|
|
1.1 ! root 1: # include <stdio.h> ! 2: # include "strfile.h" ! 3: ! 4: # define TRUE 1 ! 5: # define FALSE 0 ! 6: ! 7: /* ! 8: * This program un-does what "strfile" makes, thereby obtaining the ! 9: * original file again. This can be invoked with the name of the output ! 10: * file, the input file, or both. If invoked with only a single argument ! 11: * ending in ".dat", it is pressumed to be the input file and the output ! 12: * file will be the same stripped of the ".dat". If the single argument ! 13: * doesn't end in ".dat", then it is presumed to be the output file, and ! 14: * the input file is that name prepended by a ".dat". If both are given ! 15: * they are treated literally as the input and output files. ! 16: * ! 17: * Ken Arnold Aug 13, 1978 ! 18: */ ! 19: ! 20: # define DELIM_CH '-' ! 21: ! 22: char Infile[100], /* name of input file */ ! 23: Outfile[100]; /* name of output file */ ! 24: ! 25: short Oflag = FALSE; /* use order of initial table */ ! 26: ! 27: FILE *Inf, *Outf; ! 28: ! 29: char *rindex(), *malloc(), *strcat(), *strcpy(); ! 30: ! 31: main(ac, av) ! 32: int ac; ! 33: char **av; ! 34: { ! 35: register char c; ! 36: register int nstr, delim; ! 37: static STRFILE tbl; /* description table */ ! 38: ! 39: getargs(ac, av); ! 40: if ((Inf = fopen(Infile, "r")) == NULL) { ! 41: perror(Infile); ! 42: exit(-1); ! 43: /* NOTREACHED */ ! 44: } ! 45: if ((Outf = fopen(Outfile, "w")) == NULL) { ! 46: perror(Outfile); ! 47: exit(-1); ! 48: /* NOTREACHED */ ! 49: } ! 50: (void) fread((char *) &tbl, sizeof tbl, 1, Inf); ! 51: if (Oflag) { ! 52: order_unstr(&tbl); ! 53: exit(0); ! 54: /* NOTREACHED */ ! 55: } ! 56: nstr = tbl.str_numstr; ! 57: (void) fseek(Inf, (long) (sizeof (long) * (nstr + 1)), 1); ! 58: delim = 0; ! 59: for (nstr = 0; (c = getc(Inf)) != EOF; nstr++) ! 60: if (c != '\0') ! 61: putc(c, Outf); ! 62: else if (nstr != tbl.str_numstr - 1) ! 63: if (nstr == tbl.str_delims[delim]) { ! 64: fputs("%-\n", Outf); ! 65: delim++; ! 66: } ! 67: else ! 68: fputs("%%\n", Outf); ! 69: exit(0); ! 70: /* NOTREACHED */ ! 71: } ! 72: ! 73: getargs(ac, av) ! 74: register int ac; ! 75: register char **av; ! 76: { ! 77: register char *sp; ! 78: ! 79: if (ac > 1 && strcmp(av[1], "-o") == 0) { ! 80: Oflag++; ! 81: ac--; ! 82: av++; ! 83: } ! 84: if (ac < 2) { ! 85: printf("usage: %s datafile[.dat] [ outfile ]\n", av[0]); ! 86: exit(-1); ! 87: } ! 88: (void) strcpy(Infile, av[1]); ! 89: if (ac < 3) { ! 90: (void) strcpy(Outfile, Infile); ! 91: if ((sp = rindex(av[1], '.')) && strcmp(sp, ".dat") == 0) ! 92: Outfile[strlen(Outfile) - 4] = '\0'; ! 93: else ! 94: (void) strcat(Infile, ".dat"); ! 95: } ! 96: else ! 97: (void) strcpy(Outfile, av[2]); ! 98: } ! 99: ! 100: order_unstr(tbl) ! 101: STRFILE *tbl; ! 102: { ! 103: register int i, c; ! 104: register int delim; ! 105: register long *seekpts; ! 106: ! 107: seekpts = (long *) malloc(sizeof *seekpts * tbl->str_numstr); /* NOSTRICT */ ! 108: if (seekpts == NULL) { ! 109: perror("malloc"); ! 110: exit(-1); ! 111: /* NOTREACHED */ ! 112: } ! 113: (void) fread((char *) seekpts, sizeof *seekpts, tbl->str_numstr, Inf); ! 114: delim = 0; ! 115: for (i = 0; i < tbl->str_numstr; i++, seekpts++) { ! 116: if (i != 0) ! 117: if (i == tbl->str_delims[delim]) { ! 118: fputs("%-\n", Outf); ! 119: delim++; ! 120: } ! 121: else ! 122: fputs("%%\n", Outf); ! 123: (void) fseek(Inf, *seekpts, 0); ! 124: while ((c = getc(Inf)) != '\0') ! 125: putc(c, Outf); ! 126: } ! 127: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.