Compare commits

..

No commits in common. "6613bd07075ef0c0d475f55c530500ad4c4d180e" and "67a36f71e38871d30355d5755dd6d3fd8b61ffa2" have entirely different histories.

2 changed files with 26 additions and 56 deletions

View File

@ -1,5 +1,5 @@
CC = gcc CC = gcc
CFLAGS = -Wall -std=c99 CFLAGS = -Wall -Werror -pedantic
parse: parse.c parse: parse.c

View File

@ -1,6 +1,3 @@
#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>
@ -9,8 +6,6 @@
#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)
@ -19,66 +14,41 @@ 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 (int linenum = 1;; linenum++) { for (;;) {
int fuzzy = 0, tmp; char *line = NULL;
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 "Original line:\n%s\n" ANSI_COLOR_RESET, line); 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;
// Remove leading spaces if (isblank(line[i]) && !(inquotes || inapos)) {
while (isspace(line[0]) && linelen > 1) memmove(&line[i], &line[i + 1], linelen - i);
memmove(line, &line[1], --linelen); i -= i ? 1 : 0;
// 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);
// Remove leading spaces in command char *token = NULL;
tmp = strlen(command); token = strtok(line, "=");
while (isspace(command[0]) && tmp > 1) if (token)
memmove(command, &command[1], --tmp); printf("%s\n", token);
token = strtok(NULL, "=");
int x = 1; if (token)
char *k = strtok(keys, ","); printf("%s\n", token);
do { free(line);
printf("Key %d: %s\n", x++, k);
} while ((k = strtok(NULL, ",")));
printf("Command: %s\n", command);
} }
return 0; return 0;
} }