#include <fcntl.h> #include <stdio.h> void main(int argc, char *argv[]) { FILE *f, *g; char buf[8192], *p, *q, *match; int a, b, offset, len, count=0, total, found, matchlen; memset(buf, 0, 8192); if(argc < 3) { fprintf(stderr, "Usage: %s [pattern] [file...]\n", argv[0]); exit(1); } if(!(matchlen=strlen(argv[1]))) { fprintf(stderr, "%s: Invalid match length.\n", argv[0]); exit(1); } match=argv[1]; for(a=2;a<argc;a++) { if(!(f=fopen(argv[a], "r"))) { perror(argv[a]); continue; } for(found=0,offset=0;!found && offset<256;offset++) { total=0; while(!found && (len=fread(buf, 1, 4096, f))) { for(b=0;b<len;b++) buf[b]+=offset; q=buf; while((p=(char *)memchr(q, *match, len))) { q=p+1; if(!strncmp(p, match, matchlen)) { printf("%s: Byte %d, Offset %d\n", argv[a], total+(p-buf), offset); if((q=strrchr(argv[a], '/'))) strcpy(buf, q+1); else { strcpy(buf, argv[a]); strcat(buf, "~"); } g=fopen(buf, "w"); rewind(f); while((len=fread(buf, 1, 4096, f))) { for(b=0;b<len;b++) buf[b]+=offset; fwrite(buf, len, 1, g); } fclose(g); found=1; count++; break; } } total+=len; } rewind(f); } fclose(f); } if(count) printf("%d match%s found.\n", count, count==1?"":"es"); else printf("No match found. Anywhere.\n"); }