Windows NT 4.0 source code leak
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

181 lines
5.0 KiB

4 years ago
  1. /* trans.c - transliterate one file into another
  2. *
  3. * Modifications:
  4. * 30-Apr-1987 mz Use fmove ()
  5. * 13-May-1987 mz Check for buffer overflow
  6. * Use stderr for error output
  7. * 14-May-1987 bw Fix stack overflow on fREMatch call
  8. * Make stdin/stdout O_BINARY when used
  9. * Use return message from fmove()
  10. * Send debug output to stderr
  11. * 01-Mar-1988 mz Add parameter to RECompile for Z syntax
  12. * 15-Sep-1988 bw fREMatch became REMatch
  13. *
  14. */
  15. #include <malloc.h>
  16. #include <stdio.h>
  17. #include <fcntl.h>
  18. #include <io.h>
  19. #include <string.h>
  20. #include <process.h>
  21. #include <windows.h>
  22. #include <tools.h>
  23. #include <remi.h>
  24. #define BUFFERSIZE 512
  25. #define MAXRESTACK 1024
  26. flagType fCase = FALSE; /* TRUE => case is significant */
  27. flagType fTrans = FALSE; /* TRUE => transform file */
  28. flagType fDebug = FALSE;
  29. // Forward Function Declarations...
  30. void usage( void );
  31. void fatal( char * );
  32. flagType fDoTrans( FILE *, FILE *, char * );
  33. int _CRTAPI1 main( int, char ** );
  34. extern flagType RETranslate( struct patType *, char *, char * );
  35. extern int RETranslateLength( struct patType *, char * );
  36. struct patType *pbuf;
  37. RE_OPCODE * REStack[MAXRESTACK];
  38. void usage ()
  39. {
  40. fatal ("Usage: trans [/c] [/t] [files]\n");
  41. }
  42. void fatal( p1 )
  43. char *p1;
  44. {
  45. fprintf (stderr, p1 );
  46. exit (1);
  47. }
  48. flagType fDoTrans (fhin, fhout, rbuf)
  49. FILE *fhin, *fhout;
  50. char *rbuf;
  51. {
  52. flagType fChanged;
  53. static char buf[BUFFERSIZE], rpl[BUFFERSIZE];
  54. char * p, * np;
  55. int line = 0;
  56. fChanged = FALSE;
  57. if (fDebug)
  58. fprintf (stderr, "Replacement '%s'\n", rbuf);
  59. while (fgetl (buf, BUFFERSIZE, fhin) != 0) {
  60. line++;
  61. p = buf;
  62. if (fDebug)
  63. fprintf (stderr, "Input: '%s'\n", buf);
  64. while (!REMatch (pbuf, buf, p, REStack, MAXRESTACK, TRUE)) {
  65. fChanged = TRUE;
  66. if (fDebug)
  67. fprintf (stderr, " Match at %x length %x\n",
  68. REStart (pbuf)-buf,
  69. RELength (pbuf, 0));
  70. /* Make sure translation will fit in temp buffers
  71. */
  72. if (RETranslateLength (pbuf, rbuf) >= BUFFERSIZE) {
  73. fprintf (stderr, "After translation, line %d too long", line);
  74. exit (1);
  75. }
  76. if (!RETranslate (pbuf, rbuf, rpl))
  77. fatal ("Invalid replacement pattern\n");
  78. if (fDebug)
  79. fprintf (stderr, " Replacement: '%s'\n", rpl);
  80. /* Make sure body - match + translation still fits in buffer
  81. */
  82. if (strlen (buf) - RELength (pbuf, 0) + strlen (rpl) >= BUFFERSIZE) {
  83. fprintf (stderr, "After translation, line %d too long", line);
  84. exit (1);
  85. }
  86. np = (p = REStart (pbuf)) + strlen (rpl);
  87. strcat (rpl, p + RELength (pbuf, 0));
  88. strcpy (p, rpl);
  89. p = np;
  90. if (fDebug)
  91. fprintf (stderr, " Match start %x in '%s'\n", p-buf, buf);
  92. }
  93. if (!fTrans || p != buf) {
  94. if (fDebug)
  95. fprintf (stderr, " Outputting '%s'\n", buf);
  96. fputl (buf, strlen(buf), fhout);
  97. }
  98. }
  99. return fChanged;
  100. }
  101. _CRTAPI1 main (c, v)
  102. int c;
  103. char *v[];
  104. {
  105. FILE *fhin, *fhout;
  106. char *p, *p1;
  107. flagType fChanged;
  108. ConvertAppToOem( c, v );
  109. if (c < 3)
  110. usage ();
  111. while (fSwitChr (*v[1])) {
  112. switch (v[1][1]) {
  113. case 'c':
  114. fCase = TRUE;
  115. break;
  116. case 'd':
  117. fDebug = TRUE;
  118. break;
  119. case 't':
  120. fTrans = TRUE;
  121. break;
  122. default:
  123. usage ();
  124. }
  125. SHIFT(c,v);
  126. }
  127. if ((pbuf = RECompile (v[1], fCase, TRUE)) == NULL)
  128. fatal ("Invalid pattern\n");
  129. p = v[2];
  130. if (c == 3) {
  131. _setmode(0, O_BINARY);
  132. _setmode(1, O_BINARY);
  133. fDoTrans (stdin, stdout, p);
  134. }
  135. else
  136. while (c != 3) {
  137. if ((fhin = fopen (v[3], "rb")) == NULL)
  138. fprintf (stderr, "trans: Cannot open %s - %s\n", v[3], error ());
  139. else
  140. if ((fhout = fopen ("trans$$$.$$$", "wb")) == NULL) {
  141. fprintf (stderr, "trans: Cannot create temp file - %s\n", error ());
  142. fclose (fhin);
  143. }
  144. else {
  145. printf ("%s ", v[3]);
  146. fChanged = fDoTrans (fhin, fhout, p);
  147. fclose (fhin);
  148. fclose (fhout);
  149. if (fChanged) {
  150. if (p1 = fmove ("trans$$$.$$$", v[3]))
  151. printf ("[%s]\n", p1);
  152. else
  153. printf ("[OK]\n");
  154. }
  155. else {
  156. _unlink ("trans$$$.$$$");
  157. printf ("[No change]\n");
  158. }
  159. }
  160. SHIFT(c,v);
  161. }
  162. return( 0 );
  163. }