static struct buffer parse_string(struct buffer buff, struct rmsgpack_dom_value *value, const char **error) { const char * str_start; char terminator = '\0'; char c = '\0'; (void)c; buff = get_char(buff, &terminator, error); if (*error) return buff; if (terminator != '"' && terminator != '\'') { buff.offset--; raise_expected_string(buff.offset, error); } str_start = buff.data + buff.offset; buff = get_char(buff, &c, error); while (!*error) { if (c == terminator) break; buff = get_char(buff, &c, error); } if (!*error) { value->type = RDT_STRING; value->string.len = (buff.data + buff.offset) - str_start - 1; value->string.buff = (char*)calloc(value->string.len + 1, sizeof(char)); if (!value->string.buff) raise_enomem(error); else memcpy( value->string.buff, str_start, value->string.len ); } return buff; }
static struct buffer parse_string(struct buffer buff, struct rmsgpack_dom_value *value, const char **error) { const char * str_start = NULL; char terminator = '\0'; char c = '\0'; int is_binstr = 0; (void)c; buff = get_char(buff, &terminator, error); if (*error) return buff; if (terminator == 'b') { is_binstr = 1; buff = get_char(buff, &terminator, error); } if (terminator != '"' && terminator != '\'') { buff.offset--; raise_expected_string(buff.offset, error); } str_start = buff.data + buff.offset; buff = get_char(buff, &c, error); while (!*error) { if (c == terminator) break; buff = get_char(buff, &c, error); } if (!*error) { size_t count; value->type = is_binstr ? RDT_BINARY : RDT_STRING; value->val.string.len = (buff.data + buff.offset) - str_start - 1; count = is_binstr ? (value->val.string.len + 1) / 2 : (value->val.string.len + 1); value->val.string.buff = (char*)calloc(count, sizeof(char)); if (!value->val.string.buff) raise_enomem(error); else if (is_binstr) { unsigned i; const char *tok = str_start; unsigned j = 0; for (i = 0; i < value->val.string.len; i += 2) { uint8_t hi, lo; char hic = tok[i]; char loc = tok[i + 1]; if (hic <= '9') hi = hic - '0'; else hi = (hic - 'A') + 10; if (loc <= '9') lo = loc - '0'; else lo = (loc - 'A') + 10; value->val.string.buff[j++] = hi * 16 + lo; } value->val.string.len = j; } else memcpy(value->val.string.buff, str_start, value->val.string.len); } return buff; }