DEADSOFTWARE

Initial Bare Metal BlackBox Prototype
[bmbb.git] / Boot486 / mkcharfn.c
1 #include <locale.h>
2 #include <wchar.h>
3 #include <wctype.h>
4 #include <stdio.h>
6 #define MAX_CP_CAHR 0x10000
8 static wint_t isalphatab[MAX_CP_CAHR];
9 static wint_t isuppertab[MAX_CP_CAHR];
10 static wint_t islowertab[MAX_CP_CAHR];
11 static wint_t uppertable[MAX_CP_CAHR];
12 static wint_t lowertable[MAX_CP_CAHR];
14 static void
15 print_tabs(int n) {
16 for (int i = 0; i < n; i++) {
17 putchar('\t');
18 }
19 }
21 static void
22 print_range (wint_t *tab, int max, int t, int retbool) {
23 int i = 0;
24 int begin = 0;
25 int end = 0;
26 int oddmode = 0;
27 int fold = 0;
28 int count = 0;
30 print_tabs(t);
31 printf("CASE ch OF\n");
33 while (i < max) {
34 while ((i < max) && (tab[i] == 0)) ++i;
35 begin = i;
37 oddmode = 0;
38 if (i + 2 < max && tab[i + 1] == 0 && tab[i + 2] != 0) {
39 if (tab[i] % 2 == 1) {
40 oddmode = 1;
41 } else {
42 oddmode = 2;
43 }
44 }
46 if (oddmode == 0) {
47 while (i < max && tab[i] != 0) i += 1;
48 end = i - 1;
49 } else {
50 while (i + 1 < max && tab[i] != 0 && tab[i + 1] == 0) i += 2;
51 end = i;
52 }
54 if (i < max && begin <= end) {
55 print_tabs(t);
56 // printf("(* %i *) ", oddmode)
57 printf("| ");
59 if (begin == end) {
60 if (retbool) {
61 printf("0%XX: RETURN TRUE\n", begin);
62 } else {
63 printf("0%XX: RETURN 0%XX\n", begin, tab[begin]);
64 }
65 } else {
66 printf("0%XX..0%XX: ", begin, end);
67 if (retbool) {
68 if (oddmode == 0) {
69 printf("RETURN TRUE\n");
70 } else if (oddmode == 1) {
71 printf("RETURN ODD(ORD(ch))\n");
72 } else if (oddmode == 2) {
73 printf("RETURN ~ODD(ORD(ch))\n");
74 }
75 } else {
76 if (oddmode == 0) {
77 printf("RETURN CHR(0%XH + ORD(ch) - 0%XH)\n", tab[begin], begin);
78 } else if (oddmode == 1) {
79 printf("IF ODD(ORD(ch)) THEN RETURN CHR(0%XH + ORD(ch) - 0%XH) ELSE RETURN ch END\n", tab[begin], begin);
80 } else if (oddmode == 2) {
81 printf("IF ~ODD(ORD(ch)) THEN RETURN CHR(0%XH + ORD(ch) - 0%XH) ELSE RETURN ch END\n", tab[begin], begin);
82 }
83 }
84 }
86 count += 1;
87 if (count > 4096) {
88 count = 0;
89 fold += 1;
90 print_tabs(t);
91 printf("ELSE\n");
92 t += 1;
93 print_tabs(t);
94 printf("CASE ch OF\n");
95 }
96 }
98 i += 1;
99 }
101 for (int i = 0; i < fold + 1; i++) {
102 print_tabs(t);
103 printf("ELSE ");
104 if (retbool) {
105 printf("RETURN FALSE\n");
106 } else {
107 printf("RETURN ch\n");
109 print_tabs(t);
110 printf("END\n");
111 t -= 1;
115 int
116 main (int argc, char **argv) {
117 setlocale(LC_ALL, "");
118 for (wint_t i = 0; i < MAX_CP_CAHR; i++) {
119 isalphatab[i] = iswalpha(i) ? i : 0;
120 isuppertab[i] = iswupper(i) ? i : 0;
121 islowertab[i] = iswlower(i) ? i : 0;
122 uppertable[i] = (towupper(i) == i) ? 0 : towupper(i);
123 lowertable[i] = (towlower(i) == i) ? 0 : towlower(i);
126 printf("MODULE Unicode;\n\n");
128 printf("\tIMPORT Kernel;\n\n");
130 printf("\tTYPE\n");
131 printf("\t\tHook = POINTER TO RECORD (Kernel.CharHook) END;\n\n");
133 printf("\tPROCEDURE (h: Hook) Upper (ch: CHAR): CHAR;\n");
134 printf("\tBEGIN\n");
135 print_range(uppertable, MAX_CP_CAHR, 2, 0);
136 printf("\tEND Upper;\n\n");
138 printf("\tPROCEDURE (h: Hook) Lower (ch: CHAR): CHAR;\n");
139 printf("\tBEGIN\n");
140 print_range(lowertable, MAX_CP_CAHR, 2, 0);
141 printf("\tEND Lower;\n\n");
143 printf("\tPROCEDURE (h: Hook) IsAlpha (ch: CHAR): BOOLEAN;\n");
144 printf("\tBEGIN\n");
145 print_range(isalphatab, MAX_CP_CAHR, 2, 1);
146 printf("\tEND IsAlpha;\n\n");
148 printf("\tPROCEDURE (h: Hook) IsUpper (ch: CHAR): BOOLEAN;\n");
149 printf("\tBEGIN\n");
150 print_range(isuppertab, MAX_CP_CAHR, 2, 1);
151 printf("\tEND IsUpper;\n\n");
153 printf("\tPROCEDURE (h: Hook) IsLower (ch: CHAR): BOOLEAN;\n");
154 printf("\tBEGIN\n");
155 print_range(islowertab, MAX_CP_CAHR, 2, 1);
156 printf("\tEND IsLower;\n\n");
158 printf("\tPROCEDURE Init;\n");
159 printf("\t\tVAR h: Hook;\n");
160 printf("\tBEGIN\n");
161 printf("\t\tNEW(h); Kernel.SetCharHook(h)\n");
162 printf("\tEND Init;\n\n");
164 printf("BEGIN\n");
165 printf("\tInit\n");
166 printf("CLOSE\n");
167 printf("\tKernel.SetCharHook(NIL)\n");
168 printf("END Unicode.");