+ if ( !re.Matches(text) )
+ {
+ wxPuts(_T("ERROR: match expected."));
+ }
+ else
+ {
+ wxPrintf(_T("Entire match: %s\n"), re.GetMatch(text).c_str());
+
+ wxPrintf(_T("Date: %s/%s/%s, wday: %s\n"),
+ re.GetMatch(text, 3).c_str(),
+ re.GetMatch(text, 2).c_str(),
+ re.GetMatch(text, 4).c_str(),
+ re.GetMatch(text, 1).c_str());
+ }
+}
+
+static void TestRegExReplacement()
+{
+ wxPuts(_T("*** Testing RE replacement ***"));
+
+ static struct RegExReplTestData
+ {
+ const wxChar *text;
+ const wxChar *repl;
+ const wxChar *result;
+ size_t count;
+ } regExReplTestData[] =
+ {
+ { _T("foo123"), _T("bar"), _T("bar"), 1 },
+ { _T("foo123"), _T("\\2\\1"), _T("123foo"), 1 },
+ { _T("foo_123"), _T("\\2\\1"), _T("123foo"), 1 },
+ { _T("123foo"), _T("bar"), _T("123foo"), 0 },
+ { _T("123foo456foo"), _T("&&"), _T("123foo456foo456foo"), 1 },
+ { _T("foo123foo123"), _T("bar"), _T("barbar"), 2 },
+ { _T("foo123_foo456_foo789"), _T("bar"), _T("bar_bar_bar"), 3 },
+ };
+
+ const wxChar *pattern = _T("([a-z]+)[^0-9]*([0-9]+)");
+ wxRegEx re = pattern;
+
+ wxPrintf(_T("Using pattern '%s' for replacement.\n"), pattern);
+
+ for ( size_t n = 0; n < WXSIZEOF(regExReplTestData); n++ )
+ {
+ const RegExReplTestData& data = regExReplTestData[n];
+
+ wxString text = data.text;
+ size_t nRepl = re.Replace(&text, data.repl);
+
+ wxPrintf(_T("%s =~ s/RE/%s/g: %u match%s, result = '%s' ("),
+ data.text, data.repl,
+ nRepl, nRepl == 1 ? _T("") : _T("es"),
+ text.c_str());
+ if ( text == data.result && nRepl == data.count )
+ {
+ wxPuts(_T("ok)"));
+ }
+ else
+ {
+ wxPrintf(_T("ERROR: should be %u and '%s')\n"),
+ data.count, data.result);
+ }
+ }
+}
+
+static void TestRegExInteractive()
+{
+ wxPuts(_T("*** Testing RE interactively ***"));
+
+ for ( ;; )
+ {
+ char pattern[128];
+ printf("\nEnter a pattern: ");
+ if ( !fgets(pattern, WXSIZEOF(pattern), stdin) )
+ break;
+
+ // kill the last '\n'
+ pattern[strlen(pattern) - 1] = 0;
+
+ wxRegEx re;
+ if ( !re.Compile(pattern) )
+ {
+ continue;
+ }
+
+ char text[128];
+ for ( ;; )
+ {
+ printf("Enter text to match: ");
+ if ( !fgets(text, WXSIZEOF(text), stdin) )
+ break;
+
+ // kill the last '\n'
+ text[strlen(text) - 1] = 0;
+
+ if ( !re.Matches(text) )
+ {
+ printf("No match.\n");
+ }
+ else
+ {
+ printf("Pattern matches at '%s'\n", re.GetMatch(text).c_str());
+
+ size_t start, len;
+ for ( size_t n = 1; ; n++ )
+ {
+ if ( !re.GetMatch(&start, &len, n) )
+ {
+ break;
+ }
+
+ printf("Subexpr %u matched '%s'\n",
+ n, wxString(text + start, len).c_str());
+ }
+ }
+ }
+ }
+}
+
+#endif // TEST_REGEX
+
+// ----------------------------------------------------------------------------
+// registry and related stuff
+// ----------------------------------------------------------------------------
+
+// this is for MSW only
+#ifndef __WXMSW__
+ #undef TEST_REGCONF
+ #undef TEST_REGISTRY
+#endif
+
+#ifdef TEST_REGCONF
+
+#include <wx/confbase.h>
+#include <wx/msw/regconf.h>
+
+static void TestRegConfWrite()
+{
+ wxRegConfig regconf(_T("console"), _T("wxwindows"));
+ regconf.Write(_T("Hello"), wxString(_T("world")));
+}
+
+#endif // TEST_REGCONF
+
+#ifdef TEST_REGISTRY
+
+#include <wx/msw/registry.h>
+
+// I chose this one because I liked its name, but it probably only exists under
+// NT
+static const wxChar *TESTKEY =
+ _T("HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Control\\CrashControl");
+
+static void TestRegistryRead()
+{
+ puts("*** testing registry reading ***");
+
+ wxRegKey key(TESTKEY);
+ printf("The test key name is '%s'.\n", key.GetName().c_str());
+ if ( !key.Open() )
+ {
+ puts("ERROR: test key can't be opened, aborting test.");
+
+ return;
+ }
+
+ size_t nSubKeys, nValues;
+ if ( key.GetKeyInfo(&nSubKeys, NULL, &nValues, NULL) )
+ {
+ printf("It has %u subkeys and %u values.\n", nSubKeys, nValues);
+ }
+
+ printf("Enumerating values:\n");
+
+ long dummy;
+ wxString value;
+ bool cont = key.GetFirstValue(value, dummy);
+ while ( cont )
+ {
+ printf("Value '%s': type ", value.c_str());
+ switch ( key.GetValueType(value) )
+ {
+ case wxRegKey::Type_None: printf("ERROR (none)"); break;
+ case wxRegKey::Type_String: printf("SZ"); break;
+ case wxRegKey::Type_Expand_String: printf("EXPAND_SZ"); break;
+ case wxRegKey::Type_Binary: printf("BINARY"); break;
+ case wxRegKey::Type_Dword: printf("DWORD"); break;
+ case wxRegKey::Type_Multi_String: printf("MULTI_SZ"); break;
+ default: printf("other (unknown)"); break;
+ }
+
+ printf(", value = ");
+ if ( key.IsNumericValue(value) )
+ {
+ long val;
+ key.QueryValue(value, &val);
+ printf("%ld", val);
+ }
+ else // string
+ {
+ wxString val;
+ key.QueryValue(value, val);
+ printf("'%s'", val.c_str());
+
+ key.QueryRawValue(value, val);
+ printf(" (raw value '%s')", val.c_str());
+ }
+
+ putchar('\n');
+
+ cont = key.GetNextValue(value, dummy);
+ }
+}
+
+static void TestRegistryAssociation()
+{
+ /*
+ The second call to deleteself genertaes an error message, with a
+ messagebox saying .flo is crucial to system operation, while the .ddf
+ call also fails, but with no error message
+ */
+
+ wxRegKey key;
+
+ key.SetName("HKEY_CLASSES_ROOT\\.ddf" );
+ key.Create();
+ key = "ddxf_auto_file" ;
+ key.SetName("HKEY_CLASSES_ROOT\\.flo" );
+ key.Create();
+ key = "ddxf_auto_file" ;
+ key.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon");
+ key.Create();
+ key = "program,0" ;
+ key.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command");
+ key.Create();
+ key = "program \"%1\"" ;
+
+ key.SetName("HKEY_CLASSES_ROOT\\.ddf" );
+ key.DeleteSelf();
+ key.SetName("HKEY_CLASSES_ROOT\\.flo" );
+ key.DeleteSelf();
+ key.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\DefaultIcon");
+ key.DeleteSelf();
+ key.SetName("HKEY_CLASSES_ROOT\\ddxf_auto_file\\shell\\open\\command");
+ key.DeleteSelf();
+}
+
+#endif // TEST_REGISTRY
+
+// ----------------------------------------------------------------------------
+// sockets
+// ----------------------------------------------------------------------------
+
+#ifdef TEST_SOCKETS
+
+#include <wx/socket.h>
+#include <wx/protocol/protocol.h>
+#include <wx/protocol/http.h>
+
+static void TestSocketServer()
+{
+ puts("*** Testing wxSocketServer ***\n");
+
+ static const int PORT = 3000;
+
+ wxIPV4address addr;
+ addr.Service(PORT);
+
+ wxSocketServer *server = new wxSocketServer(addr);
+ if ( !server->Ok() )
+ {
+ puts("ERROR: failed to bind");
+
+ return;
+ }
+
+ for ( ;; )
+ {
+ printf("Server: waiting for connection on port %d...\n", PORT);
+
+ wxSocketBase *socket = server->Accept();
+ if ( !socket )
+ {
+ puts("ERROR: wxSocketServer::Accept() failed.");
+ break;
+ }
+
+ puts("Server: got a client.");
+
+ server->SetTimeout(60); // 1 min
+
+ while ( socket->IsConnected() )
+ {
+ wxString s;
+ char ch = '\0';
+ for ( ;; )
+ {
+ if ( socket->Read(&ch, sizeof(ch)).Error() )
+ {
+ // don't log error if the client just close the connection
+ if ( socket->IsConnected() )
+ {
+ puts("ERROR: in wxSocket::Read.");
+ }
+
+ break;
+ }
+
+ if ( ch == '\r' )
+ continue;
+
+ if ( ch == '\n' )
+ break;
+
+ s += ch;
+ }
+
+ if ( ch != '\n' )
+ {
+ break;
+ }
+
+ printf("Server: got '%s'.\n", s.c_str());
+ if ( s == _T("bye") )
+ {
+ delete socket;
+
+ break;
+ }
+
+ socket->Write(s.MakeUpper().c_str(), s.length());
+ socket->Write("\r\n", 2);
+ printf("Server: wrote '%s'.\n", s.c_str());
+ }
+
+ puts("Server: lost a client.");
+
+ socket->Destroy();
+ }
+
+ // same as "delete server" but is consistent with GUI programs
+ server->Destroy();
+}
+
+static void TestSocketClient()
+{
+ puts("*** Testing wxSocketClient ***\n");
+
+ static const char *hostname = "www.wxwindows.org";
+
+ wxIPV4address addr;
+ addr.Hostname(hostname);
+ addr.Service(80);
+
+ printf("--- Attempting to connect to %s:80...\n", hostname);
+
+ wxSocketClient client;
+ if ( !client.Connect(addr) )