95 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
	
		
			1.6 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /*	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);
 | |
| }
 |