From ff96ce192b2e56166db30d5eccc28197d953059e Mon Sep 17 00:00:00 2001 From: Bryan Petty Date: Wed, 28 Aug 2002 20:02:20 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create tag 'wxPy_2_3_3_pre'. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/tags/wxPy_2_3_3_pre@16847 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/html/icons/no.gif | Bin 0 -> 298 bytes docs/html/icons/somewhat.gif | Bin 0 -> 290 bytes docs/html/icons/yes.gif | Bin 0 -> 290 bytes docs/html/roadmap.htm | 165 +++ docs/mac/changes.txt | 4 + docs/symbols.txt | 64 + samples/mdi/bitmaps/bitmap1.bmp | Bin 0 -> 238 bytes samples/mdi/bitmaps/bitmap2.bmp | Bin 0 -> 238 bytes samples/mdi/bitmaps/calc.bmp | Bin 0 -> 702 bytes samples/mdi/bitmaps/copy.bmp | Bin 0 -> 238 bytes samples/mdi/bitmaps/cut.bmp | Bin 0 -> 238 bytes samples/mdi/bitmaps/dirplain.xbm | 14 + samples/mdi/bitmaps/draft.xbm | 14 + samples/mdi/bitmaps/drawing.xbm | 14 + samples/mdi/bitmaps/flowchar.xbm | 14 + samples/mdi/bitmaps/help.bmp | Bin 0 -> 238 bytes samples/mdi/bitmaps/helpcs.bmp | Bin 0 -> 238 bytes samples/mdi/bitmaps/new.bmp | Bin 0 -> 238 bytes samples/mdi/bitmaps/open.bmp | Bin 0 -> 238 bytes samples/mdi/bitmaps/paste.bmp | Bin 0 -> 238 bytes samples/mdi/bitmaps/preview.bmp | Bin 0 -> 238 bytes samples/mdi/bitmaps/print.bmp | Bin 0 -> 238 bytes samples/mdi/bitmaps/save.bmp | Bin 0 -> 238 bytes samples/mdi/bitmaps/tick.bmp | Bin 0 -> 220 bytes samples/mdi/bitmaps/write.xbm | 14 + samples/minifram/bitmaps/copy.bmp | Bin 0 -> 238 bytes samples/minifram/bitmaps/cut.bmp | Bin 0 -> 238 bytes samples/minifram/bitmaps/help.bmp | Bin 0 -> 238 bytes samples/minifram/bitmaps/new.bmp | Bin 0 -> 238 bytes samples/minifram/bitmaps/open.bmp | Bin 0 -> 238 bytes samples/minifram/bitmaps/page.bmp | Bin 0 -> 714 bytes samples/minifram/bitmaps/paste.bmp | Bin 0 -> 238 bytes samples/minifram/bitmaps/preview.bmp | Bin 0 -> 238 bytes samples/minifram/bitmaps/print.bmp | Bin 0 -> 238 bytes samples/minifram/bitmaps/save.bmp | Bin 0 -> 238 bytes samples/minimal/MinimalM6.mcp | Bin 0 -> 177251 bytes samples/minimal/makemac6.mcp | Bin 0 -> 177251 bytes samples/treectrl/bitmaps/file1.bmp | Bin 0 -> 246 bytes samples/treectrl/bitmaps/file1.ico | Bin 0 -> 318 bytes samples/treectrl/bitmaps/file2.bmp | Bin 0 -> 246 bytes samples/treectrl/bitmaps/file2.ico | Bin 0 -> 318 bytes samples/treectrl/bitmaps/folder1.bmp | Bin 0 -> 246 bytes samples/treectrl/bitmaps/folder1.ico | Bin 0 -> 318 bytes samples/treectrl/bitmaps/folder2.bmp | Bin 0 -> 246 bytes samples/treectrl/bitmaps/folder2.ico | Bin 0 -> 318 bytes samples/treectrl/bitmaps/folder3.bmp | Bin 0 -> 246 bytes samples/treectrl/bitmaps/folder3.ico | Bin 0 -> 318 bytes samples/wizard/Wiztest.bmp | Bin 0 -> 15718 bytes src/makeg95.env | 21 +- src/makemac6.mcp | Bin 0 -> 474140 bytes src/makemac7.mcp | Bin 0 -> 721023 bytes src/regex/COPYRIGHT | 176 +-- src/regex/Makefile | 144 +- src/regex/cclass.h | 20 + src/regex/cname.h | 102 ++ src/regex/debug.c | 242 +++ src/regex/engine.c | 1019 +++++++++++++ src/regex/re_main.c | 510 +++++++ src/regex/re_syntax.n | 970 ------------ src/regex/regc_color.c | 780 ---------- src/regex/regc_cvec.c | 189 --- src/regex/regc_lex.c | 1146 -------------- src/regex/regc_locale.c | 838 ----------- src/regex/regc_nfa.c | 1559 -------------------- src/regex/rege_dfa.c | 699 --------- src/regex/regerrs.h | 75 - src/regex/regex.7 | 235 +++ src/regex/regex.h | 244 +-- src/regex/regex2.h | 134 ++ src/regex/regfronts.c | 83 -- src/regex/regguts.h | 417 ------ src/regex/split.c | 316 ++++ src/regex/tclUniData.c | 904 ------------ src/regex/utils.h | 22 + utils/wxPython/src/makefile.nt | 339 +++++ utils/wxPython/src/wxp.cpp | 2049 ++++++++++++++++++++++++++ wxPython/b.bat | 1 + wxPython/distrib/README.devel.txt | 27 + wxPython/distrib/make_installer.py | 14 +- wxPython/distrib/makedemo | 4 +- wxPython/distrib/makedev.bat | 83 +- wxPython/distrib/makedocs.bat | 26 + 82 files changed, 5621 insertions(+), 8070 deletions(-) create mode 100644 docs/html/icons/no.gif create mode 100644 docs/html/icons/somewhat.gif create mode 100644 docs/html/icons/yes.gif create mode 100644 docs/html/roadmap.htm create mode 100644 docs/mac/changes.txt create mode 100644 docs/symbols.txt create mode 100644 samples/mdi/bitmaps/bitmap1.bmp create mode 100644 samples/mdi/bitmaps/bitmap2.bmp create mode 100644 samples/mdi/bitmaps/calc.bmp create mode 100644 samples/mdi/bitmaps/copy.bmp create mode 100644 samples/mdi/bitmaps/cut.bmp create mode 100644 samples/mdi/bitmaps/dirplain.xbm create mode 100644 samples/mdi/bitmaps/draft.xbm create mode 100644 samples/mdi/bitmaps/drawing.xbm create mode 100644 samples/mdi/bitmaps/flowchar.xbm create mode 100644 samples/mdi/bitmaps/help.bmp create mode 100644 samples/mdi/bitmaps/helpcs.bmp create mode 100644 samples/mdi/bitmaps/new.bmp create mode 100644 samples/mdi/bitmaps/open.bmp create mode 100644 samples/mdi/bitmaps/paste.bmp create mode 100644 samples/mdi/bitmaps/preview.bmp create mode 100644 samples/mdi/bitmaps/print.bmp create mode 100644 samples/mdi/bitmaps/save.bmp create mode 100644 samples/mdi/bitmaps/tick.bmp create mode 100644 samples/mdi/bitmaps/write.xbm create mode 100644 samples/minifram/bitmaps/copy.bmp create mode 100644 samples/minifram/bitmaps/cut.bmp create mode 100644 samples/minifram/bitmaps/help.bmp create mode 100644 samples/minifram/bitmaps/new.bmp create mode 100644 samples/minifram/bitmaps/open.bmp create mode 100644 samples/minifram/bitmaps/page.bmp create mode 100644 samples/minifram/bitmaps/paste.bmp create mode 100644 samples/minifram/bitmaps/preview.bmp create mode 100644 samples/minifram/bitmaps/print.bmp create mode 100644 samples/minifram/bitmaps/save.bmp create mode 100644 samples/minimal/MinimalM6.mcp create mode 100644 samples/minimal/makemac6.mcp create mode 100644 samples/treectrl/bitmaps/file1.bmp create mode 100644 samples/treectrl/bitmaps/file1.ico create mode 100644 samples/treectrl/bitmaps/file2.bmp create mode 100644 samples/treectrl/bitmaps/file2.ico create mode 100644 samples/treectrl/bitmaps/folder1.bmp create mode 100644 samples/treectrl/bitmaps/folder1.ico create mode 100644 samples/treectrl/bitmaps/folder2.bmp create mode 100644 samples/treectrl/bitmaps/folder2.ico create mode 100644 samples/treectrl/bitmaps/folder3.bmp create mode 100644 samples/treectrl/bitmaps/folder3.ico create mode 100644 samples/wizard/Wiztest.bmp create mode 100644 src/makemac6.mcp create mode 100644 src/makemac7.mcp create mode 100644 src/regex/cclass.h create mode 100644 src/regex/cname.h create mode 100644 src/regex/debug.c create mode 100644 src/regex/engine.c create mode 100644 src/regex/re_main.c delete mode 100644 src/regex/re_syntax.n delete mode 100644 src/regex/regc_color.c delete mode 100644 src/regex/regc_cvec.c delete mode 100644 src/regex/regc_lex.c delete mode 100644 src/regex/regc_locale.c delete mode 100644 src/regex/regc_nfa.c delete mode 100644 src/regex/rege_dfa.c delete mode 100644 src/regex/regerrs.h create mode 100644 src/regex/regex.7 create mode 100644 src/regex/regex2.h delete mode 100644 src/regex/regfronts.c delete mode 100644 src/regex/regguts.h create mode 100644 src/regex/split.c delete mode 100644 src/regex/tclUniData.c create mode 100644 src/regex/utils.h create mode 100644 utils/wxPython/src/makefile.nt create mode 100644 utils/wxPython/src/wxp.cpp create mode 100644 wxPython/distrib/README.devel.txt create mode 100755 wxPython/distrib/makedocs.bat diff --git a/docs/html/icons/no.gif b/docs/html/icons/no.gif new file mode 100644 index 0000000000000000000000000000000000000000..65fc311b1d013805d43158ffb7c1a1674bc896e4 GIT binary patch literal 298 zcmZ?wbhEHb6k!lyxXQ_Z2OKzX0FUe-ky8B0!pOkD$)E#r56DjrZ0-kI3OsbA+PPYS zCVD8%IR5O@j25?EKkcxSSL4=m4OyyNfe8 SiXwy3s;c5zi+fxg8LR<3{3^)+ literal 0 HcmV?d00001 diff --git a/docs/html/icons/somewhat.gif b/docs/html/icons/somewhat.gif new file mode 100644 index 0000000000000000000000000000000000000000..11dd29b01839f13e3cf48595ebaaa7c3ca1dc896 GIT binary patch literal 290 zcmZ?wbhEHb6k!lyxXQ_Z3;h4jaNxj!bLWzADHtT;ia%Kx85lSjbU^L_`N@IJ{yZ0ir)0I8i6Nm^hBLjg{-=pwlIvvjI+;f{=F?x8gc6DvUfz~g-E^p`f0c9 Q+efoQ>T8?w+#MOL0Ry@whX4Qo literal 0 HcmV?d00001 diff --git a/docs/html/icons/yes.gif b/docs/html/icons/yes.gif new file mode 100644 index 0000000000000000000000000000000000000000..759fc9e8e9d51eacd30fe15cd4771d5f6821d5ed GIT binary patch literal 290 zcmZ?wbhEHb6k!lyxXQ_Z3!GtLIdI^>ACnYZ3I>U|;!hSv1_n+B9gurKesW;5KhRR( zp(EAr%*xcLqBs4lM&L;sJyEAsA*=4DEevBZ>W{gAyO~De%dYj Q_R;K+`r4*EcSi + + wxWindows Roadmap + + + + + + + + + + + + +
+ +wxWindows Roadmap + +
+ +

+ +

+Schedule | To-Do List +
+ +

+ +This page represents current thinking about where wxWindows is going in the near, +medium and long-term. It also serves as a schedule for new releases so +that both developers and users can know what to expect when, at least approximately.

+ +We are adopting the Linux kernel style of numbering system where odd minor version numbers are development +versions, and even numbers are stable versions. For example, 2.1.x are development releases, +and the next 'stable' or final release of it would be 2.2.

+ +Bug-fix patches to the stable release (if made) then become point +releases of 2.2 (2.2.x) while development continues with wild abandon +on 2.3.x until the end of the next development cycle when it is +released as 2.4.

+ +Development versions that end up on the FTP site or CD-ROM, as opposed to remaining +in the CVS archive, are semi-stable -- i.e. they are checked for compilation and +run-time problems, but not as thoroughly as the stable versions.

+ +Note that since the wxWindows effort is voluntary, these are not hard-and-fast deadlines: +but we will endeavour to follow them as closely as possible.

+ +Note also that the releases described are for wxGTK, wxMSW and wxMotif ports. wxMac currently follows +its own development path but is due to merge with the main code base in November/December. +Also, minor snapshot releases for specific platforms may be +available at dates convenient to the developers. + +Finally, this page only shows the things which are still left to do, please +look elsewhere to see the complete list of changes between the releases, +including the things which are already done. +

+ +

+
Schedule
+
+

+ +

Release 2.4.0 (stable)

+ +Release date: Summer 2002? + +

+ +Stable version of 2.3. + +

    +
  1. Very important +
      +
    • wxMac: make the release together with the other ports +
    • Fix wxStream::Eof() problems +
    • wxGTK: GTK+ 2.0 support +
    + +
  2. Important +
      +
    • (Unix) implement wx-config as a version and build + parameters independent script which would just read the + configuration files +
    • Finish wxFileName +
    • Make it possible to process the key strokes portably +
    • Add wxSemaphor, fix wxCondition +
    + +
  3. Nice to have +
      +
    • support for text in the wxToolBar buttons +
    • radio buttons in wxToolBar +
    • possibility to use individual wxUniv controls from the native + ports +
    +
+ +

+ +

Release 3.0.0 (stable)

+ +This release should finally mark the end of support for the antiquated +compilers without decent support of the modern C++ features such as templates, +exceptions and namespaces. wxWindows containers should be replaced with the +corresponding standard library classes and std::basic_string<> +should be used instead of wxString. + +

+ +

+
To-Do List
+
+ +

+ +This is just a collection of the various things which it would be nice to +include in wxWindows but which are not actively worked on right now and for +which no schedule is fixed yet. If you're interested in helping with wxWindows +development, one of the small projects below could be a great way to join the +team! + +

+Developers: please feel free to add to these, and delete them when they are done. + +

+ +General

+ +

    +
  • A rich text editor similar to GTK+ 2.0 GtkTextView but cross-platform +
  • Extend and unify drag and drop handling (e.g. we need to specify multiple drop targets +that can handle multiple formats). +
  • Support for 'skins', perhaps using a set of alternative control and window classes +written generically in wxWindows. +
  • Serial and parallel port support. +
  • Modem and telephony support. +
  • Book, tutorial. +
  • More examples. +
+ +

+ +wxMSW

+ +

    +
  • Windows CE port. +
+ +

+ +wxGTK

+ +

    +
  • Full Unicode support using GTK+ 2.0 +
  • Wrap the new GTK+ 2.0 GtkTextView powerful widget +
  • GNOME/KDE integration libraries. +
+ +

+ + + + diff --git a/docs/mac/changes.txt b/docs/mac/changes.txt new file mode 100644 index 0000000000..455164c50b --- /dev/null +++ b/docs/mac/changes.txt @@ -0,0 +1,4 @@ +These are the changes for wxMac 2.3.2 + +- support for configuration and build under Mac OS X using the Apple Developer + Tools diff --git a/docs/symbols.txt b/docs/symbols.txt new file mode 100644 index 0000000000..d79695390b --- /dev/null +++ b/docs/symbols.txt @@ -0,0 +1,64 @@ +This is a list of preprocessor symbols used in the wxWindows source. + +GUIs: +----- + +__X__ any X, but not GTK +__WXMOTIF__ Motif +__WXXT__ Xt; mutually exclusive with WX_MOTIF (?) +__WXGTK__ GTK +__WXGTK12__ GTK 1.2 or higher +__WXMSW__ Any Windows +__WXWINE__ WINE (i.e. Win32 on Unix) +__WXMAC__ MacOS +__WXPM__ OS/2 native Presentation Manager +__UNIX__ any Unix +__WINDOWS__ any Windows +__WIN95__ GUI for Windows 95 and above; NT 4.0 and above. +__WIN32__ WIN32 API +__NT__ Windows NT +__WXCURSES__ CURSES +__WXSTUBS__ Stubbed version ('template' wxWin implementation) + +In fact, they should better all start with __WX instead of __ only. +The only GUIs implemented for 2.0 are __WXGTK__, __WXMSW__ and __WXMOTIF__ +yet. Any new ones, please start the define with __WX. + +OSes/machines: + +__HPUX__ +__SVR4__ +__SYSV__ +__LINUX__ +__SGI__ +__ULTRIX__ +__BSD__ +__VMS__ +__SUN__ Any Sun +__SUNOS__ +__SOLARIS__ +__ALPHA__ +__AIX__ +__DATA_GENERAL__ +__OSF__ +__FREEBSD__ + +Compilers: +---------- + +__GNUWIN32__ Gnu-Win32 compiler +__DJGPP__ DJGPP +__GNUG__ Gnu C++ on any platform +__BORLANDC__ Borland C++ +__WATCOMC__ Watcom C++ +__SYMANTECC__ Symantec C++ +__VISUALC__ VC++ +__SUNCC__ Sun CC +__XLC__ ?? compiler + +wxWindows modes: +---------------- + +__WXDEBUG__ usage: #ifdef __WXDEBUG__ (=> debug mode, else => release) +WXDEBUG usage: #if DEBUG (0: release, 1: minimal debug code, ...) + diff --git a/samples/mdi/bitmaps/bitmap1.bmp b/samples/mdi/bitmaps/bitmap1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..13e2170b7369879a97bdd01c57b42af6f4126264 GIT binary patch literal 238 zcmZup$qj%o3^Ni^o-hV;@Mo922+wZTPQ(hutwBPF)JM*)+X=-^TgaK5$N?i2IJ*8x z1_Y+Pr$L8wG(}1gYeu+p9^X1)J~P=@jSHSMY)3;sNkY2 zEPWRLqal$RV;7jK=A7!i)5w*|^bK%qLGNEQTGkCeTtf<*)|jz0bZVCKqs&^|_qZ0` QxOhk{d)WGeIhJR90ll(R-T(jq literal 0 HcmV?d00001 diff --git a/samples/mdi/bitmaps/calc.bmp b/samples/mdi/bitmaps/calc.bmp new file mode 100644 index 0000000000000000000000000000000000000000..6eee9cce8c1cd915f888258cbe729ead1bd19154 GIT binary patch literal 702 zcmb_au?~YE5Irx%5Yt3s8t0Dvj!s?rJGCQQ+5Dr%Phu+@eTOJ&J65>kc*i{+$mRB8 zir*dn3_B$&NRgzjDUXnvWD*mZ*vS})U}yrtjpGO;#7-ed1Va-D?qsnKj9o{pONo4E z=SW$8Ry{v3rW_(y(GKz2ve{!yz;yK6de4prWZZYnKX}+;&!|X|N~(EKex+yNkTX!S zC{hM1mzs$OSe-HOyvrWSe{huaqdx5G;~96=hail3mzCD(23HE&t@imYryJdJIIh98 l_{`r1+)_Gc{@aa(hUFE=46BTeZz9d~YGx{Aj)6VK;sXibpM3xT literal 0 HcmV?d00001 diff --git a/samples/mdi/bitmaps/copy.bmp b/samples/mdi/bitmaps/copy.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4551a06bfa79e0a42c1ffb7cdbb90fd4f699dce2 GIT binary patch literal 238 zcmZvVK?*`K3`9pLxU9$U91{2|@hV+>tjiv)Cz3AyzP{vxy7<$~OeTT!c7JQf6T89- z%?kmn<${;(P#uFN<0A#FuUo(qgT{&F@ekspii W=d@ZzPG(Cb=QBs}_=7thzxV(viB<;y literal 0 HcmV?d00001 diff --git a/samples/mdi/bitmaps/cut.bmp b/samples/mdi/bitmaps/cut.bmp new file mode 100644 index 0000000000000000000000000000000000000000..15554338a01bc4d8f0a501c32237e84200e64583 GIT binary patch literal 238 zcmZvU!3}^Q5Cqr6gr}Ba8OD(CvKJo2^+{<|WDB@(K8*2TclNjo+kV075Ef~cCTYMZ z2hQ$)mH}PlY>+FWlp?l4?H9GSBqTFi~p=nI%+}YJ={H-mN0|?29BK#fUL#erbtT(lh^R?4vYy(d-6AGn1|j$rr}v KbDqI%Xjd+{i$y;G literal 0 HcmV?d00001 diff --git a/samples/mdi/bitmaps/helpcs.bmp b/samples/mdi/bitmaps/helpcs.bmp new file mode 100644 index 0000000000000000000000000000000000000000..88373816814a283aa9ecca7899faf81ce7a15b4e GIT binary patch literal 238 zcmZvV!3{z&3`32Clp~D69NgKZC&ICtwG;gn%5(a;k=Ax%E6VeAXxAHgfIGN>i>|Qr zDgH-8;%kg8Fsb(=J`dZ5!;MsyQTV&Nwu@o7(Ri`byve-X0yz0?`b73&zHji5? LZQ&!hb;b0l4tjP;1(ew=nJ8j|<6WY3bU0`GK9aK^RUId`!4(ELX-1{H u>6c`QQqJ8_T9s0iQsQ8(Wab^@`3kuPA_p->w)Xt4Pkz>06 literal 0 HcmV?d00001 diff --git a/samples/mdi/bitmaps/open.bmp b/samples/mdi/bitmaps/open.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bbf93fe03364e63f3e18a3507a0e85ab8ea2f87d GIT binary patch literal 238 zcmXv{u@M3>3=;=;U&0ua+_3>YyQsonW~6N3OvKTr2(k@|B{{YeKb~(CUb3rr5zpcQ zCn>O}mP9XDa6kd~GO1FGG0<95V`X5i$V8neN$dxz4&8XX3!AZr-;ApY^eS-9oTLj~ Y^Hcc9z2|$wrXTtLH=Rc2n(WoWFRhqJ00000 literal 0 HcmV?d00001 diff --git a/samples/mdi/bitmaps/paste.bmp b/samples/mdi/bitmaps/paste.bmp new file mode 100644 index 0000000000000000000000000000000000000000..564f514e0df7225f0a7adbe8457b41af537813bd GIT binary patch literal 238 zcmZvVF%Ci@5Jbns$83OZ*I;# co}I%%@f6>ra3+S=gC69}eM%GII+SAI4J;x>B>(^b literal 0 HcmV?d00001 diff --git a/samples/mdi/bitmaps/preview.bmp b/samples/mdi/bitmaps/preview.bmp new file mode 100644 index 0000000000000000000000000000000000000000..da1f4dbc4be6c2dd8fb9d7cb71cc48a4a7c139ca GIT binary patch literal 238 zcmZvVu?@p83pv2yNo4mlT?N_pr2ISnd1NHDM5O^cFcMc59&^> z)PfrwsOeYM05)2ipmU4fJIss+o(=cdQCu+!%TlZiKDH!a!aP2;C|UGpLD9M;zmsLJ XIp;lzIUm!ckI6HO{IjaYcZ_-fA4^nl literal 0 HcmV?d00001 diff --git a/samples/mdi/bitmaps/print.bmp b/samples/mdi/bitmaps/print.bmp new file mode 100644 index 0000000000000000000000000000000000000000..00319b55bb23c3c69cc051144d80e5275747c53e GIT binary patch literal 238 zcmZur!3_d23^Ni^o@EUFY`~vgA|YX<`*bfpod|VizM>j+f}Fx~Q7! zgtHKM7yg3|DAD^Sp<0YF#C}+nSj(MC$5#Ss27*aN<{l9dYV3`7rsq)3!X>4ws(){6V0MX5FKAjcylGXqN-n#XsS=YhW0WogZT{L^_i_GT%*k@+ph E1NJ~MtpET3 literal 0 HcmV?d00001 diff --git a/samples/mdi/bitmaps/tick.bmp b/samples/mdi/bitmaps/tick.bmp new file mode 100644 index 0000000000000000000000000000000000000000..c0d66c94601657fee33b923de9b1791844d7a331 GIT binary patch literal 220 zcmXv`!4bnS2vd9<&b6P6(K-6>8h!H$UytTNvWqL(DMm;L@cVON#YuV*&l?*Ih5AeU z{bqVO)bKZHuqJq2P$o+ Qrwbl?Kzn<_G@1WzKlk4xlmGw# literal 0 HcmV?d00001 diff --git a/samples/mdi/bitmaps/write.xbm b/samples/mdi/bitmaps/write.xbm new file mode 100644 index 0000000000..1409e98f1b --- /dev/null +++ b/samples/mdi/bitmaps/write.xbm @@ -0,0 +1,14 @@ +#define write_width 32 +#define write_height 32 +static char write_bits[] = { + 0x00, 0x80, 0x00, 0x00, 0x00, 0x40, 0x01, 0x00, 0x00, 0x20, 0x02, 0x00, + 0x00, 0x10, 0x04, 0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x04, 0x10, 0x00, + 0x00, 0x92, 0x20, 0x00, 0x00, 0x49, 0x40, 0x00, 0x80, 0x04, 0x81, 0x00, + 0x40, 0x90, 0x04, 0x01, 0x20, 0x09, 0x02, 0x02, 0x90, 0x20, 0x01, 0x04, + 0x08, 0x92, 0x00, 0x08, 0x24, 0x49, 0x00, 0x10, 0x92, 0x00, 0xfc, 0x20, + 0x49, 0x12, 0x02, 0x41, 0x22, 0x09, 0x01, 0x82, 0x84, 0x84, 0x0c, 0x44, + 0x48, 0x82, 0x13, 0x28, 0x10, 0x79, 0xfe, 0xf1, 0x20, 0x44, 0x0c, 0xe0, + 0x40, 0x82, 0x00, 0xe0, 0x80, 0x00, 0x01, 0xe0, 0x00, 0x01, 0x06, 0xe0, + 0x00, 0x02, 0xf8, 0xe7, 0x00, 0x04, 0x40, 0xf8, 0x00, 0x08, 0x20, 0xe0, + 0x00, 0x10, 0x10, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x40, 0x04, 0x00, + 0x00, 0x80, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00}; diff --git a/samples/minifram/bitmaps/copy.bmp b/samples/minifram/bitmaps/copy.bmp new file mode 100644 index 0000000000000000000000000000000000000000..4551a06bfa79e0a42c1ffb7cdbb90fd4f699dce2 GIT binary patch literal 238 zcmZvVK?*`K3`9pLxU9$U91{2|@hV+>tjiv)Cz3AyzP{vxy7<$~OeTT!c7JQf6T89- z%?kmn<${;(P#uFN<0A#FuUo(qgT{&F@ekspii W=d@ZzPG(Cb=QBs}_=7thzxV(viB<;y literal 0 HcmV?d00001 diff --git a/samples/minifram/bitmaps/cut.bmp b/samples/minifram/bitmaps/cut.bmp new file mode 100644 index 0000000000000000000000000000000000000000..15554338a01bc4d8f0a501c32237e84200e64583 GIT binary patch literal 238 zcmZvU!3}^Q5Cqr6gr}Ba8OD(CvKJo2^+{<|WDB@(K8*2TclNjo+kV075Ef~cCTYMZ z2hQ$)mH}PlY>+FWlp?l4?H9GSBqTFi~p=nI%+}YJ={H-mN0|?29BK#fUL#erbtT(lh^R?4vYy(d-6AGn1|j$rr}v KbDqI%Xjd+{i$y;G literal 0 HcmV?d00001 diff --git a/samples/minifram/bitmaps/new.bmp b/samples/minifram/bitmaps/new.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d66feb2384ad4c626a078c995c1a3e49af78ec3c GIT binary patch literal 238 zcmbu2yA6Oa5JQcGL>b0l4tjP;1(ew=nJ8j|<6WY3bU0`GK9aK^RUId`!4(ELX-1{H u>6c`QQqJ8_T9s0iQsQ8(Wab^@`3kuPA_p->w)Xt4Pkz>06 literal 0 HcmV?d00001 diff --git a/samples/minifram/bitmaps/open.bmp b/samples/minifram/bitmaps/open.bmp new file mode 100644 index 0000000000000000000000000000000000000000..bbf93fe03364e63f3e18a3507a0e85ab8ea2f87d GIT binary patch literal 238 zcmXv{u@M3>3=;=;U&0ua+_3>YyQsonW~6N3OvKTr2(k@|B{{YeKb~(CUb3rr5zpcQ zCn>O}mP9XDa6kd~GO1FGG0<95V`X5i$V8neN$dxz4&8XX3!AZr-;ApY^eS-9oTLj~ Y^Hcc9z2|$wrXTtLH=Rc2n(WoWFRhqJ00000 literal 0 HcmV?d00001 diff --git a/samples/minifram/bitmaps/page.bmp b/samples/minifram/bitmaps/page.bmp new file mode 100644 index 0000000000000000000000000000000000000000..3dbd4b05b4c2d1a4f046141d450caf34c1a3d470 GIT binary patch literal 714 zcmaJk)fu{chJ-2TT-iZmtVS?uc5roS;-EuD8k*^vaH9hj_d6X ziQgC358^U$kRpEdIqzx8X~Jz0i&xCtBKWwA%eHOw^mwIrw+KG&;&N&1L*Q{1Xmx8p zxBo0O*pac2@{B`!>-fgLdSDP(C2}M>_DcBv60g*0UKyHhy!Oc8UYD-XBeIyOWTry_ zTA4Yuua#Ixm?vFMcI3@F*>XSp02Lyo AJ^%m! literal 0 HcmV?d00001 diff --git a/samples/minifram/bitmaps/paste.bmp b/samples/minifram/bitmaps/paste.bmp new file mode 100644 index 0000000000000000000000000000000000000000..564f514e0df7225f0a7adbe8457b41af537813bd GIT binary patch literal 238 zcmZvVF%Ci@5Jbns$83OZ*I;# co}I%%@f6>ra3+S=gC69}eM%GII+SAI4J;x>B>(^b literal 0 HcmV?d00001 diff --git a/samples/minifram/bitmaps/preview.bmp b/samples/minifram/bitmaps/preview.bmp new file mode 100644 index 0000000000000000000000000000000000000000..da1f4dbc4be6c2dd8fb9d7cb71cc48a4a7c139ca GIT binary patch literal 238 zcmZvVu?@p83pv2yNo4mlT?N_pr2ISnd1NHDM5O^cFcMc59&^> z)PfrwsOeYM05)2ipmU4fJIss+o(=cdQCu+!%TlZiKDH!a!aP2;C|UGpLD9M;zmsLJ XIp;lzIUm!ckI6HO{IjaYcZ_-fA4^nl literal 0 HcmV?d00001 diff --git a/samples/minifram/bitmaps/print.bmp b/samples/minifram/bitmaps/print.bmp new file mode 100644 index 0000000000000000000000000000000000000000..00319b55bb23c3c69cc051144d80e5275747c53e GIT binary patch literal 238 zcmZur!3_d23^Ni^o@EUFY`~vgA|YX<`*bfpod|VizM>j+f}Fx~Q7! zgtHKM7yg3|DAD^Sp<0YF#C}+nSj(MC$5#Ss27*aN<{l9dYV3`7rsq)3!X>4ws(){6V0MX5FKAjcylGXqN-n#XsS=YhW0WogZT{L^_i_GT%*k@+ph E1NJ~MtpET3 literal 0 HcmV?d00001 diff --git a/samples/minimal/MinimalM6.mcp b/samples/minimal/MinimalM6.mcp new file mode 100644 index 0000000000000000000000000000000000000000..91b47b8e2a5ecf4f59b5242e908166b542986a7d GIT binary patch literal 177251 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�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

RFJVA>_9_3(n&+bDoDbR8~p(*IImL&U>zb{7fOg z6ZXXY5_1mS4LNKfDR*CrEsxL4`Pdf_oGs*M(0O=VV$K`ifxKPHF9VnUzxh4LsUwh` zUD!(hZ|?`eIa2;DIFGl?+58>kYlQrsr-6CAWzM$#z-xv4-Z#K`yk*YWg^-^s-DR%hcRgA-`D4?*ZrWmO0f@w@zD9wpHLoZ zZ?K0)U@PlePS-VRSFk5)VsYTiEC|*M`NPv=aUdTy6vRZ*|Ki$M9Qft)5L_YTk1YV^ ze;+aD#nir63i&^ui^Tyzrd-A4jy^MDabWH=$gdXqTj)9<+iNP~n{thipYaoL(GS%l zsv$=?kd!SH4`h4&ybyv7B!-;EfgHaNqpk`aPja-Uj00*PKk#)z{y5c7!~s=>Ou1gl zUj&zS#$wDVHwgLjJAnTx#(UM*z&CQa zG7emd7@}+x@;8FfIN+RK4*4xY{=#p-WgPftYXiV#9N3Wq`7echCzVUa0ng)*-^JyQ zk+3J@fb*Qekl!uzU%Gd zg`CQPDvg8xdv6!=*Aa`9UkQ03VjbJY<;slSkpEi9i{MXry;e?~0QqJipFw^*Sm^hr zYZe_3`!jHyERQm?7;@@QNLfpz8ZD2qVi)9(2>Bu!PqI8t^lb%t zNRA&ZkCumBjcbMSJ0bU+3ogpTUO5Hw$D|zNSS!yG2jpA0oMmT%%kun%%89l|ax~l+ zE6+OAQF%hhBd39j@~}r}TvK~PpZb{QpF^L9{3#(n!wW9`GoR}9dnsQTEf2e!#x;(i z)Q!#~%A+_Ahx{2XcARx)v^?y$MUX!$cdF3WQtVu11oA-`;VtUUdxpZrnCuPz0b N{`oaxwelRv{~zD|p}7D6 literal 0 HcmV?d00001 diff --git a/samples/minimal/makemac6.mcp b/samples/minimal/makemac6.mcp new file mode 100644 index 0000000000000000000000000000000000000000..47fe39649f74d7489d5b457a4ef84b228eeed408 GIT binary patch literal 177251 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 PaOt04BUUTVk^KJw3jdaJ literal 0 HcmV?d00001 diff --git a/samples/treectrl/bitmaps/file1.bmp b/samples/treectrl/bitmaps/file1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..9a0544b232721e18b22e955fb09d0aecf303084e GIT binary patch literal 246 zcmb76u@Qhk2#a_2IEHiByN)%Z{YX@{F~Hl{nTJ5geU9@+pG+w28v8D8A}#Qhy;IFj7@ygw>C%Gjy Ic=~?n20JQ3^Ni-#Q@?8?qKH~=AO{C-}EFV)?gPQ|vY5syfFq)-GNQHlM{HwKiPD_E1e*gdg literal 0 HcmV?d00001 diff --git a/samples/treectrl/bitmaps/file2.ico b/samples/treectrl/bitmaps/file2.ico new file mode 100644 index 0000000000000000000000000000000000000000..b1059f953ac241d4603e4d4a3945bf391fac006b GIT binary patch literal 318 zcma)$yA6Oa3`8#y5~3m%EtG7*Y8inx+him*2=9`H0wm79^DmAp1uVuWV-M2e2;JFW z(11#%>6;`8S4usgq$;HlJ*dr9t22nXW%Px# literal 0 HcmV?d00001 diff --git a/samples/treectrl/bitmaps/folder1.bmp b/samples/treectrl/bitmaps/folder1.bmp new file mode 100644 index 0000000000000000000000000000000000000000..dada286b64daeafc29cbe1abb95401624b3db837 GIT binary patch literal 246 zcmZ?r{l)+RWk5;;hy|dSk%0v)(EuhP1WXRX1IhpqLqh|E0+K)`!+`?_fHX+rKNvCm z{|{mTF%W`;Kzwunlm~$y9bnM#<99U(H2nC!9R!HyL(FaX0o1gkqoecPSa@q@HtU$5w1BQo>3pGM-6# z*h6P#m^7hM480O6E=HUVB~)t-??N9(y*q-KQ?)lN;2+{|7maOGxnFh_zYD7 literal 0 HcmV?d00001 diff --git a/samples/treectrl/bitmaps/folder2.bmp b/samples/treectrl/bitmaps/folder2.bmp new file mode 100644 index 0000000000000000000000000000000000000000..35fedba962e0accf24a09879b654eafe8a6e0380 GIT binary patch literal 246 zcmZ?r{l)+RWk5;;hy|dSk%0v)(EuccxFHxO2bN#}%77#r8Xy#q1Tq;895?`^K@$JL z2t)u`VDdjm2uJ`iDgerZz>f|vX!!BF8Uz}CeBTZN#PcDhHv9l;+R@R`|G&Gsx*sG4 IG#J@J0LHU(N&o-= literal 0 HcmV?d00001 diff --git a/samples/treectrl/bitmaps/folder2.ico b/samples/treectrl/bitmaps/folder2.ico new file mode 100644 index 0000000000000000000000000000000000000000..15f47103f538e96d2b68ea26429d26d78bea7614 GIT binary patch literal 318 zcma)#Ar8YZ3`KvWf{q0h5B3;6%I*R6)e$1?s%Mr6RQr?0{`Mrws je=a8}bLeH3=4S{|`+GCpIqvG{V+STBCzU}W zJbS@LCD6d+kw&PsvY;KcfvIP8_9LweY>}jB7{$$SiK`)t$xxgT#Xpb|=Ral^ylYuU E4~Mx*tN;K2 literal 0 HcmV?d00001 diff --git a/samples/treectrl/bitmaps/folder3.ico b/samples/treectrl/bitmaps/folder3.ico new file mode 100644 index 0000000000000000000000000000000000000000..1ed6ff97371e227f55c50fb1175051f23ed8001b GIT binary patch literal 318 zcmaiwI}U^}3`8elB}!6JQ*OBu7mTzQLZYO}&9ZNjK!sR4GtaX5Sdju5W0d0^q}fF7 zEGX!OOR4&uG4U{^2AonkXXrtxN2Rzzq+7Osu{wBYFhA1XxtR=(ll?=7gZkq3_=mQK WcVYbrja>t@xR0u{55INy_RbG_JvP4p literal 0 HcmV?d00001 diff --git a/samples/wizard/Wiztest.bmp b/samples/wizard/Wiztest.bmp new file mode 100644 index 0000000000000000000000000000000000000000..d70d3f25bea80a37140ee1379acc3a59afd21e35 GIT binary patch literal 15718 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 literal 0 HcmV?d00001 diff --git a/src/makeg95.env b/src/makeg95.env index 4ecb310617..a84cdd4ab3 100644 --- a/src/makeg95.env +++ b/src/makeg95.env @@ -46,6 +46,9 @@ RM=rm -f # You can get a suitable cp.exe from ports/mingw32/extra.zip on the ftp site. COPY=cp +# Cross compiling? Provide the target prefix (eg., i386-mingw32-) +# CROSS=i386-mingw32- + ########################## Compiler ################################## # C++ compiler @@ -63,19 +66,19 @@ endif ifeq ($(MINGW32),1) ifneq "$(_GCC295)$(_GCC3)" "" - CC = gcc --pipe $(if $(_GCC3), , -fvtable-thunks) + CC = $(CROSS)gcc --pipe $(if $(_GCC3), , -fvtable-thunks) else - CC = gcc + CC = $(CROSS)gcc endif else - CC = gcc + CC = $(CROSS)gcc endif # C compiler for pure C programs CCC = $(CC) # Compiler used for LEX generated C -CCLEX=gcc +CCLEX=$(CROSS)gcc # This shouldn't be needed as make is supposed to define this # variable itself. Uncomment it if your make complains. @@ -91,7 +94,7 @@ YACC=byacc # Settings for Cyginw/Mingw32 # Some versions of windres cannot cope with the --preprocessor # option. Uncomment the RCPREPROCESSOR line below if yours can. -RESCOMP=windres +RESCOMP=$(CROSS)windres RCINPUTSWITCH=-i RCOUTPUTSWITCH=-o RCINCSWITCH=--include-dir @@ -106,8 +109,8 @@ RCDEFSWITCH=--define RESFLAGS=$(RCPREPROCESSOR) $(RCINCSWITCH) $(WXDIR)/include $(RCEXTRAINC) $(RCDEFSWITCH) __WIN32__ $(RCDEFSWITCH) __WIN95__ $(RCDEFSWITCH) __GNUWIN32__ # Needed to build a DLL if your linker does not support --shared option. -AS = as -DLLTOOL = dlltool +AS = $(CROSS)as +DLLTOOL = $(CROSS)dlltool ########################## Compiler flags ############################# @@ -172,9 +175,9 @@ endif # Options for ar archiver # AROPTIONS = crs # For IRIX and Solaris (both SYSVR4). -AR = ar +AR = $(CROSS)ar AROPTIONS = ruv -RANLIB = ranlib +RANLIB = $(CROSS)ranlib # Extra compiler libraries COMPLIBS= diff --git a/src/makemac6.mcp b/src/makemac6.mcp new file mode 100644 index 0000000000000000000000000000000000000000..481cbf5a0c060ec1832cd1230c3f76e51706b7ef GIT binary patch literal 474140 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 literal 0 HcmV?d00001 diff --git a/src/makemac7.mcp b/src/makemac7.mcp new file mode 100644 index 0000000000000000000000000000000000000000..a3f193052eb96f7712baf9c12504b98a9ab4f2c6 GIT binary patch literal 721023 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 t5t_Igd!XCb_#(z!~_V9f*{&T9}Lf{6|b+I{q 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 -clean: - rm -f SUBSYS.o $(OBJS) +default: r + +lib: purge $(OBJPRODN) + rm -f libregex.a + ar crv libregex.a $(OBJPRODN) + +purge: + rm -f *.o + +# stuff to build regex.h +REGEXH=regex.h +REGEXHSRC=regex2.h $(REGSRC) +$(REGEXH): $(REGEXHSRC) mkh + sh ./mkh $(MKHFLAGS) -i _REGEX_H_ $(REGEXHSRC) >regex.tmp + cmp -s regex.tmp regex.h 2>/dev/null || cp regex.tmp regex.h + rm -f regex.tmp + +# dependencies +$(OBJPRODN) debug.o: utils.h regex.h regex2.h +regcomp.o: cclass.h cname.h regcomp.ih +regexec.o: engine.c engine.ih +regerror.o: regerror.ih +debug.o: debug.ih +re_main.o: re_main.ih + +# tester +re: $(OBJS) + $(CC) $(CFLAGS) $(LDFLAGS) $(OBJS) $(LIBS) -o $@ + +# regression test +r: re tests + ./re &1 | egrep -v '$(JUNKLINT)' | tee lint + +fullprint: + ti README WHATSNEW notes todo | list + ti *.h | list + list *.c + list regex.3 regex.7 + +print: + ti README WHATSNEW notes todo | list + ti *.h | list + list reg*.c engine.c + + +mf.tmp: Makefile + sed '/^REGEXH=/s/=.*/=regex.h/' Makefile | sed '/#DEL$$/d' >$@ + +DTRH=cclass.h cname.h regex2.h utils.h +PRE=COPYRIGHT README WHATSNEW +POST=mkh regex.3 regex.7 tests $(DTRH) $(ALLSRC) fake/*.[ch] +FILES=$(PRE) Makefile $(POST) +DTR=$(PRE) Makefile=mf.tmp $(POST) +dtr: $(FILES) mf.tmp + makedtr $(DTR) >$@ + rm mf.tmp + +cio: $(FILES) + cio $(FILES) + +rdf: $(FILES) + rcsdiff -c $(FILES) 2>&1 | p + +# various forms of cleanup +tidy: + rm -f junk* core core.* *.core dtr *.tmp lint + +clean: tidy + rm -f *.o *.s *.ih re libregex.a + +# don't do this one unless you know what you're doing +spotless: clean + rm -f mkh regex.h diff --git a/src/regex/cclass.h b/src/regex/cclass.h new file mode 100644 index 0000000000..2b50a76197 --- /dev/null +++ b/src/regex/cclass.h @@ -0,0 +1,20 @@ +/* character-class table */ +static struct cclass { + char *name; + char *chars; + char *multis; +} cclasses[] = { + { "alnum", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "" }, + { "alpha", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz", "" }, + { "blank", " \t", "" }, + { "cntrl", "\007\b\t\n\v\f\r\1\2\3\4\5\6\16\17\20\21\22\23\24\25\26\27\30\31\32\33\34\35\36\37\177", "" }, + { "digit", "0123456789", "" }, + { "graph", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", "" }, + { "lower", "abcdefghijklmnopqrstuvwxyz", "" }, + { "print", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~ ", "" }, + { "punct", "!\"#$%&'()*+,-./:;<=>?@[\\]^_`{|}~", "" }, + { "space", "\t\n\v\f\r ", "" }, + { "upper", "ABCDEFGHIJKLMNOPQRSTUVWXYZ", "" }, + { "xdigit", "0123456789ABCDEFabcdef", "" }, + { NULL, 0, "" } +}; diff --git a/src/regex/cname.h b/src/regex/cname.h new file mode 100644 index 0000000000..c1a6dd5656 --- /dev/null +++ b/src/regex/cname.h @@ -0,0 +1,102 @@ +/* character-name table */ +static struct cname { + char *name; + char code; +} cnames[] = { + { "NUL", '\0' }, + { "SOH", '\001' }, + { "STX", '\002' }, + { "ETX", '\003' }, + { "EOT", '\004' }, + { "ENQ", '\005' }, + { "ACK", '\006' }, + { "BEL", '\007' }, + { "alert", '\007' }, + { "BS", '\010' }, + { "backspace", '\b' }, + { "HT", '\011' }, + { "tab", '\t' }, + { "LF", '\012' }, + { "newline", '\n' }, + { "VT", '\013' }, + { "vertical-tab", '\v' }, + { "FF", '\014' }, + { "form-feed", '\f' }, + { "CR", '\015' }, + { "carriage-return", '\r' }, + { "SO", '\016' }, + { "SI", '\017' }, + { "DLE", '\020' }, + { "DC1", '\021' }, + { "DC2", '\022' }, + { "DC3", '\023' }, + { "DC4", '\024' }, + { "NAK", '\025' }, + { "SYN", '\026' }, + { "ETB", '\027' }, + { "CAN", '\030' }, + { "EM", '\031' }, + { "SUB", '\032' }, + { "ESC", '\033' }, + { "IS4", '\034' }, + { "FS", '\034' }, + { "IS3", '\035' }, + { "GS", '\035' }, + { "IS2", '\036' }, + { "RS", '\036' }, + { "IS1", '\037' }, + { "US", '\037' }, + { "space", ' ' }, + { "exclamation-mark", '!' }, + { "quotation-mark", '"' }, + { "number-sign", '#' }, + { "dollar-sign", '$' }, + { "percent-sign", '%' }, + { "ampersand", '&' }, + { "apostrophe", '\'' }, + { "left-parenthesis", '(' }, + { "right-parenthesis", ')' }, + { "asterisk", '*' }, + { "plus-sign", '+' }, + { "comma", ',' }, + { "hyphen", '-' }, + { "hyphen-minus", '-' }, + { "period", '.' }, + { "full-stop", '.' }, + { "slash", '/' }, + { "solidus", '/' }, + { "zero", '0' }, + { "one", '1' }, + { "two", '2' }, + { "three", '3' }, + { "four", '4' }, + { "five", '5' }, + { "six", '6' }, + { "seven", '7' }, + { "eight", '8' }, + { "nine", '9' }, + { "colon", ':' }, + { "semicolon", ';' }, + { "less-than-sign", '<' }, + { "equals-sign", '=' }, + { "greater-than-sign", '>' }, + { "question-mark", '?' }, + { "commercial-at", '@' }, + { "left-square-bracket", '[' }, + { "backslash", '\\' }, + { "reverse-solidus", '\\' }, + { "right-square-bracket", ']' }, + { "circumflex", '^' }, + { "circumflex-accent", '^' }, + { "underscore", '_' }, + { "low-line", '_' }, + { "grave-accent", '`' }, + { "left-brace", '{' }, + { "left-curly-bracket", '{' }, + { "vertical-line", '|' }, + { "right-brace", '}' }, + { "right-curly-bracket", '}' }, + { "tilde", '~' }, + { "DEL", '\177' }, + { NULL, 0 }, +}; diff --git a/src/regex/debug.c b/src/regex/debug.c new file mode 100644 index 0000000000..bf40bbb3bd --- /dev/null +++ b/src/regex/debug.c @@ -0,0 +1,242 @@ +#include +#include +#include +#include +#include +#include +#include "regex.h" + +#include "utils.h" +#include "regex2.h" +#include "debug.ih" + +/* + - regprint - print a regexp for debugging + == void regprint(regex_t *r, FILE *d); + */ +void +regprint(r, d) +regex_t *r; +FILE *d; +{ + register struct re_guts *g = r->re_g; + register int i; + register int c; + register int last; + int nincat[NC]; + + fprintf(d, "%ld states, %d categories", (long)g->nstates, + g->ncategories); + fprintf(d, ", first %ld last %ld", (long)g->firststate, + (long)g->laststate); + if (g->iflags&USEBOL) + fprintf(d, ", USEBOL"); + if (g->iflags&USEEOL) + fprintf(d, ", USEEOL"); + if (g->iflags&BAD) + fprintf(d, ", BAD"); + if (g->nsub > 0) + fprintf(d, ", nsub=%ld", (long)g->nsub); + if (g->must != NULL) + fprintf(d, ", must(%ld) `%*s'", (long)g->mlen, (int)g->mlen, + g->must); + if (g->backrefs) + fprintf(d, ", backrefs"); + if (g->nplus > 0) + fprintf(d, ", nplus %ld", (long)g->nplus); + fprintf(d, "\n"); + s_print(g, d); + for (i = 0; i < g->ncategories; i++) { + nincat[i] = 0; + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (g->categories[c] == i) + nincat[i]++; + } + fprintf(d, "cc0#%d", nincat[0]); + for (i = 1; i < g->ncategories; i++) + if (nincat[i] == 1) { + for (c = CHAR_MIN; c <= CHAR_MAX; c++) + if (g->categories[c] == i) + break; + fprintf(d, ", %d=%s", i, regchar(c)); + } + fprintf(d, "\n"); + for (i = 1; i < g->ncategories; i++) + if (nincat[i] != 1) { + fprintf(d, "cc%d\t", i); + last = -1; + for (c = CHAR_MIN; c <= CHAR_MAX+1; c++) /* +1 does flush */ + if (c <= CHAR_MAX && g->categories[c] == i) { + if (last < 0) { + fprintf(d, "%s", regchar(c)); + last = c; + } + } else { + if (last >= 0) { + if (last != c-1) + fprintf(d, "-%s", + regchar(c-1)); + last = -1; + } + } + fprintf(d, "\n"); + } +} + +/* + - s_print - print the strip for debugging + == static void s_print(register struct re_guts *g, FILE *d); + */ +static void +s_print(g, d) +register struct re_guts *g; +FILE *d; +{ + register sop *s; + register cset *cs; + register int i; + register int done = 0; + register sop opnd; + register int col = 0; + register int last; + register sopno offset = 2; +# define GAP() { if (offset % 5 == 0) { \ + if (col > 40) { \ + fprintf(d, "\n\t"); \ + col = 0; \ + } else { \ + fprintf(d, " "); \ + col++; \ + } \ + } else \ + col++; \ + offset++; \ + } + + if (OP(g->strip[0]) != OEND) + fprintf(d, "missing initial OEND!\n"); + for (s = &g->strip[1]; !done; s++) { + opnd = OPND(*s); + switch (OP(*s)) { + case OEND: + fprintf(d, "\n"); + done = 1; + break; + case OCHAR: + if (strchr("\\|()^$.[+*?{}!<> ", (char)opnd) != NULL) + fprintf(d, "\\%c", (char)opnd); + else + fprintf(d, "%s", regchar((char)opnd)); + break; + case OBOL: + fprintf(d, "^"); + break; + case OEOL: + fprintf(d, "$"); + break; + case OBOW: + fprintf(d, "\\{"); + break; + case OEOW: + fprintf(d, "\\}"); + break; + case OANY: + fprintf(d, "."); + break; + case OANYOF: + fprintf(d, "[(%ld)", (long)opnd); + cs = &g->sets[opnd]; + last = -1; + for (i = 0; i < g->csetsize+1; i++) /* +1 flushes */ + if (CHIN(cs, i) && i < g->csetsize) { + if (last < 0) { + fprintf(d, "%s", regchar(i)); + last = i; + } + } else { + if (last >= 0) { + if (last != i-1) + fprintf(d, "-%s", + regchar(i-1)); + last = -1; + } + } + fprintf(d, "]"); + break; + case OBACK_: + fprintf(d, "(\\<%ld>", (long)opnd); + break; + case O_BACK: + fprintf(d, "<%ld>\\)", (long)opnd); + break; + case OPLUS_: + fprintf(d, "(+"); + if (OP(*(s+opnd)) != O_PLUS) + fprintf(d, "<%ld>", (long)opnd); + break; + case O_PLUS: + if (OP(*(s-opnd)) != OPLUS_) + fprintf(d, "<%ld>", (long)opnd); + fprintf(d, "+)"); + break; + case OQUEST_: + fprintf(d, "(?"); + if (OP(*(s+opnd)) != O_QUEST) + fprintf(d, "<%ld>", (long)opnd); + break; + case O_QUEST: + if (OP(*(s-opnd)) != OQUEST_) + fprintf(d, "<%ld>", (long)opnd); + fprintf(d, "?)"); + break; + case OLPAREN: + fprintf(d, "((<%ld>", (long)opnd); + break; + case ORPAREN: + fprintf(d, "<%ld>))", (long)opnd); + break; + case OCH_: + fprintf(d, "<"); + if (OP(*(s+opnd)) != OOR2) + fprintf(d, "<%ld>", (long)opnd); + break; + case OOR1: + if (OP(*(s-opnd)) != OOR1 && OP(*(s-opnd)) != OCH_) + fprintf(d, "<%ld>", (long)opnd); + fprintf(d, "|"); + break; + case OOR2: + fprintf(d, "|"); + if (OP(*(s+opnd)) != OOR2 && OP(*(s+opnd)) != O_CH) + fprintf(d, "<%ld>", (long)opnd); + break; + case O_CH: + if (OP(*(s-opnd)) != OOR1) + fprintf(d, "<%ld>", (long)opnd); + fprintf(d, ">"); + break; + default: + fprintf(d, "!%d(%d)!", OP(*s), opnd); + break; + } + if (!done) + GAP(); + } +} + +/* + - regchar - make a character printable + == static char *regchar(int ch); + */ +static char * /* -> representation */ +regchar(ch) +int ch; +{ + static char buf[10]; + + if (isprint(ch) || ch == ' ') + sprintf(buf, "%c", ch); + else + sprintf(buf, "\\%o", ch); + return(buf); +} diff --git a/src/regex/engine.c b/src/regex/engine.c new file mode 100644 index 0000000000..0b88dcf1ed --- /dev/null +++ b/src/regex/engine.c @@ -0,0 +1,1019 @@ +/* + * The matching engine and friends. This file is #included by regexec.c + * after suitable #defines of a variety of macros used herein, so that + * different state representations can be used without duplicating masses + * of code. + */ + +#ifdef SNAMES +#define matcher smatcher +#define fast sfast +#define slow sslow +#define dissect sdissect +#define backref sbackref +#define step sstep +#define print sprint +#define at sat +#define match smat +#endif +#ifdef LNAMES +#define matcher lmatcher +#define fast lfast +#define slow lslow +#define dissect ldissect +#define backref lbackref +#define step lstep +#define print lprint +#define at lat +#define match lmat +#endif + +/* another structure passed up and down to avoid zillions of parameters */ +struct match { + struct re_guts *g; + int eflags; + regmatch_t *pmatch; /* [nsub+1] (0 element unused) */ + char *offp; /* offsets work from here */ + char *beginp; /* start of string -- virtual NUL precedes */ + char *endp; /* end of string -- virtual NUL here */ + char *coldp; /* can be no match starting before here */ + char **lastpos; /* [nplus+1] */ + STATEVARS; + states st; /* current states */ + states fresh; /* states for a fresh start */ + states tmp; /* temporary */ + states empty; /* empty set of states */ +}; + +#include "engine.ih" + +#ifdef REDEBUG +#define SP(t, s, c) print(m, t, s, c, stdout) +#define AT(t, p1, p2, s1, s2) at(m, t, p1, p2, s1, s2) +#define NOTE(str) { if (m->eflags®_TRACE) printf("=%s\n", (str)); } +#else +#define SP(t, s, c) /* nothing */ +#define AT(t, p1, p2, s1, s2) /* nothing */ +#define NOTE(s) /* nothing */ +#endif + +/* + - matcher - the actual matching engine + == static int matcher(register struct re_guts *g, char *string, \ + == size_t nmatch, regmatch_t pmatch[], int eflags); + */ +static int /* 0 success, REG_NOMATCH failure */ +matcher(g, string, nmatch, pmatch, eflags) +register struct re_guts *g; +char *string; +size_t nmatch; +regmatch_t pmatch[]; +int eflags; +{ + register char *endp; + register size_t i; + struct match mv; + register struct match *m = &mv; + register char *dp; + const register sopno gf = g->firststate+1; /* +1 for OEND */ + const register sopno gl = g->laststate; + char *start; + char *stop; + + /* simplify the situation where possible */ + if (g->cflags®_NOSUB) + nmatch = 0; + if (eflags®_STARTEND) { + start = string + pmatch[0].rm_so; + stop = string + pmatch[0].rm_eo; + } else { + start = string; + stop = start + strlen(start); + } + if (stop < start) + return(REG_INVARG); + + /* prescreening; this does wonders for this rather slow code */ + if (g->must != NULL) { + for (dp = start; dp < stop; dp++) + if (*dp == g->must[0] && stop - dp >= g->mlen && + memcmp(dp, g->must, (size_t)g->mlen) == 0) + break; + if (dp == stop) /* we didn't find g->must */ + return(REG_NOMATCH); + } + + /* match struct setup */ + m->g = g; + m->eflags = eflags; + m->pmatch = NULL; + m->lastpos = NULL; + m->offp = string; + m->beginp = start; + m->endp = stop; + STATESETUP(m, 4); + SETUP(m->st); + SETUP(m->fresh); + SETUP(m->tmp); + SETUP(m->empty); + CLEAR(m->empty); + + /* this loop does only one repetition except for backrefs */ + for (;;) { + endp = fast(m, start, stop, gf, gl); + if (endp == NULL) { /* a miss */ + STATETEARDOWN(m); + return(REG_NOMATCH); + } + if (nmatch == 0 && !g->backrefs) + break; /* no further info needed */ + + /* where? */ + assert(m->coldp != NULL); + for (;;) { + NOTE("finding start"); + endp = slow(m, m->coldp, stop, gf, gl); + if (endp != NULL) + break; + assert(m->coldp < m->endp); + m->coldp++; + } + if (nmatch == 1 && !g->backrefs) + break; /* no further info needed */ + + /* oh my, he wants the subexpressions... */ + if (m->pmatch == NULL) + m->pmatch = (regmatch_t *)malloc((m->g->nsub + 1) * + sizeof(regmatch_t)); + if (m->pmatch == NULL) { + STATETEARDOWN(m); + return(REG_ESPACE); + } + for (i = 1; i <= m->g->nsub; i++) + m->pmatch[i].rm_so = m->pmatch[i].rm_eo = -1; + if (!g->backrefs && !(m->eflags®_BACKR)) { + NOTE("dissecting"); + dp = dissect(m, m->coldp, endp, gf, gl); + } else { + if (g->nplus > 0 && m->lastpos == NULL) + m->lastpos = (char **)malloc((g->nplus+1) * + sizeof(char *)); + if (g->nplus > 0 && m->lastpos == NULL) { + free(m->pmatch); + STATETEARDOWN(m); + return(REG_ESPACE); + } + NOTE("backref dissect"); + dp = backref(m, m->coldp, endp, gf, gl, (sopno)0); + } + if (dp != NULL) + break; + + /* uh-oh... we couldn't find a subexpression-level match */ + assert(g->backrefs); /* must be back references doing it */ + assert(g->nplus == 0 || m->lastpos != NULL); + for (;;) { + if (dp != NULL || endp <= m->coldp) + break; /* defeat */ + NOTE("backoff"); + endp = slow(m, m->coldp, endp-1, gf, gl); + if (endp == NULL) + break; /* defeat */ + /* try it on a shorter possibility */ +#ifndef NDEBUG + for (i = 1; i <= m->g->nsub; i++) { + assert(m->pmatch[i].rm_so == -1); + assert(m->pmatch[i].rm_eo == -1); + } +#endif + NOTE("backoff dissect"); + dp = backref(m, m->coldp, endp, gf, gl, (sopno)0); + } + assert(dp == NULL || dp == endp); + if (dp != NULL) /* found a shorter one */ + break; + + /* despite initial appearances, there is no match here */ + NOTE("false alarm"); + start = m->coldp + 1; /* recycle starting later */ + assert(start <= stop); + } + + /* fill in the details if requested */ + if (nmatch > 0) { + pmatch[0].rm_so = m->coldp - m->offp; + pmatch[0].rm_eo = endp - m->offp; + } + if (nmatch > 1) { + assert(m->pmatch != NULL); + for (i = 1; i < nmatch; i++) + if (i <= m->g->nsub) + pmatch[i] = m->pmatch[i]; + else { + pmatch[i].rm_so = -1; + pmatch[i].rm_eo = -1; + } + } + + if (m->pmatch != NULL) + free((char *)m->pmatch); + if (m->lastpos != NULL) + free((char *)m->lastpos); + STATETEARDOWN(m); + return(0); +} + +/* + - dissect - figure out what matched what, no back references + == static char *dissect(register struct match *m, char *start, \ + == char *stop, sopno startst, sopno stopst); + */ +static char * /* == stop (success) always */ +dissect(m, start, stop, startst, stopst) +register struct match *m; +char *start; +char *stop; +sopno startst; +sopno stopst; +{ + register int i; + register sopno ss; /* start sop of current subRE */ + register sopno es; /* end sop of current subRE */ + register char *sp; /* start of string matched by it */ + register char *stp; /* string matched by it cannot pass here */ + register char *rest; /* start of rest of string */ + register char *tail; /* string unmatched by rest of RE */ + register sopno ssub; /* start sop of subsubRE */ + register sopno esub; /* end sop of subsubRE */ + register char *ssp; /* start of string matched by subsubRE */ + register char *sep; /* end of string matched by subsubRE */ + register char *oldssp; /* previous ssp */ + register char *dp; + + AT("diss", start, stop, startst, stopst); + sp = start; + for (ss = startst; ss < stopst; ss = es) { + /* identify end of subRE */ + es = ss; + switch (OP(m->g->strip[es])) { + case OPLUS_: + case OQUEST_: + es += OPND(m->g->strip[es]); + break; + case OCH_: + while (OP(m->g->strip[es]) != O_CH) + es += OPND(m->g->strip[es]); + break; + } + es++; + + /* figure out what it matched */ + switch (OP(m->g->strip[ss])) { + case OEND: + assert(nope); + break; + case OCHAR: + sp++; + break; + case OBOL: + case OEOL: + case OBOW: + case OEOW: + break; + case OANY: + case OANYOF: + sp++; + break; + case OBACK_: + case O_BACK: + assert(nope); + break; + /* cases where length of match is hard to find */ + case OQUEST_: + stp = stop; + for (;;) { + /* how long could this one be? */ + rest = slow(m, sp, stp, ss, es); + assert(rest != NULL); /* it did match */ + /* could the rest match the rest? */ + tail = slow(m, rest, stop, es, stopst); + if (tail == stop) + break; /* yes! */ + /* no -- try a shorter match for this one */ + stp = rest - 1; + assert(stp >= sp); /* it did work */ + } + ssub = ss + 1; + esub = es - 1; + /* did innards match? */ + if (slow(m, sp, rest, ssub, esub) != NULL) { + dp = dissect(m, sp, rest, ssub, esub); + assert(dp == rest); + } else /* no */ + assert(sp == rest); + sp = rest; + break; + case OPLUS_: + stp = stop; + for (;;) { + /* how long could this one be? */ + rest = slow(m, sp, stp, ss, es); + assert(rest != NULL); /* it did match */ + /* could the rest match the rest? */ + tail = slow(m, rest, stop, es, stopst); + if (tail == stop) + break; /* yes! */ + /* no -- try a shorter match for this one */ + stp = rest - 1; + assert(stp >= sp); /* it did work */ + } + ssub = ss + 1; + esub = es - 1; + ssp = sp; + oldssp = ssp; + for (;;) { /* find last match of innards */ + sep = slow(m, ssp, rest, ssub, esub); + if (sep == NULL || sep == ssp) + break; /* failed or matched null */ + oldssp = ssp; /* on to next try */ + ssp = sep; + } + if (sep == NULL) { + /* last successful match */ + sep = ssp; + ssp = oldssp; + } + assert(sep == rest); /* must exhaust substring */ + assert(slow(m, ssp, sep, ssub, esub) == rest); + dp = dissect(m, ssp, sep, ssub, esub); + assert(dp == sep); + sp = rest; + break; + case OCH_: + stp = stop; + for (;;) { + /* how long could this one be? */ + rest = slow(m, sp, stp, ss, es); + assert(rest != NULL); /* it did match */ + /* could the rest match the rest? */ + tail = slow(m, rest, stop, es, stopst); + if (tail == stop) + break; /* yes! */ + /* no -- try a shorter match for this one */ + stp = rest - 1; + assert(stp >= sp); /* it did work */ + } + ssub = ss + 1; + esub = ss + OPND(m->g->strip[ss]) - 1; + assert(OP(m->g->strip[esub]) == OOR1); + for (;;) { /* find first matching branch */ + if (slow(m, sp, rest, ssub, esub) == rest) + break; /* it matched all of it */ + /* that one missed, try next one */ + assert(OP(m->g->strip[esub]) == OOR1); + esub++; + assert(OP(m->g->strip[esub]) == OOR2); + ssub = esub + 1; + esub += OPND(m->g->strip[esub]); + if (OP(m->g->strip[esub]) == OOR2) + esub--; + else + assert(OP(m->g->strip[esub]) == O_CH); + } + dp = dissect(m, sp, rest, ssub, esub); + assert(dp == rest); + sp = rest; + break; + case O_PLUS: + case O_QUEST: + case OOR1: + case OOR2: + case O_CH: + assert(nope); + break; + case OLPAREN: + i = OPND(m->g->strip[ss]); + assert(0 < i && i <= m->g->nsub); + m->pmatch[i].rm_so = sp - m->offp; + break; + case ORPAREN: + i = OPND(m->g->strip[ss]); + assert(0 < i && i <= m->g->nsub); + m->pmatch[i].rm_eo = sp - m->offp; + break; + default: /* uh oh */ + assert(nope); + break; + } + } + + assert(sp == stop); + return(sp); +} + +/* + - backref - figure out what matched what, figuring in back references + == static char *backref(register struct match *m, char *start, \ + == char *stop, sopno startst, sopno stopst, sopno lev); + */ +static char * /* == stop (success) or NULL (failure) */ +backref(m, start, stop, startst, stopst, lev) +register struct match *m; +char *start; +char *stop; +sopno startst; +sopno stopst; +sopno lev; /* PLUS nesting level */ +{ + register int i; + register sopno ss; /* start sop of current subRE */ + register char *sp; /* start of string matched by it */ + register sopno ssub; /* start sop of subsubRE */ + register sopno esub; /* end sop of subsubRE */ + register char *ssp; /* start of string matched by subsubRE */ + register char *dp; + register size_t len; + register int hard; + register sop s; + register regoff_t offsave; + register cset *cs; + + AT("back", start, stop, startst, stopst); + sp = start; + + /* get as far as we can with easy stuff */ + hard = 0; + for (ss = startst; !hard && ss < stopst; ss++) + switch (OP(s = m->g->strip[ss])) { + case OCHAR: + if (sp == stop || *sp++ != (char)OPND(s)) + return(NULL); + break; + case OANY: + if (sp == stop) + return(NULL); + sp++; + break; + case OANYOF: + cs = &m->g->sets[OPND(s)]; + if (sp == stop || !CHIN(cs, *sp++)) + return(NULL); + break; + case OBOL: + if ( (sp == m->beginp && !(m->eflags®_NOTBOL)) || + (sp < m->endp && *(sp-1) == '\n' && + (m->g->cflags®_NEWLINE)) ) + { /* yes */ } + else + return(NULL); + break; + case OEOL: + if ( (sp == m->endp && !(m->eflags®_NOTEOL)) || + (sp < m->endp && *sp == '\n' && + (m->g->cflags®_NEWLINE)) ) + { /* yes */ } + else + return(NULL); + break; + case OBOW: + if (( (sp == m->beginp && !(m->eflags®_NOTBOL)) || + (sp < m->endp && *(sp-1) == '\n' && + (m->g->cflags®_NEWLINE)) || + (sp > m->beginp && + !ISWORD(*(sp-1))) ) && + (sp < m->endp && ISWORD(*sp)) ) + { /* yes */ } + else + return(NULL); + break; + case OEOW: + if (( (sp == m->endp && !(m->eflags®_NOTEOL)) || + (sp < m->endp && *sp == '\n' && + (m->g->cflags®_NEWLINE)) || + (sp < m->endp && !ISWORD(*sp)) ) && + (sp > m->beginp && ISWORD(*(sp-1))) ) + { /* yes */ } + else + return(NULL); + break; + case O_QUEST: + break; + case OOR1: /* matches null but needs to skip */ + ss++; + s = m->g->strip[ss]; + do { + assert(OP(s) == OOR2); + ss += OPND(s); + } while (OP(s = m->g->strip[ss]) != O_CH); + /* note that the ss++ gets us past the O_CH */ + break; + default: /* have to make a choice */ + hard = 1; + break; + } + if (!hard) { /* that was it! */ + if (sp != stop) + return(NULL); + return(sp); + } + ss--; /* adjust for the for's final increment */ + + /* the hard stuff */ + AT("hard", sp, stop, ss, stopst); + s = m->g->strip[ss]; + switch (OP(s)) { + case OBACK_: /* the vilest depths */ + i = OPND(s); + assert(0 < i && i <= m->g->nsub); + if (m->pmatch[i].rm_eo == -1) + return(NULL); + assert(m->pmatch[i].rm_so != -1); + len = m->pmatch[i].rm_eo - m->pmatch[i].rm_so; + assert(stop - m->beginp >= len); + if (sp > stop - len) + return(NULL); /* not enough left to match */ + ssp = m->offp + m->pmatch[i].rm_so; + if (memcmp(sp, ssp, len) != 0) + return(NULL); + while (m->g->strip[ss] != SOP(O_BACK, i)) + ss++; + return(backref(m, sp+len, stop, ss+1, stopst, lev)); + break; + case OQUEST_: /* to null or not */ + dp = backref(m, sp, stop, ss+1, stopst, lev); + if (dp != NULL) + return(dp); /* not */ + return(backref(m, sp, stop, ss+OPND(s)+1, stopst, lev)); + break; + case OPLUS_: + assert(m->lastpos != NULL); + assert(lev+1 <= m->g->nplus); + m->lastpos[lev+1] = sp; + return(backref(m, sp, stop, ss+1, stopst, lev+1)); + break; + case O_PLUS: + if (sp == m->lastpos[lev]) /* last pass matched null */ + return(backref(m, sp, stop, ss+1, stopst, lev-1)); + /* try another pass */ + m->lastpos[lev] = sp; + dp = backref(m, sp, stop, ss-OPND(s)+1, stopst, lev); + if (dp == NULL) + return(backref(m, sp, stop, ss+1, stopst, lev-1)); + else + return(dp); + break; + case OCH_: /* find the right one, if any */ + ssub = ss + 1; + esub = ss + OPND(s) - 1; + assert(OP(m->g->strip[esub]) == OOR1); + for (;;) { /* find first matching branch */ + dp = backref(m, sp, stop, ssub, esub, lev); + if (dp != NULL) + return(dp); + /* that one missed, try next one */ + if (OP(m->g->strip[esub]) == O_CH) + return(NULL); /* there is none */ + esub++; + assert(OP(m->g->strip[esub]) == OOR2); + ssub = esub + 1; + esub += OPND(m->g->strip[esub]); + if (OP(m->g->strip[esub]) == OOR2) + esub--; + else + assert(OP(m->g->strip[esub]) == O_CH); + } + break; + case OLPAREN: /* must undo assignment if rest fails */ + i = OPND(s); + assert(0 < i && i <= m->g->nsub); + offsave = m->pmatch[i].rm_so; + m->pmatch[i].rm_so = sp - m->offp; + dp = backref(m, sp, stop, ss+1, stopst, lev); + if (dp != NULL) + return(dp); + m->pmatch[i].rm_so = offsave; + return(NULL); + break; + case ORPAREN: /* must undo assignment if rest fails */ + i = OPND(s); + assert(0 < i && i <= m->g->nsub); + offsave = m->pmatch[i].rm_eo; + m->pmatch[i].rm_eo = sp - m->offp; + dp = backref(m, sp, stop, ss+1, stopst, lev); + if (dp != NULL) + return(dp); + m->pmatch[i].rm_eo = offsave; + return(NULL); + break; + default: /* uh oh */ + assert(nope); + break; + } + + /* "can't happen" */ + assert(nope); + /* NOTREACHED */ + return((char *)NULL); /* dummy */ +} + +/* + - fast - step through the string at top speed + == static char *fast(register struct match *m, char *start, \ + == char *stop, sopno startst, sopno stopst); + */ +static char * /* where tentative match ended, or NULL */ +fast(m, start, stop, startst, stopst) +register struct match *m; +char *start; +char *stop; +sopno startst; +sopno stopst; +{ + register states st = m->st; + register states fresh = m->fresh; + register states tmp = m->tmp; + register char *p = start; + register int c = (start == m->beginp) ? OUT : *(start-1); + register int lastc; /* previous c */ + register int flagch; + register int i; + register char *coldp; /* last p after which no match was underway */ + + CLEAR(st); + SET1(st, startst); + st = step(m->g, startst, stopst, st, NOTHING, st); + ASSIGN(fresh, st); + SP("start", st, *p); + coldp = NULL; + for (;;) { + /* next character */ + lastc = c; + c = (p == m->endp) ? OUT : *p; + if (EQ(st, fresh)) + coldp = p; + + /* is there an EOL and/or BOL between lastc and c? */ + flagch = '\0'; + i = 0; + if ( (lastc == '\n' && m->g->cflags®_NEWLINE) || + (lastc == OUT && !(m->eflags®_NOTBOL)) ) { + flagch = BOL; + i = m->g->nbol; + } + if ( (c == '\n' && m->g->cflags®_NEWLINE) || + (c == OUT && !(m->eflags®_NOTEOL)) ) { + flagch = (flagch == BOL) ? BOLEOL : EOL; + i += m->g->neol; + } + if (i != 0) { + for (; i > 0; i--) + st = step(m->g, startst, stopst, st, flagch, st); + SP("boleol", st, c); + } + + /* how about a word boundary? */ + if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && + (c != OUT && ISWORD(c)) ) { + flagch = BOW; + } + if ( (lastc != OUT && ISWORD(lastc)) && + (flagch == EOL || (c != OUT && !ISWORD(c))) ) { + flagch = EOW; + } + if (flagch == BOW || flagch == EOW) { + st = step(m->g, startst, stopst, st, flagch, st); + SP("boweow", st, c); + } + + /* are we done? */ + if (ISSET(st, stopst) || p == stop) + break; /* NOTE BREAK OUT */ + + /* no, we must deal with this character */ + ASSIGN(tmp, st); + ASSIGN(st, fresh); + assert(c != OUT); + st = step(m->g, startst, stopst, tmp, c, st); + SP("aft", st, c); + assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); + p++; + } + + assert(coldp != NULL); + m->coldp = coldp; + if (ISSET(st, stopst)) + return(p+1); + else + return(NULL); +} + +/* + - slow - step through the string more deliberately + == static char *slow(register struct match *m, char *start, \ + == char *stop, sopno startst, sopno stopst); + */ +static char * /* where it ended */ +slow(m, start, stop, startst, stopst) +register struct match *m; +char *start; +char *stop; +sopno startst; +sopno stopst; +{ + register states st = m->st; + register states empty = m->empty; + register states tmp = m->tmp; + register char *p = start; + register int c = (start == m->beginp) ? OUT : *(start-1); + register int lastc; /* previous c */ + register int flagch; + register int i; + register char *matchp; /* last p at which a match ended */ + + AT("slow", start, stop, startst, stopst); + CLEAR(st); + SET1(st, startst); + SP("sstart", st, *p); + st = step(m->g, startst, stopst, st, NOTHING, st); + matchp = NULL; + for (;;) { + /* next character */ + lastc = c; + c = (p == m->endp) ? OUT : *p; + + /* is there an EOL and/or BOL between lastc and c? */ + flagch = '\0'; + i = 0; + if ( (lastc == '\n' && m->g->cflags®_NEWLINE) || + (lastc == OUT && !(m->eflags®_NOTBOL)) ) { + flagch = BOL; + i = m->g->nbol; + } + if ( (c == '\n' && m->g->cflags®_NEWLINE) || + (c == OUT && !(m->eflags®_NOTEOL)) ) { + flagch = (flagch == BOL) ? BOLEOL : EOL; + i += m->g->neol; + } + if (i != 0) { + for (; i > 0; i--) + st = step(m->g, startst, stopst, st, flagch, st); + SP("sboleol", st, c); + } + + /* how about a word boundary? */ + if ( (flagch == BOL || (lastc != OUT && !ISWORD(lastc))) && + (c != OUT && ISWORD(c)) ) { + flagch = BOW; + } + if ( (lastc != OUT && ISWORD(lastc)) && + (flagch == EOL || (c != OUT && !ISWORD(c))) ) { + flagch = EOW; + } + if (flagch == BOW || flagch == EOW) { + st = step(m->g, startst, stopst, st, flagch, st); + SP("sboweow", st, c); + } + + /* are we done? */ + if (ISSET(st, stopst)) + matchp = p; + if (EQ(st, empty) || p == stop) + break; /* NOTE BREAK OUT */ + + /* no, we must deal with this character */ + ASSIGN(tmp, st); + ASSIGN(st, empty); + assert(c != OUT); + st = step(m->g, startst, stopst, tmp, c, st); + SP("saft", st, c); + assert(EQ(step(m->g, startst, stopst, st, NOTHING, st), st)); + p++; + } + + return(matchp); +} + + +/* + - step - map set of states reachable before char to set reachable after + == static states step(register struct re_guts *g, sopno start, sopno stop, \ + == register states bef, int ch, register states aft); + == #define BOL (OUT+1) + == #define EOL (BOL+1) + == #define BOLEOL (BOL+2) + == #define NOTHING (BOL+3) + == #define BOW (BOL+4) + == #define EOW (BOL+5) + == #define CODEMAX (BOL+5) // highest code used + == #define NONCHAR(c) ((c) > CHAR_MAX) + == #define NNONCHAR (CODEMAX-CHAR_MAX) + */ +static states +step(g, start, stop, bef, ch, aft) +register struct re_guts *g; +sopno start; /* start state within strip */ +sopno stop; /* state after stop state within strip */ +register states bef; /* states reachable before */ +int ch; /* character or NONCHAR code */ +register states aft; /* states already known reachable after */ +{ + register cset *cs; + register sop s; + register sopno pc; + register onestate here; /* note, macros know this name */ + register sopno look; + register long i; + + for (pc = start, INIT(here, pc); pc != stop; pc++, INC(here)) { + s = g->strip[pc]; + switch (OP(s)) { + case OEND: + assert(pc == stop-1); + break; + case OCHAR: + /* only characters can match */ + assert(!NONCHAR(ch) || ch != (char)OPND(s)); + if (ch == (char)OPND(s)) + FWD(aft, bef, 1); + break; + case OBOL: + if (ch == BOL || ch == BOLEOL) + FWD(aft, bef, 1); + break; + case OEOL: + if (ch == EOL || ch == BOLEOL) + FWD(aft, bef, 1); + break; + case OBOW: + if (ch == BOW) + FWD(aft, bef, 1); + break; + case OEOW: + if (ch == EOW) + FWD(aft, bef, 1); + break; + case OANY: + if (!NONCHAR(ch)) + FWD(aft, bef, 1); + break; + case OANYOF: + cs = &g->sets[OPND(s)]; + if (!NONCHAR(ch) && CHIN(cs, ch)) + FWD(aft, bef, 1); + break; + case OBACK_: /* ignored here */ + case O_BACK: + FWD(aft, aft, 1); + break; + case OPLUS_: /* forward, this is just an empty */ + FWD(aft, aft, 1); + break; + case O_PLUS: /* both forward and back */ + FWD(aft, aft, 1); + i = ISSETBACK(aft, OPND(s)); + BACK(aft, aft, OPND(s)); + if (!i && ISSETBACK(aft, OPND(s))) { + /* oho, must reconsider loop body */ + pc -= OPND(s) + 1; + INIT(here, pc); + } + break; + case OQUEST_: /* two branches, both forward */ + FWD(aft, aft, 1); + FWD(aft, aft, OPND(s)); + break; + case O_QUEST: /* just an empty */ + FWD(aft, aft, 1); + break; + case OLPAREN: /* not significant here */ + case ORPAREN: + FWD(aft, aft, 1); + break; + case OCH_: /* mark the first two branches */ + FWD(aft, aft, 1); + assert(OP(g->strip[pc+OPND(s)]) == OOR2); + FWD(aft, aft, OPND(s)); + break; + case OOR1: /* done a branch, find the O_CH */ + if (ISSTATEIN(aft, here)) { + for (look = 1; + OP(s = g->strip[pc+look]) != O_CH; + look += OPND(s)) + assert(OP(s) == OOR2); + FWD(aft, aft, look); + } + break; + case OOR2: /* propagate OCH_'s marking */ + FWD(aft, aft, 1); + if (OP(g->strip[pc+OPND(s)]) != O_CH) { + assert(OP(g->strip[pc+OPND(s)]) == OOR2); + FWD(aft, aft, OPND(s)); + } + break; + case O_CH: /* just empty */ + FWD(aft, aft, 1); + break; + default: /* ooooops... */ + assert(nope); + break; + } + } + + return(aft); +} + +#ifdef REDEBUG +/* + - print - print a set of states + == #ifdef REDEBUG + == static void print(struct match *m, char *caption, states st, \ + == int ch, FILE *d); + == #endif + */ +static void +print(m, caption, st, ch, d) +struct match *m; +char *caption; +states st; +int ch; +FILE *d; +{ + register struct re_guts *g = m->g; + register int i; + register int first = 1; + + if (!(m->eflags®_TRACE)) + return; + + fprintf(d, "%s", caption); + if (ch != '\0') + fprintf(d, " %s", pchar(ch)); + for (i = 0; i < g->nstates; i++) + if (ISSET(st, i)) { + fprintf(d, "%s%d", (first) ? "\t" : ", ", i); + first = 0; + } + fprintf(d, "\n"); +} + +/* + - at - print current situation + == #ifdef REDEBUG + == static void at(struct match *m, char *title, char *start, char *stop, \ + == sopno startst, sopno stopst); + == #endif + */ +static void +at(m, title, start, stop, startst, stopst) +struct match *m; +char *title; +char *start; +char *stop; +sopno startst; +sopno stopst; +{ + if (!(m->eflags®_TRACE)) + return; + + printf("%s %s-", title, pchar(*start)); + printf("%s ", pchar(*stop)); + printf("%ld-%ld\n", (long)startst, (long)stopst); +} + +#ifndef PCHARDONE +#define PCHARDONE /* never again */ +/* + - pchar - make a character printable + == #ifdef REDEBUG + == static char *pchar(int ch); + == #endif + * + * Is this identical to regchar() over in debug.c? Well, yes. But a + * duplicate here avoids having a debugging-capable regexec.o tied to + * a matching debug.o, and this is convenient. It all disappears in + * the non-debug compilation anyway, so it doesn't matter much. + */ +static char * /* -> representation */ +pchar(ch) +int ch; +{ + static char pbuf[10]; + + if (isprint(ch) || ch == ' ') + sprintf(pbuf, "%c", ch); + else + sprintf(pbuf, "\\%o", ch); + return(pbuf); +} +#endif +#endif + +#undef matcher +#undef fast +#undef slow +#undef dissect +#undef backref +#undef step +#undef print +#undef at +#undef match diff --git a/src/regex/re_main.c b/src/regex/re_main.c new file mode 100644 index 0000000000..0221e7713d --- /dev/null +++ b/src/regex/re_main.c @@ -0,0 +1,510 @@ +#include +#include +#include +#include +#include + +#include "main.ih" + +char *progname; +int debug = 0; +int line = 0; +int status = 0; + +int copts = REG_EXTENDED; +int eopts = 0; +regoff_t startoff = 0; +regoff_t endoff = 0; + + +extern int split(); +extern void regprint(); + +/* + - main - do the simple case, hand off to regress() for regression + */ +main(argc, argv) +int argc; +char *argv[]; +{ + regex_t re; +# define NS 10 + regmatch_t subs[NS]; + char erbuf[100]; + int err; + size_t len; + int c; + int errflg = 0; + register int i; + extern int optind; + extern char *optarg; + + progname = argv[0]; + + while ((c = getopt(argc, argv, "c:e:S:E:x")) != EOF) + switch (c) { + case 'c': /* compile options */ + copts = options('c', optarg); + break; + case 'e': /* execute options */ + eopts = options('e', optarg); + break; + case 'S': /* start offset */ + startoff = (regoff_t)atoi(optarg); + break; + case 'E': /* end offset */ + endoff = (regoff_t)atoi(optarg); + break; + case 'x': /* Debugging. */ + debug++; + break; + case '?': + default: + errflg++; + break; + } + if (errflg) { + fprintf(stderr, "usage: %s ", progname); + fprintf(stderr, "[-c copt][-C][-d] [re]\n"); + exit(2); + } + + if (optind >= argc) { + regress(stdin); + exit(status); + } + + err = regcomp(&re, argv[optind++], copts); + if (err) { + len = regerror(err, &re, erbuf, sizeof(erbuf)); + fprintf(stderr, "error %s, %d/%d `%s'\n", + eprint(err), len, sizeof(erbuf), erbuf); + exit(status); + } + regprint(&re, stdout); + + if (optind >= argc) { + regfree(&re); + exit(status); + } + + if (eopts®_STARTEND) { + subs[0].rm_so = startoff; + subs[0].rm_eo = strlen(argv[optind]) - endoff; + } + err = regexec(&re, argv[optind], (size_t)NS, subs, eopts); + if (err) { + len = regerror(err, &re, erbuf, sizeof(erbuf)); + fprintf(stderr, "error %s, %d/%d `%s'\n", + eprint(err), len, sizeof(erbuf), erbuf); + exit(status); + } + if (!(copts®_NOSUB)) { + len = (int)(subs[0].rm_eo - subs[0].rm_so); + if (subs[0].rm_so != -1) { + if (len != 0) + printf("match `%.*s'\n", len, + argv[optind] + subs[0].rm_so); + else + printf("match `'@%.1s\n", + argv[optind] + subs[0].rm_so); + } + for (i = 1; i < NS; i++) + if (subs[i].rm_so != -1) + printf("(%d) `%.*s'\n", i, + (int)(subs[i].rm_eo - subs[i].rm_so), + argv[optind] + subs[i].rm_so); + } + exit(status); +} + +/* + - regress - main loop of regression test + == void regress(FILE *in); + */ +void +regress(in) +FILE *in; +{ + char inbuf[1000]; +# define MAXF 10 + char *f[MAXF]; + int nf; + int i; + char erbuf[100]; + size_t ne; + char *badpat = "invalid regular expression"; +# define SHORT 10 + char *bpname = "REG_BADPAT"; + regex_t re; + + while (fgets(inbuf, sizeof(inbuf), in) != NULL) { + line++; + if (inbuf[0] == '#' || inbuf[0] == '\n') + continue; /* NOTE CONTINUE */ + inbuf[strlen(inbuf)-1] = '\0'; /* get rid of stupid \n */ + if (debug) + fprintf(stdout, "%d:\n", line); + nf = split(inbuf, f, MAXF, "\t\t"); + if (nf < 3) { + fprintf(stderr, "bad input, line %d\n", line); + exit(1); + } + for (i = 0; i < nf; i++) + if (strcmp(f[i], "\"\"") == 0) + f[i] = ""; + if (nf <= 3) + f[3] = NULL; + if (nf <= 4) + f[4] = NULL; + try(f[0], f[1], f[2], f[3], f[4], options('c', f[1])); + if (opt('&', f[1])) /* try with either type of RE */ + try(f[0], f[1], f[2], f[3], f[4], + options('c', f[1]) &~ REG_EXTENDED); + } + + ne = regerror(REG_BADPAT, (regex_t *)NULL, erbuf, sizeof(erbuf)); + if (strcmp(erbuf, badpat) != 0 || ne != strlen(badpat)+1) { + fprintf(stderr, "end: regerror() test gave `%s' not `%s'\n", + erbuf, badpat); + status = 1; + } + ne = regerror(REG_BADPAT, (regex_t *)NULL, erbuf, (size_t)SHORT); + if (strncmp(erbuf, badpat, SHORT-1) != 0 || erbuf[SHORT-1] != '\0' || + ne != strlen(badpat)+1) { + fprintf(stderr, "end: regerror() short test gave `%s' not `%.*s'\n", + erbuf, SHORT-1, badpat); + status = 1; + } + ne = regerror(REG_ITOA|REG_BADPAT, (regex_t *)NULL, erbuf, sizeof(erbuf)); + if (strcmp(erbuf, bpname) != 0 || ne != strlen(bpname)+1) { + fprintf(stderr, "end: regerror() ITOA test gave `%s' not `%s'\n", + erbuf, bpname); + status = 1; + } + re.re_endp = bpname; + ne = regerror(REG_ATOI, &re, erbuf, sizeof(erbuf)); + if (atoi(erbuf) != (int)REG_BADPAT) { + fprintf(stderr, "end: regerror() ATOI test gave `%s' not `%ld'\n", + erbuf, (long)REG_BADPAT); + status = 1; + } else if (ne != strlen(erbuf)+1) { + fprintf(stderr, "end: regerror() ATOI test len(`%s') = %ld\n", + erbuf, (long)REG_BADPAT); + status = 1; + } +} + +/* + - try - try it, and report on problems + == void try(char *f0, char *f1, char *f2, char *f3, char *f4, int opts); + */ +void +try(f0, f1, f2, f3, f4, opts) +char *f0; +char *f1; +char *f2; +char *f3; +char *f4; +int opts; /* may not match f1 */ +{ + regex_t re; +# define NSUBS 10 + regmatch_t subs[NSUBS]; +# define NSHOULD 15 + char *should[NSHOULD]; + int nshould; + char erbuf[100]; + int err; + int len; + char *type = (opts & REG_EXTENDED) ? "ERE" : "BRE"; + register int i; + char *grump; + char f0copy[1000]; + char f2copy[1000]; + + strcpy(f0copy, f0); + re.re_endp = (opts®_PEND) ? f0copy + strlen(f0copy) : NULL; + fixstr(f0copy); + err = regcomp(&re, f0copy, opts); + if (err != 0 && (!opt('C', f1) || err != efind(f2))) { + /* unexpected error or wrong error */ + len = regerror(err, &re, erbuf, sizeof(erbuf)); + fprintf(stderr, "%d: %s error %s, %d/%d `%s'\n", + line, type, eprint(err), len, + sizeof(erbuf), erbuf); + status = 1; + } else if (err == 0 && opt('C', f1)) { + /* unexpected success */ + fprintf(stderr, "%d: %s should have given REG_%s\n", + line, type, f2); + status = 1; + err = 1; /* so we won't try regexec */ + } + + if (err != 0) { + regfree(&re); + return; + } + + strcpy(f2copy, f2); + fixstr(f2copy); + + if (options('e', f1)®_STARTEND) { + if (strchr(f2, '(') == NULL || strchr(f2, ')') == NULL) + fprintf(stderr, "%d: bad STARTEND syntax\n", line); + subs[0].rm_so = strchr(f2, '(') - f2 + 1; + subs[0].rm_eo = strchr(f2, ')') - f2; + } + err = regexec(&re, f2copy, NSUBS, subs, options('e', f1)); + + if (err != 0 && (f3 != NULL || err != REG_NOMATCH)) { + /* unexpected error or wrong error */ + len = regerror(err, &re, erbuf, sizeof(erbuf)); + fprintf(stderr, "%d: %s exec error %s, %d/%d `%s'\n", + line, type, eprint(err), len, + sizeof(erbuf), erbuf); + status = 1; + } else if (err != 0) { + /* nothing more to check */ + } else if (f3 == NULL) { + /* unexpected success */ + fprintf(stderr, "%d: %s exec should have failed\n", + line, type); + status = 1; + err = 1; /* just on principle */ + } else if (opts®_NOSUB) { + /* nothing more to check */ + } else if ((grump = check(f2, subs[0], f3)) != NULL) { + fprintf(stderr, "%d: %s %s\n", line, type, grump); + status = 1; + err = 1; + } + + if (err != 0 || f4 == NULL) { + regfree(&re); + return; + } + + for (i = 1; i < NSHOULD; i++) + should[i] = NULL; + nshould = split(f4, should+1, NSHOULD-1, ","); + if (nshould == 0) { + nshould = 1; + should[1] = ""; + } + for (i = 1; i < NSUBS; i++) { + grump = check(f2, subs[i], should[i]); + if (grump != NULL) { + fprintf(stderr, "%d: %s $%d %s\n", line, + type, i, grump); + status = 1; + err = 1; + } + } + + regfree(&re); +} + +/* + - options - pick options out of a regression-test string + == int options(int type, char *s); + */ +int +options(type, s) +int type; /* 'c' compile, 'e' exec */ +char *s; +{ + register char *p; + register int o = (type == 'c') ? copts : eopts; + register char *legal = (type == 'c') ? "bisnmp" : "^$#tl"; + + for (p = s; *p != '\0'; p++) + if (strchr(legal, *p) != NULL) + switch (*p) { + case 'b': + o &= ~REG_EXTENDED; + break; + case 'i': + o |= REG_ICASE; + break; + case 's': + o |= REG_NOSUB; + break; + case 'n': + o |= REG_NEWLINE; + break; + case 'm': + o &= ~REG_EXTENDED; + o |= REG_NOSPEC; + break; + case 'p': + o |= REG_PEND; + break; + case '^': + o |= REG_NOTBOL; + break; + case '$': + o |= REG_NOTEOL; + break; + case '#': + o |= REG_STARTEND; + break; + case 't': /* trace */ + o |= REG_TRACE; + break; + case 'l': /* force long representation */ + o |= REG_LARGE; + break; + case 'r': /* force backref use */ + o |= REG_BACKR; + break; + } + return(o); +} + +/* + - opt - is a particular option in a regression string? + == int opt(int c, char *s); + */ +int /* predicate */ +opt(c, s) +int c; +char *s; +{ + return(strchr(s, c) != NULL); +} + +/* + - fixstr - transform magic characters in strings + == void fixstr(register char *p); + */ +void +fixstr(p) +register char *p; +{ + if (p == NULL) + return; + + for (; *p != '\0'; p++) + if (*p == 'N') + *p = '\n'; + else if (*p == 'T') + *p = '\t'; + else if (*p == 'S') + *p = ' '; + else if (*p == 'Z') + *p = '\0'; +} + +/* + - check - check a substring match + == char *check(char *str, regmatch_t sub, char *should); + */ +char * /* NULL or complaint */ +check(str, sub, should) +char *str; +regmatch_t sub; +char *should; +{ + register int len; + register int shlen; + register char *p; + static char grump[500]; + register char *at = NULL; + + if (should != NULL && strcmp(should, "-") == 0) + should = NULL; + if (should != NULL && should[0] == '@') { + at = should + 1; + should = ""; + } + + /* check rm_so and rm_eo for consistency */ + if (sub.rm_so > sub.rm_eo || (sub.rm_so == -1 && sub.rm_eo != -1) || + (sub.rm_so != -1 && sub.rm_eo == -1) || + (sub.rm_so != -1 && sub.rm_so < 0) || + (sub.rm_eo != -1 && sub.rm_eo < 0) ) { + sprintf(grump, "start %ld end %ld", (long)sub.rm_so, + (long)sub.rm_eo); + return(grump); + } + + /* check for no match */ + if (sub.rm_so == -1 && should == NULL) + return(NULL); + if (sub.rm_so == -1) + return("did not match"); + + /* check for in range */ + if (sub.rm_eo > strlen(str)) { + sprintf(grump, "start %ld end %ld, past end of string", + (long)sub.rm_so, (long)sub.rm_eo); + return(grump); + } + + len = (int)(sub.rm_eo - sub.rm_so); + shlen = (int)strlen(should); + p = str + sub.rm_so; + + /* check for not supposed to match */ + if (should == NULL) { + sprintf(grump, "matched `%.*s'", len, p); + return(grump); + } + + /* check for wrong match */ + if (len != shlen || strncmp(p, should, (size_t)shlen) != 0) { + sprintf(grump, "matched `%.*s' instead", len, p); + return(grump); + } + if (shlen > 0) + return(NULL); + + /* check null match in right place */ + if (at == NULL) + return(NULL); + shlen = strlen(at); + if (shlen == 0) + shlen = 1; /* force check for end-of-string */ + if (strncmp(p, at, shlen) != 0) { + sprintf(grump, "matched null at `%.20s'", p); + return(grump); + } + return(NULL); +} + +/* + - eprint - convert error number to name + == static char *eprint(int err); + */ +static char * +eprint(err) +int err; +{ + static char epbuf[100]; + size_t len; + + len = regerror(REG_ITOA|err, (regex_t *)NULL, epbuf, sizeof(epbuf)); + assert(len <= sizeof(epbuf)); + return(epbuf); +} + +/* + - efind - convert error name to number + == static int efind(char *name); + */ +static int +efind(name) +char *name; +{ + static char efbuf[100]; + size_t n; + regex_t re; + + sprintf(efbuf, "REG_%s", name); + assert(strlen(efbuf) < sizeof(efbuf)); + re.re_endp = efbuf; + (void) regerror(REG_ATOI, &re, efbuf, sizeof(efbuf)); + return(atoi(efbuf)); +} diff --git a/src/regex/re_syntax.n b/src/regex/re_syntax.n deleted file mode 100644 index f37bb85abd..0000000000 --- a/src/regex/re_syntax.n +++ /dev/null @@ -1,970 +0,0 @@ -'\" -'\" Copyright (c) 1998 Sun Microsystems, Inc. -'\" Copyright (c) 1999 Scriptics Corporation -'\" -'\" This software is copyrighted by the Regents of the University of -'\" California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState -'\" Corporation and other parties. The following terms apply to all files -'\" associated with the software unless explicitly disclaimed in -'\" individual files. -'\" -'\" The authors hereby grant permission to use, copy, modify, distribute, -'\" and license this software and its documentation for any purpose, provided -'\" that existing copyright notices are retained in all copies and that this -'\" notice is included verbatim in any distributions. No written agreement, -'\" license, or royalty fee is required for any of the authorized uses. -'\" Modifications to this software may be copyrighted by their authors -'\" and need not follow the licensing terms described here, provided that -'\" the new terms are clearly indicated on the first page of each file where -'\" they apply. -'\" -'\" IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY -'\" FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES -'\" ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY -'\" DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE -'\" POSSIBILITY OF SUCH DAMAGE. -'\" -'\" THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, -'\" INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, -'\" FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE -'\" IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE -'\" NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR -'\" MODIFICATIONS. -'\" -'\" GOVERNMENT USE: If you are acquiring this software on behalf of the -'\" U.S. government, the Government shall have only "Restricted Rights" -'\" in the software and related documentation as defined in the Federal -'\" Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you -'\" are acquiring the software on behalf of the Department of Defense, the -'\" software shall be classified as "Commercial Computer Software" and the -'\" Government shall have only "Restricted Rights" as defined in Clause -'\" 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the -'\" authors grant the U.S. Government and others acting in its behalf -'\" permission to use and distribute the software in accordance with the -'\" terms specified in this license. -'\" -'\" RCS: @(#) Id: re_syntax.n,v 1.3 1999/07/14 19:09:36 jpeek Exp -'\" -.so man.macros -.TH re_syntax n "8.1" Tcl "Tcl Built-In Commands" -.BS -.SH NAME -re_syntax \- Syntax of Tcl regular expressions. -.BE - -.SH DESCRIPTION -.PP -A \fIregular expression\fR describes strings of characters. -It's a pattern that matches certain strings and doesn't match others. - -.SH "DIFFERENT FLAVORS OF REs" -Regular expressions (``RE''s), as defined by POSIX, come in two -flavors: \fIextended\fR REs (``EREs'') and \fIbasic\fR REs (``BREs''). -EREs are roughly those of the traditional \fIegrep\fR, while BREs are -roughly those of the traditional \fIed\fR. This implementation adds -a third flavor, \fIadvanced\fR REs (``AREs''), basically EREs with -some significant extensions. -.PP -This manual page primarily describes AREs. BREs mostly exist for -backward compatibility in some old programs; they will be discussed at -the end. POSIX EREs are almost an exact subset of AREs. Features of -AREs that are not present in EREs will be indicated. - -.SH "REGULAR EXPRESSION SYNTAX" -.PP -Tcl regular expressions are implemented using the package written by -Henry Spencer, based on the 1003.2 spec and some (not quite all) of -the Perl5 extensions (thanks, Henry!). Much of the description of -regular expressions below is copied verbatim from his manual entry. -.PP -An ARE is one or more \fIbranches\fR, -separated by `\fB|\fR', -matching anything that matches any of the branches. -.PP -A branch is zero or more \fIconstraints\fR or \fIquantified atoms\fR, -concatenated. -It matches a match for the first, followed by a match for the second, etc; -an empty branch matches the empty string. -.PP -A quantified atom is an \fIatom\fR possibly followed -by a single \fIquantifier\fR. -Without a quantifier, it matches a match for the atom. -The quantifiers, -and what a so-quantified atom matches, are: -.RS 2 -.TP 6 -\fB*\fR -a sequence of 0 or more matches of the atom -.TP -\fB+\fR -a sequence of 1 or more matches of the atom -.TP -\fB?\fR -a sequence of 0 or 1 matches of the atom -.TP -\fB{\fIm\fB}\fR -a sequence of exactly \fIm\fR matches of the atom -.TP -\fB{\fIm\fB,}\fR -a sequence of \fIm\fR or more matches of the atom -.TP -\fB{\fIm\fB,\fIn\fB}\fR -a sequence of \fIm\fR through \fIn\fR (inclusive) matches of the atom; -\fIm\fR may not exceed \fIn\fR -.TP -\fB*? +? ?? {\fIm\fB}? {\fIm\fB,}? {\fIm\fB,\fIn\fB}?\fR -\fInon-greedy\fR quantifiers, -which match the same possibilities, -but prefer the smallest number rather than the largest number -of matches (see MATCHING) -.RE -.PP -The forms using -\fB{\fR and \fB}\fR -are known as \fIbound\fRs. -The numbers -\fIm\fR and \fIn\fR are unsigned decimal integers -with permissible values from 0 to 255 inclusive. -.PP -An atom is one of: -.RS 2 -.TP 6 -\fB(\fIre\fB)\fR -(where \fIre\fR is any regular expression) -matches a match for -\fIre\fR, with the match noted for possible reporting -.TP -\fB(?:\fIre\fB)\fR -as previous, -but does no reporting -(a ``non-capturing'' set of parentheses) -.TP -\fB()\fR -matches an empty string, -noted for possible reporting -.TP -\fB(?:)\fR -matches an empty string, -without reporting -.TP -\fB[\fIchars\fB]\fR -a \fIbracket expression\fR, -matching any one of the \fIchars\fR (see BRACKET EXPRESSIONS for more detail) -.TP - \fB.\fR -matches any single character -.TP -\fB\e\fIk\fR -(where \fIk\fR is a non-alphanumeric character) -matches that character taken as an ordinary character, -e.g. \e\e matches a backslash character -.TP -\fB\e\fIc\fR -where \fIc\fR is alphanumeric -(possibly followed by other characters), -an \fIescape\fR (AREs only), -see ESCAPES below -.TP -\fB{\fR -when followed by a character other than a digit, -matches the left-brace character `\fB{\fR'; -when followed by a digit, it is the beginning of a -\fIbound\fR (see above) -.TP -\fIx\fR -where \fIx\fR is -a single character with no other significance, matches that character. -.RE -.PP -A \fIconstraint\fR matches an empty string when specific conditions -are met. -A constraint may not be followed by a quantifier. -The simple constraints are as follows; some more constraints are -described later, under ESCAPES. -.RS 2 -.TP 8 -\fB^\fR -matches at the beginning of a line -.TP -\fB$\fR -matches at the end of a line -.TP -\fB(?=\fIre\fB)\fR -\fIpositive lookahead\fR (AREs only), matches at any point -where a substring matching \fIre\fR begins -.TP -\fB(?!\fIre\fB)\fR -\fInegative lookahead\fR (AREs only), matches at any point -where no substring matching \fIre\fR begins -.RE -.PP -The lookahead constraints may not contain back references (see later), -and all parentheses within them are considered non-capturing. -.PP -An RE may not end with `\fB\e\fR'. - -.SH "BRACKET EXPRESSIONS" -A \fIbracket expression\fR is a list of characters enclosed in `\fB[\|]\fR'. -It normally matches any single character from the list (but see below). -If the list begins with `\fB^\fR', -it matches any single character -(but see below) \fInot\fR from the rest of the list. -.PP -If two characters in the list are separated by `\fB\-\fR', -this is shorthand -for the full \fIrange\fR of characters between those two (inclusive) in the -collating sequence, -e.g. -\fB[0\-9]\fR -in ASCII matches any decimal digit. -Two ranges may not share an -endpoint, so e.g. -\fBa\-c\-e\fR -is illegal. -Ranges are very collating-sequence-dependent, -and portable programs should avoid relying on them. -.PP -To include a literal -\fB]\fR -or -\fB\-\fR -in the list, -the simplest method is to -enclose it in -\fB[.\fR and \fB.]\fR -to make it a collating element (see below). -Alternatively, -make it the first character -(following a possible `\fB^\fR'), -or (AREs only) precede it with `\fB\e\fR'. -Alternatively, for `\fB\-\fR', -make it the last character, -or the second endpoint of a range. -To use a literal -\fB\-\fR -as the first endpoint of a range, -make it a collating element -or (AREs only) precede it with `\fB\e\fR'. -With the exception of these, some combinations using -\fB[\fR -(see next -paragraphs), and escapes, -all other special characters lose their -special significance within a bracket expression. -.PP -Within a bracket expression, a collating element (a character, -a multi-character sequence that collates as if it were a single character, -or a collating-sequence name for either) -enclosed in -\fB[.\fR and \fB.]\fR -stands for the -sequence of characters of that collating element. -The sequence is a single element of the bracket expression's list. -A bracket expression in a locale that has -multi-character collating elements -can thus match more than one character. -.VS 8.2 -So (insidiously), a bracket expression that starts with \fB^\fR -can match multi-character collating elements even if none of them -appear in the bracket expression! -(\fINote:\fR Tcl currently has no multi-character collating elements. -This information is only for illustration.) -.PP -For example, assume the collating sequence includes a \fBch\fR -multi-character collating element. -Then the RE \fB[[.ch.]]*c\fR (zero or more \fBch\fP's followed by \fBc\fP) -matches the first five characters of `\fBchchcc\fR'. -Also, the RE \fB[^c]b\fR matches all of `\fBchb\fR' -(because \fB[^c]\fR matches the multi-character \fBch\fR). -.VE 8.2 -.PP -Within a bracket expression, a collating element enclosed in -\fB[=\fR -and -\fB=]\fR -is an equivalence class, standing for the sequences of characters -of all collating elements equivalent to that one, including itself. -(If there are no other equivalent collating elements, -the treatment is as if the enclosing delimiters were `\fB[.\fR'\& -and `\fB.]\fR'.) -For example, if -\fBo\fR -and -\fB\o'o^'\fR -are the members of an equivalence class, -then `\fB[[=o=]]\fR', `\fB[[=\o'o^'=]]\fR', -and `\fB[o\o'o^']\fR'\& -are all synonymous. -An equivalence class may not be an endpoint -of a range. -.VS 8.2 -(\fINote:\fR -Tcl currently implements only the Unicode locale. -It doesn't define any equivalence classes. -The examples above are just illustrations.) -.VE 8.2 -.PP -Within a bracket expression, the name of a \fIcharacter class\fR enclosed -in -\fB[:\fR -and -\fB:]\fR -stands for the list of all characters -(not all collating elements!) -belonging to that -class. -Standard character classes are: -.PP -.RS -.ne 5 -.nf -.ta 3c -\fBalpha\fR A letter. -\fBupper\fR An upper-case letter. -\fBlower\fR A lower-case letter. -\fBdigit\fR A decimal digit. -\fBxdigit\fR A hexadecimal digit. -\fBalnum\fR An alphanumeric (letter or digit). -\fBprint\fR An alphanumeric (same as alnum). -\fBblank\fR A space or tab character. -\fBspace\fR A character producing white space in displayed text. -\fBpunct\fR A punctuation character. -\fBgraph\fR A character with a visible representation. -\fBcntrl\fR A control character. -.fi -.RE -.PP -A locale may provide others. -.VS 8.2 -(Note that the current Tcl implementation has only one locale: -the Unicode locale.) -.VE 8.2 -A character class may not be used as an endpoint of a range. -.PP -There are two special cases of bracket expressions: -the bracket expressions -\fB[[:<:]]\fR -and -\fB[[:>:]]\fR -are constraints, matching empty strings at -the beginning and end of a word respectively. -'\" note, discussion of escapes below references this definition of word -A word is defined as a sequence of -word characters -that is neither preceded nor followed by -word characters. -A word character is an -\fIalnum\fR -character -or an underscore -(\fB_\fR). -These special bracket expressions are deprecated; -users of AREs should use constraint escapes instead (see below). -.SH ESCAPES -Escapes (AREs only), which begin with a -\fB\e\fR -followed by an alphanumeric character, -come in several varieties: -character entry, class shorthands, constraint escapes, and back references. -A -\fB\e\fR -followed by an alphanumeric character but not constituting -a valid escape is illegal in AREs. -In EREs, there are no escapes: -outside a bracket expression, -a -\fB\e\fR -followed by an alphanumeric character merely stands for that -character as an ordinary character, -and inside a bracket expression, -\fB\e\fR -is an ordinary character. -(The latter is the one actual incompatibility between EREs and AREs.) -.PP -Character-entry escapes (AREs only) exist to make it easier to specify -non-printing and otherwise inconvenient characters in REs: -.RS 2 -.TP 5 -\fB\ea\fR -alert (bell) character, as in C -.TP -\fB\eb\fR -backspace, as in C -.TP -\fB\eB\fR -synonym for -\fB\e\fR -to help reduce backslash doubling in some -applications where there are multiple levels of backslash processing -.TP -\fB\ec\fIX\fR -(where X is any character) the character whose -low-order 5 bits are the same as those of -\fIX\fR, -and whose other bits are all zero -.TP -\fB\ee\fR -the character whose collating-sequence name -is `\fBESC\fR', -or failing that, the character with octal value 033 -.TP -\fB\ef\fR -formfeed, as in C -.TP -\fB\en\fR -newline, as in C -.TP -\fB\er\fR -carriage return, as in C -.TP -\fB\et\fR -horizontal tab, as in C -.TP -\fB\eu\fIwxyz\fR -(where -\fIwxyz\fR -is exactly four hexadecimal digits) -the Unicode character -\fBU+\fIwxyz\fR -in the local byte ordering -.TP -\fB\eU\fIstuvwxyz\fR -(where -\fIstuvwxyz\fR -is exactly eight hexadecimal digits) -reserved for a somewhat-hypothetical Unicode extension to 32 bits -.TP -\fB\ev\fR -vertical tab, as in C -are all available. -.TP -\fB\ex\fIhhh\fR -(where -\fIhhh\fR -is any sequence of hexadecimal digits) -the character whose hexadecimal value is -\fB0x\fIhhh\fR -(a single character no matter how many hexadecimal digits are used). -.TP -\fB\e0\fR -the character whose value is -\fB0\fR -.TP -\fB\e\fIxy\fR -(where -\fIxy\fR -is exactly two octal digits, -and is not a -\fIback reference\fR (see below)) -the character whose octal value is -\fB0\fIxy\fR -.TP -\fB\e\fIxyz\fR -(where -\fIxyz\fR -is exactly three octal digits, -and is not a -back reference (see below)) -the character whose octal value is -\fB0\fIxyz\fR -.RE -.PP -Hexadecimal digits are `\fB0\fR'-`\fB9\fR', `\fBa\fR'-`\fBf\fR', -and `\fBA\fR'-`\fBF\fR'. -Octal digits are `\fB0\fR'-`\fB7\fR'. -.PP -The character-entry escapes are always taken as ordinary characters. -For example, -\fB\e135\fR -is -\fB]\fR -in ASCII, -but -\fB\e135\fR -does not terminate a bracket expression. -Beware, however, that some applications (e.g., C compilers) interpret -such sequences themselves before the regular-expression package -gets to see them, which may require doubling (quadrupling, etc.) the `\fB\e\fR'. -.PP -Class-shorthand escapes (AREs only) provide shorthands for certain commonly-used -character classes: -.RS 2 -.TP 10 -\fB\ed\fR -\fB[[:digit:]]\fR -.TP -\fB\es\fR -\fB[[:space:]]\fR -.TP -\fB\ew\fR -\fB[[:alnum:]_]\fR -(note underscore) -.TP -\fB\eD\fR -\fB[^[:digit:]]\fR -.TP -\fB\eS\fR -\fB[^[:space:]]\fR -.TP -\fB\eW\fR -\fB[^[:alnum:]_]\fR -(note underscore) -.RE -.PP -Within bracket expressions, `\fB\ed\fR', `\fB\es\fR', -and `\fB\ew\fR'\& -lose their outer brackets, -and `\fB\eD\fR', `\fB\eS\fR', -and `\fB\eW\fR'\& -are illegal. -.VS 8.2 -(So, for example, \fB[a-c\ed]\fR is equivalent to \fB[a-c[:digit:]]\fR. -Also, \fB[a-c\eD]\fR, which is equivalent to \fB[a-c^[:digit:]]\fR, is illegal.) -.VE 8.2 -.PP -A constraint escape (AREs only) is a constraint, -matching the empty string if specific conditions are met, -written as an escape: -.RS 2 -.TP 6 -\fB\eA\fR -matches only at the beginning of the string -(see MATCHING, below, for how this differs from `\fB^\fR') -.TP -\fB\em\fR -matches only at the beginning of a word -.TP -\fB\eM\fR -matches only at the end of a word -.TP -\fB\ey\fR -matches only at the beginning or end of a word -.TP -\fB\eY\fR -matches only at a point that is not the beginning or end of a word -.TP -\fB\eZ\fR -matches only at the end of the string -(see MATCHING, below, for how this differs from `\fB$\fR') -.TP -\fB\e\fIm\fR -(where -\fIm\fR -is a nonzero digit) a \fIback reference\fR, see below -.TP -\fB\e\fImnn\fR -(where -\fIm\fR -is a nonzero digit, and -\fInn\fR -is some more digits, -and the decimal value -\fImnn\fR -is not greater than the number of closing capturing parentheses seen so far) -a \fIback reference\fR, see below -.RE -.PP -A word is defined as in the specification of -\fB[[:<:]]\fR -and -\fB[[:>:]]\fR -above. -Constraint escapes are illegal within bracket expressions. -.PP -A back reference (AREs only) matches the same string matched by the parenthesized -subexpression specified by the number, -so that (e.g.) -\fB([bc])\e1\fR -matches -\fBbb\fR -or -\fBcc\fR -but not `\fBbc\fR'. -The subexpression must entirely precede the back reference in the RE. -Subexpressions are numbered in the order of their leading parentheses. -Non-capturing parentheses do not define subexpressions. -.PP -There is an inherent historical ambiguity between octal character-entry -escapes and back references, which is resolved by heuristics, -as hinted at above. -A leading zero always indicates an octal escape. -A single non-zero digit, not followed by another digit, -is always taken as a back reference. -A multi-digit sequence not starting with a zero is taken as a back -reference if it comes after a suitable subexpression -(i.e. the number is in the legal range for a back reference), -and otherwise is taken as octal. -.SH "METASYNTAX" -In addition to the main syntax described above, there are some special -forms and miscellaneous syntactic facilities available. -.PP -Normally the flavor of RE being used is specified by -application-dependent means. -However, this can be overridden by a \fIdirector\fR. -If an RE of any flavor begins with `\fB***:\fR', -the rest of the RE is an ARE. -If an RE of any flavor begins with `\fB***=\fR', -the rest of the RE is taken to be a literal string, -with all characters considered ordinary characters. -.PP -An ARE may begin with \fIembedded options\fR: -a sequence -\fB(?\fIxyz\fB)\fR -(where -\fIxyz\fR -is one or more alphabetic characters) -specifies options affecting the rest of the RE. -These supplement, and can override, -any options specified by the application. -The available option letters are: -.RS 2 -.TP 3 -\fBb\fR -rest of RE is a BRE -.TP 3 -\fBc\fR -case-sensitive matching (usual default) -.TP 3 -\fBe\fR -rest of RE is an ERE -.TP 3 -\fBi\fR -case-insensitive matching (see MATCHING, below) -.TP 3 -\fBm\fR -historical synonym for -\fBn\fR -.TP 3 -\fBn\fR -newline-sensitive matching (see MATCHING, below) -.TP 3 -\fBp\fR -partial newline-sensitive matching (see MATCHING, below) -.TP 3 -\fBq\fR -rest of RE is a literal (``quoted'') string, all ordinary characters -.TP 3 -\fBs\fR -non-newline-sensitive matching (usual default) -.TP 3 -\fBt\fR -tight syntax (usual default; see below) -.TP 3 -\fBw\fR -inverse partial newline-sensitive (``weird'') matching (see MATCHING, below) -.TP 3 -\fBx\fR -expanded syntax (see below) -.RE -.PP -Embedded options take effect at the -\fB)\fR -terminating the sequence. -They are available only at the start of an ARE, -and may not be used later within it. -.PP -In addition to the usual (\fItight\fR) RE syntax, in which all characters are -significant, there is an \fIexpanded\fR syntax, -available in all flavors of RE -with the \fB-expanded\fR switch, or in AREs with the embedded x option. -In the expanded syntax, -white-space characters are ignored -and all characters between a -\fB#\fR -and the following newline (or the end of the RE) are ignored, -permitting paragraphing and commenting a complex RE. -There are three exceptions to that basic rule: -.RS 2 -.PP -a white-space character or `\fB#\fR' preceded by `\fB\e\fR' is retained -.PP -white space or `\fB#\fR' within a bracket expression is retained -.PP -white space and comments are illegal within multi-character symbols -like the ARE `\fB(?:\fR' or the BRE `\fB\e(\fR' -.RE -.PP -Expanded-syntax white-space characters are blank, tab, newline, and -.VS 8.2 -any character that belongs to the \fIspace\fR character class. -.VE 8.2 -.PP -Finally, in an ARE, -outside bracket expressions, the sequence `\fB(?#\fIttt\fB)\fR' -(where -\fIttt\fR -is any text not containing a `\fB)\fR') -is a comment, -completely ignored. -Again, this is not allowed between the characters of -multi-character symbols like `\fB(?:\fR'. -Such comments are more a historical artifact than a useful facility, -and their use is deprecated; -use the expanded syntax instead. -.PP -\fINone\fR of these metasyntax extensions is available if the application -(or an initial -\fB***=\fR -director) -has specified that the user's input be treated as a literal string -rather than as an RE. -.SH MATCHING -In the event that an RE could match more than one substring of a given -string, -the RE matches the one starting earliest in the string. -If the RE could match more than one substring starting at that point, -its choice is determined by its \fIpreference\fR: -either the longest substring, or the shortest. -.PP -Most atoms, and all constraints, have no preference. -A parenthesized RE has the same preference (possibly none) as the RE. -A quantified atom with quantifier -\fB{\fIm\fB}\fR -or -\fB{\fIm\fB}?\fR -has the same preference (possibly none) as the atom itself. -A quantified atom with other normal quantifiers (including -\fB{\fIm\fB,\fIn\fB}\fR -with -\fIm\fR -equal to -\fIn\fR) -prefers longest match. -A quantified atom with other non-greedy quantifiers (including -\fB{\fIm\fB,\fIn\fB}?\fR -with -\fIm\fR -equal to -\fIn\fR) -prefers shortest match. -A branch has the same preference as the first quantified atom in it -which has a preference. -An RE consisting of two or more branches connected by the -\fB|\fR -operator prefers longest match. -.PP -Subject to the constraints imposed by the rules for matching the whole RE, -subexpressions also match the longest or shortest possible substrings, -based on their preferences, -with subexpressions starting earlier in the RE taking priority over -ones starting later. -Note that outer subexpressions thus take priority over -their component subexpressions. -.PP -Note that the quantifiers -\fB{1,1}\fR -and -\fB{1,1}?\fR -can be used to force longest and shortest preference, respectively, -on a subexpression or a whole RE. -.PP -Match lengths are measured in characters, not collating elements. -An empty string is considered longer than no match at all. -For example, -\fBbb*\fR -matches the three middle characters of `\fBabbbc\fR', -\fB(week|wee)(night|knights)\fR -matches all ten characters of `\fBweeknights\fR', -when -\fB(.*).*\fR -is matched against -\fBabc\fR -the parenthesized subexpression -matches all three characters, and -when -\fB(a*)*\fR -is matched against -\fBbc\fR -both the whole RE and the parenthesized -subexpression match an empty string. -.PP -If case-independent matching is specified, -the effect is much as if all case distinctions had vanished from the -alphabet. -When an alphabetic that exists in multiple cases appears as an -ordinary character outside a bracket expression, it is effectively -transformed into a bracket expression containing both cases, -so that -\fBx\fR -becomes `\fB[xX]\fR'. -When it appears inside a bracket expression, all case counterparts -of it are added to the bracket expression, so that -\fB[x]\fR -becomes -\fB[xX]\fR -and -\fB[^x]\fR -becomes `\fB[^xX]\fR'. -.PP -If newline-sensitive matching is specified, \fB.\fR -and bracket expressions using -\fB^\fR -will never match the newline character -(so that matches will never cross newlines unless the RE -explicitly arranges it) -and -\fB^\fR -and -\fB$\fR -will match the empty string after and before a newline -respectively, in addition to matching at beginning and end of string -respectively. -ARE -\fB\eA\fR -and -\fB\eZ\fR -continue to match beginning or end of string \fIonly\fR. -.PP -If partial newline-sensitive matching is specified, -this affects \fB.\fR -and bracket expressions -as with newline-sensitive matching, but not -\fB^\fR -and `\fB$\fR'. -.PP -If inverse partial newline-sensitive matching is specified, -this affects -\fB^\fR -and -\fB$\fR -as with -newline-sensitive matching, -but not \fB.\fR -and bracket expressions. -This isn't very useful but is provided for symmetry. -.SH "LIMITS AND COMPATIBILITY" -No particular limit is imposed on the length of REs. -Programs intended to be highly portable should not employ REs longer -than 256 bytes, -as a POSIX-compliant implementation can refuse to accept such REs. -.PP -The only feature of AREs that is actually incompatible with -POSIX EREs is that -\fB\e\fR -does not lose its special -significance inside bracket expressions. -All other ARE features use syntax which is illegal or has -undefined or unspecified effects in POSIX EREs; -the -\fB***\fR -syntax of directors likewise is outside the POSIX -syntax for both BREs and EREs. -.PP -Many of the ARE extensions are borrowed from Perl, but some have -been changed to clean them up, and a few Perl extensions are not present. -Incompatibilities of note include `\fB\eb\fR', `\fB\eB\fR', -the lack of special treatment for a trailing newline, -the addition of complemented bracket expressions to the things -affected by newline-sensitive matching, -the restrictions on parentheses and back references in lookahead constraints, -and the longest/shortest-match (rather than first-match) matching semantics. -.PP -The matching rules for REs containing both normal and non-greedy quantifiers -have changed since early beta-test versions of this package. -(The new rules are much simpler and cleaner, -but don't work as hard at guessing the user's real intentions.) -.PP -Henry Spencer's original 1986 \fIregexp\fR package, -still in widespread use (e.g., in pre-8.1 releases of Tcl), -implemented an early version of today's EREs. -There are four incompatibilities between \fIregexp\fR's near-EREs -(`RREs' for short) and AREs. -In roughly increasing order of significance: -.PP -.RS -In AREs, -\fB\e\fR -followed by an alphanumeric character is either an -escape or an error, -while in RREs, it was just another way of writing the -alphanumeric. -This should not be a problem because there was no reason to write -such a sequence in RREs. -.PP -\fB{\fR -followed by a digit in an ARE is the beginning of a bound, -while in RREs, -\fB{\fR -was always an ordinary character. -Such sequences should be rare, -and will often result in an error because following characters -will not look like a valid bound. -.PP -In AREs, -\fB\e\fR -remains a special character within `\fB[\|]\fR', -so a literal -\fB\e\fR -within -\fB[\|]\fR -must be written `\fB\e\e\fR'. -\fB\e\e\fR -also gives a literal -\fB\e\fR -within -\fB[\|]\fR -in RREs, -but only truly paranoid programmers routinely doubled the backslash. -.PP -AREs report the longest/shortest match for the RE, -rather than the first found in a specified search order. -This may affect some RREs which were written in the expectation that -the first match would be reported. -(The careful crafting of RREs to optimize the search order for fast -matching is obsolete (AREs examine all possible matches -in parallel, and their performance is largely insensitive to their -complexity) but cases where the search order was exploited to deliberately -find a match which was \fInot\fR the longest/shortest will need rewriting.) -.RE - -.SH "BASIC REGULAR EXPRESSIONS" -BREs differ from EREs in several respects. `\fB|\fR', `\fB+\fR', -and -\fB?\fR -are ordinary characters and there is no equivalent -for their functionality. -The delimiters for bounds are -\fB\e{\fR -and `\fB\e}\fR', -with -\fB{\fR -and -\fB}\fR -by themselves ordinary characters. -The parentheses for nested subexpressions are -\fB\e(\fR -and `\fB\e)\fR', -with -\fB(\fR -and -\fB)\fR -by themselves ordinary characters. -\fB^\fR -is an ordinary character except at the beginning of the -RE or the beginning of a parenthesized subexpression, -\fB$\fR -is an ordinary character except at the end of the -RE or the end of a parenthesized subexpression, -and -\fB*\fR -is an ordinary character if it appears at the beginning of the -RE or the beginning of a parenthesized subexpression -(after a possible leading `\fB^\fR'). -Finally, -single-digit back references are available, -and -\fB\e<\fR -and -\fB\e>\fR -are synonyms for -\fB[[:<:]]\fR -and -\fB[[:>:]]\fR -respectively; -no other escapes are available. - -.SH "SEE ALSO" -RegExp(3), regexp(n), regsub(n), lsearch(n), switch(n), text(n) - -.SH KEYWORDS -match, regular expression, string diff --git a/src/regex/regc_color.c b/src/regex/regc_color.c deleted file mode 100644 index 5376af2ed5..0000000000 --- a/src/regex/regc_color.c +++ /dev/null @@ -1,780 +0,0 @@ -/* - * colorings of characters - * This file is #included by regcomp.c. - * - * Copyright (c) 1998, 1999 Henry Spencer. All rights reserved. - * - * Development of this software was funded, in part, by Cray Research Inc., - * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics - * Corporation, none of whom are responsible for the results. The author - * thanks all of them. - * - * Redistribution and use in source and binary forms -- with or without - * modification -- are permitted for any purpose, provided that - * redistributions in source form retain this entire copyright notice and - * indicate the origin and nature of any modifications. - * - * I'd appreciate being given credit for this package in the documentation - * of software which uses it, but that is not a requirement. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Header$ - * - * - * Note that there are some incestuous relationships between this code and - * NFA arc maintenance, which perhaps ought to be cleaned up sometime. - */ - - - -#define CISERR() VISERR(cm->v) -#define CERR(e) VERR(cm->v, (e)) - - - -/* - * initcm - set up new colormap - */ -static void -initcm(struct vars * v, - struct colormap * cm) -{ - int i; - int j; - union tree *t; - union tree *nextt; - struct colordesc *cd; - - cm->magic = CMMAGIC; - cm->v = v; - - cm->ncds = NINLINECDS; - cm->cd = cm->cdspace; - cm->max = 0; - cm->free = 0; - - cd = cm->cd; /* cm->cd[WHITE] */ - cd->sub = NOSUB; - cd->arcs = NULL; - cd->flags = 0; - cd->nchrs = CHR_MAX - CHR_MIN + 1; - - /* upper levels of tree */ - for (t = &cm->tree[0], j = NBYTS - 1; j > 0; t = nextt, j--) - { - nextt = t + 1; - for (i = BYTTAB - 1; i >= 0; i--) - t->tptr[i] = nextt; - } - /* bottom level is solid white */ - t = &cm->tree[NBYTS - 1]; - for (i = BYTTAB - 1; i >= 0; i--) - t->tcolor[i] = WHITE; - cd->block = t; -} - -/* - * freecm - free dynamically-allocated things in a colormap - */ -static void -freecm(struct colormap * cm) -{ - size_t i; - union tree *cb; - - cm->magic = 0; - if (NBYTS > 1) - cmtreefree(cm, cm->tree, 0); - for (i = 1; i <= cm->max; i++) /* skip WHITE */ - if (!UNUSEDCOLOR(&cm->cd[i])) - { - cb = cm->cd[i].block; - if (cb != NULL) - FREE(cb); - } - if (cm->cd != cm->cdspace) - FREE(cm->cd); -} - -/* - * cmtreefree - free a non-terminal part of a colormap tree - */ -static void -cmtreefree(struct colormap * cm, - union tree * tree, - int level) /* level number (top == 0) of this block */ -{ - int i; - union tree *t; - union tree *fillt = &cm->tree[level + 1]; - union tree *cb; - - assert(level < NBYTS - 1); /* this level has pointers */ - for (i = BYTTAB - 1; i >= 0; i--) - { - t = tree->tptr[i]; - assert(t != NULL); - if (t != fillt) - { - if (level < NBYTS - 2) - { /* more pointer blocks below */ - cmtreefree(cm, t, level + 1); - FREE(t); - } - else - { /* color block below */ - cb = cm->cd[t->tcolor[0]].block; - if (t != cb) /* not a solid block */ - FREE(t); - } - } - } -} - -/* - * setcolor - set the color of a character in a colormap - */ -static color /* previous color */ -setcolor(struct colormap * cm, - chr c, - pcolor co) -{ - uchr uc = c; - int shift; - int level; - int b; - int bottom; - union tree *t; - union tree *newt; - union tree *fillt; - union tree *lastt; - union tree *cb; - color prev; - - assert(cm->magic == CMMAGIC); - if (CISERR() || co == COLORLESS) - return COLORLESS; - - t = cm->tree; - for (level = 0, shift = BYTBITS * (NBYTS - 1); shift > 0; - level++, shift -= BYTBITS) - { - b = (uc >> shift) & BYTMASK; - lastt = t; - t = lastt->tptr[b]; - assert(t != NULL); - fillt = &cm->tree[level + 1]; - bottom = (shift <= BYTBITS) ? 1 : 0; - cb = (bottom) ? cm->cd[t->tcolor[0]].block : fillt; - if (t == fillt || t == cb) - { /* must allocate a new block */ - newt = (union tree *) MALLOC((bottom) ? - sizeof(struct colors) : sizeof(struct ptrs)); - if (newt == NULL) - { - CERR(REG_ESPACE); - return COLORLESS; - } - if (bottom) - memcpy(VS(newt->tcolor), VS(t->tcolor), - BYTTAB * sizeof(color)); - else - memcpy(VS(newt->tptr), VS(t->tptr), - BYTTAB * sizeof(union tree *)); - t = newt; - lastt->tptr[b] = t; - } - } - - b = uc & BYTMASK; - prev = t->tcolor[b]; - t->tcolor[b] = (color) co; - return prev; -} - -/* - * maxcolor - report largest color number in use - */ -static color -maxcolor(struct colormap * cm) -{ - if (CISERR()) - return COLORLESS; - - return (color) cm->max; -} - -/* - * newcolor - find a new color (must be subject of setcolor at once) - * Beware: may relocate the colordescs. - */ -static color /* COLORLESS for error */ -newcolor(struct colormap * cm) -{ - struct colordesc *cd; - struct colordesc *new; - size_t n; - - if (CISERR()) - return COLORLESS; - - if (cm->free != 0) - { - assert(cm->free > 0); - assert((size_t) cm->free < cm->ncds); - cd = &cm->cd[cm->free]; - assert(UNUSEDCOLOR(cd)); - assert(cd->arcs == NULL); - cm->free = cd->sub; - } - else if (cm->max < cm->ncds - 1) - { - cm->max++; - cd = &cm->cd[cm->max]; - } - else - { - /* oops, must allocate more */ - n = cm->ncds * 2; - if (cm->cd == cm->cdspace) - { - new = (struct colordesc *) MALLOC(n * - sizeof(struct colordesc)); - if (new != NULL) - memcpy(VS(new), VS(cm->cdspace), cm->ncds * - sizeof(struct colordesc)); - } - else - new = (struct colordesc *) REALLOC(cm->cd, - n * sizeof(struct colordesc)); - if (new == NULL) - { - CERR(REG_ESPACE); - return COLORLESS; - } - cm->cd = new; - cm->ncds = n; - assert(cm->max < cm->ncds - 1); - cm->max++; - cd = &cm->cd[cm->max]; - } - - cd->nchrs = 0; - cd->sub = NOSUB; - cd->arcs = NULL; - cd->flags = 0; - cd->block = NULL; - - return (color) (cd - cm->cd); -} - -/* - * freecolor - free a color (must have no arcs or subcolor) - */ -static void -freecolor(struct colormap * cm, - pcolor co) -{ - struct colordesc *cd = &cm->cd[co]; - color pco, - nco; /* for freelist scan */ - - assert(co >= 0); - if (co == WHITE) - return; - - assert(cd->arcs == NULL); - assert(cd->sub == NOSUB); - assert(cd->nchrs == 0); - cd->flags = FREECOL; - if (cd->block != NULL) - { - FREE(cd->block); - cd->block = NULL; /* just paranoia */ - } - - if ((size_t) co == cm->max) - { - while (cm->max > WHITE && UNUSEDCOLOR(&cm->cd[cm->max])) - cm->max--; - assert(cm->free >= 0); - while ((size_t) cm->free > cm->max) - cm->free = cm->cd[cm->free].sub; - if (cm->free > 0) - { - assert(cm->free < cm->max); - pco = cm->free; - nco = cm->cd[pco].sub; - while (nco > 0) - if ((size_t) nco > cm->max) - { - /* take this one out of freelist */ - nco = cm->cd[nco].sub; - cm->cd[pco].sub = nco; - } - else - { - assert(nco < cm->max); - pco = nco; - nco = cm->cd[pco].sub; - } - } - } - else - { - cd->sub = cm->free; - cm->free = (color) (cd - cm->cd); - } -} - -/* - * pseudocolor - allocate a false color, to be managed by other means - */ -static color -pseudocolor(struct colormap * cm) -{ - color co; - - co = newcolor(cm); - if (CISERR()) - return COLORLESS; - cm->cd[co].nchrs = 1; - cm->cd[co].flags = PSEUDO; - return co; -} - -/* - * subcolor - allocate a new subcolor (if necessary) to this chr - */ -static color -subcolor(struct colormap * cm, chr c) -{ - color co; /* current color of c */ - color sco; /* new subcolor */ - - co = GETCOLOR(cm, c); - sco = newsub(cm, co); - if (CISERR()) - return COLORLESS; - assert(sco != COLORLESS); - - if (co == sco) /* already in an open subcolor */ - return co; /* rest is redundant */ - cm->cd[co].nchrs--; - cm->cd[sco].nchrs++; - setcolor(cm, c, sco); - return sco; -} - -/* - * newsub - allocate a new subcolor (if necessary) for a color - */ -static color -newsub(struct colormap * cm, - pcolor co) -{ - color sco; /* new subcolor */ - - sco = cm->cd[co].sub; - if (sco == NOSUB) - { /* color has no open subcolor */ - if (cm->cd[co].nchrs == 1) /* optimization */ - return co; - sco = newcolor(cm); /* must create subcolor */ - if (sco == COLORLESS) - { - assert(CISERR()); - return COLORLESS; - } - cm->cd[co].sub = sco; - cm->cd[sco].sub = sco; /* open subcolor points to self */ - } - assert(sco != NOSUB); - - return sco; -} - -/* - * subrange - allocate new subcolors to this range of chrs, fill in arcs - */ -static void -subrange(struct vars * v, - chr from, - chr to, - struct state * lp, - struct state * rp) -{ - uchr uf; - int i; - - assert(from <= to); - - /* first, align "from" on a tree-block boundary */ - uf = (uchr) from; - i = (int) (((uf + BYTTAB - 1) & (uchr) ~BYTMASK) - uf); - for (; from <= to && i > 0; i--, from++) - newarc(v->nfa, PLAIN, subcolor(v->cm, from), lp, rp); - if (from > to) /* didn't reach a boundary */ - return; - - /* deal with whole blocks */ - for (; to - from >= BYTTAB; from += BYTTAB) - subblock(v, from, lp, rp); - - /* clean up any remaining partial table */ - for (; from <= to; from++) - newarc(v->nfa, PLAIN, subcolor(v->cm, from), lp, rp); -} - -/* - * subblock - allocate new subcolors for one tree block of chrs, fill in arcs - */ -static void -subblock(struct vars * v, - chr start, /* first of BYTTAB chrs */ - struct state * lp, - struct state * rp) -{ - uchr uc = start; - struct colormap *cm = v->cm; - int shift; - int level; - int i; - int b; - union tree *t; - union tree *cb; - union tree *fillt; - union tree *lastt; - int previ; - int ndone; - color co; - color sco; - - assert((uc % BYTTAB) == 0); - - /* find its color block, making new pointer blocks as needed */ - t = cm->tree; - fillt = NULL; - for (level = 0, shift = BYTBITS * (NBYTS - 1); shift > 0; - level++, shift -= BYTBITS) - { - b = (uc >> shift) & BYTMASK; - lastt = t; - t = lastt->tptr[b]; - assert(t != NULL); - fillt = &cm->tree[level + 1]; - if (t == fillt && shift > BYTBITS) - { /* need new ptr block */ - t = (union tree *) MALLOC(sizeof(struct ptrs)); - if (t == NULL) - { - CERR(REG_ESPACE); - return; - } - memcpy(VS(t->tptr), VS(fillt->tptr), - BYTTAB * sizeof(union tree *)); - lastt->tptr[b] = t; - } - } - - /* special cases: fill block or solid block */ - co = t->tcolor[0]; - cb = cm->cd[co].block; - if (t == fillt || t == cb) - { - /* either way, we want a subcolor solid block */ - sco = newsub(cm, co); - t = cm->cd[sco].block; - if (t == NULL) - { /* must set it up */ - t = (union tree *) MALLOC(sizeof(struct colors)); - if (t == NULL) - { - CERR(REG_ESPACE); - return; - } - for (i = 0; i < BYTTAB; i++) - t->tcolor[i] = sco; - cm->cd[sco].block = t; - } - /* find loop must have run at least once */ - lastt->tptr[b] = t; - newarc(v->nfa, PLAIN, sco, lp, rp); - cm->cd[co].nchrs -= BYTTAB; - cm->cd[sco].nchrs += BYTTAB; - return; - } - - /* general case, a mixed block to be altered */ - i = 0; - while (i < BYTTAB) - { - co = t->tcolor[i]; - sco = newsub(cm, co); - newarc(v->nfa, PLAIN, sco, lp, rp); - previ = i; - do - { - t->tcolor[i++] = sco; - } while (i < BYTTAB && t->tcolor[i] == co); - ndone = i - previ; - cm->cd[co].nchrs -= ndone; - cm->cd[sco].nchrs += ndone; - } -} - -/* - * okcolors - promote subcolors to full colors - */ -static void -okcolors(struct nfa * nfa, - struct colormap * cm) -{ - struct colordesc *cd; - struct colordesc *end = CDEND(cm); - struct colordesc *scd; - struct arc *a; - color co; - color sco; - - for (cd = cm->cd, co = 0; cd < end; cd++, co++) - { - sco = cd->sub; - if (UNUSEDCOLOR(cd) || sco == NOSUB) - { - /* has no subcolor, no further action */ - } - else if (sco == co) - { - /* is subcolor, let parent deal with it */ - } - else if (cd->nchrs == 0) - { - /* parent empty, its arcs change color to subcolor */ - cd->sub = NOSUB; - scd = &cm->cd[sco]; - assert(scd->nchrs > 0); - assert(scd->sub == sco); - scd->sub = NOSUB; - while ((a = cd->arcs) != NULL) - { - assert(a->co == co); - /* uncolorchain(cm, a); */ - cd->arcs = a->colorchain; - a->co = sco; - /* colorchain(cm, a); */ - a->colorchain = scd->arcs; - scd->arcs = a; - } - freecolor(cm, co); - } - else - { - /* parent's arcs must gain parallel subcolor arcs */ - cd->sub = NOSUB; - scd = &cm->cd[sco]; - assert(scd->nchrs > 0); - assert(scd->sub == sco); - scd->sub = NOSUB; - for (a = cd->arcs; a != NULL; a = a->colorchain) - { - assert(a->co == co); - newarc(nfa, a->type, sco, a->from, a->to); - } - } - } -} - -/* - * colorchain - add this arc to the color chain of its color - */ -static void -colorchain(struct colormap * cm, - struct arc * a) -{ - struct colordesc *cd = &cm->cd[a->co]; - - a->colorchain = cd->arcs; - cd->arcs = a; -} - -/* - * uncolorchain - delete this arc from the color chain of its color - */ -static void -uncolorchain(struct colormap * cm, - struct arc * a) -{ - struct colordesc *cd = &cm->cd[a->co]; - struct arc *aa; - - aa = cd->arcs; - if (aa == a) /* easy case */ - cd->arcs = a->colorchain; - else - { - for (; aa != NULL && aa->colorchain != a; aa = aa->colorchain) - continue; - assert(aa != NULL); - aa->colorchain = a->colorchain; - } - a->colorchain = NULL; /* paranoia */ -} - -/* - * singleton - is this character in its own color? - */ -static int /* predicate */ -singleton(struct colormap * cm, - chr c) -{ - color co; /* color of c */ - - co = GETCOLOR(cm, c); - if (cm->cd[co].nchrs == 1 && cm->cd[co].sub == NOSUB) - return 1; - return 0; -} - -/* - * rainbow - add arcs of all full colors (but one) between specified states - */ -static void -rainbow(struct nfa * nfa, - struct colormap * cm, - int type, - pcolor but, /* COLORLESS if no exceptions */ - struct state * from, - struct state * to) -{ - struct colordesc *cd; - struct colordesc *end = CDEND(cm); - color co; - - for (cd = cm->cd, co = 0; cd < end && !CISERR(); cd++, co++) - if (!UNUSEDCOLOR(cd) && cd->sub != co && co != but && - !(cd->flags & PSEUDO)) - newarc(nfa, type, co, from, to); -} - -/* - * colorcomplement - add arcs of complementary colors - * - * The calling sequence ought to be reconciled with cloneouts(). - */ -static void -colorcomplement(struct nfa * nfa, - struct colormap * cm, - int type, - struct state * of, /* complements of this guy's PLAIN - * outarcs */ - struct state * from, - struct state * to) -{ - struct colordesc *cd; - struct colordesc *end = CDEND(cm); - color co; - - assert(of != from); - for (cd = cm->cd, co = 0; cd < end && !CISERR(); cd++, co++) - if (!UNUSEDCOLOR(cd) && !(cd->flags & PSEUDO)) - if (findarc(of, PLAIN, co) == NULL) - newarc(nfa, type, co, from, to); -} - - -#ifdef REG_DEBUG - -/* - * dumpcolors - debugging output - */ -static void -dumpcolors(struct colormap * cm, - FILE *f) -{ - struct colordesc *cd; - struct colordesc *end; - color co; - chr c; - char *has; - - fprintf(f, "max %ld\n", (long) cm->max); - if (NBYTS > 1) - fillcheck(cm, cm->tree, 0, f); - end = CDEND(cm); - for (cd = cm->cd + 1, co = 1; cd < end; cd++, co++) /* skip 0 */ - if (!UNUSEDCOLOR(cd)) - { - assert(cd->nchrs > 0); - has = (cd->block != NULL) ? "#" : ""; - if (cd->flags & PSEUDO) - fprintf(f, "#%2ld%s(ps): ", (long) co, has); - else - fprintf(f, "#%2ld%s(%2d): ", (long) co, - has, cd->nchrs); - /* it's hard to do this more efficiently */ - for (c = CHR_MIN; c < CHR_MAX; c++) - if (GETCOLOR(cm, c) == co) - dumpchr(c, f); - assert(c == CHR_MAX); - if (GETCOLOR(cm, c) == co) - dumpchr(c, f); - fprintf(f, "\n"); - } -} - -/* - * fillcheck - check proper filling of a tree - */ -static void -fillcheck(struct colormap * cm, - union tree * tree, - int level, /* level number (top == 0) of this block */ - FILE *f) -{ - int i; - union tree *t; - union tree *fillt = &cm->tree[level + 1]; - - assert(level < NBYTS - 1); /* this level has pointers */ - for (i = BYTTAB - 1; i >= 0; i--) - { - t = tree->tptr[i]; - if (t == NULL) - fprintf(f, "NULL found in filled tree!\n"); - else if (t == fillt) - { - } - else if (level < NBYTS - 2) /* more pointer blocks below */ - fillcheck(cm, t, level + 1, f); - } -} - -/* - * dumpchr - print a chr - * - * Kind of char-centric but works well enough for debug use. - */ -static void -dumpchr(chr c, - FILE *f) -{ - if (c == '\\') - fprintf(f, "\\\\"); - else if (c > ' ' && c <= '~') - putc((char) c, f); - else - fprintf(f, "\\u%04lx", (long) c); -} - -#endif /* REG_DEBUG */ diff --git a/src/regex/regc_cvec.c b/src/regex/regc_cvec.c deleted file mode 100644 index b6aa8c98f1..0000000000 --- a/src/regex/regc_cvec.c +++ /dev/null @@ -1,189 +0,0 @@ -/* - * Utility functions for handling cvecs - * This file is #included by regcomp.c. - * - * Copyright (c) 1998, 1999 Henry Spencer. All rights reserved. - * - * Development of this software was funded, in part, by Cray Research Inc., - * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics - * Corporation, none of whom are responsible for the results. The author - * thanks all of them. - * - * Redistribution and use in source and binary forms -- with or without - * modification -- are permitted for any purpose, provided that - * redistributions in source form retain this entire copyright notice and - * indicate the origin and nature of any modifications. - * - * I'd appreciate being given credit for this package in the documentation - * of software which uses it, but that is not a requirement. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Header$ - * - */ - -/* - * newcvec - allocate a new cvec - */ -static struct cvec * -newcvec(int nchrs, /* to hold this many chrs... */ - int nranges, /* ... and this many ranges... */ - int nmcces) /* ... and this many MCCEs */ -{ - size_t n; - size_t nc; - struct cvec *cv; - - nc = (size_t) nchrs + (size_t) nmcces *(MAXMCCE + 1) + (size_t) nranges *2; - - n = sizeof(struct cvec) + (size_t) (nmcces - 1) * sizeof(chr *) - + nc * sizeof(chr); - cv = (struct cvec *) MALLOC(n); - if (cv == NULL) - return NULL; - cv->chrspace = nchrs; - cv->chrs = (chr *) &cv->mcces[nmcces]; /* chrs just after MCCE - * ptrs */ - cv->mccespace = nmcces; - cv->ranges = cv->chrs + nchrs + nmcces * (MAXMCCE + 1); - cv->rangespace = nranges; - return clearcvec(cv); -} - -/* - * clearcvec - clear a possibly-new cvec - * Returns pointer as convenience. - */ -static struct cvec * -clearcvec(struct cvec * cv) -{ - int i; - - assert(cv != NULL); - cv->nchrs = 0; - assert(cv->chrs == (chr *) &cv->mcces[cv->mccespace]); - cv->nmcces = 0; - cv->nmccechrs = 0; - cv->nranges = 0; - for (i = 0; i < cv->mccespace; i++) - cv->mcces[i] = NULL; - - return cv; -} - -/* - * addchr - add a chr to a cvec - */ -static void -addchr(struct cvec * cv, /* character vector */ - chr c) /* character to add */ -{ - assert(cv->nchrs < cv->chrspace - cv->nmccechrs); - cv->chrs[cv->nchrs++] = (chr) c; -} - -/* - * addrange - add a range to a cvec - */ -static void -addrange(struct cvec * cv, /* character vector */ - chr from, /* first character of range */ - chr to) /* last character of range */ -{ - assert(cv->nranges < cv->rangespace); - cv->ranges[cv->nranges * 2] = (chr) from; - cv->ranges[cv->nranges * 2 + 1] = (chr) to; - cv->nranges++; -} - -/* - * addmcce - add an MCCE to a cvec - */ -static void -addmcce(struct cvec * cv, /* character vector */ - chr *startp, /* beginning of text */ - chr *endp) /* just past end of text */ -{ - int len; - int i; - chr *s; - chr *d; - - if (startp == NULL && endp == NULL) - return; - len = endp - startp; - assert(len > 0); - assert(cv->nchrs + len < cv->chrspace - cv->nmccechrs); - assert(cv->nmcces < cv->mccespace); - d = &cv->chrs[cv->chrspace - cv->nmccechrs - len - 1]; - cv->mcces[cv->nmcces++] = d; - for (s = startp, i = len; i > 0; s++, i--) - *d++ = *s; - *d++ = 0; /* endmarker */ - assert(d == &cv->chrs[cv->chrspace - cv->nmccechrs]); - cv->nmccechrs += len + 1; -} - -/* - * haschr - does a cvec contain this chr? - */ -static int /* predicate */ -haschr(struct cvec * cv, /* character vector */ - chr c) /* character to test for */ -{ - int i; - chr *p; - - for (p = cv->chrs, i = cv->nchrs; i > 0; p++, i--) - { - if (*p == c) - return 1; - } - for (p = cv->ranges, i = cv->nranges; i > 0; p += 2, i--) - { - if ((*p <= c) && (c <= *(p + 1))) - return 1; - } - return 0; -} - -/* - * getcvec - get a cvec, remembering it as v->cv - */ -static struct cvec * -getcvec(struct vars * v, /* context */ - int nchrs, /* to hold this many chrs... */ - int nranges, /* ... and this many ranges... */ - int nmcces) /* ... and this many MCCEs */ -{ - if (v->cv != NULL && nchrs <= v->cv->chrspace && - nranges <= v->cv->rangespace && nmcces <= v->cv->mccespace) - return clearcvec(v->cv); - - if (v->cv != NULL) - freecvec(v->cv); - v->cv = newcvec(nchrs, nranges, nmcces); - if (v->cv == NULL) - ERR(REG_ESPACE); - - return v->cv; -} - -/* - * freecvec - free a cvec - */ -static void -freecvec(struct cvec * cv) -{ - FREE(cv); -} diff --git a/src/regex/regc_lex.c b/src/regex/regc_lex.c deleted file mode 100644 index a24290d1a1..0000000000 --- a/src/regex/regc_lex.c +++ /dev/null @@ -1,1146 +0,0 @@ -/* - * lexical analyzer - * This file is #included by regcomp.c. - * - * Copyright (c) 1998, 1999 Henry Spencer. All rights reserved. - * - * Development of this software was funded, in part, by Cray Research Inc., - * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics - * Corporation, none of whom are responsible for the results. The author - * thanks all of them. - * - * Redistribution and use in source and binary forms -- with or without - * modification -- are permitted for any purpose, provided that - * redistributions in source form retain this entire copyright notice and - * indicate the origin and nature of any modifications. - * - * I'd appreciate being given credit for this package in the documentation - * of software which uses it, but that is not a requirement. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Header$ - * - */ - -/* scanning macros (know about v) */ -#define ATEOS() (v->now >= v->stop) -#define HAVE(n) (v->stop - v->now >= (n)) -#define NEXT1(c) (!ATEOS() && *v->now == CHR(c)) -#define NEXT2(a,b) (HAVE(2) && *v->now == CHR(a) && *(v->now+1) == CHR(b)) -#define NEXT3(a,b,c) (HAVE(3) && *v->now == CHR(a) && \ - *(v->now+1) == CHR(b) && \ - *(v->now+2) == CHR(c)) -#define SET(c) (v->nexttype = (c)) -#define SETV(c, n) (v->nexttype = (c), v->nextvalue = (n)) -#define RET(c) return (SET(c), 1) -#define RETV(c, n) return (SETV(c, n), 1) -#define FAILW(e) return (ERR(e), 0) /* ERR does SET(EOS) */ -#define LASTTYPE(t) (v->lasttype == (t)) - -/* lexical contexts */ -#define L_ERE 1 /* mainline ERE/ARE */ -#define L_BRE 2 /* mainline BRE */ -#define L_Q 3 /* REG_QUOTE */ -#define L_EBND 4 /* ERE/ARE bound */ -#define L_BBND 5 /* BRE bound */ -#define L_BRACK 6 /* brackets */ -#define L_CEL 7 /* collating element */ -#define L_ECL 8 /* equivalence class */ -#define L_CCL 9 /* character class */ -#define INTOCON(c) (v->lexcon = (c)) -#define INCON(con) (v->lexcon == (con)) - -/* construct pointer past end of chr array */ -#define ENDOF(array) ((array) + sizeof(array)/sizeof(chr)) - -/* - * lexstart - set up lexical stuff, scan leading options - */ -static void -lexstart(struct vars * v) -{ - prefixes(v); /* may turn on new type bits etc. */ - NOERR(); - - if (v->cflags & REG_QUOTE) - { - assert(!(v->cflags & (REG_ADVANCED | REG_EXPANDED | REG_NEWLINE))); - INTOCON(L_Q); - } - else if (v->cflags & REG_EXTENDED) - { - assert(!(v->cflags & REG_QUOTE)); - INTOCON(L_ERE); - } - else - { - assert(!(v->cflags & (REG_QUOTE | REG_ADVF))); - INTOCON(L_BRE); - } - - v->nexttype = EMPTY; /* remember we were at the start */ - next(v); /* set up the first token */ -} - -/* - * prefixes - implement various special prefixes - */ -static void -prefixes(struct vars * v) -{ - /* literal string doesn't get any of this stuff */ - if (v->cflags & REG_QUOTE) - return; - - /* initial "***" gets special things */ - if (HAVE(4) && NEXT3('*', '*', '*')) - switch (*(v->now + 3)) - { - case CHR('?'): /* "***?" error, msg shows version */ - ERR(REG_BADPAT); - return; /* proceed no further */ - break; - case CHR('='): /* "***=" shifts to literal string */ - NOTE(REG_UNONPOSIX); - v->cflags |= REG_QUOTE; - v->cflags &= ~(REG_ADVANCED | REG_EXPANDED | REG_NEWLINE); - v->now += 4; - return; /* and there can be no more prefixes */ - break; - case CHR(':'): /* "***:" shifts to AREs */ - NOTE(REG_UNONPOSIX); - v->cflags |= REG_ADVANCED; - v->now += 4; - break; - default: /* otherwise *** is just an error */ - ERR(REG_BADRPT); - return; - break; - } - - /* BREs and EREs don't get embedded options */ - if ((v->cflags & REG_ADVANCED) != REG_ADVANCED) - return; - - /* embedded options (AREs only) */ - if (HAVE(3) && NEXT2('(', '?') && iscalpha(*(v->now + 2))) - { - NOTE(REG_UNONPOSIX); - v->now += 2; - for (; !ATEOS() && iscalpha(*v->now); v->now++) - switch (*v->now) - { - case CHR('b'): /* BREs (but why???) */ - v->cflags &= ~(REG_ADVANCED | REG_QUOTE); - break; - case CHR('c'): /* case sensitive */ - v->cflags &= ~REG_ICASE; - break; - case CHR('e'): /* plain EREs */ - v->cflags |= REG_EXTENDED; - v->cflags &= ~(REG_ADVF | REG_QUOTE); - break; - case CHR('i'): /* case insensitive */ - v->cflags |= REG_ICASE; - break; - case CHR('m'): /* Perloid synonym for n */ - case CHR('n'): /* \n affects ^ $ . [^ */ - v->cflags |= REG_NEWLINE; - break; - case CHR('p'): /* ~Perl, \n affects . [^ */ - v->cflags |= REG_NLSTOP; - v->cflags &= ~REG_NLANCH; - break; - case CHR('q'): /* literal string */ - v->cflags |= REG_QUOTE; - v->cflags &= ~REG_ADVANCED; - break; - case CHR('s'): /* single line, \n ordinary */ - v->cflags &= ~REG_NEWLINE; - break; - case CHR('t'): /* tight syntax */ - v->cflags &= ~REG_EXPANDED; - break; - case CHR('w'): /* weird, \n affects ^ $ only */ - v->cflags &= ~REG_NLSTOP; - v->cflags |= REG_NLANCH; - break; - case CHR('x'): /* expanded syntax */ - v->cflags |= REG_EXPANDED; - break; - default: - ERR(REG_BADOPT); - return; - } - if (!NEXT1(')')) - { - ERR(REG_BADOPT); - return; - } - v->now++; - if (v->cflags & REG_QUOTE) - v->cflags &= ~(REG_EXPANDED | REG_NEWLINE); - } -} - -/* - * lexnest - "call a subroutine", interpolating string at the lexical level - * - * Note, this is not a very general facility. There are a number of - * implicit assumptions about what sorts of strings can be subroutines. - */ -static void -lexnest(struct vars * v, - chr *beginp, /* start of interpolation */ - chr *endp) /* one past end of interpolation */ -{ - assert(v->savenow == NULL); /* only one level of nesting */ - v->savenow = v->now; - v->savestop = v->stop; - v->now = beginp; - v->stop = endp; -} - -/* - * string constants to interpolate as expansions of things like \d - */ -static chr backd[] = { /* \d */ - CHR('['), CHR('['), CHR(':'), - CHR('d'), CHR('i'), CHR('g'), CHR('i'), CHR('t'), - CHR(':'), CHR(']'), CHR(']') -}; -static chr backD[] = { /* \D */ - CHR('['), CHR('^'), CHR('['), CHR(':'), - CHR('d'), CHR('i'), CHR('g'), CHR('i'), CHR('t'), - CHR(':'), CHR(']'), CHR(']') -}; -static chr brbackd[] = { /* \d within brackets */ - CHR('['), CHR(':'), - CHR('d'), CHR('i'), CHR('g'), CHR('i'), CHR('t'), - CHR(':'), CHR(']') -}; -static chr backs[] = { /* \s */ - CHR('['), CHR('['), CHR(':'), - CHR('s'), CHR('p'), CHR('a'), CHR('c'), CHR('e'), - CHR(':'), CHR(']'), CHR(']') -}; -static chr backS[] = { /* \S */ - CHR('['), CHR('^'), CHR('['), CHR(':'), - CHR('s'), CHR('p'), CHR('a'), CHR('c'), CHR('e'), - CHR(':'), CHR(']'), CHR(']') -}; -static chr brbacks[] = { /* \s within brackets */ - CHR('['), CHR(':'), - CHR('s'), CHR('p'), CHR('a'), CHR('c'), CHR('e'), - CHR(':'), CHR(']') -}; -static chr backw[] = { /* \w */ - CHR('['), CHR('['), CHR(':'), - CHR('a'), CHR('l'), CHR('n'), CHR('u'), CHR('m'), - CHR(':'), CHR(']'), CHR('_'), CHR(']') -}; -static chr backW[] = { /* \W */ - CHR('['), CHR('^'), CHR('['), CHR(':'), - CHR('a'), CHR('l'), CHR('n'), CHR('u'), CHR('m'), - CHR(':'), CHR(']'), CHR('_'), CHR(']') -}; -static chr brbackw[] = { /* \w within brackets */ - CHR('['), CHR(':'), - CHR('a'), CHR('l'), CHR('n'), CHR('u'), CHR('m'), - CHR(':'), CHR(']'), CHR('_') -}; - -/* - * lexword - interpolate a bracket expression for word characters - * Possibly ought to inquire whether there is a "word" character class. - */ -static void -lexword(struct vars * v) -{ - lexnest(v, backw, ENDOF(backw)); -} - -/* - * next - get next token - */ -static int /* 1 normal, 0 failure */ -next(struct vars * v) -{ - chr c; - - /* errors yield an infinite sequence of failures */ - if (ISERR()) - return 0; /* the error has set nexttype to EOS */ - - /* remember flavor of last token */ - v->lasttype = v->nexttype; - - /* REG_BOSONLY */ - if (v->nexttype == EMPTY && (v->cflags & REG_BOSONLY)) - { - /* at start of a REG_BOSONLY RE */ - RETV(SBEGIN, 0); /* same as \A */ - } - - /* if we're nested and we've hit end, return to outer level */ - if (v->savenow != NULL && ATEOS()) - { - v->now = v->savenow; - v->stop = v->savestop; - v->savenow = v->savestop = NULL; - } - - /* skip white space etc. if appropriate (not in literal or []) */ - if (v->cflags & REG_EXPANDED) - switch (v->lexcon) - { - case L_ERE: - case L_BRE: - case L_EBND: - case L_BBND: - skip(v); - break; - } - - /* handle EOS, depending on context */ - if (ATEOS()) - { - switch (v->lexcon) - { - case L_ERE: - case L_BRE: - case L_Q: - RET(EOS); - break; - case L_EBND: - case L_BBND: - FAILW(REG_EBRACE); - break; - case L_BRACK: - case L_CEL: - case L_ECL: - case L_CCL: - FAILW(REG_EBRACK); - break; - } - assert(NOTREACHED); - } - - /* okay, time to actually get a character */ - c = *v->now++; - - /* deal with the easy contexts, punt EREs to code below */ - switch (v->lexcon) - { - case L_BRE: /* punt BREs to separate function */ - return brenext(v, c); - break; - case L_ERE: /* see below */ - break; - case L_Q: /* literal strings are easy */ - RETV(PLAIN, c); - break; - case L_BBND: /* bounds are fairly simple */ - case L_EBND: - switch (c) - { - case CHR('0'): - case CHR('1'): - case CHR('2'): - case CHR('3'): - case CHR('4'): - case CHR('5'): - case CHR('6'): - case CHR('7'): - case CHR('8'): - case CHR('9'): - RETV(DIGIT, (chr) DIGITVAL(c)); - break; - case CHR(','): - RET(','); - break; - case CHR('}'): /* ERE bound ends with } */ - if (INCON(L_EBND)) - { - INTOCON(L_ERE); - if ((v->cflags & REG_ADVF) && NEXT1('?')) - { - v->now++; - NOTE(REG_UNONPOSIX); - RETV('}', 0); - } - RETV('}', 1); - } - else - FAILW(REG_BADBR); - break; - case CHR('\\'): /* BRE bound ends with \} */ - if (INCON(L_BBND) && NEXT1('}')) - { - v->now++; - INTOCON(L_BRE); - RET('}'); - } - else - FAILW(REG_BADBR); - break; - default: - FAILW(REG_BADBR); - break; - } - assert(NOTREACHED); - break; - case L_BRACK: /* brackets are not too hard */ - switch (c) - { - case CHR(']'): - if (LASTTYPE('[')) - RETV(PLAIN, c); - else - { - INTOCON((v->cflags & REG_EXTENDED) ? - L_ERE : L_BRE); - RET(']'); - } - break; - case CHR('\\'): - NOTE(REG_UBBS); - if (!(v->cflags & REG_ADVF)) - RETV(PLAIN, c); - NOTE(REG_UNONPOSIX); - if (ATEOS()) - FAILW(REG_EESCAPE); - (DISCARD) lexescape(v); - switch (v->nexttype) - { /* not all escapes okay here */ - case PLAIN: - return 1; - break; - case CCLASS: - switch (v->nextvalue) - { - case 'd': - lexnest(v, brbackd, ENDOF(brbackd)); - break; - case 's': - lexnest(v, brbacks, ENDOF(brbacks)); - break; - case 'w': - lexnest(v, brbackw, ENDOF(brbackw)); - break; - default: - FAILW(REG_EESCAPE); - break; - } - /* lexnest done, back up and try again */ - v->nexttype = v->lasttype; - return next(v); - break; - } - /* not one of the acceptable escapes */ - FAILW(REG_EESCAPE); - break; - case CHR('-'): - if (LASTTYPE('[') || NEXT1(']')) - RETV(PLAIN, c); - else - RETV(RANGE, c); - break; - case CHR('['): - if (ATEOS()) - FAILW(REG_EBRACK); - switch (*v->now++) - { - case CHR('.'): - INTOCON(L_CEL); - /* might or might not be locale-specific */ - RET(COLLEL); - break; - case CHR('='): - INTOCON(L_ECL); - NOTE(REG_ULOCALE); - RET(ECLASS); - break; - case CHR(':'): - INTOCON(L_CCL); - NOTE(REG_ULOCALE); - RET(CCLASS); - break; - default: /* oops */ - v->now--; - RETV(PLAIN, c); - break; - } - assert(NOTREACHED); - break; - default: - RETV(PLAIN, c); - break; - } - assert(NOTREACHED); - break; - case L_CEL: /* collating elements are easy */ - if (c == CHR('.') && NEXT1(']')) - { - v->now++; - INTOCON(L_BRACK); - RETV(END, '.'); - } - else - RETV(PLAIN, c); - break; - case L_ECL: /* ditto equivalence classes */ - if (c == CHR('=') && NEXT1(']')) - { - v->now++; - INTOCON(L_BRACK); - RETV(END, '='); - } - else - RETV(PLAIN, c); - break; - case L_CCL: /* ditto character classes */ - if (c == CHR(':') && NEXT1(']')) - { - v->now++; - INTOCON(L_BRACK); - RETV(END, ':'); - } - else - RETV(PLAIN, c); - break; - default: - assert(NOTREACHED); - break; - } - - /* that got rid of everything except EREs and AREs */ - assert(INCON(L_ERE)); - - /* deal with EREs and AREs, except for backslashes */ - switch (c) - { - case CHR('|'): - RET('|'); - break; - case CHR('*'): - if ((v->cflags & REG_ADVF) && NEXT1('?')) - { - v->now++; - NOTE(REG_UNONPOSIX); - RETV('*', 0); - } - RETV('*', 1); - break; - case CHR('+'): - if ((v->cflags & REG_ADVF) && NEXT1('?')) - { - v->now++; - NOTE(REG_UNONPOSIX); - RETV('+', 0); - } - RETV('+', 1); - break; - case CHR('?'): - if ((v->cflags & REG_ADVF) && NEXT1('?')) - { - v->now++; - NOTE(REG_UNONPOSIX); - RETV('?', 0); - } - RETV('?', 1); - break; - case CHR('{'): /* bounds start or plain character */ - if (v->cflags & REG_EXPANDED) - skip(v); - if (ATEOS() || !iscdigit(*v->now)) - { - NOTE(REG_UBRACES); - NOTE(REG_UUNSPEC); - RETV(PLAIN, c); - } - else - { - NOTE(REG_UBOUNDS); - INTOCON(L_EBND); - RET('{'); - } - assert(NOTREACHED); - break; - case CHR('('): /* parenthesis, or advanced extension */ - if ((v->cflags & REG_ADVF) && NEXT1('?')) - { - NOTE(REG_UNONPOSIX); - v->now++; - switch (*v->now++) - { - case CHR(':'): /* non-capturing paren */ - RETV('(', 0); - break; - case CHR('#'): /* comment */ - while (!ATEOS() && *v->now != CHR(')')) - v->now++; - if (!ATEOS()) - v->now++; - assert(v->nexttype == v->lasttype); - return next(v); - break; - case CHR('='): /* positive lookahead */ - NOTE(REG_ULOOKAHEAD); - RETV(LACON, 1); - break; - case CHR('!'): /* negative lookahead */ - NOTE(REG_ULOOKAHEAD); - RETV(LACON, 0); - break; - default: - FAILW(REG_BADRPT); - break; - } - assert(NOTREACHED); - } - if (v->cflags & REG_NOSUB) - RETV('(', 0); /* all parens non-capturing */ - else - RETV('(', 1); - break; - case CHR(')'): - if (LASTTYPE('(')) - NOTE(REG_UUNSPEC); - RETV(')', c); - break; - case CHR('['): /* easy except for [[:<:]] and [[:>:]] */ - if (HAVE(6) && *(v->now + 0) == CHR('[') && - *(v->now + 1) == CHR(':') && - (*(v->now + 2) == CHR('<') || - *(v->now + 2) == CHR('>')) && - *(v->now + 3) == CHR(':') && - *(v->now + 4) == CHR(']') && - *(v->now + 5) == CHR(']')) - { - c = *(v->now + 2); - v->now += 6; - NOTE(REG_UNONPOSIX); - RET((c == CHR('<')) ? '<' : '>'); - } - INTOCON(L_BRACK); - if (NEXT1('^')) - { - v->now++; - RETV('[', 0); - } - RETV('[', 1); - break; - case CHR('.'): - RET('.'); - break; - case CHR('^'): - RET('^'); - break; - case CHR('$'): - RET('$'); - break; - case CHR('\\'): /* mostly punt backslashes to code below */ - if (ATEOS()) - FAILW(REG_EESCAPE); - break; - default: /* ordinary character */ - RETV(PLAIN, c); - break; - } - - /* ERE/ARE backslash handling; backslash already eaten */ - assert(!ATEOS()); - if (!(v->cflags & REG_ADVF)) - { /* only AREs have non-trivial escapes */ - if (iscalnum(*v->now)) - { - NOTE(REG_UBSALNUM); - NOTE(REG_UUNSPEC); - } - RETV(PLAIN, *v->now++); - } - (DISCARD) lexescape(v); - if (ISERR()) - FAILW(REG_EESCAPE); - if (v->nexttype == CCLASS) - { /* fudge at lexical level */ - switch (v->nextvalue) - { - case 'd': - lexnest(v, backd, ENDOF(backd)); - break; - case 'D': - lexnest(v, backD, ENDOF(backD)); - break; - case 's': - lexnest(v, backs, ENDOF(backs)); - break; - case 'S': - lexnest(v, backS, ENDOF(backS)); - break; - case 'w': - lexnest(v, backw, ENDOF(backw)); - break; - case 'W': - lexnest(v, backW, ENDOF(backW)); - break; - default: - assert(NOTREACHED); - FAILW(REG_ASSERT); - break; - } - /* lexnest done, back up and try again */ - v->nexttype = v->lasttype; - return next(v); - } - /* otherwise, lexescape has already done the work */ - return !ISERR(); -} - -/* - * lexescape - parse an ARE backslash escape (backslash already eaten) - * Note slightly nonstandard use of the CCLASS type code. - */ -static int /* not actually used, but convenient for - * RETV */ -lexescape(struct vars * v) -{ - chr c; - static chr alert[] = { - CHR('a'), CHR('l'), CHR('e'), CHR('r'), CHR('t') - }; - static chr esc[] = { - CHR('E'), CHR('S'), CHR('C') - }; - chr *save; - - assert(v->cflags & REG_ADVF); - - assert(!ATEOS()); - c = *v->now++; - if (!iscalnum(c)) - RETV(PLAIN, c); - - NOTE(REG_UNONPOSIX); - switch (c) - { - case CHR('a'): - RETV(PLAIN, chrnamed(v, alert, ENDOF(alert), CHR('\007'))); - break; - case CHR('A'): - RETV(SBEGIN, 0); - break; - case CHR('b'): - RETV(PLAIN, CHR('\b')); - break; - case CHR('B'): - RETV(PLAIN, CHR('\\')); - break; - case CHR('c'): - NOTE(REG_UUNPORT); - if (ATEOS()) - FAILW(REG_EESCAPE); - RETV(PLAIN, (chr) (*v->now++ & 037)); - break; - case CHR('d'): - NOTE(REG_ULOCALE); - RETV(CCLASS, 'd'); - break; - case CHR('D'): - NOTE(REG_ULOCALE); - RETV(CCLASS, 'D'); - break; - case CHR('e'): - NOTE(REG_UUNPORT); - RETV(PLAIN, chrnamed(v, esc, ENDOF(esc), CHR('\033'))); - break; - case CHR('f'): - RETV(PLAIN, CHR('\f')); - break; - case CHR('m'): - RET('<'); - break; - case CHR('M'): - RET('>'); - break; - case CHR('n'): - RETV(PLAIN, CHR('\n')); - break; - case CHR('r'): - RETV(PLAIN, CHR('\r')); - break; - case CHR('s'): - NOTE(REG_ULOCALE); - RETV(CCLASS, 's'); - break; - case CHR('S'): - NOTE(REG_ULOCALE); - RETV(CCLASS, 'S'); - break; - case CHR('t'): - RETV(PLAIN, CHR('\t')); - break; - case CHR('u'): - c = lexdigits(v, 16, 4, 4); - if (ISERR()) - FAILW(REG_EESCAPE); - RETV(PLAIN, c); - break; - case CHR('U'): - c = lexdigits(v, 16, 8, 8); - if (ISERR()) - FAILW(REG_EESCAPE); - RETV(PLAIN, c); - break; - case CHR('v'): - RETV(PLAIN, CHR('\v')); - break; - case CHR('w'): - NOTE(REG_ULOCALE); - RETV(CCLASS, 'w'); - break; - case CHR('W'): - NOTE(REG_ULOCALE); - RETV(CCLASS, 'W'); - break; - case CHR('x'): - NOTE(REG_UUNPORT); - c = lexdigits(v, 16, 1, 255); /* REs >255 long outside - * spec */ - if (ISERR()) - FAILW(REG_EESCAPE); - RETV(PLAIN, c); - break; - case CHR('y'): - NOTE(REG_ULOCALE); - RETV(WBDRY, 0); - break; - case CHR('Y'): - NOTE(REG_ULOCALE); - RETV(NWBDRY, 0); - break; - case CHR('Z'): - RETV(SEND, 0); - break; - case CHR('1'): - case CHR('2'): - case CHR('3'): - case CHR('4'): - case CHR('5'): - case CHR('6'): - case CHR('7'): - case CHR('8'): - case CHR('9'): - save = v->now; - v->now--; /* put first digit back */ - c = lexdigits(v, 10, 1, 255); /* REs >255 long outside - * spec */ - if (ISERR()) - FAILW(REG_EESCAPE); - /* ugly heuristic (first test is "exactly 1 digit?") */ - if (v->now - save == 0 || (int) c <= v->nsubexp) - { - NOTE(REG_UBACKREF); - RETV(BACKREF, (chr) c); - } - /* oops, doesn't look like it's a backref after all... */ - v->now = save; - /* and fall through into octal number */ - case CHR('0'): - NOTE(REG_UUNPORT); - v->now--; /* put first digit back */ - c = lexdigits(v, 8, 1, 3); - if (ISERR()) - FAILW(REG_EESCAPE); - RETV(PLAIN, c); - break; - default: - assert(iscalpha(c)); - FAILW(REG_EESCAPE); /* unknown alphabetic escape */ - break; - } - assert(NOTREACHED); -} - -/* - * lexdigits - slurp up digits and return chr value - */ -static chr /* chr value; errors signalled via ERR */ -lexdigits(struct vars * v, - int base, - int minlen, - int maxlen) -{ - uchr n; /* unsigned to avoid overflow misbehavior */ - int len; - chr c; - int d; - const uchr ub = (uchr) base; - - n = 0; - for (len = 0; len < maxlen && !ATEOS(); len++) - { - c = *v->now++; - switch (c) - { - case CHR('0'): - case CHR('1'): - case CHR('2'): - case CHR('3'): - case CHR('4'): - case CHR('5'): - case CHR('6'): - case CHR('7'): - case CHR('8'): - case CHR('9'): - d = DIGITVAL(c); - break; - case CHR('a'): - case CHR('A'): - d = 10; - break; - case CHR('b'): - case CHR('B'): - d = 11; - break; - case CHR('c'): - case CHR('C'): - d = 12; - break; - case CHR('d'): - case CHR('D'): - d = 13; - break; - case CHR('e'): - case CHR('E'): - d = 14; - break; - case CHR('f'): - case CHR('F'): - d = 15; - break; - default: - v->now--; /* oops, not a digit at all */ - d = -1; - break; - } - - if (d >= base) - { /* not a plausible digit */ - v->now--; - d = -1; - } - if (d < 0) - break; /* NOTE BREAK OUT */ - n = n * ub + (uchr) d; - } - if (len < minlen) - ERR(REG_EESCAPE); - - return (chr) n; -} - -/* - * brenext - get next BRE token - * - * This is much like EREs except for all the stupid backslashes and the - * context-dependency of some things. - */ -static int /* 1 normal, 0 failure */ -brenext(struct vars * v, - chr pc) -{ - chr c = (chr) pc; - - switch (c) - { - case CHR('*'): - if (LASTTYPE(EMPTY) || LASTTYPE('(') || LASTTYPE('^')) - RETV(PLAIN, c); - RET('*'); - break; - case CHR('['): - if (HAVE(6) && *(v->now + 0) == CHR('[') && - *(v->now + 1) == CHR(':') && - (*(v->now + 2) == CHR('<') || - *(v->now + 2) == CHR('>')) && - *(v->now + 3) == CHR(':') && - *(v->now + 4) == CHR(']') && - *(v->now + 5) == CHR(']')) - { - c = *(v->now + 2); - v->now += 6; - NOTE(REG_UNONPOSIX); - RET((c == CHR('<')) ? '<' : '>'); - } - INTOCON(L_BRACK); - if (NEXT1('^')) - { - v->now++; - RETV('[', 0); - } - RETV('[', 1); - break; - case CHR('.'): - RET('.'); - break; - case CHR('^'): - if (LASTTYPE(EMPTY)) - RET('^'); - if (LASTTYPE('(')) - { - NOTE(REG_UUNSPEC); - RET('^'); - } - RETV(PLAIN, c); - break; - case CHR('$'): - if (v->cflags & REG_EXPANDED) - skip(v); - if (ATEOS()) - RET('$'); - if (NEXT2('\\', ')')) - { - NOTE(REG_UUNSPEC); - RET('$'); - } - RETV(PLAIN, c); - break; - case CHR('\\'): - break; /* see below */ - default: - RETV(PLAIN, c); - break; - } - - assert(c == CHR('\\')); - - if (ATEOS()) - FAILW(REG_EESCAPE); - - c = *v->now++; - switch (c) - { - case CHR('{'): - INTOCON(L_BBND); - NOTE(REG_UBOUNDS); - RET('{'); - break; - case CHR('('): - RETV('(', 1); - break; - case CHR(')'): - RETV(')', c); - break; - case CHR('<'): - NOTE(REG_UNONPOSIX); - RET('<'); - break; - case CHR('>'): - NOTE(REG_UNONPOSIX); - RET('>'); - break; - case CHR('1'): - case CHR('2'): - case CHR('3'): - case CHR('4'): - case CHR('5'): - case CHR('6'): - case CHR('7'): - case CHR('8'): - case CHR('9'): - NOTE(REG_UBACKREF); - RETV(BACKREF, (chr) DIGITVAL(c)); - break; - default: - if (iscalnum(c)) - { - NOTE(REG_UBSALNUM); - NOTE(REG_UUNSPEC); - } - RETV(PLAIN, c); - break; - } - - assert(NOTREACHED); -} - -/* - * skip - skip white space and comments in expanded form - */ -static void -skip(struct vars * v) -{ - chr *start = v->now; - - assert(v->cflags & REG_EXPANDED); - - for (;;) - { - while (!ATEOS() && iscspace(*v->now)) - v->now++; - if (ATEOS() || *v->now != CHR('#')) - break; /* NOTE BREAK OUT */ - assert(NEXT1('#')); - while (!ATEOS() && *v->now != CHR('\n')) - v->now++; - /* leave the newline to be picked up by the iscspace loop */ - } - - if (v->now != start) - NOTE(REG_UNONPOSIX); -} - -/* - * newline - return the chr for a newline - * - * This helps confine use of CHR to this source file. - */ -static chr -newline(void) -{ - return CHR('\n'); -} - -/* - * chrnamed - return the chr known by a given (chr string) name - * - * The code is a bit clumsy, but this routine gets only such specialized - * use that it hardly matters. - */ -static chr -chrnamed(struct vars * v, - chr *startp, /* start of name */ - chr *endp, /* just past end of name */ - chr lastresort) /* what to return if name lookup fails */ -{ - celt c; - int errsave; - int e; - struct cvec *cv; - - errsave = v->err; - v->err = 0; - c = element(v, startp, endp); - e = v->err; - v->err = errsave; - - if (e != 0) - return (chr) lastresort; - - cv = range(v, c, c, 0); - if (cv->nchrs == 0) - return (chr) lastresort; - return cv->chrs[0]; -} diff --git a/src/regex/regc_locale.c b/src/regex/regc_locale.c deleted file mode 100644 index 4e13b8488b..0000000000 --- a/src/regex/regc_locale.c +++ /dev/null @@ -1,838 +0,0 @@ -/* - * regc_locale.c -- - * - * This file contains locale-specific regexp routines. - * This file is #included by regcomp.c. - * - * Copyright (c) 1998 by Scriptics Corporation. - * - * This software is copyrighted by the Regents of the University of - * California, Sun Microsystems, Inc., Scriptics Corporation, ActiveState - * Corporation and other parties. The following terms apply to all files - * associated with the software unless explicitly disclaimed in - * individual files. - * - * The authors hereby grant permission to use, copy, modify, distribute, - * and license this software and its documentation for any purpose, provided - * that existing copyright notices are retained in all copies and that this - * notice is included verbatim in any distributions. No written agreement, - * license, or royalty fee is required for any of the authorized uses. - * Modifications to this software may be copyrighted by their authors - * and need not follow the licensing terms described here, provided that - * the new terms are clearly indicated on the first page of each file where - * they apply. - * - * IN NO EVENT SHALL THE AUTHORS OR DISTRIBUTORS BE LIABLE TO ANY PARTY - * FOR DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES - * ARISING OUT OF THE USE OF THIS SOFTWARE, ITS DOCUMENTATION, OR ANY - * DERIVATIVES THEREOF, EVEN IF THE AUTHORS HAVE BEEN ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * THE AUTHORS AND DISTRIBUTORS SPECIFICALLY DISCLAIM ANY WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. THIS SOFTWARE - * IS PROVIDED ON AN "AS IS" BASIS, AND THE AUTHORS AND DISTRIBUTORS HAVE - * NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR - * MODIFICATIONS. - * - * GOVERNMENT USE: If you are acquiring this software on behalf of the - * U.S. government, the Government shall have only "Restricted Rights" - * in the software and related documentation as defined in the Federal - * Acquisition Regulations (FARs) in Clause 52.227.19 (c) (2). If you - * are acquiring the software on behalf of the Department of Defense, the - * software shall be classified as "Commercial Computer Software" and the - * Government shall have only "Restricted Rights" as defined in Clause - * 252.227-7013 (c) (1) of DFARs. Notwithstanding the foregoing, the - * authors grant the U.S. Government and others acting in its behalf - * permission to use and distribute the software in accordance with the - * terms specified in this license. - * - * $Header$ - */ - -int char_and_wchar_strncmp (const char* cp, const wx_wchar* wp, size_t nNum) -{ - while(*cp++ == (const char)*wp++ && --nNum){} - - return nNum; -} - -/* ASCII character-name table */ - -static struct cname -{ - char *name; - char code; -} cnames[] = - -{ - { - "NUL", '\0' - }, - { - "SOH", '\001' - }, - { - "STX", '\002' - }, - { - "ETX", '\003' - }, - { - "EOT", '\004' - }, - { - "ENQ", '\005' - }, - { - "ACK", '\006' - }, - { - "BEL", '\007' - }, - { - "alert", '\007' - }, - { - "BS", '\010' - }, - { - "backspace", '\b' - }, - { - "HT", '\011' - }, - { - "tab", '\t' - }, - { - "LF", '\012' - }, - { - "newline", '\n' - }, - { - "VT", '\013' - }, - { - "vertical-tab", '\v' - }, - { - "FF", '\014' - }, - { - "form-feed", '\f' - }, - { - "CR", '\015' - }, - { - "carriage-return", '\r' - }, - { - "SO", '\016' - }, - { - "SI", '\017' - }, - { - "DLE", '\020' - }, - { - "DC1", '\021' - }, - { - "DC2", '\022' - }, - { - "DC3", '\023' - }, - { - "DC4", '\024' - }, - { - "NAK", '\025' - }, - { - "SYN", '\026' - }, - { - "ETB", '\027' - }, - { - "CAN", '\030' - }, - { - "EM", '\031' - }, - { - "SUB", '\032' - }, - { - "ESC", '\033' - }, - { - "IS4", '\034' - }, - { - "FS", '\034' - }, - { - "IS3", '\035' - }, - { - "GS", '\035' - }, - { - "IS2", '\036' - }, - { - "RS", '\036' - }, - { - "IS1", '\037' - }, - { - "US", '\037' - }, - { - "space", ' ' - }, - { - "exclamation-mark", '!' - }, - { - "quotation-mark", '"' - }, - { - "number-sign", '#' - }, - { - "dollar-sign", '$' - }, - { - "percent-sign", '%' - }, - { - "ampersand", '&' - }, - { - "apostrophe", '\'' - }, - { - "left-parenthesis", '(' - }, - { - "right-parenthesis", ')' - }, - { - "asterisk", '*' - }, - { - "plus-sign", '+' - }, - { - "comma", ',' - }, - { - "hyphen", '-' - }, - { - "hyphen-minus", '-' - }, - { - "period", '.' - }, - { - "full-stop", '.' - }, - { - "slash", '/' - }, - { - "solidus", '/' - }, - { - "zero", '0' - }, - { - "one", '1' - }, - { - "two", '2' - }, - { - "three", '3' - }, - { - "four", '4' - }, - { - "five", '5' - }, - { - "six", '6' - }, - { - "seven", '7' - }, - { - "eight", '8' - }, - { - "nine", '9' - }, - { - "colon", ':' - }, - { - "semicolon", ';' - }, - { - "less-than-sign", '<' - }, - { - "equals-sign", '=' - }, - { - "greater-than-sign", '>' - }, - { - "question-mark", '?' - }, - { - "commercial-at", '@' - }, - { - "left-square-bracket", '[' - }, - { - "backslash", '\\' - }, - { - "reverse-solidus", '\\' - }, - { - "right-square-bracket", ']' - }, - { - "circumflex", '^' - }, - { - "circumflex-accent", '^' - }, - { - "underscore", '_' - }, - { - "low-line", '_' - }, - { - "grave-accent", '`' - }, - { - "left-brace", '{' - }, - { - "left-curly-bracket", '{' - }, - { - "vertical-line", '|' - }, - { - "right-brace", '}' - }, - { - "right-curly-bracket", '}' - }, - { - "tilde", '~' - }, - { - "DEL", '\177' - }, - { - NULL, 0 - } -}; - -/* - * some ctype functions with non-ascii-char guard - */ -static int -wx_isdigit(wx_wchar c) -{ - return (c >= 0 && c <= UCHAR_MAX && isdigit((unsigned char) c)); -} - -static int -wx_isalpha(wx_wchar c) -{ - return (c >= 0 && c <= UCHAR_MAX && isalpha((unsigned char) c)); -} - -static int -wx_isalnum(wx_wchar c) -{ - return (c >= 0 && c <= UCHAR_MAX && isalnum((unsigned char) c)); -} - -static int -wx_isupper(wx_wchar c) -{ - return (c >= 0 && c <= UCHAR_MAX && isupper((unsigned char) c)); -} - -static int -wx_islower(wx_wchar c) -{ - return (c >= 0 && c <= UCHAR_MAX && islower((unsigned char) c)); -} - -static int -wx_isgraph(wx_wchar c) -{ - return (c >= 0 && c <= UCHAR_MAX && isgraph((unsigned char) c)); -} - -static int -wx_ispunct(wx_wchar c) -{ - return (c >= 0 && c <= UCHAR_MAX && ispunct((unsigned char) c)); -} - -static int -wx_isspace(wx_wchar c) -{ - return (c >= 0 && c <= UCHAR_MAX && isspace((unsigned char) c)); -} - -static wx_wchar -wx_toupper(wx_wchar c) -{ - if (c >= 0 && c <= UCHAR_MAX) - return toupper((unsigned char) c); - return c; -} - -static wx_wchar -wx_tolower(wx_wchar c) -{ - if (c >= 0 && c <= UCHAR_MAX) - return tolower((unsigned char) c); - return c; -} - - -/* - * nmcces - how many distinct MCCEs are there? - */ -static int -nmcces(struct vars * v) -{ - /* - * No multi-character collating elements defined at the moment. - */ - return 0; -} - -/* - * nleaders - how many chrs can be first chrs of MCCEs? - */ -static int -nleaders(struct vars * v) -{ - return 0; -} - -/* - * allmcces - return a cvec with all the MCCEs of the locale - */ -static struct cvec * -allmcces(struct vars * v, /* context */ - struct cvec * cv) /* this is supposed to have enough room */ -{ - return clearcvec(cv); -} - -/* - * element - map collating-element name to celt - */ -static celt -element(struct vars * v, /* context */ - chr *startp, /* points to start of name */ - chr *endp) /* points just past end of name */ -{ - struct cname *cn; - size_t len; - - /* generic: one-chr names stand for themselves */ - assert(startp < endp); - len = endp - startp; - if (len == 1) - return *startp; - - NOTE(REG_ULOCALE); - - /* search table */ - for (cn = cnames; cn->name != NULL; cn++) - { - if (strlen(cn->name) == len && - char_and_wchar_strncmp(cn->name, startp, len) == 0) - { - break; /* NOTE BREAK OUT */ - } - } - if (cn->name != NULL) - return CHR(cn->code); - - /* couldn't find it */ - ERR(REG_ECOLLATE); - return 0; -} - -/* - * range - supply cvec for a range, including legality check - */ -static struct cvec * -range(struct vars * v, /* context */ - celt a, /* range start */ - celt b, /* range end, might equal a */ - int cases) /* case-independent? */ -{ - int nchrs; - struct cvec *cv; - celt c, - lc, - uc; - - if (a != b && !before(a, b)) - { - ERR(REG_ERANGE); - return NULL; - } - - if (!cases) - { /* easy version */ - cv = getcvec(v, 0, 1, 0); - NOERRN(); - addrange(cv, a, b); - return cv; - } - - /* - * When case-independent, it's hard to decide when cvec ranges are - * usable, so for now at least, we won't try. We allocate enough - * space for two case variants plus a little extra for the two title - * case variants. - */ - - nchrs = (b - a + 1) * 2 + 4; - - cv = getcvec(v, nchrs, 0, 0); - NOERRN(); - - for (c = a; c <= b; c++) - { - addchr(cv, c); - lc = wx_tolower((chr) c); - if (c != lc) - addchr(cv, lc); - uc = wx_toupper((chr) c); - if (c != uc) - addchr(cv, uc); - } - - return cv; -} - -/* - * before - is celt x before celt y, for purposes of range legality? - */ -static int /* predicate */ -before(celt x, celt y) -{ - /* trivial because no MCCEs */ - if (x < y) - return 1; - return 0; -} - -/* - * eclass - supply cvec for an equivalence class - * Must include case counterparts on request. - */ -static struct cvec * -eclass(struct vars * v, /* context */ - celt c, /* Collating element representing the - * equivalence class. */ - int cases) /* all cases? */ -{ - struct cvec *cv; - - /* crude fake equivalence class for testing */ - if ((v->cflags & REG_FAKE) && c == 'x') - { - cv = getcvec(v, 4, 0, 0); - addchr(cv, (chr) 'x'); - addchr(cv, (chr) 'y'); - if (cases) - { - addchr(cv, (chr) 'X'); - addchr(cv, (chr) 'Y'); - } - return cv; - } - - /* otherwise, none */ - if (cases) - return allcases(v, c); - cv = getcvec(v, 1, 0, 0); - assert(cv != NULL); - addchr(cv, (chr) c); - return cv; -} - -/* - * cclass - supply cvec for a character class - * - * Must include case counterparts on request. - */ -static struct cvec * -cclass(struct vars * v, /* context */ - chr *startp, /* where the name starts */ - chr *endp, /* just past the end of the name */ - int cases) /* case-independent? */ -{ - size_t len; - struct cvec *cv = NULL; - char **namePtr; - int i, - index; - - /* - * The following arrays define the valid character class names. - */ - - static char *classNames[] = { - "alnum", "alpha", "ascii", "blank", "cntrl", "digit", "graph", - "lower", "print", "punct", "space", "upper", "xdigit", NULL - }; - - enum classes - { - CC_ALNUM, CC_ALPHA, CC_ASCII, CC_BLANK, CC_CNTRL, CC_DIGIT, CC_GRAPH, - CC_LOWER, CC_PRINT, CC_PUNCT, CC_SPACE, CC_UPPER, CC_XDIGIT - }; - - /* - * Map the name to the corresponding enumerated value. - */ - len = endp - startp; - index = -1; - for (namePtr = classNames, i = 0; *namePtr != NULL; namePtr++, i++) - { - if (strlen(*namePtr) == len && - char_and_wchar_strncmp(*namePtr, startp, len) == 0) - { - index = i; - break; - } - } - if (index == -1) - { - ERR(REG_ECTYPE); - return NULL; - } - - /* - * Remap lower and upper to alpha if the match is case insensitive. - */ - - if (cases && - ((enum classes) index == CC_LOWER || - (enum classes) index == CC_UPPER)) - index = (int) CC_ALPHA; - - /* - * Now compute the character class contents. - * - * For the moment, assume that only char codes < 256 can be in these - * classes. - */ - - switch ((enum classes) index) - { - case CC_PRINT: - case CC_ALNUM: - cv = getcvec(v, UCHAR_MAX, 1, 0); - if (cv) - { - for (i = 0; i <= UCHAR_MAX; i++) - { - if (wx_isalpha((chr) i)) - addchr(cv, (chr) i); - } - addrange(cv, (chr) '0', (chr) '9'); - } - break; - case CC_ALPHA: - cv = getcvec(v, UCHAR_MAX, 0, 0); - if (cv) - { - for (i = 0; i <= UCHAR_MAX; i++) - { - if (wx_isalpha((chr) i)) - addchr(cv, (chr) i); - } - } - break; - case CC_ASCII: - cv = getcvec(v, 0, 1, 0); - if (cv) - addrange(cv, 0, 0x7f); - break; - case CC_BLANK: - cv = getcvec(v, 2, 0, 0); - addchr(cv, '\t'); - addchr(cv, ' '); - break; - case CC_CNTRL: - cv = getcvec(v, 0, 2, 0); - addrange(cv, 0x0, 0x1f); - addrange(cv, 0x7f, 0x9f); - break; - case CC_DIGIT: - cv = getcvec(v, 0, 1, 0); - if (cv) - addrange(cv, (chr) '0', (chr) '9'); - break; - case CC_PUNCT: - cv = getcvec(v, UCHAR_MAX, 0, 0); - if (cv) - { - for (i = 0; i <= UCHAR_MAX; i++) - { - if (wx_ispunct((chr) i)) - addchr(cv, (chr) i); - } - } - break; - case CC_XDIGIT: - cv = getcvec(v, 0, 3, 0); - if (cv) - { - addrange(cv, '0', '9'); - addrange(cv, 'a', 'f'); - addrange(cv, 'A', 'F'); - } - break; - case CC_SPACE: - cv = getcvec(v, UCHAR_MAX, 0, 0); - if (cv) - { - for (i = 0; i <= UCHAR_MAX; i++) - { - if (wx_isspace((chr) i)) - addchr(cv, (chr) i); - } - } - break; - case CC_LOWER: - cv = getcvec(v, UCHAR_MAX, 0, 0); - if (cv) - { - for (i = 0; i <= UCHAR_MAX; i++) - { - if (wx_islower((chr) i)) - addchr(cv, (chr) i); - } - } - break; - case CC_UPPER: - cv = getcvec(v, UCHAR_MAX, 0, 0); - if (cv) - { - for (i = 0; i <= UCHAR_MAX; i++) - { - if (wx_isupper((chr) i)) - addchr(cv, (chr) i); - } - } - break; - case CC_GRAPH: - cv = getcvec(v, UCHAR_MAX, 0, 0); - if (cv) - { - for (i = 0; i <= UCHAR_MAX; i++) - { - if (wx_isgraph((chr) i)) - addchr(cv, (chr) i); - } - } - break; - } - if (cv == NULL) - ERR(REG_ESPACE); - return cv; -} - -/* - * allcases - supply cvec for all case counterparts of a chr (including itself) - * - * This is a shortcut, preferably an efficient one, for simple characters; - * messy cases are done via range(). - */ -static struct cvec * -allcases(struct vars * v, /* context */ - chr pc) /* character to get case equivs of */ -{ - struct cvec *cv; - chr c = (chr) pc; - chr lc, - uc; - - lc = wx_tolower((chr) c); - uc = wx_toupper((chr) c); - - cv = getcvec(v, 2, 0, 0); - addchr(cv, lc); - if (lc != uc) - addchr(cv, uc); - return cv; -} - -/* - * cmp - chr-substring compare - * - * Backrefs need this. It should preferably be efficient. - * Note that it does not need to report anything except equal/unequal. - * Note also that the length is exact, and the comparison should not - * stop at embedded NULs! - */ -static int /* 0 for equal, nonzero for unequal */ -cmp(const chr *x, const chr *y, /* strings to compare */ - size_t len) /* exact length of comparison */ -{ - return memcmp(VS(x), VS(y), len * sizeof(chr)); -} - -/* - * casecmp - case-independent chr-substring compare - * - * REG_ICASE backrefs need this. It should preferably be efficient. - * Note that it does not need to report anything except equal/unequal. - * Note also that the length is exact, and the comparison should not - * stop at embedded NULs! - */ -static int /* 0 for equal, nonzero for unequal */ -casecmp(const chr *x, const chr *y, /* strings to compare */ - size_t len) /* exact length of comparison */ -{ - for (; len > 0; len--, x++, y++) - { - if ((*x != *y) && (wx_tolower(*x) != wx_tolower(*y))) - return 1; - } - return 0; -} diff --git a/src/regex/regc_nfa.c b/src/regex/regc_nfa.c deleted file mode 100644 index cc9f6ea2f9..0000000000 --- a/src/regex/regc_nfa.c +++ /dev/null @@ -1,1559 +0,0 @@ -/* - * NFA utilities. - * This file is #included by regcomp.c. - * - * Copyright (c) 1998, 1999 Henry Spencer. All rights reserved. - * - * Development of this software was funded, in part, by Cray Research Inc., - * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics - * Corporation, none of whom are responsible for the results. The author - * thanks all of them. - * - * Redistribution and use in source and binary forms -- with or without - * modification -- are permitted for any purpose, provided that - * redistributions in source form retain this entire copyright notice and - * indicate the origin and nature of any modifications. - * - * I'd appreciate being given credit for this package in the documentation - * of software which uses it, but that is not a requirement. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Header$ - * - * - * One or two things that technically ought to be in here - * are actually in color.c, thanks to some incestuous relationships in - * the color chains. - */ - -#define NISERR() VISERR(nfa->v) -#define NERR(e) VERR(nfa->v, (e)) - - -/* - * newnfa - set up an NFA - */ -static struct nfa * /* the NFA, or NULL */ -newnfa(struct vars * v, - struct colormap * cm, - struct nfa * parent) /* NULL if primary NFA */ -{ - struct nfa *nfa; - - nfa = (struct nfa *) MALLOC(sizeof(struct nfa)); - if (nfa == NULL) - return NULL; - - nfa->states = NULL; - nfa->slast = NULL; - nfa->free = NULL; - nfa->nstates = 0; - nfa->cm = cm; - nfa->v = v; - nfa->bos[0] = nfa->bos[1] = COLORLESS; - nfa->eos[0] = nfa->eos[1] = COLORLESS; - nfa->post = newfstate(nfa, '@'); /* number 0 */ - nfa->pre = newfstate(nfa, '>'); /* number 1 */ - nfa->parent = parent; - - nfa->init = newstate(nfa); /* may become invalid later */ - nfa->final = newstate(nfa); - if (ISERR()) - { - freenfa(nfa); - return NULL; - } - rainbow(nfa, nfa->cm, PLAIN, COLORLESS, nfa->pre, nfa->init); - newarc(nfa, '^', 1, nfa->pre, nfa->init); - newarc(nfa, '^', 0, nfa->pre, nfa->init); - rainbow(nfa, nfa->cm, PLAIN, COLORLESS, nfa->final, nfa->post); - newarc(nfa, '$', 1, nfa->final, nfa->post); - newarc(nfa, '$', 0, nfa->final, nfa->post); - - if (ISERR()) - { - freenfa(nfa); - return NULL; - } - return nfa; -} - -/* - * freenfa - free an entire NFA - */ -static void -freenfa(struct nfa * nfa) -{ - struct state *s; - - while ((s = nfa->states) != NULL) - { - s->nins = s->nouts = 0; /* don't worry about arcs */ - freestate(nfa, s); - } - while ((s = nfa->free) != NULL) - { - nfa->free = s->next; - destroystate(nfa, s); - } - - nfa->slast = NULL; - nfa->nstates = -1; - nfa->pre = NULL; - nfa->post = NULL; - FREE(nfa); -} - -/* - * newstate - allocate an NFA state, with zero flag value - */ -static struct state * /* NULL on error */ -newstate(struct nfa * nfa) -{ - struct state *s; - - if (nfa->free != NULL) - { - s = nfa->free; - nfa->free = s->next; - } - else - { - s = (struct state *) MALLOC(sizeof(struct state)); - if (s == NULL) - { - NERR(REG_ESPACE); - return NULL; - } - s->oas.next = NULL; - s->free = NULL; - s->noas = 0; - } - - assert(nfa->nstates >= 0); - s->no = nfa->nstates++; - s->flag = 0; - if (nfa->states == NULL) - nfa->states = s; - s->nins = 0; - s->ins = NULL; - s->nouts = 0; - s->outs = NULL; - s->tmp = NULL; - s->next = NULL; - if (nfa->slast != NULL) - { - assert(nfa->slast->next == NULL); - nfa->slast->next = s; - } - s->prev = nfa->slast; - nfa->slast = s; - return s; -} - -/* - * newfstate - allocate an NFA state with a specified flag value - */ -static struct state * /* NULL on error */ -newfstate(struct nfa * nfa, int flag) -{ - struct state *s; - - s = newstate(nfa); - if (s != NULL) - s->flag = (char) flag; - return s; -} - -/* - * dropstate - delete a state's inarcs and outarcs and free it - */ -static void -dropstate(struct nfa * nfa, - struct state * s) -{ - struct arc *a; - - while ((a = s->ins) != NULL) - freearc(nfa, a); - while ((a = s->outs) != NULL) - freearc(nfa, a); - freestate(nfa, s); -} - -/* - * freestate - free a state, which has no in-arcs or out-arcs - */ -static void -freestate(struct nfa * nfa, - struct state * s) -{ - assert(s != NULL); - assert(s->nins == 0 && s->nouts == 0); - - s->no = FREESTATE; - s->flag = 0; - if (s->next != NULL) - s->next->prev = s->prev; - else - { - assert(s == nfa->slast); - nfa->slast = s->prev; - } - if (s->prev != NULL) - s->prev->next = s->next; - else - { - assert(s == nfa->states); - nfa->states = s->next; - } - s->prev = NULL; - s->next = nfa->free; /* don't delete it, put it on the free - * list */ - nfa->free = s; -} - -/* - * destroystate - really get rid of an already-freed state - */ -static void -destroystate(struct nfa * nfa, - struct state * s) -{ - struct arcbatch *ab; - struct arcbatch *abnext; - - assert(s->no == FREESTATE); - for (ab = s->oas.next; ab != NULL; ab = abnext) - { - abnext = ab->next; - FREE(ab); - } - s->ins = NULL; - s->outs = NULL; - s->next = NULL; - FREE(s); -} - -/* - * newarc - set up a new arc within an NFA - */ -static void -newarc(struct nfa * nfa, - int t, - pcolor co, - struct state * from, - struct state * to) -{ - struct arc *a; - - assert(from != NULL && to != NULL); - - /* check for duplicates */ - for (a = from->outs; a != NULL; a = a->outchain) - if (a->to == to && a->co == co && a->type == t) - return; - - a = allocarc(nfa, from); - if (NISERR()) - return; - assert(a != NULL); - - a->type = t; - a->co = (color) co; - a->to = to; - a->from = from; - - /* - * Put the new arc on the beginning, not the end, of the chains. Not - * only is this easier, it has the very useful side effect that - * deleting the most-recently-added arc is the cheapest case rather - * than the most expensive one. - */ - a->inchain = to->ins; - to->ins = a; - a->outchain = from->outs; - from->outs = a; - - from->nouts++; - to->nins++; - - if (COLORED(a) && nfa->parent == NULL) - colorchain(nfa->cm, a); - - return; -} - -/* - * allocarc - allocate a new out-arc within a state - */ -static struct arc * /* NULL for failure */ -allocarc(struct nfa * nfa, - struct state * s) -{ - struct arc *a; - struct arcbatch *new; - int i; - - /* shortcut */ - if (s->free == NULL && s->noas < ABSIZE) - { - a = &s->oas.a[s->noas]; - s->noas++; - return a; - } - - /* if none at hand, get more */ - if (s->free == NULL) - { - new = (struct arcbatch *) MALLOC(sizeof(struct arcbatch)); - if (new == NULL) - { - NERR(REG_ESPACE); - return NULL; - } - new->next = s->oas.next; - s->oas.next = new; - - for (i = 0; i < ABSIZE; i++) - { - new->a[i].type = 0; - new->a[i].freechain = &new->a[i + 1]; - } - new->a[ABSIZE - 1].freechain = NULL; - s->free = &new->a[0]; - } - assert(s->free != NULL); - - a = s->free; - s->free = a->freechain; - return a; -} - -/* - * freearc - free an arc - */ -static void -freearc(struct nfa * nfa, - struct arc * victim) -{ - struct state *from = victim->from; - struct state *to = victim->to; - struct arc *a; - - assert(victim->type != 0); - - /* take it off color chain if necessary */ - if (COLORED(victim) && nfa->parent == NULL) - uncolorchain(nfa->cm, victim); - - /* take it off source's out-chain */ - assert(from != NULL); - assert(from->outs != NULL); - a = from->outs; - if (a == victim) /* simple case: first in chain */ - from->outs = victim->outchain; - else - { - for (; a != NULL && a->outchain != victim; a = a->outchain) - continue; - assert(a != NULL); - a->outchain = victim->outchain; - } - from->nouts--; - - /* take it off target's in-chain */ - assert(to != NULL); - assert(to->ins != NULL); - a = to->ins; - if (a == victim) /* simple case: first in chain */ - to->ins = victim->inchain; - else - { - for (; a != NULL && a->inchain != victim; a = a->inchain) - continue; - assert(a != NULL); - a->inchain = victim->inchain; - } - to->nins--; - - /* clean up and place on free list */ - victim->type = 0; - victim->from = NULL; /* precautions... */ - victim->to = NULL; - victim->inchain = NULL; - victim->outchain = NULL; - victim->freechain = from->free; - from->free = victim; -} - -/* - * findarc - find arc, if any, from given source with given type and color - * If there is more than one such arc, the result is random. - */ -static struct arc * -findarc(struct state * s, - int type, - pcolor co) -{ - struct arc *a; - - for (a = s->outs; a != NULL; a = a->outchain) - if (a->type == type && a->co == co) - return a; - return NULL; -} - -/* - * cparc - allocate a new arc within an NFA, copying details from old one - */ -static void -cparc(struct nfa * nfa, - struct arc * oa, - struct state * from, - struct state * to) -{ - newarc(nfa, oa->type, oa->co, from, to); -} - -/* - * moveins - move all in arcs of a state to another state - * - * You might think this could be done better by just updating the - * existing arcs, and you would be right if it weren't for the desire - * for duplicate suppression, which makes it easier to just make new - * ones to exploit the suppression built into newarc. - */ -static void -moveins(struct nfa * nfa, - struct state * old, - struct state * new) -{ - struct arc *a; - - assert(old != new); - - while ((a = old->ins) != NULL) - { - cparc(nfa, a, a->from, new); - freearc(nfa, a); - } - assert(old->nins == 0); - assert(old->ins == NULL); -} - -/* - * copyins - copy all in arcs of a state to another state - */ -static void -copyins(struct nfa * nfa, - struct state * old, - struct state * new) -{ - struct arc *a; - - assert(old != new); - - for (a = old->ins; a != NULL; a = a->inchain) - cparc(nfa, a, a->from, new); -} - -/* - * moveouts - move all out arcs of a state to another state - */ -static void -moveouts(struct nfa * nfa, - struct state * old, - struct state * new) -{ - struct arc *a; - - assert(old != new); - - while ((a = old->outs) != NULL) - { - cparc(nfa, a, new, a->to); - freearc(nfa, a); - } -} - -/* - * copyouts - copy all out arcs of a state to another state - */ -static void -copyouts(struct nfa * nfa, - struct state * old, - struct state * new) -{ - struct arc *a; - - assert(old != new); - - for (a = old->outs; a != NULL; a = a->outchain) - cparc(nfa, a, new, a->to); -} - -/* - * cloneouts - copy out arcs of a state to another state pair, modifying type - */ -static void -cloneouts(struct nfa * nfa, - struct state * old, - struct state * from, - struct state * to, - int type) -{ - struct arc *a; - - assert(old != from); - - for (a = old->outs; a != NULL; a = a->outchain) - newarc(nfa, type, a->co, from, to); -} - -/* - * delsub - delete a sub-NFA, updating subre pointers if necessary - * - * This uses a recursive traversal of the sub-NFA, marking already-seen - * states using their tmp pointer. - */ -static void -delsub(struct nfa * nfa, - struct state * lp, /* the sub-NFA goes from here... */ - struct state * rp) /* ...to here, *not* inclusive */ -{ - assert(lp != rp); - - rp->tmp = rp; /* mark end */ - - deltraverse(nfa, lp, lp); - assert(lp->nouts == 0 && rp->nins == 0); /* did the job */ - assert(lp->no != FREESTATE && rp->no != FREESTATE); /* no more */ - - rp->tmp = NULL; /* unmark end */ - lp->tmp = NULL; /* and begin, marked by deltraverse */ -} - -/* - * deltraverse - the recursive heart of delsub - * This routine's basic job is to destroy all out-arcs of the state. - */ -static void -deltraverse(struct nfa * nfa, - struct state * leftend, - struct state * s) -{ - struct arc *a; - struct state *to; - - if (s->nouts == 0) - return; /* nothing to do */ - if (s->tmp != NULL) - return; /* already in progress */ - - s->tmp = s; /* mark as in progress */ - - while ((a = s->outs) != NULL) - { - to = a->to; - deltraverse(nfa, leftend, to); - assert(to->nouts == 0 || to->tmp != NULL); - freearc(nfa, a); - if (to->nins == 0 && to->tmp == NULL) - { - assert(to->nouts == 0); - freestate(nfa, to); - } - } - - assert(s->no != FREESTATE); /* we're still here */ - assert(s == leftend || s->nins != 0); /* and still reachable */ - assert(s->nouts == 0); /* but have no outarcs */ - - s->tmp = NULL; /* we're done here */ -} - -/* - * dupnfa - duplicate sub-NFA - * - * Another recursive traversal, this time using tmp to point to duplicates - * as well as mark already-seen states. (You knew there was a reason why - * it's a state pointer, didn't you? :-)) - */ -static void -dupnfa(struct nfa * nfa, - struct state * start, /* duplicate of subNFA starting here */ - struct state * stop, /* and stopping here */ - struct state * from, /* stringing duplicate from here */ - struct state * to) /* to here */ -{ - if (start == stop) - { - newarc(nfa, EMPTY, 0, from, to); - return; - } - - stop->tmp = to; - duptraverse(nfa, start, from); - /* done, except for clearing out the tmp pointers */ - - stop->tmp = NULL; - cleartraverse(nfa, start); -} - -/* - * duptraverse - recursive heart of dupnfa - */ -static void -duptraverse(struct nfa * nfa, - struct state * s, - struct state * stmp) /* s's duplicate, or NULL */ -{ - struct arc *a; - - if (s->tmp != NULL) - return; /* already done */ - - s->tmp = (stmp == NULL) ? newstate(nfa) : stmp; - if (s->tmp == NULL) - { - assert(NISERR()); - return; - } - - for (a = s->outs; a != NULL && !NISERR(); a = a->outchain) - { - duptraverse(nfa, a->to, (struct state *) NULL); - assert(a->to->tmp != NULL); - cparc(nfa, a, s->tmp, a->to->tmp); - } -} - -/* - * cleartraverse - recursive cleanup for algorithms that leave tmp ptrs set - */ -static void -cleartraverse(struct nfa * nfa, - struct state * s) -{ - struct arc *a; - - if (s->tmp == NULL) - return; - s->tmp = NULL; - - for (a = s->outs; a != NULL; a = a->outchain) - cleartraverse(nfa, a->to); -} - -/* - * specialcolors - fill in special colors for an NFA - */ -static void -specialcolors(struct nfa * nfa) -{ - /* false colors for BOS, BOL, EOS, EOL */ - if (nfa->parent == NULL) - { - nfa->bos[0] = pseudocolor(nfa->cm); - nfa->bos[1] = pseudocolor(nfa->cm); - nfa->eos[0] = pseudocolor(nfa->cm); - nfa->eos[1] = pseudocolor(nfa->cm); - } - else - { - assert(nfa->parent->bos[0] != COLORLESS); - nfa->bos[0] = nfa->parent->bos[0]; - assert(nfa->parent->bos[1] != COLORLESS); - nfa->bos[1] = nfa->parent->bos[1]; - assert(nfa->parent->eos[0] != COLORLESS); - nfa->eos[0] = nfa->parent->eos[0]; - assert(nfa->parent->eos[1] != COLORLESS); - nfa->eos[1] = nfa->parent->eos[1]; - } -} - -/* - * optimize - optimize an NFA - */ -static long /* re_info bits */ -optimize(struct nfa * nfa, - FILE *f) /* for debug output; NULL none */ -{ -#ifdef REG_DEBUG - int verbose = (f != NULL) ? 1 : 0; - - if (verbose) - fprintf(f, "\ninitial cleanup:\n"); -#endif - cleanup(nfa); /* may simplify situation */ -#ifdef REG_DEBUG - if (verbose) - dumpnfa(nfa, f); - if (verbose) - fprintf(f, "\nempties:\n"); -#endif - fixempties(nfa, f); /* get rid of EMPTY arcs */ -#ifdef REG_DEBUG - if (verbose) - fprintf(f, "\nconstraints:\n"); -#endif - pullback(nfa, f); /* pull back constraints backward */ - pushfwd(nfa, f); /* push fwd constraints forward */ -#ifdef REG_DEBUG - if (verbose) - fprintf(f, "\nfinal cleanup:\n"); -#endif - cleanup(nfa); /* final tidying */ - return analyze(nfa); /* and analysis */ -} - -/* - * pullback - pull back constraints backward to (with luck) eliminate them - */ -static void -pullback(struct nfa * nfa, - FILE *f) /* for debug output; NULL none */ -{ - struct state *s; - struct state *nexts; - struct arc *a; - struct arc *nexta; - int progress; - - /* find and pull until there are no more */ - do - { - progress = 0; - for (s = nfa->states; s != NULL && !NISERR(); s = nexts) - { - nexts = s->next; - for (a = s->outs; a != NULL && !NISERR(); a = nexta) - { - nexta = a->outchain; - if (a->type == '^' || a->type == BEHIND) - if (pull(nfa, a)) - progress = 1; - assert(nexta == NULL || s->no != FREESTATE); - } - } - if (progress && f != NULL) - dumpnfa(nfa, f); - } while (progress && !NISERR()); - if (NISERR()) - return; - - for (a = nfa->pre->outs; a != NULL; a = nexta) - { - nexta = a->outchain; - if (a->type == '^') - { - assert(a->co == 0 || a->co == 1); - newarc(nfa, PLAIN, nfa->bos[a->co], a->from, a->to); - freearc(nfa, a); - } - } -} - -/* - * pull - pull a back constraint backward past its source state - * A significant property of this function is that it deletes at most - * one state -- the constraint's from state -- and only if the constraint - * was that state's last outarc. - */ -static int /* 0 couldn't, 1 could */ -pull(struct nfa * nfa, - struct arc * con) -{ - struct state *from = con->from; - struct state *to = con->to; - struct arc *a; - struct arc *nexta; - struct state *s; - - if (from == to) - { /* circular constraint is pointless */ - freearc(nfa, con); - return 1; - } - if (from->flag) /* can't pull back beyond start */ - return 0; - if (from->nins == 0) - { /* unreachable */ - freearc(nfa, con); - return 1; - } - - /* first, clone from state if necessary to avoid other outarcs */ - if (from->nouts > 1) - { - s = newstate(nfa); - if (NISERR()) - return 0; - assert(to != from); /* con is not an inarc */ - copyins(nfa, from, s); /* duplicate inarcs */ - cparc(nfa, con, s, to); /* move constraint arc */ - freearc(nfa, con); - from = s; - con = from->outs; - } - assert(from->nouts == 1); - - /* propagate the constraint into the from state's inarcs */ - for (a = from->ins; a != NULL; a = nexta) - { - nexta = a->inchain; - switch (combine(con, a)) - { - case INCOMPATIBLE: /* destroy the arc */ - freearc(nfa, a); - break; - case SATISFIED: /* no action needed */ - break; - case COMPATIBLE: /* swap the two arcs, more or less */ - s = newstate(nfa); - if (NISERR()) - return 0; - cparc(nfa, a, s, to); /* anticipate move */ - cparc(nfa, con, a->from, s); - if (NISERR()) - return 0; - freearc(nfa, a); - break; - default: - assert(NOTREACHED); - break; - } - } - - /* remaining inarcs, if any, incorporate the constraint */ - moveins(nfa, from, to); - dropstate(nfa, from); /* will free the constraint */ - return 1; -} - -/* - * pushfwd - push forward constraints forward to (with luck) eliminate them - */ -static void -pushfwd(struct nfa * nfa, - FILE *f) /* for debug output; NULL none */ -{ - struct state *s; - struct state *nexts; - struct arc *a; - struct arc *nexta; - int progress; - - /* find and push until there are no more */ - do - { - progress = 0; - for (s = nfa->states; s != NULL && !NISERR(); s = nexts) - { - nexts = s->next; - for (a = s->ins; a != NULL && !NISERR(); a = nexta) - { - nexta = a->inchain; - if (a->type == '$' || a->type == AHEAD) - if (push(nfa, a)) - progress = 1; - assert(nexta == NULL || s->no != FREESTATE); - } - } - if (progress && f != NULL) - dumpnfa(nfa, f); - } while (progress && !NISERR()); - if (NISERR()) - return; - - for (a = nfa->post->ins; a != NULL; a = nexta) - { - nexta = a->inchain; - if (a->type == '$') - { - assert(a->co == 0 || a->co == 1); - newarc(nfa, PLAIN, nfa->eos[a->co], a->from, a->to); - freearc(nfa, a); - } - } -} - -/* - * push - push a forward constraint forward past its destination state - * A significant property of this function is that it deletes at most - * one state -- the constraint's to state -- and only if the constraint - * was that state's last inarc. - */ -static int /* 0 couldn't, 1 could */ -push(struct nfa * nfa, - struct arc * con) -{ - struct state *from = con->from; - struct state *to = con->to; - struct arc *a; - struct arc *nexta; - struct state *s; - - if (to == from) - { /* circular constraint is pointless */ - freearc(nfa, con); - return 1; - } - if (to->flag) /* can't push forward beyond end */ - return 0; - if (to->nouts == 0) - { /* dead end */ - freearc(nfa, con); - return 1; - } - - /* first, clone to state if necessary to avoid other inarcs */ - if (to->nins > 1) - { - s = newstate(nfa); - if (NISERR()) - return 0; - copyouts(nfa, to, s); /* duplicate outarcs */ - cparc(nfa, con, from, s); /* move constraint */ - freearc(nfa, con); - to = s; - con = to->ins; - } - assert(to->nins == 1); - - /* propagate the constraint into the to state's outarcs */ - for (a = to->outs; a != NULL; a = nexta) - { - nexta = a->outchain; - switch (combine(con, a)) - { - case INCOMPATIBLE: /* destroy the arc */ - freearc(nfa, a); - break; - case SATISFIED: /* no action needed */ - break; - case COMPATIBLE: /* swap the two arcs, more or less */ - s = newstate(nfa); - if (NISERR()) - return 0; - cparc(nfa, con, s, a->to); /* anticipate move */ - cparc(nfa, a, from, s); - if (NISERR()) - return 0; - freearc(nfa, a); - break; - default: - assert(NOTREACHED); - break; - } - } - - /* remaining outarcs, if any, incorporate the constraint */ - moveouts(nfa, to, from); - dropstate(nfa, to); /* will free the constraint */ - return 1; -} - -/* - * combine - constraint lands on an arc, what happens? - * - * #def INCOMPATIBLE 1 // destroys arc - * #def SATISFIED 2 // constraint satisfied - * #def COMPATIBLE 3 // compatible but not satisfied yet - */ -static int -combine(struct arc * con, - struct arc * a) -{ -#define CA(ct,at) (((ct)<type, a->type)) - { - case CA('^', PLAIN): /* newlines are handled separately */ - case CA('$', PLAIN): - return INCOMPATIBLE; - break; - case CA(AHEAD, PLAIN): /* color constraints meet colors */ - case CA(BEHIND, PLAIN): - if (con->co == a->co) - return SATISFIED; - return INCOMPATIBLE; - break; - case CA('^', '^'): /* collision, similar constraints */ - case CA('$', '$'): - case CA(AHEAD, AHEAD): - case CA(BEHIND, BEHIND): - if (con->co == a->co) /* true duplication */ - return SATISFIED; - return INCOMPATIBLE; - break; - case CA('^', BEHIND): /* collision, dissimilar constraints */ - case CA(BEHIND, '^'): - case CA('$', AHEAD): - case CA(AHEAD, '$'): - return INCOMPATIBLE; - break; - case CA('^', '$'): /* constraints passing each other */ - case CA('^', AHEAD): - case CA(BEHIND, '$'): - case CA(BEHIND, AHEAD): - case CA('$', '^'): - case CA('$', BEHIND): - case CA(AHEAD, '^'): - case CA(AHEAD, BEHIND): - case CA('^', LACON): - case CA(BEHIND, LACON): - case CA('$', LACON): - case CA(AHEAD, LACON): - return COMPATIBLE; - break; - } - assert(NOTREACHED); - return INCOMPATIBLE; /* for benefit of blind compilers */ -} - -/* - * fixempties - get rid of EMPTY arcs - */ -static void -fixempties(struct nfa * nfa, - FILE *f) /* for debug output; NULL none */ -{ - struct state *s; - struct state *nexts; - struct arc *a; - struct arc *nexta; - int progress; - - /* find and eliminate empties until there are no more */ - do - { - progress = 0; - for (s = nfa->states; s != NULL && !NISERR(); s = nexts) - { - nexts = s->next; - for (a = s->outs; a != NULL && !NISERR(); a = nexta) - { - nexta = a->outchain; - if (a->type == EMPTY && unempty(nfa, a)) - progress = 1; - assert(nexta == NULL || s->no != FREESTATE); - } - } - if (progress && f != NULL) - dumpnfa(nfa, f); - } while (progress && !NISERR()); -} - -/* - * unempty - optimize out an EMPTY arc, if possible - * - * Actually, as it stands this function always succeeds, but the return - * value is kept with an eye on possible future changes. - */ -static int /* 0 couldn't, 1 could */ -unempty(struct nfa * nfa, - struct arc * a) -{ - struct state *from = a->from; - struct state *to = a->to; - int usefrom; /* work on from, as opposed to to? */ - - assert(a->type == EMPTY); - assert(from != nfa->pre && to != nfa->post); - - if (from == to) - { /* vacuous loop */ - freearc(nfa, a); - return 1; - } - - /* decide which end to work on */ - usefrom = 1; /* default: attack from */ - if (from->nouts > to->nins) - usefrom = 0; - else if (from->nouts == to->nins) - { - /* decide on secondary issue: move/copy fewest arcs */ - if (from->nins > to->nouts) - usefrom = 0; - } - - freearc(nfa, a); - if (usefrom) - { - if (from->nouts == 0) - { - /* was the state's only outarc */ - moveins(nfa, from, to); - freestate(nfa, from); - } - else - copyins(nfa, from, to); - } - else - { - if (to->nins == 0) - { - /* was the state's only inarc */ - moveouts(nfa, to, from); - freestate(nfa, to); - } - else - copyouts(nfa, to, from); - } - - return 1; -} - -/* - * cleanup - clean up NFA after optimizations - */ -static void -cleanup(struct nfa * nfa) -{ - struct state *s; - struct state *nexts; - int n; - - /* clear out unreachable or dead-end states */ - /* use pre to mark reachable, then post to mark can-reach-post */ - markreachable(nfa, nfa->pre, (struct state *) NULL, nfa->pre); - markcanreach(nfa, nfa->post, nfa->pre, nfa->post); - for (s = nfa->states; s != NULL; s = nexts) - { - nexts = s->next; - if (s->tmp != nfa->post && !s->flag) - dropstate(nfa, s); - } - assert(nfa->post->nins == 0 || nfa->post->tmp == nfa->post); - cleartraverse(nfa, nfa->pre); - assert(nfa->post->nins == 0 || nfa->post->tmp == NULL); - /* the nins==0 (final unreachable) case will be caught later */ - - /* renumber surviving states */ - n = 0; - for (s = nfa->states; s != NULL; s = s->next) - s->no = n++; - nfa->nstates = n; -} - -/* - * markreachable - recursive marking of reachable states - */ -static void -markreachable(struct nfa * nfa, - struct state * s, - struct state * okay, /* consider only states with this - * mark */ - struct state * mark) /* the value to mark with */ -{ - struct arc *a; - - if (s->tmp != okay) - return; - s->tmp = mark; - - for (a = s->outs; a != NULL; a = a->outchain) - markreachable(nfa, a->to, okay, mark); -} - -/* - * markcanreach - recursive marking of states which can reach here - */ -static void -markcanreach(struct nfa * nfa, - struct state * s, - struct state * okay, /* consider only states with this - * mark */ - struct state * mark) /* the value to mark with */ -{ - struct arc *a; - - if (s->tmp != okay) - return; - s->tmp = mark; - - for (a = s->ins; a != NULL; a = a->inchain) - markcanreach(nfa, a->from, okay, mark); -} - -/* - * analyze - ascertain potentially-useful facts about an optimized NFA - */ -static long /* re_info bits to be ORed in */ -analyze(struct nfa * nfa) -{ - struct arc *a; - struct arc *aa; - - if (nfa->pre->outs == NULL) - return REG_UIMPOSSIBLE; - for (a = nfa->pre->outs; a != NULL; a = a->outchain) - for (aa = a->to->outs; aa != NULL; aa = aa->outchain) - if (aa->to == nfa->post) - return REG_UEMPTYMATCH; - return 0; -} - -/* - * compact - compact an NFA - */ -static void -compact(struct nfa * nfa, - struct cnfa * cnfa) -{ - struct state *s; - struct arc *a; - size_t nstates; - size_t narcs; - struct carc *ca; - struct carc *first; - - assert(!NISERR()); - - nstates = 0; - narcs = 0; - for (s = nfa->states; s != NULL; s = s->next) - { - nstates++; - narcs += 1 + s->nouts + 1; - /* 1 as a fake for flags, nouts for arcs, 1 as endmarker */ - } - - cnfa->states = (struct carc **) MALLOC(nstates * sizeof(struct carc *)); - cnfa->arcs = (struct carc *) MALLOC(narcs * sizeof(struct carc)); - if (cnfa->states == NULL || cnfa->arcs == NULL) - { - if (cnfa->states != NULL) - FREE(cnfa->states); - if (cnfa->arcs != NULL) - FREE(cnfa->arcs); - NERR(REG_ESPACE); - return; - } - cnfa->nstates = nstates; - cnfa->pre = nfa->pre->no; - cnfa->post = nfa->post->no; - cnfa->bos[0] = nfa->bos[0]; - cnfa->bos[1] = nfa->bos[1]; - cnfa->eos[0] = nfa->eos[0]; - cnfa->eos[1] = nfa->eos[1]; - cnfa->ncolors = maxcolor(nfa->cm) + 1; - cnfa->flags = 0; - - ca = cnfa->arcs; - for (s = nfa->states; s != NULL; s = s->next) - { - assert((size_t) s->no < nstates); - cnfa->states[s->no] = ca; - ca->co = 0; /* clear and skip flags "arc" */ - ca++; - first = ca; - for (a = s->outs; a != NULL; a = a->outchain) - switch (a->type) - { - case PLAIN: - ca->co = a->co; - ca->to = a->to->no; - ca++; - break; - case LACON: - assert(s->no != cnfa->pre); - ca->co = (color) (cnfa->ncolors + a->co); - ca->to = a->to->no; - ca++; - cnfa->flags |= HASLACONS; - break; - default: - assert(NOTREACHED); - break; - } - carcsort(first, ca - 1); - ca->co = COLORLESS; - ca->to = 0; - ca++; - } - assert(ca == &cnfa->arcs[narcs]); - assert(cnfa->nstates != 0); - - /* mark no-progress states */ - for (a = nfa->pre->outs; a != NULL; a = a->outchain) - cnfa->states[a->to->no]->co = 1; - cnfa->states[nfa->pre->no]->co = 1; -} - -/* - * carcsort - sort compacted-NFA arcs by color - * - * Really dumb algorithm, but if the list is long enough for that to matter, - * you're in real trouble anyway. - */ -static void -carcsort(struct carc * first, - struct carc * last) -{ - struct carc *p; - struct carc *q; - struct carc tmp; - - if (last - first <= 1) - return; - - for (p = first; p <= last; p++) - for (q = p; q <= last; q++) - if (p->co > q->co || - (p->co == q->co && p->to > q->to)) - { - assert(p != q); - tmp = *p; - *p = *q; - *q = tmp; - } -} - -/* - * freecnfa - free a compacted NFA - */ -static void -freecnfa(struct cnfa * cnfa) -{ - assert(cnfa->nstates != 0); /* not empty already */ - cnfa->nstates = 0; - FREE(cnfa->states); - FREE(cnfa->arcs); -} - -/* - * dumpnfa - dump an NFA in human-readable form - */ -static void -dumpnfa(struct nfa * nfa, - FILE *f) -{ -#ifdef REG_DEBUG - struct state *s; - - fprintf(f, "pre %d, post %d", nfa->pre->no, nfa->post->no); - if (nfa->bos[0] != COLORLESS) - fprintf(f, ", bos [%ld]", (long) nfa->bos[0]); - if (nfa->bos[1] != COLORLESS) - fprintf(f, ", bol [%ld]", (long) nfa->bos[1]); - if (nfa->eos[0] != COLORLESS) - fprintf(f, ", eos [%ld]", (long) nfa->eos[0]); - if (nfa->eos[1] != COLORLESS) - fprintf(f, ", eol [%ld]", (long) nfa->eos[1]); - fprintf(f, "\n"); - for (s = nfa->states; s != NULL; s = s->next) - dumpstate(s, f); - if (nfa->parent == NULL) - dumpcolors(nfa->cm, f); - fflush(f); -#endif -} - -#ifdef REG_DEBUG /* subordinates of dumpnfa */ - -/* - * dumpstate - dump an NFA state in human-readable form - */ -static void -dumpstate(struct state * s, - FILE *f) -{ - struct arc *a; - - fprintf(f, "%d%s%c", s->no, (s->tmp != NULL) ? "T" : "", - (s->flag) ? s->flag : '.'); - if (s->prev != NULL && s->prev->next != s) - fprintf(f, "\tstate chain bad\n"); - if (s->nouts == 0) - fprintf(f, "\tno out arcs\n"); - else - dumparcs(s, f); - fflush(f); - for (a = s->ins; a != NULL; a = a->inchain) - { - if (a->to != s) - fprintf(f, "\tlink from %d to %d on %d's in-chain\n", - a->from->no, a->to->no, s->no); - } -} - -/* - * dumparcs - dump out-arcs in human-readable form - */ -static void -dumparcs(struct state * s, - FILE *f) -{ - int pos; - - assert(s->nouts > 0); - /* printing arcs in reverse order is usually clearer */ - pos = dumprarcs(s->outs, s, f, 1); - if (pos != 1) - fprintf(f, "\n"); -} - -/* - * dumprarcs - dump remaining outarcs, recursively, in reverse order - */ -static int /* resulting print position */ -dumprarcs(struct arc * a, - struct state * s, - FILE *f, - int pos) /* initial print position */ -{ - if (a->outchain != NULL) - pos = dumprarcs(a->outchain, s, f, pos); - dumparc(a, s, f); - if (pos == 5) - { - fprintf(f, "\n"); - pos = 1; - } - else - pos++; - return pos; -} - -/* - * dumparc - dump one outarc in readable form, including prefixing tab - */ -static void -dumparc(struct arc * a, - struct state * s, - FILE *f) -{ - struct arc *aa; - struct arcbatch *ab; - - fprintf(f, "\t"); - switch (a->type) - { - case PLAIN: - fprintf(f, "[%ld]", (long) a->co); - break; - case AHEAD: - fprintf(f, ">%ld>", (long) a->co); - break; - case BEHIND: - fprintf(f, "<%ld<", (long) a->co); - break; - case LACON: - fprintf(f, ":%ld:", (long) a->co); - break; - case '^': - case '$': - fprintf(f, "%c%d", a->type, (int) a->co); - break; - case EMPTY: - break; - default: - fprintf(f, "0x%x/0%lo", a->type, (long) a->co); - break; - } - if (a->from != s) - fprintf(f, "?%d?", a->from->no); - for (ab = &a->from->oas; ab != NULL; ab = ab->next) - { - for (aa = &ab->a[0]; aa < &ab->a[ABSIZE]; aa++) - if (aa == a) - break; /* NOTE BREAK OUT */ - if (aa < &ab->a[ABSIZE]) /* propagate break */ - break; /* NOTE BREAK OUT */ - } - if (ab == NULL) - fprintf(f, "?!?"); /* not in allocated space */ - fprintf(f, "->"); - if (a->to == NULL) - { - fprintf(f, "NULL"); - return; - } - fprintf(f, "%d", a->to->no); - for (aa = a->to->ins; aa != NULL; aa = aa->inchain) - if (aa == a) - break; /* NOTE BREAK OUT */ - if (aa == NULL) - fprintf(f, "?!?"); /* missing from in-chain */ -} -#endif /* REG_DEBUG */ - -/* - * dumpcnfa - dump a compacted NFA in human-readable form - */ -#ifdef REG_DEBUG -static void -dumpcnfa(struct cnfa * cnfa, - FILE *f) -{ - int st; - - fprintf(f, "pre %d, post %d", cnfa->pre, cnfa->post); - if (cnfa->bos[0] != COLORLESS) - fprintf(f, ", bos [%ld]", (long) cnfa->bos[0]); - if (cnfa->bos[1] != COLORLESS) - fprintf(f, ", bol [%ld]", (long) cnfa->bos[1]); - if (cnfa->eos[0] != COLORLESS) - fprintf(f, ", eos [%ld]", (long) cnfa->eos[0]); - if (cnfa->eos[1] != COLORLESS) - fprintf(f, ", eol [%ld]", (long) cnfa->eos[1]); - if (cnfa->flags & HASLACONS) - fprintf(f, ", haslacons"); - fprintf(f, "\n"); - for (st = 0; st < cnfa->nstates; st++) - dumpcstate(st, cnfa->states[st], cnfa, f); - fflush(f); -} -#endif - -#ifdef REG_DEBUG /* subordinates of dumpcnfa */ - -/* - * dumpcstate - dump a compacted-NFA state in human-readable form - */ -static void -dumpcstate(int st, - struct carc * ca, - struct cnfa * cnfa, - FILE *f) -{ - int i; - int pos; - - fprintf(f, "%d%s", st, (ca[0].co) ? ":" : "."); - pos = 1; - for (i = 1; ca[i].co != COLORLESS; i++) - { - if (ca[i].co < cnfa->ncolors) - fprintf(f, "\t[%ld]->%d", (long) ca[i].co, ca[i].to); - else - fprintf(f, "\t:%ld:->%d", (long) ca[i].co - cnfa->ncolors, - ca[i].to); - if (pos == 5) - { - fprintf(f, "\n"); - pos = 1; - } - else - pos++; - } - if (i == 1 || pos != 1) - fprintf(f, "\n"); - fflush(f); -} - -#endif /* REG_DEBUG */ diff --git a/src/regex/rege_dfa.c b/src/regex/rege_dfa.c deleted file mode 100644 index 5347b90d73..0000000000 --- a/src/regex/rege_dfa.c +++ /dev/null @@ -1,699 +0,0 @@ -/* - * DFA routines - * This file is #included by regexec.c. - * - * Copyright (c) 1998, 1999 Henry Spencer. All rights reserved. - * - * Development of this software was funded, in part, by Cray Research Inc., - * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics - * Corporation, none of whom are responsible for the results. The author - * thanks all of them. - * - * Redistribution and use in source and binary forms -- with or without - * modification -- are permitted for any purpose, provided that - * redistributions in source form retain this entire copyright notice and - * indicate the origin and nature of any modifications. - * - * I'd appreciate being given credit for this package in the documentation - * of software which uses it, but that is not a requirement. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Header$ - * - */ - -/* - * longest - longest-preferred matching engine - */ -static chr * /* endpoint, or NULL */ -longest(struct vars * v, /* used only for debug and exec flags */ - struct dfa * d, - chr *start, /* where the match should start */ - chr *stop, /* match must end at or before here */ - int *hitstopp) /* record whether hit v->stop, if non-NULL */ -{ - chr *cp; - chr *realstop = (stop == v->stop) ? stop : stop + 1; - color co; - struct sset *css; - struct sset *ss; - chr *post; - int i; - struct colormap *cm = d->cm; - - /* initialize */ - css = initialize(v, d, start); - cp = start; - if (hitstopp != NULL) - *hitstopp = 0; - - /* startup */ - FDEBUG(("+++ startup +++\n")); - if (cp == v->start) - { - co = d->cnfa->bos[(v->eflags & REG_NOTBOL) ? 0 : 1]; - FDEBUG(("color %ld\n", (long) co)); - } - else - { - co = GETCOLOR(cm, *(cp - 1)); - FDEBUG(("char %c, color %ld\n", (char) *(cp - 1), (long) co)); - } - css = miss(v, d, css, co, cp, start); - if (css == NULL) - return NULL; - css->lastseen = cp; - - /* main loop */ - if (v->eflags & REG_FTRACE) - while (cp < realstop) - { - FDEBUG(("+++ at c%d +++\n", css - d->ssets)); - co = GETCOLOR(cm, *cp); - FDEBUG(("char %c, color %ld\n", (char) *cp, (long) co)); - ss = css->outs[co]; - if (ss == NULL) - { - ss = miss(v, d, css, co, cp + 1, start); - if (ss == NULL) - break; /* NOTE BREAK OUT */ - } - cp++; - ss->lastseen = cp; - css = ss; - } - else - while (cp < realstop) - { - co = GETCOLOR(cm, *cp); - ss = css->outs[co]; - if (ss == NULL) - { - ss = miss(v, d, css, co, cp + 1, start); - if (ss == NULL) - break; /* NOTE BREAK OUT */ - } - cp++; - ss->lastseen = cp; - css = ss; - } - - /* shutdown */ - FDEBUG(("+++ shutdown at c%d +++\n", css - d->ssets)); - if (cp == v->stop && stop == v->stop) - { - if (hitstopp != NULL) - *hitstopp = 1; - co = d->cnfa->eos[(v->eflags & REG_NOTEOL) ? 0 : 1]; - FDEBUG(("color %ld\n", (long) co)); - ss = miss(v, d, css, co, cp, start); - /* special case: match ended at eol? */ - if (ss != NULL && (ss->flags & POSTSTATE)) - return cp; - else if (ss != NULL) - ss->lastseen = cp; /* to be tidy */ - } - - /* find last match, if any */ - post = d->lastpost; - for (ss = d->ssets, i = d->nssused; i > 0; ss++, i--) - if ((ss->flags & POSTSTATE) && post != ss->lastseen && - (post == NULL || post < ss->lastseen)) - post = ss->lastseen; - if (post != NULL) /* found one */ - return post - 1; - - return NULL; -} - -/* - * shortest - shortest-preferred matching engine - */ -static chr * /* endpoint, or NULL */ -shortest(struct vars * v, - struct dfa * d, - chr *start, /* where the match should start */ - chr *min, /* match must end at or after here */ - chr *max, /* match must end at or before here */ - chr **coldp, /* store coldstart pointer here, if - * nonNULL */ - int *hitstopp) /* record whether hit v->stop, if non-NULL */ -{ - chr *cp; - chr *realmin = (min == v->stop) ? min : min + 1; - chr *realmax = (max == v->stop) ? max : max + 1; - color co; - struct sset *css; - struct sset *ss; - struct colormap *cm = d->cm; - - /* initialize */ - css = initialize(v, d, start); - cp = start; - if (hitstopp != NULL) - *hitstopp = 0; - - /* startup */ - FDEBUG(("--- startup ---\n")); - if (cp == v->start) - { - co = d->cnfa->bos[(v->eflags & REG_NOTBOL) ? 0 : 1]; - FDEBUG(("color %ld\n", (long) co)); - } - else - { - co = GETCOLOR(cm, *(cp - 1)); - FDEBUG(("char %c, color %ld\n", (char) *(cp - 1), (long) co)); - } - css = miss(v, d, css, co, cp, start); - if (css == NULL) - return NULL; - css->lastseen = cp; - ss = css; - - /* main loop */ - if (v->eflags & REG_FTRACE) - while (cp < realmax) - { - FDEBUG(("--- at c%d ---\n", css - d->ssets)); - co = GETCOLOR(cm, *cp); - FDEBUG(("char %c, color %ld\n", (char) *cp, (long) co)); - ss = css->outs[co]; - if (ss == NULL) - { - ss = miss(v, d, css, co, cp + 1, start); - if (ss == NULL) - break; /* NOTE BREAK OUT */ - } - cp++; - ss->lastseen = cp; - css = ss; - if ((ss->flags & POSTSTATE) && cp >= realmin) - break; /* NOTE BREAK OUT */ - } - else - while (cp < realmax) - { - co = GETCOLOR(cm, *cp); - ss = css->outs[co]; - if (ss == NULL) - { - ss = miss(v, d, css, co, cp + 1, start); - if (ss == NULL) - break; /* NOTE BREAK OUT */ - } - cp++; - ss->lastseen = cp; - css = ss; - if ((ss->flags & POSTSTATE) && cp >= realmin) - break; /* NOTE BREAK OUT */ - } - - if (ss == NULL) - return NULL; - - if (coldp != NULL) /* report last no-progress state set, if - * any */ - *coldp = lastcold(v, d); - - if ((ss->flags & POSTSTATE) && cp > min) - { - assert(cp >= realmin); - cp--; - } - else if (cp == v->stop && max == v->stop) - { - co = d->cnfa->eos[(v->eflags & REG_NOTEOL) ? 0 : 1]; - FDEBUG(("color %ld\n", (long) co)); - ss = miss(v, d, css, co, cp, start); - /* match might have ended at eol */ - if ((ss == NULL || !(ss->flags & POSTSTATE)) && hitstopp != NULL) - *hitstopp = 1; - } - - if (ss == NULL || !(ss->flags & POSTSTATE)) - return NULL; - - return cp; -} - -/* - * lastcold - determine last point at which no progress had been made - */ -static chr * /* endpoint, or NULL */ -lastcold(struct vars * v, - struct dfa * d) -{ - struct sset *ss; - chr *nopr; - int i; - - nopr = d->lastnopr; - if (nopr == NULL) - nopr = v->start; - for (ss = d->ssets, i = d->nssused; i > 0; ss++, i--) - if ((ss->flags & NOPROGRESS) && nopr < ss->lastseen) - nopr = ss->lastseen; - return nopr; -} - -/* - * newdfa - set up a fresh DFA - */ -static struct dfa * -newdfa(struct vars * v, - struct cnfa * cnfa, - struct colormap * cm, - struct smalldfa * small) /* preallocated space, may be NULL */ -{ - struct dfa *d; - size_t nss = cnfa->nstates * 2; - int wordsper = (cnfa->nstates + UBITS - 1) / UBITS; - struct smalldfa *smallwas = small; - - assert(cnfa != NULL && cnfa->nstates != 0); - - if (nss <= FEWSTATES && cnfa->ncolors <= FEWCOLORS) - { - assert(wordsper == 1); - if (small == NULL) - { - small = (struct smalldfa *) MALLOC( - sizeof(struct smalldfa)); - if (small == NULL) - { - ERR(REG_ESPACE); - return NULL; - } - } - d = &small->dfa; - d->ssets = small->ssets; - d->statesarea = small->statesarea; - d->work = &d->statesarea[nss]; - d->outsarea = small->outsarea; - d->incarea = small->incarea; - d->cptsmalloced = 0; - d->mallocarea = (smallwas == NULL) ? (char *) small : NULL; - } - else - { - d = (struct dfa *) MALLOC(sizeof(struct dfa)); - if (d == NULL) - { - ERR(REG_ESPACE); - return NULL; - } - d->ssets = (struct sset *) MALLOC(nss * sizeof(struct sset)); - d->statesarea = (unsigned *) MALLOC((nss + WORK) * wordsper * - sizeof(unsigned)); - d->work = &d->statesarea[nss * wordsper]; - d->outsarea = (struct sset **) MALLOC(nss * cnfa->ncolors * - sizeof(struct sset *)); - d->incarea = (struct arcp *) MALLOC(nss * cnfa->ncolors * - sizeof(struct arcp)); - d->cptsmalloced = 1; - d->mallocarea = (char *) d; - if (d->ssets == NULL || d->statesarea == NULL || - d->outsarea == NULL || d->incarea == NULL) - { - freedfa(d); - ERR(REG_ESPACE); - return NULL; - } - } - - d->nssets = (v->eflags & REG_SMALL) ? 7 : nss; - d->nssused = 0; - d->nstates = cnfa->nstates; - d->ncolors = cnfa->ncolors; - d->wordsper = wordsper; - d->cnfa = cnfa; - d->cm = cm; - d->lastpost = NULL; - d->lastnopr = NULL; - d->search = d->ssets; - - /* initialization of sset fields is done as needed */ - - return d; -} - -/* - * freedfa - free a DFA - */ -static void -freedfa(struct dfa * d) -{ - if (d->cptsmalloced) - { - if (d->ssets != NULL) - FREE(d->ssets); - if (d->statesarea != NULL) - FREE(d->statesarea); - if (d->outsarea != NULL) - FREE(d->outsarea); - if (d->incarea != NULL) - FREE(d->incarea); - } - - if (d->mallocarea != NULL) - FREE(d->mallocarea); -} - -/* - * hash - construct a hash code for a bitvector - * - * There are probably better ways, but they're more expensive. - */ -static unsigned -hash(unsigned *uv, - int n) -{ - int i; - unsigned h; - - h = 0; - for (i = 0; i < n; i++) - h ^= uv[i]; - return h; -} - -/* - * initialize - hand-craft a cache entry for startup, otherwise get ready - */ -static struct sset * -initialize(struct vars * v, /* used only for debug flags */ - struct dfa * d, - chr *start) -{ - struct sset *ss; - int i; - - /* is previous one still there? */ - if (d->nssused > 0 && (d->ssets[0].flags & STARTER)) - ss = &d->ssets[0]; - else - { /* no, must (re)build it */ - ss = getvacant(v, d, start, start); - for (i = 0; i < d->wordsper; i++) - ss->states[i] = 0; - BSET(ss->states, d->cnfa->pre); - ss->hash = HASH(ss->states, d->wordsper); - assert(d->cnfa->pre != d->cnfa->post); - ss->flags = STARTER | LOCKED | NOPROGRESS; - /* lastseen dealt with below */ - } - - for (i = 0; i < d->nssused; i++) - d->ssets[i].lastseen = NULL; - ss->lastseen = start; /* maybe untrue, but harmless */ - d->lastpost = NULL; - d->lastnopr = NULL; - return ss; -} - -/* - * miss - handle a cache miss - */ -static struct sset * /* NULL if goes to empty set */ -miss(struct vars * v, /* used only for debug flags */ - struct dfa * d, - struct sset * css, - pcolor co, - chr *cp, /* next chr */ - chr *start) /* where the attempt got started */ -{ - struct cnfa *cnfa = d->cnfa; - int i; - unsigned h; - struct carc *ca; - struct sset *p; - int ispost; - int noprogress; - int gotstate; - int dolacons; - int sawlacons; - - /* for convenience, we can be called even if it might not be a miss */ - if (css->outs[co] != NULL) - { - FDEBUG(("hit\n")); - return css->outs[co]; - } - FDEBUG(("miss\n")); - - /* first, what set of states would we end up in? */ - for (i = 0; i < d->wordsper; i++) - d->work[i] = 0; - ispost = 0; - noprogress = 1; - gotstate = 0; - for (i = 0; i < d->nstates; i++) - if (ISBSET(css->states, i)) - for (ca = cnfa->states[i] + 1; ca->co != COLORLESS; ca++) - if (ca->co == co) - { - BSET(d->work, ca->to); - gotstate = 1; - if (ca->to == cnfa->post) - ispost = 1; - if (!cnfa->states[ca->to]->co) - noprogress = 0; - FDEBUG(("%d -> %d\n", i, ca->to)); - } - dolacons = (gotstate) ? (cnfa->flags & HASLACONS) : 0; - sawlacons = 0; - while (dolacons) - { /* transitive closure */ - dolacons = 0; - for (i = 0; i < d->nstates; i++) - if (ISBSET(d->work, i)) - for (ca = cnfa->states[i] + 1; ca->co != COLORLESS; - ca++) - { - if (ca->co <= cnfa->ncolors) - continue; /* NOTE CONTINUE */ - sawlacons = 1; - if (ISBSET(d->work, ca->to)) - continue; /* NOTE CONTINUE */ - if (!lacon(v, cnfa, cp, ca->co)) - continue; /* NOTE CONTINUE */ - BSET(d->work, ca->to); - dolacons = 1; - if (ca->to == cnfa->post) - ispost = 1; - if (!cnfa->states[ca->to]->co) - noprogress = 0; - FDEBUG(("%d :> %d\n", i, ca->to)); - } - } - if (!gotstate) - return NULL; - h = HASH(d->work, d->wordsper); - - /* next, is that in the cache? */ - for (p = d->ssets, i = d->nssused; i > 0; p++, i--) - if (HIT(h, d->work, p, d->wordsper)) - { - FDEBUG(("cached c%d\n", p - d->ssets)); - break; /* NOTE BREAK OUT */ - } - if (i == 0) - { /* nope, need a new cache entry */ - p = getvacant(v, d, cp, start); - assert(p != css); - for (i = 0; i < d->wordsper; i++) - p->states[i] = d->work[i]; - p->hash = h; - p->flags = (ispost) ? POSTSTATE : 0; - if (noprogress) - p->flags |= NOPROGRESS; - /* lastseen to be dealt with by caller */ - } - - if (!sawlacons) - { /* lookahead conds. always cache miss */ - FDEBUG(("c%d[%d]->c%d\n", css - d->ssets, co, p - d->ssets)); - css->outs[co] = p; - css->inchain[co] = p->ins; - p->ins.ss = css; - p->ins.co = (color) co; - } - return p; -} - -/* - * lacon - lookahead-constraint checker for miss() - */ -static int /* predicate: constraint satisfied? */ -lacon(struct vars * v, - struct cnfa * pcnfa, /* parent cnfa */ - chr *cp, - pcolor co) /* "color" of the lookahead constraint */ -{ - int n; - struct subre *sub; - struct dfa *d; - struct smalldfa sd; - chr *end; - - n = co - pcnfa->ncolors; - assert(n < v->g->nlacons && v->g->lacons != NULL); - FDEBUG(("=== testing lacon %d\n", n)); - sub = &v->g->lacons[n]; - d = newdfa(v, &sub->cnfa, &v->g->cmap, &sd); - if (d == NULL) - { - ERR(REG_ESPACE); - return 0; - } - end = longest(v, d, cp, v->stop, (int *) NULL); - freedfa(d); - FDEBUG(("=== lacon %d match %d\n", n, (end != NULL))); - return (sub->subno) ? (end != NULL) : (end == NULL); -} - -/* - * getvacant - get a vacant state set - * This routine clears out the inarcs and outarcs, but does not otherwise - * clear the innards of the state set -- that's up to the caller. - */ -static struct sset * -getvacant(struct vars * v, /* used only for debug flags */ - struct dfa * d, - chr *cp, - chr *start) -{ - int i; - struct sset *ss; - struct sset *p; - struct arcp ap; - struct arcp lastap; - color co; - - ss = pickss(v, d, cp, start); - assert(!(ss->flags & LOCKED)); - - /* clear out its inarcs, including self-referential ones */ - ap = ss->ins; - while ((p = ap.ss) != NULL) - { - co = ap.co; - FDEBUG(("zapping c%d's %ld outarc\n", p - d->ssets, (long) co)); - p->outs[co] = NULL; - ap = p->inchain[co]; - p->inchain[co].ss = NULL; /* paranoia */ - } - ss->ins.ss = NULL; - - /* take it off the inarc chains of the ssets reached by its outarcs */ - for (i = 0; i < d->ncolors; i++) - { - p = ss->outs[i]; - assert(p != ss); /* not self-referential */ - if (p == NULL) - continue; /* NOTE CONTINUE */ - FDEBUG(("del outarc %d from c%d's in chn\n", i, p - d->ssets)); - if (p->ins.ss == ss && p->ins.co == i) - p->ins = ss->inchain[i]; - else - { - assert(p->ins.ss != NULL); - for (ap = p->ins; ap.ss != NULL && - !(ap.ss == ss && ap.co == i); - ap = ap.ss->inchain[ap.co]) - lastap = ap; - assert(ap.ss != NULL); - lastap.ss->inchain[lastap.co] = ss->inchain[i]; - } - ss->outs[i] = NULL; - ss->inchain[i].ss = NULL; - } - - /* if ss was a success state, may need to remember location */ - if ((ss->flags & POSTSTATE) && ss->lastseen != d->lastpost && - (d->lastpost == NULL || d->lastpost < ss->lastseen)) - d->lastpost = ss->lastseen; - - /* likewise for a no-progress state */ - if ((ss->flags & NOPROGRESS) && ss->lastseen != d->lastnopr && - (d->lastnopr == NULL || d->lastnopr < ss->lastseen)) - d->lastnopr = ss->lastseen; - - return ss; -} - -/* - * pickss - pick the next stateset to be used - */ -static struct sset * -pickss(struct vars * v, /* used only for debug flags */ - struct dfa * d, - chr *cp, - chr *start) -{ - int i; - struct sset *ss; - struct sset *end; - chr *ancient; - - /* shortcut for cases where cache isn't full */ - if (d->nssused < d->nssets) - { - i = d->nssused; - d->nssused++; - ss = &d->ssets[i]; - FDEBUG(("new c%d\n", i)); - /* set up innards */ - ss->states = &d->statesarea[i * d->wordsper]; - ss->flags = 0; - ss->ins.ss = NULL; - ss->ins.co = WHITE; /* give it some value */ - ss->outs = &d->outsarea[i * d->ncolors]; - ss->inchain = &d->incarea[i * d->ncolors]; - for (i = 0; i < d->ncolors; i++) - { - ss->outs[i] = NULL; - ss->inchain[i].ss = NULL; - } - return ss; - } - - /* look for oldest, or old enough anyway */ - if (cp - start > d->nssets * 2 / 3) /* oldest 33% are expendable */ - ancient = cp - d->nssets * 2 / 3; - else - ancient = start; - for (ss = d->search, end = &d->ssets[d->nssets]; ss < end; ss++) - if ((ss->lastseen == NULL || ss->lastseen < ancient) && - !(ss->flags & LOCKED)) - { - d->search = ss + 1; - FDEBUG(("replacing c%d\n", ss - d->ssets)); - return ss; - } - for (ss = d->ssets, end = d->search; ss < end; ss++) - if ((ss->lastseen == NULL || ss->lastseen < ancient) && - !(ss->flags & LOCKED)) - { - d->search = ss + 1; - FDEBUG(("replacing c%d\n", ss - d->ssets)); - return ss; - } - - /* nobody's old enough?!? -- something's really wrong */ - FDEBUG(("can't find victim to replace!\n")); - assert(NOTREACHED); - ERR(REG_ASSERT); - return d->ssets; -} diff --git a/src/regex/regerrs.h b/src/regex/regerrs.h deleted file mode 100644 index f99dbf4f73..0000000000 --- a/src/regex/regerrs.h +++ /dev/null @@ -1,75 +0,0 @@ -/* - * $Id$ - */ - -{ - REG_OKAY, "REG_OKAY", "no errors detected" -}, - -{ - REG_NOMATCH, "REG_NOMATCH", "failed to match" -}, - -{ - REG_BADPAT, "REG_BADPAT", "invalid regexp (reg version 0.8)" -}, - -{ - REG_ECOLLATE, "REG_ECOLLATE", "invalid collating element" -}, - -{ - REG_ECTYPE, "REG_ECTYPE", "invalid character class" -}, - -{ - REG_EESCAPE, "REG_EESCAPE", "invalid escape \\ sequence" -}, - -{ - REG_ESUBREG, "REG_ESUBREG", "invalid backreference number" -}, - -{ - REG_EBRACK, "REG_EBRACK", "brackets [] not balanced" -}, - -{ - REG_EPAREN, "REG_EPAREN", "parentheses () not balanced" -}, - -{ - REG_EBRACE, "REG_EBRACE", "braces {} not balanced" -}, - -{ - REG_BADBR, "REG_BADBR", "invalid repetition count(s)" -}, - -{ - REG_ERANGE, "REG_ERANGE", "invalid character range" -}, - -{ - REG_ESPACE, "REG_ESPACE", "out of memory" -}, - -{ - REG_BADRPT, "REG_BADRPT", "quantifier operand invalid" -}, - -{ - REG_ASSERT, "REG_ASSERT", "\"can't happen\" -- you found a bug" -}, - -{ - REG_INVARG, "REG_INVARG", "invalid argument to regex function" -}, - -{ - REG_MIXED, "REG_MIXED", "character widths of regex and string differ" -}, - -{ - REG_BADOPT, "REG_BADOPT", "invalid embedded option" -}, diff --git a/src/regex/regex.7 b/src/regex/regex.7 new file mode 100644 index 0000000000..0fa180269e --- /dev/null +++ b/src/regex/regex.7 @@ -0,0 +1,235 @@ +.TH REGEX 7 "25 Oct 1995" +.BY "Henry Spencer" +.SH NAME +regex \- POSIX 1003.2 regular expressions +.SH DESCRIPTION +Regular expressions (``RE''s), +as defined in POSIX 1003.2, come in two forms: +modern REs (roughly those of +.IR egrep ; +1003.2 calls these ``extended'' REs) +and obsolete REs (roughly those of +.IR ed ; +1003.2 ``basic'' REs). +Obsolete REs mostly exist for backward compatibility in some old programs; +they will be discussed at the end. +1003.2 leaves some aspects of RE syntax and semantics open; +`\(dg' marks decisions on these aspects that +may not be fully portable to other 1003.2 implementations. +.PP +A (modern) RE is one\(dg or more non-empty\(dg \fIbranches\fR, +separated by `|'. +It matches anything that matches one of the branches. +.PP +A branch is one\(dg or more \fIpieces\fR, concatenated. +It matches a match for the first, followed by a match for the second, etc. +.PP +A piece is an \fIatom\fR possibly followed +by a single\(dg `*', `+', `?', or \fIbound\fR. +An atom followed by `*' matches a sequence of 0 or more matches of the atom. +An atom followed by `+' matches a sequence of 1 or more matches of the atom. +An atom followed by `?' matches a sequence of 0 or 1 matches of the atom. +.PP +A \fIbound\fR is `{' followed by an unsigned decimal integer, +possibly followed by `,' +possibly followed by another unsigned decimal integer, +always followed by `}'. +The integers must lie between 0 and RE_DUP_MAX (255\(dg) inclusive, +and if there are two of them, the first may not exceed the second. +An atom followed by a bound containing one integer \fIi\fR +and no comma matches +a sequence of exactly \fIi\fR matches of the atom. +An atom followed by a bound +containing one integer \fIi\fR and a comma matches +a sequence of \fIi\fR or more matches of the atom. +An atom followed by a bound +containing two integers \fIi\fR and \fIj\fR matches +a sequence of \fIi\fR through \fIj\fR (inclusive) matches of the atom. +.PP +An atom is a regular expression enclosed in `()' (matching a match for the +regular expression), +an empty set of `()' (matching the null string)\(dg, +a \fIbracket expression\fR (see below), `.' +(matching any single character), `^' (matching the null string at the +beginning of a line), `$' (matching the null string at the +end of a line), a `\e' followed by one of the characters +`^.[$()|*+?{\e' +(matching that character taken as an ordinary character), +a `\e' followed by any other character\(dg +(matching that character taken as an ordinary character, +as if the `\e' had not been present\(dg), +or a single character with no other significance (matching that character). +A `{' followed by a character other than a digit is an ordinary +character, not the beginning of a bound\(dg. +It is illegal to end an RE with `\e'. +.PP +A \fIbracket expression\fR is a list of characters enclosed in `[]'. +It normally matches any single character from the list (but see below). +If the list begins with `^', +it matches any single character +(but see below) \fInot\fR from the rest of the list. +If two characters in the list are separated by `\-', this is shorthand +for the full \fIrange\fR of characters between those two (inclusive) in the +collating sequence, +e.g. `[0\-9]' in ASCII matches any decimal digit. +It is illegal\(dg for two ranges to share an +endpoint, e.g. `a\-c\-e'. +Ranges are very collating-sequence-dependent, +and portable programs should avoid relying on them. +.PP +To include a literal `]' in the list, make it the first character +(following a possible `^'). +To include a literal `\-', make it the first or last character, +or the second endpoint of a range. +To use a literal `\-' as the first endpoint of a range, +enclose it in `[.' and `.]' to make it a collating element (see below). +With the exception of these and some combinations using `[' (see next +paragraphs), all other special characters, including `\e', lose their +special significance within a bracket expression. +.PP +Within a bracket expression, a collating element (a character, +a multi-character sequence that collates as if it were a single character, +or a collating-sequence name for either) +enclosed in `[.' and `.]' stands for the +sequence of characters of that collating element. +The sequence is a single element of the bracket expression's list. +A bracket expression containing a multi-character collating element +can thus match more than one character, +e.g. if the collating sequence includes a `ch' collating element, +then the RE `[[.ch.]]*c' matches the first five characters +of `chchcc'. +.PP +Within a bracket expression, a collating element enclosed in `[=' and +`=]' is an equivalence class, standing for the sequences of characters +of all collating elements equivalent to that one, including itself. +(If there are no other equivalent collating elements, +the treatment is as if the enclosing delimiters were `[.' and `.]'.) +For example, if o and \o'o^' are the members of an equivalence class, +then `[[=o=]]', `[[=\o'o^'=]]', and `[o\o'o^']' are all synonymous. +An equivalence class may not\(dg be an endpoint +of a range. +.PP +Within a bracket expression, the name of a \fIcharacter class\fR enclosed +in `[:' and `:]' stands for the list of all characters belonging to that +class. +Standard character class names are: +.PP +.RS +.nf +.ta 3c 6c 9c +alnum digit punct +alpha graph space +blank lower upper +cntrl print xdigit +.fi +.RE +.PP +These stand for the character classes defined in +.IR ctype (3). +A locale may provide others. +A character class may not be used as an endpoint of a range. +.PP +There are two special cases\(dg of bracket expressions: +the bracket expressions `[[:<:]]' and `[[:>:]]' match the null string at +the beginning and end of a word respectively. +A word is defined as a sequence of +word characters +which is neither preceded nor followed by +word characters. +A word character is an +.I alnum +character (as defined by +.IR ctype (3)) +or an underscore. +This is an extension, +compatible with but not specified by POSIX 1003.2, +and should be used with +caution in software intended to be portable to other systems. +.PP +In the event that an RE could match more than one substring of a given +string, +the RE matches the one starting earliest in the string. +If the RE could match more than one substring starting at that point, +it matches the longest. +Subexpressions also match the longest possible substrings, subject to +the constraint that the whole match be as long as possible, +with subexpressions starting earlier in the RE taking priority over +ones starting later. +Note that higher-level subexpressions thus take priority over +their lower-level component subexpressions. +.PP +Match lengths are measured in characters, not collating elements. +A null string is considered longer than no match at all. +For example, +`bb*' matches the three middle characters of `abbbc', +`(wee|week)(knights|nights)' matches all ten characters of `weeknights', +when `(.*).*' is matched against `abc' the parenthesized subexpression +matches all three characters, and +when `(a*)*' is matched against `bc' both the whole RE and the parenthesized +subexpression match the null string. +.PP +If case-independent matching is specified, +the effect is much as if all case distinctions had vanished from the +alphabet. +When an alphabetic that exists in multiple cases appears as an +ordinary character outside a bracket expression, it is effectively +transformed into a bracket expression containing both cases, +e.g. `x' becomes `[xX]'. +When it appears inside a bracket expression, all case counterparts +of it are added to the bracket expression, so that (e.g.) `[x]' +becomes `[xX]' and `[^x]' becomes `[^xX]'. +.PP +No particular limit is imposed on the length of REs\(dg. +Programs intended to be portable should not employ REs longer +than 256 bytes, +as an implementation can refuse to accept such REs and remain +POSIX-compliant. +.PP +Obsolete (``basic'') regular expressions differ in several respects. +`|', `+', and `?' are ordinary characters and there is no equivalent +for their functionality. +The delimiters for bounds are `\e{' and `\e}', +with `{' and `}' by themselves ordinary characters. +The parentheses for nested subexpressions are `\e(' and `\e)', +with `(' and `)' by themselves ordinary characters. +`^' is an ordinary character except at the beginning of the +RE or\(dg the beginning of a parenthesized subexpression, +`$' is an ordinary character except at the end of the +RE or\(dg the end of a parenthesized subexpression, +and `*' is an ordinary character if it appears at the beginning of the +RE or the beginning of a parenthesized subexpression +(after a possible leading `^'). +Finally, there is one new type of atom, a \fIback reference\fR: +`\e' followed by a non-zero decimal digit \fId\fR +matches the same sequence of characters +matched by the \fId\fRth parenthesized subexpression +(numbering subexpressions by the positions of their opening parentheses, +left to right), +so that (e.g.) `\e([bc]\e)\e1' matches `bb' or `cc' but not `bc'. +.SH SEE ALSO +regex(3) +.PP +POSIX 1003.2, section 2.8 (Regular Expression Notation). +.SH HISTORY +Written by Henry Spencer, based on the 1003.2 spec. +.SH BUGS +Having two kinds of REs is a botch. +.PP +The current 1003.2 spec says that `)' is an ordinary character in +the absence of an unmatched `('; +this was an unintentional result of a wording error, +and change is likely. +Avoid relying on it. +.PP +Back references are a dreadful botch, +posing major problems for efficient implementations. +They are also somewhat vaguely defined +(does +`a\e(\e(b\e)*\e2\e)*d' match `abbbd'?). +Avoid using them. +.PP +1003.2's specification of case-independent matching is vague. +The ``one case implies all cases'' definition given above +is current consensus among implementors as to the right interpretation. +.PP +The syntax for word boundaries is incredibly ugly. diff --git a/src/regex/regex.h b/src/regex/regex.h index a1fcec2e1c..d094d072d5 100644 --- a/src/regex/regex.h +++ b/src/regex/regex.h @@ -1,202 +1,74 @@ #ifndef _REGEX_H_ #define _REGEX_H_ /* never again */ -/* - * regular expressions - * - * Copyright (c) 1998, 1999 Henry Spencer. All rights reserved. - * - * Development of this software was funded, in part, by Cray Research Inc., - * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics - * Corporation, none of whom are responsible for the results. The author - * thanks all of them. - * - * Redistribution and use in source and binary forms -- with or without - * modification -- are permitted for any purpose, provided that - * redistributions in source form retain this entire copyright notice and - * indicate the origin and nature of any modifications. - * - * I'd appreciate being given credit for this package in the documentation - * of software which uses it, but that is not a requirement. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Id$ - */ - -/* - * Add your own defines, if needed, here. - */ +/* ========= begin header generated by ./mkh ========= */ #ifdef __cplusplus extern "C" { #endif -#include -#include -#include - -#ifndef wxCHECK_GCC_VERSION -#define wxCHECK_GCC_VERSION( major, minor ) \ - ( defined(__GNUC__) && defined(__GNUC_MINOR__) \ - && ( ( __GNUC__ > (major) ) \ - || ( __GNUC__ == (major) && __GNUC_MINOR__ >= (minor) ) ) ) -#endif - -#if !wxUSE_UNICODE -# define wx_wchar char -#else // Unicode - #if (defined(__GNUC__) && !wxCHECK_GCC_VERSION(2, 96)) -# define wx_wchar __WCHAR_TYPE__ - #else // __WCHAR_TYPE__ and gcc < 2.96 - // standard case -# define wx_wchar wchar_t - #endif // __WCHAR_TYPE__ -#endif // ASCII/Unicode - -/* - * interface types etc. - */ - -/* - * regoff_t has to be large enough to hold either off_t or ssize_t, - * and must be signed; it's only a guess that long is suitable. - */ -typedef long regoff_t; - -/* - * other interface types - */ - -/* the biggie, a compiled RE (or rather, a front end to same) */ -typedef struct -{ - int re_magic; /* magic number */ - size_t re_nsub; /* number of subexpressions */ - long re_info; /* information about RE */ -#define REG_UBACKREF 000001 -#define REG_ULOOKAHEAD 000002 -#define REG_UBOUNDS 000004 -#define REG_UBRACES 000010 -#define REG_UBSALNUM 000020 -#define REG_UPBOTCH 000040 -#define REG_UBBS 000100 -#define REG_UNONPOSIX 000200 -#define REG_UUNSPEC 000400 -#define REG_UUNPORT 001000 -#define REG_ULOCALE 002000 -#define REG_UEMPTYMATCH 004000 -#define REG_UIMPOSSIBLE 010000 -#define REG_USHORTEST 020000 - int re_csize; /* sizeof(character) */ - char *re_endp; /* backward compatibility kludge */ - /* the rest is opaque pointers to hidden innards */ - char *re_guts; /* `char *' is more portable than `void *' */ - char *re_fns; +/* === regex2.h === */ +typedef off_t regoff_t; +typedef struct { + int re_magic; + size_t re_nsub; /* number of parenthesized subexpressions */ + const char *re_endp; /* end pointer for REG_PEND */ + struct re_guts *re_g; /* none of your business :-) */ } regex_t; - -/* result reporting (may acquire more fields later) */ -typedef struct -{ - regoff_t rm_so; /* start of substring */ - regoff_t rm_eo; /* end of substring */ +typedef struct { + regoff_t rm_so; /* start of match */ + regoff_t rm_eo; /* end of match */ } regmatch_t; -/* supplementary control and reporting */ -typedef struct -{ - regmatch_t rm_extend; /* see REG_EXPECT */ -} rm_detail_t; + +/* === regcomp.c === */ +extern int regcomp(regex_t *, const char *, int); +#define REG_BASIC 0000 +#define REG_EXTENDED 0001 +#define REG_ICASE 0002 +#define REG_NOSUB 0004 +#define REG_NEWLINE 0010 +#define REG_NOSPEC 0020 +#define REG_PEND 0040 +#define REG_DUMP 0200 - -/* - * regex compilation flags - */ -#define REG_BASIC 000000 /* BREs (convenience) */ -#define REG_EXTENDED 000001 /* EREs */ -#define REG_ADVF 000002 /* advanced features in EREs */ -#define REG_ADVANCED 000003 /* AREs (which are also EREs) */ -#define REG_QUOTE 000004 /* no special characters, none */ -#define REG_NOSPEC REG_QUOTE /* historical synonym */ -#define REG_ICASE 000010 /* ignore case */ -#define REG_NOSUB 000020 /* don't care about subexpressions */ -#define REG_EXPANDED 000040 /* expanded format, white space & comments */ -#define REG_NLSTOP 000100 /* \n doesn't match . or [^ ] */ -#define REG_NLANCH 000200 /* ^ matches after \n, $ before */ -#define REG_NEWLINE 000300 /* newlines are line terminators */ -#define REG_PEND 000400 /* ugh -- backward-compatibility hack */ -#define REG_EXPECT 001000 /* report details on partial/limited - * matches */ -#define REG_BOSONLY 002000 /* temporary kludge for BOS-only matches */ -#define REG_DUMP 004000 /* none of your business :-) */ -#define REG_FAKE 010000 /* none of your business :-) */ -#define REG_PROGRESS 020000 /* none of your business :-) */ - - - -/* - * regex execution flags - */ -#define REG_NOTBOL 0001 /* BOS is not BOL */ -#define REG_NOTEOL 0002 /* EOS is not EOL */ -#define REG_STARTEND 0004 /* backward compatibility kludge */ -#define REG_FTRACE 0010 /* none of your business */ -#define REG_MTRACE 0020 /* none of your business */ -#define REG_SMALL 0040 /* none of your business */ - - -/* - * error reporting - * Be careful if modifying the list of error codes -- the table used by - * regerror() is generated automatically from this file! - */ -#define REG_OKAY 0 /* no errors detected */ -#define REG_NOMATCH 1 /* failed to match */ -#define REG_BADPAT 2 /* invalid regexp */ -#define REG_ECOLLATE 3 /* invalid collating element */ -#define REG_ECTYPE 4 /* invalid character class */ -#define REG_EESCAPE 5 /* invalid escape \ sequence */ -#define REG_ESUBREG 6 /* invalid backreference number */ -#define REG_EBRACK 7 /* brackets [] not balanced */ -#define REG_EPAREN 8 /* parentheses () not balanced */ -#define REG_EBRACE 9 /* braces {} not balanced */ -#define REG_BADBR 10 /* invalid repetition count(s) */ -#define REG_ERANGE 11 /* invalid character range */ -#define REG_ESPACE 12 /* out of memory */ -#define REG_BADRPT 13 /* quantifier operand invalid */ -#define REG_ASSERT 15 /* "can't happen" -- you found a bug */ -#define REG_INVARG 16 /* invalid argument to regex function */ -#define REG_MIXED 17 /* character widths of regex and string - * differ */ -#define REG_BADOPT 18 /* invalid embedded option */ -/* two specials for debugging and testing */ -#define REG_ATOI 101 /* convert error-code name to number */ -#define REG_ITOA 102 /* convert error-code number to name */ - - - -/* - * the prototypes for exported functions - */ -extern int wx_regcomp(regex_t *, const wx_wchar *, size_t, int); -extern int regcomp(regex_t *, const wx_wchar *, int); -extern int wx_regexec(regex_t *, const wx_wchar *, size_t, rm_detail_t *, size_t, regmatch_t[], int); -extern int regexec(regex_t *, const wx_wchar *, size_t, regmatch_t[], int); -extern void regfree(regex_t *); +/* === regerror.c === */ +#define REG_OKAY 0 +#define REG_NOMATCH 1 +#define REG_BADPAT 2 +#define REG_ECOLLATE 3 +#define REG_ECTYPE 4 +#define REG_EESCAPE 5 +#define REG_ESUBREG 6 +#define REG_EBRACK 7 +#define REG_EPAREN 8 +#define REG_EBRACE 9 +#define REG_BADBR 10 +#define REG_ERANGE 11 +#define REG_ESPACE 12 +#define REG_BADRPT 13 +#define REG_EMPTY 14 +#define REG_ASSERT 15 +#define REG_INVARG 16 +#define REG_ATOI 255 /* convert name to number (!) */ +#define REG_ITOA 0400 /* convert number to name (!) */ extern size_t regerror(int, const regex_t *, char *, size_t); -extern void wx_regfree(regex_t *); -extern size_t wx_regerror(int, const regex_t *, char *, size_t); + + +/* === regexec.c === */ +extern int regexec(const regex_t *, const char *, size_t, regmatch_t [], int); +#define REG_NOTBOL 00001 +#define REG_NOTEOL 00002 +#define REG_STARTEND 00004 +#define REG_TRACE 00400 /* tracing of execution */ +#define REG_LARGE 01000 /* force large representation */ +#define REG_BACKR 02000 /* force use of backref code */ + + +/* === regfree.c === */ +extern void regfree(regex_t *); #ifdef __cplusplus } #endif - -#endif /* _REGEX_H_ */ +/* ========= end header generated by ./mkh ========= */ +#endif diff --git a/src/regex/regex2.h b/src/regex/regex2.h new file mode 100644 index 0000000000..58fd8d8a43 --- /dev/null +++ b/src/regex/regex2.h @@ -0,0 +1,134 @@ +/* + * First, the stuff that ends up in the outside-world include file + = typedef off_t regoff_t; + = typedef struct { + = int re_magic; + = size_t re_nsub; // number of parenthesized subexpressions + = const char *re_endp; // end pointer for REG_PEND + = struct re_guts *re_g; // none of your business :-) + = } regex_t; + = typedef struct { + = regoff_t rm_so; // start of match + = regoff_t rm_eo; // end of match + = } regmatch_t; + */ +/* + * internals of regex_t + */ +#define MAGIC1 ((('r'^0200)<<8) | 'e') + +/* + * The internal representation is a *strip*, a sequence of + * operators ending with an endmarker. (Some terminology etc. is a + * historical relic of earlier versions which used multiple strips.) + * Certain oddities in the representation are there to permit running + * the machinery backwards; in particular, any deviation from sequential + * flow must be marked at both its source and its destination. Some + * fine points: + * + * - OPLUS_ and O_PLUS are *inside* the loop they create. + * - OQUEST_ and O_QUEST are *outside* the bypass they create. + * - OCH_ and O_CH are *outside* the multi-way branch they create, while + * OOR1 and OOR2 are respectively the end and the beginning of one of + * the branches. Note that there is an implicit OOR2 following OCH_ + * and an implicit OOR1 preceding O_CH. + * + * In state representations, an operator's bit is on to signify a state + * immediately *preceding* "execution" of that operator. + */ +typedef long sop; /* strip operator */ +typedef long sopno; +#define OPRMASK 0x7c000000 +#define OPDMASK 0x03ffffff +#define OPSHIFT (26) +#define OP(n) ((n)&OPRMASK) +#define OPND(n) ((n)&OPDMASK) +#define SOP(op, opnd) ((op)|(opnd)) +/* operators meaning operand */ +/* (back, fwd are offsets) */ +#define OEND (1< uch [csetsize] */ + uch mask; /* bit within array */ + uch hash; /* hash code */ + size_t smultis; + char *multis; /* -> char[smulti] ab\0cd\0ef\0\0 */ +} cset; +/* note that CHadd and CHsub are unsafe, and CHIN doesn't yield 0/1 */ +#define CHadd(cs, c) ((cs)->ptr[(uch)(c)] |= (cs)->mask, (cs)->hash += (c)) +#define CHsub(cs, c) ((cs)->ptr[(uch)(c)] &= ~(cs)->mask, (cs)->hash -= (c)) +#define CHIN(cs, c) ((cs)->ptr[(uch)(c)] & (cs)->mask) +#define MCadd(p, cs, cp) mcadd(p, cs, cp) /* regcomp() internal fns */ +#define MCsub(p, cs, cp) mcsub(p, cs, cp) +#define MCin(p, cs, cp) mcin(p, cs, cp) + +/* stuff for character categories */ +typedef unsigned char cat_t; + +/* + * main compiled-expression structure + */ +struct re_guts { + int magic; +# define MAGIC2 ((('R'^0200)<<8)|'E') + sop *strip; /* malloced area for strip */ + int csetsize; /* number of bits in a cset vector */ + int ncsets; /* number of csets in use */ + cset *sets; /* -> cset [ncsets] */ + uch *setbits; /* -> uch[csetsize][ncsets/CHAR_BIT] */ + int cflags; /* copy of regcomp() cflags argument */ + sopno nstates; /* = number of sops */ + sopno firststate; /* the initial OEND (normally 0) */ + sopno laststate; /* the final OEND */ + int iflags; /* internal flags */ +# define USEBOL 01 /* used ^ */ +# define USEEOL 02 /* used $ */ +# define BAD 04 /* something wrong */ + int nbol; /* number of ^ used */ + int neol; /* number of $ used */ + int ncategories; /* how many character categories */ + cat_t *categories; /* ->catspace[-CHAR_MIN] */ + char *must; /* match must contain this string */ + int mlen; /* length of must */ + size_t nsub; /* copy of re_nsub */ + int backrefs; /* does it use back references? */ + sopno nplus; /* how deep does it nest +s? */ + /* catspace must be last */ + cat_t catspace[1]; /* actually [NC] */ +}; + +/* misc utilities */ +#define OUT (CHAR_MAX+1) /* a non-character value */ +#define ISWORD(c) (isalnum(c) || (c) == '_') diff --git a/src/regex/regfronts.c b/src/regex/regfronts.c deleted file mode 100644 index 82f48e2abc..0000000000 --- a/src/regex/regfronts.c +++ /dev/null @@ -1,83 +0,0 @@ -/* - * regcomp and regexec - front ends to re_ routines - * - * Mostly for implementation of backward-compatibility kludges. Note - * that these routines exist ONLY in char versions. - * - * Copyright (c) 1998, 1999 Henry Spencer. All rights reserved. - * - * Development of this software was funded, in part, by Cray Research Inc., - * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics - * Corporation, none of whom are responsible for the results. The author - * thanks all of them. - * - * Redistribution and use in source and binary forms -- with or without - * modification -- are permitted for any purpose, provided that - * redistributions in source form retain this entire copyright notice and - * indicate the origin and nature of any modifications. - * - * I'd appreciate being given credit for this package in the documentation - * of software which uses it, but that is not a requirement. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#include "regguts.h" - -/* - - regcomp - compile regular expression - */ -int -regcomp(re, str, flags) -regex_t *re; -CONST char *str; -int flags; -{ - size_t len; - int f = flags; - - if (f®_PEND) { - len = re->re_endp - str; - f &= ~REG_PEND; - } else - len = strlen(str); - - return re_comp(re, str, len, f); -} - -/* - - regexec - execute regular expression - */ -int -regexec(re, str, nmatch, pmatch, flags) -regex_t *re; -CONST char *str; -size_t nmatch; -regmatch_t pmatch[]; -int flags; -{ - CONST char *start; - size_t len; - int f = flags; - - if (f®_STARTEND) { - start = str + pmatch[0].rm_so; - len = pmatch[0].rm_eo - pmatch[0].rm_so; - f &= ~REG_STARTEND; - } else { - start = str; - len = strlen(str); - } - - return re_exec(re, start, len, nmatch, pmatch, f); -} diff --git a/src/regex/regguts.h b/src/regex/regguts.h deleted file mode 100644 index aa12dbf445..0000000000 --- a/src/regex/regguts.h +++ /dev/null @@ -1,417 +0,0 @@ -/* - * Internal interface definitions, etc., for the reg package - * - * Copyright (c) 1998, 1999 Henry Spencer. All rights reserved. - * - * Development of this software was funded, in part, by Cray Research Inc., - * UUNET Communications Services Inc., Sun Microsystems Inc., and Scriptics - * Corporation, none of whom are responsible for the results. The author - * thanks all of them. - * - * Redistribution and use in source and binary forms -- with or without - * modification -- are permitted for any purpose, provided that - * redistributions in source form retain this entire copyright notice and - * indicate the origin and nature of any modifications. - * - * I'd appreciate being given credit for this package in the documentation - * of software which uses it, but that is not a requirement. - * - * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL - * HENRY SPENCER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - * $Id$ - */ - - - -/* - * Environmental customization. It should not (I hope) be necessary to - * alter the file you are now reading -- regcustom.h should handle it all, - * given care here and elsewhere. - */ -#include "regcustom.h" - - - -/* - * Things that regcustom.h might override. - */ - -/* assertions */ -#ifndef assert -#ifndef REG_DEBUG -# ifndef NDEBUG -# define NDEBUG /* no assertions */ -# endif -#endif -#include -#endif - -/* voids */ -#ifndef DISCARD -#define DISCARD void /* for throwing values away */ -#endif -#ifndef VS -#define VS(x) ((void *)(x)) /* cast something to generic ptr */ -#endif - -/* function-pointer declarator */ -#ifndef FUNCPTR -#define FUNCPTR(name, args) (*name) args -#endif - -/* memory allocation */ -#ifndef MALLOC -#define MALLOC(n) malloc(n) -#endif -#ifndef REALLOC -#define REALLOC(p, n) realloc(VS(p), n) -#endif -#ifndef FREE -#define FREE(p) free(VS(p)) -#endif - -/* want size of a char in bits, and max value in bounded quantifiers */ -#ifndef CHAR_BIT -#include -#endif -#ifndef _POSIX2_RE_DUP_MAX -#define _POSIX2_RE_DUP_MAX 255 /* normally from */ -#endif - - - -/* - * misc - */ - -#define NOTREACHED 0 -#define xxx 1 - -#define DUPMAX _POSIX2_RE_DUP_MAX -#define INFINITY (DUPMAX+1) - -#define REMAGIC 0xfed7 /* magic number for main struct */ - - - -/* - * debugging facilities - */ -#ifdef REG_DEBUG -/* FDEBUG does finite-state tracing */ -#define FDEBUG(arglist) { if (v->eflags®_FTRACE) printf arglist; } -/* MDEBUG does higher-level tracing */ -#define MDEBUG(arglist) { if (v->eflags®_MTRACE) printf arglist; } -#else -#define FDEBUG(arglist) {} -#define MDEBUG(arglist) {} -#endif - - - -/* - * bitmap manipulation - */ -#define UBITS (CHAR_BIT * sizeof(unsigned)) -#define BSET(uv, sn) ((uv)[(sn)/UBITS] |= (unsigned)1 << ((sn)%UBITS)) -#define ISBSET(uv, sn) ((uv)[(sn)/UBITS] & ((unsigned)1 << ((sn)%UBITS))) - - - -/* - * We dissect a chr into byts for colormap table indexing. Here we define - * a byt, which will be the same as a byte on most machines... The exact - * size of a byt is not critical, but about 8 bits is good, and extraction - * of 8-bit chunks is sometimes especially fast. - */ -#ifndef BYTBITS -#define BYTBITS 8 /* bits in a byt */ -#endif -#define BYTTAB (1<flags&FREECOL) - union tree *block; /* block of solid color, if any */ -}; - -/* the color map itself */ -struct colormap -{ - int magic; -#define CMMAGIC 0x876 - struct vars *v; /* for compile error reporting */ - size_t ncds; /* number of colordescs */ - size_t max; /* highest in use */ - color free; /* beginning of free chain (if non-0) */ - struct colordesc *cd; -#define CDEND(cm) (&(cm)->cd[(cm)->max + 1]) -#define NINLINECDS ((size_t)10) - struct colordesc cdspace[NINLINECDS]; - union tree tree[NBYTS]; /* tree top, plus fill blocks */ -}; - -/* optimization magic to do fast chr->color mapping */ -#define B0(c) ((c) & BYTMASK) -#define B1(c) (((c)>>BYTBITS) & BYTMASK) -#define B2(c) (((c)>>(2*BYTBITS)) & BYTMASK) -#define B3(c) (((c)>>(3*BYTBITS)) & BYTMASK) -#if NBYTS == 1 -#define GETCOLOR(cm, c) ((cm)->tree->tcolor[B0(c)]) -#endif -/* beware, for NBYTS>1, GETCOLOR() is unsafe -- 2nd arg used repeatedly */ -#if NBYTS == 2 -#define GETCOLOR(cm, c) ((cm)->tree->tptr[B1(c)]->tcolor[B0(c)]) -#endif -#if NBYTS == 4 -#define GETCOLOR(cm, c) ((cm)->tree->tptr[B3(c)]->tptr[B2(c)]->tptr[B1(c)]->tcolor[B0(c)]) -#endif - - - -/* - * Interface definitions for locale-interface functions in locale.c. - * Multi-character collating elements (MCCEs) cause most of the trouble. - */ -struct cvec -{ - int nchrs; /* number of chrs */ - int chrspace; /* number of chrs possible */ - chr *chrs; /* pointer to vector of chrs */ - int nranges; /* number of ranges (chr pairs) */ - int rangespace; /* number of chrs possible */ - chr *ranges; /* pointer to vector of chr pairs */ - int nmcces; /* number of MCCEs */ - int mccespace; /* number of MCCEs possible */ - int nmccechrs; /* number of chrs used for MCCEs */ - chr *mcces[1]; /* pointers to 0-terminated MCCEs */ - /* and both batches of chrs are on the end */ -}; - -/* caution: this value cannot be changed easily */ -#define MAXMCCE 2 /* length of longest MCCE */ - - - -/* - * definitions for NFA internal representation - * - * Having a "from" pointer within each arc may seem redundant, but it - * saves a lot of hassle. - */ -struct state; - -struct arc -{ - int type; -#define ARCFREE '\0' - color co; - struct state *from; /* where it's from (and contained within) */ - struct state *to; /* where it's to */ - struct arc *outchain; /* *from's outs chain or free chain */ -#define freechain outchain - struct arc *inchain; /* *to's ins chain */ - struct arc *colorchain; /* color's arc chain */ -}; - -struct arcbatch -{ /* for bulk allocation of arcs */ - struct arcbatch *next; -#define ABSIZE 10 - struct arc a[ABSIZE]; -}; - -struct state -{ - int no; -#define FREESTATE (-1) - char flag; /* marks special states */ - int nins; /* number of inarcs */ - struct arc *ins; /* chain of inarcs */ - int nouts; /* number of outarcs */ - struct arc *outs; /* chain of outarcs */ - struct arc *free; /* chain of free arcs */ - struct state *tmp; /* temporary for traversal algorithms */ - struct state *next; /* chain for traversing all */ - struct state *prev; /* back chain */ - struct arcbatch oas; /* first arcbatch, avoid malloc in easy - * case */ - int noas; /* number of arcs used in first arcbatch */ -}; - -struct nfa -{ - struct state *pre; /* pre-initial state */ - struct state *init; /* initial state */ - struct state *final; /* final state */ - struct state *post; /* post-final state */ - int nstates; /* for numbering states */ - struct state *states; /* state-chain header */ - struct state *slast; /* tail of the chain */ - struct state *free; /* free list */ - struct colormap *cm; /* the color map */ - color bos[2]; /* colors, if any, assigned to BOS and BOL */ - color eos[2]; /* colors, if any, assigned to EOS and EOL */ - struct vars *v; /* simplifies compile error reporting */ - struct nfa *parent; /* parent NFA, if any */ -}; - - - -/* - * definitions for compacted NFA - */ -struct carc -{ - color co; /* COLORLESS is list terminator */ - int to; /* state number */ -}; - -struct cnfa -{ - int nstates; /* number of states */ - int ncolors; /* number of colors */ - int flags; -#define HASLACONS 01 /* uses lookahead constraints */ - int pre; /* setup state number */ - int post; /* teardown state number */ - color bos[2]; /* colors, if any, assigned to BOS and BOL */ - color eos[2]; /* colors, if any, assigned to EOS and EOL */ - struct carc **states; /* vector of pointers to outarc lists */ - struct carc *arcs; /* the area for the lists */ -}; - -#define ZAPCNFA(cnfa) ((cnfa).nstates = 0) -#define NULLCNFA(cnfa) ((cnfa).nstates == 0) - - - -/* - * subexpression tree - */ -struct subre -{ - char op; /* '|', '.' (concat), 'b' (backref), '(', - * '=' */ - char flags; -#define LONGER 01 /* prefers longer match */ -#define SHORTER 02 /* prefers shorter match */ -#define MIXED 04 /* mixed preference below */ -#define CAP 010 /* capturing parens below */ -#define BACKR 020 /* back reference below */ -#define INUSE 0100 /* in use in final tree */ -#define LOCAL 03 /* bits which may not propagate up */ -#define LMIX(f) ((f)<<2) /* LONGER -> MIXED */ -#define SMIX(f) ((f)<<1) /* SHORTER -> MIXED */ -#define UP(f) (((f)&~LOCAL) | (LMIX(f) & SMIX(f) & MIXED)) -#define MESSY(f) ((f)&(MIXED|CAP|BACKR)) -#define PREF(f) ((f)&LOCAL) -#define PREF2(f1, f2) ((PREF(f1) != 0) ? PREF(f1) : PREF(f2)) -#define COMBINE(f1, f2) (UP((f1)|(f2)) | PREF2(f1, f2)) - short retry; /* index into retry memory */ - int subno; /* subexpression number (for 'b' and '(') */ - short min; /* min repetitions, for backref only */ - short max; /* max repetitions, for backref only */ - struct subre *left; /* left child, if any (also freelist - * chain) */ - struct subre *right; /* right child, if any */ - struct state *begin; /* outarcs from here... */ - struct state *end; /* ...ending in inarcs here */ - struct cnfa cnfa; /* compacted NFA, if any */ - struct subre *chain; /* for bookkeeping and error cleanup */ -}; - - - -/* - * table of function pointers for generic manipulation functions - * A regex_t's re_fns points to one of these. - */ -struct fns -{ - void FUNCPTR(free, (regex_t *)); -}; - - - -/* - * the insides of a regex_t, hidden behind a void * - */ -struct guts -{ - int magic; -#define GUTSMAGIC 0xfed9 - int cflags; /* copy of compile flags */ - long info; /* copy of re_info */ - size_t nsub; /* copy of re_nsub */ - struct subre *tree; - struct cnfa search; /* for fast preliminary search */ - int ntree; - struct colormap cmap; - int FUNCPTR(compare, (const chr *, const chr *, size_t)); - struct subre *lacons; /* lookahead-constraint vector */ - int nlacons; /* size of lacons */ -}; diff --git a/src/regex/split.c b/src/regex/split.c new file mode 100644 index 0000000000..188bdb775b --- /dev/null +++ b/src/regex/split.c @@ -0,0 +1,316 @@ +#include +#include + +/* + - split - divide a string into fields, like awk split() + = int split(char *string, char *fields[], int nfields, char *sep); + */ +int /* number of fields, including overflow */ +split(string, fields, nfields, sep) +char *string; +char *fields[]; /* list is not NULL-terminated */ +int nfields; /* number of entries available in fields[] */ +char *sep; /* "" white, "c" single char, "ab" [ab]+ */ +{ + register char *p = string; + register char c; /* latest character */ + register char sepc = sep[0]; + register char sepc2; + register int fn; + register char **fp = fields; + register char *sepp; + register int trimtrail; + + /* white space */ + if (sepc == '\0') { + while ((c = *p++) == ' ' || c == '\t') + continue; + p--; + trimtrail = 1; + sep = " \t"; /* note, code below knows this is 2 long */ + sepc = ' '; + } else + trimtrail = 0; + sepc2 = sep[1]; /* now we can safely pick this up */ + + /* catch empties */ + if (*p == '\0') + return(0); + + /* single separator */ + if (sepc2 == '\0') { + fn = nfields; + for (;;) { + *fp++ = p; + fn--; + if (fn == 0) + break; + while ((c = *p++) != sepc) + if (c == '\0') + return(nfields - fn); + *(p-1) = '\0'; + } + /* we have overflowed the fields vector -- just count them */ + fn = nfields; + for (;;) { + while ((c = *p++) != sepc) + if (c == '\0') + return(fn); + fn++; + } + /* not reached */ + } + + /* two separators */ + if (sep[2] == '\0') { + fn = nfields; + for (;;) { + *fp++ = p; + fn--; + while ((c = *p++) != sepc && c != sepc2) + if (c == '\0') { + if (trimtrail && **(fp-1) == '\0') + fn++; + return(nfields - fn); + } + if (fn == 0) + break; + *(p-1) = '\0'; + while ((c = *p++) == sepc || c == sepc2) + continue; + p--; + } + /* we have overflowed the fields vector -- just count them */ + fn = nfields; + while (c != '\0') { + while ((c = *p++) == sepc || c == sepc2) + continue; + p--; + fn++; + while ((c = *p++) != '\0' && c != sepc && c != sepc2) + continue; + } + /* might have to trim trailing white space */ + if (trimtrail) { + p--; + while ((c = *--p) == sepc || c == sepc2) + continue; + p++; + if (*p != '\0') { + if (fn == nfields+1) + *p = '\0'; + fn--; + } + } + return(fn); + } + + /* n separators */ + fn = 0; + for (;;) { + if (fn < nfields) + *fp++ = p; + fn++; + for (;;) { + c = *p++; + if (c == '\0') + return(fn); + sepp = sep; + while ((sepc = *sepp++) != '\0' && sepc != c) + continue; + if (sepc != '\0') /* it was a separator */ + break; + } + if (fn < nfields) + *(p-1) = '\0'; + for (;;) { + c = *p++; + sepp = sep; + while ((sepc = *sepp++) != '\0' && sepc != c) + continue; + if (sepc == '\0') /* it wasn't a separator */ + break; + } + p--; + } + + /* not reached */ +} + +#ifdef TEST_SPLIT + + +/* + * test program + * pgm runs regression + * pgm sep splits stdin lines by sep + * pgm str sep splits str by sep + * pgm str sep n splits str by sep n times + */ +int +main(argc, argv) +int argc; +char *argv[]; +{ + char buf[512]; + register int n; +# define MNF 10 + char *fields[MNF]; + + if (argc > 4) + for (n = atoi(argv[3]); n > 0; n--) { + (void) strcpy(buf, argv[1]); + } + else if (argc > 3) + for (n = atoi(argv[3]); n > 0; n--) { + (void) strcpy(buf, argv[1]); + (void) split(buf, fields, MNF, argv[2]); + } + else if (argc > 2) + dosplit(argv[1], argv[2]); + else if (argc > 1) + while (fgets(buf, sizeof(buf), stdin) != NULL) { + buf[strlen(buf)-1] = '\0'; /* stomp newline */ + dosplit(buf, argv[1]); + } + else + regress(); + + exit(0); +} + +dosplit(string, seps) +char *string; +char *seps; +{ +# define NF 5 + char *fields[NF]; + register int nf; + + nf = split(string, fields, NF, seps); + print(nf, NF, fields); +} + +print(nf, nfp, fields) +int nf; +int nfp; +char *fields[]; +{ + register int fn; + register int bound; + + bound = (nf > nfp) ? nfp : nf; + printf("%d:\t", nf); + for (fn = 0; fn < bound; fn++) + printf("\"%s\"%s", fields[fn], (fn+1 < nf) ? ", " : "\n"); +} + +#define RNF 5 /* some table entries know this */ +struct { + char *str; + char *seps; + int nf; + char *fi[RNF]; +} tests[] = { + "", " ", 0, { "" }, + " ", " ", 2, { "", "" }, + "x", " ", 1, { "x" }, + "xy", " ", 1, { "xy" }, + "x y", " ", 2, { "x", "y" }, + "abc def g ", " ", 5, { "abc", "def", "", "g", "" }, + " a bcd", " ", 4, { "", "", "a", "bcd" }, + "a b c d e f", " ", 6, { "a", "b", "c", "d", "e f" }, + " a b c d ", " ", 6, { "", "a", "b", "c", "d " }, + + "", " _", 0, { "" }, + " ", " _", 2, { "", "" }, + "x", " _", 1, { "x" }, + "x y", " _", 2, { "x", "y" }, + "ab _ cd", " _", 2, { "ab", "cd" }, + " a_b c ", " _", 5, { "", "a", "b", "c", "" }, + "a b c_d e f", " _", 6, { "a", "b", "c", "d", "e f" }, + " a b c d ", " _", 6, { "", "a", "b", "c", "d " }, + + "", " _~", 0, { "" }, + " ", " _~", 2, { "", "" }, + "x", " _~", 1, { "x" }, + "x y", " _~", 2, { "x", "y" }, + "ab _~ cd", " _~", 2, { "ab", "cd" }, + " a_b c~", " _~", 5, { "", "a", "b", "c", "" }, + "a b_c d~e f", " _~", 6, { "a", "b", "c", "d", "e f" }, + "~a b c d ", " _~", 6, { "", "a", "b", "c", "d " }, + + "", " _~-", 0, { "" }, + " ", " _~-", 2, { "", "" }, + "x", " _~-", 1, { "x" }, + "x y", " _~-", 2, { "x", "y" }, + "ab _~- cd", " _~-", 2, { "ab", "cd" }, + " a_b c~", " _~-", 5, { "", "a", "b", "c", "" }, + "a b_c-d~e f", " _~-", 6, { "a", "b", "c", "d", "e f" }, + "~a-b c d ", " _~-", 6, { "", "a", "b", "c", "d " }, + + "", " ", 0, { "" }, + " ", " ", 2, { "", "" }, + "x", " ", 1, { "x" }, + "xy", " ", 1, { "xy" }, + "x y", " ", 2, { "x", "y" }, + "abc def g ", " ", 4, { "abc", "def", "g", "" }, + " a bcd", " ", 3, { "", "a", "bcd" }, + "a b c d e f", " ", 6, { "a", "b", "c", "d", "e f" }, + " a b c d ", " ", 6, { "", "a", "b", "c", "d " }, + + "", "", 0, { "" }, + " ", "", 0, { "" }, + "x", "", 1, { "x" }, + "xy", "", 1, { "xy" }, + "x y", "", 2, { "x", "y" }, + "abc def g ", "", 3, { "abc", "def", "g" }, + "\t a bcd", "", 2, { "a", "bcd" }, + " a \tb\t c ", "", 3, { "a", "b", "c" }, + "a b c d e ", "", 5, { "a", "b", "c", "d", "e" }, + "a b\tc d e f", "", 6, { "a", "b", "c", "d", "e f" }, + " a b c d e f ", "", 6, { "a", "b", "c", "d", "e f " }, + + NULL, NULL, 0, { NULL }, +}; + +regress() +{ + char buf[512]; + register int n; + char *fields[RNF+1]; + register int nf; + register int i; + register int printit; + register char *f; + + for (n = 0; tests[n].str != NULL; n++) { + (void) strcpy(buf, tests[n].str); + fields[RNF] = NULL; + nf = split(buf, fields, RNF, tests[n].seps); + printit = 0; + if (nf != tests[n].nf) { + printf("split `%s' by `%s' gave %d fields, not %d\n", + tests[n].str, tests[n].seps, nf, tests[n].nf); + printit = 1; + } else if (fields[RNF] != NULL) { + printf("split() went beyond array end\n"); + printit = 1; + } else { + for (i = 0; i < nf && i < RNF; i++) { + f = fields[i]; + if (f == NULL) + f = "(NULL)"; + if (strcmp(f, tests[n].fi[i]) != 0) { + printf("split `%s' by `%s', field %d is `%s', not `%s'\n", + tests[n].str, tests[n].seps, + i, fields[i], tests[n].fi[i]); + printit = 1; + } + } + } + if (printit) + print(nf, RNF, fields); + } +} +#endif diff --git a/src/regex/tclUniData.c b/src/regex/tclUniData.c deleted file mode 100644 index 9f0c6e05ae..0000000000 --- a/src/regex/tclUniData.c +++ /dev/null @@ -1,904 +0,0 @@ -/* - * tclUniData.c -- - * - * Declarations of Unicode character information tables. This file is - * automatically generated by the tools/uniParse.tcl script. Do not - * modify this file by hand. - * - * Copyright (c) 1998 by Scriptics Corporation. - * All rights reserved. - * - * RCS: @(#) $Id$ - */ - -/* - * A 16-bit Unicode character is split into two parts in order to index - * into the following tables. The lower OFFSET_BITS comprise an offset - * into a page of characters. The upper bits comprise the page number. - */ - -#define OFFSET_BITS 5 - -/* - * The pageMap is indexed by page number and returns an alternate page number - * that identifies a unique page of characters. Many Unicode characters map - * to the same alternate page number. - */ - -static unsigned char pageMap[] = { - 0, 1, 2, 3, 0, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 7, 15, 16, 17, - 18, 19, 20, 21, 22, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 7, 32, - 7, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 47, - 48, 49, 50, 51, 52, 35, 47, 53, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, - 58, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 80, 81, - 84, 85, 80, 86, 87, 88, 89, 90, 91, 92, 35, 93, 94, 95, 35, 96, 97, - 98, 99, 100, 101, 102, 35, 47, 103, 104, 35, 35, 105, 106, 107, 47, - 47, 108, 47, 47, 109, 47, 110, 111, 47, 112, 47, 113, 114, 115, 116, - 114, 47, 117, 118, 35, 47, 47, 119, 90, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 120, 121, 47, 47, 122, - 35, 35, 35, 35, 47, 123, 124, 125, 126, 47, 127, 128, 47, 129, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 7, 7, 7, 7, 130, 7, 7, 131, 132, 133, 134, - 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, - 149, 150, 151, 152, 153, 154, 155, 156, 156, 156, 156, 156, 156, 156, - 157, 158, 159, 160, 161, 162, 35, 35, 35, 160, 163, 164, 165, 166, - 167, 168, 169, 160, 160, 160, 160, 170, 171, 172, 173, 174, 160, 160, - 175, 35, 35, 35, 35, 176, 177, 178, 179, 180, 181, 35, 35, 160, 160, - 160, 160, 160, 160, 160, 160, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 182, 160, 160, 155, 160, 160, 160, 160, 160, 160, 170, 183, 184, 185, - 90, 47, 186, 90, 47, 187, 188, 189, 47, 47, 190, 128, 35, 35, 191, - 192, 193, 194, 192, 195, 196, 197, 160, 160, 160, 198, 160, 160, 199, - 197, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 200, 35, 35, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 201, 35, 35, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 202, 203, 204, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 205, 35, 35, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, - 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, - 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, - 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, - 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 206, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 47, 47, 47, 47, 47, 47, 47, 47, 47, 208, 35, 35, 35, 35, - 35, 35, 209, 210, 211, 47, 47, 212, 213, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 214, 215, 47, 216, 47, 217, 218, 35, 219, 220, 221, 47, - 47, 47, 222, 223, 2, 224, 225, 226, 227, 228, 229, 230, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 231, 35, 232, 233, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 208, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 47, 234, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 235, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, 207, - 207, 207, 207, 236, 207, 207, 207, 207, 207, 207, 207, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35 -}; - -/* - * The groupMap is indexed by combining the alternate page number with - * the page offset and returns a group number that identifies a unique - * set of character attributes. - */ - -static unsigned char groupMap[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 3, 3, 4, 3, 3, 3, 5, 6, 3, 7, 3, 8, - 3, 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 7, 7, 7, 3, 3, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 5, 3, 6, 11, 12, 11, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 5, 7, 6, 7, 1, 2, 3, 4, 4, 4, 4, 14, 14, 11, 14, 15, 16, - 7, 8, 14, 11, 14, 7, 17, 17, 11, 18, 14, 3, 11, 17, 15, 19, 17, 17, - 17, 3, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 7, 10, 10, 10, 10, 10, 10, 10, 15, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 7, 13, 13, 13, 13, 13, 13, 13, 20, 21, 22, - 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, - 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, - 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 23, 24, 21, 22, 21, - 22, 21, 22, 15, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, - 22, 21, 22, 15, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, - 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, - 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 25, - 21, 22, 21, 22, 21, 22, 26, 15, 27, 21, 22, 21, 22, 28, 21, 22, 29, - 29, 21, 22, 15, 30, 31, 32, 21, 22, 29, 33, 34, 35, 36, 21, 22, 15, - 15, 35, 37, 15, 38, 21, 22, 21, 22, 21, 22, 39, 21, 22, 39, 15, 15, - 21, 22, 39, 21, 22, 40, 40, 21, 22, 21, 22, 41, 21, 22, 15, 42, 21, - 22, 15, 43, 42, 42, 42, 42, 44, 45, 46, 44, 45, 46, 44, 45, 46, 21, - 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 47, 21, - 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, - 15, 44, 45, 46, 21, 22, 48, 49, 21, 22, 21, 22, 21, 22, 21, 22, 0, - 0, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, - 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 50, 51, 15, 52, 52, 15, 53, 15, - 54, 15, 15, 15, 15, 52, 15, 15, 55, 15, 15, 15, 15, 56, 57, 15, 15, - 15, 15, 15, 57, 15, 15, 58, 15, 15, 59, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 60, 15, 15, 60, 15, 15, 15, 15, 60, 15, 61, 61, 15, 15, - 15, 15, 15, 15, 62, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 63, - 63, 63, 63, 63, 63, 63, 63, 63, 11, 11, 63, 63, 63, 63, 63, 63, 63, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 63, 63, 11, - 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 63, 63, 63, 63, - 63, 11, 11, 11, 11, 11, 11, 11, 11, 11, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 65, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, - 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 11, - 0, 0, 0, 0, 63, 0, 0, 0, 3, 0, 0, 0, 0, 0, 11, 11, 66, 3, 67, 67, 67, - 0, 68, 0, 69, 69, 15, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 0, 10, 10, 10, 10, 10, 10, 10, 10, 10, 70, 71, - 71, 71, 15, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 72, 13, 13, 13, 13, 13, 13, 13, 13, 13, 73, 74, 74, 0, - 75, 76, 77, 77, 77, 78, 79, 15, 0, 0, 21, 22, 21, 22, 21, 22, 21, 22, - 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 80, 81, 47, - 15, 82, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 21, 22, 14, 64, 64, 64, 64, 0, 85, 85, 0, 0, 21, 22, - 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, - 22, 77, 21, 22, 21, 22, 0, 0, 21, 22, 0, 0, 21, 22, 0, 0, 0, 21, 22, - 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, - 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, - 21, 22, 0, 0, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, - 0, 0, 63, 3, 3, 3, 3, 3, 3, 0, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 15, 0, 3, 8, 0, 0, - 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 64, 64, 3, 64, 3, 64, - 64, 3, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 0, 0, 0, 0, 0, 42, 42, 42, 3, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 3, 0, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 0, 0, 0, 0, 0, 63, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, 3, 3, 3, 0, 0, 64, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 3, 42, 64, - 64, 64, 64, 64, 64, 64, 85, 85, 64, 64, 64, 64, 64, 64, 63, 63, 64, - 64, 14, 64, 64, 64, 64, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 42, 42, - 42, 14, 14, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 88, 42, - 64, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, - 64, 89, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 0, 0, 64, 42, 89, 89, 89, 64, 64, 64, 64, 64, 64, - 64, 64, 89, 89, 89, 89, 64, 0, 0, 42, 64, 64, 64, 64, 0, 0, 0, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 64, 64, 3, 3, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, - 89, 89, 0, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 42, 42, 0, 0, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 0, 42, 0, 0, 0, 42, - 42, 42, 42, 0, 0, 64, 0, 89, 89, 89, 64, 64, 64, 64, 0, 0, 89, 89, - 0, 0, 89, 89, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 42, 42, - 0, 42, 42, 42, 64, 64, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 42, 42, - 4, 4, 17, 17, 17, 17, 17, 17, 14, 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 42, - 42, 42, 42, 42, 42, 0, 0, 0, 0, 42, 42, 0, 0, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, - 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 0, 42, 42, 0, 42, 42, 0, 0, - 64, 0, 89, 89, 89, 64, 64, 0, 0, 0, 0, 64, 64, 0, 0, 64, 64, 64, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 0, 42, 0, 0, 0, 0, 0, - 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 64, 64, 42, 42, 42, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 89, 0, 42, 42, 42, 42, 42, 42, 42, - 0, 42, 0, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 42, 42, - 42, 42, 0, 42, 42, 0, 42, 42, 42, 42, 42, 0, 0, 64, 42, 89, 89, 89, - 64, 64, 64, 64, 64, 0, 64, 64, 89, 0, 89, 89, 64, 0, 0, 42, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 0, 42, - 42, 0, 0, 42, 42, 42, 42, 0, 0, 64, 42, 89, 64, 89, 64, 64, 64, 0, - 0, 0, 89, 89, 0, 0, 89, 89, 64, 0, 0, 0, 0, 0, 0, 0, 0, 64, 89, 0, - 0, 0, 0, 42, 42, 0, 42, 42, 42, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 89, - 0, 42, 42, 42, 42, 42, 42, 0, 0, 0, 42, 42, 42, 0, 42, 42, 42, 42, - 0, 0, 0, 42, 42, 0, 42, 0, 42, 42, 0, 0, 0, 42, 42, 0, 0, 0, 42, 42, - 42, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 0, 0, 0, - 0, 89, 89, 64, 89, 89, 0, 0, 0, 89, 89, 89, 0, 89, 89, 89, 64, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 17, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 89, 89, 89, 0, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, - 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 0, 42, 42, 42, 42, 42, 0, 0, 0, 0, 64, 64, 64, 89, 89, - 89, 89, 0, 64, 64, 64, 0, 64, 64, 64, 64, 0, 0, 0, 0, 0, 0, 0, 64, - 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, - 89, 0, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 0, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, - 42, 42, 0, 0, 0, 0, 89, 64, 89, 89, 89, 89, 89, 0, 64, 89, 89, 0, 89, - 89, 64, 64, 0, 0, 0, 0, 0, 0, 0, 89, 89, 0, 0, 0, 0, 0, 0, 0, 42, 0, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 89, 89, 89, 64, 64, - 64, 0, 0, 89, 89, 89, 0, 89, 89, 89, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 89, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 89, 0, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 0, 0, - 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 64, 0, 0, 0, 0, 89, 89, 89, 64, - 64, 64, 0, 64, 0, 89, 89, 89, 89, 89, 89, 89, 89, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 89, 89, 3, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 64, 42, 42, 64, 64, 64, 64, 64, 64, 64, 0, 0, 0, 0, 4, 42, 42, - 42, 42, 42, 42, 63, 64, 64, 64, 64, 64, 64, 64, 64, 3, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 3, 3, 0, 0, 0, 0, 0, 42, 42, 0, 42, 0, 0, 42, 42, - 0, 42, 0, 0, 42, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 0, 42, 42, 42, 42, - 42, 42, 42, 0, 42, 42, 42, 0, 42, 0, 42, 0, 0, 42, 42, 0, 42, 42, 42, - 42, 64, 42, 42, 64, 64, 64, 64, 64, 64, 0, 64, 64, 42, 0, 0, 42, 42, - 42, 42, 42, 0, 63, 0, 64, 64, 64, 64, 64, 64, 0, 0, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 0, 0, 42, 42, 0, 0, 42, 14, 14, 14, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 14, 14, 14, 14, 14, 64, 64, 14, 14, 14, - 14, 14, 14, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 14, 64, 14, 64, 14, 64, 5, 6, 5, 6, 89, 89, 42, 42, 42, - 42, 42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 89, 64, 64, 64, 64, 64, 3, 64, 64, 42, - 42, 42, 42, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 0, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 0, 14, 14, 14, 14, 14, 14, 14, 14, 64, 14, 14, 14, 14, 14, 14, 0, 0, - 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 0, 42, - 42, 42, 42, 42, 0, 42, 42, 0, 89, 64, 64, 64, 64, 89, 64, 0, 0, 0, - 64, 64, 89, 64, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 3, - 3, 3, 3, 3, 3, 42, 42, 42, 42, 42, 42, 89, 89, 64, 64, 0, 0, 0, 0, - 0, 0, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 77, 77, 77, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 0, 0, 0, 0, 3, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, - 0, 0, 0, 0, 42, 42, 42, 42, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 42, 42, 42, - 42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 0, 42, 0, 42, 42, 42, 42, 0, 0, 42, 42, 42, 42, 42, 42, 42, - 0, 42, 0, 42, 42, 42, 42, 0, 0, 42, 42, 42, 42, 42, 42, 42, 0, 42, - 0, 42, 42, 42, 42, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 0, 42, 0, 42, 42, 42, 42, 0, 0, 42, 42, 42, 42, 42, 42, - 42, 0, 42, 0, 42, 42, 42, 42, 0, 0, 42, 42, 42, 42, 42, 42, 42, 0, - 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, - 3, 9, 9, 9, 9, 9, 9, 9, 9, 9, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 3, 3, 42, 42, 42, 42, 42, - 42, 42, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 5, 6, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 3, 3, 3, 90, 90, 90, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 89, 89, 89, 64, 64, 64, 64, 64, 64, 64, 89, 89, 89, 89, 89, - 89, 89, 89, 64, 89, 89, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 3, 3, 3, 3, 3, 3, 3, 4, 3, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 3, - 3, 3, 3, 3, 8, 3, 3, 3, 3, 88, 88, 88, 88, 0, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 0, 0, 0, 0, 0, 0, 42, 42, 42, 63, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 0, - 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 64, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 22, 21, 22, 21, 22, 21, - 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 15, 15, - 15, 15, 15, 91, 0, 0, 0, 0, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, - 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 21, 22, 0, - 0, 0, 0, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, - 93, 93, 93, 92, 92, 92, 92, 92, 92, 0, 0, 93, 93, 93, 93, 93, 93, 0, - 0, 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, - 92, 92, 92, 92, 92, 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 92, - 92, 92, 92, 92, 92, 0, 0, 93, 93, 93, 93, 93, 93, 0, 0, 15, 92, 15, - 92, 15, 92, 15, 92, 0, 93, 0, 93, 0, 93, 0, 93, 92, 92, 92, 92, 92, - 92, 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 94, 94, 95, 95, 95, 95, - 96, 96, 97, 97, 98, 98, 99, 99, 0, 0, 92, 92, 92, 92, 92, 92, 92, 92, - 100, 100, 100, 100, 100, 100, 100, 100, 92, 92, 92, 92, 92, 92, 92, - 92, 100, 100, 100, 100, 100, 100, 100, 100, 92, 92, 92, 92, 92, 92, - 92, 92, 100, 100, 100, 100, 100, 100, 100, 100, 92, 92, 15, 101, 15, - 0, 15, 15, 93, 93, 102, 102, 103, 11, 104, 11, 11, 11, 15, 101, 15, - 0, 15, 15, 105, 105, 105, 105, 103, 11, 11, 11, 92, 92, 15, 15, 0, - 0, 15, 15, 93, 93, 106, 106, 0, 11, 11, 11, 92, 92, 15, 15, 15, 107, - 15, 15, 93, 93, 108, 108, 109, 11, 11, 11, 0, 0, 15, 101, 15, 0, 15, - 15, 110, 110, 111, 111, 103, 11, 11, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 88, 88, 88, 88, 8, 8, 8, 8, 8, 8, 3, 3, 16, 19, 5, 16, 16, - 19, 5, 16, 3, 3, 3, 3, 3, 3, 3, 3, 112, 113, 88, 88, 88, 88, 88, 2, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 16, 19, 3, 3, 3, 3, 12, 12, 3, 3, 3, 7, - 5, 6, 0, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 88, 88, 88, 88, 88, 17, - 0, 0, 0, 17, 17, 17, 17, 17, 17, 7, 7, 7, 5, 6, 15, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 7, 7, 7, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 85, 85, 85, 85, 64, 85, 85, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 77, - 14, 14, 14, 14, 77, 14, 14, 15, 77, 77, 77, 15, 15, 77, 77, 77, 15, - 14, 77, 14, 14, 14, 77, 77, 77, 77, 77, 14, 14, 14, 14, 14, 14, 77, - 14, 114, 14, 77, 14, 115, 116, 77, 77, 14, 15, 77, 77, 14, 77, 15, - 42, 42, 42, 42, 15, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, 117, - 117, 117, 117, 117, 117, 118, 118, 118, 118, 118, 118, 118, 118, 118, - 118, 118, 118, 118, 118, 118, 118, 90, 90, 90, 90, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 14, 14, 14, 14, 14, 7, 7, 14, 14, - 14, 14, 7, 14, 14, 7, 14, 14, 7, 14, 14, 14, 14, 14, 14, 14, 7, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 14, 14, 7, - 14, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 7, 7, 7, 7, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 7, 7, 14, 14, 14, 14, 14, 14, 14, 5, 6, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, 119, - 119, 119, 119, 119, 119, 119, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 7, 14, 14, 14, 14, 14, 14, 14, 14, 14, 7, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 7, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, - 14, 14, 14, 0, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 0, 14, 0, 14, 14, 14, 14, 0, 0, 0, 14, 0, 14, 14, - 14, 14, 14, 14, 14, 0, 0, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 14, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 0, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, - 0, 0, 0, 2, 3, 3, 3, 14, 63, 42, 90, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, - 14, 14, 5, 6, 5, 6, 5, 6, 5, 6, 8, 5, 6, 6, 14, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 64, 64, 64, 64, 64, 64, 8, 63, 63, 63, 63, 63, 14, - 14, 90, 90, 90, 0, 0, 0, 14, 14, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 64, 64, - 11, 11, 63, 63, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 12, 63, - 63, 63, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 14, 14, 17, 17, 17, - 17, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 0, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 0, 14, 14, 14, 0, 14, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 42, 42, 42, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 121, 121, 121, 121, 121, 121, 121, - 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, - 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 121, 122, 122, 122, - 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, - 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, - 122, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, - 15, 15, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 15, 15, 15, 15, 0, - 0, 0, 0, 0, 42, 64, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 7, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 42, 42, 42, 42, - 42, 0, 42, 0, 42, 42, 0, 42, 42, 0, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, 0, 64, 64, 64, 64, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 8, 8, 12, 12, 5, 6, 5, 6, 5, - 6, 5, 6, 5, 6, 5, 6, 5, 6, 5, 6, 0, 0, 0, 0, 3, 3, 3, 3, 12, 12, 12, - 3, 3, 3, 0, 3, 3, 3, 3, 8, 5, 6, 5, 6, 5, 6, 3, 3, 3, 7, 8, 7, 7, 7, - 0, 3, 4, 3, 3, 0, 0, 0, 0, 42, 42, 42, 0, 42, 0, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 0, 0, 88, 0, 3, 3, 3, 4, 3, 3, 3, 5, 6, 3, 7, 3, 8, 3, 3, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 3, 3, 7, 7, 7, 3, 11, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 5, 7, 6, 7, 0, 0, 3, 5, 6, 3, 12, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 63, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 63, - 63, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 0, 0, 0, - 42, 42, 42, 42, 42, 42, 0, 0, 42, 42, 42, 42, 42, 42, 0, 0, 42, 42, - 42, 42, 42, 42, 0, 0, 42, 42, 42, 0, 0, 0, 4, 4, 7, 11, 14, 4, 4, 0, - 14, 7, 7, 7, 7, 14, 14, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 88, 88, 88, 14, - 14, 42, 17, 42, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 123, 123, 123, - 126, 126, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 89, 64, 14, 14, 14, - 14, 14, 0, 0, 77, 77, 15, 15, 77, 15, 15, 77, 77, 15, 77, 77, 15, 77, - 77, 15, 15, 77, 15, 15, 77, 77, 15, 77, 77, 15, 77, 77, 15, 15, 77, - 15, 15, 77, 77, 15, 77, 77, 15, 77, 77, 15, 15, 77, 77, 15, 15, 77, - 15, 15, 77, 77, 15, 15, 77, 15, 15, 77, 77, 15, 15, 9, 9, 9, 42, 42, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 88, 0, 88, 88, 88, 88, 88, 88, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 122, 122, - 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, - 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, - 122 -}; - -/* - * Each group represents a unique set of character attributes. The attributes - * are encoded into a 32-bit value as follows: - * - * Bits 0-4 Character category: see the constants listed below. - * - * Bits 5-7 Case delta type: 000 = identity - * 010 = add delta for lower - * 011 = add delta for lower, add 1 for title - * 100 = sutract delta for title/upper - * 101 = sub delta for upper, sub 1 for title - * 110 = sub delta for upper, add delta for lower - * - * Bits 8-21 Reserved for future use. - * - * Bits 22-31 Case delta: delta for case conversions. This should be the - * highest field so we can easily sign extend. - */ - -static int groups[] = { - 0, 15, 12, 25, 27, 21, 22, 26, 20, 9, 134217793, 28, 19, 134217858, - 29, 2, 23, 11, 1178599554, 24, -507510654, 4194369, 4194434, -834666431, - 973078658, -507510719, 1258291330, 880803905, 864026689, 859832385, - 331350081, 847249473, 851443777, 868220993, -406847358, 884998209, - 876609601, 893386817, 897581121, 914358337, 910164033, 918552641, - 5, -234880894, 8388705, 4194499, 8388770, 331350146, -406847423, - -234880959, 880803970, 864026754, 859832450, 847249538, 851443842, - 868221058, 876609666, 884998274, 893386882, 897581186, 914358402, - 910164098, 918552706, 4, 6, -352321402, 159383617, 155189313, - 268435521, 264241217, 159383682, 155189378, 130023554, 268435586, - 264241282, 260046978, 239075458, 1, 197132418, 226492546, 360710274, - 335544450, -251658175, 402653314, 335544385, 7, 201326657, 201326722, - 16, 8, 10, 247464066, -33554302, -33554367, -310378366, -360710014, - -419430270, -536870782, -469761918, -528482174, -33554365, -37748606, - -310378431, -37748669, 155189378, -360710079, -419430335, -29359998, - -469761983, -29360063, -536870847, -528482239, 13, 14, -1463812031, - -801111999, -293601215, 67108938, 67109002, 109051997, 109052061, - 18, 17, 8388673, 12582977, 8388738, 12583042 -}; - -/* - * The following constants are used to determine the category of a - * Unicode character. - */ - -#define UNICODE_CATEGORY_MASK 0X1F - -enum { - UNASSIGNED, - UPPERCASE_LETTER, - LOWERCASE_LETTER, - TITLECASE_LETTER, - MODIFIER_LETTER, - OTHER_LETTER, - NON_SPACING_MARK, - ENCLOSING_MARK, - COMBINING_SPACING_MARK, - DECIMAL_DIGIT_NUMBER, - LETTER_NUMBER, - OTHER_NUMBER, - SPACE_SEPARATOR, - LINE_SEPARATOR, - PARAGRAPH_SEPARATOR, - CONTROL, - FORMAT, - PRIVATE_USE, - SURROGATE, - CONNECTOR_PUNCTUATION, - DASH_PUNCTUATION, - OPEN_PUNCTUATION, - CLOSE_PUNCTUATION, - INITIAL_QUOTE_PUNCTUATION, - FINAL_QUOTE_PUNCTUATION, - OTHER_PUNCTUATION, - MATH_SYMBOL, - CURRENCY_SYMBOL, - MODIFIER_SYMBOL, - OTHER_SYMBOL -}; - -/* - * The following macros extract the fields of the character info. The - * GetDelta() macro is complicated because we can't rely on the C compiler - * to do sign extension on right shifts. - */ - -#define GetCaseType(info) (((info) & 0xE0) >> 5) -#define GetCategory(info) ((info) & 0x1F) -#define GetDelta(info) (((info) > 0) ? ((info) >> 22) : (~(~((info)) >> 22))) - -/* - * This macro extracts the information about a character from the - * Unicode character tables. - */ - -#define GetUniCharInfo(ch) (groups[groupMap[(pageMap[(((int)(ch)) & 0xffff) >> OFFSET_BITS] << OFFSET_BITS) | ((ch) & ((1 << OFFSET_BITS)-1))]]) - diff --git a/src/regex/utils.h b/src/regex/utils.h new file mode 100644 index 0000000000..1a997ac8fc --- /dev/null +++ b/src/regex/utils.h @@ -0,0 +1,22 @@ +/* utility definitions */ +#ifdef _POSIX2_RE_DUP_MAX +#define DUPMAX _POSIX2_RE_DUP_MAX +#else +#define DUPMAX 255 +#endif +#define INFINITY (DUPMAX + 1) +#define NC (CHAR_MAX - CHAR_MIN + 1) +typedef unsigned char uch; + +/* switch off assertions (if not already off) if no REDEBUG */ +#ifndef REDEBUG +#ifndef NDEBUG +#define NDEBUG /* no assertions please */ +#endif +#endif +#include + +/* for old systems with bcopy() but no memmove() */ +#ifdef USEBCOPY +#define memmove(d, s, c) bcopy(s, d, c) +#endif diff --git a/utils/wxPython/src/makefile.nt b/utils/wxPython/src/makefile.nt new file mode 100644 index 0000000000..42d9af86b7 --- /dev/null +++ b/utils/wxPython/src/makefile.nt @@ -0,0 +1,339 @@ +#---------------------------------------------------------------------------- +# Name: makefile.nt +# Purpose: Win32, VC++ 5 makefile for wxPython +# +# Author: Robin Dunn +# +# Created: 3/27/97 +# RCS-ID: $Id$ +# Copyright: (c) 1998 by Total Control Software +# Licence: wxWindows license +#---------------------------------------------------------------------------- +VERSION=0.5.4 + +# Set WXDIR to the root wxWindows directory for your system +WXDIR = $(WXWIN) + +# Set this to the root of the Python installation +PYTHONDIR=d:\Python + +# Set this to 1 for a non-debug, optimised compile +FINAL=0 + +# Set this to where you want the stuff installed at. It should +# be a directory contained in a PYTHONPATH directory, and should be +# named wxPython +TARGETDIR=.. + +# Set this to 1 for make to pre-compile the Python modules, 0 to +# just copy the sources and let Python compile them at the first +# runtime. +COMPILEPY=0 + +SEPARATE=0 + +#---------------------------------------------------------------------- + +WXUSINGDLL=0 +NOPCH=1 +THISDIR=$(WXDIR)\utils\wxPython + +EXTRALIBS=$(PYTHONDIR)\libs\python15.lib +EXTRAINC=-I$(PYTHONDIR)\include -I. +EXTRAFLAGS=/Fpwxp.pch /YXhelpers.h -DSWIG_GLOBAL -DHAVE_CONFIG_H +OVERRIDEFLAGS=/GX- + + +SWIGFLAGS=-c++ -shadow -python -dnone -D__WXMSW__ +GENCODEDIR=msw + + +!include $(WXDIR)\src\ntwxwin.mak + +#---------------------------------------------------------------------- + +TARGET = wxc + +OBJECTS = wx.obj helpers.obj windows.obj events.obj \ + misc.obj gdi.obj mdi.obj controls.obj \ + controls2.obj windows2.obj cmndlgs.obj stattool.obj \ + frames.obj windows3.obj \ +!if "$(SEPARATE)" == "0" + utils.obj +!else + +TARGET2 = utilsc +OBJECTS2 = utils.obj +target2=$(TARGETDIR)\$(TARGET2).pyd +!endif + +PYMODULES = $(TARGETDIR)\wx.py $(TARGETDIR)\events.py \ + $(TARGETDIR)\windows.py $(TARGETDIR)\misc.py \ + $(TARGETDIR)\gdi.py $(TARGETDIR)\mdi.py \ + $(TARGETDIR)\controls.py $(TARGETDIR)\controls2.py \ + $(TARGETDIR)\windows2.py $(TARGETDIR)\cmndlgs.py \ + $(TARGETDIR)\stattool.py $(TARGETDIR)\frames.py \ + $(TARGETDIR)\utils.py $(TARGETDIR)\windows3.py \ + $(TARGETDIR)\__init__.py + + +#---------------------------------------------------------------------- + +!if "$(FINAL)" == "0" +DEBUGLFLAGS = /DEBUG /INCREMENTAL:YES +!else +DEBUGLFLAGS = /INCREMENTAL:NO +!endif + +LFLAGS= $(DEBUGLFLAGS) /DLL /def:$(TARGET).def /subsystem:windows,3.50 \ + /machine:I386 /implib:./$(TARGET).lib /nologo + +LFLAGS2=$(DEBUGLFLAGS) /DLL /def:$(TARGET2).def /subsystem:windows,3.50 \ + /machine:I386 /implib:./$(TARGET2).lib /nologo + +#---------------------------------------------------------------------- + +default: $(TARGETDIR)\$(TARGET).pyd $(target2) pycfiles + +all: wx $(TARGET) $(TARGET2) + +wx: + cd $(WXDIR)\src\msw + nmake -f makefile.nt FINAL=$(FINAL) + cd $(THISDIR) + +wxclean: + cd $(WXDIR)\src\msw + nmake -f makefile.nt clean + cd $(THISDIR) + + +pycfiles : $(PYMODULES) +!if "$(COMPILEPY)" == "1" + $(PYTHONDIR)\python $(PYTHONDIR)\Lib\compileall.py -l $(TARGETDIR) + $(PYTHONDIR)\python -O $(PYTHONDIR)\Lib\compileall.py -l $(TARGETDIR) +!endif + +#---------------------------------------------------------------------- + +$(TARGETDIR)\$(TARGET).pyd : $(DUMMYOBJ) $(WXLIB) $(OBJECTS) $(TARGET).res + $(link) @<< +/out:$@ /dll +$(LFLAGS) +$(DUMMYOBJ) $(OBJECTS) $(TARGET).res +$(LIBS) +<< + +$(TARGETDIR)\$(TARGET2).pyd : $(DUMMYOBJ) $(WXLIB) $(OBJECTS2) + $(link) @<< +/out:$@ /dll +$(LFLAGS2) +$(DUMMYOBJ) $(OBJECTS2) +$(LIBS) +<< + + +$(TARGET).res : $(TARGET).rc $(WXDIR)\include\wx\msw\wx.rc + $(rc) -r /i$(WXDIR)\include -fo$@ $(TARGET).rc + + + +# implicit rule for compiling .cpp files +{}.cpp{}.obj: + $(cc) @<< +$(CPPFLAGS) /c /Tp $< +<< + +{$(GENCODEDIR)}.cpp{}.obj: + $(cc) @<< +$(CPPFLAGS) /c /Tp $< +<< + + +clean: + -erase *.obj + -erase *.exe + -erase *.res + -erase *.map + -erase *.sbr + -erase *.pdb + -erase *.pch + -erase $(TARGET).exp + -erase $(TARGET).lib + -erase $(TARGETDIR)\$(TARGET).* +!if "$(SEPARATE)" != "0" + -erase $(TARGET2).exp + -erase $(TARGET2).lib + -erase $(TARGETDIR)\$(TARGET2).* +!endif + -erase $(TARGETDIR)\$(TARGET).pyd + -erase $(TARGETDIR)\*.py + -erase $(TARGETDIR)\*.pyc + -erase $(TARGETDIR)\*.pyo + + + +#------------------------------------------------------------------------ + +.SUFFIXES : .i .py + +# Implicit rules to run SWIG +{}.i{$(GENCODEDIR)}.cpp: + swig $(SWIGFLAGS) -c -o $@ $< + +{}.i{$(GENCODEDIR)}.py: + swig $(SWIGFLAGS) -c -o $@ $< + + +{$(GENCODEDIR)}.py{$(TARGETDIR)}.py: + copy $< $@ + +{}.py{$(TARGETDIR)}.py: + copy $< $@ + +#{}.py{$(TARGETDIR)}.$(PYEXT): +# $(PYTHON) -c "import py_compile; py_compile.compile('$<', '$@')" + + + + +# This one must leave out the -c flag so we define the whole rule +$(GENCODEDIR)\wx.cpp $(GENCODEDIR)\wx.py : wx.i my_typemaps.i _defs.i _extras.py + swig $(SWIGFLAGS) -o $(GENCODEDIR)/wx.cpp wx.i + + +# Define some dependencies. These MUST use forward slashes so SWIG +# will write the shadow file to the right directory. +$(GENCODEDIR)/windows.cpp $(GENCODEDIR)/windows.py : windows.i my_typemaps.i _defs.i +$(GENCODEDIR)/windows2.cpp $(GENCODEDIR)/windows2.py : windows2.i my_typemaps.i _defs.i +$(GENCODEDIR)/windows3.cpp $(GENCODEDIR)/windows3.py : windows3.i my_typemaps.i _defs.i +$(GENCODEDIR)/events.cpp $(GENCODEDIR)/events.py : events.i my_typemaps.i _defs.i +$(GENCODEDIR)/misc.cpp $(GENCODEDIR)/misc.py : misc.i my_typemaps.i _defs.i +$(GENCODEDIR)/gdi.cpp $(GENCODEDIR)/gdi.py : gdi.i my_typemaps.i _defs.i +$(GENCODEDIR)/mdi.cpp $(GENCODEDIR)/mdi.py : mdi.i my_typemaps.i _defs.i +$(GENCODEDIR)/controls.cpp $(GENCODEDIR)/controls.py : controls.i my_typemaps.i _defs.i +$(GENCODEDIR)/controls2.cpp $(GENCODEDIR)/controls2.py : controls2.i my_typemaps.i _defs.i +$(GENCODEDIR)/cmndlgs.cpp $(GENCODEDIR)/cmndlgs.py : cmndlgs.i my_typemaps.i _defs.i +$(GENCODEDIR)/stattool.cpp $(GENCODEDIR)/stattool.py : stattool.i my_typemaps.i _defs.i +$(GENCODEDIR)/frames.cpp $(GENCODEDIR)/frames.py : frames.i my_typemaps.i _defs.i + +!if "$(SEPARATE)" == "1" +$(GENCODEDIR)\utils.cpp $(GENCODEDIR)\utils.py : utils.i my_typemaps.i + swig $(SWIGFLAGS) -o $(GENCODEDIR)/utils.cpp utils.i +!else +$(GENCODEDIR)/utils.cpp $(GENCODEDIR)/utils.py : utils.i my_typemaps.i _defs.i +!endif + + +$(TARGETDIR)\wx.py : $(GENCODEDIR)\wx.py +$(TARGETDIR)\windows.py : $(GENCODEDIR)\windows.py +$(TARGETDIR)\windows2.py : $(GENCODEDIR)\windows2.py +$(TARGETDIR)\windows3.py : $(GENCODEDIR)\windows3.py +$(TARGETDIR)\events.py : $(GENCODEDIR)\events.py +$(TARGETDIR)\misc.py : $(GENCODEDIR)\misc.py +$(TARGETDIR)\gdi.py : $(GENCODEDIR)\gdi.py +$(TARGETDIR)\mdi.py : $(GENCODEDIR)\mdi.py +$(TARGETDIR)\controls.py : $(GENCODEDIR)\controls.py +$(TARGETDIR)\controls2.py : $(GENCODEDIR)\controls2.py +$(TARGETDIR)\cmndlgs.py : $(GENCODEDIR)\cmndlgs.py +$(TARGETDIR)\frames.py : $(GENCODEDIR)\frames.py +$(TARGETDIR)\stattool.py : $(GENCODEDIR)\stattool.py +$(TARGETDIR)\utils.py : $(GENCODEDIR)\utils.py +$(TARGETDIR)\__init__.py : __init__.py + + +SOURCES = $(GENCODEDIR)\wx.cpp $(GENCODEDIR)\wx.py \ + $(GENCODEDIR)/windows.cpp $(GENCODEDIR)/windows.py \ + $(GENCODEDIR)/windows2.cpp $(GENCODEDIR)/windows2.py \ + $(GENCODEDIR)/windows3.cpp $(GENCODEDIR)/windows3.py \ + $(GENCODEDIR)/events.cpp $(GENCODEDIR)/events.py \ + $(GENCODEDIR)/misc.cpp $(GENCODEDIR)/misc.py \ + $(GENCODEDIR)/gdi.cpp $(GENCODEDIR)/gdi.py \ + $(GENCODEDIR)/mdi.cpp $(GENCODEDIR)/mdi.py \ + $(GENCODEDIR)/controls.cpp $(GENCODEDIR)/controls.py \ + $(GENCODEDIR)/controls2.cpp $(GENCODEDIR)/controls2.py\ + $(GENCODEDIR)/cmndlgs.cpp $(GENCODEDIR)/cmndlgs.py \ + $(GENCODEDIR)/stattool.cpp $(GENCODEDIR)/stattool.py \ + $(GENCODEDIR)/frames.cpp $(GENCODEDIR)/frames.py \ + $(GENCODEDIR)/utils.cpp $(GENCODEDIR)/utils.py \ + + +sources : $(SOURCES) + + +dist: + cd ..\.. + wxPython\distrib\zipit.bat $(VERSION) + +#------------------------------------------------------------------------ +# +# $Log$ +# Revision 1.12 1999/06/28 21:39:47 VZ +# 1. wxStaticLine implemented (generic (ugly) and MSW versions) +# 2. wxTextDialog looks fine under MSW again +# 3. startup tips added: code, sample, docs +# 4. read-only text controls don't participate in TAB traversal +# +# Revision 1.11 1999/02/06 23:47:02 RD +# +# Changing makefile.nt to makefile.vc as in rest of wxWindows +# +# Revision 1.10 1999/02/01 00:10:40 RD +# +# Added the missing EVT_LIST_ITEM_SELECTED and friends. +# +# Revision 1.9 1999/01/30 07:30:13 RD +# +# Added wxSashWindow, wxSashEvent, wxLayoutAlgorithm, etc. +# +# Various cleanup, tweaks, minor additions, etc. to maintain +# compatibility with the current wxWindows. +# +# Revision 1.8 1998/12/21 19:58:06 RD +# +# Now compiles with /GX- on MSW. +# +# Revision 1.7 1998/12/15 20:41:20 RD +# Changed the import semantics from "from wxPython import *" to "from +# wxPython.wx import *" This is for people who are worried about +# namespace pollution, they can use "from wxPython import wx" and then +# prefix all the wxPython identifiers with "wx." +# +# Added wxTaskbarIcon for wxMSW. +# +# Made the events work for wxGrid. +# +# Added wxConfig. +# +# Added wxMiniFrame for wxGTK, (untested.) +# +# Changed many of the args and return values that were pointers to gdi +# objects to references to reflect changes in the wxWindows API. +# +# Other assorted fixes and additions. +# +# Revision 1.6 1998/10/02 06:40:41 RD +# +# Version 0.4 of wxPython for MSW. +# +# Revision 1.5 1998/08/19 00:38:23 RD +# +# A few tweaks +# +# Revision 1.4 1998/08/18 21:55:10 RD +# +# New build directory structure +# +# Revision 1.3 1998/08/15 07:36:37 RD +# - Moved the header in the .i files out of the code that gets put into +# the .cpp files. It caused CVS conflicts because of the RCS ID being +# different each time. +# +# - A few minor fixes. +# +# Revision 1.2 1998/08/14 03:34:23 RD +# made pre-compiling the python files optional +# +# Revision 1.1 1998/08/09 08:25:51 RD +# Initial version +# diff --git a/utils/wxPython/src/wxp.cpp b/utils/wxPython/src/wxp.cpp new file mode 100644 index 0000000000..cea3c3c5c4 --- /dev/null +++ b/utils/wxPython/src/wxp.cpp @@ -0,0 +1,2049 @@ +/* + * FILE : wxp.cpp + * + * This file was automatically generated by : + * Simplified Wrapper and Interface Generator (SWIG) + * Version 1.1 (Patch 5) + * + * Portions Copyright (c) 1995-1998 + * The University of Utah and The Regents of the University of California. + * Permission is granted to distribute this file in any manner provided + * this notice remains intact. + * + * Do not make changes to this file--changes will be lost! + * + */ + + +#define SWIGCODE +/* Implementation : PYTHON */ + +#define SWIGPYTHON +#include +#include +/*********************************************************************** + * $Header$ + * swig_lib/python/python.cfg + * + * This file contains coded needed to add variable linking to the + * Python interpreter. C variables are added as a new kind of Python + * datatype. + * + * Also contains supporting code for building python under Windows + * and things like that. + * + * $Log$ + * Revision 1.6 1999/06/28 21:39:47 VZ + * 1. wxStaticLine implemented (generic (ugly) and MSW versions) + * 2. wxTextDialog looks fine under MSW again + * 3. startup tips added: code, sample, docs + * 4. read-only text controls don't participate in TAB traversal + * + * Revision 1.5 1998/08/18 21:50:09 RD + * + * moving the SWIG-generated files to toolkit specific subdirectories + * + * Revision 1.4 1998/08/15 07:36:51 RD + * - Moved the header in the .i files out of the code that gets put into + * the .cpp files. It caused CVS conflicts because of the RCS ID being + * different each time. + * + * - A few minor fixes. + * + ************************************************************************/ + +#ifdef __cplusplus +extern "C" { +#endif +#include "Python.h" +#ifdef __cplusplus +} +#endif + +/* Definitions for Windows/Unix exporting */ +#if defined(__WIN32__) +# if defined(_MSC_VER) +# define SWIGEXPORT(a,b) __declspec(dllexport) a b +# else +# if defined(__BORLANDC__) +# define SWIGEXPORT(a,b) a _export b +# else +# define SWIGEXPORT(a,b) a b +# endif +# endif +#else +# define SWIGEXPORT(a,b) a b +#endif + +#ifdef SWIG_GLOBAL +#ifdef __cplusplus +#define SWIGSTATIC extern "C" +#else +#define SWIGSTATIC +#endif +#endif + +#ifndef SWIGSTATIC +#define SWIGSTATIC static +#endif + +typedef struct { + char *name; + PyObject *(*get_attr)(void); + int (*set_attr)(PyObject *); +} swig_globalvar; + +typedef struct swig_varlinkobject { + PyObject_HEAD + swig_globalvar **vars; + int nvars; + int maxvars; +} swig_varlinkobject; + +/* ---------------------------------------------------------------------- + swig_varlink_repr() + + Function for python repr method + ---------------------------------------------------------------------- */ + +static PyObject * +swig_varlink_repr(swig_varlinkobject *v) +{ + v = v; + return PyString_FromString(""); +} + +/* --------------------------------------------------------------------- + swig_varlink_print() + + Print out all of the global variable names + --------------------------------------------------------------------- */ + +static int +swig_varlink_print(swig_varlinkobject *v, FILE *fp, int flags) +{ + + int i = 0; + flags = flags; + fprintf(fp,"Global variables { "); + while (v->vars[i]) { + fprintf(fp,"%s", v->vars[i]->name); + i++; + if (v->vars[i]) fprintf(fp,", "); + } + fprintf(fp," }\n"); + return 0; +} + +/* -------------------------------------------------------------------- + swig_varlink_getattr + + This function gets the value of a variable and returns it as a + PyObject. In our case, we'll be looking at the datatype and + converting into a number or string + -------------------------------------------------------------------- */ + +static PyObject * +swig_varlink_getattr(swig_varlinkobject *v, char *n) +{ + int i = 0; + char temp[128]; + + while (v->vars[i]) { + if (strcmp(v->vars[i]->name,n) == 0) { + return (*v->vars[i]->get_attr)(); + } + i++; + } + sprintf(temp,"C global variable %s not found.", n); + PyErr_SetString(PyExc_NameError,temp); + return NULL; +} + +/* ------------------------------------------------------------------- + swig_varlink_setattr() + + This function sets the value of a variable. + ------------------------------------------------------------------- */ + +static int +swig_varlink_setattr(swig_varlinkobject *v, char *n, PyObject *p) +{ + char temp[128]; + int i = 0; + while (v->vars[i]) { + if (strcmp(v->vars[i]->name,n) == 0) { + return (*v->vars[i]->set_attr)(p); + } + i++; + } + sprintf(temp,"C global variable %s not found.", n); + PyErr_SetString(PyExc_NameError,temp); + return 1; +} + +statichere PyTypeObject varlinktype = { +/* PyObject_HEAD_INIT(&PyType_Type) Note : This doesn't work on some machines */ + PyObject_HEAD_INIT(0) + 0, + "varlink", /* Type name */ + sizeof(swig_varlinkobject), /* Basic size */ + 0, /* Itemsize */ + 0, /* Deallocator */ + (printfunc) swig_varlink_print, /* Print */ + (getattrfunc) swig_varlink_getattr, /* get attr */ + (setattrfunc) swig_varlink_setattr, /* Set attr */ + 0, /* tp_compare */ + (reprfunc) swig_varlink_repr, /* tp_repr */ + 0, /* tp_as_number */ + 0, /* tp_as_mapping*/ + 0, /* tp_hash */ +}; + +/* Create a variable linking object for use later */ + +SWIGSTATIC PyObject * +SWIG_newvarlink(void) +{ + swig_varlinkobject *result = 0; + result = PyMem_NEW(swig_varlinkobject,1); + varlinktype.ob_type = &PyType_Type; /* Patch varlinktype into a PyType */ + result->ob_type = &varlinktype; + /* _Py_NewReference(result); Does not seem to be necessary */ + result->nvars = 0; + result->maxvars = 64; + result->vars = (swig_globalvar **) malloc(64*sizeof(swig_globalvar *)); + result->vars[0] = 0; + result->ob_refcnt = 0; + Py_XINCREF((PyObject *) result); + return ((PyObject*) result); +} + +SWIGSTATIC void +SWIG_addvarlink(PyObject *p, char *name, + PyObject *(*get_attr)(void), int (*set_attr)(PyObject *p)) +{ + swig_varlinkobject *v; + v= (swig_varlinkobject *) p; + + if (v->nvars >= v->maxvars -1) { + v->maxvars = 2*v->maxvars; + v->vars = (swig_globalvar **) realloc(v->vars,v->maxvars*sizeof(swig_globalvar *)); + if (v->vars == NULL) { + fprintf(stderr,"SWIG : Fatal error in initializing Python module.\n"); + exit(1); + } + } + v->vars[v->nvars] = (swig_globalvar *) malloc(sizeof(swig_globalvar)); + v->vars[v->nvars]->name = (char *) malloc(strlen(name)+1); + strcpy(v->vars[v->nvars]->name,name); + v->vars[v->nvars]->get_attr = get_attr; + v->vars[v->nvars]->set_attr = set_attr; + v->nvars++; + v->vars[v->nvars] = 0; +} + + + +/***************************************************************************** + * $Header$ + * + * swigptr.swg + * + * This file contains supporting code for the SWIG run-time type checking + * mechanism. The following functions are available : + * + * SWIG_RegisterMapping(char *origtype, char *newtype, void *(*cast)(void *)); + * + * Registers a new type-mapping with the type-checker. origtype is the + * original datatype and newtype is an equivalent type. cast is optional + * pointer to a function to cast pointer values between types (this + * is typically used to cast pointers from derived classes to base classes in C++) + * + * SWIG_MakePtr(char *buffer, void *ptr, char *typestring); + * + * Makes a pointer string from a pointer and typestring. The result is returned + * in buffer which is assumed to hold enough space for the result. + * + * char * SWIG_GetPtr(char *buffer, void **ptr, char *type) + * + * Gets a pointer value from a string. If there is a type-mismatch, returns + * a character string to the received type. On success, returns NULL. + * + * + * You can remap these functions by making a file called "swigptr.swg" in + * your the same directory as the interface file you are wrapping. + * + * These functions are normally declared static, but this file can be + * can be used in a multi-module environment by redefining the symbol + * SWIGSTATIC. + *****************************************************************************/ + +#include + +#ifdef SWIG_GLOBAL +#ifdef __cplusplus +#define SWIGSTATIC extern "C" +#else +#define SWIGSTATIC +#endif +#endif + +#ifndef SWIGSTATIC +#define SWIGSTATIC static +#endif + + +/* SWIG pointer structure */ + +typedef struct SwigPtrType { + char *name; /* Datatype name */ + int len; /* Length (used for optimization) */ + void *(*cast)(void *); /* Pointer casting function */ + struct SwigPtrType *next; /* Linked list pointer */ +} SwigPtrType; + +/* Pointer cache structure */ + +typedef struct { + int stat; /* Status (valid) bit */ + SwigPtrType *tp; /* Pointer to type structure */ + char name[256]; /* Given datatype name */ + char mapped[256]; /* Equivalent name */ +} SwigCacheType; + +/* Some variables */ + +static int SwigPtrMax = 64; /* Max entries that can be currently held */ + /* This value may be adjusted dynamically */ +static int SwigPtrN = 0; /* Current number of entries */ +static int SwigPtrSort = 0; /* Status flag indicating sort */ +static int SwigStart[256]; /* Starting positions of types */ + +/* Pointer table */ +static SwigPtrType *SwigPtrTable = 0; /* Table containing pointer equivalences */ + +/* Cached values */ + +#define SWIG_CACHESIZE 8 +#define SWIG_CACHEMASK 0x7 +static SwigCacheType SwigCache[SWIG_CACHESIZE]; +static int SwigCacheIndex = 0; +static int SwigLastCache = 0; + +/* Sort comparison function */ +static int swigsort(const void *data1, const void *data2) { + SwigPtrType *d1 = (SwigPtrType *) data1; + SwigPtrType *d2 = (SwigPtrType *) data2; + return strcmp(d1->name,d2->name); +} + +/* Binary Search function */ +static int swigcmp(const void *key, const void *data) { + char *k = (char *) key; + SwigPtrType *d = (SwigPtrType *) data; + return strncmp(k,d->name,d->len); +} + +/* Register a new datatype with the type-checker */ + +SWIGSTATIC +void SWIG_RegisterMapping(char *origtype, char *newtype, void *(*cast)(void *)) { + + int i; + SwigPtrType *t = 0,*t1; + + /* Allocate the pointer table if necessary */ + + if (!SwigPtrTable) { + SwigPtrTable = (SwigPtrType *) malloc(SwigPtrMax*sizeof(SwigPtrType)); + SwigPtrN = 0; + } + /* Grow the table */ + if (SwigPtrN >= SwigPtrMax) { + SwigPtrMax = 2*SwigPtrMax; + SwigPtrTable = (SwigPtrType *) realloc((char *) SwigPtrTable,SwigPtrMax*sizeof(SwigPtrType)); + } + for (i = 0; i < SwigPtrN; i++) + if (strcmp(SwigPtrTable[i].name,origtype) == 0) { + t = &SwigPtrTable[i]; + break; + } + if (!t) { + t = &SwigPtrTable[SwigPtrN]; + t->name = origtype; + t->len = strlen(t->name); + t->cast = 0; + t->next = 0; + SwigPtrN++; + } + + /* Check for existing entry */ + + while (t->next) { + if ((strcmp(t->name,newtype) == 0)) { + if (cast) t->cast = cast; + return; + } + t = t->next; + } + + /* Now place entry (in sorted order) */ + + t1 = (SwigPtrType *) malloc(sizeof(SwigPtrType)); + t1->name = newtype; + t1->len = strlen(t1->name); + t1->cast = cast; + t1->next = 0; + t->next = t1; + SwigPtrSort = 0; +} + +/* Make a pointer value string */ + +SWIGSTATIC +void SWIG_MakePtr(char *_c, const void *_ptr, char *type) { + static char _hex[16] = + {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', + 'a', 'b', 'c', 'd', 'e', 'f'}; + unsigned long _p, _s; + char _result[20], *_r; /* Note : a 64-bit hex number = 16 digits */ + _r = _result; + _p = (unsigned long) _ptr; + if (_p > 0) { + while (_p > 0) { + _s = _p & 0xf; + *(_r++) = _hex[_s]; + _p = _p >> 4; + } + *_r = '_'; + while (_r >= _result) + *(_c++) = *(_r--); + } else { + strcpy (_c, "NULL"); + } + if (_ptr) + strcpy (_c, type); +} + +/* Define for backwards compatibility */ + +#define _swig_make_hex SWIG_MakePtr + +/* Function for getting a pointer value */ + +SWIGSTATIC +char *SWIG_GetPtr(char *_c, void **ptr, char *_t) +{ + unsigned long _p; + char temp_type[256]; + char *name; + int i, len; + SwigPtrType *sp,*tp; + SwigCacheType *cache; + int start, end; + _p = 0; + + /* Pointer values must start with leading underscore */ + if (*_c == '_') { + _c++; + /* Extract hex value from pointer */ + while (*_c) { + if ((*_c >= '0') && (*_c <= '9')) + _p = (_p << 4) + (*_c - '0'); + else if ((*_c >= 'a') && (*_c <= 'f')) + _p = (_p << 4) + ((*_c - 'a') + 10); + else + break; + _c++; + } + + if (_t) { + if (strcmp(_t,_c)) { + if (!SwigPtrSort) { + qsort((void *) SwigPtrTable, SwigPtrN, sizeof(SwigPtrType), swigsort); + for (i = 0; i < 256; i++) { + SwigStart[i] = SwigPtrN; + } + for (i = SwigPtrN-1; i >= 0; i--) { + SwigStart[(int) (SwigPtrTable[i].name[1])] = i; + } + for (i = 255; i >= 1; i--) { + if (SwigStart[i-1] > SwigStart[i]) + SwigStart[i-1] = SwigStart[i]; + } + SwigPtrSort = 1; + for (i = 0; i < SWIG_CACHESIZE; i++) + SwigCache[i].stat = 0; + } + + /* First check cache for matches. Uses last cache value as starting point */ + cache = &SwigCache[SwigLastCache]; + for (i = 0; i < SWIG_CACHESIZE; i++) { + if (cache->stat) { + if (strcmp(_t,cache->name) == 0) { + if (strcmp(_c,cache->mapped) == 0) { + cache->stat++; + *ptr = (void *) _p; + if (cache->tp->cast) *ptr = (*(cache->tp->cast))(*ptr); + return (char *) 0; + } + } + } + SwigLastCache = (SwigLastCache+1) & SWIG_CACHEMASK; + if (!SwigLastCache) cache = SwigCache; + else cache++; + } + /* We have a type mismatch. Will have to look through our type + mapping table to figure out whether or not we can accept this datatype */ + + start = SwigStart[(int) _t[1]]; + end = SwigStart[(int) _t[1]+1]; + sp = &SwigPtrTable[start]; + while (start < end) { + if (swigcmp(_t,sp) == 0) break; + sp++; + start++; + } + if (start >= end) sp = 0; + /* Try to find a match for this */ + if (sp) { + while (swigcmp(_t,sp) == 0) { + name = sp->name; + len = sp->len; + tp = sp->next; + /* Try to find entry for our given datatype */ + while(tp) { + if (tp->len >= 255) { + return _c; + } + strcpy(temp_type,tp->name); + strncat(temp_type,_t+len,255-tp->len); + if (strcmp(_c,temp_type) == 0) { + + strcpy(SwigCache[SwigCacheIndex].mapped,_c); + strcpy(SwigCache[SwigCacheIndex].name,_t); + SwigCache[SwigCacheIndex].stat = 1; + SwigCache[SwigCacheIndex].tp = tp; + SwigCacheIndex = SwigCacheIndex & SWIG_CACHEMASK; + + /* Get pointer value */ + *ptr = (void *) _p; + if (tp->cast) *ptr = (*(tp->cast))(*ptr); + return (char *) 0; + } + tp = tp->next; + } + sp++; + /* Hmmm. Didn't find it this time */ + } + } + /* Didn't find any sort of match for this data. + Get the pointer value and return the received type */ + *ptr = (void *) _p; + return _c; + } else { + /* Found a match on the first try. Return pointer value */ + *ptr = (void *) _p; + return (char *) 0; + } + } else { + /* No type specified. Good luck */ + *ptr = (void *) _p; + return (char *) 0; + } + } else { + if (strcmp (_c, "NULL") == 0) { + *ptr = (void *) 0; + return (char *) 0; + } + *ptr = (void *) 0; + return _c; + } +} + +/* Compatibility mode */ + +#define _swig_get_hex SWIG_GetPtr + +#define SWIG_init initwxpc + +#define SWIG_name "wxpc" + + +#ifdef __WXMSW__ +#include +#undef FindWindow +#undef GetCharWidth +#undef LoadAccelerators +#endif + + +#include "helpers.h" + +static PyObject* l_output_helper(PyObject* target, PyObject* o) { + PyObject* o2; + if (!target) { + target = o; + } else if (target == Py_None) { + Py_DECREF(Py_None); + target = o; + } else { + if (!PyList_Check(target)) { + o2 = target; + target = PyList_New(0); + PyList_Append(target, o2); + Py_XDECREF(o2); + } + PyList_Append(target,o); + Py_XDECREF(o); + } + return target; +} + +static PyObject* t_output_helper(PyObject* target, PyObject* o) { + PyObject* o2; + PyObject* o3; + + if (!target) { + target = o; + } else if (target == Py_None) { + Py_DECREF(Py_None); + target = o; + } else { + if (!PyTuple_Check(target)) { + o2 = target; + target = PyTuple_New(1); + PyTuple_SetItem(target, 0, o2); + } + o3 = PyTuple_New(1); + PyTuple_SetItem(o3, 0, o); + + o2 = target; + target = PySequence_Concat(o2, o3); + Py_DECREF(o2); + Py_DECREF(o3); + } + return target; +} + + +extern int* int_LIST_helper(PyObject* source); +extern long* long_LIST_helper(PyObject* source); +extern char** string_LIST_helper(PyObject* source); +extern wxPoint* wxPoint_LIST_helper(PyObject* source); +extern wxBitmap** wxBitmap_LIST_helper(PyObject* source); +extern wxString* wxString_LIST_helper(PyObject* source); +#ifdef __WXMSW__ +extern wxAcceleratorEntry* wxAcceleratorEntry_LIST_helper(PyObject* source); +#endif + + +static char* wxStringErrorMsg = "string type is required for parameter"; + +#ifdef __WXMSW__ // If building for win32... + +#include +#undef GetClassName + +extern HINSTANCE wxhInstance; + +BOOL WINAPI DllMain( + HINSTANCE hinstDLL, // handle to DLL module + DWORD fdwReason, // reason for calling function + LPVOID lpvReserved // reserved + ) +{ + wxhInstance = hinstDLL; + return 1; +} +#endif + + +extern "C" SWIGEXPORT(void,initwindowsc)(); +extern "C" SWIGEXPORT(void,initwindows2c)(); +extern "C" SWIGEXPORT(void,initeventsc)(); +extern "C" SWIGEXPORT(void,initmiscc)(); +extern "C" SWIGEXPORT(void,initgdic)(); +extern "C" SWIGEXPORT(void,initmdic)(); +extern "C" SWIGEXPORT(void,initcontrolsc)(); +extern "C" SWIGEXPORT(void,initcontrols2c)(); +extern "C" SWIGEXPORT(void,initcmndlgsc)(); + +static int _wrap_wxPyDefaultPosition_set(PyObject *val) { + + PyErr_SetString(PyExc_TypeError,"Variable wxPyDefaultPosition is read-only."); + return 1; +} + +static PyObject *_wrap_wxPyDefaultPosition_get() { + PyObject * pyobj; + char ptemp[128]; + + SWIG_MakePtr(ptemp,(char *) &wxPyDefaultPosition,"_wxPoint_p"); + pyobj = PyString_FromString(ptemp); + return pyobj; +} + +static int _wrap_wxPyDefaultSize_set(PyObject *val) { + + PyErr_SetString(PyExc_TypeError,"Variable wxPyDefaultSize is read-only."); + return 1; +} + +static PyObject *_wrap_wxPyDefaultSize_get() { + PyObject * pyobj; + char ptemp[128]; + + SWIG_MakePtr(ptemp,(char *) &wxPyDefaultSize,"_wxSize_p"); + pyobj = PyString_FromString(ptemp); + return pyobj; +} + +static void *SwigwxPyAppTowxEvtHandler(void *ptr) { + wxPyApp *src; + wxEvtHandler *dest; + src = (wxPyApp *) ptr; + dest = (wxEvtHandler *) src; + return (void *) dest; +} + +static wxPyApp *new_wxPyApp() { + wxPythonApp = new wxPyApp(); + return wxPythonApp; + } + +static PyObject *_wrap_new_wxPyApp(PyObject *self, PyObject *args) { + PyObject * _resultobj; + wxPyApp * _result; + char _ptemp[128]; + + self = self; + if(!PyArg_ParseTuple(args,":new_wxPyApp")) + return NULL; + _result = (wxPyApp *)new_wxPyApp(); + SWIG_MakePtr(_ptemp, (char *) _result,"_wxPyApp_p"); + _resultobj = Py_BuildValue("s",_ptemp); + return _resultobj; +} + +#define wxPyApp_GetAppName(_swigobj) (_swigobj->GetAppName()) +static PyObject *_wrap_wxPyApp_GetAppName(PyObject *self, PyObject *args) { + PyObject * _resultobj; + wxString * _result; + wxPyApp * _arg0; + char * _argc0 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"s:wxPyApp_GetAppName",&_argc0)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_GetAppName. Expected _wxPyApp_p."); + return NULL; + } + } + _result = new wxString (wxPyApp_GetAppName(_arg0)); +{ + _resultobj = PyString_FromString(WXSTRINGCAST *(_result)); +} +{ + delete _result; +} + return _resultobj; +} + +#define wxPyApp_GetAuto3D(_swigobj) (_swigobj->GetAuto3D()) +static PyObject *_wrap_wxPyApp_GetAuto3D(PyObject *self, PyObject *args) { + PyObject * _resultobj; + bool _result; + wxPyApp * _arg0; + char * _argc0 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"s:wxPyApp_GetAuto3D",&_argc0)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_GetAuto3D. Expected _wxPyApp_p."); + return NULL; + } + } + _result = (bool )wxPyApp_GetAuto3D(_arg0); + _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + +#define wxPyApp_GetClassName(_swigobj) (_swigobj->GetClassName()) +static PyObject *_wrap_wxPyApp_GetClassName(PyObject *self, PyObject *args) { + PyObject * _resultobj; + wxString * _result; + wxPyApp * _arg0; + char * _argc0 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"s:wxPyApp_GetClassName",&_argc0)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_GetClassName. Expected _wxPyApp_p."); + return NULL; + } + } + _result = new wxString (wxPyApp_GetClassName(_arg0)); +{ + _resultobj = PyString_FromString(WXSTRINGCAST *(_result)); +} +{ + delete _result; +} + return _resultobj; +} + +#define wxPyApp_GetExitOnFrameDelete(_swigobj) (_swigobj->GetExitOnFrameDelete()) +static PyObject *_wrap_wxPyApp_GetExitOnFrameDelete(PyObject *self, PyObject *args) { + PyObject * _resultobj; + bool _result; + wxPyApp * _arg0; + char * _argc0 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"s:wxPyApp_GetExitOnFrameDelete",&_argc0)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_GetExitOnFrameDelete. Expected _wxPyApp_p."); + return NULL; + } + } + _result = (bool )wxPyApp_GetExitOnFrameDelete(_arg0); + _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + +#define wxPyApp_GetPrintMode(_swigobj) (_swigobj->GetPrintMode()) +static PyObject *_wrap_wxPyApp_GetPrintMode(PyObject *self, PyObject *args) { + PyObject * _resultobj; + int _result; + wxPyApp * _arg0; + char * _argc0 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"s:wxPyApp_GetPrintMode",&_argc0)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_GetPrintMode. Expected _wxPyApp_p."); + return NULL; + } + } + _result = (int )wxPyApp_GetPrintMode(_arg0); + _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + +#define wxPyApp_GetTopWindow(_swigobj) (_swigobj->GetTopWindow()) +static PyObject *_wrap_wxPyApp_GetTopWindow(PyObject *self, PyObject *args) { + PyObject * _resultobj; + wxWindow * _result; + wxPyApp * _arg0; + char * _argc0 = 0; + char _ptemp[128]; + + self = self; + if(!PyArg_ParseTuple(args,"s:wxPyApp_GetTopWindow",&_argc0)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_GetTopWindow. Expected _wxPyApp_p."); + return NULL; + } + } + _result = (wxWindow *)wxPyApp_GetTopWindow(_arg0); + SWIG_MakePtr(_ptemp, (char *) _result,"_wxWindow_p"); + _resultobj = Py_BuildValue("s",_ptemp); + return _resultobj; +} + +#define wxPyApp_GetVendorName(_swigobj) (_swigobj->GetVendorName()) +static PyObject *_wrap_wxPyApp_GetVendorName(PyObject *self, PyObject *args) { + PyObject * _resultobj; + wxString * _result; + wxPyApp * _arg0; + char * _argc0 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"s:wxPyApp_GetVendorName",&_argc0)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_GetVendorName. Expected _wxPyApp_p."); + return NULL; + } + } + _result = new wxString (wxPyApp_GetVendorName(_arg0)); +{ + _resultobj = PyString_FromString(WXSTRINGCAST *(_result)); +} +{ + delete _result; +} + return _resultobj; +} + +#define wxPyApp_Dispatch(_swigobj) (_swigobj->Dispatch()) +static PyObject *_wrap_wxPyApp_Dispatch(PyObject *self, PyObject *args) { + PyObject * _resultobj; + wxPyApp * _arg0; + char * _argc0 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"s:wxPyApp_Dispatch",&_argc0)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_Dispatch. Expected _wxPyApp_p."); + return NULL; + } + } + wxPyApp_Dispatch(_arg0); + Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + +#define wxPyApp_ExitMainLoop(_swigobj) (_swigobj->ExitMainLoop()) +static PyObject *_wrap_wxPyApp_ExitMainLoop(PyObject *self, PyObject *args) { + PyObject * _resultobj; + wxPyApp * _arg0; + char * _argc0 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"s:wxPyApp_ExitMainLoop",&_argc0)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_ExitMainLoop. Expected _wxPyApp_p."); + return NULL; + } + } + wxPyApp_ExitMainLoop(_arg0); + Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + +#define wxPyApp_Initialized(_swigobj) (_swigobj->Initialized()) +static PyObject *_wrap_wxPyApp_Initialized(PyObject *self, PyObject *args) { + PyObject * _resultobj; + bool _result; + wxPyApp * _arg0; + char * _argc0 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"s:wxPyApp_Initialized",&_argc0)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_Initialized. Expected _wxPyApp_p."); + return NULL; + } + } + _result = (bool )wxPyApp_Initialized(_arg0); + _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + +#define wxPyApp_MainLoop(_swigobj) (_swigobj->MainLoop()) +static PyObject *_wrap_wxPyApp_MainLoop(PyObject *self, PyObject *args) { + PyObject * _resultobj; + int _result; + wxPyApp * _arg0; + char * _argc0 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"s:wxPyApp_MainLoop",&_argc0)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_MainLoop. Expected _wxPyApp_p."); + return NULL; + } + } + _result = (int )wxPyApp_MainLoop(_arg0); + _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + +#define wxPyApp_Pending(_swigobj) (_swigobj->Pending()) +static PyObject *_wrap_wxPyApp_Pending(PyObject *self, PyObject *args) { + PyObject * _resultobj; + bool _result; + wxPyApp * _arg0; + char * _argc0 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"s:wxPyApp_Pending",&_argc0)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_Pending. Expected _wxPyApp_p."); + return NULL; + } + } + _result = (bool )wxPyApp_Pending(_arg0); + _resultobj = Py_BuildValue("i",_result); + return _resultobj; +} + +#define wxPyApp_SetAppName(_swigobj,_swigarg0) (_swigobj->SetAppName(_swigarg0)) +static PyObject *_wrap_wxPyApp_SetAppName(PyObject *self, PyObject *args) { + PyObject * _resultobj; + wxPyApp * _arg0; + wxString * _arg1; + char * _argc0 = 0; + PyObject * _obj1 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"sO:wxPyApp_SetAppName",&_argc0,&_obj1)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_SetAppName. Expected _wxPyApp_p."); + return NULL; + } + } +{ + if (!PyString_Check(_obj1)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + _arg1 = new wxString(PyString_AsString(_obj1)); +} + wxPyApp_SetAppName(_arg0,*_arg1); + Py_INCREF(Py_None); + _resultobj = Py_None; +{ + if (_obj1) + delete _arg1; +} + return _resultobj; +} + +#define wxPyApp_SetAuto3D(_swigobj,_swigarg0) (_swigobj->SetAuto3D(_swigarg0)) +static PyObject *_wrap_wxPyApp_SetAuto3D(PyObject *self, PyObject *args) { + PyObject * _resultobj; + wxPyApp * _arg0; + bool _arg1; + char * _argc0 = 0; + int tempbool1; + + self = self; + if(!PyArg_ParseTuple(args,"si:wxPyApp_SetAuto3D",&_argc0,&tempbool1)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_SetAuto3D. Expected _wxPyApp_p."); + return NULL; + } + } + _arg1 = (bool ) tempbool1; + wxPyApp_SetAuto3D(_arg0,_arg1); + Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + +#define wxPyApp_SetClassName(_swigobj,_swigarg0) (_swigobj->SetClassName(_swigarg0)) +static PyObject *_wrap_wxPyApp_SetClassName(PyObject *self, PyObject *args) { + PyObject * _resultobj; + wxPyApp * _arg0; + wxString * _arg1; + char * _argc0 = 0; + PyObject * _obj1 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"sO:wxPyApp_SetClassName",&_argc0,&_obj1)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_SetClassName. Expected _wxPyApp_p."); + return NULL; + } + } +{ + if (!PyString_Check(_obj1)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + _arg1 = new wxString(PyString_AsString(_obj1)); +} + wxPyApp_SetClassName(_arg0,*_arg1); + Py_INCREF(Py_None); + _resultobj = Py_None; +{ + if (_obj1) + delete _arg1; +} + return _resultobj; +} + +#define wxPyApp_SetExitOnFrameDelete(_swigobj,_swigarg0) (_swigobj->SetExitOnFrameDelete(_swigarg0)) +static PyObject *_wrap_wxPyApp_SetExitOnFrameDelete(PyObject *self, PyObject *args) { + PyObject * _resultobj; + wxPyApp * _arg0; + bool _arg1; + char * _argc0 = 0; + int tempbool1; + + self = self; + if(!PyArg_ParseTuple(args,"si:wxPyApp_SetExitOnFrameDelete",&_argc0,&tempbool1)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_SetExitOnFrameDelete. Expected _wxPyApp_p."); + return NULL; + } + } + _arg1 = (bool ) tempbool1; + wxPyApp_SetExitOnFrameDelete(_arg0,_arg1); + Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + +#define wxPyApp_SetPrintMode(_swigobj,_swigarg0) (_swigobj->SetPrintMode(_swigarg0)) +static PyObject *_wrap_wxPyApp_SetPrintMode(PyObject *self, PyObject *args) { + PyObject * _resultobj; + wxPyApp * _arg0; + int _arg1; + char * _argc0 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"si:wxPyApp_SetPrintMode",&_argc0,&_arg1)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_SetPrintMode. Expected _wxPyApp_p."); + return NULL; + } + } + wxPyApp_SetPrintMode(_arg0,_arg1); + Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + +#define wxPyApp_SetTopWindow(_swigobj,_swigarg0) (_swigobj->SetTopWindow(_swigarg0)) +static PyObject *_wrap_wxPyApp_SetTopWindow(PyObject *self, PyObject *args) { + PyObject * _resultobj; + wxPyApp * _arg0; + wxWindow * _arg1; + char * _argc0 = 0; + char * _argc1 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"ss:wxPyApp_SetTopWindow",&_argc0,&_argc1)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_SetTopWindow. Expected _wxPyApp_p."); + return NULL; + } + } + if (_argc1) { + if (SWIG_GetPtr(_argc1,(void **) &_arg1,"_wxWindow_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 2 of wxPyApp_SetTopWindow. Expected _wxWindow_p."); + return NULL; + } + } + wxPyApp_SetTopWindow(_arg0,_arg1); + Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + +#define wxPyApp_SetVendorName(_swigobj,_swigarg0) (_swigobj->SetVendorName(_swigarg0)) +static PyObject *_wrap_wxPyApp_SetVendorName(PyObject *self, PyObject *args) { + PyObject * _resultobj; + wxPyApp * _arg0; + wxString * _arg1; + char * _argc0 = 0; + PyObject * _obj1 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"sO:wxPyApp_SetVendorName",&_argc0,&_obj1)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_SetVendorName. Expected _wxPyApp_p."); + return NULL; + } + } +{ + if (!PyString_Check(_obj1)) { + PyErr_SetString(PyExc_TypeError, wxStringErrorMsg); + return NULL; + } + _arg1 = new wxString(PyString_AsString(_obj1)); +} + wxPyApp_SetVendorName(_arg0,*_arg1); + Py_INCREF(Py_None); + _resultobj = Py_None; +{ + if (_obj1) + delete _arg1; +} + return _resultobj; +} + +#define wxPyApp_AfterMainLoop(_swigobj) (_swigobj->AfterMainLoop()) +static PyObject *_wrap_wxPyApp_AfterMainLoop(PyObject *self, PyObject *args) { + PyObject * _resultobj; + wxPyApp * _arg0; + char * _argc0 = 0; + + self = self; + if(!PyArg_ParseTuple(args,"s:wxPyApp_AfterMainLoop",&_argc0)) + return NULL; + if (_argc0) { + if (SWIG_GetPtr(_argc0,(void **) &_arg0,"_wxPyApp_p")) { + PyErr_SetString(PyExc_TypeError,"Type error in argument 1 of wxPyApp_AfterMainLoop. Expected _wxPyApp_p."); + return NULL; + } + } + wxPyApp_AfterMainLoop(_arg0); + Py_INCREF(Py_None); + _resultobj = Py_None; + return _resultobj; +} + +static PyMethodDef wxpcMethods[] = { + { "wxPyApp_AfterMainLoop", _wrap_wxPyApp_AfterMainLoop, 1 }, + { "wxPyApp_SetVendorName", _wrap_wxPyApp_SetVendorName, 1 }, + { "wxPyApp_SetTopWindow", _wrap_wxPyApp_SetTopWindow, 1 }, + { "wxPyApp_SetPrintMode", _wrap_wxPyApp_SetPrintMode, 1 }, + { "wxPyApp_SetExitOnFrameDelete", _wrap_wxPyApp_SetExitOnFrameDelete, 1 }, + { "wxPyApp_SetClassName", _wrap_wxPyApp_SetClassName, 1 }, + { "wxPyApp_SetAuto3D", _wrap_wxPyApp_SetAuto3D, 1 }, + { "wxPyApp_SetAppName", _wrap_wxPyApp_SetAppName, 1 }, + { "wxPyApp_Pending", _wrap_wxPyApp_Pending, 1 }, + { "wxPyApp_MainLoop", _wrap_wxPyApp_MainLoop, 1 }, + { "wxPyApp_Initialized", _wrap_wxPyApp_Initialized, 1 }, + { "wxPyApp_ExitMainLoop", _wrap_wxPyApp_ExitMainLoop, 1 }, + { "wxPyApp_Dispatch", _wrap_wxPyApp_Dispatch, 1 }, + { "wxPyApp_GetVendorName", _wrap_wxPyApp_GetVendorName, 1 }, + { "wxPyApp_GetTopWindow", _wrap_wxPyApp_GetTopWindow, 1 }, + { "wxPyApp_GetPrintMode", _wrap_wxPyApp_GetPrintMode, 1 }, + { "wxPyApp_GetExitOnFrameDelete", _wrap_wxPyApp_GetExitOnFrameDelete, 1 }, + { "wxPyApp_GetClassName", _wrap_wxPyApp_GetClassName, 1 }, + { "wxPyApp_GetAuto3D", _wrap_wxPyApp_GetAuto3D, 1 }, + { "wxPyApp_GetAppName", _wrap_wxPyApp_GetAppName, 1 }, + { "new_wxPyApp", _wrap_new_wxPyApp, 1 }, + { "_wxSetDictionary", __wxSetDictionary, 1 }, + { "_wxStart", __wxStart, 1 }, + { NULL, NULL } +}; +static PyObject *SWIG_globals; +#ifdef __cplusplus +extern "C" +#endif +SWIGEXPORT(void,initwxpc)() { + PyObject *m, *d; + SWIG_globals = SWIG_newvarlink(); + m = Py_InitModule("wxpc", wxpcMethods); + d = PyModule_GetDict(m); + PyDict_SetItemString(d,"wxMAJOR_VERSION", PyInt_FromLong((long) wxMAJOR_VERSION)); + PyDict_SetItemString(d,"wxMINOR_VERSION", PyInt_FromLong((long) wxMINOR_VERSION)); + PyDict_SetItemString(d,"wxRELEASE_NUMBER", PyInt_FromLong((long) wxRELEASE_NUMBER)); + PyDict_SetItemString(d,"UNKNOWN", PyInt_FromLong((long) UNKNOWN)); + PyDict_SetItemString(d,"NOT_FOUND", PyInt_FromLong((long) NOT_FOUND)); + PyDict_SetItemString(d,"wxVSCROLL", PyInt_FromLong((long) wxVSCROLL)); + PyDict_SetItemString(d,"wxHSCROLL", PyInt_FromLong((long) wxHSCROLL)); + PyDict_SetItemString(d,"wxCAPTION", PyInt_FromLong((long) wxCAPTION)); + PyDict_SetItemString(d,"wxDOUBLE_BORDER", PyInt_FromLong((long) wxDOUBLE_BORDER)); + PyDict_SetItemString(d,"wxSUNKEN_BORDER", PyInt_FromLong((long) wxSUNKEN_BORDER)); + PyDict_SetItemString(d,"wxRAISED_BORDER", PyInt_FromLong((long) wxRAISED_BORDER)); + PyDict_SetItemString(d,"wxBORDER", PyInt_FromLong((long) wxBORDER)); + PyDict_SetItemString(d,"wxSIMPLE_BORDER", PyInt_FromLong((long) wxSIMPLE_BORDER)); + PyDict_SetItemString(d,"wxSTATIC_BORDER", PyInt_FromLong((long) wxSTATIC_BORDER)); + PyDict_SetItemString(d,"wxTRANSPARENT_WINDOW", PyInt_FromLong((long) wxTRANSPARENT_WINDOW)); + PyDict_SetItemString(d,"wxNO_BORDER", PyInt_FromLong((long) wxNO_BORDER)); + PyDict_SetItemString(d,"wxUSER_COLOURS", PyInt_FromLong((long) wxUSER_COLOURS)); + PyDict_SetItemString(d,"wxNO_3D", PyInt_FromLong((long) wxNO_3D)); + PyDict_SetItemString(d,"wxTAB_TRAVERSAL", PyInt_FromLong((long) wxTAB_TRAVERSAL)); + PyDict_SetItemString(d,"wxHORIZONTAL", PyInt_FromLong((long) wxHORIZONTAL)); + PyDict_SetItemString(d,"wxVERTICAL", PyInt_FromLong((long) wxVERTICAL)); + PyDict_SetItemString(d,"wxBOTH", PyInt_FromLong((long) wxBOTH)); + PyDict_SetItemString(d,"wxCENTER_FRAME", PyInt_FromLong((long) wxCENTER_FRAME)); + PyDict_SetItemString(d,"wxSTAY_ON_TOP", PyInt_FromLong((long) wxSTAY_ON_TOP)); + PyDict_SetItemString(d,"wxICONIZE", PyInt_FromLong((long) wxICONIZE)); + PyDict_SetItemString(d,"wxMINIMIZE", PyInt_FromLong((long) wxMINIMIZE)); + PyDict_SetItemString(d,"wxMAXIMIZE", PyInt_FromLong((long) wxMAXIMIZE)); + PyDict_SetItemString(d,"wxTHICK_FRAME", PyInt_FromLong((long) wxTHICK_FRAME)); + PyDict_SetItemString(d,"wxSYSTEM_MENU", PyInt_FromLong((long) wxSYSTEM_MENU)); + PyDict_SetItemString(d,"wxMINIMIZE_BOX", PyInt_FromLong((long) wxMINIMIZE_BOX)); + PyDict_SetItemString(d,"wxMAXIMIZE_BOX", PyInt_FromLong((long) wxMAXIMIZE_BOX)); + PyDict_SetItemString(d,"wxTINY_CAPTION_HORIZ", PyInt_FromLong((long) wxTINY_CAPTION_HORIZ)); + PyDict_SetItemString(d,"wxTINY_CAPTION_VERT", PyInt_FromLong((long) wxTINY_CAPTION_VERT)); + PyDict_SetItemString(d,"wxRESIZE_BOX", PyInt_FromLong((long) wxRESIZE_BOX)); + PyDict_SetItemString(d,"wxRESIZE_BORDER", PyInt_FromLong((long) wxRESIZE_BORDER)); + PyDict_SetItemString(d,"wxDIALOG_MODAL", PyInt_FromLong((long) wxDIALOG_MODAL)); + PyDict_SetItemString(d,"wxDIALOG_MODELESS", PyInt_FromLong((long) wxDIALOG_MODELESS)); + PyDict_SetItemString(d,"wxDEFAULT_FRAME_STYLE", PyInt_FromLong((long) wxDEFAULT_FRAME_STYLE)); + PyDict_SetItemString(d,"wxDEFAULT_DIALOG_STYLE", PyInt_FromLong((long) wxDEFAULT_DIALOG_STYLE)); + PyDict_SetItemString(d,"wxRETAINED", PyInt_FromLong((long) wxRETAINED)); + PyDict_SetItemString(d,"wxBACKINGSTORE", PyInt_FromLong((long) wxBACKINGSTORE)); + PyDict_SetItemString(d,"wxTB_3DBUTTONS", PyInt_FromLong((long) wxTB_3DBUTTONS)); + PyDict_SetItemString(d,"wxTB_HORIZONTAL", PyInt_FromLong((long) wxTB_HORIZONTAL)); + PyDict_SetItemString(d,"wxTB_VERTICAL", PyInt_FromLong((long) wxTB_VERTICAL)); + PyDict_SetItemString(d,"wxCOLOURED", PyInt_FromLong((long) wxCOLOURED)); + PyDict_SetItemString(d,"wxFIXED_LENGTH", PyInt_FromLong((long) wxFIXED_LENGTH)); + PyDict_SetItemString(d,"wxALIGN_LEFT", PyInt_FromLong((long) wxALIGN_LEFT)); + PyDict_SetItemString(d,"wxALIGN_CENTER", PyInt_FromLong((long) wxALIGN_CENTER)); + PyDict_SetItemString(d,"wxALIGN_CENTRE", PyInt_FromLong((long) wxALIGN_CENTRE)); + PyDict_SetItemString(d,"wxALIGN_RIGHT", PyInt_FromLong((long) wxALIGN_RIGHT)); + PyDict_SetItemString(d,"wxLB_NEEDED_SB", PyInt_FromLong((long) wxLB_NEEDED_SB)); + PyDict_SetItemString(d,"wxLB_ALWAYS_SB", PyInt_FromLong((long) wxLB_ALWAYS_SB)); + PyDict_SetItemString(d,"wxLB_SORT", PyInt_FromLong((long) wxLB_SORT)); + PyDict_SetItemString(d,"wxLB_SINGLE", PyInt_FromLong((long) wxLB_SINGLE)); + PyDict_SetItemString(d,"wxLB_MULTIPLE", PyInt_FromLong((long) wxLB_MULTIPLE)); + PyDict_SetItemString(d,"wxLB_EXTENDED", PyInt_FromLong((long) wxLB_EXTENDED)); + PyDict_SetItemString(d,"wxLB_OWNERDRAW", PyInt_FromLong((long) wxLB_OWNERDRAW)); + PyDict_SetItemString(d,"wxLB_HSCROLL", PyInt_FromLong((long) wxLB_HSCROLL)); + PyDict_SetItemString(d,"wxPROCESS_ENTER", PyInt_FromLong((long) wxPROCESS_ENTER)); + PyDict_SetItemString(d,"wxPASSWORD", PyInt_FromLong((long) wxPASSWORD)); + PyDict_SetItemString(d,"wxTE_PROCESS_ENTER", PyInt_FromLong((long) wxTE_PROCESS_ENTER)); + PyDict_SetItemString(d,"wxTE_PASSWORD", PyInt_FromLong((long) wxTE_PASSWORD)); + PyDict_SetItemString(d,"wxTE_READONLY", PyInt_FromLong((long) wxTE_READONLY)); + PyDict_SetItemString(d,"wxTE_MULTILINE", PyInt_FromLong((long) wxTE_MULTILINE)); + PyDict_SetItemString(d,"wxCB_SIMPLE", PyInt_FromLong((long) wxCB_SIMPLE)); + PyDict_SetItemString(d,"wxCB_DROPDOWN", PyInt_FromLong((long) wxCB_DROPDOWN)); + PyDict_SetItemString(d,"wxCB_SORT", PyInt_FromLong((long) wxCB_SORT)); + PyDict_SetItemString(d,"wxCB_READONLY", PyInt_FromLong((long) wxCB_READONLY)); + PyDict_SetItemString(d,"wxRA_HORIZONTAL", PyInt_FromLong((long) wxRA_HORIZONTAL)); + PyDict_SetItemString(d,"wxRA_VERTICAL", PyInt_FromLong((long) wxRA_VERTICAL)); + PyDict_SetItemString(d,"wxRB_GROUP", PyInt_FromLong((long) wxRB_GROUP)); + PyDict_SetItemString(d,"wxGA_PROGRESSBAR", PyInt_FromLong((long) wxGA_PROGRESSBAR)); + PyDict_SetItemString(d,"wxGA_HORIZONTAL", PyInt_FromLong((long) wxGA_HORIZONTAL)); + PyDict_SetItemString(d,"wxGA_VERTICAL", PyInt_FromLong((long) wxGA_VERTICAL)); + PyDict_SetItemString(d,"wxSL_HORIZONTAL", PyInt_FromLong((long) wxSL_HORIZONTAL)); + PyDict_SetItemString(d,"wxSL_VERTICAL", PyInt_FromLong((long) wxSL_VERTICAL)); + PyDict_SetItemString(d,"wxSL_AUTOTICKS", PyInt_FromLong((long) wxSL_AUTOTICKS)); + PyDict_SetItemString(d,"wxSL_LABELS", PyInt_FromLong((long) wxSL_LABELS)); + PyDict_SetItemString(d,"wxSL_LEFT", PyInt_FromLong((long) wxSL_LEFT)); + PyDict_SetItemString(d,"wxSL_TOP", PyInt_FromLong((long) wxSL_TOP)); + PyDict_SetItemString(d,"wxSL_RIGHT", PyInt_FromLong((long) wxSL_RIGHT)); + PyDict_SetItemString(d,"wxSL_BOTTOM", PyInt_FromLong((long) wxSL_BOTTOM)); + PyDict_SetItemString(d,"wxSL_BOTH", PyInt_FromLong((long) wxSL_BOTH)); + PyDict_SetItemString(d,"wxSL_SELRANGE", PyInt_FromLong((long) wxSL_SELRANGE)); + PyDict_SetItemString(d,"wxSB_HORIZONTAL", PyInt_FromLong((long) wxSB_HORIZONTAL)); + PyDict_SetItemString(d,"wxSB_VERTICAL", PyInt_FromLong((long) wxSB_VERTICAL)); + PyDict_SetItemString(d,"wxBU_AUTODRAW", PyInt_FromLong((long) wxBU_AUTODRAW)); + PyDict_SetItemString(d,"wxBU_NOAUTODRAW", PyInt_FromLong((long) wxBU_NOAUTODRAW)); + PyDict_SetItemString(d,"wxTR_HAS_BUTTONS", PyInt_FromLong((long) wxTR_HAS_BUTTONS)); + PyDict_SetItemString(d,"wxTR_EDIT_LABELS", PyInt_FromLong((long) wxTR_EDIT_LABELS)); + PyDict_SetItemString(d,"wxLC_ICON", PyInt_FromLong((long) wxLC_ICON)); + PyDict_SetItemString(d,"wxLC_SMALL_ICON", PyInt_FromLong((long) wxLC_SMALL_ICON)); + PyDict_SetItemString(d,"wxLC_LIST", PyInt_FromLong((long) wxLC_LIST)); + PyDict_SetItemString(d,"wxLC_REPORT", PyInt_FromLong((long) wxLC_REPORT)); + PyDict_SetItemString(d,"wxLC_ALIGN_TOP", PyInt_FromLong((long) wxLC_ALIGN_TOP)); + PyDict_SetItemString(d,"wxLC_ALIGN_LEFT", PyInt_FromLong((long) wxLC_ALIGN_LEFT)); + PyDict_SetItemString(d,"wxLC_AUTOARRANGE", PyInt_FromLong((long) wxLC_AUTOARRANGE)); + PyDict_SetItemString(d,"wxLC_USER_TEXT", PyInt_FromLong((long) wxLC_USER_TEXT)); + PyDict_SetItemString(d,"wxLC_EDIT_LABELS", PyInt_FromLong((long) wxLC_EDIT_LABELS)); + PyDict_SetItemString(d,"wxLC_NO_HEADER", PyInt_FromLong((long) wxLC_NO_HEADER)); + PyDict_SetItemString(d,"wxLC_NO_SORT_HEADER", PyInt_FromLong((long) wxLC_NO_SORT_HEADER)); + PyDict_SetItemString(d,"wxLC_SINGLE_SEL", PyInt_FromLong((long) wxLC_SINGLE_SEL)); + PyDict_SetItemString(d,"wxLC_SORT_ASCENDING", PyInt_FromLong((long) wxLC_SORT_ASCENDING)); + PyDict_SetItemString(d,"wxLC_SORT_DESCENDING", PyInt_FromLong((long) wxLC_SORT_DESCENDING)); + PyDict_SetItemString(d,"wxLC_MASK_TYPE", PyInt_FromLong((long) wxLC_MASK_TYPE)); + PyDict_SetItemString(d,"wxLC_MASK_ALIGN", PyInt_FromLong((long) wxLC_MASK_ALIGN)); + PyDict_SetItemString(d,"wxLC_MASK_SORT", PyInt_FromLong((long) wxLC_MASK_SORT)); + PyDict_SetItemString(d,"wxSP_VERTICAL", PyInt_FromLong((long) wxSP_VERTICAL)); + PyDict_SetItemString(d,"wxSP_HORIZONTAL", PyInt_FromLong((long) wxSP_HORIZONTAL)); + PyDict_SetItemString(d,"wxSP_ARROW_KEYS", PyInt_FromLong((long) wxSP_ARROW_KEYS)); + PyDict_SetItemString(d,"wxSP_WRAP", PyInt_FromLong((long) wxSP_WRAP)); + PyDict_SetItemString(d,"wxSP_NOBORDER", PyInt_FromLong((long) wxSP_NOBORDER)); + PyDict_SetItemString(d,"wxSP_3D", PyInt_FromLong((long) wxSP_3D)); + PyDict_SetItemString(d,"wxSP_BORDER", PyInt_FromLong((long) wxSP_BORDER)); + PyDict_SetItemString(d,"wxTAB_MULTILINE", PyInt_FromLong((long) wxTAB_MULTILINE)); + PyDict_SetItemString(d,"wxTAB_RIGHTJUSTIFY", PyInt_FromLong((long) wxTAB_RIGHTJUSTIFY)); + PyDict_SetItemString(d,"wxTAB_FIXEDWIDTH", PyInt_FromLong((long) wxTAB_FIXEDWIDTH)); + PyDict_SetItemString(d,"wxTAB_OWNERDRAW", PyInt_FromLong((long) wxTAB_OWNERDRAW)); + PyDict_SetItemString(d,"wxFLOOD_SURFACE", PyInt_FromLong((long) wxFLOOD_SURFACE)); + PyDict_SetItemString(d,"wxFLOOD_BORDER", PyInt_FromLong((long) wxFLOOD_BORDER)); + PyDict_SetItemString(d,"wxODDEVEN_RULE", PyInt_FromLong((long) wxODDEVEN_RULE)); + PyDict_SetItemString(d,"wxWINDING_RULE", PyInt_FromLong((long) wxWINDING_RULE)); + PyDict_SetItemString(d,"wxTOOL_TOP", PyInt_FromLong((long) wxTOOL_TOP)); + PyDict_SetItemString(d,"wxTOOL_BOTTOM", PyInt_FromLong((long) wxTOOL_BOTTOM)); + PyDict_SetItemString(d,"wxTOOL_LEFT", PyInt_FromLong((long) wxTOOL_LEFT)); + PyDict_SetItemString(d,"wxTOOL_RIGHT", PyInt_FromLong((long) wxTOOL_RIGHT)); + PyDict_SetItemString(d,"wxOK", PyInt_FromLong((long) wxOK)); + PyDict_SetItemString(d,"wxYES_NO", PyInt_FromLong((long) wxYES_NO)); + PyDict_SetItemString(d,"wxCANCEL", PyInt_FromLong((long) wxCANCEL)); + PyDict_SetItemString(d,"wxYES", PyInt_FromLong((long) wxYES)); + PyDict_SetItemString(d,"wxNO", PyInt_FromLong((long) wxNO)); + PyDict_SetItemString(d,"wxICON_EXCLAMATION", PyInt_FromLong((long) wxICON_EXCLAMATION)); + PyDict_SetItemString(d,"wxICON_HAND", PyInt_FromLong((long) wxICON_HAND)); + PyDict_SetItemString(d,"wxICON_QUESTION", PyInt_FromLong((long) wxICON_QUESTION)); + PyDict_SetItemString(d,"wxICON_INFORMATION", PyInt_FromLong((long) wxICON_INFORMATION)); + PyDict_SetItemString(d,"wxICON_STOP", PyInt_FromLong((long) wxICON_STOP)); + PyDict_SetItemString(d,"wxICON_ASTERISK", PyInt_FromLong((long) wxICON_ASTERISK)); + PyDict_SetItemString(d,"wxICON_MASK", PyInt_FromLong((long) wxICON_MASK)); + PyDict_SetItemString(d,"wxCENTRE", PyInt_FromLong((long) wxCENTRE)); + PyDict_SetItemString(d,"wxCENTER", PyInt_FromLong((long) wxCENTER)); + PyDict_SetItemString(d,"wxSIZE_AUTO_WIDTH", PyInt_FromLong((long) wxSIZE_AUTO_WIDTH)); + PyDict_SetItemString(d,"wxSIZE_AUTO_HEIGHT", PyInt_FromLong((long) wxSIZE_AUTO_HEIGHT)); + PyDict_SetItemString(d,"wxSIZE_AUTO", PyInt_FromLong((long) wxSIZE_AUTO)); + PyDict_SetItemString(d,"wxSIZE_USE_EXISTING", PyInt_FromLong((long) wxSIZE_USE_EXISTING)); + PyDict_SetItemString(d,"wxSIZE_ALLOW_MINUS_ONE", PyInt_FromLong((long) wxSIZE_ALLOW_MINUS_ONE)); + PyDict_SetItemString(d,"wxDF_TEXT", PyInt_FromLong((long) wxDF_TEXT)); + PyDict_SetItemString(d,"wxDF_BITMAP", PyInt_FromLong((long) wxDF_BITMAP)); + PyDict_SetItemString(d,"wxDF_METAFILE", PyInt_FromLong((long) wxDF_METAFILE)); + PyDict_SetItemString(d,"wxDF_DIB", PyInt_FromLong((long) wxDF_DIB)); + PyDict_SetItemString(d,"wxDF_OEMTEXT", PyInt_FromLong((long) wxDF_OEMTEXT)); + PyDict_SetItemString(d,"wxDF_FILENAME", PyInt_FromLong((long) wxDF_FILENAME)); + PyDict_SetItemString(d,"wxPORTRAIT", PyInt_FromLong((long) wxPORTRAIT)); + PyDict_SetItemString(d,"wxLANDSCAPE", PyInt_FromLong((long) wxLANDSCAPE)); + PyDict_SetItemString(d,"wxID_OPEN", PyInt_FromLong((long) wxID_OPEN)); + PyDict_SetItemString(d,"wxID_CLOSE", PyInt_FromLong((long) wxID_CLOSE)); + PyDict_SetItemString(d,"wxID_NEW", PyInt_FromLong((long) wxID_NEW)); + PyDict_SetItemString(d,"wxID_SAVE", PyInt_FromLong((long) wxID_SAVE)); + PyDict_SetItemString(d,"wxID_SAVEAS", PyInt_FromLong((long) wxID_SAVEAS)); + PyDict_SetItemString(d,"wxID_REVERT", PyInt_FromLong((long) wxID_REVERT)); + PyDict_SetItemString(d,"wxID_EXIT", PyInt_FromLong((long) wxID_EXIT)); + PyDict_SetItemString(d,"wxID_UNDO", PyInt_FromLong((long) wxID_UNDO)); + PyDict_SetItemString(d,"wxID_REDO", PyInt_FromLong((long) wxID_REDO)); + PyDict_SetItemString(d,"wxID_HELP", PyInt_FromLong((long) wxID_HELP)); + PyDict_SetItemString(d,"wxID_PRINT", PyInt_FromLong((long) wxID_PRINT)); + PyDict_SetItemString(d,"wxID_PRINT_SETUP", PyInt_FromLong((long) wxID_PRINT_SETUP)); + PyDict_SetItemString(d,"wxID_PREVIEW", PyInt_FromLong((long) wxID_PREVIEW)); + PyDict_SetItemString(d,"wxID_ABOUT", PyInt_FromLong((long) wxID_ABOUT)); + PyDict_SetItemString(d,"wxID_HELP_CONTENTS", PyInt_FromLong((long) wxID_HELP_CONTENTS)); + PyDict_SetItemString(d,"wxID_HELP_COMMANDS", PyInt_FromLong((long) wxID_HELP_COMMANDS)); + PyDict_SetItemString(d,"wxID_HELP_PROCEDURES", PyInt_FromLong((long) wxID_HELP_PROCEDURES)); + PyDict_SetItemString(d,"wxID_HELP_CONTEXT", PyInt_FromLong((long) wxID_HELP_CONTEXT)); + PyDict_SetItemString(d,"wxID_CUT", PyInt_FromLong((long) wxID_CUT)); + PyDict_SetItemString(d,"wxID_COPY", PyInt_FromLong((long) wxID_COPY)); + PyDict_SetItemString(d,"wxID_PASTE", PyInt_FromLong((long) wxID_PASTE)); + PyDict_SetItemString(d,"wxID_CLEAR", PyInt_FromLong((long) wxID_CLEAR)); + PyDict_SetItemString(d,"wxID_FIND", PyInt_FromLong((long) wxID_FIND)); + PyDict_SetItemString(d,"wxID_FILE1", PyInt_FromLong((long) wxID_FILE1)); + PyDict_SetItemString(d,"wxID_FILE2", PyInt_FromLong((long) wxID_FILE2)); + PyDict_SetItemString(d,"wxID_FILE3", PyInt_FromLong((long) wxID_FILE3)); + PyDict_SetItemString(d,"wxID_FILE4", PyInt_FromLong((long) wxID_FILE4)); + PyDict_SetItemString(d,"wxID_FILE5", PyInt_FromLong((long) wxID_FILE5)); + PyDict_SetItemString(d,"wxID_FILE6", PyInt_FromLong((long) wxID_FILE6)); + PyDict_SetItemString(d,"wxID_FILE7", PyInt_FromLong((long) wxID_FILE7)); + PyDict_SetItemString(d,"wxID_FILE8", PyInt_FromLong((long) wxID_FILE8)); + PyDict_SetItemString(d,"wxID_FILE9", PyInt_FromLong((long) wxID_FILE9)); + PyDict_SetItemString(d,"wxID_OK", PyInt_FromLong((long) wxID_OK)); + PyDict_SetItemString(d,"wxID_CANCEL", PyInt_FromLong((long) wxID_CANCEL)); + PyDict_SetItemString(d,"wxID_APPLY", PyInt_FromLong((long) wxID_APPLY)); + PyDict_SetItemString(d,"wxID_YES", PyInt_FromLong((long) wxID_YES)); + PyDict_SetItemString(d,"wxID_NO", PyInt_FromLong((long) wxID_NO)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_BMP", PyInt_FromLong((long) wxBITMAP_TYPE_BMP)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_BMP_RESOURCE", PyInt_FromLong((long) wxBITMAP_TYPE_BMP_RESOURCE)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_ICO", PyInt_FromLong((long) wxBITMAP_TYPE_ICO)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_ICO_RESOURCE", PyInt_FromLong((long) wxBITMAP_TYPE_ICO_RESOURCE)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_CUR", PyInt_FromLong((long) wxBITMAP_TYPE_CUR)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_CUR_RESOURCE", PyInt_FromLong((long) wxBITMAP_TYPE_CUR_RESOURCE)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_XBM", PyInt_FromLong((long) wxBITMAP_TYPE_XBM)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_XBM_DATA", PyInt_FromLong((long) wxBITMAP_TYPE_XBM_DATA)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_XPM", PyInt_FromLong((long) wxBITMAP_TYPE_XPM)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_XPM_DATA", PyInt_FromLong((long) wxBITMAP_TYPE_XPM_DATA)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_TIF", PyInt_FromLong((long) wxBITMAP_TYPE_TIF)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_TIF_RESOURCE", PyInt_FromLong((long) wxBITMAP_TYPE_TIF_RESOURCE)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_GIF", PyInt_FromLong((long) wxBITMAP_TYPE_GIF)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_GIF_RESOURCE", PyInt_FromLong((long) wxBITMAP_TYPE_GIF_RESOURCE)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_PNG", PyInt_FromLong((long) wxBITMAP_TYPE_PNG)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_PNG_RESOURCE", PyInt_FromLong((long) wxBITMAP_TYPE_PNG_RESOURCE)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_ANY", PyInt_FromLong((long) wxBITMAP_TYPE_ANY)); + PyDict_SetItemString(d,"wxBITMAP_TYPE_RESOURCE", PyInt_FromLong((long) wxBITMAP_TYPE_RESOURCE)); + PyDict_SetItemString(d,"wxOPEN", PyInt_FromLong((long) wxOPEN)); + PyDict_SetItemString(d,"wxSAVE", PyInt_FromLong((long) wxSAVE)); + PyDict_SetItemString(d,"wxHIDE_READONLY", PyInt_FromLong((long) wxHIDE_READONLY)); + PyDict_SetItemString(d,"wxOVERWRITE_PROMPT", PyInt_FromLong((long) wxOVERWRITE_PROMPT)); + PyDict_SetItemString(d,"wxACCEL_ALT", PyInt_FromLong((long) wxACCEL_ALT)); + PyDict_SetItemString(d,"wxACCEL_CTRL", PyInt_FromLong((long) wxACCEL_CTRL)); + PyDict_SetItemString(d,"wxACCEL_SHIFT", PyInt_FromLong((long) wxACCEL_SHIFT)); + PyDict_SetItemString(d,"ERR_PARAM", PyInt_FromLong((long) ERR_PARAM)); + PyDict_SetItemString(d,"ERR_NODATA", PyInt_FromLong((long) ERR_NODATA)); + PyDict_SetItemString(d,"ERR_CANCEL", PyInt_FromLong((long) ERR_CANCEL)); + PyDict_SetItemString(d,"ERR_SUCCESS", PyInt_FromLong((long) ERR_SUCCESS)); + PyDict_SetItemString(d,"wxDEFAULT", PyInt_FromLong((long) wxDEFAULT)); + PyDict_SetItemString(d,"wxDECORATIVE", PyInt_FromLong((long) wxDECORATIVE)); + PyDict_SetItemString(d,"wxROMAN", PyInt_FromLong((long) wxROMAN)); + PyDict_SetItemString(d,"wxSCRIPT", PyInt_FromLong((long) wxSCRIPT)); + PyDict_SetItemString(d,"wxSWISS", PyInt_FromLong((long) wxSWISS)); + PyDict_SetItemString(d,"wxMODERN", PyInt_FromLong((long) wxMODERN)); + PyDict_SetItemString(d,"wxTELETYPE", PyInt_FromLong((long) wxTELETYPE)); + PyDict_SetItemString(d,"wxVARIABLE", PyInt_FromLong((long) wxVARIABLE)); + PyDict_SetItemString(d,"wxFIXED", PyInt_FromLong((long) wxFIXED)); + PyDict_SetItemString(d,"wxNORMAL", PyInt_FromLong((long) wxNORMAL)); + PyDict_SetItemString(d,"wxLIGHT", PyInt_FromLong((long) wxLIGHT)); + PyDict_SetItemString(d,"wxBOLD", PyInt_FromLong((long) wxBOLD)); + PyDict_SetItemString(d,"wxITALIC", PyInt_FromLong((long) wxITALIC)); + PyDict_SetItemString(d,"wxSLANT", PyInt_FromLong((long) wxSLANT)); + PyDict_SetItemString(d,"wxSOLID", PyInt_FromLong((long) wxSOLID)); + PyDict_SetItemString(d,"wxDOT", PyInt_FromLong((long) wxDOT)); + PyDict_SetItemString(d,"wxLONG_DASH", PyInt_FromLong((long) wxLONG_DASH)); + PyDict_SetItemString(d,"wxSHORT_DASH", PyInt_FromLong((long) wxSHORT_DASH)); + PyDict_SetItemString(d,"wxDOT_DASH", PyInt_FromLong((long) wxDOT_DASH)); + PyDict_SetItemString(d,"wxUSER_DASH", PyInt_FromLong((long) wxUSER_DASH)); + PyDict_SetItemString(d,"wxTRANSPARENT", PyInt_FromLong((long) wxTRANSPARENT)); + PyDict_SetItemString(d,"wxSTIPPLE", PyInt_FromLong((long) wxSTIPPLE)); + PyDict_SetItemString(d,"wxBDIAGONAL_HATCH", PyInt_FromLong((long) wxBDIAGONAL_HATCH)); + PyDict_SetItemString(d,"wxCROSSDIAG_HATCH", PyInt_FromLong((long) wxCROSSDIAG_HATCH)); + PyDict_SetItemString(d,"wxFDIAGONAL_HATCH", PyInt_FromLong((long) wxFDIAGONAL_HATCH)); + PyDict_SetItemString(d,"wxCROSS_HATCH", PyInt_FromLong((long) wxCROSS_HATCH)); + PyDict_SetItemString(d,"wxHORIZONTAL_HATCH", PyInt_FromLong((long) wxHORIZONTAL_HATCH)); + PyDict_SetItemString(d,"wxVERTICAL_HATCH", PyInt_FromLong((long) wxVERTICAL_HATCH)); + PyDict_SetItemString(d,"wxJOIN_BEVEL", PyInt_FromLong((long) wxJOIN_BEVEL)); + PyDict_SetItemString(d,"wxJOIN_MITER", PyInt_FromLong((long) wxJOIN_MITER)); + PyDict_SetItemString(d,"wxJOIN_ROUND", PyInt_FromLong((long) wxJOIN_ROUND)); + PyDict_SetItemString(d,"wxCAP_ROUND", PyInt_FromLong((long) wxCAP_ROUND)); + PyDict_SetItemString(d,"wxCAP_PROJECTING", PyInt_FromLong((long) wxCAP_PROJECTING)); + PyDict_SetItemString(d,"wxCAP_BUTT", PyInt_FromLong((long) wxCAP_BUTT)); + PyDict_SetItemString(d,"wxCLEAR", PyInt_FromLong((long) wxCLEAR)); + PyDict_SetItemString(d,"wxXOR", PyInt_FromLong((long) wxXOR)); + PyDict_SetItemString(d,"wxINVERT", PyInt_FromLong((long) wxINVERT)); + PyDict_SetItemString(d,"wxOR_REVERSE", PyInt_FromLong((long) wxOR_REVERSE)); + PyDict_SetItemString(d,"wxAND_REVERSE", PyInt_FromLong((long) wxAND_REVERSE)); + PyDict_SetItemString(d,"wxCOPY", PyInt_FromLong((long) wxCOPY)); + PyDict_SetItemString(d,"wxAND", PyInt_FromLong((long) wxAND)); + PyDict_SetItemString(d,"wxAND_INVERT", PyInt_FromLong((long) wxAND_INVERT)); + PyDict_SetItemString(d,"wxNO_OP", PyInt_FromLong((long) wxNO_OP)); + PyDict_SetItemString(d,"wxNOR", PyInt_FromLong((long) wxNOR)); + PyDict_SetItemString(d,"wxEQUIV", PyInt_FromLong((long) wxEQUIV)); + PyDict_SetItemString(d,"wxSRC_INVERT", PyInt_FromLong((long) wxSRC_INVERT)); + PyDict_SetItemString(d,"wxOR_INVERT", PyInt_FromLong((long) wxOR_INVERT)); + PyDict_SetItemString(d,"wxNAND", PyInt_FromLong((long) wxNAND)); + PyDict_SetItemString(d,"wxOR", PyInt_FromLong((long) wxOR)); + PyDict_SetItemString(d,"wxSET", PyInt_FromLong((long) wxSET)); + PyDict_SetItemString(d,"wxSRC_OR", PyInt_FromLong((long) wxSRC_OR)); + PyDict_SetItemString(d,"wxSRC_AND", PyInt_FromLong((long) wxSRC_AND)); + PyDict_SetItemString(d,"WXK_BACK", PyInt_FromLong((long) WXK_BACK)); + PyDict_SetItemString(d,"WXK_TAB", PyInt_FromLong((long) WXK_TAB)); + PyDict_SetItemString(d,"WXK_RETURN", PyInt_FromLong((long) WXK_RETURN)); + PyDict_SetItemString(d,"WXK_ESCAPE", PyInt_FromLong((long) WXK_ESCAPE)); + PyDict_SetItemString(d,"WXK_SPACE", PyInt_FromLong((long) WXK_SPACE)); + PyDict_SetItemString(d,"WXK_DELETE", PyInt_FromLong((long) WXK_DELETE)); + PyDict_SetItemString(d,"WXK_START", PyInt_FromLong((long) WXK_START)); + PyDict_SetItemString(d,"WXK_LBUTTON", PyInt_FromLong((long) WXK_LBUTTON)); + PyDict_SetItemString(d,"WXK_RBUTTON", PyInt_FromLong((long) WXK_RBUTTON)); + PyDict_SetItemString(d,"WXK_CANCEL", PyInt_FromLong((long) WXK_CANCEL)); + PyDict_SetItemString(d,"WXK_MBUTTON", PyInt_FromLong((long) WXK_MBUTTON)); + PyDict_SetItemString(d,"WXK_CLEAR", PyInt_FromLong((long) WXK_CLEAR)); + PyDict_SetItemString(d,"WXK_SHIFT", PyInt_FromLong((long) WXK_SHIFT)); + PyDict_SetItemString(d,"WXK_CONTROL", PyInt_FromLong((long) WXK_CONTROL)); + PyDict_SetItemString(d,"WXK_MENU", PyInt_FromLong((long) WXK_MENU)); + PyDict_SetItemString(d,"WXK_PAUSE", PyInt_FromLong((long) WXK_PAUSE)); + PyDict_SetItemString(d,"WXK_CAPITAL", PyInt_FromLong((long) WXK_CAPITAL)); + PyDict_SetItemString(d,"WXK_PRIOR", PyInt_FromLong((long) WXK_PRIOR)); + PyDict_SetItemString(d,"WXK_NEXT", PyInt_FromLong((long) WXK_NEXT)); + PyDict_SetItemString(d,"WXK_END", PyInt_FromLong((long) WXK_END)); + PyDict_SetItemString(d,"WXK_HOME", PyInt_FromLong((long) WXK_HOME)); + PyDict_SetItemString(d,"WXK_LEFT", PyInt_FromLong((long) WXK_LEFT)); + PyDict_SetItemString(d,"WXK_UP", PyInt_FromLong((long) WXK_UP)); + PyDict_SetItemString(d,"WXK_RIGHT", PyInt_FromLong((long) WXK_RIGHT)); + PyDict_SetItemString(d,"WXK_DOWN", PyInt_FromLong((long) WXK_DOWN)); + PyDict_SetItemString(d,"WXK_SELECT", PyInt_FromLong((long) WXK_SELECT)); + PyDict_SetItemString(d,"WXK_PRINT", PyInt_FromLong((long) WXK_PRINT)); + PyDict_SetItemString(d,"WXK_EXECUTE", PyInt_FromLong((long) WXK_EXECUTE)); + PyDict_SetItemString(d,"WXK_SNAPSHOT", PyInt_FromLong((long) WXK_SNAPSHOT)); + PyDict_SetItemString(d,"WXK_INSERT", PyInt_FromLong((long) WXK_INSERT)); + PyDict_SetItemString(d,"WXK_HELP", PyInt_FromLong((long) WXK_HELP)); + PyDict_SetItemString(d,"WXK_NUMPAD0", PyInt_FromLong((long) WXK_NUMPAD0)); + PyDict_SetItemString(d,"WXK_NUMPAD1", PyInt_FromLong((long) WXK_NUMPAD1)); + PyDict_SetItemString(d,"WXK_NUMPAD2", PyInt_FromLong((long) WXK_NUMPAD2)); + PyDict_SetItemString(d,"WXK_NUMPAD3", PyInt_FromLong((long) WXK_NUMPAD3)); + PyDict_SetItemString(d,"WXK_NUMPAD4", PyInt_FromLong((long) WXK_NUMPAD4)); + PyDict_SetItemString(d,"WXK_NUMPAD5", PyInt_FromLong((long) WXK_NUMPAD5)); + PyDict_SetItemString(d,"WXK_NUMPAD6", PyInt_FromLong((long) WXK_NUMPAD6)); + PyDict_SetItemString(d,"WXK_NUMPAD7", PyInt_FromLong((long) WXK_NUMPAD7)); + PyDict_SetItemString(d,"WXK_NUMPAD8", PyInt_FromLong((long) WXK_NUMPAD8)); + PyDict_SetItemString(d,"WXK_NUMPAD9", PyInt_FromLong((long) WXK_NUMPAD9)); + PyDict_SetItemString(d,"WXK_MULTIPLY", PyInt_FromLong((long) WXK_MULTIPLY)); + PyDict_SetItemString(d,"WXK_ADD", PyInt_FromLong((long) WXK_ADD)); + PyDict_SetItemString(d,"WXK_SEPARATOR", PyInt_FromLong((long) WXK_SEPARATOR)); + PyDict_SetItemString(d,"WXK_SUBTRACT", PyInt_FromLong((long) WXK_SUBTRACT)); + PyDict_SetItemString(d,"WXK_DECIMAL", PyInt_FromLong((long) WXK_DECIMAL)); + PyDict_SetItemString(d,"WXK_DIVIDE", PyInt_FromLong((long) WXK_DIVIDE)); + PyDict_SetItemString(d,"WXK_F1", PyInt_FromLong((long) WXK_F1)); + PyDict_SetItemString(d,"WXK_F2", PyInt_FromLong((long) WXK_F2)); + PyDict_SetItemString(d,"WXK_F3", PyInt_FromLong((long) WXK_F3)); + PyDict_SetItemString(d,"WXK_F4", PyInt_FromLong((long) WXK_F4)); + PyDict_SetItemString(d,"WXK_F5", PyInt_FromLong((long) WXK_F5)); + PyDict_SetItemString(d,"WXK_F6", PyInt_FromLong((long) WXK_F6)); + PyDict_SetItemString(d,"WXK_F7", PyInt_FromLong((long) WXK_F7)); + PyDict_SetItemString(d,"WXK_F8", PyInt_FromLong((long) WXK_F8)); + PyDict_SetItemString(d,"WXK_F9", PyInt_FromLong((long) WXK_F9)); + PyDict_SetItemString(d,"WXK_F10", PyInt_FromLong((long) WXK_F10)); + PyDict_SetItemString(d,"WXK_F11", PyInt_FromLong((long) WXK_F11)); + PyDict_SetItemString(d,"WXK_F12", PyInt_FromLong((long) WXK_F12)); + PyDict_SetItemString(d,"WXK_F13", PyInt_FromLong((long) WXK_F13)); + PyDict_SetItemString(d,"WXK_F14", PyInt_FromLong((long) WXK_F14)); + PyDict_SetItemString(d,"WXK_F15", PyInt_FromLong((long) WXK_F15)); + PyDict_SetItemString(d,"WXK_F16", PyInt_FromLong((long) WXK_F16)); + PyDict_SetItemString(d,"WXK_F17", PyInt_FromLong((long) WXK_F17)); + PyDict_SetItemString(d,"WXK_F18", PyInt_FromLong((long) WXK_F18)); + PyDict_SetItemString(d,"WXK_F19", PyInt_FromLong((long) WXK_F19)); + PyDict_SetItemString(d,"WXK_F20", PyInt_FromLong((long) WXK_F20)); + PyDict_SetItemString(d,"WXK_F21", PyInt_FromLong((long) WXK_F21)); + PyDict_SetItemString(d,"WXK_F22", PyInt_FromLong((long) WXK_F22)); + PyDict_SetItemString(d,"WXK_F23", PyInt_FromLong((long) WXK_F23)); + PyDict_SetItemString(d,"WXK_F24", PyInt_FromLong((long) WXK_F24)); + PyDict_SetItemString(d,"WXK_NUMLOCK", PyInt_FromLong((long) WXK_NUMLOCK)); + PyDict_SetItemString(d,"WXK_SCROLL", PyInt_FromLong((long) WXK_SCROLL)); + PyDict_SetItemString(d,"WXK_PAGEUP", PyInt_FromLong((long) WXK_PAGEUP)); + PyDict_SetItemString(d,"WXK_PAGEDOWN", PyInt_FromLong((long) WXK_PAGEDOWN)); + PyDict_SetItemString(d,"wxCURSOR_ARROW", PyInt_FromLong((long) wxCURSOR_ARROW)); + PyDict_SetItemString(d,"wxCURSOR_BULLSEYE", PyInt_FromLong((long) wxCURSOR_BULLSEYE)); + PyDict_SetItemString(d,"wxCURSOR_CHAR", PyInt_FromLong((long) wxCURSOR_CHAR)); + PyDict_SetItemString(d,"wxCURSOR_CROSS", PyInt_FromLong((long) wxCURSOR_CROSS)); + PyDict_SetItemString(d,"wxCURSOR_HAND", PyInt_FromLong((long) wxCURSOR_HAND)); + PyDict_SetItemString(d,"wxCURSOR_IBEAM", PyInt_FromLong((long) wxCURSOR_IBEAM)); + PyDict_SetItemString(d,"wxCURSOR_LEFT_BUTTON", PyInt_FromLong((long) wxCURSOR_LEFT_BUTTON)); + PyDict_SetItemString(d,"wxCURSOR_MAGNIFIER", PyInt_FromLong((long) wxCURSOR_MAGNIFIER)); + PyDict_SetItemString(d,"wxCURSOR_MIDDLE_BUTTON", PyInt_FromLong((long) wxCURSOR_MIDDLE_BUTTON)); + PyDict_SetItemString(d,"wxCURSOR_NO_ENTRY", PyInt_FromLong((long) wxCURSOR_NO_ENTRY)); + PyDict_SetItemString(d,"wxCURSOR_PAINT_BRUSH", PyInt_FromLong((long) wxCURSOR_PAINT_BRUSH)); + PyDict_SetItemString(d,"wxCURSOR_PENCIL", PyInt_FromLong((long) wxCURSOR_PENCIL)); + PyDict_SetItemString(d,"wxCURSOR_POINT_LEFT", PyInt_FromLong((long) wxCURSOR_POINT_LEFT)); + PyDict_SetItemString(d,"wxCURSOR_POINT_RIGHT", PyInt_FromLong((long) wxCURSOR_POINT_RIGHT)); + PyDict_SetItemString(d,"wxCURSOR_QUESTION_ARROW", PyInt_FromLong((long) wxCURSOR_QUESTION_ARROW)); + PyDict_SetItemString(d,"wxCURSOR_RIGHT_BUTTON", PyInt_FromLong((long) wxCURSOR_RIGHT_BUTTON)); + PyDict_SetItemString(d,"wxCURSOR_SIZENESW", PyInt_FromLong((long) wxCURSOR_SIZENESW)); + PyDict_SetItemString(d,"wxCURSOR_SIZENS", PyInt_FromLong((long) wxCURSOR_SIZENS)); + PyDict_SetItemString(d,"wxCURSOR_SIZENWSE", PyInt_FromLong((long) wxCURSOR_SIZENWSE)); + PyDict_SetItemString(d,"wxCURSOR_SIZEWE", PyInt_FromLong((long) wxCURSOR_SIZEWE)); + PyDict_SetItemString(d,"wxCURSOR_SIZING", PyInt_FromLong((long) wxCURSOR_SIZING)); + PyDict_SetItemString(d,"wxCURSOR_SPRAYCAN", PyInt_FromLong((long) wxCURSOR_SPRAYCAN)); + PyDict_SetItemString(d,"wxCURSOR_WAIT", PyInt_FromLong((long) wxCURSOR_WAIT)); + PyDict_SetItemString(d,"wxCURSOR_WATCH", PyInt_FromLong((long) wxCURSOR_WATCH)); + PyDict_SetItemString(d,"wxCURSOR_BLANK", PyInt_FromLong((long) wxCURSOR_BLANK)); + PyDict_SetItemString(d,"FALSE", PyInt_FromLong((long) 0)); + PyDict_SetItemString(d,"false", PyInt_FromLong((long) 0)); + PyDict_SetItemString(d,"TRUE", PyInt_FromLong((long) 1)); + PyDict_SetItemString(d,"true", PyInt_FromLong((long) 1)); + PyDict_SetItemString(d,"wxEVT_NULL", PyInt_FromLong((long) wxEVT_NULL)); + PyDict_SetItemString(d,"wxEVT_FIRST", PyInt_FromLong((long) wxEVT_FIRST)); + PyDict_SetItemString(d,"wxEVT_COMMAND_BUTTON_CLICKED", PyInt_FromLong((long) wxEVT_COMMAND_BUTTON_CLICKED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_CHECKBOX_CLICKED", PyInt_FromLong((long) wxEVT_COMMAND_CHECKBOX_CLICKED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_CHOICE_SELECTED", PyInt_FromLong((long) wxEVT_COMMAND_CHOICE_SELECTED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LISTBOX_SELECTED", PyInt_FromLong((long) wxEVT_COMMAND_LISTBOX_SELECTED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LISTBOX_DOUBLECLICKED", PyInt_FromLong((long) wxEVT_COMMAND_LISTBOX_DOUBLECLICKED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_CHECKLISTBOX_TOGGLED", PyInt_FromLong((long) wxEVT_COMMAND_CHECKLISTBOX_TOGGLED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TEXT_UPDATED", PyInt_FromLong((long) wxEVT_COMMAND_TEXT_UPDATED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TEXT_ENTER", PyInt_FromLong((long) wxEVT_COMMAND_TEXT_ENTER)); + PyDict_SetItemString(d,"wxEVT_COMMAND_MENU_SELECTED", PyInt_FromLong((long) wxEVT_COMMAND_MENU_SELECTED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_SLIDER_UPDATED", PyInt_FromLong((long) wxEVT_COMMAND_SLIDER_UPDATED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_RADIOBOX_SELECTED", PyInt_FromLong((long) wxEVT_COMMAND_RADIOBOX_SELECTED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_RADIOBUTTON_SELECTED", PyInt_FromLong((long) wxEVT_COMMAND_RADIOBUTTON_SELECTED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_SCROLLBAR_UPDATED", PyInt_FromLong((long) wxEVT_COMMAND_SCROLLBAR_UPDATED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_VLBOX_SELECTED", PyInt_FromLong((long) wxEVT_COMMAND_VLBOX_SELECTED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_COMBOBOX_SELECTED", PyInt_FromLong((long) wxEVT_COMMAND_COMBOBOX_SELECTED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TOOL_CLICKED", PyInt_FromLong((long) wxEVT_COMMAND_TOOL_CLICKED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TOOL_RCLICKED", PyInt_FromLong((long) wxEVT_COMMAND_TOOL_RCLICKED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TOOL_ENTER", PyInt_FromLong((long) wxEVT_COMMAND_TOOL_ENTER)); + PyDict_SetItemString(d,"wxEVT_SET_FOCUS", PyInt_FromLong((long) wxEVT_SET_FOCUS)); + PyDict_SetItemString(d,"wxEVT_KILL_FOCUS", PyInt_FromLong((long) wxEVT_KILL_FOCUS)); + PyDict_SetItemString(d,"wxEVT_LEFT_DOWN", PyInt_FromLong((long) wxEVT_LEFT_DOWN)); + PyDict_SetItemString(d,"wxEVT_LEFT_UP", PyInt_FromLong((long) wxEVT_LEFT_UP)); + PyDict_SetItemString(d,"wxEVT_MIDDLE_DOWN", PyInt_FromLong((long) wxEVT_MIDDLE_DOWN)); + PyDict_SetItemString(d,"wxEVT_MIDDLE_UP", PyInt_FromLong((long) wxEVT_MIDDLE_UP)); + PyDict_SetItemString(d,"wxEVT_RIGHT_DOWN", PyInt_FromLong((long) wxEVT_RIGHT_DOWN)); + PyDict_SetItemString(d,"wxEVT_RIGHT_UP", PyInt_FromLong((long) wxEVT_RIGHT_UP)); + PyDict_SetItemString(d,"wxEVT_MOTION", PyInt_FromLong((long) wxEVT_MOTION)); + PyDict_SetItemString(d,"wxEVT_ENTER_WINDOW", PyInt_FromLong((long) wxEVT_ENTER_WINDOW)); + PyDict_SetItemString(d,"wxEVT_LEAVE_WINDOW", PyInt_FromLong((long) wxEVT_LEAVE_WINDOW)); + PyDict_SetItemString(d,"wxEVT_LEFT_DCLICK", PyInt_FromLong((long) wxEVT_LEFT_DCLICK)); + PyDict_SetItemString(d,"wxEVT_MIDDLE_DCLICK", PyInt_FromLong((long) wxEVT_MIDDLE_DCLICK)); + PyDict_SetItemString(d,"wxEVT_RIGHT_DCLICK", PyInt_FromLong((long) wxEVT_RIGHT_DCLICK)); + PyDict_SetItemString(d,"wxEVT_NC_LEFT_DOWN", PyInt_FromLong((long) wxEVT_NC_LEFT_DOWN)); + PyDict_SetItemString(d,"wxEVT_NC_LEFT_UP", PyInt_FromLong((long) wxEVT_NC_LEFT_UP)); + PyDict_SetItemString(d,"wxEVT_NC_MIDDLE_DOWN", PyInt_FromLong((long) wxEVT_NC_MIDDLE_DOWN)); + PyDict_SetItemString(d,"wxEVT_NC_MIDDLE_UP", PyInt_FromLong((long) wxEVT_NC_MIDDLE_UP)); + PyDict_SetItemString(d,"wxEVT_NC_RIGHT_DOWN", PyInt_FromLong((long) wxEVT_NC_RIGHT_DOWN)); + PyDict_SetItemString(d,"wxEVT_NC_RIGHT_UP", PyInt_FromLong((long) wxEVT_NC_RIGHT_UP)); + PyDict_SetItemString(d,"wxEVT_NC_MOTION", PyInt_FromLong((long) wxEVT_NC_MOTION)); + PyDict_SetItemString(d,"wxEVT_NC_ENTER_WINDOW", PyInt_FromLong((long) wxEVT_NC_ENTER_WINDOW)); + PyDict_SetItemString(d,"wxEVT_NC_LEAVE_WINDOW", PyInt_FromLong((long) wxEVT_NC_LEAVE_WINDOW)); + PyDict_SetItemString(d,"wxEVT_NC_LEFT_DCLICK", PyInt_FromLong((long) wxEVT_NC_LEFT_DCLICK)); + PyDict_SetItemString(d,"wxEVT_NC_MIDDLE_DCLICK", PyInt_FromLong((long) wxEVT_NC_MIDDLE_DCLICK)); + PyDict_SetItemString(d,"wxEVT_NC_RIGHT_DCLICK", PyInt_FromLong((long) wxEVT_NC_RIGHT_DCLICK)); + PyDict_SetItemString(d,"wxEVT_CHAR", PyInt_FromLong((long) wxEVT_CHAR)); + PyDict_SetItemString(d,"wxEVT_SCROLL_TOP", PyInt_FromLong((long) wxEVT_SCROLL_TOP)); + PyDict_SetItemString(d,"wxEVT_SCROLL_BOTTOM", PyInt_FromLong((long) wxEVT_SCROLL_BOTTOM)); + PyDict_SetItemString(d,"wxEVT_SCROLL_LINEUP", PyInt_FromLong((long) wxEVT_SCROLL_LINEUP)); + PyDict_SetItemString(d,"wxEVT_SCROLL_LINEDOWN", PyInt_FromLong((long) wxEVT_SCROLL_LINEDOWN)); + PyDict_SetItemString(d,"wxEVT_SCROLL_PAGEUP", PyInt_FromLong((long) wxEVT_SCROLL_PAGEUP)); + PyDict_SetItemString(d,"wxEVT_SCROLL_PAGEDOWN", PyInt_FromLong((long) wxEVT_SCROLL_PAGEDOWN)); + PyDict_SetItemString(d,"wxEVT_SCROLL_THUMBTRACK", PyInt_FromLong((long) wxEVT_SCROLL_THUMBTRACK)); + PyDict_SetItemString(d,"wxEVT_SIZE", PyInt_FromLong((long) wxEVT_SIZE)); + PyDict_SetItemString(d,"wxEVT_MOVE", PyInt_FromLong((long) wxEVT_MOVE)); + PyDict_SetItemString(d,"wxEVT_CLOSE_WINDOW", PyInt_FromLong((long) wxEVT_CLOSE_WINDOW)); + PyDict_SetItemString(d,"wxEVT_END_SESSION", PyInt_FromLong((long) wxEVT_END_SESSION)); + PyDict_SetItemString(d,"wxEVT_QUERY_END_SESSION", PyInt_FromLong((long) wxEVT_QUERY_END_SESSION)); + PyDict_SetItemString(d,"wxEVT_ACTIVATE_APP", PyInt_FromLong((long) wxEVT_ACTIVATE_APP)); + PyDict_SetItemString(d,"wxEVT_POWER", PyInt_FromLong((long) wxEVT_POWER)); + PyDict_SetItemString(d,"wxEVT_CHAR_HOOK", PyInt_FromLong((long) wxEVT_CHAR_HOOK)); + PyDict_SetItemString(d,"wxEVT_KEY_UP", PyInt_FromLong((long) wxEVT_KEY_UP)); + PyDict_SetItemString(d,"wxEVT_ACTIVATE", PyInt_FromLong((long) wxEVT_ACTIVATE)); + PyDict_SetItemString(d,"wxEVT_CREATE", PyInt_FromLong((long) wxEVT_CREATE)); + PyDict_SetItemString(d,"wxEVT_DESTROY", PyInt_FromLong((long) wxEVT_DESTROY)); + PyDict_SetItemString(d,"wxEVT_SHOW", PyInt_FromLong((long) wxEVT_SHOW)); + PyDict_SetItemString(d,"wxEVT_ICONIZE", PyInt_FromLong((long) wxEVT_ICONIZE)); + PyDict_SetItemString(d,"wxEVT_MAXIMIZE", PyInt_FromLong((long) wxEVT_MAXIMIZE)); + PyDict_SetItemString(d,"wxEVT_MOUSE_CAPTURE_CHANGED", PyInt_FromLong((long) wxEVT_MOUSE_CAPTURE_CHANGED)); + PyDict_SetItemString(d,"wxEVT_PAINT", PyInt_FromLong((long) wxEVT_PAINT)); + PyDict_SetItemString(d,"wxEVT_ERASE_BACKGROUND", PyInt_FromLong((long) wxEVT_ERASE_BACKGROUND)); + PyDict_SetItemString(d,"wxEVT_NC_PAINT", PyInt_FromLong((long) wxEVT_NC_PAINT)); + PyDict_SetItemString(d,"wxEVT_PAINT_ICON", PyInt_FromLong((long) wxEVT_PAINT_ICON)); + PyDict_SetItemString(d,"wxEVT_MENU_CHAR", PyInt_FromLong((long) wxEVT_MENU_CHAR)); + PyDict_SetItemString(d,"wxEVT_MENU_INIT", PyInt_FromLong((long) wxEVT_MENU_INIT)); + PyDict_SetItemString(d,"wxEVT_MENU_HIGHLIGHT", PyInt_FromLong((long) wxEVT_MENU_HIGHLIGHT)); + PyDict_SetItemString(d,"wxEVT_POPUP_MENU_INIT", PyInt_FromLong((long) wxEVT_POPUP_MENU_INIT)); + PyDict_SetItemString(d,"wxEVT_CONTEXT_MENU", PyInt_FromLong((long) wxEVT_CONTEXT_MENU)); + PyDict_SetItemString(d,"wxEVT_SYS_COLOUR_CHANGED", PyInt_FromLong((long) wxEVT_SYS_COLOUR_CHANGED)); + PyDict_SetItemString(d,"wxEVT_SETTING_CHANGED", PyInt_FromLong((long) wxEVT_SETTING_CHANGED)); + PyDict_SetItemString(d,"wxEVT_QUERY_NEW_PALETTE", PyInt_FromLong((long) wxEVT_QUERY_NEW_PALETTE)); + PyDict_SetItemString(d,"wxEVT_PALETTE_CHANGED", PyInt_FromLong((long) wxEVT_PALETTE_CHANGED)); + PyDict_SetItemString(d,"wxEVT_JOY_BUTTON_DOWN", PyInt_FromLong((long) wxEVT_JOY_BUTTON_DOWN)); + PyDict_SetItemString(d,"wxEVT_JOY_BUTTON_UP", PyInt_FromLong((long) wxEVT_JOY_BUTTON_UP)); + PyDict_SetItemString(d,"wxEVT_JOY_MOVE", PyInt_FromLong((long) wxEVT_JOY_MOVE)); + PyDict_SetItemString(d,"wxEVT_JOY_ZMOVE", PyInt_FromLong((long) wxEVT_JOY_ZMOVE)); + PyDict_SetItemString(d,"wxEVT_DROP_FILES", PyInt_FromLong((long) wxEVT_DROP_FILES)); + PyDict_SetItemString(d,"wxEVT_DRAW_ITEM", PyInt_FromLong((long) wxEVT_DRAW_ITEM)); + PyDict_SetItemString(d,"wxEVT_MEASURE_ITEM", PyInt_FromLong((long) wxEVT_MEASURE_ITEM)); + PyDict_SetItemString(d,"wxEVT_COMPARE_ITEM", PyInt_FromLong((long) wxEVT_COMPARE_ITEM)); + PyDict_SetItemString(d,"wxEVT_INIT_DIALOG", PyInt_FromLong((long) wxEVT_INIT_DIALOG)); + PyDict_SetItemString(d,"wxEVT_IDLE", PyInt_FromLong((long) wxEVT_IDLE)); + PyDict_SetItemString(d,"wxEVT_UPDATE_UI", PyInt_FromLong((long) wxEVT_UPDATE_UI)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LEFT_CLICK", PyInt_FromLong((long) wxEVT_COMMAND_LEFT_CLICK)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LEFT_DCLICK", PyInt_FromLong((long) wxEVT_COMMAND_LEFT_DCLICK)); + PyDict_SetItemString(d,"wxEVT_COMMAND_RIGHT_CLICK", PyInt_FromLong((long) wxEVT_COMMAND_RIGHT_CLICK)); + PyDict_SetItemString(d,"wxEVT_COMMAND_RIGHT_DCLICK", PyInt_FromLong((long) wxEVT_COMMAND_RIGHT_DCLICK)); + PyDict_SetItemString(d,"wxEVT_COMMAND_SET_FOCUS", PyInt_FromLong((long) wxEVT_COMMAND_SET_FOCUS)); + PyDict_SetItemString(d,"wxEVT_COMMAND_KILL_FOCUS", PyInt_FromLong((long) wxEVT_COMMAND_KILL_FOCUS)); + PyDict_SetItemString(d,"wxEVT_COMMAND_ENTER", PyInt_FromLong((long) wxEVT_COMMAND_ENTER)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TREE_BEGIN_DRAG", PyInt_FromLong((long) wxEVT_COMMAND_TREE_BEGIN_DRAG)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TREE_BEGIN_RDRAG", PyInt_FromLong((long) wxEVT_COMMAND_TREE_BEGIN_RDRAG)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT", PyInt_FromLong((long) wxEVT_COMMAND_TREE_BEGIN_LABEL_EDIT)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TREE_END_LABEL_EDIT", PyInt_FromLong((long) wxEVT_COMMAND_TREE_END_LABEL_EDIT)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TREE_DELETE_ITEM", PyInt_FromLong((long) wxEVT_COMMAND_TREE_DELETE_ITEM)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TREE_GET_INFO", PyInt_FromLong((long) wxEVT_COMMAND_TREE_GET_INFO)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TREE_SET_INFO", PyInt_FromLong((long) wxEVT_COMMAND_TREE_SET_INFO)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TREE_ITEM_EXPANDED", PyInt_FromLong((long) wxEVT_COMMAND_TREE_ITEM_EXPANDED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TREE_ITEM_EXPANDING", PyInt_FromLong((long) wxEVT_COMMAND_TREE_ITEM_EXPANDING)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TREE_SEL_CHANGED", PyInt_FromLong((long) wxEVT_COMMAND_TREE_SEL_CHANGED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TREE_SEL_CHANGING", PyInt_FromLong((long) wxEVT_COMMAND_TREE_SEL_CHANGING)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TREE_KEY_DOWN", PyInt_FromLong((long) wxEVT_COMMAND_TREE_KEY_DOWN)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LIST_BEGIN_DRAG", PyInt_FromLong((long) wxEVT_COMMAND_LIST_BEGIN_DRAG)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LIST_BEGIN_RDRAG", PyInt_FromLong((long) wxEVT_COMMAND_LIST_BEGIN_RDRAG)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT", PyInt_FromLong((long) wxEVT_COMMAND_LIST_BEGIN_LABEL_EDIT)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LIST_END_LABEL_EDIT", PyInt_FromLong((long) wxEVT_COMMAND_LIST_END_LABEL_EDIT)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LIST_DELETE_ITEM", PyInt_FromLong((long) wxEVT_COMMAND_LIST_DELETE_ITEM)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS", PyInt_FromLong((long) wxEVT_COMMAND_LIST_DELETE_ALL_ITEMS)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LIST_GET_INFO", PyInt_FromLong((long) wxEVT_COMMAND_LIST_GET_INFO)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LIST_SET_INFO", PyInt_FromLong((long) wxEVT_COMMAND_LIST_SET_INFO)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LIST_ITEM_SELECTED", PyInt_FromLong((long) wxEVT_COMMAND_LIST_ITEM_SELECTED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LIST_ITEM_DESELECTED", PyInt_FromLong((long) wxEVT_COMMAND_LIST_ITEM_DESELECTED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LIST_KEY_DOWN", PyInt_FromLong((long) wxEVT_COMMAND_LIST_KEY_DOWN)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LIST_INSERT_ITEM", PyInt_FromLong((long) wxEVT_COMMAND_LIST_INSERT_ITEM)); + PyDict_SetItemString(d,"wxEVT_COMMAND_LIST_COL_CLICK", PyInt_FromLong((long) wxEVT_COMMAND_LIST_COL_CLICK)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TAB_SEL_CHANGED", PyInt_FromLong((long) wxEVT_COMMAND_TAB_SEL_CHANGED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_TAB_SEL_CHANGING", PyInt_FromLong((long) wxEVT_COMMAND_TAB_SEL_CHANGING)); + PyDict_SetItemString(d,"wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED", PyInt_FromLong((long) wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGED)); + PyDict_SetItemString(d,"wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING", PyInt_FromLong((long) wxEVT_COMMAND_NOTEBOOK_PAGE_CHANGING)); + PyDict_SetItemString(d,"__version__", PyString_FromString("0.3.1")); + PyDict_SetItemString(d,"cvar", SWIG_globals); + SWIG_addvarlink(SWIG_globals,"wxPyDefaultPosition",_wrap_wxPyDefaultPosition_get, _wrap_wxPyDefaultPosition_set); + SWIG_addvarlink(SWIG_globals,"wxPyDefaultSize",_wrap_wxPyDefaultSize_get, _wrap_wxPyDefaultSize_set); + + // We don't want to run the wxEntry or OnInit yet, so we just do the + // beginings of what it would have done... See __wxStart() for the + // rest. +#ifdef __WXMSW__ + wxApp::Initialize((WXHINSTANCE)wxhInstance); +#endif +#ifdef __WXGTK__ + wxApp::CommonInit(); +#endif + + +// wxPyWindows = new wxHashTable(wxKEY_INTEGER, 100); + + // Since these modules are all linked together, initialize them now + // because python won't be able to find their shared library files, + // (since there isn't any.) + initwindowsc(); + initwindows2c(); + initeventsc(); + initmiscc(); + initgdic(); + initmdic(); + initcontrolsc(); + initcontrols2c(); + initcmndlgsc(); +/* + * These are the pointer type-equivalency mappings. + * (Used by the SWIG pointer type-checker). + */ + SWIG_RegisterMapping("_wxAcceleratorTable","_class_wxAcceleratorTable",0); + SWIG_RegisterMapping("_wxEvent","_class_wxEvent",0); + SWIG_RegisterMapping("_class_wxActivateEvent","_wxActivateEvent",0); + SWIG_RegisterMapping("_signed_long","_long",0); + SWIG_RegisterMapping("_wxMenuEvent","_class_wxMenuEvent",0); + SWIG_RegisterMapping("_wxFontData","_class_wxFontData",0); + SWIG_RegisterMapping("_class_wxMenuBar","_wxMenuBar",0); + SWIG_RegisterMapping("_class_wxEvtHandler","_class_wxPyApp",SwigwxPyAppTowxEvtHandler); + SWIG_RegisterMapping("_class_wxEvtHandler","_wxPyApp",SwigwxPyAppTowxEvtHandler); + SWIG_RegisterMapping("_class_wxEvtHandler","_wxEvtHandler",0); + SWIG_RegisterMapping("_wxPaintEvent","_class_wxPaintEvent",0); + SWIG_RegisterMapping("_wxIndividualLayoutConstraint","_class_wxIndividualLayoutConstraint",0); + SWIG_RegisterMapping("_wxCursor","_class_wxCursor",0); + SWIG_RegisterMapping("_class_wxTreeCtrl","_wxTreeCtrl",0); + SWIG_RegisterMapping("_wxMask","_class_wxMask",0); + SWIG_RegisterMapping("_wxGrid","_class_wxGrid",0); + SWIG_RegisterMapping("_wxPageSetupData","_class_wxPageSetupData",0); + SWIG_RegisterMapping("_wxPyMenu","_class_wxPyMenu",0); + SWIG_RegisterMapping("_class_wxColourData","_wxColourData",0); + SWIG_RegisterMapping("_wxPen","_class_wxPen",0); + SWIG_RegisterMapping("_wxUpdateUIEvent","_class_wxUpdateUIEvent",0); + SWIG_RegisterMapping("_byte","_unsigned_char",0); + SWIG_RegisterMapping("_wxStaticBox","_class_wxStaticBox",0); + SWIG_RegisterMapping("_wxChoice","_class_wxChoice",0); + SWIG_RegisterMapping("_wxSlider","_class_wxSlider",0); + SWIG_RegisterMapping("_wxNotebookEvent","_class_wxNotebookEvent",0); + SWIG_RegisterMapping("_long","_wxDash",0); + SWIG_RegisterMapping("_long","_unsigned_long",0); + SWIG_RegisterMapping("_long","_signed_long",0); + SWIG_RegisterMapping("_wxDropFilesEvent","_class_wxDropFilesEvent",0); + SWIG_RegisterMapping("_wxBitmapButton","_class_wxBitmapButton",0); + SWIG_RegisterMapping("_class_wxAcceleratorTable","_wxAcceleratorTable",0); + SWIG_RegisterMapping("_class_wxGauge","_wxGauge",0); + SWIG_RegisterMapping("_wxDC","_class_wxDC",0); + SWIG_RegisterMapping("_wxListEvent","_class_wxListEvent",0); + SWIG_RegisterMapping("_class_wxSingleChoiceDialog","_wxSingleChoiceDialog",0); + SWIG_RegisterMapping("_class_wxRealPoint","_wxRealPoint",0); + SWIG_RegisterMapping("_wxPrinterDC","_class_wxPrinterDC",0); + SWIG_RegisterMapping("_class_wxMenuItem","_wxMenuItem",0); + SWIG_RegisterMapping("_class_wxPaintEvent","_wxPaintEvent",0); + SWIG_RegisterMapping("_wxSysColourChangedEvent","_class_wxSysColourChangedEvent",0); + SWIG_RegisterMapping("_class_wxPostScriptDC","_wxPostScriptDC",0); + SWIG_RegisterMapping("_wxPanel","_class_wxPanel",0); + SWIG_RegisterMapping("_wxInitDialogEvent","_class_wxInitDialogEvent",0); + SWIG_RegisterMapping("_wxCheckBox","_class_wxCheckBox",0); + SWIG_RegisterMapping("_wxTextCtrl","_class_wxTextCtrl",0); + SWIG_RegisterMapping("_class_wxMask","_wxMask",0); + SWIG_RegisterMapping("_class_wxKeyEvent","_wxKeyEvent",0); + SWIG_RegisterMapping("_class_wxGrid","_wxGrid",0); + SWIG_RegisterMapping("_class_wxPageSetupData","_wxPageSetupData",0); + SWIG_RegisterMapping("_wxColour","_class_wxColour",0); + SWIG_RegisterMapping("_class_wxDialog","_wxDialog",0); + SWIG_RegisterMapping("_wxPageSetupDialog","_class_wxPageSetupDialog",0); + SWIG_RegisterMapping("_wxIdleEvent","_class_wxIdleEvent",0); + SWIG_RegisterMapping("_class_wxUpdateUIEvent","_wxUpdateUIEvent",0); + SWIG_RegisterMapping("_wxBrush","_class_wxBrush",0); + SWIG_RegisterMapping("_wxMiniFrame","_class_wxMiniFrame",0); + SWIG_RegisterMapping("_class_wxNotebookEvent","_wxNotebookEvent",0); + SWIG_RegisterMapping("_wxShowEvent","_class_wxShowEvent",0); + SWIG_RegisterMapping("_uint","_unsigned_int",0); + SWIG_RegisterMapping("_uint","_int",0); + SWIG_RegisterMapping("_uint","_wxWindowID",0); + SWIG_RegisterMapping("_class_wxEvent","_wxEvent",0); + SWIG_RegisterMapping("_wxRect","_class_wxRect",0); + SWIG_RegisterMapping("_wxCommandEvent","_class_wxCommandEvent",0); + SWIG_RegisterMapping("_wxSizeEvent","_class_wxSizeEvent",0); + SWIG_RegisterMapping("_wxPoint","_class_wxPoint",0); + SWIG_RegisterMapping("_class_wxButton","_wxButton",0); + SWIG_RegisterMapping("_wxRadioBox","_class_wxRadioBox",0); + SWIG_RegisterMapping("_class_wxFontData","_wxFontData",0); + SWIG_RegisterMapping("_wxBitmap","_class_wxBitmap",0); + SWIG_RegisterMapping("_wxPrintDialog","_class_wxPrintDialog",0); + SWIG_RegisterMapping("_wxPyTimer","_class_wxPyTimer",0); + SWIG_RegisterMapping("_wxScrollBar","_class_wxScrollBar",0); + SWIG_RegisterMapping("_wxSpinButton","_class_wxSpinButton",0); + SWIG_RegisterMapping("_wxColourDialog","_class_wxColourDialog",0); + SWIG_RegisterMapping("_wxPrintData","_class_wxPrintData",0); + SWIG_RegisterMapping("_class_wxIndividualLayoutConstraint","_wxIndividualLayoutConstraint",0); + SWIG_RegisterMapping("_wxMessageDialog","_class_wxMessageDialog",0); + SWIG_RegisterMapping("_wxTextEntryDialog","_class_wxTextEntryDialog",0); + SWIG_RegisterMapping("_class_wxIconizeEvent","_wxIconizeEvent",0); + SWIG_RegisterMapping("_class_wxStaticBitmap","_wxStaticBitmap",0); + SWIG_RegisterMapping("_wxMDIChildFrame","_class_wxMDIChildFrame",0); + SWIG_RegisterMapping("_wxListItem","_class_wxListItem",0); + SWIG_RegisterMapping("_wxScrollEvent","_class_wxScrollEvent",0); + SWIG_RegisterMapping("_EBool","_signed_int",0); + SWIG_RegisterMapping("_EBool","_int",0); + SWIG_RegisterMapping("_EBool","_wxWindowID",0); + SWIG_RegisterMapping("_class_wxDropFilesEvent","_wxDropFilesEvent",0); + SWIG_RegisterMapping("_wxStaticText","_class_wxStaticText",0); + SWIG_RegisterMapping("_wxFont","_class_wxFont",0); + SWIG_RegisterMapping("_wxCloseEvent","_class_wxCloseEvent",0); + SWIG_RegisterMapping("_wxNotebook","_class_wxNotebook",0); + SWIG_RegisterMapping("_unsigned_long","_wxDash",0); + SWIG_RegisterMapping("_unsigned_long","_long",0); + SWIG_RegisterMapping("_class_wxRect","_wxRect",0); + SWIG_RegisterMapping("_class_wxDC","_wxDC",0); + SWIG_RegisterMapping("_wxPyApp","_class_wxPyApp",0); + SWIG_RegisterMapping("_wxMDIParentFrame","_class_wxMDIParentFrame",0); + SWIG_RegisterMapping("_class_wxTreeEvent","_wxTreeEvent",0); + SWIG_RegisterMapping("_class_wxDirDialog","_wxDirDialog",0); + SWIG_RegisterMapping("_class_wxPyTimer","_wxPyTimer",0); + SWIG_RegisterMapping("_wxFocusEvent","_class_wxFocusEvent",0); + SWIG_RegisterMapping("_wxMaximizeEvent","_class_wxMaximizeEvent",0); + SWIG_RegisterMapping("_class_wxSpinButton","_wxSpinButton",0); + SWIG_RegisterMapping("_wxAcceleratorEntry","_class_wxAcceleratorEntry",0); + SWIG_RegisterMapping("_class_wxPanel","_wxPanel",0); + SWIG_RegisterMapping("_class_wxCheckBox","_wxCheckBox",0); + SWIG_RegisterMapping("_wxComboBox","_class_wxComboBox",0); + SWIG_RegisterMapping("_wxRadioButton","_class_wxRadioButton",0); + SWIG_RegisterMapping("_class_wxMessageDialog","_wxMessageDialog",0); + SWIG_RegisterMapping("_signed_int","_EBool",0); + SWIG_RegisterMapping("_signed_int","_wxWindowID",0); + SWIG_RegisterMapping("_signed_int","_int",0); + SWIG_RegisterMapping("_class_wxTextCtrl","_wxTextCtrl",0); + SWIG_RegisterMapping("_wxLayoutConstraints","_class_wxLayoutConstraints",0); + SWIG_RegisterMapping("_wxMetaFileDC","_class_wxMetaFileDC",0); + SWIG_RegisterMapping("_wxMenu","_class_wxMenu",0); + SWIG_RegisterMapping("_class_wxMoveEvent","_wxMoveEvent",0); + SWIG_RegisterMapping("_wxListBox","_class_wxListBox",0); + SWIG_RegisterMapping("_wxScreenDC","_class_wxScreenDC",0); + SWIG_RegisterMapping("_class_wxMDIChildFrame","_wxMDIChildFrame",0); + SWIG_RegisterMapping("_WXTYPE","_short",0); + SWIG_RegisterMapping("_WXTYPE","_signed_short",0); + SWIG_RegisterMapping("_WXTYPE","_unsigned_short",0); + SWIG_RegisterMapping("_wxFileDialog","_class_wxFileDialog",0); + SWIG_RegisterMapping("_class_wxMDIClientWindow","_wxMDIClientWindow",0); + SWIG_RegisterMapping("_class_wxBrush","_wxBrush",0); + SWIG_RegisterMapping("_unsigned_short","_WXTYPE",0); + SWIG_RegisterMapping("_unsigned_short","_short",0); + SWIG_RegisterMapping("_class_wxWindow","_wxWindow",0); + SWIG_RegisterMapping("_class_wxStaticText","_wxStaticText",0); + SWIG_RegisterMapping("_class_wxFont","_wxFont",0); + SWIG_RegisterMapping("_class_wxCloseEvent","_wxCloseEvent",0); + SWIG_RegisterMapping("_wxTreeItem","_class_wxTreeItem",0); + SWIG_RegisterMapping("_class_wxMenuEvent","_wxMenuEvent",0); + SWIG_RegisterMapping("_wxClientDC","_class_wxClientDC",0); + SWIG_RegisterMapping("_wxMouseEvent","_class_wxMouseEvent",0); + SWIG_RegisterMapping("_wxListCtrl","_class_wxListCtrl",0); + SWIG_RegisterMapping("_wxSingleChoiceDialog","_class_wxSingleChoiceDialog",0); + SWIG_RegisterMapping("_class_wxPoint","_wxPoint",0); + SWIG_RegisterMapping("_wxRealPoint","_class_wxRealPoint",0); + SWIG_RegisterMapping("_class_wxRadioBox","_wxRadioBox",0); + SWIG_RegisterMapping("_wxGridCell","_class_wxGridCell",0); + SWIG_RegisterMapping("_signed_short","_WXTYPE",0); + SWIG_RegisterMapping("_signed_short","_short",0); + SWIG_RegisterMapping("_wxMemoryDC","_class_wxMemoryDC",0); + SWIG_RegisterMapping("_class_wxPrintDialog","_wxPrintDialog",0); + SWIG_RegisterMapping("_wxPaintDC","_class_wxPaintDC",0); + SWIG_RegisterMapping("_class_wxFocusEvent","_wxFocusEvent",0); + SWIG_RegisterMapping("_class_wxMaximizeEvent","_wxMaximizeEvent",0); + SWIG_RegisterMapping("_class_wxAcceleratorEntry","_wxAcceleratorEntry",0); + SWIG_RegisterMapping("_class_wxCursor","_wxCursor",0); + SWIG_RegisterMapping("_wxPostScriptDC","_class_wxPostScriptDC",0); + SWIG_RegisterMapping("_wxScrolledWindow","_class_wxScrolledWindow",0); + SWIG_RegisterMapping("_unsigned_char","_byte",0); + SWIG_RegisterMapping("_class_wxMetaFileDC","_wxMetaFileDC",0); + SWIG_RegisterMapping("_class_wxMenu","_wxMenu",0); + SWIG_RegisterMapping("_wxControl","_class_wxControl",0); + SWIG_RegisterMapping("_class_wxListBox","_wxListBox",0); + SWIG_RegisterMapping("_wxTabCtrl","_class_wxTabCtrl",0); + SWIG_RegisterMapping("_unsigned_int","_uint",0); + SWIG_RegisterMapping("_unsigned_int","_wxWindowID",0); + SWIG_RegisterMapping("_unsigned_int","_int",0); + SWIG_RegisterMapping("_wxIcon","_class_wxIcon",0); + SWIG_RegisterMapping("_wxDialog","_class_wxDialog",0); + SWIG_RegisterMapping("_class_wxPyMenu","_wxPyMenu",0); + SWIG_RegisterMapping("_class_wxListItem","_wxListItem",0); + SWIG_RegisterMapping("_class_wxPen","_wxPen",0); + SWIG_RegisterMapping("_class_wxFileDialog","_wxFileDialog",0); + SWIG_RegisterMapping("_short","_WXTYPE",0); + SWIG_RegisterMapping("_short","_unsigned_short",0); + SWIG_RegisterMapping("_short","_signed_short",0); + SWIG_RegisterMapping("_class_wxStaticBox","_wxStaticBox",0); + SWIG_RegisterMapping("_class_wxScrollEvent","_wxScrollEvent",0); + SWIG_RegisterMapping("_wxJoystickEvent","_class_wxJoystickEvent",0); + SWIG_RegisterMapping("_class_wxChoice","_wxChoice",0); + SWIG_RegisterMapping("_class_wxSlider","_wxSlider",0); + SWIG_RegisterMapping("_class_wxBitmapButton","_wxBitmapButton",0); + SWIG_RegisterMapping("_wxTabEvent","_class_wxTabEvent",0); + SWIG_RegisterMapping("_wxFrame","_class_wxFrame",0); + SWIG_RegisterMapping("_class_wxNotebook","_wxNotebook",0); + SWIG_RegisterMapping("_wxWindowID","_EBool",0); + SWIG_RegisterMapping("_wxWindowID","_uint",0); + SWIG_RegisterMapping("_wxWindowID","_int",0); + SWIG_RegisterMapping("_wxWindowID","_signed_int",0); + SWIG_RegisterMapping("_wxWindowID","_unsigned_int",0); + SWIG_RegisterMapping("_int","_EBool",0); + SWIG_RegisterMapping("_int","_uint",0); + SWIG_RegisterMapping("_int","_wxWindowID",0); + SWIG_RegisterMapping("_int","_unsigned_int",0); + SWIG_RegisterMapping("_int","_signed_int",0); + SWIG_RegisterMapping("_class_wxMouseEvent","_wxMouseEvent",0); + SWIG_RegisterMapping("_class_wxListEvent","_wxListEvent",0); + SWIG_RegisterMapping("_wxButton","_class_wxButton",0); + SWIG_RegisterMapping("_class_wxPyApp","_wxPyApp",0); + SWIG_RegisterMapping("_wxSize","_class_wxSize",0); + SWIG_RegisterMapping("_class_wxPrinterDC","_wxPrinterDC",0); + SWIG_RegisterMapping("_class_wxMDIParentFrame","_wxMDIParentFrame",0); + SWIG_RegisterMapping("_class_wxPaintDC","_wxPaintDC",0); + SWIG_RegisterMapping("_class_wxSysColourChangedEvent","_wxSysColourChangedEvent",0); + SWIG_RegisterMapping("_class_wxInitDialogEvent","_wxInitDialogEvent",0); + SWIG_RegisterMapping("_class_wxComboBox","_wxComboBox",0); + SWIG_RegisterMapping("_class_wxRadioButton","_wxRadioButton",0); + SWIG_RegisterMapping("_wxTreeCtrl","_class_wxTreeCtrl",0); + SWIG_RegisterMapping("_class_wxLayoutConstraints","_wxLayoutConstraints",0); + SWIG_RegisterMapping("_wxIconizeEvent","_class_wxIconizeEvent",0); + SWIG_RegisterMapping("_class_wxControl","_wxControl",0); + SWIG_RegisterMapping("_wxStaticBitmap","_class_wxStaticBitmap",0); + SWIG_RegisterMapping("_class_wxTabCtrl","_wxTabCtrl",0); + SWIG_RegisterMapping("_class_wxIcon","_wxIcon",0); + SWIG_RegisterMapping("_class_wxColour","_wxColour",0); + SWIG_RegisterMapping("_class_wxScreenDC","_wxScreenDC",0); + SWIG_RegisterMapping("_class_wxPageSetupDialog","_wxPageSetupDialog",0); + SWIG_RegisterMapping("_class_wxIdleEvent","_wxIdleEvent",0); + SWIG_RegisterMapping("_wxEraseEvent","_class_wxEraseEvent",0); + SWIG_RegisterMapping("_class_wxMiniFrame","_wxMiniFrame",0); + SWIG_RegisterMapping("_class_wxJoystickEvent","_wxJoystickEvent",0); + SWIG_RegisterMapping("_wxFontDialog","_class_wxFontDialog",0); + SWIG_RegisterMapping("_class_wxShowEvent","_wxShowEvent",0); + SWIG_RegisterMapping("_wxActivateEvent","_class_wxActivateEvent",0); + SWIG_RegisterMapping("_wxGauge","_class_wxGauge",0); + SWIG_RegisterMapping("_class_wxTreeItem","_wxTreeItem",0); + SWIG_RegisterMapping("_class_wxCommandEvent","_wxCommandEvent",0); + SWIG_RegisterMapping("_class_wxClientDC","_wxClientDC",0); + SWIG_RegisterMapping("_class_wxSizeEvent","_wxSizeEvent",0); + SWIG_RegisterMapping("_class_wxListCtrl","_wxListCtrl",0); + SWIG_RegisterMapping("_class_wxGridCell","_wxGridCell",0); + SWIG_RegisterMapping("_class_wxSize","_wxSize",0); + SWIG_RegisterMapping("_class_wxBitmap","_wxBitmap",0); + SWIG_RegisterMapping("_class_wxMemoryDC","_wxMemoryDC",0); + SWIG_RegisterMapping("_wxMenuBar","_class_wxMenuBar",0); + SWIG_RegisterMapping("_wxTreeEvent","_class_wxTreeEvent",0); + SWIG_RegisterMapping("_wxDirDialog","_class_wxDirDialog",0); + SWIG_RegisterMapping("_wxEvtHandler","_class_wxPyApp",SwigwxPyAppTowxEvtHandler); + SWIG_RegisterMapping("_wxEvtHandler","_wxPyApp",SwigwxPyAppTowxEvtHandler); + SWIG_RegisterMapping("_wxEvtHandler","_class_wxEvtHandler",0); + SWIG_RegisterMapping("_wxMenuItem","_class_wxMenuItem",0); + SWIG_RegisterMapping("_class_wxScrollBar","_wxScrollBar",0); + SWIG_RegisterMapping("_class_wxColourDialog","_wxColourDialog",0); + SWIG_RegisterMapping("_class_wxPrintData","_wxPrintData",0); + SWIG_RegisterMapping("_wxDash","_unsigned_long",0); + SWIG_RegisterMapping("_wxDash","_long",0); + SWIG_RegisterMapping("_class_wxScrolledWindow","_wxScrolledWindow",0); + SWIG_RegisterMapping("_class_wxTextEntryDialog","_wxTextEntryDialog",0); + SWIG_RegisterMapping("_wxKeyEvent","_class_wxKeyEvent",0); + SWIG_RegisterMapping("_wxMoveEvent","_class_wxMoveEvent",0); + SWIG_RegisterMapping("_wxColourData","_class_wxColourData",0); + SWIG_RegisterMapping("_class_wxEraseEvent","_wxEraseEvent",0); + SWIG_RegisterMapping("_wxMDIClientWindow","_class_wxMDIClientWindow",0); + SWIG_RegisterMapping("_class_wxFontDialog","_wxFontDialog",0); + SWIG_RegisterMapping("_wxWindow","_class_wxWindow",0); + SWIG_RegisterMapping("_class_wxTabEvent","_wxTabEvent",0); + SWIG_RegisterMapping("_class_wxFrame","_wxFrame",0); +} diff --git a/wxPython/b.bat b/wxPython/b.bat index 4f9e1c3322..d68095f808 100755 --- a/wxPython/b.bat +++ b/wxPython/b.bat @@ -33,6 +33,7 @@ rem just remove the *.pyd's elseiff "%1" == "d" then shift set CMD=del wxPython\*.pyd + set OTHERCMD=del wxPython\*.pdb rem touch all the *.i files so swig will regenerate elseiff "%1" == "t" then diff --git a/wxPython/distrib/README.devel.txt b/wxPython/distrib/README.devel.txt new file mode 100644 index 0000000000..080bf7bb6b --- /dev/null +++ b/wxPython/distrib/README.devel.txt @@ -0,0 +1,27 @@ +This tarball contains all the files needed (I hope!) to allow you to +write win32 programs or Python extension modules that link to the same +wxWindows DLL that wxPython does. Files for both the normal (ANSI) +and unicode builds are included. + +You'll need to add the following directories to your Include path (the +/I flag for MSVC): + + wxPython-[version]\lib\mswdllh [for ANSI builds] + wxPython-[version]\lib\mswdlluh [for Unicode builds] + wxPython-[version]\include + +And also you should link with one of the wxmsw*.lib files in the lib +dir, use the one with the 'u' in the name for the Unicode build and +the one without for the ANSI build. + +I've also included some makefiles in the src dir to give you an idea +of what compiler and linker flags are required. You can also get this +info from wxPython's setup.py script. + +I'm sure I've forgotten something, so when you discover what it is +please let me know. Also, if anyone feels like turning this text into +a more detailed HOW-TO please send your text to me. + + +Robin + diff --git a/wxPython/distrib/make_installer.py b/wxPython/distrib/make_installer.py index 310efba1fe..3b77adba35 100644 --- a/wxPython/distrib/make_installer.py +++ b/wxPython/distrib/make_installer.py @@ -67,6 +67,7 @@ Name: tools; Description: "Tools"; Types: full [Files] Source: "%(SYSDIR)s\MSVCRT.dll"; DestDir: "{sys}"; CopyMode: alwaysskipifsameorolder; Flags: sharedfile uninsneveruninstall restartreplace; Components: core Source: "%(SYSDIR)s\MSVCIRT.dll"; DestDir: "{sys}"; CopyMode: alwaysskipifsameorolder; Flags: sharedfile uninsneveruninstall restartreplace; Components: core +Source: "%(SYSDIR)s\MSVCP60.dll"; DestDir: "{sys}"; CopyMode: alwaysskipifsameorolder; Flags: sharedfile uninsneveruninstall restartreplace; Components: core Source: "%(WXDIR)s\lib\%(WXDLL)s"; DestDir: "{app}\wxPython"; Components: core %(MSLU)s @@ -76,6 +77,7 @@ Source: "wxPython\gridc.pyd"; DestDir: "{app}\wxPython"; Component Source: "wxPython\helpc.pyd"; DestDir: "{app}\wxPython"; Components: core Source: "wxPython\htmlc.pyd"; DestDir: "{app}\wxPython"; Components: core Source: "wxPython\calendarc.pyd"; DestDir: "{app}\wxPython"; Components: core +Source: "wxPython\wizardc.pyd"; DestDir: "{app}\wxPython"; Components: core Source: "wxPython\glcanvasc.pyd"; DestDir: "{app}\wxPython"; Components: core Source: "wxPython\oglc.pyd"; DestDir: "{app}\wxPython"; Components: core Source: "wxPython\stc_c.pyd"; DestDir: "{app}\wxPython"; Components: core @@ -189,7 +191,8 @@ Source: "samples\embedded\*.xpm"; DestDir: "{app}\wxPython\samples\embe [Run] ;; Recreate the tool scripts to use the paths on the users machine -Filename: "{code:GetPythonDir}\python.exe"; Parameters: "CreateBatchFiles.py"; WorkingDir: "{code:GetPythonDir}\Scripts"; Components: tools +Filename: "{code:GetPythonDir}\python.exe"; Parameters: "{code:GetPythonDir}\Lib\compileall.py {app}\wxPython"; Description: "Compile Python .py files to .pyc"; Flags: postinstall; Components: core +Filename: "{code:GetPythonDir}\python.exe"; Parameters: "CreateBatchFiles.py"; WorkingDir: "{code:GetPythonDir}\Scripts"; Description: "Create batch files for tool scripts"; Flags: postinstall; Components: tools ;;------------------------------------------------------------ @@ -244,6 +247,15 @@ Type: files; Name: "{app}\wxPython\samples\stxview\StructuredText\*.pyc"; Type: files; Name: "{app}\wxPython\samples\stxview\StructuredText\*.pyo"; Type: files; Name: "{app}\wxPython\samples\frogedit\*.pyc"; Type: files; Name: "{app}\wxPython\samples\frogedit\*.pyo"; +Type: files; Name: "{app}\wxPython\demo\data\*.pyc"; +Type: files; Name: "{app}\wxPython\demo\data\*.pyo"; +Type: files; Name: "{app}\wxPython\demo\dllwidget\*.pyc"; +Type: files; Name: "{app}\wxPython\demo\dllwidget\*.pyo"; +Type: files; Name: "{app}\wxPython\samples\embedded\*.pyc"; +Type: files; Name: "{app}\wxPython\samples\embedded\*.pyo"; +Type: files; Name: "{app}\wxPython\samples\pySketch\*.pyc"; +Type: files; Name: "{app}\wxPython\samples\pySketch\*.pyo"; + ''' diff --git a/wxPython/distrib/makedemo b/wxPython/distrib/makedemo index 7dfe6cc356..bf340d4335 100755 --- a/wxPython/distrib/makedemo +++ b/wxPython/distrib/makedemo @@ -28,8 +28,8 @@ rm -f `find _distrib_tgz/wxPython-$1 -name *.so` cd _distrib_tgz -tar cvf ../dist/wxPython-demo-$1.tar wxPython-$1 -gzip ../dist/wxPython-demo-$1.tar +tar cvf ../dist/wxPythonDemo-$1.tar wxPython-$1 +gzip ../dist/wxPythonDemo-$1.tar cd .. rm -r _distrib_tgz diff --git a/wxPython/distrib/makedev.bat b/wxPython/distrib/makedev.bat index a7bc43f3d3..03368b9732 100755 --- a/wxPython/distrib/makedev.bat +++ b/wxPython/distrib/makedev.bat @@ -1,47 +1,70 @@ @echo off rem Builds a zip containing stuff needed to link with the wxWindows DLL -rem shipped with wxPython. This allows other developers to create apps +rem shipped with wxPython. This should allow other developers to create apps rem or extensions that can share the same DLL. setlocal +set BASE=_distrib_zip\wxPython-%1 -set BASE=wxPython-devel - +rem **** Make a directory to build up a distribution tree +mkdir _distrib_zip mkdir %BASE% -mkdir %BASE%\ReleaseDLL -mkdir %BASE%\HybridDLL -copy /s %WXWIN%\ReleaseDLL %BASE%\ReleaseDLL -copy /s %WXWIN%\HybridDLL %BASE%\HybridDLL -mkdir %BASE%\lib -copy %WXWIN%\lib\*.lib %BASE\lib -del %BASE%\lib\*d.lib -copy %WXWIN%\lib\*.dll %BASE\lib -del %BASE%\lib\*d.dll -copy %WXWIN%\lib\*.pdb %BASE\lib -del %BASE%\lib\*d.pdb -copy /s %WXWIN%\lib\mswdll %BASE\lib\mswdll -copy /s %WXWIN%\lib\mswdllh %BASE\lib\mswdllh - - -mkdir %BASE%\src -copy %WXWIN%\src\makevc.env %BASE%\src -copy %WXWIN%\src\*.vc %BASE%\src - -mkdir %BASE%\src\msw -mkdir %BASE%\src\msw\ReleaseDLL -copy %WXWIN%\src\msw\ReleaseDLL\dummy*.obj %BASE%\src\msw\ReleaseDLL -mkdir %BASE%\src\msw\HybridDLL -copy %WXWIN%\src\msw\HybridDLL\dummy*.obj %BASE%\src\msw\HybridDLL +rem *** copy files +copy distrib\README.devel.txt %BASE%\README.txt mkdir %BASE%\include mkdir %BASE%\include\wx -copy /s %WXWIN%\include\wx\* %BASE%\include\wx +copy /s %WXWIN%\include\wx\* %BASE%\include\wx + +mkdir %BASE%\lib +mkdir %BASE%\lib\mswdllh +mkdir %BASE%\lib\mswdlluh +copy /s %WXWIN%\lib\mswdllh\* %BASE%\lib\mswdllh +copy /s %WXWIN%\lib\mswdlluh\* %BASE%\lib\mswdlluh +copy %WXWIN%\lib\wxmsw*h.lib %BASE%\lib +copy %WXWIN%\lib\wxmsw*h.dll %BASE%\lib +copy %WXWIN%\lib\mslu.txt %BASE%\lib +copy %WXWIN%\lib\unicows.dll %BASE%\lib +copy %WXWIN%\lib\unicows.lib %BASE%\lib + +mkdir %BASE%\src +copy %WXWIN%\src\makevc.env %BASE%\src +copy %WXWIN%\src\makelib.vc %BASE%\src -zip -r dist\wxPython-devel-win32-%1.zip %BASE% -del /sxzy %BASE% +rem *** remove unneeded files +del /sxzy %BASE%\include\wx\CVS +del /sxzy %BASE%\include\wx\generic\CVS +del /sxzy %BASE%\include\wx\gtk\CVS +del /sxzy %BASE%\include\wx\html\CVS +del /sxzy %BASE%\include\wx\mac\CVS +del /sxzy %BASE%\include\wx\mgl\CVS +del /sxzy %BASE%\include\wx\motif\CVS +del /sxzy %BASE%\include\wx\msw\CVS +del /sxzy %BASE%\include\wx\msw\ctl3d\CVS +del /sxzy %BASE%\include\wx\msw\gnuwin32\CVS +del /sxzy %BASE%\include\wx\msw\gnuwin32\gl\CVS +del /sxzy %BASE%\include\wx\msw\ole\CVS +del /sxzy %BASE%\include\wx\os2\CVS +del /sxzy %BASE%\include\wx\protocol\CVS +del /sxzy %BASE%\include\wx\univ\CVS +del /sxzy %BASE%\include\wx\unix\CVS +del /sxzy %BASE%\include\wx\x11\CVS +del /sxzy %BASE%\include\wx\x11\nanox\CVS +del /sxzy %BASE%\include\wx\x11\nanox\X11\CVS + + + +rem *** bundle it all up +cd _distrib_zip +tar cvf ..\dist\wxPythonWIN32-devel-%1.tar wxPython-%1 +gzip -9 ..\dist\wxPythonWIN32-devel-%1.tar + +rem *** cleanup +cd .. +del /sxzy _distrib_zip endlocal diff --git a/wxPython/distrib/makedocs.bat b/wxPython/distrib/makedocs.bat new file mode 100755 index 0000000000..4e353fb32c --- /dev/null +++ b/wxPython/distrib/makedocs.bat @@ -0,0 +1,26 @@ +@echo off + +rem **** Make a directory to build up a distribution tree +md _distrib_zip +md _distrib_zip\wxPython-%1 + +cd _distrib_zip + +rem **** copy the docs into the tree +md wxPython-%1\docs +md wxPython-%1\docs\wx +md wxPython-%1\docs\ogl +copy %WXWIN%\docs\html\wx\*.* wxPython-%1\docs\wx +copy wxPython-%1\docs\wx\wx.htm wxPython-%1\docs\wx\index.htm +copy %WXWIN%\docs\html\ogl\*.* wxPython-%1\docs\ogl +copy wxPython-%1\docs\ogl\ogl.htm wxPython-%1\docs\ogl\index.htm + +rem **** zip up the docs +rem zip -r ..\distrib\wxPython-docs-%1.zip wxPython-%1\docs +tar cvf ..\dist\wxPythonDocs-%1.tar wxPython-%1 +gzip -9 ..\dist\wxPythonDocs-%1.tar + + +rem **** Cleanup +cd .. +del /sxzy _distrib_zip