Refactor for reuse of file parsing logic

This commit is contained in:
akp 2023-10-06 23:24:14 +01:00
parent e95a1607dd
commit 21b8037bd6
No known key found for this signature in database
GPG key ID: CF8D58F3DEB20755
2 changed files with 50 additions and 36 deletions

View file

@ -138,4 +138,50 @@ char* parse_rule(char line[], struct Rule* result) {
fail:
return NULL;
}
}
#define MAX_RULES 128
// parse_file parses a set of rules from the file named fname. The memory used
// by the return value should be freed by the caller. If the return value is
// NULL, an error was encoutered and echo'd.
struct Rule** parse_file(char fname[], size_t* num_parsed_rules) {
FILE *fp = fopen(fname, "r");
if (fp == NULL) {
perror("Read input file");
return NULL;
}
struct Rule** parsed_rules = malloc(sizeof(struct Rule*) * MAX_RULES);
*num_parsed_rules = 0;
char *line = NULL;
size_t line_size = 0;
while (getline(&line, &line_size, fp) != -1) {
if (*num_parsed_rules == MAX_RULES) {
fprintf(stderr, "Too many rules\n");
return NULL;
}
struct Rule* rule = (struct Rule*) malloc(sizeof(struct Rule));
char* endptr = parse_rule(line, rule);
if (endptr == NULL || *endptr != '\n') {
fprintf(stderr, "Ill formed rule: %s\n", line);
return NULL;
}
parsed_rules[*num_parsed_rules] = rule;
(*num_parsed_rules) += 1;
}
if (!feof(fp)) { // When we get here, getline has always returned -1 but may or may not have reached EOF.
// If it hasn't reached EOF, an error was thrown.
perror("Read line");
return NULL;
}
free(line);
if (fclose(fp) != 0) {
perror("Close input file");
return NULL;
}
return parsed_rules;
}

View file

@ -2,7 +2,6 @@
#include <stdio.h>
#include "parser.c"
#define MAX_RULES 128
int main(int argc, char* argv[]) {
if (argc < 2) {
@ -10,42 +9,11 @@ int main(int argc, char* argv[]) {
return 1;
}
char *fname = argv[1];
FILE *fp = fopen(fname, "r");
if (fp == NULL) {
perror("Read input file");
return 1;
}
size_t num_parsed_rules;
struct Rule** parsed_rules = parse_file(argv[1], &num_parsed_rules);
struct Rule** parsed_rules = malloc(sizeof(struct Rule*) * MAX_RULES);
uint num_parsed_rules = 0;
char *line = NULL;
size_t line_size = 0;
while (getline(&line, &line_size, fp) != -1) {
if (num_parsed_rules == MAX_RULES) {
fprintf(stderr, "Too many rules\n");
return 1;
}
struct Rule* rule = (struct Rule*) malloc(sizeof(struct Rule));
char* endptr = parse_rule(line, rule);
if (endptr == NULL || *endptr != '\n') {
fprintf(stderr, "Ill formed rule: %s\n", line);
return 1;
}
parsed_rules[num_parsed_rules] = rule;
num_parsed_rules += 1;
}
if (!feof(fp)) { // When we get here, getline has always returned -1 but may or may not have reached EOF.
// If it hasn't reached EOF, an error was thrown.
perror("Read line");
return 1;
}
free(line);
if (fclose(fp) != 0) {
perror("Close input file");
if (parsed_rules == NULL) {
return 1;
}