#include #include #include #include #include "puzzle_input.h" parse_ret_t parse_long(char * buffer, int64_t *val) { *val = strtol(buffer, NULL, 10); if (*val == LONG_MIN || *val == LONG_MAX) { return PARSER_INVALID; } return PARSER_OK; } parse_ret_t parse_long_from_buff(char * buffer, void * data, uint16_t index) { uint64_t * int_data = (uint64_t *)data; uint64_t val; int ret; ret = parse_long(buffer, (int64_t *)&val); if (ret != PARSER_OK) { return ret; } int_data[index] = val; return PARSER_OK; } parse_ret_t read_input(const char * file_path, void * data, uint16_t max_len, input_parser_t parser, uint16_t * len) { char buffer[64]; int c; int ret = 0; FILE * file = fopen(file_path, "r"); uint16_t data_ndx = 0; if (file != NULL) { int buffer_ndx = 0; while ((c = fgetc(file)) != EOF) { if (c == '\n') { buffer[buffer_ndx] = 0; ret = parser(buffer, data, data_ndx); if (ret != PARSER_OK) { break; } data_ndx++; if (data_ndx >= max_len) { ret = PARSER_RANGE_OVERFLOW; break; } buffer_ndx = 0; } else { buffer[buffer_ndx] = (char)c; buffer_ndx++; } } if (buffer_ndx > 0) { ret = parser(buffer, data, data_ndx); if (ret == PARSER_OK) { data_ndx++; } } } else { ret = PARSE_FILE_ERR; } if (file != NULL) { fclose(file); } *len = data_ndx; return ret; }