1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495 |
- /* Utility to change strings in binary files.
- Reads from standard input, writes on standard output.
- Only replaces one occurrence if the -s flag is given.
- */
- #include <stdio.h>
- main(argc, argv)
- char *argv[];
- {
- register char *psrc;
- register int ch;
- int srclen;
- int sflag = 0;
- char *progname = argv[0];
- while (argc > 1 && argv[1][0] == '-') {
- switch(argv[1][1]) {
- case 's':
- sflag = 1;
- break;
- default:
- fprintf(stderr,
- "Usage: %s [-s] <originalstring> <replacementstring>\n",
- progname);
- exit(1);
- }
- argc--;
- argv++;
- }
- if (argc != 3) {
- fprintf(stderr,
- "Usage: %s [-s] <originalstring> <replacementstring>\n",
- progname);
- exit(1);
- }
- psrc = argv[1];
- srclen = strlen(psrc);
- if (srclen == 0) {
- fprintf(stderr,
- "%s: originalstring must have length > 0\n",
- progname);
- exit(1);
- }
- for (;;) {
- ch = getchar();
- if (ch == EOF) exit(0);
- if (ch != (*psrc & 0377)) {
- putchar(ch);
- continue;
- }
- do {
- psrc++;
- ch = getchar();
- } while (ch && ch == (*psrc & 0377));
- if (ch != EOF) ungetc(ch, stdin);
- if (*psrc == '\0') {
- /* we have a match */
- register int i;
- register char *prepl = argv[2];
- for (i = srclen; i; i--) {
- if (*prepl) {
- putchar(*prepl);
- prepl++;
- }
- else putchar('\0');
- }
- while (*prepl) {
- putchar(*prepl);
- prepl++;
- if (ch != EOF) ch = getchar();
- }
- if (sflag) {
- break;
- }
- }
- else {
- register char *p = argv[1];
-
- while (p < psrc) {
- putchar(*p);
- p++;
- }
- if (ch == EOF) exit(0);
- }
- psrc = argv[1];
- }
- if (ch == EOF) exit(0);
- while ((ch = getchar()) != EOF) {
- putchar(ch);
- }
- exit(0);
- }
|