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 /* Possible tags */
7 08708877 2003-11-25 devnull enum {
8 08708877 2003-11-25 devnull DF, /* definition */
9 08708877 2003-11-25 devnull DX, /* definition/example */
10 08708877 2003-11-25 devnull ET, /* etymology */
11 08708877 2003-11-25 devnull EX, /* example */
12 08708877 2003-11-25 devnull LA, /* label */
13 08708877 2003-11-25 devnull ME, /* main entry */
14 08708877 2003-11-25 devnull NU, /* sense number */
15 08708877 2003-11-25 devnull PR, /* pronunciation */
16 08708877 2003-11-25 devnull PS, /* grammar part */
17 08708877 2003-11-25 devnull XR, /* cross reference */
18 cbeb0b26 2006-04-01 devnull XX /* cross reference (whole entry) */
19 08708877 2003-11-25 devnull };
20 08708877 2003-11-25 devnull
21 08708877 2003-11-25 devnull /* Assoc tables must be sorted on first field */
22 08708877 2003-11-25 devnull
23 08708877 2003-11-25 devnull static Assoc tagtab[] = {
24 08708877 2003-11-25 devnull {"df", DF},
25 08708877 2003-11-25 devnull {"dx", DX},
26 08708877 2003-11-25 devnull {"et", ET},
27 08708877 2003-11-25 devnull {"ex", EX},
28 08708877 2003-11-25 devnull {"la", LA},
29 08708877 2003-11-25 devnull {"me", ME},
30 08708877 2003-11-25 devnull {"nu", NU},
31 08708877 2003-11-25 devnull {"pr", PR},
32 08708877 2003-11-25 devnull {"ps", PS},
33 08708877 2003-11-25 devnull {"xr", XR},
34 cbeb0b26 2006-04-01 devnull {"xx", XX}
35 08708877 2003-11-25 devnull };
36 08708877 2003-11-25 devnull static long sget(char *, char *, char **, char **);
37 08708877 2003-11-25 devnull static void soutpiece(char *, char *);
38 08708877 2003-11-25 devnull
39 08708877 2003-11-25 devnull void
40 08708877 2003-11-25 devnull slangprintentry(Entry e, int cmd)
41 08708877 2003-11-25 devnull {
42 08708877 2003-11-25 devnull char *p, *pe, *vs, *ve;
43 08708877 2003-11-25 devnull long t;
44 08708877 2003-11-25 devnull
45 08708877 2003-11-25 devnull p = e.start;
46 08708877 2003-11-25 devnull pe = e.end;
47 08708877 2003-11-25 devnull if(cmd == 'h') {
48 08708877 2003-11-25 devnull t = sget(p, pe, &vs, &ve);
49 08708877 2003-11-25 devnull if(t == ME)
50 08708877 2003-11-25 devnull soutpiece(vs, ve);
51 08708877 2003-11-25 devnull outnl(0);
52 08708877 2003-11-25 devnull return;
53 08708877 2003-11-25 devnull }
54 08708877 2003-11-25 devnull while(p < pe) {
55 08708877 2003-11-25 devnull switch(sget(p, pe, &vs, &ve)) {
56 08708877 2003-11-25 devnull case DF:
57 08708877 2003-11-25 devnull soutpiece(vs, ve);
58 08708877 2003-11-25 devnull outchars(". ");
59 08708877 2003-11-25 devnull break;
60 08708877 2003-11-25 devnull case DX:
61 08708877 2003-11-25 devnull soutpiece(vs, ve);
62 08708877 2003-11-25 devnull outchars(". ");
63 08708877 2003-11-25 devnull break;
64 08708877 2003-11-25 devnull case ET:
65 08708877 2003-11-25 devnull outchars("[");
66 08708877 2003-11-25 devnull soutpiece(vs, ve);
67 08708877 2003-11-25 devnull outchars("] ");
68 08708877 2003-11-25 devnull break;
69 08708877 2003-11-25 devnull case EX:
70 08708877 2003-11-25 devnull outchars("E.g., ");
71 08708877 2003-11-25 devnull soutpiece(vs, ve);
72 08708877 2003-11-25 devnull outchars(". ");
73 08708877 2003-11-25 devnull break;
74 08708877 2003-11-25 devnull case LA:
75 08708877 2003-11-25 devnull outchars("(");
76 08708877 2003-11-25 devnull soutpiece(vs, ve);
77 08708877 2003-11-25 devnull outchars(") ");
78 08708877 2003-11-25 devnull break;
79 08708877 2003-11-25 devnull case ME:
80 08708877 2003-11-25 devnull outnl(0);
81 08708877 2003-11-25 devnull soutpiece(vs, ve);
82 08708877 2003-11-25 devnull outnl(0);
83 08708877 2003-11-25 devnull break;
84 08708877 2003-11-25 devnull case NU:
85 08708877 2003-11-25 devnull outnl(2);
86 08708877 2003-11-25 devnull soutpiece(vs, ve);
87 08708877 2003-11-25 devnull outchars(". ");
88 08708877 2003-11-25 devnull break;
89 08708877 2003-11-25 devnull case PR:
90 08708877 2003-11-25 devnull outchars("[");
91 08708877 2003-11-25 devnull soutpiece(vs, ve);
92 08708877 2003-11-25 devnull outchars("] ");
93 08708877 2003-11-25 devnull break;
94 08708877 2003-11-25 devnull case PS:
95 08708877 2003-11-25 devnull outnl(1);
96 08708877 2003-11-25 devnull soutpiece(vs, ve);
97 08708877 2003-11-25 devnull outchars(". ");
98 08708877 2003-11-25 devnull break;
99 08708877 2003-11-25 devnull case XR:
100 08708877 2003-11-25 devnull outchars("See ");
101 08708877 2003-11-25 devnull soutpiece(vs, ve);
102 08708877 2003-11-25 devnull outchars(". ");
103 08708877 2003-11-25 devnull break;
104 08708877 2003-11-25 devnull case XX:
105 08708877 2003-11-25 devnull outchars("See ");
106 08708877 2003-11-25 devnull soutpiece(vs, ve);
107 08708877 2003-11-25 devnull outchars(". ");
108 08708877 2003-11-25 devnull break;
109 08708877 2003-11-25 devnull default:
110 08708877 2003-11-25 devnull ve = pe; /* will end loop */
111 08708877 2003-11-25 devnull break;
112 08708877 2003-11-25 devnull }
113 08708877 2003-11-25 devnull p = ve;
114 08708877 2003-11-25 devnull }
115 08708877 2003-11-25 devnull outnl(0);
116 08708877 2003-11-25 devnull }
117 08708877 2003-11-25 devnull
118 08708877 2003-11-25 devnull long
119 08708877 2003-11-25 devnull slangnextoff(long fromoff)
120 08708877 2003-11-25 devnull {
121 08708877 2003-11-25 devnull long a;
122 08708877 2003-11-25 devnull char *p;
123 08708877 2003-11-25 devnull
124 08708877 2003-11-25 devnull a = Bseek(bdict, fromoff, 0);
125 08708877 2003-11-25 devnull if(a < 0)
126 08708877 2003-11-25 devnull return -1;
127 08708877 2003-11-25 devnull for(;;) {
128 08708877 2003-11-25 devnull p = Brdline(bdict, '\n');
129 08708877 2003-11-25 devnull if(!p)
130 08708877 2003-11-25 devnull break;
131 08708877 2003-11-25 devnull if(p[0] == 'm' && p[1] == 'e' && p[2] == ' ')
132 08708877 2003-11-25 devnull return (Boffset(bdict)-Blinelen(bdict));
133 08708877 2003-11-25 devnull }
134 08708877 2003-11-25 devnull return -1;
135 08708877 2003-11-25 devnull }
136 08708877 2003-11-25 devnull
137 08708877 2003-11-25 devnull void
138 08708877 2003-11-25 devnull slangprintkey(void)
139 08708877 2003-11-25 devnull {
140 08708877 2003-11-25 devnull Bprint(bout, "No key\n");
141 08708877 2003-11-25 devnull }
142 08708877 2003-11-25 devnull
143 08708877 2003-11-25 devnull /*
144 08708877 2003-11-25 devnull * Starting from b, find next line beginning with a tag.
145 08708877 2003-11-25 devnull * Don't go past e, but assume *e==0.
146 08708877 2003-11-25 devnull * Return tag value, or -1 if no more tags before e.
147 08708877 2003-11-25 devnull * Set pvb to beginning of value (after tag).
148 08708877 2003-11-25 devnull * Set pve to point at newline that ends the value.
149 08708877 2003-11-25 devnull */
150 08708877 2003-11-25 devnull static long
151 08708877 2003-11-25 devnull sget(char *b, char *e, char **pvb, char **pve)
152 08708877 2003-11-25 devnull {
153 08708877 2003-11-25 devnull char *p;
154 08708877 2003-11-25 devnull char buf[3];
155 08708877 2003-11-25 devnull long t, tans;
156 08708877 2003-11-25 devnull
157 08708877 2003-11-25 devnull buf[2] = 0;
158 08708877 2003-11-25 devnull tans = -1;
159 08708877 2003-11-25 devnull for(p = b;;) {
160 08708877 2003-11-25 devnull if(p[2] == ' ') {
161 08708877 2003-11-25 devnull buf[0] = p[0];
162 08708877 2003-11-25 devnull buf[1] = p[1];
163 08708877 2003-11-25 devnull t = lookassoc(tagtab, asize(tagtab), buf);
164 08708877 2003-11-25 devnull if(t < 0) {
165 08708877 2003-11-25 devnull if(debug)
166 08708877 2003-11-25 devnull err("tag %s\n", buf);
167 08708877 2003-11-25 devnull p += 3;
168 08708877 2003-11-25 devnull } else {
169 08708877 2003-11-25 devnull if(tans < 0) {
170 08708877 2003-11-25 devnull p += 3;
171 08708877 2003-11-25 devnull tans = t;
172 08708877 2003-11-25 devnull *pvb = p;
173 08708877 2003-11-25 devnull } else {
174 08708877 2003-11-25 devnull *pve = p;
175 08708877 2003-11-25 devnull break;
176 08708877 2003-11-25 devnull }
177 08708877 2003-11-25 devnull }
178 08708877 2003-11-25 devnull }
179 08708877 2003-11-25 devnull p = strchr(p, '\n');
180 08708877 2003-11-25 devnull if(!p || ++p >= e) {
181 08708877 2003-11-25 devnull if(tans >= 0)
182 08708877 2003-11-25 devnull *pve = e-1;
183 08708877 2003-11-25 devnull break;
184 08708877 2003-11-25 devnull }
185 08708877 2003-11-25 devnull }
186 08708877 2003-11-25 devnull return tans;
187 08708877 2003-11-25 devnull }
188 08708877 2003-11-25 devnull
189 08708877 2003-11-25 devnull static void
190 08708877 2003-11-25 devnull soutpiece(char *b, char *e)
191 08708877 2003-11-25 devnull {
192 08708877 2003-11-25 devnull int c, lastc;
193 08708877 2003-11-25 devnull
194 08708877 2003-11-25 devnull lastc = 0;
195 08708877 2003-11-25 devnull while(b < e) {
196 08708877 2003-11-25 devnull c = *b++;
197 08708877 2003-11-25 devnull if(c == '\n')
198 08708877 2003-11-25 devnull c = ' ';
199 08708877 2003-11-25 devnull if(!(c == ' ' && lastc == ' ') && c != '@')
200 08708877 2003-11-25 devnull outchar(c);
201 08708877 2003-11-25 devnull lastc = c;
202 08708877 2003-11-25 devnull }
203 08708877 2003-11-25 devnull }