|
- //
- // Lol Engine
- //
- // Copyright: (c) 2010-2014 Sam Hocevar <sam@hocevar.net>
- // This program is free software; you can redistribute it and/or
- // modify it under the terms of the Do What The Fuck You Want To
- // Public License, Version 2, as published by Sam Hocevar. See
- // http://www.wtfpl.net/ for more details.
- //
-
- #include <lol/engine-internal.h>
-
- namespace lol
- {
-
- /*
- * Safe enum helpers
- */
-
- map<int64_t, String> BuildEnumMap(String const &str, char const **custom)
- {
- return BuildEnumMap(str.C(), custom);
- }
- map<int64_t, String> BuildEnumMap(char const *str, char const **custom)
- {
- map<int64_t, String> ret;
- char const *parser = str;
- int64_t next_value = 0;
- int64_t cur_idx = 0;
-
- for (;;)
- {
- /* Find name */
- while (*parser == ' ' || *parser == ',')
- ++parser;
- if (!*parser)
- break;
-
- /* Parse name */
- char const *name = parser;
- while (*parser && *parser != ' ' && *parser != ',' && *parser != '=')
- ++parser;
- char const *name_end = parser;
-
- /* Find the value (if any) */
- uint64_t current_value = next_value;
- while (*parser == ' ' || *parser == '=')
- ++parser;
- if (*parser && *parser != ',')
- {
- #if defined _WIN32
- current_value = _strtoi64(parser, nullptr, 0);
- #else
- current_value = strtoll(parser, nullptr, 0);
- #endif
-
- while (*parser && *parser != ' ' && *parser != ',')
- ++parser;
- }
-
- /* Store in the map */
- ret[current_value] = (!custom) ? (String(name, (int)(name_end - name))) : (String(custom[cur_idx]));
- next_value = current_value + 1;
- cur_idx++;
- }
-
- return ret;
- }
-
- } /* namespace lol */
|