1: # include <stdio.h>
   2: # include <ctype.h>
   3: # include "dlvrmail.h"
   4: 
   5: static  char SccsId[] = "@(#)newaliases.c	2.1	11/5/80";
   6: 
   7: typedef struct { char *dptr; int dsize; } datum;
   8: char *aliases = ALIASFILE;
   9: char dirbuf[100];
  10: char pagbuf[100];
  11: int LineNo;
  12: char *To;
  13: int ExitStat;
  14: int Errors;
  15: # ifdef DEBUG
  16: bool Debug;
  17: # endif DEBUG
  18: 
  19: main(argc, argv)
  20:     int argc;
  21:     char *argv[];
  22: {
  23:     int f;
  24:     char line[BUFSIZ];
  25:     char line2[MAXLINE];
  26:     register char *p;
  27:     char *cp, *p2;
  28:     char *rhs;
  29:     int naliases, bytes, longest;
  30:     datum key, content;
  31:     bool skipping;
  32:     addrq al, bl;
  33:     extern char *prescan();
  34:     extern addrq *parse();
  35:     bool contin;
  36: 
  37: # ifdef DEBUG
  38:     if (argc > 1 && strcmp(argv[1], "-T") == 0)
  39:     {
  40:         Debug++;
  41:         argc--;
  42:         argv++;
  43:     }
  44: # endif DEBUG
  45:     if (argc > 1)
  46:         aliases = argv[1];
  47: 
  48:     strcpy(dirbuf, aliases);
  49:     strcat(dirbuf, ".dir");
  50:     strcpy(pagbuf, aliases);
  51:     strcat(pagbuf, ".pag");
  52:     f = creat(dirbuf, 0666);
  53:     if (f < 0) {
  54:         perror(dirbuf);
  55:         exit(1);
  56:     }
  57:     close(f);
  58:     f = creat(pagbuf, 0666);
  59:     if (f < 0) {
  60:         perror(pagbuf);
  61:         exit(1);
  62:     }
  63:     close(f);
  64:     if (dbminit(aliases) < 0)
  65:         exit(1);
  66:     if (freopen(aliases, "r", stdin) == 0) {
  67:         perror(aliases);
  68:         exit(1);
  69:     }
  70: 
  71:     /* read and interpret lines */
  72:     LineNo = 0;
  73:     naliases = 0;
  74:     bytes = 0;
  75:     longest = 0;
  76:     skipping = FALSE;
  77:     while (fgets(line, sizeof (line), stdin) != NULL)
  78:     {
  79:         LineNo++;
  80:         switch (line[0])
  81:         {
  82:           case '#':
  83:           case '\n':
  84:           case '\0':
  85:             skipping = FALSE;
  86:             continue;
  87: 
  88:           case ' ':
  89:           case '\t':
  90:             if (!skipping)
  91:                 usrerr("Non-continuation line starts with space");
  92:             skipping = TRUE;
  93:             continue;
  94:         }
  95:         skipping = FALSE;
  96: 
  97:         /* process the LHS */
  98:         for (p = line; *p != '\0' && *p != ':' && *p != '\n'; p++)
  99:             continue;
 100:         if (*p == '\0' || *p == '\n')
 101:         {
 102:          syntaxerr:
 103:             usrerr("missing colon");
 104:             continue;
 105:         }
 106:         *p++ = '\0';
 107:         if (parse(line, &al, 1) == NULL)
 108:         {
 109:             *--p = ':';
 110:             goto syntaxerr;
 111:         }
 112:         rhs = cp = p;
 113:         contin = FALSE;
 114:         for (;;)
 115:         {
 116:             register char c;
 117: 
 118:             /* do parsing & compression of addresses */
 119:             c = *p;
 120:             while (c != '\0')
 121:             {
 122:                 p2 = p;
 123:                 while (*p != '\n' && *p != ',' && *p != '\0')
 124:                     p++;
 125:                 c = *p;
 126:                 *p++ = '\0';
 127:                 if (prescan(p2, cp, &line[sizeof line - 1], ',') == NULL)
 128:                     continue;
 129:                 contin = FALSE;
 130:                 if (parse(cp, &bl, -1) != NULL)
 131:                     cp += strlen(cp);
 132:                 if (c == ',')
 133:                 {
 134:                     *cp++ = ',';
 135:                     contin = TRUE;
 136:                 }
 137:             }
 138: 
 139:             /* see if there should be a continuation line */
 140:             if (!contin)
 141:                 break;
 142: 
 143:             /* read continuation line */
 144:             if (fgets(line2, sizeof (line2), stdin) == NULL)
 145:                 break;
 146:             LineNo++;
 147: 
 148:             if (!isspace(line2[0]))
 149:                 usrerr("continuation line missing");
 150: 
 151:             p = line2;
 152:         }
 153:         if (al.q_mailer != &Mailer[0])
 154:         {
 155:             usrerr("cannot alias non-local names");
 156:             continue;
 157:         }
 158:         naliases++;
 159:         key.dsize = strlen(al.q_user) + 1;
 160:         key.dptr = al.q_user;
 161:         content.dsize = strlen(rhs) + 1;
 162:         if (content.dsize > longest)
 163:             longest = content.dsize;
 164:         content.dptr = rhs;
 165:         bytes += key.dsize + content.dsize;
 166:         if (store(key, content), 0)
 167:         /* if (f = store(key, content)) */
 168:             usrerr("Dbm internal error return %d from store\n", f);
 169:     }
 170:     fprintf(stderr, "%d aliases, %d bytes, longest %d bytes, %d errors\n",
 171:         naliases, bytes, longest, Errors);
 172: 
 173:     exit(ExitStat);
 174: }
 175: 
 176: usrerr(fmt, a, b, c, d, e)
 177:     char *fmt;
 178: {
 179:     Errors++;
 180:     fprintf(stderr, "line %d: ", LineNo);
 181:     fprintf(stderr, fmt, a, b, c, d, e);
 182:     fprintf(stderr, "\n");
 183:     return (-1);
 184: }
 185: 
 186: syserr(fmt, a, b, c, d, e)
 187:     char *fmt;
 188: {
 189:     return (usrerr(fmt, a, b, c, d, e));
 190: }

Defined functions

main defined in line 19; never used

Defined variables

LineNo defined in line 11; used 4 times
SccsId defined in line 5; never used
aliases defined in line 8; used 6 times
dirbuf defined in line 9; used 4 times
pagbuf defined in line 10; used 4 times
Last modified: 1981-02-06
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 962
Valid CSS Valid XHTML 1.0 Strict