|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1989 The Regents of the University of California. ! 3: * All rights reserved. ! 4: * ! 5: * This code is derived from software contributed to Berkeley by ! 6: * Ken Arnold. ! 7: * ! 8: * Redistribution and use in source and binary forms are permitted ! 9: * provided that the above copyright notice and this paragraph are ! 10: * duplicated in all such forms and that any documentation, ! 11: * advertising materials, and other materials related to such ! 12: * distribution and use acknowledge that the software was developed ! 13: * by the University of California, Berkeley. The name of the ! 14: * University may not be used to endorse or promote products derived ! 15: * from this software without specific prior written permission. ! 16: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 17: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 18: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 19: */ ! 20: ! 21: #ifndef lint ! 22: char copyright[] = ! 23: "@(#) Copyright (c) 1989 The Regents of the University of California.\n\ ! 24: All rights reserved.\n"; ! 25: #endif /* not lint */ ! 26: ! 27: #ifndef lint ! 28: static char sccsid[] = "@(#)unstr.c 5.6 (Berkeley) 12/15/89"; ! 29: #endif /* not lint */ ! 30: ! 31: /* ! 32: * This program un-does what "strfile" makes, thereby obtaining the ! 33: * original file again. This can be invoked with the name of the output ! 34: * file, the input file, or both. If invoked with only a single argument ! 35: * ending in ".dat", it is pressumed to be the input file and the output ! 36: * file will be the same stripped of the ".dat". If the single argument ! 37: * doesn't end in ".dat", then it is presumed to be the output file, and ! 38: * the input file is that name prepended by a ".dat". If both are given ! 39: * they are treated literally as the input and output files. ! 40: * ! 41: * Ken Arnold Aug 13, 1978 ! 42: */ ! 43: ! 44: # include <machine/endian.h> ! 45: # include <sys/param.h> ! 46: # include "strfile.h" ! 47: # include <stdio.h> ! 48: # include <ctype.h> ! 49: ! 50: # ifndef MAXPATHLEN ! 51: # define MAXPATHLEN 1024 ! 52: # endif /* MAXPATHLEN */ ! 53: ! 54: char *Infile, /* name of input file */ ! 55: Datafile[MAXPATHLEN], /* name of data file */ ! 56: Delimch; /* delimiter character */ ! 57: ! 58: FILE *Inf, *Dataf; ! 59: ! 60: char *strcat(), *strcpy(); ! 61: ! 62: /* ARGSUSED */ ! 63: main(ac, av) ! 64: int ac; ! 65: char **av; ! 66: { ! 67: static STRFILE tbl; /* description table */ ! 68: ! 69: getargs(av); ! 70: if ((Inf = fopen(Infile, "r")) == NULL) { ! 71: perror(Infile); ! 72: exit(1); ! 73: } ! 74: if ((Dataf = fopen(Datafile, "r")) == NULL) { ! 75: perror(Datafile); ! 76: exit(1); ! 77: } ! 78: (void) fread((char *) &tbl, sizeof tbl, 1, Dataf); ! 79: tbl.str_version = ntohl(tbl.str_version); ! 80: tbl.str_numstr = ntohl(tbl.str_numstr); ! 81: tbl.str_longlen = ntohl(tbl.str_longlen); ! 82: tbl.str_shortlen = ntohl(tbl.str_shortlen); ! 83: tbl.str_flags = ntohl(tbl.str_flags); ! 84: if (!(tbl.str_flags & (STR_ORDERED | STR_RANDOM))) { ! 85: fprintf(stderr, "nothing to do -- table in file order\n"); ! 86: exit(1); ! 87: } ! 88: Delimch = tbl.str_delim; ! 89: order_unstr(&tbl); ! 90: (void) fclose(Inf); ! 91: (void) fclose(Dataf); ! 92: exit(0); ! 93: } ! 94: ! 95: getargs(av) ! 96: register char *av[]; ! 97: { ! 98: if (!*++av) { ! 99: (void) fprintf(stderr, "usage: unstr datafile\n"); ! 100: exit(1); ! 101: } ! 102: Infile = *av; ! 103: (void) strcpy(Datafile, Infile); ! 104: (void) strcat(Datafile, ".dat"); ! 105: } ! 106: ! 107: order_unstr(tbl) ! 108: register STRFILE *tbl; ! 109: { ! 110: register int i; ! 111: register char *sp; ! 112: auto off_t pos; ! 113: char buf[BUFSIZ]; ! 114: ! 115: for (i = 0; i < tbl->str_numstr; i++) { ! 116: (void) fread((char *) &pos, 1, sizeof pos, Dataf); ! 117: (void) fseek(Inf, ntohl(pos), 0); ! 118: if (i != 0) ! 119: (void) printf("%c\n", Delimch); ! 120: for (;;) { ! 121: sp = fgets(buf, sizeof buf, Inf); ! 122: if (sp == NULL || STR_ENDSTRING(sp, *tbl)) ! 123: break; ! 124: else ! 125: fputs(sp, stdout); ! 126: } ! 127: } ! 128: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.