aboutsummaryrefslogtreecommitdiff
path: root/client/parse.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'client/parse.cpp')
-rw-r--r--client/parse.cpp26
1 files changed, 17 insertions, 9 deletions
diff --git a/client/parse.cpp b/client/parse.cpp
index f31e802..16f0781 100644
--- a/client/parse.cpp
+++ b/client/parse.cpp
@@ -6,7 +6,6 @@
#include "parse.h"
static int parse_string(const char * str, char * data, size_t * offset) {
- char closing = str[0];
char escape = false;
int i = 0;
size_t len = strlen(str);
@@ -21,15 +20,27 @@ static int parse_string(const char * str, char * data, size_t * offset) {
default:
return -i;
}
+ char closing = str[i];
for (i = 1; i < len && str[i] != '\0'; i++, *offset += 1) {
char c = str[i];
- // TODO: handle escaped characters
-
if (c == closing)
return i + 1; // +1 for closing quote
+ if (escape && c == '\\') {
+ char x = str[i + 1];
+ if (x == '0') c = '\0';
+ else if (x == 't') c = '\t';
+ else if (x == 'n') c = '\n';
+ else if (x == 'r') c = '\r';
+ else if (x == '\\') c = '\\';
+ else if (x == '\"') c = '\"';
+ else if (x == '\'') c = '\'';
+ else break;
+ i++;
+ }
+
if (data != NULL)
data[*offset] = c;
}
@@ -38,8 +49,7 @@ static int parse_string(const char * str, char * data, size_t * offset) {
}
static int parse_hexstr(const char * str, char * data, size_t * offset) {
- const char* ifs = IFS;
- size_t len = strcspn(str, ifs);
+ size_t len = strcspn(str, IFS);
int i = 0;
// check if token contains at least one colon
@@ -74,8 +84,7 @@ static int parse_hexstr(const char * str, char * data, size_t * offset) {
}
static int parse_number(const char * str, char * data, size_t * offset) {
- const char* ifs = IFS;
- size_t len = strcspn(str, ifs);
+ size_t len = strcspn(str, IFS);
int i = 0;
int base = 10;
bool bytestring = false;
@@ -142,12 +151,11 @@ static int parse_number(const char * str, char * data, size_t * offset) {
}
static int _strtodata_main(const char * str, char* data, size_t * offset) {
- const char* ifs = IFS;
size_t len = strlen(str);
int i, run;
for (i = 0; i < len; i += run) {
- i += strspn(&str[i], ifs); // skip whitespace
+ i += strspn(&str[i], IFS); // skip whitespace
if (str[i] == '\0') break; // end of string
if ((run = parse_string(str + i, data, offset)) > 0) continue;