summaryrefslogtreecommitdiff
path: root/sys/src/games/mix/char.c
blob: 3b5d57cbeedc7e3ab43a2b1561f67fab32d5d3a5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#include <u.h>
#include <libc.h>
#include <avl.h>
#include <bio.h>
#include "mix.h"

typedef
struct Mixchar {
	Rune r;
	int m;
} Mixchar;

static Rune mixtor[] = {
	' ',
	'A',
	'B',
	'C',
	'D',
	'E',
	'F',
	'G',
	'H',
	'I',
	L'Δ',
	'J',
	'K',
	'L',
	'M',
	'N',
	'O',
	'P',
	'Q',
	'R',
	L'Σ',
	L'Π',
	'S',
	'T',
	'U',
	'V',
	'W',
	'X',
	'Y',
	'Z',
	'0',
	'1',
	'2',
	'3',
	'4',
	'5',
	'6',
	'7',
	'8',
	'9',
	'.',
	',',
	'(',
	')',
	'+',
	'-',
	'*',
	'/',
	'=',
	'$',
	'<',
	'>',
	'@',
	';',
	':',
	'\''
};

static Mixchar rtomix[nelem(mixtor)];

static int
runecmp(void *a, void *b)
{
	Rune ra, rb;

	ra = ((Mixchar*)a)->r;
	rb = ((Mixchar*)b)->r;

	if(ra < rb)
		return -1;
	if(ra > rb)
		return 1;
	return 0;
}

void
cinit(void)
{
	int i;
	Mixchar *a;

	for(i = 0; i < nelem(rtomix); i++) {
		a = rtomix+i;
		a->r = mixtor[i];
		a->m = i;
	}
	qsort(rtomix, nelem(rtomix), sizeof(*rtomix), runecmp);
}

int
runetomix(Rune r)
{
	Mixchar *c, l;

	l.r = r;
	c = (Mixchar*)bsearch(&l, rtomix, nelem(rtomix), sizeof(*rtomix), runecmp);
	if(c == nil) {
		print("Not found!!\n");
		return -1;
	}

	return c->m;
}

Rune
mixtorune(int m)
{
	if(m < nelem(mixtor))
		return mixtor[m];
	return -1;
}