Refactor for reuse of file parsing logic
This commit is contained in:
parent
e95a1607dd
commit
21b8037bd6
2 changed files with 50 additions and 36 deletions
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Reference in a new issue