|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T u
Length: 3701 (0xe75)
Types: TextFile
Names: »unstr.c«
└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
└─⟦this⟧ »EUUGD18/General/Fortune/unstr.c«
# include <stdio.h>
# include <ctype.h>
# include "strfile.h"
# define TRUE 1
# define FALSE 0
/*
* This program un-does what "strfile" makes, thereby obtaining the
* original file again. This can be invoked with the name of the output
* file, the input file, or both. If invoked with only a single argument
* ending in ".dat", it is pressumed to be the input file and the output
* file will be the same stripped of the ".dat". If the single argument
* doesn't end in ".dat", then it is presumed to be the output file, and
* the input file is that name prepended by a ".dat". If both are given
* they are treated literally as the input and output files.
*
* Ken Arnold Aug 13, 1978
*/
# define DELIM_CH '-'
char Infile[100], /* name of input file */
Outfile[100], /* name of output file */
Delimch = '%'; /* delimiter character */
short Oflag = FALSE; /* use order of initial table */
FILE *Inf, *Outf;
char *rindex(), *malloc(), *strcat(), *strcpy();
main(ac, av)
int ac;
char **av;
{
register int c;
register int nstr, delim;
static STRFILE tbl; /* description table */
getargs(ac, av);
if ((Inf = fopen(Infile, "r")) == NULL) {
perror(Infile);
exit(-1);
/* NOTREACHED */
}
if ((Outf = fopen(Outfile, "w")) == NULL) {
perror(Outfile);
exit(-1);
/* NOTREACHED */
}
(void) fread((char *) &tbl, sizeof tbl, 1, Inf);
if (Oflag) {
order_unstr(&tbl);
exit(0);
/* NOTREACHED */
}
nstr = tbl.str_numstr;
(void) fseek(Inf, (off_t) (sizeof (off_t) * (nstr + 1)), 1);
delim = 0;
nstr = 0;
while ((c = getc(Inf)) != EOF)
if (c != '\0')
putc(c, Outf);
else if (nstr != tbl.str_numstr - 1)
if (++nstr == tbl.str_delims[delim]) {
fprintf(Outf, "%c-\n", Delimch);
delim++;
}
else
fprintf(Outf, "%c%c\n", Delimch, Delimch);
exit(0);
/* NOTREACHED */
}
getargs(ac, av)
register int ac;
register char *av[];
{
register int i;
register char *sp;
register int j;
register short bad;
bad = 0;
for (i = 1; i < ac; i++) {
if (av[i][0] != '-') {
(void) strcpy(Infile, av[i]);
if (i + 1 >= ac) {
(void) strcpy(Outfile, Infile);
if ((sp = rindex(av[i], '.')) &&
strcmp(sp, ".dat") == 0)
Outfile[strlen(Outfile) - 4] = '\0';
else
(void) strcat(Infile, ".dat");
}
else
(void) strcpy(Outfile, av[i + 1]);
break;
}
else if (av[i][1] == '\0') {
printf("usage: unstr [-o] [-cC] datafile[.dat] [outfile]\n");
exit(0);
/* NOTREACHED */
}
else
for (sp = &av[i][1]; *sp != '\0'; sp++)
switch (*sp) {
case 'o': /* print out in seekptr order */
Oflag++;
break;
case 'c': /* new delimiting char */
if ((Delimch = *++sp) == '\0') {
--sp;
Delimch = *av[++i];
}
if (!isascii(Delimch)) {
fprintf(stderr,
"bad delimiting character: 0x%x\n",
Delimch);
bad++;
}
break;
default:
fprintf(stderr, "unknown flag: '%c'\n",
*sp);
bad++;
break;
}
}
if (bad) {
printf("use \"%s -\" to get usage\n", av[0]);
exit(-1);
}
}
order_unstr(tbl)
STRFILE *tbl;
{
register int i, c;
register int delim;
register off_t *seekpts;
seekpts = (off_t *) malloc(sizeof *seekpts * tbl->str_numstr); /* NOSTRICT */
if (seekpts == NULL) {
perror("malloc");
exit(-1);
/* NOTREACHED */
}
(void) fread((char *) seekpts, sizeof *seekpts, (int) tbl->str_numstr,
Inf);
delim = 0;
for (i = 0; i < tbl->str_numstr; i++, seekpts++) {
if (i != 0)
if (i == tbl->str_delims[delim]) {
fputs("%-\n", Outf);
delim++;
}
else
fputs("%%\n", Outf);
(void) fseek(Inf, *seekpts, 0);
while ((c = getc(Inf)) != '\0')
putc(c, Outf);
}
}