/* trans.c - transliterate one file into another * * Modifications: * 30-Apr-1987 mz Use fmove () * 13-May-1987 mz Check for buffer overflow * Use stderr for error output * 14-May-1987 bw Fix stack overflow on fREMatch call * Make stdin/stdout O_BINARY when used * Use return message from fmove() * Send debug output to stderr * 01-Mar-1988 mz Add parameter to RECompile for Z syntax * 15-Sep-1988 bw fREMatch became REMatch * */ #include #include #include #include #include #include #include #include #include #define BUFFERSIZE 512 #define MAXRESTACK 1024 flagType fCase = FALSE; /* TRUE => case is significant */ flagType fTrans = FALSE; /* TRUE => transform file */ flagType fDebug = FALSE; // Forward Function Declarations... void usage( void ); void fatal( char * ); flagType fDoTrans( FILE *, FILE *, char * ); extern flagType RETranslate( struct patType *, char *, char * ); extern int RETranslateLength( struct patType *, char * ); struct patType *pbuf; RE_OPCODE * REStack[MAXRESTACK]; void usage () { fatal ("Usage: trans [/c] [/t] [files]\n"); } void fatal( p1 ) char *p1; { fprintf (stderr, p1 ); exit (1); } flagType fDoTrans (fhin, fhout, rbuf) FILE *fhin, *fhout; char *rbuf; { flagType fChanged; static char buf[BUFFERSIZE], rpl[BUFFERSIZE]; char * p, * np; int line = 0; fChanged = FALSE; if (fDebug) fprintf (stderr, "Replacement '%s'\n", rbuf); while (fgetl (buf, BUFFERSIZE, fhin) != 0) { line++; p = buf; if (fDebug) fprintf (stderr, "Input: '%s'\n", buf); while (!REMatch (pbuf, buf, p, REStack, MAXRESTACK, TRUE)) { fChanged = TRUE; if (fDebug) fprintf (stderr, " Match at %x length %x\n", REStart (pbuf)-buf, RELength (pbuf, 0)); /* Make sure translation will fit in temp buffers */ if (RETranslateLength (pbuf, rbuf) >= BUFFERSIZE) { fprintf (stderr, "After translation, line %d too long", line); exit (1); } if (!RETranslate (pbuf, rbuf, rpl)) fatal ("Invalid replacement pattern\n"); if (fDebug) fprintf (stderr, " Replacement: '%s'\n", rpl); /* Make sure body - match + translation still fits in buffer */ if (strlen (buf) - RELength (pbuf, 0) + strlen (rpl) >= BUFFERSIZE) { fprintf (stderr, "After translation, line %d too long", line); exit (1); } np = (p = REStart (pbuf)) + strlen (rpl); strcat (rpl, p + RELength (pbuf, 0)); strcpy (p, rpl); p = np; if (fDebug) fprintf (stderr, " Match start %x in '%s'\n", p-buf, buf); } if (!fTrans || p != buf) { if (fDebug) fprintf (stderr, " Outputting '%s'\n", buf); fputl (buf, strlen(buf), fhout); } } return fChanged; } __cdecl main ( int c, char *v[] ) { FILE *fhin, *fhout; char *p, *p1; flagType fChanged; ConvertAppToOem( c, v ); if (c < 3) usage (); while (fSwitChr (*v[1])) { switch (v[1][1]) { case 'c': fCase = TRUE; break; case 'd': fDebug = TRUE; break; case 't': fTrans = TRUE; break; default: usage (); } SHIFT(c,v); } if ((pbuf = RECompile (v[1], fCase, TRUE)) == NULL) fatal ("Invalid pattern\n"); p = v[2]; if (c == 3) { _setmode(0, O_BINARY); _setmode(1, O_BINARY); fDoTrans (stdin, stdout, p); } else while (c != 3) { if ((fhin = fopen (v[3], "rb")) == NULL) fprintf (stderr, "trans: Cannot open %s - %s\n", v[3], error ()); else if ((fhout = fopen ("trans$$$.$$$", "wb")) == NULL) { fprintf (stderr, "trans: Cannot create temp file - %s\n", error ()); fclose (fhin); } else { printf ("%s ", v[3]); fChanged = fDoTrans (fhin, fhout, p); fclose (fhin); fclose (fhout); if (fChanged) { if (p1 = fmove ("trans$$$.$$$", v[3])) printf ("[%s]\n", p1); else printf ("[OK]\n"); } else { _unlink ("trans$$$.$$$"); printf ("[No change]\n"); } } SHIFT(c,v); } return( 0 ); }