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

version 1.1.2.9, 2017/11/29 00:49:47 version 1.3, 2017/12/03 21:50:23
Line 563  json_token2array(const char *jstr, jtok_t * __restrict Line 563  json_token2array(const char *jstr, jtok_t * __restrict
                 }                  }
         } else {          } else {
                 elwix_SetErr(J_ERR_PARAM, "%s", jerrstr[J_ERR_PARAM]);                  elwix_SetErr(J_ERR_PARAM, "%s", jerrstr[J_ERR_PARAM]);
                   ait_freeVars(&arr);
                 return NULL;                  return NULL;
         }          }
   
Line 570  json_token2array(const char *jstr, jtok_t * __restrict Line 571  json_token2array(const char *jstr, jtok_t * __restrict
 }  }
   
   
   
 /*  /*
  * json_add_begin_object() - Adds begin of object {   * json_add_begin_object() - Adds begin of object {
  *   *
Line 582  int Line 584  int
 json_add_begin_object(char * __restrict jstr, int jlen, int wspace)  json_add_begin_object(char * __restrict jstr, int jlen, int wspace)
 {  {
         int len;          int len;
           size_t eos;
   
         if (!jstr)          if (!jstr)
                 return -1;                  return -1;
           else
                   eos = strlen(jstr);
   
   
         if (wspace)          if (wspace)
                 len = strlcat(jstr, "{ ", jlen);                  len = strlcat(jstr, "{ ", jlen);
         else          else
Line 593  json_add_begin_object(char * __restrict jstr, int jlen Line 599  json_add_begin_object(char * __restrict jstr, int jlen
   
         if (len >= jlen) {          if (len >= jlen) {
                 elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);                  elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   jstr[eos] = 0;
                 return -1;                  return -1;
         }          }
   
Line 611  int Line 618  int
 json_add_end_object(char * __restrict jstr, int jlen, int wspace)  json_add_end_object(char * __restrict jstr, int jlen, int wspace)
 {  {
         int len;          int len;
           size_t eos;
   
         if (!jstr)          if (!jstr)
                 return -1;                  return -1;
           else
                   eos = strlen(jstr);
   
         if (wspace)          if (wspace)
                 len = strlcat(jstr, " }", jlen);                  len = strlcat(jstr, " }", jlen);
Line 622  json_add_end_object(char * __restrict jstr, int jlen,  Line 632  json_add_end_object(char * __restrict jstr, int jlen, 
   
         if (len >= jlen) {          if (len >= jlen) {
                 elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);                  elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   jstr[eos] = 0;
                 return -1;                  return -1;
         }          }
   
Line 640  int Line 651  int
 json_add_begin_array(char * __restrict jstr, int jlen, int wspace)  json_add_begin_array(char * __restrict jstr, int jlen, int wspace)
 {  {
         int len;          int len;
           size_t eos;
   
         if (!jstr)          if (!jstr)
                 return -1;                  return -1;
           else
                   eos = strlen(jstr);
   
         if (wspace)          if (wspace)
                 len = strlcat(jstr, "[ ", jlen);                  len = strlcat(jstr, "[ ", jlen);
Line 651  json_add_begin_array(char * __restrict jstr, int jlen, Line 665  json_add_begin_array(char * __restrict jstr, int jlen,
   
         if (len >= jlen) {          if (len >= jlen) {
                 elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);                  elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   jstr[eos] = 0;
                 return -1;                  return -1;
         }          }
   
Line 669  int Line 684  int
 json_add_end_array(char * __restrict jstr, int jlen, int wspace)  json_add_end_array(char * __restrict jstr, int jlen, int wspace)
 {  {
         int len;          int len;
           size_t eos;
   
         if (!jstr)          if (!jstr)
                 return -1;                  return -1;
           else
                   eos = strlen(jstr);
   
         if (wspace)          if (wspace)
                 len = strlcat(jstr, " ]", jlen);                  len = strlcat(jstr, " ]", jlen);
Line 680  json_add_end_array(char * __restrict jstr, int jlen, i Line 698  json_add_end_array(char * __restrict jstr, int jlen, i
   
         if (len >= jlen) {          if (len >= jlen) {
                 elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);                  elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   jstr[eos] = 0;
                 return -1;                  return -1;
         }          }
   
Line 702  json_add_char(char * __restrict jstr, int jlen, u_char Line 721  json_add_char(char * __restrict jstr, int jlen, u_char
         if (!jstr)          if (!jstr)
                 return -1;                  return -1;
   
        len = strlen(jstr);        len = strlen(jstr) + 1;
         if (len >= jlen) {          if (len >= jlen) {
                 elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);                  elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                 return -1;                  return -1;
Line 726  int Line 745  int
 json_add_colon(char * __restrict jstr, int jlen, int wspace)  json_add_colon(char * __restrict jstr, int jlen, int wspace)
 {  {
         int len;          int len;
           size_t eos;
   
         if (!jstr)          if (!jstr)
                 return -1;                  return -1;
           else
                   eos = strlen(jstr);
   
         if (wspace)          if (wspace)
                 len = strlcat(jstr, ": ", jlen);                  len = strlcat(jstr, ": ", jlen);
Line 737  json_add_colon(char * __restrict jstr, int jlen, int w Line 759  json_add_colon(char * __restrict jstr, int jlen, int w
   
         if (len >= jlen) {          if (len >= jlen) {
                 elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);                  elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   jstr[eos] = 0;
                 return -1;                  return -1;
         }          }
   
Line 755  int Line 778  int
 json_add_comma(char * __restrict jstr, int jlen, int wspace)  json_add_comma(char * __restrict jstr, int jlen, int wspace)
 {  {
         int len;          int len;
           size_t eos;
   
         if (!jstr)          if (!jstr)
                 return -1;                  return -1;
           else
                   eos = strlen(jstr);
   
         if (wspace)          if (wspace)
                 len = strlcat(jstr, ", ", jlen);                  len = strlcat(jstr, ", ", jlen);
Line 766  json_add_comma(char * __restrict jstr, int jlen, int w Line 792  json_add_comma(char * __restrict jstr, int jlen, int w
   
         if (len >= jlen) {          if (len >= jlen) {
                 elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);                  elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   jstr[eos] = 0;
                 return -1;                  return -1;
         }          }
   
Line 785  int Line 812  int
 json_add_string(char * __restrict jstr, int jlen, int unquot, const char *str)  json_add_string(char * __restrict jstr, int jlen, int unquot, const char *str)
 {  {
         int len;          int len;
           size_t eos;
   
         if (!jstr || !str)          if (!jstr || !str)
                 return -1;                  return -1;
           else
                   eos = strlen(jstr);
   
        if (!unquot)        if (!unquot) {
                 len = strlcat(jstr, "\"", jlen);                  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);          len = strlcat(jstr, str, jlen);
         if (!unquot)  
                 len = strlcat(jstr, "\"", jlen);  
   
         if (len >= jlen) {          if (len >= jlen) {
                 elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);                  elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   jstr[eos] = 0;
                 return -1;                  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;          return len;
 }  }
Line 817  json_add_value(char * __restrict jstr, int jlen, int u Line 859  json_add_value(char * __restrict jstr, int jlen, int u
 {  {
         int len;          int len;
         char wrk[STRSIZ] = { [0 ... STRSIZ - 1] = 0 };          char wrk[STRSIZ] = { [0 ... STRSIZ - 1] = 0 };
           size_t eos;
   
         if (!jstr)          if (!jstr)
                 return -1;                  return -1;
           else
                   eos = strlen(jstr);
   
        if (!unquot)        if (!unquot) {
                 len = strlcat(jstr, "\"", jlen);                  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);          snprintf(wrk, sizeof wrk, "%ld", num);
         len = strlcat(jstr, wrk, jlen);          len = strlcat(jstr, wrk, jlen);
         if (!unquot)  
                 len = strlcat(jstr, "\"", jlen);  
   
         if (len >= jlen) {          if (len >= jlen) {
                 elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);                  elwix_SetErr(J_ERR_NOMEM, "%s", jerrstr[J_ERR_NOMEM]);
                   jstr[eos] = 0;
                 return -1;                  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;          return len;
 }  }
Line 850  int Line 907  int
 json_add_pair(char * __restrict jstr, int jlen, int wspace, const char *key, const char *val)  json_add_pair(char * __restrict jstr, int jlen, int wspace, const char *key, const char *val)
 {  {
         int len = -1;          int len = -1;
           size_t eos;
   
         if (!jstr || !key || !val)          if (!jstr || !key || !val)
                 return -1;                  return -1;
           else
                   eos = strlen(jstr);
   
        if (json_add_string(jstr, jlen, 0, key) == -1)        if (json_add_string(jstr, jlen, 0, key) == -1) {
                 jstr[eos] = 0;
                 return -1;                  return -1;
        if (json_add_colon(jstr, jlen, wspace) == -1)        }
         if (json_add_colon(jstr, jlen, wspace) == -1) {
                 jstr[eos] = 0;
                 return -1;                  return -1;
        if ((len = json_add_string(jstr, jlen, 0, key)) == -1)        }
         if ((len = json_add_string(jstr, jlen, 0, val)) == -1) {
                 jstr[eos] = 0;
                 return -1;                  return -1;
           }
   
         return len;          return len;
 }  }
Line 879  json_add_array(char * __restrict jstr, int jlen, int w Line 945  json_add_array(char * __restrict jstr, int jlen, int w
         int len = -1;          int len = -1;
         register int i;          register int i;
         ait_val_t *v;          ait_val_t *v;
           size_t eos;
   
         if (!jstr || !arr)          if (!jstr || !arr)
                 return -1;                  return -1;
           else
                   eos = strlen(jstr);
   
        if (json_add_begin_array(jstr, jlen, wspace) == -1)        if (json_add_begin_array(jstr, jlen, wspace) == -1) {
                 jstr[eos] = 0;
                 return -1;                  return -1;
           }
         for (i = 0; i < array_Size(arr); i++) {          for (i = 0; i < array_Size(arr); i++) {
                 v = array(arr, i, ait_val_t*);                  v = array(arr, i, ait_val_t*);
                 if (v) {                  if (v) {
                         if (AIT_TYPE(v) == string) {                          if (AIT_TYPE(v) == string) {
                                if (json_add_string(jstr, jlen, 0, AIT_GET_STR(v)) == -1)                                if (json_add_string(jstr, jlen, 0, AIT_GET_STR(v)) == -1) {
                                         jstr[eos] = 0;
                                         return -1;                                          return -1;
                                   }
                         } else {                          } else {
                                if (json_add_value(jstr, jlen, 0, AIT_GET_LIKE(v, long)) == -1)                                if (json_add_value(jstr, jlen, 0, AIT_GET_LIKE(v, long)) == -1) {
                                         jstr[eos] = 0;
                                         return -1;                                          return -1;
                                   }
                         }                          }
                        if (i < array_Size(arr) - 1 && json_add_comma(jstr, jlen, wspace) == -1)                        if (i < array_Size(arr) - 1 && json_add_comma(jstr, jlen, wspace) == -1) {
                                 jstr[eos] = 0;
                                 return -1;                                  return -1;
                           }
                 }                  }
         }          }
        if ((len = json_add_end_array(jstr, jlen, wspace)) == -1)        if ((len = json_add_end_array(jstr, jlen, wspace)) == -1) {
                 jstr[eos] = 0;
                 return -1;                  return -1;
           }
   
         return len;          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.9  
changed lines
  Added in v.1.3


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