1219b2ee8SDavid du Colombier #include <u.h>
2219b2ee8SDavid du Colombier #include <libc.h>
3219b2ee8SDavid du Colombier #include <bio.h>
4219b2ee8SDavid du Colombier #include "dict.h"
5219b2ee8SDavid du Colombier
6219b2ee8SDavid du Colombier /*
7219b2ee8SDavid du Colombier * American Heritage Dictionary (encrypted)
8219b2ee8SDavid du Colombier */
9219b2ee8SDavid du Colombier
10219b2ee8SDavid du Colombier static Rune intab[256] = {
11219b2ee8SDavid du Colombier [0x82] L'é',
12219b2ee8SDavid du Colombier [0x85] L'à',
13*7dd7cddfSDavid du Colombier [0x89] L'ë',
14219b2ee8SDavid du Colombier [0x8a] L'è',
15219b2ee8SDavid du Colombier [0xa4] L'ñ',
16219b2ee8SDavid du Colombier [0xf8] L'°',
17219b2ee8SDavid du Colombier [0xf9] L'·',
18219b2ee8SDavid du Colombier };
19219b2ee8SDavid du Colombier
20219b2ee8SDavid du Colombier static char tag[64];
21219b2ee8SDavid du Colombier
22219b2ee8SDavid du Colombier enum{
23219b2ee8SDavid du Colombier Run, Openper, Openat, Closeat
24219b2ee8SDavid du Colombier };
25219b2ee8SDavid du Colombier
26219b2ee8SDavid du Colombier void
ahdprintentry(Entry e,int cmd)27219b2ee8SDavid du Colombier ahdprintentry(Entry e, int cmd)
28219b2ee8SDavid du Colombier {
29219b2ee8SDavid du Colombier static int inited;
30219b2ee8SDavid du Colombier long addr;
31219b2ee8SDavid du Colombier char *p, *t = tag;
32219b2ee8SDavid du Colombier int obreaklen;
33219b2ee8SDavid du Colombier int c, state = Run;
34219b2ee8SDavid du Colombier
35219b2ee8SDavid du Colombier if(!inited){
36219b2ee8SDavid du Colombier for(c=0; c<256; c++)
37219b2ee8SDavid du Colombier if(intab[c] == 0)
38219b2ee8SDavid du Colombier intab[c] = c;
39219b2ee8SDavid du Colombier inited = 1;
40219b2ee8SDavid du Colombier }
41219b2ee8SDavid du Colombier obreaklen = breaklen;
42219b2ee8SDavid du Colombier breaklen = 80;
43219b2ee8SDavid du Colombier addr = e.doff;
44219b2ee8SDavid du Colombier for(p=e.start; p<e.end; p++){
45219b2ee8SDavid du Colombier c = intab[(*p ^ (addr++>>1))&0xff];
46219b2ee8SDavid du Colombier switch(state){
47219b2ee8SDavid du Colombier case Run:
48219b2ee8SDavid du Colombier if(c == '%'){
49219b2ee8SDavid du Colombier t = tag;
50219b2ee8SDavid du Colombier state = Openper;
51219b2ee8SDavid du Colombier break;
52219b2ee8SDavid du Colombier }
53219b2ee8SDavid du Colombier Putchar:
54219b2ee8SDavid du Colombier if(c == '\n')
55219b2ee8SDavid du Colombier outnl(0);
56219b2ee8SDavid du Colombier else if(c < Runeself)
57219b2ee8SDavid du Colombier outchar(c);
58219b2ee8SDavid du Colombier else
59219b2ee8SDavid du Colombier outrune(c);
60219b2ee8SDavid du Colombier break;
61219b2ee8SDavid du Colombier
62219b2ee8SDavid du Colombier case Openper:
63219b2ee8SDavid du Colombier if(c == '@')
64219b2ee8SDavid du Colombier state = Openat;
65219b2ee8SDavid du Colombier else{
66219b2ee8SDavid du Colombier outchar('%');
67219b2ee8SDavid du Colombier state = Run;
68219b2ee8SDavid du Colombier goto Putchar;
69219b2ee8SDavid du Colombier }
70219b2ee8SDavid du Colombier break;
71219b2ee8SDavid du Colombier
72219b2ee8SDavid du Colombier case Openat:
73219b2ee8SDavid du Colombier if(c == '@')
74219b2ee8SDavid du Colombier state = Closeat;
75219b2ee8SDavid du Colombier else if(t < &tag[sizeof tag-1])
76219b2ee8SDavid du Colombier *t++ = c;
77219b2ee8SDavid du Colombier break;
78219b2ee8SDavid du Colombier
79219b2ee8SDavid du Colombier case Closeat:
80219b2ee8SDavid du Colombier if(c == '%'){
81219b2ee8SDavid du Colombier *t = 0;
82219b2ee8SDavid du Colombier switch(cmd){
83219b2ee8SDavid du Colombier case 'h':
84219b2ee8SDavid du Colombier if(strcmp("EH", tag) == 0)
85219b2ee8SDavid du Colombier goto out;
86219b2ee8SDavid du Colombier break;
87219b2ee8SDavid du Colombier case 'r':
88219b2ee8SDavid du Colombier outprint("%%@%s@%%", tag);
89219b2ee8SDavid du Colombier break;
90219b2ee8SDavid du Colombier }
91219b2ee8SDavid du Colombier state = Run;
92219b2ee8SDavid du Colombier }else{
93219b2ee8SDavid du Colombier if(t < &tag[sizeof tag-1])
94219b2ee8SDavid du Colombier *t++ = '@';
95219b2ee8SDavid du Colombier if(t < &tag[sizeof tag-1])
96219b2ee8SDavid du Colombier *t++ = c;
97219b2ee8SDavid du Colombier state = Openat;
98219b2ee8SDavid du Colombier }
99219b2ee8SDavid du Colombier break;
100219b2ee8SDavid du Colombier }
101219b2ee8SDavid du Colombier }
102219b2ee8SDavid du Colombier out:
103219b2ee8SDavid du Colombier outnl(0);
104219b2ee8SDavid du Colombier breaklen = obreaklen;
105219b2ee8SDavid du Colombier }
106219b2ee8SDavid du Colombier
107219b2ee8SDavid du Colombier long
ahdnextoff(long fromoff)108219b2ee8SDavid du Colombier ahdnextoff(long fromoff)
109219b2ee8SDavid du Colombier {
110219b2ee8SDavid du Colombier static char *patterns[] = { "%@NL@%", "%@2@%", 0 };
111219b2ee8SDavid du Colombier int c, k = 0, state = 0;
112219b2ee8SDavid du Colombier char *pat = patterns[0];
113219b2ee8SDavid du Colombier long defoff = -1;
114219b2ee8SDavid du Colombier
115219b2ee8SDavid du Colombier if(Bseek(bdict, fromoff, 0) < 0)
116219b2ee8SDavid du Colombier return -1;
117*7dd7cddfSDavid du Colombier while((c = Bgetc(bdict)) >= 0){
118219b2ee8SDavid du Colombier c ^= (fromoff++>>1)&0xff;
119219b2ee8SDavid du Colombier if(c != pat[state]){
120219b2ee8SDavid du Colombier state = 0;
121219b2ee8SDavid du Colombier continue;
122219b2ee8SDavid du Colombier }
123219b2ee8SDavid du Colombier if(pat[++state])
124219b2ee8SDavid du Colombier continue;
125219b2ee8SDavid du Colombier if(pat = patterns[++k]){ /* assign = */
126219b2ee8SDavid du Colombier state = 0;
127219b2ee8SDavid du Colombier defoff = fromoff-6;
128219b2ee8SDavid du Colombier continue;
129219b2ee8SDavid du Colombier }
130219b2ee8SDavid du Colombier return fromoff-5;
131219b2ee8SDavid du Colombier }
132219b2ee8SDavid du Colombier return defoff;
133219b2ee8SDavid du Colombier }
134219b2ee8SDavid du Colombier
135219b2ee8SDavid du Colombier void
ahdprintkey(void)136219b2ee8SDavid du Colombier ahdprintkey(void)
137219b2ee8SDavid du Colombier {
138219b2ee8SDavid du Colombier Bprint(bout, "No pronunciations.\n");
139219b2ee8SDavid du Colombier }
140