fork download
  1. #include <iostream>
  2. #include <iterator>
  3. #include <type_traits>
  4. #include <tuple>
  5. #include <vector>
  6. #include <string>
  7. #include <algorithm>
  8.  
  9. std::vector<std::string> tokenizeLine(const std::string str)
  10. {
  11. std::vector<std::string> tokens;
  12.  
  13. std::string::size_type start = 0;
  14. std::string::size_type end = 0;
  15. while (end != std::string::npos)
  16. {
  17. enum POSES // Deliminators
  18. {
  19. EQUALS,
  20. OPEN,
  21. CLOSE,
  22. SPACE,
  23. EOL,
  24. RETURN,
  25. TAB,
  26. COMMENT,
  27. POSES_SIZE
  28. };
  29. std::string::size_type pos[] =
  30. {
  31. str.find('=', start),
  32. str.find('{', start),
  33. str.find('}', start),
  34. str.find(' ', start),
  35. str.find('\n', start),
  36. str.find('\r', start),
  37. str.find('\t', start),
  38. str.find('#', start)
  39. };
  40. end = *std::min_element(pos, &pos[POSES_SIZE]);
  41.  
  42. switch (str[start])
  43. {
  44. case('=') :
  45. tokens.push_back("=");
  46. break;
  47. case('{') :
  48. tokens.push_back("{");
  49. break;
  50. case('}') :
  51. tokens.push_back("}");
  52. break;
  53. case(' ') :
  54. case('\n') :
  55. case('\r') :
  56. case('\t'):
  57. break;
  58. case('#') :
  59. return tokens;
  60. break;
  61. default:
  62. if (str.substr(start, end - start).length() > 0)
  63. {
  64. tokens.push_back(str.substr(start, end - start));
  65. --end;
  66. }
  67. }
  68.  
  69. // If at end, use start=maxSize. Else use start=end+delimiter.
  70. start = ((end > (std::string::npos - sizeof(char)))
  71. ? std::string::npos : end + sizeof(char));
  72. }
  73. return tokens;
  74. }
  75.  
  76. int main()
  77. {
  78. auto ans = tokenizeLine("show_position = { x=-9 y =78 }");
  79. std::ostream_iterator<std::string> o(std::cout, "\n");
  80. std::copy(ans.begin(), ans.end(), o);
  81. return 0;
  82. }
Success #stdin #stdout 0s 3464KB
stdin
Standard input is empty
stdout
show_position
=
{
x
=
-9
y
=
78
}