123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- #include <u.h>
- #include <libc.h>
- #include <bio.h>
- #include "dict.h"
- /* Possible tags */
- enum {
- BEG, /* beginning of entry */
- AB, /* abstract */
- AN, /* database serial number */
- AS, /* author (one at a time) */
- AU, /* all authors */
- AW, /* award_awardee */
- BW, /* bw or c */
- CA, /* cast: character_actor */
- CN, /* cinematography */
- CO, /* country */
- CR, /* miscellaneous job_name */
- DE, /* topic keyword */
- DR, /* director */
- ED, /* editor */
- MP, /* MPAA rating (R, PG, etc.) */
- NT, /* note */
- PR, /* producer and for ...*/
- PS, /* producer (repeats info in PR) */
- RA, /* rating (letter) */
- RD, /* release date */
- RT, /* running time */
- RV, /* review citation */
- ST, /* production or release company (repeats info in PR) */
- TI, /* title[; original foreign title] */
- TX, /* paragraph of descriptive text */
- VD, /* video information (format_time_company; or "Not Avail.") */
- NTAG /* number of tags */
- };
- /* Assoc tables must be sorted on first field */
- static char *tagtab[] = {
- [BEG] "$$",
- [AB] "AB",
- [AN] "AN",
- [AS] "AS",
- [AU] "AU",
- [AW] "AW",
- [BW] "BW",
- [CA] "CA",
- [CN] "CN",
- [CO] "CO",
- [CR] "CR",
- [DE] "DE",
- [DR] "DR",
- [ED] "ED",
- [MP] "MP",
- [NT] "NT",
- [PR] "PR",
- [PS] "PS",
- [RA] "RA",
- [RD] "RD",
- [RT] "RT",
- [RV] "RV",
- [ST] "ST",
- [TI] "TI",
- [TX] "TX",
- [VD] "VD",
- };
- static char *mget(int, char *, char *, char **);
- static void moutall(int, char *, char *);
- static void moutall2(int, char *, char *);
- void
- movieprintentry(Entry ent, int cmd)
- {
- char *p, *e, *ps, *pe, *pn;
- int n;
- ps = ent.start;
- pe = ent.end;
- if(cmd == 'r') {
- Bwrite(bout, ps, pe-ps);
- return;
- }
- p = mget(TI, ps, pe, &e);
- if(p) {
- outpiece(p, e);
- outnl(0);
- }
- if(cmd == 'h')
- return;
- outnl(2);
- n = 0;
- p = mget(RD, ps, pe, &e);
- if(p) {
- outchars("Released: ");
- outpiece(p, e);
- n++;
- }
- p = mget(CO, ps, pe, &e);
- if(p) {
- if(n)
- outchars(", ");
- outpiece(p, e);
- n++;
- }
- p = mget(RT, ps, pe, &e);
- if(p) {
- if(n)
- outchars(", ");
- outchars("Running time: ");
- outpiece(p, e);
- n++;
- }
- p = mget(MP, ps, pe, &e);
- if(p) {
- if(n)
- outchars(", ");
- outpiece(p, e);
- n++;
- }
- p = mget(BW, ps, pe, &e);
- if(p) {
- if(n)
- outchars(", ");
- if(*p == 'c' || *p == 'C')
- outchars("Color");
- else
- outchars("B&W");
- n++;
- }
- if(n) {
- outchar('.');
- outnl(1);
- }
- p = mget(VD, ps, pe, &e);
- if(p) {
- outchars("Video: ");
- outpiece(p, e);
- outnl(1);
- }
- p = mget(AU, ps, pe, &e);
- if(p) {
- outchars("By: ");
- moutall2(AU, ps, pe);
- outnl(1);
- }
- p = mget(DR, ps, pe, &e);
- if(p) {
- outchars("Director: ");
- outpiece(p, e);
- outnl(1);
- }
- p = mget(PR, ps, pe, &e);
- if(p) {
- outchars("Producer: ");
- outpiece(p, e);
- outnl(1);
- }
- p = mget(CN, ps, pe, &e);
- if(p) {
- outchars("Cinematograpy: ");
- outpiece(p, e);
- outnl(1);
- }
- p = mget(CR, ps, pe, &e);
- if(p) {
- outchars("Other Credits: ");
- moutall2(CR, ps, pe);
- }
- outnl(2);
- p = mget(CA, ps, pe, &e);
- if(p) {
- outchars("Cast: ");
- moutall2(CA, ps, pe);
- }
- outnl(2);
- p = mget(AW, ps, pe, &e);
- if(p) {
- outchars("Awards: ");
- moutall2(AW, ps, pe);
- outnl(2);
- }
- p = mget(NT, ps, pe, &e);
- if(p) {
- outpiece(p, e);
- outnl(2);
- }
- p = mget(AB, ps, pe, &e);
- if(p) {
- outpiece(p, e);
- outnl(2);
- }
- pn = ps;
- n = 0;
- while((p = mget(TX, pn, pe, &pn)) != 0) {
- if(n++)
- outnl(1);
- outpiece(p, pn);
- }
- outnl(0);
- }
- long
- movienextoff(long fromoff)
- {
- long a;
- char *p;
- a = Bseek(bdict, fromoff, 0);
- if(a < 0)
- return -1;
- for(;;) {
- p = Brdline(bdict, '\n');
- if(!p)
- break;
- if(p[0] == '$' && p[1] == '$')
- return (Boffset(bdict)-Blinelen(bdict));
- }
- return -1;
- }
- void
- movieprintkey(void)
- {
- Bprint(bout, "No key\n");
- }
- /*
- * write a comma-separated list of all tag values between b and e
- */
- static void
- moutall(int tag, char *b, char *e)
- {
- char *p, *pn;
- int n;
- n = 0;
- pn = b;
- while((p = mget(tag, pn, e, &pn)) != 0) {
- if(n++)
- outchars(", ");
- outpiece(p, pn);
- }
- }
- /*
- * like moutall, but values are expected to have form:
- * field1_field2
- * and we are to output 'field2 (field1)' for each
- * (sometimes field1 has underscores, so search from end)
- */
- static void
- moutall2(int tag, char *b, char *e)
- {
- char *p, *pn, *us, *q;
- int n;
- n = 0;
- pn = b;
- while((p = mget(tag, pn, e, &pn)) != 0) {
- if(n++)
- outchars(", ");
- us = 0;
- for(q = pn-1; q >= p; q--)
- if(*q == '_') {
- us = q;
- break;
- }
- if(us) {
- /*
- * Hack to fix cast list Himself/Herself
- */
- if(strncmp(us+1, "Himself", 7) == 0 ||
- strncmp(us+1, "Herself", 7) == 0) {
- outpiece(p, us);
- outchars(" (");
- outpiece(us+1, pn);
- outchar(')');
- } else {
- outpiece(us+1, pn);
- outchars(" (");
- outpiece(p, us);
- outchar(')');
- }
- } else {
- outpiece(p, pn);
- }
- }
- }
- /*
- * Starting from b, find next line beginning with tagtab[tag].
- * Don't go past e, but assume *e==0.
- * Return pointer to beginning of value (after tag), and set
- * eptr to point at newline that ends the value
- */
- static char *
- mget(int tag, char *b, char *e, char **eptr)
- {
- char *p, *t, *ans;
- if(tag < 0 || tag >= NTAG)
- return 0;
- t = tagtab[tag];
- ans = 0;
- for(p = b;;) {
- p = strchr(p, '\n');
- if(!p || ++p >= e) {
- if(ans)
- *eptr = e-1;
- break;
- }
- if(!ans) {
- if(p[0] == t[0] && p[1] == t[1])
- ans = p+3;
- } else {
- if(p[0] != ' ') {
- *eptr = p-1;
- break;
- }
- }
- }
- return ans;
- }
|