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"
7 08708877 2003-11-25 devnull * American Heritage Dictionary (encrypted)
10 08708877 2003-11-25 devnull static Rune intab[256] = {
11 08708877 2003-11-25 devnull [0x82] 0xe9,
12 08708877 2003-11-25 devnull [0x85] 0xe0,
13 08708877 2003-11-25 devnull [0x89] 0xeb,
14 08708877 2003-11-25 devnull [0x8a] 0xe8,
15 08708877 2003-11-25 devnull [0xa4] 0xf1,
16 08708877 2003-11-25 devnull [0xf8] 0xb0,
17 08708877 2003-11-25 devnull [0xf9] 0xb7,
20 08708877 2003-11-25 devnull static char tag[64];
23 08708877 2003-11-25 devnull Run, Openper, Openat, Closeat
27 08708877 2003-11-25 devnull ahdprintentry(Entry e, int cmd)
29 08708877 2003-11-25 devnull static int inited;
30 08708877 2003-11-25 devnull long addr;
31 08708877 2003-11-25 devnull char *p, *t = tag;
32 08708877 2003-11-25 devnull int obreaklen;
33 08708877 2003-11-25 devnull int c, state = Run;
35 08708877 2003-11-25 devnull if(!inited){
36 08708877 2003-11-25 devnull for(c=0; c<256; c++)
37 08708877 2003-11-25 devnull if(intab[c] == 0)
38 08708877 2003-11-25 devnull intab[c] = c;
39 08708877 2003-11-25 devnull inited = 1;
41 08708877 2003-11-25 devnull obreaklen = breaklen;
42 08708877 2003-11-25 devnull breaklen = 80;
43 08708877 2003-11-25 devnull addr = e.doff;
44 08708877 2003-11-25 devnull for(p=e.start; p<e.end; p++){
45 08708877 2003-11-25 devnull c = intab[(*p ^ (addr++>>1))&0xff];
46 08708877 2003-11-25 devnull switch(state){
47 08708877 2003-11-25 devnull case Run:
48 08708877 2003-11-25 devnull if(c == '%'){
50 08708877 2003-11-25 devnull state = Openper;
54 08708877 2003-11-25 devnull if(c == '\n')
55 08708877 2003-11-25 devnull outnl(0);
56 08708877 2003-11-25 devnull else if(c < Runeself)
57 08708877 2003-11-25 devnull outchar(c);
59 08708877 2003-11-25 devnull outrune(c);
62 08708877 2003-11-25 devnull case Openper:
63 08708877 2003-11-25 devnull if(c == '@')
64 08708877 2003-11-25 devnull state = Openat;
66 08708877 2003-11-25 devnull outchar('%');
67 08708877 2003-11-25 devnull state = Run;
68 08708877 2003-11-25 devnull goto Putchar;
72 08708877 2003-11-25 devnull case Openat:
73 08708877 2003-11-25 devnull if(c == '@')
74 08708877 2003-11-25 devnull state = Closeat;
75 08708877 2003-11-25 devnull else if(t < &tag[sizeof tag-1])
76 08708877 2003-11-25 devnull *t++ = c;
79 08708877 2003-11-25 devnull case Closeat:
80 08708877 2003-11-25 devnull if(c == '%'){
82 08708877 2003-11-25 devnull switch(cmd){
83 08708877 2003-11-25 devnull case 'h':
84 08708877 2003-11-25 devnull if(strcmp("EH", tag) == 0)
85 08708877 2003-11-25 devnull goto out;
87 08708877 2003-11-25 devnull case 'r':
88 08708877 2003-11-25 devnull outprint("%%@%s@%%", tag);
91 08708877 2003-11-25 devnull state = Run;
93 08708877 2003-11-25 devnull if(t < &tag[sizeof tag-1])
94 08708877 2003-11-25 devnull *t++ = '@';
95 08708877 2003-11-25 devnull if(t < &tag[sizeof tag-1])
96 08708877 2003-11-25 devnull *t++ = c;
97 08708877 2003-11-25 devnull state = Openat;
103 08708877 2003-11-25 devnull outnl(0);
104 08708877 2003-11-25 devnull breaklen = obreaklen;
108 08708877 2003-11-25 devnull ahdnextoff(long fromoff)
110 08708877 2003-11-25 devnull static char *patterns[] = { "%@NL@%", "%@2@%", 0 };
111 08708877 2003-11-25 devnull int c, k = 0, state = 0;
112 08708877 2003-11-25 devnull char *pat = patterns[0];
113 08708877 2003-11-25 devnull long defoff = -1;
115 08708877 2003-11-25 devnull if(Bseek(bdict, fromoff, 0) < 0)
116 08708877 2003-11-25 devnull return -1;
117 08708877 2003-11-25 devnull while((c = Bgetc(bdict)) >= 0){
118 08708877 2003-11-25 devnull c ^= (fromoff++>>1)&0xff;
119 08708877 2003-11-25 devnull if(c != pat[state]){
120 08708877 2003-11-25 devnull state = 0;
121 08708877 2003-11-25 devnull continue;
123 08708877 2003-11-25 devnull if(pat[++state])
124 08708877 2003-11-25 devnull continue;
125 08708877 2003-11-25 devnull if(pat = patterns[++k]){ /* assign = */
126 08708877 2003-11-25 devnull state = 0;
127 08708877 2003-11-25 devnull defoff = fromoff-6;
128 08708877 2003-11-25 devnull continue;
130 08708877 2003-11-25 devnull return fromoff-5;
132 08708877 2003-11-25 devnull return defoff;
136 08708877 2003-11-25 devnull ahdprintkey(void)
138 08708877 2003-11-25 devnull Bprint(bout, "No pronunciations.\n");