|
|
1.1 root 1: #include <u.h>
2:
3: /*
4: * The code makes two assumptions: strlen(ld) is 1 or 2; latintab[i].ld can be a
5: * prefix of latintab[j].ld only when j<i.
6: */
7: struct cvlist
8: {
9: char *ld; /* must be seen before using this conversion */
10: char *si; /* options for last input characters */
11: Rune *so; /* the corresponding Rune for each si entry */
12: } latintab[] = {
13: " ", " i", L"␣ı",
14: "!~", "-=~", L"≄≇≉",
15: "!", "!<=>?bmp", L"¡≮≠≯‽⊄∉⊅",
16: "\"*","IUiu", L"ΪΫϊϋ",
17: "\"", "AEIOUY\"aeiouy", L"ÄËÏÖÜŸ¨äëïöüÿ",
18: "$*", "fhk", L"ϕϑϰ",
19: "$", "BEFHILMoRVaefglpv", L"ℬℰℱℋℐℒℳℴℛƲɑℯƒℊℓ℘ʋ",
20: "'\"","Uu", L"Ǘǘ",
21: "'", "'ACEILNORSUYZacegilnorsuyz",
22: L"´ÁĆÉÍĹŃÓŔŚÚÝŹáćéģíĺńóŕśúýź",
23: "*", "*ABCDEFGHIKLMNOPQRSTUWXYZabcdefghiklmnopqrstuwxyz",
24: L"∗ΑΒΞΔΕΦΓΘΙΚΛΜΝΟΠΨΡΣΤΥΩΧΗΖαβξδεφγθικλμνοπψρστυωχηζ",
25: "+", "-O", L"±⊕",
26: ",", ",ACEGIKLNORSTUacegiklnorstu",
27: L"¸ĄÇĘĢĮĶĻŅǪŖŞŢŲąçęģįķļņǫŗşţų",
28: "-*", "l", L"ƛ",
29: "-", "+-2:>DGHILOTZbdghiltuz~",
30: L"∓ƻ÷→ÐǤĦƗŁ⊖ŦƵƀðǥℏɨłŧʉƶ≂",
31: ".", ".CEGILOZceglz", L"·ĊĖĠİĿ⊙Żċėġŀż",
32: "/", "Oo", L"Øø",
33: "1", "234568", L"½⅓¼⅕⅙⅛",
34: "2", "-35", L"ƻ⅔⅖",
35: "3", "458", L"¾⅗⅜",
36: "4", "5", L"⅘",
37: "5", "68", L"⅚⅝",
38: "7", "8", L"⅞",
39: ":", "-=", L"÷≔",
40: "<!", "=~", L"≨⋦",
41: "<", "-<=>~", L"←«≤≶≲",
42: "=", ":<=>OV", L"≕⋜≡⋝⊜⇒",
43: ">!", "=~", L"≩⋧",
44: ">", "<=>~", L"≷≥»≳",
45: "?", "!?", L"‽¿",
46: "@@", "'EKSTYZekstyz", L"ьЕКСТЫЗекстыз",
47: "@'", "'", L"ъ",
48: "@C", "Hh", L"ЧЧ",
49: "@E", "Hh", L"ЭЭ",
50: "@K", "Hh", L"ХХ",
51: "@S", "CHch", L"ЩШЩШ",
52: "@T", "Ss", L"ЦЦ",
53: "@Y", "AEOUaeou", L"ЯЕЁЮЯЕЁЮ",
54: "@Z", "Hh", L"ЖЖ",
55: "@c", "h", L"ч",
56: "@e", "h", L"э",
57: "@k", "h", L"х",
58: "@s", "ch", L"щш",
59: "@t", "s", L"ц",
60: "@y", "aeou", L"яеёю",
61: "@z", "h", L"ж",
62: "@", "ABDFGIJLMNOPRUVXabdfgijlmnopruvx",
63: L"АБДФГИЙЛМНОПРУВХабдфгийлмнопрувх",
64: "A", "E", L"Æ",
65: "C", "ACU", L"⋂ℂ⋃",
66: "Dv", "Zz", L"DŽDž",
67: "D", "-e", L"Ð∆",
68: "G", "-", L"Ǥ",
69: "H", "-H", L"Ħℍ",
70: "I", "-J", L"ƗIJ",
71: "L", "&-Jj|", L"⋀ŁLJLj⋁",
72: "N", "JNj", L"NJℕNj",
73: "O", "*+-./=EIcoprx", L"⊛⊕⊖⊙⊘⊜ŒƢ©⊚℗®⊗",
74: "P", "P", L"ℙ",
75: "Q", "Q", L"ℚ",
76: "R", "R", L"ℝ",
77: "S", "S", L"§",
78: "T", "-u", L"Ŧ⊨",
79: "V", "=", L"⇐",
80: "Y", "R", L"Ʀ",
81: "Z", "-Z", L"Ƶℤ",
82: "^", "ACEGHIJOSUWYaceghijosuwy",
83: L"ÂĈÊĜĤÎĴÔŜÛŴŶâĉêĝĥîĵôŝûŵŷ",
84: "_\"","AUau", L"ǞǕǟǖ",
85: "_.", "Aa", L"Ǡǡ",
86: "_,", "Oo", L"Ǭǭ",
87: "_", "_AEIOUaeiou", L"¯ĀĒĪŌŪāēīōū",
88: "`\"","Uu", L"Ǜǜ",
89: "`", "AEIOUaeiou", L"ÀÈÌÒÙàèìòù",
90: "a", "ben", L"↔æ∠",
91: "b", "()+-0123456789=bknpqru",
92: L"₍₎₊₋₀₁₂₃₄₅₆₇₈₉₌♝♚♞♟♛♜•",
93: "c", "$Oagu", L"¢©∩≅∪",
94: "dv", "z", L"dž",
95: "d", "-adegz", L"ð↓‡°†ʣ",
96: "e", "ls", L"⋯∅",
97: "f", "a", L"∀",
98: "g", "$-r", L"¤ǥ∇",
99: "h", "-v", L"ℏƕ",
100: "i", "-bfjps", L"ɨ⊆∞ij⊇∫",
101: "l", "\"$&'-jz|", L"“£∧‘łlj⋄∨",
102: "m", "iou", L"µ∈×",
103: "n", "jo", L"nj¬",
104: "o", "AOUaeiu", L"Å⊚Ůåœƣů",
105: "p", "Odgrt", L"℗∂¶∏∝",
106: "r", "\"'O", L"”’®",
107: "s", "()+-0123456789=abnoprstu",
108: L"⁽⁾⁺⁻⁰¹²³⁴⁵⁶⁷⁸⁹⁼ª⊂ⁿº⊃√ß∍∑",
109: "t", "-efmsu", L"ŧ∃∴™ς⊢",
110: "u", "-AEGIOUaegiou", L"ʉĂĔĞĬŎŬ↑ĕğĭŏŭ",
111: "v\"","Uu", L"Ǚǚ",
112: "v", "ACDEGIKLNORSTUZacdegijklnorstuz",
113: L"ǍČĎĚǦǏǨĽŇǑŘŠŤǓŽǎčďěǧǐǰǩľňǒřšťǔž",
114: "w", "bknpqr", L"♗♔♘♙♕♖",
115: "x", "O", L"⊗",
116: "y", "$", L"¥",
117: "z", "-", L"ƶ",
118: "|", "Pp|", L"Þþ¦",
119: "~!", "=", L"≆",
120: "~", "-=AINOUainou~", L"≃≅ÃĨÑÕŨãĩñõũ≈",
121: 0, 0, 0
122: };
123:
124: /*
125: * Given 5 characters k[0]..k[4], find the rune or return -1 for failure.
126: */
127: long
128: unicode(uchar *k)
129: {
130: long i, c;
131:
132: k++; /* skip 'X' */
133: c = 0;
134: for(i=0; i<4; i++,k++){
135: c <<= 4;
136: if('0'<=*k && *k<='9')
137: c += *k-'0';
138: else if('a'<=*k && *k<='f')
139: c += 10 + *k-'a';
140: else if('A'<=*k && *k<='F')
141: c += 10 + *k-'A';
142: else
143: return -1;
144: }
145: return c;
146: }
147:
148: /*
149: * Given n characters k[0]..k[n-1], find the corresponding rune or return -1 for
150: * failure, or something < -1 if n is too small. In the latter case, the result
151: * is minus the required n.
152: */
153: long
154: latin1(uchar *k, int n)
155: {
156: struct cvlist *l;
157: int c;
158: char* p;
159:
160: if(k[0] == 'X')
161: if(n>=5)
162: return unicode(k);
163: else
164: return -5;
165: for(l=latintab; l->ld!=0; l++)
166: if(k[0] == l->ld[0]){
167: if(n == 1)
168: return -2;
169: if(l->ld[1] == 0)
170: c = k[1];
171: else if(l->ld[1] != k[1])
172: continue;
173: else if(n == 2)
174: return -3;
175: else
176: c = k[2];
177: for(p=l->si; *p!=0; p++)
178: if(*p == c)
179: return l->so[p - l->si];
180: return -1;
181: }
182: return -1;
183: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.