@@ -131,6 +131,7 @@ typedef struct pb_Value {
131
131
#define pb_slicelen (s ) ((size_t)((s)->end - (s)->p))
132
132
#define pb_gettag (v ) ((unsigned)((v) >> 3))
133
133
#define pb_gettype (v ) ((unsigned)((v) & 7))
134
+ #define pb_ (type , tag ) (((unsigned)(tag) << 3) | (PB_T##type & 7))
134
135
135
136
PB_API pb_Slice pb_slice (const char * s );
136
137
PB_API pb_Slice pb_lslice (const char * s , size_t len );
@@ -178,7 +179,7 @@ PB_API void pb_addvarint (pb_Buffer *b, uint64_t n);
178
179
PB_API void pb_addvar32 (pb_Buffer * b , uint32_t n );
179
180
PB_API void pb_addfixed64 (pb_Buffer * b , uint64_t n );
180
181
PB_API void pb_addfixed32 (pb_Buffer * b , uint32_t n );
181
- PB_API void pb_addtag (pb_Buffer * b , uint32_t tag , uint32_t type );
182
+ PB_API void pb_addpair (pb_Buffer * b , uint32_t tag , uint32_t type );
182
183
183
184
/* conversions */
184
185
@@ -509,7 +510,7 @@ PB_API pb_Slice pb_result(pb_Buffer *b)
509
510
PB_API void pb_adddata (pb_Buffer * b , pb_Slice * s )
510
511
{ pb_addvar32 (b , pb_slicelen (s )); pb_addslice (b , s ); }
511
512
512
- PB_API void pb_addtag (pb_Buffer * b , uint32_t tag , uint32_t type )
513
+ PB_API void pb_addpair (pb_Buffer * b , uint32_t tag , uint32_t type )
513
514
{ pb_addvar32 (b , (uint32_t )((tag << 3 ) | (type & 7 ))); }
514
515
515
516
PB_API void pb_initbuffer (pb_Buffer * b ) {
@@ -783,7 +784,7 @@ PB_API pb_Entry *pbM_seti(pb_Map *m, uint32_t key) {
783
784
PB_API pb_Entry * pbM_gets (pb_Map * m , pb_Slice * key ) {
784
785
uint32_t hash ;
785
786
pb_Entry * e ;
786
- if (m -> size == 0 ) return NULL ;
787
+ if (m -> size == 0 || key -> p == NULL ) return NULL ;
787
788
hash = pbM_calchash (key );
788
789
assert ((m -> size & (m -> size - 1 )) == 0 );
789
790
e = & m -> hash [hash & (m -> size - 1 )];
@@ -799,6 +800,7 @@ PB_API pb_Entry *pbM_gets(pb_Map *m, pb_Slice *key) {
799
800
800
801
PB_API pb_Entry * pbM_sets (pb_Map * m , pb_Slice * key ) {
801
802
pb_Entry e , * ret ;
803
+ if (key -> p == NULL ) return NULL ;
802
804
if ((ret = pbM_gets (m , key )) != NULL )
803
805
return ret ;
804
806
e .key = (uintptr_t )key -> p ;
@@ -1119,8 +1121,9 @@ static int pbL_rawfield(pb_State *S, pb_Type *t, pb_Field *f, pb_Slice *name) {
1119
1121
1120
1122
static int pbL_rawtype (pb_State * S , pb_Type * t , pb_Slice * name ) {
1121
1123
pb_Entry * e = pbM_sets (& S -> types , name );
1122
- pb_Type * nt = (pb_Type * )e -> value ;
1123
- if (nt == NULL )
1124
+ pb_Type * nt ;
1125
+ if (e == NULL ) return 0 ;
1126
+ if ((nt = (pb_Type * )e -> value ) == NULL )
1124
1127
DO_ (nt = (pb_Type * )pbP_newsize (S -> typepool , sizeof (pb_Type )));
1125
1128
else {
1126
1129
pbM_free (& nt -> field_tags );
@@ -1132,23 +1135,23 @@ static int pbL_rawtype(pb_State *S, pb_Type *t, pb_Slice *name) {
1132
1135
}
1133
1136
1134
1137
static int pbL_EnumValueDescriptorProto (pb_State * S , pb_Slice * b , pb_Type * t ) {
1135
- uint32_t tag , number ;
1136
- pb_Slice name ;
1138
+ uint32_t pair , number ;
1139
+ pb_Slice name = { NULL , NULL } ;
1137
1140
pb_Field f ;
1138
1141
memset (& f , 0 , sizeof (f ));
1139
1142
f .scalar = 1 ;
1140
- while (pb_readvar32 (b , & tag )) {
1141
- switch (pb_gettag ( tag ) ) {
1142
- case 1 : /* name */
1143
+ while (pb_readvar32 (b , & pair )) {
1144
+ switch (pair ) {
1145
+ case pb_ ( DATA , 1 ) : /* name */
1143
1146
DO_ (pb_readslice (b , & name ));
1144
1147
DO_ (f .name = pb_newslice (S , & name ).p );
1145
1148
break ;
1146
- case 2 : /* number */
1149
+ case pb_ ( VARINT , 2 ) : /* number */
1147
1150
DO_ (pb_readvar32 (b , & number ));
1148
1151
f .u .enum_value = number ;
1149
1152
break ;
1150
1153
default :
1151
- DO_ (pb_skipvalue (b , pb_gettype (tag )));
1154
+ DO_ (pb_skipvalue (b , pb_gettype (pair )));
1152
1155
break ;
1153
1156
}
1154
1157
}
@@ -1157,24 +1160,24 @@ static int pbL_EnumValueDescriptorProto(pb_State *S, pb_Slice *b, pb_Type *t) {
1157
1160
}
1158
1161
1159
1162
static int pbL_EnumDescriptorProto (pb_State * S , pb_Slice * b , pb_Slice * prefix ) {
1160
- uint32_t tag ;
1161
- pb_Slice name , slice ;
1163
+ uint32_t pair ;
1164
+ pb_Slice name = { NULL , NULL } , slice ;
1162
1165
pb_Type t ;
1163
1166
memset (& t , 0 , sizeof (t ));
1164
1167
t .is_enum = 1 ;
1165
- while (pb_readvar32 (b , & tag )) {
1166
- switch (pb_gettag ( tag ) ) {
1167
- case 1 : /* name */
1168
+ while (pb_readvar32 (b , & pair )) {
1169
+ switch (pair ) {
1170
+ case pb_ ( DATA , 1 ) : /* name */
1168
1171
DO_ (pb_readslice (b , & name ));
1169
1172
DO_ (pbL_getqname (S , prefix , & name ));
1170
1173
t .name = name .p ;
1171
1174
break ;
1172
- case 2 : /* value */
1175
+ case pb_ ( DATA , 2 ) : /* value */
1173
1176
DO_ (pb_readslice (b , & slice ));
1174
1177
DO_ (pbL_EnumValueDescriptorProto (S , & slice , & t ));
1175
1178
break ;
1176
1179
default :
1177
- DO_ (pb_skipvalue (b , pb_gettype (tag )));
1180
+ DO_ (pb_skipvalue (b , pb_gettype (pair )));
1178
1181
break ;
1179
1182
}
1180
1183
}
@@ -1183,73 +1186,73 @@ static int pbL_EnumDescriptorProto(pb_State *S, pb_Slice *b, pb_Slice *prefix) {
1183
1186
}
1184
1187
1185
1188
static int pbL_FieldOptions (pb_State * S , pb_Slice * b , pb_Field * f ) {
1186
- uint32_t tag ;
1187
- while (pb_readvar32 (b , & tag )) {
1188
- if (pb_gettag ( tag ) == 2 ) {
1189
+ uint32_t pair ;
1190
+ while (pb_readvar32 (b , & pair )) {
1191
+ if (pair == pb_ ( VARINT , 2 ) ) {
1189
1192
uint32_t v ;
1190
1193
DO_ (pb_readvar32 (b , & v ));
1191
1194
f -> packed = v ;
1192
1195
continue ;
1193
1196
}
1194
- DO_ (pb_skipvalue (b , pb_gettype (tag )));
1197
+ DO_ (pb_skipvalue (b , pb_gettype (pair )));
1195
1198
}
1196
1199
return b -> p == b -> end ;
1197
1200
}
1198
1201
1199
1202
static int pbL_FieldDescriptorProto (pb_State * S , pb_Slice * b , pb_Type * t ) {
1200
- uint32_t tag , number ;
1201
- pb_Slice name , slice ;
1203
+ uint32_t pair , number ;
1204
+ pb_Slice name = { NULL , NULL } , slice ;
1202
1205
pb_Field f ;
1203
1206
memset (& f , 0 , sizeof (f ));
1204
- while (pb_readvar32 (b , & tag )) {
1205
- switch (pb_gettag ( tag ) ) {
1206
- case 1 : /* name */
1207
+ while (pb_readvar32 (b , & pair )) {
1208
+ switch (pair ) {
1209
+ case pb_ ( DATA , 1 ) : /* name */
1207
1210
DO_ (pb_readslice (b , & name ));
1208
1211
DO_ ((name = pb_newslice (S , & name )).p );
1209
1212
f .name = name .p ;
1210
1213
break ;
1211
- case 3 : /* number */
1214
+ case pb_ ( VARINT , 3 ) : /* number */
1212
1215
DO_ (pb_readvar32 (b , & number ));
1213
1216
f .tag = number ;
1214
1217
break ;
1215
- case 4 : /* label */
1218
+ case pb_ ( VARINT , 4 ) : /* label */
1216
1219
DO_ (pb_readvar32 (b , & number ));
1217
1220
if (number == 3 ) /* LABEL_OPTIONAL */
1218
1221
f .repeated = 1 ;
1219
1222
break ;
1220
- case 5 : /* type */
1223
+ case pb_ ( VARINT , 5 ) : /* type */
1221
1224
DO_ (pb_readvar32 (b , & number ));
1222
1225
DO_ (number != PB_Tgroup );
1223
1226
f .type_id = number ;
1224
1227
if (f .type_id != PB_Tmessage && f .type_id != PB_Tenum )
1225
1228
f .scalar = 1 ;
1226
1229
break ;
1227
- case 6 : /* type_name */
1230
+ case pb_ ( DATA , 6 ) : /* type_name */
1228
1231
DO_ (pb_readslice (b , & slice ));
1229
1232
if (* slice .p == '.' ) ++ slice .p ;
1230
1233
if ((f .type = pb_type (S , & slice )) == NULL ) {
1231
1234
slice = pb_newslice (S , & slice );
1232
1235
f .type = pb_newtype (S , & slice );
1233
1236
}
1234
1237
break ;
1235
- case 2 : /* extendee */
1238
+ case pb_ ( DATA , 2 ) : /* extendee */
1236
1239
DO_ (t == NULL );
1237
1240
DO_ (pb_readslice (b , & slice ));
1238
1241
if ((t = pb_type (S , & slice )) == NULL ) {
1239
1242
slice = pb_newslice (S , & slice );
1240
1243
t = pb_newtype (S , & slice );
1241
1244
}
1242
1245
break ;
1243
- case 7 : /* default_value */
1246
+ case pb_ ( DATA , 7 ) : /* default_value */
1244
1247
DO_ (pb_readslice (b , & slice ));
1245
1248
DO_ (f .u .default_value = pb_newslice (S , & slice ).p );
1246
1249
break ;
1247
- case 8 : /* options */
1250
+ case pb_ ( DATA , 8 ) : /* options */
1248
1251
DO_ (pb_readslice (b , & slice ));
1249
1252
DO_ (pbL_FieldOptions (S , b , & f ));
1250
1253
break ;
1251
1254
default :
1252
- DO_ (pb_skipvalue (b , pb_gettype (tag )));
1255
+ DO_ (pb_skipvalue (b , pb_gettype (pair )));
1253
1256
break ;
1254
1257
}
1255
1258
}
@@ -1259,35 +1262,35 @@ static int pbL_FieldDescriptorProto(pb_State *S, pb_Slice *b, pb_Type *t) {
1259
1262
}
1260
1263
1261
1264
static int pbL_DescriptorProto (pb_State * S , pb_Slice * b , pb_Slice * prefix ) {
1262
- uint32_t tag ;
1265
+ uint32_t pair ;
1263
1266
pb_Type t ;
1264
- pb_Slice name , slice ;
1267
+ pb_Slice name = { NULL , NULL } , slice ;
1265
1268
memset (& t , 0 , sizeof (t ));
1266
- while (pb_readvar32 (b , & tag )) {
1267
- switch (pb_gettag ( tag ) ) {
1268
- case 1 : /* name */
1269
+ while (pb_readvar32 (b , & pair )) {
1270
+ switch (pair ) {
1271
+ case pb_ ( DATA , 1 ) : /* name */
1269
1272
DO_ (pb_readslice (b , & name ));
1270
1273
DO_ (pbL_getqname (S , prefix , & name ));
1271
1274
t .name = name .p ;
1272
1275
break ;
1273
- case 2 : /* field */
1276
+ case pb_ ( DATA , 2 ) : /* field */
1274
1277
DO_ (pb_readslice (b , & slice ));
1275
1278
DO_ (pbL_FieldDescriptorProto (S , & slice , & t ));
1276
1279
break ;
1277
- case 6 : /* extension */
1280
+ case pb_ ( DATA , 6 ) : /* extension */
1278
1281
DO_ (pb_readslice (b , & slice ));
1279
1282
DO_ (pbL_FieldDescriptorProto (S , & slice , NULL ));
1280
1283
break ;
1281
- case 3 : /* nested_type */
1284
+ case pb_ ( DATA , 3 ) : /* nested_type */
1282
1285
DO_ (pb_readslice (b , & slice ));
1283
1286
DO_ (pbL_DescriptorProto (S , & slice , & name ));
1284
1287
break ;
1285
- case 4 : /* enum_type */
1288
+ case pb_ ( DATA , 4 ) : /* enum_type */
1286
1289
DO_ (pb_readslice (b , & slice ));
1287
1290
DO_ (pbL_EnumDescriptorProto (S , & slice , & name ));
1288
1291
break ;
1289
1292
default :
1290
- DO_ (pb_skipvalue (b , pb_gettype (tag )));
1293
+ DO_ (pb_skipvalue (b , pb_gettype (pair )));
1291
1294
break ;
1292
1295
}
1293
1296
}
@@ -1296,43 +1299,43 @@ static int pbL_DescriptorProto(pb_State *S, pb_Slice *b, pb_Slice *prefix) {
1296
1299
}
1297
1300
1298
1301
static int pbL_FileDescriptorProto (pb_State * S , pb_Slice * b ) {
1299
- uint32_t tag ;
1302
+ uint32_t pair ;
1300
1303
pb_Slice package , slice ;
1301
- while (pb_readvar32 (b , & tag )) {
1302
- switch (pb_gettag ( tag ) ) {
1303
- case 2 : /* package */
1304
+ while (pb_readvar32 (b , & pair )) {
1305
+ switch (pair ) {
1306
+ case pb_ ( DATA , 2 ) : /* package */
1304
1307
DO_ (pb_readslice (b , & package ));
1305
1308
break ;
1306
- case 4 : /* message_type */
1309
+ case pb_ ( DATA , 4 ) : /* message_type */
1307
1310
DO_ (pb_readslice (b , & slice ));
1308
1311
DO_ (pbL_DescriptorProto (S , & slice , & package ));
1309
1312
break ;
1310
- case 5 : /* enum_type */
1313
+ case pb_ ( DATA , 5 ) : /* enum_type */
1311
1314
DO_ (pb_readslice (b , & slice ));
1312
1315
DO_ (pbL_EnumDescriptorProto (S , & slice , & package ));
1313
1316
break ;
1314
- case 7 : /* extension */
1317
+ case pb_ ( DATA , 7 ) : /* extension */
1315
1318
DO_ (pb_readslice (b , & slice ));
1316
1319
DO_ (pbL_FieldDescriptorProto (S , & slice , NULL ));
1317
1320
break ;
1318
1321
default :
1319
- DO_ (pb_skipvalue (b , pb_gettype (tag )));
1322
+ DO_ (pb_skipvalue (b , pb_gettype (pair )));
1320
1323
break ;
1321
1324
}
1322
1325
}
1323
1326
return b -> p == b -> end ;
1324
1327
}
1325
1328
1326
1329
PB_API int pb_load (pb_State * S , pb_Slice * b ) {
1327
- uint32_t tag ;
1328
- while (pb_readvar32 (b , & tag )) {
1329
- if (pb_gettag ( tag ) == 1 ) {
1330
+ uint32_t pair ;
1331
+ while (pb_readvar32 (b , & pair )) {
1332
+ if (pair == pb_ ( DATA , 1 ) ) {
1330
1333
pb_Slice slice ;
1331
1334
DO_ (pb_readslice (b , & slice ));
1332
1335
DO_ (pbL_FileDescriptorProto (S , & slice ));
1333
1336
continue ;
1334
1337
}
1335
- DO_ (pb_skipvalue (b , pb_gettype (tag )));
1338
+ DO_ (pb_skipvalue (b , pb_gettype (pair )));
1336
1339
}
1337
1340
return b -> p == b -> end ;
1338
1341
}
0 commit comments