/****************************************************************************** 版权所有 (C), 2018-2099, Radkil ****************************************************************************** 文 件 名 : pb_lua_desc.h 功能描述 : pb_lua 消息描述符类型 + X-macro。 由 pb_lua.c 与生成的 pb_lua_registry.c 共享。 字段表内容随 Type_FIELDLIST 自动; 消息注册由生成器维护。 ******************************************************************************/ #ifndef __PB_LUA_DESC_H__ #define __PB_LUA_DESC_H__ #include #include #include #include "pb.h" typedef enum { PB_LUA_T_BOOL = 0, PB_LUA_T_INT32, PB_LUA_T_INT64, PB_LUA_T_DOUBLE, PB_LUA_T_STRING, PB_LUA_T_MESSAGE, PB_LUA_T_UNSUPPORTED } pb_lua_ftype_t; typedef struct { const char *name; uint8_t tag; uint8_t ltype; /* pb_lua_ftype_t */ uint16_t offset; int16_t has_offset; /* -1 = 无 has_ */ uint16_t size; const void *aux; /* MESSAGE→pb_lua_msg_t*; 否则 NULL */ } pb_lua_field_t; typedef struct pb_lua_msg { const char *name; const pb_msgdesc_t *msg; size_t c_size; size_t max_encoded; const pb_lua_field_t *fields; size_t nfields; } pb_lua_msg_t; /*── X-macro: 由 Type_FIELDLIST 生成字段表 ────────────────────── */ #define PB_LUA_MSGREF_(type) (&type##_lua_desc) #define PB_LUA_MSGREF(type) PB_LUA_MSGREF_(type) #define PB_LUA_HAS_OPTIONAL(a, f) ((int16_t)offsetof(a, has_##f)) #define PB_LUA_HAS_REQUIRED(a, f) ((int16_t)-1) #define PB_LUA_HAS_SINGULAR(a, f) ((int16_t)-1) #define PB_LUA_HAS_REPEATED(a, f) ((int16_t)-1) #define PB_LUA_AUX_NULL(a, f) NULL #define PB_LUA_AUX_MESSAGE(a, f) PB_LUA_MSGREF(a##_##f##_MSGTYPE) #define PB_LUA_AUX_MSG_W_CB(a, f) PB_LUA_AUX_MESSAGE(a, f) #define PB_LUA_AUX_ENUM(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_UENUM(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_BOOL(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_INT32(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_INT64(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_DOUBLE(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_FLOAT(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_STRING(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_BYTES(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_UINT32(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_UINT64(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_SINT32(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_SINT64(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_FIXED32(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_FIXED64(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_SFIXED32(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_SFIXED64(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_EXTENSION(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_AUX_FIXED_LENGTH_BYTES(a, f) PB_LUA_AUX_NULL(a, f) #define PB_LUA_FT_BOOL PB_LUA_T_BOOL #define PB_LUA_FT_INT32 PB_LUA_T_INT32 #define PB_LUA_FT_INT64 PB_LUA_T_INT64 #define PB_LUA_FT_DOUBLE PB_LUA_T_DOUBLE #define PB_LUA_FT_FLOAT PB_LUA_T_DOUBLE #define PB_LUA_FT_ENUM PB_LUA_T_INT32 #define PB_LUA_FT_UENUM PB_LUA_T_INT32 #define PB_LUA_FT_STRING PB_LUA_T_STRING #define PB_LUA_FT_MESSAGE PB_LUA_T_MESSAGE #define PB_LUA_FT_MSG_W_CB PB_LUA_T_MESSAGE #define PB_LUA_FT_BYTES PB_LUA_T_UNSUPPORTED #define PB_LUA_FT_UINT32 PB_LUA_T_INT32 #define PB_LUA_FT_UINT64 PB_LUA_T_INT64 #define PB_LUA_FT_SINT32 PB_LUA_T_INT32 #define PB_LUA_FT_SINT64 PB_LUA_T_INT64 #define PB_LUA_FT_FIXED32 PB_LUA_T_INT32 #define PB_LUA_FT_FIXED64 PB_LUA_T_INT64 #define PB_LUA_FT_SFIXED32 PB_LUA_T_INT32 #define PB_LUA_FT_SFIXED64 PB_LUA_T_INT64 #define PB_LUA_FT_EXTENSION PB_LUA_T_UNSUPPORTED #define PB_LUA_FT_FIXED_LENGTH_BYTES PB_LUA_T_UNSUPPORTED #define PB_LUA_EMIT(a, atype, htype, ltype, name, tag) \ { #name, (uint8_t)(tag), (uint8_t)PB_LUA_FT_##ltype, \ (uint16_t)offsetof(a, name), \ PB_LUA_HAS_##htype(a, name), \ (uint16_t)sizeof(((a *)0)->name), \ PB_LUA_AUX_##ltype(a, name) }, #define PB_LUA_FIELDS(Struct) Struct##_FIELDLIST(PB_LUA_EMIT, Struct) #define PB_LUA_MSGDESC(Struct, StructName, MaxEnc) \ { StructName, &Struct##_msg, sizeof(Struct), (MaxEnc), \ Struct##_fields_lua, \ sizeof(Struct##_fields_lua) / sizeof(Struct##_fields_lua[0]) } /* ── 全局注册表(生成的 pb_lua_registry.c 强符号定义) ─────────── */ extern const pb_lua_msg_t *const g_pb_msgs[]; extern const int g_pb_msgs_count; #endif /* __PB_LUA_DESC_H__ */