str_change.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /* Utility to change strings in binary files.
  2. Reads from standard input, writes on standard output.
  3. Only replaces one occurrence if the -s flag is given.
  4. */
  5. #include <stdio.h>
  6. main(argc, argv)
  7. char *argv[];
  8. {
  9. register char *psrc;
  10. register int ch;
  11. int srclen;
  12. int sflag = 0;
  13. char *progname = argv[0];
  14. while (argc > 1 && argv[1][0] == '-') {
  15. switch(argv[1][1]) {
  16. case 's':
  17. sflag = 1;
  18. break;
  19. default:
  20. fprintf(stderr,
  21. "Usage: %s [-s] <originalstring> <replacementstring>\n",
  22. progname);
  23. exit(1);
  24. }
  25. argc--;
  26. argv++;
  27. }
  28. if (argc != 3) {
  29. fprintf(stderr,
  30. "Usage: %s [-s] <originalstring> <replacementstring>\n",
  31. progname);
  32. exit(1);
  33. }
  34. psrc = argv[1];
  35. srclen = strlen(psrc);
  36. if (srclen == 0) {
  37. fprintf(stderr,
  38. "%s: originalstring must have length > 0\n",
  39. progname);
  40. exit(1);
  41. }
  42. for (;;) {
  43. ch = getchar();
  44. if (ch == EOF) exit(0);
  45. if (ch != (*psrc & 0377)) {
  46. putchar(ch);
  47. continue;
  48. }
  49. do {
  50. psrc++;
  51. ch = getchar();
  52. } while (ch && ch == (*psrc & 0377));
  53. if (ch != EOF) ungetc(ch, stdin);
  54. if (*psrc == '\0') {
  55. /* we have a match */
  56. register int i;
  57. register char *prepl = argv[2];
  58. for (i = srclen; i; i--) {
  59. if (*prepl) {
  60. putchar(*prepl);
  61. prepl++;
  62. }
  63. else putchar('\0');
  64. }
  65. while (*prepl) {
  66. putchar(*prepl);
  67. prepl++;
  68. if (ch != EOF) ch = getchar();
  69. }
  70. if (sflag) {
  71. break;
  72. }
  73. }
  74. else {
  75. register char *p = argv[1];
  76. while (p < psrc) {
  77. putchar(*p);
  78. p++;
  79. }
  80. if (ch == EOF) exit(0);
  81. }
  82. psrc = argv[1];
  83. }
  84. if (ch == EOF) exit(0);
  85. while ((ch = getchar()) != EOF) {
  86. putchar(ch);
  87. }
  88. exit(0);
  89. }