summaryrefslogtreecommitdiffstats
path: root/src/Common/Util.h
blob: 71d7b69dfd5bace6211b82a4673459017471843c (plain)
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
/*
 * Util.h
 *
 * Copyright (C) 2008 Matthias Schiffer <matthias@gamezock.de>
 *
 * This program is free software: you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by the
 * Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along
 * with this program. If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef MAD_COMMON_UTIL_H_
#define MAD_COMMON_UTIL_H_

#include <string>
#include <locale>
#include <vector>

namespace Mad {
namespace Common {

class Util {
  private:
    Util();

  public:
    static std::string tolower(const std::string &str) {
      std::string ret;

      for(std::string::const_iterator c = str.begin(); c != str.end(); ++c)
        ret += std::tolower(*c);

      return ret;
    }

    static std::string trim(const std::string &str) {
      size_t beg, end;

      beg = str.find_first_not_of(" \t");
      end = str.find_last_not_of(" \t");

      if(beg == std::string::npos)
        beg = 0;

      if(end != std::string::npos)
        end = end-beg+1;

      return str.substr(beg, end);
    }

    static std::vector<std::string> split(const std::string &str) {
      std::vector<std::string> ret;
      std::string temp;
      bool quoteSingle = false, quoteDouble = false, escape = false;

      size_t beg = 0;

      for(size_t cur = 0; cur < str.length(); ++cur) {
        if(!escape) {
          if(str[cur] == ' ' && !quoteSingle && !quoteDouble) {
            if(cur == beg && temp.empty()) {
              ++beg;
            }
            else {
              temp += str.substr(beg, cur-beg);
              ret.push_back(temp);
              temp.clear();
              beg = cur+1;
            }

            continue;
          }

          if(str[cur] == '"' && !quoteSingle) {
            temp += str.substr(beg, cur-beg);
            beg = cur+1;

            quoteDouble = !quoteDouble;
            continue;
          }
          if(str[cur] == '\'' && !quoteDouble) {
            temp += str.substr(beg, cur-beg);
            beg = cur+1;

            quoteSingle = !quoteSingle;
            continue;
          }

          if(str[cur] == '\\') {
            escape = true;
            continue;
          }
        }

        if(escape && ((!quoteSingle && !quoteDouble) || (quoteSingle && str[cur] == '\'') || (quoteDouble && (str[cur] == '"' || str[cur] == '\\')))) {
          temp += str.substr(beg, cur-beg-1);
          beg = cur;
        }

        escape = false;
      }

      temp += str.substr(beg, std::string::npos);
      ret.push_back(temp);

      return ret;
    }
};

}
}

#endif /* MAD_COMMON_UTIL_H_ */