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 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,
18 08708877 2003-11-25 devnull };
19 08708877 2003-11-25 devnull
20 08708877 2003-11-25 devnull static char tag[64];
21 08708877 2003-11-25 devnull
22 08708877 2003-11-25 devnull enum{
23 08708877 2003-11-25 devnull Run, Openper, Openat, Closeat
24 08708877 2003-11-25 devnull };
25 08708877 2003-11-25 devnull
26 08708877 2003-11-25 devnull void
27 08708877 2003-11-25 devnull ahdprintentry(Entry e, int cmd)
28 08708877 2003-11-25 devnull {
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;
34 08708877 2003-11-25 devnull
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;
40 08708877 2003-11-25 devnull }
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 == '%'){
49 08708877 2003-11-25 devnull t = tag;
50 08708877 2003-11-25 devnull state = Openper;
51 08708877 2003-11-25 devnull break;
52 08708877 2003-11-25 devnull }
53 08708877 2003-11-25 devnull Putchar:
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);
58 08708877 2003-11-25 devnull else
59 08708877 2003-11-25 devnull outrune(c);
60 08708877 2003-11-25 devnull break;
61 08708877 2003-11-25 devnull
62 08708877 2003-11-25 devnull case Openper:
63 08708877 2003-11-25 devnull if(c == '@')
64 08708877 2003-11-25 devnull state = Openat;
65 08708877 2003-11-25 devnull else{
66 08708877 2003-11-25 devnull outchar('%');
67 08708877 2003-11-25 devnull state = Run;
68 08708877 2003-11-25 devnull goto Putchar;
69 08708877 2003-11-25 devnull }
70 08708877 2003-11-25 devnull break;
71 08708877 2003-11-25 devnull
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;
77 08708877 2003-11-25 devnull break;
78 08708877 2003-11-25 devnull
79 08708877 2003-11-25 devnull case Closeat:
80 08708877 2003-11-25 devnull if(c == '%'){
81 08708877 2003-11-25 devnull *t = 0;
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;
86 08708877 2003-11-25 devnull break;
87 08708877 2003-11-25 devnull case 'r':
88 08708877 2003-11-25 devnull outprint("%%@%s@%%", tag);
89 08708877 2003-11-25 devnull break;
90 08708877 2003-11-25 devnull }
91 08708877 2003-11-25 devnull state = Run;
92 08708877 2003-11-25 devnull }else{
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;
98 08708877 2003-11-25 devnull }
99 08708877 2003-11-25 devnull break;
100 08708877 2003-11-25 devnull }
101 08708877 2003-11-25 devnull }
102 08708877 2003-11-25 devnull out:
103 08708877 2003-11-25 devnull outnl(0);
104 08708877 2003-11-25 devnull breaklen = obreaklen;
105 08708877 2003-11-25 devnull }
106 08708877 2003-11-25 devnull
107 08708877 2003-11-25 devnull long
108 08708877 2003-11-25 devnull ahdnextoff(long fromoff)
109 08708877 2003-11-25 devnull {
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;
114 08708877 2003-11-25 devnull
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;
122 08708877 2003-11-25 devnull }
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;
129 08708877 2003-11-25 devnull }
130 08708877 2003-11-25 devnull return fromoff-5;
131 08708877 2003-11-25 devnull }
132 08708877 2003-11-25 devnull return defoff;
133 08708877 2003-11-25 devnull }
134 08708877 2003-11-25 devnull
135 08708877 2003-11-25 devnull void
136 08708877 2003-11-25 devnull ahdprintkey(void)
137 08708877 2003-11-25 devnull {
138 08708877 2003-11-25 devnull Bprint(bout, "No pronunciations.\n");
139 08708877 2003-11-25 devnull }