--- libelwix/src/json.c 2018/04/18 14:55:45 1.4.6.3 +++ libelwix/src/json.c 2021/03/21 01:32:04 1.9 @@ -3,7 +3,7 @@ * by Michael Pounov * * $Author: misho $ -* $Id: json.c,v 1.4.6.3 2018/04/18 14:55:45 misho Exp $ +* $Id: json.c,v 1.9 2021/03/21 01:32:04 misho Exp $ * ************************************************************************** The ELWIX and AITNET software is distributed under the following @@ -12,7 +12,7 @@ terms: All of the documentation and software included in the ELWIX and AITNET Releases is copyrighted by ELWIX - Sofia/Bulgaria -Copyright 2004 - 2018 +Copyright 2004 - 2019 by Michael Pounov . All rights reserved. Redistribution and use in source and binary forms, with or without @@ -224,7 +224,7 @@ json_parse_value(json_t * __restrict json, const char case '}': goto found; } - if (jstr[json->h_pos] < 32 || jstr[json->h_pos] > 127) { + if (jstr[json->h_pos] < 32 || (u_char) jstr[json->h_pos] > 127) { json->h_pos = pos; elwix_SetErr(J_ERR_INVAL, "%s", jerrstr[J_ERR_INVAL]); return -1; @@ -442,19 +442,25 @@ json_token2val(const char *jstr, jtok_t * __restrict t char * json_token2str(const char *jstr, jtok_t * __restrict tok) { - char *str = NULL; + char *s, *s2, *wrk, *str = NULL; size_t len; if (!jstr || !tok) return NULL; + len = json_toklen(tok); str = e_malloc(len + 1); if (!str) return NULL; else { - strncpy(str, json_tokstr(jstr, tok), len); - str[len] = 0; + memset(str, 0, len + 1); + + wrk = e_strdup(json_tokstr(jstr, tok)); + wrk[len] = 0; + for (s = wrk, s2 = str; *s; s++) + *s2++ = (*s != '\\') ? *s : *++s; + e_free(wrk); } return str; @@ -505,6 +511,40 @@ json_token2dbl(const char *jstr, jtok_t * __restrict t } /* + * json_token2bool() - Return token to bool int + * + * @jstr = JSON string + * @tok = Token for convert + * @return 0 for FALSE and !=0 for TRUE + */ +int +json_token2bool(const char *jstr, jtok_t * __restrict tok) +{ + double ret = 0; + char *str; + + str = json_token2str(jstr, tok); + if (!str) + return 0; + + switch (*str) { + case 't': + case 'T': + ret = 1; + break; + case 'f': + case 'F': + ret = 0; + break; + default: + ret = (int) strtol(str, NULL, 10); + break; + } + e_free(str); + return ret; +} + +/* * json_findbykey() - Find token data by key * * @jstr = JSON string @@ -527,7 +567,7 @@ json_findbykey(const char *jstr, const char *key, jtyp klen = strlen(key); for (i = 1; i < toksnum; i++) { - if (toks[i].tok_type == J_STRING && + if (toks[i].tok_type == J_STRING && toks[i].tok_size == 1 && klen == toks[i].tok_end - toks[i].tok_start && !strncmp(jstr + toks[i].tok_start, key, klen)) { if (type != J_UNDEF) { @@ -983,6 +1023,48 @@ json_add_pair(char * __restrict jstr, int jlen, int ws return -1; } if ((len = json_add_string(jstr, jlen, 0, val)) == -1) { + jstr[eos] = 0; + return -1; + } + + return len; +} + +/* + * json_add_pair2() - Adds key/value pair with formated args + * + * @jstr = JSON string + * @jlen = JSON string length + * @wspace = whitespace include + * @key = Key string + * @fmt = Format string for values + * return: -1 error or !=-1 actual JSON string length + */ +int +json_add_pair2(char * __restrict jstr, int jlen, int wspace, const char *key, const char *fmt, ...) +{ + int len = -1; + size_t eos; + va_list lst; + char szStr[BUFSIZ] = { [0 ... BUFSIZ - 1] = 0 }; + + if (!jstr || !key || !fmt) + return -1; + else + eos = strlen(jstr); + + if (json_add_string(jstr, jlen, 0, key) == -1) { + jstr[eos] = 0; + return -1; + } + if (json_add_colon(jstr, jlen, wspace) == -1) { + jstr[eos] = 0; + return -1; + } + va_start(lst, fmt); + vsnprintf(szStr, sizeof szStr, fmt, lst); + va_end(lst); + if ((len = json_add_string(jstr, jlen, 0, szStr)) == -1) { jstr[eos] = 0; return -1; }