modified parser to suit new config format
This commit is contained in:
parent
cc15646a15
commit
6613bd0707
@ -1,3 +1,6 @@
|
|||||||
|
#define _POSIX_C_SOURCE 200809L
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
@ -6,6 +9,8 @@
|
|||||||
#define ANSI_COLOR_RED "\x1b[31m"
|
#define ANSI_COLOR_RED "\x1b[31m"
|
||||||
#define ANSI_COLOR_RESET "\x1b[0m"
|
#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[])
|
int main(int argc, char const *argv[])
|
||||||
{
|
{
|
||||||
if (argc < 2)
|
if (argc < 2)
|
||||||
@ -14,41 +19,66 @@ int main(int argc, char const *argv[])
|
|||||||
fd = fopen(argv[1], "r");
|
fd = fopen(argv[1], "r");
|
||||||
if (!fd)
|
if (!fd)
|
||||||
return -1;
|
return -1;
|
||||||
for (;;) {
|
for (int linenum = 1;; linenum++) {
|
||||||
char *line = NULL;
|
int fuzzy = 0, tmp;
|
||||||
|
char *line = NULL, *keys = NULL, *command = NULL;
|
||||||
size_t linelen = 0;
|
size_t linelen = 0;
|
||||||
|
|
||||||
if (getline(&line, &linelen, fd) == -1)
|
if (getline(&line, &linelen, fd) == -1)
|
||||||
break;
|
break;
|
||||||
if (linelen < 2)
|
if (linelen < 2)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
printf(ANSI_COLOR_RED "%s\n" ANSI_COLOR_RESET, line);
|
printf(ANSI_COLOR_RED "Original line:\n%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)) {
|
// Remove leading spaces
|
||||||
memmove(&line[i], &line[i + 1], linelen - i);
|
while (isspace(line[0]) && linelen > 1)
|
||||||
i -= i ? 1 : 0;
|
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;
|
// Remove leading spaces in command
|
||||||
token = strtok(line, "=");
|
tmp = strlen(command);
|
||||||
if (token)
|
while (isspace(command[0]) && tmp > 1)
|
||||||
printf("%s\n", token);
|
memmove(command, &command[1], --tmp);
|
||||||
token = strtok(NULL, "=");
|
|
||||||
if (token)
|
int x = 1;
|
||||||
printf("%s\n", token);
|
char *k = strtok(keys, ",");
|
||||||
free(line);
|
do {
|
||||||
|
printf("Key %d: %s\n", x++, k);
|
||||||
|
} while ((k = strtok(NULL, ",")));
|
||||||
|
|
||||||
|
printf("Command: %s\n", command);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user