Blame


1 08708877 2003-11-25 devnull #include <u.h>
2 08708877 2003-11-25 devnull #include <libc.h>
3 08708877 2003-11-25 devnull #include <bio.h>
4 08708877 2003-11-25 devnull #include "dict.h"
5 08708877 2003-11-25 devnull
6 08708877 2003-11-25 devnull /*
7 08708877 2003-11-25 devnull * American Heritage Dictionary (encrypted)
8 08708877 2003-11-25 devnull */
9 08708877 2003-11-25 devnull
10 be22ae2d 2004-03-26 devnull static Rune intab[256];
11 08708877 2003-11-25 devnull
12 be22ae2d 2004-03-26 devnull static void
13 be22ae2d 2004-03-26 devnull initintab(void)
14 be22ae2d 2004-03-26 devnull {
15 be22ae2d 2004-03-26 devnull intab[0x82] = 0xe9;
16 be22ae2d 2004-03-26 devnull intab[0x85] = 0xe0;
17 be22ae2d 2004-03-26 devnull intab[0x89] = 0xeb;
18 be22ae2d 2004-03-26 devnull intab[0x8a] = 0xe8;
19 be22ae2d 2004-03-26 devnull intab[0xa4] = 0xf1;
20 be22ae2d 2004-03-26 devnull intab[0xf8] = 0xb0;
21 be22ae2d 2004-03-26 devnull intab[0xf9] = 0xb7;
22 be22ae2d 2004-03-26 devnull }
23 be22ae2d 2004-03-26 devnull
24 08708877 2003-11-25 devnull static char tag[64];
25 08708877 2003-11-25 devnull
26 08708877 2003-11-25 devnull enum{
27 08708877 2003-11-25 devnull Run, Openper, Openat, Closeat
28 08708877 2003-11-25 devnull };
29 08708877 2003-11-25 devnull
30 08708877 2003-11-25 devnull void
31 08708877 2003-11-25 devnull ahdprintentry(Entry e, int cmd)
32 08708877 2003-11-25 devnull {
33 08708877 2003-11-25 devnull static int inited;
34 08708877 2003-11-25 devnull long addr;
35 08708877 2003-11-25 devnull char *p, *t = tag;
36 08708877 2003-11-25 devnull int obreaklen;
37 08708877 2003-11-25 devnull int c, state = Run;
38 08708877 2003-11-25 devnull
39 08708877 2003-11-25 devnull if(!inited){
40 be22ae2d 2004-03-26 devnull initintab();
41 08708877 2003-11-25 devnull for(c=0; c<256; c++)
42 08708877 2003-11-25 devnull if(intab[c] == 0)
43 08708877 2003-11-25 devnull intab[c] = c;
44 08708877 2003-11-25 devnull inited = 1;
45 08708877 2003-11-25 devnull }
46 08708877 2003-11-25 devnull obreaklen = breaklen;
47 08708877 2003-11-25 devnull breaklen = 80;
48 08708877 2003-11-25 devnull addr = e.doff;
49 08708877 2003-11-25 devnull for(p=e.start; p<e.end; p++){
50 08708877 2003-11-25 devnull c = intab[(*p ^ (addr++>>1))&0xff];
51 08708877 2003-11-25 devnull switch(state){
52 08708877 2003-11-25 devnull case Run:
53 08708877 2003-11-25 devnull if(c == '%'){
54 08708877 2003-11-25 devnull t = tag;
55 08708877 2003-11-25 devnull state = Openper;
56 08708877 2003-11-25 devnull break;
57 08708877 2003-11-25 devnull }
58 08708877 2003-11-25 devnull Putchar:
59 08708877 2003-11-25 devnull if(c == '\n')
60 08708877 2003-11-25 devnull outnl(0);
61 08708877 2003-11-25 devnull else if(c < Runeself)
62 08708877 2003-11-25 devnull outchar(c);
63 08708877 2003-11-25 devnull else
64 08708877 2003-11-25 devnull outrune(c);
65 08708877 2003-11-25 devnull break;
66 08708877 2003-11-25 devnull
67 08708877 2003-11-25 devnull case Openper:
68 08708877 2003-11-25 devnull if(c == '@')
69 08708877 2003-11-25 devnull state = Openat;
70 08708877 2003-11-25 devnull else{
71 08708877 2003-11-25 devnull outchar('%');
72 08708877 2003-11-25 devnull state = Run;
73 08708877 2003-11-25 devnull goto Putchar;
74 08708877 2003-11-25 devnull }
75 08708877 2003-11-25 devnull break;
76 08708877 2003-11-25 devnull
77 08708877 2003-11-25 devnull case Openat:
78 08708877 2003-11-25 devnull if(c == '@')
79 08708877 2003-11-25 devnull state = Closeat;
80 08708877 2003-11-25 devnull else if(t < &tag[sizeof tag-1])
81 08708877 2003-11-25 devnull *t++ = c;
82 08708877 2003-11-25 devnull break;
83 08708877 2003-11-25 devnull
84 08708877 2003-11-25 devnull case Closeat:
85 08708877 2003-11-25 devnull if(c == '%'){
86 08708877 2003-11-25 devnull *t = 0;
87 08708877 2003-11-25 devnull switch(cmd){
88 08708877 2003-11-25 devnull case 'h':
89 08708877 2003-11-25 devnull if(strcmp("EH", tag) == 0)
90 08708877 2003-11-25 devnull goto out;
91 08708877 2003-11-25 devnull break;
92 08708877 2003-11-25 devnull case 'r':
93 08708877 2003-11-25 devnull outprint("%%@%s@%%", tag);
94 08708877 2003-11-25 devnull break;
95 08708877 2003-11-25 devnull }
96 08708877 2003-11-25 devnull state = Run;
97 08708877 2003-11-25 devnull }else{
98 08708877 2003-11-25 devnull if(t < &tag[sizeof tag-1])
99 08708877 2003-11-25 devnull *t++ = '@';
100 08708877 2003-11-25 devnull if(t < &tag[sizeof tag-1])
101 08708877 2003-11-25 devnull *t++ = c;
102 08708877 2003-11-25 devnull state = Openat;
103 08708877 2003-11-25 devnull }
104 08708877 2003-11-25 devnull break;
105 08708877 2003-11-25 devnull }
106 08708877 2003-11-25 devnull }
107 08708877 2003-11-25 devnull out:
108 08708877 2003-11-25 devnull outnl(0);
109 08708877 2003-11-25 devnull breaklen = obreaklen;
110 08708877 2003-11-25 devnull }
111 08708877 2003-11-25 devnull
112 08708877 2003-11-25 devnull long
113 08708877 2003-11-25 devnull ahdnextoff(long fromoff)
114 08708877 2003-11-25 devnull {
115 08708877 2003-11-25 devnull static char *patterns[] = { "%@NL@%", "%@2@%", 0 };
116 08708877 2003-11-25 devnull int c, k = 0, state = 0;
117 08708877 2003-11-25 devnull char *pat = patterns[0];
118 08708877 2003-11-25 devnull long defoff = -1;
119 08708877 2003-11-25 devnull
120 08708877 2003-11-25 devnull if(Bseek(bdict, fromoff, 0) < 0)
121 08708877 2003-11-25 devnull return -1;
122 08708877 2003-11-25 devnull while((c = Bgetc(bdict)) >= 0){
123 08708877 2003-11-25 devnull c ^= (fromoff++>>1)&0xff;
124 08708877 2003-11-25 devnull if(c != pat[state]){
125 08708877 2003-11-25 devnull state = 0;
126 08708877 2003-11-25 devnull continue;
127 08708877 2003-11-25 devnull }
128 08708877 2003-11-25 devnull if(pat[++state])
129 08708877 2003-11-25 devnull continue;
130 08708877 2003-11-25 devnull if(pat = patterns[++k]){ /* assign = */
131 08708877 2003-11-25 devnull state = 0;
132 08708877 2003-11-25 devnull defoff = fromoff-6;
133 08708877 2003-11-25 devnull continue;
134 08708877 2003-11-25 devnull }
135 08708877 2003-11-25 devnull return fromoff-5;
136 08708877 2003-11-25 devnull }
137 08708877 2003-11-25 devnull return defoff;
138 08708877 2003-11-25 devnull }
139 08708877 2003-11-25 devnull
140 08708877 2003-11-25 devnull void
141 08708877 2003-11-25 devnull ahdprintkey(void)
142 08708877 2003-11-25 devnull {
143 08708877 2003-11-25 devnull Bprint(bout, "No pronunciations.\n");
144 08708877 2003-11-25 devnull }