Annotation of 43BSD/contrib/mh/h/formatsbr.h, revision 1.1.1.1

1.1       root        1: /* formatsbr.h - definitions for fmtscan () */
                      2: 
                      3: /*
                      4:  * This structure describes an "interesting" component.  It holds
                      5:  * the name & text from the component (if found) and one piece of
                      6:  * auxilary info.  The structure for a particular component is located
                      7:  * by hashing the name and using it as an index into the ptr array
                      8:  * "wantcomp".  All format entries that reference a particular component
                      9:  * point to its comp struct (so we only have to do component specific
                     10:  * processing once.  e.g., parse an address.).
                     11:  */
                     12: struct comp {
                     13:        char            *c_name;        /* component name (in lower case) */
                     14:        struct  comp    *c_next;        /* hash chain linkage */
                     15:        char            *c_text;        /* component text (if found) */
                     16:        short           c_flags;        /* misc. flags (from formatsbr) */
                     17:        short           c_type;         /* type info (from fmtcompile) */
                     18:        union {
                     19:                struct tws      *c_u_tws;
                     20:                struct mailname *c_u_mn;
                     21:        } c_un;
                     22: #define c_tws c_un.c_u_tws
                     23: #define c_mn c_un.c_u_mn
                     24: };
                     25: 
                     26: /* c_type bits */
                     27: #define        CT_ADDR         1       /* referenced as address */
                     28: #define        CT_DATE         2       /* referenced as date */
                     29: #define        CT_MYMBOX       4       /* "mymbox" test being done */
                     30: #define        CT_ADDRPARSE    8       /* address parse being done */
                     31: 
                     32: extern int fmt_norm;
                     33: 
                     34: struct comp    *wantcomp[128]; /* hash table for deciding if a
                     35:                                 * component is "interesting" */
                     36: 
                     37: /* 
                     38:  * Hash function for component name.  The function should be
                     39:  * case independent and probably shouldn't involve a routine
                     40:  * call.  This function is pretty good but will not work on
                     41:  * single character component names.  
                     42:  */
                     43: #define        CHASH(nm)       (((nm[0]-nm[1])&0x1f)+(nm[2]&0x5f))
                     44: 
                     45: #define FINDCOMP(comp,name) \
                     46:                for (comp = wantcomp[CHASH(name)]; \
                     47:                     comp && ! uleq(comp->c_name,name); \
                     48:                     comp = comp->c_next) ;
                     49: 
                     50: 
                     51: /*
                     52:  * This structure defines one formatting instruction.
                     53:  */
                     54: struct format {
                     55:        unsigned char   f_type;
                     56:        char            f_fill;
                     57:        short           f_width;        /* output field width */
                     58: #define f_skip f_width                 /* instr to skip (false "if") */
                     59:        union {
                     60:                struct comp     *f_u_comp;      /* associated component */
                     61:                char            *f_u_text;      /* literal text */
                     62:                char            f_u_char;       /* literal character */
                     63:                int             f_u_value;      /* literal value */
                     64:        } f_un;
                     65: #define f_comp f_un.f_u_comp
                     66: #define f_text f_un.f_u_text
                     67: #define f_char f_un.f_u_char
                     68: #define f_value f_un.f_u_value
                     69: };
                     70: 
                     71: int    fmtscan ();
                     72: char   *new_fs ();

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.