/* gindent.c - coagulate all detail records after main (column 1) record*/ /* "group indented lines with master line" */ /* 1st used for decusc.doc, to prepare for sort */ /* use clean.c to regenerate decusc.doc, in ASCII ascending order */ /* ufilter5.c - prototype filter program - line (actually record) oriented */ /* * Modular, fast, record filter skeleton. * Forces FD.CR on output file. * Gets file names from argv[1],[2]. Too hard to use stdin,stdout. * The record has NOTHING (like free '\n's) added to it. * Howlong = the record size in bytes. * Designed for R.VAR files. * Seperate input & output buffers */ #include #include #include #include #include char * inbufp; /* where the input buffer is */ int bufmax; /* maximum record size, needed for recinp() */ #define OUTMAX (bufmax*50) /* maximum output record size */ FILE *inf; /* input file */ FILE *ouf; /* output file */ FDB * fdbp; /* obsolete kludge */ int howlong; /* char length of this record */ char * otbufp; /* where the output buffer is */ char * p; /* where to add to otbufp. -> '\0' */ main(argc,argv) char **argv; BEGIN char * recinp(); /* the record-getter: 0 means end-of-file */ IF ((inf=fopen(argv[1],"urn"))==NULL) THEN error("can't find %s\7",argv[1]); FI fdbp = inf -> io_fdb; IF (!(inbufp=malloc(bufmax=fdbp->f_fatt.f_rsiz))) THEN error("max record size=%d.\7",bufmax); FI IF (!(otbufp=malloc(OUTMAX))) THEN error("MAX rec siz=%d.\7",OUTMAX); FI IF ((ouf=fopen(argv[2],"uwn"))==NULL) THEN error("can't make %s\7",argv[2]); FI fdbp = ouf -> io_fdb; fdbp -> f_fatt . f_ratt |= fd_cr; /* force fd.cr */ strcpy(otbufp,""); p = otbufp; WHILE (recinp(inbufp,bufmax,inf,&howlong)) DO IF (isspac(*inbufp)) THEN IF (p>otbufp) THEN *p++ = '\n'; FI ELSE IF (p>otbufp) THEN recout(otbufp,p-otbufp,ouf); p = otbufp; FI FI copy(p,inbufp,howlong); p += howlong; OD IF (p>otbufp) THEN recout(otbufp,p-otbufp,ouf); FI IF (fclose(ouf)) THEN error("Can't close\7"); FI END char * recinp (where,moby,sewer,lenp) /* 0==end-file, else buf adr */ char * where; /* buffer */ int moby; /* buffer size */ FILE * sewer; /* input file */ int * lenp; /* return actual record size */ BEGIN *lenp = fget(where,moby,sewer); IF (ferror(sewer)) THEN error("read failure $$ferr=%oo\7\n",$$ferr); FI return (feof(sewer)?NULL:where); END recout(where,len,sewer) char * where; /* buffer */ int len; /* record size */ FILE * sewer; /* output file */ BEGIN fput(where,len,sewer); IF (ferror(sewer)) THEN error("write failed $$ferr=%oo len=%d.\7\n",$$ferr,len); FI END /* end: ufilter5.c */ /* end: gindent.c */