80 lines
1.6 KiB
C
80 lines
1.6 KiB
C
#include "string.h"
|
|
#include "../../lexer/token.h"
|
|
|
|
#include <cjson/cJSON.h>
|
|
#include <stddef.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
|
|
char *swap_quotes(char *input, char quote) {
|
|
size_t len = strlen(input);
|
|
char *result = malloc(len + 1);
|
|
if (!result)
|
|
return NULL;
|
|
|
|
for (size_t i = 0; i < len; ++i) {
|
|
if (input[i] == '"')
|
|
result[i] = quote;
|
|
else if (input[i] == quote)
|
|
result[i] = '"';
|
|
else
|
|
result[i] = input[i];
|
|
}
|
|
result[len] = '\0';
|
|
return result;
|
|
}
|
|
|
|
char *unquote(char *str) {
|
|
if (*str == '\0')
|
|
return NULL;
|
|
|
|
char quote = str[0];
|
|
char *swapped = NULL;
|
|
char *unescaped = NULL;
|
|
|
|
if (quote != '"') {
|
|
swapped = swap_quotes(str, quote);
|
|
if (!swapped)
|
|
return NULL;
|
|
str = swapped;
|
|
}
|
|
|
|
cJSON *json = cJSON_Parse(str);
|
|
if (!json || !cJSON_IsString(json)) {
|
|
if (swapped)
|
|
free(swapped);
|
|
return NULL;
|
|
}
|
|
|
|
// Copy unescaped string before freeing JSON object
|
|
const char *decoded = cJSON_GetStringValue(json);
|
|
if (!decoded) {
|
|
cJSON_Delete(json);
|
|
if (swapped)
|
|
free(swapped);
|
|
return NULL;
|
|
}
|
|
|
|
unescaped = strdup(decoded);
|
|
cJSON_Delete(json);
|
|
if (swapped)
|
|
free(swapped);
|
|
|
|
// If input was single-quoted, swap quotes back in the output
|
|
if (quote != '"') {
|
|
char *final = swap_quotes(unescaped, quote);
|
|
free(unescaped);
|
|
return final;
|
|
}
|
|
|
|
return unescaped;
|
|
}
|
|
|
|
ParsedValue * parse_string(Token token) {
|
|
ParsedValue * parsedValue = malloc(sizeof(ParsedValue));
|
|
|
|
parsedValue->type = AST_STRING;
|
|
parsedValue->data = unquote(token.value);
|
|
return parsedValue;
|
|
} |