-
Notifications
You must be signed in to change notification settings - Fork 1
/
AutoEnum.cpp
129 lines (105 loc) · 4 KB
/
AutoEnum.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
/*************************************************************************
Crytek Source File.
Copyright (C), Crytek Studios, 2001-2007.
-------------------------------------------------------------------------
Description:
Macros for automatically building enumerations and matching char* arrays
-------------------------------------------------------------------------
History:
- 6:11:2009: Created by Tim Furnish
*************************************************************************/
#include "StdAfx.h"
#include "AutoEnum.h"
#include "Utility/StringUtils.h"
#define DO_PARSE_BITFIELD_STRING_LOGS 0
TBitfield AutoEnum_GetBitfieldFromString(const char * inString, const char ** inArray, int arraySize)
{
unsigned int reply = 0;
if (inString && inString[0] != '\0') // Avoid a load of work if the string's NULL or empty
{
const char * startFrom = inString;
assert (arraySize > 0);
char skipThisString[32];
size_t skipChars = cry_copyStringUntilFindChar(skipThisString, inArray[0], sizeof(skipThisString), '_');
size_t foundAtIndex = 0;
#if DO_PARSE_BITFIELD_STRING_LOGS
CryLog("AutoEnum_GetBitfieldFromString: Parsing '%s' (skipping first %d chars '%s%s' of each string in array)", inString, skipChars, skipThisString, skipChars ? "_" : "");
#endif
do
{
char gotToken[32];
foundAtIndex = cry_copyStringUntilFindChar(gotToken, startFrom, sizeof(gotToken), '|');
startFrom += foundAtIndex;
bool done = false;
for (int i = 0; i < arraySize; ++ i)
{
if (0 == stricmp(inArray[i] + skipChars, gotToken))
{
CRY_ASSERT_MESSAGE((reply & BIT(i)) == 0, string().Format("Bit '%s' already turned on! Does it feature more than once in string '%s'?", gotToken, inString));
#if DO_PARSE_BITFIELD_STRING_LOGS
CryLog("AutoEnum_GetBitfieldFromString: Token = '%s' = BIT(%d) = %d, remaining string = '%s'", gotToken, i, BIT(i), foundAtIndex ? startFrom : "");
#endif
reply |= BIT(i);
done = true;
break;
}
}
CRY_ASSERT_MESSAGE(done, string().Format("No flag called '%s' in list", gotToken));
}
while (foundAtIndex);
}
return reply;
}
bool AutoEnum_GetEnumValFromString(const char* inString, const char** inArray, int arraySize, int* outVal)
{
bool done = false;
if (inString && (inString[0] != '\0')) // avoid a load of work if the string's NULL or empty
{
CRY_ASSERT(arraySize > 0);
char skipThisString[32];
size_t skipChars = cry_copyStringUntilFindChar(skipThisString, inArray[0], sizeof(skipThisString), '_');
#if DO_PARSE_BITFIELD_STRING_LOGS
CryLog("AutoEnum_GetEnumValFromString: Parsing '%s' (skipping first %d chars '%s%s' of each string in array)", inString, skipChars, skipThisString, skipChars ? "_" : "");
#endif
for (int i=0; i<arraySize; i++)
{
#if DO_PARSE_BITFIELD_STRING_LOGS
CryLog("AutoEnum_GetEnumValFromString: Searching... Enum val %d = '%s'", i, (inArray[i] + skipChars));
#endif
if (0 == stricmp((inArray[i] + skipChars), inString))
{
#if DO_PARSE_BITFIELD_STRING_LOGS
CryLog("AutoEnum_GetEnumValFromString: Flag '%s' found in enum list as value %d", inString, i);
#endif
if (outVal)
(*outVal) = i;
done = true;
break;
}
}
CRY_ASSERT_MESSAGE(done, string().Format("No flag called '%s' in enum list", inString));
}
return done;
}
#ifndef _RELEASE
string AutoEnum_GetStringFromBitfield(TBitfield bitfield, const char ** inArray, int arraySize)
{
string output;
TBitfield checkThis = 1;
assert (arraySize > 0);
char skipThisString[32];
size_t skipChars = cry_copyStringUntilFindChar(skipThisString, inArray[0], sizeof(skipThisString), '_');
for (int i = 0; i < arraySize; ++ i, checkThis <<= 1)
{
if (bitfield & checkThis)
{
if (! output.empty())
{
output.append("|");
}
output.append(inArray[i] + skipChars);
}
}
return string().Format("%s%s", output.empty() ? "none" : output.c_str(), (bitfield >= checkThis) ? ", invalid bits found!" : "");
}
#endif