@ -28,7 +28,6 @@
# include "upbc/code_generator_request.h"
# include <inttypes.h>
# include <setjmp.h>
# include <stdio.h>
# include "google/protobuf/compiler/plugin.upb.h"
@ -56,7 +55,8 @@ static void upbc_State_Fini(upbc_State* s) {
if ( s - > symtab ) upb_DefPool_Free ( s - > symtab ) ;
}
static void upbc_Error ( upbc_State * s , const char * fn , const char * msg ) {
UPB_NORETURN static void upbc_Error ( upbc_State * s , const char * fn ,
const char * msg ) {
upb_Status_SetErrorFormat ( s - > status , " %s(): %s " , fn , msg ) ;
upbc_State_Fini ( s ) ;
UPB_LONGJMP ( s - > jmp , - 1 ) ;
@ -70,9 +70,10 @@ static void upbc_State_Init(upbc_State* s) {
if ( ! s - > out ) upbc_Error ( s , __func__ , " could not allocate request " ) ;
}
static void upbc_State_Emit ( upbc_State * s , const char * name ,
upb_StringView encoding ) {
static void upbc_State_Emit ( upbc_State * s , const char * name , const char * data ,
size_t size ) {
const upb_StringView key = upb_StringView_FromString ( name ) ;
const upb_StringView encoding = upb_StringView_FromDataAndSize ( data , size ) ;
bool ok = upbc_CodeGeneratorRequest_mini_descriptors_set ( s - > out , key ,
encoding , s - > arena ) ;
if ( ! ok ) upbc_Error ( s , __func__ , " could not set mini descriptor in map " ) ;
@ -83,52 +84,52 @@ static void upbc_State_Emit(upbc_State* s, const char* name,
// Forward declaration.
static void upbc_Scrape_Message ( upbc_State * , const upb_MessageDef * ) ;
static void upbc_Scrape_Enum ( upbc_State * s , const upb_EnumDef * enum_def ) {
const char * name = upb_EnumDef_FullName ( enum_def ) ;
const upb_StringView encoding =
upb_MiniDescriptor_EncodeEnum ( enum_def , s - > arena ) ;
upbc_State_Emit ( s , name , encoding ) ;
static void upbc_Scrape_Enum ( upbc_State * s , const upb_EnumDef * e ) {
char * data ;
size_t size ;
bool ok = upb_MiniDescriptor_EncodeEnum ( e , & data , & size , s - > arena ) ;
if ( ! ok ) upbc_Error ( s , __func__ , " could not encode enum " ) ;
upbc_State_Emit ( s , upb_EnumDef_FullName ( e ) , data , size ) ;
}
static void upbc_Scrape_Extension ( upbc_State * s ,
const upb_FieldDef * field_def ) {
const char * name = upb_FieldDef_FullName ( field_def ) ;
const upb_StringView encoding =
upb_MiniDescriptor_EncodeExtension ( field_def , s - > arena ) ;
upbc_State_Emit ( s , name , encoding ) ;
static void upbc_Scrape_Extension ( upbc_State * s , const upb_FieldDef * f ) {
char * data ;
size_t size ;
bool ok = upb_MiniDescriptor_EncodeField ( f , & data , & size , s - > arena ) ;
if ( ! ok ) upbc_Error ( s , __func__ , " could not encode extension " ) ;
upbc_State_Emit ( s , upb_FieldDef_FullName ( f ) , data , size ) ;
}
static void upbc_Scrape_FileEnums ( upbc_State * s , const upb_FileDef * file_def ) {
const size_t len = upb_FileDef_TopLevelEnumCount ( file_def ) ;
static void upbc_Scrape_FileEnums ( upbc_State * s , const upb_FileDef * f ) {
const size_t len = upb_FileDef_TopLevelEnumCount ( f ) ;
for ( size_t i = 0 ; i < len ; i + + ) {
const upb_EnumDef * enum_def = upb_FileDef_TopLevelEnum ( file_def , i ) ;
upbc_Scrape_Enum ( s , enum_def ) ;
upbc_Scrape_Enum ( s , upb_FileDef_TopLevelEnum ( f , i ) ) ;
}
}
static void upbc_Scrape_FileExtensions ( upbc_State * s ,
const upb_FileDef * file_def ) {
const size_t len = upb_FileDef_TopLevelExtensionCount ( file_def ) ;
static void upbc_Scrape_FileExtensions ( upbc_State * s , const upb_FileDef * f ) {
const size_t len = upb_FileDef_TopLevelExtensionCount ( f ) ;
for ( size_t i = 0 ; i < len ; i + + ) {
const upb_FieldDef * field_def = upb_FileDef_TopLevelExtension ( file_def , i ) ;
upbc_Scrape_Extension ( s , field_def ) ;
upbc_Scrape_Extension ( s , upb_FileDef_TopLevelExtension ( f , i ) ) ;
}
}
static void upbc_Scrape_FileMessages ( upbc_State * s ,
const upb_FileDef * file_def ) {
const size_t len = upb_FileDef_TopLevelMessageCount ( file_def ) ;
static void upbc_Scrape_FileMessages ( upbc_State * s , const upb_FileDef * f ) {
const size_t len = upb_FileDef_TopLevelMessageCount ( f ) ;
for ( size_t i = 0 ; i < len ; i + + ) {
const upb_MessageDef * message_def =
upb_FileDef_TopLevelMessage ( file_def , i ) ;
upbc_Scrape_Message ( s , message_def ) ;
upbc_Scrape_Message ( s , upb_FileDef_TopLevelMessage ( f , i ) ) ;
}
}
static void upbc_Scrape_File ( upbc_State * s , const upb_FileDef * file_def ) {
upbc_Scrape_FileEnums ( s , file_def ) ;
upbc_Scrape_FileExtensions ( s , file_def ) ;
upbc_Scrape_FileMessages ( s , file_def ) ;
static void upbc_Scrape_File ( upbc_State * s , const upb_FileDef * f ) {
upbc_Scrape_FileEnums ( s , f ) ;
upbc_Scrape_FileExtensions ( s , f ) ;
upbc_Scrape_FileMessages ( s , f ) ;
}
static void upbc_Scrape_Files ( upbc_State * s ) {
@ -136,57 +137,53 @@ static void upbc_Scrape_Files(upbc_State* s) {
upbc_CodeGeneratorRequest_request ( s - > out ) ;
size_t len = 0 ;
const google_protobuf_FileDescriptorProto * const * file_type s =
const google_protobuf_FileDescriptorProto * const * files =
google_protobuf_compiler_CodeGeneratorRequest_proto_file ( request , & len ) ;
for ( size_t i = 0 ; i < len ; i + + ) {
const upb_FileDef * file_def =
upb_DefPool_AddFile ( s - > symtab , file_types [ i ] , s - > status ) ;
if ( ! file_def ) upbc_Error ( s , __func__ , " could not add file to def pool " ) ;
const upb_FileDef * f = upb_DefPool_AddFile ( s - > symtab , files [ i ] , s - > status ) ;
if ( ! f ) upbc_Error ( s , __func__ , " could not add file to def pool " ) ;
upbc_Scrape_File ( s , file_def ) ;
upbc_Scrape_File ( s , f ) ;
}
}
static void upbc_Scrape_NestedEnums ( upbc_State * s ,
const upb_MessageDef * message_def ) {
const size_t len = upb_MessageDef_NestedEnumCount ( message_def ) ;
static void upbc_Scrape_NestedEnums ( upbc_State * s , const upb_MessageDef * m ) {
const size_t len = upb_MessageDef_NestedEnumCount ( m ) ;
for ( size_t i = 0 ; i < len ; i + + ) {
const upb_EnumDef * enum_def = upb_MessageDef_NestedEnum ( message_def , i ) ;
upbc_Scrape_Enum ( s , enum_def ) ;
upbc_Scrape_Enum ( s , upb_MessageDef_NestedEnum ( m , i ) ) ;
}
}
static void upbc_Scrape_NestedExtensions ( upbc_State * s ,
const upb_MessageDef * message_def ) {
const size_t len = upb_MessageDef_NestedExtensionCount ( message_def ) ;
const upb_MessageDef * m ) {
const size_t len = upb_MessageDef_NestedExtensionCount ( m ) ;
for ( size_t i = 0 ; i < len ; i + + ) {
const upb_FieldDef * field_def =
upb_MessageDef_NestedExtension ( message_def , i ) ;
upbc_Scrape_Extension ( s , field_def ) ;
upbc_Scrape_Extension ( s , upb_MessageDef_NestedExtension ( m , i ) ) ;
}
}
static void upbc_Scrape_NestedMessages ( upbc_State * s ,
const upb_MessageDef * message_def ) {
const size_t len = upb_MessageDef_NestedMessageCount ( message_def ) ;
static void upbc_Scrape_NestedMessages ( upbc_State * s , const upb_MessageDef * m ) {
const size_t len = upb_MessageDef_NestedMessageCount ( m ) ;
for ( size_t i = 0 ; i < len ; i + + ) {
const upb_MessageDef * nested_def =
upb_MessageDef_NestedMessage ( message_def , i ) ;
upbc_Scrape_Message ( s , nested_def ) ;
upbc_Scrape_Message ( s , upb_MessageDef_NestedMessage ( m , i ) ) ;
}
}
static void upbc_Scrape_Message ( upbc_State * s ,
const upb_MessageDef * message_def ) {
const char * name = upb_MessageDef_FullName ( message_def ) ;
const upb_StringView encoding =
upb_MiniDescriptor_EncodeMessage ( message_def , s - > arena ) ;
upbc_State_Emit ( s , name , encoding ) ;
static void upbc_Scrape_Message ( upbc_State * s , const upb_MessageDef * m ) {
char * data ;
size_t size ;
bool ok = upb_MiniDescriptor_EncodeMessage ( m , & data , & size , s - > arena ) ;
if ( ! ok ) upbc_Error ( s , __func__ , " could not encode message " ) ;
upbc_State_Emit ( s , upb_MessageDef_FullName ( m ) , data , size ) ;
upbc_Scrape_NestedEnums ( s , message_def ) ;
upbc_Scrape_NestedExtensions ( s , message_def ) ;
upbc_Scrape_NestedMessages ( s , message_def ) ;
upbc_Scrape_NestedEnums ( s , m ) ;
upbc_Scrape_NestedExtensions ( s , m ) ;
upbc_Scrape_NestedMessages ( s , m ) ;
}
upbc_CodeGeneratorRequest * upbc_MakeCodeGeneratorRequest (