From 563325435753fae01d2b45cceba8b9d14c8a7aad Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Thu, 10 Jun 2010 09:14:31 -0700 Subject: Implement proper type checking again. --- src/upb.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) (limited to 'src/upb.c') diff --git a/src/upb.c b/src/upb.c index bd41613..189dfe4 100644 --- a/src/upb.c +++ b/src/upb.c @@ -11,6 +11,34 @@ #include "upb.h" +#define alignof(t) offsetof(struct { char c; t x; }, x) +#define TYPE_INFO(wire_type, ctype, allows_delimited) \ + {alignof(ctype), sizeof(ctype), wire_type, \ + (1 << wire_type) | (allows_delimited << UPB_WIRE_TYPE_DELIMITED), \ + #ctype}, + +upb_type_info upb_types[] = { + {0, 0, 0, ""} // There is no type 0. + TYPE_INFO(UPB_WIRE_TYPE_64BIT, double, 1), // DOUBLE + TYPE_INFO(UPB_WIRE_TYPE_32BIT, float, 1), // FLOAT + TYPE_INFO(UPB_WIRE_TYPE_VARINT, int64_t, 1), // INT64 + TYPE_INFO(UPB_WIRE_TYPE_VARINT, uint64_t, 1), // UINT64 + TYPE_INFO(UPB_WIRE_TYPE_VARINT, int32_t, 1), // INT32 + TYPE_INFO(UPB_WIRE_TYPE_64BIT, uint64_t, 1), // FIXED64 + TYPE_INFO(UPB_WIRE_TYPE_32BIT, uint32_t, 1), // FIXED32 + TYPE_INFO(UPB_WIRE_TYPE_VARINT, bool, 1), // BOOL + TYPE_INFO(UPB_WIRE_TYPE_DELIMITED, void*, 1), // STRING + TYPE_INFO(UPB_WIRE_TYPE_START_GROUP, void*, 0), // GROUP + TYPE_INFO(UPB_WIRE_TYPE_DELIMITED, void*, 1), // MESSAGE + TYPE_INFO(UPB_WIRE_TYPE_DELIMITED, void*, 1), // BYTES + TYPE_INFO(UPB_WIRE_TYPE_VARINT, uint32_t, 1), // UINT32 + TYPE_INFO(UPB_WIRE_TYPE_VARINT, uint32_t, 1), // ENUM + TYPE_INFO(UPB_WIRE_TYPE_32BIT, int32_t, 1), // SFIXED32 + TYPE_INFO(UPB_WIRE_TYPE_64BIT, int64_t, 1), // SFIXED64 + TYPE_INFO(UPB_WIRE_TYPE_VARINT, int32_t, 1), // SINT32 + TYPE_INFO(UPB_WIRE_TYPE_VARINT, int64_t, 1), // SINT64 +}; + void upb_seterr(upb_status *status, enum upb_status_code code, const char *msg, ...) { -- cgit v1.2.3