From 6613bd07075ef0c0d475f55c530500ad4c4d180e Mon Sep 17 00:00:00 2001 From: Alessandro Mauri Date: Sat, 25 Jul 2020 17:51:00 +0200 Subject: [PATCH] modified parser to suit new config format --- tests/parse.c | 84 ++++++++++++++++++++++++++++++++++----------------- 1 file changed, 57 insertions(+), 27 deletions(-) diff --git a/tests/parse.c b/tests/parse.c index f4db9a1..fad9767 100644 --- a/tests/parse.c +++ b/tests/parse.c @@ -1,3 +1,6 @@ +#define _POSIX_C_SOURCE 200809L +#define _DEFAULT_SOURCE + #include #include #include @@ -6,6 +9,8 @@ #define ANSI_COLOR_RED "\x1b[31m" #define ANSI_COLOR_RESET "\x1b[0m" +#define parse_failure(str, line) {fprintf(stderr, "Error in config file at line %d: " str "\n", line); exit(EXIT_FAILURE);} + int main(int argc, char const *argv[]) { if (argc < 2) @@ -14,41 +19,66 @@ int main(int argc, char const *argv[]) fd = fopen(argv[1], "r"); if (!fd) return -1; - for (;;) { - char *line = NULL; + for (int linenum = 1;; linenum++) { + int fuzzy = 0, tmp; + char *line = NULL, *keys = NULL, *command = NULL; size_t linelen = 0; + if (getline(&line, &linelen, fd) == -1) break; if (linelen < 2) continue; - printf(ANSI_COLOR_RED "%s\n" ANSI_COLOR_RESET, line); - /* remove white spaces */ - int inquotes = 0; - int inapos = 0; - for (size_t i = 0; i < linelen; i++) { - if (line[i] == '"' && !inapos) - inquotes = !inquotes; - if (line[i] == '\'' && !inquotes) - inapos = !inapos; - - if (isblank(line[i]) && !(inquotes || inapos)) { - memmove(&line[i], &line[i + 1], linelen - i); - i -= i ? 1 : 0; + printf(ANSI_COLOR_RED "Original line:\n%s\n" ANSI_COLOR_RESET, line); + + // Remove leading spaces + while (isspace(line[0]) && linelen > 1) + memmove(line, &line[1], --linelen); + + // Skip comments and blank lines + if (line[0] == '#' || !line[0]) { + free(line); + continue; + } + + printf("Valid line:\n%s\n", line); + + // TODO: multiline commands, ending with "\\n" + // TODO: better error checks in order to remove unnecessary + // memmoves (line has to begin with cmment or "*-"), etc. + + if (line[0] == '*') + fuzzy = 1; + memmove(line, &line[1], --linelen); + // Remove leading spaces + while (isspace(line[0]) && linelen > 1) + memmove(line, &line[1], --linelen); + + keys = strtok(line, ":"); + command = strtok(NULL, ":"); + if (!command || !keys) + parse_failure("No command or keys specified", linenum); + + // Remove whitespaces in keys + tmp = strlen(keys); + for (int i = 0; i < tmp; i++) { + if (isspace(keys[i])) { + memmove(&line[i], &line[i + 1], --tmp); } } - if (line[0] == '#') - continue; - printf("%s\n", line); - - char *token = NULL; - token = strtok(line, "="); - if (token) - printf("%s\n", token); - token = strtok(NULL, "="); - if (token) - printf("%s\n", token); - free(line); + + // Remove leading spaces in command + tmp = strlen(command); + while (isspace(command[0]) && tmp > 1) + memmove(command, &command[1], --tmp); + + int x = 1; + char *k = strtok(keys, ","); + do { + printf("Key %d: %s\n", x++, k); + } while ((k = strtok(NULL, ","))); + + printf("Command: %s\n", command); } return 0; }