mirror of
https://github.com/cesanta/mongoose.git
synced 2026-10-23 11:44:53 +00:00
Graph fixes
This commit is contained in:
1 parent
4b01dc1a78
commit
8030f8f8b5
10 files changed
+114
-77
No files matched your search
+28
-24
@@ -305,38 +305,42 @@ bool mg_json_get_bool(struct mg_str json, const char *path, bool *v) {
|
||||
return found;
|
||||
}
|
||||
|
||||
bool mg_json_unescape(struct mg_str s, char *to, size_t n) {
|
||||
size_t i, j;
|
||||
for (i = 0, j = 0; i < s.len && j < n; i++, j++) {
|
||||
if (s.buf[i] == '\\' && i + 5 < s.len && s.buf[i + 1] == 'u') {
|
||||
// \uXXXX escape. We process simple one-byte chars \u00xx within ASCII
|
||||
// range. More complex chars would require dragging in a UTF8 library,
|
||||
// which is too much for us
|
||||
if (mg_str_to_num(mg_str_n(s.buf + i + 2, 4), 16, &to[j],
|
||||
sizeof(uint8_t)) == false)
|
||||
return false;
|
||||
i += 5;
|
||||
} else if (s.buf[i] == '\\' && i + 1 < s.len) {
|
||||
char c = json_esc(s.buf[i + 1], 0);
|
||||
if (c == 0) return false;
|
||||
to[j] = c;
|
||||
i++;
|
||||
} else {
|
||||
to[j] = s.buf[i];
|
||||
size_t mg_json_unescape(struct mg_str json, const char *path, char *to,
|
||||
size_t n) {
|
||||
struct mg_str s = mg_json_get_tok(json, path);
|
||||
size_t res = 0, i, j;
|
||||
if (s.len > 1 && s.buf[0] == '"') { // Is is a string?
|
||||
s.len -= 2, s.buf++; // Trim surrounding double-quotes
|
||||
for (i = 0, j = 0; i < s.len && j < n; i++, j++) {
|
||||
if (s.buf[i] == '\\' && i + 5 < s.len && s.buf[i + 1] == 'u') {
|
||||
// \uXXXX escape. We process simple one-byte chars \u00xx within ASCII
|
||||
// range. More complex chars would require dragging in a UTF8 library,
|
||||
// which is too much for us
|
||||
if (mg_str_to_num(mg_str_n(s.buf + i + 2, 4), 16, &to[j],
|
||||
sizeof(uint8_t)) == false)
|
||||
break;
|
||||
i += 5;
|
||||
} else if (s.buf[i] == '\\' && i + 1 < s.len) {
|
||||
char c = json_esc(s.buf[i + 1], 0);
|
||||
if (c == 0) return false;
|
||||
to[j] = c;
|
||||
i++;
|
||||
} else {
|
||||
to[j] = s.buf[i];
|
||||
}
|
||||
}
|
||||
if (j < n) res = j;
|
||||
if (n > 0) to[j < n ? j : n - 1] = '\0';
|
||||
}
|
||||
if (j >= n) return false;
|
||||
if (n > 0) to[j] = '\0';
|
||||
return true;
|
||||
return res;
|
||||
}
|
||||
|
||||
char *mg_json_get_str(struct mg_str json, const char *path) {
|
||||
char *result = NULL;
|
||||
int len = 0, off = mg_json_get(json, path, &len);
|
||||
if (off >= 0 && len > 1 && json.buf[off] == '"') {
|
||||
if (off >= 0 && len > 2 && json.buf[off] == '"') {
|
||||
if ((result = (char *) mg_calloc(1, (size_t) len)) != NULL &&
|
||||
!mg_json_unescape(mg_str_n(json.buf + off + 1, (size_t) (len - 2)),
|
||||
result, (size_t) len)) {
|
||||
mg_json_unescape(json, path, result, (size_t) len) == 0) {
|
||||
mg_free(result);
|
||||
result = NULL;
|
||||
}
|
||||
|
||||
+1
-1
@@ -18,7 +18,7 @@ long mg_json_get_long(struct mg_str json, const char *path, long dflt);
|
||||
char *mg_json_get_str(struct mg_str json, const char *path);
|
||||
char *mg_json_get_hex(struct mg_str json, const char *path, int *len);
|
||||
char *mg_json_get_b64(struct mg_str json, const char *path, int *len);
|
||||
size_t mg_json_unescape(struct mg_str json, const char *path, char *, size_t);
|
||||
|
||||
bool mg_json_unescape(struct mg_str str, char *buf, size_t len);
|
||||
size_t mg_json_next(struct mg_str obj, size_t ofs, struct mg_str *key,
|
||||
struct mg_str *val);
|
||||
Reference in new issue
Block a user