Diff for /libelwix/src/json.c between versions 1.1.2.4 and 1.3

version 1.1.2.4, 2017/11/28 00:46:53 version 1.3, 2017/12/03 21:50:23
Line 116  json_gettoken(json_t * __restrict json, jtok_t * __res Line 116  json_gettoken(json_t * __restrict json, jtok_t * __res
                 elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);                  elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                 return NULL;                  return NULL;
         } else          } else
                tok = &jtoks[json->h_next++];                tok = &jtoks[json->h_next];
         tok->tok_idx = json->h_next++;
         tok->tok_start = tok->tok_end = tok->tok_parent = -1;          tok->tok_start = tok->tok_end = tok->tok_parent = -1;
         tok->tok_size = 0;          tok->tok_size = 0;
   
Line 276  json_parse(json_t * __restrict json, const char *jstr, Line 277  json_parse(json_t * __restrict json, const char *jstr,
                 switch ((ch = jstr[json->h_pos])) {                  switch ((ch = jstr[json->h_pos])) {
                         case '{':                          case '{':
                         case '[':                          case '[':
                                cx++;   /* start new token */                                cx++;   /* start new object/array token */
                                 if (!jtoks)                                  if (!jtoks)
                                         break;                                          break;
   
Line 324  json_parse(json_t * __restrict json, const char *jstr, Line 325  json_parse(json_t * __restrict json, const char *jstr,
                                 }                                  }
                                 break;                                  break;
                         case '\"':                          case '\"':
                                if (json_parse_string(json, jstr, jlen, jtoks, toksnum) == -1) {                                if (json_parse_string(json, jstr, jlen, jtoks, toksnum) == -1)
                                        elwix_SetErr(J_ERR_INVAL, "%s", jerrstr[J_ERR_INVAL]); 
                                         return (u_int) -1;                                          return (u_int) -1;
                                }                                cx++;   /* start new string token */
                                cx++; 
                                 if (jtoks && json->h_parent != -1)                                  if (jtoks && json->h_parent != -1)
                                         jtoks[json->h_parent].tok_size++;                                          jtoks[json->h_parent].tok_size++;
                                 break;                                  break;
Line 374  json_parse(json_t * __restrict json, const char *jstr, Line 373  json_parse(json_t * __restrict json, const char *jstr,
   
                                         if (json_parse_value(json, jstr, jlen, jtoks, toksnum) == -1)                                          if (json_parse_value(json, jstr, jlen, jtoks, toksnum) == -1)
                                                 return (u_int) -1;                                                  return (u_int) -1;
                                        cx++;                                        cx++;   /* start new value token */
                                         if (jtoks && json->h_parent != -1)                                          if (jtoks && json->h_parent != -1)
                                                 jtoks[json->h_parent].tok_size++;                                                  jtoks[json->h_parent].tok_size++;
                                         break;                                          break;
Line 387  json_parse(json_t * __restrict json, const char *jstr, Line 386  json_parse(json_t * __restrict json, const char *jstr,
   
                                 if (json_parse_value(json, jstr, jlen, jtoks, toksnum) == -1)                                  if (json_parse_value(json, jstr, jlen, jtoks, toksnum) == -1)
                                         return (u_int) -1;                                          return (u_int) -1;
                                cx++;                                cx++;   /* start new value token */
                                 if (jtoks && json->h_parent != -1)                                  if (jtoks && json->h_parent != -1)
                                         jtoks[json->h_parent].tok_size++;                                          jtoks[json->h_parent].tok_size++;
                                 break;                                  break;
Line 402  json_parse(json_t * __restrict json, const char *jstr, Line 401  json_parse(json_t * __restrict json, const char *jstr,
                                 return (u_int) -1;                                  return (u_int) -1;
                         }                          }
                 }                  }
        }        } else
                 cx++;   /* increment needed tokens number for termination empty token */
   
         return cx;          return cx;
 }  }
Line 426  json_token2val(const char *jstr, jtok_t * __restrict t Line 426  json_token2val(const char *jstr, jtok_t * __restrict t
         if (!v)          if (!v)
                 return NULL;                  return NULL;
   
        AIT_SET_STRSIZ(v, tok->tok_end - tok->tok_start);        AIT_SET_STRSIZ(v, json_toklen(tok));
        strncpy(AIT_GET_STR(v), jstr + tok->tok_start, AIT_LEN(v) - 1);        strncpy(AIT_GET_STR(v), json_tokstr(jstr, tok), AIT_LEN(v) - 1);
   
         return v;          return v;
 }  }
Line 448  json_token2str(const char *jstr, jtok_t * __restrict t Line 448  json_token2str(const char *jstr, jtok_t * __restrict t
         if (!jstr || !tok)          if (!jstr || !tok)
                 return NULL;                  return NULL;
   
        len = tok->tok_end - tok->tok_start;        len = json_toklen(tok);
         str = e_malloc(len + 1);          str = e_malloc(len + 1);
         if (!str)          if (!str)
                 return NULL;                  return NULL;
         else {          else {
                strncpy(str, jstr + tok->tok_start, len);                strncpy(str, json_tokstr(jstr, tok), len);
                 str[len] = 0;                  str[len] = 0;
         }          }
   
Line 516  json_findbykey(const char *jstr, const char *key, jtok Line 516  json_findbykey(const char *jstr, const char *key, jtok
 }  }
   
 /*  /*
 * json_token2array() - Convert token to array * json_token2array() - Convert token to string array
  *   *
  * @jstr = JSON string   * @jstr = JSON string
  * @tok = Token for convert   * @tok = Token for convert
 * return: =NULL error or !=NULL allocated array with variables,  * return: =NULL error or !=NULL allocated array with string variables, 
  *              after use should be ait_freeVars()   *              after use should be ait_freeVars()
  */   */
 array_t *  array_t *
Line 536  json_token2array(const char *jstr, jtok_t * __restrict Line 536  json_token2array(const char *jstr, jtok_t * __restrict
                 return NULL;                  return NULL;
   
         siz = tok->tok_size;          siz = tok->tok_size;
        if (!siz && tok->tok_type != J_ARRAY && tok->tok_type != J_OBJECT)        if (!siz && json_toktype(tok) != J_ARRAY && json_toktype(tok) != J_OBJECT)
                 siz++;                  siz++;
   
         arr = ait_allocVars(siz);          arr = ait_allocVars(siz);
Line 545  json_token2array(const char *jstr, jtok_t * __restrict Line 545  json_token2array(const char *jstr, jtok_t * __restrict
   
         if (tok->tok_type == J_STRING || tok->tok_type == J_VALUE) {          if (tok->tok_type == J_STRING || tok->tok_type == J_VALUE) {
                 v = ait_getVars(&arr, 0);                  v = ait_getVars(&arr, 0);
                AIT_SET_STRSIZ(v, tok->tok_end - tok->tok_start);                AIT_SET_STRSIZ(v, json_toklen(tok) + 1);
                strncpy(AIT_GET_STR(v), jstr + tok->tok_start, AIT_LEN(v) - 1);                json_tokstrcpy(AIT_GET_STR(v), jstr, tok);
         } else if (tok->tok_type == J_ARRAY) {          } else if (tok->tok_type == J_ARRAY) {
                 for (i = 0; i < tok->tok_size; i++) {                  for (i = 0; i < tok->tok_size; i++) {
                         t = &tok[i + 1];                          t = &tok[i + 1];
                         v = ait_getVars(&arr, i);                          v = ait_getVars(&arr, i);
                        AIT_SET_STRSIZ(v, t->tok_end - t->tok_start);                        AIT_SET_STRSIZ(v, json_toklen(t) + 1);
                        strncpy(AIT_GET_STR(v), jstr + t->tok_start, AIT_LEN(v) - 1);                        json_tokstrcpy(AIT_GET_STR(v), jstr, t);
                 }                  }
           } else if (tok->tok_type == J_OBJECT) {
                   for (i = 0; tok->tok_idx <= tok[i + 1].tok_parent; i++) {
                           t = &tok[i + 1];
                           v = ait_getVars(&arr, i);
                           AIT_SET_STRSIZ(v, json_toklen(t) + 1);
                           json_tokstrcpy(AIT_GET_STR(v), jstr, t);
                   }
         } else {          } else {
                /* todo for object */                elwix_SetErr(J_ERR_PARAM, "%s", jerrstr[J_ERR_PARAM]);
                 ait_freeVars(&arr);
                 return NULL;
         }          }
   
         return arr;          return arr;
   }
   
   
   
   /*
    * json_add_begin_object() - Adds begin of object {
    *
    * @jstr = JSON string
    * @jlen = JSON string length
    * @wspace = whitespace include
    * return: -1 error or !=-1 actual JSON string length
    */
   int
   json_add_begin_object(char * __restrict jstr, int jlen, int wspace)
   {
           int len;
           size_t eos;
   
           if (!jstr)
                   return -1;
           else
                   eos = strlen(jstr);
   
   
           if (wspace)
                   len = strlcat(jstr, "{ ", jlen);
           else
                   len = strlcat(jstr, "{", jlen);
   
           if (len >= jlen) {
                   elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   jstr[eos] = 0;
                   return -1;
           }
   
           return len;
   }
   
   /*
    * json_add_end_object() - Adds end of object }
    *
    * @jstr = JSON string
    * @jlen = JSON string length
    * @wspace = whitespace include
    * return: -1 error or !=-1 actual JSON string length
    */
   int
   json_add_end_object(char * __restrict jstr, int jlen, int wspace)
   {
           int len;
           size_t eos;
   
           if (!jstr)
                   return -1;
           else
                   eos = strlen(jstr);
   
           if (wspace)
                   len = strlcat(jstr, " }", jlen);
           else
                   len = strlcat(jstr, "}", jlen);
   
           if (len >= jlen) {
                   elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   jstr[eos] = 0;
                   return -1;
           }
   
           return len;
   }
   
   /*
    * json_add_begin_array() - Adds begin of array [
    *
    * @jstr = JSON string
    * @jlen = JSON string length
    * @wspace = whitespace include
    * return: -1 error or !=-1 actual JSON string length
    */
   int
   json_add_begin_array(char * __restrict jstr, int jlen, int wspace)
   {
           int len;
           size_t eos;
   
           if (!jstr)
                   return -1;
           else
                   eos = strlen(jstr);
   
           if (wspace)
                   len = strlcat(jstr, "[ ", jlen);
           else
                   len = strlcat(jstr, "[", jlen);
   
           if (len >= jlen) {
                   elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   jstr[eos] = 0;
                   return -1;
           }
   
           return len;
   }
   
   /*
    * json_add_end_array() - Adds end of array ]
    *
    * @jstr = JSON string
    * @jlen = JSON string length
    * @wspace = whitespace include
    * return: -1 error or !=-1 actual JSON string length
    */
   int
   json_add_end_array(char * __restrict jstr, int jlen, int wspace)
   {
           int len;
           size_t eos;
   
           if (!jstr)
                   return -1;
           else
                   eos = strlen(jstr);
   
           if (wspace)
                   len = strlcat(jstr, " ]", jlen);
           else
                   len = strlcat(jstr, "]", jlen);
   
           if (len >= jlen) {
                   elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   jstr[eos] = 0;
                   return -1;
           }
   
           return len;
   }
   
   /*
    * json_add_char() - Adds character
    *
    * @jstr = JSON string
    * @jlen = JSON string length
    * @ch = Character
    * return: -1 error or !=-1 actual JSON string length
    */
   int
   json_add_char(char * __restrict jstr, int jlen, u_char ch)
   {
           int len;
   
           if (!jstr)
                   return -1;
   
           len = strlen(jstr) + 1;
           if (len >= jlen) {
                   elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   return -1;
           } else {
                   jstr[len++] = (char) ch;
                   jstr[len] = 0;
           }
   
           return len;
   }
   
   /*
    * json_add_colon() - Adds key/value pair delimiter colon :
    *
    * @jstr = JSON string
    * @jlen = JSON string length
    * @wspace = whitespace include
    * return: -1 error or !=-1 actual JSON string length
    */
   int
   json_add_colon(char * __restrict jstr, int jlen, int wspace)
   {
           int len;
           size_t eos;
   
           if (!jstr)
                   return -1;
           else
                   eos = strlen(jstr);
   
           if (wspace)
                   len = strlcat(jstr, ": ", jlen);
           else
                   len = strlcat(jstr, ":", jlen);
   
           if (len >= jlen) {
                   elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   jstr[eos] = 0;
                   return -1;
           }
   
           return len;
   }
   
   /*
    * json_add_comma() - Adds value delimiter comma ,
    *
    * @jstr = JSON string
    * @jlen = JSON string length
    * @wspace = whitespace include
    * return: -1 error or !=-1 actual JSON string length
    */
   int
   json_add_comma(char * __restrict jstr, int jlen, int wspace)
   {
           int len;
           size_t eos;
   
           if (!jstr)
                   return -1;
           else
                   eos = strlen(jstr);
   
           if (wspace)
                   len = strlcat(jstr, ", ", jlen);
           else
                   len = strlcat(jstr, ",", jlen);
   
           if (len >= jlen) {
                   elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   jstr[eos] = 0;
                   return -1;
           }
   
           return len;
   }
   
   /*
    * json_add_string() - Adds string
    *
    * @jstr = JSON string
    * @jlen = JSON string length
    * @unquot = Unquoted string
    * @str = String, it can't be NULL
    * return: -1 error or !=-1 actual JSON string length
    */
   int
   json_add_string(char * __restrict jstr, int jlen, int unquot, const char *str)
   {
           int len;
           size_t eos;
   
           if (!jstr || !str)
                   return -1;
           else
                   eos = strlen(jstr);
   
           if (!unquot) {
                   len = strlcat(jstr, "\"", jlen);
                   if (len >= jlen) {
                           elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                           jstr[eos] = 0;
                           return -1;
                   }
           }
           len = strlcat(jstr, str, jlen);
           if (len >= jlen) {
                   elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   jstr[eos] = 0;
                   return -1;
           }
           if (!unquot) {
                   len = strlcat(jstr, "\"", jlen);
                   if (len >= jlen) {
                           elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                           jstr[eos] = 0;
                           return -1;
                   }
           }
   
           return len;
   }
   
   /*
    * json_add_value() - Adds value
    *
    * @jstr = JSON string
    * @jlen = JSON string length
    * @unquot = Unquoted number
    * @num = Number
    * return: -1 error or !=-1 actual JSON string length
    */
   int
   json_add_value(char * __restrict jstr, int jlen, int unquot, long num)
   {
           int len;
           char wrk[STRSIZ] = { [0 ... STRSIZ - 1] = 0 };
           size_t eos;
   
           if (!jstr)
                   return -1;
           else
                   eos = strlen(jstr);
   
           if (!unquot) {
                   len = strlcat(jstr, "\"", jlen);
                   if (len >= jlen) {
                           elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                           jstr[eos] = 0;
                           return -1;
                   }
           }
           snprintf(wrk, sizeof wrk, "%ld", num);
           len = strlcat(jstr, wrk, jlen);
           if (len >= jlen) {
                   elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   jstr[eos] = 0;
                   return -1;
           }
           if (!unquot) {
                   len = strlcat(jstr, "\"", jlen);
                   if (len >= jlen) {
                           elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                           jstr[eos] = 0;
                           return -1;
                   }
           }
   
           return len;
   }
   
   /*
    * json_add_pair() - Adds key/value pair
    *
    * @jstr = JSON string
    * @jlen = JSON string length
    * @wspace = whitespace include
    * @key = Key string
    * @val = Value string
    * return: -1 error or !=-1 actual JSON string length
    */
   int
   json_add_pair(char * __restrict jstr, int jlen, int wspace, const char *key, const char *val)
   {
           int len = -1;
           size_t eos;
   
           if (!jstr || !key || !val)
                   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;
           }
           if ((len = json_add_string(jstr, jlen, 0, val)) == -1) {
                   jstr[eos] = 0;
                   return -1;
           }
   
           return len;
   }
   
   /*
    * json_add_array() - Adds array
    *
    * @jstr = JSON string
    * @jlen = JSON string length
    * @wspace = whitespace include
    * @arr = Array with variables
    * return: -1 error or !=-1 actual JSON string length
    */
   int
   json_add_array(char * __restrict jstr, int jlen, int wspace, array_t * __restrict arr)
   {
           int len = -1;
           register int i;
           ait_val_t *v;
           size_t eos;
   
           if (!jstr || !arr)
                   return -1;
           else
                   eos = strlen(jstr);
   
           if (json_add_begin_array(jstr, jlen, wspace) == -1) {
                   jstr[eos] = 0;
                   return -1;
           }
           for (i = 0; i < array_Size(arr); i++) {
                   v = array(arr, i, ait_val_t*);
                   if (v) {
                           if (AIT_TYPE(v) == string) {
                                   if (json_add_string(jstr, jlen, 0, AIT_GET_STR(v)) == -1) {
                                           jstr[eos] = 0;
                                           return -1;
                                   }
                           } else {
                                   if (json_add_value(jstr, jlen, 0, AIT_GET_LIKE(v, long)) == -1) {
                                           jstr[eos] = 0;
                                           return -1;
                                   }
                           }
                           if (i < array_Size(arr) - 1 && json_add_comma(jstr, jlen, wspace) == -1) {
                                   jstr[eos] = 0;
                                   return -1;
                           }
                   }
           }
           if ((len = json_add_end_array(jstr, jlen, wspace)) == -1) {
                   jstr[eos] = 0;
                   return -1;
           }
   
           return len;
   }
   
   /*
    * json_dump_yaml() - Dump parsed JSON string to YAML format
    *
    * @f = Output handler
    * @jstr = JSON string
    * @toks = JSON tokens
    * @toksnum = Number of tokens
    * @indent = Start indent spaces
    * return: 0 done and 1 added one more item
    */
   int
   json_dump_yaml(FILE *f, const char *jstr, jtok_t *toks, int toksnum, int indent)
   {
           register int i, j, k;
   
           if (!toksnum)
                   return 0;
   
           if (toks->tok_type == J_VALUE) {
                   fprintf(f, "%.*s", (int) json_toklen(toks), json_tokstr(jstr, toks));
                   return 1;
           } else if (toks->tok_type == J_STRING) {
                   fprintf(f, "%.*s", (int) json_toklen(toks), json_tokstr(jstr, toks));
                   return 1;
           } else if (toks->tok_type == J_OBJECT) {
                   fprintf(f, "\n");
                   for (j = i = 0; i < json_toksize(toks); i++) {
                           for (k = 0; k < indent; k++)
                                   fprintf(f, "  ");
                           j += json_dump_yaml(f, jstr, toks + j + 1, toksnum - j, indent + 1);
                           fprintf(f, ": ");
                           j += json_dump_yaml(f, jstr, toks + j + 1, toksnum - j, indent + 1);
                           fprintf(f, "\n");
                   }
                   return j + 1;
           } else if (toks->tok_type == J_ARRAY) {
                   fprintf(f, "\n");
                   for (j = i = 0; i < json_toksize(toks); i++) {
                           for (k = 0; k < indent - 1; k++)
                                   fprintf(f, "  ");
                           fprintf(f, "   - ");
                           j += json_dump_yaml(f, jstr, toks + j + 1, toksnum - j, indent + 1);
                           fprintf(f, "\n");
                   }
                   return j + 1;
           }
   
           return 0;
 }  }

Removed from v.1.1.2.4  
changed lines
  Added in v.1.3


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>