|
@@ -65,6 +65,63 @@ ENUM_TO_STRING(BBLONG,l)
|
|
|
ENUM_TO_STRING(BBULONG,y)
|
|
|
ENUM_TO_STRING(BBSIZET,t)
|
|
|
|
|
|
+#define TRY_ENUM_CONVERT(type,chr)\
|
|
|
+int bbEnumTryConvert_##chr(BBEnum * bbEnum, type ordinalValue, type * ordinalResult) {\
|
|
|
+ type * value = (type*)bbEnum->values;\
|
|
|
+ if (bbEnum->flags) {\
|
|
|
+ int result;\
|
|
|
+ for (int i = 0; i < bbEnum->length; i++) {\
|
|
|
+ if (ordinalValue & *value) {\
|
|
|
+ result |= *value++;\
|
|
|
+ }\
|
|
|
+ }\
|
|
|
+ if (result == ordinalValue) {\
|
|
|
+ *ordinalResult = ordinalValue;\
|
|
|
+ return 1;\
|
|
|
+ }\
|
|
|
+ } else {\
|
|
|
+ if (ordinalValue < *value || ordinalValue > ((type*)bbEnum->values)[bbEnum->length - 1]) {\
|
|
|
+ return 0;\
|
|
|
+ }\
|
|
|
+ for (int i = 0; i < bbEnum->length; i++) {\
|
|
|
+ if (*value++ == ordinalValue) {\
|
|
|
+ *ordinalResult = ordinalValue;\
|
|
|
+ return 1;\
|
|
|
+ }\
|
|
|
+ }\
|
|
|
+ }\
|
|
|
+ return 0;\
|
|
|
+}
|
|
|
+
|
|
|
+TRY_ENUM_CONVERT(BBBYTE,b)
|
|
|
+TRY_ENUM_CONVERT(BBSHORT,s)
|
|
|
+TRY_ENUM_CONVERT(BBINT,i)
|
|
|
+TRY_ENUM_CONVERT(BBUINT,u)
|
|
|
+TRY_ENUM_CONVERT(BBLONG,l)
|
|
|
+TRY_ENUM_CONVERT(BBULONG,y)
|
|
|
+TRY_ENUM_CONVERT(BBSIZET,t)
|
|
|
+
|
|
|
+#ifndef NDEBUG
|
|
|
+
|
|
|
+#define ENUM_CAST(type,chr)\
|
|
|
+type bbEnumCast_##chr(BBEnum * bbEnum, type ordinalValue) {\
|
|
|
+ type result;\
|
|
|
+ if (!bbEnumTryConvert_##chr(bbEnum, ordinalValue, &result)) {\
|
|
|
+ brl_blitz_InvalidEnumError();\
|
|
|
+ }\
|
|
|
+ return result;\
|
|
|
+}
|
|
|
+
|
|
|
+ENUM_CAST(BBBYTE,b)
|
|
|
+ENUM_CAST(BBSHORT,s)
|
|
|
+ENUM_CAST(BBINT,i)
|
|
|
+ENUM_CAST(BBUINT,u)
|
|
|
+ENUM_CAST(BBLONG,l)
|
|
|
+ENUM_CAST(BBULONG,y)
|
|
|
+ENUM_CAST(BBSIZET,t)
|
|
|
+
|
|
|
+#endif
|
|
|
+
|
|
|
struct enum_info_node {
|
|
|
struct avl_root link;
|
|
|
BBEnum * bbEnum;
|