#include <config.h>
#include <algorithm>
+
+#ifdef __GLIBCPP__
+#include <ctype.h>
+#else
#include <cctype>
-#include <cstdio>
+#endif
#include <cstdlib>
+#ifdef HAVE_SSTREAM
+#include <sstream>
+#else
+#include <strstream>
+#endif
+using std::ostringstream;
+
#include "LString.h"
#include "lstrings.h"
#include "LRegex.h"
using std::count;
using std::transform;
+using std::tolower;
+using std::toupper;
+
+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)
{
-#if 0
- string tmp;
- string::const_iterator cit = a.begin();
- for(; cit != a.end(); ++cit) {
- tmp += static_cast<char>(tolower(*cit));
- }
- return tmp;
-#endif
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 uppercase(string const & a)
{
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;
}
string tostr(long i)
{
- // should use string stream
+#ifndef HAVE_SSTREAM
+ // "Hey!", you say. "Why do we need the char str[30]?".
+ // Since strstream does not handle memory for us we have to do
+ // that ourselves, if we don't pass str in we have to capture
+ // oss.str() in a tmp variable and delete that manually.
+ // Thus we then require more temporary variables and the code
+ // gets more obfuscated.
char str[30];
- sprintf(str, "%ld", i);
- return string(str);
+ ostrstream oss(str, 30);
+ oss << i << '\0';
+ return oss.str();
+#else
+ ostringstream oss;
+ oss << i;
+ return oss.str().c_str();
+#endif
}
string tostr(unsigned long i)
{
- // should use string stream
+#ifndef HAVE_SSTREAM
char str[30];
- sprintf(str, "%lu", i);
- return string(str);
+ ostrstream oss(str, 30);
+ oss << i << '\0';
+ return oss.str();
+#else
+ ostringstream oss;
+ oss << i;
+ return oss.str().c_str();
+#endif
}
}
-#if 0
-string tostr(float f)
-{
- return tostr(double(f));
-}
-#endif
-
-
string tostr(double d)
{
- // should use string stream
+#ifndef HAVE_SSTREAM
char tmp[40];
- sprintf(tmp, "%f", d);
- return string(tmp);
+ ostrstream oss(tmp, 40);
+ oss << d << '\0';
+ return oss.str();
+#else
+ ostringstream oss;
+ oss << d;
+ return oss.str().c_str();
+#endif
}
}
-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
}