From: Vadim Zeitlin Date: Sun, 10 Feb 2008 17:03:23 +0000 (+0000) Subject: add wxXLocale class and wxIsxxx_l() and wxToxxx_l() functions (heavily modified and... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/6e4ae332ac7d85be3592640ffef56a60924cc1c9 add wxXLocale class and wxIsxxx_l() and wxToxxx_l() functions (heavily modified and extended patch 1874287) git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@51632 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/Makefile.in b/Makefile.in index 272a21a917..cc34564bfa 100644 --- a/Makefile.in +++ b/Makefile.in @@ -427,6 +427,7 @@ ALL_BASE_HEADERS = \ wx/wxcrtbase.h \ wx/wxcrtvararg.h \ wx/wxprec.h \ + wx/xlocale.h \ wx/xti.h \ wx/xtistrm.h \ wx/zipstrm.h \ @@ -576,6 +577,7 @@ ALL_PORTS_BASE_HEADERS = \ wx/wxcrtbase.h \ wx/wxcrtvararg.h \ wx/wxprec.h \ + wx/xlocale.h \ wx/xti.h \ wx/xtistrm.h \ wx/zipstrm.h \ @@ -718,6 +720,7 @@ ALL_BASE_SOURCES = \ src/common/wfstream.cpp \ src/common/wxcrt.cpp \ src/common/wxprintf.cpp \ + src/common/xlocale.cpp \ src/common/xti.cpp \ src/common/xtistrm.cpp \ src/common/zipstrm.cpp \ @@ -902,6 +905,7 @@ MONODLL_OBJECTS = \ monodll_wfstream.o \ monodll_wxcrt.o \ monodll_wxprintf.o \ + monodll_xlocale.o \ monodll_xti.o \ monodll_xtistrm.o \ monodll_zipstrm.o \ @@ -1016,6 +1020,7 @@ MONOLIB_OBJECTS = \ monolib_wfstream.o \ monolib_wxcrt.o \ monolib_wxprintf.o \ + monolib_xlocale.o \ monolib_xti.o \ monolib_xtistrm.o \ monolib_zipstrm.o \ @@ -1128,6 +1133,7 @@ BASEDLL_OBJECTS = \ basedll_wfstream.o \ basedll_wxcrt.o \ basedll_wxprintf.o \ + basedll_xlocale.o \ basedll_xti.o \ basedll_xtistrm.o \ basedll_zipstrm.o \ @@ -1223,6 +1229,7 @@ BASELIB_OBJECTS = \ baselib_wfstream.o \ baselib_wxcrt.o \ baselib_wxprintf.o \ + baselib_xlocale.o \ baselib_xti.o \ baselib_xtistrm.o \ baselib_zipstrm.o \ @@ -13778,6 +13785,9 @@ monodll_wxcrt.o: $(srcdir)/src/common/wxcrt.cpp $(MONODLL_ODEP) monodll_wxprintf.o: $(srcdir)/src/common/wxprintf.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/wxprintf.cpp +monodll_xlocale.o: $(srcdir)/src/common/xlocale.cpp $(MONODLL_ODEP) + $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/xlocale.cpp + monodll_xti.o: $(srcdir)/src/common/xti.cpp $(MONODLL_ODEP) $(CXXC) -c -o $@ $(MONODLL_CXXFLAGS) $(srcdir)/src/common/xti.cpp @@ -18281,6 +18291,9 @@ monolib_wxcrt.o: $(srcdir)/src/common/wxcrt.cpp $(MONOLIB_ODEP) monolib_wxprintf.o: $(srcdir)/src/common/wxprintf.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/wxprintf.cpp +monolib_xlocale.o: $(srcdir)/src/common/xlocale.cpp $(MONOLIB_ODEP) + $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/xlocale.cpp + monolib_xti.o: $(srcdir)/src/common/xti.cpp $(MONOLIB_ODEP) $(CXXC) -c -o $@ $(MONOLIB_CXXFLAGS) $(srcdir)/src/common/xti.cpp @@ -22784,6 +22797,9 @@ basedll_wxcrt.o: $(srcdir)/src/common/wxcrt.cpp $(BASEDLL_ODEP) basedll_wxprintf.o: $(srcdir)/src/common/wxprintf.cpp $(BASEDLL_ODEP) $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/wxprintf.cpp +basedll_xlocale.o: $(srcdir)/src/common/xlocale.cpp $(BASEDLL_ODEP) + $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/xlocale.cpp + basedll_xti.o: $(srcdir)/src/common/xti.cpp $(BASEDLL_ODEP) $(CXXC) -c -o $@ $(BASEDLL_CXXFLAGS) $(srcdir)/src/common/xti.cpp @@ -23591,6 +23607,9 @@ baselib_wxcrt.o: $(srcdir)/src/common/wxcrt.cpp $(BASELIB_ODEP) baselib_wxprintf.o: $(srcdir)/src/common/wxprintf.cpp $(BASELIB_ODEP) $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/wxprintf.cpp +baselib_xlocale.o: $(srcdir)/src/common/xlocale.cpp $(BASELIB_ODEP) + $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/xlocale.cpp + baselib_xti.o: $(srcdir)/src/common/xti.cpp $(BASELIB_ODEP) $(CXXC) -c -o $@ $(BASELIB_CXXFLAGS) $(srcdir)/src/common/xti.cpp diff --git a/build/bakefiles/files.bkl b/build/bakefiles/files.bkl index c30a5b8733..5a8f01d277 100644 --- a/build/bakefiles/files.bkl +++ b/build/bakefiles/files.bkl @@ -416,6 +416,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! src/common/wfstream.cpp src/common/wxcrt.cpp src/common/wxprintf.cpp + src/common/xlocale.cpp src/common/xti.cpp src/common/xtistrm.cpp src/common/zipstrm.cpp @@ -550,6 +551,7 @@ IMPORTANT: please read docs/tech/tn0016.txt before modifying this file! wx/wxcrtbase.h wx/wxcrtvararg.h wx/wxprec.h + wx/xlocale.h wx/xti.h wx/xtistrm.h wx/zipstrm.h diff --git a/build/msw/makefile.bcc b/build/msw/makefile.bcc index 8bc6649edb..c99d09f4f4 100644 --- a/build/msw/makefile.bcc +++ b/build/msw/makefile.bcc @@ -377,6 +377,7 @@ MONODLL_OBJECTS = \ $(OBJS)\monodll_wfstream.obj \ $(OBJS)\monodll_wxcrt.obj \ $(OBJS)\monodll_wxprintf.obj \ + $(OBJS)\monodll_xlocale.obj \ $(OBJS)\monodll_xti.obj \ $(OBJS)\monodll_xtistrm.obj \ $(OBJS)\monodll_zipstrm.obj \ @@ -514,6 +515,7 @@ MONOLIB_OBJECTS = \ $(OBJS)\monolib_wfstream.obj \ $(OBJS)\monolib_wxcrt.obj \ $(OBJS)\monolib_wxprintf.obj \ + $(OBJS)\monolib_xlocale.obj \ $(OBJS)\monolib_xti.obj \ $(OBJS)\monolib_xtistrm.obj \ $(OBJS)\monolib_zipstrm.obj \ @@ -648,6 +650,7 @@ BASEDLL_OBJECTS = \ $(OBJS)\basedll_wfstream.obj \ $(OBJS)\basedll_wxcrt.obj \ $(OBJS)\basedll_wxprintf.obj \ + $(OBJS)\basedll_xlocale.obj \ $(OBJS)\basedll_xti.obj \ $(OBJS)\basedll_xtistrm.obj \ $(OBJS)\basedll_zipstrm.obj \ @@ -766,6 +769,7 @@ BASELIB_OBJECTS = \ $(OBJS)\baselib_wfstream.obj \ $(OBJS)\baselib_wxcrt.obj \ $(OBJS)\baselib_wxprintf.obj \ + $(OBJS)\baselib_xlocale.obj \ $(OBJS)\baselib_xti.obj \ $(OBJS)\baselib_xtistrm.obj \ $(OBJS)\baselib_zipstrm.obj \ @@ -5387,6 +5391,9 @@ $(OBJS)\monodll_wxcrt.obj: ..\..\src\common\wxcrt.cpp $(OBJS)\monodll_wxprintf.obj: ..\..\src\common\wxprintf.cpp $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\wxprintf.cpp +$(OBJS)\monodll_xlocale.obj: ..\..\src\common\xlocale.cpp + $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\xlocale.cpp + $(OBJS)\monodll_xti.obj: ..\..\src\common\xti.cpp $(CXX) -q -c -P -o$@ $(MONODLL_CXXFLAGS) ..\..\src\common\xti.cpp @@ -7490,6 +7497,9 @@ $(OBJS)\monolib_wxcrt.obj: ..\..\src\common\wxcrt.cpp $(OBJS)\monolib_wxprintf.obj: ..\..\src\common\wxprintf.cpp $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\wxprintf.cpp +$(OBJS)\monolib_xlocale.obj: ..\..\src\common\xlocale.cpp + $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\xlocale.cpp + $(OBJS)\monolib_xti.obj: ..\..\src\common\xti.cpp $(CXX) -q -c -P -o$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\xti.cpp @@ -9593,6 +9603,9 @@ $(OBJS)\basedll_wxcrt.obj: ..\..\src\common\wxcrt.cpp $(OBJS)\basedll_wxprintf.obj: ..\..\src\common\wxprintf.cpp $(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\wxprintf.cpp +$(OBJS)\basedll_xlocale.obj: ..\..\src\common\xlocale.cpp + $(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\xlocale.cpp + $(OBJS)\basedll_xti.obj: ..\..\src\common\xti.cpp $(CXX) -q -c -P -o$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\xti.cpp @@ -9896,6 +9909,9 @@ $(OBJS)\baselib_wxcrt.obj: ..\..\src\common\wxcrt.cpp $(OBJS)\baselib_wxprintf.obj: ..\..\src\common\wxprintf.cpp $(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) ..\..\src\common\wxprintf.cpp +$(OBJS)\baselib_xlocale.obj: ..\..\src\common\xlocale.cpp + $(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) ..\..\src\common\xlocale.cpp + $(OBJS)\baselib_xti.obj: ..\..\src\common\xti.cpp $(CXX) -q -c -P -o$@ $(BASELIB_CXXFLAGS) ..\..\src\common\xti.cpp diff --git a/build/msw/makefile.gcc b/build/msw/makefile.gcc index 9de596d104..dd2ebce2c8 100644 --- a/build/msw/makefile.gcc +++ b/build/msw/makefile.gcc @@ -364,6 +364,7 @@ MONODLL_OBJECTS = \ $(OBJS)\monodll_wfstream.o \ $(OBJS)\monodll_wxcrt.o \ $(OBJS)\monodll_wxprintf.o \ + $(OBJS)\monodll_xlocale.o \ $(OBJS)\monodll_xti.o \ $(OBJS)\monodll_xtistrm.o \ $(OBJS)\monodll_zipstrm.o \ @@ -502,6 +503,7 @@ MONOLIB_OBJECTS = \ $(OBJS)\monolib_wfstream.o \ $(OBJS)\monolib_wxcrt.o \ $(OBJS)\monolib_wxprintf.o \ + $(OBJS)\monolib_xlocale.o \ $(OBJS)\monolib_xti.o \ $(OBJS)\monolib_xtistrm.o \ $(OBJS)\monolib_zipstrm.o \ @@ -638,6 +640,7 @@ BASEDLL_OBJECTS = \ $(OBJS)\basedll_wfstream.o \ $(OBJS)\basedll_wxcrt.o \ $(OBJS)\basedll_wxprintf.o \ + $(OBJS)\basedll_xlocale.o \ $(OBJS)\basedll_xti.o \ $(OBJS)\basedll_xtistrm.o \ $(OBJS)\basedll_zipstrm.o \ @@ -756,6 +759,7 @@ BASELIB_OBJECTS = \ $(OBJS)\baselib_wfstream.o \ $(OBJS)\baselib_wxcrt.o \ $(OBJS)\baselib_wxprintf.o \ + $(OBJS)\baselib_xlocale.o \ $(OBJS)\baselib_xti.o \ $(OBJS)\baselib_xtistrm.o \ $(OBJS)\baselib_zipstrm.o \ @@ -5529,6 +5533,9 @@ $(OBJS)\monodll_wxcrt.o: ../../src/common/wxcrt.cpp $(OBJS)\monodll_wxprintf.o: ../../src/common/wxprintf.cpp $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\monodll_xlocale.o: ../../src/common/xlocale.cpp + $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\monodll_xti.o: ../../src/common/xti.cpp $(CXX) -c -o $@ $(MONODLL_CXXFLAGS) $(CPPDEPS) $< @@ -7734,6 +7741,9 @@ $(OBJS)\monolib_wxcrt.o: ../../src/common/wxcrt.cpp $(OBJS)\monolib_wxprintf.o: ../../src/common/wxprintf.cpp $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\monolib_xlocale.o: ../../src/common/xlocale.cpp + $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\monolib_xti.o: ../../src/common/xti.cpp $(CXX) -c -o $@ $(MONOLIB_CXXFLAGS) $(CPPDEPS) $< @@ -9939,6 +9949,9 @@ $(OBJS)\basedll_wxcrt.o: ../../src/common/wxcrt.cpp $(OBJS)\basedll_wxprintf.o: ../../src/common/wxprintf.cpp $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\basedll_xlocale.o: ../../src/common/xlocale.cpp + $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\basedll_xti.o: ../../src/common/xti.cpp $(CXX) -c -o $@ $(BASEDLL_CXXFLAGS) $(CPPDEPS) $< @@ -10242,6 +10255,9 @@ $(OBJS)\baselib_wxcrt.o: ../../src/common/wxcrt.cpp $(OBJS)\baselib_wxprintf.o: ../../src/common/wxprintf.cpp $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\baselib_xlocale.o: ../../src/common/xlocale.cpp + $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\baselib_xti.o: ../../src/common/xti.cpp $(CXX) -c -o $@ $(BASELIB_CXXFLAGS) $(CPPDEPS) $< diff --git a/build/msw/makefile.vc b/build/msw/makefile.vc index 8603955e9f..704df78cfc 100644 --- a/build/msw/makefile.vc +++ b/build/msw/makefile.vc @@ -379,6 +379,7 @@ MONODLL_OBJECTS = \ $(OBJS)\monodll_wfstream.obj \ $(OBJS)\monodll_wxcrt.obj \ $(OBJS)\monodll_wxprintf.obj \ + $(OBJS)\monodll_xlocale.obj \ $(OBJS)\monodll_xti.obj \ $(OBJS)\monodll_xtistrm.obj \ $(OBJS)\monodll_zipstrm.obj \ @@ -521,6 +522,7 @@ MONOLIB_OBJECTS = \ $(OBJS)\monolib_wfstream.obj \ $(OBJS)\monolib_wxcrt.obj \ $(OBJS)\monolib_wxprintf.obj \ + $(OBJS)\monolib_xlocale.obj \ $(OBJS)\monolib_xti.obj \ $(OBJS)\monolib_xtistrm.obj \ $(OBJS)\monolib_zipstrm.obj \ @@ -661,6 +663,7 @@ BASEDLL_OBJECTS = \ $(OBJS)\basedll_wfstream.obj \ $(OBJS)\basedll_wxcrt.obj \ $(OBJS)\basedll_wxprintf.obj \ + $(OBJS)\basedll_xlocale.obj \ $(OBJS)\basedll_xti.obj \ $(OBJS)\basedll_xtistrm.obj \ $(OBJS)\basedll_zipstrm.obj \ @@ -784,6 +787,7 @@ BASELIB_OBJECTS = \ $(OBJS)\baselib_wfstream.obj \ $(OBJS)\baselib_wxcrt.obj \ $(OBJS)\baselib_wxprintf.obj \ + $(OBJS)\baselib_xlocale.obj \ $(OBJS)\baselib_xti.obj \ $(OBJS)\baselib_xtistrm.obj \ $(OBJS)\baselib_zipstrm.obj \ @@ -5719,6 +5723,9 @@ $(OBJS)\monodll_wxcrt.obj: ..\..\src\common\wxcrt.cpp $(OBJS)\monodll_wxprintf.obj: ..\..\src\common\wxprintf.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\wxprintf.cpp +$(OBJS)\monodll_xlocale.obj: ..\..\src\common\xlocale.cpp + $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\xlocale.cpp + $(OBJS)\monodll_xti.obj: ..\..\src\common\xti.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONODLL_CXXFLAGS) ..\..\src\common\xti.cpp @@ -7822,6 +7829,9 @@ $(OBJS)\monolib_wxcrt.obj: ..\..\src\common\wxcrt.cpp $(OBJS)\monolib_wxprintf.obj: ..\..\src\common\wxprintf.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\wxprintf.cpp +$(OBJS)\monolib_xlocale.obj: ..\..\src\common\xlocale.cpp + $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\xlocale.cpp + $(OBJS)\monolib_xti.obj: ..\..\src\common\xti.cpp $(CXX) /c /nologo /TP /Fo$@ $(MONOLIB_CXXFLAGS) ..\..\src\common\xti.cpp @@ -9925,6 +9935,9 @@ $(OBJS)\basedll_wxcrt.obj: ..\..\src\common\wxcrt.cpp $(OBJS)\basedll_wxprintf.obj: ..\..\src\common\wxprintf.cpp $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\wxprintf.cpp +$(OBJS)\basedll_xlocale.obj: ..\..\src\common\xlocale.cpp + $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\xlocale.cpp + $(OBJS)\basedll_xti.obj: ..\..\src\common\xti.cpp $(CXX) /c /nologo /TP /Fo$@ $(BASEDLL_CXXFLAGS) ..\..\src\common\xti.cpp @@ -10228,6 +10241,9 @@ $(OBJS)\baselib_wxcrt.obj: ..\..\src\common\wxcrt.cpp $(OBJS)\baselib_wxprintf.obj: ..\..\src\common\wxprintf.cpp $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\wxprintf.cpp +$(OBJS)\baselib_xlocale.obj: ..\..\src\common\xlocale.cpp + $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\xlocale.cpp + $(OBJS)\baselib_xti.obj: ..\..\src\common\xti.cpp $(CXX) /c /nologo /TP /Fo$@ $(BASELIB_CXXFLAGS) ..\..\src\common\xti.cpp diff --git a/build/msw/makefile.wat b/build/msw/makefile.wat index f58e1e0a4e..3f82c465db 100644 --- a/build/msw/makefile.wat +++ b/build/msw/makefile.wat @@ -3314,6 +3314,7 @@ MONODLL_OBJECTS = & $(OBJS)\monodll_wfstream.obj & $(OBJS)\monodll_wxcrt.obj & $(OBJS)\monodll_wxprintf.obj & + $(OBJS)\monodll_xlocale.obj & $(OBJS)\monodll_xti.obj & $(OBJS)\monodll_xtistrm.obj & $(OBJS)\monodll_zipstrm.obj & @@ -3451,6 +3452,7 @@ MONOLIB_OBJECTS = & $(OBJS)\monolib_wfstream.obj & $(OBJS)\monolib_wxcrt.obj & $(OBJS)\monolib_wxprintf.obj & + $(OBJS)\monolib_xlocale.obj & $(OBJS)\monolib_xti.obj & $(OBJS)\monolib_xtistrm.obj & $(OBJS)\monolib_zipstrm.obj & @@ -3586,6 +3588,7 @@ BASEDLL_OBJECTS = & $(OBJS)\basedll_wfstream.obj & $(OBJS)\basedll_wxcrt.obj & $(OBJS)\basedll_wxprintf.obj & + $(OBJS)\basedll_xlocale.obj & $(OBJS)\basedll_xti.obj & $(OBJS)\basedll_xtistrm.obj & $(OBJS)\basedll_zipstrm.obj & @@ -3704,6 +3707,7 @@ BASELIB_OBJECTS = & $(OBJS)\baselib_wfstream.obj & $(OBJS)\baselib_wxcrt.obj & $(OBJS)\baselib_wxprintf.obj & + $(OBJS)\baselib_xlocale.obj & $(OBJS)\baselib_xti.obj & $(OBJS)\baselib_xtistrm.obj & $(OBJS)\baselib_zipstrm.obj & @@ -5761,6 +5765,9 @@ $(OBJS)\monodll_wxcrt.obj : .AUTODEPEND ..\..\src\common\wxcrt.cpp $(OBJS)\monodll_wxprintf.obj : .AUTODEPEND ..\..\src\common\wxprintf.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< +$(OBJS)\monodll_xlocale.obj : .AUTODEPEND ..\..\src\common\xlocale.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< + $(OBJS)\monodll_xti.obj : .AUTODEPEND ..\..\src\common\xti.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONODLL_CXXFLAGS) $< @@ -7966,6 +7973,9 @@ $(OBJS)\monolib_wxcrt.obj : .AUTODEPEND ..\..\src\common\wxcrt.cpp $(OBJS)\monolib_wxprintf.obj : .AUTODEPEND ..\..\src\common\wxprintf.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< +$(OBJS)\monolib_xlocale.obj : .AUTODEPEND ..\..\src\common\xlocale.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< + $(OBJS)\monolib_xti.obj : .AUTODEPEND ..\..\src\common\xti.cpp $(CXX) -bt=nt -zq -fo=$^@ $(MONOLIB_CXXFLAGS) $< @@ -10171,6 +10181,9 @@ $(OBJS)\basedll_wxcrt.obj : .AUTODEPEND ..\..\src\common\wxcrt.cpp $(OBJS)\basedll_wxprintf.obj : .AUTODEPEND ..\..\src\common\wxprintf.cpp $(CXX) -bt=nt -zq -fo=$^@ $(BASEDLL_CXXFLAGS) $< +$(OBJS)\basedll_xlocale.obj : .AUTODEPEND ..\..\src\common\xlocale.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(BASEDLL_CXXFLAGS) $< + $(OBJS)\basedll_xti.obj : .AUTODEPEND ..\..\src\common\xti.cpp $(CXX) -bt=nt -zq -fo=$^@ $(BASEDLL_CXXFLAGS) $< @@ -10474,6 +10487,9 @@ $(OBJS)\baselib_wxcrt.obj : .AUTODEPEND ..\..\src\common\wxcrt.cpp $(OBJS)\baselib_wxprintf.obj : .AUTODEPEND ..\..\src\common\wxprintf.cpp $(CXX) -bt=nt -zq -fo=$^@ $(BASELIB_CXXFLAGS) $< +$(OBJS)\baselib_xlocale.obj : .AUTODEPEND ..\..\src\common\xlocale.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(BASELIB_CXXFLAGS) $< + $(OBJS)\baselib_xti.obj : .AUTODEPEND ..\..\src\common\xti.cpp $(CXX) -bt=nt -zq -fo=$^@ $(BASELIB_CXXFLAGS) $< diff --git a/build/msw/wx_base.dsp b/build/msw/wx_base.dsp index 260d93f51d..086e987c2f 100644 --- a/build/msw/wx_base.dsp +++ b/build/msw/wx_base.dsp @@ -551,6 +551,10 @@ SOURCE=..\..\src\common\wxprintf.cpp # End Source File # Begin Source File +SOURCE=..\..\src\common\xlocale.cpp +# End Source File +# Begin Source File + SOURCE=..\..\src\common\xti.cpp # End Source File # Begin Source File @@ -1507,6 +1511,10 @@ SOURCE=..\..\include\wx\wxprec.h # End Source File # Begin Source File +SOURCE=..\..\include\wx\xlocale.h +# End Source File +# Begin Source File + SOURCE=..\..\include\wx\xti.h # End Source File # Begin Source File diff --git a/build/msw/wx_vc7_base.vcproj b/build/msw/wx_vc7_base.vcproj index 51c44a8659..f256e4d526 100644 --- a/build/msw/wx_vc7_base.vcproj +++ b/build/msw/wx_vc7_base.vcproj @@ -834,6 +834,8 @@ RelativePath="..\..\src\common\wxcrt.cpp"/> + + + @@ -1841,6 +1844,9 @@ + diff --git a/configure b/configure index 3e4a3663ac..45ba3b0287 100755 --- a/configure +++ b/configure @@ -1,5 +1,5 @@ #! /bin/sh -# From configure.in Id: configure.in 51582 2008-02-07 20:59:50Z DE . +# From configure.in Id: configure.in 51614 2008-02-09 14:40:26Z VZ . # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.61 for wxWidgets 2.9.0. # @@ -1669,6 +1669,7 @@ Optional Features: --enable-objc_uniquifying enable Objective-C class name uniquifying --disable-visibility disable use of ELF symbols visibility even if supported --enable-intl use internationalization system + --enable-xlocale use x-locale support (requires wxLocale) --enable-config use wxConfig (and derived) classes --enable-protocols use wxProtocol and derived classes --enable-ftp use wxFTP (requires wxProtocol @@ -5611,6 +5612,50 @@ fi echo "${ECHO_T}$result" >&6; } + enablestring= + defaultval=$wxUSE_ALL_FEATURES + if test -z "$defaultval"; then + if test x"$enablestring" = xdisable; then + defaultval=yes + else + defaultval=no + fi + fi + + { echo "$as_me:$LINENO: checking for --${enablestring:-enable}-xlocale" >&5 +echo $ECHO_N "checking for --${enablestring:-enable}-xlocale... $ECHO_C" >&6; } + # Check whether --enable-xlocale was given. +if test "${enable_xlocale+set}" = set; then + enableval=$enable_xlocale; + if test "$enableval" = yes; then + wx_cv_use_xlocale='wxUSE_XLOCALE=yes' + else + wx_cv_use_xlocale='wxUSE_XLOCALE=no' + fi + +else + + wx_cv_use_xlocale='wxUSE_XLOCALE=${'DEFAULT_wxUSE_XLOCALE":-$defaultval}" + +fi + + + eval "$wx_cv_use_xlocale" + + if test x"$enablestring" = xdisable; then + if test $wxUSE_XLOCALE = yes; then + result=no + else + result=yes + fi + else + result=$wxUSE_XLOCALE + fi + + { echo "$as_me:$LINENO: result: $result" >&5 +echo "${ECHO_T}$result" >&6; } + + enablestring= defaultval=$wxUSE_ALL_FEATURES if test -z "$defaultval"; then @@ -42726,6 +42771,77 @@ _ACEOF fi fi +if test "$wxUSE_XLOCALE" == "yes" ; then + cat >>confdefs.h <<\_ACEOF +#define wxUSE_XLOCALE 1 +_ACEOF + + { echo "$as_me:$LINENO: checking for locale_t" >&5 +echo $ECHO_N "checking for locale_t... $ECHO_C" >&6; } +if test "${ac_cv_type_locale_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + #include + +typedef locale_t ac__type_new_; +int +main () +{ +if ((ac__type_new_ *) 0) + return 0; +if (sizeof (ac__type_new_)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (ac_try="$ac_compile" +case "(($ac_try" in + *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; + *) ac_try_echo=$ac_try;; +esac +eval "echo \"\$as_me:$LINENO: $ac_try_echo\"") >&5 + (eval "$ac_compile") 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { + test -z "$ac_c_werror_flag" || + test ! -s conftest.err + } && test -s conftest.$ac_objext; then + ac_cv_type_locale_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_cv_type_locale_t=no +fi + +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ echo "$as_me:$LINENO: result: $ac_cv_type_locale_t" >&5 +echo "${ECHO_T}$ac_cv_type_locale_t" >&6; } +if test $ac_cv_type_locale_t = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_LOCALE_T 1 +_ACEOF + + +fi + +fi + if test "$wxUSE_LOG" = "yes"; then cat >>confdefs.h <<\_ACEOF #define wxUSE_LOG 1 diff --git a/configure.in b/configure.in index 85d3771cad..0386e44018 100644 --- a/configure.in +++ b/configure.in @@ -664,6 +664,7 @@ dnl optional non GUI features dnl --------------------------------------------------------------------------- WX_ARG_FEATURE(intl, [ --enable-intl use internationalization system], wxUSE_INTL) +WX_ARG_FEATURE(xlocale, [ --enable-xlocale use x-locale support (requires wxLocale)], wxUSE_XLOCALE) WX_ARG_FEATURE(config, [ --enable-config use wxConfig (and derived) classes], wxUSE_CONFIG) WX_ARG_FEATURE(protocols, [ --enable-protocols use wxProtocol and derived classes], wxUSE_PROTOCOL) @@ -5559,6 +5560,13 @@ if test "$wxUSE_INTL" = "yes" ; then fi fi +if test "$wxUSE_XLOCALE" == "yes" ; then + AC_DEFINE(wxUSE_XLOCALE) + AC_CHECK_TYPES(locale_t,,, + [#include + #include ]) +fi + if test "$wxUSE_LOG" = "yes"; then AC_DEFINE(wxUSE_LOG) diff --git a/docs/latex/wx/classes.tex b/docs/latex/wx/classes.tex index 78fe1db4bd..d3eee08451 100644 --- a/docs/latex/wx/classes.tex +++ b/docs/latex/wx/classes.tex @@ -475,6 +475,7 @@ \input wizard.tex \input wizevt.tex \input wizpage.tex +\input xlocale.tex \input xmldocument.tex \input xmlnode.tex \input xmlattr.tex diff --git a/docs/latex/wx/locale.tex b/docs/latex/wx/locale.tex index 22f4d123dc..dfc2de40b6 100644 --- a/docs/latex/wx/locale.tex +++ b/docs/latex/wx/locale.tex @@ -49,7 +49,8 @@ No base class \wxheading{See also} \helpref{Internationalization overview}{internationalization},\\ -\helpref{Internat sample}{sampleinternat} +\helpref{Internat sample}{sampleinternat},\\ +\helpref{wxXLocale}{wxxlocale} \wxheading{Include files} diff --git a/include/wx/features.h b/include/wx/features.h index 9d400205f2..52c84a27e0 100644 --- a/include/wx/features.h +++ b/include/wx/features.h @@ -74,5 +74,14 @@ #define wxHAS_NATIVE_TAB_TRAVERSAL #endif +/* This is defined when the compiler provides some type of extended locale + functions. Otherwise, we implement them ourselves to only support the + 'C' locale */ +#if defined(HAVE_LOCALE_T) || wxCHECK_VISUALC_VERSION(8) + #define wxHAS_XLOCALE_SUPPORT +#else + #undef wxHAS_XLOCALE_SUPPORT +#endif + #endif /* _WX_FEATURES_H_ */ diff --git a/include/wx/mac/setup0.h b/include/wx/mac/setup0.h index d3f2e97f79..de3bd675ec 100644 --- a/include/wx/mac/setup0.h +++ b/include/wx/mac/setup0.h @@ -372,6 +372,21 @@ // i18n support: _() macro, wxLocale class. Requires wxTextFile. #define wxUSE_INTL 1 +// Provide wxFoo_l() functions similar to standard foo() functions but taking +// an extra locale parameter. +// +// Notice that this is fully implemented only for the systems providing POSIX +// xlocale support or Microsoft Visual C++ >= 8 (which provides proprietary +// almost-equivalent of xlocale functions), otherwise wxFoo_l() functions will +// only work for the current user locale and "C" locale. You can use +// wxHAS_XLOCALE_SUPPORT to test whether the full support is available. +// +// Default is 1 +// +// Recommended setting: 1 but may be disabled if you are writing programs +// running only in C locale anyhow +#define wxUSE_XLOCALE 1 + // Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which // allow to manipulate dates, times and time intervals. wxDateTime replaces the // old wxTime and wxDate classes which are still provided for backwards diff --git a/include/wx/motif/setup0.h b/include/wx/motif/setup0.h index 080be0a033..55631e9d9f 100644 --- a/include/wx/motif/setup0.h +++ b/include/wx/motif/setup0.h @@ -371,6 +371,21 @@ // i18n support: _() macro, wxLocale class. Requires wxTextFile. #define wxUSE_INTL 1 +// Provide wxFoo_l() functions similar to standard foo() functions but taking +// an extra locale parameter. +// +// Notice that this is fully implemented only for the systems providing POSIX +// xlocale support or Microsoft Visual C++ >= 8 (which provides proprietary +// almost-equivalent of xlocale functions), otherwise wxFoo_l() functions will +// only work for the current user locale and "C" locale. You can use +// wxHAS_XLOCALE_SUPPORT to test whether the full support is available. +// +// Default is 1 +// +// Recommended setting: 1 but may be disabled if you are writing programs +// running only in C locale anyhow +#define wxUSE_XLOCALE 1 + // Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which // allow to manipulate dates, times and time intervals. wxDateTime replaces the // old wxTime and wxDate classes which are still provided for backwards diff --git a/include/wx/msw/setup0.h b/include/wx/msw/setup0.h index d59a717c05..dc45efdd16 100644 --- a/include/wx/msw/setup0.h +++ b/include/wx/msw/setup0.h @@ -371,6 +371,21 @@ // i18n support: _() macro, wxLocale class. Requires wxTextFile. #define wxUSE_INTL 1 +// Provide wxFoo_l() functions similar to standard foo() functions but taking +// an extra locale parameter. +// +// Notice that this is fully implemented only for the systems providing POSIX +// xlocale support or Microsoft Visual C++ >= 8 (which provides proprietary +// almost-equivalent of xlocale functions), otherwise wxFoo_l() functions will +// only work for the current user locale and "C" locale. You can use +// wxHAS_XLOCALE_SUPPORT to test whether the full support is available. +// +// Default is 1 +// +// Recommended setting: 1 but may be disabled if you are writing programs +// running only in C locale anyhow +#define wxUSE_XLOCALE 1 + // Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which // allow to manipulate dates, times and time intervals. wxDateTime replaces the // old wxTime and wxDate classes which are still provided for backwards diff --git a/include/wx/msw/wince/setup.h b/include/wx/msw/wince/setup.h index 7152cc2437..98c18229e6 100644 --- a/include/wx/msw/wince/setup.h +++ b/include/wx/msw/wince/setup.h @@ -371,6 +371,21 @@ // i18n support: _() macro, wxLocale class. Requires wxTextFile. #define wxUSE_INTL 1 +// Provide wxFoo_l() functions similar to standard foo() functions but taking +// an extra locale parameter. +// +// Notice that this is fully implemented only for the systems providing POSIX +// xlocale support or Microsoft Visual C++ >= 8 (which provides proprietary +// almost-equivalent of xlocale functions), otherwise wxFoo_l() functions will +// only work for the current user locale and "C" locale. You can use +// wxHAS_XLOCALE_SUPPORT to test whether the full support is available. +// +// Default is 1 +// +// Recommended setting: 1 but may be disabled if you are writing programs +// running only in C locale anyhow +#define wxUSE_XLOCALE 1 + // Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which // allow to manipulate dates, times and time intervals. wxDateTime replaces the // old wxTime and wxDate classes which are still provided for backwards diff --git a/include/wx/os2/setup0.h b/include/wx/os2/setup0.h index 3763726239..eea4f59b55 100644 --- a/include/wx/os2/setup0.h +++ b/include/wx/os2/setup0.h @@ -371,6 +371,21 @@ // i18n support: _() macro, wxLocale class. Requires wxTextFile. #define wxUSE_INTL 1 +// Provide wxFoo_l() functions similar to standard foo() functions but taking +// an extra locale parameter. +// +// Notice that this is fully implemented only for the systems providing POSIX +// xlocale support or Microsoft Visual C++ >= 8 (which provides proprietary +// almost-equivalent of xlocale functions), otherwise wxFoo_l() functions will +// only work for the current user locale and "C" locale. You can use +// wxHAS_XLOCALE_SUPPORT to test whether the full support is available. +// +// Default is 1 +// +// Recommended setting: 1 but may be disabled if you are writing programs +// running only in C locale anyhow +#define wxUSE_XLOCALE 1 + // Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which // allow to manipulate dates, times and time intervals. wxDateTime replaces the // old wxTime and wxDate classes which are still provided for backwards diff --git a/include/wx/palmos/setup0.h b/include/wx/palmos/setup0.h index 312c8c0aaf..cf8547e8e1 100644 --- a/include/wx/palmos/setup0.h +++ b/include/wx/palmos/setup0.h @@ -371,6 +371,21 @@ // i18n support: _() macro, wxLocale class. Requires wxTextFile. #define wxUSE_INTL 1 +// Provide wxFoo_l() functions similar to standard foo() functions but taking +// an extra locale parameter. +// +// Notice that this is fully implemented only for the systems providing POSIX +// xlocale support or Microsoft Visual C++ >= 8 (which provides proprietary +// almost-equivalent of xlocale functions), otherwise wxFoo_l() functions will +// only work for the current user locale and "C" locale. You can use +// wxHAS_XLOCALE_SUPPORT to test whether the full support is available. +// +// Default is 1 +// +// Recommended setting: 1 but may be disabled if you are writing programs +// running only in C locale anyhow +#define wxUSE_XLOCALE 1 + // Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which // allow to manipulate dates, times and time intervals. wxDateTime replaces the // old wxTime and wxDate classes which are still provided for backwards diff --git a/include/wx/setup_inc.h b/include/wx/setup_inc.h index bf6ff406cc..44a5fbb79c 100644 --- a/include/wx/setup_inc.h +++ b/include/wx/setup_inc.h @@ -367,6 +367,21 @@ // i18n support: _() macro, wxLocale class. Requires wxTextFile. #define wxUSE_INTL 1 +// Provide wxFoo_l() functions similar to standard foo() functions but taking +// an extra locale parameter. +// +// Notice that this is fully implemented only for the systems providing POSIX +// xlocale support or Microsoft Visual C++ >= 8 (which provides proprietary +// almost-equivalent of xlocale functions), otherwise wxFoo_l() functions will +// only work for the current user locale and "C" locale. You can use +// wxHAS_XLOCALE_SUPPORT to test whether the full support is available. +// +// Default is 1 +// +// Recommended setting: 1 but may be disabled if you are writing programs +// running only in C locale anyhow +#define wxUSE_XLOCALE 1 + // Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which // allow to manipulate dates, times and time intervals. wxDateTime replaces the // old wxTime and wxDate classes which are still provided for backwards diff --git a/include/wx/univ/setup0.h b/include/wx/univ/setup0.h index 56e191740d..4b693ac864 100644 --- a/include/wx/univ/setup0.h +++ b/include/wx/univ/setup0.h @@ -370,6 +370,21 @@ // i18n support: _() macro, wxLocale class. Requires wxTextFile. #define wxUSE_INTL 1 +// Provide wxFoo_l() functions similar to standard foo() functions but taking +// an extra locale parameter. +// +// Notice that this is fully implemented only for the systems providing POSIX +// xlocale support or Microsoft Visual C++ >= 8 (which provides proprietary +// almost-equivalent of xlocale functions), otherwise wxFoo_l() functions will +// only work for the current user locale and "C" locale. You can use +// wxHAS_XLOCALE_SUPPORT to test whether the full support is available. +// +// Default is 1 +// +// Recommended setting: 1 but may be disabled if you are writing programs +// running only in C locale anyhow +#define wxUSE_XLOCALE 1 + // Set wxUSE_DATETIME to 1 to compile the wxDateTime and related classes which // allow to manipulate dates, times and time intervals. wxDateTime replaces the // old wxTime and wxDate classes which are still provided for backwards diff --git a/include/wx/xlocale.h b/include/wx/xlocale.h new file mode 100644 index 0000000000..58069d63b4 --- /dev/null +++ b/include/wx/xlocale.h @@ -0,0 +1,292 @@ +////////////////////////////////////////////////////////////////////////////// +// Name: wx/xlocale.h +// Purpose: Header to provide some xlocale wrappers +// Author: Brian Vanderburg II, Vadim Zeitlin +// Created: 2008-01-07 +// RCS-ID: $Id$ +// Copyright: (c) 2008 Brian Vanderburg II +// 2008 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +/* + This header defines portable wrappers around xlocale foo_l() functions or + their MSVC proprietary _foo_l() equivalents when they are available and + implements these functions for the "C" locale [only] if they are not. This + allows the program running under the default user locale to still use "C" + locale for operations such as reading data from files where they are stored + using decimal point &c. + + TODO: Currently only the character classification and transformation + functions are implemented, we also need at least + - numbers: atof_l(), strtod_l() &c + - formatted IO: scanf_l(), printf_l() &c + - time: strftime_l(), strptime_l() + */ + +#ifndef _WX_XLOCALE_H_ +#define _WX_XLOCALE_H_ + +#include "wx/defs.h" // wxUSE_XLOCALE + +#if wxUSE_XLOCALE + +#include "wx/crt.h" // Includes wx/chartype.h, wx/wxcrt.h(wx/string.h) +#include "wx/intl.h" // wxLanguage + +// The platform-specific locale type +// If wxXLocale_t is not defined, then only "C" locale support is provided +#ifdef wxHAS_XLOCALE_SUPPORT + #if wxCHECK_VISUALC_VERSION(8) + typedef _locale_t wxXLocale_t; + #define wxXLOCALE_IDENT(name) _ ## name + #elif defined(HAVE_LOCALE_T) + #include + #include + #include + + #if wxUSE_UNICODE + #include + #endif + + // Locale type and identifier name + typedef locale_t wxXLocale_t; + + #define wxXLOCALE_IDENT(name) name + #else + #error "Unknown xlocale support" + #endif +#endif // wxHAS_XLOCALE_SUPPORT + + +// wxXLocale is a wrapper around the native type representing a locale. +// +// It is not to be confused with wxLocale, which handles actually changing the +// locale, loading message catalogs, etc. This just stores a locale value. +// The similarity of names is unfortunate, but there doesn't seem to be any +// better alternative right now. Perhaps by wxWidgets 4.0 better naming could +// be used, or this class could become wxLocale (a wrapper for the value), and +// some other class could be used to load the language catalogs or something +// that would be clearer +#ifdef wxHAS_XLOCALE_SUPPORT + +class WXDLLIMPEXP_BASE wxXLocale +{ +public: + // Construct an uninitialized locale + wxXLocale() { m_locale = NULL; } + + // Construct from a symbolic language constant + wxXLocale(wxLanguage lang); + + // Construct from the given language string + wxXLocale(const char *loc) { Init(loc); } + + // Destroy the locale + ~wxXLocale() { Free(); } + + + // Get the global "C" locale object + static wxXLocale& GetCLocale(); + + // Check if the object represents a valid locale (notice that without + // wxHAS_XLOCALE_SUPPORT the only valid locale is the "C" one) + bool IsOk() const { return m_locale != NULL; } + + // Get the type + wxXLocale_t Get() const { return m_locale; } + +private: + // Special ctor for the "C" locale, it's only used internally as the user + // code is supposed to use GetCLocale() + wxXLocale(struct wxXLocaleCTag * WXUNUSED(dummy)) { Init("C"); } + + // Create from the given language string (called from ctors) + void Init(const char *loc); + + // Free the locale if it's non-NULL + void Free(); + + + // The corresponding locale handle, NULL if invalid + wxXLocale_t m_locale; + + + // POSIX xlocale API provides a duplocale() function but MSVC locale API + // doesn't give us any means to copy a _locale_t object so we reduce the + // functionality to least common denominator here -- it shouldn't be a + // problem as copying the locale objects shouldn't be often needed + DECLARE_NO_COPY_CLASS(wxXLocale) +}; + +#else // !wxHAS_XLOCALE_SUPPORT + +// Skeleton version supporting only the "C" locale for the systems without +// xlocale support +class WXDLLIMPEXP_BASE wxXLocale +{ +public: + // Construct an uninitialized locale + wxXLocale() { m_isC = false; } + + // Construct from a symbolic language constant: unless the language is + // wxLANGUAGE_ENGLISH_US (which we suppose to be the same as "C" locale) + // the object will be invalid + wxXLocale(wxLanguage lang) + { + m_isC = lang == wxLANGUAGE_ENGLISH_US; + } + + // Construct from the given language string: unless the string is "C" or + // "POSIX" the object will be invalid + wxXLocale(const char *loc) + { + m_isC = loc && (strcmp(loc, "C") == 0 || strcmp(loc, "POSIX") == 0); + } + + // Default copy ctor, assignment operator and dtor are ok (or would be if + // we didn't use DECLARE_NO_COPY_CLASS() for consistency with the xlocale + // version) + + + // Get the global "C" locale object + static wxXLocale& GetCLocale(); + + // Check if the object represents a valid locale (notice that without + // wxHAS_XLOCALE_SUPPORT the only valid locale is the "C" one) + bool IsOk() const { return m_isC; } + +private: + // Special ctor for the "C" locale, it's only used internally as the user + // code is supposed to use GetCLocale() + wxXLocale(struct wxXLocaleCTag * WXUNUSED(dummy)) { m_isC = true; } + + // Without xlocale support this class can only represent "C" locale, if + // this is false the object is invalid + bool m_isC; + + + // although it's not a problem to copy the objects of this class, we use + // this macro in this implementation for consistency with the xlocale-based + // one which can't be copied when using MSVC locale API + DECLARE_NO_COPY_CLASS(wxXLocale) +}; + +#endif // wxHAS_XLOCALE_SUPPORT/!wxHAS_XLOCALE_SUPPORT + + +// A shorter synonym for the most commonly used locale object +#define wxCLocale (wxXLocale::GetCLocale()) + + +// Wrappers for various functions: +#ifdef wxHAS_XLOCALE_SUPPORT + + // ctype functions + #define wxCRT_Isalnum_lA wxXLOCALE_IDENT(isalnum_l) + #define wxCRT_Isalpha_lA wxXLOCALE_IDENT(isalpha_l) + #define wxCRT_Iscntrl_lA wxXLOCALE_IDENT(iscntrl_l) + #define wxCRT_Isdigit_lA wxXLOCALE_IDENT(isdigit_l) + #define wxCRT_Isgraph_lA wxXLOCALE_IDENT(isgraph_l) + #define wxCRT_Islower_lA wxXLOCALE_IDENT(islower_l) + #define wxCRT_Isprint_lA wxXLOCALE_IDENT(isprint_l) + #define wxCRT_Ispunct_lA wxXLOCALE_IDENT(ispunct_l) + #define wxCRT_Isspace_lA wxXLOCALE_IDENT(isspace_l) + #define wxCRT_Isupper_lA wxXLOCALE_IDENT(isupper_l) + #define wxCRT_Isxdigit_lA wxXLOCALE_IDENT(isxdigit_l) + #define wxCRT_Tolower_lA wxXLOCALE_IDENT(tolower_l) + #define wxCRT_Toupper_lA wxXLOCALE_IDENT(toupper_l) + + inline int wxIsalnum_l(char c, const wxXLocale& loc) + { return wxCRT_Isalnum_lA(c, loc.Get()); } + inline int wxIsalpha_l(char c, const wxXLocale& loc) + { return wxCRT_Isalpha_lA(c, loc.Get()); } + inline int wxIscntrl_l(char c, const wxXLocale& loc) + { return wxCRT_Iscntrl_lA(c, loc.Get()); } + inline int wxIsdigit_l(char c, const wxXLocale& loc) + { return wxCRT_Isdigit_lA(c, loc.Get()); } + inline int wxIsgraph_l(char c, const wxXLocale& loc) + { return wxCRT_Isgraph_lA(c, loc.Get()); } + inline int wxIslower_l(char c, const wxXLocale& loc) + { return wxCRT_Islower_lA(c, loc.Get()); } + inline int wxIsprint_l(char c, const wxXLocale& loc) + { return wxCRT_Isprint_lA(c, loc.Get()); } + inline int wxIspunct_l(char c, const wxXLocale& loc) + { return wxCRT_Ispunct_lA(c, loc.Get()); } + inline int wxIsspace_l(char c, const wxXLocale& loc) + { return wxCRT_Isspace_lA(c, loc.Get()); } + inline int wxIsupper_l(char c, const wxXLocale& loc) + { return wxCRT_Isupper_lA(c, loc.Get()); } + inline int wxIsxdigit_l(char c, const wxXLocale& loc) + { return wxCRT_Isxdigit_lA(c, loc.Get()); } + inline char wxTolower_l(char c, const wxXLocale& loc) + { return wxCRT_Tolower_lA(c, loc.Get()); } + inline char wxToupper_l(char c, const wxXLocale& loc) + { return wxCRT_Toupper_lA(c, loc.Get()); } + + #if wxUSE_UNICODE + #define wxCRT_Isalnum_lW wxXLOCALE_IDENT(iswalnum_l) + #define wxCRT_Isalpha_lW wxXLOCALE_IDENT(iswalpha_l) + #define wxCRT_Iscntrl_lW wxXLOCALE_IDENT(iswcntrl_l) + #define wxCRT_Isdigit_lW wxXLOCALE_IDENT(iswdigit_l) + #define wxCRT_Isgraph_lW wxXLOCALE_IDENT(iswgraph_l) + #define wxCRT_Islower_lW wxXLOCALE_IDENT(iswlower_l) + #define wxCRT_Isprint_lW wxXLOCALE_IDENT(iswprint_l) + #define wxCRT_Ispunct_lW wxXLOCALE_IDENT(iswpunct_l) + #define wxCRT_Isspace_lW wxXLOCALE_IDENT(iswspace_l) + #define wxCRT_Isupper_lW wxXLOCALE_IDENT(iswupper_l) + #define wxCRT_Isxdigit_lW wxXLOCALE_IDENT(iswxdigit_l) + #define wxCRT_Tolower_lW wxXLOCALE_IDENT(towlower_l) + #define wxCRT_Toupper_lW wxXLOCALE_IDENT(towupper_l) + + inline int wxIsalnum_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Isalnum_lW(c, loc.Get()); } + inline int wxIsalpha_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Isalpha_lW(c, loc.Get()); } + inline int wxIscntrl_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Iscntrl_lW(c, loc.Get()); } + inline int wxIsdigit_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Isdigit_lW(c, loc.Get()); } + inline int wxIsgraph_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Isgraph_lW(c, loc.Get()); } + inline int wxIslower_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Islower_lW(c, loc.Get()); } + inline int wxIsprint_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Isprint_lW(c, loc.Get()); } + inline int wxIspunct_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Ispunct_lW(c, loc.Get()); } + inline int wxIsspace_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Isspace_lW(c, loc.Get()); } + inline int wxIsupper_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Isupper_lW(c, loc.Get()); } + inline int wxIsxdigit_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Isxdigit_lW(c, loc.Get()); } + inline wchar_t wxTolower_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Tolower_lW(c, loc.Get()); } + inline wchar_t wxToupper_l(wchar_t c, const wxXLocale& loc) + { return wxCRT_Toupper_lW(c, loc.Get()); } + + #endif // wxUSE_UNICDE (ctype functions) +#else // !wxHAS_XLOCALE_SUPPORT + + // ctype functions + int WXDLLIMPEXP_BASE wxIsalnum_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIsalpha_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIscntrl_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIsdigit_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIsgraph_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIslower_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIsprint_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIspunct_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIsspace_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIsupper_l(const wxUniChar& c, const wxXLocale& loc); + int WXDLLIMPEXP_BASE wxIsxdigit_l(const wxUniChar& c, const wxXLocale& loc); + wxUniChar WXDLLIMPEXP_BASE wxTolower_l(const wxUniChar& c, const wxXLocale& loc); + wxUniChar WXDLLIMPEXP_BASE wxToupper_l(const wxUniChar& c, const wxXLocale& loc); + + +#endif // wxHAS_XLOCALE_SUPPORT/!wxHAS_XLOCALE_SUPPORT + +#endif // wxUSE_XLOCALE + +#endif // _WX_XLOCALE_H_ diff --git a/setup.h.in b/setup.h.in index 5d0746c7d0..95fdf6c7d9 100644 --- a/setup.h.in +++ b/setup.h.in @@ -231,6 +231,8 @@ #define wxUSE_INTL 0 +#define wxUSE_XLOCALE 0 + #define wxUSE_DATETIME 0 #define wxUSE_TIMER 0 @@ -1108,6 +1110,9 @@ /* Define if getgrgid_r is available. */ #undef HAVE_GETGRGID_R +/* Define if locale_t is available */ +#undef HAVE_LOCALE_T + /* ------------------------------------------------------------------------- Win32 adjustments section ------------------------------------------------------------------------- */ diff --git a/src/common/xlocale.cpp b/src/common/xlocale.cpp new file mode 100644 index 0000000000..1f00c13c98 --- /dev/null +++ b/src/common/xlocale.cpp @@ -0,0 +1,228 @@ +////////////////////////////////////////////////////////////////////////////// +// Name: src/common/xlocale.cpp +// Purpose: xlocale wrappers/impl to provide some xlocale wrappers +// Author: Brian Vanderburg II, Vadim Zeitlin +// Created: 2008-01-07 +// RCS-ID: $Id$ +// Copyright: (c) 2008 Brian Vanderburg II +// 2008 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ============================================================================ +// declarations +// ============================================================================ + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "wx/wxprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_XLOCALE + +#ifndef WX_PRECOMP + #include "wx/module.h" +#endif + +#include "wx/xlocale.h" + +// ---------------------------------------------------------------------------- +// module globals +// ---------------------------------------------------------------------------- + +// This is the C locale object, it is created on demand +static wxXLocale *gs_cLocale = NULL; + +// ============================================================================ +// implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// Module for gs_cLocale cleanup +// ---------------------------------------------------------------------------- + +class wxXLocaleModule : public wxModule +{ +public: + virtual bool OnInit() { return true; } + virtual void OnExit() { wxDELETE(gs_cLocale); } + + DECLARE_DYNAMIC_CLASS(wxXLocaleModule) +}; + +IMPLEMENT_DYNAMIC_CLASS(wxXLocaleModule, wxModule) + + +// ============================================================================ +// wxXLocale implementation +// ============================================================================ + +// ---------------------------------------------------------------------------- +// common parts +// ---------------------------------------------------------------------------- + +// Get the C locale +wxXLocale& wxXLocale::GetCLocale() +{ + if ( !gs_cLocale ) + { + gs_cLocale = new wxXLocale(wx_static_cast(wxXLocaleCTag *, NULL)); + } + + return *gs_cLocale; +} + +wxXLocale::wxXLocale(wxLanguage lang) +{ + const wxLanguageInfo * const info = wxLocale::GetLanguageInfo(lang); + if ( !info ) + { + m_locale = NULL; + } + else + { + Init(info->CanonicalName); + } +} + +#ifdef wxHAS_XLOCALE_SUPPORT + +#if wxCHECK_VISUALC_VERSION(8) + +// ---------------------------------------------------------------------------- +// implementation using MSVC locale API +// ---------------------------------------------------------------------------- + +void wxXLocale::Init(const char *loc) +{ + m_locale = _create_locale(LC_ALL, loc); +} + +void wxXLocale::Free() +{ + if ( m_locale ) + _free_locale(m_locale); +} + +#elif defined(HAVE_LOCALE_T) + +// ---------------------------------------------------------------------------- +// implementation using xlocale API +// ---------------------------------------------------------------------------- + +void wxXLocale::Init(const char *loc) +{ + m_locale = newlocale(LC_ALL_MASK, loc, NULL); +} + +void wxXLocale::Free() +{ + if ( m_locale ) + freelocale(m_locale); +} + +#else + #error "Unknown xlocale support." +#endif + +#endif // wxHAS_XLOCALE_SUPPORT + +#ifndef wxHAS_XLOCALE_SUPPORT + +// ============================================================================ +// Implementation of wxFoo_l() functions for "C" locale without xlocale support +// ============================================================================ + +// ---------------------------------------------------------------------------- +// character classification and transformation functions +// ---------------------------------------------------------------------------- + +// lookup table and macros for character type functions +#define CTYPE_ALNUM 0x0001 +#define CTYPE_ALPHA 0x0002 +#define CTYPE_CNTRL 0x0004 +#define CTYPE_DIGIT 0x0008 +#define CTYPE_GRAPH 0x0010 +#define CTYPE_LOWER 0x0020 +#define CTYPE_PRINT 0x0040 +#define CTYPE_PUNCT 0x0080 +#define CTYPE_SPACE 0x0100 +#define CTYPE_UPPER 0x0200 +#define CTYPE_XDIGIT 0x0400 + +static unsigned int gs_lookup[] = +{ + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0104, 0x0104, 0x0104, 0x0104, 0x0104, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, 0x0004, + 0x0140, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, + 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, + 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, 0x0459, + 0x0459, 0x0459, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, + 0x00D0, 0x0653, 0x0653, 0x0653, 0x0653, 0x0653, 0x0653, 0x0253, + 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, + 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, 0x0253, + 0x0253, 0x0253, 0x0253, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x00D0, + 0x00D0, 0x0473, 0x0473, 0x0473, 0x0473, 0x0473, 0x0473, 0x0073, + 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, + 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, 0x0073, + 0x0073, 0x0073, 0x0073, 0x00D0, 0x00D0, 0x00D0, 0x00D0, 0x0004 +}; + + +#define CTYPE_TEST(c, t) ( (c) <= 127 && (gs_lookup[(c)] & (t)) ) + + +// ctype functions +#define GEN_ISFUNC(name, test) \ +int name(const wxUniChar& c, const wxXLocale& loc) \ +{ \ + wxCHECK(loc.IsOk(), false); \ + return CTYPE_TEST(c.GetValue(), test); \ +} + +GEN_ISFUNC(wxIsalnum_l, CTYPE_ALNUM) +GEN_ISFUNC(wxIsalpha_l, CTYPE_ALPHA) +GEN_ISFUNC(wxIscntrl_l, CTYPE_CNTRL) +GEN_ISFUNC(wxIsdigit_l, CTYPE_DIGIT) +GEN_ISFUNC(wxIsgraph_l, CTYPE_GRAPH) +GEN_ISFUNC(wxIslower_l, CTYPE_LOWER) +GEN_ISFUNC(wxIsprint_l, CTYPE_PRINT) +GEN_ISFUNC(wxIspunct_l, CTYPE_PUNCT) +GEN_ISFUNC(wxIsspace_l, CTYPE_SPACE) +GEN_ISFUNC(wxIsupper_l, CTYPE_UPPER) +GEN_ISFUNC(wxIsxdigit_l, CTYPE_XDIGIT) + +wxUniChar wxTolower_l(const wxUniChar& c, const wxXLocale& loc) +{ + wxCHECK(loc.IsOk(), false); + + if(CTYPE_TEST(c, CTYPE_UPPER)) + { + return c - 'A' + 'a'; + } + + return c; +} + +wxUniChar wxToupper_l(const wxUniChar& c, const wxXLocale& loc) +{ + wxCHECK(loc.IsOk(), false); + + if(CTYPE_TEST(c, CTYPE_LOWER)) + { + return c - 'a' + 'A'; + } + + return c; +} + +#endif // !defined(wxHAS_XLOCALE_SUPPORT) + +#endif // wxUSE_XLOCALE diff --git a/tests/Makefile.in b/tests/Makefile.in index f60b44b919..56205bab41 100644 --- a/tests/Makefile.in +++ b/tests/Makefile.in @@ -98,7 +98,8 @@ TEST_OBJECTS = \ test_uris.o \ test_vectors.o \ test_evtconnection.o \ - test_weakref.o + test_weakref.o \ + test_xlocale.o TEST_ODEP = $(___pch_testprec_test_testprec_h_gch___depname) TEST_GUI_CXXFLAGS = $(__test_gui_PCH_INC) -D__WX$(TOOLKIT)__ \ $(__WXUNIV_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \ @@ -465,6 +466,9 @@ test_evtconnection.o: $(srcdir)/weakref/evtconnection.cpp $(TEST_ODEP) test_weakref.o: $(srcdir)/weakref/weakref.cpp $(TEST_ODEP) $(CXXC) -c -o $@ $(TEST_CXXFLAGS) $(srcdir)/weakref/weakref.cpp +test_xlocale.o: $(srcdir)/xlocale/xlocale.cpp $(TEST_ODEP) + $(CXXC) -c -o $@ $(TEST_CXXFLAGS) $(srcdir)/xlocale/xlocale.cpp + test_gui_sample_rc.o: $(srcdir)/../samples/sample.rc $(TEST_GUI_ODEP) $(WINDRES) -i$< -o$@ --define __WX$(TOOLKIT)__ $(__WXUNIV_DEFINE_p_5) $(__EXCEPTIONS_DEFINE_p_5) $(__RTTI_DEFINE_p_5) $(__THREAD_DEFINE_p_5) --include-dir $(srcdir) $(__DLLFLAG_p_5) --include-dir $(srcdir)/../samples $(__RCDEFDIR_p_1) --include-dir $(top_srcdir)/include diff --git a/tests/makefile.bcc b/tests/makefile.bcc index 29dd9fb06d..1c630af6ff 100644 --- a/tests/makefile.bcc +++ b/tests/makefile.bcc @@ -85,7 +85,8 @@ TEST_OBJECTS = \ $(OBJS)\test_uris.obj \ $(OBJS)\test_vectors.obj \ $(OBJS)\test_evtconnection.obj \ - $(OBJS)\test_weakref.obj + $(OBJS)\test_weakref.obj \ + $(OBJS)\test_xlocale.obj TEST_GUI_CXXFLAGS = $(__RUNTIME_LIBS) -I$(BCCDIR)\include $(__DEBUGINFO) \ $(__OPTIMIZEFLAG) $(__THREADSFLAG_1) -D__WXMSW__ $(__WXUNIV_DEFINE_p) \ $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \ @@ -497,6 +498,9 @@ $(OBJS)\test_evtconnection.obj: .\weakref\evtconnection.cpp $(OBJS)\test_weakref.obj: .\weakref\weakref.cpp $(CXX) -q -c -P -o$@ $(TEST_CXXFLAGS) .\weakref\weakref.cpp +$(OBJS)\test_xlocale.obj: .\xlocale\xlocale.cpp + $(CXX) -q -c -P -o$@ $(TEST_CXXFLAGS) .\xlocale\xlocale.cpp + $(OBJS)\test_gui_sample.res: .\..\samples\sample.rc brcc32 -32 -r -fo$@ -i$(BCCDIR)\include -d__WXMSW__ $(__WXUNIV_DEFINE_p_3) $(__DEBUG_DEFINE_p_3) $(__EXCEPTIONS_DEFINE_p_3) $(__RTTI_DEFINE_p_3) $(__THREAD_DEFINE_p_3) $(__UNICODE_DEFINE_p_3) $(__MSLU_DEFINE_p_3) $(__GFXCTX_DEFINE_p_3) -i$(SETUPHDIR) -i.\..\include -i. $(__DLLFLAG_p_3) -i.\..\samples -dNOPCH .\..\samples\sample.rc diff --git a/tests/makefile.gcc b/tests/makefile.gcc index ae8a12366d..9de958824d 100644 --- a/tests/makefile.gcc +++ b/tests/makefile.gcc @@ -77,7 +77,8 @@ TEST_OBJECTS = \ $(OBJS)\test_uris.o \ $(OBJS)\test_vectors.o \ $(OBJS)\test_evtconnection.o \ - $(OBJS)\test_weakref.o + $(OBJS)\test_weakref.o \ + $(OBJS)\test_xlocale.o TEST_GUI_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(__THREADSFLAG) \ $(GCCFLAGS) -DHAVE_W32API_H -D__WXMSW__ $(__WXUNIV_DEFINE_p) \ $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) \ @@ -475,6 +476,9 @@ $(OBJS)\test_evtconnection.o: ./weakref/evtconnection.cpp $(OBJS)\test_weakref.o: ./weakref/weakref.cpp $(CXX) -c -o $@ $(TEST_CXXFLAGS) $(CPPDEPS) $< +$(OBJS)\test_xlocale.o: ./xlocale/xlocale.cpp + $(CXX) -c -o $@ $(TEST_CXXFLAGS) $(CPPDEPS) $< + $(OBJS)\test_gui_sample_rc.o: ./../samples/sample.rc windres --use-temp-file -i$< -o$@ --define __WXMSW__ $(__WXUNIV_DEFINE_p_3) $(__DEBUG_DEFINE_p_3) $(__EXCEPTIONS_DEFINE_p_3) $(__RTTI_DEFINE_p_3) $(__THREAD_DEFINE_p_3) $(__UNICODE_DEFINE_p_3) $(__MSLU_DEFINE_p_3) $(__GFXCTX_DEFINE_p_3) --include-dir $(SETUPHDIR) --include-dir ./../include --include-dir . $(__DLLFLAG_p_3) --include-dir ./../samples --define NOPCH diff --git a/tests/makefile.vc b/tests/makefile.vc index 0290313759..395b6c4ac6 100644 --- a/tests/makefile.vc +++ b/tests/makefile.vc @@ -78,7 +78,8 @@ TEST_OBJECTS = \ $(OBJS)\test_uris.obj \ $(OBJS)\test_vectors.obj \ $(OBJS)\test_evtconnection.obj \ - $(OBJS)\test_weakref.obj + $(OBJS)\test_weakref.obj \ + $(OBJS)\test_xlocale.obj TEST_GUI_CXXFLAGS = /M$(__RUNTIME_LIBS_23)$(__DEBUGRUNTIME) /DWIN32 \ $(__DEBUGINFO) /Fd$(OBJS)\test_gui.pdb $(____DEBUGRUNTIME) \ $(__OPTIMIZEFLAG) $(__NO_VC_CRTDBG_p) /D__WXMSW__ $(__WXUNIV_DEFINE_p) \ @@ -582,6 +583,9 @@ $(OBJS)\test_evtconnection.obj: .\weakref\evtconnection.cpp $(OBJS)\test_weakref.obj: .\weakref\weakref.cpp $(CXX) /c /nologo /TP /Fo$@ $(TEST_CXXFLAGS) .\weakref\weakref.cpp +$(OBJS)\test_xlocale.obj: .\xlocale\xlocale.cpp + $(CXX) /c /nologo /TP /Fo$@ $(TEST_CXXFLAGS) .\xlocale\xlocale.cpp + $(OBJS)\test_gui_dummy.obj: .\dummy.cpp $(CXX) /c /nologo /TP /Fo$@ $(TEST_GUI_CXXFLAGS) /Yctestprec.h .\dummy.cpp diff --git a/tests/makefile.wat b/tests/makefile.wat index 8d7aa750a2..60d133b8cb 100644 --- a/tests/makefile.wat +++ b/tests/makefile.wat @@ -285,7 +285,8 @@ TEST_OBJECTS = & $(OBJS)\test_uris.obj & $(OBJS)\test_vectors.obj & $(OBJS)\test_evtconnection.obj & - $(OBJS)\test_weakref.obj + $(OBJS)\test_weakref.obj & + $(OBJS)\test_xlocale.obj TEST_GUI_CXXFLAGS = $(__DEBUGINFO) $(__OPTIMIZEFLAG) $(__THREADSFLAG) & $(__RUNTIME_LIBS) -d__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) & $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) & @@ -527,6 +528,9 @@ $(OBJS)\test_evtconnection.obj : .AUTODEPEND .\weakref\evtconnection.cpp $(OBJS)\test_weakref.obj : .AUTODEPEND .\weakref\weakref.cpp $(CXX) -bt=nt -zq -fo=$^@ $(TEST_CXXFLAGS) $< +$(OBJS)\test_xlocale.obj : .AUTODEPEND .\xlocale\xlocale.cpp + $(CXX) -bt=nt -zq -fo=$^@ $(TEST_CXXFLAGS) $< + $(OBJS)\test_gui_sample.res : .AUTODEPEND .\..\samples\sample.rc wrc -q -ad -bt=nt -r -fo=$^@ -d__WXMSW__ $(__WXUNIV_DEFINE_p) $(__DEBUG_DEFINE_p) $(__EXCEPTIONS_DEFINE_p) $(__RTTI_DEFINE_p) $(__THREAD_DEFINE_p) $(__UNICODE_DEFINE_p) $(__GFXCTX_DEFINE_p) -i=$(SETUPHDIR) -i=.\..\include -i=. $(__DLLFLAG_p) -i=.\..\samples -dNOPCH $< diff --git a/tests/test.bkl b/tests/test.bkl index 68132e086d..bfdcbbd93c 100644 --- a/tests/test.bkl +++ b/tests/test.bkl @@ -72,6 +72,7 @@ vectors/vectors.cpp weakref/evtconnection.cpp weakref/weakref.cpp + xlocale/xlocale.cpp net base diff --git a/tests/test_test.dsp b/tests/test_test.dsp index 9f40449273..ea24f8eceb 100644 --- a/tests/test_test.dsp +++ b/tests/test_test.dsp @@ -429,6 +429,10 @@ SOURCE=.\regex\wxregextest.cpp # End Source File # Begin Source File +SOURCE=.\xlocale\xlocale.cpp +# End Source File +# Begin Source File + SOURCE=.\archive\ziptest.cpp # End Source File # Begin Source File diff --git a/tests/test_vc7_test.vcproj b/tests/test_vc7_test.vcproj index 10744bf8cb..9494e01caa 100644 --- a/tests/test_vc7_test.vcproj +++ b/tests/test_vc7_test.vcproj @@ -794,6 +794,8 @@ RelativePath=".\weakref\weakref.cpp"/> + + diff --git a/tests/xlocale/xlocale.cpp b/tests/xlocale/xlocale.cpp new file mode 100644 index 0000000000..9a6ba3aa36 --- /dev/null +++ b/tests/xlocale/xlocale.cpp @@ -0,0 +1,182 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: tests/xlocale/xlocale.cpp +// Purpose: wxXLocale & related unit test +// Author: Brian Vanderburg II, Vadim Zeitlin +// Created: 2008-01-16 +// RCS-ID: $Id$ +// Copyright: (c) 2008 Brian Vanderburg II +// 2008 Vadim Zeitlin +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +// ---------------------------------------------------------------------------- +// headers +// ---------------------------------------------------------------------------- + +#include "testprec.h" + +#ifdef __BORLANDC__ + #pragma hdrstop +#endif + +#if wxUSE_XLOCALE + +#ifndef WX_PRECOMP + #include "wx/wx.h" +#endif // WX_PRECOMP + +#include "wx/xlocale.h" + +// -------------------------------------------------------------------------- +// test class +// -------------------------------------------------------------------------- + +class XLocaleTestCase : public CppUnit::TestCase +{ +public: + XLocaleTestCase() { } + +private: + CPPUNIT_TEST_SUITE( XLocaleTestCase ); + CPPUNIT_TEST( TestCtor ); + CPPUNIT_TEST( TestCtypeFunctions ); + CPPUNIT_TEST_SUITE_END(); + + void TestCtor(); + void TestCtypeFunctions(); + + void TestCtypeFunctionsWith(const wxXLocale& loc); + + DECLARE_NO_COPY_CLASS(XLocaleTestCase) +}; + +// register in the unnamed registry so that these tests are run by default +CPPUNIT_TEST_SUITE_REGISTRATION( XLocaleTestCase ); + +// also include in it's own registry so that these tests can be run alone +CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( XLocaleTestCase, "XLocaleTestCase" ); + + +// test the different wxXLocale ctors +void XLocaleTestCase::TestCtor() +{ + CPPUNIT_ASSERT( !wxXLocale().IsOk() ); + CPPUNIT_ASSERT( wxCLocale.IsOk() ); + CPPUNIT_ASSERT( wxXLocale("C").IsOk() ); +#ifdef wxHAS_XLOCALE_SUPPORT + CPPUNIT_ASSERT( wxXLocale(wxLANGUAGE_FRENCH).IsOk() ); + CPPUNIT_ASSERT( wxXLocale("fr_FR").IsOk() ); + CPPUNIT_ASSERT( wxXLocale("french").IsOk() ); +#endif + CPPUNIT_ASSERT( !wxXLocale("bloordyblop").IsOk() ); +} + +// test the ctype functions with the given locale +void XLocaleTestCase::TestCtypeFunctionsWith(const wxXLocale& loc) +{ + // isalnum + CPPUNIT_ASSERT( wxIsalnum_l('0', loc) ); + CPPUNIT_ASSERT( wxIsalnum_l('9', loc) ); + CPPUNIT_ASSERT( wxIsalnum_l('A', loc) ); + CPPUNIT_ASSERT( wxIsalnum_l('Z', loc) ); + CPPUNIT_ASSERT( wxIsalnum_l('a', loc) ); + CPPUNIT_ASSERT( wxIsalnum_l('z', loc) ); + CPPUNIT_ASSERT( !wxIsalnum_l('*', loc) ); + CPPUNIT_ASSERT( !wxIsalnum_l('@', loc) ); + CPPUNIT_ASSERT( !wxIsalnum_l('+', loc) ); + + // isalpha + CPPUNIT_ASSERT( !wxIsalpha_l('0', loc) ); + CPPUNIT_ASSERT( !wxIsalpha_l('9', loc) ); + CPPUNIT_ASSERT( wxIsalpha_l('A', loc) ); + CPPUNIT_ASSERT( wxIsalpha_l('Z', loc) ); + CPPUNIT_ASSERT( wxIsalpha_l('a', loc) ); + CPPUNIT_ASSERT( wxIsalpha_l('z', loc) ); + CPPUNIT_ASSERT( !wxIsalpha_l('*', loc) ); + CPPUNIT_ASSERT( !wxIsalpha_l('@', loc) ); + CPPUNIT_ASSERT( !wxIsalpha_l('+', loc) ); + + // TODO: iscntrl + + // isdigit + CPPUNIT_ASSERT( wxIsdigit_l('0', loc) ); + CPPUNIT_ASSERT( wxIsdigit_l('9', loc) ); + CPPUNIT_ASSERT( !wxIsdigit_l('A', loc) ); + CPPUNIT_ASSERT( !wxIsdigit_l('Z', loc) ); + CPPUNIT_ASSERT( !wxIsdigit_l('a', loc) ); + CPPUNIT_ASSERT( !wxIsdigit_l('z', loc) ); + + // TODO: isgraph + + // islower + CPPUNIT_ASSERT( !wxIslower_l('A', loc) ); + CPPUNIT_ASSERT( !wxIslower_l('Z', loc) ); + CPPUNIT_ASSERT( wxIslower_l('a', loc) ); + CPPUNIT_ASSERT( wxIslower_l('z', loc) ); + CPPUNIT_ASSERT( !wxIslower_l('0', loc) ); + CPPUNIT_ASSERT( !wxIslower_l('9', loc) ); + + + // TODO: isprint + // TODO: ispunct + + // isspace + CPPUNIT_ASSERT( wxIsspace_l(' ', loc) ); + CPPUNIT_ASSERT( wxIsspace_l('\t', loc) ); + CPPUNIT_ASSERT( wxIsspace_l('\r', loc) ); + CPPUNIT_ASSERT( wxIsspace_l('\n', loc) ); + CPPUNIT_ASSERT( !wxIsspace_l('0', loc) ); + CPPUNIT_ASSERT( !wxIsspace_l('a', loc) ); + CPPUNIT_ASSERT( !wxIsspace_l('A', loc) ); + + // isupper + CPPUNIT_ASSERT( !wxIsupper_l('0', loc) ); + CPPUNIT_ASSERT( !wxIsupper_l('9', loc) ); + CPPUNIT_ASSERT( wxIsupper_l('A', loc) ); + CPPUNIT_ASSERT( wxIsupper_l('Z', loc) ); + CPPUNIT_ASSERT( !wxIsupper_l('a', loc) ); + CPPUNIT_ASSERT( !wxIsupper_l('z', loc) ); + + // isxdigit + CPPUNIT_ASSERT( wxIsxdigit_l('0', loc) ); + CPPUNIT_ASSERT( wxIsxdigit_l('9', loc) ); + CPPUNIT_ASSERT( wxIsxdigit_l('A', loc) ); + CPPUNIT_ASSERT( wxIsxdigit_l('F', loc) ); + CPPUNIT_ASSERT( !wxIsxdigit_l('Z', loc) ); + CPPUNIT_ASSERT( wxIsxdigit_l('a', loc) ); + CPPUNIT_ASSERT( wxIsxdigit_l('f', loc) ); + CPPUNIT_ASSERT( !wxIsxdigit_l('z', loc) ); + + // tolower + CPPUNIT_ASSERT_EQUAL( 'a', wxTolower_l('A', loc) ); + CPPUNIT_ASSERT_EQUAL( 'a', wxTolower_l('a', loc) ); + CPPUNIT_ASSERT_EQUAL( 'z', wxTolower_l('Z', loc) ); + CPPUNIT_ASSERT_EQUAL( 'z', wxTolower_l('z', loc) ); + CPPUNIT_ASSERT_EQUAL( '0', wxTolower_l('0', loc) ); + CPPUNIT_ASSERT_EQUAL( '9', wxTolower_l('9', loc) ); + + // toupper + CPPUNIT_ASSERT_EQUAL( 'A', wxToupper_l('A', loc) ); + CPPUNIT_ASSERT_EQUAL( 'A', wxToupper_l('a', loc) ); + CPPUNIT_ASSERT_EQUAL( 'Z', wxToupper_l('Z', loc) ); + CPPUNIT_ASSERT_EQUAL( 'Z', wxToupper_l('z', loc) ); + CPPUNIT_ASSERT_EQUAL( '0', wxToupper_l('0', loc) ); + CPPUNIT_ASSERT_EQUAL( '9', wxToupper_l('9', loc) ); +} + +void XLocaleTestCase::TestCtypeFunctions() +{ + TestCtypeFunctionsWith(wxCLocale); + +#ifdef wxHAS_XLOCALE_SUPPORT + wxXLocale locFR("fr_FR"); + TestCtypeFunctionsWith(locFR); + + CPPUNIT_ASSERT( wxIsalpha_l('é', locFR) ); + CPPUNIT_ASSERT( wxIslower_l('é', locFR) ); + CPPUNIT_ASSERT( !wxIslower_l('É', locFR) ); + CPPUNIT_ASSERT( wxIsupper_l('É', locFR) ); +#endif +} + +#endif // wxUSE_XLOCALE diff --git a/wxGTK.spec b/wxGTK.spec index a265df2bf4..b7b5c3f318 100644 --- a/wxGTK.spec +++ b/wxGTK.spec @@ -327,6 +327,7 @@ wx/wxcrt.h wx/wxcrtbase.h wx/wxcrtvararg.h wx/wxprec.h +wx/xlocale.h wx/xti.h wx/xtistrm.h wx/zipstrm.h @@ -344,11 +345,11 @@ wx/unix/chkconf.h wx/unix/evtloop.h wx/unix/pipe.h wx/unix/stdpaths.h +wx/unix/stackwalk.h wx/unix/execute.h wx/unix/mimetype.h wx/unix/private.h wx/private/gsocketiohandler.h -wx/unix/stackwalk.h wx/fs_inet.h wx/gsocket.h wx/protocol/file.h diff --git a/wxMotif.spec b/wxMotif.spec index 1c6b54314c..d5fb0fef87 100644 --- a/wxMotif.spec +++ b/wxMotif.spec @@ -232,6 +232,7 @@ wx/wxcrt.h wx/wxcrtbase.h wx/wxcrtvararg.h wx/wxprec.h +wx/xlocale.h wx/xti.h wx/xtistrm.h wx/zipstrm.h @@ -249,11 +250,11 @@ wx/unix/chkconf.h wx/unix/evtloop.h wx/unix/pipe.h wx/unix/stdpaths.h +wx/unix/stackwalk.h wx/unix/execute.h wx/unix/mimetype.h wx/unix/private.h wx/private/gsocketiohandler.h -wx/unix/stackwalk.h wx/fs_inet.h wx/gsocket.h wx/protocol/file.h diff --git a/wxX11.spec b/wxX11.spec index bc9faeaaac..62135b2953 100644 --- a/wxX11.spec +++ b/wxX11.spec @@ -256,6 +256,7 @@ wx/wxcrt.h wx/wxcrtbase.h wx/wxcrtvararg.h wx/wxprec.h +wx/xlocale.h wx/xti.h wx/xtistrm.h wx/zipstrm.h @@ -273,11 +274,11 @@ wx/unix/chkconf.h wx/unix/evtloop.h wx/unix/pipe.h wx/unix/stdpaths.h +wx/unix/stackwalk.h wx/unix/execute.h wx/unix/mimetype.h wx/unix/private.h wx/private/gsocketiohandler.h -wx/unix/stackwalk.h wx/fs_inet.h wx/gsocket.h wx/protocol/file.h