aboutsummaryrefslogtreecommitdiff
path: root/src/lexer.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lexer.c')
-rw-r--r--src/lexer.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/src/lexer.c b/src/lexer.c
new file mode 100644
index 0000000..34db154
--- /dev/null
+++ b/src/lexer.c
@@ -0,0 +1,81 @@
+#define _GNU_SOURCE
+
+#include <ctype.h>
+#include <lexer.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+key_match_t *
+find_next_key(char *buffer)
+{
+ key_match_t *match = calloc(1, sizeof(key_match_t));
+
+ for (size_t i = 0; i < strlen(buffer) - 1; i++) {
+ if (buffer[i] == '{' && buffer[i + 1] == '{')
+ match->offset = i;
+
+ if (i == strlen(buffer) - 1) {
+ free(match);
+ return NULL;
+ }
+ }
+
+ char *subbuffer = buffer + match->offset;
+ for (size_t i = 0; i < strlen(subbuffer) - 1; i++) {
+ if (subbuffer[i] == '}' && subbuffer[i + 1] == '}')
+ match->length = i + 2;
+
+ if (i == strlen(buffer) - 1) {
+ printf("Unterminated Key\n");
+ free(match);
+ return NULL;
+ }
+ }
+
+ return match;
+}
+
+directive_t *
+find_directive(char *content, key_match_t *match)
+{
+ directive_t *directive = (directive_t *) calloc(1, sizeof(directive_t));
+
+ char *buffer = content + match->offset;
+ unsigned int n = 0;
+
+ for (size_t i = 0; i < match->length; i++)
+ switch (buffer[i]) {
+ case '{':
+ case ' ':
+ case '\t':
+ case '\n':
+ n++;
+ break;
+
+ default:
+ goto found_start;
+ }
+
+ return NULL;
+
+found_start:
+ if (strncmp(buffer + n, "include", strlen("include")) == 0) {
+ directive->type = INCLUDE;
+
+ char *operand = NULL;
+ for (size_t i = n + strlen("include");
+ i < match->length - strlen("include");
+ i++)
+ if (isalnum(buffer[i])) {
+ sscanf(buffer + i, "%ms\"", &operand);
+ operand[strlen(operand) - 1] = '\0';
+ break;
+ }
+
+ asprintf((char **) &directive->operands, "%s", operand);
+ free(operand);
+ }
+
+ return directive;
+}