@ -11624,7 +11624,7 @@ _again:
# line 1270 "upb / json / parser.rl"
if ( p ! = pe ) {
upb_status_seterrf ( & parser - > status , " Parse error at %s \n " , p ) ;
upb_status_seterrf ( & parser - > status , " Parse error at ' %.* s' \n " , p , pe - p ) ;
upb_env_reporterror ( parser - > env , & parser - > status ) ;
} else {
capture_suspend ( parser , & p ) ;
@ -11725,6 +11725,7 @@ static void add_jsonname_table(upb_json_parsermethod *m, const upb_msgdef* md) {
upb_msg_field_next ( & i ) ) {
const upb_fielddef * f = upb_msg_iter_field ( & i ) ;
/* Add an entry for the JSON name. */
size_t field_len = upb_fielddef_getjsonname ( f , buf , len ) ;
if ( field_len > len ) {
size_t len2 ;
@ -11735,10 +11736,10 @@ static void add_jsonname_table(upb_json_parsermethod *m, const upb_msgdef* md) {
}
upb_strtable_insert ( t , buf , upb_value_constptr ( f ) ) ;
if ( getenv ( " UPB_JSON_ACCEPT_LEGACY_FIELD_NAMES " ) ) {
/* Temporary code to help people migrate if they were depending on the
* old , non - proto3 - json - compliant field names . In this case we
* recognize both old names and new names . */
if ( strcmp ( buf , upb_fielddef_name ( f ) ) ! = 0 ) {
/* Since the JSON name is different from the regular field name, add an
* entry for the raw name ( compliant proto3 JSON parsers must accept
* both ) . */
upb_strtable_insert ( t , upb_fielddef_name ( f ) , upb_value_constptr ( f ) ) ;
}
@ -11853,12 +11854,11 @@ void freestrpc(void *ptr) {
}
/* Convert fielddef name to JSON name and return as a string piece. */
strpc * newstrpc ( upb_handlers * h , const upb_fielddef * f ) {
strpc * newstrpc ( upb_handlers * h , const upb_fielddef * f ,
bool preserve_fieldnames ) {
/* TODO(haberman): handle malloc failure. */
strpc * ret = malloc ( sizeof ( * ret ) ) ;
if ( getenv ( " UPB_JSON_WRITE_LEGACY_FIELD_NAMES " ) ) {
/* Temporary code to help people migrate if they were depending on the
* old , non - proto3 - json - compliant field names . */
if ( preserve_fieldnames ) {
ret - > ptr = upb_strdup ( upb_fielddef_name ( f ) ) ;
ret - > len = strlen ( ret - > ptr ) ;
} else {
@ -12374,10 +12374,11 @@ static size_t mapkey_bytes(void *closure, const void *handler_data,
static void set_enum_hd ( upb_handlers * h ,
const upb_fielddef * f ,
bool preserve_fieldnames ,
upb_handlerattr * attr ) {
EnumHandlerData * hd = malloc ( sizeof ( EnumHandlerData ) ) ;
hd - > enumdef = ( const upb_enumdef * ) upb_fielddef_subdef ( f ) ;
hd - > keyname = newstrpc ( h , f ) ;
hd - > keyname = newstrpc ( h , f , preserve_fieldnames ) ;
upb_handlers_addcleanup ( h , hd , free ) ;
upb_handlerattr_sethandlerdata ( attr , hd ) ;
}
@ -12394,7 +12395,8 @@ static void set_enum_hd(upb_handlers *h,
* our sources that emit mapentry messages do so canonically ( with one key
* field , and then one value field ) , so this is not a pressing concern at the
* moment . */
void printer_sethandlers_mapentry ( const void * closure , upb_handlers * h ) {
void printer_sethandlers_mapentry ( const void * closure , bool preserve_fieldnames ,
upb_handlers * h ) {
const upb_msgdef * md = upb_handlers_msgdef ( h ) ;
/* A mapentry message is printed simply as '"key": value'. Rather than
@ -12468,7 +12470,7 @@ void printer_sethandlers_mapentry(const void *closure, upb_handlers *h) {
break ;
case UPB_TYPE_ENUM : {
upb_handlerattr enum_attr = UPB_HANDLERATTR_INITIALIZER ;
set_enum_hd ( h , value_field , & enum_attr ) ;
set_enum_hd ( h , value_field , preserve_fieldnames , & enum_attr ) ;
upb_handlers_setint32 ( h , value_field , mapvalue_enum , & enum_attr ) ;
upb_handlerattr_uninit ( & enum_attr ) ;
break ;
@ -12487,13 +12489,13 @@ void printer_sethandlers(const void *closure, upb_handlers *h) {
bool is_mapentry = upb_msgdef_mapentry ( md ) ;
upb_handlerattr empty_attr = UPB_HANDLERATTR_INITIALIZER ;
upb_msg_field_iter i ;
UPB_UNUSED ( closure ) ;
const bool * preserve_fieldnames_ptr = closure ;
const bool preserve_fieldnames = * preserve_fieldnames_ptr ;
if ( is_mapentry ) {
/* mapentry messages are sufficiently different that we handle them
* separately . */
printer_sethandlers_mapentry ( closure , h ) ;
printer_sethandlers_mapentry ( closure , preserve_fieldnames , h ) ;
return ;
}
@ -12514,7 +12516,8 @@ void printer_sethandlers(const void *closure, upb_handlers *h) {
const upb_fielddef * f = upb_msg_iter_field ( & i ) ;
upb_handlerattr name_attr = UPB_HANDLERATTR_INITIALIZER ;
upb_handlerattr_sethandlerdata ( & name_attr , newstrpc ( h , f ) ) ;
upb_handlerattr_sethandlerdata ( & name_attr ,
newstrpc ( h , f , preserve_fieldnames ) ) ;
if ( upb_fielddef_ismap ( f ) ) {
upb_handlers_setstartseq ( h , f , startmap , & name_attr ) ;
@ -12537,7 +12540,7 @@ void printer_sethandlers(const void *closure, upb_handlers *h) {
* option later to control this behavior , but we will wait for a real
* need first . */
upb_handlerattr enum_attr = UPB_HANDLERATTR_INITIALIZER ;
set_enum_hd ( h , f , & enum_attr ) ;
set_enum_hd ( h , f , preserve_fieldnames , & enum_attr ) ;
if ( upb_fielddef_isseq ( f ) ) {
upb_handlers_setint32 ( h , f , repeated_enum , & enum_attr ) ;
@ -12614,6 +12617,8 @@ upb_sink *upb_json_printer_input(upb_json_printer *p) {
}
const upb_handlers * upb_json_printer_newhandlers ( const upb_msgdef * md ,
bool preserve_fieldnames ,
const void * owner ) {
return upb_handlers_newfrozen ( md , owner , printer_sethandlers , NULL ) ;
return upb_handlers_newfrozen (
md , owner , printer_sethandlers , & preserve_fieldnames ) ;
}