#include <config.h>
#include <algorithm>
+
#include <cctype>
-#include <cstdio>
#include <cstdlib>
#include "LString.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)
{
string lowercase(string const & a)
{
- string tmp;
- string::const_iterator cit = a.begin();
- for(; cit != a.end(); ++cit) {
- tmp += static_cast<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)
+string uppercase(string const & a)
{
- return string(1, c);
-}
-
-string tostr(bool b)
-{
- return b ? "true" : "false";
-}
-
-#if 0
-string tostr(float f)
-{
- return tostr(double(f));
-}
-#endif
-
-string tostr(double d)
-{
- 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;
}
}
-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
}
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;
}