|
|
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.