Annotation of 43BSD/contrib/notes/src/expand.c, revision 1.1.1.1

1.1       root        1: #include "parms.h"
                      2: #include "structs.h"
                      3: #include <ctype.h>
                      4: #include <signal.h>
                      5: 
                      6: #ifdef RCSIDENT
                      7: static char *rcsident = "$Header: expand.c,v 1.7 85/01/18 15:40:08 notes Rel $";
                      8: #endif
                      9: 
                     10: /*
                     11:  *     Routines to expand notesgroups specifications
                     12:  *
                     13:  *     Rick L Spickelmier, UC Berkeley
                     14:  *     Lou Salkind, NYU
                     15:  */
                     16: 
                     17: #define                MAXGROUP        400                     /* lots of them */
                     18: 
                     19: 
                     20: static int  seqtyp = NOSEQ;                            /* sequencer mode */
                     21: static int  last_group = 0;                            /* active in list */
                     22: static int  this_group = 0;                            /* next one to show */
                     23: static struct nflist_f  groups[MAXGROUP];              /* and the groups */
                     24: 
                     25: /*
                     26:  * set the sequencer type (external interface)
                     27:  */
                     28: 
                     29: setseq (i)
                     30: {
                     31:     seqtyp = i;
                     32: }
                     33: 
                     34: /*
                     35:  * add a notesfile to the active list
                     36:  */
                     37: 
                     38: addgrp (string)
                     39: char   *string;
                     40: {
                     41:     int     i;
                     42: 
                     43:     /* see if it already exists */
                     44:     for (i = 0; i < last_group; i++)
                     45:     {
                     46:        if (strcmp (groups[i].nf_name, string) == 0)
                     47:        {                                               /* already in table */
                     48:            groups[i].nf_active = TRUE;                 /* deleted earlier? */
                     49:            groups[i].nf_seqmode = seqtyp;
                     50:            return;
                     51:        }
                     52:     }
                     53:     if (last_group >= MAXGROUP)
                     54:     {
                     55:        printf ("addgrp: array overflow, ignoring %s\n", string);
                     56:        return;
                     57:     }
                     58:     groups[last_group].nf_active = TRUE;
                     59:     groups[last_group].nf_seqmode = seqtyp;
                     60:     groups[last_group++].nf_name = strsave (string);
                     61: }
                     62: 
                     63: /*
                     64:  * delete the notesfile from the active list
                     65:  */
                     66: 
                     67: delgroup (string)
                     68: char   *string;
                     69: {
                     70:     register int    i;                                 /* might as well be fast */
                     71: 
                     72:     for (i = 0; i < last_group; i++)
                     73:     {
                     74:        if (strcmp (groups[i].nf_name, string) == 0)
                     75:        {
                     76:            groups[i].nf_active = FALSE;
                     77:            return;
                     78:        }
                     79:     }
                     80: }
                     81: 
                     82: /*
                     83:  * given a command line argument, expand it into
                     84:  * the appropriate sequence command or notesfile
                     85:  * specification
                     86:  */
                     87: 
                     88: expand (argp)
                     89: char   *argp;
                     90: {
                     91:     char   *endp;
                     92: 
                     93:     while (1)                                          /* do entire string */
                     94:     {
                     95:        while (isspace (*argp))                         /* skip trash chars */
                     96:            argp++;
                     97:        if (*argp == '\0')                              /* fell off end */
                     98:            return;
                     99:        endp = argp;
                    100:        while (*endp)
                    101:        {
                    102:            if (isspace (*endp) || *endp == ',')
                    103:            {
                    104:                *endp++ = '\0';
                    105:                break;
                    106:            }
                    107:            endp++;                                     /* now points at next (or NULL) */
                    108:        }
                    109: 
                    110:        switch (argp[0])                                /* on first character */
                    111:        {
                    112: /*
                    113:  *     Parse options that make sense at this point.
                    114:  */
                    115:            case '-':                                   /* options */
                    116:                {
                    117:                    switch (argp[1])
                    118:                    {
                    119:                        case 's':                       /* -S-equencer */
                    120:                            seqtyp = NORMSEQ;
                    121:                            break;
                    122:                        case 'x':                       /* e-X-tended sequencer */
                    123:                            seqtyp = EXTSEQ;
                    124:                            break;
                    125:                        case 'i':                       /* indexing sequencer */
                    126:                            seqtyp = INDXSEQ;
                    127:                            break;
                    128:                        case 'n':                       /* -N-o sequencer */
                    129:                            seqtyp = NOSEQ;
                    130:                            break;
                    131: 
                    132:                        default: 
                    133:                            break;                      /* ignore it */
                    134:                    }
                    135:                    break;
                    136:                }
                    137: 
                    138: /*
                    139:  *     specified a file  the hard way (via colon).  This usually
                    140:  *     happens in the NFSEQ definition
                    141:  */
                    142: 
                    143:            case ':':                                   /* include a file */
                    144:                readrc (&argp[1]);                      /* do it */
                    145:                break;
                    146: 
                    147: /*
                    148:  *     Eliminate notesfles.  If the arg is "! pattern", we remove the
                    149:  *     notesfiles that "pattern" matches from the list of notesfiles
                    150:  *     to read.
                    151:  *
                    152:  */
                    153:            case '!':                                   /* eliminate notesfiles */
                    154:                {
                    155:                    if (patcheck (&argp[1]))            /* wildcard */
                    156:                        dopat (&argp[1], delgroup);
                    157:                    else
                    158:                        delgroup (&argp[1]);
                    159:                    break;
                    160:                }
                    161: /*
                    162:  *     Anything else is just a "pattern" and specifies some notesfiles
                    163:  *     to be added to the list.
                    164:  */
                    165:            default:                                    /* add notesfiles */
                    166:                {
                    167:                    if (patcheck (argp))                /* wildcard check */
                    168:                        dopat (argp, addgrp);
                    169:                    else
                    170:                        addgrp (argp);
                    171:                    break;
                    172:                }
                    173:        }
                    174:        argp = endp;
                    175:     }
                    176:                                                        /* NOT REACHED */
                    177: }
                    178: 
                    179: /*
                    180:  * read a file which contains the command line arguments
                    181:  */
                    182: 
                    183: readrc (s)
                    184: char   *s;
                    185: {
                    186:     FILE * f;
                    187:     char    buf[BUFSIZ];
                    188: 
                    189:     if ((f = fopen (s, "r")) == NULL)
                    190:     {
                    191:        fprintf (stderr, "%s: unable to read file ", Invokedas);
                    192:        perror (s);                                     /* and the error */
                    193:        return (-1);
                    194:     }
                    195:     while (fgets (buf, sizeof buf - 1, f))
                    196:        expand (buf);
                    197:     fclose (f);
                    198:     return (0);
                    199: }
                    200: 
                    201: /*
                    202:  *     return the next active notesfile in the list
                    203:  */
                    204: 
                    205: struct nflist_f *nextgroup ()
                    206: {
                    207:     while           (this_group < last_group)
                    208:     {
                    209:        if              (groups[this_group].nf_active)
                    210:                            return (&groups[this_group++]);/* give it */
                    211:        else
                    212:            this_group++;                               /* try another */
                    213:     }
                    214:     return ((struct nflist_f *) NULL);                 /* no more */
                    215: }

unix.superglobalmegacorp.com

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