// ------------------------------- //
// -------- Start of File -------- //
// ------------------------------- //
// ----------------------------------------------------------- //
// C++ Source Code File Name: testprog.cpp
// C++ Compiler Used: MSVC, BCC32, GCC, HPUX aCC, SOLARIS CC
// Produced By: DataReel Software Development Team
// File Creation Date: 11/29/1996
// Date Last Modified: 06/17/2016
// Copyright (c) 2001-2024 DataReel Software Development
// ----------------------------------------------------------- //
// ------------- Program Description and Details ------------- //
// ----------------------------------------------------------- //
/*
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
USA
This is a test program for the gxString class.
*/
// ----------------------------------------------------------- //
#include "gxdlcode.h"
#if defined (__USE_ANSI_CPP__) // Use the ANSI Standard C++ library
#include <iostream>
using namespace std; // Use unqualified names for Standard C++ library
#else // Use the old iostream library by default
#include <iostream.h>
#endif // __USE_ANSI_CPP__
#include "gxstring.h"
#ifdef __MSVC_DEBUG__
#include "leaktest.h"
#endif
void PausePrg()
{
#ifndef __AUTORUN_TESTPROG__
cout << "\n";
cout << "Press enter to continue..." << "\n";
cin.get();
#endif
}
void ASCIIStringTest()
{
cout << "Testing all ASCII string class functions..." << "\n";
PausePrg();
cout << "Testing constructors..." << "\n";
gxString a("The quick brown fox jumps over the lazy dog");
cout << a << "\n";
gxString b;
gxString c("This is a test");
cout << c << "\n";
cout << "Copy constructing a string..." << "\n";
gxString d(c);
cout << d << "\n";
cout << "\n";
cout << "Testing overloaded assignment operators..." << "\n";
b = a;
cout << b << "\n";
b = c;
cout << b << "\n";
b = "0123456789";
cout << b << "\n";
cout << "\n";
cout << "Testing copy constructor..." << "\n";
gxString aa(a);
cout << aa << "\n";
gxString bb(b);
cout << bb << "\n";
PausePrg();
cout << "Testing overloaded += operator..." << "\n";
gxString buf(" 0123456789");
a += buf;
cout << a << "\n";
c += " message";
cout << c << "\n";
c += 'X';
cout << c << "\n";
PausePrg();
cout << "Testing concatenation..." << "\n";
gxString s1("String 1"), s2("String 2");
char *str3 = " and String 3";
s1.Cat(" and ", 5);
s1 += s2;
cout << s1 << "\n";
s1.Cat(str3);
cout << s1 << "\n";
PausePrg();
cout << "Testing find functions..." << "\n";
cout << s1 << "\n";
cout << "Searching for: " << "xyz" << "\n";
if(s1.Find("xyz") == -1)
cout << "Pattern not found!" << "\n";
else
cout << "Pattern found." << "\n";
cout << "Searching for: " << str3 << "\n";
if(s1.Find(str3, gxstrlen(str3)) == -1)
cout << "Pattern not found!" << "\n";
else
cout << "Pattern found." << "\n";
cout << "Searching for: " << s2 << "\n";
if(s1.Find(s2) == -1)
cout << "Pattern not found!" << "\n";
else
cout << "Pattern found." << "\n";
PausePrg();
cout << "Testing ifind functions..." << "\n";
cout << s1 << "\n";
cout << "Searching for: " << "xyz" << "\n";
if(s1.IFind("xyz") == -1)
cout << "Pattern not found!" << "\n";
else
cout << "Pattern found." << "\n";
cout << "Searching for: " << str3 << "\n";
if(s1.IFind(str3, gxstrlen(str3)) == -1)
cout << "Pattern not found!" << "\n";
else
cout << "Pattern found." << "\n";
cout << "Searching for: " << s2 << "\n";
if(s1.IFind(s2) == -1)
cout << "Pattern not found!" << "\n";
else
cout << "Pattern found." << "\n";
PausePrg();
cout << "Testing repeated pattern finding..." << "\n";
s1 = "This is a test message";
cout << s1 << "\n";
cout << "Searching for: " << "is" << "\n";
int offset = 0;
while(1) {
offset = s1.Find("is", offset);
if (offset == -1) break;
cout << "Pattern match found at index: " << offset << "\n";
offset++;
}
PausePrg();
cout << "Testing delete function..." << "\n";
gxString x1("The quick brown fox jumps over the lazy dog");
cout << x1 << "\n";
char *xx = "fox";
int Index = x1.Find(xx);
cout << "Deleting fox from string..." << "\n";
x1.DeleteAt(Index, gxstrlen(xx));
cout << x1 << "\n";
PausePrg();
cout << "Testing replace functions..." << "\n";
x1 = "The quick brown fox jumps over the lazy dog";
cout << x1 << "\n";
char *xy = "cat";
Index = x1.Find(xx);
cout << "Replacing fox:" << "\n";
x1.ReplaceAt(Index, xy, gxstrlen(xy));
cout << x1 << "\n";
cout << "Replacing jumps:" << "\n";
Index = x1.Find("jumps");
x1.ReplaceAt(Index, "runs ");
cout << x1 << "\n";
gxString x2("cow");
cout << "Replacing dog:" << "\n";
Index = x1.Find("dog");
x1.ReplaceAt(Index, x2);
cout << x1 << "\n";
PausePrg();
cout << "Testing the insert functions..." << "\n";
x1 = "The quick brown fox jumps over the lazy dog";
cout << x1 << "\n";
char *xz = "and yellow ";
cout << "Inserting text into string:" << "\n";
Index = x1.Find(xx);
x1.InsertAt(Index, xz, gxstrlen(xz));
cout << x1 << "\n";
Index = x1.Find("over");
x1.InsertAt(Index, "around and ");
cout << x1 << "\n";
gxString x3("cow and ");
Index = x1.Find("dog");
x1.InsertAt(Index, x3);
cout << x1 << "\n";
PausePrg();
cout << "Testing c_str functions" << "\n";
gxString gs("COW");
const gxString &cs = gs;
cout << "String = " << gs.c_str() << "\n";
cout << "Const String = " << cs.c_str() << "\n";
PausePrg();
cout << "Testing overload subscript operator..." << "\n";
char *Message = "This is a test message";
gxString ss(Message);
for(unsigned i = 0; i < gxstrlen(Message); i++)
cout << ss[i];
cout << "\n";
PausePrg();
cout << "Testing general-purpose filter functions" << "\n";
cout << "\n";
gxString s(" ?The quick brown fox jumps over the lazy dog\n\r\
0123456789\r\n?~!@#$%^&*()_+<> ");
unsigned num;
cout << "Original string: " << "\n";
cout << s.c_str() << "\n";
cout << "\n";
cout << "Trimming all leading and trailing spaces" << "\n";
cout << "begin" << s.c_str() << "end" << "\n";
num = s.TrimLeadingSpaces();
cout << "Leading spaces = " << num << "\n";
cout << s.c_str() << "\n";
num = s.TrimTrailingSpaces();
cout << "Trialing spaces = " << num << "\n";
cout << s.c_str();
cout << "end";
PausePrg();
cout << "Changing to upper case" << "\n";
if(s.ToUpper()) cout << s.c_str() << "\n";
cout << "Changing to lower case" << "\n";
if(s.ToLower()) cout << s.c_str() << "\n";
PausePrg();
cout << "Replacing carriage returns/line feeds with spaces" << "\n";
num = s.ReplaceChar('\r', ' ');
num = s.ReplaceString("\n", " ");
cout << s.c_str() << "\n";
PausePrg();
cout << "Filtering all \'?\' characters" << "\n";
num = s.FilterChar('?');
cout << s.c_str() << "\n";
PausePrg();
cout << "Filtering the \"he\" string" << "\n";
s.FilterString("he");
cout << s.c_str() << "\n";
PausePrg();
cout << "Testing overloaded << operators" << "\n";
gxString stream;
const int i1 = 1; const long i2 = 2; const short i3 = 3;
int i4 = 255; long i5 =1024; short i6 = 2048;
unsigned int i7 = 4096; unsigned long i8 = 8192; unsigned short i9 = 16384;
float f1 = (float)4.22; double f2 = (double)8.092;
char c1 = 'A'; char c2 = 'B'; char c3 = 'C'; char c4 = 'D';
char *str1 = "Output test = "; gxString str2 = "Output test = ";
stream << "Output test = " << c1 << ' ' << c2 << ' ' << c3 << ' '
<< c4 << "\n";
cout << stream;
stream << clear << str1 << i1 << " " << i2 << " " << i3 << " " << i4 << " "
<< i5 << " " << i6 << " " << i7 << " " << i8 << " " << i9 << "\n";
cout << stream;
stream.Clear();
stream.SetWidth(4); stream.SetFill('0');
stream << str2 << hex << i1 << " " << i2 << " " << i3 << " "
<< i4 << " " << i5 << " " << i6 << " " << i7 << " " << i8
<< " " << i9 << "\n";
cout << stream;
stream.Clear();
stream.Precision(2);
stream << "Output test = " << f1 << " " << f2 << "\n";
stream.Precision(4);
stream << "Output test = " << f1 << " " << f2 << "\n";
cout << stream;
stream << clear;
PausePrg();
cout << "Testing overloaded >> operators" << "\n";
char csbuf[255];
gxString sb1 = "Input test = ";
sb1 << (int)15 << " " << (long)25 << " " << (short)35 << " "
<< (unsigned int)45 << " " << (unsigned long)55 << " "
<< (unsigned short)65 << " " << (double)1.5 << " "
<< (float)2.5 << " " << 'A' << 'B' << 'C' << "\n";
sb1 >> csbuf;
cout << csbuf;
gxString sb2, sb3, sb4, sb5, sb6, sb7, sb8, sb9, sb10, sb11, sb12;
sb2 << (int)15; sb3 << (long)25; sb4 << (short)35;
sb5 << (unsigned int)45; sb6 << (unsigned long)55;
sb7 << (unsigned short)65; sb8 << (double)1.5;
sb9 << (float)2.5; sb10 << 'A'; sb11 << 'B'; sb12 << 'C';
cout << "Input test = " << sb2 << " " << sb3 << " " << sb4 << " "
<< sb5 << " " << sb6 << " " << sb7 << " " << sb8 << " " << sb9
<< " " << sb10 << sb11 << sb12 << "\n";
int ib2 = 0; long ib3 = 0; short ib4 = 0; unsigned int ib5 = 0;
unsigned long ib6 = 0; unsigned short ib7 = 0; double ib8 = 0;
float ib9 = 0; char ib10 = 0; char ib11 = 0; char ib12 = 0;
sb2 >> ib2;
sb3 >> ib3;
sb4 >> ib4;
sb5 >> ib5;
sb6 >> ib6;
sb7 >> ib7;
sb8 >> ib8;
sb9 >> ib9;
sb10 >> ib10;
sb11 >> ib11;
sb12 >> ib12;
cout << "Input test = " << ib2 << " " << ib3 << " " << ib4 << " "
<< ib5 << " " << ib6 << " " << ib7 << " " << ib8 << " " << ib9
<< " " << ib10 << ib11 << ib12 << "\n";
#if defined (__64_BIT_DATABASE_ENGINE__)
PausePrg();
cout << "Testing overloaded >> and << 64-bit operators" << "\n";
__LLWORD__ LL1 = (__LLWORD__)255;
const __LLWORD__ LL2 = (__LLWORD__)1024;
__ULLWORD__ LL3 = (__ULLWORD__)2048;
const __ULLWORD__ LL4 = (__LLWORD__)4096;
stream << clear << "64-bit test = " << LL1 << " " << LL2 << " " << LL3
<< " " << LL4 << "\n";
stream >> csbuf;
cout << csbuf;
stream.Clear();
stream.SetWidth(4); stream.SetFill('0');
stream << "64-bit test = " << hex << LL1 << " " << LL2 << " "
<< LL3 << " " << LL4 << "\n";
cout << stream;
gxString sb64_1, sb64_2, sb64_3, sb64_4;
sb64_1 << LL1;
sb64_2 << LL2;
sb64_3 << LL3;
sb64_4 << LL4;
__LLWORD__ LLn1, LLn2;
__ULLWORD__ LLn3, LLn4;
sb64_1 >> LLn1;
sb64_2 >> LLn2;
sb64_3 >> LLn3;
sb64_4 >> LLn4;
cout << "64-bit test = " << (int)LLn1 << " " << (int)LLn2 << " "
<< (int)LLn3 << " " << (int) LLn4 << "\n";
#endif
PausePrg();
cout << "Testing escape sequence conversion function" << "\n";
cout << "\n";
gxString esc_string("This%20is%20a%20test%20for%20%%%20escape%20chars");
cout << esc_string.c_str() << "\n";
cout << "Converting escape sequences" << "\n";
int num_esc = esc_string.ConvertEscapeSeq('%');
cout << "Found " << num_esc << " escape sequences" << "\n";
cout << esc_string.c_str() << "\n";
cout << "\n";
esc_string = "This#0020is#0020a#0020test#0020for#0020###0020escape\
#0020chars";
cout << esc_string.c_str() << "\n";
cout << "Converting escape sequences" << "\n";
num_esc = esc_string.ConvertEscapeSeq('#', 4);
cout << "Found " << num_esc << " escape sequences" << "\n";
cout << esc_string.c_str() << "\n";
cout << "\n";
esc_string = "This;020is;020a;020test;020for;020;;;020escape;020chars";
cout << esc_string.c_str() << "\n";
cout << "Converting escape sequences" << "\n";
num_esc = esc_string.ConvertEscapeSeq(';', 3);
cout << "Found " << num_esc << " escape sequences" << "\n";
cout << esc_string.c_str() << "\n";
PausePrg();
cout << "Testing the comparison operators" << "\n";
#ifndef __AUTORUN_TESTPROG__
gxString acomp(255), bcomp;
cout << "Enter string A>"; cin >> acomp;
cout << "Enter string B>"; cin >> bcomp;
#else
// In auto run mode so do not prompt user for any input
gxString acomp("CAT"), bcomp("cat");
cout << "String A = CAT, String B = cat" << "\n";
#endif
cout << "String A == B "; acomp == bcomp ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A != B "; acomp != bcomp ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A < B "; acomp < bcomp ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A <= B "; acomp <= bcomp ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A > B "; acomp > bcomp ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A >= B "; acomp >= bcomp ? cout << 'y' : cout << 'n';
cout << "\n";
PausePrg();
cout << "Testing the case insensitive comparison functions" << "\n";
cout << "String A == B ";
acomp.StringICompare(bcomp) == 0 ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A != B ";
acomp.StringICompare(bcomp) != 0 ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A < B ";
acomp.StringICompare(bcomp) < 0 ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A <= B ";
acomp.StringICompare(bcomp) <= 0 ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A > B ";
acomp.StringICompare(bcomp) > 0 ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A >= B ";
acomp.StringICompare(bcomp) >= 0 ? cout << 'y' : cout << 'n';
cout << "\n";
PausePrg();
cout << "Testing the find last function" << "\n";
gxString url("http://www.example.com:80/docs/index.html");
cout << "Complete URL: " << url.c_str() << "\n";
cout << "Searching for last \"/\"" << "\n";
offset = url.FindLast("/");
if(offset != -1) {
cout << "Found last \"/\" at offset: " << offset << "\n";
}
else {
cout << "Could not find last \"/\"" << "\n";
}
cout << "\n";
cout << "Testing delete before and after functions" << "\n";
gxString ubuf = url;
ubuf.DeleteBeforeIncluding("://");
ubuf.DeleteAfterIncluding(":");
cout << "Complete URL: " << url.c_str() << "\n";
cout << "Server: " << ubuf.c_str() << "\n";
ubuf = url;
ubuf.DeleteAfter("http");
cout << "Protocol: " << ubuf.c_str() << "\n";
ubuf = url;
ubuf.DeleteBeforeLast(":");
ubuf.DeleteAfterIncluding("/");
ubuf.DeleteAt(0, 1);
cout << "Port: " << ubuf.c_str() << "\n";
ubuf = url;
ubuf.DeleteBeforeIncluding("://");
ubuf.DeleteBeforeIncluding("/");
ubuf.DeleteAfterLastIncluding("/");
ubuf.InsertAt(0, "/");
cout << "Directory: " << ubuf.c_str() << "\n";
ubuf = url;
ubuf.DeleteBeforeLastIncluding("/");
cout << "File: " << ubuf.c_str() << "\n";
ubuf.DeleteBefore(".");
cout << "Dot extension: " << ubuf.c_str() << "\n";
PausePrg();
cout << "Testing shorthand notation nomenclature" << "\n";
long by1 = 519;
unsigned long by2 = 2133;
gxString byte_string;
byte_string << clear << "Byte value 1 = " << shn << by1 << " bytes "
<< "Byte value 2 = " << by2 << " bytes" << "\n";
cout << byte_string.c_str();
by1 *= (1000 * 1000);
by2 *= (1000 * 1000);
byte_string << clear << "Byte value 1 = " << shn << by1 << " bytes "
<< "Byte value 2 = " << by2 << " bytes" << "\n";
cout << byte_string.c_str();
#if defined (__64_BIT_DATABASE_ENGINE__)
__LLWORD__ llby1 = 519;
__ULLWORD__ llby2 = 2133;
byte_string << clear << "Byte value 1 = " << shn << llby1 << " bytes "
<< "Byte value 2 = " << llby2 << " bytes" << "\n";
cout << byte_string.c_str();
llby1 *= (1000 * 1000);
llby2 *= (1000 * 1000);
byte_string << clear << "Byte value 1 = " << shn << llby1 << " bytes "
<< "Byte value 2 = " << llby2 << " bytes" << "\n";
cout << byte_string.c_str();
llby1 *= 1000;
llby2 *= 1000;
byte_string << clear << "Byte value 1 = " << shn << llby1 << " bytes "
<< "Byte value 2 = " << llby2 << " bytes" << "\n";
cout << byte_string.c_str();
#endif
PausePrg();
cout << "Testing octal conversion functions" << "\n";
gxString o_string;
int onum1 = 0755;
int onum2 = 0644;
int onum3 = 0220;
o_string << clear << oct << onum1 << " " << onum2 << " " << onum3 << "\n";
cout << o_string.c_str();
#if defined (__64_BIT_DATABASE_ENGINE__)
__LLWORD__ lonum1 = 0755;
__LLWORD__ lonum2 = 0644;
__LLWORD__ lonum3 = 0220;
o_string << clear << oct << lonum1 << " " << lonum2 << " " << lonum3 << "\n";
cout << o_string.c_str();
#endif
PausePrg();
cout << "Testing char trim functions" << "\n";
gxString trim_str = "######Test String______";
cout << "String = " << trim_str.c_str() << "\n";
trim_str.TrimLeading('#'); trim_str.TrimTrailing('_');
cout << "String = " << trim_str.c_str() << "\n";
PausePrg();
cout << "Testing substring functions" << "\n";
gxString substr("The quick brown fox jumps over the lazy dog");
cout << substr.c_str() << "\n";
Index = substr.Find("fox");
cout << "Testing mid function:" << "\n";
gxString Fox = substr.Mid(Index, 3); // 3 characters for fox
cout << Fox.c_str() << "\n";
cout << "Testing left function:" << "\n";
gxString The = substr.Left(3); // 3 characters for the
cout << The.c_str() << "\n";
cout << "Testing right function:" << "\n";
gxString Dog = substr.Right(3); // 3 characters for dog
cout << Dog.c_str() << "\n";
cout << "\n";
cout << "Exiting ASCII string test" << "\n";
PausePrg();
}
void UNICODEStringTest()
{
cout << "Testing all Unicode string class functions..." << "\n";
PausePrg();
cout << "Testing constructors..." << "\n";
wchar_t wsbuf[255];
gxStringw a(gxLTCHAR("The quick brown fox jumps over the lazy dog", wsbuf));
cout << a << "\n";
gxStringw b;
gxStringw c(gxLTCHAR("This is a test", wsbuf));
cout << c << "\n";
cout << "Copy constructing a string..." << "\n";
gxStringw d(c);
cout << d << "\n";
cout << "\n";
cout << "Testing overloaded assignment operators..." << "\n";
b = a;
cout << b << "\n";
b = c;
cout << b << "\n";
b = gxLTCHAR("0123456789", wsbuf);
cout << b << "\n";
cout << "\n";
cout << "Testing copy constructor..." << "\n";
gxStringw aa(a);
cout << aa << "\n";
gxStringw bb(b);
cout << bb << "\n";
PausePrg();
cout << "Testing overloaded += operator..." << "\n";
gxStringw buf(gxLTCHAR(" 0123456789", wsbuf));
a += buf;
cout << a << "\n";
c += gxLTCHAR(" message", wsbuf);
cout << c << "\n";
c += gxLTCHAR('X', wsbuf);
cout << c << "\n";
PausePrg();
cout << "Testing concatenation..." << "\n";
gxStringw s1(gxLTCHAR("String 1", wsbuf)), s2(gxLTCHAR("String 2", wsbuf));
char *str3 = " and String 3";
s1.Cat(gxLTCHAR(" and ", wsbuf), 5);
s1 += s2;
cout << s1 << "\n";
s1.Cat(str3);
cout << s1 << "\n";
PausePrg();
cout << "Testing find functions..." << "\n";
cout << s1 << "\n";
cout << "Searching for: " << "xyz" << "\n";
if(s1.Find(gxLTCHAR("xyz", wsbuf)) == -1)
cout << "Pattern not found!" << "\n";
else
cout << "Pattern found." << "\n";
cout << "Searching for: " << str3 << "\n";
if(s1.Find(str3, gxstrlen(str3)) == -1)
cout << "Pattern not found!" << "\n";
else
cout << "Pattern found." << "\n";
cout << "Searching for: " << s2 << "\n";
if(s1.Find(s2) == -1)
cout << "Pattern not found!" << "\n";
else
cout << "Pattern found." << "\n";
PausePrg();
cout << "Testing ifind functions..." << "\n";
cout << s1 << "\n";
cout << "Searching for: " << "xyz" << "\n";
if(s1.IFind(gxLTCHAR("xyz", wsbuf)) == -1)
cout << "Pattern not found!" << "\n";
else
cout << "Pattern found." << "\n";
cout << "Searching for: " << str3 << "\n";
if(s1.IFind(str3, gxstrlen(str3)) == -1)
cout << "Pattern not found!" << "\n";
else
cout << "Pattern found." << "\n";
cout << "Searching for: " << s2 << "\n";
if(s1.IFind(s2) == -1)
cout << "Pattern not found!" << "\n";
else
cout << "Pattern found." << "\n";
PausePrg();
cout << "Testing repeated pattern finding..." << "\n";
s1 = "This is a test message";
cout << s1 << "\n";
cout << "Searching for: " << "is" << "\n";
int offset = 0;
while(1) {
offset = s1.Find(gxLTCHAR("is", wsbuf), offset);
if (offset == -1) break;
cout << "Pattern match found at index: " << offset << "\n";
offset++;
}
PausePrg();
cout << "Testing delete function..." << "\n";
gxStringw x1(gxLTCHAR("The quick brown fox jumps over the lazy dog", wsbuf));
cout << x1 << "\n";
wchar_t *xx = gxLTCHAR("fox", wsbuf);
int Index = x1.Find(xx);
cout << "Deleting fox from string..." << "\n";
x1.DeleteAt(Index, gxstrlen(xx));
cout << x1 << "\n";
PausePrg();
cout << "Testing replace functions..." << "\n";
x1 = "The quick brown fox jumps over the lazy dog";
cout << x1 << "\n";
wchar_t *xy = gxLTCHAR("cat", wsbuf);
Index = x1.Find(gxLTCHAR("fox", wsbuf));
cout << "Replacing fox:" << "\n";
x1.ReplaceAt(Index, xy, gxstrlen(xy));
cout << x1 << "\n";
cout << "Replacing jumps:" << "\n";
Index = x1.Find(gxLTCHAR("jumps", wsbuf));
x1.ReplaceAt(Index, gxLTCHAR("runs ", wsbuf));
cout << x1 << "\n";
gxStringw x2(gxLTCHAR("cow", wsbuf));
cout << "Replacing dog:" << "\n";
Index = x1.Find(gxLTCHAR("dog", wsbuf));
x1.ReplaceAt(Index, x2);
cout << x1 << "\n";
PausePrg();
cout << "Testing the insert functions..." << "\n";
x1 = gxLTCHAR("The quick brown fox jumps over the lazy dog", wsbuf);
cout << x1 << "\n";
cout << "Inserting text into string:" << "\n";
Index = x1.Find(gxLTCHAR("fox", wsbuf));
x1.InsertAt(Index, gxLTCHAR("and yellow ", wsbuf), gxstrlen("and yellow "));
cout << x1 << "\n";
Index = x1.Find(gxLTCHAR("over", wsbuf));
x1.InsertAt(Index, gxLTCHAR("around and ", wsbuf));
cout << x1 << "\n";
gxStringw x3(gxLTCHAR("cow and ", wsbuf));
Index = x1.Find(gxLTCHAR("dog", wsbuf));
x1.InsertAt(Index, x3);
cout << x1 << "\n";
PausePrg();
cout << "Testing c_str functions" << "\n";
char sbuf[255]; // ASCII string buffer for Unicode to ASCII conversion
gxStringw gs(gxLTCHAR("COW", wsbuf));
const gxStringw &cs = gs;
cout << "String = " << gs.c_str(sbuf) << "\n";
cout << "Const String = " << cs.c_str(sbuf) << "\n";
PausePrg();
cout << "Testing overload subscript operator..." << "\n";
wchar_t *Message = gxLTCHAR("This is a test message", wsbuf);
gxStringw ss(Message);
for(unsigned i = 0; i < gxstrlen(Message); i++)
cout << (char)ss[i];
cout << "\n";
PausePrg();
cout << "Testing general-purpose filter functions" << "\n";
cout << "\n";
gxStringw s(gxLTCHAR(\
" ?The quick brown fox jumps over the lazy dog\n\r\
0123456789\r\n?~!@#$%^&*()_+<> ", wsbuf));
unsigned num;
cout << "Original string: " << "\n";
cout << s.c_str(sbuf) << "\n";
cout << "\n";
cout << "Trimming all leading and trailing spaces" << "\n";
cout << "begin" << s.c_str(sbuf) << "end" << "\n";
num = s.TrimLeadingSpaces();
cout << "Leading spaces = " << num << "\n";
cout << s.c_str(sbuf) << "\n";
num = s.TrimTrailingSpaces();
cout << "Trialing spaces = " << num << "\n";
cout << s.c_str(sbuf);
cout << "end";
PausePrg();
cout << "Changing to upper case" << "\n";
if(s.ToUpper()) cout << s.c_str(sbuf) << "\n";
cout << "Changing to lower case" << "\n";
if(s.ToLower()) cout << s.c_str(sbuf) << "\n";
PausePrg();
cout << "Replacing carriage returns/line feeds with spaces" << "\n";
wchar_t wsbuf2[255];
num = s.ReplaceChar(gxLTCHAR('\r', wsbuf), gxLTCHAR(' ', wsbuf2));
num = s.ReplaceString(gxLTCHAR("\n", wsbuf), gxLTCHAR(" ", wsbuf2));
cout << s.c_str(sbuf) << "\n";
PausePrg();
cout << "Filtering all \'?\' characters" << "\n";
num = s.FilterChar(gxLTCHAR('?', wsbuf));
cout << s.c_str(sbuf) << "\n";
PausePrg();
cout << "Filtering the \"he\" string" << "\n";
s.FilterString(gxLTCHAR("he", wsbuf));
cout << s.c_str(sbuf) << "\n";
PausePrg();
cout << "Testing overloaded << operators" << "\n";
gxStringw stream;
const int i1 = 1; const long i2 = 2; const short i3 = 3;
int i4 = 255; long i5 =1024; short i6 = 2048;
unsigned int i7 = 4096; unsigned long i8 = 8192; unsigned short i9 = 16384;
float f1 = (float)4.22; double f2 = (double)8.092;
char c1 = 'A'; char c2 = 'B';
wchar_t c3 = gxLTCHAR('C', wsbuf); wchar_t c4 = gxLTCHAR('D', wsbuf2);
char *str1 = "Output test = "; gxStringw str2 = "Output test = ";
stream << "Output test = " << c1 << ' ' << c2 << ' ' << (char)c3 << ' '
<< (char)c4 << "\n";
cout << stream;
stream << clear << str1 << i1 << " " << i2 << " " << i3 << " " << i4 << " "
<< i5 << " " << i6 << " " << i7 << " " << i8 << " " << i9 << "\n";
cout << stream;
stream.Clear();
stream.SetWidth(4); stream.SetFill('0');
stream << str2 << hex << i1 << " " << i2 << " " << i3 << " "
<< i4 << " " << i5 << " " << i6 << " " << i7 << " " << i8
<< " " << i9 << "\n";
cout << stream;
stream.Clear();
stream.Precision(2);
stream << "Output test = " << f1 << " " << f2 << "\n";
stream.Precision(4);
stream << "Output test = " << f1 << " " << f2 << "\n";
cout << stream;
stream << clear;
PausePrg();
cout << "Testing overloaded >> operators" << "\n";
char csbuf[255];
gxStringw sb1 = "Input test = ";
sb1 << (int)15 << " " << (long)25 << " " << (short)35 << " "
<< (unsigned int)45 << " " << (unsigned long)55 << " "
<< (unsigned short)65 << " " << (double)1.5 << " "
<< (float)2.5 << " " << 'A' << 'B' << 'C' << "\n";
sb1 >> csbuf;
cout << csbuf;
gxStringw sb2, sb3, sb4, sb5, sb6, sb7, sb8, sb9, sb10, sb11, sb12;
sb2 << (int)15; sb3 << (long)25; sb4 << (short)35;
sb5 << (unsigned int)45; sb6 << (unsigned long)55;
sb7 << (unsigned short)65; sb8 << (double)1.5;
sb9 << (float)2.5; sb10 << 'A'; sb11 << 'B'; sb12 << 'C';
cout << "Input test = " << sb2 << " " << sb3 << " " << sb4 << " "
<< sb5 << " " << sb6 << " " << sb7 << " " << sb8 << " " << sb9
<< " " << sb10 << sb11 << sb12 << "\n";
int ib2 = 0; long ib3 = 0; short ib4 = 0; unsigned int ib5 = 0;
unsigned long ib6 = 0; unsigned short ib7 = 0; double ib8 = 0;
float ib9 = 0; char ib10 = 0; char ib11 = 0; char ib12 = 0;
sb2 >> ib2;
sb3 >> ib3;
sb4 >> ib4;
sb5 >> ib5;
sb6 >> ib6;
sb7 >> ib7;
sb8 >> ib8;
sb9 >> ib9;
sb10 >> ib10;
sb11 >> ib11;
sb12 >> ib12;
cout << "Input test = " << ib2 << " " << ib3 << " " << ib4 << " "
<< ib5 << " " << ib6 << " " << ib7 << " " << ib8 << " " << ib9
<< " " << ib10 << ib11 << ib12 << "\n";
#if defined (__64_BIT_DATABASE_ENGINE__)
PausePrg();
cout << "Testing overloaded >> and << 64-bit operators" << "\n";
__LLWORD__ LL1 = (__LLWORD__)255;
const __LLWORD__ LL2 = (__LLWORD__)1024;
__ULLWORD__ LL3 = (__ULLWORD__)2048;
const __ULLWORD__ LL4 = (__LLWORD__)4096;
stream << clear << "64-bit test = " << LL1 << " " << LL2 << " " << LL3
<< " " << LL4 << "\n";
stream >> csbuf;
cout << csbuf;
stream.Clear();
stream.SetWidth(4); stream.SetFill('0');
stream << "64-bit test = " << hex << LL1 << " " << LL2 << " "
<< LL3 << " " << LL4 << "\n";
cout << stream;
gxStringw sb64_1, sb64_2, sb64_3, sb64_4;
sb64_1 << LL1;
sb64_2 << LL2;
sb64_3 << LL3;
sb64_4 << LL4;
__LLWORD__ LLn1, LLn2;
__ULLWORD__ LLn3, LLn4;
sb64_1 >> LLn1;
sb64_2 >> LLn2;
sb64_3 >> LLn3;
sb64_4 >> LLn4;
cout << "64-bit test = " << (int)LLn1 << " " << (int)LLn2 << " "
<< (int)LLn3 << " " << (int) LLn4 << "\n";
#endif
PausePrg();
cout << "Testing escape sequence conversion function" << "\n";
cout << "\n";
gxStringw esc_string(gxLTCHAR(\
"This%20is%20a%20test%20for%20%%%20escape%20chars", wsbuf));
cout << esc_string.c_str(sbuf) << "\n";
cout << "Converting escape sequences" << "\n";
wchar_t es = gxLTCHAR('%', wsbuf);
int num_esc = esc_string.ConvertEscapeSeq(es);
cout << "Found " << num_esc << " escape sequences" << "\n";
cout << esc_string.c_str(sbuf) << "\n";
cout << "\n";
esc_string = gxLTCHAR("This#0020is#0020a#0020test#0020for#0020###0020escape\
#0020chars", wsbuf);
cout << esc_string.c_str(sbuf) << "\n";
cout << "Converting escape sequences" << "\n";
num_esc = esc_string.ConvertEscapeSeq(gxLTCHAR('#', wsbuf), 4);
cout << "Found " << num_esc << " escape sequences" << "\n";
cout << esc_string.c_str(sbuf) << "\n";
cout << "\n";
esc_string = gxLTCHAR(\
"This;020is;020a;020test;020for;020;;;020escape;020chars", wsbuf);
cout << esc_string.c_str(sbuf) << "\n";
cout << "Converting escape sequences" << "\n";
num_esc = esc_string.ConvertEscapeSeq(';', 3);
cout << "Found " << num_esc << " escape sequences" << "\n";
cout << esc_string.c_str(sbuf) << "\n";
PausePrg();
cout << "Testing the comparison operators" << "\n";
#ifndef __AUTORUN_TESTPROG__
gxStringw acomp(255), bcomp;
cout << "Enter string A>"; cin >> acomp;
cout << "Enter string B>"; cin >> bcomp;
#else
// In auto run mode so do not prompt user for any input
gxStringw acomp(gxLTCHAR("CAT", wsbuf)), bcomp(gxLTCHAR("cat", wsbuf));
cout << "String A = CAT, String B = cat" << "\n";
#endif
cout << "String A == B "; acomp == bcomp ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A != B "; acomp != bcomp ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A < B "; acomp < bcomp ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A <= B "; acomp <= bcomp ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A > B "; acomp > bcomp ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A >= B "; acomp >= bcomp ? cout << 'y' : cout << 'n';
cout << "\n";
PausePrg();
cout << "Testing the case insensitive comparison functions" << "\n";
cout << "String A == B ";
acomp.StringICompare(bcomp) == 0 ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A != B ";
acomp.StringICompare(bcomp) != 0 ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A < B ";
acomp.StringICompare(bcomp) < 0 ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A <= B ";
acomp.StringICompare(bcomp) <= 0 ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A > B ";
acomp.StringICompare(bcomp) > 0 ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "String A >= B ";
acomp.StringICompare(bcomp) >= 0 ? cout << 'y' : cout << 'n';
cout << "\n";
PausePrg();
cout << "Testing the find last function" << "\n";
gxStringw url(gxLTCHAR("http://www.example.com:80/docs/index.html", wsbuf));
cout << "Complete URL: " << url.c_str(sbuf) << "\n";
cout << "Searching for last \"/\"" << "\n";
offset = url.FindLast(gxLTCHAR("/", wsbuf));
if(offset != -1) {
cout << "Found last \"/\" at offset: " << offset << "\n";
}
else {
cout << "Could not find last \"/\"" << "\n";
}
cout << "\n";
cout << "Testing delete before and after functions" << "\n";
gxStringw ubuf = url;
ubuf.DeleteBeforeIncluding(gxLTCHAR("://", wsbuf));
ubuf.DeleteAfterIncluding(gxLTCHAR(":", wsbuf));
cout << "Complete URL: " << url.c_str(sbuf) << "\n";
cout << "Server: " << ubuf.c_str(sbuf) << "\n";
ubuf = url;
ubuf.DeleteAfter(gxLTCHAR("http", wsbuf));
cout << "Protocol: " << ubuf.c_str(sbuf) << "\n";
ubuf = url;
ubuf.DeleteBeforeLast(gxLTCHAR(":", wsbuf));
ubuf.DeleteAfterIncluding(gxLTCHAR("/", wsbuf));
ubuf.DeleteAt(0, 1);
cout << "Port: " << ubuf.c_str(sbuf) << "\n";
ubuf = url;
ubuf.DeleteBeforeIncluding(gxLTCHAR("://", wsbuf));
ubuf.DeleteBeforeIncluding(gxLTCHAR("/", wsbuf));
ubuf.DeleteAfterLastIncluding(gxLTCHAR("/", wsbuf));
ubuf.InsertAt(0, gxLTCHAR("/", wsbuf));
cout << "Directory: " << ubuf.c_str(sbuf) << "\n";
ubuf = url;
ubuf.DeleteBeforeLastIncluding(gxLTCHAR("/", wsbuf));
cout << "File: " << ubuf.c_str(sbuf) << "\n";
ubuf.DeleteBefore(gxLTCHAR(".", wsbuf));
cout << "Dot extension: " << ubuf.c_str(sbuf) << "\n";
PausePrg();
cout << "Testing shorthand notation nomenclature" << "\n";
long by1 = 519;
unsigned long by2 = 2133;
gxStringw byte_string;
byte_string << clear << "Byte value 1 = " << shn << by1 << " bytes "
<< "Byte value 2 = " << by2 << " bytes" << "\n";
cout << byte_string.c_str(sbuf);
by1 *= (1000 * 1000);
by2 *= (1000 * 1000);
byte_string << clear << "Byte value 1 = " << shn << by1 << " bytes "
<< "Byte value 2 = " << by2 << " bytes" << "\n";
cout << byte_string.c_str(sbuf);
#if defined (__64_BIT_DATABASE_ENGINE__)
__LLWORD__ llby1 = 519;
__ULLWORD__ llby2 = 2133;
byte_string << clear << "Byte value 1 = " << shn << llby1 << " bytes "
<< "Byte value 2 = " << llby2 << " bytes" << "\n";
cout << byte_string.c_str(sbuf);
llby1 *= (1000 * 1000);
llby2 *= (1000 * 1000);
byte_string << clear << "Byte value 1 = " << shn << llby1 << " bytes "
<< "Byte value 2 = " << llby2 << " bytes" << "\n";
cout << byte_string.c_str(sbuf);
llby1 *= 1000;
llby2 *= 1000;
byte_string << clear << "Byte value 1 = " << shn << llby1 << " bytes "
<< "Byte value 2 = " << llby2 << " bytes" << "\n";
cout << byte_string.c_str(sbuf);
#endif
PausePrg();
cout << "Testing octal conversion functions" << "\n";
gxStringw o_string;
int onum1 = 0755;
int onum2 = 0644;
int onum3 = 0220;
o_string << clear << oct << onum1 << " " << onum2 << " " << onum3 << "\n";
cout << o_string.c_str(sbuf);
#if defined (__64_BIT_DATABASE_ENGINE__)
__LLWORD__ lonum1 = 0755;
__LLWORD__ lonum2 = 0644;
__LLWORD__ lonum3 = 0220;
o_string << clear << oct << lonum1 << " " << lonum2 << " " << lonum3 << "\n";
cout << o_string.c_str(sbuf);
#endif
PausePrg();
cout << "Testing char trim functions" << "\n";
gxStringw trim_str = gxLTCHAR("######Test String______", wsbuf);
cout << "String = " << trim_str.c_str(sbuf) << "\n";
trim_str.TrimLeading((wchar_t)'#');
trim_str.TrimTrailing((wchar_t)'_');
cout << "String = " << trim_str.c_str(sbuf) << "\n";
PausePrg();
cout << "Testing substring functions" << "\n";
gxStringw substr(gxLTCHAR("The quick brown fox jumps over the lazy dog",
wsbuf));
cout << substr.c_str(sbuf) << "\n";
Index = substr.Find(gxLTCHAR("fox", wsbuf));
cout << "Testing mid function:" << "\n";
gxStringw Fox = substr.Mid(Index, 3); // 3 characters for fox
cout << Fox.c_str(sbuf) << "\n";
cout << "Testing left function:" << "\n";
gxStringw The = substr.Left(3); // 3 characters for the
cout << The.c_str(sbuf) << "\n";
cout << "Testing right function:" << "\n";
gxStringw Dog = substr.Right(3); // 3 characters for dog
cout << Dog.c_str(sbuf) << "\n";
cout << "\n";
cout << "Exiting Unicode string test" << "\n";
PausePrg();
}
void MixedStringTest()
{
cout << "Testing ASCII and UNICODE string functions..." << "\n";
PausePrg();
cout << "Displaying platform dependent byte alignments" << "\n";
cout << "ASCII byte alignment = " << sizeof(char) << "\n";
cout << "ASCII bit alignment = " << (sizeof(char) * 8) << "\n";
cout << "Unicode byte alignment = " << sizeof(wchar_t)
<< "\n";
cout << "Unicode bit alignment = " << (sizeof(wchar_t) * 8)
<< "\n";
cout << "gxwchar_t byte alignment = " << sizeof(gxwchar_t)
<< "\n";
cout << "gxwchar_t bit alignment = " << (sizeof(gxwchar_t) * 8)
<< "\n";
PausePrg();
cout << "Constructing ASCII and Unicode strings" << "\n";
char sbuf[255];
wchar_t wsbuf[255];
const char *mesg = "This is a test";
wchar_t *umesg = ASCII2Unicode(mesg);
gxString as(mesg);
gxStringw wstr1((const wchar_t *)umesg);
cout << "ASCII string: " << as.c_str() << "\n";
cout << "Unicode string: " << wstr1.c_str(sbuf) << "\n";
cout << "\n";
cout << "Testing string length functions" << "\n";
cout << "ASCII string length = " << gxstrlen(as.c_str()) << "\n";
cout << "Unicode string length = " << gxstrlen(wstr1.c_wstr()) << "\n";
PausePrg();
cout << "Testing the gxwchar_t strings functions" << "\n";
gxwchar_t *gxws_t1 = ASCII2gxwchar_t(mesg);
gxString gxas = gxws_t1;
gxStringw gxws = gxws_t1;
cout << "gxwchar_t String: " << (gxStringw)gxws_t1 << "\n";
cout << "gxwchar_t String: " << (gxString)gxws_t1 << "\n";
cout << "ASCII string: " << gxas.c_str() << "\n";
cout << "Unicode string: " << gxws.c_str(sbuf) << "\n";
cout << "\n";
cout << "Testing string length functions" << "\n";
cout << "ASCII string length = " << gxstrlen(gxas.c_str()) << "\n";
cout << "Unicode string length = " << gxstrlen(gxws.c_wstr()) << "\n";
cout << "gxwchar_t string length = " << gxstrlen(gxws_t1) << "\n";
cout << "\n";
cout << "Testing gxwchar_t string copy, cat, and cmp functions" << endl;
gxwchar_t gxws_tbuf[255];
gxwchar_t gxws_t2[255]; gxwchar_t gxws_t3[255]; gxwchar_t gxws_t4[255];
gxstrcpy(gxws_t2, gxLTCHAR("Cat", gxws_tbuf));
gxstrcpy(gxws_t3, gxLTCHAR("Dog", gxws_tbuf));
gxstrcpy(gxws_t4, gxLTCHAR("Cow", gxws_tbuf));
gxstrcpy(gxws_tbuf, gxws_t2);
gxstrcat(gxws_tbuf, gxws_t3);
gxstrcat(gxws_tbuf, gxws_t4);
cout << (gxStringw)gxws_tbuf << "\n";
cout << "Comparing \"Cat\" to \"Dog\"" << "\n";
cout << "String compare = " << gxstrcmp(gxws_t2, gxws_t3);
PausePrg();
cout << "Testing the string class length functions" << "\n";
cout << "ASCII string length: " << as.length() << "\n";
cout << "ASCII bytes allocated: " << as.dlength() << "\n";
cout << "Unicode string length: " << wstr1.length() << "\n";
cout << "Unicode bytes allocated: " << wstr1.dlength() << "\n";
PausePrg();
cout << "Testing standalone string copy functions" << "\n";
gxstrcpy(sbuf, as.c_str());
cout << sbuf << "\n";
gxstrcpy(wsbuf, wstr1.c_wstr());
cout << (gxStringw)wsbuf << "\n";
PausePrg();
cout << "Testing standalone string cat functions" << "\n";
const char *s1 = "The quick brown";
const char *s2 = " fox jumps over";
const char *s3 = " the lazy dog";
char *comp = StringCat(s1, s2, s3);
cout << comp << "\n";
wchar_t *ws1 = ASCII2Unicode(s1);
wchar_t *ws2 = ASCII2Unicode(s2);
wchar_t *ws3 = ASCII2Unicode(s3);
wchar_t *wcomp = StringCat(ws1, ws2, ws3);
cout << (gxStringw)wcomp << "\n";
PausePrg();
cout << "Testing the standalone string parser..." << "\n";
const char *as_strings = "MOUSE DOG CAT LION FLEA COW HORSE";
wchar_t *ws_strings = ASCII2Unicode(as_strings);
char as_words[MAXWORDS][MAXWORDLENGTH];
wchar_t ws_words[MAXWORDS][MAXWORDLENGTH];
int num_words;
char as_sep = ' ';
wchar_t ws_sep = (wchar_t)as_sep;
int i;
int rv = parse(as_strings, as_words, &num_words, as_sep);
if(rv != 0) {
cout << "ASCII parse error" << "\n";
}
else {
cout << "Parsed " << num_words << " ASCII words" << "\n";
for(i = 0; i < num_words; i++) {
if(*as_words[i] == 0) break;
cout << as_words[i] << ' ';
}
cout << "\n";
}
parse(ws_strings, ws_words, &num_words, ws_sep);
if(rv != 0) {
cout << "Unicode parse error" << "\n";
}
else {
cout << "Parsed " << num_words << " Unicode words" << "\n";
for(i = 0; i < num_words; i++) {
if(*ws_words[i] == 0) break;
cout << (gxStringw)ws_words[i] << ' ';
}
cout << "\n";
}
PausePrg();
cout << "Testing standalone string compare functions" << "\n";
char *acomp = "CAT"; char *bcomp = "cat";
cout << "String A = CAT, String B = cat" << "\n";
wchar_t *wacomp = ASCII2Unicode(acomp);
wchar_t *wbcomp = ASCII2Unicode(bcomp);
rv = gxstrcmp(acomp, bcomp);
cout << "ASCII case compare = " << rv << "\n";
rv = gxstrcmp(wacomp, wbcomp);
cout << "Unicode case compare = " << rv << "\n";
rv = CaseICmp(acomp, bcomp);
cout << "ASCII casei compare = " << rv << "\n";
rv = CaseICmp(wacomp, wbcomp);
cout << "Unicode casei compare = " << rv << "\n";
PausePrg();
cout << "Testing standalone pattern matching functions" << "\n";
const char *search_str = "The quick brown fox jumps over the lazy dog";
wchar_t *wsearch_str = ASCII2Unicode(search_str);
cout << "Searching for pattern \"fox\"" << "\n";
int offset = FindMatch(search_str, "fox", 0, 0, 0);
if(offset != -1) {
cout << "Found ASCII match at character offset: " << offset << "\n";
}
else {
cout << "Could not find ASCII match" << "\n";
}
wchar_t *wpattern = ASCII2Unicode("fox");
offset = FindMatch(wsearch_str, wpattern);
if(offset != -1) {
cout << "Found Unicode match at character offset: " << offset << "\n";
}
else {
cout << "Could not find Unicode match" << "\n";
}
cout << "\n";
cout << "Search using non-case sensitive pattern match" << "\n";
cout << "Searching for pattern \"FOX\"" << "\n";
offset = IFindMatch(search_str, "FOX");
if(offset != -1) {
cout << "Found ASCII match at character offset: " << offset << "\n";
}
else {
cout << "Could not find ASCII match" << "\n";
}
delete wpattern; // Free memory before calling conversion function again
wpattern = ASCII2Unicode("FOX");
offset = IFindMatch(wsearch_str, wpattern);
if(offset != -1) {
cout << "Found Unicode match at character offset: " << offset << "\n";
}
else {
cout << "Could not find Unicode match" << "\n";
}
// Free all memory buffers
delete umesg;
delete gxws_t1;
delete comp; delete wcomp;
delete ws1; delete ws2; delete ws3;
delete ws_strings;
delete wacomp; delete wbcomp;
delete wsearch_str; delete wpattern;
cout << "\n";
cout << "Exiting mixed string test" << "\n";
PausePrg();
}
void NULLStringTest()
{
cout << "Testing ASCII and UNICODE with NULL strings..." << "\n";
PausePrg();
wchar_t wsbuf[255];
char sbuf[255];
cout << "Testing the NULL string class" << "\n";
cout << "Global null char = " << (int)UStringNULLPtr::UStringNUllChar
<< "\n";
cout << "Global null wchar_t = " << UStringNULLPtr::UStringwNUllChar << "\n";
cout << "Global null wchar_t address = "
<< &UStringNULLPtr::UStringwNUllChar << "\n";
cout << "Global null string address = " << &UStringNULLPtr::UStringNUllStr
<< "\n";
cout << "Global null wstring address = " << &UStringNULLPtr::UStringwNUllStr
<< "\n";
PausePrg();
cout << "Testing NULL string construction and manipulation" << "\n";
// Test the constructors and assignment operators
gxString nstr; UString nstr2(""); UString nstr3(gxLTCHAR("", wsbuf));
UStringw nwstr; UStringw nwstr2(""); UStringw nwstr3(gxLTCHAR("", wsbuf));
nstr = ""; nstr = nstr2; nstr = nstr3; nstr = nwstr3.c_wstr();
nstr = gxLTCHAR("", wsbuf);
nwstr = gxLTCHAR("", wsbuf); nwstr = nwstr2; nwstr = nwstr3;
nwstr = nstr2.c_str();
cout << "ASCII length = " << nstr.length() << endl;
cout << "ASCII dimensioned length = " << nstr.dlength() << endl;
cout << "Unicode length = " << nwstr.length() << endl;
cout << "Unicode dimensioned length = " << nwstr.dlength() << endl;
PausePrg();
cout << "Testing for wild pointers and buffer overflows" << "\n";
cout << nstr[100]; cout << (char)nwstr[100];
cout << nstr.c_str(); cout << gxLTCHAR(nwstr.c_wstr(), sbuf);
cout << gxLTCHAR(nstr.c_wstr(wsbuf), sbuf);
cout << nwstr.c_str(sbuf);
nstr.DeleteAt(0, 100);
nstr += "";
nstr.ReplaceAt(0, "");
nstr.InsertAt(0, "");
nstr.Atoi();
nstr.Atol();
nstr.Atof();
nstr.ToUpper();
nstr.ToLower();
nstr.FindLast("");
nstr.ReplaceChar('\0', '\0');
nstr.ReplaceString("", "");
nstr.FilterString("");
nstr.FilterChar('\0');
nstr.TrimLeadingSpaces();
nstr.TrimTrailingSpaces();
nstr.DeleteAfter("");
nstr.DeleteBefore("");
nstr.DeleteAfterIncluding("");
nstr.DeleteBeforeIncluding("");
nstr.DeleteAfterLast("");
nstr.DeleteAfterLastIncluding("");
nstr.DeleteBeforeLast("");
nstr.DeleteBeforeLastIncluding("");
nstr.ConvertEscapeSeq('%');
nstr.Find("");
nstr.Find("", 100, 100);
nstr.IFind("");
nstr.IFind("", 100, 100);
nwstr.DeleteAt(0, 100);
nstr += "";
nwstr.ReplaceAt(0, "");
nwstr.InsertAt(0, "");
nwstr.Atoi();
nwstr.Atol();
nwstr.Atof();
nwstr.ToUpper();
nwstr.ToLower();
nwstr.FindLast("");
nwstr.ReplaceChar('\0', '\0');
nwstr.ReplaceString("", "");
nwstr.FilterString("");
nwstr.FilterChar('\0');
nwstr.TrimLeadingSpaces();
nwstr.TrimTrailingSpaces();
nwstr.DeleteAfter("");
nwstr.DeleteBefore("");
nwstr.DeleteAfterIncluding("");
nwstr.DeleteBeforeIncluding("");
nwstr.DeleteAfterLast("");
nwstr.DeleteAfterLastIncluding("");
nwstr.DeleteBeforeLast("");
nwstr.DeleteBeforeLastIncluding("");
nwstr.ConvertEscapeSeq('%');
nwstr.Find("");
nwstr.Find("", 100, 100);
nwstr.IFind("");
nwstr.IFind("", 100, 100);
cout << "\n";
cout << "Passed" << "\n";
PausePrg();
cout << "Testing comparison operator on null strings" << "\n";
cout << "ASCII length = " << nstr.length() << endl;
cout << "ASCII dimensioned length = " << nstr.dlength() << endl;
cout << "Unicode length = " << nwstr.length() << endl;
cout << "Unicode dimensioned length = " << nwstr.dlength() << endl;
cout << "ASCII String == null "; nstr == "" ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "ASCII String != null "; nstr != "" ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "ASCII String < null "; nstr < "" ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "ASCII String A <= B "; nstr <= "" ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "ASCII String > null "; nstr > "" ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "ASCII String >= null "; nstr >= "" ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "Unicode String == null ";
nwstr == gxLTCHAR("", wsbuf) ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "Unicode String != null ";
nwstr != gxLTCHAR("", wsbuf) ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "Unicode String < null ";
nwstr < gxLTCHAR("", wsbuf) ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "Unicode String A <= B ";
nwstr <= gxLTCHAR("", wsbuf) ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "Unicode String > null ";
nwstr > gxLTCHAR("", wsbuf) ? cout << 'y' : cout << 'n';
cout << "\n";
cout << "Unicode String >= null ";
nwstr >= gxLTCHAR("", wsbuf) ? cout << 'y' : cout << 'n';
cout << "\n";
// Test the global pointer reset functions
// NOTE: A reset is only required if the global nulls have
// been accidentally modified.
nstr.ResetGlobalNull();
nwstr.ResetGlobalNull();
cout << "\n";
cout << "Exiting NULL string test" << "\n";
PausePrg();
}
int main()
{
#ifdef __MSVC_DEBUG__
InitLeakTest();
#endif
MixedStringTest();
NULLStringTest();
ASCIIStringTest();
UNICODEStringTest();
cout << "All tests complete. Exiting..." << "\n";
return 0;
}
// ----------------------------------------------------------- //
// ------------------------------- //
// --------- End of File --------- //
// ------------------------------- //