static void add_str(ParseInfo pi, const char *str, int len) { ojcVal parent = stack_peek(&pi->stack); if (0 == parent) { // simple add *pi->stack.head = get_str_val(pi, str, len); } else { switch (parent->expect) { case NEXT_ARRAY_NEW: case NEXT_ARRAY_ELEMENT: ojc_array_append(&pi->err, parent, get_str_val(pi, str, len)); parent->expect = NEXT_ARRAY_COMMA; break; case NEXT_OBJECT_NEW: case NEXT_OBJECT_KEY: if ((int)sizeof(pi->karray) <= len) { pi->key = strndup(str, len); pi->kalloc = true; } else { memcpy(pi->karray, str, len); pi->karray[len] = '\0'; pi->key = pi->karray; pi->kalloc = false; } pi->klen = len; parent->expect = NEXT_OBJECT_COLON; break; case NEXT_OBJECT_VALUE: pi_object_nappend(pi, parent, get_str_val(pi, str, len)); if (pi->kalloc) { free(pi->key); } pi->key = 0; pi->klen = 0; pi->kalloc = false; parent->expect = NEXT_OBJECT_COMMA; break; case NEXT_OBJECT_COMMA: case NEXT_NONE: case NEXT_ARRAY_COMMA: case NEXT_OBJECT_COLON: default: ojc_set_error_at(pi, OJC_PARSE_ERR, __FILE__, __LINE__, "expected %s, not a string", _ojc_stack_next_str((ValNext)parent->expect)); break; } } ojc_reader_release(&pi->rd); }
char *getpssval(Cell *vp) /* get string val of a Cell for print */ { return get_str_val(vp, OFMT); }
char *getsval(Cell *vp) /* get string val of a Cell */ { return get_str_val(vp, CONVFMT); }