|
|
1.1 ! root 1: # include <stdio.h> ! 2: # include <ctype.h> ! 3: ! 4: # define reg register ! 5: # define bool char ! 6: ! 7: # define TRUE 1 ! 8: # define FALSE 0 ! 9: ! 10: static char *sccsid ="@(#)enteraddr.c 1.6 (Berkeley) 4/10/81"; ! 11: ! 12: struct fd { ! 13: char *f_name; ! 14: char *f_desc; ! 15: char *f_value; ! 16: }; ! 17: ! 18: typedef struct fd FDES; ! 19: ! 20: char *Fmtfile, ! 21: *Addrfile, ! 22: Fmt[BUFSIZ], ! 23: *malloc(); ! 24: ! 25: FDES Fmtab[BUFSIZ], ! 26: *name(); ! 27: ! 28: main(ac, av) ! 29: int ac; ! 30: char **av; ! 31: { ! 32: setbuf(stdout, 0); ! 33: if (ac != 3) { ! 34: printf("usage: %s fmt-file addr-file\n", av[0]); ! 35: exit(1); ! 36: } ! 37: Fmtfile = av[1]; ! 38: Addrfile = av[2]; ! 39: parseaddr(); ! 40: doaddrs(); ! 41: putchar('\n'); ! 42: } ! 43: ! 44: /* ! 45: * parse the fmt file ! 46: */ ! 47: parseaddr() ! 48: { ! 49: reg FILE *inf; ! 50: reg char *sp; ! 51: reg FDES *fp; ! 52: reg char c; ! 53: char buf[80]; ! 54: ! 55: if ((inf = fopen(Fmtfile, "r")) == NULL) { ! 56: perror(Fmtfile); ! 57: exit(1); ! 58: } ! 59: for (fp = Fmtab; fp < &Fmtab[BUFSIZ]; fp++) ! 60: fp->f_name = NULL; ! 61: ! 62: while ((c = getc(inf)) != EOF) ! 63: if (c == '<') { ! 64: register char c; ! 65: ! 66: sp = buf; ! 67: while ((*sp = getc(inf)) != '>' && *sp != ':') ! 68: sp++; ! 69: c = *sp; ! 70: *sp++ = '\0'; ! 71: fp = name(buf); ! 72: fp->f_name = malloc(sp - buf); ! 73: strcpy(fp->f_name, buf); ! 74: if (c == ':') { ! 75: for (sp = buf; (*sp = getc(inf)) != '>'; sp++) ! 76: continue; ! 77: *sp++ = 0; ! 78: fp->f_desc = malloc(sp - buf); ! 79: strcpy(fp->f_desc, buf); ! 80: } ! 81: else ! 82: fp->f_desc = NULL; ! 83: } ! 84: fclose(inf); ! 85: } ! 86: ! 87: doaddrs() ! 88: { ! 89: reg FILE *outf; ! 90: reg char *sp; ! 91: reg FDES *fp; ! 92: reg int len; ! 93: char buf[BUFSIZ]; ! 94: ! 95: if ((outf = fopen(Addrfile, "a")) == NULL) { ! 96: perror(Addrfile); ! 97: exit(1); ! 98: } ! 99: ! 100: for (fp = Fmtab; fp->f_name != NULL; fp++) ! 101: fp->f_value = NULL; ! 102: ! 103: for (;;) { ! 104: for (fp = Fmtab; fp->f_name != NULL; fp++) { ! 105: printf("%s", fp->f_name); ! 106: if (fp->f_value != NULL) ! 107: printf(" (%s)", fp->f_value); ! 108: else if (fp->f_desc != NULL) ! 109: printf(" (%s)", fp->f_desc); ! 110: printf(": "); ! 111: if (fgets(buf, BUFSIZ, stdin) == NULL) ! 112: return; ! 113: buf[strlen(buf)-1] = '\0'; ! 114: if (buf[0] == '\0') ! 115: if (fp->f_value == NULL) ! 116: if (fp->f_desc != NULL) ! 117: strcpy(buf, fp->f_desc); ! 118: else ! 119: strcpy(buf, ""); ! 120: else ! 121: continue; ! 122: else if (fp->f_value != NULL) ! 123: cfree(fp->f_value); ! 124: fp->f_value = malloc(strlen(buf) + 1); ! 125: strcpy(fp->f_value, buf); ! 126: } ! 127: putchar('\n'); ! 128: for (fp = Fmtab; fp->f_name != NULL; fp++) ! 129: printf("%s: %s\n", fp->f_name, fp->f_value); ! 130: printf("correct? "); ! 131: fgets(buf, BUFSIZ, stdin); ! 132: if (buf[0] == 'y') { ! 133: for (fp = Fmtab; fp->f_name != NULL; fp++) { ! 134: fprintf(outf, "%s", fp->f_name); ! 135: if (*fp->f_value != '\0') ! 136: fprintf(outf, " %s", fp->f_value); ! 137: putc('\n', outf); ! 138: cfree(fp->f_value); ! 139: fp->f_value = NULL; ! 140: } ! 141: fprintf(outf, "$\n"); ! 142: } ! 143: putchar('\n'); ! 144: } ! 145: } ! 146: ! 147: FDES * ! 148: name(str) ! 149: reg char *str; { ! 150: ! 151: reg FDES *fp; ! 152: ! 153: for (fp = Fmtab; fp->f_name != NULL; fp++) ! 154: if (strcmp(str, fp->f_name) == 0) ! 155: return fp; ! 156: return fp; ! 157: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.