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 BEG, /* beginning of entry */
9 08708877 2003-11-25 devnull AB, /* abstract */
10 08708877 2003-11-25 devnull AN, /* database serial number */
11 08708877 2003-11-25 devnull AS, /* author (one at a time) */
12 08708877 2003-11-25 devnull AU, /* all authors */
13 08708877 2003-11-25 devnull AW, /* award_awardee */
14 08708877 2003-11-25 devnull BW, /* bw or c */
15 08708877 2003-11-25 devnull CA, /* cast: character_actor */
16 08708877 2003-11-25 devnull CN, /* cinematography */
17 08708877 2003-11-25 devnull CO, /* country */
18 08708877 2003-11-25 devnull CR, /* miscellaneous job_name */
19 08708877 2003-11-25 devnull DE, /* topic keyword */
20 08708877 2003-11-25 devnull DR, /* director */
21 08708877 2003-11-25 devnull ED, /* editor */
22 08708877 2003-11-25 devnull MP, /* MPAA rating (R, PG, etc.) */
23 08708877 2003-11-25 devnull NT, /* note */
24 08708877 2003-11-25 devnull PR, /* producer and for ...*/
25 08708877 2003-11-25 devnull PS, /* producer (repeats info in PR) */
26 08708877 2003-11-25 devnull RA, /* rating (letter) */
27 08708877 2003-11-25 devnull RD, /* release date */
28 08708877 2003-11-25 devnull RT, /* running time */
29 08708877 2003-11-25 devnull RV, /* review citation */
30 08708877 2003-11-25 devnull ST, /* production or release company (repeats info in PR) */
31 08708877 2003-11-25 devnull TI, /* title[; original foreign title] */
32 08708877 2003-11-25 devnull TX, /* paragraph of descriptive text */
33 08708877 2003-11-25 devnull VD, /* video information (format_time_company; or "Not Avail.") */
34 08708877 2003-11-25 devnull NTAG /* number of tags */
35 08708877 2003-11-25 devnull };
36 08708877 2003-11-25 devnull
37 08708877 2003-11-25 devnull /* Assoc tables must be sorted on first field */
38 08708877 2003-11-25 devnull
39 65d5010e 2004-03-26 devnull static char *tagtab[NTAG];
40 65d5010e 2004-03-26 devnull
41 65d5010e 2004-03-26 devnull static void
42 65d5010e 2004-03-26 devnull inittagtab(void)
43 65d5010e 2004-03-26 devnull {
44 65d5010e 2004-03-26 devnull tagtab[BEG]= "$$";
45 65d5010e 2004-03-26 devnull tagtab[AB]= "AB";
46 65d5010e 2004-03-26 devnull tagtab[AN]= "AN";
47 65d5010e 2004-03-26 devnull tagtab[AS]= "AS";
48 65d5010e 2004-03-26 devnull tagtab[AU]= "AU";
49 65d5010e 2004-03-26 devnull tagtab[AW]= "AW";
50 65d5010e 2004-03-26 devnull tagtab[BW]= "BW";
51 65d5010e 2004-03-26 devnull tagtab[CA]= "CA";
52 65d5010e 2004-03-26 devnull tagtab[CN]= "CN";
53 65d5010e 2004-03-26 devnull tagtab[CO]= "CO";
54 65d5010e 2004-03-26 devnull tagtab[CR]= "CR";
55 65d5010e 2004-03-26 devnull tagtab[DE]= "DE";
56 65d5010e 2004-03-26 devnull tagtab[DR]= "DR";
57 65d5010e 2004-03-26 devnull tagtab[ED]= "ED";
58 65d5010e 2004-03-26 devnull tagtab[MP]= "MP";
59 65d5010e 2004-03-26 devnull tagtab[NT]= "NT";
60 65d5010e 2004-03-26 devnull tagtab[PR]= "PR";
61 65d5010e 2004-03-26 devnull tagtab[PS]= "PS";
62 65d5010e 2004-03-26 devnull tagtab[RA]= "RA";
63 65d5010e 2004-03-26 devnull tagtab[RD]= "RD";
64 65d5010e 2004-03-26 devnull tagtab[RT]= "RT";
65 65d5010e 2004-03-26 devnull tagtab[RV]= "RV";
66 65d5010e 2004-03-26 devnull tagtab[ST]= "ST";
67 65d5010e 2004-03-26 devnull tagtab[TI]= "TI";
68 65d5010e 2004-03-26 devnull tagtab[TX]= "TX";
69 65d5010e 2004-03-26 devnull tagtab[VD]= "VD";
70 be22ae2d 2004-03-26 devnull }
71 08708877 2003-11-25 devnull
72 08708877 2003-11-25 devnull static char *mget(int, char *, char *, char **);
73 08708877 2003-11-25 devnull #if 0
74 08708877 2003-11-25 devnull static void moutall(int, char *, char *);
75 08708877 2003-11-25 devnull #endif
76 08708877 2003-11-25 devnull static void moutall2(int, char *, char *);
77 08708877 2003-11-25 devnull
78 08708877 2003-11-25 devnull void
79 08708877 2003-11-25 devnull movieprintentry(Entry ent, int cmd)
80 08708877 2003-11-25 devnull {
81 08708877 2003-11-25 devnull char *p, *e, *ps, *pe, *pn;
82 08708877 2003-11-25 devnull int n;
83 08708877 2003-11-25 devnull
84 08708877 2003-11-25 devnull ps = ent.start;
85 08708877 2003-11-25 devnull pe = ent.end;
86 08708877 2003-11-25 devnull if(cmd == 'r') {
87 08708877 2003-11-25 devnull Bwrite(bout, ps, pe-ps);
88 08708877 2003-11-25 devnull return;
89 08708877 2003-11-25 devnull }
90 08708877 2003-11-25 devnull p = mget(TI, ps, pe, &e);
91 08708877 2003-11-25 devnull if(p) {
92 08708877 2003-11-25 devnull outpiece(p, e);
93 08708877 2003-11-25 devnull outnl(0);
94 08708877 2003-11-25 devnull }
95 08708877 2003-11-25 devnull if(cmd == 'h')
96 08708877 2003-11-25 devnull return;
97 08708877 2003-11-25 devnull outnl(2);
98 08708877 2003-11-25 devnull n = 0;
99 08708877 2003-11-25 devnull p = mget(RD, ps, pe, &e);
100 08708877 2003-11-25 devnull if(p) {
101 08708877 2003-11-25 devnull outchars("Released: ");
102 08708877 2003-11-25 devnull outpiece(p, e);
103 08708877 2003-11-25 devnull n++;
104 08708877 2003-11-25 devnull }
105 08708877 2003-11-25 devnull p = mget(CO, ps, pe, &e);
106 08708877 2003-11-25 devnull if(p) {
107 08708877 2003-11-25 devnull if(n)
108 08708877 2003-11-25 devnull outchars(", ");
109 08708877 2003-11-25 devnull outpiece(p, e);
110 08708877 2003-11-25 devnull n++;
111 08708877 2003-11-25 devnull }
112 08708877 2003-11-25 devnull p = mget(RT, ps, pe, &e);
113 08708877 2003-11-25 devnull if(p) {
114 08708877 2003-11-25 devnull if(n)
115 08708877 2003-11-25 devnull outchars(", ");
116 08708877 2003-11-25 devnull outchars("Running time: ");
117 08708877 2003-11-25 devnull outpiece(p, e);
118 08708877 2003-11-25 devnull n++;
119 08708877 2003-11-25 devnull }
120 08708877 2003-11-25 devnull p = mget(MP, ps, pe, &e);
121 08708877 2003-11-25 devnull if(p) {
122 08708877 2003-11-25 devnull if(n)
123 08708877 2003-11-25 devnull outchars(", ");
124 08708877 2003-11-25 devnull outpiece(p, e);
125 08708877 2003-11-25 devnull n++;
126 08708877 2003-11-25 devnull }
127 08708877 2003-11-25 devnull p = mget(BW, ps, pe, &e);
128 08708877 2003-11-25 devnull if(p) {
129 08708877 2003-11-25 devnull if(n)
130 08708877 2003-11-25 devnull outchars(", ");
131 08708877 2003-11-25 devnull if(*p == 'c' || *p == 'C')
132 08708877 2003-11-25 devnull outchars("Color");
133 08708877 2003-11-25 devnull else
134 08708877 2003-11-25 devnull outchars("B&W");
135 08708877 2003-11-25 devnull n++;
136 08708877 2003-11-25 devnull }
137 08708877 2003-11-25 devnull if(n) {
138 08708877 2003-11-25 devnull outchar('.');
139 08708877 2003-11-25 devnull outnl(1);
140 08708877 2003-11-25 devnull }
141 08708877 2003-11-25 devnull p = mget(VD, ps, pe, &e);
142 08708877 2003-11-25 devnull if(p) {
143 08708877 2003-11-25 devnull outchars("Video: ");
144 08708877 2003-11-25 devnull outpiece(p, e);
145 08708877 2003-11-25 devnull outnl(1);
146 08708877 2003-11-25 devnull }
147 08708877 2003-11-25 devnull p = mget(AU, ps, pe, &e);
148 08708877 2003-11-25 devnull if(p) {
149 08708877 2003-11-25 devnull outchars("By: ");
150 08708877 2003-11-25 devnull moutall2(AU, ps, pe);
151 08708877 2003-11-25 devnull outnl(1);
152 08708877 2003-11-25 devnull }
153 08708877 2003-11-25 devnull p = mget(DR, ps, pe, &e);
154 08708877 2003-11-25 devnull if(p) {
155 08708877 2003-11-25 devnull outchars("Director: ");
156 08708877 2003-11-25 devnull outpiece(p, e);
157 08708877 2003-11-25 devnull outnl(1);
158 08708877 2003-11-25 devnull }
159 08708877 2003-11-25 devnull p = mget(PR, ps, pe, &e);
160 08708877 2003-11-25 devnull if(p) {
161 08708877 2003-11-25 devnull outchars("Producer: ");
162 08708877 2003-11-25 devnull outpiece(p, e);
163 08708877 2003-11-25 devnull outnl(1);
164 08708877 2003-11-25 devnull }
165 08708877 2003-11-25 devnull p = mget(CN, ps, pe, &e);
166 08708877 2003-11-25 devnull if(p) {
167 08708877 2003-11-25 devnull outchars("Cinematograpy: ");
168 08708877 2003-11-25 devnull outpiece(p, e);
169 08708877 2003-11-25 devnull outnl(1);
170 08708877 2003-11-25 devnull }
171 08708877 2003-11-25 devnull p = mget(CR, ps, pe, &e);
172 08708877 2003-11-25 devnull if(p) {
173 08708877 2003-11-25 devnull outchars("Other Credits: ");
174 08708877 2003-11-25 devnull moutall2(CR, ps, pe);
175 08708877 2003-11-25 devnull }
176 08708877 2003-11-25 devnull outnl(2);
177 08708877 2003-11-25 devnull p = mget(CA, ps, pe, &e);
178 08708877 2003-11-25 devnull if(p) {
179 08708877 2003-11-25 devnull outchars("Cast: ");
180 08708877 2003-11-25 devnull moutall2(CA, ps, pe);
181 08708877 2003-11-25 devnull }
182 08708877 2003-11-25 devnull outnl(2);
183 08708877 2003-11-25 devnull p = mget(AW, ps, pe, &e);
184 08708877 2003-11-25 devnull if(p) {
185 08708877 2003-11-25 devnull outchars("Awards: ");
186 08708877 2003-11-25 devnull moutall2(AW, ps, pe);
187 08708877 2003-11-25 devnull outnl(2);
188 08708877 2003-11-25 devnull }
189 08708877 2003-11-25 devnull p = mget(NT, ps, pe, &e);
190 08708877 2003-11-25 devnull if(p) {
191 08708877 2003-11-25 devnull outpiece(p, e);
192 08708877 2003-11-25 devnull outnl(2);
193 08708877 2003-11-25 devnull }
194 08708877 2003-11-25 devnull p = mget(AB, ps, pe, &e);
195 08708877 2003-11-25 devnull if(p) {
196 08708877 2003-11-25 devnull outpiece(p, e);
197 08708877 2003-11-25 devnull outnl(2);
198 08708877 2003-11-25 devnull }
199 08708877 2003-11-25 devnull pn = ps;
200 08708877 2003-11-25 devnull n = 0;
201 08708877 2003-11-25 devnull while((p = mget(TX, pn, pe, &pn)) != 0) {
202 08708877 2003-11-25 devnull if(n++)
203 08708877 2003-11-25 devnull outnl(1);
204 08708877 2003-11-25 devnull outpiece(p, pn);
205 08708877 2003-11-25 devnull }
206 08708877 2003-11-25 devnull outnl(0);
207 08708877 2003-11-25 devnull }
208 08708877 2003-11-25 devnull
209 08708877 2003-11-25 devnull long
210 08708877 2003-11-25 devnull movienextoff(long fromoff)
211 08708877 2003-11-25 devnull {
212 08708877 2003-11-25 devnull long a;
213 08708877 2003-11-25 devnull char *p;
214 08708877 2003-11-25 devnull
215 08708877 2003-11-25 devnull a = Bseek(bdict, fromoff, 0);
216 08708877 2003-11-25 devnull if(a < 0)
217 08708877 2003-11-25 devnull return -1;
218 08708877 2003-11-25 devnull for(;;) {
219 08708877 2003-11-25 devnull p = Brdline(bdict, '\n');
220 08708877 2003-11-25 devnull if(!p)
221 08708877 2003-11-25 devnull break;
222 08708877 2003-11-25 devnull if(p[0] == '$' && p[1] == '$')
223 08708877 2003-11-25 devnull return (Boffset(bdict)-Blinelen(bdict));
224 08708877 2003-11-25 devnull }
225 08708877 2003-11-25 devnull return -1;
226 08708877 2003-11-25 devnull }
227 08708877 2003-11-25 devnull
228 08708877 2003-11-25 devnull void
229 08708877 2003-11-25 devnull movieprintkey(void)
230 08708877 2003-11-25 devnull {
231 08708877 2003-11-25 devnull Bprint(bout, "No key\n");
232 08708877 2003-11-25 devnull }
233 08708877 2003-11-25 devnull
234 08708877 2003-11-25 devnull /*
235 08708877 2003-11-25 devnull * write a comma-separated list of all tag values between b and e
236 08708877 2003-11-25 devnull */
237 08708877 2003-11-25 devnull #if 0
238 08708877 2003-11-25 devnull static void
239 08708877 2003-11-25 devnull moutall(int tag, char *b, char *e)
240 08708877 2003-11-25 devnull {
241 08708877 2003-11-25 devnull char *p, *pn;
242 08708877 2003-11-25 devnull int n;
243 08708877 2003-11-25 devnull
244 08708877 2003-11-25 devnull n = 0;
245 08708877 2003-11-25 devnull pn = b;
246 08708877 2003-11-25 devnull while((p = mget(tag, pn, e, &pn)) != 0) {
247 08708877 2003-11-25 devnull if(n++)
248 08708877 2003-11-25 devnull outchars(", ");
249 08708877 2003-11-25 devnull outpiece(p, pn);
250 08708877 2003-11-25 devnull }
251 08708877 2003-11-25 devnull }
252 08708877 2003-11-25 devnull #endif
253 08708877 2003-11-25 devnull
254 08708877 2003-11-25 devnull /*
255 08708877 2003-11-25 devnull * like moutall, but values are expected to have form:
256 08708877 2003-11-25 devnull * field1_field2
257 08708877 2003-11-25 devnull * and we are to output 'field2 (field1)' for each
258 08708877 2003-11-25 devnull * (sometimes field1 has underscores, so search from end)
259 08708877 2003-11-25 devnull */
260 08708877 2003-11-25 devnull static void
261 08708877 2003-11-25 devnull moutall2(int tag, char *b, char *e)
262 08708877 2003-11-25 devnull {
263 08708877 2003-11-25 devnull char *p, *pn, *us, *q;
264 08708877 2003-11-25 devnull int n;
265 08708877 2003-11-25 devnull
266 08708877 2003-11-25 devnull n = 0;
267 08708877 2003-11-25 devnull pn = b;
268 08708877 2003-11-25 devnull while((p = mget(tag, pn, e, &pn)) != 0) {
269 08708877 2003-11-25 devnull if(n++)
270 08708877 2003-11-25 devnull outchars(", ");
271 08708877 2003-11-25 devnull us = 0;
272 08708877 2003-11-25 devnull for(q = pn-1; q >= p; q--)
273 08708877 2003-11-25 devnull if(*q == '_') {
274 08708877 2003-11-25 devnull us = q;
275 08708877 2003-11-25 devnull break;
276 08708877 2003-11-25 devnull }
277 08708877 2003-11-25 devnull if(us) {
278 08708877 2003-11-25 devnull /*
279 08708877 2003-11-25 devnull * Hack to fix cast list Himself/Herself
280 08708877 2003-11-25 devnull */
281 08708877 2003-11-25 devnull if(strncmp(us+1, "Himself", 7) == 0 ||
282 08708877 2003-11-25 devnull strncmp(us+1, "Herself", 7) == 0) {
283 08708877 2003-11-25 devnull outpiece(p, us);
284 08708877 2003-11-25 devnull outchars(" (");
285 08708877 2003-11-25 devnull outpiece(us+1, pn);
286 08708877 2003-11-25 devnull outchar(')');
287 08708877 2003-11-25 devnull } else {
288 08708877 2003-11-25 devnull outpiece(us+1, pn);
289 08708877 2003-11-25 devnull outchars(" (");
290 08708877 2003-11-25 devnull outpiece(p, us);
291 08708877 2003-11-25 devnull outchar(')');
292 08708877 2003-11-25 devnull }
293 08708877 2003-11-25 devnull } else {
294 08708877 2003-11-25 devnull outpiece(p, pn);
295 08708877 2003-11-25 devnull }
296 08708877 2003-11-25 devnull }
297 08708877 2003-11-25 devnull }
298 08708877 2003-11-25 devnull
299 08708877 2003-11-25 devnull /*
300 08708877 2003-11-25 devnull * Starting from b, find next line beginning with tagtab[tag].
301 08708877 2003-11-25 devnull * Don't go past e, but assume *e==0.
302 08708877 2003-11-25 devnull * Return pointer to beginning of value (after tag), and set
303 08708877 2003-11-25 devnull * eptr to point at newline that ends the value
304 08708877 2003-11-25 devnull */
305 08708877 2003-11-25 devnull static char *
306 08708877 2003-11-25 devnull mget(int tag, char *b, char *e, char **eptr)
307 08708877 2003-11-25 devnull {
308 08708877 2003-11-25 devnull char *p, *t, *ans;
309 08708877 2003-11-25 devnull
310 08708877 2003-11-25 devnull if(tag < 0 || tag >= NTAG)
311 08708877 2003-11-25 devnull return 0;
312 65d5010e 2004-03-26 devnull if(tagtab[BEG] == 0)
313 65d5010e 2004-03-26 devnull inittagtab();
314 08708877 2003-11-25 devnull t = tagtab[tag];
315 08708877 2003-11-25 devnull ans = 0;
316 08708877 2003-11-25 devnull for(p = b;;) {
317 08708877 2003-11-25 devnull p = strchr(p, '\n');
318 08708877 2003-11-25 devnull if(!p || ++p >= e) {
319 08708877 2003-11-25 devnull if(ans)
320 08708877 2003-11-25 devnull *eptr = e-1;
321 08708877 2003-11-25 devnull break;
322 08708877 2003-11-25 devnull }
323 08708877 2003-11-25 devnull if(!ans) {
324 08708877 2003-11-25 devnull if(p[0] == t[0] && p[1] == t[1])
325 08708877 2003-11-25 devnull ans = p+3;
326 08708877 2003-11-25 devnull } else {
327 08708877 2003-11-25 devnull if(p[0] != ' ') {
328 08708877 2003-11-25 devnull *eptr = p-1;
329 08708877 2003-11-25 devnull break;
330 08708877 2003-11-25 devnull }
331 08708877 2003-11-25 devnull }
332 08708877 2003-11-25 devnull }
333 08708877 2003-11-25 devnull return ans;
334 08708877 2003-11-25 devnull }