/* qf -- quickly find strings in files */

#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define BUFSIZE (65536) /* 64k */

int main (int argc, char ** argv) {
    char *buf, *search;
    int i, j, found, len, slen;

    if (argc != 2) exit (2);
    search = argv[1];
    slen = strlen (search);

    buf = calloc (BUFSIZE, 1);
    if (buf == NULL) exit (2);

    found = 0;
    while ((len = read (STDIN_FILENO, buf, BUFSIZE)) > 0) {
        for (i=0; i<len; i++) {
            for (j=found; j<slen && i+j<len; j++) {
                if (buf[i+j] != search[j]) break;
            }
            if (j == slen) { /* found it */
                write (STDOUT_FILENO, &buf[i], slen);
                write (STDOUT_FILENO, "\n", 1);
                exit (0);
            }
            else if (j+i==len) {
                found = j;
            }
            else found = 0;
        }
    }
    return 1;
}

