• Robert Edmonds's avatar
    protoc-c: preserve case in C enum value names (Issue #129) · d2658e25
    Robert Edmonds authored
    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
        };
    d2658e25
c_enum.cc 10.9 KB