]> git.lizzy.rs Git - plan9front.git/blob - sys/src/games/mix/char.c
games/mix: Add Knuth MIX emulator/assembler
[plan9front.git] / sys / src / games / mix / char.c
1 #include <u.h>
2 #include <libc.h>
3 #include <avl.h>
4 #include <bio.h>
5 #include "mix.h"
6
7 typedef
8 struct Mixchar {
9         Rune r;
10         int m;
11 } Mixchar;
12
13 static Rune mixtor[] = {
14         ' ',
15         'A',
16         'B',
17         'C',
18         'D',
19         'E',
20         'F',
21         'G',
22         'H',
23         'I',
24         L'Δ',
25         'J',
26         'K',
27         'L',
28         'M',
29         'N',
30         'O',
31         'P',
32         'Q',
33         'R',
34         L'Σ',
35         L'Π',
36         'S',
37         'T',
38         'U',
39         'V',
40         'W',
41         'X',
42         'Y',
43         'Z',
44         '0',
45         '1',
46         '2',
47         '3',
48         '4',
49         '5',
50         '6',
51         '7',
52         '8',
53         '9',
54         '.',
55         ',',
56         '(',
57         ')',
58         '+',
59         '-',
60         '*',
61         '/',
62         '=',
63         '$',
64         '<',
65         '>',
66         '@',
67         ';',
68         ':',
69         '\''
70 };
71
72 static Mixchar rtomix[nelem(mixtor)];
73
74 static int
75 runecmp(void *a, void *b)
76 {
77         Rune ra, rb;
78
79         ra = ((Mixchar*)a)->r;
80         rb = ((Mixchar*)b)->r;
81
82         if(ra < rb)
83                 return -1;
84         if(ra > rb)
85                 return 1;
86         return 0;
87 }
88
89 void
90 cinit(void)
91 {
92         int i;
93         Mixchar *a;
94
95         for(i = 0; i < nelem(rtomix); i++) {
96                 a = rtomix+i;
97                 a->r = mixtor[i];
98                 a->m = i;
99         }
100         qsort(rtomix, nelem(rtomix), sizeof(*rtomix), runecmp);
101 }
102
103 int
104 runetomix(Rune r)
105 {
106         Mixchar *c, l;
107
108         l.r = r;
109         c = (Mixchar*)bsearch(&l, rtomix, nelem(rtomix), sizeof(*rtomix), runecmp);
110         if(c == nil) {
111                 print("Not found!!\n");
112                 return -1;
113         }
114
115         return c->m;
116 }
117
118 Rune
119 mixtorune(int m)
120 {
121         if(m < nelem(mixtor))
122                 return mixtor[m];
123         return -1;
124 }