aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/dict/movie.c
diff options
context:
space:
mode:
authorrsc <devnull@localhost>2003-11-25 03:37:45 +0000
committerrsc <devnull@localhost>2003-11-25 03:37:45 +0000
commit08708877939323c1e1cb87210193ec25fc472ff7 (patch)
treebd34e2144a3e9532ab228619d7ae8d4a0078aeeb /src/cmd/dict/movie.c
parent091f74d0a0db5ba1e098a518922525cb032a97b4 (diff)
downloadplan9port-08708877939323c1e1cb87210193ec25fc472ff7.tar.gz
plan9port-08708877939323c1e1cb87210193ec25fc472ff7.tar.bz2
plan9port-08708877939323c1e1cb87210193ec25fc472ff7.zip
add dict
Diffstat (limited to 'src/cmd/dict/movie.c')
-rw-r--r--src/cmd/dict/movie.c328
1 files changed, 328 insertions, 0 deletions
diff --git a/src/cmd/dict/movie.c b/src/cmd/dict/movie.c
new file mode 100644
index 00000000..f1042fd6
--- /dev/null
+++ b/src/cmd/dict/movie.c
@@ -0,0 +1,328 @@
+#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 **);
+#if 0
+static void moutall(int, char *, char *);
+#endif
+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
+ */
+#if 0
+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);
+ }
+}
+#endif
+
+/*
+ * 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;
+}