| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318 |
- #include <OgreStringConverter.h>
- #include "core/Utilites.h"
- const Ogre::String
- CreateAutoName(const Ogre::String prefix)
- {
- static int enumerator = 0;
- return prefix + Ogre::StringConverter::toString(enumerator++);
- }
- struct KeyName
- {
- Ogre::String name;
- OIS::KeyCode key;
- };
- KeyName key_names[] =
- {
- {"Enter", OIS::KC_RETURN},
- {"Escape", OIS::KC_ESCAPE},
- {"Space", OIS::KC_SPACE},
- {"LShift", OIS::KC_LSHIFT},
- {"RShift", OIS::KC_RSHIFT},
- {"LCtrl", OIS::KC_LCONTROL},
- {"RCtrl", OIS::KC_RCONTROL},
- {"LAlt", OIS::KC_LMENU},
- {"RAlt", OIS::KC_RMENU},
- {"0", OIS::KC_0},
- {"1", OIS::KC_1},
- {"2", OIS::KC_2},
- {"3", OIS::KC_3},
- {"4", OIS::KC_4},
- {"5", OIS::KC_5},
- {"6", OIS::KC_6},
- {"7", OIS::KC_7},
- {"8", OIS::KC_8},
- {"9", OIS::KC_9},
- {"A", OIS::KC_A},
- {"B", OIS::KC_B},
- {"C", OIS::KC_C},
- {"D", OIS::KC_D},
- {"E", OIS::KC_E},
- {"F", OIS::KC_F},
- {"G", OIS::KC_G},
- {"H", OIS::KC_H},
- {"I", OIS::KC_I},
- {"J", OIS::KC_J},
- {"K", OIS::KC_K},
- {"L", OIS::KC_L},
- {"M", OIS::KC_M},
- {"N", OIS::KC_N},
- {"O", OIS::KC_O},
- {"P", OIS::KC_P},
- {"Q", OIS::KC_Q},
- {"R", OIS::KC_R},
- {"S", OIS::KC_S},
- {"T", OIS::KC_T},
- {"U", OIS::KC_U},
- {"V", OIS::KC_V},
- {"W", OIS::KC_W},
- {"X", OIS::KC_X},
- {"Y", OIS::KC_Y},
- {"Z", OIS::KC_Z},
- {"Left", OIS::KC_LEFT},
- {"Up", OIS::KC_UP},
- {"Down", OIS::KC_DOWN},
- {"Right", OIS::KC_RIGHT},
- {"Num0", OIS::KC_NUMPAD0},
- {"Num1", OIS::KC_NUMPAD1},
- {"Num2", OIS::KC_NUMPAD2},
- {"Num3", OIS::KC_NUMPAD3},
- {"Num4", OIS::KC_NUMPAD4},
- {"Num5", OIS::KC_NUMPAD5},
- {"Num6", OIS::KC_NUMPAD6},
- {"Num7", OIS::KC_NUMPAD7},
- {"Num8", OIS::KC_NUMPAD8},
- {"Num9", OIS::KC_NUMPAD9},
- {"NumLock", OIS::KC_NUMLOCK},
- {"NumDiv", OIS::KC_DIVIDE},
- {"NumMult", OIS::KC_MULTIPLY},
- {"NumSub", OIS::KC_SUBTRACT},
- {"NumAdd", OIS::KC_ADD},
- {"NumEnter", OIS::KC_NUMPADENTER},
- {"NumDec", OIS::KC_DECIMAL},
- {"F1", OIS::KC_F1},
- {"F2", OIS::KC_F2},
- {"F3", OIS::KC_F3},
- {"F4", OIS::KC_F4},
- {"F5", OIS::KC_F5},
- {"F6", OIS::KC_F6},
- {"F7", OIS::KC_F7},
- {"F8", OIS::KC_F8},
- {"F9", OIS::KC_F9},
- {"F10", OIS::KC_F10},
- {"F11", OIS::KC_F11},
- {"F12", OIS::KC_F12},
- {"UNASSIGNED", OIS::KC_UNASSIGNED},
- };
- Ogre::String
- KeyToString(OIS::KeyCode key)
- {
- // find string by key
- for(KeyName* kn = key_names; kn->name != "UNASSIGNED"; ++kn)
- {
- if(kn->key == key)
- {
- return kn->name;
- }
- }
- return "UNASSIGNED";
- }
- OIS::KeyCode
- StringToKey(const Ogre::String& str)
- {
- if(str == "")
- {
- return OIS::KC_UNASSIGNED;
- }
- // find key by string
- for(KeyName* kn = key_names; kn->name != "UNASSIGNED"; ++kn)
- {
- if(kn->name == str)
- {
- return kn->key;
- }
- }
- return OIS::KC_UNASSIGNED;
- }
- Ogre::StringVector
- StringTokenise(const Ogre::String& str, const Ogre::String& delimiters, const Ogre::String& delimiters_preserve, const Ogre::String& quote, const Ogre::String& esc)
- {
- Ogre::StringVector ret;
- Ogre::String::size_type pos = 0; // the current position (char) in the string
- char ch = 0; // buffer for the current character
- char delimiter = 0; // the buffer for the delimiter char which
- // will be added to the tokens if the delimiter
- // is preserved
- char current_quote = 0; // the char of the current open quote
- bool quoted = false; // indicator if there is an open quote
- Ogre::String token; // string buffer for the token
- bool token_complete = false; // indicates if the current token is
- // read to be added to the result vector
- Ogre::String::size_type len = str.length(); // length of the input-string
- // for every char in the input-string
- while(len > pos)
- {
- // get the character of the string and reset the delimiter buffer
- ch = str.at(pos);
- delimiter = 0;
- // assume ch isn't a delimiter
- bool add_char = true;
- // check ...
- // ... if the delimiter is an escaped character
- bool escaped = false; // indicates if the next char is protected
- if(esc.empty() == false) // check if esc-chars are provided
- {
- if(esc.find_first_of(ch) != std::string::npos)
- {
- // get the escaped char
- ++pos;
- if(pos < len) // if there are more chars left
- {
- // get the next one
- ch = str.at(pos);
- // add the escaped character to the token
- add_char = true;
- }
- else // cannot get any more characters
- {
- // don't add the esc-char
- add_char = false;
- }
- // ignore the remaining delimiter checks
- escaped = true;
- }
- }
- // ... if the delimiter is a quote
- if(quote.empty() == false && escaped == false)
- {
- // if quote chars are provided and the char isn't protected
- if(quote.find_first_of(ch) != std::string::npos)
- {
- // if not quoted, set state to open quote and set
- // the quote character
- if(quoted == false)
- {
- quoted = true;
- current_quote = ch;
- // don't add the quote-char to the token
- add_char = false;
- }
- else // if quote is open already
- {
- // check if it is the matching character to close it
- if(current_quote == ch)
- {
- // close quote and reset the quote character
- quoted = false;
- current_quote = 0;
- // don't add the quote-char to the token
- add_char = false;
- }
- }
- }
- }
- // if the delimiter isn't preserved
- if(delimiters.empty() == false && escaped == false && quoted == false)
- {
- // if a delimiter is provided and the char isn't protected by
- // quote or escape char
- if(delimiters.find_first_of(ch) != std::string::npos)
- {
- // if ch is a delimiter and the token string isn't empty
- // the token is complete
- if(token.empty() == false)
- {
- token_complete = true;
- }
- // don't add the delimiter to the token
- add_char = false;
- }
- }
- // if the delimiter is preserved - add it as a token
- bool add_delimiter = false;
- if(delimiters_preserve.empty() == false && escaped == false && quoted == false)
- {
- // if a delimiter which will be preserved is provided and the
- // char isn't protected by quote or escape char
- if(delimiters_preserve.find_first_of(ch) != std::string::npos)
- {
- // if ch is a delimiter and the token string isn't empty the token is complete
- if(token.empty() == false)
- {
- token_complete = true;
- }
- // don't add the delimiter to the token
- add_char = false;
- // add the delimiter
- delimiter = ch;
- add_delimiter = true;
- }
- }
- // add the character to the token
- if(add_char == true)
- {
- // add the current char
- token.push_back(ch);
- }
- // add the token if it is complete
- if(token_complete == true && token.empty() == false)
- {
- // add the token string
- ret.push_back(token);
- // clear the contents
- token.clear();
- // build the next token
- token_complete = false;
- }
- // add the delimiter
- if(add_delimiter == true)
- {
- // the next token is the delimiter
- Ogre::String delim_token;
- delim_token.push_back(delimiter);
- ret.push_back(delim_token);
- }
- // repeat for the next character
- ++pos;
- }
- // add the final token
- if(token.empty() == false)
- {
- ret.push_back(token);
- }
- return ret;
- }
|