protoc-c: preserve case in C enum value names (Issue #129)
there is some confusion with regard to the use of lower case letters in enum values. take the following message definition: message LowerCase { enum CaseEnum { UPPER = 1; lower = 2; } optional CaseEnum value = 1 [default = lower]; } this generates the following C enum: typedef enum _LowerCase__CaseEnum { LOWER_CASE__CASE_ENUM__UPPER = 1, LOWER_CASE__CASE_ENUM__lower = 2 _PROTOBUF_C_FORCE_ENUM_TO_BE_INT_SIZE(LOWER_CASE__CASE_ENUM) } LowerCase__CaseEnum; note that the case of the enum value 'lower' was preserved in the C symbol name as 'LOWER_CASE__CASE_ENUM__lower', but that the _INIT macro references the same enum value with the (non-existent) C symbol name 'LOWER_CASE__CASE_ENUM__LOWER': #define LOWER_CASE__INIT \ { PROTOBUF_C_MESSAGE_INIT (&lower_case__descriptor) \ , 0,LOWER_CASE__CASE_ENUM__LOWER } additionally, the ProtobufCEnumValue array generated also refers to the same enum value with the (non-existent) upper cased version: const ProtobufCEnumValue lower_case__case_enum__enum_values_by_number[2] = { { "UPPER", "LOWER_CASE__CASE_ENUM__UPPER", 1 }, { "lower", "LOWER_CASE__CASE_ENUM__LOWER", 2 }, }; we should preserve the existing behavior of copying the case from the enum values in the message definition and fix up the places where the (non-existent) upper case version is used, rather than changing the enum definition itself to match the case used in the _INIT macro and enum_values_by_number array, because it's possible that there might be existing working code that uses enum values with lower case letters that would be affected by such a change. incidentally, google's C++ protobuf implementation preserves case in enum values. protoc --cpp_out generates the following enum declaration for the message descriptor above: enum LowerCase_CaseEnum { LowerCase_CaseEnum_UPPER = 1, LowerCase_CaseEnum_lower = 2 };
Showing
Please register or sign in to comment