2 ** fmt_scan.h -- definitions for fmt_scan()
6 ** This structure describes an "interesting" component. It holds
7 ** the name & text from the component (if found) and one piece of
8 ** auxilary info. The structure for a particular component is located
9 ** by (open) hashing the name and using it as an index into the ptr array
10 ** "wantcomp". All format entries that reference a particular component
11 ** point to its comp struct (so we only have to do component specific
12 ** processing once. e.g., parse an address.).
15 char *c_name; /* component name (in lower case) */
16 char *c_text; /* component text (if found) */
17 struct comp *c_next; /* hash chain linkage */
18 short c_flags; /* misc. flags (from fmt_scan) */
19 short c_type; /* type info (from fmt_compile) */
22 struct mailname *c_u_mn;
26 #define c_tws c_un.c_u_tws
27 #define c_mn c_un.c_u_mn
32 #define CT_ADDR (1<<0) /* referenced as address */
33 #define CT_DATE (1<<1) /* referenced as date */
38 #define CF_TRUE (1<<0) /* usually means component is present */
39 #define CF_PARSED (1<<1) /* address/date has been parsed */
40 #define CF_DATEFAB (1<<2) /* datefield fabricated */
45 ** Hash table for deciding if a component is "interesting".
47 extern struct comp *wantcomp[128];
50 ** Hash function for component name. The function should be
51 ** case independent and probably shouldn't involve a routine
52 ** call. This function is pretty good but will not work on
53 ** single character component names.
55 #define CHASH(nm) (((((nm)[0]) - ((nm)[1])) & 0x1f) + (((nm)[2]) & 0x5f))
58 ** Find a component in the hash table.
60 #define FINDCOMP(comp,name) \
61 for (comp = wantcomp[CHASH(name)]; \
62 comp && strcmp(comp->c_name,name)!=0; \
63 comp = comp->c_next) ;
66 ** This structure defines one formatting instruction.
71 short f_width; /* output field width */
73 struct comp *f_u_comp; /* associated component */
74 char *f_u_text; /* literal text */
75 char f_u_char; /* literal character */
76 int f_u_value; /* literal value */
80 #define f_skip f_width /* instr to skip (false "if") */
82 #define f_comp f_un.f_u_comp
83 #define f_text f_un.f_u_text
84 #define f_char f_un.f_u_char
85 #define f_value f_un.f_u_value
90 struct format *fmt_scan(struct format *, char *, int, int *);
91 int fmt_compile(char *, struct format **);