Thanks to the creators of the algorithms.
 */
 
-#ifdef __GNUG__
-#pragma implementation
-#endif
 #include <Integer.h>
 //#include <std.h>
 #include <ctype.h>
 
 */
 
 #ifndef _Integer_h
-#ifdef __GNUG__
-#pragma interface
-#endif
 #define _Integer_h 1
 
 #include <iostream>
 
    // Adding Strings and SuperStrings
 
    friend SuperString operator+(const SuperString&, const String&);
+   friend SuperString operator+(const String&, const SuperString&);
+   friend SuperString operator+(const SuperString&, const SuperString&);
    SuperString& operator+=(const String&);
+
+   /*
+    *   SuperString comparison tests
+    */
+
+   friend int operator==(const SuperString& x, const SuperString& y)
+   {
+      return x._ss == y._ss;
+   }
+
+   friend int operator!=(const SuperString& x, const SuperString& y)
+   {
+      return x._ss != y._ss;
+   }
+
+   friend int operator<=(const SuperString& x, const SuperString& y)
+   {
+      return x._ss <= y._ss;
+   }
+
+   friend int operator>=(const SuperString& x, const SuperString& y)
+   {
+      return x._ss >= y._ss;
+   }
+
+   friend int operator<(const SuperString& x, const SuperString& y)
+   {
+      return x._ss < y._ss;
+   }
+
+   friend int operator>(const SuperString& x, const SuperString& y)
+   {
+      return x._ss > y._ss;
+   }
+
 };
 
 #endif  /* STRING_H */
 
 
 
 #ifndef _builtin_h
-#ifdef __GNUG__
-#pragma interface
-#endif
 #define _builtin_h 1
 
 //#include <_G_config.h>
 
 ********************************
 **      ORIGINAL AUTHOR : Arjen Baart - arjen@andromeda.nl
 **      CREATION DATE   : Nov 17, 1997
-**      LAST UPDATE     : Nov 30, 2003
-**      MODIFICATIONS   : 
+**      LAST UPDATE     : Jun 12, 2020
 **************************************************************************/
 
-/*****************************
-   $Log: string.cpp,v $
-   Revision 1.5  2007-05-04 13:55:18  arjen
-   Dynamically allocate more memory if the string buffer runs out of space when
-   reading a String object from an input stream.
-
-   Revision 1.4  2003/03/29 07:18:54  arjen
-   String constructor and assignment from char * are more robust fro NULL pointers.
-
-   Revision 1.3  2002/11/03 13:18:57  arjen
-   New functions - String::escape() and String::unescape()
-
-   Revision 1.2  2002/09/28 06:42:11  arjen
-   A few small bug fixes.
-
-   Revision 1.1  2002/07/25 08:01:27  arjen
-   First checkin, AXE release 0.2
-
-*****************************/
-
-static const char RCSID[] = "$Id: string.cpp,v 1.5 2007-05-04 13:55:18 arjen Exp $";
-
 #include <stdio.h>
 #include <ctype.h>
 #include "String.h"
 
 
 // Addition operators
 
+SuperString operator+(const SuperString& sx, const SuperString& sy)
+{
+   SuperString sum;
+
+   return sum;
+}
+
 SuperString operator+(const SuperString& ss, const String& s)
 {
    SuperString SS(ss);
    return SS;
 }
 
+SuperString operator+(const String& s, const SuperString& ss)
+{
+   SuperString sum;
+
+   return sum;
+}
+
 SuperString& SuperString::operator+=(const String& x)
 {
    _ss.push_back(x);
 
 LDADD = ../src/.libs/libACL.la
 check_PROGRAMS = string_assign string_basics string_compare string_cat string_convert string_modify \
                  string_shift string_substring string_regex \
-                 superstring_assign superstring_basics superstring_cat string_split_join \
+                 superstring_assign superstring_basics superstring_cat superstring_compare string_split_join \
                  date_assign date_parse date_compare date_arithmetic date_attributes date_check_today \
                  hour_assign hour_parse hour_compare hour_arithmetic hour_check_now \
                  utc_assign utc_parse utc_compare utc_arithmetic utc_convert \
 string_substring_SOURCES   = string_substring.cpp
 string_regex_SOURCES       = string_regex.cpp
 
-superstring_assign_SOURCES  = superstring_assign.cpp
-superstring_basics_SOURCES  = superstring_basics.cpp
-superstring_cat_SOURCES     = superstring_cat.cpp
-string_split_join_SOURCES   = string_split_join.cpp
+superstring_assign_SOURCES      = superstring_assign.cpp
+superstring_basics_SOURCES      = superstring_basics.cpp
+superstring_cat_SOURCES         = superstring_cat.cpp
+superstring_compare_SOURCES     = superstring_compare.cpp
+string_split_join_SOURCES       = string_split_join.cpp
 
 date_assign_SOURCES        = date_assign.cpp
 date_parse_SOURCES         = date_parse.cpp
 
 
 int main()
 {
-   // Add a String to a SuperString, + operator
+   // Add a String to a SuperString, + operator(SuperString, String)
 
    SuperString ss0;
 
    print_ss(ss2);
    std::cout << "\n";
 
+   // Add a String to a SuperString, + operator(String, SuperString)
+
+   SuperString ss4;
+
+   String s5("abc");
+   String s6("def");
+   SuperString ss5(s5);
+
+   ss4 = s6 + ss5;
+
+   std::cout << s6 << " + ";
+   print_ss(ss5);
+   std::cout << " = ";
+   print_ss(ss4);
+   std::cout << "\n";
+
+   // Add a SuperString  to a SuperString, + operator(SuperString, SuperString)
+ 
+   SuperString  ss7(2);
+   SuperString  ss8(2);
+   SuperString  ss9;
+
+   ss7[0] = "abc";
+   ss7[1] = "def";
+   ss8[0] = "uvw";
+   ss8[1] = "xyz";
+
+   ss9 = ss7 + ss8;
+
+   print_ss(ss7);
+   std::cout << " + ";
+   print_ss(ss8);
+   std::cout << " = ";
+   print_ss(ss9);
+   std::cout << "\n";
+
    return 0;
 }
 
 
--- /dev/null
+/*******************************************************
+ *  Unit test for the SuperString class
+ *
+ * test relational operators
+ ******************************************************
+ *
+ */
+
+#include "String.h"
+#include <assert.h>
+
+void print_ss(SuperString ss)
+{
+   std::cout << "[";
+   for (int i = 0; i < ~ss; i++)
+   {
+      if (i != 0)
+         std::cout << ",";
+      std::cout << "\"" << ss[i] << "\"";
+   }
+   std::cout << "]";
+}
+
+int main()
+{
+   String s1("abcdef");
+   String s2("abcdef");
+   String s3("vwuxyz");
+
+   SuperString ss1(s1);
+   SuperString ss2(s2);
+   SuperString ss3(s3);
+
+   print_ss(ss1);
+   std::cout << " == ";
+   print_ss(ss2);
+   std::cout << " = " << (ss1 == ss2)  << "\n";
+   assert((ss1 == ss2) == true);
+
+   print_ss(ss1);
+   std::cout << " == ";
+   print_ss(ss3);
+   std::cout << " = " << (ss1 == ss3)  << "\n";
+   assert((ss1 == ss3) == false);
+
+   print_ss(ss1);
+   std::cout << " != ";
+   print_ss(ss2);
+   std::cout << " = " << (ss1 != ss2)  << "\n";
+   assert((ss1 != ss2) == false);
+
+   print_ss(ss1);
+   std::cout << " != ";
+   print_ss(ss3);
+   std::cout << " = " << (ss1 != ss3)  << "\n";
+   assert((ss1 != ss3) == true);
+
+   print_ss(ss1);
+   std::cout << " < ";
+   print_ss(ss2);
+   std::cout << " = " << (ss1 < ss2)  << "\n";
+   assert((ss1 < ss2) == false);
+
+   print_ss(ss1);
+   std::cout << " < ";
+   print_ss(ss3);
+   std::cout << " = " << (ss1 < ss3)  << "\n";
+   assert((ss1 < ss3) == true);
+
+   print_ss(ss3);
+   std::cout << " < ";
+   print_ss(ss1);
+   std::cout << " = " << (ss3 < ss1)  << "\n";
+   assert((ss3 < ss1) == false);
+
+   print_ss(ss1);
+   std::cout << " > ";
+   print_ss(ss2);
+   std::cout << " = " << (ss1 > ss2)  << "\n";
+   assert((ss1 > ss2) == false);
+
+   print_ss(ss1);
+   std::cout << " > ";
+   print_ss(ss3);
+   std::cout << " = " << (ss1 > ss3)  << "\n";
+   assert((ss1 > ss3) == false);
+
+   print_ss(ss3);
+   std::cout << " > ";
+   print_ss(ss1);
+   std::cout << " = " << (ss3 > ss1)  << "\n";
+   assert((ss3 > ss1) == true);
+
+   print_ss(ss1);
+   std::cout << " <= ";
+   print_ss(ss2);
+   std::cout << " = " << (ss1 <= ss2)  << "\n";
+   assert((ss1 <= ss2) == true);
+
+   print_ss(ss1);
+   std::cout << " <= ";
+   print_ss(ss3);
+   std::cout << " = " << (ss1 <= ss3)  << "\n";
+   assert((ss1 <= ss3) == true);
+
+   print_ss(ss3);
+   std::cout << " <= ";
+   print_ss(ss1);
+   std::cout << " = " << (ss3 <= ss1)  << "\n";
+   assert((ss3 <= ss1) == false);
+
+   print_ss(ss1);
+   std::cout << " >= ";
+   print_ss(ss2);
+   std::cout << " = " << (ss1 >= ss2)  << "\n";
+   assert((ss1 >= ss2) == true);
+
+   print_ss(ss1);
+   std::cout << " >= ";
+   print_ss(ss3);
+   std::cout << " = " << (ss1 >= ss3)  << "\n";
+   assert((ss1 >= ss3) == false);
+
+   print_ss(ss3);
+   std::cout << " >= ";
+   print_ss(ss1);
+   std::cout << " = " << (ss3 >= ss1)  << "\n";
+   assert((ss3 >= ss1) == true);
+
+
+   return 0;
+}
+