xref: /plan9/sys/src/cmd/dict/ahd.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
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