Diff for /qemu/json-parser.c between versions 1.1.1.5 and 1.1.1.6

version 1.1.1.5, 2018/04/24 18:33:39 version 1.1.1.6, 2018/04/24 18:55:57
Line 22 Line 22
 #include "qbool.h"  #include "qbool.h"
 #include "json-parser.h"  #include "json-parser.h"
 #include "json-lexer.h"  #include "json-lexer.h"
   #include "qerror.h"
   
 typedef struct JSONParserContext  typedef struct JSONParserContext
 {  {
       Error *err;
 } JSONParserContext;  } JSONParserContext;
   
 #define BUG_ON(cond) assert(!(cond))  #define BUG_ON(cond) assert(!(cond))
Line 95  static void GCC_FMT_ATTR(3, 4) parse_err Line 97  static void GCC_FMT_ATTR(3, 4) parse_err
                                            QObject *token, const char *msg, ...)                                             QObject *token, const char *msg, ...)
 {  {
     va_list ap;      va_list ap;
       char message[1024];
     va_start(ap, msg);      va_start(ap, msg);
     fprintf(stderr, "parse error: ");      vsnprintf(message, sizeof(message), msg, ap);
     vfprintf(stderr, msg, ap);  
     fprintf(stderr, "\n");  
     va_end(ap);      va_end(ap);
       if (ctxt->err) {
           error_free(ctxt->err);
           ctxt->err = NULL;
       }
       error_set(&ctxt->err, QERR_JSON_PARSE_ERROR, message);
 }  }
   
 /**  /**
Line 269  out: Line 275  out:
  */   */
 static int parse_pair(JSONParserContext *ctxt, QDict *dict, QList **tokens, va_list *ap)  static int parse_pair(JSONParserContext *ctxt, QDict *dict, QList **tokens, va_list *ap)
 {  {
     QObject *key, *token = NULL, *value, *peek;      QObject *key = NULL, *token = NULL, *value, *peek;
     QList *working = qlist_copy(*tokens);      QList *working = qlist_copy(*tokens);
   
     peek = qlist_peek(working);      peek = qlist_peek(working);
       if (peek == NULL) {
           parse_error(ctxt, NULL, "premature EOI");
           goto out;
       }
   
     key = parse_value(ctxt, &working, ap);      key = parse_value(ctxt, &working, ap);
     if (!key || qobject_type(key) != QTYPE_QSTRING) {      if (!key || qobject_type(key) != QTYPE_QSTRING) {
         parse_error(ctxt, peek, "key is not a string in object");          parse_error(ctxt, peek, "key is not a string in object");
Line 280  static int parse_pair(JSONParserContext  Line 291  static int parse_pair(JSONParserContext 
     }      }
   
     token = qlist_pop(working);      token = qlist_pop(working);
       if (token == NULL) {
           parse_error(ctxt, NULL, "premature EOI");
           goto out;
       }
   
     if (!token_is_operator(token, ':')) {      if (!token_is_operator(token, ':')) {
         parse_error(ctxt, token, "missing : in object pair");          parse_error(ctxt, token, "missing : in object pair");
         goto out;          goto out;
Line 315  static QObject *parse_object(JSONParserC Line 331  static QObject *parse_object(JSONParserC
     QList *working = qlist_copy(*tokens);      QList *working = qlist_copy(*tokens);
   
     token = qlist_pop(working);      token = qlist_pop(working);
       if (token == NULL) {
           goto out;
       }
   
     if (!token_is_operator(token, '{')) {      if (!token_is_operator(token, '{')) {
         goto out;          goto out;
     }      }
Line 324  static QObject *parse_object(JSONParserC Line 344  static QObject *parse_object(JSONParserC
     dict = qdict_new();      dict = qdict_new();
   
     peek = qlist_peek(working);      peek = qlist_peek(working);
       if (peek == NULL) {
           parse_error(ctxt, NULL, "premature EOI");
           goto out;
       }
   
     if (!token_is_operator(peek, '}')) {      if (!token_is_operator(peek, '}')) {
         if (parse_pair(ctxt, dict, &working, ap) == -1) {          if (parse_pair(ctxt, dict, &working, ap) == -1) {
             goto out;              goto out;
         }          }
   
         token = qlist_pop(working);          token = qlist_pop(working);
           if (token == NULL) {
               parse_error(ctxt, NULL, "premature EOI");
               goto out;
           }
   
         while (!token_is_operator(token, '}')) {          while (!token_is_operator(token, '}')) {
             if (!token_is_operator(token, ',')) {              if (!token_is_operator(token, ',')) {
                 parse_error(ctxt, token, "expected separator in dict");                  parse_error(ctxt, token, "expected separator in dict");
Line 343  static QObject *parse_object(JSONParserC Line 373  static QObject *parse_object(JSONParserC
             }              }
   
             token = qlist_pop(working);              token = qlist_pop(working);
               if (token == NULL) {
                   parse_error(ctxt, NULL, "premature EOI");
                   goto out;
               }
         }          }
         qobject_decref(token);          qobject_decref(token);
         token = NULL;          token = NULL;
Line 371  static QObject *parse_array(JSONParserCo Line 405  static QObject *parse_array(JSONParserCo
     QList *working = qlist_copy(*tokens);      QList *working = qlist_copy(*tokens);
   
     token = qlist_pop(working);      token = qlist_pop(working);
       if (token == NULL) {
           goto out;
       }
   
     if (!token_is_operator(token, '[')) {      if (!token_is_operator(token, '[')) {
         goto out;          goto out;
     }      }
Line 380  static QObject *parse_array(JSONParserCo Line 418  static QObject *parse_array(JSONParserCo
     list = qlist_new();      list = qlist_new();
   
     peek = qlist_peek(working);      peek = qlist_peek(working);
       if (peek == NULL) {
           parse_error(ctxt, NULL, "premature EOI");
           goto out;
       }
   
     if (!token_is_operator(peek, ']')) {      if (!token_is_operator(peek, ']')) {
         QObject *obj;          QObject *obj;
   
Line 392  static QObject *parse_array(JSONParserCo Line 435  static QObject *parse_array(JSONParserCo
         qlist_append_obj(list, obj);          qlist_append_obj(list, obj);
   
         token = qlist_pop(working);          token = qlist_pop(working);
           if (token == NULL) {
               parse_error(ctxt, NULL, "premature EOI");
               goto out;
           }
   
         while (!token_is_operator(token, ']')) {          while (!token_is_operator(token, ']')) {
             if (!token_is_operator(token, ',')) {              if (!token_is_operator(token, ',')) {
                 parse_error(ctxt, token, "expected separator in list");                  parse_error(ctxt, token, "expected separator in list");
Line 410  static QObject *parse_array(JSONParserCo Line 458  static QObject *parse_array(JSONParserCo
             qlist_append_obj(list, obj);              qlist_append_obj(list, obj);
   
             token = qlist_pop(working);              token = qlist_pop(working);
               if (token == NULL) {
                   parse_error(ctxt, NULL, "premature EOI");
                   goto out;
               }
         }          }
   
         qobject_decref(token);          qobject_decref(token);
Line 438  static QObject *parse_keyword(JSONParser Line 490  static QObject *parse_keyword(JSONParser
     QList *working = qlist_copy(*tokens);      QList *working = qlist_copy(*tokens);
   
     token = qlist_pop(working);      token = qlist_pop(working);
       if (token == NULL) {
           goto out;
       }
   
     if (token_get_type(token) != JSON_KEYWORD) {      if (token_get_type(token) != JSON_KEYWORD) {
         goto out;          goto out;
Line 475  static QObject *parse_escape(JSONParserC Line 530  static QObject *parse_escape(JSONParserC
     }      }
   
     token = qlist_pop(working);      token = qlist_pop(working);
       if (token == NULL) {
           goto out;
       }
   
     if (token_is_escape(token, "%p")) {      if (token_is_escape(token, "%p")) {
         obj = va_arg(*ap, QObject *);          obj = va_arg(*ap, QObject *);
Line 514  static QObject *parse_literal(JSONParser Line 572  static QObject *parse_literal(JSONParser
     QList *working = qlist_copy(*tokens);      QList *working = qlist_copy(*tokens);
   
     token = qlist_pop(working);      token = qlist_pop(working);
       if (token == NULL) {
           goto out;
       }
   
     switch (token_get_type(token)) {      switch (token_get_type(token)) {
     case JSON_STRING:      case JSON_STRING:
         obj = QOBJECT(qstring_from_escaped_str(ctxt, token));          obj = QOBJECT(qstring_from_escaped_str(ctxt, token));
Line 565  static QObject *parse_value(JSONParserCo Line 627  static QObject *parse_value(JSONParserCo
   
 QObject *json_parser_parse(QList *tokens, va_list *ap)  QObject *json_parser_parse(QList *tokens, va_list *ap)
 {  {
       return json_parser_parse_err(tokens, ap, NULL);
   }
   
   QObject *json_parser_parse_err(QList *tokens, va_list *ap, Error **errp)
   {
     JSONParserContext ctxt = {};      JSONParserContext ctxt = {};
     QList *working = qlist_copy(tokens);      QList *working;
     QObject *result;      QObject *result;
   
       if (!tokens) {
           return NULL;
       }
       working = qlist_copy(tokens);
     result = parse_value(&ctxt, &working, ap);      result = parse_value(&ctxt, &working, ap);
   
     QDECREF(working);      QDECREF(working);
   
       error_propagate(errp, ctxt.err);
   
     return result;      return result;
 }  }

Removed from v.1.1.1.5  
changed lines
  Added in v.1.1.1.6


unix.superglobalmegacorp.com