#include #include #include typedef int (*config_parser_fn_t)(char *, void *); struct parse_table_entry { char *token; void *dest; config_parser_fn_t parser; }; struct config_data cd; struct config_data { char *interfaces; long int retries; }; int parse_int(char *str, void *dst) { *((long int *)dst) = strtoul(str, NULL, 10); return 0; } int parse_str(char *str, void *dst) { *((char **)dst) = strdup(str); return 0; } struct parse_table_entry pt[] = { { "interfaces", &cd.interfaces, parse_str }, { "retries", &cd.retries, parse_int }, }; int main(int argc, char *argv[]) { FILE *input; char line[128]; input = fopen("./config_file", "r"); if (!input) { fprintf(stderr, "Unable to open ./config_file: %s\n", strerror(errno)); return -1; } while (fgets(line, sizeof(line), input) != NULL) { int i, toklen; for (i = 0; i < sizeof(pt) / sizeof(struct parse_table_entry); i++) { toklen = strlen(pt[i].token); if (strncmp(pt[i].token, line, toklen) == 0) { if (pt[i].parser(line + toklen + 1, pt[i].dest) != 0) { fprintf(stderr, "Unexpected input. Aborting.\n"); break; } } } } printf("interfaces: %s\n", (cd.interfaces) ? cd.interfaces : "unset"); printf("retries: %d\n", cd.retries); fclose(input); }