aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRaghuram Subramani <raghus2247@gmail.com>2025-07-12 16:31:57 +0530
committerRaghuram Subramani <raghus2247@gmail.com>2025-07-12 16:31:57 +0530
commit37c69bc9c889c2cee0a66336c3b7dec7194d982b (patch)
treee1509b3c4d2261e21e17ab514926bf497967130f
parentf02732e5ec00849b3150c9261e59aa6e78ba6bbc (diff)
lexer: find_next_key should be able to skip x keys
-rw-r--r--include/lexer.h2
-rw-r--r--src/engine.c4
-rw-r--r--src/lexer.c15
3 files changed, 14 insertions, 7 deletions
diff --git a/include/lexer.h b/include/lexer.h
index ef99187..d93877e 100644
--- a/include/lexer.h
+++ b/include/lexer.h
@@ -30,7 +30,7 @@ typedef struct {
list_t *lex(char *buffer);
directive_t *find_directive(char *content, key_match_t *match);
-key_match_t *find_next_key(char *buffer);
+key_match_t *find_next_key(char *buffer, size_t skip);
char *find_contentfor_value(list_t *content_headers, char *key);
#endif
diff --git a/src/engine.c b/src/engine.c
index f57228c..61a01bf 100644
--- a/src/engine.c
+++ b/src/engine.c
@@ -78,8 +78,9 @@ ingest(char **buffer)
return NULL;
}
+ size_t skip = 0;
while (true) {
- match = find_next_key(*buffer);
+ match = find_next_key(*buffer, skip);
if (match == NULL)
break;
@@ -112,6 +113,7 @@ ingest(char **buffer)
case CONTENT:
case ENDCONTENT:
case _RAW:
+ skip++;
break;
}
diff --git a/src/lexer.c b/src/lexer.c
index 2076d20..0e1a80a 100644
--- a/src/lexer.c
+++ b/src/lexer.c
@@ -15,7 +15,7 @@ lex(char *buffer)
size_t current_offset = 0;
while (true) {
- key_match_t *key = find_next_key(buffer);
+ key_match_t *key = find_next_key(buffer, 0);
if (key == NULL)
break;
@@ -55,14 +55,19 @@ lex(char *buffer)
}
key_match_t *
-find_next_key(char *buffer)
+find_next_key(char *buffer, size_t skip)
{
key_match_t *match = calloc(1, sizeof(key_match_t));
+ size_t count = 0;
for (size_t i = 0; i < strlen(buffer); i++) {
if (buffer[i] == '{' && buffer[i + 1] == '{') {
- match->offset = i;
- break;
+ count++;
+
+ if (count > skip) {
+ match->offset = i;
+ break;
+ }
}
if (i == strlen(buffer) - 1) {
@@ -149,7 +154,7 @@ found_start:
directive_t *new_directive;
while (true) {
- new_match = find_next_key(buffer);
+ new_match = find_next_key(buffer, 0);
if (new_match == NULL) {
printf("Cannot find endcontent\n");
free(new_directive);