/* * Copyright (c) Camden Dixie O'Brien * SPDX-License-Identifier: AGPL-3.0-only */ #include "compile.h" #include #include #include #include #define BUFFER_START_CAPACITY 128 #define PREFIX ".*(" #define PREFIX_LEN 3 #define SUFFIX ").*" #define SUFFIX_LEN 3 int main(int argc, char *argv[]) { if (argc != 2) { fprintf(stderr, "Usage: %s REGEX\n", argv[0]); return EXIT_FAILURE; } const int input_len = strlen(argv[1]); const int regex_len = input_len + 6; char *regex = malloc(regex_len); memcpy(regex, PREFIX, PREFIX_LEN); memcpy(regex + PREFIX_LEN, argv[1], input_len); memcpy(regex + PREFIX_LEN + input_len, SUFFIX, SUFFIX_LEN); fsa_t dfa; if (!compile(regex, regex_len, &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; }