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