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;
}
|