54 lines
990 B
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;
|
|
}
|