]> git.tdb.fi Git - libs/core.git/blob - source/utils.cpp
Add copyright notices and Id tags
[libs/core.git] / source / utils.cpp
1 /* $Id$
2
3 This file is part of libmspstrings
4 Copyright © 2006-2007 Mikko Rasa
5 Distributed under the LGPL
6 */
7
8 #include <list>
9 #include "utils.h"
10
11 using namespace std;
12
13 namespace Msp {
14
15 /**
16 Compares two strings, ignoring case.
17
18 @param   s1  First string
19 @param   s2  Second string
20
21 @return  -1 if s1<s2, 0 if s1==s2, 1 if s1>s2
22 */
23 int strcasecmp(const string &s1, const string &s2)
24 {
25         string::const_iterator i1=s1.begin();
26         string::const_iterator i2=s2.begin();
27         for(; (i1!=s1.end() && i2!=s2.end()); ++i1, ++i2)
28         {
29                 const char c1=::tolower(*i1);
30                 const char c2=::tolower(*i2);
31                 if(c1!=c2) return c1-c2;
32         }
33         if(i1!=s1.end()) return *i1;
34         if(i2!=s2.end()) return -*i2;
35         return 0;
36 }
37
38 /**
39 Returns a lowercase copy of the given string.
40 */
41 string tolower(const string &str)
42 {
43         string result(str);
44         transform(result.begin(), result.end(), result.begin(), ::tolower);
45         return result;
46 }
47
48 /**
49 Returns an uppercase copy of the given string.
50 */
51 string toupper(const string &str)
52 {
53         string result(str);
54         transform(result.begin(), result.end(), result.begin(), ::toupper);
55         return result;
56 }
57
58 /**
59 Splits a string to parts.
60
61 @param   str          String to be split
62 @param   sep          A set of separator characters
63 @param   allow_empty  Whether or not to produce empty parts for sequences of
64                       more than one separator character
65 */
66 vector<string> split(const string &str, const string &sep, bool allow_empty)
67 {
68         vector<string> result;
69         
70         unsigned start=0;
71         if(!allow_empty)
72                 start=str.find_first_not_of(sep);
73         
74         while(start<str.size())
75         {
76                 unsigned end=str.find_first_of(sep, start);
77                 result.push_back(str.substr(start, end-start));
78                 
79                 if(end==string::npos)
80                         break;
81                 
82                 if(allow_empty)
83                 {
84                         start=end+1;
85                         if(start==str.size())
86                                 result.push_back(string());
87                 }
88                 else
89                         start=str.find_first_not_of(sep, end);
90         }
91
92         return result;
93 }
94
95 vector<string> split(const string &str, char sep, bool allow_empty)
96 {
97         return split(str, string(1, sep), allow_empty);
98 }
99
100 /**
101 Builds a single string from the strings in the given sequence by concatenating
102 them.
103
104 @param  seq  A sequence of strings
105 @param  sep  Separator to be inserted between strings
106 */
107 template<typename T>
108 string join(const T &seq, const string &sep)
109 {
110         string result;
111         for(typename T::const_iterator i=seq.begin(); i!=seq.end(); ++i)
112         {
113                 if(i!=seq.begin())
114                         result+=sep;
115                 result+=*i;
116         }
117
118         return result;
119 }
120 template string join<list<string> >(const list<string> &, const string &);
121 template string join<vector<string> >(const vector<string> &, const string &);
122
123 /**
124 Returns a copy of the given string with leading and trailing whitespace
125 removed.
126 */
127 string strip(const string &s)
128 {
129         string result=s;
130         if(!result.erase(0, result.find_first_not_of(" \t\n")).empty())
131                 result.erase(result.find_last_not_of(" \t\n")+1);
132         return result;
133 }
134
135 } // namespace Msp