xref: /plan9-contrib/sys/src/cmd/dict/roget.c (revision 119a69fa8ad92159a87063874a5e6ab47dcf1bcf)
1*119a69faSDavid du Colombier #include <u.h>
2*119a69faSDavid du Colombier #include <libc.h>
3*119a69faSDavid du Colombier #include <bio.h>
4*119a69faSDavid du Colombier #include <ctype.h>
5*119a69faSDavid du Colombier #include "dict.h"
6*119a69faSDavid du Colombier 
7*119a69faSDavid du Colombier /* Roget's Thesaurus from project Gutenberg */
8*119a69faSDavid du Colombier 
9*119a69faSDavid du Colombier static long Last = 0;
10*119a69faSDavid du Colombier 
11*119a69faSDavid du Colombier void
rogetprintentry(Entry e,int cmd)12*119a69faSDavid du Colombier rogetprintentry(Entry e, int cmd)
13*119a69faSDavid du Colombier {
14*119a69faSDavid du Colombier 	int spc;
15*119a69faSDavid du Colombier 	char c, *p;
16*119a69faSDavid du Colombier 
17*119a69faSDavid du Colombier 	spc = 0;
18*119a69faSDavid du Colombier 	p = e.start;
19*119a69faSDavid du Colombier 
20*119a69faSDavid du Colombier 	if(cmd == 'h'){
21*119a69faSDavid du Colombier 		while(!isspace(*p) && p < e.end)
22*119a69faSDavid du Colombier 			p++;
23*119a69faSDavid du Colombier 		while(strncmp(p, " -- ", 4) != 0 && p < e.end){
24*119a69faSDavid du Colombier 			while(isspace(*p) && p < e.end)
25*119a69faSDavid du Colombier 				p++;
26*119a69faSDavid du Colombier 			if (*p == '[' || *p == '{'){
27*119a69faSDavid du Colombier 				c = (*p == '[')? ']': '}';
28*119a69faSDavid du Colombier 				while(*p != c && p < e.end)
29*119a69faSDavid du Colombier 					p++;
30*119a69faSDavid du Colombier 				p++;
31*119a69faSDavid du Colombier 				continue;
32*119a69faSDavid du Colombier 			}
33*119a69faSDavid du Colombier 			if (isdigit(*p) || ispunct(*p)){
34*119a69faSDavid du Colombier 				while(!isspace(*p) && p < e.end)
35*119a69faSDavid du Colombier 					p++;
36*119a69faSDavid du Colombier 				continue;
37*119a69faSDavid du Colombier 			}
38*119a69faSDavid du Colombier 
39*119a69faSDavid du Colombier 
40*119a69faSDavid du Colombier 			if (isspace(*p))
41*119a69faSDavid du Colombier 				spc = 1;
42*119a69faSDavid du Colombier 			else
43*119a69faSDavid du Colombier 			if (spc){
44*119a69faSDavid du Colombier 				outchar(' ');
45*119a69faSDavid du Colombier 				spc = 0;
46*119a69faSDavid du Colombier 			}
47*119a69faSDavid du Colombier 
48*119a69faSDavid du Colombier 			while(!isspace(*p) && p < e.end)
49*119a69faSDavid du Colombier 				outchar(*p++);
50*119a69faSDavid du Colombier 		}
51*119a69faSDavid du Colombier 		return;
52*119a69faSDavid du Colombier 	}
53*119a69faSDavid du Colombier 
54*119a69faSDavid du Colombier 	while(p < e.end && !isspace(*p))
55*119a69faSDavid du Colombier 		p++;
56*119a69faSDavid du Colombier 	while(p < e.end && isspace(*p))
57*119a69faSDavid du Colombier 		p++;
58*119a69faSDavid du Colombier 
59*119a69faSDavid du Colombier 	while (p < e.end){
60*119a69faSDavid du Colombier 		if (p < e.end -4 && strncmp(p, " -- ", 4) == 0){	/* first line */
61*119a69faSDavid du Colombier 			outnl(2);
62*119a69faSDavid du Colombier 			p += 4;
63*119a69faSDavid du Colombier 			spc = 0;
64*119a69faSDavid du Colombier 		}
65*119a69faSDavid du Colombier 
66*119a69faSDavid du Colombier 		if (p < e.end -2 && strncmp(p, "[ ", 4) == 0){		/* twiddle layout */
67*119a69faSDavid du Colombier 			outchars(" [");
68*119a69faSDavid du Colombier 			continue;
69*119a69faSDavid du Colombier 		}
70*119a69faSDavid du Colombier 
71*119a69faSDavid du Colombier 		if (p < e.end -4 && strncmp(p, "&c (", 4) == 0){	/* usefull xref */
72*119a69faSDavid du Colombier 			if (spc)
73*119a69faSDavid du Colombier 				outchar(' ');
74*119a69faSDavid du Colombier 			outchar('/');
75*119a69faSDavid du Colombier 			while(p < e.end && *p != '(')
76*119a69faSDavid du Colombier 				p++;
77*119a69faSDavid du Colombier 			p++;
78*119a69faSDavid du Colombier 			while(p < e.end && *p != ')')
79*119a69faSDavid du Colombier 				outchar(*p++);
80*119a69faSDavid du Colombier 			p++;
81*119a69faSDavid du Colombier 			while(p < e.end && isspace(*p))
82*119a69faSDavid du Colombier 				p++;
83*119a69faSDavid du Colombier 			while(p < e.end && isdigit(*p))
84*119a69faSDavid du Colombier 				p++;
85*119a69faSDavid du Colombier 			outchar('/');
86*119a69faSDavid du Colombier 			continue;
87*119a69faSDavid du Colombier 		}
88*119a69faSDavid du Colombier 
89*119a69faSDavid du Colombier 		if (p < e.end -3 && strncmp(p, "&c ", 3) == 0){		/* less usefull xref */
90*119a69faSDavid du Colombier 			while(p < e.end && !isdigit(*p))
91*119a69faSDavid du Colombier 				p++;
92*119a69faSDavid du Colombier 			while(p < e.end && isdigit(*p))
93*119a69faSDavid du Colombier 				p++;
94*119a69faSDavid du Colombier 			continue;
95*119a69faSDavid du Colombier 		}
96*119a69faSDavid du Colombier 
97*119a69faSDavid du Colombier 		if (*p == '\n' && p < (e.end -1)){			/* their newlines */
98*119a69faSDavid du Colombier 			spc = 0;
99*119a69faSDavid du Colombier 			p++;
100*119a69faSDavid du Colombier 			if (isspace(*p)){				/* their continuation line */
101*119a69faSDavid du Colombier 				while (isspace(*p))
102*119a69faSDavid du Colombier 					p++;
103*119a69faSDavid du Colombier 				p--;
104*119a69faSDavid du Colombier 			}
105*119a69faSDavid du Colombier 			else{
106*119a69faSDavid du Colombier 				outnl(2);
107*119a69faSDavid du Colombier 			}
108*119a69faSDavid du Colombier 		}
109*119a69faSDavid du Colombier 		if (spc && *p != ';' && *p != '.' &&
110*119a69faSDavid du Colombier 		    *p != ',' && !isspace(*p)){				/* drop spaces before punct */
111*119a69faSDavid du Colombier 			spc = 0;
112*119a69faSDavid du Colombier 			outchar(' ');
113*119a69faSDavid du Colombier 		}
114*119a69faSDavid du Colombier 		if (isspace(*p))
115*119a69faSDavid du Colombier 			spc = 1;
116*119a69faSDavid du Colombier 		else
117*119a69faSDavid du Colombier 			outchar(*p);
118*119a69faSDavid du Colombier 		p++;
119*119a69faSDavid du Colombier 	}
120*119a69faSDavid du Colombier 	outnl(0);
121*119a69faSDavid du Colombier }
122*119a69faSDavid du Colombier 
123*119a69faSDavid du Colombier long
rogetnextoff(long fromoff)124*119a69faSDavid du Colombier rogetnextoff(long fromoff)
125*119a69faSDavid du Colombier {
126*119a69faSDavid du Colombier 	int i;
127*119a69faSDavid du Colombier 	vlong l;
128*119a69faSDavid du Colombier 	char *p;
129*119a69faSDavid du Colombier 
130*119a69faSDavid du Colombier 	Bseek(bdict, fromoff, 0);
131*119a69faSDavid du Colombier 	Brdline(bdict, '\n');
132*119a69faSDavid du Colombier 	while ((p = Brdline(bdict, '\n')) != nil){
133*119a69faSDavid du Colombier 		l = Blinelen(bdict);
134*119a69faSDavid du Colombier 		if (!isdigit(*p))
135*119a69faSDavid du Colombier 			continue;
136*119a69faSDavid du Colombier 		for (i = 0; i < l-4; i++)
137*119a69faSDavid du Colombier 			if (strncmp(p+i, " -- ", 4) == 0)
138*119a69faSDavid du Colombier 				return Boffset(bdict)-l;
139*119a69faSDavid du Colombier 	}
140*119a69faSDavid du Colombier 	return Boffset(bdict);
141*119a69faSDavid du Colombier }
142*119a69faSDavid du Colombier 
143*119a69faSDavid du Colombier void
rogetprintkey(void)144*119a69faSDavid du Colombier rogetprintkey(void)
145*119a69faSDavid du Colombier {
146*119a69faSDavid du Colombier 	Bprint(bout, "No pronunciation key.\n");
147*119a69faSDavid du Colombier }
148