--- a
+++ b/src/utils/smallut.cpp
@@ -0,0 +1,148 @@
+#ifndef lint
+static char rcsid[] = "@(#$Id: smallut.cpp,v 1.1 2005-01-31 14:31:10 dockes Exp $ (C) 2004 J.F.Dockes";
+#endif
+
+#ifndef TEST_SMALLUT
+#include <string>
+#include "smallut.h"
+
+#include <ctype.h>
+
+#define MIN(A,B) ((A)<(B)?(A):(B))
+
+int stringicmp(const string & s1, const string& s2) 
+{
+    string::const_iterator it1 = s1.begin();
+    string::const_iterator it2 = s2.begin();
+    int size1 = s1.length(), size2 = s2.length();
+    char c1, c2;
+
+    if (size1 > size2) {
+	while (it1 != s1.end()) { 
+	    c1 = ::toupper(*it1);
+	    c2 = ::toupper(*it2);
+	    if (c1 != c2) {
+		return c1 > c2 ? 1 : -1;
+	    }
+	    ++it1; ++it2;
+	}
+	return size1 == size2 ? 0 : 1;
+    } else {
+	while (it2 != s2.end()) { 
+	    c1 = ::toupper(*it1);
+	    c2 = ::toupper(*it2);
+	    if (c1 != c2) {
+		return c1 > c2 ? 1 : -1;
+	    }
+	    ++it1; ++it2;
+	}
+	return size1 == size2 ? 0 : -1;
+    }
+}
+
+//  s1 is already lowercase
+int stringlowercmp(const string & s1, const string& s2) 
+{
+    string::const_iterator it1 = s1.begin();
+    string::const_iterator it2 = s2.begin();
+    int size1 = s1.length(), size2 = s2.length();
+    char c2;
+
+    if (size1 > size2) {
+	while (it1 != s1.end()) { 
+	    c2 = ::tolower(*it2);
+	    if (*it1 != c2) {
+		return *it1 > c2 ? 1 : -1;
+	    }
+	    ++it1; ++it2;
+	}
+	return size1 == size2 ? 0 : 1;
+    } else {
+	while (it2 != s2.end()) { 
+	    c2 = ::tolower(*it2);
+	    if (*it1 != c2) {
+		return *it1 > c2 ? 1 : -1;
+	    }
+	    ++it1; ++it2;
+	}
+	return size1 == size2 ? 0 : -1;
+    }
+}
+
+//  s1 is already uppercase
+int stringuppercmp(const string & s1, const string& s2) 
+{
+    string::const_iterator it1 = s1.begin();
+    string::const_iterator it2 = s2.begin();
+    int size1 = s1.length(), size2 = s2.length();
+    char c2;
+
+    if (size1 > size2) {
+	while (it1 != s1.end()) { 
+	    c2 = ::toupper(*it2);
+	    if (*it1 != c2) {
+		return *it1 > c2 ? 1 : -1;
+	    }
+	    ++it1; ++it2;
+	}
+	return size1 == size2 ? 0 : 1;
+    } else {
+	while (it2 != s2.end()) { 
+	    c2 = ::toupper(*it2);
+	    if (*it1 != c2) {
+		return *it1 > c2 ? 1 : -1;
+	    }
+	    ++it1; ++it2;
+	}
+	return size1 == size2 ? 0 : -1;
+    }
+}
+
+#else
+
+#include <string>
+#include "smallut.h"
+
+struct spair {
+    const char *s1;
+    const char *s2;
+};
+struct spair pairs[] = {
+    {"", ""},
+    {"", "a"},
+    {"a", ""},
+    {"a", "a"},
+    {"A", "a"},
+    {"a", "A"},
+    {"A", "A"},
+    {"12", "12"},
+    {"a", "ab"},
+    {"ab", "a"},
+    {"A", "Ab"},
+    {"a", "Ab"},
+};
+int npairs = sizeof(pairs) / sizeof(struct spair);
+
+int main(int argc, char **argv)
+{
+    for (int i = 0; i < npairs; i++) {
+	{
+	    int c = stringicmp(pairs[i].s1, pairs[i].s2);
+	    printf("'%s' %s '%s' ", pairs[i].s1, 
+		   c == 0 ? "==" : c < 0 ? "<" : ">", pairs[i].s2);
+	}
+	{
+	    int cl = stringlowercmp(pairs[i].s1, pairs[i].s2);
+	    printf("L '%s' %s '%s' ", pairs[i].s1, 
+		   cl == 0 ? "==" : cl < 0 ? "<" : ">", pairs[i].s2);
+	}
+	{
+	    int cu = stringuppercmp(pairs[i].s1, pairs[i].s2);
+	    printf("U '%s' %s '%s' ", pairs[i].s1, 
+		   cu == 0 ? "==" : cu < 0 ? "<" : ">", pairs[i].s2);
+	}
+	printf("\n");
+    }
+}
+
+#endif