#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");
}