Blame


1 c66b5250 2006-06-25 devnull #include <u.h>
2 c66b5250 2006-06-25 devnull #include <libc.h>
3 c66b5250 2006-06-25 devnull #include <draw.h>
4 c66b5250 2006-06-25 devnull
5 c66b5250 2006-06-25 devnull /*
6 c66b5250 2006-06-25 devnull * The code makes two assumptions: strlen(ld) is 1 or 2; latintab[i].ld can be a
7 c66b5250 2006-06-25 devnull * prefix of latintab[j].ld only when j<i.
8 c66b5250 2006-06-25 devnull */
9 c66b5250 2006-06-25 devnull static struct cvlist
10 c66b5250 2006-06-25 devnull {
11 c66b5250 2006-06-25 devnull char *ld; /* must be seen before using this conversion */
12 c66b5250 2006-06-25 devnull char *si; /* options for last input characters */
13 c66b5250 2006-06-25 devnull Rune so[60]; /* the corresponding Rune for each si entry */
14 c66b5250 2006-06-25 devnull } latintab[] = {
15 bb7ff349 2009-07-08 mt #include "latin1.h"
16 c66b5250 2006-06-25 devnull 0, 0, { 0 }
17 c66b5250 2006-06-25 devnull };
18 c66b5250 2006-06-25 devnull
19 c66b5250 2006-06-25 devnull /*
20 3850e6e1 2020-05-30 rsc * Given 5 characters k[0]..k[n], find the rune or return -1 for failure.
21 c66b5250 2006-06-25 devnull */
22 c66b5250 2006-06-25 devnull static long
23 3850e6e1 2020-05-30 rsc unicode(Rune *k, int n)
24 c66b5250 2006-06-25 devnull {
25 c66b5250 2006-06-25 devnull long i, c;
26 c66b5250 2006-06-25 devnull
27 c66b5250 2006-06-25 devnull c = 0;
28 3850e6e1 2020-05-30 rsc for(i=0; i<n; i++,k++){
29 c66b5250 2006-06-25 devnull c <<= 4;
30 c66b5250 2006-06-25 devnull if('0'<=*k && *k<='9')
31 c66b5250 2006-06-25 devnull c += *k-'0';
32 c66b5250 2006-06-25 devnull else if('a'<=*k && *k<='f')
33 c66b5250 2006-06-25 devnull c += 10 + *k-'a';
34 c66b5250 2006-06-25 devnull else if('A'<=*k && *k<='F')
35 c66b5250 2006-06-25 devnull c += 10 + *k-'A';
36 c66b5250 2006-06-25 devnull else
37 c66b5250 2006-06-25 devnull return -1;
38 3850e6e1 2020-05-30 rsc if(c > Runemax)
39 3850e6e1 2020-05-30 rsc return -1;
40 c66b5250 2006-06-25 devnull }
41 c66b5250 2006-06-25 devnull return c;
42 c66b5250 2006-06-25 devnull }
43 c66b5250 2006-06-25 devnull
44 c66b5250 2006-06-25 devnull /*
45 c66b5250 2006-06-25 devnull * Given n characters k[0]..k[n-1], find the corresponding rune or return -1 for
46 c66b5250 2006-06-25 devnull * failure, or something < -1 if n is too small. In the latter case, the result
47 c66b5250 2006-06-25 devnull * is minus the required n.
48 c66b5250 2006-06-25 devnull */
49 c66b5250 2006-06-25 devnull int
50 41547af3 2020-01-13 rsc latin1(Rune *k, int n)
51 c66b5250 2006-06-25 devnull {
52 c66b5250 2006-06-25 devnull struct cvlist *l;
53 c66b5250 2006-06-25 devnull int c;
54 c66b5250 2006-06-25 devnull char* p;
55 c66b5250 2006-06-25 devnull
56 c66b5250 2006-06-25 devnull if(k[0] == 'X'){
57 3850e6e1 2020-05-30 rsc if(n < 2)
58 3850e6e1 2020-05-30 rsc return -2;
59 3850e6e1 2020-05-30 rsc if(k[1] == 'X') {
60 3850e6e1 2020-05-30 rsc if(n < 3)
61 3850e6e1 2020-05-30 rsc return -3;
62 3850e6e1 2020-05-30 rsc if(k[2] == 'X') {
63 3850e6e1 2020-05-30 rsc if(n < 9) {
64 3850e6e1 2020-05-30 rsc if(unicode(k+3, n-3) < 0)
65 3850e6e1 2020-05-30 rsc return -1;
66 3850e6e1 2020-05-30 rsc return -(n+1);
67 3850e6e1 2020-05-30 rsc }
68 3850e6e1 2020-05-30 rsc return unicode(k+3, 6);
69 3850e6e1 2020-05-30 rsc }
70 3850e6e1 2020-05-30 rsc if(n < 7) {
71 3850e6e1 2020-05-30 rsc if(unicode(k+2, n-2) < 0)
72 3850e6e1 2020-05-30 rsc return -1;
73 3850e6e1 2020-05-30 rsc return -(n+1);
74 3850e6e1 2020-05-30 rsc }
75 3850e6e1 2020-05-30 rsc return unicode(k+2, 5);
76 3850e6e1 2020-05-30 rsc }
77 3850e6e1 2020-05-30 rsc if(n < 5) {
78 3850e6e1 2020-05-30 rsc if(unicode(k+1, n-1) < 0)
79 3850e6e1 2020-05-30 rsc return -1;
80 3850e6e1 2020-05-30 rsc return -(n+1);
81 3850e6e1 2020-05-30 rsc }
82 3850e6e1 2020-05-30 rsc return unicode(k+1, 4);
83 c66b5250 2006-06-25 devnull }
84 fa325e9b 2020-01-10 cross
85 c66b5250 2006-06-25 devnull for(l=latintab; l->ld!=0; l++)
86 c66b5250 2006-06-25 devnull if(k[0] == l->ld[0]){
87 c66b5250 2006-06-25 devnull if(n == 1)
88 c66b5250 2006-06-25 devnull return -2;
89 c66b5250 2006-06-25 devnull if(l->ld[1] == 0)
90 c66b5250 2006-06-25 devnull c = k[1];
91 c66b5250 2006-06-25 devnull else if(l->ld[1] != k[1])
92 c66b5250 2006-06-25 devnull continue;
93 c66b5250 2006-06-25 devnull else if(n == 2)
94 c66b5250 2006-06-25 devnull return -3;
95 c66b5250 2006-06-25 devnull else
96 c66b5250 2006-06-25 devnull c = k[2];
97 c66b5250 2006-06-25 devnull for(p=l->si; *p!=0; p++)
98 c66b5250 2006-06-25 devnull if(*p == c)
99 c66b5250 2006-06-25 devnull return l->so[p - l->si];
100 c66b5250 2006-06-25 devnull return -1;
101 c66b5250 2006-06-25 devnull }
102 c66b5250 2006-06-25 devnull return -1;
103 c66b5250 2006-06-25 devnull }