Compare commits
34 Commits
wxPy_B4_UN
...
PRE_GTK_2_
Author | SHA1 | Date | |
---|---|---|---|
|
b9b167ab8d | ||
|
7fccee998d | ||
|
d5cf34f4dc | ||
|
21689736a7 | ||
|
4b2424bcad | ||
|
ec312631c6 | ||
|
59db9cfaa7 | ||
|
5541d1fda4 | ||
|
4c6b8d9e6f | ||
|
046ba576a8 | ||
|
b726509bdc | ||
|
d27294ac6e | ||
|
62313c2788 | ||
|
0fe5e8fea0 | ||
|
d1b327e1f9 | ||
|
2e7b0a1617 | ||
|
8b3fddc493 | ||
|
6a0fab3a3a | ||
|
fa03793d3b | ||
|
b82d2a004d | ||
|
326c7ea888 | ||
|
9b8270da40 | ||
|
ac92c7e948 | ||
|
a81cf6f490 | ||
|
9fcaaedd89 | ||
|
51c14c62de | ||
|
0470b3826a | ||
|
ec0674452a | ||
|
3373d6bfaf | ||
|
3aa5d53272 | ||
|
e25f954b96 | ||
|
6824d4f9e0 | ||
|
c8bc7bb84d | ||
|
3b7bc64a2a |
@@ -39,8 +39,10 @@ libtool
|
||||
aclocal.m4
|
||||
base
|
||||
gtk
|
||||
gtk2
|
||||
motif
|
||||
win32
|
||||
x11
|
||||
univ
|
||||
univ-debug
|
||||
univ-release
|
||||
|
48
configure
vendored
@@ -19415,48 +19415,10 @@ EOF
|
||||
|
||||
if test "$wxUSE_MSW" = 1; then
|
||||
if test "$wxUSE_MS_HTML_HELP" = "yes"; then
|
||||
ac_safe=`echo "htmlhelp.h" | sed 'y%./+-%__p_%'`
|
||||
echo $ac_n "checking for htmlhelp.h""... $ac_c" 1>&6
|
||||
echo "configure:19421: checking for htmlhelp.h" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 19426 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <htmlhelp.h>
|
||||
EOF
|
||||
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
||||
{ (eval echo configure:19431: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
|
||||
if test -z "$ac_err"; then
|
||||
rm -rf conftest*
|
||||
eval "ac_cv_header_$ac_safe=yes"
|
||||
else
|
||||
echo "$ac_err" >&5
|
||||
echo "configure: failed program was:" >&5
|
||||
cat conftest.$ac_ext >&5
|
||||
rm -rf conftest*
|
||||
eval "ac_cv_header_$ac_safe=no"
|
||||
fi
|
||||
rm -f conftest*
|
||||
fi
|
||||
if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then
|
||||
echo "$ac_t""yes" 1>&6
|
||||
|
||||
cat >> confdefs.h <<\EOF
|
||||
cat >> confdefs.h <<\EOF
|
||||
#define wxUSE_MS_HTML_HELP 1
|
||||
EOF
|
||||
|
||||
|
||||
else
|
||||
echo "$ac_t""no" 1>&6
|
||||
|
||||
echo "configure: warning: MS HTML Help cannot be used without htmlhelp.h... disabled" 1>&2
|
||||
wxUSE_MS_HTML_HELP=no
|
||||
|
||||
fi
|
||||
|
||||
fi
|
||||
fi
|
||||
|
||||
@@ -19519,17 +19481,17 @@ if test "$wxUSE_MSW" = 1 -a \( "$wxUSE_DATAOBJ" = "yes" \
|
||||
do
|
||||
ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
|
||||
echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
|
||||
echo "configure:19523: checking for $ac_hdr" >&5
|
||||
echo "configure:19485: checking for $ac_hdr" >&5
|
||||
if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 19528 "configure"
|
||||
#line 19490 "configure"
|
||||
#include "confdefs.h"
|
||||
#include <$ac_hdr>
|
||||
EOF
|
||||
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
||||
{ (eval echo configure:19533: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
{ (eval echo configure:19495: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||
ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
|
||||
if test -z "$ac_err"; then
|
||||
rm -rf conftest*
|
||||
@@ -20504,7 +20466,7 @@ SAMPLES_SUBDIRS="`echo $SAMPLES_SUBDIRS | tr -s ' ' | tr ' ' '\n' | sort | uniq
|
||||
|
||||
|
||||
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
|
||||
echo "configure:20508: checking whether ${MAKE-make} sets \${MAKE}" >&5
|
||||
echo "configure:20470: checking whether ${MAKE-make} sets \${MAKE}" >&5
|
||||
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
|
||||
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
|
@@ -4022,14 +4022,7 @@ if test "$wxUSE_HELP" = "yes"; then
|
||||
|
||||
if test "$wxUSE_MSW" = 1; then
|
||||
if test "$wxUSE_MS_HTML_HELP" = "yes"; then
|
||||
AC_CHECK_HEADER(htmlhelp.h,
|
||||
[
|
||||
AC_DEFINE(wxUSE_MS_HTML_HELP)
|
||||
],
|
||||
[
|
||||
AC_MSG_WARN([MS HTML Help cannot be used without htmlhelp.h... disabled])
|
||||
wxUSE_MS_HTML_HELP=no
|
||||
])
|
||||
AC_DEFINE(wxUSE_MS_HTML_HELP)
|
||||
fi
|
||||
fi
|
||||
|
||||
|
@@ -1,15 +0,0 @@
|
||||
|
||||
# Top dir of wxWindows
|
||||
top_builddir = /gtm/bart/wxGTK
|
||||
|
||||
PROGRAM=dbbrowser_gtk
|
||||
|
||||
|
||||
OBJECTS= dbbrowse.o doc.o pgmctrl.o tabpgwin.o\
|
||||
browsedb.o dbtree.o dbgrid.o dlguser.o
|
||||
|
||||
|
||||
|
||||
|
||||
include $(top_builddir)/src/makeprog.env
|
||||
|
@@ -41,7 +41,7 @@
|
||||
#include "forty.h"
|
||||
#include "card.h"
|
||||
|
||||
#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__)
|
||||
#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXX11__)
|
||||
#include "pictures.xpm"
|
||||
#include "symbols.xbm"
|
||||
#endif
|
||||
|
@@ -727,9 +727,12 @@ void MyCanvas::OnPaint(wxPaintEvent& WXUNUSED(event))
|
||||
int xx, yy;
|
||||
TheMainWindow->GetClientSize(&xx, &yy);
|
||||
|
||||
dc.DrawBitmap(* backingBitmap, 0, 0);
|
||||
#if 0
|
||||
wxMemoryDC memDC;
|
||||
memDC.SelectObject(* backingBitmap);
|
||||
dc.Blit(0, 0, backingBitmap->GetWidth(), backingBitmap->GetHeight(), &memDC, 0, 0);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -37,7 +37,7 @@ functions that take a wxListEvent argument.
|
||||
\twocolitem{{\bf EVT\_LIST\_KEY\_DOWN(id, func)}}{A key has been pressed.}
|
||||
\twocolitem{{\bf EVT\_LIST\_INSERT\_ITEM(id, func)}}{An item has been inserted.}
|
||||
\twocolitem{{\bf EVT\_LIST\_COL\_CLICK(id, func)}}{A column ({\bf m\_col}) has been left-clicked.}
|
||||
\twocolitem{{\bf EVT\_LIST\_COL\_RIGHT\_CLICK(id, func)}}{A column ({\bf m\_col}) has been right-clicked.}
|
||||
\twocolitem{{\bf EVT\_LIST\_COL\_RIGHT\_CLICK(id, func)}}{A column ({\bf m\_col}) (which can be $-1$ if the click occured outside any column) has been right-clicked.}
|
||||
\twocolitem{{\bf EVT\_LIST\_COL\_BEGIN\_DRAG(id, func)}}{The user started resizing a column - can be vetoed.}
|
||||
\twocolitem{{\bf EVT\_LIST\_COL\_DRAGGING(id, func)}}{The divider between columns is being dragged.}
|
||||
\twocolitem{{\bf EVT\_LIST\_COL\_END\_DRAG(id, func)}}{A column has been resized by the user.}
|
||||
|
@@ -2483,17 +2483,20 @@ The resizing increments are only significant under Motif or Xt.
|
||||
|
||||
\membersection{wxWindow::SetSizer}\label{wxwindowsetsizer}
|
||||
|
||||
\func{void}{SetSizer}{\param{wxSizer* }{sizer}}
|
||||
\func{void}{SetSizer}{\param{wxSizer* }{sizer}, \param{bool }{deleteOld=TRUE}}
|
||||
|
||||
Sets the window to have the given layout sizer. The window
|
||||
will then own the object, and will take care of its deletion.
|
||||
If an existing layout constraints object is already owned by the
|
||||
window, it will be deleted.
|
||||
window, it will be deleted if the deleteOld parameter is TRUE.
|
||||
|
||||
\wxheading{Parameters}
|
||||
|
||||
\docparam{sizer}{The sizer to set. Pass NULL to disassociate and delete the window's
|
||||
sizer.}
|
||||
\docparam{sizer}{The sizer to set. Pass NULL to disassociate and conditionally delete
|
||||
the window's sizer. See below.}
|
||||
|
||||
\docparam{deleteOld}{If TRUE (the default), this will delete any prexisting sizer.
|
||||
Pass FALSE if you wish to handle deleting the old sizer yourself.}
|
||||
|
||||
\wxheading{Remarks}
|
||||
|
||||
|
@@ -75,9 +75,9 @@ public:
|
||||
bool operator!=(const wxAcceleratorEntry& entry) const
|
||||
{ return !(*this == entry); }
|
||||
|
||||
#if defined(__WXMOTIF__) || defined(__WXX11__)
|
||||
#if defined(__WXMOTIF__)
|
||||
// Implementation use only
|
||||
bool MatchesEvent(const wxKeyEvent& event) const ;
|
||||
bool MatchesEvent(const wxKeyEvent& event) const;
|
||||
#endif
|
||||
|
||||
private:
|
||||
|
@@ -50,6 +50,11 @@ public:
|
||||
|
||||
const wxAcceleratorEntry *GetEntry(const wxKeyEvent& event) const;
|
||||
|
||||
protected:
|
||||
// ref counting code
|
||||
virtual wxObjectRefData *CreateRefData() const;
|
||||
virtual wxObjectRefData *CloneRefData(const wxObjectRefData *data) const;
|
||||
|
||||
private:
|
||||
DECLARE_DYNAMIC_CLASS(wxAcceleratorTable)
|
||||
};
|
||||
|
@@ -21,8 +21,9 @@
|
||||
#include "wx/control.h"
|
||||
#include "wx/event.h"
|
||||
#include "wx/hash.h"
|
||||
#include "wx/textctrl.h"
|
||||
|
||||
|
||||
class WXDLLEXPORT wxTextCtrl;
|
||||
class WXDLLEXPORT wxImageList;
|
||||
|
||||
/*
|
||||
|
@@ -739,7 +739,7 @@ public:
|
||||
virtual bool Layout();
|
||||
|
||||
// sizers
|
||||
void SetSizer( wxSizer *sizer );
|
||||
void SetSizer(wxSizer *sizer, bool deleteOld = TRUE );
|
||||
wxSizer *GetSizer() const { return m_windowSizer; }
|
||||
|
||||
// Track if this window is a member of a sizer
|
||||
|
@@ -589,67 +589,66 @@ void MyFrame::ShowHelp(int commandId, wxHelpControllerBase& helpController)
|
||||
{
|
||||
switch(commandId)
|
||||
{
|
||||
case HelpDemo_Help_Classes:
|
||||
case HelpDemo_Html_Help_Classes:
|
||||
case HelpDemo_Advanced_Html_Help_Classes:
|
||||
case HelpDemo_MS_Html_Help_Classes:
|
||||
case HelpDemo_Best_Help_Classes:
|
||||
helpController.DisplaySection(2);
|
||||
//helpController.DisplaySection("Classes"); // An alternative form for most controllers
|
||||
case HelpDemo_Help_Classes:
|
||||
case HelpDemo_Html_Help_Classes:
|
||||
case HelpDemo_Advanced_Html_Help_Classes:
|
||||
case HelpDemo_MS_Html_Help_Classes:
|
||||
case HelpDemo_Best_Help_Classes:
|
||||
helpController.DisplaySection(2);
|
||||
//helpController.DisplaySection("Classes"); // An alternative form for most controllers
|
||||
break;
|
||||
|
||||
break;
|
||||
case HelpDemo_Help_Functions:
|
||||
case HelpDemo_Html_Help_Functions:
|
||||
case HelpDemo_Advanced_Html_Help_Functions:
|
||||
case HelpDemo_MS_Html_Help_Functions:
|
||||
helpController.DisplaySection(1);
|
||||
//helpController.DisplaySection("Functions"); // An alternative form for most controllers
|
||||
break;
|
||||
case HelpDemo_Help_Help:
|
||||
case HelpDemo_Html_Help_Help:
|
||||
case HelpDemo_Advanced_Html_Help_Help:
|
||||
case HelpDemo_MS_Html_Help_Help:
|
||||
case HelpDemo_Best_Help_Help:
|
||||
helpController.DisplaySection(3);
|
||||
//helpController.DisplaySection("About"); // An alternative form for most controllers
|
||||
break;
|
||||
case HelpDemo_Help_Functions:
|
||||
case HelpDemo_Html_Help_Functions:
|
||||
case HelpDemo_Advanced_Html_Help_Functions:
|
||||
case HelpDemo_MS_Html_Help_Functions:
|
||||
helpController.DisplaySection(1);
|
||||
//helpController.DisplaySection("Functions"); // An alternative form for most controllers
|
||||
break;
|
||||
|
||||
case HelpDemo_Help_Search:
|
||||
case HelpDemo_Html_Help_Search:
|
||||
case HelpDemo_Advanced_Html_Help_Search:
|
||||
case HelpDemo_MS_Html_Help_Search:
|
||||
case HelpDemo_Best_Help_Search:
|
||||
{
|
||||
wxString key = wxGetTextFromUser("Search for?",
|
||||
"Search help for keyword",
|
||||
"",
|
||||
this);
|
||||
if(! key.IsEmpty())
|
||||
helpController.KeywordSearch(key);
|
||||
}
|
||||
break;
|
||||
case HelpDemo_Help_Help:
|
||||
case HelpDemo_Html_Help_Help:
|
||||
case HelpDemo_Advanced_Html_Help_Help:
|
||||
case HelpDemo_MS_Html_Help_Help:
|
||||
case HelpDemo_Best_Help_Help:
|
||||
helpController.DisplaySection(3);
|
||||
//helpController.DisplaySection("About"); // An alternative form for most controllers
|
||||
break;
|
||||
|
||||
case HelpDemo_Help_Index:
|
||||
case HelpDemo_Html_Help_Index:
|
||||
case HelpDemo_Advanced_Html_Help_Index:
|
||||
case HelpDemo_MS_Html_Help_Index:
|
||||
case HelpDemo_Best_Help_Index:
|
||||
helpController.DisplayContents();
|
||||
break;
|
||||
case HelpDemo_Help_Search:
|
||||
case HelpDemo_Html_Help_Search:
|
||||
case HelpDemo_Advanced_Html_Help_Search:
|
||||
case HelpDemo_MS_Html_Help_Search:
|
||||
case HelpDemo_Best_Help_Search:
|
||||
{
|
||||
wxString key = wxGetTextFromUser("Search for?",
|
||||
"Search help for keyword",
|
||||
"",
|
||||
this);
|
||||
if(! key.IsEmpty())
|
||||
helpController.KeywordSearch(key);
|
||||
}
|
||||
break;
|
||||
|
||||
// These three calls are only used by wxExtHelpController
|
||||
case HelpDemo_Help_Index:
|
||||
case HelpDemo_Html_Help_Index:
|
||||
case HelpDemo_Advanced_Html_Help_Index:
|
||||
case HelpDemo_MS_Html_Help_Index:
|
||||
case HelpDemo_Best_Help_Index:
|
||||
helpController.DisplayContents();
|
||||
break;
|
||||
|
||||
case HelpDemo_Help_KDE:
|
||||
helpController.SetViewer("kdehelp");
|
||||
break;
|
||||
case HelpDemo_Help_GNOME:
|
||||
helpController.SetViewer("gnome-help-browser");
|
||||
break;
|
||||
case HelpDemo_Help_Netscape:
|
||||
helpController.SetViewer("netscape", wxHELP_NETSCAPE);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
// These three calls are only used by wxExtHelpController
|
||||
|
||||
case HelpDemo_Help_KDE:
|
||||
helpController.SetViewer("kdehelp");
|
||||
break;
|
||||
case HelpDemo_Help_GNOME:
|
||||
helpController.SetViewer("gnome-help-browser");
|
||||
break;
|
||||
case HelpDemo_Help_Netscape:
|
||||
helpController.SetViewer("netscape", wxHELP_NETSCAPE);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -631,7 +631,10 @@ void MyListCtrl::OnColClick(wxListEvent& event)
|
||||
void MyListCtrl::OnColRightClick(wxListEvent& event)
|
||||
{
|
||||
int col = event.GetColumn();
|
||||
SetColumnImage(col, -1);
|
||||
if ( col != -1 )
|
||||
{
|
||||
SetColumnImage(col, -1);
|
||||
}
|
||||
|
||||
wxLogMessage( wxT("OnColumnRightClick at %d."), event.GetColumn() );
|
||||
}
|
||||
|
@@ -5,7 +5,7 @@ top_srcdir = @top_srcdir@/..
|
||||
top_builddir = ../..
|
||||
program_dir = samples/treectrl
|
||||
|
||||
PROGRAM=treectrl
|
||||
PROGRAM=treetest
|
||||
|
||||
OBJECTS =$(PROGRAM).o
|
||||
DEPFILES=$(PROGRAM).d
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
WXDIR = $(WXWIN)
|
||||
|
||||
TARGET=treectrl
|
||||
TARGET=treetest
|
||||
OBJECTS = $(TARGET).obj
|
||||
|
||||
!include $(WXDIR)\src\makeprog.b32
|
||||
|
@@ -7,7 +7,7 @@
|
||||
|
||||
WXDIR = $(WXWIN)
|
||||
|
||||
TARGET=treectrl
|
||||
TARGET=treetest
|
||||
OBJECTS=$(TARGET).obj
|
||||
|
||||
!include $(WXDIR)\src\makeprog.bcc
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
WXDIR = $(WXWIN)
|
||||
|
||||
TARGET=treectrl
|
||||
TARGET=treetest
|
||||
OBJECTS=$(TARGET).obj
|
||||
|
||||
!include $(WXDIR)\src\makeprog.msc
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
WXDIR = ../..
|
||||
|
||||
TARGET=treectrl
|
||||
TARGET=treetest
|
||||
OBJECTS = $(TARGET).o
|
||||
|
||||
include $(WXDIR)/src/makeprog.g95
|
||||
|
@@ -1,17 +1,17 @@
|
||||
# Purpose: makefile for treectrl example (Symantec C++)
|
||||
# Purpose: makefile for treetest example (Symantec C++)
|
||||
# Created: 2000-03-15
|
||||
|
||||
WXDIR = $(WXWIN)
|
||||
WXLIB = $(WXDIR)\lib\wx.lib
|
||||
INCDIR = $(WXDIR)\include
|
||||
INCLUDE=$(INCDIR)
|
||||
TARGET=treectrl
|
||||
TARGET=treetest
|
||||
|
||||
include $(WXDIR)\src\makesc.env
|
||||
|
||||
treectrl.exe: treectrl.obj $(DEFFILE) treectrl.res
|
||||
treetest.exe: treetest.obj $(DEFFILE) treetest.res
|
||||
*$(CC) $(LDFLAGS) -o$@ $** $(LIBS)
|
||||
*$(RC) -k treectrl.res
|
||||
*$(RC) -k treetest.res
|
||||
|
||||
sc32.def:
|
||||
echo EXETYPE NT > sc32.def
|
||||
|
@@ -1,7 +1,7 @@
|
||||
# Purpose: makefile for treectrl example (Salford C++)
|
||||
# Created: 2000-03-15
|
||||
|
||||
PROGRAM = treectrl
|
||||
PROGRAM = treetest
|
||||
OBJECTS = $(PROGRAM).obj
|
||||
|
||||
include ..\..\src\makeprog.sl
|
||||
|
@@ -1,4 +1,4 @@
|
||||
# Purpose: makefile for treectrl example (TWIN)
|
||||
# Purpose: makefile for treetest example (TWIN)
|
||||
# Created: 2000-03-15
|
||||
|
||||
WXDIR = ../..
|
||||
@@ -7,29 +7,29 @@ WXDIR = ../..
|
||||
# this central makefile.
|
||||
include $(WXDIR)/src/maketwin.env
|
||||
|
||||
OBJECTS = $(OBJDIR)/treectrl.$(OBJSUFF) $(OBJDIR)/treectrl.$(OBJSUFF)
|
||||
OBJECTS = $(OBJDIR)/treetest.$(OBJSUFF) $(OBJDIR)/treetest.$(OBJSUFF)
|
||||
|
||||
all: $(OBJDIR) treectrl$(GUISUFFIX)$(EXESUFF)
|
||||
all: $(OBJDIR) treetest$(GUISUFFIX)$(EXESUFF)
|
||||
|
||||
wx:
|
||||
|
||||
$(OBJDIR):
|
||||
mkdir $(OBJDIR)
|
||||
|
||||
treectrl$(GUISUFFIX)$(EXESUFF): $(OBJECTS) $(WXLIB)
|
||||
$(CC) $(LDFLAGS) -o treectrl$(GUISUFFIX)$(EXESUFF) $(OBJECTS) $(LDLIBS)
|
||||
treetest$(GUISUFFIX)$(EXESUFF): $(OBJECTS) $(WXLIB)
|
||||
$(CC) $(LDFLAGS) -o treetest$(GUISUFFIX)$(EXESUFF) $(OBJECTS) $(LDLIBS)
|
||||
|
||||
$(OBJDIR)/treectrl.$(OBJSUFF): treectrl.$(SRCSUFF)
|
||||
$(CC) -c $(CPPFLAGS) -o $@ treectrl.$(SRCSUFF)
|
||||
$(OBJDIR)/treetest.$(OBJSUFF): treetest.$(SRCSUFF)
|
||||
$(CC) -c $(CPPFLAGS) -o $@ treetest.$(SRCSUFF)
|
||||
|
||||
treectrl.c: treectrl.rc
|
||||
$(RESCOMP) $(RCINPUTSWITCH) treectrl.rc $(RCOUTPUTSWITCH) treectrl.c $(RESFLAGS)
|
||||
treetest.c: treetest.rc
|
||||
$(RESCOMP) $(RCINPUTSWITCH) treetest.rc $(RCOUTPUTSWITCH) treetest.c $(RESFLAGS)
|
||||
|
||||
$(OBJDIR)/treectrl.$(OBJSUFF): treectrl.c
|
||||
$(CC) -c $(CPPFLAGS) -o $@ treectrl.c
|
||||
$(OBJDIR)/treetest.$(OBJSUFF): treetest.c
|
||||
$(CC) -c $(CPPFLAGS) -o $@ treetest.c
|
||||
|
||||
#$(OBJDIR)/treectrl.o: treectrl.rc
|
||||
# $(RESCOMP) $(RCINPUTSWITCH) treectrl.rc $(RCOUTPUTSWITCH) $(OBJDIR)/treectrl.o $(RESFLAGS)
|
||||
#$(OBJDIR)/treetest.o: treetest.rc
|
||||
# $(RESCOMP) $(RCINPUTSWITCH) treetest.rc $(RCOUTPUTSWITCH) $(OBJDIR)/treetest.o $(RESFLAGS)
|
||||
|
||||
clean:
|
||||
rm -f $(OBJECTS) treectrl$(GUISUFFIX).exe core *.rsc *.res
|
||||
rm -f $(OBJECTS) treetest$(GUISUFFIX).exe core *.rsc *.res
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
CXX = $(shell wx-config --cxx)
|
||||
|
||||
PROGRAM = treectrl
|
||||
PROGRAM = treetest
|
||||
|
||||
OBJECTS = $(PROGRAM).o
|
||||
|
||||
|
@@ -4,7 +4,7 @@
|
||||
# Set WXDIR for your system
|
||||
WXDIR = $(WXWIN)
|
||||
|
||||
PROGRAM=treectrl
|
||||
PROGRAM=treetest
|
||||
OBJECTS = $(PROGRAM).obj
|
||||
|
||||
!include $(WXDIR)\src\makeprog.vc
|
||||
|
@@ -3,7 +3,7 @@
|
||||
|
||||
WXDIR = $(%WXWIN)
|
||||
|
||||
PROGRAM = treectrl
|
||||
PROGRAM = treetest
|
||||
OBJECTS = $(PROGRAM).obj
|
||||
|
||||
!include $(WXDIR)\src\makeprog.wat
|
||||
|
@@ -1,5 +1,5 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: treectrl.cpp
|
||||
// Name: treetest.cpp
|
||||
// Purpose: wxTreeCtrl sample
|
||||
// Author: Julian Smart
|
||||
// Modified by:
|
||||
@@ -9,12 +9,9 @@
|
||||
// Licence: wxWindows license
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// important: the #pragma argument must be different from treectrl.cpp,
|
||||
// otherwise gcc gets confused (as there is also treectrl.cpp in the library
|
||||
// which has identical #pragma) and the sample crashes on startup!
|
||||
#ifdef __GNUG__
|
||||
#pragma interface "treetest.cpp"
|
||||
#pragma implementation "treetest.cpp"
|
||||
#pragma implementation
|
||||
#pragma interface
|
||||
#endif
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
@@ -42,7 +39,7 @@
|
||||
#define NO_VARIABLE_HEIGHT
|
||||
#endif
|
||||
|
||||
#include "treectrl.h"
|
||||
#include "treetest.h"
|
||||
|
||||
// under Windows the icons are in the .rc file
|
||||
#ifndef __WXMSW__
|
@@ -1,5 +1,5 @@
|
||||
NAME TreeCtrl
|
||||
DESCRIPTION 'TreeCtrl wxWindows application'
|
||||
NAME TreeTest
|
||||
DESCRIPTION 'TreeTest wxWindows application'
|
||||
EXETYPE WINDOWS
|
||||
STUB 'WINSTUB.EXE'
|
||||
CODE PRELOAD MOVEABLE DISCARDABLE
|
@@ -1,26 +1,26 @@
|
||||
# Microsoft Developer Studio Project File - Name="treectrl" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Project File - Name="treetest" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Application" 0x0101
|
||||
|
||||
CFG=treectrl - Win32 Debug
|
||||
CFG=treetest - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "treectrl.mak".
|
||||
!MESSAGE NMAKE /f "treetest.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "treectrl.mak" CFG="treectrl - Win32 Debug"
|
||||
!MESSAGE NMAKE /f "treetest.mak" CFG="treetest - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "treectrl - Win32 Release DLL" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "treectrl - Win32 Debug DLL" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "treectrl - Win32 Release" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "treectrl - Win32 Debug" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "treetest - Win32 Release DLL" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "treetest - Win32 Debug DLL" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "treetest - Win32 Release" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "treetest - Win32 Debug" (based on "Win32 (x86) Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
@@ -30,7 +30,7 @@ CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!ELSEIF "$(CFG)" == "treectrl - Win32 Release DLL"
|
||||
!ELSEIF "$(CFG)" == "treetest - Win32 Release DLL"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
@@ -56,7 +56,7 @@ LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib /nologo /subsystem:windows /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib /nologo /subsystem:windows /machine:I386 ..\..\lib\wxmsw233.lib
|
||||
|
||||
!ELSEIF "$(CFG)" == "treectrl - Win32 Debug DLL"
|
||||
!ELSEIF "$(CFG)" == "treetest - Win32 Debug DLL"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
@@ -82,7 +82,7 @@ LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept ..\..\lib\wxmsw233d.lib
|
||||
|
||||
!ELSEIF "$(CFG)" == "treectrl - Win32 Release"
|
||||
!ELSEIF "$(CFG)" == "treetest - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
@@ -108,7 +108,7 @@ LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib /nologo /subsystem:windows /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib /nologo /subsystem:windows /machine:I386 ..\..\lib\zlib.lib ..\..\lib\regex.lib ..\..\lib\png.lib ..\..\lib\jpeg.lib ..\..\lib\tiff.lib ..\..\lib\wxmsw.lib
|
||||
|
||||
!ELSEIF "$(CFG)" == "treectrl - Win32 Debug"
|
||||
!ELSEIF "$(CFG)" == "treetest - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
@@ -138,17 +138,17 @@ LINK32=link.exe
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "treectrl - Win32 Release DLL"
|
||||
# Name "treectrl - Win32 Debug DLL"
|
||||
# Name "treectrl - Win32 Release"
|
||||
# Name "treectrl - Win32 Debug"
|
||||
# Name "treetest - Win32 Release DLL"
|
||||
# Name "treetest - Win32 Debug DLL"
|
||||
# Name "treetest - Win32 Release"
|
||||
# Name "treetest - Win32 Debug"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\treectrl.cpp
|
||||
SOURCE=.\treetest.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\treectrl.rc
|
||||
SOURCE=.\treetest.rc
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
@@ -12,6 +12,6 @@ CONFIG = wx
|
||||
#WXCONFIGS = Debug Release DebugDll ReleaseDll
|
||||
|
||||
# project files
|
||||
SOURCES = treectrl.cpp
|
||||
RC_FILE = treectrl.rc
|
||||
TARGET = treectrl
|
||||
SOURCES = treetest.cpp
|
||||
RC_FILE = treetest.rc
|
||||
TARGET = treetest
|
@@ -34,6 +34,7 @@
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/combobox.h" // wxComboControl
|
||||
#include "wx/app.h" // wxPostEvent
|
||||
#include "wx/log.h"
|
||||
#endif //WX_PRECOMP
|
||||
|
||||
@@ -216,12 +217,13 @@ void wxPopupTransientWindow::PopHandlers()
|
||||
|
||||
if ( m_focus )
|
||||
{
|
||||
#ifndef __WXX11__
|
||||
if ( !m_focus->RemoveEventHandler(m_handlerFocus) )
|
||||
{
|
||||
// see above
|
||||
m_handlerFocus = NULL;
|
||||
}
|
||||
|
||||
#endif
|
||||
m_focus = NULL;
|
||||
}
|
||||
}
|
||||
@@ -251,6 +253,8 @@ void wxPopupTransientWindow::Popup(wxWindow *winFocus)
|
||||
m_focus = winFocus ? winFocus : this;
|
||||
m_focus->SetFocus();
|
||||
|
||||
#ifndef __WXX11__
|
||||
|
||||
#ifdef __WXMSW__
|
||||
// MSW doesn't allow to set focus to the popup window, but we need to
|
||||
// subclass the window which has the focus, and not winFocus passed in or
|
||||
@@ -264,6 +268,8 @@ void wxPopupTransientWindow::Popup(wxWindow *winFocus)
|
||||
|
||||
m_focus->PushEventHandler(m_handlerFocus);
|
||||
}
|
||||
|
||||
#endif // !__WXX11__
|
||||
}
|
||||
|
||||
void wxPopupTransientWindow::Dismiss()
|
||||
@@ -348,19 +354,41 @@ void wxPopupWindowHandler::OnLeftDown(wxMouseEvent& event)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
wxPoint pos = event.GetPosition();
|
||||
|
||||
// scrollbar on which the click occured
|
||||
wxWindow *sbar = NULL;
|
||||
|
||||
wxWindow *win = (wxWindow *)event.GetEventObject();
|
||||
|
||||
|
||||
switch ( win->HitTest(pos.x, pos.y) )
|
||||
{
|
||||
case wxHT_WINDOW_OUTSIDE:
|
||||
// clicking outside a popup dismisses it
|
||||
m_popup->DismissAndNotify();
|
||||
{
|
||||
// do the coords translation now as after DismissAndNotify()
|
||||
// m_popup may be destroyed
|
||||
wxMouseEvent event2(event);
|
||||
|
||||
m_popup->ClientToScreen(&event2.m_x, &event2.m_y);
|
||||
|
||||
// clicking outside a popup dismisses it
|
||||
m_popup->DismissAndNotify();
|
||||
|
||||
// dismissing a tooltip shouldn't waste a click, i.e. you
|
||||
// should be able to dismiss it and press the button with the
|
||||
// same click, so repost this event to the window beneath us
|
||||
wxWindow *win = wxFindWindowAtPoint(event2.GetPosition());
|
||||
if ( win )
|
||||
{
|
||||
// translate the event coords to the ones of the window
|
||||
// which is going to get the event
|
||||
win->ScreenToClient(&event2.m_x, &event2.m_y);
|
||||
|
||||
event2.SetEventObject(win);
|
||||
wxPostEvent(win, event2);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
#ifdef __WXUNIVERSAL__
|
||||
@@ -427,7 +455,7 @@ void wxPopupFocusHandler::OnKillFocus(wxFocusEvent& event)
|
||||
return;
|
||||
win = win->GetParent();
|
||||
}
|
||||
|
||||
|
||||
m_popup->DismissAndNotify();
|
||||
}
|
||||
|
||||
|
@@ -1185,9 +1185,9 @@ void wxWindowBase::DeleteRelatedConstraints()
|
||||
}
|
||||
#endif
|
||||
|
||||
void wxWindowBase::SetSizer(wxSizer *sizer)
|
||||
void wxWindowBase::SetSizer(wxSizer *sizer, bool deleteOld)
|
||||
{
|
||||
if (m_windowSizer) delete m_windowSizer;
|
||||
if (m_windowSizer && deleteOld) delete m_windowSizer;
|
||||
|
||||
m_windowSizer = sizer;
|
||||
}
|
||||
|
@@ -53,7 +53,16 @@ WX_DEFINE_LIST(wxAccelList);
|
||||
class wxAccelRefData : public wxObjectRefData
|
||||
{
|
||||
public:
|
||||
wxAccelRefData() { m_accels.DeleteContents(TRUE); }
|
||||
wxAccelRefData()
|
||||
{
|
||||
m_accels.DeleteContents(TRUE);
|
||||
}
|
||||
|
||||
wxAccelRefData(const wxAccelRefData& data)
|
||||
{
|
||||
m_accels.DeleteContents(TRUE);
|
||||
m_accels = data.m_accels;
|
||||
}
|
||||
|
||||
wxAccelList m_accels;
|
||||
};
|
||||
@@ -61,6 +70,7 @@ public:
|
||||
// macro which can be used to access wxAccelRefData from wxAcceleratorTable
|
||||
#define M_ACCELDATA ((wxAccelRefData *)m_refData)
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// implementation
|
||||
// ============================================================================
|
||||
@@ -108,6 +118,8 @@ bool wxAcceleratorTable::Ok() const
|
||||
|
||||
void wxAcceleratorTable::Add(const wxAcceleratorEntry& entry)
|
||||
{
|
||||
AllocExclusive();
|
||||
|
||||
if ( !m_refData )
|
||||
{
|
||||
m_refData = new wxAccelRefData;
|
||||
@@ -118,6 +130,8 @@ void wxAcceleratorTable::Add(const wxAcceleratorEntry& entry)
|
||||
|
||||
void wxAcceleratorTable::Remove(const wxAcceleratorEntry& entry)
|
||||
{
|
||||
AllocExclusive();
|
||||
|
||||
wxAccelList::Node *node = M_ACCELDATA->m_accels.GetFirst();
|
||||
while ( node )
|
||||
{
|
||||
@@ -189,5 +203,15 @@ int wxAcceleratorTable::GetCommand(const wxKeyEvent& event) const
|
||||
return entry ? entry->GetCommand() : -1;
|
||||
}
|
||||
|
||||
wxObjectRefData *wxAcceleratorTable::CreateRefData() const
|
||||
{
|
||||
return new wxAccelRefData;
|
||||
}
|
||||
|
||||
wxObjectRefData *wxAcceleratorTable::CloneRefData(const wxObjectRefData *data) const
|
||||
{
|
||||
return new wxAccelRefData(*(wxAccelRefData *)data);
|
||||
}
|
||||
|
||||
#endif // wxUSE_ACCEL
|
||||
|
||||
|
@@ -435,7 +435,7 @@ protected:
|
||||
wxCursor *m_resizeCursor;
|
||||
bool m_isDragging;
|
||||
|
||||
// column being resized
|
||||
// column being resized or -1
|
||||
int m_column;
|
||||
|
||||
// divider line position in logical (unscrolled) coords
|
||||
@@ -2022,8 +2022,9 @@ void wxListHeaderWindow::OnMouse( wxMouseEvent &event )
|
||||
int xpos = 0;
|
||||
|
||||
// find the column where this event occured
|
||||
int countCol = m_owner->GetColumnCount();
|
||||
for (int col = 0; col < countCol; col++)
|
||||
int col,
|
||||
countCol = m_owner->GetColumnCount();
|
||||
for (col = 0; col < countCol; col++)
|
||||
{
|
||||
xpos += m_owner->GetColumnWidth( col );
|
||||
m_column = col;
|
||||
@@ -2044,6 +2045,9 @@ void wxListHeaderWindow::OnMouse( wxMouseEvent &event )
|
||||
m_minX = xpos;
|
||||
}
|
||||
|
||||
if ( col == countCol )
|
||||
m_column = -1;
|
||||
|
||||
if (event.LeftDown() || event.RightUp())
|
||||
{
|
||||
if (hit_border && event.LeftDown())
|
||||
|
@@ -1,172 +0,0 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: filter.cpp
|
||||
// Purpose: wxHtmlFilter - input filter for translating into HTML format
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "htmlfilter.h"
|
||||
#endif
|
||||
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#if wxUSE_HTML
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#endif
|
||||
|
||||
#include "wx/html/htmlfilter.h"
|
||||
#include "wx/html/htmlwin.h"
|
||||
|
||||
|
||||
/*
|
||||
|
||||
There is code for several default filters:
|
||||
|
||||
*/
|
||||
|
||||
IMPLEMENT_ABSTRACT_CLASS(wxHtmlFilter, wxObject)
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlFilterPlainText
|
||||
// filter for text/plain or uknown
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxHtmlFilterPlainText, wxHtmlFilter)
|
||||
|
||||
bool wxHtmlFilterPlainText::CanRead(const wxFSFile& WXUNUSED(file)) const
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxString wxHtmlFilterPlainText::ReadFile(const wxFSFile& file) const
|
||||
{
|
||||
wxInputStream *s = file.GetStream();
|
||||
char *src;
|
||||
wxString doc, doc2;
|
||||
|
||||
if (s == NULL) return wxEmptyString;
|
||||
src = new char[s -> GetSize()+1];
|
||||
src[s -> GetSize()] = 0;
|
||||
s -> Read(src, s -> GetSize());
|
||||
doc = src;
|
||||
delete [] src;
|
||||
|
||||
doc.Replace(_T("<"), _T("<"), TRUE);
|
||||
doc.Replace(_T(">"), _T(">"), TRUE);
|
||||
doc2 = _T("<HTML><BODY><PRE>\n") + doc + _T("\n</PRE></BODY></HTML>");
|
||||
return doc2;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlFilterImage
|
||||
// filter for image/*
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class wxHtmlFilterImage : public wxHtmlFilter
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxHtmlFilterImage)
|
||||
|
||||
public:
|
||||
virtual bool CanRead(const wxFSFile& file) const;
|
||||
virtual wxString ReadFile(const wxFSFile& file) const;
|
||||
};
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxHtmlFilterImage, wxHtmlFilter)
|
||||
|
||||
|
||||
|
||||
bool wxHtmlFilterImage::CanRead(const wxFSFile& file) const
|
||||
{
|
||||
return (file.GetMimeType().Left(6) == "image/");
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxString wxHtmlFilterImage::ReadFile(const wxFSFile& file) const
|
||||
{
|
||||
return ("<HTML><BODY><IMG SRC=\"" + file.GetLocation() + "\"></BODY></HTML>");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxHtmlFilterPlainText
|
||||
// filter for text/plain or uknown
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
class wxHtmlFilterHTML : public wxHtmlFilter
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxHtmlFilterHTML)
|
||||
|
||||
public:
|
||||
virtual bool CanRead(const wxFSFile& file) const;
|
||||
virtual wxString ReadFile(const wxFSFile& file) const;
|
||||
};
|
||||
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxHtmlFilterHTML, wxHtmlFilter)
|
||||
|
||||
bool wxHtmlFilterHTML::CanRead(const wxFSFile& file) const
|
||||
{
|
||||
// return (file.GetMimeType() == "text/html");
|
||||
// This is true in most case but some page can return:
|
||||
// "text/html; char-encoding=...."
|
||||
// So we use Find instead
|
||||
return (file.GetMimeType().Find(_T("text/html")) == 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxString wxHtmlFilterHTML::ReadFile(const wxFSFile& file) const
|
||||
{
|
||||
wxInputStream *s = file.GetStream();
|
||||
char *src;
|
||||
wxString doc;
|
||||
|
||||
if (s == NULL) return wxEmptyString;
|
||||
src = new char[s -> GetSize() + 1];
|
||||
src[s -> GetSize()] = 0;
|
||||
s -> Read(src, s -> GetSize());
|
||||
doc = src;
|
||||
delete[] src;
|
||||
|
||||
return doc;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
///// Module:
|
||||
|
||||
class wxHtmlFilterModule : public wxModule
|
||||
{
|
||||
DECLARE_DYNAMIC_CLASS(wxHtmlFilterModule)
|
||||
|
||||
public:
|
||||
virtual bool OnInit()
|
||||
{
|
||||
wxHtmlWindow::AddFilter(new wxHtmlFilterHTML);
|
||||
wxHtmlWindow::AddFilter(new wxHtmlFilterImage);
|
||||
return TRUE;
|
||||
}
|
||||
virtual void OnExit() {}
|
||||
};
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxHtmlFilterModule, wxModule)
|
||||
|
||||
#endif
|
@@ -1,839 +0,0 @@
|
||||
// Name: htmlhelp.cpp
|
||||
// Purpose: Help controller
|
||||
// Author: Vaclav Slavik
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#error This file should not be compiled! Update your build system! \
|
||||
(configure users, rerun configure to get a new Makefile) \
|
||||
Instead of htmlhelp[_io], use helpdata, helpfrm and helpctrl. This \
|
||||
file is only left to point out the problem and will be removed r.s.n.
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "htmlhelp.h"
|
||||
#endif
|
||||
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#if wxUSE_HTML
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#endif
|
||||
|
||||
#include <wx/notebook.h>
|
||||
#include <wx/imaglist.h>
|
||||
#include <wx/treectrl.h>
|
||||
#include <wx/tokenzr.h>
|
||||
#include <wx/wfstream.h>
|
||||
#include <wx/html/htmlwin.h>
|
||||
#include <wx/html/htmlhelp.h>
|
||||
#include <wx/busyinfo.h>
|
||||
|
||||
#if !((wxVERSION_NUMBER < 2100) || ((wxVERSION_NUMBER == 2100) && (wxBETA_NUMBER < 7)))
|
||||
#include <wx/progdlg.h>
|
||||
#endif
|
||||
|
||||
|
||||
// Bitmaps:
|
||||
|
||||
#ifndef __WXMSW__
|
||||
// XPM hack: make the arrays const
|
||||
#define static static const
|
||||
|
||||
#include "bitmaps/panel.xpm"
|
||||
#include "bitmaps/back.xpm"
|
||||
#include "bitmaps/forward.xpm"
|
||||
#include "bitmaps/book.xpm"
|
||||
#include "bitmaps/folder.xpm"
|
||||
#include "bitmaps/page.xpm"
|
||||
|
||||
#undef static
|
||||
#endif
|
||||
|
||||
#include "search.h"
|
||||
|
||||
|
||||
|
||||
|
||||
#include <wx/arrimpl.cpp>
|
||||
WX_DEFINE_OBJARRAY(HtmlBookRecArray)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// wxHtmlHelpController
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
|
||||
IMPLEMENT_DYNAMIC_CLASS(wxHtmlHelpController, wxEvtHandler)
|
||||
|
||||
|
||||
wxHtmlHelpController::wxHtmlHelpController() : wxEvtHandler()
|
||||
{
|
||||
m_Frame = NULL;
|
||||
m_Config = NULL;
|
||||
m_ConfigRoot = wxEmptyString;
|
||||
m_TitleFormat = _("Help : %s");
|
||||
m_TempPath = wxEmptyString;
|
||||
|
||||
m_Cfg.x = m_Cfg.y = 0;
|
||||
m_Cfg.w = 700; m_Cfg.h = 480;
|
||||
m_Cfg.sashpos = 240;
|
||||
m_Cfg.navig_on = TRUE;
|
||||
|
||||
m_ContentsImageList = new wxImageList(12, 12);
|
||||
m_ContentsImageList -> Add(wxICON(book));
|
||||
m_ContentsImageList -> Add(wxICON(folder));
|
||||
m_ContentsImageList -> Add(wxICON(page));
|
||||
|
||||
m_Contents = NULL;
|
||||
m_ContentsCnt = 0;
|
||||
m_Index = NULL;
|
||||
m_IndexCnt = 0;
|
||||
|
||||
m_IndexBox = NULL;
|
||||
m_ContentsBox = NULL;
|
||||
m_SearchList = NULL;
|
||||
m_SearchText = NULL;
|
||||
m_SearchButton = NULL;
|
||||
m_HtmlWin = NULL;
|
||||
m_Splitter = NULL;
|
||||
m_NavigPan = NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
wxHtmlHelpController::~wxHtmlHelpController()
|
||||
{
|
||||
int i;
|
||||
|
||||
m_BookRecords.Empty();
|
||||
delete m_ContentsImageList;
|
||||
if (m_Contents) {
|
||||
for (i = 0; i < m_ContentsCnt; i++) {
|
||||
delete[] m_Contents[i].m_Page;
|
||||
delete[] m_Contents[i].m_Name;
|
||||
}
|
||||
free(m_Contents);
|
||||
}
|
||||
if (m_Index) {
|
||||
for (i = 0; i < m_IndexCnt; i++) {
|
||||
delete[] m_Index[i].m_Page;
|
||||
delete[] m_Index[i].m_Name;
|
||||
}
|
||||
free(m_Index);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::SetTempDir(const wxString& path)
|
||||
{
|
||||
if (path == wxEmptyString) m_TempPath = path;
|
||||
else {
|
||||
if (wxIsAbsolutePath(path)) m_TempPath = path;
|
||||
else m_TempPath = wxGetCwd() + "/" + path;
|
||||
|
||||
if (m_TempPath[m_TempPath.Length() - 1] != '/')
|
||||
m_TempPath << "/";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// Reads one line, stores it into buf and returns pointer to new line or NULL.
|
||||
static char* ReadLine(char *line, char *buf)
|
||||
{
|
||||
char *writeptr = buf, *readptr = line;
|
||||
|
||||
while (*readptr != 0 && *readptr != '\r' && *readptr != '\n') *(writeptr++) = *(readptr++);
|
||||
*writeptr = 0;
|
||||
while (*readptr == '\r' || *readptr == '\n') readptr++;
|
||||
if (*readptr == 0) return NULL;
|
||||
else return readptr;
|
||||
}
|
||||
|
||||
|
||||
static wxString SafeFileName(const wxString& s)
|
||||
{
|
||||
wxString res = s;
|
||||
res.Replace(_T(":"), _T("_"), TRUE);
|
||||
res.Replace(_T(" "), _T("_"), TRUE);
|
||||
res.Replace(_T("/"), _T("_"), TRUE);
|
||||
res.Replace(_T("\\"), _T("_"), TRUE);
|
||||
res.Replace(_T("#"), _T("_"), TRUE);
|
||||
res.Replace(_T("."), _T("_"), TRUE);
|
||||
return res;
|
||||
}
|
||||
|
||||
|
||||
static int IndexCompareFunc(const void *a, const void *b)
|
||||
{
|
||||
return strcmp(((HtmlContentsItem*)a) -> m_Name, ((HtmlContentsItem*)b) -> m_Name);
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool wxHtmlHelpController::AddBook(const wxString& book, bool show_wait_msg)
|
||||
{
|
||||
wxFSFile *fi;
|
||||
wxFileSystem fsys;
|
||||
wxInputStream *s;
|
||||
HtmlBookRecord *bookr;
|
||||
wxString bookFull;
|
||||
|
||||
int sz;
|
||||
char *buff, *lineptr;
|
||||
char linebuf[300];
|
||||
|
||||
wxString title = _("noname"),
|
||||
safetitle,
|
||||
start = wxEmptyString,
|
||||
contents = wxEmptyString, index = wxEmptyString;
|
||||
|
||||
if (wxIsAbsolutePath(book)) bookFull = book;
|
||||
else bookFull = wxGetCwd() + "/" + book;
|
||||
|
||||
fi = fsys.OpenFile(bookFull);
|
||||
if (fi == NULL) return FALSE;
|
||||
fsys.ChangePathTo(bookFull);
|
||||
s = fi -> GetStream();
|
||||
sz = s -> GetSize();
|
||||
buff = new char[sz+1];
|
||||
buff[sz] = 0;
|
||||
s -> Read(buff, sz);
|
||||
lineptr = buff;
|
||||
delete fi;
|
||||
|
||||
while ((lineptr = ReadLine(lineptr, linebuf)) != NULL) {
|
||||
if (strstr(linebuf, "Title=") == linebuf)
|
||||
title = linebuf + strlen("Title=");
|
||||
if (strstr(linebuf, "Default topic=") == linebuf)
|
||||
start = linebuf + strlen("Default topic=");
|
||||
if (strstr(linebuf, "Index file=") == linebuf)
|
||||
index = linebuf + strlen("Index file=");
|
||||
if (strstr(linebuf, "Contents file=") == linebuf)
|
||||
contents = linebuf + strlen("Contents file=");
|
||||
}
|
||||
delete[] buff;
|
||||
|
||||
bookr = new HtmlBookRecord(fsys.GetPath(), title, start);
|
||||
|
||||
if (m_ContentsCnt % HTML_REALLOC_STEP == 0)
|
||||
m_Contents = (HtmlContentsItem*) realloc(m_Contents, (m_ContentsCnt + HTML_REALLOC_STEP) * sizeof(HtmlContentsItem));
|
||||
m_Contents[m_ContentsCnt].m_Level = 0;
|
||||
m_Contents[m_ContentsCnt].m_ID = 0;
|
||||
m_Contents[m_ContentsCnt].m_Page = new char[start.Length() + 1];
|
||||
strcpy(m_Contents[m_ContentsCnt].m_Page, start.c_str());
|
||||
m_Contents[m_ContentsCnt].m_Name = new char [title.Length() + 1];
|
||||
strcpy(m_Contents[m_ContentsCnt].m_Name, title.c_str());
|
||||
m_Contents[m_ContentsCnt].m_Book = bookr;
|
||||
m_ContentsCnt++;
|
||||
|
||||
// Try to find cached binary versions:
|
||||
safetitle = SafeFileName(title);
|
||||
fi = fsys.OpenFile(safetitle + ".cached");
|
||||
if (fi == NULL) fi = fsys.OpenFile(m_TempPath + safetitle + ".cached");
|
||||
if ((fi == NULL) || (m_TempPath == wxEmptyString)) {
|
||||
LoadMSProject(bookr, fsys, index, contents, show_wait_msg);
|
||||
if (m_TempPath != wxEmptyString) {
|
||||
wxFileOutputStream *outs = new wxFileOutputStream(m_TempPath + safetitle + ".cached");
|
||||
SaveCachedBook(bookr, outs);
|
||||
delete outs;
|
||||
}
|
||||
}
|
||||
else {
|
||||
LoadCachedBook(bookr, fi -> GetStream());
|
||||
delete fi;
|
||||
}
|
||||
|
||||
m_BookRecords.Add(bookr);
|
||||
if (m_IndexCnt > 0)
|
||||
qsort(m_Index, m_IndexCnt, sizeof(HtmlContentsItem), IndexCompareFunc);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::Display(const wxString& x)
|
||||
{
|
||||
int cnt;
|
||||
int i;
|
||||
wxFileSystem fsys;
|
||||
wxFSFile *f;
|
||||
|
||||
CreateHelpWindow();
|
||||
|
||||
/* 1. try to open given file: */
|
||||
|
||||
cnt = m_BookRecords.GetCount();
|
||||
for (i = 0; i < cnt; i++) {
|
||||
f = fsys.OpenFile(m_BookRecords[i].GetBasePath() + x);
|
||||
if (f) {
|
||||
m_HtmlWin -> LoadPage(m_BookRecords[i].GetBasePath() + x);
|
||||
delete f;
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* 2. try to find a book: */
|
||||
|
||||
for (i = 0; i < cnt; i++) {
|
||||
if (m_BookRecords[i].GetTitle() == x) {
|
||||
m_HtmlWin -> LoadPage(m_BookRecords[i].GetBasePath() + m_BookRecords[i].GetStart());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/* 3. try to find in contents: */
|
||||
|
||||
cnt = m_ContentsCnt;
|
||||
for (i = 0; i < cnt; i++) {
|
||||
if (strcmp(m_Contents[i].m_Name, x) == 0) {
|
||||
m_HtmlWin -> LoadPage(m_Contents[i].m_Book -> GetBasePath() + m_Contents[i].m_Page);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* 4. try to find in index: */
|
||||
|
||||
cnt = m_IndexCnt;
|
||||
for (i = 0; i < cnt; i++) {
|
||||
if (strcmp(m_Index[i].m_Name, x) == 0) {
|
||||
m_HtmlWin -> LoadPage(m_Index[i].m_Book -> GetBasePath() + m_Index[i].m_Page);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* 5. if everything failed, search the documents: */
|
||||
|
||||
KeywordSearch(x);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::Display(const int id)
|
||||
{
|
||||
CreateHelpWindow();
|
||||
|
||||
for (int i = 0; i < m_ContentsCnt; i++) {
|
||||
if (m_Contents[i].m_ID == id) {
|
||||
m_HtmlWin -> LoadPage(m_Contents[i].m_Book -> GetBasePath() + m_Contents[i].m_Page);
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::DisplayContents()
|
||||
{
|
||||
CreateHelpWindow();
|
||||
m_Frame -> Raise();
|
||||
if (!m_Splitter -> IsSplit()) {
|
||||
m_NavigPan -> Show(TRUE);
|
||||
m_HtmlWin -> Show(TRUE);
|
||||
m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
|
||||
}
|
||||
m_NavigPan -> SetSelection(0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::DisplayIndex()
|
||||
{
|
||||
CreateHelpWindow();
|
||||
m_Frame -> Raise();
|
||||
if (!m_Splitter -> IsSplit()) {
|
||||
m_NavigPan -> Show(TRUE);
|
||||
m_HtmlWin -> Show(TRUE);
|
||||
m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
|
||||
}
|
||||
m_NavigPan -> SetSelection(1);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
#if (wxVERSION_NUMBER < 2100) || ((wxVERSION_NUMBER == 2100) && (wxBETA_NUMBER < 7))
|
||||
|
||||
class MyProgressDlg : public wxDialog
|
||||
{
|
||||
public:
|
||||
bool m_Canceled;
|
||||
|
||||
MyProgressDlg(wxWindow *parent) : wxDialog(parent, -1,
|
||||
_("Searching..."),
|
||||
wxPoint(0, 0),
|
||||
#ifdef __WXGTK__
|
||||
wxSize(300, 110)
|
||||
#else
|
||||
wxSize(300, 130)
|
||||
#endif
|
||||
)
|
||||
{m_Canceled = FALSE;}
|
||||
void OnCancel(wxCommandEvent& event) {m_Canceled = TRUE;}
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
BEGIN_EVENT_TABLE(MyProgressDlg, wxDialog)
|
||||
EVT_BUTTON(wxID_CANCEL, MyProgressDlg::OnCancel)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
bool wxHtmlHelpController::KeywordSearch(const wxString& keyword)
|
||||
{
|
||||
int foundcnt = 0;
|
||||
CreateHelpWindow();
|
||||
// if these are not set, we can't continue
|
||||
if (! (m_SearchList && m_HtmlWin))
|
||||
return FALSE;
|
||||
m_Frame -> Raise();
|
||||
if (m_Splitter && m_NavigPan && m_SearchButton) {
|
||||
if (!m_Splitter -> IsSplit()) {
|
||||
m_NavigPan -> Show(TRUE);
|
||||
m_HtmlWin -> Show(TRUE);
|
||||
m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
|
||||
}
|
||||
m_NavigPan -> SetSelection(2);
|
||||
m_SearchList -> Clear();
|
||||
m_SearchText -> SetValue(keyword);
|
||||
m_SearchButton -> Enable(FALSE);
|
||||
}
|
||||
{
|
||||
int cnt = m_ContentsCnt;
|
||||
wxSearchEngine engine;
|
||||
wxFileSystem fsys;
|
||||
wxFSFile *file;
|
||||
wxString lastpage = wxEmptyString;
|
||||
wxString foundstr;
|
||||
|
||||
#if (wxVERSION_NUMBER < 2100) || ((wxVERSION_NUMBER == 2100) && (wxBETA_NUMBER < 7))
|
||||
MyProgressDlg progress(m_Frame);
|
||||
|
||||
wxStaticText *prompt = new wxStaticText(&progress, -1, "", wxPoint(20, 50), wxSize(260, 25), wxALIGN_CENTER);
|
||||
wxGauge *gauge = new wxGauge(&progress, -1, cnt, wxPoint(20, 20), wxSize(260, 25));
|
||||
wxButton *btn = new wxButton(&progress, wxID_CANCEL, _("Cancel"), wxPoint(110, 70), wxSize(80, 25));
|
||||
btn = btn; /* fool compiler :-) */
|
||||
prompt -> SetLabel(_("No matching page found yet"));
|
||||
|
||||
progress.Centre(wxBOTH);
|
||||
progress.Show(TRUE);
|
||||
#else
|
||||
wxProgressDialog progress(_("Searching..."), _("No matching page found yet"), cnt, m_Frame, wxPD_APP_MODAL | wxPD_CAN_ABORT | wxPD_AUTO_HIDE);
|
||||
#endif
|
||||
|
||||
engine.LookFor(keyword);
|
||||
|
||||
for (int i = 0; i < cnt; i++) {
|
||||
#if (wxVERSION_NUMBER < 2100) || ((wxVERSION_NUMBER == 2100) && (wxBETA_NUMBER < 7))
|
||||
gauge -> SetValue(i);
|
||||
if (progress.m_Canceled) break;
|
||||
#else
|
||||
if (progress.Update(i) == FALSE) break;
|
||||
#endif
|
||||
wxYield();
|
||||
|
||||
file = fsys.OpenFile(m_Contents[i].m_Book -> GetBasePath() + m_Contents[i].m_Page);
|
||||
if (file) {
|
||||
if (lastpage != file -> GetLocation()) {
|
||||
lastpage = file -> GetLocation();
|
||||
if (engine.Scan(file -> GetStream())) {
|
||||
foundstr.Printf(_("Found %i matches"), ++foundcnt);
|
||||
#if (wxVERSION_NUMBER < 2100) || ((wxVERSION_NUMBER == 2100) && (wxBETA_NUMBER < 7))
|
||||
prompt -> SetLabel(foundstr);
|
||||
#else
|
||||
progress.Update(i, foundstr);
|
||||
#endif
|
||||
wxYield();
|
||||
m_SearchList -> Append(m_Contents[i].m_Name, (char*)(m_Contents + i));
|
||||
}
|
||||
}
|
||||
delete file;
|
||||
}
|
||||
}
|
||||
|
||||
#if (wxVERSION_NUMBER < 2100) || ((wxVERSION_NUMBER == 2100) && (wxBETA_NUMBER < 7))
|
||||
progress.Close(TRUE);
|
||||
#endif
|
||||
}
|
||||
if (m_SearchButton)
|
||||
m_SearchButton -> Enable(TRUE);
|
||||
if (m_SearchText) {
|
||||
m_SearchText -> SetSelection(0, keyword.Length());
|
||||
m_SearchText -> SetFocus();
|
||||
}
|
||||
if (foundcnt) {
|
||||
HtmlContentsItem *it = (HtmlContentsItem*) m_SearchList -> GetClientData(0);
|
||||
if (it) m_HtmlWin -> LoadPage(it -> m_Book -> GetBasePath() + it -> m_Page);
|
||||
}
|
||||
return (foundcnt > 0);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::CreateHelpWindow()
|
||||
{
|
||||
wxBusyCursor cur;
|
||||
wxString oldpath;
|
||||
wxStatusBar *sbar;
|
||||
|
||||
if (m_Frame) {
|
||||
m_Frame -> Raise();
|
||||
m_Frame -> Show(TRUE);
|
||||
return;
|
||||
}
|
||||
|
||||
#if wxUSE_BUSYINFO
|
||||
wxBusyInfo busyinfo(_("Preparing help window..."));
|
||||
#endif
|
||||
|
||||
if (m_Config) ReadCustomization(m_Config, m_ConfigRoot);
|
||||
|
||||
m_Frame = new wxFrame(NULL, -1, "", wxPoint(m_Cfg.x, m_Cfg.y), wxSize(m_Cfg.w, m_Cfg.h));
|
||||
m_Frame -> PushEventHandler(this);
|
||||
sbar = m_Frame -> CreateStatusBar();
|
||||
|
||||
{
|
||||
wxToolBar *toolBar;
|
||||
toolBar = m_Frame -> CreateToolBar(wxNO_BORDER | wxTB_HORIZONTAL | wxTB_FLAT | wxTB_DOCKABLE);
|
||||
toolBar -> SetMargins(2, 2);
|
||||
wxBitmap* toolBarBitmaps[3];
|
||||
|
||||
#ifdef __WXMSW__
|
||||
toolBarBitmaps[0] = new wxBitmap("panel");
|
||||
toolBarBitmaps[1] = new wxBitmap("back");
|
||||
toolBarBitmaps[2] = new wxBitmap("forward");
|
||||
int width = 24;
|
||||
#else
|
||||
toolBarBitmaps[0] = new wxBitmap(panel_xpm);
|
||||
toolBarBitmaps[1] = new wxBitmap(back_xpm);
|
||||
toolBarBitmaps[2] = new wxBitmap(forward_xpm);
|
||||
int width = 16;
|
||||
#endif
|
||||
|
||||
int currentX = 5;
|
||||
|
||||
toolBar -> AddTool(wxID_HTML_PANEL, *(toolBarBitmaps[0]), wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, _("Show/hide navigation panel"));
|
||||
currentX += width + 5;
|
||||
toolBar -> AddSeparator();
|
||||
toolBar -> AddTool(wxID_HTML_BACK, *(toolBarBitmaps[1]), wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, _("Go back to the previous HTML page"));
|
||||
currentX += width + 5;
|
||||
toolBar -> AddTool(wxID_HTML_FORWARD, *(toolBarBitmaps[2]), wxNullBitmap, FALSE, currentX, -1, (wxObject *) NULL, _("Go forward to the next HTML page"));
|
||||
currentX += width + 5;
|
||||
|
||||
toolBar -> Realize();
|
||||
|
||||
// Can delete the bitmaps since they're reference counted
|
||||
for (int i = 0; i < 3; i++) delete toolBarBitmaps[i];
|
||||
}
|
||||
|
||||
|
||||
{
|
||||
m_Splitter = new wxSplitterWindow(m_Frame);
|
||||
|
||||
m_HtmlWin = new wxHtmlWindow(m_Splitter);
|
||||
m_HtmlWin -> SetRelatedFrame(m_Frame, m_TitleFormat);
|
||||
m_HtmlWin -> SetRelatedStatusBar(0);
|
||||
if (m_Config) m_HtmlWin -> ReadCustomization(m_Config, m_ConfigRoot);
|
||||
|
||||
m_NavigPan = new wxNotebook(m_Splitter, wxID_HTML_NOTEBOOK, wxDefaultPosition, wxDefaultSize);
|
||||
{
|
||||
m_ContentsBox = new wxTreeCtrl(m_NavigPan, wxID_HTML_TREECTRL, wxDefaultPosition, wxDefaultSize, wxTR_HAS_BUTTONS | wxSUNKEN_BORDER);
|
||||
m_ContentsBox -> SetImageList(m_ContentsImageList);
|
||||
m_NavigPan -> AddPage(m_ContentsBox, _("Contents"));
|
||||
}
|
||||
|
||||
{
|
||||
wxWindow *dummy = new wxPanel(m_NavigPan, wxID_HTML_INDEXPAGE);
|
||||
wxLayoutConstraints *b1 = new wxLayoutConstraints;
|
||||
b1 -> top.SameAs (dummy, wxTop, 0);
|
||||
b1 -> left.SameAs (dummy, wxLeft, 0);
|
||||
b1 -> width.PercentOf (dummy, wxWidth, 100);
|
||||
b1 -> bottom.SameAs (dummy, wxBottom, 0);
|
||||
m_IndexBox = new wxListBox(dummy, wxID_HTML_INDEXLIST, wxDefaultPosition, wxDefaultSize, 0);
|
||||
m_IndexBox -> SetConstraints(b1);
|
||||
dummy -> SetAutoLayout(TRUE);
|
||||
m_NavigPan -> AddPage(dummy, _("Index"));
|
||||
}
|
||||
|
||||
{
|
||||
wxWindow *dummy = new wxPanel(m_NavigPan, wxID_HTML_SEARCHPAGE);
|
||||
|
||||
wxLayoutConstraints *b1 = new wxLayoutConstraints;
|
||||
m_SearchText = new wxTextCtrl(dummy, wxID_HTML_SEARCHTEXT);
|
||||
b1 -> top.SameAs (dummy, wxTop, 0);
|
||||
b1 -> left.SameAs (dummy, wxLeft, 0);
|
||||
b1 -> right.SameAs (dummy, wxRight, 0);
|
||||
b1 -> height.AsIs();
|
||||
m_SearchText -> SetConstraints(b1);
|
||||
|
||||
wxLayoutConstraints *b2 = new wxLayoutConstraints;
|
||||
m_SearchButton = new wxButton(dummy, wxID_HTML_SEARCHBUTTON, _("Search!"));
|
||||
b2 -> top.Below (m_SearchText, 10);
|
||||
b2 -> right.SameAs (dummy, wxRight, 10);
|
||||
b2 -> width.AsIs();
|
||||
b2 -> height.AsIs();
|
||||
m_SearchButton -> SetConstraints(b2);
|
||||
|
||||
wxLayoutConstraints *b3 = new wxLayoutConstraints;
|
||||
m_SearchList = new wxListBox(dummy, wxID_HTML_SEARCHLIST, wxDefaultPosition, wxDefaultSize, 0);
|
||||
b3 -> top.Below (m_SearchButton, 10);
|
||||
b3 -> left.SameAs (dummy, wxLeft, 0);
|
||||
b3 -> right.SameAs (dummy, wxRight, 0);
|
||||
b3 -> bottom.SameAs (dummy, wxBottom, 0);
|
||||
m_SearchList -> SetConstraints(b3);
|
||||
|
||||
dummy -> SetAutoLayout(TRUE);
|
||||
dummy -> Layout();
|
||||
m_NavigPan -> AddPage(dummy, _("Search"));
|
||||
}
|
||||
|
||||
RefreshLists();
|
||||
m_NavigPan -> Show(TRUE);
|
||||
m_HtmlWin -> Show(TRUE);
|
||||
m_Splitter -> SetMinimumPaneSize(20);
|
||||
m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
|
||||
if (!m_Cfg.navig_on) m_Splitter -> Unsplit(m_NavigPan);
|
||||
wxYield();
|
||||
}
|
||||
|
||||
m_Frame -> Show(TRUE);
|
||||
wxYield();
|
||||
}
|
||||
|
||||
|
||||
|
||||
#define MAX_ROOTS 64
|
||||
|
||||
void wxHtmlHelpController::CreateContents()
|
||||
{
|
||||
HtmlContentsItem *it;
|
||||
wxTreeItemId roots[MAX_ROOTS];
|
||||
bool imaged[MAX_ROOTS];
|
||||
int count = m_ContentsCnt;
|
||||
|
||||
m_ContentsBox -> DeleteAllItems();
|
||||
roots[0] = m_ContentsBox -> AddRoot(_("(Help)"));
|
||||
imaged[0] = TRUE;
|
||||
|
||||
for (int i = 0; i < count; i++) {
|
||||
it = m_Contents + i;
|
||||
roots[it -> m_Level + 1] = m_ContentsBox -> AppendItem(roots[it -> m_Level], it -> m_Name, IMG_Page, -1, new wxHtmlHelpTreeItemData(it));
|
||||
if (it -> m_Level == 0) {
|
||||
m_ContentsBox -> SetItemBold(roots[1], TRUE);
|
||||
m_ContentsBox -> SetItemImage(roots[1], IMG_Book);
|
||||
m_ContentsBox -> SetItemSelectedImage(roots[1], IMG_Book);
|
||||
imaged[1] = TRUE;
|
||||
}
|
||||
else imaged[it -> m_Level + 1] = FALSE;
|
||||
|
||||
if (!imaged[it -> m_Level]) {
|
||||
m_ContentsBox -> SetItemImage(roots[it -> m_Level], IMG_Folder);
|
||||
m_ContentsBox -> SetItemSelectedImage(roots[it -> m_Level], IMG_Folder);
|
||||
imaged[it -> m_Level] = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
m_ContentsBox -> Expand(roots[0]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::CreateIndex()
|
||||
{
|
||||
m_IndexBox -> Clear();
|
||||
|
||||
for (int i = 0; i < m_IndexCnt; i++)
|
||||
m_IndexBox -> Append(m_Index[i].m_Name, (char*)(m_Index + i));
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::RefreshLists()
|
||||
{
|
||||
if (m_Frame) {
|
||||
CreateContents();
|
||||
CreateIndex();
|
||||
m_SearchList -> Clear();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::ReadCustomization(wxConfigBase *cfg, wxString path)
|
||||
{
|
||||
wxString oldpath;
|
||||
wxString tmp;
|
||||
|
||||
if (path != wxEmptyString) {
|
||||
oldpath = cfg -> GetPath();
|
||||
cfg -> SetPath(path);
|
||||
}
|
||||
|
||||
m_Cfg.navig_on = cfg -> Read("hcNavigPanel", m_Cfg.navig_on) != 0;
|
||||
m_Cfg.sashpos = cfg -> Read("hcSashPos", m_Cfg.sashpos);
|
||||
m_Cfg.x = cfg -> Read("hcX", m_Cfg.x);
|
||||
m_Cfg.y = cfg -> Read("hcY", m_Cfg.y);
|
||||
m_Cfg.w = cfg -> Read("hcW", m_Cfg.w);
|
||||
m_Cfg.h = cfg -> Read("hcH", m_Cfg.h);
|
||||
|
||||
if (path != wxEmptyString)
|
||||
cfg -> SetPath(oldpath);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::WriteCustomization(wxConfigBase *cfg, wxString path)
|
||||
{
|
||||
wxString oldpath;
|
||||
wxString tmp;
|
||||
|
||||
if (path != wxEmptyString) {
|
||||
oldpath = cfg -> GetPath();
|
||||
cfg -> SetPath(path);
|
||||
}
|
||||
|
||||
cfg -> Write("hcNavigPanel", m_Cfg.navig_on);
|
||||
cfg -> Write("hcSashPos", (long)m_Cfg.sashpos);
|
||||
cfg -> Write("hcX", (long)m_Cfg.x);
|
||||
cfg -> Write("hcY", (long)m_Cfg.y);
|
||||
cfg -> Write("hcW", (long)m_Cfg.w);
|
||||
cfg -> Write("hcH", (long)m_Cfg.h);
|
||||
|
||||
if (path != wxEmptyString)
|
||||
cfg -> SetPath(oldpath);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
EVENT HANDLING :
|
||||
*/
|
||||
|
||||
|
||||
void wxHtmlHelpController::OnToolbar(wxCommandEvent& event)
|
||||
{
|
||||
switch (event.GetId()) {
|
||||
case wxID_HTML_BACK :
|
||||
m_HtmlWin -> HistoryBack();
|
||||
break;
|
||||
case wxID_HTML_FORWARD :
|
||||
m_HtmlWin -> HistoryForward();
|
||||
break;
|
||||
case wxID_HTML_PANEL :
|
||||
if (m_Splitter -> IsSplit()) {
|
||||
m_Cfg.sashpos = m_Splitter -> GetSashPosition();
|
||||
m_Splitter -> Unsplit(m_NavigPan);
|
||||
}
|
||||
else {
|
||||
m_NavigPan -> Show(TRUE);
|
||||
m_HtmlWin -> Show(TRUE);
|
||||
m_Splitter -> SplitVertically(m_NavigPan, m_HtmlWin, m_Cfg.sashpos);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::OnContentsSel(wxTreeEvent& event)
|
||||
{
|
||||
wxHtmlHelpTreeItemData *pg;
|
||||
|
||||
pg = (wxHtmlHelpTreeItemData*) m_ContentsBox -> GetItemData(event.GetItem());
|
||||
if (pg) m_HtmlWin -> LoadPage(pg -> GetPage());
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::OnIndexSel(wxCommandEvent& event)
|
||||
{
|
||||
HtmlContentsItem *it = (HtmlContentsItem*) m_IndexBox -> GetClientData(m_IndexBox -> GetSelection());
|
||||
if (it) m_HtmlWin -> LoadPage(it -> m_Book -> GetBasePath() + it -> m_Page);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::OnSearchSel(wxCommandEvent& event)
|
||||
{
|
||||
HtmlContentsItem *it = (HtmlContentsItem*) m_SearchList -> GetClientData(m_SearchList -> GetSelection());
|
||||
if (it) m_HtmlWin -> LoadPage(it -> m_Book -> GetBasePath() + it -> m_Page);
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::OnCloseWindow(wxCloseEvent& event)
|
||||
{
|
||||
int a, b;
|
||||
|
||||
m_Cfg.navig_on = m_Splitter -> IsSplit();
|
||||
if (m_Cfg.navig_on)
|
||||
m_Cfg.sashpos = m_Splitter -> GetSashPosition();
|
||||
m_Frame -> GetPosition(&a, &b);
|
||||
m_Cfg.x = a, m_Cfg.y = b;
|
||||
m_Frame -> GetSize(&a, &b);
|
||||
m_Cfg.w = a, m_Cfg.h = b;
|
||||
|
||||
if (m_Config) {
|
||||
WriteCustomization(m_Config, m_ConfigRoot);
|
||||
m_HtmlWin -> WriteCustomization(m_Config, m_ConfigRoot);
|
||||
}
|
||||
m_Frame = NULL;
|
||||
|
||||
event.Skip();
|
||||
}
|
||||
|
||||
|
||||
|
||||
void wxHtmlHelpController::OnSearch(wxCommandEvent& event)
|
||||
{
|
||||
wxString sr = m_SearchText -> GetLineText(0);
|
||||
|
||||
if (sr != wxEmptyString) KeywordSearch(sr);
|
||||
}
|
||||
|
||||
|
||||
|
||||
BEGIN_EVENT_TABLE(wxHtmlHelpController, wxEvtHandler)
|
||||
EVT_TOOL_RANGE(wxID_HTML_PANEL, wxID_HTML_FORWARD, wxHtmlHelpController::OnToolbar)
|
||||
EVT_TREE_SEL_CHANGED(wxID_HTML_TREECTRL, wxHtmlHelpController::OnContentsSel)
|
||||
EVT_LISTBOX(wxID_HTML_INDEXLIST, wxHtmlHelpController::OnIndexSel)
|
||||
EVT_LISTBOX(wxID_HTML_SEARCHLIST, wxHtmlHelpController::OnSearchSel)
|
||||
EVT_CLOSE(wxHtmlHelpController::OnCloseWindow)
|
||||
EVT_BUTTON(wxID_HTML_SEARCHBUTTON, wxHtmlHelpController::OnSearch)
|
||||
EVT_TEXT_ENTER(wxID_HTML_SEARCHTEXT, wxHtmlHelpController::OnSearch)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
@@ -1,72 +0,0 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: search.cpp
|
||||
// Purpose: search engine
|
||||
// Author: Vaclav Slavik
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) 1999 Vaclav Slavik
|
||||
// Licence: wxWindows Licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation
|
||||
#endif
|
||||
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#include "wx/defs.h"
|
||||
#if wxUSE_HTML
|
||||
|
||||
#ifdef __BORDLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
#ifndef WXPRECOMP
|
||||
#endif
|
||||
|
||||
#include "wx/html/helpdata.h"
|
||||
|
||||
|
||||
//--------------------------------------------------------------------------------
|
||||
// wxSearchEngine
|
||||
//--------------------------------------------------------------------------------
|
||||
|
||||
void wxSearchEngine::LookFor(const wxString& keyword)
|
||||
{
|
||||
if (m_Keyword) delete[] m_Keyword;
|
||||
m_Keyword = new wxChar[keyword.Length() + 1];
|
||||
wxStrcpy(m_Keyword, keyword.c_str());
|
||||
for (int i = wxStrlen(m_Keyword) - 1; i >= 0; i--)
|
||||
if ((m_Keyword[i] >= wxT('A')) && (m_Keyword[i] <= wxT('Z')))
|
||||
m_Keyword[i] += wxT('a') - wxT('A');
|
||||
}
|
||||
|
||||
|
||||
|
||||
bool wxSearchEngine::Scan(wxInputStream *stream)
|
||||
{
|
||||
wxASSERT_MSG(m_Keyword != NULL, _("wxSearchEngine::LookFor must be called before scanning!"));
|
||||
|
||||
int i, j;
|
||||
int lng = stream ->GetSize();
|
||||
int wrd = wxStrlen(m_Keyword);
|
||||
bool found = FALSE;
|
||||
char *buf = new char[lng + 1];
|
||||
stream -> Read(buf, lng);
|
||||
buf[lng] = 0;
|
||||
|
||||
for (i = 0; i < lng; i++)
|
||||
if ((buf[i] >= 'A') && (buf[i] <= 'Z')) buf[i] += 'a' - 'A';
|
||||
|
||||
for (i = 0; i < lng - wrd; i++) {
|
||||
j = 0;
|
||||
while ((j < wrd) && (buf[i + j] == m_Keyword[j])) j++;
|
||||
if (j == wrd) {found = TRUE; break;}
|
||||
}
|
||||
|
||||
delete[] buf;
|
||||
return found;
|
||||
}
|
||||
|
||||
#endif
|
@@ -25,6 +25,7 @@
|
||||
#endif
|
||||
|
||||
#include "wx/filefn.h"
|
||||
#include "wx/log.h"
|
||||
|
||||
#if wxUSE_HELP && wxUSE_MS_HTML_HELP && defined(__WIN95__) && wxUSE_WXHTML_HELP
|
||||
#include "wx/msw/helpchm.h"
|
||||
@@ -93,8 +94,9 @@ wxString wxBestHelpController::GetValidFilename( const wxString& filename ) cons
|
||||
default:
|
||||
// we CAN'T get here
|
||||
wxFAIL_MSG( wxT("wxBestHelpController: Must call Initialize, first!") );
|
||||
return wxEmptyString;
|
||||
}
|
||||
|
||||
return wxEmptyString;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
@@ -27,6 +27,11 @@
|
||||
|
||||
#include "wx/dynlib.h"
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/intl.h"
|
||||
#include "wx/app.h"
|
||||
#endif
|
||||
|
||||
#include "wx/msw/private.h"
|
||||
|
||||
// instead of including htmlhelp.h, duplicate the things from it we need here
|
||||
|
@@ -844,6 +844,12 @@ void wxTextCtrl::GetSelection(long* from, long* to) const
|
||||
|
||||
bool wxTextCtrl::IsEditable() const
|
||||
{
|
||||
// strangely enough, we may be called before the control is created: our
|
||||
// own Create() calls MSWGetStyle() which calls AcceptsFocus() which calls
|
||||
// us
|
||||
if ( !m_hWnd )
|
||||
return TRUE;
|
||||
|
||||
long style = ::GetWindowLong(GetHwnd(), GWL_STYLE);
|
||||
|
||||
return (style & ES_READONLY) == 0;
|
||||
|
@@ -1,68 +0,0 @@
|
||||
#
|
||||
# File: makefile.nt
|
||||
# Author: Julian Smart
|
||||
# Created: 1993
|
||||
# Updated:
|
||||
# Copyright: (c) 1993, AIAI, University of Edinburgh
|
||||
#
|
||||
# "%W% %G%"
|
||||
#
|
||||
# Makefile : Builds winpng.lib library for Windows 3.1
|
||||
|
||||
# Change WXDIR or WXWIN to wherever wxWindows is found
|
||||
WXDIR = $(WXWIN)
|
||||
WXLIB = $(WXDIR)\lib\wx.lib
|
||||
WXINC = $(WXDIR)\include
|
||||
|
||||
WINPNGDIR = ..\png
|
||||
WINPNGINC = $(WINPNGDIR)
|
||||
WINPNGLIB = ..\..\lib\winpng.lib
|
||||
|
||||
INC = /I..\zlib
|
||||
|
||||
FINAL=1
|
||||
|
||||
# Set this to nothing if your compiler is MS C++ 7
|
||||
ZOPTION=
|
||||
|
||||
!ifndef FINAL
|
||||
FINAL=0
|
||||
!endif
|
||||
|
||||
PRECOMP=/YuWX.H
|
||||
|
||||
!if "$(FINAL)" == "0"
|
||||
OPT = /Od
|
||||
CPPFLAGS= /W4 /Zi /MD /GX- $(ZOPTION) $(OPT) /Dwx_msw $(INC) # $(PRECOMP) /Fp$(WXDIR)\src\msw\wx.pch
|
||||
CFLAGS= /W4 /Zi /MD /GX- /Od /Dwx_msw $(INC)
|
||||
LINKFLAGS=/NOD /CO /ONERROR:NOEXE
|
||||
!else
|
||||
# /Ox for real FINAL version
|
||||
OPT = /O2
|
||||
CPPFLAGS= /W4 /MD /GX- /Dwx_msw $(INC) # $(PRECOMP) /Fp$(WXDIR)\src\msw\wx.pch
|
||||
CFLAGS= /W4 /MD /GX- /Dwx_msw $(INC)
|
||||
LINKFLAGS=/NOD /ONERROR:NOEXE
|
||||
!endif
|
||||
|
||||
OBJECTS = png.obj pngread.obj pngrtran.obj pngrutil.obj \
|
||||
pngpread.obj pngtrans.obj pngwrite.obj pngwtran.obj pngwutil.obj \
|
||||
pngerror.obj pngmem.obj pngwio.obj pngrio.obj pngget.obj pngset.obj
|
||||
|
||||
all: $(WINPNGLIB)
|
||||
|
||||
$(WINPNGLIB): $(OBJECTS)
|
||||
erase $(WINPNGLIB)
|
||||
lib @<<
|
||||
-out:$(WINPNGLIB)
|
||||
$(OBJECTS)
|
||||
<<
|
||||
|
||||
.c.obj:
|
||||
cl -DWIN32 $(OPT) $(CFLAGS) /c $*.c
|
||||
|
||||
clean:
|
||||
erase *.obj
|
||||
erase *.exe
|
||||
erase *.lib
|
||||
|
||||
cleanall: clean
|
@@ -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
|
@@ -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 */
|
1146
src/regex/regc_lex.c
1559
src/regex/regc_nfa.c
@@ -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;
|
||||
}
|
@@ -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"
|
||||
},
|
@@ -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 <sys/types.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#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
|
||||
|
@@ -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);
|
||||
}
|
@@ -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 <assert.h>
|
||||
#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 <limits.h>
|
||||
#endif
|
||||
#ifndef _POSIX2_RE_DUP_MAX
|
||||
#define _POSIX2_RE_DUP_MAX 255 /* normally from <limits.h> */
|
||||
#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<<BYTBITS) /* size of table with one entry per byt
|
||||
* value */
|
||||
#define BYTMASK (BYTTAB-1) /* bit mask for byt */
|
||||
#define NBYTS ((CHRBITS+BYTBITS-1)/BYTBITS)
|
||||
/* the definition of GETCOLOR(), below, assumes NBYTS <= 4 */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* As soon as possible, we map chrs into equivalence classes -- "colors" --
|
||||
* which are of much more manageable number.
|
||||
*/
|
||||
typedef short color; /* colors of characters */
|
||||
typedef int pcolor; /* what color promotes to */
|
||||
|
||||
#define COLORLESS (-1) /* impossible color */
|
||||
#define WHITE 0 /* default color, parent of all others */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* A colormap is a tree -- more precisely, a DAG -- indexed at each level
|
||||
* by a byt of the chr, to map the chr to a color efficiently. Because
|
||||
* lower sections of the tree can be shared, it can exploit the usual
|
||||
* sparseness of such a mapping table. The tree is always NBYTS levels
|
||||
* deep (in the past it was shallower during construction but was "filled"
|
||||
* to full depth at the end of that); areas that are unaltered as yet point
|
||||
* to "fill blocks" which are entirely WHITE in color.
|
||||
*/
|
||||
|
||||
/* the tree itself */
|
||||
struct colors
|
||||
{
|
||||
color ccolor[BYTTAB];
|
||||
};
|
||||
struct ptrs
|
||||
{
|
||||
union tree *pptr[BYTTAB];
|
||||
};
|
||||
union tree
|
||||
{
|
||||
struct colors colors;
|
||||
struct ptrs ptrs;
|
||||
};
|
||||
|
||||
#define tcolor colors.ccolor
|
||||
#define tptr ptrs.pptr
|
||||
|
||||
/* internal per-color structure for the color machinery */
|
||||
struct colordesc
|
||||
{
|
||||
uchr nchrs; /* number of chars of this color */
|
||||
color sub; /* open subcolor (if any); free chain ptr */
|
||||
#define NOSUB COLORLESS
|
||||
struct arc *arcs; /* color chain */
|
||||
int flags;
|
||||
#define FREECOL 01 /* currently free */
|
||||
#define PSEUDO 02 /* pseudocolor, no real chars */
|
||||
#define UNUSEDCOLOR(cd) ((cd)->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 */
|
||||
};
|
@@ -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))]])
|
||||
|
@@ -153,18 +153,6 @@ bool wxDialog::Show(bool show)
|
||||
EndModal(wxID_CANCEL);
|
||||
}
|
||||
|
||||
// Not sure how to put this in platform-specific
|
||||
// code just yet. Nano-X has to force a size event,
|
||||
// else there's no initial size.
|
||||
#if wxUSE_NANOX
|
||||
if (show)
|
||||
{
|
||||
wxSizeEvent event(GetSize(), GetId());
|
||||
event.SetEventObject(this);
|
||||
GetEventHandler()->ProcessEvent(event);
|
||||
}
|
||||
#endif
|
||||
|
||||
bool ret = wxDialogBase::Show(show);
|
||||
|
||||
if ( show )
|
||||
|
@@ -30,6 +30,8 @@
|
||||
#include "wx/dcmemory.h"
|
||||
#include "wx/window.h"
|
||||
|
||||
#include "wx/menu.h"
|
||||
|
||||
#include "wx/bmpbuttn.h"
|
||||
#include "wx/button.h"
|
||||
#include "wx/checkbox.h"
|
||||
@@ -40,6 +42,8 @@
|
||||
#include "wx/slider.h"
|
||||
#include "wx/textctrl.h"
|
||||
#include "wx/toolbar.h"
|
||||
|
||||
#include "wx/settings.h"
|
||||
#endif // WX_PRECOMP
|
||||
|
||||
#include "wx/notebook.h"
|
||||
@@ -51,6 +55,8 @@
|
||||
#include "wx/univ/theme.h"
|
||||
#include "wx/toplevel.h"
|
||||
|
||||
class WXDLLEXPORT wxGTKMenuGeometryInfo;
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// constants (to be removed, for testing only)
|
||||
// ----------------------------------------------------------------------------
|
||||
@@ -425,6 +431,16 @@ protected:
|
||||
wxAlignment align,
|
||||
int indexAccel);
|
||||
|
||||
// common part of DrawMenuItem() and DrawMenuBarItem()
|
||||
void DoDrawMenuItem(wxDC& dc,
|
||||
const wxRect& rect,
|
||||
const wxString& label,
|
||||
int flags,
|
||||
int indexAccel,
|
||||
const wxString& accel = _T(""),
|
||||
const wxBitmap& bitmap = wxNullBitmap,
|
||||
const wxGTKMenuGeometryInfo *geometryInfo = NULL);
|
||||
|
||||
// initialize the combo bitmaps
|
||||
void InitComboBitmaps();
|
||||
|
||||
@@ -1215,6 +1231,10 @@ void wxGTKRenderer::DrawButtonLabel(wxDC& dc,
|
||||
dc.DrawLabel(label, rectShadow, alignment, indexAccel);
|
||||
dc.SetTextForeground(wxSCHEME_COLOUR(m_scheme, CONTROL_TEXT_DISABLED));
|
||||
}
|
||||
else
|
||||
{
|
||||
dc.SetTextForeground(wxSCHEME_COLOUR(m_scheme, CONTROL_TEXT));
|
||||
}
|
||||
|
||||
dc.DrawLabel(label, image, rect, alignment, indexAccel, rectBounds);
|
||||
}
|
||||
@@ -1273,6 +1293,7 @@ void wxGTKRenderer::DrawCheckItem(wxDC& dc,
|
||||
wxRect rectBitmap = rect;
|
||||
rectBitmap.x -= 1;
|
||||
rectBitmap.width = GetCheckBitmapSize().x;
|
||||
|
||||
// never draw the focus rect around the check indicators here
|
||||
DrawCheckButton(dc, _T(""), bitmap, rectBitmap, flags & ~wxCONTROL_FOCUSED);
|
||||
|
||||
@@ -1582,11 +1603,15 @@ void wxGTKRenderer::DrawToolBarButton(wxDC& dc,
|
||||
|
||||
if ( flags & wxCONTROL_PRESSED )
|
||||
{
|
||||
DrawBorder(dc, wxBORDER_SUNKEN, rect, flags);
|
||||
DrawBorder(dc, wxBORDER_SUNKEN, rect, flags, &rect);
|
||||
|
||||
DrawBackground(dc, wxSCHEME_COLOUR(m_scheme, CONTROL_PRESSED), rect);
|
||||
}
|
||||
else if ( flags & wxCONTROL_CURRENT )
|
||||
{
|
||||
DrawBorder(dc, wxBORDER_RAISED, rect, flags);
|
||||
DrawBorder(dc, wxBORDER_RAISED, rect, flags, &rect);
|
||||
|
||||
DrawBackground(dc, wxSCHEME_COLOUR(m_scheme, CONTROL_CURRENT), rect);
|
||||
}
|
||||
|
||||
dc.DrawLabel(label, bitmap, rect, wxALIGN_CENTRE);
|
||||
@@ -1890,45 +1915,265 @@ void wxGTKRenderer::DrawSliderThumb(wxDC& dc,
|
||||
// menu and menubar
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// wxGTKMenuGeometryInfo: the wxMenuGeometryInfo used by wxGTKRenderer
|
||||
class WXDLLEXPORT wxGTKMenuGeometryInfo : public wxMenuGeometryInfo
|
||||
{
|
||||
public:
|
||||
virtual wxSize GetSize() const { return m_size; }
|
||||
|
||||
wxCoord GetLabelOffset() const { return m_ofsLabel; }
|
||||
wxCoord GetAccelOffset() const { return m_ofsAccel; }
|
||||
|
||||
wxCoord GetItemHeight() const { return m_heightItem; }
|
||||
|
||||
private:
|
||||
// the total size of the menu
|
||||
wxSize m_size;
|
||||
|
||||
// the offset of the start of the menu item label
|
||||
wxCoord m_ofsLabel;
|
||||
|
||||
// the offset of the start of the accel label
|
||||
wxCoord m_ofsAccel;
|
||||
|
||||
// the height of a normal (not separator) item
|
||||
wxCoord m_heightItem;
|
||||
|
||||
friend wxMenuGeometryInfo *
|
||||
wxGTKRenderer::GetMenuGeometry(wxWindow *, const wxMenu&) const;
|
||||
};
|
||||
|
||||
// FIXME: all constants are hardcoded but shouldn't be
|
||||
static const wxCoord MENU_LEFT_MARGIN = 9;
|
||||
static const wxCoord MENU_RIGHT_MARGIN = 6;
|
||||
|
||||
static const wxCoord MENU_HORZ_MARGIN = 6;
|
||||
static const wxCoord MENU_VERT_MARGIN = 3;
|
||||
|
||||
// the margin around bitmap/check marks (on each side)
|
||||
static const wxCoord MENU_BMP_MARGIN = 2;
|
||||
|
||||
// the margin between the labels and accel strings
|
||||
static const wxCoord MENU_ACCEL_MARGIN = 8;
|
||||
|
||||
// the separator height in pixels: in fact, strangely enough, the real height
|
||||
// is 2 but Windows adds one extra pixel in the bottom margin, so take it into
|
||||
// account here
|
||||
static const wxCoord MENU_SEPARATOR_HEIGHT = 3;
|
||||
|
||||
// the size of the standard checkmark bitmap
|
||||
static const wxCoord MENU_CHECK_SIZE = 9;
|
||||
|
||||
void wxGTKRenderer::DrawMenuBarItem(wxDC& dc,
|
||||
const wxRect& rect,
|
||||
const wxString& label,
|
||||
int flags,
|
||||
int indexAccel)
|
||||
{
|
||||
DrawLabel(dc, label, rect, flags, wxALIGN_CENTRE, indexAccel);
|
||||
DoDrawMenuItem(dc, rect, label, flags, indexAccel);
|
||||
}
|
||||
|
||||
void wxGTKRenderer::DrawMenuItem(wxDC& dc,
|
||||
wxCoord y,
|
||||
const wxMenuGeometryInfo& geometryInfo,
|
||||
const wxMenuGeometryInfo& gi,
|
||||
const wxString& label,
|
||||
const wxString& accel,
|
||||
const wxBitmap& bitmap,
|
||||
int flags,
|
||||
int indexAccel)
|
||||
{
|
||||
wxFAIL_MSG(_T("TODO"));
|
||||
const wxGTKMenuGeometryInfo& geomInfo = (const wxGTKMenuGeometryInfo&)gi;
|
||||
|
||||
wxRect rect;
|
||||
rect.x = 0;
|
||||
rect.y = y;
|
||||
rect.width = geomInfo.GetSize().x;
|
||||
rect.height = geomInfo.GetItemHeight();
|
||||
|
||||
DoDrawMenuItem(dc, rect, label, flags, indexAccel, accel, bitmap, &geomInfo);
|
||||
}
|
||||
|
||||
void wxGTKRenderer::DoDrawMenuItem(wxDC& dc,
|
||||
const wxRect& rectOrig,
|
||||
const wxString& label,
|
||||
int flags,
|
||||
int indexAccel,
|
||||
const wxString& accel,
|
||||
const wxBitmap& bitmap,
|
||||
const wxGTKMenuGeometryInfo *geometryInfo)
|
||||
{
|
||||
wxRect rect = rectOrig;
|
||||
|
||||
// draw the selected item specially
|
||||
if ( flags & wxCONTROL_SELECTED )
|
||||
{
|
||||
wxRect rectIn;
|
||||
DrawBorder(dc, wxBORDER_RAISED, rect, flags, &rectIn);
|
||||
|
||||
DrawBackground(dc, wxSCHEME_COLOUR(m_scheme, CONTROL_CURRENT), rectIn);
|
||||
}
|
||||
|
||||
rect.Deflate(MENU_HORZ_MARGIN, MENU_VERT_MARGIN);
|
||||
|
||||
// draw the bitmap: use the bitmap provided or the standard checkmark for
|
||||
// the checkable items
|
||||
if ( geometryInfo )
|
||||
{
|
||||
wxBitmap bmp = bitmap;
|
||||
if ( !bmp.Ok() && (flags & wxCONTROL_CHECKABLE) )
|
||||
{
|
||||
bmp = GetCheckBitmap(flags);
|
||||
}
|
||||
|
||||
if ( bmp.Ok() )
|
||||
{
|
||||
rect.SetRight(geometryInfo->GetLabelOffset());
|
||||
wxControlRenderer::DrawBitmap(dc, bmp, rect);
|
||||
}
|
||||
}
|
||||
//else: menubar items don't have bitmaps
|
||||
|
||||
// draw the label
|
||||
if ( geometryInfo )
|
||||
{
|
||||
rect.x = geometryInfo->GetLabelOffset();
|
||||
rect.SetRight(geometryInfo->GetAccelOffset());
|
||||
}
|
||||
|
||||
DrawLabel(dc, label, rect, flags, wxALIGN_CENTRE_VERTICAL, indexAccel);
|
||||
|
||||
// draw the accel string
|
||||
if ( !accel.empty() )
|
||||
{
|
||||
// menubar items shouldn't have them
|
||||
wxCHECK_RET( geometryInfo, _T("accel strings only valid for menus") );
|
||||
|
||||
rect.x = geometryInfo->GetAccelOffset();
|
||||
rect.SetRight(geometryInfo->GetSize().x);
|
||||
|
||||
// NB: no accel index here
|
||||
DrawLabel(dc, accel, rect, flags, wxALIGN_CENTRE_VERTICAL);
|
||||
}
|
||||
|
||||
// draw the submenu indicator
|
||||
if ( flags & wxCONTROL_ISSUBMENU )
|
||||
{
|
||||
wxCHECK_RET( geometryInfo, _T("wxCONTROL_ISSUBMENU only valid for menus") );
|
||||
|
||||
rect.x = geometryInfo->GetSize().x - MENU_RIGHT_MARGIN;
|
||||
rect.width = MENU_RIGHT_MARGIN;
|
||||
|
||||
DrawArrow(dc, wxRIGHT, rect, flags);
|
||||
}
|
||||
}
|
||||
|
||||
void wxGTKRenderer::DrawMenuSeparator(wxDC& dc,
|
||||
wxCoord y,
|
||||
const wxMenuGeometryInfo& geomInfo)
|
||||
{
|
||||
wxFAIL_MSG(_T("TODO"));
|
||||
DrawHorizontalLine(dc, y + MENU_VERT_MARGIN, 0, geomInfo.GetSize().x);
|
||||
}
|
||||
|
||||
wxSize wxGTKRenderer::GetMenuBarItemSize(const wxSize& sizeText) const
|
||||
{
|
||||
return sizeText;
|
||||
wxSize size = sizeText;
|
||||
|
||||
// TODO: make this configurable
|
||||
size.x += 2*MENU_HORZ_MARGIN;
|
||||
size.y += 2*MENU_VERT_MARGIN;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
wxMenuGeometryInfo *wxGTKRenderer::GetMenuGeometry(wxWindow *win,
|
||||
const wxMenu& menu) const
|
||||
{
|
||||
wxFAIL_MSG(_T("TODO"));
|
||||
// prepare the dc: for now we draw all the items with the system font
|
||||
wxClientDC dc(win);
|
||||
dc.SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
|
||||
|
||||
return NULL;
|
||||
// the height of a normal item
|
||||
wxCoord heightText = dc.GetCharHeight();
|
||||
|
||||
// the total height
|
||||
wxCoord height = 0;
|
||||
|
||||
// the max length of label and accel strings: the menu width is the sum of
|
||||
// them, even if they're for different items (as the accels should be
|
||||
// aligned)
|
||||
//
|
||||
// the max length of the bitmap is never 0 as Windows always leaves enough
|
||||
// space for a check mark indicator
|
||||
wxCoord widthLabelMax = 0,
|
||||
widthAccelMax = 0,
|
||||
widthBmpMax = MENU_LEFT_MARGIN;
|
||||
|
||||
for ( wxMenuItemList::Node *node = menu.GetMenuItems().GetFirst();
|
||||
node;
|
||||
node = node->GetNext() )
|
||||
{
|
||||
// height of this item
|
||||
wxCoord h;
|
||||
|
||||
wxMenuItem *item = node->GetData();
|
||||
if ( item->IsSeparator() )
|
||||
{
|
||||
h = MENU_SEPARATOR_HEIGHT;
|
||||
}
|
||||
else // not separator
|
||||
{
|
||||
h = heightText;
|
||||
|
||||
wxCoord widthLabel;
|
||||
dc.GetTextExtent(item->GetLabel(), &widthLabel, NULL);
|
||||
if ( widthLabel > widthLabelMax )
|
||||
{
|
||||
widthLabelMax = widthLabel;
|
||||
}
|
||||
|
||||
wxCoord widthAccel;
|
||||
dc.GetTextExtent(item->GetAccelString(), &widthAccel, NULL);
|
||||
if ( widthAccel > widthAccelMax )
|
||||
{
|
||||
widthAccelMax = widthAccel;
|
||||
}
|
||||
|
||||
const wxBitmap& bmp = item->GetBitmap();
|
||||
if ( bmp.Ok() )
|
||||
{
|
||||
wxCoord widthBmp = bmp.GetWidth();
|
||||
if ( widthBmp > widthBmpMax )
|
||||
widthBmpMax = widthBmp;
|
||||
}
|
||||
//else if ( item->IsCheckable() ): no need to check for this as
|
||||
// MENU_LEFT_MARGIN is big enough to show the check mark
|
||||
}
|
||||
|
||||
h += 2*MENU_VERT_MARGIN;
|
||||
|
||||
// remember the item position and height
|
||||
item->SetGeometry(height, h);
|
||||
|
||||
height += h;
|
||||
}
|
||||
|
||||
// bundle the metrics into a struct and return it
|
||||
wxGTKMenuGeometryInfo *gi = new wxGTKMenuGeometryInfo;
|
||||
|
||||
gi->m_ofsLabel = widthBmpMax + 2*MENU_BMP_MARGIN;
|
||||
gi->m_ofsAccel = gi->m_ofsLabel + widthLabelMax;
|
||||
if ( widthAccelMax > 0 )
|
||||
{
|
||||
// if we actually have any accesl, add a margin
|
||||
gi->m_ofsAccel += MENU_ACCEL_MARGIN;
|
||||
}
|
||||
|
||||
gi->m_heightItem = heightText + 2*MENU_VERT_MARGIN;
|
||||
|
||||
gi->m_size.x = gi->m_ofsAccel + widthAccelMax + MENU_RIGHT_MARGIN;
|
||||
gi->m_size.y = height;
|
||||
|
||||
return gi;
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
|
@@ -3979,7 +3979,8 @@ bool wxWin32InputHandler::HandleMouse(wxInputConsumer *control,
|
||||
{
|
||||
wxWindow *win = control->GetInputWindow();
|
||||
|
||||
if ( wxWindow::FindFocus() != control->GetInputWindow() )
|
||||
if (( wxWindow::FindFocus() != control->GetInputWindow() ) &&
|
||||
( win->AcceptsFocus() ) )
|
||||
{
|
||||
win->SetFocus();
|
||||
|
||||
|
@@ -652,7 +652,7 @@ bool wxStdToolbarInputHandler::HandleMouse(wxInputConsumer *consumer,
|
||||
wxToolBar *tbar = wxStaticCast(consumer->GetInputWindow(), wxToolBar);
|
||||
wxToolBarToolBase *tool = tbar->FindToolForPosition(event.GetX(), event.GetY());
|
||||
|
||||
if ( tool && !tool->IsEnabled() )
|
||||
if ( !tool || !tool->IsEnabled() )
|
||||
return TRUE;
|
||||
|
||||
return wxStdButtonInputHandler::HandleMouse(consumer, event);
|
||||
|
422
src/unix/net.cpp
@@ -1,422 +0,0 @@
|
||||
// -*- c++ -*- ///////////////////////////////////////////////////////////////
|
||||
// Name: unix/net.cpp
|
||||
// Purpose: Network related wxWindows classes and functions
|
||||
// Author: Karsten Ball<6C>der
|
||||
// Modified by:
|
||||
// Created: 03.10.99
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) Karsten Ball<6C>der
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#include "wx/setup.h"
|
||||
|
||||
#if wxUSE_DIALUP_MANAGER
|
||||
|
||||
#ifndef WX_PRECOMP
|
||||
# include "wx/defs.h"
|
||||
#endif // !PCH
|
||||
|
||||
#include "wx/string.h"
|
||||
#include "wx/event.h"
|
||||
#include "wx/net.h"
|
||||
#include "wx/timer.h"
|
||||
#include "wx/filefn.h"
|
||||
#include "wx/utils.h"
|
||||
#include "wx/log.h"
|
||||
#include "wx/file.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <signal.h>
|
||||
#include <fcntl.h>
|
||||
#include <unistd.h>
|
||||
#define __STRICT_ANSI__
|
||||
#include <sys/socket.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <netdb.h>
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// A class which groups functions dealing with connecting to the network from a
|
||||
// workstation using dial-up access to the net. There is at most one instance
|
||||
// of this class in the program accessed via GetDialUpManager().
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
/* TODO
|
||||
*
|
||||
* 1. more configurability for Unix: i.e. how to initiate the connection, how
|
||||
* to check for online status, &c.
|
||||
* 2. add a "long Dial(long connectionId = -1)" function which asks the user
|
||||
* about which connection to dial (this may be done using native dialogs
|
||||
* under NT, need generic dialogs for all others) and returns the identifier
|
||||
* of the selected connection (it's opaque to the application) - it may be
|
||||
* reused later to dial the same connection later (or use strings instead of
|
||||
* longs may be?)
|
||||
* 3. add an async version of dialing functions which notify the caller about
|
||||
* the progress (or may be even start another thread to monitor it)
|
||||
* 4. the static creation/accessor functions are not MT-safe - but is this
|
||||
* really crucial? I think we may suppose they're always called from the
|
||||
* main thread?
|
||||
*/
|
||||
|
||||
class WXDLLEXPORT wxDialUpManagerImpl : public wxDialUpManager
|
||||
{
|
||||
public:
|
||||
wxDialUpManagerImpl()
|
||||
{
|
||||
m_IsOnline = -1; // unknown
|
||||
m_timer = NULL;
|
||||
m_CanUseIfconfig = -1; // unknown
|
||||
m_BeaconHost = WXDIALUP_MANAGER_DEFAULT_BEACONHOST;
|
||||
m_BeaconPort = 80;
|
||||
}
|
||||
|
||||
/** Could the dialup manager be initialized correctly? If this function
|
||||
returns FALSE, no other functions will work neither, so it's a good idea
|
||||
to call this function and check its result before calling any other
|
||||
wxDialUpManager methods.
|
||||
*/
|
||||
virtual bool IsOk() const
|
||||
{ return TRUE; }
|
||||
|
||||
/** The simplest way to initiate a dial up: this function dials the given
|
||||
ISP (exact meaning of the parameter depends on the platform), returns
|
||||
TRUE on success or FALSE on failure and logs the appropriate error
|
||||
message in the latter case.
|
||||
@param nameOfISP optional paramater for dial program
|
||||
@param username unused
|
||||
@param password unused
|
||||
*/
|
||||
virtual bool Dial(const wxString& nameOfISP,
|
||||
const wxString& WXUNUSED(username),
|
||||
const wxString& WXUNUSED(password));
|
||||
|
||||
/// Hang up the currently active dial up connection.
|
||||
virtual bool HangUp();
|
||||
|
||||
// returns TRUE if the computer is connected to the network: under Windows,
|
||||
// this just means that a RAS connection exists, under Unix we check that
|
||||
// the "well-known host" (as specified by SetWellKnownHost) is reachable
|
||||
virtual bool IsOnline() const
|
||||
{
|
||||
if( (! m_timer) // we are not polling, so test now:
|
||||
|| m_IsOnline == -1
|
||||
)
|
||||
CheckStatus();
|
||||
return m_IsOnline != 0;
|
||||
}
|
||||
|
||||
// sometimes the built-in logic for determining the online status may fail,
|
||||
// so, in general, the user should be allowed to override it. This function
|
||||
// allows to forcefully set the online status - whatever our internal
|
||||
// algorithm may think about it.
|
||||
virtual void SetOnlineStatus(bool isOnline = TRUE)
|
||||
{ m_IsOnline = isOnline; }
|
||||
|
||||
// set misc wxDialUpManager options
|
||||
// --------------------------------
|
||||
|
||||
// enable automatical checks for the connection status and sending of
|
||||
// wxEVT_DIALUP_CONNECTED/wxEVT_DIALUP_DISCONNECTED events. The interval
|
||||
// parameter is only for Unix where we do the check manually: under
|
||||
// Windows, the notification about the change of connection status is
|
||||
// instantenous.
|
||||
//
|
||||
// Returns FALSE if couldn't set up automatic check for online status.
|
||||
virtual bool EnableAutoCheckOnlineStatus(size_t nSeconds);
|
||||
|
||||
// disable automatic check for connection status change - notice that the
|
||||
// wxEVT_DIALUP_XXX events won't be sent any more neither.
|
||||
virtual void DisableAutoCheckOnlineStatus();
|
||||
|
||||
// under Unix, the value of well-known host is used to check whether we're
|
||||
// connected to the internet. It's unused under Windows, but this function
|
||||
// is always safe to call. The default value is www.yahoo.com.
|
||||
virtual void SetWellKnownHost(const wxString& hostname,
|
||||
int portno = 80);
|
||||
/** Sets the commands to start up the network and to hang up
|
||||
again. Used by the Unix implementations only.
|
||||
*/
|
||||
virtual void SetConnectCommand(const wxString &command, const wxString &hupcmd)
|
||||
{ m_ConnectCommand = command; m_HangUpCommand = hupcmd; }
|
||||
|
||||
private:
|
||||
/// -1: don<6F>t know, 0 = no, 1 = yes
|
||||
int m_IsOnline;
|
||||
|
||||
/// Can we use ifconfig to list active devices?
|
||||
int m_CanUseIfconfig;
|
||||
/// The path to ifconfig
|
||||
wxString m_IfconfigPath;
|
||||
|
||||
/// beacon host:
|
||||
wxString m_BeaconHost;
|
||||
/// beacon host portnumber for connect:
|
||||
int m_BeaconPort;
|
||||
|
||||
/// command to connect to network
|
||||
wxString m_ConnectCommand;
|
||||
/// command to hang up
|
||||
wxString m_HangUpCommand;
|
||||
/// name of ISP
|
||||
wxString m_ISPname;
|
||||
/// a timer for regular testing
|
||||
class AutoCheckTimer *m_timer;
|
||||
|
||||
friend class AutoCheckTimer;
|
||||
/// determine status
|
||||
void CheckStatus(void) const;
|
||||
|
||||
/// real status check
|
||||
void CheckStatusInternal(void);
|
||||
};
|
||||
|
||||
|
||||
class AutoCheckTimer : public wxTimer
|
||||
{
|
||||
public:
|
||||
AutoCheckTimer(wxDialUpManagerImpl *dupman)
|
||||
{
|
||||
m_dupman = dupman;
|
||||
m_started = FALSE;
|
||||
}
|
||||
|
||||
virtual bool Start( int millisecs = -1 )
|
||||
{ m_started = TRUE; return wxTimer::Start(millisecs, FALSE); }
|
||||
|
||||
virtual void Notify()
|
||||
{ wxLogTrace("Checking dial up network status."); m_dupman->CheckStatus(); }
|
||||
|
||||
virtual void Stop()
|
||||
{ if ( m_started ) wxTimer::Stop(); }
|
||||
public:
|
||||
bool m_started;
|
||||
wxDialUpManagerImpl *m_dupman;
|
||||
};
|
||||
|
||||
bool
|
||||
wxDialUpManagerImpl::Dial(const wxString &isp,
|
||||
const wxString & WXUNUSED(username),
|
||||
const wxString & WXUNUSED(password))
|
||||
{
|
||||
if(m_IsOnline == 1)
|
||||
return FALSE;
|
||||
m_IsOnline = -1;
|
||||
m_ISPname = isp;
|
||||
wxString cmd;
|
||||
if(m_ConnectCommand.Find("%s"))
|
||||
cmd.Printf(m_ConnectCommand,m_ISPname.c_str());
|
||||
else
|
||||
cmd = m_ConnectCommand;
|
||||
return wxExecute(cmd, /* sync */ TRUE) == 0;
|
||||
}
|
||||
|
||||
bool
|
||||
wxDialUpManagerImpl::HangUp(void)
|
||||
{
|
||||
if(m_IsOnline == 0)
|
||||
return FALSE;
|
||||
m_IsOnline = -1;
|
||||
wxString cmd;
|
||||
if(m_HangUpCommand.Find("%s"))
|
||||
cmd.Printf(m_HangUpCommand,m_ISPname.c_str());
|
||||
else
|
||||
cmd = m_HangUpCommand;
|
||||
return wxExecute(cmd, /* sync */ TRUE) == 0;
|
||||
}
|
||||
|
||||
|
||||
bool
|
||||
wxDialUpManagerImpl::EnableAutoCheckOnlineStatus(size_t nSeconds)
|
||||
{
|
||||
wxASSERT(m_timer == NULL);
|
||||
m_timer = new AutoCheckTimer(this);
|
||||
bool rc = m_timer->Start(nSeconds*1000);
|
||||
if(! rc)
|
||||
{
|
||||
delete m_timer;
|
||||
m_timer = NULL;
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
|
||||
void
|
||||
wxDialUpManagerImpl::DisableAutoCheckOnlineStatus()
|
||||
{
|
||||
wxASSERT(m_timer != NULL);
|
||||
m_timer->Stop();
|
||||
delete m_timer;
|
||||
m_timer = NULL;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
wxDialUpManagerImpl::SetWellKnownHost(const wxString& hostname, int portno)
|
||||
{
|
||||
/// does hostname contain a port number?
|
||||
wxString port = hostname.After(':');
|
||||
if(port.Length())
|
||||
{
|
||||
m_BeaconHost = hostname.Before(':');
|
||||
m_BeaconPort = atoi(port);
|
||||
}
|
||||
else
|
||||
{
|
||||
m_BeaconHost = hostname;
|
||||
m_BeaconPort = portno;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
wxDialUpManagerImpl::CheckStatus(void) const
|
||||
{
|
||||
// This function calls the CheckStatusInternal() helper function
|
||||
// which is OS - specific and then sends the events.
|
||||
|
||||
int oldIsOnline = m_IsOnline;
|
||||
( /* non-const */ (wxDialUpManagerImpl *)this)->CheckStatusInternal();
|
||||
|
||||
// now send the events as appropriate:
|
||||
if(m_IsOnline != oldIsOnline)
|
||||
{
|
||||
if(m_IsOnline)
|
||||
; // send ev
|
||||
else
|
||||
; // send ev
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
We have three methods that we can use:
|
||||
|
||||
1. test via /sbin/ifconfig and grep for "sl", "ppp", "pl"
|
||||
--> should be fast enough for regular polling
|
||||
2. test if we can reach the well known beacon host
|
||||
--> too slow for polling
|
||||
3. check /proc/net/dev on linux??
|
||||
This method should be preferred, if possible. Need to do more
|
||||
testing.
|
||||
|
||||
*/
|
||||
|
||||
void
|
||||
wxDialUpManagerImpl::CheckStatusInternal(void)
|
||||
{
|
||||
m_IsOnline = -1;
|
||||
|
||||
// First time check for ifconfig location. We only use the variant
|
||||
// which does not take arguments, a la GNU.
|
||||
if(m_CanUseIfconfig == -1) // unknown
|
||||
{
|
||||
if(wxFileExists("/sbin/ifconfig"))
|
||||
m_IfconfigPath = "/sbin/ifconfig";
|
||||
else if(wxFileExists("/usr/sbin/ifconfig"))
|
||||
m_IfconfigPath = "/usr/sbin/ifconfig";
|
||||
}
|
||||
|
||||
wxLogNull ln; // suppress all error messages
|
||||
// Let<65>s try the ifconfig method first, should be fastest:
|
||||
if(m_CanUseIfconfig != 0) // unknown or yes
|
||||
{
|
||||
wxASSERT(m_IfconfigPath.length());
|
||||
|
||||
wxString tmpfile = wxGetTempFileName("_wxdialuptest");
|
||||
wxString cmd = "/bin/sh -c \'";
|
||||
cmd << m_IfconfigPath << " >" << tmpfile << '\'';
|
||||
/* I tried to add an option to wxExecute() to not close stdout,
|
||||
so we could let ifconfig write directly to the tmpfile, but
|
||||
this does not work. That should be faster, as it doesn<73>t call
|
||||
the shell first. I have no idea why. :-( (KB) */
|
||||
#if 0
|
||||
// temporarily redirect stdout/stderr:
|
||||
int
|
||||
new_stdout = dup(STDOUT_FILENO),
|
||||
new_stderr = dup(STDERR_FILENO);
|
||||
close(STDOUT_FILENO);
|
||||
close(STDERR_FILENO);
|
||||
|
||||
int
|
||||
// new stdout:
|
||||
output_fd = open(tmpfile, O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR),
|
||||
// new stderr:
|
||||
null_fd = open("/dev/null", O_CREAT, S_IRUSR|S_IWUSR);
|
||||
// verify well behaved unix behaviour:
|
||||
wxASSERT(output_fd == STDOUT_FILENO);
|
||||
wxASSERT(null_fd == STDERR_FILENO);
|
||||
int rc = wxExecute(m_IfconfigPath,TRUE /* sync */,NULL ,wxEXECUTE_DONT_CLOSE_FDS);
|
||||
close(null_fd); close(output_fd);
|
||||
// restore old stdout, stderr:
|
||||
int test;
|
||||
test = dup(new_stdout); close(new_stdout); wxASSERT(test == STDOUT_FILENO);
|
||||
test = dup(new_stderr); close(new_stderr); wxASSERT(test == STDERR_FILENO);
|
||||
if(rc == 0)
|
||||
#endif
|
||||
if(wxExecute(cmd,TRUE /* sync */) == 0)
|
||||
{
|
||||
m_CanUseIfconfig = 1;
|
||||
wxFile file;
|
||||
if( file.Open(tmpfile) )
|
||||
{
|
||||
char *output = new char [file.Length()+1];
|
||||
output[file.Length()] = '\0';
|
||||
if(file.Read(output,file.Length()) == file.Length())
|
||||
{
|
||||
if(strstr(output,"ppp") // ppp
|
||||
|| strstr(output,"sl") // slip
|
||||
|| strstr(output,"pl") // plip
|
||||
)
|
||||
m_IsOnline = 1;
|
||||
else
|
||||
m_IsOnline = 0;
|
||||
}
|
||||
file.Close();
|
||||
delete [] output;
|
||||
}
|
||||
// else m_IsOnline remains -1 as we don't know for sure
|
||||
}
|
||||
else // could not run ifconfig correctly
|
||||
m_CanUseIfconfig = 0; // don<6F>t try again
|
||||
(void) wxRemoveFile(tmpfile);
|
||||
if(m_IsOnline != -1) // we are done
|
||||
return;
|
||||
}
|
||||
|
||||
// second method: try to connect to well known host:
|
||||
// This can be used under Win 9x, too!
|
||||
struct hostent *hp;
|
||||
struct sockaddr_in serv_addr;
|
||||
int sockfd;
|
||||
|
||||
m_IsOnline = 0; // assume false
|
||||
if((hp = gethostbyname(m_BeaconHost)) == NULL)
|
||||
return; // no DNS no net
|
||||
|
||||
serv_addr.sin_family = hp->h_addrtype;
|
||||
memcpy(&serv_addr.sin_addr,hp->h_addr, hp->h_length);
|
||||
serv_addr.sin_port = htons(m_BeaconPort);
|
||||
if( ( sockfd = socket(hp->h_addrtype, SOCK_STREAM, 0)) < 0)
|
||||
{
|
||||
// sys_error("cannot create socket for gw");
|
||||
return;
|
||||
}
|
||||
if( connect(sockfd, (struct sockaddr *) &serv_addr, sizeof(serv_addr)) < 0)
|
||||
{
|
||||
//sys_error("cannot connect to server");
|
||||
return;
|
||||
}
|
||||
//connected!
|
||||
close(sockfd);
|
||||
}
|
||||
|
||||
|
||||
/* static */
|
||||
wxDialUpManager *
|
||||
wxDialUpManager::wxDialUpManager::Create(void)
|
||||
{
|
||||
return new wxDialUpManagerImpl;
|
||||
}
|
||||
|
||||
#endif // wxUSE_DIALUP_MANAGER
|
@@ -661,7 +661,6 @@ bool wxApp::ProcessXEvent(WXEvent* _event)
|
||||
g_nextFocus = win;
|
||||
|
||||
win->SetFocus();
|
||||
// return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -35,6 +35,13 @@ public:
|
||||
m_colormap = (WXColormap *) NULL;
|
||||
m_hasPixel = FALSE;
|
||||
}
|
||||
wxColourRefData(const wxColourRefData& data):
|
||||
wxObjectRefData()
|
||||
{
|
||||
m_color = data.m_color;
|
||||
m_colormap = data.m_colormap;
|
||||
m_hasPixel = data.m_hasPixel;
|
||||
}
|
||||
|
||||
~wxColourRefData()
|
||||
{
|
||||
|
@@ -838,6 +838,7 @@ void wxWindowDC::DoDrawEllipse( wxCoord x, wxCoord y, wxCoord width, wxCoord hei
|
||||
|
||||
void wxWindowDC::DoDrawIcon( const wxIcon &icon, wxCoord x, wxCoord y)
|
||||
{
|
||||
DoDrawBitmap(icon, x, y, TRUE);
|
||||
}
|
||||
|
||||
#if wxUSE_NANOX
|
||||
|
@@ -144,7 +144,14 @@ bool wxReparenter::Reparent(wxWindow* newParent, wxAdoptedWindow* toReparent)
|
||||
|
||||
if (numchildren > 0)
|
||||
{
|
||||
fprintf(stderr, "Reparenting %d children.\n", numchildren);
|
||||
// TEST: see if we can get away with reparenting just
|
||||
// first one
|
||||
if (numchildren > 1)
|
||||
{
|
||||
wxLogDebug(wxT("Found %d, but only reparenting 1 child."), numchildren);
|
||||
numchildren = 1;
|
||||
}
|
||||
wxLogDebug(wxT("Reparenting %d children."), numchildren);
|
||||
/* Stacking order is preserved since XQueryTree returns its children in
|
||||
bottommost to topmost order
|
||||
*/
|
||||
|
@@ -231,6 +231,17 @@ wxTopLevelWindowX11::~wxTopLevelWindowX11()
|
||||
|
||||
bool wxTopLevelWindowX11::Show(bool show)
|
||||
{
|
||||
// Nano-X has to force a size event,
|
||||
// else there's no initial size.
|
||||
#if wxUSE_NANOX
|
||||
if (show)
|
||||
{
|
||||
wxSizeEvent event(GetSize(), GetId());
|
||||
event.SetEventObject(this);
|
||||
GetEventHandler()->ProcessEvent(event);
|
||||
}
|
||||
#endif
|
||||
|
||||
return wxWindowX11::Show(show);
|
||||
}
|
||||
|
||||
@@ -546,39 +557,44 @@ bool wxMWMIsRunning(Window w)
|
||||
// smaller
|
||||
wxPoint wxTopLevelWindowX11::GetClientAreaOrigin() const
|
||||
{
|
||||
// In fact wxFrame::GetClientAreaOrigin
|
||||
// wxFrame::GetClientAreaOrigin
|
||||
// does the required calculation already.
|
||||
#if 0
|
||||
if (this->IsKindOf(CLASSINFO(wxFrame)))
|
||||
{
|
||||
wxFrame* frame = (wxFrame*) this;
|
||||
if (frame->GetMenuBar())
|
||||
return wxPoint(0, frame->GetMenuBar()->GetSize().y);
|
||||
}
|
||||
#endif
|
||||
return wxPoint(0, 0);
|
||||
}
|
||||
|
||||
void wxTopLevelWindowX11::DoGetClientSize( int *width, int *height ) const
|
||||
{
|
||||
XSync(wxGlobalDisplay(), False);
|
||||
wxWindowX11::DoGetClientSize(width, height);
|
||||
// Done by wxTopLevelWindow
|
||||
#if 0
|
||||
if (this->IsKindOf(CLASSINFO(wxFrame)))
|
||||
{
|
||||
wxFrame* frame = (wxFrame*) this;
|
||||
if (frame->GetMenuBar())
|
||||
(*height) -= frame->GetMenuBar()->GetSize().y;
|
||||
if (frame->GetStatusBar())
|
||||
(*height) -= frame->GetStatusBar()->GetSize().y;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void wxTopLevelWindowX11::DoSetClientSize(int width, int height)
|
||||
{
|
||||
wxWindowX11::DoSetClientSize(width, height);
|
||||
|
||||
// Set the top-level window size
|
||||
XSizeHints size_hints;
|
||||
wxSize oldSize = GetSize();
|
||||
wxSize oldClientSize = GetClientSize();
|
||||
|
||||
size_hints.flags = PSize;
|
||||
size_hints.width = width + (oldSize.x - oldClientSize.x);
|
||||
size_hints.height = height + (oldSize.y - oldClientSize.y);
|
||||
XSetWMNormalHints( (Display*) GetXDisplay(), (Window) GetMainWindow(),
|
||||
&size_hints);
|
||||
|
||||
// This seems to be necessary or resizes don't get performed
|
||||
XSync(wxGlobalDisplay(), False);
|
||||
XSync(wxGlobalDisplay(), False);
|
||||
|
||||
#if 0
|
||||
wxLogDebug("DoSetClientSize: Tried to set size to %d, %d", (int) size_hints.width, (int) size_hints.height);
|
||||
|
||||
XSync(wxGlobalDisplay(), False);
|
||||
wxSize newSize = GetSize();
|
||||
wxLogDebug("New size is %d, %d", (int) newSize.x, (int) newSize.y);
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
if (!GetMainWindow())
|
||||
return;
|
||||
@@ -603,9 +619,86 @@ void wxTopLevelWindowX11::DoSetClientSize(int width, int height)
|
||||
|
||||
void wxTopLevelWindowX11::DoSetSize(int x, int y, int width, int height, int sizeFlags)
|
||||
{
|
||||
#if 0
|
||||
// wxLogDebug( "Setting pos: %d, %d", x, y );
|
||||
wxWindowX11::DoSetSize(x, y, width, height, sizeFlags);
|
||||
#endif
|
||||
XSync(wxGlobalDisplay(), False);
|
||||
Window window = (Window) m_mainWidget;
|
||||
if (!window)
|
||||
return ;
|
||||
|
||||
Display *display = (Display*) GetXDisplay();
|
||||
Window root = RootWindowOfScreen(DefaultScreenOfDisplay(display));
|
||||
Window parent_window = window,
|
||||
next_parent = window;
|
||||
|
||||
// search for the parent that is child of ROOT, because the WM may
|
||||
// reparent twice and notify only the next parent (like FVWM)
|
||||
while (next_parent != root) {
|
||||
Window *theChildren; unsigned int n;
|
||||
parent_window = next_parent;
|
||||
XQueryTree(display, parent_window, &root,
|
||||
&next_parent, &theChildren, &n);
|
||||
XFree(theChildren); // not needed
|
||||
}
|
||||
|
||||
XWindowChanges windowChanges;
|
||||
windowChanges.x = x;
|
||||
windowChanges.y = y;
|
||||
windowChanges.width = width;
|
||||
windowChanges.height = height;
|
||||
windowChanges.stack_mode = 0;
|
||||
int valueMask = CWX | CWY | CWWidth | CWHeight;
|
||||
|
||||
if (x != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
|
||||
{
|
||||
valueMask |= CWX;
|
||||
}
|
||||
if (y != -1 || (sizeFlags & wxSIZE_ALLOW_MINUS_ONE))
|
||||
{
|
||||
valueMask |= CWY;
|
||||
}
|
||||
if (width != -1)
|
||||
{
|
||||
windowChanges.width = wxMax(1, width);
|
||||
valueMask |= CWWidth;
|
||||
}
|
||||
if (height != -1)
|
||||
{
|
||||
windowChanges.height = wxMax(1, height);
|
||||
valueMask |= CWHeight;
|
||||
}
|
||||
|
||||
XConfigureWindow( display, parent_window, valueMask, &windowChanges );
|
||||
|
||||
XSizeHints size_hints;
|
||||
size_hints.flags = 0;
|
||||
if (x > -1 && y > -1)
|
||||
size_hints.flags |= PPosition;
|
||||
if (width > -1 && height > -1)
|
||||
size_hints.flags |= PSize;
|
||||
size_hints.width = width;
|
||||
size_hints.height = height;
|
||||
size_hints.x = x;
|
||||
size_hints.y = y;
|
||||
XSetWMNormalHints( (Display*) GetXDisplay(), (Window) GetMainWindow(),
|
||||
&size_hints);
|
||||
|
||||
// This seems to be necessary or resizes don't get performed.
|
||||
// Take them out (or even just one of them), and the About
|
||||
// box of the minimal sample probably won't be resized right.
|
||||
XSync(wxGlobalDisplay(), False);
|
||||
XSync(wxGlobalDisplay(), False);
|
||||
|
||||
#if 0
|
||||
wxLogDebug("DoSetSize: Tried to set size to %d, %d", (int) size_hints.width, (int) size_hints.height);
|
||||
|
||||
XSync(wxGlobalDisplay(), False);
|
||||
wxSize newSize = GetSize();
|
||||
wxLogDebug("New size is %d, %d", (int) newSize.x, (int) newSize.y);
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
wxPoint pt = GetPosition();
|
||||
// wxLogDebug( "After, pos: %d, %d", pt.x, pt.y );
|
||||
@@ -660,6 +753,30 @@ void wxTopLevelWindowX11::DoGetPosition(int *x, int *y) const
|
||||
{
|
||||
XSync(wxGlobalDisplay(), False);
|
||||
Window window = (Window) m_mainWidget;
|
||||
if (!window)
|
||||
return ;
|
||||
|
||||
Display *display = (Display*) GetXDisplay();
|
||||
Window root = RootWindowOfScreen(DefaultScreenOfDisplay(display));
|
||||
Window parent_window = window,
|
||||
next_parent = window;
|
||||
|
||||
// search for the parent that is child of ROOT, because the WM may
|
||||
// reparent twice and notify only the next parent (like FVWM)
|
||||
while (next_parent != root) {
|
||||
Window *theChildren; unsigned int n;
|
||||
parent_window = next_parent;
|
||||
XQueryTree(display, parent_window, &root,
|
||||
&next_parent, &theChildren, &n);
|
||||
XFree(theChildren); // not needed
|
||||
}
|
||||
int xx, yy; unsigned int dummy;
|
||||
XGetGeometry(display, parent_window, &root,
|
||||
&xx, &yy, &dummy, &dummy, &dummy, &dummy);
|
||||
if (x) *x = xx;
|
||||
if (y) *y = yy;
|
||||
|
||||
#if 0
|
||||
if (window)
|
||||
{
|
||||
int offsetX = 0;
|
||||
@@ -684,4 +801,5 @@ void wxTopLevelWindowX11::DoGetPosition(int *x, int *y) const
|
||||
*y = attr.y + offsetY;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
@@ -251,7 +251,17 @@ void wxWindowX11::SetFocus()
|
||||
Window xwindow = (Window) GetMainWindow();
|
||||
|
||||
wxCHECK_RET( xwindow, wxT("invalid window") );
|
||||
|
||||
|
||||
wxCHECK_RET( AcceptsFocus(), wxT("set focus on window that doesn't accept the focus") );
|
||||
|
||||
#if 0
|
||||
if (GetName() == "scrollBar")
|
||||
{
|
||||
char *crash = NULL;
|
||||
*crash = 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (wxWindowIsVisible(xwindow))
|
||||
{
|
||||
XSetInputFocus( wxGlobalDisplay(), xwindow, RevertToParent, CurrentTime );
|
||||
@@ -636,7 +646,7 @@ void wxWindowX11::DoGetSize(int *x, int *y) const
|
||||
|
||||
wxCHECK_RET( xwindow, wxT("invalid window") );
|
||||
|
||||
// XSync(wxGlobalDisplay(), False);
|
||||
//XSync(wxGlobalDisplay(), False);
|
||||
|
||||
XWindowAttributes attr;
|
||||
Status status = XGetWindowAttributes( wxGlobalDisplay(), xwindow, &attr );
|
||||
@@ -654,7 +664,7 @@ void wxWindowX11::DoGetPosition(int *x, int *y) const
|
||||
Window window = (Window) m_mainWidget;
|
||||
if (window)
|
||||
{
|
||||
// XSync(wxGlobalDisplay(), False);
|
||||
//XSync(wxGlobalDisplay(), False);
|
||||
XWindowAttributes attr;
|
||||
Status status = XGetWindowAttributes(wxGlobalDisplay(), window, & attr);
|
||||
wxASSERT(status);
|
||||
@@ -708,7 +718,7 @@ void wxWindowX11::DoGetClientSize(int *x, int *y) const
|
||||
|
||||
if (window)
|
||||
{
|
||||
// XSync(wxGlobalDisplay(), False); // Is this really a good idea?
|
||||
//XSync(wxGlobalDisplay(), False); // Is this really a good idea?
|
||||
XWindowAttributes attr;
|
||||
Status status = XGetWindowAttributes( wxGlobalDisplay(), window, &attr );
|
||||
wxASSERT(status);
|
||||
@@ -771,6 +781,14 @@ void wxWindowX11::DoSetClientSize(int width, int height)
|
||||
|
||||
wxCHECK_RET( xwindow, wxT("invalid window") );
|
||||
|
||||
XWindowChanges windowChanges;
|
||||
windowChanges.width = width;
|
||||
windowChanges.height = height;
|
||||
windowChanges.stack_mode = 0;
|
||||
int valueMask = CWWidth | CWHeight;
|
||||
|
||||
XConfigureWindow( wxGlobalDisplay(), xwindow, valueMask, &windowChanges );
|
||||
#if 0
|
||||
XWindowAttributes attr;
|
||||
Status status = XGetWindowAttributes( wxGlobalDisplay(), xwindow, &attr );
|
||||
wxCHECK_RET( status, wxT("invalid window attributes") );
|
||||
@@ -787,6 +805,7 @@ void wxWindowX11::DoSetClientSize(int width, int height)
|
||||
new_h = height;
|
||||
|
||||
DoMoveWindow( new_x, new_y, new_w, new_h );
|
||||
#endif
|
||||
}
|
||||
|
||||
// For implementation purposes - sometimes decorations make the client area
|
||||
|
4
utils/configure
vendored
@@ -648,6 +648,8 @@ trap 'rm -fr `echo "
|
||||
hhp2cached/Makefile
|
||||
dialoged/Makefile
|
||||
dialoged/src/Makefile
|
||||
emulator/Makefile
|
||||
emulator/src/Makefile
|
||||
" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15
|
||||
EOF
|
||||
cat >> $CONFIG_STATUS <<EOF
|
||||
@@ -731,6 +733,8 @@ CONFIG_FILES=\${CONFIG_FILES-"Makefile
|
||||
hhp2cached/Makefile
|
||||
dialoged/Makefile
|
||||
dialoged/src/Makefile
|
||||
emulator/Makefile
|
||||
emulator/src/Makefile
|
||||
"}
|
||||
EOF
|
||||
cat >> $CONFIG_STATUS <<\EOF
|
||||
|
@@ -16,4 +16,6 @@ AC_OUTPUT([
|
||||
hhp2cached/Makefile
|
||||
dialoged/Makefile
|
||||
dialoged/src/Makefile
|
||||
emulator/Makefile
|
||||
emulator/src/Makefile
|
||||
])
|
||||
|
7
utils/emulator/Makefile.in
Normal file
@@ -0,0 +1,7 @@
|
||||
|
||||
all:
|
||||
cd src; $(MAKE)
|
||||
|
||||
clean:
|
||||
cd src; $(MAKE) clean
|
||||
|
95
utils/emulator/docs/readme.txt
Normal file
@@ -0,0 +1,95 @@
|
||||
wxWindows PDA/Embedded System Emulator
|
||||
======================================
|
||||
|
||||
This is a simple display emulator for embedded
|
||||
applications (wxWindows or other) that use
|
||||
an X server. The Familiar Linux distribution
|
||||
is one such environment, using Tiny-X.
|
||||
|
||||
wxEmulator uses Xnest, which is the XFree86
|
||||
X server compiled to show a virtual X desktop
|
||||
in a window. wxEmulator hijacks the Xnest
|
||||
window by reparenting its window, and shows
|
||||
this window with appropriate PDA-style decorations
|
||||
surrounding it.
|
||||
|
||||
No real emulation is done, apart from the work
|
||||
that Xnest does. You compile your apps on your
|
||||
host as usual and test them out with the emulator
|
||||
to get an idea of the constraints of the embedded
|
||||
system display. Then compile the apps for your
|
||||
target system with a suitable cross-compiler,
|
||||
or if you have the luxury of lots of space on
|
||||
your target device, compile natively on the
|
||||
target.
|
||||
|
||||
It is intended to create a tarball of the
|
||||
emulator, wxX11 and maybe some other useful
|
||||
components such as a simple window manager so that
|
||||
people can quickly start developing embedded
|
||||
GUI applications without the need for actual
|
||||
target hardware.
|
||||
|
||||
Running wxEmulator
|
||||
==================
|
||||
|
||||
Make sure Xnest is in your PATH. You can download
|
||||
a binary from the XFree86 ftp server or a mirror,
|
||||
or you can compile Xnest from source -- but this
|
||||
downloading XFree86 source in its entirety and
|
||||
compiling it. Say goodbye to half a gig of disk
|
||||
space if you take this option.
|
||||
|
||||
Then run wxEmulator:
|
||||
|
||||
% emulator &
|
||||
|
||||
or
|
||||
|
||||
% emulator mydevice.wxe &
|
||||
|
||||
to specify a configuration file. Run emulator --help
|
||||
to show what options are available, such as --use-display
|
||||
for specifying a display other than :100.
|
||||
|
||||
After a brief flicker in which wxEmulator steals
|
||||
Xnest's window, you should see an emulated iPAQ with
|
||||
a checked screen that indicates raw X with nothing else
|
||||
running.
|
||||
|
||||
Running any X applications with the Xnest display
|
||||
number (currently 100) will show those applications
|
||||
in the emulator window instead of the normal desktop.
|
||||
|
||||
For example:
|
||||
|
||||
% xeyes -display :100 &
|
||||
|
||||
Before running any other programs, run a window
|
||||
manager such as twm:
|
||||
|
||||
% twm -display :100 &
|
||||
|
||||
If the X program or WM you want to run doesn't support the
|
||||
-display argument, try exporting the DISPLAY variable
|
||||
before running it. E.g.:
|
||||
|
||||
% export DISPLAY=:100
|
||||
% xterm &
|
||||
|
||||
For details on the configuration file format, please
|
||||
see default.wxe. Eventually it will support
|
||||
device buttons.
|
||||
|
||||
Compiling wxEmulator
|
||||
====================
|
||||
|
||||
You need to use wxX11 -- no other port is supported.
|
||||
Configure and make wxX11 in the usual way (see docs/x11/install.txt
|
||||
at the wxWindows top level), then compile wxEmulator
|
||||
using the makefile that configure created.
|
||||
|
||||
Have fun!
|
||||
|
||||
Julian Smart, March 2002
|
||||
|
BIN
utils/emulator/docs/screen01.jpg
Normal file
After Width: | Height: | Size: 39 KiB |
BIN
utils/emulator/docs/screen02.jpg
Normal file
After Width: | Height: | Size: 19 KiB |
23
utils/emulator/src/Makefile.in
Normal file
@@ -0,0 +1,23 @@
|
||||
#
|
||||
# File: Makefile.in
|
||||
# Author: Julian Smart
|
||||
# Created: 2002
|
||||
# Updated:
|
||||
# Copyright: (c) 2002 Julian Smart
|
||||
#
|
||||
# "%W% %G%"
|
||||
#
|
||||
# Makefile for PDA emulator
|
||||
|
||||
top_srcdir = @top_srcdir@/..
|
||||
top_builddir = ../../..
|
||||
program_dir = utils/emulator/src
|
||||
|
||||
PROGRAM=emulator
|
||||
|
||||
OBJECTS =$(PROGRAM).o
|
||||
DEPFILES=$(PROGRAM).d
|
||||
|
||||
include ../../../src/makeprog.env
|
||||
|
||||
-include $(DEPFILES)
|
BIN
utils/emulator/src/bluegradient.jpg
Normal file
After Width: | Height: | Size: 2.4 KiB |
33
utils/emulator/src/default.wxe
Normal file
@@ -0,0 +1,33 @@
|
||||
# Default emulator config file
|
||||
|
||||
[General]
|
||||
|
||||
# The title of the emulator
|
||||
title = "Default Emulator"
|
||||
|
||||
# An optional description
|
||||
description = "Basic emulator"
|
||||
|
||||
# The top-left of the virtual screen relative
|
||||
# to the background bitmap
|
||||
screenX = 10
|
||||
screenY = 10
|
||||
|
||||
# The size of the virtual screen
|
||||
screenWidth = 240
|
||||
screenHeight = 320
|
||||
|
||||
# The size of the overall device -
|
||||
# only necessary if not specifying a background
|
||||
# bitmap
|
||||
deviceWidth = 260
|
||||
deviceHeight = 340
|
||||
|
||||
# The main bitmap representing the device.
|
||||
# You can use PNG, JPG, TIFF, BMP, XPM, GIF
|
||||
backgroundBitmap = "bluegradient.jpg"
|
||||
|
||||
# Hex string for RGB background colour. You can
|
||||
# also use the name 'backgroundColor'
|
||||
backgroundColour = "008080"
|
||||
|
BIN
utils/emulator/src/emulator.bmp
Normal file
After Width: | Height: | Size: 630 B |
600
utils/emulator/src/emulator.cpp
Normal file
@@ -0,0 +1,600 @@
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Name: emulator.cpp
|
||||
// Purpose: Emulator wxWindows sample
|
||||
// Author: Julian Smart
|
||||
// Modified by:
|
||||
// Created: 04/01/98
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) Julian Smart
|
||||
// Licence: wxWindows licence
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
// ============================================================================
|
||||
// declarations
|
||||
// ============================================================================
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma implementation "emulator.h"
|
||||
#endif
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// headers
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// For compilers that support precompilation, includes "wx/wx.h".
|
||||
#include "wx/wxprec.h"
|
||||
|
||||
#ifdef __BORLANDC__
|
||||
#pragma hdrstop
|
||||
#endif
|
||||
|
||||
// for all others, include the necessary headers (this file is usually all you
|
||||
// need because it includes almost all "standard" wxWindows headers)
|
||||
#ifndef WX_PRECOMP
|
||||
#include "wx/wx.h"
|
||||
#endif
|
||||
|
||||
#include "wx/confbase.h"
|
||||
#include "wx/fileconf.h"
|
||||
#include "wx/cmdline.h"
|
||||
|
||||
#ifdef __WXX11__
|
||||
#include "wx/x11/reparent.h"
|
||||
#endif
|
||||
|
||||
#include "emulator.h"
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// resources
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// the application icon (under Windows and OS/2 it is in resources)
|
||||
#if defined(__WXGTK__) || defined(__WXMOTIF__) || defined(__WXMAC__) || defined(__WXMGL__) || defined(__WXX11__)
|
||||
#include "emulator.xpm"
|
||||
#endif
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// event tables and other macros for wxWindows
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// the event tables connect the wxWindows events with the functions (event
|
||||
// handlers) which process them. It can be also done at run-time, but for the
|
||||
// simple menu events like this the static method is much simpler.
|
||||
BEGIN_EVENT_TABLE(wxEmulatorFrame, wxFrame)
|
||||
EVT_MENU(Emulator_Quit, wxEmulatorFrame::OnQuit)
|
||||
EVT_MENU(Emulator_About, wxEmulatorFrame::OnAbout)
|
||||
EVT_CLOSE(wxEmulatorFrame::OnCloseWindow)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
// Create a new application object: this macro will allow wxWindows to create
|
||||
// the application object during program execution (it's better than using a
|
||||
// static object for many reasons) and also declares the accessor function
|
||||
// wxGetApp() which will return the reference of the right type (i.e. wxEmulatorApp and
|
||||
// not wxApp)
|
||||
IMPLEMENT_APP(wxEmulatorApp)
|
||||
|
||||
static const wxCmdLineEntryDesc sg_cmdLineDesc[] =
|
||||
{
|
||||
{ wxCMD_LINE_OPTION, "u", "use-display", "display number to use (default 100)" },
|
||||
|
||||
{ wxCMD_LINE_SWITCH, "h", "help", "displays help on the command line parameters" },
|
||||
{ wxCMD_LINE_SWITCH, "v", "version", "print version" },
|
||||
|
||||
{ wxCMD_LINE_PARAM, NULL, NULL, "config file 1", wxCMD_LINE_VAL_STRING, wxCMD_LINE_PARAM_OPTIONAL },
|
||||
|
||||
{ wxCMD_LINE_NONE }
|
||||
};
|
||||
|
||||
|
||||
// ============================================================================
|
||||
// implementation
|
||||
// ============================================================================
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// the application class
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
wxEmulatorApp::wxEmulatorApp()
|
||||
{
|
||||
m_xnestWindow = NULL;
|
||||
m_containerWindow = NULL;
|
||||
m_displayNumber = wxT("100");
|
||||
m_xnestPID = 0;
|
||||
|
||||
}
|
||||
|
||||
// 'Main program' equivalent: the program execution "starts" here
|
||||
bool wxEmulatorApp::OnInit()
|
||||
{
|
||||
wxLog::SetTimestamp(NULL);
|
||||
wxInitAllImageHandlers();
|
||||
|
||||
wxString currentDir = wxGetCwd();
|
||||
|
||||
// Use argv to get current app directory
|
||||
m_appDir = wxFindAppPath(argv[0], currentDir, wxT("WXEMUDIR"));
|
||||
|
||||
// If the development version, go up a directory.
|
||||
#ifdef __WXMSW__
|
||||
if ((m_appDir.Right(5).CmpNoCase("DEBUG") == 0) ||
|
||||
(m_appDir.Right(11).CmpNoCase("DEBUGSTABLE") == 0) ||
|
||||
(m_appDir.Right(7).CmpNoCase("RELEASE") == 0) ||
|
||||
(m_appDir.Right(13).CmpNoCase("RELEASESTABLE") == 0)
|
||||
)
|
||||
m_appDir = wxPathOnly(m_appDir);
|
||||
#endif
|
||||
|
||||
// Parse the command-line parameters and options
|
||||
wxCmdLineParser parser(sg_cmdLineDesc, argc, argv);
|
||||
int res;
|
||||
{
|
||||
wxLogNull log;
|
||||
res = parser.Parse();
|
||||
}
|
||||
if (res == -1 || res > 0 || parser.Found(wxT("h")))
|
||||
{
|
||||
#ifdef __X__
|
||||
wxLog::SetActiveTarget(new wxLogStderr);
|
||||
#endif
|
||||
parser.Usage();
|
||||
return FALSE;
|
||||
}
|
||||
if (parser.Found(wxT("v")))
|
||||
{
|
||||
#ifdef __X__
|
||||
wxLog::SetActiveTarget(new wxLogStderr);
|
||||
#endif
|
||||
wxString msg;
|
||||
msg.Printf(wxT("wxWindows PDA Emulator (c) Julian Smart, 2002 Version %.2f, %s"), wxEMULATOR_VERSION, __DATE__);
|
||||
wxLogMessage(msg);
|
||||
return FALSE;
|
||||
}
|
||||
if (parser.Found(wxT("u"), & m_displayNumber))
|
||||
{
|
||||
// Should only be number, so strip out anything before
|
||||
// and including a : character
|
||||
if (m_displayNumber.Find(wxT(':')) != -1)
|
||||
{
|
||||
m_displayNumber = m_displayNumber.AfterFirst(wxT(':'));
|
||||
}
|
||||
}
|
||||
if (parser.GetParamCount() == 0)
|
||||
{
|
||||
m_emulatorInfo.m_emulatorFilename = wxT("default.wxe");
|
||||
}
|
||||
else if (parser.GetParamCount() > 0)
|
||||
{
|
||||
m_emulatorInfo.m_emulatorFilename = parser.GetParam(0);
|
||||
}
|
||||
|
||||
// Load the emulation info
|
||||
if (!LoadEmulator(m_appDir))
|
||||
{
|
||||
//wxMessageBox(wxT("Sorry, could not load this emulator. Please check bitmaps are valid."));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
// create the main application window
|
||||
wxEmulatorFrame *frame = new wxEmulatorFrame(_T("wxEmulator"),
|
||||
wxPoint(50, 50), wxSize(450, 340));
|
||||
|
||||
frame->SetStatusText(m_emulatorInfo.m_emulatorTitle, 0);
|
||||
|
||||
wxString sizeStr;
|
||||
sizeStr.Printf(wxT("Screen: %dx%d"), (int) m_emulatorInfo.m_emulatorScreenSize.x,
|
||||
(int) m_emulatorInfo.m_emulatorScreenSize.y);
|
||||
frame->SetStatusText(sizeStr, 1);
|
||||
|
||||
m_containerWindow = new wxEmulatorContainer(frame, -1);
|
||||
|
||||
frame->SetClientSize(m_emulatorInfo.m_emulatorDeviceSize.x,
|
||||
m_emulatorInfo.m_emulatorDeviceSize.y);
|
||||
|
||||
// and show it (the frames, unlike simple controls, are not shown when
|
||||
// created initially)
|
||||
frame->Show(TRUE);
|
||||
|
||||
#ifdef __WXX11__
|
||||
m_xnestWindow = new wxAdoptedWindow;
|
||||
|
||||
wxString cmd;
|
||||
cmd.Printf(wxT("Xnest :%s -geometry %dx%d"),
|
||||
m_displayNumber.c_str(),
|
||||
(int) m_emulatorInfo.m_emulatorScreenSize.x,
|
||||
(int) m_emulatorInfo.m_emulatorScreenSize.y);
|
||||
|
||||
// Asynchronously executes Xnest
|
||||
m_xnestPID = wxExecute(cmd);
|
||||
if (0 == m_xnestPID)
|
||||
{
|
||||
frame->Destroy();
|
||||
wxMessageBox(wxT("Sorry, could not run Xnest. Please check your PATH."));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
wxReparenter reparenter;
|
||||
if (!reparenter.WaitAndReparent(m_containerWindow, m_xnestWindow, wxT("Xnest")))
|
||||
{
|
||||
wxMessageBox(wxT("Sorry, could not reparent Xnest.."));
|
||||
frame->Destroy();
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
#endif
|
||||
m_containerWindow->DoResize();
|
||||
|
||||
// success: wxApp::OnRun() will be called which will enter the main message
|
||||
// loop and the application will run. If we returned FALSE here, the
|
||||
// application would exit immediately.
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// Prepend the current program directory to the name
|
||||
wxString wxEmulatorApp::GetFullAppPath(const wxString& filename) const
|
||||
{
|
||||
wxString path(m_appDir);
|
||||
if (path.Last() != '\\' && path.Last() != '/' && filename[0] != '\\' && filename[0] != '/')
|
||||
#ifdef __X__
|
||||
path += '/';
|
||||
#else
|
||||
path += '\\';
|
||||
#endif
|
||||
path += filename;
|
||||
|
||||
return path;
|
||||
}
|
||||
|
||||
|
||||
// Load the specified emulator.
|
||||
// For now, hard-wired. TODO: make this configurable
|
||||
bool wxEmulatorApp::LoadEmulator(const wxString& appDir)
|
||||
{
|
||||
// Load config file and bitmaps
|
||||
return m_emulatorInfo.Load(appDir);
|
||||
}
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// main frame
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// frame constructor
|
||||
wxEmulatorFrame::wxEmulatorFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
|
||||
: wxFrame(NULL, -1, title, pos, size)
|
||||
{
|
||||
// set the frame icon
|
||||
SetIcon(wxICON(emulator));
|
||||
|
||||
#if wxUSE_MENUS
|
||||
// create a menu bar
|
||||
wxMenu *menuFile = new wxMenu;
|
||||
|
||||
// the "About" item should be in the help menu
|
||||
wxMenu *helpMenu = new wxMenu;
|
||||
helpMenu->Append(Emulator_About, _T("&About...\tF1"), _T("Show about dialog"));
|
||||
|
||||
menuFile->Append(Emulator_Quit, _T("E&xit\tAlt-X"), _T("Quit this program"));
|
||||
|
||||
// now append the freshly created menu to the menu bar...
|
||||
wxMenuBar *menuBar = new wxMenuBar();
|
||||
menuBar->Append(menuFile, _T("&File"));
|
||||
menuBar->Append(helpMenu, _T("&Help"));
|
||||
|
||||
// ... and attach this menu bar to the frame
|
||||
SetMenuBar(menuBar);
|
||||
#endif // wxUSE_MENUS
|
||||
|
||||
#if wxUSE_STATUSBAR
|
||||
// create a status bar just for fun (by default with 1 pane only)
|
||||
CreateStatusBar(2);
|
||||
#endif // wxUSE_STATUSBAR
|
||||
}
|
||||
|
||||
|
||||
// event handlers
|
||||
|
||||
void wxEmulatorFrame::OnQuit(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
// TRUE is to force the frame to close
|
||||
Close(TRUE);
|
||||
}
|
||||
|
||||
void wxEmulatorFrame::OnAbout(wxCommandEvent& WXUNUSED(event))
|
||||
{
|
||||
wxString msg;
|
||||
msg.Printf( _T("wxEmulator is an environment for testing embedded X11 apps.\n"));
|
||||
|
||||
wxMessageBox(msg, _T("About wxEmulator"), wxOK | wxICON_INFORMATION, this);
|
||||
}
|
||||
|
||||
void wxEmulatorFrame::OnCloseWindow(wxCloseEvent& event)
|
||||
{
|
||||
#ifdef __WXX11__
|
||||
if (wxGetApp().m_xnestWindow)
|
||||
{
|
||||
wxGetApp().m_xnestWindow->SetHandle((WXWindow) NULL);
|
||||
}
|
||||
#endif
|
||||
this->Destroy();
|
||||
if (wxGetApp().m_xnestPID > 0)
|
||||
{
|
||||
wxKill(wxGetApp().m_xnestPID);
|
||||
wxGetApp().m_xnestPID = 0;
|
||||
}
|
||||
}
|
||||
|
||||
IMPLEMENT_CLASS(wxEmulatorContainer, wxWindow)
|
||||
|
||||
BEGIN_EVENT_TABLE(wxEmulatorContainer, wxWindow)
|
||||
EVT_SIZE(wxEmulatorContainer::OnSize)
|
||||
EVT_PAINT(wxEmulatorContainer::OnPaint)
|
||||
EVT_ERASE_BACKGROUND(wxEmulatorContainer::OnEraseBackground)
|
||||
END_EVENT_TABLE()
|
||||
|
||||
wxEmulatorContainer::wxEmulatorContainer(wxWindow* parent, wxWindowID id):
|
||||
wxWindow(parent, id, wxDefaultPosition, wxDefaultSize)
|
||||
{
|
||||
}
|
||||
|
||||
void wxEmulatorContainer::OnSize(wxSizeEvent& event)
|
||||
{
|
||||
DoResize();
|
||||
}
|
||||
|
||||
void wxEmulatorContainer::DoResize()
|
||||
{
|
||||
wxSize sz = GetClientSize();
|
||||
if (wxGetApp().m_xnestWindow
|
||||
#ifdef __WXX11__
|
||||
&& wxGetApp().m_xnestWindow->GetMainWindow()
|
||||
#endif
|
||||
)
|
||||
{
|
||||
int deviceWidth = wxGetApp().m_emulatorInfo.m_emulatorDeviceSize.x;
|
||||
int deviceHeight = wxGetApp().m_emulatorInfo.m_emulatorDeviceSize.y;
|
||||
|
||||
int x = wxMax(0, (int) ((sz.x - deviceWidth)/2.0));
|
||||
int y = wxMax(0, (int) ((sz.y - deviceHeight)/2.0));
|
||||
|
||||
x += wxGetApp().m_emulatorInfo.m_emulatorScreenPosition.x;
|
||||
y += wxGetApp().m_emulatorInfo.m_emulatorScreenPosition.y;
|
||||
|
||||
wxGetApp().m_xnestWindow->Move(x, y);
|
||||
}
|
||||
Refresh();
|
||||
}
|
||||
|
||||
void wxEmulatorContainer::OnPaint(wxPaintEvent& event)
|
||||
{
|
||||
wxPaintDC dc(this);
|
||||
|
||||
wxSize sz = GetClientSize();
|
||||
if (wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap.Ok())
|
||||
{
|
||||
int deviceWidth = wxGetApp().m_emulatorInfo.m_emulatorDeviceSize.x;
|
||||
int deviceHeight = wxGetApp().m_emulatorInfo.m_emulatorDeviceSize.y;
|
||||
|
||||
int x = wxMax(0, (int) ((sz.x - deviceWidth)/2.0));
|
||||
int y = wxMax(0, (int) ((sz.y - deviceHeight)/2.0));
|
||||
|
||||
dc.DrawBitmap(wxGetApp().m_emulatorInfo.m_emulatorBackgroundBitmap, x, y);
|
||||
}
|
||||
}
|
||||
|
||||
void wxEmulatorContainer::OnEraseBackground(wxEraseEvent& event)
|
||||
{
|
||||
wxDC* dc = NULL;
|
||||
|
||||
if (event.GetDC())
|
||||
{
|
||||
dc = event.GetDC();
|
||||
}
|
||||
else
|
||||
{
|
||||
dc = new wxClientDC(this);
|
||||
}
|
||||
|
||||
dc->SetBackground(wxBrush(wxGetApp().m_emulatorInfo.m_emulatorBackgroundColour, wxSOLID));
|
||||
dc->Clear();
|
||||
|
||||
if (!event.GetDC())
|
||||
delete dc;
|
||||
}
|
||||
|
||||
// Information about the emulator decorations
|
||||
|
||||
void wxEmulatorInfo::Copy(const wxEmulatorInfo& info)
|
||||
{
|
||||
m_emulatorFilename = info.m_emulatorFilename;
|
||||
m_emulatorTitle = info.m_emulatorTitle;
|
||||
m_emulatorDescription = info.m_emulatorDescription;
|
||||
m_emulatorScreenPosition = info.m_emulatorScreenPosition;
|
||||
m_emulatorScreenSize = info.m_emulatorScreenSize;
|
||||
m_emulatorBackgroundBitmap = info.m_emulatorBackgroundBitmap;
|
||||
m_emulatorBackgroundBitmapName = info.m_emulatorBackgroundBitmapName;
|
||||
m_emulatorBackgroundColour = info.m_emulatorBackgroundColour;
|
||||
m_emulatorDeviceSize = info.m_emulatorDeviceSize;
|
||||
}
|
||||
|
||||
// Initialisation
|
||||
void wxEmulatorInfo::Init()
|
||||
{
|
||||
m_emulatorDeviceSize = wxSize(260, 340);
|
||||
m_emulatorScreenSize = wxSize(240, 320);
|
||||
}
|
||||
|
||||
// Loads bitmaps
|
||||
bool wxEmulatorInfo::Load(const wxString& appDir)
|
||||
{
|
||||
// Try to find absolute path
|
||||
wxString absoluteConfigPath = m_emulatorFilename;
|
||||
if (!wxIsAbsolutePath(absoluteConfigPath))
|
||||
{
|
||||
wxString currDir = wxGetCwd();
|
||||
absoluteConfigPath = currDir + wxString(wxFILE_SEP_PATH) + m_emulatorFilename;
|
||||
if (!wxFileExists(absoluteConfigPath))
|
||||
{
|
||||
absoluteConfigPath = appDir + wxString(wxFILE_SEP_PATH) + m_emulatorFilename;
|
||||
}
|
||||
}
|
||||
if (!wxFileExists(absoluteConfigPath))
|
||||
{
|
||||
wxString str;
|
||||
str.Printf(wxT("Could not find config file %s"), absoluteConfigPath.c_str()),
|
||||
wxMessageBox(str);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
wxString rootPath = wxPathOnly(absoluteConfigPath);
|
||||
|
||||
{
|
||||
wxFileConfig config(wxT("wxEmulator"), wxT("wxWindows"),
|
||||
absoluteConfigPath, wxEmptyString, wxCONFIG_USE_LOCAL_FILE);
|
||||
|
||||
config.Read(wxT("/General/title"), & m_emulatorTitle);
|
||||
config.Read(wxT("/General/description"), & m_emulatorDescription);
|
||||
config.Read(wxT("/General/backgroundBitmap"), & m_emulatorBackgroundBitmapName);
|
||||
|
||||
wxString colString;
|
||||
if (config.Read(wxT("/General/backgroundColour"), & colString) ||
|
||||
config.Read(wxT("/General/backgroundColor"), & colString)
|
||||
)
|
||||
{
|
||||
m_emulatorBackgroundColour = wxHexStringToColour(colString);
|
||||
}
|
||||
|
||||
int x = 0, y = 0, w = 0, h = 0, dw = 0, dh = 0;
|
||||
config.Read(wxT("/General/screenX"), & x);
|
||||
config.Read(wxT("/General/screenY"), & y);
|
||||
config.Read(wxT("/General/screenWidth"), & w);
|
||||
config.Read(wxT("/General/screenHeight"), & h);
|
||||
if (config.Read(wxT("/General/deviceWidth"), & dw) && config.Read(wxT("/General/deviceHeight"), & dh))
|
||||
{
|
||||
m_emulatorDeviceSize = wxSize(dw, dh);
|
||||
}
|
||||
|
||||
m_emulatorScreenPosition = wxPoint(x, y);
|
||||
m_emulatorScreenSize = wxSize(w, h);
|
||||
}
|
||||
|
||||
if (!m_emulatorBackgroundBitmapName.IsEmpty())
|
||||
{
|
||||
wxString absoluteBackgroundBitmapName = rootPath + wxString(wxFILE_SEP_PATH) + m_emulatorBackgroundBitmapName;
|
||||
if (!wxFileExists(absoluteBackgroundBitmapName))
|
||||
{
|
||||
wxString str;
|
||||
str.Printf(wxT("Could not find bitmap %s"), absoluteBackgroundBitmapName.c_str()),
|
||||
wxMessageBox(str);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
int type = wxDetermineImageType(m_emulatorBackgroundBitmapName);
|
||||
if (type == -1)
|
||||
return FALSE;
|
||||
|
||||
if (!m_emulatorBackgroundBitmap.LoadFile(m_emulatorBackgroundBitmapName, type))
|
||||
{
|
||||
wxString str;
|
||||
str.Printf(wxT("Could not load bitmap file %s"), m_emulatorBackgroundBitmapName.c_str()),
|
||||
wxMessageBox(str);
|
||||
return FALSE;
|
||||
}
|
||||
m_emulatorDeviceSize = wxSize(m_emulatorBackgroundBitmap.GetWidth(),
|
||||
m_emulatorBackgroundBitmap.GetHeight());
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
// Returns the image type, or -1, determined from the extension.
|
||||
int wxDetermineImageType(const wxString& filename)
|
||||
{
|
||||
wxString path, name, ext;
|
||||
|
||||
wxSplitPath(filename, & path, & name, & ext);
|
||||
|
||||
ext.MakeLower();
|
||||
if (ext == "jpg" || ext == "jpeg")
|
||||
return wxBITMAP_TYPE_JPEG;
|
||||
else if (ext == "gif")
|
||||
return wxBITMAP_TYPE_GIF;
|
||||
else if (ext == "bmp")
|
||||
return wxBITMAP_TYPE_BMP;
|
||||
else if (ext == "png")
|
||||
return wxBITMAP_TYPE_PNG;
|
||||
else if (ext == "pcx")
|
||||
return wxBITMAP_TYPE_PCX;
|
||||
else if (ext == "tif" || ext == "tiff")
|
||||
return wxBITMAP_TYPE_TIF;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
// Convert a colour to a 6-digit hex string
|
||||
wxString wxColourToHexString(const wxColour& col)
|
||||
{
|
||||
wxString hex;
|
||||
|
||||
hex += wxDecToHex(col.Red());
|
||||
hex += wxDecToHex(col.Green());
|
||||
hex += wxDecToHex(col.Blue());
|
||||
|
||||
return hex;
|
||||
}
|
||||
|
||||
// Convert 6-digit hex string to a colour
|
||||
wxColour wxHexStringToColour(const wxString& hex)
|
||||
{
|
||||
unsigned int r = 0;
|
||||
unsigned int g = 0;
|
||||
unsigned int b = 0;
|
||||
r = wxHexToDec(hex.Mid(0, 2));
|
||||
g = wxHexToDec(hex.Mid(2, 2));
|
||||
b = wxHexToDec(hex.Mid(4, 2));
|
||||
|
||||
return wxColour(r, g, b);
|
||||
}
|
||||
|
||||
// Find the absolute path where this application has been run from.
|
||||
// argv0 is wxTheApp->argv[0]
|
||||
// cwd is the current working directory (at startup)
|
||||
// appVariableName is the name of a variable containing the directory for this app, e.g.
|
||||
// MYAPPDIR. This is checked first.
|
||||
|
||||
wxString wxFindAppPath(const wxString& argv0, const wxString& cwd, const wxString& appVariableName)
|
||||
{
|
||||
wxString str;
|
||||
|
||||
// Try appVariableName
|
||||
if (!appVariableName.IsEmpty())
|
||||
{
|
||||
str = wxGetenv(appVariableName);
|
||||
if (!str.IsEmpty())
|
||||
return str;
|
||||
}
|
||||
|
||||
if (wxIsAbsolutePath(argv0))
|
||||
return wxPathOnly(argv0);
|
||||
else
|
||||
{
|
||||
// Is it a relative path?
|
||||
wxString currentDir(cwd);
|
||||
if (currentDir.Last() != wxFILE_SEP_PATH)
|
||||
currentDir += wxFILE_SEP_PATH;
|
||||
|
||||
str = currentDir + argv0;
|
||||
if (wxFileExists(str))
|
||||
return wxPathOnly(str);
|
||||
}
|
||||
|
||||
// OK, it's neither an absolute path nor a relative path.
|
||||
// Search PATH.
|
||||
|
||||
wxPathList pathList;
|
||||
pathList.AddEnvList(wxT("PATH"));
|
||||
str = pathList.FindAbsoluteValidPath(argv0);
|
||||
if (!str.IsEmpty())
|
||||
return wxPathOnly(str);
|
||||
|
||||
// Failed
|
||||
return wxEmptyString;
|
||||
}
|
||||
|
159
utils/emulator/src/emulator.dsp
Normal file
@@ -0,0 +1,159 @@
|
||||
# Microsoft Developer Studio Project File - Name="emulator" - Package Owner=<4>
|
||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
||||
# ** DO NOT EDIT **
|
||||
|
||||
# TARGTYPE "Win32 (x86) Application" 0x0101
|
||||
|
||||
CFG=emulator - Win32 Debug
|
||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
||||
!MESSAGE use the Export Makefile command and run
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "emulator.mak".
|
||||
!MESSAGE
|
||||
!MESSAGE You can specify a configuration when running NMAKE
|
||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
||||
!MESSAGE
|
||||
!MESSAGE NMAKE /f "emulator.mak" CFG="emulator - Win32 Debug"
|
||||
!MESSAGE
|
||||
!MESSAGE Possible choices for configuration are:
|
||||
!MESSAGE
|
||||
!MESSAGE "emulator - Win32 Release DLL" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "emulator - Win32 Debug DLL" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "emulator - Win32 Release" (based on "Win32 (x86) Application")
|
||||
!MESSAGE "emulator - Win32 Debug" (based on "Win32 (x86) Application")
|
||||
!MESSAGE
|
||||
|
||||
# Begin Project
|
||||
# PROP AllowPerConfigDependencies 0
|
||||
# PROP Scc_ProjName ""
|
||||
# PROP Scc_LocalPath ""
|
||||
CPP=cl.exe
|
||||
MTL=midl.exe
|
||||
RSC=rc.exe
|
||||
|
||||
!IF "$(CFG)" == "emulator - Win32 Release DLL"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "ReleaseDll"
|
||||
# PROP BASE Intermediate_Dir "ReleaseDll"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "ReleaseDll"
|
||||
# PROP Intermediate_Dir "ReleaseDll"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W4 /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W4 /O2 /I "../../../include" /I "..\..\lib\mswdll" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /D "WXUSINGDLL" /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
|
||||
# ADD BASE RSC /l 0x409 /i "../../../include" /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /i "../../../include" /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib /nologo /subsystem:windows /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib ..\..\lib\wxmsw233.lib /nologo /subsystem:windows /machine:I386
|
||||
|
||||
!ELSEIF "$(CFG)" == "emulator - Win32 Debug DLL"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "DebugDll"
|
||||
# PROP BASE Intermediate_Dir "DebugDll"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "DebugDll"
|
||||
# PROP Intermediate_Dir "DebugDll"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W4 /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /YX /FD /c
|
||||
# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../../../include" /I "..\..\lib\mswdlld" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /D "__WXDEBUG__" /D WXDEBUG=1 /D "WXUSINGDLL" /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
|
||||
# ADD BASE RSC /l 0x409 /i "../../../include" /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /i "../../../include" /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib ..\..\lib\wxmsw233d.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
|
||||
|
||||
!ELSEIF "$(CFG)" == "emulator - Win32 Release"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 0
|
||||
# PROP BASE Output_Dir "Release"
|
||||
# PROP BASE Intermediate_Dir "Release"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 0
|
||||
# PROP Output_Dir "Release"
|
||||
# PROP Intermediate_Dir "Release"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W4 /O2 /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /YX /FD /c
|
||||
# ADD CPP /nologo /MD /W4 /O2 /I "../../../include" /I "..\..\..\lib\msw" /D "NDEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
|
||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o "NUL" /win32
|
||||
# ADD BASE RSC /l 0x409 /i "../../../include" /d "NDEBUG"
|
||||
# ADD RSC /l 0x409 /i "../../../include" /d "NDEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib /nologo /subsystem:windows /machine:I386
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib ..\..\..\lib\zlib.lib ..\..\..\lib\regex.lib ..\..\..\lib\png.lib ..\..\..\lib\jpeg.lib ..\..\..\lib\tiff.lib ..\..\..\lib\wxmsw.lib /nologo /subsystem:windows /machine:I386
|
||||
|
||||
!ELSEIF "$(CFG)" == "emulator - Win32 Debug"
|
||||
|
||||
# PROP BASE Use_MFC 0
|
||||
# PROP BASE Use_Debug_Libraries 1
|
||||
# PROP BASE Output_Dir "Debug"
|
||||
# PROP BASE Intermediate_Dir "Debug"
|
||||
# PROP BASE Target_Dir ""
|
||||
# PROP Use_MFC 0
|
||||
# PROP Use_Debug_Libraries 1
|
||||
# PROP Output_Dir "Debug"
|
||||
# PROP Intermediate_Dir "Debug"
|
||||
# PROP Ignore_Export_Lib 0
|
||||
# PROP Target_Dir ""
|
||||
# ADD BASE CPP /nologo /W4 /Zi /Od /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /YX /FD /c
|
||||
# ADD CPP /nologo /MDd /W4 /Zi /Od /I "../../../include" /I "..\..\..\lib\mswd" /D "_DEBUG" /D "WIN32" /D "_WINDOWS" /D WINVER=0x400 /D "_MT" /D wxUSE_GUI=1 /D "__WXDEBUG__" /D WXDEBUG=1 /YX /FD /c
|
||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
|
||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o "NUL" /win32
|
||||
# ADD BASE RSC /l 0x409 /i "../../../include" /d "_DEBUG"
|
||||
# ADD RSC /l 0x409 /i "../../../include" /d "_DEBUG"
|
||||
BSC32=bscmake.exe
|
||||
# ADD BASE BSC32 /nologo
|
||||
# ADD BSC32 /nologo
|
||||
LINK32=link.exe
|
||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
|
||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib comctl32.lib rpcrt4.lib wsock32.lib ..\..\..\lib\zlibd.lib ..\..\..\lib\regexd.lib ..\..\..\lib\pngd.lib ..\..\..\lib\jpegd.lib ..\..\..\lib\tiffd.lib ..\..\..\lib\wxmswd.lib /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept
|
||||
|
||||
!ENDIF
|
||||
|
||||
# Begin Target
|
||||
|
||||
# Name "emulator - Win32 Release DLL"
|
||||
# Name "emulator - Win32 Debug DLL"
|
||||
# Name "emulator - Win32 Release"
|
||||
# Name "emulator - Win32 Debug"
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\emulator.cpp
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\emulator.h
|
||||
# End Source File
|
||||
# Begin Source File
|
||||
|
||||
SOURCE=.\emulator.rc
|
||||
# End Source File
|
||||
# End Target
|
||||
# End Project
|
29
utils/emulator/src/emulator.dsw
Normal file
@@ -0,0 +1,29 @@
|
||||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
||||
|
||||
###############################################################################
|
||||
|
||||
Project: "emulator"=.\emulator.dsp - Package Owner=<4>
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<4>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
||||
Global:
|
||||
|
||||
Package=<5>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
Package=<3>
|
||||
{{{
|
||||
}}}
|
||||
|
||||
###############################################################################
|
||||
|
168
utils/emulator/src/emulator.h
Normal file
@@ -0,0 +1,168 @@
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// Name: emulator.h
|
||||
// Purpose: wxX11-based PDA emulator classes
|
||||
// Author: Julian Smart
|
||||
// Modified by:
|
||||
// Created: 2002-03-10
|
||||
// RCS-ID: $Id$
|
||||
// Copyright: (c) wxWindows team
|
||||
// Licence: wxWindows licence
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
#ifndef _WX_EMULATOR_H_
|
||||
#define _WX_EMULATOR_H_
|
||||
|
||||
#ifdef __GNUG__
|
||||
#pragma interface "emulator.h"
|
||||
#endif
|
||||
|
||||
#define wxEMULATOR_VERSION 0.1
|
||||
|
||||
// Information about the emulator decorations
|
||||
class wxEmulatorInfo: public wxObject
|
||||
{
|
||||
public:
|
||||
|
||||
wxEmulatorInfo() { Init(); }
|
||||
wxEmulatorInfo(const wxEmulatorInfo& info) { Init(); Copy(info); }
|
||||
|
||||
void operator= (const wxEmulatorInfo& info) { Copy(info); }
|
||||
void Copy(const wxEmulatorInfo& info);
|
||||
|
||||
// Initialisation
|
||||
void Init();
|
||||
|
||||
// Loads bitmaps
|
||||
bool Load(const wxString& appDir);
|
||||
|
||||
// Emulator config filename
|
||||
wxString m_emulatorFilename;
|
||||
|
||||
// Emulator title
|
||||
wxString m_emulatorTitle;
|
||||
|
||||
// Emulator description
|
||||
wxString m_emulatorDescription;
|
||||
|
||||
// The offset from the top-left of the main emulator
|
||||
// bitmap and the virtual screen (where Xnest is
|
||||
// positioned)
|
||||
wxPoint m_emulatorScreenPosition;
|
||||
|
||||
// The emulated screen size, e.g. 320x240
|
||||
wxSize m_emulatorScreenSize;
|
||||
|
||||
// The emulated device size. This is ignored
|
||||
// if there is a background bitmap
|
||||
wxSize m_emulatorDeviceSize;
|
||||
|
||||
// The bitmap used for drawing the main emulator
|
||||
// decorations
|
||||
wxBitmap m_emulatorBackgroundBitmap;
|
||||
wxString m_emulatorBackgroundBitmapName;
|
||||
|
||||
// The intended background colour (for filling in
|
||||
// areas of the window not covered by the bitmap)
|
||||
wxColour m_emulatorBackgroundColour;
|
||||
|
||||
// TODO: an array of bitmaps and ids for custom buttons
|
||||
};
|
||||
|
||||
// Emulator app class
|
||||
class wxEmulatorContainer;
|
||||
class wxEmulatorApp : public wxApp
|
||||
{
|
||||
public:
|
||||
wxEmulatorApp();
|
||||
virtual bool OnInit();
|
||||
|
||||
// Load the specified emulator
|
||||
bool LoadEmulator(const wxString& appDir);
|
||||
|
||||
// Get app dir
|
||||
wxString GetAppDir() const { return m_appDir; }
|
||||
|
||||
// Prepend the current app program directory to the name
|
||||
wxString GetFullAppPath(const wxString& filename) const;
|
||||
|
||||
public:
|
||||
|
||||
wxEmulatorInfo m_emulatorInfo;
|
||||
#ifdef __WXX11__
|
||||
wxAdoptedWindow* m_xnestWindow;
|
||||
#else
|
||||
wxWindow* m_xnestWindow;
|
||||
#endif
|
||||
wxEmulatorContainer* m_containerWindow;
|
||||
wxString m_appDir;
|
||||
wxString m_displayNumber;
|
||||
long m_xnestPID;
|
||||
};
|
||||
|
||||
// The container for the Xnest window. The decorations
|
||||
// will be drawn on this window.
|
||||
class wxEmulatorContainer: public wxWindow
|
||||
{
|
||||
public:
|
||||
|
||||
wxEmulatorContainer(wxWindow* parent, wxWindowID id);
|
||||
|
||||
void DoResize();
|
||||
|
||||
void OnSize(wxSizeEvent& event);
|
||||
void OnPaint(wxPaintEvent& event);
|
||||
void OnEraseBackground(wxEraseEvent& event);
|
||||
|
||||
DECLARE_CLASS(wxEmulatorContainer)
|
||||
DECLARE_EVENT_TABLE()
|
||||
|
||||
};
|
||||
|
||||
// Frame class
|
||||
class wxEmulatorFrame : public wxFrame
|
||||
{
|
||||
public:
|
||||
// ctor(s)
|
||||
wxEmulatorFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
|
||||
|
||||
// event handlers
|
||||
void OnQuit(wxCommandEvent& event);
|
||||
void OnAbout(wxCommandEvent& event);
|
||||
void OnCloseWindow(wxCloseEvent& event);
|
||||
|
||||
private:
|
||||
// any class wishing to process wxWindows events must use this macro
|
||||
DECLARE_EVENT_TABLE()
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// constants
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// IDs for the controls and the menu commands
|
||||
enum
|
||||
{
|
||||
// menu items
|
||||
Emulator_Quit = 1,
|
||||
|
||||
// it is important for the id corresponding to the "About" command to have
|
||||
// this standard value as otherwise it won't be handled properly under Mac
|
||||
// (where it is special and put into the "Apple" menu)
|
||||
Emulator_About = wxID_ABOUT
|
||||
};
|
||||
|
||||
// Returns the image type, or -1, determined from the extension.
|
||||
int wxDetermineImageType(const wxString& filename);
|
||||
|
||||
// Convert a colour to a 6-digit hex string
|
||||
wxString wxColourToHexString(const wxColour& col);
|
||||
|
||||
// Convert 6-digit hex string to a colour
|
||||
wxColour wxHexStringToColour(const wxString& hex);
|
||||
|
||||
// Find the absolute path where this application has been run from.
|
||||
wxString wxFindAppPath(const wxString& argv0, const wxString& cwd, const wxString& appVariableName);
|
||||
|
||||
#endif
|
||||
// _WX_EMULATOR_H_
|
||||
|
BIN
utils/emulator/src/emulator.ico
Normal file
After Width: | Height: | Size: 3.6 KiB |
3
utils/emulator/src/emulator.rc
Normal file
@@ -0,0 +1,3 @@
|
||||
emulator ICON "emulator.ico"
|
||||
#include "wx/msw/wx.rc"
|
||||
|
52
utils/emulator/src/emulator.xpm
Normal file
@@ -0,0 +1,52 @@
|
||||
/* XPM */
|
||||
static char * emulator_xpm[] = {
|
||||
"32 32 17 1",
|
||||
"( c #000000",
|
||||
". c #000000",
|
||||
"+ c #008484",
|
||||
"@ c #848484",
|
||||
"# c #A5A5A5",
|
||||
"$ c None",
|
||||
"% c #FFFFF7",
|
||||
"& c #FFFFFF",
|
||||
"* c #FFFFFF",
|
||||
"= c #FFFFFF",
|
||||
"- c #FFFFFF",
|
||||
"; c #FFFFFF",
|
||||
"> c #FFFFFF",
|
||||
", c #FFFFFF",
|
||||
"' c #FFFFFF",
|
||||
") c #FFFFFF",
|
||||
"! c #FFFFFF",
|
||||
"$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$",
|
||||
"$$$%%%%%%%%%%%%%%%%%%%%%%%&@$$$$",
|
||||
"$$$%######################@.$$$$",
|
||||
"$$$%######################@.$$$$",
|
||||
"$$$%##++++++++++++++++++##@.$$$$",
|
||||
"$$$%##++++++++++++++++++##@.$$.$",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%##++++++++++++++++++##@.$&.#",
|
||||
"$$$%######################@.$&.#",
|
||||
"$$$%######################@.$&.#",
|
||||
"$$$%##@####@##########@###@.$&.#",
|
||||
"$$$%#@@@##@@@########@@@##@.$&.#",
|
||||
"$$$%##@####@##########@###@.$&.#",
|
||||
"$$$%######################@.$&.#",
|
||||
"$$$&@@@@@@@@@@@@@@@@@@@@@@@.$&.#",
|
||||
"$$$@........................$$$$"};
|
33
utils/emulator/src/ipaq.wxe
Normal file
@@ -0,0 +1,33 @@
|
||||
# Default emulator config file
|
||||
|
||||
[General]
|
||||
|
||||
# The title of the emulator
|
||||
title = "iPAQ Emulator"
|
||||
|
||||
# An optional description
|
||||
description = "No description yet"
|
||||
|
||||
# The top-left of the virtual screen relative
|
||||
# to the background bitmap
|
||||
screenX = 56
|
||||
screenY = 69
|
||||
|
||||
# The size of the virtual screen
|
||||
screenWidth = 240
|
||||
screenHeight = 320
|
||||
|
||||
# The size of the overall device -
|
||||
# only necessary if not specifying a background
|
||||
# bitmap
|
||||
# deviceWidth = 260
|
||||
# deviceHeight = 340
|
||||
|
||||
# The main bitmap representing the device.
|
||||
# You can use PNG, JPG, TIFF, BMP, XPM, GIF
|
||||
backgroundBitmap = "ipaq01.jpg"
|
||||
|
||||
# Hex string for background colour. You can
|
||||
# also use the name 'backgroundColor'
|
||||
backgroundColour = "000000"
|
||||
|
BIN
utils/emulator/src/ipaq01.jpg
Normal file
After Width: | Height: | Size: 20 KiB |
16
utils/emulator/src/makefile.g95
Normal file
@@ -0,0 +1,16 @@
|
||||
#
|
||||
# File: makefile.g95
|
||||
# Author: Julian Smart
|
||||
# Created: 1999
|
||||
# Updated:
|
||||
# Copyright: (c) Julian Smart, 1999
|
||||
#
|
||||
# Makefile for emulator (Cygwin/Mingw32).
|
||||
|
||||
WXDIR = ../../..
|
||||
|
||||
TARGET=emulator
|
||||
OBJECTS = $(TARGET).o
|
||||
|
||||
include $(WXDIR)/src/makeprog.g95
|
||||
|
18
utils/emulator/src/makefile.vc
Normal file
@@ -0,0 +1,18 @@
|
||||
#
|
||||
# File: makefile.vc
|
||||
# Author: Julian Smart
|
||||
# Created: 1999
|
||||
# Updated:
|
||||
# Copyright: (c) Julian Smart
|
||||
#
|
||||
# Makefile : Builds emulator (VC++, WIN32)
|
||||
# Use FINAL=1 argument to nmake to build final version with no debug info.
|
||||
|
||||
# Set WXDIR for your system
|
||||
WXDIR = $(WXWIN)
|
||||
|
||||
PROGRAM=emulator
|
||||
OBJECTS = $(PROGRAM).obj
|
||||
|
||||
!include $(WXDIR)\src\makeprog.vc
|
||||
|
BIN
utils/emulator/src/mondrian.ico
Normal file
After Width: | Height: | Size: 766 B |
44
utils/emulator/src/mondrian.xpm
Normal file
@@ -0,0 +1,44 @@
|
||||
/* XPM */
|
||||
static char *mondrian_xpm[] = {
|
||||
/* columns rows colors chars-per-pixel */
|
||||
"32 32 6 1",
|
||||
" c Black",
|
||||
". c Blue",
|
||||
"X c #00bf00",
|
||||
"o c Red",
|
||||
"O c Yellow",
|
||||
"+ c Gray100",
|
||||
/* pixels */
|
||||
" ",
|
||||
" oooooo +++++++++++++++++++++++ ",
|
||||
" oooooo +++++++++++++++++++++++ ",
|
||||
" oooooo +++++++++++++++++++++++ ",
|
||||
" oooooo +++++++++++++++++++++++ ",
|
||||
" oooooo +++++++++++++++++++++++ ",
|
||||
" oooooo +++++++++++++++++++++++ ",
|
||||
" oooooo +++++++++++++++++++++++ ",
|
||||
" ",
|
||||
" ++++++ ++++++++++++++++++ .... ",
|
||||
" ++++++ ++++++++++++++++++ .... ",
|
||||
" ++++++ ++++++++++++++++++ .... ",
|
||||
" ++++++ ++++++++++++++++++ .... ",
|
||||
" ++++++ ++++++++++++++++++ .... ",
|
||||
" ++++++ ++++++++++++++++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++++++++++++++++ ++++ ",
|
||||
" ++++++ ++++ ",
|
||||
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
|
||||
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
|
||||
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
|
||||
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
|
||||
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
|
||||
" ++++++ OOOOOOOOOOOO XXXXX ++++ ",
|
||||
" "
|
||||
};
|
@@ -1,339 +0,0 @@
|
||||
#----------------------------------------------------------------------------
|
||||
# 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
|
||||
#
|
@@ -84,12 +84,6 @@ static PyObject* t_output_helper(PyObject* target, PyObject* o) {
|
||||
}
|
||||
return target;
|
||||
}
|
||||
|
||||
#if PYTHON_API_VERSION >= 1009
|
||||
static char* wxStringErrorMsg = "String or Unicode type required";
|
||||
#else
|
||||
static char* wxStringErrorMsg = "String type required";
|
||||
#endif
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -158,41 +152,15 @@ static PyObject *_wrap_new_wxDllWidget(PyObject *self, PyObject *args, PyObject
|
||||
}
|
||||
if (_obj2)
|
||||
{
|
||||
#if PYTHON_API_VERSION >= 1009
|
||||
char* tmpPtr; int tmpSize;
|
||||
if (!PyString_Check(_obj2) && !PyUnicode_Check(_obj2)) {
|
||||
PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
|
||||
_arg2 = wxString_in_helper(_obj2);
|
||||
if (_arg2 == NULL)
|
||||
return NULL;
|
||||
}
|
||||
if (PyString_AsStringAndSize(_obj2, &tmpPtr, &tmpSize) == -1)
|
||||
return NULL;
|
||||
_arg2 = new wxString(tmpPtr, tmpSize);
|
||||
#else
|
||||
if (!PyString_Check(_obj2)) {
|
||||
PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
|
||||
return NULL;
|
||||
}
|
||||
_arg2 = new wxString(PyString_AS_STRING(_obj2), PyString_GET_SIZE(_obj2));
|
||||
#endif
|
||||
}
|
||||
if (_obj3)
|
||||
{
|
||||
#if PYTHON_API_VERSION >= 1009
|
||||
char* tmpPtr; int tmpSize;
|
||||
if (!PyString_Check(_obj3) && !PyUnicode_Check(_obj3)) {
|
||||
PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
|
||||
_arg3 = wxString_in_helper(_obj3);
|
||||
if (_arg3 == NULL)
|
||||
return NULL;
|
||||
}
|
||||
if (PyString_AsStringAndSize(_obj3, &tmpPtr, &tmpSize) == -1)
|
||||
return NULL;
|
||||
_arg3 = new wxString(tmpPtr, tmpSize);
|
||||
#else
|
||||
if (!PyString_Check(_obj3)) {
|
||||
PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
|
||||
return NULL;
|
||||
}
|
||||
_arg3 = new wxString(PyString_AS_STRING(_obj3), PyString_GET_SIZE(_obj3));
|
||||
#endif
|
||||
}
|
||||
if (_obj4)
|
||||
{
|
||||
@@ -208,7 +176,7 @@ static PyObject *_wrap_new_wxDllWidget(PyObject *self, PyObject *args, PyObject
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxDllWidget *)new_wxDllWidget(_arg0,_arg1,*_arg2,*_arg3,*_arg4,*_arg5,_arg6);
|
||||
_result = (wxDllWidget *)new_wxDllWidget(_arg0,_arg1,*_arg2,*_arg3,*_arg4,*_arg5,_arg6);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -250,7 +218,7 @@ static PyObject *_wrap_wxDllWidget_Ok(PyObject *self, PyObject *args, PyObject *
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (bool )wxDllWidget_Ok(_arg0);
|
||||
_result = (bool )wxDllWidget_Ok(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -281,26 +249,13 @@ static PyObject *_wrap_wxDllWidget_SendCommand(PyObject *self, PyObject *args, P
|
||||
}
|
||||
if (_obj2)
|
||||
{
|
||||
#if PYTHON_API_VERSION >= 1009
|
||||
char* tmpPtr; int tmpSize;
|
||||
if (!PyString_Check(_obj2) && !PyUnicode_Check(_obj2)) {
|
||||
PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
|
||||
_arg2 = wxString_in_helper(_obj2);
|
||||
if (_arg2 == NULL)
|
||||
return NULL;
|
||||
}
|
||||
if (PyString_AsStringAndSize(_obj2, &tmpPtr, &tmpSize) == -1)
|
||||
return NULL;
|
||||
_arg2 = new wxString(tmpPtr, tmpSize);
|
||||
#else
|
||||
if (!PyString_Check(_obj2)) {
|
||||
PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
|
||||
return NULL;
|
||||
}
|
||||
_arg2 = new wxString(PyString_AS_STRING(_obj2), PyString_GET_SIZE(_obj2));
|
||||
#endif
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (int )wxDllWidget_SendCommand(_arg0,_arg1,*_arg2);
|
||||
_result = (int )wxDllWidget_SendCommand(_arg0,_arg1,*_arg2);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -332,7 +287,7 @@ static PyObject *_wrap_wxDllWidget_GetWidgetWindow(PyObject *self, PyObject *arg
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxWindow *)wxDllWidget_GetWidgetWindow(_arg0);
|
||||
_result = (wxWindow *)wxDllWidget_GetWidgetWindow(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -350,12 +305,16 @@ static PyObject *_wrap_wxDllWidget_GetDllExt(PyObject *self, PyObject *args, PyO
|
||||
return NULL;
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = new wxString (wxDllWidget::GetDllExt());
|
||||
_result = new wxString (wxDllWidget::GetDllExt());
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
}{
|
||||
#if wxUSE_UNICODE
|
||||
_resultobj = PyUnicode_FromUnicode(_result->c_str(), _result->Len());
|
||||
#else
|
||||
_resultobj = PyString_FromStringAndSize(_result->c_str(), _result->Len());
|
||||
#endif
|
||||
}
|
||||
{
|
||||
delete _result;
|
||||
|
@@ -88,12 +88,6 @@ static PyObject* t_output_helper(PyObject* target, PyObject* o) {
|
||||
return target;
|
||||
}
|
||||
|
||||
#if PYTHON_API_VERSION >= 1009
|
||||
static char* wxStringErrorMsg = "String or Unicode type required";
|
||||
#else
|
||||
static char* wxStringErrorMsg = "String type required";
|
||||
#endif
|
||||
|
||||
typedef wxTreeCtrl wxPyTreeCtrl;
|
||||
|
||||
class wxPyTreeCompanionWindow: public wxTreeCompanionWindow
|
||||
@@ -173,7 +167,7 @@ static PyObject *_wrap_new_wxDynamicSashSplitEvent(PyObject *self, PyObject *arg
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxDynamicSashSplitEvent *)new_wxDynamicSashSplitEvent(_arg0);
|
||||
_result = (wxDynamicSashSplitEvent *)new_wxDynamicSashSplitEvent(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -232,7 +226,7 @@ static PyObject *_wrap_new_wxDynamicSashUnifyEvent(PyObject *self, PyObject *arg
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxDynamicSashUnifyEvent *)new_wxDynamicSashUnifyEvent(_arg0);
|
||||
_result = (wxDynamicSashUnifyEvent *)new_wxDynamicSashUnifyEvent(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -312,7 +306,7 @@ static PyObject *_wrap_new_wxDynamicSashWindow(PyObject *self, PyObject *args, P
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxDynamicSashWindow *)new_wxDynamicSashWindow(_arg0,_arg1,*_arg2,*_arg3,_arg4,_arg5);
|
||||
_result = (wxDynamicSashWindow *)new_wxDynamicSashWindow(_arg0,_arg1,*_arg2,*_arg3,_arg4,_arg5);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -338,7 +332,7 @@ static PyObject *_wrap_new_wxPreDynamicSashWindow(PyObject *self, PyObject *args
|
||||
return NULL;
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxDynamicSashWindow *)new_wxPreDynamicSashWindow();
|
||||
_result = (wxDynamicSashWindow *)new_wxPreDynamicSashWindow();
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -402,7 +396,7 @@ static PyObject *_wrap_wxDynamicSashWindow_Create(PyObject *self, PyObject *args
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (bool )wxDynamicSashWindow_Create(_arg0,_arg1,_arg2,*_arg3,*_arg4,_arg5,_arg6);
|
||||
_result = (bool )wxDynamicSashWindow_Create(_arg0,_arg1,_arg2,*_arg3,*_arg4,_arg5,_arg6);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -440,7 +434,7 @@ static PyObject *_wrap_wxDynamicSashWindow_GetHScrollBar(PyObject *self, PyObjec
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxScrollBar *)wxDynamicSashWindow_GetHScrollBar(_arg0,_arg1);
|
||||
_result = (wxScrollBar *)wxDynamicSashWindow_GetHScrollBar(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -484,7 +478,7 @@ static PyObject *_wrap_wxDynamicSashWindow_GetVScrollBar(PyObject *self, PyObjec
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxScrollBar *)wxDynamicSashWindow_GetVScrollBar(_arg0,_arg1);
|
||||
_result = (wxScrollBar *)wxDynamicSashWindow_GetVScrollBar(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -561,22 +555,9 @@ static PyObject *_wrap_new_wxEditableListBox(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
}
|
||||
{
|
||||
#if PYTHON_API_VERSION >= 1009
|
||||
char* tmpPtr; int tmpSize;
|
||||
if (!PyString_Check(_obj2) && !PyUnicode_Check(_obj2)) {
|
||||
PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
|
||||
_arg2 = wxString_in_helper(_obj2);
|
||||
if (_arg2 == NULL)
|
||||
return NULL;
|
||||
}
|
||||
if (PyString_AsStringAndSize(_obj2, &tmpPtr, &tmpSize) == -1)
|
||||
return NULL;
|
||||
_arg2 = new wxString(tmpPtr, tmpSize);
|
||||
#else
|
||||
if (!PyString_Check(_obj2)) {
|
||||
PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
|
||||
return NULL;
|
||||
}
|
||||
_arg2 = new wxString(PyString_AS_STRING(_obj2), PyString_GET_SIZE(_obj2));
|
||||
#endif
|
||||
}
|
||||
if (_obj3)
|
||||
{
|
||||
@@ -592,7 +573,7 @@ static PyObject *_wrap_new_wxEditableListBox(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxEditableListBox *)new_wxEditableListBox(_arg0,_arg1,*_arg2,*_arg3,*_arg4,_arg5,_arg6);
|
||||
_result = (wxEditableListBox *)new_wxEditableListBox(_arg0,_arg1,*_arg2,*_arg3,*_arg4,_arg5,_arg6);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -638,15 +619,20 @@ static PyObject *_wrap_wxEditableListBox_SetStrings(PyObject *self, PyObject *ar
|
||||
int i, len=PySequence_Length(_obj1);
|
||||
for (i=0; i<len; i++) {
|
||||
PyObject* item = PySequence_GetItem(_obj1, i);
|
||||
#if wxUSE_UNICODE
|
||||
PyObject* str = PyObject_Unicode(item);
|
||||
_arg1->Add(PyUnicode_AsUnicode(str));
|
||||
#else
|
||||
PyObject* str = PyObject_Str(item);
|
||||
_arg1->Add(PyString_AsString(str));
|
||||
#endif
|
||||
Py_DECREF(item);
|
||||
Py_DECREF(str);
|
||||
}
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxEditableListBox_SetStrings(_arg0,*_arg1);
|
||||
wxEditableListBox_SetStrings(_arg0,*_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -683,7 +669,7 @@ static PyObject *_wrap_wxEditableListBox_GetStrings(PyObject *self, PyObject *ar
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (PyObject *)wxEditableListBox_GetStrings(_arg0);
|
||||
_result = (PyObject *)wxEditableListBox_GetStrings(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -774,7 +760,7 @@ static PyObject *_wrap_new_wxRemotelyScrolledTreeCtrl(PyObject *self, PyObject *
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxRemotelyScrolledTreeCtrl *)new_wxRemotelyScrolledTreeCtrl(_arg0,_arg1,*_arg2,*_arg3,_arg4);
|
||||
_result = (wxRemotelyScrolledTreeCtrl *)new_wxRemotelyScrolledTreeCtrl(_arg0,_arg1,*_arg2,*_arg3,_arg4);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -807,7 +793,7 @@ static PyObject *_wrap_wxRemotelyScrolledTreeCtrl_HideVScrollbar(PyObject *self,
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxRemotelyScrolledTreeCtrl_HideVScrollbar(_arg0);
|
||||
wxRemotelyScrolledTreeCtrl_HideVScrollbar(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -835,7 +821,7 @@ static PyObject *_wrap_wxRemotelyScrolledTreeCtrl_AdjustRemoteScrollbars(PyObjec
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxRemotelyScrolledTreeCtrl_AdjustRemoteScrollbars(_arg0);
|
||||
wxRemotelyScrolledTreeCtrl_AdjustRemoteScrollbars(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -865,7 +851,7 @@ static PyObject *_wrap_wxRemotelyScrolledTreeCtrl_GetScrolledWindow(PyObject *se
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxScrolledWindow *)wxRemotelyScrolledTreeCtrl_GetScrolledWindow(_arg0);
|
||||
_result = (wxScrolledWindow *)wxRemotelyScrolledTreeCtrl_GetScrolledWindow(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -900,7 +886,7 @@ static PyObject *_wrap_wxRemotelyScrolledTreeCtrl_ScrollToLine(PyObject *self, P
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxRemotelyScrolledTreeCtrl_ScrollToLine(_arg0,_arg1,_arg2);
|
||||
wxRemotelyScrolledTreeCtrl_ScrollToLine(_arg0,_arg1,_arg2);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -937,7 +923,7 @@ static PyObject *_wrap_wxRemotelyScrolledTreeCtrl_SetCompanionWindow(PyObject *s
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxRemotelyScrolledTreeCtrl_SetCompanionWindow(_arg0,_arg1);
|
||||
wxRemotelyScrolledTreeCtrl_SetCompanionWindow(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -966,7 +952,7 @@ static PyObject *_wrap_wxRemotelyScrolledTreeCtrl_GetCompanionWindow(PyObject *s
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxWindow *)wxRemotelyScrolledTreeCtrl_GetCompanionWindow(_arg0);
|
||||
_result = (wxWindow *)wxRemotelyScrolledTreeCtrl_GetCompanionWindow(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1039,7 +1025,7 @@ static PyObject *_wrap_new_wxTreeCompanionWindow(PyObject *self, PyObject *args,
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxPyTreeCompanionWindow *)new_wxTreeCompanionWindow(_arg0,_arg1,*_arg2,*_arg3,_arg4);
|
||||
_result = (wxPyTreeCompanionWindow *)new_wxTreeCompanionWindow(_arg0,_arg1,*_arg2,*_arg3,_arg4);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1082,7 +1068,7 @@ static PyObject *_wrap_wxTreeCompanionWindow__setCallbackInfo(PyObject *self, Py
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxTreeCompanionWindow__setCallbackInfo(_arg0,_arg1,_arg2);
|
||||
wxTreeCompanionWindow__setCallbackInfo(_arg0,_arg1,_arg2);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1112,7 +1098,7 @@ static PyObject *_wrap_wxTreeCompanionWindow_GetTreeCtrl(PyObject *self, PyObjec
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxRemotelyScrolledTreeCtrl *)wxTreeCompanionWindow_GetTreeCtrl(_arg0);
|
||||
_result = (wxRemotelyScrolledTreeCtrl *)wxTreeCompanionWindow_GetTreeCtrl(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1154,7 +1140,7 @@ static PyObject *_wrap_wxTreeCompanionWindow_SetTreeCtrl(PyObject *self, PyObjec
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxTreeCompanionWindow_SetTreeCtrl(_arg0,_arg1);
|
||||
wxTreeCompanionWindow_SetTreeCtrl(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1236,7 +1222,7 @@ static PyObject *_wrap_new_wxThinSplitterWindow(PyObject *self, PyObject *args,
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxThinSplitterWindow *)new_wxThinSplitterWindow(_arg0,_arg1,*_arg2,*_arg3,_arg4);
|
||||
_result = (wxThinSplitterWindow *)new_wxThinSplitterWindow(_arg0,_arg1,*_arg2,*_arg3,_arg4);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1331,7 +1317,7 @@ static PyObject *_wrap_new_wxSplitterScrolledWindow(PyObject *self, PyObject *ar
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxSplitterScrolledWindow *)new_wxSplitterScrolledWindow(_arg0,_arg1,*_arg2,*_arg3,_arg4);
|
||||
_result = (wxSplitterScrolledWindow *)new_wxSplitterScrolledWindow(_arg0,_arg1,*_arg2,*_arg3,_arg4);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1418,7 +1404,7 @@ static PyObject *_wrap_new_wxLEDNumberCtrl(PyObject *self, PyObject *args, PyObj
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxLEDNumberCtrl *)new_wxLEDNumberCtrl(_arg0,_arg1,*_arg2,*_arg3,_arg4);
|
||||
_result = (wxLEDNumberCtrl *)new_wxLEDNumberCtrl(_arg0,_arg1,*_arg2,*_arg3,_arg4);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1444,7 +1430,7 @@ static PyObject *_wrap_new_wxPreLEDNumberCtrl(PyObject *self, PyObject *args, Py
|
||||
return NULL;
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxLEDNumberCtrl *)new_wxPreLEDNumberCtrl();
|
||||
_result = (wxLEDNumberCtrl *)new_wxPreLEDNumberCtrl();
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1507,7 +1493,7 @@ static PyObject *_wrap_wxLEDNumberCtrl_Create(PyObject *self, PyObject *args, Py
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (bool )wxLEDNumberCtrl_Create(_arg0,_arg1,_arg2,*_arg3,*_arg4,_arg5);
|
||||
_result = (bool )wxLEDNumberCtrl_Create(_arg0,_arg1,_arg2,*_arg3,*_arg4,_arg5);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1535,7 +1521,7 @@ static PyObject *_wrap_wxLEDNumberCtrl_GetAlignment(PyObject *self, PyObject *ar
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxLEDValueAlign )wxLEDNumberCtrl_GetAlignment(_arg0);
|
||||
_result = (wxLEDValueAlign )wxLEDNumberCtrl_GetAlignment(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1563,7 +1549,7 @@ static PyObject *_wrap_wxLEDNumberCtrl_GetDrawFaded(PyObject *self, PyObject *ar
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (bool )wxLEDNumberCtrl_GetDrawFaded(_arg0);
|
||||
_result = (bool )wxLEDNumberCtrl_GetDrawFaded(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1591,13 +1577,17 @@ static PyObject *_wrap_wxLEDNumberCtrl_GetValue(PyObject *self, PyObject *args,
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
const wxString & _result_ref = wxLEDNumberCtrl_GetValue(_arg0);
|
||||
const wxString & _result_ref = wxLEDNumberCtrl_GetValue(_arg0);
|
||||
_result = (wxString *) &_result_ref;
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
}{
|
||||
#if wxUSE_UNICODE
|
||||
_resultobj = PyUnicode_FromUnicode(_result->c_str(), _result->Len());
|
||||
#else
|
||||
_resultobj = PyString_FromStringAndSize(_result->c_str(), _result->Len());
|
||||
#endif
|
||||
}
|
||||
return _resultobj;
|
||||
}
|
||||
@@ -1625,7 +1615,7 @@ static PyObject *_wrap_wxLEDNumberCtrl_SetAlignment(PyObject *self, PyObject *ar
|
||||
_arg2 = (bool ) tempbool2;
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxLEDNumberCtrl_SetAlignment(_arg0,_arg1,_arg2);
|
||||
wxLEDNumberCtrl_SetAlignment(_arg0,_arg1,_arg2);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1659,7 +1649,7 @@ static PyObject *_wrap_wxLEDNumberCtrl_SetDrawFaded(PyObject *self, PyObject *ar
|
||||
_arg2 = (bool ) tempbool2;
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxLEDNumberCtrl_SetDrawFaded(_arg0,_arg1,_arg2);
|
||||
wxLEDNumberCtrl_SetDrawFaded(_arg0,_arg1,_arg2);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1690,27 +1680,14 @@ static PyObject *_wrap_wxLEDNumberCtrl_SetValue(PyObject *self, PyObject *args,
|
||||
}
|
||||
}
|
||||
{
|
||||
#if PYTHON_API_VERSION >= 1009
|
||||
char* tmpPtr; int tmpSize;
|
||||
if (!PyString_Check(_obj1) && !PyUnicode_Check(_obj1)) {
|
||||
PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
|
||||
_arg1 = wxString_in_helper(_obj1);
|
||||
if (_arg1 == NULL)
|
||||
return NULL;
|
||||
}
|
||||
if (PyString_AsStringAndSize(_obj1, &tmpPtr, &tmpSize) == -1)
|
||||
return NULL;
|
||||
_arg1 = new wxString(tmpPtr, tmpSize);
|
||||
#else
|
||||
if (!PyString_Check(_obj1)) {
|
||||
PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
|
||||
return NULL;
|
||||
}
|
||||
_arg1 = new wxString(PyString_AS_STRING(_obj1), PyString_GET_SIZE(_obj1));
|
||||
#endif
|
||||
}
|
||||
_arg2 = (bool ) tempbool2;
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxLEDNumberCtrl_SetValue(_arg0,*_arg1,_arg2);
|
||||
wxLEDNumberCtrl_SetValue(_arg0,*_arg1,_arg2);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
|
@@ -89,12 +89,6 @@ static PyObject* t_output_helper(PyObject* target, PyObject* o) {
|
||||
}
|
||||
return target;
|
||||
}
|
||||
|
||||
#if PYTHON_API_VERSION >= 1009
|
||||
static char* wxStringErrorMsg = "String or Unicode type required";
|
||||
#else
|
||||
static char* wxStringErrorMsg = "String type required";
|
||||
#endif
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -139,7 +133,7 @@ static PyObject *_wrap_new_wxGLContext(PyObject *self, PyObject *args, PyObject
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxGLContext *)new_wxGLContext(_arg0,_arg1,*_arg2);
|
||||
_result = (wxGLContext *)new_wxGLContext(_arg0,_arg1,*_arg2);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -172,7 +166,7 @@ static PyObject *_wrap_delete_wxGLContext(PyObject *self, PyObject *args, PyObje
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
delete_wxGLContext(_arg0);
|
||||
delete_wxGLContext(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -200,7 +194,7 @@ static PyObject *_wrap_wxGLContext_SetCurrent(PyObject *self, PyObject *args, Py
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLContext_SetCurrent(_arg0);
|
||||
wxGLContext_SetCurrent(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -229,7 +223,7 @@ static PyObject *_wrap_wxGLContext_SetColour(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLContext_SetColour(_arg0,_arg1);
|
||||
wxGLContext_SetColour(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -257,7 +251,7 @@ static PyObject *_wrap_wxGLContext_SwapBuffers(PyObject *self, PyObject *args, P
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLContext_SwapBuffers(_arg0);
|
||||
wxGLContext_SwapBuffers(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -285,7 +279,7 @@ static PyObject *_wrap_wxGLContext_SetupPixelFormat(PyObject *self, PyObject *ar
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLContext_SetupPixelFormat(_arg0);
|
||||
wxGLContext_SetupPixelFormat(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -322,7 +316,7 @@ static PyObject *_wrap_wxGLContext_SetupPalette(PyObject *self, PyObject *args,
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLContext_SetupPalette(_arg0,*_arg1);
|
||||
wxGLContext_SetupPalette(_arg0,*_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -352,7 +346,7 @@ static PyObject *_wrap_wxGLContext_CreateDefaultPalette(PyObject *self, PyObject
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = new wxPalette (wxGLContext_CreateDefaultPalette(_arg0));
|
||||
_result = new wxPalette (wxGLContext_CreateDefaultPalette(_arg0));
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -382,7 +376,7 @@ static PyObject *_wrap_wxGLContext_GetPalette(PyObject *self, PyObject *args, Py
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxPalette *)wxGLContext_GetPalette(_arg0);
|
||||
_result = (wxPalette *)wxGLContext_GetPalette(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -416,7 +410,7 @@ static PyObject *_wrap_wxGLContext_GetWindow(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxWindow *)wxGLContext_GetWindow(_arg0);
|
||||
_result = (wxWindow *)wxGLContext_GetWindow(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -515,7 +509,7 @@ static PyObject *_wrap_new_wxGLCanvas(PyObject *self, PyObject *args, PyObject *
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxGLCanvas *)new_wxGLCanvas(_arg0,_arg1,*_arg2,*_arg3,_arg4,_arg5,_arg6,*_arg7);
|
||||
_result = (wxGLCanvas *)new_wxGLCanvas(_arg0,_arg1,*_arg2,*_arg3,_arg4,_arg5,_arg6,*_arg7);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -608,7 +602,7 @@ static PyObject *_wrap_new_wxGLCanvasWithContext(PyObject *self, PyObject *args,
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxGLCanvas *)new_wxGLCanvasWithContext(_arg0,_arg1,_arg2,*_arg3,*_arg4,_arg5,_arg6,_arg7,*_arg8);
|
||||
_result = (wxGLCanvas *)new_wxGLCanvasWithContext(_arg0,_arg1,_arg2,*_arg3,*_arg4,_arg5,_arg6,_arg7,*_arg8);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -644,7 +638,7 @@ static PyObject *_wrap_wxGLCanvas_SetCurrent(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLCanvas_SetCurrent(_arg0);
|
||||
wxGLCanvas_SetCurrent(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -673,7 +667,7 @@ static PyObject *_wrap_wxGLCanvas_SetColour(PyObject *self, PyObject *args, PyOb
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLCanvas_SetColour(_arg0,_arg1);
|
||||
wxGLCanvas_SetColour(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -701,7 +695,7 @@ static PyObject *_wrap_wxGLCanvas_SwapBuffers(PyObject *self, PyObject *args, Py
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLCanvas_SwapBuffers(_arg0);
|
||||
wxGLCanvas_SwapBuffers(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -731,7 +725,7 @@ static PyObject *_wrap_wxGLCanvas_GetContext(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxGLContext *)wxGLCanvas_GetContext(_arg0);
|
||||
_result = (wxGLContext *)wxGLCanvas_GetContext(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
|
@@ -89,12 +89,6 @@ static PyObject* t_output_helper(PyObject* target, PyObject* o) {
|
||||
}
|
||||
return target;
|
||||
}
|
||||
|
||||
#if PYTHON_API_VERSION >= 1009
|
||||
static char* wxStringErrorMsg = "String or Unicode type required";
|
||||
#else
|
||||
static char* wxStringErrorMsg = "String type required";
|
||||
#endif
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -125,7 +119,7 @@ static PyObject *_wrap_delete_wxGLContext(PyObject *self, PyObject *args, PyObje
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
delete_wxGLContext(_arg0);
|
||||
delete_wxGLContext(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -153,7 +147,7 @@ static PyObject *_wrap_wxGLContext_SetCurrent(PyObject *self, PyObject *args, Py
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLContext_SetCurrent(_arg0);
|
||||
wxGLContext_SetCurrent(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -182,7 +176,7 @@ static PyObject *_wrap_wxGLContext_SetColour(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLContext_SetColour(_arg0,_arg1);
|
||||
wxGLContext_SetColour(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -210,7 +204,7 @@ static PyObject *_wrap_wxGLContext_SwapBuffers(PyObject *self, PyObject *args, P
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLContext_SwapBuffers(_arg0);
|
||||
wxGLContext_SwapBuffers(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -239,7 +233,7 @@ static PyObject *_wrap_wxGLContext_GetWindow(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxWindow *)wxGLContext_GetWindow(_arg0);
|
||||
_result = (wxWindow *)wxGLContext_GetWindow(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -338,7 +332,7 @@ static PyObject *_wrap_new_wxGLCanvas(PyObject *self, PyObject *args, PyObject *
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxGLCanvas *)new_wxGLCanvas(_arg0,_arg1,*_arg2,*_arg3,_arg4,_arg5,_arg6,*_arg7);
|
||||
_result = (wxGLCanvas *)new_wxGLCanvas(_arg0,_arg1,*_arg2,*_arg3,_arg4,_arg5,_arg6,*_arg7);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -431,7 +425,7 @@ static PyObject *_wrap_new_wxGLCanvasWithContext(PyObject *self, PyObject *args,
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxGLCanvas *)new_wxGLCanvasWithContext(_arg0,_arg1,_arg2,*_arg3,*_arg4,_arg5,_arg6,_arg7,*_arg8);
|
||||
_result = (wxGLCanvas *)new_wxGLCanvasWithContext(_arg0,_arg1,_arg2,*_arg3,*_arg4,_arg5,_arg6,_arg7,*_arg8);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -467,7 +461,7 @@ static PyObject *_wrap_wxGLCanvas_SetCurrent(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLCanvas_SetCurrent(_arg0);
|
||||
wxGLCanvas_SetCurrent(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -496,7 +490,7 @@ static PyObject *_wrap_wxGLCanvas_SetColour(PyObject *self, PyObject *args, PyOb
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLCanvas_SetColour(_arg0,_arg1);
|
||||
wxGLCanvas_SetColour(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -524,7 +518,7 @@ static PyObject *_wrap_wxGLCanvas_SwapBuffers(PyObject *self, PyObject *args, Py
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLCanvas_SwapBuffers(_arg0);
|
||||
wxGLCanvas_SwapBuffers(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -554,7 +548,7 @@ static PyObject *_wrap_wxGLCanvas_GetContext(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxGLContext *)wxGLCanvas_GetContext(_arg0);
|
||||
_result = (wxGLContext *)wxGLCanvas_GetContext(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
|
@@ -89,12 +89,6 @@ static PyObject* t_output_helper(PyObject* target, PyObject* o) {
|
||||
}
|
||||
return target;
|
||||
}
|
||||
|
||||
#if PYTHON_API_VERSION >= 1009
|
||||
static char* wxStringErrorMsg = "String or Unicode type required";
|
||||
#else
|
||||
static char* wxStringErrorMsg = "String type required";
|
||||
#endif
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
@@ -139,7 +133,7 @@ static PyObject *_wrap_new_wxGLContext(PyObject *self, PyObject *args, PyObject
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxGLContext *)new_wxGLContext(_arg0,_arg1,*_arg2);
|
||||
_result = (wxGLContext *)new_wxGLContext(_arg0,_arg1,*_arg2);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -172,7 +166,7 @@ static PyObject *_wrap_delete_wxGLContext(PyObject *self, PyObject *args, PyObje
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
delete_wxGLContext(_arg0);
|
||||
delete_wxGLContext(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -200,7 +194,7 @@ static PyObject *_wrap_wxGLContext_SetCurrent(PyObject *self, PyObject *args, Py
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLContext_SetCurrent(_arg0);
|
||||
wxGLContext_SetCurrent(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -229,7 +223,7 @@ static PyObject *_wrap_wxGLContext_SetColour(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLContext_SetColour(_arg0,_arg1);
|
||||
wxGLContext_SetColour(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -257,7 +251,7 @@ static PyObject *_wrap_wxGLContext_SwapBuffers(PyObject *self, PyObject *args, P
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLContext_SwapBuffers(_arg0);
|
||||
wxGLContext_SwapBuffers(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -286,7 +280,7 @@ static PyObject *_wrap_wxGLContext_GetWindow(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxWindow *)wxGLContext_GetWindow(_arg0);
|
||||
_result = (wxWindow *)wxGLContext_GetWindow(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -385,7 +379,7 @@ static PyObject *_wrap_new_wxGLCanvas(PyObject *self, PyObject *args, PyObject *
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxGLCanvas *)new_wxGLCanvas(_arg0,_arg1,*_arg2,*_arg3,_arg4,_arg5,_arg6,*_arg7);
|
||||
_result = (wxGLCanvas *)new_wxGLCanvas(_arg0,_arg1,*_arg2,*_arg3,_arg4,_arg5,_arg6,*_arg7);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -478,7 +472,7 @@ static PyObject *_wrap_new_wxGLCanvasWithContext(PyObject *self, PyObject *args,
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxGLCanvas *)new_wxGLCanvasWithContext(_arg0,_arg1,_arg2,*_arg3,*_arg4,_arg5,_arg6,_arg7,*_arg8);
|
||||
_result = (wxGLCanvas *)new_wxGLCanvasWithContext(_arg0,_arg1,_arg2,*_arg3,*_arg4,_arg5,_arg6,_arg7,*_arg8);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -514,7 +508,7 @@ static PyObject *_wrap_wxGLCanvas_SetCurrent(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLCanvas_SetCurrent(_arg0);
|
||||
wxGLCanvas_SetCurrent(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -543,7 +537,7 @@ static PyObject *_wrap_wxGLCanvas_SetColour(PyObject *self, PyObject *args, PyOb
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLCanvas_SetColour(_arg0,_arg1);
|
||||
wxGLCanvas_SetColour(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -571,7 +565,7 @@ static PyObject *_wrap_wxGLCanvas_SwapBuffers(PyObject *self, PyObject *args, Py
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLCanvas_SwapBuffers(_arg0);
|
||||
wxGLCanvas_SwapBuffers(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -601,7 +595,7 @@ static PyObject *_wrap_wxGLCanvas_GetContext(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxGLContext *)wxGLCanvas_GetContext(_arg0);
|
||||
_result = (wxGLContext *)wxGLCanvas_GetContext(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -650,7 +644,7 @@ static PyObject *_wrap_wxGLCanvas_SetupPixelFormat(PyObject *self, PyObject *arg
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLCanvas_SetupPixelFormat(_arg0,_arg1);
|
||||
wxGLCanvas_SetupPixelFormat(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -690,7 +684,7 @@ static PyObject *_wrap_wxGLCanvas_SetupPalette(PyObject *self, PyObject *args, P
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxGLCanvas_SetupPalette(_arg0,*_arg1);
|
||||
wxGLCanvas_SetupPalette(_arg0,*_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -720,7 +714,7 @@ static PyObject *_wrap_wxGLCanvas_CreateDefaultPalette(PyObject *self, PyObject
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = new wxPalette (wxGLCanvas_CreateDefaultPalette(_arg0));
|
||||
_result = new wxPalette (wxGLCanvas_CreateDefaultPalette(_arg0));
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -750,7 +744,7 @@ static PyObject *_wrap_wxGLCanvas_GetPalette(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxPalette *)wxGLCanvas_GetPalette(_arg0);
|
||||
_result = (wxPalette *)wxGLCanvas_GetPalette(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
|
@@ -85,12 +85,6 @@ static PyObject* t_output_helper(PyObject* target, PyObject* o) {
|
||||
return target;
|
||||
}
|
||||
|
||||
#if PYTHON_API_VERSION >= 1009
|
||||
static char* wxStringErrorMsg = "String or Unicode type required";
|
||||
#else
|
||||
static char* wxStringErrorMsg = "String type required";
|
||||
#endif
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
// This one will work for any class for the VERY generic cases, but beyond that
|
||||
// the helper needs to know more about the type.
|
||||
@@ -230,7 +224,7 @@ static PyObject *_wrap_wxOGLInitialize(PyObject *self, PyObject *args, PyObject
|
||||
return NULL;
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxOGLInitialize();
|
||||
wxOGLInitialize();
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -248,7 +242,7 @@ static PyObject *_wrap_wxOGLCleanUp(PyObject *self, PyObject *args, PyObject *kw
|
||||
return NULL;
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxOGLCleanUp();
|
||||
wxOGLCleanUp();
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
|
@@ -85,12 +85,6 @@ static PyObject* t_output_helper(PyObject* target, PyObject* o) {
|
||||
return target;
|
||||
}
|
||||
|
||||
#if PYTHON_API_VERSION >= 1009
|
||||
static char* wxStringErrorMsg = "String or Unicode type required";
|
||||
#else
|
||||
static char* wxStringErrorMsg = "String type required";
|
||||
#endif
|
||||
|
||||
IMP_PYCALLBACK__2DBLINT(wxPyShapeCanvas, wxShapeCanvas, OnBeginDragLeft);
|
||||
IMP_PYCALLBACK__2DBLINT(wxPyShapeCanvas, wxShapeCanvas, OnBeginDragRight);
|
||||
IMP_PYCALLBACK__2DBLINT(wxPyShapeCanvas, wxShapeCanvas, OnEndDragLeft);
|
||||
@@ -122,7 +116,7 @@ static PyObject *_wrap_new_wxDiagram(PyObject *self, PyObject *args, PyObject *k
|
||||
return NULL;
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxDiagram *)new_wxDiagram();
|
||||
_result = (wxDiagram *)new_wxDiagram();
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -173,7 +167,7 @@ static PyObject *_wrap_wxDiagram_AddShape(PyObject *self, PyObject *args, PyObje
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_AddShape(_arg0,_arg1,_arg2);
|
||||
wxDiagram_AddShape(_arg0,_arg1,_arg2);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -210,7 +204,7 @@ static PyObject *_wrap_wxDiagram_Clear(PyObject *self, PyObject *args, PyObject
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_Clear(_arg0,*_arg1);
|
||||
wxDiagram_Clear(_arg0,*_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -238,7 +232,7 @@ static PyObject *_wrap_wxDiagram_DeleteAllShapes(PyObject *self, PyObject *args,
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_DeleteAllShapes(_arg0);
|
||||
wxDiagram_DeleteAllShapes(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -279,7 +273,7 @@ static PyObject *_wrap_wxDiagram_DrawOutline(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_DrawOutline(_arg0,*_arg1,_arg2,_arg3,_arg4,_arg5);
|
||||
wxDiagram_DrawOutline(_arg0,*_arg1,_arg2,_arg3,_arg4,_arg5);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -309,7 +303,7 @@ static PyObject *_wrap_wxDiagram_FindShape(PyObject *self, PyObject *args, PyObj
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxPyShape *)wxDiagram_FindShape(_arg0,_arg1);
|
||||
_result = (wxPyShape *)wxDiagram_FindShape(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -337,7 +331,7 @@ static PyObject *_wrap_wxDiagram_GetCanvas(PyObject *self, PyObject *args, PyObj
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxPyShapeCanvas *)wxDiagram_GetCanvas(_arg0);
|
||||
_result = (wxPyShapeCanvas *)wxDiagram_GetCanvas(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -365,7 +359,7 @@ static PyObject *_wrap_wxDiagram_GetCount(PyObject *self, PyObject *args, PyObje
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (int )wxDiagram_GetCount(_arg0);
|
||||
_result = (int )wxDiagram_GetCount(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -393,7 +387,7 @@ static PyObject *_wrap_wxDiagram_GetGridSpacing(PyObject *self, PyObject *args,
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (double )wxDiagram_GetGridSpacing(_arg0);
|
||||
_result = (double )wxDiagram_GetGridSpacing(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -421,7 +415,7 @@ static PyObject *_wrap_wxDiagram_GetMouseTolerance(PyObject *self, PyObject *arg
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (int )wxDiagram_GetMouseTolerance(_arg0);
|
||||
_result = (int )wxDiagram_GetMouseTolerance(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -452,7 +446,7 @@ static PyObject *_wrap_wxDiagram_GetShapeList(PyObject *self, PyObject *args, Py
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (PyObject *)wxDiagram_GetShapeList(_arg0);
|
||||
_result = (PyObject *)wxDiagram_GetShapeList(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -482,7 +476,7 @@ static PyObject *_wrap_wxDiagram_GetQuickEditMode(PyObject *self, PyObject *args
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (bool )wxDiagram_GetQuickEditMode(_arg0);
|
||||
_result = (bool )wxDiagram_GetQuickEditMode(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -510,7 +504,7 @@ static PyObject *_wrap_wxDiagram_GetSnapToGrid(PyObject *self, PyObject *args, P
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (bool )wxDiagram_GetSnapToGrid(_arg0);
|
||||
_result = (bool )wxDiagram_GetSnapToGrid(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -546,7 +540,7 @@ static PyObject *_wrap_wxDiagram_InsertShape(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_InsertShape(_arg0,_arg1);
|
||||
wxDiagram_InsertShape(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -576,26 +570,13 @@ static PyObject *_wrap_wxDiagram_LoadFile(PyObject *self, PyObject *args, PyObje
|
||||
}
|
||||
}
|
||||
{
|
||||
#if PYTHON_API_VERSION >= 1009
|
||||
char* tmpPtr; int tmpSize;
|
||||
if (!PyString_Check(_obj1) && !PyUnicode_Check(_obj1)) {
|
||||
PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
|
||||
_arg1 = wxString_in_helper(_obj1);
|
||||
if (_arg1 == NULL)
|
||||
return NULL;
|
||||
}
|
||||
if (PyString_AsStringAndSize(_obj1, &tmpPtr, &tmpSize) == -1)
|
||||
return NULL;
|
||||
_arg1 = new wxString(tmpPtr, tmpSize);
|
||||
#else
|
||||
if (!PyString_Check(_obj1)) {
|
||||
PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
|
||||
return NULL;
|
||||
}
|
||||
_arg1 = new wxString(PyString_AS_STRING(_obj1), PyString_GET_SIZE(_obj1));
|
||||
#endif
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (bool )wxDiagram_LoadFile(_arg0,*_arg1);
|
||||
_result = (bool )wxDiagram_LoadFile(_arg0,*_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -635,7 +616,7 @@ static PyObject *_wrap_wxDiagram_ReadContainerGeometry(PyObject *self, PyObject
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_ReadContainerGeometry(_arg0,*_arg1);
|
||||
wxDiagram_ReadContainerGeometry(_arg0,*_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -672,7 +653,7 @@ static PyObject *_wrap_wxDiagram_ReadLines(PyObject *self, PyObject *args, PyObj
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_ReadLines(_arg0,*_arg1);
|
||||
wxDiagram_ReadLines(_arg0,*_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -709,7 +690,7 @@ static PyObject *_wrap_wxDiagram_ReadNodes(PyObject *self, PyObject *args, PyObj
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_ReadNodes(_arg0,*_arg1);
|
||||
wxDiagram_ReadNodes(_arg0,*_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -746,7 +727,7 @@ static PyObject *_wrap_wxDiagram_RecentreAll(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_RecentreAll(_arg0,*_arg1);
|
||||
wxDiagram_RecentreAll(_arg0,*_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -783,7 +764,7 @@ static PyObject *_wrap_wxDiagram_Redraw(PyObject *self, PyObject *args, PyObject
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_Redraw(_arg0,*_arg1);
|
||||
wxDiagram_Redraw(_arg0,*_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -811,7 +792,7 @@ static PyObject *_wrap_wxDiagram_RemoveAllShapes(PyObject *self, PyObject *args,
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_RemoveAllShapes(_arg0);
|
||||
wxDiagram_RemoveAllShapes(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -848,7 +829,7 @@ static PyObject *_wrap_wxDiagram_RemoveShape(PyObject *self, PyObject *args, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_RemoveShape(_arg0,_arg1);
|
||||
wxDiagram_RemoveShape(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -878,26 +859,13 @@ static PyObject *_wrap_wxDiagram_SaveFile(PyObject *self, PyObject *args, PyObje
|
||||
}
|
||||
}
|
||||
{
|
||||
#if PYTHON_API_VERSION >= 1009
|
||||
char* tmpPtr; int tmpSize;
|
||||
if (!PyString_Check(_obj1) && !PyUnicode_Check(_obj1)) {
|
||||
PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
|
||||
_arg1 = wxString_in_helper(_obj1);
|
||||
if (_arg1 == NULL)
|
||||
return NULL;
|
||||
}
|
||||
if (PyString_AsStringAndSize(_obj1, &tmpPtr, &tmpSize) == -1)
|
||||
return NULL;
|
||||
_arg1 = new wxString(tmpPtr, tmpSize);
|
||||
#else
|
||||
if (!PyString_Check(_obj1)) {
|
||||
PyErr_SetString(PyExc_TypeError, wxStringErrorMsg);
|
||||
return NULL;
|
||||
}
|
||||
_arg1 = new wxString(PyString_AS_STRING(_obj1), PyString_GET_SIZE(_obj1));
|
||||
#endif
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (bool )wxDiagram_SaveFile(_arg0,*_arg1);
|
||||
_result = (bool )wxDiagram_SaveFile(_arg0,*_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -937,7 +905,7 @@ static PyObject *_wrap_wxDiagram_SetCanvas(PyObject *self, PyObject *args, PyObj
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_SetCanvas(_arg0,_arg1);
|
||||
wxDiagram_SetCanvas(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -966,7 +934,7 @@ static PyObject *_wrap_wxDiagram_SetGridSpacing(PyObject *self, PyObject *args,
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_SetGridSpacing(_arg0,_arg1);
|
||||
wxDiagram_SetGridSpacing(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -995,7 +963,7 @@ static PyObject *_wrap_wxDiagram_SetMouseTolerance(PyObject *self, PyObject *arg
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_SetMouseTolerance(_arg0,_arg1);
|
||||
wxDiagram_SetMouseTolerance(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1026,7 +994,7 @@ static PyObject *_wrap_wxDiagram_SetQuickEditMode(PyObject *self, PyObject *args
|
||||
_arg1 = (bool ) tempbool1;
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_SetQuickEditMode(_arg0,_arg1);
|
||||
wxDiagram_SetQuickEditMode(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1057,7 +1025,7 @@ static PyObject *_wrap_wxDiagram_SetSnapToGrid(PyObject *self, PyObject *args, P
|
||||
_arg1 = (bool ) tempbool1;
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_SetSnapToGrid(_arg0,_arg1);
|
||||
wxDiagram_SetSnapToGrid(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1088,7 +1056,7 @@ static PyObject *_wrap_wxDiagram_ShowAll(PyObject *self, PyObject *args, PyObjec
|
||||
_arg1 = (bool ) tempbool1;
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_ShowAll(_arg0,_arg1);
|
||||
wxDiagram_ShowAll(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1130,7 +1098,7 @@ static PyObject *_wrap_wxDiagram_Snap(PyObject *self, PyObject *args, PyObject *
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxDiagram_Snap(_arg0,_arg1,_arg2);
|
||||
wxDiagram_Snap(_arg0,_arg1,_arg2);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1230,7 +1198,7 @@ static PyObject *_wrap_new_wxPyShapeCanvas(PyObject *self, PyObject *args, PyObj
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxPyShapeCanvas *)new_wxPyShapeCanvas(_arg0,_arg1,*_arg2,*_arg3,_arg4);
|
||||
_result = (wxPyShapeCanvas *)new_wxPyShapeCanvas(_arg0,_arg1,*_arg2,*_arg3,_arg4);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1273,7 +1241,7 @@ static PyObject *_wrap_wxPyShapeCanvas__setCallbackInfo(PyObject *self, PyObject
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxPyShapeCanvas__setCallbackInfo(_arg0,_arg1,_arg2);
|
||||
wxPyShapeCanvas__setCallbackInfo(_arg0,_arg1,_arg2);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1319,7 +1287,7 @@ static PyObject *_wrap_wxPyShapeCanvas_AddShape(PyObject *self, PyObject *args,
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxPyShapeCanvas_AddShape(_arg0,_arg1,_arg2);
|
||||
wxPyShapeCanvas_AddShape(_arg0,_arg1,_arg2);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1373,7 +1341,7 @@ static PyObject *_wrap_wxPyShapeCanvas_FindShape(PyObject *self, PyObject *args,
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxPyShape *)wxPyShapeCanvas_FindShape(_arg0,_arg1,_arg2,_arg3,_arg4,_arg5);
|
||||
_result = (wxPyShape *)wxPyShapeCanvas_FindShape(_arg0,_arg1,_arg2,_arg3,_arg4,_arg5);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1414,7 +1382,7 @@ static PyObject *_wrap_wxPyShapeCanvas_FindFirstSensitiveShape(PyObject *self, P
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxPyShape *)wxPyShapeCanvas_FindFirstSensitiveShape(_arg0,_arg1,_arg2,_arg3,_arg4);
|
||||
_result = (wxPyShape *)wxPyShapeCanvas_FindFirstSensitiveShape(_arg0,_arg1,_arg2,_arg3,_arg4);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1447,7 +1415,7 @@ static PyObject *_wrap_wxPyShapeCanvas_GetDiagram(PyObject *self, PyObject *args
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (wxDiagram *)wxPyShapeCanvas_GetDiagram(_arg0);
|
||||
_result = (wxDiagram *)wxPyShapeCanvas_GetDiagram(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1475,7 +1443,7 @@ static PyObject *_wrap_wxPyShapeCanvas_GetQuickEditMode(PyObject *self, PyObject
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
_result = (bool )wxPyShapeCanvas_GetQuickEditMode(_arg0);
|
||||
_result = (bool )wxPyShapeCanvas_GetQuickEditMode(_arg0);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1511,7 +1479,7 @@ static PyObject *_wrap_wxPyShapeCanvas_InsertShape(PyObject *self, PyObject *arg
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxPyShapeCanvas_InsertShape(_arg0,_arg1);
|
||||
wxPyShapeCanvas_InsertShape(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1542,7 +1510,7 @@ static PyObject *_wrap_wxPyShapeCanvas_base_OnBeginDragLeft(PyObject *self, PyOb
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxPyShapeCanvas_base_OnBeginDragLeft(_arg0,_arg1,_arg2,_arg3);
|
||||
wxPyShapeCanvas_base_OnBeginDragLeft(_arg0,_arg1,_arg2,_arg3);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1573,7 +1541,7 @@ static PyObject *_wrap_wxPyShapeCanvas_base_OnBeginDragRight(PyObject *self, PyO
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxPyShapeCanvas_base_OnBeginDragRight(_arg0,_arg1,_arg2,_arg3);
|
||||
wxPyShapeCanvas_base_OnBeginDragRight(_arg0,_arg1,_arg2,_arg3);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1604,7 +1572,7 @@ static PyObject *_wrap_wxPyShapeCanvas_base_OnEndDragLeft(PyObject *self, PyObje
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxPyShapeCanvas_base_OnEndDragLeft(_arg0,_arg1,_arg2,_arg3);
|
||||
wxPyShapeCanvas_base_OnEndDragLeft(_arg0,_arg1,_arg2,_arg3);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1635,7 +1603,7 @@ static PyObject *_wrap_wxPyShapeCanvas_base_OnEndDragRight(PyObject *self, PyObj
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxPyShapeCanvas_base_OnEndDragRight(_arg0,_arg1,_arg2,_arg3);
|
||||
wxPyShapeCanvas_base_OnEndDragRight(_arg0,_arg1,_arg2,_arg3);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1669,7 +1637,7 @@ static PyObject *_wrap_wxPyShapeCanvas_base_OnDragLeft(PyObject *self, PyObject
|
||||
_arg1 = (bool ) tempbool1;
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxPyShapeCanvas_base_OnDragLeft(_arg0,_arg1,_arg2,_arg3,_arg4);
|
||||
wxPyShapeCanvas_base_OnDragLeft(_arg0,_arg1,_arg2,_arg3,_arg4);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1703,7 +1671,7 @@ static PyObject *_wrap_wxPyShapeCanvas_base_OnDragRight(PyObject *self, PyObject
|
||||
_arg1 = (bool ) tempbool1;
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxPyShapeCanvas_base_OnDragRight(_arg0,_arg1,_arg2,_arg3,_arg4);
|
||||
wxPyShapeCanvas_base_OnDragRight(_arg0,_arg1,_arg2,_arg3,_arg4);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1734,7 +1702,7 @@ static PyObject *_wrap_wxPyShapeCanvas_base_OnLeftClick(PyObject *self, PyObject
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxPyShapeCanvas_base_OnLeftClick(_arg0,_arg1,_arg2,_arg3);
|
||||
wxPyShapeCanvas_base_OnLeftClick(_arg0,_arg1,_arg2,_arg3);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1765,7 +1733,7 @@ static PyObject *_wrap_wxPyShapeCanvas_base_OnRightClick(PyObject *self, PyObjec
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxPyShapeCanvas_base_OnRightClick(_arg0,_arg1,_arg2,_arg3);
|
||||
wxPyShapeCanvas_base_OnRightClick(_arg0,_arg1,_arg2,_arg3);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1802,7 +1770,7 @@ static PyObject *_wrap_wxPyShapeCanvas_Redraw(PyObject *self, PyObject *args, Py
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxPyShapeCanvas_Redraw(_arg0,*_arg1);
|
||||
wxPyShapeCanvas_Redraw(_arg0,*_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1839,7 +1807,7 @@ static PyObject *_wrap_wxPyShapeCanvas_RemoveShape(PyObject *self, PyObject *arg
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxPyShapeCanvas_RemoveShape(_arg0,_arg1);
|
||||
wxPyShapeCanvas_RemoveShape(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1876,7 +1844,7 @@ static PyObject *_wrap_wxPyShapeCanvas_SetDiagram(PyObject *self, PyObject *args
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxPyShapeCanvas_SetDiagram(_arg0,_arg1);
|
||||
wxPyShapeCanvas_SetDiagram(_arg0,_arg1);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
@@ -1918,7 +1886,7 @@ static PyObject *_wrap_wxPyShapeCanvas_Snap(PyObject *self, PyObject *args, PyOb
|
||||
}
|
||||
{
|
||||
PyThreadState* __tstate = wxPyBeginAllowThreads();
|
||||
wxPyShapeCanvas_Snap(_arg0,_arg1,_arg2);
|
||||
wxPyShapeCanvas_Snap(_arg0,_arg1,_arg2);
|
||||
|
||||
wxPyEndAllowThreads(__tstate);
|
||||
if (PyErr_Occurred()) return NULL;
|
||||
|