|
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 f
Length: 3675 (0xe5b) Types: TextFile Names: »filter.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦e83f91978⟧ »EurOpenD22/isode/osimis-2.0.tar.Z« └─⟦d846658bd⟧ └─⟦this⟧ »osimis/smap/filter.c«
/* * Copyright (c) 1988 University College London * All rights reserved. * * Redistribution and use in source and binary forms are permitted * provided that the above copyright notice and this paragraph are * duplicated in all such forms and that any documentation, * advertising materials, and other materials related to such * distribution and use acknowledge that the software was developed * by the Department of Computer Science, University College London. * The name of the University may not be used to * endorse or promote products derived from this software without * specific prior written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. */ /* maintains a log of oncoming data from a special device */ /* spdevice stuff cribbed from link */ /* By Graham Knight, 0ctober 83 * May 84 Modified to use libspdev routines * October 88 spdevices stuff removed */ #include <stdio.h> #include <errno.h> #include <signal.h> #include <sys/types.h> #include <sys/stat.h> extern int errno; FILE *ioptr, *filefp; char *crlf = "\r\n"; char sep[] = " <<==>> "; char ifmt[] = "%d"; char df = 'd'; int bufflg = 1; int teeflg = 0; int endf(); int tee(); int flush(); #define SEPLEN ((sizeof sep) -1) #define FLEN 10000L #define LINELEN 80 long flen = FLEN; int linelen = LINELEN; int crmod = 0; char obuf[BUFSIZ]; main(argc,argv) int argc; char **argv;{ char buf[LINELEN], *cp; int n, part, rest; long space; setbuf(stderr, 0); argv++; argc--; while (*(cp = *argv) == '-'){ switch (*++cp){ case 'u': bufflg--; break; case 'n': argc--; flen = (long)rnum(*++argv); break; case 'l': argc--; linelen = rnum(*++argv); if (linelen > LINELEN) linelen = LINELEN; break; } argv++; argc--; } if (argc != 1){ fprintf(stderr,"useage: record [-u] [-n filelen] [-l \ linelen] <logname>\n"); exit(); } /* signal(SIGINT, SIG_IGN); */ signal(SIGILL, flush); signal(SIGTRAP, tee); if ((filefp = fopen(*argv, "w")) == NULL) fprintf(stderr, "record: can't open %s\n",*argv); space = flen; for (;;){ fwrite(sep, SEPLEN, 1, filefp); if (bufflg == 0) fflush(filefp); fseek(filefp,-(long)(SEPLEN),1); if ((n = fread(buf, 1, linelen, stdin)) == NULL){ if (ferror(stdin)){ if (errno == EINTR) continue; perror("record"); endf(); } if (feof(stdin)){ fprintf(stderr, "record: end of file on input\n"); endf(); } fprintf(stderr, "record: unexplained NULL return\n"); endf(); } part = ((long)n < space) ? n : (int)space; twrite(buf, 1, part, filefp); if ((space -= (long)part) == 0L){ fseek (filefp,(long)0,0); if (rest = n-part) twrite(&buf[part], 1, rest, filefp); space = flen - (long)rest; } } } twrite(bufp, size, nitems, ioptr) char *bufp; int size, nitems; FILE *ioptr;{ static int i=0; fwrite(bufp, size, nitems, ioptr); if (bufflg == 0) fflush(filefp); if (teeflg) { fwrite(bufp, size, nitems, stdout); fflush(stdout); } } flush(){ signal(SIGILL, flush); fflush(filefp); } tee(){ signal(SIGTRAP, tee); teeflg = 1 - teeflg; } endf(){ fclose(filefp); exit(); } rnum(cp) register char *cp; { int i; if (*cp == '0'){ switch (*(cp+1) & ~0x20){ case 'X': ifmt[1] = 'x'; cp += 2; break; case '\0': ifmt[1] = 'd'; break; default: ifmt[1] = 'o'; cp++; break; } } else ifmt[1] = df; sscanf(cp,ifmt,&i); return(i); }