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