regex-engine/demo/shitgrep.c

54 lines
990 B
C

/*
* Copyright (c) Camden Dixie O'Brien
* SPDX-License-Identifier: AGPL-3.0-only
*/
#include "compile.h"
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFFER_START_CAPACITY 128
int main(int argc, char *argv[])
{
if (argc != 2) {
fprintf(stderr, "Usage: %s REGEX\n", argv[0]);
return EXIT_FAILURE;
}
fsa_t dfa;
if (!compile(argv[1], strlen(argv[1]), &dfa)) {
fprintf(stderr, "Failed to parse regex\n");
return EXIT_FAILURE;
}
int len = 0, capacity = BUFFER_START_CAPACITY;
char *buffer = malloc(capacity);
assert(NULL != buffer);
int c;
while ((c = getchar()) != EOF) {
if (capacity < len + 1) {
capacity *= 2;
buffer = realloc(buffer, capacity);
assert(NULL != buffer);
}
if ('\n' == c) {
if (fsa_accepts(&dfa, buffer, len)) {
buffer[len++] = '\n';
fwrite(buffer, 1, len, stdout);
}
len = 0;
} else {
buffer[len++] = c;
}
}
fsa_free(&dfa);
free(buffer);
return EXIT_SUCCESS;
}