#include <config.h>
#include <algorithm>
+
#include <cctype>
-#include <cstdio>
#include <cstdlib>
#include "LString.h"
#include "lstrings.h"
-
-//#include "debug.h"
+#include "LRegex.h"
using std::count;
+using std::transform;
+#ifndef __GLIBCPP__
+// The new glibstdc++-v3 has not worked out all the quirks regarding cctype
+// yet. So currently it failes if the to using lines below are stated.
+using std::tolower;
+using std::toupper;
+#endif
+
+int compare_no_case(string const & s, string const & s2)
+{
+ // ANSI C
+ string::const_iterator p = s.begin();
+ string::const_iterator p2 = s2.begin();
+
+ while (p != s.end() && p2 != s2.end()) {
+ int const lc1 = tolower(*p);
+ int const lc2 = tolower(*p2);
+ if (lc1 != lc2)
+ return (lc1 < lc2) ? -1 : 1;
+ ++p;
+ ++p2;
+ }
+
+ if (s.size() == s2.size())
+ return 0;
+ if (s.size() < s2.size())
+ return -1;
+ return 1;
+}
+
+
+int compare_no_case(string const & s, string const & s2, unsigned int len)
+{
+//#warning verify this func please
+ string::const_iterator p = s.begin();
+ string::const_iterator p2 = s2.begin();
+ unsigned int i = 0;
+ while (i < len && p != s.end() && p2 != s2.end()) {
+ int const lc1 = tolower(*p);
+ int const lc2 = tolower(*p2);
+ if (lc1 != lc2)
+ return (lc1 < lc2) ? -1 : 1;
+ ++i;
+ ++p;
+ ++p2;
+ }
+ if (s.size() == s2.size())
+ return 0;
+ if (s.size() < s2.size())
+ return -1;
+ return 1;
+}
+
bool isStrInt(string const & str)
{
}
-int LStr2Int(string const & str)
+int strToInt(string const & str)
{
string tmpstr;
string lowercase(string const & a)
{
- string tmp;
- string::const_iterator cit = a.begin();
- for(; cit != a.end(); ++cit) {
- tmp += char(tolower(*cit));
+ string tmp(a);
+//#ifdef __GLIBCPP__
+ string::iterator result = tmp.begin();
+ for (string::iterator first = tmp.begin();
+ first != tmp.end(); ++first, ++result) {
+ *result = tolower(*first);
}
+//#else
+// transform(tmp.begin(), tmp.end(), tmp.begin(), tolower);
+//#endif
return tmp;
}
-string tostr(long i)
-{
- char str[30];
- sprintf(str, "%ld", i);
- return string(str);
-}
-
-string tostr(unsigned long i)
-{
- char str[30];
- sprintf(str, "%lu", i);
- return string(str);
-}
-
-string tostr(void * v)
-{
- return tostr(long(v));
-}
-
-
-string tostr(int i)
-{
- return tostr(long(i));
-}
-
-string tostr(unsigned int ui)
-{
- return tostr(long(ui));
-}
-
-string tostr(char c)
-{
- return tostr(long(c));
-}
-
-string tostr(bool b)
-{
- return b ? "true" : "false";
-}
-
-#if 0
-string tostr(float f)
-{
- return tostr(double(f));
-}
-#endif
-
-string tostr(double d)
+string uppercase(string const & a)
{
- char tmp[40];
- sprintf(tmp, "%f", d);
- return string(tmp);
+ string tmp(a);
+//#ifdef __GLIBCPP__
+ string::iterator result = tmp.begin();
+ for (string::iterator first = tmp.begin();
+ first != tmp.end(); ++first, ++result) {
+ *result = toupper(*first);
+ }
+//#else
+// transform(tmp.begin(), tmp.end(), tmp.begin(), toupper);
+//#endif
+ return tmp;
}
bool suffixIs(string const & a, char c)
{
if (a.empty()) return false;
- return a[a.length()-1] == c;
+ return a[a.length() - 1] == c;
}
}
-int countChar(string const & a, char const c)
+unsigned int countChar(string const & a, char const c)
{
+#ifdef HAVE_STD_COUNT
+ return count(a.begin(), a.end(), c);
+#else
unsigned int n = 0;
count(a.begin(), a.end(), c, n);
return n;
+#endif
}
while (!str.empty()) {
str = split(str, tmptok, delim);
- if (tok==tmptok)
+ if (tok == tmptok)
return i;
++i;
}
bool regexMatch(string const & a, string const & pattern)
{
- if (pattern.empty())
- return true;
- if (a.empty())
- return false;
-
- string::size_type si=0, pi=0;
- string::size_type const sl = a.length();
- string::size_type const pl = pattern.length();
-
- while (si < sl && pi < pl) {
- if (pattern[pi]=='*') {
- // Skip all consequtive *s
- while (pattern[pi] == '*') {
- ++pi;
- if (pi == pl)
- return true;
- }
-
- // Get next chunk of pattern to match
- string chunk;
- string temp =
- split(pattern.substr(pi, pl-1), chunk, '*');
-
- if (!chunk.empty() && pattern[pl-1] == '*' &&
- temp.empty())
- temp = '*';
-
- if (temp.empty()) {
- // Last chunk, see if tail matches
- if (sl < chunk.length()) {
- return false;
- }
- temp = a.substr(sl - chunk.length(), sl - 1);
- return temp == chunk;
- } else {
- // Middle chunk, see if we can find a match
- bool match = false;
- while (!match && si<sl) {
- temp = a.substr(si, sl - 1);
- match = prefixIs(temp, chunk.c_str());
- ++si;
- };
- if (!match)
- return false;
- si += chunk.length()-1;
- pi += chunk.length();
- if (si==sl && pi==pl-1)
- return true;
- }
- } else if (a[si++] != pattern[pi++]) {
- return false;
- }
- }
- if (pi < pl || si < sl)
- return false;
- return true;
+ // We massage the pattern a bit so that the usual
+ // shell pattern we all are used to will work.
+ // One nice thing about using a real regex is that
+ // things like "*.*[^~]" will work also.
+ // build the regex string.
+ string regex(pattern);
+ regex = subst(regex, ".", "\\.");
+ regex = subst(regex, "*", ".*");
+ LRegex reg(regex);
+ return reg.exact_match(a);
}
string subst(string const & a,
- char const * oldstr, string const & newstr)
+ char const * oldstr, string const & newstr)
{
string lstr(a);
string::size_type i = 0;
if (i != string::npos)
tmp.erase(i + 1, string::npos);
else
- tmp.clear(); // only c in the whole string
+ tmp.erase(); // only c in the whole string
return tmp;
}
piece = a.substr(0, i);
tmp = a.substr(i + 1);
} else if (i == 0) {
- piece.clear();
+ piece.erase();
tmp = a.substr(i + 1);
} else {
piece = a;
piece = a.substr(0, i);
tmp = a.substr(i + 1);
} else { // delimter was not found
- piece.clear();
+ piece.erase();
}
return tmp;
}