You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

123 lines
4.7 KiB

/******************************************************************************
版权所有 (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 <stddef.h>
#include <stdint.h>
#include <stdbool.h>
#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__ */