HelpGen is a prototype of the tool for automatic generation of the .tex files

for wxWindows documentation from C++ headers


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1347 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 1999-01-08 17:46:08 +00:00
parent cde9f08e1f
commit cecfc5e7e5
21 changed files with 10005 additions and 0 deletions

737
utils/HelpGen/Makefile Normal file
View File

@ -0,0 +1,737 @@
##############################################################################
# Name: Makefile
# Purpose: Unix makefile for helpgen project
# Author: Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
# Modified by:
# Created: 06/01/99
# RCS-ID: $Id$
# Copyright: (c) 1999 VZ
# Licence: GPL
##############################################################################
# vi: set tw=0 noet ts=8 sw=8:
.SUFFIXES: .cpp
##############################################################################
# variables
##############################################################################
PROG = HelpGen
SRCS = src/cjparser.cpp\
src/markup.cpp\
src/scriptbinder.cpp\
src/srcparser.cpp\
src/ifcontext.cpp\
src/HelpGen.cpp\
src/sourcepainter.cpp\
src/wx/string.cpp\
src/wx_extra_imps.cpp\
src/wx/object.cpp\
src/wx/hash.cpp\
src/wx/log.cpp\
src/wx/file.cpp\
src/wx/list.cpp
OBJS = obj/cjparser.o\
obj/markup.o\
obj/scriptbinder.o\
obj/srcparser.o\
obj/ifcontext.o\
obj/HelpGen.o\
obj/sourcepainter.o\
obj/wx/string.o\
obj/wx_extra_imps.o\
obj/wx/object.o\
obj/wx/hash.o\
obj/wx/log.o\
obj/wx/file.o\
obj/wx/list.o
# tested with egcs 1.1.1 (add more compilers here)
CC = g++
DEFINES = -DwxUSE_NOGUI=1 -D__UNIX__ -D__WXGTK__ -DHAVE_VSNPRINTF
# this might not work with some versions of gcc - try just -g then
DEBUG = -ggdb
INCLUDE = -I./include
CPPFLAGS = $(INCLUDE) $(DEFINES) $(DEBUG) -c -Wall
##############################################################################
# rules
##############################################################################
# building the program
obj/%.o: src/%.cpp
$(CC) $(CPPFLAGS) -o $@ $<
all: links $(PROG)
$(PROG) : $(OBJS)
$(CC) -o $(PROG) $(DEBUG) -Wall $(OBJS)
# create the links
links: include/wx src/wx
ln -sf ../../include/wx include/wx
ln -sf ../../src/common src/wx
# this requires exuberant ctags version 2.x or later
ctags: tags
ctags -i mCF --lang=c++ include/*.h src/*.cpp
depend:
makedepend $(INCLUDE) $(DEFINES) -I/usr/include/g++ -I/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include $(SRCS)
clean:
rm -f $(OBJS) $(PROG) core
# DO NOT DELETE
src/cjparser.o: ./include/wx/wxprec.h ./include/wx/wx.h
src/cjparser.o: ./include/wx/wx/setup.h ./include/wx/wx/wx/gtk/setup.h
src/cjparser.o: ./include/wx/wx/defs.h
src/cjparser.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stddef.h
src/cjparser.o: ./include/wx/wx/wx/version.h ./include/wx/wx/string.h
src/cjparser.o: /usr/include/string.h /usr/include/features.h
src/cjparser.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
src/cjparser.o: /usr/include/stdio.h /usr/include/libio.h
src/cjparser.o: /usr/include/_G_config.h /usr/include/gnu/types.h
src/cjparser.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stdarg.h
src/cjparser.o: /usr/include/stdio_lim.h
src/cjparser.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/limits.h
src/cjparser.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/syslimits.h
src/cjparser.o: /usr/include/stdlib.h /usr/include/sys/types.h
src/cjparser.o: /usr/include/time.h /usr/include/endian.h
src/cjparser.o: /usr/include/bytesex.h /usr/include/sys/select.h
src/cjparser.o: /usr/include/selectbits.h /usr/include/alloca.h
src/cjparser.o: ./include/wx/wx/wx/debug.h /usr/include/assert.h
src/cjparser.o: /usr/include/g++/iostream.h /usr/include/g++/streambuf.h
src/cjparser.o: ./include/wx/wx/log.h ./include/wx/wx/window.h
src/cjparser.o: ./include/wx/wx/wx/gtk/window.h ./include/wx/object.h
src/cjparser.o: ./include/wx/wx/memory.h ./include/wx/list.h
src/cjparser.o: ./include/wx/event.h ./include/wx/wx/gdicmn.h
src/cjparser.o: ./include/wx/wx/wx/hash.h ./include/wx/wx/wx/colour.h
src/cjparser.o: ./include/wx/wx/wx/wx/gtk/colour.h ./include/wx/gdiobj.h
src/cjparser.o: ./include/wx/wx/gtk/gdiobj.h ./include/wx/palette.h
src/cjparser.o: ./include/wx/wx/gtk/palette.h ./include/wx/validate.h
src/cjparser.o: ./include/wx/cursor.h ./include/wx/wx/gtk/cursor.h
src/cjparser.o: ./include/wx/font.h ./include/wx/wx/gtk/font.h
src/cjparser.o: ./include/wx/region.h ./include/wx/wx/gtk/region.h
src/cjparser.o: ./include/wx/accel.h ./include/wx/wx/gtk/accel.h
src/cjparser.o: ./include/wx/wx/panel.h ./include/wx/wx/wx/generic/panelg.h
src/cjparser.o: ./include/wx/wx/frame.h ./include/wx/wx/wx/gtk/frame.h
src/cjparser.o: ./include/wx/icon.h ./include/wx/wx/dc.h
src/cjparser.o: ./include/wx/wx/wx/gtk/dc.h ./include/wx/pen.h
src/cjparser.o: ./include/wx/wx/gtk/pen.h ./include/wx/brush.h
src/cjparser.o: ./include/wx/wx/gtk/brush.h ./include/wx/bitmap.h
src/cjparser.o: ./include/wx/wx/gtk/bitmap.h ./include/wx/wx/dcclient.h
src/cjparser.o: ./include/wx/wx/wx/gtk/dcclient.h ./include/wx/wx/dcmemory.h
src/cjparser.o: ./include/wx/wx/wx/gtk/dcmemory.h ./include/wx/wx/dcprint.h
src/cjparser.o: ./include/wx/wx/dcscreen.h ./include/wx/wx/wx/gtk/dcscreen.h
src/cjparser.o: ./include/wx/wx/button.h ./include/wx/wx/wx/gtk/button.h
src/cjparser.o: ./include/wx/control.h ./include/wx/wx/gtk/control.h
src/cjparser.o: ./include/wx/wx/bmpbuttn.h ./include/wx/wx/wx/gtk/bmpbuttn.h
src/cjparser.o: ./include/wx/wx/checkbox.h ./include/wx/wx/wx/gtk/checkbox.h
src/cjparser.o: ./include/wx/wx/choice.h ./include/wx/wx/wx/gtk/choice.h
src/cjparser.o: ./include/wx/wx/scrolbar.h ./include/wx/wx/wx/gtk/scrolbar.h
src/cjparser.o: ./include/wx/wx/stattext.h ./include/wx/wx/wx/gtk/stattext.h
src/cjparser.o: ./include/wx/wx/statbmp.h ./include/wx/wx/wx/gtk/statbmp.h
src/cjparser.o: ./include/wx/wx/statbox.h ./include/wx/wx/wx/gtk/statbox.h
src/cjparser.o: ./include/wx/wx/listbox.h ./include/wx/wx/wx/gtk/listbox.h
src/cjparser.o: ./include/wx/wx/radiobox.h ./include/wx/wx/wx/gtk/radiobox.h
src/cjparser.o: ./include/wx/wx/radiobut.h ./include/wx/wx/wx/gtk/radiobut.h
src/cjparser.o: ./include/wx/wx/textctrl.h ./include/wx/wx/wx/gtk/textctrl.h
src/cjparser.o: ./include/wx/wx/slider.h ./include/wx/wx/wx/gtk/slider.h
src/cjparser.o: ./include/wx/wx/gauge.h ./include/wx/wx/wx/gtk/gauge.h
src/cjparser.o: ./include/wx/wx/combobox.h ./include/wx/wx/wx/gtk/combobox.h
src/cjparser.o: ./include/wx/wx/menu.h ./include/wx/wx/wx/gtk/menu.h
src/cjparser.o: ./include/wx/menuitem.h ./include/wx/wx/gtk/menuitem.h
src/cjparser.o: ./include/wx/wx/app.h ./include/wx/wx/wx/gtk/app.h
src/cjparser.o: ./include/wx/wx/dialog.h ./include/wx/wx/wx/gtk/dialog.h
src/cjparser.o: ./include/wx/wx/timer.h ./include/wx/wx/wx/gtk/timer.h
src/cjparser.o: ./include/wx/wx/utils.h ./include/wx/wx/wx/filefn.h
src/cjparser.o: ./include/wx/wx/wx/process.h ./include/wx/wx/settings.h
src/cjparser.o: ./include/wx/wx/wx/gtk/settings.h ./include/wx/wx/layout.h
src/cjparser.o: ./include/wx/wx/mdi.h ./include/wx/wx/wx/gtk/mdi.h
src/cjparser.o: ./include/wx/toolbar.h ./include/wx/wx/gtk/tbargtk.h
src/cjparser.o: ./include/wx/wx/scrolwin.h
src/cjparser.o: ./include/wx/wx/wx/generic/scrolwin.h
src/cjparser.o: ./include/wx/wx/statusbr.h
src/cjparser.o: ./include/wx/wx/wx/generic/statusbr.h
src/cjparser.o: ./include/wx/wx/msgdlg.h ./include/wx/wx/wx/generic/msgdlgg.h
src/cjparser.o: ./include/wx/wx/choicdlg.h
src/cjparser.o: ./include/wx/wx/wx/generic/choicdgg.h
src/cjparser.o: ./include/wx/wx/textdlg.h
src/cjparser.o: ./include/wx/wx/wx/generic/textdlgg.h
src/cjparser.o: ./include/wx/wx/filedlg.h ./include/wx/wx/wx/gtk/filedlg.h
src/cjparser.o: ./include/wx/wx/dirdlg.h ./include/wx/wx/wx/generic/dirdlgg.h
src/cjparser.o: ./include/wx/treectrl.h ./include/wx/wx/generic/treectrl.h
src/cjparser.o: ./include/wx/wx/cmndata.h ./include/wx/wx/intl.h
src/cjparser.o: ./include/wx/wx/valtext.h ./include/cjparser.h
src/cjparser.o: ./include/srcparser.h ./include/markup.h
src/cjparser.o: /usr/include/memory.h
src/markup.o: ./include/wx/wxprec.h ./include/wx/wx.h ./include/wx/wx/setup.h
src/markup.o: ./include/wx/wx/wx/gtk/setup.h ./include/wx/wx/defs.h
src/markup.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stddef.h
src/markup.o: ./include/wx/wx/wx/version.h ./include/wx/wx/string.h
src/markup.o: /usr/include/string.h /usr/include/features.h
src/markup.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
src/markup.o: /usr/include/stdio.h /usr/include/libio.h
src/markup.o: /usr/include/_G_config.h /usr/include/gnu/types.h
src/markup.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stdarg.h
src/markup.o: /usr/include/stdio_lim.h
src/markup.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/limits.h
src/markup.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/syslimits.h
src/markup.o: /usr/include/stdlib.h /usr/include/sys/types.h
src/markup.o: /usr/include/time.h /usr/include/endian.h
src/markup.o: /usr/include/bytesex.h /usr/include/sys/select.h
src/markup.o: /usr/include/selectbits.h /usr/include/alloca.h
src/markup.o: ./include/wx/wx/wx/debug.h /usr/include/assert.h
src/markup.o: /usr/include/g++/iostream.h /usr/include/g++/streambuf.h
src/markup.o: ./include/wx/wx/log.h ./include/wx/wx/window.h
src/markup.o: ./include/wx/wx/wx/gtk/window.h ./include/wx/object.h
src/markup.o: ./include/wx/wx/memory.h ./include/wx/list.h
src/markup.o: ./include/wx/event.h ./include/wx/wx/gdicmn.h
src/markup.o: ./include/wx/wx/wx/hash.h ./include/wx/wx/wx/colour.h
src/markup.o: ./include/wx/wx/wx/wx/gtk/colour.h ./include/wx/gdiobj.h
src/markup.o: ./include/wx/wx/gtk/gdiobj.h ./include/wx/palette.h
src/markup.o: ./include/wx/wx/gtk/palette.h ./include/wx/validate.h
src/markup.o: ./include/wx/cursor.h ./include/wx/wx/gtk/cursor.h
src/markup.o: ./include/wx/font.h ./include/wx/wx/gtk/font.h
src/markup.o: ./include/wx/region.h ./include/wx/wx/gtk/region.h
src/markup.o: ./include/wx/accel.h ./include/wx/wx/gtk/accel.h
src/markup.o: ./include/wx/wx/panel.h ./include/wx/wx/wx/generic/panelg.h
src/markup.o: ./include/wx/wx/frame.h ./include/wx/wx/wx/gtk/frame.h
src/markup.o: ./include/wx/icon.h ./include/wx/wx/dc.h
src/markup.o: ./include/wx/wx/wx/gtk/dc.h ./include/wx/pen.h
src/markup.o: ./include/wx/wx/gtk/pen.h ./include/wx/brush.h
src/markup.o: ./include/wx/wx/gtk/brush.h ./include/wx/bitmap.h
src/markup.o: ./include/wx/wx/gtk/bitmap.h ./include/wx/wx/dcclient.h
src/markup.o: ./include/wx/wx/wx/gtk/dcclient.h ./include/wx/wx/dcmemory.h
src/markup.o: ./include/wx/wx/wx/gtk/dcmemory.h ./include/wx/wx/dcprint.h
src/markup.o: ./include/wx/wx/dcscreen.h ./include/wx/wx/wx/gtk/dcscreen.h
src/markup.o: ./include/wx/wx/button.h ./include/wx/wx/wx/gtk/button.h
src/markup.o: ./include/wx/control.h ./include/wx/wx/gtk/control.h
src/markup.o: ./include/wx/wx/bmpbuttn.h ./include/wx/wx/wx/gtk/bmpbuttn.h
src/markup.o: ./include/wx/wx/checkbox.h ./include/wx/wx/wx/gtk/checkbox.h
src/markup.o: ./include/wx/wx/choice.h ./include/wx/wx/wx/gtk/choice.h
src/markup.o: ./include/wx/wx/scrolbar.h ./include/wx/wx/wx/gtk/scrolbar.h
src/markup.o: ./include/wx/wx/stattext.h ./include/wx/wx/wx/gtk/stattext.h
src/markup.o: ./include/wx/wx/statbmp.h ./include/wx/wx/wx/gtk/statbmp.h
src/markup.o: ./include/wx/wx/statbox.h ./include/wx/wx/wx/gtk/statbox.h
src/markup.o: ./include/wx/wx/listbox.h ./include/wx/wx/wx/gtk/listbox.h
src/markup.o: ./include/wx/wx/radiobox.h ./include/wx/wx/wx/gtk/radiobox.h
src/markup.o: ./include/wx/wx/radiobut.h ./include/wx/wx/wx/gtk/radiobut.h
src/markup.o: ./include/wx/wx/textctrl.h ./include/wx/wx/wx/gtk/textctrl.h
src/markup.o: ./include/wx/wx/slider.h ./include/wx/wx/wx/gtk/slider.h
src/markup.o: ./include/wx/wx/gauge.h ./include/wx/wx/wx/gtk/gauge.h
src/markup.o: ./include/wx/wx/combobox.h ./include/wx/wx/wx/gtk/combobox.h
src/markup.o: ./include/wx/wx/menu.h ./include/wx/wx/wx/gtk/menu.h
src/markup.o: ./include/wx/menuitem.h ./include/wx/wx/gtk/menuitem.h
src/markup.o: ./include/wx/wx/app.h ./include/wx/wx/wx/gtk/app.h
src/markup.o: ./include/wx/wx/dialog.h ./include/wx/wx/wx/gtk/dialog.h
src/markup.o: ./include/wx/wx/timer.h ./include/wx/wx/wx/gtk/timer.h
src/markup.o: ./include/wx/wx/utils.h ./include/wx/wx/wx/filefn.h
src/markup.o: ./include/wx/wx/wx/process.h ./include/wx/wx/settings.h
src/markup.o: ./include/wx/wx/wx/gtk/settings.h ./include/wx/wx/layout.h
src/markup.o: ./include/wx/wx/mdi.h ./include/wx/wx/wx/gtk/mdi.h
src/markup.o: ./include/wx/toolbar.h ./include/wx/wx/gtk/tbargtk.h
src/markup.o: ./include/wx/wx/scrolwin.h
src/markup.o: ./include/wx/wx/wx/generic/scrolwin.h
src/markup.o: ./include/wx/wx/statusbr.h
src/markup.o: ./include/wx/wx/wx/generic/statusbr.h ./include/wx/wx/msgdlg.h
src/markup.o: ./include/wx/wx/wx/generic/msgdlgg.h ./include/wx/wx/choicdlg.h
src/markup.o: ./include/wx/wx/wx/generic/choicdgg.h ./include/wx/wx/textdlg.h
src/markup.o: ./include/wx/wx/wx/generic/textdlgg.h ./include/wx/wx/filedlg.h
src/markup.o: ./include/wx/wx/wx/gtk/filedlg.h ./include/wx/wx/dirdlg.h
src/markup.o: ./include/wx/wx/wx/generic/dirdlgg.h ./include/wx/treectrl.h
src/markup.o: ./include/wx/wx/generic/treectrl.h ./include/wx/wx/cmndata.h
src/markup.o: ./include/wx/wx/intl.h ./include/wx/wx/valtext.h
src/markup.o: ./include/markup.h
src/scriptbinder.o: ./include/wx/wxprec.h ./include/wx/wx.h
src/scriptbinder.o: ./include/wx/wx/setup.h ./include/wx/wx/wx/gtk/setup.h
src/scriptbinder.o: ./include/wx/wx/defs.h
src/scriptbinder.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stddef.h
src/scriptbinder.o: ./include/wx/wx/wx/version.h ./include/wx/wx/string.h
src/scriptbinder.o: /usr/include/string.h /usr/include/features.h
src/scriptbinder.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
src/scriptbinder.o: /usr/include/stdio.h /usr/include/libio.h
src/scriptbinder.o: /usr/include/_G_config.h /usr/include/gnu/types.h
src/scriptbinder.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stdarg.h
src/scriptbinder.o: /usr/include/stdio_lim.h
src/scriptbinder.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/limits.h
src/scriptbinder.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/syslimits.h
src/scriptbinder.o: /usr/include/stdlib.h /usr/include/sys/types.h
src/scriptbinder.o: /usr/include/time.h /usr/include/endian.h
src/scriptbinder.o: /usr/include/bytesex.h /usr/include/sys/select.h
src/scriptbinder.o: /usr/include/selectbits.h /usr/include/alloca.h
src/scriptbinder.o: ./include/wx/wx/wx/debug.h /usr/include/assert.h
src/scriptbinder.o: /usr/include/g++/iostream.h /usr/include/g++/streambuf.h
src/scriptbinder.o: ./include/wx/wx/log.h ./include/wx/wx/window.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/window.h ./include/wx/object.h
src/scriptbinder.o: ./include/wx/wx/memory.h ./include/wx/list.h
src/scriptbinder.o: ./include/wx/event.h ./include/wx/wx/gdicmn.h
src/scriptbinder.o: ./include/wx/wx/wx/hash.h ./include/wx/wx/wx/colour.h
src/scriptbinder.o: ./include/wx/wx/wx/wx/gtk/colour.h ./include/wx/gdiobj.h
src/scriptbinder.o: ./include/wx/wx/gtk/gdiobj.h ./include/wx/palette.h
src/scriptbinder.o: ./include/wx/wx/gtk/palette.h ./include/wx/validate.h
src/scriptbinder.o: ./include/wx/cursor.h ./include/wx/wx/gtk/cursor.h
src/scriptbinder.o: ./include/wx/font.h ./include/wx/wx/gtk/font.h
src/scriptbinder.o: ./include/wx/region.h ./include/wx/wx/gtk/region.h
src/scriptbinder.o: ./include/wx/accel.h ./include/wx/wx/gtk/accel.h
src/scriptbinder.o: ./include/wx/wx/panel.h
src/scriptbinder.o: ./include/wx/wx/wx/generic/panelg.h
src/scriptbinder.o: ./include/wx/wx/frame.h ./include/wx/wx/wx/gtk/frame.h
src/scriptbinder.o: ./include/wx/icon.h ./include/wx/wx/dc.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/dc.h ./include/wx/pen.h
src/scriptbinder.o: ./include/wx/wx/gtk/pen.h ./include/wx/brush.h
src/scriptbinder.o: ./include/wx/wx/gtk/brush.h ./include/wx/bitmap.h
src/scriptbinder.o: ./include/wx/wx/gtk/bitmap.h ./include/wx/wx/dcclient.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/dcclient.h
src/scriptbinder.o: ./include/wx/wx/dcmemory.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/dcmemory.h
src/scriptbinder.o: ./include/wx/wx/dcprint.h ./include/wx/wx/dcscreen.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/dcscreen.h
src/scriptbinder.o: ./include/wx/wx/button.h ./include/wx/wx/wx/gtk/button.h
src/scriptbinder.o: ./include/wx/control.h ./include/wx/wx/gtk/control.h
src/scriptbinder.o: ./include/wx/wx/bmpbuttn.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/bmpbuttn.h
src/scriptbinder.o: ./include/wx/wx/checkbox.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/checkbox.h
src/scriptbinder.o: ./include/wx/wx/choice.h ./include/wx/wx/wx/gtk/choice.h
src/scriptbinder.o: ./include/wx/wx/scrolbar.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/scrolbar.h
src/scriptbinder.o: ./include/wx/wx/stattext.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/stattext.h
src/scriptbinder.o: ./include/wx/wx/statbmp.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/statbmp.h
src/scriptbinder.o: ./include/wx/wx/statbox.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/statbox.h
src/scriptbinder.o: ./include/wx/wx/listbox.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/listbox.h
src/scriptbinder.o: ./include/wx/wx/radiobox.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/radiobox.h
src/scriptbinder.o: ./include/wx/wx/radiobut.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/radiobut.h
src/scriptbinder.o: ./include/wx/wx/textctrl.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/textctrl.h
src/scriptbinder.o: ./include/wx/wx/slider.h ./include/wx/wx/wx/gtk/slider.h
src/scriptbinder.o: ./include/wx/wx/gauge.h ./include/wx/wx/wx/gtk/gauge.h
src/scriptbinder.o: ./include/wx/wx/combobox.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/combobox.h ./include/wx/wx/menu.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/menu.h ./include/wx/menuitem.h
src/scriptbinder.o: ./include/wx/wx/gtk/menuitem.h ./include/wx/wx/app.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/app.h ./include/wx/wx/dialog.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/dialog.h ./include/wx/wx/timer.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/timer.h ./include/wx/wx/utils.h
src/scriptbinder.o: ./include/wx/wx/wx/filefn.h ./include/wx/wx/wx/process.h
src/scriptbinder.o: ./include/wx/wx/settings.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/settings.h
src/scriptbinder.o: ./include/wx/wx/layout.h ./include/wx/wx/mdi.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/mdi.h ./include/wx/toolbar.h
src/scriptbinder.o: ./include/wx/wx/gtk/tbargtk.h ./include/wx/wx/scrolwin.h
src/scriptbinder.o: ./include/wx/wx/wx/generic/scrolwin.h
src/scriptbinder.o: ./include/wx/wx/statusbr.h
src/scriptbinder.o: ./include/wx/wx/wx/generic/statusbr.h
src/scriptbinder.o: ./include/wx/wx/msgdlg.h
src/scriptbinder.o: ./include/wx/wx/wx/generic/msgdlgg.h
src/scriptbinder.o: ./include/wx/wx/choicdlg.h
src/scriptbinder.o: ./include/wx/wx/wx/generic/choicdgg.h
src/scriptbinder.o: ./include/wx/wx/textdlg.h
src/scriptbinder.o: ./include/wx/wx/wx/generic/textdlgg.h
src/scriptbinder.o: ./include/wx/wx/filedlg.h
src/scriptbinder.o: ./include/wx/wx/wx/gtk/filedlg.h ./include/wx/wx/dirdlg.h
src/scriptbinder.o: ./include/wx/wx/wx/generic/dirdlgg.h
src/scriptbinder.o: ./include/wx/treectrl.h
src/scriptbinder.o: ./include/wx/wx/generic/treectrl.h
src/scriptbinder.o: ./include/wx/wx/cmndata.h ./include/wx/wx/intl.h
src/scriptbinder.o: ./include/wx/wx/valtext.h /usr/include/malloc.h
src/scriptbinder.o: /usr/include/memory.h ./include/scriptbinder.h
src/scriptbinder.o: ./include/markup.h
src/srcparser.o: ./include/wx/wxprec.h ./include/wx/wx.h
src/srcparser.o: ./include/wx/wx/setup.h ./include/wx/wx/wx/gtk/setup.h
src/srcparser.o: ./include/wx/wx/defs.h
src/srcparser.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stddef.h
src/srcparser.o: ./include/wx/wx/wx/version.h ./include/wx/wx/string.h
src/srcparser.o: /usr/include/string.h /usr/include/features.h
src/srcparser.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
src/srcparser.o: /usr/include/stdio.h /usr/include/libio.h
src/srcparser.o: /usr/include/_G_config.h /usr/include/gnu/types.h
src/srcparser.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stdarg.h
src/srcparser.o: /usr/include/stdio_lim.h
src/srcparser.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/limits.h
src/srcparser.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/syslimits.h
src/srcparser.o: /usr/include/stdlib.h /usr/include/sys/types.h
src/srcparser.o: /usr/include/time.h /usr/include/endian.h
src/srcparser.o: /usr/include/bytesex.h /usr/include/sys/select.h
src/srcparser.o: /usr/include/selectbits.h /usr/include/alloca.h
src/srcparser.o: ./include/wx/wx/wx/debug.h /usr/include/assert.h
src/srcparser.o: /usr/include/g++/iostream.h /usr/include/g++/streambuf.h
src/srcparser.o: ./include/wx/wx/log.h ./include/wx/wx/window.h
src/srcparser.o: ./include/wx/wx/wx/gtk/window.h ./include/wx/object.h
src/srcparser.o: ./include/wx/wx/memory.h ./include/wx/list.h
src/srcparser.o: ./include/wx/event.h ./include/wx/wx/gdicmn.h
src/srcparser.o: ./include/wx/wx/wx/hash.h ./include/wx/wx/wx/colour.h
src/srcparser.o: ./include/wx/wx/wx/wx/gtk/colour.h ./include/wx/gdiobj.h
src/srcparser.o: ./include/wx/wx/gtk/gdiobj.h ./include/wx/palette.h
src/srcparser.o: ./include/wx/wx/gtk/palette.h ./include/wx/validate.h
src/srcparser.o: ./include/wx/cursor.h ./include/wx/wx/gtk/cursor.h
src/srcparser.o: ./include/wx/font.h ./include/wx/wx/gtk/font.h
src/srcparser.o: ./include/wx/region.h ./include/wx/wx/gtk/region.h
src/srcparser.o: ./include/wx/accel.h ./include/wx/wx/gtk/accel.h
src/srcparser.o: ./include/wx/wx/panel.h ./include/wx/wx/wx/generic/panelg.h
src/srcparser.o: ./include/wx/wx/frame.h ./include/wx/wx/wx/gtk/frame.h
src/srcparser.o: ./include/wx/icon.h ./include/wx/wx/dc.h
src/srcparser.o: ./include/wx/wx/wx/gtk/dc.h ./include/wx/pen.h
src/srcparser.o: ./include/wx/wx/gtk/pen.h ./include/wx/brush.h
src/srcparser.o: ./include/wx/wx/gtk/brush.h ./include/wx/bitmap.h
src/srcparser.o: ./include/wx/wx/gtk/bitmap.h ./include/wx/wx/dcclient.h
src/srcparser.o: ./include/wx/wx/wx/gtk/dcclient.h ./include/wx/wx/dcmemory.h
src/srcparser.o: ./include/wx/wx/wx/gtk/dcmemory.h ./include/wx/wx/dcprint.h
src/srcparser.o: ./include/wx/wx/dcscreen.h ./include/wx/wx/wx/gtk/dcscreen.h
src/srcparser.o: ./include/wx/wx/button.h ./include/wx/wx/wx/gtk/button.h
src/srcparser.o: ./include/wx/control.h ./include/wx/wx/gtk/control.h
src/srcparser.o: ./include/wx/wx/bmpbuttn.h ./include/wx/wx/wx/gtk/bmpbuttn.h
src/srcparser.o: ./include/wx/wx/checkbox.h ./include/wx/wx/wx/gtk/checkbox.h
src/srcparser.o: ./include/wx/wx/choice.h ./include/wx/wx/wx/gtk/choice.h
src/srcparser.o: ./include/wx/wx/scrolbar.h ./include/wx/wx/wx/gtk/scrolbar.h
src/srcparser.o: ./include/wx/wx/stattext.h ./include/wx/wx/wx/gtk/stattext.h
src/srcparser.o: ./include/wx/wx/statbmp.h ./include/wx/wx/wx/gtk/statbmp.h
src/srcparser.o: ./include/wx/wx/statbox.h ./include/wx/wx/wx/gtk/statbox.h
src/srcparser.o: ./include/wx/wx/listbox.h ./include/wx/wx/wx/gtk/listbox.h
src/srcparser.o: ./include/wx/wx/radiobox.h ./include/wx/wx/wx/gtk/radiobox.h
src/srcparser.o: ./include/wx/wx/radiobut.h ./include/wx/wx/wx/gtk/radiobut.h
src/srcparser.o: ./include/wx/wx/textctrl.h ./include/wx/wx/wx/gtk/textctrl.h
src/srcparser.o: ./include/wx/wx/slider.h ./include/wx/wx/wx/gtk/slider.h
src/srcparser.o: ./include/wx/wx/gauge.h ./include/wx/wx/wx/gtk/gauge.h
src/srcparser.o: ./include/wx/wx/combobox.h ./include/wx/wx/wx/gtk/combobox.h
src/srcparser.o: ./include/wx/wx/menu.h ./include/wx/wx/wx/gtk/menu.h
src/srcparser.o: ./include/wx/menuitem.h ./include/wx/wx/gtk/menuitem.h
src/srcparser.o: ./include/wx/wx/app.h ./include/wx/wx/wx/gtk/app.h
src/srcparser.o: ./include/wx/wx/dialog.h ./include/wx/wx/wx/gtk/dialog.h
src/srcparser.o: ./include/wx/wx/timer.h ./include/wx/wx/wx/gtk/timer.h
src/srcparser.o: ./include/wx/wx/utils.h ./include/wx/wx/wx/filefn.h
src/srcparser.o: ./include/wx/wx/wx/process.h ./include/wx/wx/settings.h
src/srcparser.o: ./include/wx/wx/wx/gtk/settings.h ./include/wx/wx/layout.h
src/srcparser.o: ./include/wx/wx/mdi.h ./include/wx/wx/wx/gtk/mdi.h
src/srcparser.o: ./include/wx/toolbar.h ./include/wx/wx/gtk/tbargtk.h
src/srcparser.o: ./include/wx/wx/scrolwin.h
src/srcparser.o: ./include/wx/wx/wx/generic/scrolwin.h
src/srcparser.o: ./include/wx/wx/statusbr.h
src/srcparser.o: ./include/wx/wx/wx/generic/statusbr.h
src/srcparser.o: ./include/wx/wx/msgdlg.h
src/srcparser.o: ./include/wx/wx/wx/generic/msgdlgg.h
src/srcparser.o: ./include/wx/wx/choicdlg.h
src/srcparser.o: ./include/wx/wx/wx/generic/choicdgg.h
src/srcparser.o: ./include/wx/wx/textdlg.h
src/srcparser.o: ./include/wx/wx/wx/generic/textdlgg.h
src/srcparser.o: ./include/wx/wx/filedlg.h ./include/wx/wx/wx/gtk/filedlg.h
src/srcparser.o: ./include/wx/wx/dirdlg.h
src/srcparser.o: ./include/wx/wx/wx/generic/dirdlgg.h ./include/wx/treectrl.h
src/srcparser.o: ./include/wx/wx/generic/treectrl.h ./include/wx/wx/cmndata.h
src/srcparser.o: ./include/wx/wx/intl.h ./include/wx/wx/valtext.h
src/srcparser.o: /usr/include/malloc.h ./include/srcparser.h
src/srcparser.o: ./include/markup.h
src/ifcontext.o: ./include/wx/wxprec.h ./include/wx/wx.h
src/ifcontext.o: ./include/wx/wx/setup.h ./include/wx/wx/wx/gtk/setup.h
src/ifcontext.o: ./include/wx/wx/defs.h
src/ifcontext.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stddef.h
src/ifcontext.o: ./include/wx/wx/wx/version.h ./include/wx/wx/string.h
src/ifcontext.o: /usr/include/string.h /usr/include/features.h
src/ifcontext.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
src/ifcontext.o: /usr/include/stdio.h /usr/include/libio.h
src/ifcontext.o: /usr/include/_G_config.h /usr/include/gnu/types.h
src/ifcontext.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stdarg.h
src/ifcontext.o: /usr/include/stdio_lim.h
src/ifcontext.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/limits.h
src/ifcontext.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/syslimits.h
src/ifcontext.o: /usr/include/stdlib.h /usr/include/sys/types.h
src/ifcontext.o: /usr/include/time.h /usr/include/endian.h
src/ifcontext.o: /usr/include/bytesex.h /usr/include/sys/select.h
src/ifcontext.o: /usr/include/selectbits.h /usr/include/alloca.h
src/ifcontext.o: ./include/wx/wx/wx/debug.h /usr/include/assert.h
src/ifcontext.o: /usr/include/g++/iostream.h /usr/include/g++/streambuf.h
src/ifcontext.o: ./include/wx/wx/log.h ./include/wx/wx/window.h
src/ifcontext.o: ./include/wx/wx/wx/gtk/window.h ./include/wx/object.h
src/ifcontext.o: ./include/wx/wx/memory.h ./include/wx/list.h
src/ifcontext.o: ./include/wx/event.h ./include/wx/wx/gdicmn.h
src/ifcontext.o: ./include/wx/wx/wx/hash.h ./include/wx/wx/wx/colour.h
src/ifcontext.o: ./include/wx/wx/wx/wx/gtk/colour.h ./include/wx/gdiobj.h
src/ifcontext.o: ./include/wx/wx/gtk/gdiobj.h ./include/wx/palette.h
src/ifcontext.o: ./include/wx/wx/gtk/palette.h ./include/wx/validate.h
src/ifcontext.o: ./include/wx/cursor.h ./include/wx/wx/gtk/cursor.h
src/ifcontext.o: ./include/wx/font.h ./include/wx/wx/gtk/font.h
src/ifcontext.o: ./include/wx/region.h ./include/wx/wx/gtk/region.h
src/ifcontext.o: ./include/wx/accel.h ./include/wx/wx/gtk/accel.h
src/ifcontext.o: ./include/wx/wx/panel.h ./include/wx/wx/wx/generic/panelg.h
src/ifcontext.o: ./include/wx/wx/frame.h ./include/wx/wx/wx/gtk/frame.h
src/ifcontext.o: ./include/wx/icon.h ./include/wx/wx/dc.h
src/ifcontext.o: ./include/wx/wx/wx/gtk/dc.h ./include/wx/pen.h
src/ifcontext.o: ./include/wx/wx/gtk/pen.h ./include/wx/brush.h
src/ifcontext.o: ./include/wx/wx/gtk/brush.h ./include/wx/bitmap.h
src/ifcontext.o: ./include/wx/wx/gtk/bitmap.h ./include/wx/wx/dcclient.h
src/ifcontext.o: ./include/wx/wx/wx/gtk/dcclient.h ./include/wx/wx/dcmemory.h
src/ifcontext.o: ./include/wx/wx/wx/gtk/dcmemory.h ./include/wx/wx/dcprint.h
src/ifcontext.o: ./include/wx/wx/dcscreen.h ./include/wx/wx/wx/gtk/dcscreen.h
src/ifcontext.o: ./include/wx/wx/button.h ./include/wx/wx/wx/gtk/button.h
src/ifcontext.o: ./include/wx/control.h ./include/wx/wx/gtk/control.h
src/ifcontext.o: ./include/wx/wx/bmpbuttn.h ./include/wx/wx/wx/gtk/bmpbuttn.h
src/ifcontext.o: ./include/wx/wx/checkbox.h ./include/wx/wx/wx/gtk/checkbox.h
src/ifcontext.o: ./include/wx/wx/choice.h ./include/wx/wx/wx/gtk/choice.h
src/ifcontext.o: ./include/wx/wx/scrolbar.h ./include/wx/wx/wx/gtk/scrolbar.h
src/ifcontext.o: ./include/wx/wx/stattext.h ./include/wx/wx/wx/gtk/stattext.h
src/ifcontext.o: ./include/wx/wx/statbmp.h ./include/wx/wx/wx/gtk/statbmp.h
src/ifcontext.o: ./include/wx/wx/statbox.h ./include/wx/wx/wx/gtk/statbox.h
src/ifcontext.o: ./include/wx/wx/listbox.h ./include/wx/wx/wx/gtk/listbox.h
src/ifcontext.o: ./include/wx/wx/radiobox.h ./include/wx/wx/wx/gtk/radiobox.h
src/ifcontext.o: ./include/wx/wx/radiobut.h ./include/wx/wx/wx/gtk/radiobut.h
src/ifcontext.o: ./include/wx/wx/textctrl.h ./include/wx/wx/wx/gtk/textctrl.h
src/ifcontext.o: ./include/wx/wx/slider.h ./include/wx/wx/wx/gtk/slider.h
src/ifcontext.o: ./include/wx/wx/gauge.h ./include/wx/wx/wx/gtk/gauge.h
src/ifcontext.o: ./include/wx/wx/combobox.h ./include/wx/wx/wx/gtk/combobox.h
src/ifcontext.o: ./include/wx/wx/menu.h ./include/wx/wx/wx/gtk/menu.h
src/ifcontext.o: ./include/wx/menuitem.h ./include/wx/wx/gtk/menuitem.h
src/ifcontext.o: ./include/wx/wx/app.h ./include/wx/wx/wx/gtk/app.h
src/ifcontext.o: ./include/wx/wx/dialog.h ./include/wx/wx/wx/gtk/dialog.h
src/ifcontext.o: ./include/wx/wx/timer.h ./include/wx/wx/wx/gtk/timer.h
src/ifcontext.o: ./include/wx/wx/utils.h ./include/wx/wx/wx/filefn.h
src/ifcontext.o: ./include/wx/wx/wx/process.h ./include/wx/wx/settings.h
src/ifcontext.o: ./include/wx/wx/wx/gtk/settings.h ./include/wx/wx/layout.h
src/ifcontext.o: ./include/wx/wx/mdi.h ./include/wx/wx/wx/gtk/mdi.h
src/ifcontext.o: ./include/wx/toolbar.h ./include/wx/wx/gtk/tbargtk.h
src/ifcontext.o: ./include/wx/wx/scrolwin.h
src/ifcontext.o: ./include/wx/wx/wx/generic/scrolwin.h
src/ifcontext.o: ./include/wx/wx/statusbr.h
src/ifcontext.o: ./include/wx/wx/wx/generic/statusbr.h
src/ifcontext.o: ./include/wx/wx/msgdlg.h
src/ifcontext.o: ./include/wx/wx/wx/generic/msgdlgg.h
src/ifcontext.o: ./include/wx/wx/choicdlg.h
src/ifcontext.o: ./include/wx/wx/wx/generic/choicdgg.h
src/ifcontext.o: ./include/wx/wx/textdlg.h
src/ifcontext.o: ./include/wx/wx/wx/generic/textdlgg.h
src/ifcontext.o: ./include/wx/wx/filedlg.h ./include/wx/wx/wx/gtk/filedlg.h
src/ifcontext.o: ./include/wx/wx/dirdlg.h
src/ifcontext.o: ./include/wx/wx/wx/generic/dirdlgg.h ./include/wx/treectrl.h
src/ifcontext.o: ./include/wx/wx/generic/treectrl.h ./include/wx/wx/cmndata.h
src/ifcontext.o: ./include/wx/wx/intl.h ./include/wx/wx/valtext.h
src/ifcontext.o: /usr/include/malloc.h ./include/ifcontext.h
src/ifcontext.o: ./include/srcparser.h ./include/markup.h
src/ifcontext.o: ./include/cjparser.h /usr/include/memory.h
src/HelpGen.o: ./include/wx/wxprec.h ./include/cjparser.h
src/HelpGen.o: ./include/srcparser.h ./include/markup.h
src/HelpGen.o: /usr/include/g++/iostream.h /usr/include/g++/streambuf.h
src/HelpGen.o: /usr/include/libio.h /usr/include/features.h
src/HelpGen.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
src/HelpGen.o: /usr/include/_G_config.h /usr/include/gnu/types.h
src/HelpGen.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stddef.h
src/HelpGen.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stdarg.h
src/HelpGen.o: /usr/include/memory.h /usr/include/stdlib.h
src/HelpGen.o: /usr/include/sys/types.h /usr/include/time.h
src/HelpGen.o: /usr/include/endian.h /usr/include/bytesex.h
src/HelpGen.o: /usr/include/sys/select.h /usr/include/selectbits.h
src/HelpGen.o: /usr/include/alloca.h /usr/include/stdio.h
src/HelpGen.o: /usr/include/stdio_lim.h
src/sourcepainter.o: ./include/wx/wxprec.h ./include/wx/wx.h
src/sourcepainter.o: ./include/wx/wx/setup.h ./include/wx/wx/wx/gtk/setup.h
src/sourcepainter.o: ./include/wx/wx/defs.h
src/sourcepainter.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stddef.h
src/sourcepainter.o: ./include/wx/wx/wx/version.h ./include/wx/wx/string.h
src/sourcepainter.o: /usr/include/string.h /usr/include/features.h
src/sourcepainter.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
src/sourcepainter.o: /usr/include/stdio.h /usr/include/libio.h
src/sourcepainter.o: /usr/include/_G_config.h /usr/include/gnu/types.h
src/sourcepainter.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stdarg.h
src/sourcepainter.o: /usr/include/stdio_lim.h
src/sourcepainter.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/limits.h
src/sourcepainter.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/syslimits.h
src/sourcepainter.o: /usr/include/stdlib.h /usr/include/sys/types.h
src/sourcepainter.o: /usr/include/time.h /usr/include/endian.h
src/sourcepainter.o: /usr/include/bytesex.h /usr/include/sys/select.h
src/sourcepainter.o: /usr/include/selectbits.h /usr/include/alloca.h
src/sourcepainter.o: ./include/wx/wx/wx/debug.h /usr/include/assert.h
src/sourcepainter.o: /usr/include/g++/iostream.h /usr/include/g++/streambuf.h
src/sourcepainter.o: ./include/wx/wx/log.h ./include/wx/wx/window.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/window.h ./include/wx/object.h
src/sourcepainter.o: ./include/wx/wx/memory.h ./include/wx/list.h
src/sourcepainter.o: ./include/wx/event.h ./include/wx/wx/gdicmn.h
src/sourcepainter.o: ./include/wx/wx/wx/hash.h ./include/wx/wx/wx/colour.h
src/sourcepainter.o: ./include/wx/wx/wx/wx/gtk/colour.h ./include/wx/gdiobj.h
src/sourcepainter.o: ./include/wx/wx/gtk/gdiobj.h ./include/wx/palette.h
src/sourcepainter.o: ./include/wx/wx/gtk/palette.h ./include/wx/validate.h
src/sourcepainter.o: ./include/wx/cursor.h ./include/wx/wx/gtk/cursor.h
src/sourcepainter.o: ./include/wx/font.h ./include/wx/wx/gtk/font.h
src/sourcepainter.o: ./include/wx/region.h ./include/wx/wx/gtk/region.h
src/sourcepainter.o: ./include/wx/accel.h ./include/wx/wx/gtk/accel.h
src/sourcepainter.o: ./include/wx/wx/panel.h
src/sourcepainter.o: ./include/wx/wx/wx/generic/panelg.h
src/sourcepainter.o: ./include/wx/wx/frame.h ./include/wx/wx/wx/gtk/frame.h
src/sourcepainter.o: ./include/wx/icon.h ./include/wx/wx/dc.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/dc.h ./include/wx/pen.h
src/sourcepainter.o: ./include/wx/wx/gtk/pen.h ./include/wx/brush.h
src/sourcepainter.o: ./include/wx/wx/gtk/brush.h ./include/wx/bitmap.h
src/sourcepainter.o: ./include/wx/wx/gtk/bitmap.h ./include/wx/wx/dcclient.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/dcclient.h
src/sourcepainter.o: ./include/wx/wx/dcmemory.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/dcmemory.h
src/sourcepainter.o: ./include/wx/wx/dcprint.h ./include/wx/wx/dcscreen.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/dcscreen.h
src/sourcepainter.o: ./include/wx/wx/button.h ./include/wx/wx/wx/gtk/button.h
src/sourcepainter.o: ./include/wx/control.h ./include/wx/wx/gtk/control.h
src/sourcepainter.o: ./include/wx/wx/bmpbuttn.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/bmpbuttn.h
src/sourcepainter.o: ./include/wx/wx/checkbox.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/checkbox.h
src/sourcepainter.o: ./include/wx/wx/choice.h ./include/wx/wx/wx/gtk/choice.h
src/sourcepainter.o: ./include/wx/wx/scrolbar.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/scrolbar.h
src/sourcepainter.o: ./include/wx/wx/stattext.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/stattext.h
src/sourcepainter.o: ./include/wx/wx/statbmp.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/statbmp.h
src/sourcepainter.o: ./include/wx/wx/statbox.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/statbox.h
src/sourcepainter.o: ./include/wx/wx/listbox.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/listbox.h
src/sourcepainter.o: ./include/wx/wx/radiobox.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/radiobox.h
src/sourcepainter.o: ./include/wx/wx/radiobut.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/radiobut.h
src/sourcepainter.o: ./include/wx/wx/textctrl.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/textctrl.h
src/sourcepainter.o: ./include/wx/wx/slider.h ./include/wx/wx/wx/gtk/slider.h
src/sourcepainter.o: ./include/wx/wx/gauge.h ./include/wx/wx/wx/gtk/gauge.h
src/sourcepainter.o: ./include/wx/wx/combobox.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/combobox.h ./include/wx/wx/menu.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/menu.h ./include/wx/menuitem.h
src/sourcepainter.o: ./include/wx/wx/gtk/menuitem.h ./include/wx/wx/app.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/app.h ./include/wx/wx/dialog.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/dialog.h ./include/wx/wx/timer.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/timer.h ./include/wx/wx/utils.h
src/sourcepainter.o: ./include/wx/wx/wx/filefn.h ./include/wx/wx/wx/process.h
src/sourcepainter.o: ./include/wx/wx/settings.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/settings.h
src/sourcepainter.o: ./include/wx/wx/layout.h ./include/wx/wx/mdi.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/mdi.h ./include/wx/toolbar.h
src/sourcepainter.o: ./include/wx/wx/gtk/tbargtk.h ./include/wx/wx/scrolwin.h
src/sourcepainter.o: ./include/wx/wx/wx/generic/scrolwin.h
src/sourcepainter.o: ./include/wx/wx/statusbr.h
src/sourcepainter.o: ./include/wx/wx/wx/generic/statusbr.h
src/sourcepainter.o: ./include/wx/wx/msgdlg.h
src/sourcepainter.o: ./include/wx/wx/wx/generic/msgdlgg.h
src/sourcepainter.o: ./include/wx/wx/choicdlg.h
src/sourcepainter.o: ./include/wx/wx/wx/generic/choicdgg.h
src/sourcepainter.o: ./include/wx/wx/textdlg.h
src/sourcepainter.o: ./include/wx/wx/wx/generic/textdlgg.h
src/sourcepainter.o: ./include/wx/wx/filedlg.h
src/sourcepainter.o: ./include/wx/wx/wx/gtk/filedlg.h
src/sourcepainter.o: ./include/wx/wx/dirdlg.h
src/sourcepainter.o: ./include/wx/wx/wx/generic/dirdlgg.h
src/sourcepainter.o: ./include/wx/treectrl.h
src/sourcepainter.o: ./include/wx/wx/generic/treectrl.h
src/sourcepainter.o: ./include/wx/wx/cmndata.h ./include/wx/wx/intl.h
src/sourcepainter.o: ./include/wx/wx/valtext.h ./include/sourcepainter.h
src/sourcepainter.o: ./include/markup.h
src/wx/string.o: ./include/wx/wxprec.h /usr/include/ctype.h
src/wx/string.o: /usr/include/features.h /usr/include/sys/cdefs.h
src/wx/string.o: /usr/include/gnu/stubs.h /usr/include/endian.h
src/wx/string.o: /usr/include/bytesex.h /usr/include/string.h
src/wx/string.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stddef.h
src/wx/string.o: /usr/include/stdlib.h /usr/include/sys/types.h
src/wx/string.o: /usr/include/gnu/types.h /usr/include/time.h
src/wx/string.o: /usr/include/sys/select.h /usr/include/selectbits.h
src/wx/string.o: /usr/include/alloca.h
src/wx_extra_imps.o: ./include/wx/wxprec.h /usr/include/memory.h
src/wx_extra_imps.o: /usr/include/features.h /usr/include/sys/cdefs.h
src/wx_extra_imps.o: /usr/include/gnu/stubs.h
src/wx/object.o: ./include/wx/wxprec.h /usr/include/string.h
src/wx/object.o: /usr/include/features.h /usr/include/sys/cdefs.h
src/wx/object.o: /usr/include/gnu/stubs.h
src/wx/object.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stddef.h
src/wx/object.o: /usr/include/assert.h
src/wx/hash.o: ./include/wx/wxprec.h ./include/wx/list.h
src/wx/hash.o: ./include/wx/wx/defs.h
src/wx/hash.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stddef.h
src/wx/hash.o: ./include/wx/wx/setup.h ./include/wx/wx/wx/gtk/setup.h
src/wx/hash.o: ./include/wx/wx/wx/version.h ./include/wx/wx/wx/debug.h
src/wx/hash.o: /usr/include/assert.h /usr/include/features.h
src/wx/hash.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
src/wx/hash.o: ./include/wx/object.h ./include/wx/wx/memory.h
src/wx/hash.o: ./include/wx/wx/string.h /usr/include/string.h
src/wx/hash.o: /usr/include/stdio.h /usr/include/libio.h
src/wx/hash.o: /usr/include/_G_config.h /usr/include/gnu/types.h
src/wx/hash.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stdarg.h
src/wx/hash.o: /usr/include/stdio_lim.h
src/wx/hash.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/limits.h
src/wx/hash.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/syslimits.h
src/wx/hash.o: /usr/include/stdlib.h /usr/include/sys/types.h
src/wx/hash.o: /usr/include/time.h /usr/include/endian.h
src/wx/hash.o: /usr/include/bytesex.h /usr/include/sys/select.h
src/wx/hash.o: /usr/include/selectbits.h /usr/include/alloca.h
src/wx/hash.o: /usr/include/g++/iostream.h /usr/include/g++/streambuf.h
src/wx/hash.o: ./include/wx/wx/wx/hash.h
src/wx/log.o: ./include/wx/wxprec.h ./include/wx/file.h
src/wx/log.o: ./include/wx/textfile.h ./include/wx/wx/defs.h
src/wx/log.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stddef.h
src/wx/log.o: ./include/wx/wx/setup.h ./include/wx/wx/wx/gtk/setup.h
src/wx/log.o: ./include/wx/wx/wx/version.h ./include/wx/wx/string.h
src/wx/log.o: /usr/include/string.h /usr/include/features.h
src/wx/log.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
src/wx/log.o: /usr/include/stdio.h /usr/include/libio.h
src/wx/log.o: /usr/include/_G_config.h /usr/include/gnu/types.h
src/wx/log.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stdarg.h
src/wx/log.o: /usr/include/stdio_lim.h
src/wx/log.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/limits.h
src/wx/log.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/syslimits.h
src/wx/log.o: /usr/include/stdlib.h /usr/include/sys/types.h
src/wx/log.o: /usr/include/time.h /usr/include/endian.h
src/wx/log.o: /usr/include/bytesex.h /usr/include/sys/select.h
src/wx/log.o: /usr/include/selectbits.h /usr/include/alloca.h
src/wx/log.o: ./include/wx/wx/wx/debug.h /usr/include/assert.h
src/wx/log.o: /usr/include/g++/iostream.h /usr/include/g++/streambuf.h
src/wx/log.o: ./include/wx/wx/dynarray.h ./include/wx/wx/utils.h
src/wx/log.o: ./include/wx/object.h ./include/wx/wx/memory.h
src/wx/log.o: ./include/wx/list.h ./include/wx/wx/window.h
src/wx/log.o: ./include/wx/wx/wx/gtk/window.h ./include/wx/event.h
src/wx/log.o: ./include/wx/wx/gdicmn.h ./include/wx/wx/wx/hash.h
src/wx/log.o: ./include/wx/wx/wx/colour.h ./include/wx/wx/wx/wx/gtk/colour.h
src/wx/log.o: ./include/wx/gdiobj.h ./include/wx/wx/gtk/gdiobj.h
src/wx/log.o: ./include/wx/palette.h ./include/wx/wx/gtk/palette.h
src/wx/log.o: ./include/wx/validate.h ./include/wx/cursor.h
src/wx/log.o: ./include/wx/wx/gtk/cursor.h ./include/wx/font.h
src/wx/log.o: ./include/wx/wx/gtk/font.h ./include/wx/region.h
src/wx/log.o: ./include/wx/wx/gtk/region.h ./include/wx/accel.h
src/wx/log.o: ./include/wx/wx/gtk/accel.h ./include/wx/wx/wx/filefn.h
src/wx/log.o: ./include/wx/wx/wx/process.h ./include/wx/wx/log.h
src/wx/log.o: /usr/include/errno.h /usr/include/errnos.h
src/wx/log.o: /usr/include/linux/errno.h /usr/include/asm/errno.h
src/wx/file.o: ./include/wx/wxprec.h ./include/wx/wx/defs.h
src/wx/file.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stddef.h
src/wx/file.o: ./include/wx/wx/setup.h ./include/wx/wx/wx/gtk/setup.h
src/wx/file.o: ./include/wx/wx/wx/version.h /usr/include/stdio.h
src/wx/file.o: /usr/include/libio.h /usr/include/features.h
src/wx/file.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
src/wx/file.o: /usr/include/_G_config.h /usr/include/gnu/types.h
src/wx/file.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stdarg.h
src/wx/file.o: /usr/include/stdio_lim.h /usr/include/fcntl.h
src/wx/file.o: /usr/include/fcntlbits.h /usr/include/sys/types.h
src/wx/file.o: /usr/include/time.h /usr/include/endian.h
src/wx/file.o: /usr/include/bytesex.h /usr/include/sys/select.h
src/wx/file.o: /usr/include/selectbits.h /usr/include/sys/stat.h
src/wx/file.o: /usr/include/statbuf.h ./include/wx/wx/string.h
src/wx/file.o: /usr/include/string.h
src/wx/file.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/limits.h
src/wx/file.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/syslimits.h
src/wx/file.o: /usr/include/stdlib.h /usr/include/alloca.h
src/wx/file.o: ./include/wx/wx/wx/debug.h /usr/include/assert.h
src/wx/file.o: /usr/include/g++/iostream.h /usr/include/g++/streambuf.h
src/wx/file.o: ./include/wx/wx/intl.h ./include/wx/file.h
src/wx/file.o: ./include/wx/wx/log.h
src/wx/list.o: ./include/wx/wxprec.h
src/wx/list.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stdarg.h
src/wx/list.o: /usr/include/stdlib.h /usr/include/features.h
src/wx/list.o: /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h
src/wx/list.o: /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.60/include/stddef.h
src/wx/list.o: /usr/include/sys/types.h /usr/include/gnu/types.h
src/wx/list.o: /usr/include/time.h /usr/include/endian.h
src/wx/list.o: /usr/include/bytesex.h /usr/include/sys/select.h
src/wx/list.o: /usr/include/selectbits.h /usr/include/alloca.h
src/wx/list.o: /usr/include/string.h

View File

@ -0,0 +1,125 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: Implementation of C++/Java parser
// compatible with SourceParserBase interface
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 22/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef __CJPARSESR_G__
#define __CJPARSESR_G__
#include "srcparser.h"
#include <iostream.h>
#include <memory.h>
#include <stdlib.h>
#include <stdio.h>
// class parses given "memory-resident" Java or C++ source code
// and captures information about classes/attrubutes/methods/
// arguments/etc into structures. Conforms with SourceParserBase
// interface requirements.
class CJSourceParser : public SourceParserBase
{
protected:
// begining of the full-text area of the source file
char* mpStart;
// points to first character after the end
// of teh full-text area
char* mpEnd;
// current "privacy level"
int mCurVis;
// current parsing position int full-text area
char* cur;
// about the current class
bool mIsVirtaul;
bool mIsTemplate;
size_t mNestingLevel;
// context data for which is currently being collected
spContext* mpCurCtx;
int mCurCtxType; // type of the current context
bool mCommentsOn;
bool mMacrosOn;
protected:
void AttachComments( spContext& ctx, char* cur );
void ParseKeyword( char*& cur );
bool ParseNameAndRetVal( char*& cur, bool& isAMacro );
bool ParseArguments( char*& cur );
void ParseMemberVar( char*& cur );
void SkipFunction( char*& cur );
void SkipFunctionBody( char*& cur );
bool CheckVisibilty( char*& cur );
void AddClassNode( char*& cur );
void AddMacroNode( char*& cur );
void AddEnumNode( char*& cur );
void AddTypeDefNode( char*& cur );
void DumpOperationInfo( spOperation& info, const string& tab, ostream& os );
void DumpClassHeader( spClass& info, ostream& os );
void DumpClassBody( spClass& info, ostream& os );
public:
// NOTE:: discarding of macros or comments improves performance and
// decreases memory usage
CJSourceParser(bool collectCommnets = 1,
bool collectMacros = 1);
// returns the root-node of the created context tree
// (user is responsible for releasing it from the heep)
// "end" should point to the last (character + 1) of the
// source text
virtual spFile* Parse( char* start, char* end );
};
// inline'ed helpers used (just info):
/*
static inline void skip_to_eol( char*& cur );
static inline void skip_eol( char*& cur );
static inline bool skip_to_next_comment_in_the_line( char*& cur );
static void skip_to_prev_line( char*& cur );
static inline void skip_comments( char*& cur );
static inline void clear_commets_queue();
static inline void skip_quoted_string( char*& cur );
static inline bool get_next_token( char*& cur );
static inline void skip_preprocessor_dir( char*& cur );
static void skip_token( char*& cur );
static inline size_t get_token_len( char* tok );
static inline bool cmp_tokens( char* tok1, char* tok2 );
static inline bool cmp_tokens_fast( char* tok1, char* tok2, size_t len );
static inline void skip_tempalate_statement( char*& cur );
static inline void skip_statement( char*& cur );
static inline void skip_token_back( char*& cur );
static inline void skip_next_token_back( char*& cur );
static string get_token_str( char* cur );
static size_t skip_block( char*& cur );
static inline bool skip_imp_block( char*& cur );
static bool is_class_token( char*& cur );
inline static bool is_forward_decl( char* cur );
inline static bool is_function( char* cur, bool& isAMacro );
static inline void skip_scope_block( char*& cur );
static void arrange_indirection_tokens_between( string& type, string& identifier );
static bool is_keyword( char* cur );
static inline void get_string_between( char* start, char* end, string* pStr );
static char* set_comment_text( string& text, char* start );
*/
#endif

View File

@ -0,0 +1,157 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: Contrib. demo
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 22/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef __DOCRIPPER_G__
#define __DOCRIPPER_G__
#include "scriptbinder.h"
#include "srcparser.h"
#include "sourcepainter.h"
#if defined( wxUSE_TEMPLATE_STL )
#include <vector>
typedef vector<ScriptTemplate*> STemplateListT;
#else
#include "wxstlvec.h"
typedef ScriptTemplate* ScriptTemplatePtrT;
typedef WXSTL_VECTOR_SHALLOW_COPY(ScriptTemplatePtrT) STemplateListT;
#endif
// specific DocGenerator class for "Ripper",
// also acts as source code visitor
class RipperDocGen : public DocGeneratorBase, public spVisitor
{
protected:
// templates for various sections
ScriptTemplate mTopTempl;
ScriptTemplate mContentIdxTempl;
ScriptTemplate mSuperContentTempl;
ScriptTemplate mSubContentTempl;
ScriptTemplate mOutLineTempl;
ScriptTemplate mOutLine1Templ;
// template used for corss-references
ScriptTemplate mRefTempl;
// template used to show not-existing sections
ScriptTemplate mDeadRefTempl;
// template collection for generation of class-tree
STemplateListT mTreeTemplates;
// pointers to all major index sections
ScriptSection* mpTopIdx;
ScriptSection* mpClassIdx;
ScriptSection* mpEnumIdx;
ScriptSection* mpTypeDefIdx;
ScriptSection* mpMacroIdx;
ScriptSection* mpGlobalVarsIdx;
ScriptSection* mpGlobalFuncIdx;
ScriptSection* mpConstIdx;
// parser set up from user-code for sepcific language
SourceParserBase* mpParser;
// class section, which is currently being
// assembled
ScriptSection* mpCurClassSect;
// source syntax heighlighter object
SourcePainter mSrcPainter;
// context, to which all file contexts
// are assembled
spContext* mpFileBinderCtx;
// script tags set up from usesr code
MarkupTagsT mTags;
protected:
// helpers
void AppendComments( spContext& fromContext, string& str );
void AppendMulitilineStr( string& st, string& mlStr );
void AppendHighlightedSource( string& st, string source );
// returns TRUE, if no comments found in the context,
// plus, creates dummy(empty) section, and puts a
// reference woth "dead-link" template to it in the
// given index-section "toSect"
bool CheckIfUncommented( spContext& ctx, ScriptSection& toSect );
// checks if context has any comments, then returns
// template of normal reference, otherwise of dead reference
ScriptTemplate* GetRefTemplFor( spContext& ctx );
// adds "someClass::" perfix to the context name,
// if it's not in the file scope (i.e. if it's not global)
string GetScopedName( spContext& ofCtx );
// adds section to currently assembled class section
// and places references to it from "public", "protected"
// or "private" indexing-subsections of the class, depending
// on the visibility of the context
void AddToCurrentClass( ScriptSection* pSection, spContext& ctx,
const char* subSectionName );
// called, after all files are processed, to
// resolve possible super/derived class relations,
// and put cross references to them - where resolution was
// successful
void LinkSuperClassRefs();
// implementations of "visiting procedures", declared in spVisitor
virtual void VisitClass( spClass& cl );
virtual void VisitEnumeration( spEnumeration& en );
virtual void VisitTypeDef( spTypeDef& td );
virtual void VisitPreprocessorLine( spPreprocessorLine& pd );
virtual void VisitAttribute( spAttribute& attr );
virtual void VisitOperation( spOperation& op );
// overriden member of DocGernatorBase
virtual bool OnSaveDocument( ScriptStream& stm );
virtual ScriptSection* GetTopSection()
{ return mpTopIdx; }
public:
RipperDocGen();
~RipperDocGen();
// should be called onece to set user-code provided,
// parser for specific source code language
// (NOTE:: it's the user-code's responsibility to
// relseas memory of pParser)
void Init( SourceParserBase* pParser );
// should be called on each file
void ProcessFile( const char* sourceFile );
};
#endif

View File

@ -0,0 +1,100 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: Contrib. demo
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 27/12/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef __IFCONTEXT_G__
#define __IFCONTEXT_G__
#include "srcparser.h"
#include "cjparser.h"
class spBookmark
{
public:
size_t mFrom;
size_t mLen;
size_t mFileNo;
inline spBookmark() {}
inline spBookmark( int from, int len, int fileNo )
: mFrom( from ), mLen( len ), mFileNo( fileNo )
{}
};
#if defined( wxUSE_TEMPLATE_STL )
typedef vector<spBookmark) BookmarkListT
#else
typedef WXSTL_VECTOR_SHALLOW_COPY(spBookmark) BookmarkListT;
#endif
class spInterFileContext : public spContext
{
protected:
BookmarkListT mDeletionMarks;
BookmarkListT mFiltered;
size_t mCurFileNo;
CJSourceParser mParser;
protected:
size_t GetFileNoOfContext( spContext& ctx );
size_t GetFileNo( const string& fname );
void InsertBookmarkSorted( BookmarkListT& lst, spBookmark& mark );
void DoAppendSourceFragment( string& source,
string& result,
size_t pos, size_t len );
void GenerateContextBody( spContext& ctx,
string& source,
string& result,
size_t& lastSavedPos,
size_t& lastKnownPos );
public:
StrListT mFiles;
StrListT mContents;
public:
spInterFileContext();
~spInterFileContext();
void AddFile( const string& fname, const string& content );
void RemoveContext( spContext& ctx );
void GenrateContents();
void ParseContents( SourceParserPlugin* pPlugin = NULL );
void WriteToFiles();
// overriden method of the base class (finds out the source fragment)
virtual string GetBody( spContext* pCtx = NULL );
virtual string GetHeader( spContext* pCtx = NULL );
};
#endif

View File

@ -0,0 +1,51 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: Contrib. demo
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 22/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef __MARKUP_G__
#define __MARKUP_G__
// indicies for the MarkupTagsT array
#define TAG_BOLD 0
#define TAG_ITALIC 1
#define TAG_FIXED_FONT 2
#define TAG_BLACK_FONT 3
#define TAG_RED_FONT 4
#define TAG_GREEN_FONT 5
#define TAG_BLUE_FONT 6
#define TAG_PARAGRAPH 7
#define TAG_NEW_LINE 8
#define TAG_HEADING_1 9
#define TAG_HEADING_2 10
#define TAG_HEADING_3 11
#define TAG_ITEM_LIST 12
#define TAG_LIST_ITEM 13
struct TagStructT
{
char* start; // tag that starts style
char* end; // tag that finishes style
};
// tag array
typedef TagStructT* MarkupTagsT;
// returns array of TagStructT with tag strings for HTML
MarkupTagsT get_HTML_markup_tags();
// MarkupTagsT get_PostScript_markup_tags();
// MarkupTagsT get_Latex_markup_tags();
#endif

View File

@ -0,0 +1,377 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: Contrib. demo
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 22/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef __SCRIPTBINDER_G__
#define __SCRIPTBINDER_G__
#if defined( wxUSE_TEMPLATE_STL )
#include <vector>
#ifdef WIN32
#include <bstring.h>
#else
#include <strclass.h>
#include <string.h>
#endif
#else
#include "wxstlvec.h"
#include "wx/string.h"
// FIXME:: dirty!
typedef wxString string;
#endif
#ifndef ASSERT
// assert yourself
#define ASSERT(x) if (!(x) ) throw;
#endif
#include "markup.h"
// just another portable stream class...
class ScriptStream
{
protected:
char* mpBuf;
size_t mSize;
size_t mCapacity;
public:
ScriptStream();
~ScriptStream();
void WriteBytes( const void* srcBuf, size_t count );
ScriptStream& operator<<( const char* str );
ScriptStream& operator<<( const string& str );
ScriptStream& operator<<( char ch );
void endl();
inline char* GetBuf() { return mpBuf; }
inline size_t GetBufSize() { return mSize; }
// clears current contents of the stream
void Reset() { mSize = 0; }
};
class ScriptTemplate;
// used internally by ScriptTemplate
enum TEMPLATE_VARIABLE_TYPES
{
TVAR_INTEGER,
TVAR_STRING,
TVAR_DOUBLE,
TVAR_REF_ARRAY
};
// helper structures used only by ScriptTemplate
struct TVarInfo
{
public:
const char* mName;
int mType;
int mOfs;
TVarInfo( const char* name, int ofs, int varType )
: mName(name),
mType( varType ),
mOfs( ofs )
{}
};
struct TArrayInfo : public TVarInfo
{
public:
int mRefOfs;
int mSizeIntOfs;
int mObjRefTemplOfs;
TArrayInfo( const char* name )
: TVarInfo( name, 0, TVAR_REF_ARRAY )
{}
};
// stores offset of the given member (of the given class)
// to (*pOfs), though the use of template classes would have
// solved this problem in much clearer fashion
// FOR NOW:: obtaining physical offset of class member
// does not appeare to be protable across compilers?
// FIXME:: +/- 1 problem
#ifdef __UNIX__
#define WEIRD_OFFSET 1
#else
#define WEIRD_OFFSET 0
#endif
#define GET_VAR_OFS( className, varName, pOfs ) \
{ \
int* className::* varPtr; \
varPtr = (int* className::*)&className::varName; \
\
(*pOfs) = int(*(int*)&varPtr)-WEIRD_OFFSET; \
}
class ScriptSection;
#if defined( wxUSE_TEMPLATE_STL )
typedef vector<TVarInfo*> TVarListT;
// container class for sections
typedef vector<ScriptSection*> SectListT;
#else
typedef TVarInfo* TVarInfoPtrT;
typedef ScriptSection* ScriptSectionPtrT;
typedef WXSTL_VECTOR_SHALLOW_COPY(TVarInfoPtrT) TVarListT;
// container class for sections
typedef WXSTL_VECTOR_SHALLOW_COPY(ScriptSectionPtrT) SectListT;
#endif
// class performs preprocessing of arbitrary scripts,
// replaces identifiers enclosed in $(..) tag, whith
// values of the corresponding class member variables
class ScriptTemplate
{
protected:
// do not use string object here - parsing of
// C string can be much faster (in debug v.)
char* mTText;
TVarListT mVars;
inline void PrintVar( TVarInfo* pInfo,
void* dataObj,
ScriptStream& stm );
public:
ScriptTemplate( const string& templateText );
virtual ~ScriptTemplate();
bool HasVar( const char* name );
// Member variables registration methods.
// NOTE:: GET_VAR_OFS() macro should be used
// to get offset of the class member (see #define above)
void AddStringVar ( const char* name, int ofs );
void AddIntegerVar( const char* name, int ofs );
void AddDoubleVar ( const char* name, int ofs );
void AddObjectRefArray( const char* name,
int ofsRefToFirstObj,
int ofsObjSizeInt,
int ofsObjRefTempl
);
// reads the script, replaces $(..) tags with values
// of registered members of dataObj object, and outputs
// the result to given text stream
void PrintScript( void* dataObj, ScriptStream& stm );
};
class ScriptSection;
// class manages section and aggregated sections of
// inter-linked documents
class ScriptSection
{
protected:
// NOTE:: "$(NAME)", $(ID), "$(BODY)" and "$(REFLIST)" aree
// reseved template variables of ScriptSection
// the below there members are registered to ScriptTemplate,
// GUID within the section tree (numeric)
ScriptSection* mpParent;
string mId; // $(ID)
string mName; // $(NAME)
string mBody; // $(BODY)
// NULL, if this section is not aggregated anywhere
SectListT mSubsections; // aggregated sectons
SectListT mReferences; // registered as $(REFLIST)
bool mAutoHide; // see autoHide arg, in constructor
bool mSortOn; // TRUE, if sort subsectons by naem
// tempalte for this section
ScriptTemplate* mpSectTempl;
// template used for links (or references) to this section
ScriptTemplate* mpRefTempl;
// do not call destructor of this object,
// call RemoveRef() instead
int mRefCount;
static int mIdCounter; // generator of GUIDs
// fields registered and used by ScriptTemplate object
void* mRefFirst;
int mArrSize;
protected:
virtual void AddRef();
virtual void RemoveRef();
void DoRemoveEmptySections(int& nRemoved, SectListT& removedLst);
void DoRemoveDeadLinks( SectListT& removedLst);
public:
// NOTE:: pass NULL to certain template, if your sure
// this kind of template will never be used,
// e.g. if section is contained but never referrenced,
// then pReferenceTemplate can be NULL
// if autoHide option is TRUE, the section will be automatically
// collapsed (not shown) if it doesn't contain any references
// to other sections (e.g. could be usefull for autoamically
// hiding empty index-sections).
ScriptSection( const string& name = "",
const string& body = "",
ScriptTemplate* pSectionTemplate = NULL,
ScriptTemplate* pReferenceTemplate = NULL,
bool autoHide = FALSE,
bool sorted = FALSE
);
// calls RemoveRef() to all aggreagated sections first,
// then to all referenced section - this way all
// sections (even not aggregated ones) become "garbage-collected"
// NOTE:: do not call destructor directlly, call RemoveRef()
// instead
virtual ~ScriptSection();
// if addToReferencesToo is TRUE, section is aggregated and
// also added to reference list of this section
void AddSection( ScriptSection* pSection, bool addToReferencesToo = FALSE );
// add cross-reference to this given section
void AddReference( ScriptSection* pReferredSection );
// subsection may be given of variable depth level,
// e.g. "publications/reviews/software"
ScriptSection* GetSubsection( const char* name );
// returns list aggregated sections
SectListT& GetSubsections();
// binds reserved template names ( $(..) ) to member
// vairalbes in the ScriptSection class, should be called
// to initialize each user-code provided script template
static void RegisterTemplate( ScriptTemplate& sectionTempalte );
// prints out section tree to the stream, starting from
// this section as a root node
virtual void Print( ScriptStream& stm );
// searches empty sections which has autoHide == TRUE,
// and colapses them (this method should be called )
// on the root-section of the sections tree
// NOTE:: does not work properly, yet!
void RemoveEmptySections();
};
// base class for documnetation generators
// (allows user code set up target script type,
// independently of documentation type)
class DocGeneratorBase
{
protected:
MarkupTagsT mTags;
// override this method to do some post processing
// after generation of document, or even write some
// data into output stream, before the section tree
// is flushed into it.
// return FALSE, if something has gone wrong and
// document cannot be saved now
virtual bool OnSaveDocument( ScriptStream& stm )
{ return 1; }
// override this method to provide reference to
// the top section of the document (used as default
// starting section when saving a document)
virtual ScriptSection* GetTopSection()
{ return 0; }
public:
DocGeneratorBase()
: mTags(0) // no defaul script
{}
// dectrouctors of polymorphic classes SHOULD be virtual
virtual ~DocGeneratorBase() {}
// returns tags, being used for specific target script
MarkupTagsT GetScriptMarkupTags() { return mTags; }
// sets tag array for specific script
// NOTE:: Why virtual? since approach with MarkupTagsT is
// "flowless" only in theory. Overriding this method
// allows document generators to check the type of the
// target script, and perhaps make some modifications
// to generator's tamplates, to match the specific script
virtual void SetScriptMarkupTags( MarkupTagsT tags )
{ mTags = tags; }
// seves document to file starting from the root-node of
// the document (provided by GetTopSection() method),
// or from "pFromSection" if it's not NULL.
// fopenOptions arg. is string passed to fopen() method,
// returns TRUE, if saving was successfull
virtual bool SaveDocument( const char* fname,
const char* fopenOptions = "w",
ScriptSection* pFromSection = NULL
);
};
#endif

View File

@ -0,0 +1,104 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: Contrib. demo
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 22/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef __SOURCEPAINTER_G__
#define __SOURCEPAINTER_G__
#ifndef ASSERT
#define ASSERT(x) if (!(x)) throw
#endif
#if defined( wxUSE_TEMPLATE_STL )
#include <vector.h>
typedef vector<int> SPBlockListT;
#ifdef WIN32
#include <bstring.h>
#else
#include <strclass.h>
#include <string.h>
#endif
#else
#include "wxstlvec.h"
#include "wx/string.h"
// FIXME:: dirty!
#define string wxString
typedef WXSTL_VECTOR_SHALLOW_COPY(int) SPBlockListT;
#endif
#include "markup.h" // import MarkupTagsT definition
// "colored" codes for highlighted blocks
#define RANK_BLACK 0 // common source fragments
#define RANK_BLUE 1 // basic types
#define RANK_RED 2 // reserved words
#define RANK_GREEN 3 // comments
// colored block description format :
// int( ( rank << 16 ) | ( source_range_len ) )
// FOR NOW:: no lagnguage-map selection
// source code syntax heighlighter (CPP+JAVA+VB+PASCAL)
class SourcePainter
{
protected:
string mResultStr;
SPBlockListT mBlocks;
bool mCollectResultsOn;
// state variables
bool mIsInComment;
bool mCommentIsMultiline;
public:
// assembleResultString == TRUE - instructs painter
// to collect each chunk of srouce passed to ProcessSource(),
// so that results cann be futher obtained in a single string
// instead of vector of block descriptions
SourcePainter( bool assembleResultString = TRUE );
virtual ~SourcePainter() {}
// can be called multiple times (e.g. on each source line)
void ProcessSource( char* src, int srcLen );
// method, for manually adjusting state of source painter
void SetState( bool isInComment,
bool commentIsMultiline );
// reinitializes object - clears results of previouse processing
void Init( bool assembleResultString = TRUE );
// generates string of highlighted source for the scipting
// language given by "tags" argument
virtual void GetResultString(string& result, MarkupTagsT tags);
// returns vector of block descriptors, see SPBlockListT definition
// (block descriptors can be used for fast custom hightlighted text generation)
SPBlockListT& GetBlocks();
// NOTE:: static method
// returns if the given word is a reserved word or basic type identifier
static bool IsKeyword( char* word, int wordLen );
};
#endif

View File

@ -0,0 +1,736 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: To provide a simple _framework_
// for series of source code parsers with
// compatible interfaces
// Author: Aleksandras Gluchovas
// Modified by: AG on 28/12/98
// Created: 22/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef __SRCPARSER_G__
#define __SRCPARSER_G__
#if defined( wxUSE_TEMPLATE_STL )
#include <vector>
#ifdef WIN32
#include <bstring.h>
#else
#include <strclass.h>
#include <string.h>
#endif
#else
#include "wx/string.h"
#include "wxstlvec.h"
// FOR NOW:: quick n' dirty:
#define string wxString
#endif
#include "markup.h" // markup tags used in spOperator::GetFullName()
// context class list in "inside-out" order :
class spContext;
class spParameter;
class spAttribute;
class spOperation;
class spEnumeration;
class spTypeDef;
class spPreprocessorLine;
class spClass;
class spNameSpace;
class spFile;
// source context visibilities
enum SRC_VISIBLITY_TYPES
{
SP_VIS_PUBLIC,
SP_VIS_PROTECTED,
SP_VIS_PRIVATE
};
// class types
enum SP_CLASS_TYPES
{
SP_CLTYPE_CLASS,
SP_CLTYPE_TEMPLATE_CLASS,
SP_CLTYPE_STRUCTURE,
SP_CLTYPE_UNION,
SP_CLTYPE_INTERFACE
};
// inheritance types
enum SP_INHERITANCE_TYPES
{
SP_INHERIT_VIRTUAL,
SP_INHERIT_PUBLIC,
SP_INHERIT_PRIVATE
};
// proprocessor definitions types (specific to C++ code)
enum SP_PREP_DEFINITION_TYPES
{
SP_PREP_DEF_DEFINE_SYMBOL,
SP_PREP_DEF_REDEFINE_SYMBOL,
SP_PREP_DEF_INCLUDE_FILE,
SP_PREP_DEF_OTHER
};
// common context types
#define SP_CTX_UNKNOWN 0x000
#define SP_CTX_FILE 0x001
#define SP_CTX_NAMESPACE 0x002
#define SP_CTX_CLASS 0x004
#define SP_CTX_TYPEDEF 0x008
#define SP_CTX_PREPROCESSOR 0x010
#define SP_CTX_ENUMERATION 0x020
#define SP_CTX_ATTRIBUTE 0x040
#define SP_CTX_OPERATION 0x080
#define SP_CTX_PARAMETER 0x100
// other (custom) context codes may be defined elsewere, however they should
// not clash with above codes for common type and also should not
// exceed 16-bits of in value
// masks all context types (up to 16 custom context can be defined)
#define SP_CTX_ANY 0xFFFF
class spComment;
#if defined( wxUSE_TEMPLATE_STL )
// context members
typedef vector<spContext*> MMemberListT;
// comments list
typedef vector<spComment*> MCommentListT;
// list of parameters
typedef vector<spParameter*> MParamListT;
// string list
typedef vector<string> StrListT;
#else
typedef spContext* spContextPtrT;
typedef spComment* spCommentPtrT;
typedef spParameter* spParameterPtrT;
typedef WXSTL_VECTOR_SHALLOW_COPY(spContextPtrT) MMemberListT;
typedef WXSTL_VECTOR_SHALLOW_COPY(spCommentPtrT) MCommentListT;
typedef WXSTL_VECTOR_SHALLOW_COPY(spParameterPtrT) MParamListT;
typedef WXSTL_VECTOR_SHALLOW_COPY(string) StrListT;
#endif;
// base class for all visitors of source code contents
class spVisitor
{
protected:
bool mSiblingSkipped;
bool mChildSkipped;
int mContextMask;
spContext* mpCurCxt;
public:
// methods invoked by context
// method invoked from user's controling code
// to visit all nodes staring at the given context.
// Content is sorted if requrired, see comments
// spClass on sorting the class members
void VisitAll( spContext& atContext,
bool sortContent = TRUE
);
// methods invoked by visitor
// goes to the next context in the outter scope
// NOTE:: should not be invoked more than once while
// visiting certain context
void SkipSiblings();
// prevents going down into the contexts contained by
// the current context
// NOTE:: the same as above
void SkipChildren();
// can be called only in from visiting procedure
void RemoveCurrentContext();
// method enables fast filtered traversal
// of source content, e.g. collecting only classes,
// or only global functions
// arg. context - can contain combination of contexts concatinated
// with bitwise OR, e.g. SP_CTX_CLASS | SP_CTX_NAMESPACE
//
// method can be invoked from the user's controling as well as
// from within the visting procedure
void SetFilter( int contextMask );
// methods should be implemneted by specific visitor:
// NOTE:: Do not confuse visiting with parsing, first
// the source is parsed, and than can be visited
// multiple times by variouse visitors (there can
// be more the one visitor visiting content at a time)
virtual void VisitFile( spFile& fl ) {}
virtual void VisitNameSpace( spNameSpace& ns ) {}
virtual void VisitClass( spClass& cl ) {}
virtual void VisitEnumeration( spEnumeration& en ) {}
virtual void VisitTypeDef( spTypeDef& td ) {}
virtual void VisitPreprocessorLine( spPreprocessorLine& pd ) {}
virtual void VisitAttribute( spAttribute& attr ) {}
virtual void VisitOperation( spOperation& op ) {}
virtual void VisitParameter( spParameter& param ) {}
virtual void VisitCustomContext( spContext& ctx ) {}
};
// stores one section of comments,
// multiple sections can be put to geather
// and attached to some context
class spComment
{
public:
string mText;
bool mIsMultiline; // multiline comments ar those with /**/'s
// TRUE, if these was an empty empty
// line above single line comment
bool mStartsPar;
public:
bool IsMultiline() const;
bool StartsParagraph() const;
string& GetText();
// contstant version of GetText()
string GetText() const;
};
// abstract base class for common (to most languages) code
// contexts (constructs), e.g file, namespace, class, operation,
// etc
class spContext
{
protected:
// "linked" list of comments belonging to this context
MCommentListT mComments;
// NULL, if this is file context
MMemberListT mMembers;
// NULL, if this is top-most context
spContext* mpParent;
// points to context object, where the this context
// was originally declared, meaning that this object
// is redeclaration (or if in the case of operation
// this context object most probably referres to the
// implemnetation in .cpp file for example)
// is NULL, if this object referres to the first occurence
// of the context
spContext* mpFirstOccurence;
// used, to avoid excessive sorting of context's agreggates
bool mAlreadySorted;
public:
// source line number, (-1) if unknown
int mSrcLineNo;
// offset of context in the source file, (-1) if unknown
int mSrcOffset;
// lentgh of the context in characters, (-1) if unknown
int mContextLength;
// source line number, in which this cotext ends, (-1) if unknown
int mLastScrLineNo;
// fields are valid, if the may contain other contexts nested inside
int mHeaderLength;
int mFooterLength;
// zero-based index of the first character of
// this context in the source line, (-1) if unknown
int mFirstCharPos;
// zero-based index of the first character of
// this context in the last source line of this context, (-1) if unknown
int mLastCharPos;
// see SRC_VISIBLITY_TYPES enumeration
int mVisibility;
// TRUE, if context does not really exist in the source
// but was created by external tools (e.g. forward engineering)
bool mIsVirtualContext;
bool mVirtualContextHasChildren;
// body of the context in case (mIsVirtual == TRUE)
string mVirtualContextBody;
string mVittualContextFooter;
// e.g. can be used by documentation generator to store
// reference to section object
void* mpUserData;
public:
// universal identifier of the context (e.g. class name)
string mName;
public:
// default constructor
spContext();
// automatically destorys all aggregated contexts
// (thus, it's enought to call destructor of root-context)
virtual ~spContext();
// see mUererData member;
void* GetUserData() { return mpUserData; }
// sets untyped pointer to user data
void SetUserData( void* pUserData )
{ mpUserData = pUserData; }
// searches the whole context tree for the cotnexts
// which match given masks, pust results into lst array
void GetContextList( MMemberListT& lst, int contextMask );
// used by default visitor's implementation
bool IsSorted();
/*** forward/reverse ingineering fecilities ***/
bool PositionIsKnown();
bool IsVirtualContext();
bool VitualContextHasChildren();
void SetVirtualContextBody( const string& body,
bool hasChildren = FALSE,
const string& footer = "" );
string GetVirtualContextBody();
string GetFooterOfVirtualContextBody();
// can be overriden by top-level context classes
// to find-out ot the source-fragment of this
// context using it's position information
virtual string GetBody( spContext* pCtx = NULL );
virtual string GetHeader( spContext* pCtx = NULL );
// TRUE, if there is at least one entry
// in the comment list of this context
bool HasComments();
inline MCommentListT& GetCommentList()
{ return mComments; }
// should be overriden, if the context supports sorting
// of it's members
virtual void SortMembers() {}
// returns identifier of this context
inline string& GetName() { return mName; }
// returns -1, if souce line # is unknow
inline int GetSourceLineNo() { return mSrcLineNo; }
// see comments on mpFirstOccurence member variable
bool IsFirstOccurence();
spContext* GetFirstOccurence();
// returns not-NULL value if this context
// is aggregated by another cotnext
spContext* GetOutterContext();
// perhaps more intuitive alias for `GetOutterContext()'
inline spContext* GetParent() { return mpParent; }
bool HasOutterContext();
// add one aggregate (or child) into this context
void AddMember ( spContext* pMember );
MMemberListT& GetMembers();
// append comment to the comment list decribing
// this context
void AddComment( spComment* pComment );
// returns NULL, if the context with the given
// name and type is not contained by this context
// and it's children. Children's children are not
// searched recursivelly if searchSubMembers is FALSE
spContext* FindContext( const string& identifier,
int contextType = SP_CTX_ANY,
bool searchSubMembers = TRUE
);
// removes this context from it's parent
// (NOTE:: context should have an outter cotnext
// to when this method is called, otherwise removal
// will result assertion failure)
void RemoveThisContext();
// returns TRUE, if this object is aggregated in the file
bool IsInFile();
// TRUE, if outter context is a namespace
bool IsInNameSpace();
// TRUE, if outter context is a class
bool IsInClass();
// TRUE, if outter cotext is an operation (TRUE for "spParameter"s)
bool IsInOperation();
// TRUE if the context is public
bool IsPublic() const { return mVisibility == SP_VIS_PUBLIC; }
// NOTE:: method returns not the type of this object
// but the file/namespace/class/operation or file in which this
// attribute is contained. First, check for the type of
// context using the above method.
// Requiering container which does not exist, will result
// in assertion failure
spClass& GetClass();
spFile& GetFile();
spNameSpace& GetNameSpace();
spOperation& GetOperation();
// each new context should override this method
// to return it's specific type
virtual int GetContextType() { return SP_CTX_UNKNOWN; }
// perhaps more intuitive short-cut
inline int GetType() { return GetContextType(); }
// derived classes override this to invoke VisitXXX method
// which corresponds to the class of specific context,
// - this is what the "Visitor" pattern told us ^)
// if method is not overriden, then it's probably user-defined
// custom context
virtual void AcceptVisitor( spVisitor& visitor )
{ visitor.VisitCustomContext( *this ); };
// called by visitors, to remove given subcontext
// of this context object
void RemoveChild( spContext* pChild );
void RemoveChildren();
spContext* GetEnclosingContext( int mask = SP_CTX_ANY );
};
// stores information about single argument of operation
class spParameter : public spContext
{
public:
// type of argument (parameter)
string mType;
// "stringified" initial value
string mInitVal;
public:
virtual int GetContextType() { return SP_CTX_PARAMETER; }
virtual void AcceptVisitor( spVisitor& visitor )
{ visitor.VisitParameter( *this ); }
};
// stores information about member(or global) variable
class spAttribute : public spContext
{
public:
// type of the attribute
string mType;
// it's initial value
string mInitVal;
// constantness
bool mIsConstant;
public:
virtual int GetContextType() { return SP_CTX_ATTRIBUTE; }
virtual void AcceptVisitor( spVisitor& visitor )
{ visitor.VisitAttribute( *this ); }
};
class spOperation : public spContext
{
public:
// type of return value
string mRetType;
// argument list
//MParamListT mParams;
// TRUE, if operation does not modify
// the content of the object
bool mIsConstant;
// flag, specific to C++
bool mIsVirtual;
// TRUE, if definition follows the declaration immediatelly
bool mHasDefinition;
// scope if any (e.g. MyClass::MyFunction(), scope stirng is "MyClass" )
// usually found along with implementation of the method, which is now skipped
string mScope;
public:
spOperation();
// returns full declaration of the operations
// (ret val., identifier, arg. list),
// arguments are marked up with italic,
// default values marked up with bold-italic,
// all the rest is marked as bold
// NOTE:: this method may be overriden by class
// specific to concrete parser, to provide
// language-dependent reperesnetation of
// operation and it's argumetn list
//
// the default implementation outputs name in
// C++/Java syntax
virtual string GetFullName(MarkupTagsT tags);
virtual int GetContextType() { return SP_CTX_OPERATION; }
virtual void AcceptVisitor( spVisitor& visitor )
{ visitor.VisitOperation( *this ); }
};
// stores infromation about preprocessor directive
class spPreprocessorLine : public spContext
{
public:
// prepocessor statement including '#' and
// attached multiple lines with '\' character
string mLine;
int mDefType; // see SP_PREP_DEFINITION_TYPES enumeration
public:
virtual int GetContextType() { return SP_CTX_PREPROCESSOR; }
virtual int GetStatementType() { return mDefType; }
string CPP_GetIncludedFileNeme();
virtual void AcceptVisitor( spVisitor& visitor )
{ visitor.VisitPreprocessorLine( *this ); }
};
// stores information about the class
class spClass : public spContext
{
public:
// list of superclasses/interfaces
StrListT mSuperClassNames;
// see SP_CLASS_TYPES enumeration
int mClassSubType;
// see SP_INHERITANCE_TYPES enumeration
int mInheritanceType;
// valid if mClassSubType is SP_CLTYPE_TEMPLATE_CLASS
string mTemplateTypes;
// TRUE, if it's and interface of abstract base class
bool mIsAbstract;
public:
// sorts class members in the following order:
//
// (by "privacy level" - first private, than protected, public)
//
// within above set
//
// (by member type - attributes first, than methods, nested classes)
//
// within above set
//
// (by identifier of the member)
virtual void SortMembers();
virtual int GetContextType() { return SP_CTX_CLASS; }
virtual void AcceptVisitor( spVisitor& visitor )
{ visitor.VisitClass( *this ); }
};
// stores information about enum statement
class spEnumeration : public spContext
{
public:
string mEnumContent; // full-text content of enumeration
public:
virtual int GetContextType() { return SP_CTX_ENUMERATION; }
virtual void AcceptVisitor( spVisitor& visitor )
{ visitor.VisitEnumeration( *this ); }
};
class spTypeDef : public spContext
{
public:
// the original type which is redefined
// by this type definition
string mOriginalType;
public:
virtual int GetContextType() { return SP_CTX_TYPEDEF; }
virtual void AcceptVisitor( spVisitor& visitor )
{ visitor.VisitTypeDef( *this ); }
};
// NOTE:: files context may be put to other
// file context, resulting in a collection
// of parsed file contexts, with a virtual "superfile"
class spFile : public spContext
{
public:
// since file name cannot be determined from
// source code, filling in this field is optional
string mFileName;
public:
virtual int GetContextType() { return SP_CTX_FILE; }
virtual void AcceptVisitor( spVisitor& visitor )
{ visitor.VisitFile( *this ); }
};
//TODO:: comments.
class SourceParserPlugin
{
public:
virtual bool CanUnderstandContext( char* cur, char* end, spContext* pOuttterCtx ) = 0;
virtual void ParseContext( char* start, char*& cur, char* end, spContext* pOuttterCtx ) = 0;
};
// abstract interface for source parsers
// which can output parsing results in the
// form of context-tree, where each node
// should be derivative of spContext, (see
// above classes)
class SourceParserBase
{
private:
// auto-resizing file buffer, created in ParseFile()
// to reuse large heap block for multiple parsings
char* mpFileBuf;
int mFileBufSz;
protected:
SourceParserPlugin* mpPlugin;
protected:
// value is set in the derived parser classes
int mParserStatus;
public:
SourceParserBase();
virtual ~SourceParserBase();
// loads entier source file(as text) into memory,
// and passes it's contents to ParseAll() method,
// memory occupied by source text is released after
// parsing is done
//
// (NOTE:: this is the default implementation),
virtual spFile* ParseFile( const char* fname );
// should returns the root-node of the created context tree
// (user is responsible for releasing it from the heep)
// "end" should point to the (last character + 1) of the
// source text area
virtual spFile* Parse( char* start, char* end ) = 0;
// returns parser "status word" (specific to concrete parser)
int GetParserStatus() { return mParserStatus; }
void SetPlugin( SourceParserPlugin* pPlugin );
};
#endif

View File

@ -0,0 +1,664 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: Contrib. demo
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 27/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef __WXSTLAC_G__
#define __WXSTLAC_G__
#include <stddef.h>
#include <sys/types.h>
#include <memory.h>
#include <limits.h>
#include <new.h>
// the below macro used internally (see actual interface after this macro)
// arguments:
//
// ARG_IS_UNIQUE
// ASSOC_CONT_CLASS_NAME
//
// ARG_VALUE_TYPE
// ARG_KEY_TYPE
// ARG_ACTUAL_VALUE_TYPE
//
// _KEY_NAME
// _VALUE_NAME
//
// _X_KEY_NAME
// _X_VALUE_NAME
//
// _INSERT_METHOD_DEFINITION
#define __DEFINE_ASOC_CLASS( ARG_IS_UNIQUE, \
FUNCTOR,\
ASSOC_CONT_CLASS_NAME, \
ARG_VALUE_TYPE, \
ARG_KEY_TYPE, \
ARG_ACTUAL_VALUE_TYPE, \
_KEY_NAME, \
_VALUE_NAME, \
_X_KEY_NAME, \
_X_VALUE_NAME, \
_INSERT_METHOD_DEFINITION \
) class \
ASSOC_CONT_CLASS_NAME\
{\
protected:\
\
public:\
typedef ARG_VALUE_TYPE value_type;\
typedef ARG_KEY_TYPE key_type;\
typedef ARG_ACTUAL_VALUE_TYPE actual_value_type;\
\
typedef value_type* pointer;\
typedef value_type& reference;\
\
typedef const value_type& const_reference;\
\
typedef FUNCTOR key_compare;\
typedef key_compare Compare;\
\
protected:\
\
struct tree_node \
{\
tree_node* mpParent;\
tree_node* mpLeft;\
tree_node* mpRight;\
\
value_type mData;\
};\
\
typedef tree_node* node_ref_type;\
\
node_ref_type mpRoot;\
node_ref_type mpLeftMost;\
node_ref_type mpRightMost;\
\
node_ref_type mpFreeListHead;\
int mKeyIsUnique;\
\
key_compare mCmpFunctorObj;\
\
public:\
\
static inline node_ref_type next( node_ref_type pNode )\
{\
if ( pNode->mpRight ) \
{\
pNode = pNode->mpRight;\
\
while ( pNode->mpLeft ) pNode = pNode->mpLeft;\
\
return pNode;\
}\
else\
if ( pNode->mpParent )\
{\
if ( pNode == pNode->mpParent->mpLeft )\
\
return pNode->mpParent;\
\
pNode = pNode->mpParent;\
\
node_ref_type prevNode = pNode;\
pNode = pNode->mpParent;\
\
while(pNode)\
{\
if ( pNode->mpRight &&\
pNode->mpRight != prevNode\
) return pNode;\
\
prevNode = pNode;\
pNode= pNode->mpParent;\
}\
\
return 0;\
}\
else\
return 0;\
}\
\
static inline node_ref_type prev( node_ref_type pNode )\
{\
if ( pNode->mpLeft ) \
{\
pNode = pNode->mpLeft;\
\
while ( pNode->mpRight ) pNode = pNode->mpRight;\
\
return pNode;\
}\
else\
if ( pNode->mpParent )\
{\
if ( pNode == pNode->mpParent->mpRight )\
return pNode->mpParent;\
\
pNode = pNode->mpParent;\
\
node_ref_type prevNode = pNode;\
pNode = pNode->mpParent;\
\
while(pNode)\
{\
if ( pNode->mpLeft &&\
pNode->mpLeft != prevNode\
) return pNode;\
\
prevNode = pNode;\
pNode= pNode->mpParent;\
}\
\
return 0;\
}\
else \
return 0;\
}\
\
protected:\
\
inline int are_equel( const key_type& x, const key_type& y )\
{\
return ( !mCmpFunctorObj(x,y) && !mCmpFunctorObj(y,x) );\
}\
\
inline int is_less( const key_type& x, const key_type& y )\
{\
return mCmpFunctorObj(x,y);\
}\
\
static inline const actual_value_type& value( node_ref_type pNode )\
{\
return pNode->_VALUE_NAME;\
}\
\
static inline const key_type& key( node_ref_type pNode )\
{\
return pNode->_KEY_NAME;\
}\
\
inline node_ref_type AllocNode() \
{ \
if ( mpFreeListHead ) \
{\
node_ref_type pFreeNode = mpFreeListHead;\
mpFreeListHead = mpFreeListHead->mpLeft;\
\
return pFreeNode;\
}\
else\
{\
char* pHeapBlock = new char[sizeof(tree_node)];\
\
return (node_ref_type)pHeapBlock;\
}\
}\
\
inline void DestroyFreeList()\
{\
while ( mpFreeListHead )\
{\
node_ref_type tmp = mpFreeListHead;\
mpFreeListHead = mpFreeListHead->mpLeft;\
\
delete [](char*)tmp;\
}\
}\
\
inline void RecycleNode( node_ref_type pNode ) \
{\
pNode->mpLeft = mpFreeListHead;\
mpFreeListHead = pNode;\
}\
\
inline node_ref_type do_insert(const value_type& x = value_type() )\
{\
node_ref_type pNewNode = AllocNode();\
\
pNewNode->mpParent = \
pNewNode->mpLeft =\
pNewNode->mpRight = 0;\
\
node_ref_type pCurrent = mpRoot;\
node_ref_type pParent = 0;\
\
while (pCurrent) \
{\
if ( mKeyIsUnique && are_equel( _X_KEY_NAME, value(pCurrent) ) )\
{\
RecycleNode(pNewNode);\
return 0;\
}\
\
pParent = pCurrent;\
\
pCurrent = is_less( _X_KEY_NAME, value(pCurrent) ) \
? pCurrent->mpLeft \
: pCurrent->mpRight;\
}\
\
pNewNode->mpParent = pParent;\
\
if(pParent)\
\
if( is_less(_X_KEY_NAME, value(pParent) ) )\
\
pParent->mpLeft = pNewNode;\
else\
pParent->mpRight = pNewNode;\
else\
mpRoot = pNewNode;\
\
new ( &pNewNode->_KEY_NAME ) key_type(_X_KEY_NAME);\
new ( &pNewNode->_VALUE_NAME ) actual_value_type(_X_VALUE_NAME);\
\
if ( prev(pNewNode) == 0 ) mpLeftMost = pNewNode;\
if ( next(pNewNode) == 0 ) mpRightMost = pNewNode;\
\
return pNewNode;\
}\
\
friend class iterator;\
\
public:\
\
class iterator;\
class const_iterator;\
\
class iterator \
{\
public:\
node_ref_type mpNode;\
friend class CONT_CLASS_NAME;\
friend class const_iterator;\
friend class const_reverse_iterator;\
\
inline iterator( node_ref_type pNode )\
{\
mpNode = pNode;\
}\
\
public:\
inline iterator() {}\
inline int operator==( const iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
inline int operator!=( const iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
\
inline iterator( const iterator& other )\
{\
mpNode = other.mpNode;\
}\
\
inline const iterator& operator=( const iterator& other )\
{\
mpNode = other.mpNode;\
return *this;\
}\
\
inline const iterator& operator--() \
{\
mpNode = ASSOC_CONT_CLASS_NAME::prev(mpNode);\
return *this;\
}\
\
inline iterator operator--(int)\
{\
iterator tmp = *this;\
mpNode = ASSOC_CONT_CLASS_NAME::prev(mpNode);\
return tmp;\
}\
\
inline const iterator& operator++() \
{\
mpNode = ASSOC_CONT_CLASS_NAME::next(mpNode);\
return *this;\
}\
\
inline iterator operator++(int)\
{\
iterator tmp = *this;\
mpNode = ASSOC_CONT_CLASS_NAME::next(mpNode);\
return tmp;\
}\
\
inline reference operator*() const { return mpNode->mData; }\
};\
\
\
class const_iterator \
{\
public:\
node_ref_type mpNode;\
friend class CONT_CLASS_NAME;\
friend class const_reverse_iterator;\
\
inline const_iterator( node_ref_type pNode )\
{\
mpNode = pNode;\
}\
\
public:\
inline const_iterator() {}\
\
inline int operator==( const const_iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
inline int operator!=( const const_iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
\
inline const_iterator( const iterator& other )\
{\
mpNode = other.mpNode;\
}\
\
inline const_iterator( const const_iterator& other )\
{\
mpNode = other.mpNode;\
}\
\
inline const const_iterator& operator=( const const_iterator& other )\
{\
mpNode = other.mpNode;\
return *this;\
}\
\
inline const const_iterator& operator--() \
{\
mpNode = ASSOC_CONT_CLASS_NAME::prev(mpNode);\
return *this;\
}\
\
inline const_iterator operator--(int)\
{\
const_iterator tmp = *this;\
mpNode = ASSOC_CONT_CLASS_NAME::prev(mpNode);\
return tmp;\
}\
\
inline const const_iterator& operator++() \
{\
mpNode = ASSOC_CONT_CLASS_NAME::next(mpNode);\
return *this;\
}\
\
inline const_iterator operator++(int)\
{\
const_iterator tmp = *this;\
mpNode = ASSOC_CONT_CLASS_NAME::next(mpNode);\
return tmp;\
}\
\
inline const_reference operator*() const { return mpNode->mData; }\
};\
\
public:\
\
inline ASSOC_CONT_CLASS_NAME( key_compare cmpFunctorObj = key_compare(),\
int keyIsUnique = ARG_IS_UNIQUE )\
: mpFreeListHead( 0 ),\
mKeyIsUnique( keyIsUnique ),\
mCmpFunctorObj( cmpFunctorObj )\
{\
mpLeftMost = 0;\
mpRightMost = 0;\
mpRoot = 0;\
}\
\
inline ~ASSOC_CONT_CLASS_NAME() \
{ \
erase( begin(), end() ); \
\
DestroyFreeList();\
}\
\
inline iterator begin() { return mpLeftMost; }\
inline iterator end() { return 0; }\
\
inline const_iterator begin() const { return mpLeftMost; }\
inline const_iterator end() const { return 0; }\
\
inline iterator lower_bound( const key_type& x )\
{ \
node_ref_type pCurrent = mpRoot;\
\
while( pCurrent )\
{\
node_ref_type pParent = pCurrent;\
\
if( are_equel( x, key(pCurrent) ) )\
\
return (pCurrent);\
else\
pCurrent = is_less( x, key(pCurrent) ) \
? pCurrent->mpLeft \
: pCurrent->mpRight;\
\
if ( !pCurrent ) return (pParent);\
}\
\
return begin();\
}\
\
inline const_iterator lower_bound( const key_type& x ) const\
\
{ return const_iterator( lower_bound(x).mpNode ); }\
\
inline iterator upper_bound( const key_type& x )\
{\
node_ref_type pCurrent = mpRoot;\
\
while( pCurrent )\
{\
node_ref_type pParent = pCurrent;\
\
if( are_equel( x, key(pCurrent) ) )\
\
return (pCurrent);\
else\
pCurrent = is_less( x, key(pCurrent) ) \
? pCurrent->mpLeft \
: pCurrent->mpRight;\
\
if ( !pCurrent ) return next(pParent);\
}\
\
return end();\
}\
\
inline const_iterator upper_bound( const key_type& x ) const\
\
{ return const_iterator( upper_bound(x).mpNode ); }\
\
inline iterator find( const key_type& x )\
{\
node_ref_type pCurrent = mpRoot;\
\
while( pCurrent )\
{\
if( are_equel( x, key(pCurrent) ) )\
\
return (pCurrent);\
else\
pCurrent = is_less( x, key(pCurrent) ) \
? pCurrent->mpLeft \
: pCurrent->mpRight;\
}\
\
return end();\
}\
\
inline const_iterator find( const key_type& x ) const\
\
{ return const_iterator( find(x).mpNode ); }\
\
inline void erase(iterator first, iterator last)\
{\
if ( first.mpNode == 0 ) return;\
\
while( first != last ) \
{\
iterator next = first;\
++next;\
erase( first );\
first = next;\
}\
}\
\
inline void erase(iterator position)\
{\
if ( position.mpNode == 0 ) return;\
\
node_ref_type pZ = position.mpNode;\
node_ref_type pX, pY;\
\
if ( pZ == mpLeftMost ) mpLeftMost = next(pZ);\
if ( pZ == mpRightMost ) mpRightMost = prev( pZ );\
\
if ( !pZ->mpLeft || !pZ->mpRight )\
\
pY = pZ;\
else \
{\
pY = pZ->mpRight;\
\
while (pY->mpLeft) \
\
pY = pY->mpLeft;\
}\
\
if ( pY->mpLeft)\
\
pX = pY->mpLeft;\
else\
pX = pY->mpRight;\
\
if ( pX ) pX->mpParent = pY->mpParent;\
\
if (pY->mpParent)\
\
if (pY == pY->mpParent->mpLeft )\
\
pY->mpParent->mpLeft = pX;\
else\
pY->mpParent->mpRight = pX;\
else\
mpRoot = pX;\
\
node_ref_type toRemove = 0;\
\
if (pY != pZ) {\
\
pY->mpLeft = pZ->mpLeft;\
\
if (pY->mpLeft) pY->mpLeft->mpParent = pY;\
\
pY->mpRight = pZ->mpRight;\
\
if ( pY->mpRight ) \
\
pY->mpRight->mpParent = pY;\
\
pY->mpParent = pZ->mpParent;\
\
if (pZ->mpParent)\
\
if (pZ == pZ->mpParent->mpLeft)\
\
pZ->mpParent->mpLeft = pY;\
else\
pZ->mpParent->mpRight = pY;\
else\
mpRoot = pY;\
\
toRemove = pZ;\
} \
else \
toRemove = pY;\
\
value(toRemove).~actual_value_type();\
key(toRemove).~actual_value_type();\
\
RecycleNode( toRemove );\
}\
\
_INSERT_METHOD_DEFINITION\
}
// do not undefine ___WXSTL_COMMA, where associated containers are defined!
// (it is used as workaround for constraints of C-Preprocessor's nested macros)
#define ___WXSTL_COMMA ,
#define __DEFINE_MAP(ARG_IS_UNIQUE, KEY_TYPE, VAL_TYPE, FUNCTOR ) __DEFINE_ASOC_CLASS( ARG_IS_UNIQUE,\
FUNCTOR,\
__WXSTLMAP_##KEY_TYPE##VAL_TYPE##ARG_IS_UNIQUE, \
struct key_value_pair { KEY_TYPE first ; \
VAL_TYPE second;\
key_value_pair() {}\
key_value_pair( const KEY_TYPE& key ___WXSTL_COMMA const VAL_TYPE& value ) \
: first(key) ___WXSTL_COMMA second( value ) {} \
} , \
KEY_TYPE,\
VAL_TYPE,\
mData.first, mData.second, x.first, x.second, \
struct insert_result_iterator\
{\
iterator first;\
int second;\
};\
inline insert_result_iterator insert( const value_type& x )\
{\
insert_result_iterator result;\
\
result.first = do_insert(x);\
result.second = ( result.first == end() ) ? 0 : 1;\
\
return result;\
} )
#define __DEFINE_SET(ARG_IS_UNIQUE, KEY_TYPE, FUNCTOR ) __DEFINE_ASOC_CLASS( ARG_IS_UNIQUE,\
FUNCTOR,\
__WXSTLSET_##TYPE##ARG_IS_UNIQUE, \
KEY_TYPE,\
KEY_TYPE,\
KEY_TYPE,\
mData, mData, x, x, \
struct insert_result_iterator\
{\
iterator first;\
int second;\
};\
inline insert_result_iterator insert( const value_type& x )\
{\
insert_result_iterator result;\
\
result.first = do_insert(x);\
result.second = ( result.first == end() ) ? 0 : 1;\
\
return result;\
} )
// helper macros to create functor objects for associative containers of the given type
#define LESS_THEN_FUNCTOR(TYPE) struct \
{ inline int operator()(const TYPE& x, const TYPE& y ) const { return x < y; } }
#define GREATER_THEN_FUNCTOR(TYPE) struct \
{ inline int operator()(const TYPE& x, const TYPE& y ) const { return x > y; } }
// functor argument should be created using the two above macros
// or passing own class with method "operator()(const TYPE&,cosnt TYPE&)" defined in it
#define WXSTL_MAP( KEY_TYPE, VALUE_TYPE, FUNCTOR ) __DEFINE_MAP( 1 ,KEY_TYPE, VALUE_TYPE, FUNCTOR)
#define WXSTL_MULTIMAP( KEY_TYPE, VALUE_TYPE, FUNCTOR ) __DEFINE_MAP( 0 ,KEY_TYPE, VALUE_TYPE, FUNCTOR)
#define WXSTL_SET( KEY_TYPE, FUNCTOR ) __DEFINE_SET( 1 ,KEY_TYPE, FUNCTOR )
#define WXSTL_MULTISET( KEY_TYPE, FUNCTOR ) __DEFINE_SET( 0 ,KEY_TYPE, FUNCTOR )
#endif

View File

@ -0,0 +1,555 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: Contrib. demo
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 27/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef __WXSTLLST_G__
#define __WXSTLLST_G__
#include <stddef.h>
#include <sys/types.h>
#include <memory.h>
#include <limits.h>
#include <new.h>
// VERSION:: 0.2 (copy-constructor/adign-op added)
// FOR NOW:: class-member operators "new" and "delete"
// are ignored by list class, memory allocated
// and freed using global operators
typedef int Type;
// the below macro used internally (see actual interface after this macro)
#define __DEFINE_STL_LIST(listClass,Type) class \
listClass \
{\
public:\
\
typedef Type value_type;\
typedef value_type* pointer;\
typedef const value_type* const_pointer;\
typedef value_type& reference;\
typedef const value_type& const_reference;\
typedef size_t size_type;\
typedef ptrdiff_t difference_type;\
\
protected:\
struct list_node\
{\
list_node* mpNext;\
list_node* mpPrev;\
value_type mData;\
};\
\
typedef list_node* node_ref_type;\
\
node_ref_type mpFreeListHead;\
node_ref_type mpTerminator;\
size_type mSize;\
\
inline node_ref_type AllocNode() \
{ \
if ( mpFreeListHead ) \
{\
node_ref_type pFreeNode = mpFreeListHead;\
mpFreeListHead = mpFreeListHead->mpPrev;\
\
return pFreeNode;\
}\
else\
{\
char* pHeapBlock = new char[sizeof(list_node)];\
\
return (node_ref_type)pHeapBlock;\
}\
}\
\
inline void DestroyFreeList()\
{\
while ( mpFreeListHead )\
{\
node_ref_type tmp = mpFreeListHead;\
mpFreeListHead = mpFreeListHead->mpPrev;\
\
delete [](char*)tmp;\
}\
}\
\
inline void RecycleNode( node_ref_type pNode ) \
{\
pNode->mpPrev = mpFreeListHead;\
mpFreeListHead = pNode;\
}\
\
public:\
\
class iterator \
{\
public:\
node_ref_type mpNode;\
friend class listClass;\
friend class const_iterator;\
friend class const_reverse_iterator;\
\
protected:\
iterator( node_ref_type pNode )\
{\
mpNode = pNode;\
}\
\
public:\
iterator() {}\
int operator==( const iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
int operator!=( const iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
\
inline iterator( const iterator& other )\
{\
mpNode = other.mpNode;\
}\
\
inline const iterator& operator--() \
{\
mpNode = mpNode->mpPrev;\
return *this;\
}\
\
inline iterator operator--(int)\
{\
iterator tmp = *this;\
mpNode = mpNode->mpPrev;\
return tmp;\
}\
\
inline const iterator& operator++() \
{\
mpNode = mpNode->mpNext;\
return *this;\
}\
\
inline iterator operator++(int)\
{\
iterator tmp = *this;\
mpNode = mpNode->mpNext;\
return tmp;\
}\
\
inline reference operator*() const { return mpNode->mData; }\
};\
\
\
class const_iterator \
{\
protected:\
node_ref_type mpNode;\
friend class listClass;\
\
protected:\
const_iterator( node_ref_type pNode )\
{\
mpNode = pNode;\
}\
\
public:\
\
const_iterator() {}\
int operator==( const const_iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
int operator!=( const const_iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
\
\
inline const_iterator( const iterator& other )\
{\
mpNode = other.mpNode;\
}\
\
inline const const_iterator& operator--() \
{\
mpNode = mpNode->mpPrev;\
return *this;\
}\
\
inline const_iterator operator--(int)\
{\
const_iterator tmp = *this;\
mpNode = mpNode->mpPrev;\
return tmp;\
}\
\
inline const const_iterator& operator++() \
{\
mpNode = mpNode->mpNext;\
return *this;\
}\
\
inline const_iterator operator++(int)\
{\
const_iterator tmp = *this;\
mpNode = mpNode->mpNext;\
return tmp;\
}\
\
inline const_reference operator*() const { return mpNode->mData; }\
};\
\
typedef iterator OutputIterator;\
typedef const_iterator InputIterator;\
\
class reverse_iterator \
{\
public:\
node_ref_type mpNode;\
friend class listClass;\
friend class const_reverse_iterator;\
\
protected:\
reverse_iterator ( node_ref_type pNode )\
{\
mpNode = pNode;\
}\
\
public:\
\
reverse_iterator() {}\
int operator==( const reverse_iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
int operator!=( const reverse_iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
\
inline reverse_iterator( const reverse_iterator& other )\
{\
mpNode = other.mpNode;\
}\
\
inline const reverse_iterator& operator--() \
{\
mpNode = mpNode->mpNext;\
return *this;\
}\
\
inline reverse_iterator operator--(int)\
{\
reverse_iterator tmp = *this;\
mpNode = mpNode->mpPrev;\
return tmp;\
}\
\
inline const reverse_iterator & operator++() \
{\
mpNode = mpNode->mpNext;\
return *this;\
}\
\
inline reverse_iterator operator++(int)\
{\
reverse_iterator tmp = *this;\
mpNode = mpNode->mpPrev;\
return tmp;\
}\
\
inline const_reference operator*() const { return mpNode->mData; }\
};\
\
\
class const_reverse_iterator \
{\
protected:\
node_ref_type mpNode;\
friend class listClass;\
\
protected:\
const_reverse_iterator( node_ref_type pNode )\
{\
mpNode = pNode;\
}\
\
public:\
\
const_reverse_iterator() {}\
int operator==( const const_reverse_iterator& rhs ) const { return (mpNode == rhs.mpNode); }\
int operator!=( const const_reverse_iterator& rhs ) const { return (mpNode != rhs.mpNode); }\
\
inline const_reverse_iterator( const reverse_iterator& other )\
{\
mpNode = other.mpNode;\
}\
\
inline const const_reverse_iterator& operator--() \
{\
mpNode = mpNode->mpNext;\
return *this;\
}\
\
inline const_reverse_iterator operator--(int)\
{\
const_reverse_iterator tmp = *this;\
mpNode = mpNode->mpNext;\
return tmp;\
}\
\
inline const const_reverse_iterator& operator++() \
{\
mpNode = mpNode->mpPrev;\
return *this;\
}\
\
inline const_reverse_iterator operator++(int)\
{\
const_reverse_iterator tmp = *this;\
mpNode = mpNode->mpPrev;\
return tmp;\
}\
\
inline const_reference operator*() const { return mpNode->mData; }\
};\
\
public:\
\
inline listClass()\
: mpFreeListHead( 0 ),\
mSize(0)\
{\
mpTerminator = AllocNode();\
mpTerminator->mpPrev = mpTerminator->mpNext = mpTerminator;\
}\
\
listClass( const listClass& other )\
{\
mpTerminator = AllocNode();\
mpTerminator->mpPrev = mpTerminator->mpNext = mpTerminator;\
\
for( listClass::const_iterator i = other.begin(); i != other.end(); ++i )\
\
push_back( (*i) );\
}\
\
inline const listClass& operator=( const listClass& rhs ) \
{\
erase( begin(), end() );\
\
for( listClass::const_iterator i = rhs.begin(); i != rhs.end(); ++i )\
\
push_back( (*i) );\
\
return *this;\
}\
\
inline listClass(const_iterator first, const_iterator last)\
: mpFreeListHead( 0 ),\
mSize(0)\
\
{ while( first != last ) push_back( *first++ ); }\
\
inline listClass( size_type n, const value_type& value = value_type() )\
\
{ for( size_t i = 0; i != n; ++n ) push_back( value ); }\
\
inline ~listClass() \
{ \
erase( begin(), end() ); \
\
RecycleNode( mpTerminator );\
DestroyFreeList();\
}\
\
inline iterator begin() { return iterator(mpTerminator->mpNext); }\
\
inline const_iterator begin() const \
{ return const_iterator(mpTerminator->mpNext); }\
\
inline iterator end() { return iterator(mpTerminator); }\
\
inline const_iterator end() const { return const_iterator(mpTerminator); }\
\
inline reverse_iterator rbegin() \
{ return reverse_iterator(mpTerminator->mpPrev); }\
\
inline reverse_iterator rend() \
{ return reverse_iterator(mpTerminator); }\
\
inline const_reverse_iterator rbegin() const\
{ return const_reverse_iterator(mpTerminator->mpPrev); }\
\
inline const_reverse_iterator rend() const\
{ return const_reverse_iterator(mpTerminator); }\
\
inline int empty() const { return (mSize == 0); }\
\
inline size_type size() const { return mSize; }\
\
inline size_type max_size() const { return UINT_MAX/sizeof(list_node); }\
\
inline reference front() { return mpTerminator->mData; }\
\
inline const_reference front() const { return mpTerminator->mData; }\
\
inline reference back() { return mpTerminator->mpPrev->mData; }\
\
inline const_reference back() const { return mpTerminator->mpPrev->mData; }\
\
inline void push_front(const value_type& x) { insert( begin(), x ); }\
\
inline void push_back(const value_type& x) { insert( end(), x ); }\
\
iterator insert(iterator position, const value_type& x = value_type())\
{\
node_ref_type pNew = AllocNode();\
\
node_ref_type pos = *((node_ref_type*)&position);\
\
pNew->mpNext = pos;\
pNew->mpPrev = pos->mpPrev;\
pos->mpPrev->mpNext = pNew;\
pos->mpPrev = pNew;\
\
new (&pNew->mData) value_type(x);\
\
++mSize;\
\
return iterator(pNew);\
}\
\
inline void insert(iterator position, const_iterator first, const_iterator last )\
{\
while( first != last ) insert( position, *first++ );\
}\
\
inline void splice( iterator position, listClass& other )\
{\
if ( other.begin() == other.end() ) return;\
\
node_ref_type pTill = other.mpTerminator->mpPrev;\
node_ref_type pFrom = other.begin().mpNode;\
\
mpTerminator->mpPrev->mpNext = pFrom;\
pFrom->mpPrev = mpTerminator->mpPrev->mpNext;\
\
pTill->mpNext = mpTerminator;\
mpTerminator->mpPrev = pTill;\
\
other.mpTerminator->mpNext = \
other.mpTerminator->mpPrev = other.mpTerminator;\
\
mSize += other.mSize;\
other.mSize = 0;\
}\
\
inline void splice( iterator position, listClass& other, iterator first, iterator last )\
{\
if ( first == last ) return;\
\
size_type sz = 0;\
iterator tmp = first;\
while( tmp != last ) \
{\
++tmp;\
++sz;\
}\
\
mSize += sz;\
other.mSize -= sz;\
\
node_ref_type pPos = position.mpNode;\
node_ref_type pFirst = first.mpNode;\
node_ref_type pLast = last.mpNode;\
node_ref_type pTill = last.mpNode->mpPrev;\
\
pPos->mpPrev->mpNext = pFirst;\
pPos->mpPrev = pTill;\
\
pFirst->mpPrev->mpNext = last.mpNode;\
pLast->mpPrev = pTill;\
\
pFirst->mpPrev = pPos->mpPrev;\
pTill->mpNext = pPos;\
}\
\
inline void pop_front() { erase( begin() ); }\
inline void pop_back() { erase( --end() ); }\
\
inline void erase(iterator position)\
{\
erase( position, ++position );\
}\
\
inline void erase(iterator first, iterator last)\
{\
node_ref_type firstNode = *((node_ref_type*)&first);\
node_ref_type lastNode = *((node_ref_type*)&last);\
\
firstNode->mpPrev->mpNext = lastNode;\
lastNode->mpPrev = firstNode->mpPrev;\
\
while( firstNode != lastNode )\
{\
node_ref_type next = firstNode->mpNext;\
\
typedef value_type value_type_local;\
firstNode->mData.value_type_local::~value_type_local();\
\
RecycleNode( firstNode );\
\
firstNode = next;\
\
--mSize;\
}\
}\
\
inline void remove(const value_type& value)\
{\
for( iterator i = begin(); i != end(); ++i )\
\
if ( (*i) == value ) \
{\
erase( i ); break;\
}\
}\
\
void sort()\
{\
if ( mSize < 2 ) return;\
\
iterator from = begin();\
iterator other_end = end();\
--other_end;\
\
for( size_type i = 0; i != mSize; ++i )\
{\
size_type nSwaps = 0;\
\
iterator next = begin();\
++next;\
\
for( iterator j = begin(); j != other_end; ++j )\
{\
\
if ( (*next) < (*j) )\
{\
value_type tmp = (*j);\
(*j) = (*next);\
(*next) = tmp;\
\
++nSwaps;\
}\
\
++next;\
}\
\
if ( !nSwaps) break;\
\
--other_end;\
}\
}\
}
// defines list class with the given element type
#define WXSTL_LIST(ELEMENT_CLASS) __DEFINE_STL_LIST(\
\
_WXSTL_LIST_##ELEMENT_CLASS, ELEMENT_CLASS )
#endif

View File

@ -0,0 +1,777 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: Contrib. demo
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 27/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifndef __WXSTLVEC_G__
#define __WXSTLVEC_G__
#include <memory.h>
#include <string.h> // imports memmove()
#include <stddef.h>
#include <sys/types.h>
#include <limits.h>
#include <new>
// the below macro used internally (see actual interface after this macro)
#define __DEFINE_STL_VECTOR_DEEP( vectorClass, Type ) class vectorClass {\
\
public:\
typedef Type value_type;\
typedef value_type* iterator;\
typedef const value_type* const_iterator;\
typedef iterator pointer;\
typedef const iterator const_pointer;\
typedef value_type& reference;\
typedef const value_type& const_reference;\
typedef size_t size_type;\
typedef ptrdiff_t difference_type;\
\
typedef iterator OutputIterator;\
typedef const_iterator InputIterator;\
\
protected:\
\
inline void PlacementCopy( const_iterator first, const_iterator last, iterator result )\
{\
while ( first != last ) \
new (result++) value_type(*first++);\
}\
\
inline void ConstructObjects( iterator first, iterator last, const value_type& pattern )\
{\
while( first != last ) \
new (first++) value_type(pattern);\
}\
\
inline void CopyObjects( iterator first, iterator last, iterator result )\
{\
while( first != last ) \
*result++ = *first++;\
}\
\
inline void CopyObjectsBack( iterator first, iterator last, iterator result )\
{\
result += difference_type(last,first);\
\
while( first != last ) \
*(--result) = *(--last);\
}\
\
public:\
\
class reverse_iterator \
{\
friend class vectorClass;\
friend class const_reverse_iterator;\
\
public:\
iterator mpPos;\
\
public:\
\
reverse_iterator() {}\
\
reverse_iterator ( iterator pPos )\
{\
mpPos = pPos;\
}\
\
int operator==( const reverse_iterator& rhs ) const { return (mpPos == rhs.mpPos); }\
int operator!=( const reverse_iterator& rhs ) const { return (mpPos != rhs.mpPos); }\
\
inline reverse_iterator( const reverse_iterator& other )\
{\
mpPos = other.mpPos;\
}\
\
inline const reverse_iterator& operator--() \
{\
--mpPos;\
return *this;\
}\
\
inline reverse_iterator operator--(int)\
{\
reverse_iterator tmp = *this;\
--mpPos;\
return tmp;\
}\
\
inline const reverse_iterator & operator++() \
{\
++mpPos;\
return *this;\
}\
\
inline reverse_iterator operator++(int)\
{\
reverse_iterator tmp = *this;\
++mpPos;\
return tmp;\
}\
\
inline const_reference operator*() const { return *mpPos; }\
};\
\
\
class const_reverse_iterator \
{\
protected:\
iterator mpPos;\
public:\
\
const_reverse_iterator() {}\
\
const_reverse_iterator( const iterator pPos )\
{\
mpPos = pPos;\
}\
\
int operator==( const const_reverse_iterator& rhs ) const { return (mpPos == rhs.mpPos); }\
int operator!=( const const_reverse_iterator& rhs ) const { return (mpPos != rhs.mpPos); }\
\
inline const_reverse_iterator( const reverse_iterator& other )\
{\
mpPos = other.mpPos;\
}\
\
inline const const_reverse_iterator& operator--() \
{\
--mpPos;\
return *this;\
}\
\
inline const_reverse_iterator operator--(int)\
{\
const_reverse_iterator tmp = *this;\
--mpPos;\
return tmp;\
}\
\
inline const const_reverse_iterator & operator++() \
{\
++mpPos;\
return *this;\
}\
\
inline const_reverse_iterator operator++(int)\
{\
const_reverse_iterator tmp = *this;\
++mpPos;\
return tmp;\
}\
\
inline const_reference operator*() const { return *mpPos; }\
};\
\
protected:\
\
pointer mpStart;\
pointer mpEnd;\
pointer mpEndOfBuf;\
\
protected:\
\
inline void quick_sort(int low, int hi) \
{\
}\
\
inline void DestructRange( iterator first, iterator last )\
{\
typedef value_type value_type_local;\
\
while ( first != last ) \
{\
first->value_type_local::~value_type_local();\
++first;\
}\
}\
\
inline iterator DoInsert(iterator position, const value_type& x)\
{\
if ( mpEnd < mpEndOfBuf )\
{\
new (mpEnd) value_type(*(mpEnd-1) );\
\
CopyObjectsBack( position, mpEnd, position + 1 );\
\
*position = x;\
\
++mpEnd;\
\
return position;\
}\
\
size_type minBufLen = WXSTL_VECTOR_MIN_BUF_SIZE/sizeof(value_type);\
\
size_type doubledSize = size()*2;\
\
size_type newLen = ( doubledSize < minBufLen ) ? minBufLen : doubledSize;\
\
iterator pNewStart = (iterator)( new char[newLen*sizeof(value_type)] );\
\
PlacementCopy( mpStart, position, pNewStart );\
\
iterator atPosition = pNewStart + difference_type( position - mpStart );\
\
new (atPosition) value_type(x);\
\
iterator newPos = atPosition;\
\
++atPosition;\
\
if ( mpStart ) \
{\
PlacementCopy( position, mpEnd, atPosition );\
DestructRange( mpStart, mpEnd );\
delete [](char*)mpStart;\
}\
\
mpEnd = atPosition + difference_type( mpEnd - position );\
\
mpStart = pNewStart;\
mpEndOfBuf = pNewStart + newLen;\
\
return newPos;\
}\
\
public:\
\
inline vectorClass() : mpStart(0), \
mpEnd(0),\
mpEndOfBuf(0)\
{}\
\
inline vectorClass( const_iterator first, const_iterator last )\
: mpStart(0),\
mpEnd(0),\
mpEndOfBuf(0)\
\
{ while( first != last ) push_back( *first++ ); }\
\
inline vectorClass( size_type n, const value_type& value = value_type() )\
: mpStart(0),\
mpEnd(0),\
mpEndOfBuf(0)\
\
{ for( size_type i = 0; i != n; ++i ) push_back( value ); }\
\
inline const vectorClass& operator=( const vectorClass& other )\
{\
if (mpStart) \
{\
DestructRange( begin(), end() );\
delete [](char*)mpStart; \
}\
\
size_t newLen = difference_type( other.mpEndOfBuf - other.mpStart );\
\
mpStart = (iterator)( new char[newLen*sizeof(value_type)] );\
\
PlacementCopy( other.begin(), other.end(), mpStart );\
\
mpEnd = mpStart + other.size();\
\
mpEndOfBuf = mpStart + newLen;\
\
return *this;\
}\
\
inline vectorClass( const vectorClass& other )\
: mpStart(0),\
mpEnd(0),\
mpEndOfBuf(0)\
{\
this->operator=( other );\
}\
\
inline ~vectorClass() \
{ \
if (mpStart) \
{\
DestructRange( begin(), end() );\
delete [](char*)mpStart; \
}\
}\
\
inline iterator begin() { return mpStart; }\
\
inline const_iterator begin() const { return mpStart; }\
\
inline iterator end() { return mpEnd; }\
\
inline const_iterator end() const { return mpEnd; }\
\
inline size_type size() const { return (size_type)difference_type(mpEnd-mpStart); }\
\
inline size_type max_size() const { return UINT_MAX/sizeof(value_type); }\
\
inline size_type capacity() const \
{ return difference_type(mpEndOfBuf-mpStart)/sizeof(value_type); }\
\
inline int empty() const { return mpStart == mpEnd; }\
\
inline reference operator[](size_type n) { return *(mpStart+n); }\
\
inline const_reference operator[](size_type n) const { return *(mpStart+n); }\
\
inline reference front() { return (*mpStart); }\
\
inline const_reference front() const { return (*mpStart); }\
\
inline reference back() { return (*(mpEnd-1)); }\
\
inline const_reference back() const { return (*(mpEnd-1)); }\
\
inline void reserve(size_type n) {}\
\
inline void push_back(const value_type& x)\
{\
if ( mpEnd != mpEndOfBuf ) \
{\
new (mpEnd) value_type(x);\
++mpEnd;\
}\
else\
DoInsert( mpEnd, x );\
}\
\
inline iterator insert(iterator position, const value_type& x = value_type())\
{\
if ( position == mpEnd && mpEnd != mpEndOfBuf )\
{\
new (mpEnd) value_type(x);\
++mpEnd;\
return (mpEnd-1);\
}\
else return DoInsert( position, x );\
}\
\
inline void pop_back()\
{\
DestructRange( mpEnd-1, mpEnd );\
\
--mpEnd;\
}\
\
inline void erase(iterator first, iterator last)\
{\
if ( last == mpEnd )\
{\
DestructRange( first, last );\
mpEnd = first;\
return;\
}\
\
CopyObjects( last, last + difference_type( mpEnd - last ), first );\
\
iterator newEnd = mpEnd - difference_type( last - first );\
DestructRange( newEnd, mpEnd );\
\
mpEnd = newEnd;\
}\
\
inline void erase( iterator position )\
{\
erase( position, position + 1 );\
}\
\
inline void sort()\
{\
if ( size() < 2 ) return;\
quick_sort( 0, size()-1 );\
}\
}
/////////////////////////////// shallow-copy container ///////////////////////
#define __DEFINE_STL_VECTOR_SHALLOW( vectorClass, Type ) class vectorClass {\
\
public:\
typedef Type value_type;\
typedef value_type* iterator;\
typedef const value_type* const_iterator;\
typedef iterator pointer;\
typedef const iterator const_pointer;\
typedef value_type& reference;\
typedef const value_type& const_reference;\
typedef size_t size_type;\
typedef ptrdiff_t difference_type;\
\
typedef iterator OutputIterator;\
typedef const_iterator InputIterator;\
\
protected:\
\
inline void PlacementCopy( const_iterator first, const_iterator last, iterator result )\
{\
memcpy(result, first, int(difference_type(last-first)*sizeof(value_type)) );\
}\
\
inline void ConstructObjects( iterator first, iterator last, const value_type& pattern )\
{\
if ( sizeof(pattern) == 1 )\
\
memset( first, int(difference_type(last-first)/sizeof(value_type)), \
int(*((char*)&pattern)) );\
else\
while( first != last ) \
*first++ = pattern;\
}\
\
inline void CopyObjects( iterator first, iterator last, iterator result )\
{\
memcpy(result, first, int(difference_type(last-first)*sizeof(value_type)) );\
}\
\
inline void CopyObjectsBack( iterator first, iterator last, iterator result )\
{\
memmove(result, first, int(difference_type(last-first)*sizeof(value_type)) );\
}\
\
public:\
\
class reverse_iterator \
{\
friend class vectorClass;\
friend class const_reverse_iterator;\
\
public:\
iterator mpPos;\
\
public:\
\
reverse_iterator() {}\
\
reverse_iterator ( iterator pPos )\
{\
mpPos = pPos;\
}\
\
int operator==( const reverse_iterator& rhs ) const { return (mpPos == rhs.mpPos); }\
int operator!=( const reverse_iterator& rhs ) const { return (mpPos != rhs.mpPos); }\
\
inline reverse_iterator( const reverse_iterator& other )\
{\
mpPos = other.mpPos;\
}\
\
inline const reverse_iterator& operator--() \
{\
--mpPos;\
return *this;\
}\
\
inline reverse_iterator operator--(int)\
{\
reverse_iterator tmp = *this;\
--mpPos;\
return tmp;\
}\
\
inline const reverse_iterator & operator++() \
{\
++mpPos;\
return *this;\
}\
\
inline reverse_iterator operator++(int)\
{\
reverse_iterator tmp = *this;\
++mpPos;\
return tmp;\
}\
\
inline const_reference operator*() const { return *mpPos; }\
};\
\
\
class const_reverse_iterator \
{\
protected:\
iterator mpPos;\
public:\
\
const_reverse_iterator() {}\
\
const_reverse_iterator( const iterator pPos )\
{\
mpPos = pPos;\
}\
\
int operator==( const const_reverse_iterator& rhs ) const { return (mpPos == rhs.mpPos); }\
int operator!=( const const_reverse_iterator& rhs ) const { return (mpPos != rhs.mpPos); }\
\
inline const_reverse_iterator( const reverse_iterator& other )\
{\
mpPos = other.mpPos;\
}\
\
inline const const_reverse_iterator& operator--() \
{\
--mpPos;\
return *this;\
}\
\
inline const_reverse_iterator operator--(int)\
{\
const_reverse_iterator tmp = *this;\
--mpPos;\
return tmp;\
}\
\
inline const const_reverse_iterator & operator++() \
{\
++mpPos;\
return *this;\
}\
\
inline const_reverse_iterator operator++(int)\
{\
const_reverse_iterator tmp = *this;\
++mpPos;\
return tmp;\
}\
\
inline const_reference operator*() const { return *mpPos; }\
};\
\
protected:\
\
pointer mpStart;\
pointer mpEnd;\
pointer mpEndOfBuf;\
\
protected:\
\
inline void quick_sort(int low, int hi) \
{\
}\
\
inline void DestructRange( iterator first, iterator last )\
{\
}\
\
inline iterator DoInsert(iterator position, const value_type& x)\
{\
if ( mpEnd < mpEndOfBuf )\
{\
new (mpEnd) value_type(*(mpEnd-1) );\
\
CopyObjectsBack( position, mpEnd, position + 1 );\
\
*position = x;\
\
++mpEnd;\
\
return position;\
}\
\
size_type minBufLen = WXSTL_VECTOR_MIN_BUF_SIZE/sizeof(value_type);\
\
size_type doubledSize = size()*2;\
\
size_type newLen = ( doubledSize < minBufLen ) ? minBufLen : doubledSize;\
\
iterator pNewStart = (iterator)( new char[newLen*sizeof(value_type)] );\
\
PlacementCopy( mpStart, position, pNewStart );\
\
iterator atPosition = pNewStart + difference_type( position - mpStart );\
\
new (atPosition) value_type(x);\
\
iterator newPos = atPosition;\
\
++atPosition;\
\
if ( mpStart ) \
{\
PlacementCopy( position, mpEnd, atPosition );\
DestructRange( mpStart, mpEnd );\
delete [](char*)mpStart;\
}\
\
mpEnd = atPosition + difference_type( mpEnd - position );\
\
mpStart = pNewStart;\
mpEndOfBuf = pNewStart + newLen;\
\
return newPos;\
}\
\
public:\
\
inline vectorClass() : mpStart(0), \
mpEnd(0),\
mpEndOfBuf(0)\
{}\
\
inline vectorClass( const_iterator first, const_iterator last )\
: mpStart(0),\
mpEnd(0),\
mpEndOfBuf(0)\
\
{ while( first != last ) push_back( *first++ ); }\
\
inline vectorClass( size_type n, const value_type& value = value_type() )\
: mpStart(0),\
mpEnd(0),\
mpEndOfBuf(0)\
\
{ for( size_type i = 0; i != n; ++i ) push_back( value ); }\
\
inline const vectorClass& operator=( const vectorClass& other )\
{\
if (mpStart) \
{\
DestructRange( begin(), end() );\
delete [](char*)mpStart; \
}\
\
size_t newLen = difference_type( other.mpEndOfBuf - other.mpStart );\
\
mpStart = (iterator)( new char[newLen*sizeof(value_type)] );\
\
PlacementCopy( other.begin(), other.end(), mpStart );\
\
mpEnd = mpStart + other.size();\
\
mpEndOfBuf = mpStart + newLen;\
\
return *this;\
}\
\
inline vectorClass( const vectorClass& other )\
: mpStart(0),\
mpEnd(0),\
mpEndOfBuf(0)\
{\
this->operator=( other );\
}\
\
inline ~vectorClass() \
{ \
if (mpStart) \
{\
DestructRange( begin(), end() );\
delete [](char*)mpStart; \
}\
}\
\
inline iterator begin() { return mpStart; }\
\
inline const_iterator begin() const { return mpStart; }\
\
inline iterator end() { return mpEnd; }\
\
inline const_iterator end() const { return mpEnd; }\
\
inline size_type size() const { return (size_type)difference_type(mpEnd-mpStart); }\
\
inline size_type max_size() const { return UINT_MAX/sizeof(value_type); }\
\
inline size_type capacity() const \
{ return difference_type(mpEndOfBuf-mpStart)/sizeof(value_type); }\
\
inline int empty() const { return mpStart == mpEnd; }\
\
inline reference operator[](size_type n) { return *(mpStart+n); }\
\
inline const_reference operator[](size_type n) const { return *(mpStart+n); }\
\
inline reference front() { return (*mpStart); }\
\
inline const_reference front() const { return (*mpStart); }\
\
inline reference back() { return (*(mpEnd-1)); }\
\
inline const_reference back() const { return (*(mpEnd-1)); }\
\
inline void reserve(size_type n) {}\
\
inline void push_back(const value_type& x)\
{\
if ( mpEnd != mpEndOfBuf ) \
{\
new (mpEnd) value_type(x);\
++mpEnd;\
}\
else\
DoInsert( mpEnd, x );\
}\
\
inline iterator insert(iterator position, const value_type& x = value_type())\
{\
if ( position == mpEnd && mpEnd != mpEndOfBuf )\
{\
new (mpEnd) value_type(x);\
++mpEnd;\
return (mpEnd-1);\
}\
else return DoInsert( position, x );\
}\
\
inline void pop_back()\
{\
DestructRange( mpEnd-1, mpEnd );\
\
--mpEnd;\
}\
\
inline void erase(iterator first, iterator last)\
{\
if ( last == mpEnd )\
{\
DestructRange( first, last );\
mpEnd = first;\
return;\
}\
\
CopyObjects( last, last + difference_type( mpEnd - last ), first );\
\
iterator newEnd = mpEnd - difference_type( last - first );\
DestructRange( newEnd, mpEnd );\
\
mpEnd = newEnd;\
}\
\
inline void erase( iterator position )\
{\
erase( position, position + 1 );\
}\
\
inline void sort()\
{\
if ( size() < 2 ) return;\
quick_sort( 0, size()-1 );\
}\
}
// redefine below symbol to change the default allocation unit of vector content buffer
#define WXSTL_VECTOR_MIN_BUF_SIZE 64
// defines vector class, where objects are copied
// using "deep-copy" sematics (i.e. by calling their copy constructors)
#define WXSTL_VECTOR(ELEMENT_CLASS) \
__DEFINE_STL_VECTOR_DEEP(_WXSTL_VECTOR_##ELEMENT_CLASS, ELEMENT_CLASS)
// defines vector class, where objects are copied
// using "shallow-copy" sematics (i.e. instead of calling
// their constructors, memcpy() and memmove() are used to copy their raw data)
#define WXSTL_VECTOR_SHALLOW_COPY(ELEMENT_CLASS) __DEFINE_STL_VECTOR_SHALLOW(_WXSTL_VECTORSC_##ELEMENT_CLASS, ELEMENT_CLASS)
#endif

View File

@ -0,0 +1,515 @@
/////////////////////////////////////////////////////////////////////////////
// Name: HelpGen.cpp
// Purpose: Main program file for HelpGen
// Author: Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
// Modified by:
// Created: 06/01/99
// RCS-ID: $Id$
// Copyright: (c) 1999 VZ
// Licence: GPL
/////////////////////////////////////////////////////////////////////////////
/*
TODO (+ means fixed)
(i) small fixes in the current version
+1. Quote special TeX characters like '&' and '_' (=> derive from wxFile)
2. Document typedefs
3. Document global variables
4. Document #defines
(ii) plans for version 2
1. Use wxTextFile for direct file access to avoid one scan method problems
*/
// =============================================================================
// declarations
// =============================================================================
// -----------------------------------------------------------------------------
// headers
// -----------------------------------------------------------------------------
// wxWindows
#include "wx/wxprec.h"
#ifndef WX_PRECOMP
#include <wx/string.h>
#include <wx/log.h>
#include <wx/file.h>
#endif // WX_PRECOMP
// C++ parsing classes
#include "cjparser.h"
// standard headers
#include <stdio.h>
#include <time.h>
// -----------------------------------------------------------------------------
// private functions
// -----------------------------------------------------------------------------
// return the label for the given function name
static wxString MakeLabel(const char *classname, const char *funcname);
// quotes special TeX characters in place
static void TeXFilter(wxString* str);
// -----------------------------------------------------------------------------
// private classes
// -----------------------------------------------------------------------------
// add a function which sanitazes the string before writing it to the file
class wxTeXFile : public wxFile
{
public:
wxTeXFile() : wxFile() { }
bool WriteTeX(const wxString& s)
{
wxString t(s);
TeXFilter(&t);
return wxFile::Write(t);
}
};
class HelpGenVisitor : public spVisitor
{
public:
// ctor
HelpGenVisitor();
virtual void VisitFile( spFile& fl );
virtual void VisitClass( spClass& cl );
virtual void VisitEnumeration( spEnumeration& en );
virtual void VisitTypeDef( spTypeDef& td );
virtual void VisitAttribute( spAttribute& attr );
virtual void VisitOperation( spOperation& op );
virtual void VisitParameter( spParameter& param );
void EndVisit();
// shut up g++ warning (ain't it stupid?)
virtual ~HelpGenVisitor() { }
protected:
// (re)initialize the state
void Reset();
// insert documentation for enums/typedefs coming immediately before the
// class declaration into the class documentation
void InsertTypedefDocs();
void InsertEnumDocs();
// write the headers for corresponding sections (only once)
void InsertDataStructuresHeader();
void InsertMethodsHeader();
// terminate the function documentation if it was started
void CloseFunction();
wxTeXFile m_file; // file we're writing to now
// state variables
bool m_inClass, // TRUE after file successfully opened
m_inTypesSection, // enums & typedefs go there
m_inMethodSection, // functions go here
m_isFirstParam, // first parameter of current function?
m_inFunction; // we're parsing a function declaration
// holders for "saved" documentation
wxString m_textStoredEnums,
m_textStoredTypedefs,
m_textStoredFunctionComment;
};
// -----------------------------------------------------------------------------
// private functions
// -----------------------------------------------------------------------------
// =============================================================================
// implementation
// =============================================================================
int main(int argc, char **argv)
{
if ( argc < 2 ) {
wxLogError("usage: %s <header files...>\n", argv[0]);
return 1;
}
// be verbose
wxLog::GetActiveTarget()->SetVerbose();
// create a parser object and a visitor derivation
CJSourceParser parser;
HelpGenVisitor visitor;
// parse all files
for ( int i = 1; i < argc; i++ ) {
spContext *ctxTop = parser.ParseFile(argv[i]);
if ( !ctxTop ) {
wxLogWarning("File '%s' couldn't be processed.", argv[i]);
}
else {
((spFile *)ctxTop)->mFileName = argv[i];
visitor.VisitAll(*ctxTop);
visitor.EndVisit();
}
}
return 0;
}
// -----------------------------------------------------------------------------
// HelpGenVisitor implementation
// -----------------------------------------------------------------------------
HelpGenVisitor::HelpGenVisitor()
{
Reset();
}
void HelpGenVisitor::Reset()
{
m_inClass =
m_inFunction =
m_inTypesSection =
m_inMethodSection = false;
}
void HelpGenVisitor::InsertTypedefDocs()
{
m_file.WriteTeX(m_textStoredTypedefs);
m_textStoredTypedefs.Empty();
}
void HelpGenVisitor::InsertEnumDocs()
{
m_file.WriteTeX(m_textStoredEnums);
m_textStoredEnums.Empty();
}
void HelpGenVisitor::InsertDataStructuresHeader()
{
if ( !m_inTypesSection ) {
m_inTypesSection = true;
m_file.WriteTeX("\\wxheading{Data structures}\n\n");
}
}
void HelpGenVisitor::InsertMethodsHeader()
{
if ( !m_inMethodSection ) {
m_inMethodSection = true;
m_file.WriteTeX( "\\latexignore{\\rtfignore{\\wxheading{Members}}}\n\n");
}
}
void HelpGenVisitor::CloseFunction()
{
if ( m_inFunction ) {
m_inFunction = false;
wxString totalText;
if ( m_isFirstParam ) {
// no params found
totalText << "\\void";
}
totalText << "}\n\n";
if ( !m_textStoredFunctionComment.IsEmpty() )
totalText << m_textStoredFunctionComment << '\n';
m_file.WriteTeX(totalText);
}
}
void HelpGenVisitor::EndVisit()
{
CloseFunction();
}
void HelpGenVisitor::VisitFile( spFile& file )
{
wxLogInfo("Parsing classes from file '%s'...", file.mFileName.c_str());
}
void HelpGenVisitor::VisitClass( spClass& cl )
{
wxString name = cl.GetName();
// the file name is built from the class name by removing the leading "wx"
// if any and converting it to the lower case
wxString filename = name;
if ( filename(0, 2) == "wx" ) {
filename.erase(0, 2);
}
filename.MakeLower();
filename += ".tex";
m_inClass = m_file.Open(filename, wxFile::write);
if ( !m_inClass ) {
wxLogError("Can't generate documentation for the class '%s'.",
name.c_str());
return;
}
m_inMethodSection =
m_inTypesSection = false;
wxLogInfo("Created new file '%s' for class '%s'.",
filename.c_str(), name.c_str());
// the entire text we're writing to file
wxString totalText;
// write out the header
{
time_t timeNow = time(NULL);
wxString header;
header.Printf("% automatically generated by HelpGen from %s at "
"%s" // no '\n' here because ctime() inserts one
"\\section{\\class{%s}}\\label{%s}\n",
filename.c_str(), ctime(&timeNow),
name.c_str(), wxString(name).MakeLower().c_str());
totalText << header << '\n';
}
// the comment before the class generally explains what is it for so put it
// in place of the class description
if ( cl.HasComments() ) {
wxString comment;
const MCommentListT& comments = cl.GetCommentList();
for ( MCommentListT::const_iterator i = comments.begin();
i != comments.end();
i++ ) {
comment << (*i)->GetText();
}
totalText << '\n' << comment << '\n';
}
// derived from section
wxString derived = "\\wxheading{Derived from}\n\n";
const StrListT& baseClasses = cl.mSuperClassNames;
if ( baseClasses.size() == 0 ) {
derived << "No base class";
}
else {
bool first = true;
for ( StrListT::const_iterator i = baseClasses.begin();
i != baseClasses.end();
i++ ) {
if ( !first ) {
// separate from the previous one
derived << "\\\\\n";
}
else {
first = false;
}
wxString baseclass = *i;
derived << "\\helpref{" << baseclass << "}"
"{ " << baseclass.MakeLower() << "}";
}
}
totalText << derived << "\n\n";
// write all this to file
m_file.WriteTeX(totalText);
// if there were any enums/typedefs before, insert their documentation now
InsertDataStructuresHeader();
InsertTypedefDocs();
InsertEnumDocs();
}
void HelpGenVisitor::VisitEnumeration( spEnumeration& en )
{
CloseFunction();
if ( m_inMethodSection ) {
// FIXME that's a bug, but tell the user aboit it nevertheless... we
// should be smart enough to process even the enums which come after the
// functions
wxLogWarning("enum '%s' ignored, please put it before the class "
"methods.", en.GetName().c_str());
return;
}
// simply copy the enum text in the docs
wxString enumeration;
enumeration << "{\\small \\begin{verbatim}\n"
<< en.mEnumContent
<< "\n\\end{verbatim}}\n";
// remember for later use if we're not inside a class yet
if ( !m_inClass ) {
if ( !m_textStoredEnums.IsEmpty() ) {
m_textStoredEnums << '\n';
}
m_textStoredEnums << enumeration;
}
else {
// write the header for this section if not done yet
InsertDataStructuresHeader();
enumeration << '\n';
m_file.WriteTeX(enumeration);
}
}
void HelpGenVisitor::VisitTypeDef( spTypeDef& td )
{
CloseFunction();
wxFAIL_MSG("don't know how to document typedefs yet");
}
void HelpGenVisitor::VisitAttribute( spAttribute& attr )
{
CloseFunction();
// only document the public member variables
if ( !m_inClass || !attr.IsPublic() )
return;
wxFAIL_MSG("don't know how to document member vars yet");
}
void HelpGenVisitor::VisitOperation( spOperation& op )
{
CloseFunction();
if ( !m_inClass || !op.IsInClass() ) {
// FIXME that's a bug too
wxLogWarning("skipped global function '%s'.", op.GetName().c_str());
return;
}
if ( op.mVisibility == SP_VIS_PRIVATE ) {
// FIXME should we document protected functions?
return;
}
InsertMethodsHeader();
// save state info
m_inFunction =
m_isFirstParam = true;
m_textStoredFunctionComment.Empty();
const MCommentListT& comments = op.GetCommentList();
for ( MCommentListT::const_iterator i = comments.begin();
i != comments.end();
i++ ) {
m_textStoredFunctionComment << (*i)->GetText();
}
// start function documentation
wxString totalText;
const char *funcname = op.GetName().c_str();
const char *classname = op.GetClass().GetName().c_str();
// check for the special case of dtor
wxString dtor;
if ( (funcname[0] == '~') && (strcmp(funcname + 1, classname) == 0) ) {
dtor.Printf("\\destruct{%s}", classname);
funcname = dtor;
}
totalText.Printf("\\membersection{%s::%s}\\label{%s}\n"
"\\%sfunc{%s}{%s}{",
classname, funcname,
MakeLabel(classname, funcname).c_str(),
op.mIsConstant ? "const" : "",
op.mRetType.c_str(),
funcname);
m_file.WriteTeX(totalText);
}
void HelpGenVisitor::VisitParameter( spParameter& param )
{
if ( !m_inFunction )
return;
wxString totalText;
if ( m_isFirstParam ) {
m_isFirstParam = false;
}
else {
totalText << ", ";
}
totalText << "\\param{" << param.mType << " }{" << param.GetName();
wxString defvalue = param.mInitVal;
if ( !defvalue.IsEmpty() ) {
totalText << " = " << defvalue;
}
totalText << '}';
m_file.WriteTeX(totalText);
}
// -----------------------------------------------------------------------------
// global function implementation
// -----------------------------------------------------------------------------
static wxString MakeLabel(const char *classname, const char *funcname)
{
wxString label(classname);
if ( funcname[0] == '\\' ) {
// we may have some special TeX macro - so far only \destruct exists,
// but may be later others will be added
static const char *macros[] = { "destruct" };
static const char *replacement[] = { "dtor" };
size_t n;
for ( n = 0; n < WXSIZEOF(macros); n++ ) {
if ( strncmp(funcname + 1, macros[n], strlen(macros[n])) == 0 ) {
// found
break;
}
}
if ( n == WXSIZEOF(macros) ) {
wxLogWarning("unknown function name '%s' - leaving as is.",
funcname);
}
else {
funcname = replacement[n];
}
}
label << funcname;
label.MakeLower();
return label;
}
static void TeXFilter(wxString* str)
{
// FIXME may be done much more quickly
str->Replace("&", "\\&");
str->Replace("_", "\\_");
}
/* vi: set tw=80 et ts=4 sw=4: */

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,568 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: Contrib. demo
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 22/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "docripper.h"
#include <iostream.h>
// script templates
// ***** currently only HTML versions of variouse templates available ***** //
static const char* HTM_TopTempl =
"<html><body bgcolor=#FFFFFF>\n\
\n\n<!------ Automatically Generated by \"wxDocRipper\"------->\n\n\n\
<p><h2>$(NAME)</h2><p>\n\
<ul>\n\
$(REFLIST)\
</ul><p>\n\n\
";
static const char* HTM_ContentIdxTempl =
"\
<a name=\"r$(ID)_$(NAME)\">\n\
<p><hr>\n\
<h2><p>$(NAME)<p></h2>\
<ul>\n\
$(REFLIST)\
</ul><p>\n\n\
";
static const char* HTM_SuperContentTempl =
"\
<a name=\"r$(ID)_$(NAME)\">\n\
<p><hr>\n\
<p><h2>$(NAME)<p></h2>\
$(BODY)\n\
";
static const char* HTM_SubContentTempl =
"\
<a name=\"r$(ID)_$(NAME)\">\n\
<p><hr>\n\
<p><h3>$(NAME)<p></h3>\
$(BODY)\n\
";
static const char* HTM_OutLineTempl =
"\
<p>\n\
<b><font color=\"#FF0000\">$(NAME)</font></b><p>\n\
";
static const char* HTM_OutLine1Templ =
"\
<p>\n\
<b><i><font color=\"#101010\">$(NAME)</font></i></b>\n\
<ul>\n\
$(REFLIST)\
</ul>\n\n\
";
static const char* HTM_RefTempl =
"\
<li><a href=\"#r$(ID)_$(NAME)\">$(NAME)</A>\n\
";
static const char* HTM_DeadRefTempl =
"\
<li></b>$(NAME)\n\
";
/***** Implementation for class RipperDocGen *****/
RipperDocGen::RipperDocGen()
: mTopTempl ( HTM_TopTempl ),
mContentIdxTempl ( HTM_ContentIdxTempl ),
mSuperContentTempl( HTM_SuperContentTempl ),
mSubContentTempl ( HTM_SubContentTempl ),
mOutLineTempl ( HTM_OutLineTempl ),
mOutLine1Templ ( HTM_OutLine1Templ ),
mRefTempl ( HTM_RefTempl ),
mDeadRefTempl ( HTM_DeadRefTempl ),
mpCurClassSect(0)
{ // topIndex is not referenced
mpTopIdx = new ScriptSection( "Source Code Contents" , "", &mTopTempl , 0 );
mpClassIdx = new ScriptSection( "Classes Reference" , "", &mContentIdxTempl, &mRefTempl );
mpEnumIdx = new ScriptSection( "Enumerations Reference" , "", &mContentIdxTempl, &mRefTempl );
mpTypeDefIdx = new ScriptSection( "Type Definitions Reference" , "", &mContentIdxTempl, &mRefTempl );
mpMacroIdx = new ScriptSection( "Macros Reference" , "", &mContentIdxTempl, &mRefTempl );
mpGlobalVarsIdx = new ScriptSection( "Global Variables Reference" , "", &mContentIdxTempl, &mRefTempl );
mpGlobalFuncIdx = new ScriptSection( "Global Functions Reference", "", &mContentIdxTempl, &mRefTempl );
mpConstIdx = new ScriptSection( "Constants Reference" , "", &mContentIdxTempl, &mRefTempl );
// assemble top index
mpTopIdx->AddSection( mpClassIdx , 1 );
mpTopIdx->AddSection( mpEnumIdx , 1 );
mpTopIdx->AddSection( mpTypeDefIdx , 1 );
mpTopIdx->AddSection( mpMacroIdx , 1 );
mpTopIdx->AddSection( mpGlobalVarsIdx, 1 );
mpTopIdx->AddSection( mpGlobalFuncIdx, 1 );
mpTopIdx->AddSection( mpConstIdx , 1 );
// register reserved variables for index and description templates
ScriptSection::RegisterTemplate( mTopTempl );
ScriptSection::RegisterTemplate( mContentIdxTempl );
ScriptSection::RegisterTemplate( mSuperContentTempl );
ScriptSection::RegisterTemplate( mSubContentTempl );
ScriptSection::RegisterTemplate( mOutLineTempl );
ScriptSection::RegisterTemplate( mOutLine1Templ );
ScriptSection::RegisterTemplate( mRefTempl );
ScriptSection::RegisterTemplate( mDeadRefTempl );
// create the top-most (interfile) context
mpFileBinderCtx = new spFile();
// the default script is HTML
mTags = get_HTML_markup_tags();
mpParser = 0; // no default parser!
}
void RipperDocGen::Init( SourceParserBase* pParser )
{
mpParser = pParser;
}
RipperDocGen::~RipperDocGen()
{
delete mpFileBinderCtx;
}
void RipperDocGen::AppendComments( spContext& fromContext, string& str )
{
if ( !fromContext.HasComments() ) return;
size_t start = str.length();
str += mTags[TAG_BOLD].end;
str += mTags[TAG_PARAGRAPH].start;
MCommentListT& lst = fromContext.GetCommentList();
for( size_t i = 0; i != lst.size(); ++i )
{
if ( i != 0 )
if ( lst[i]->StartsParagraph() )
{
str += mTags[TAG_PARAGRAPH].start;
}
str += lst[i]->mText;
}
// remove new lines, and insert paragraph breaks
// if empty lines found
size_t len = str.length();
for( size_t n = start; n != len; ++n )
if ( str[n] == 10 ||
str[n] == 13 )
{
if ( n + 2 < len )
{
if ( ( str[n] == 13 && str[n+1] == 10 && // FIXME:: quick-hack
str[n+2] == 13 ) ||
( str[n] == 10 && str[n+1] == 10 )
)
{
str.insert( n + 1, "<p>" ); // FIXME:: quick-hack
len += 3;
}
}
str[n] = ' ';
}
str += mTags[TAG_PARAGRAPH].end;
}
void RipperDocGen::AppendMulitilineStr( string& st, string& mlStr )
{
st = mTags[TAG_FIXED_FONT].start;
st += mlStr;
st += mTags[TAG_FIXED_FONT].end;
}
void RipperDocGen::AppendHighlightedSource( string& st, string source )
{
// FIXME:: below should not be fixed :)
char buf[1024*32];
// DBG:::
ASSERT( source.length() + 1 < sizeof(buf) );
strcpy( buf, source.c_str() );
// highlight things
mSrcPainter.Init();
mSrcPainter.ProcessSource( buf, strlen(buf) );
mSrcPainter.GetResultString( st, mTags );
}
bool RipperDocGen::CheckIfUncommented( spContext& ctx, ScriptSection& toSect )
{
if ( ctx.HasComments() ) return 0;
toSect.AddReference(
new ScriptSection( GetScopedName( ctx ), "", 0, &mDeadRefTempl )
);
return 1;
}
ScriptTemplate* RipperDocGen::GetRefTemplFor( spContext& ctx )
{
if ( ctx.HasComments() )
return &mRefTempl;
else
return &mDeadRefTempl;
}
string RipperDocGen::GetScopedName( spContext& ofCtx )
{
if ( ofCtx.IsInFile() ) return ofCtx.GetName();
else
return ofCtx.GetOutterContext()->GetName() +
"::" + ofCtx.GetName();
}
void RipperDocGen::AddToCurrentClass( ScriptSection* pSection, spContext& ctx,
const char* subSectionName )
{
string sName;
if ( ctx.mVisibility == SP_VIS_PROTECTED )
sName = "Protected members/";
else
if ( ctx.mVisibility == SP_VIS_PRIVATE )
sName = "Private members/";
else
sName = "Public members/";
sName += subSectionName;
ScriptSection* pSect = mpCurClassSect->GetSubsection( sName.c_str() );
if ( CheckIfUncommented( ctx, *pSect ) )
{
delete pSection;
return;
}
pSect->AddReference( pSection );
mpCurClassSect->AddSection( pSection );
}
void RipperDocGen::LinkSuperClassRefs()
{
MMemberListT clLst;
// collect all classes in the context tree
mpFileBinderCtx->GetContextList( clLst, SP_CTX_CLASS );
for( size_t i = 0; i != clLst.size(); ++i )
{
spClass& cl = *((spClass*)clLst[i]);
// FIXME:: why sometimes GetUserData() returns NULL?
if ( !cl.GetUserData() )
continue;
ScriptSection* pClSect = (ScriptSection*)cl.GetUserData();
ScriptSection* pSuperSect = pClSect->GetSubsection("Derived from");
for( size_t n = 0; n != cl.mSuperClassNames.size(); ++n )
{
string& superClName = cl.mSuperClassNames[n];
spClass* pFound = NULL;
string* name;
for( size_t k = 0; k != clLst.size(); ++k )
{
name = &clLst[k]->GetName();
if ( clLst[k]->GetName() == superClName )
{
pFound = (spClass*)clLst[k];
break;
}
}
if ( !pFound )
{
ScriptSection* pNotFound =
new ScriptSection( superClName, "", 0, &mDeadRefTempl );
pSuperSect->AddReference( pNotFound );
}
else
if ( pFound->GetUserData() )
pSuperSect->AddReference(
(ScriptSection*)pFound->GetUserData() );
}
}
}
void RipperDocGen::ProcessFile( const char* sourceFile )
{
cout << "Processing file " << sourceFile << "..." << endl;
spFile* pCtx = mpParser->ParseFile( sourceFile );
if ( pCtx == NULL )
{
cout << "Cannot open file " << sourceFile << ", skipped..." << endl;
return;
}
VisitAll( *pCtx, TRUE );
mpFileBinderCtx->AddMember( pCtx );
}
// implementations of "visiting procedures"
void RipperDocGen::VisitEnumeration( spEnumeration& en )
{
// FOR NOW:: do not reference "nameless" enums
if ( en.GetName() == "" ) return;
if ( CheckIfUncommented( en, *mpEnumIdx ) )
return;
string body;
body += mTags[TAG_BOLD].start;
AppendMulitilineStr( body, en.mEnumContent );
body += mTags[TAG_BOLD].end;
string line;
AppendHighlightedSource( line, body );
AppendComments( en, line );
mpEnumIdx->AddSection(
new ScriptSection( en.GetName(), line,
&mSubContentTempl,
GetRefTemplFor( en ) ), 1
);
}
void RipperDocGen::VisitTypeDef( spTypeDef& td )
{
if ( CheckIfUncommented( td, *mpTypeDefIdx ) )
return;
string body;
body += mTags[TAG_BOLD].start;
body += "typdef ";
body += mTags[TAG_BOLD].end;
AppendMulitilineStr( body, td.mOriginalType );
body += td.mOriginalType;
body += ' ';
body += mTags[TAG_BOLD].start;
body += td.GetName();
body += mTags[TAG_BOLD].end;
string line;
AppendHighlightedSource( line, body );
AppendComments( td, line );
mpTypeDefIdx->AddSection(
new ScriptSection( td.GetName(), line,
&mSubContentTempl,
GetRefTemplFor( td ) ), TRUE
);
}
void RipperDocGen::VisitPreprocessorLine( spPreprocessorLine& pd )
{
if ( pd.mDefType != SP_PREP_DEF_REDEFINE_SYMBOL )
return;
if ( CheckIfUncommented( pd, *mpMacroIdx ) )
return;
string body;
body += mTags[TAG_FIXED_FONT].start;
string coloredLine = pd.mLine;
AppendHighlightedSource( coloredLine, pd.mLine );
AppendMulitilineStr( body, coloredLine );
body += mTags[TAG_FIXED_FONT].end;
AppendComments( pd, body );
mpMacroIdx->AddSection(
new ScriptSection( pd.GetName(), body,
&mSubContentTempl,
GetRefTemplFor( pd ) ), TRUE
);
}
void RipperDocGen::VisitClass( spClass& cl )
{
// FOR NOW:: do not document nested classes -
// nicier visiting method yet needed
if ( cl.IsInClass() )
{
SkipChildren(); // spVisitor's method
return;
}
string body;
AppendComments( cl, body );
mpCurClassSect =
new ScriptSection( cl.GetName(), body, &mSuperContentTempl, &mRefTempl );
// set up reference in the class context, pointing back
// to the section where this class is represented
cl.SetUserData( mpCurClassSect );
ScriptSection* pSuper = new ScriptSection( "Derived from" ,"", &mOutLine1Templ,0, 1 );
ScriptSection* pPublic = new ScriptSection( "Public members" ,"", &mOutLineTempl,0, 1 );
ScriptSection* pProtected = new ScriptSection( "Protected members" ,"", &mOutLineTempl,0, 1 );
ScriptSection* pPrivate = new ScriptSection( "Private members" ,"", &mOutLineTempl,0, 1 );
pPublic->AddSection( new ScriptSection( "Operations", "", &mOutLine1Templ, 0, 1 ) );
pPublic->AddSection( new ScriptSection( "Attributes", "", &mOutLine1Templ, 0, 1 ) );
pProtected->AddSection( new ScriptSection( "Operations", "", &mOutLine1Templ, 0, 1 ) );
pProtected->AddSection( new ScriptSection( "Attributes", "", &mOutLine1Templ, 0, 1 ) );
pPrivate->AddSection( new ScriptSection( "Operations", "", &mOutLine1Templ, 0, 1 ) );
pPrivate->AddSection( new ScriptSection( "Attributes", "", &mOutLine1Templ, 0, 1 ) );
mpCurClassSect->AddSection( pSuper );
mpCurClassSect->AddSection( pPublic );
mpCurClassSect->AddSection( pProtected );
mpCurClassSect->AddSection( pPrivate );
mpClassIdx->AddSection( mpCurClassSect, TRUE );
}
void RipperDocGen::VisitAttribute( spAttribute& attr )
{
string body;
body += mTags[TAG_BOLD].start;
body += attr.mType;
body += mTags[TAG_BOLD].end;
body += mTags[TAG_ITALIC].start;
body += ' ';
body += attr.GetName();
body += mTags[TAG_ITALIC].end;
string line;
AppendHighlightedSource( line, body );
AppendComments( attr, line );
ScriptSection* pSection =
new ScriptSection( GetScopedName( attr ), line,
&mSubContentTempl,
GetRefTemplFor( attr ) );
if ( attr.mIsConstant )
mpConstIdx->AddSection( pSection, TRUE );
else
if ( !attr.IsInClass() )
{
if ( CheckIfUncommented( attr, *mpGlobalVarsIdx ) )
return;
mpGlobalVarsIdx->AddSection( pSection, TRUE );
}
else
AddToCurrentClass( pSection, attr, "Attributes" );
}
void RipperDocGen::VisitOperation( spOperation& op )
{
string body;
AppendHighlightedSource( body, op.GetFullName(mTags) );
AppendComments( op, body );
ScriptSection* pSection =
new ScriptSection( GetScopedName( op ), body,
&mSubContentTempl,
GetRefTemplFor( op ) );
if ( !op.IsInClass() )
{
if ( CheckIfUncommented( op, *mpGlobalFuncIdx ) )
return;
mpGlobalFuncIdx->AddSection( pSection, 1 );
}
else
AddToCurrentClass( pSection, op, "Operations" );
}
bool RipperDocGen::OnSaveDocument( ScriptStream& stm )
{
LinkSuperClassRefs();
// FOR NOW:: doesn't work yet
//mpTopIdx->RemoveEmptySections();
return 1; // saving can proceed now
}

View File

@ -0,0 +1,295 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: Contrib. demo
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 27/12/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "ifcontext.h"
#pragma interface
#endif
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include <malloc.h>
#include <stdio.h>
#include "ifcontext.h"
/***** Implementation for class spInterFileContext *****/
size_t spInterFileContext::GetFileNo( const string& fname )
{
for( size_t i = 0; i != mFiles.size(); ++i )
if ( fname == mFiles[i] ) return i;
wxASSERT(0); // DBG::
return 0;
}
size_t spInterFileContext::GetFileNoOfContext( spContext& ctx )
{
spContext* pCtx = ctx.GetEnclosingContext( SP_CTX_FILE );
// DBG:: outer-file context should be present
wxASSERT( pCtx && pCtx->GetType() == SP_CTX_FILE );
return GetFileNo( ((spFile*)pCtx)->mFileName );
}
/*** public interface ***/
spInterFileContext::spInterFileContext()
{}
spInterFileContext::~spInterFileContext()
{}
void spInterFileContext::AddFile( const string& fname, const string& content )
{
mFiles.push_back( fname );
mContents.push_back( content );
}
void spInterFileContext::RemoveContext( spContext& ctx )
{
wxASSERT( ctx.PositionIsKnown() ); // DBG:: should be checked by-user code
size_t fNo = GetFileNoOfContext( ctx );
mDeletionMarks.push_back( spBookmark( ctx.mSrcOffset, ctx.mContextLength, fNo ) );
}
void spInterFileContext::InsertBookmarkSorted( BookmarkListT& lst, spBookmark& mark )
{
for( size_t i = 0; i != lst.size(); ++i )
if ( lst[i].mFrom > mark.mFrom )
{
lst.insert( &lst[i], mark );
return;
}
lst.push_back( mark );
}
void spInterFileContext::DoAppendSourceFragment( string& source,
string& result,
size_t pos, size_t len )
{
mFiltered.erase( mFiltered.begin(), mFiltered.end() );
size_t i;
for( i = 0; i != mDeletionMarks.size(); ++i )
{
spBookmark& mark = mDeletionMarks[i];
if ( mark.mFileNo == mCurFileNo &&
mark.mFrom >= pos && mark.mFrom < pos + len )
InsertBookmarkSorted( mFiltered, mark );
}
size_t cur = pos;
for( i = 0; i != mFiltered.size(); ++ i )
{
spBookmark& mark = mFiltered[i];
result.append( source, cur, ( (size_t)mark.mFrom - cur ) );
cur = size_t( mark.mFrom + mark.mLen );
if ( cur >= pos + len ) // check if we've overstepped the current source-fragment
{
wxASSERT(0); // DBG:: with current imp. this should not happen
cur = pos + len; break;
}
}
result.append( source, cur, ( pos + len ) - cur );
}
void spInterFileContext::GenerateContextBody( spContext& ctx,
string& source,
string& result,
size_t& lastSavedPos,
size_t& lastKnownPos )
{
if ( ctx.PositionIsKnown() )
lastKnownPos = ctx.mSrcOffset;
if ( ctx.IsVirtualContext() )
{
// add fragment accumulated before this context
DoAppendSourceFragment( source, result,
size_t(lastSavedPos),
size_t(lastKnownPos - lastSavedPos) );
// add context body
result += ctx.GetVirtualContextBody();
lastSavedPos = lastKnownPos;
if ( ctx.PositionIsKnown() )
{
if ( ctx.VitualContextHasChildren() )
{
lastKnownPos = ctx.mSrcOffset + ctx.mHeaderLength;
lastSavedPos = lastKnownPos;
}
else
{
lastKnownPos = ctx.mSrcOffset + ctx.mContextLength;
lastSavedPos = lastKnownPos;
return; // have not children
}
}
}
MMemberListT& lst = ctx.GetMembers();
for( size_t i = 0; i != lst.size(); ++i )
GenerateContextBody( *lst[i], source, result, lastSavedPos, lastKnownPos );
if ( ctx.IsVirtualContext() )
{
if ( ctx.VitualContextHasChildren() &&
ctx.GetFooterOfVirtualContextBody() != "" )
{
// append the reminder space after children of the context
DoAppendSourceFragment( result, source,
size_t(lastSavedPos),
size_t(lastKnownPos - lastSavedPos) );
// add footer
result += ctx.GetFooterOfVirtualContextBody();
lastKnownPos = ctx.mSrcOffset + ctx.mContextLength;
lastSavedPos = lastKnownPos;
}
}
if ( ctx.PositionIsKnown() )
lastKnownPos = ctx.mSrcOffset + ctx.mContextLength;
}
void spInterFileContext::GenrateContents()
{
MMemberListT& lst = GetMembers();
for( size_t f = 0; f != lst.size(); ++f )
{
string& fname = ((spFile*)lst[f])->mFileName;
size_t fileNo = GetFileNo( fname );
string& source = mContents[ fileNo ];
string result;
size_t lastKnownPos = 0, // the begining of the file is always "known"
lastSavedPos = 0;
mCurFileNo = fileNo;
GenerateContextBody( *lst[f], source, result, lastSavedPos, lastKnownPos );
// the end of file is always known
lastKnownPos = mContents[ fileNo ].length();
// append the reminder
DoAppendSourceFragment( source, result,
size_t(lastSavedPos),
size_t(lastKnownPos - lastSavedPos) );
// replace original contnet with newly generated one
mContents[ fileNo ] = result;
}
}
void spInterFileContext::ParseContents( SourceParserPlugin* pPlugin )
{
mDeletionMarks.erase( mDeletionMarks.begin(), mDeletionMarks.end() );
RemoveChildren(); // clean up top-level context
mParser.SetPlugin( pPlugin );
for( size_t i = 0; i != mFiles.size(); ++i )
{
char* s = (char*)(mContents[i].c_str());
spFile* pFCtx = mParser.Parse( s, s + mContents[i].length() );
pFCtx->mFileName = mFiles[i];
AddMember( pFCtx );
}
}
void spInterFileContext::WriteToFiles()
{
for( size_t i = 0; i != mFiles.size(); ++i )
{
FILE* fp = fopen( mFiles[i].c_str(), "w+t" );
if ( int(fp) > 0 )
{
fwrite( mContents[i].c_str(), sizeof(char), mContents[i].length(), fp );
fclose( fp );
}
}
}
string spInterFileContext::GetBody( spContext* pCtx )
{
wxASSERT( pCtx->PositionIsKnown() ); // DBG:: should be checked by-user code
string& source = mContents[ GetFileNoOfContext( *pCtx ) ];
return string( source.c_str() + pCtx->mSrcOffset, pCtx->mContextLength );
}
string spInterFileContext::GetHeader( spContext* pCtx )
{
wxASSERT( pCtx->PositionIsKnown() ); // DBG:: should be checked by-user code
wxASSERT( pCtx->mHeaderLength != -1 ); // DBG:: -/-
string& source = mContents[ GetFileNoOfContext( *pCtx ) ];
return string( source.c_str() + pCtx->mSrcOffset, pCtx->mHeaderLength );
}

View File

@ -0,0 +1,46 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: Contrib. demo
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 22/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include "markup.h"
static TagStructT htmlTags[] =
{
{ "<b>","</b>" }, // 0
{ "<i>","</i>" }, // 1
{ "<pre>","</pre>" }, // 2
{ "<font color=\"#000000\">","</font>" }, // 3
{ "<font color=\"#8F0000\">","</font>" }, // 4
{ "<font color=\"#008F00\">","</font>" }, // 5
{ "<font color=\"#0000CF\">","</font>" }, // 6
{ "<p>","</p>" }, // 7
{ "<br>","" }, // 8
{ "<h1>","</h1>" }, // 9
{ "<h2>","</h2>" }, // 10
{ "<h3>","</h3>" }, // 11
{ "<ul>","</ul>" }, // 12
{ "<li>","</li>" }, // 13
};
MarkupTagsT get_HTML_markup_tags()
{
return htmlTags;
}

View File

@ -0,0 +1,157 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: Contrib. demo
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 22/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#ifdef WIN32
#include <io.h>
#endif
#include <stdio.h>
#include "markup.h" // get_HTML_markup_tags() will be used
#include "docripper.h"
#include "cjparser.h" // C++/Java will be parsed here
/***** Main funciton *****/
#ifdef WIN32
// NOTE:: under Windows this generator parses all .h files
// int the current directory
#include "direct.h"
void main(int argc, char** argv)
{
cout << "C++/JAVA Source Documentation Generator (\"wxDocRipper\")" << endl
<< "(C) 1998, Aleksandras Gluchovas (mailto:alex@soften.ktu.lt)"
<< endl << endl;
RipperDocGen gen;
// set up target script
gen.SetScriptMarkupTags( get_HTML_markup_tags() );
// setup source langauge
CJSourceParser* pParser = new CJSourceParser();
gen.Init( pParser );
// read process all files in the current directory
struct _finddata_t c_file; // NT-specific?
long hFile;
hFile = _findfirst( "*.h", &c_file );
int total = 0;
while( hFile != -1L )
{
gen.ProcessFile( c_file.name );
++total;
if ( _findnext( hFile, &c_file ) == -1L )
break;
}
if ( total )
{
cout << endl
<< "*** storing source documenation into ./srcref.html ***"
<< endl << endl;
if ( !gen.SaveDocument( "srcref.html" ) )
cout << "\nERROR: document cannot be saved" << endl;
}
else
{
cout << "\nno .h files found in this directory - You must be running Windows now :-)"
<< endl;
return;
}
printf( "\nTotal %d file(s) processed, done.\n", total );
}
#else
// NOTE:: on platfroms other then Windows this generator parses all files
// given from the command line
int main(int argc, char** argv)
{
cout << "C++/JAVA Source Documentation Generator (\"wxDocRipper\")" << endl
<< "(C) 1998, Aleksandras Gluchovas (mailto:alex@soften.ktu.lt)"
<< endl << endl;
if ( argc < 2 )
{
cout << "Usage: list of files with .h, .hpp, .cpp or .java extentions"
<< endl;
return 1;
}
int from = 1, no_dump = 0;
if ( strcmp( argv[1], "-x" ) == 0 )
{
from = 2;
no_dump = 1;
}
RipperDocGen gen;
// set up target script
gen.SetScriptMarkupTags( get_HTML_markup_tags() );
// setup source langauge
CJSourceParser* pParser = new CJSourceParser();
gen.Init( pParser );
for( int i = from; i != argc; ++i )
gen.ProcessFile( argv[i] );
if ( !no_dump )
{
cout << endl
<< "*** storing source documenation into ./srcref.html ***"
<< endl << endl;
if ( !gen.SaveDocument( "srcref.html" ) )
cout << "\nERROR: document cannot be saved" << endl;
}
printf( "\nTotal %d file(s) processed, done.\n", argc-from );
return 0;
}
#endif

View File

@ -0,0 +1,618 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: Contrib. demo
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 22/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include <malloc.h>
#include <string.h>
#include <memory.h>
#include <stdio.h> // import sprintf() (for doubles)
#include <stdlib.h> // import atoi() (for integers)
#include "scriptbinder.h"
// helper functions
static size_t log2(size_t nr)
{
size_t tmp = 0;
while (nr >= 2 )
{
nr /= 2;
++tmp;
}
return tmp;
}
/***** Implementation for class ScriptStream *****/
ScriptStream::ScriptStream()
: mpBuf(0),
mSize(0),
mCapacity(0)
{}
ScriptStream::~ScriptStream()
{
if ( mpBuf ) delete mpBuf;
}
void ScriptStream::WriteBytes( const void* srcBuf, size_t count )
{
if ( !count ) return;
// increase the capacity if necessary
if ( mSize + count > mCapacity )
{
mCapacity =
( 0x2 << (log2( mSize + count ) + 1 ) );
if ( mCapacity < 128 ) mCapacity = 128;
char* oldBuf = mpBuf;
mpBuf = new char[mCapacity];
if ( oldBuf )
{
memcpy( mpBuf, oldBuf, mSize );
delete oldBuf;
}
}
// append new data
memcpy( &mpBuf[mSize], srcBuf, count );
mSize += count;
}
ScriptStream& ScriptStream::operator<<( const char* str )
{
WriteBytes( str, strlen( str ) );
return *this;
}
ScriptStream& ScriptStream::operator<<( const string& str )
{
if ( str.length() < 512 )
{
char buf[512];
size_t len = str.length();
for( size_t i = 0; i != len; ++i )
buf[i] = str[i];
WriteBytes( buf, len );
}
else
WriteBytes( str.c_str(), str.length() );
return *this;
}
ScriptStream& ScriptStream::operator<<( char ch )
{
WriteBytes( &ch, 1 );
return *this;
}
void ScriptStream::endl()
{
char ch = '\n';
WriteBytes( &ch, 1 );
}
/***** Implementation for class ScriptTemplate *****/
ScriptTemplate::ScriptTemplate( const string& templateText )
{
string tmp = templateText;
mTText = (char*)malloc( tmp.length() + 1 );
strcpy( mTText, tmp.c_str() );
}
ScriptTemplate::~ScriptTemplate()
{
for( size_t i = 0; i != mVars.size(); ++i )
delete mVars[i];
free( mTText );
}
bool ScriptTemplate::HasVar( const char* name )
{
for( size_t i = 0; i != mVars.size(); ++i )
if ( strcmp( mVars[i]->mName, name ) == 0 )
return 1;
return 0;
}
void ScriptTemplate::AddStringVar ( const char* name, int ofs )
{
mVars.push_back( new TVarInfo( name, ofs, TVAR_STRING ) );
}
void ScriptTemplate::AddIntegerVar( const char* name, int ofs )
{
mVars.push_back( new TVarInfo( name, ofs, TVAR_INTEGER ) );
}
void ScriptTemplate::AddDoubleVar ( const char* name, int ofs )
{
mVars.push_back( new TVarInfo( name, ofs, TVAR_DOUBLE ) );
}
void ScriptTemplate::AddObjectRefArray( const char* name,
int ofsRefToFirstObj,
int ofsObjSizeInt,
int ofsObjRefTempl
)
{
TArrayInfo* pInfo = new TArrayInfo( name );
mVars.push_back( pInfo );
pInfo->mRefOfs = ofsRefToFirstObj;
pInfo->mSizeIntOfs = ofsObjSizeInt;
pInfo->mObjRefTemplOfs = ofsObjRefTempl;
}
inline void ScriptTemplate::PrintVar( TVarInfo* pInfo,
void* dataObj,
ScriptStream& stm )
{
char buf[128];
switch ( pInfo->mType )
{
case TVAR_INTEGER :
{
sprintf(buf, "%d",*( (int*) ((char*)dataObj + pInfo->mOfs) ) );
stm.WriteBytes( buf, strlen(buf ) );
break;
}
case TVAR_STRING :
{
string& str = *( (string*) ((char*)dataObj+pInfo->mOfs) );
const char* cs = str.c_str();
#ifdef DEBUG_WEIRED_OFFSETS
cout << "DBG:: cs address is " << (int)cs << endl;
cout << "DBG:: str address is " << (int)(&str) << endl;
cout << "DBG:: dataObj points to " << (int)dataObj << endl;
cout << "DBG:: pInfo->mOfs value is " << (int)pInfo->mOfs << endl;
cout << "DBG:: d+pInfo->mOfs is " << (int)((char*)dataObj + pInfo->mOfs) << endl;
cout << "DBG:: pInfo->mName is " << pInfo->mName << endl;
cout << "DBG:: pInfo->mType is " << pInfo->mType << endl;
cout << "DBG:: end of dump. " << endl;
cout << "DBG:: cs value is " << endl << cs << endl;
#endif
stm.WriteBytes( cs, strlen(cs) );
break;
}
case TVAR_DOUBLE :
{
sprintf( buf, "%f",
*( (double*)( (char*)dataObj+pInfo->mOfs) ) );
stm.WriteBytes( buf, strlen(buf ) );
break;
}
case TVAR_REF_ARRAY :
{
TArrayInfo& info = *((TArrayInfo*)pInfo);
int sz = *((int*) ( (char*)dataObj+info.mSizeIntOfs ));
if ( !sz )
{
// DBG::
int u;
++u;
break;
}
int* array = *((int**)( (char*)dataObj+info.mRefOfs ));
ScriptTemplate* pRefTempl;
for( int i = 0; i != sz; ++i )
{
pRefTempl =
*((ScriptTemplate**)((char*)(array[i])+info.mObjRefTemplOfs));
pRefTempl->PrintScript( (void*)array[i], stm );
}
break;
}
default : break;
}
}
void ScriptTemplate::PrintScript( void* dataObj, ScriptStream& stm )
{
char* cur = mTText;
// template parsing loop
do
{
char* start = cur;
while( *cur != '\0' && *cur != '$' ) ++cur;
// flush text collected between variables
stm.WriteBytes( start, cur - start );
if ( *cur == '\0' ) break;
cur += 2; // skip to the name of the var
start = cur;
while( *cur != ')' ) ++cur;
// put terminating zero temorarely
*cur = '\0';
// look up variable
size_t sz = mVars.size();
bool found = 0;
for( size_t i = 0; i != sz; ++i )
{
if ( strcmp( mVars[i]->mName, start ) == 0 )
{
PrintVar( mVars[i], dataObj, stm );
*cur = ')'; // remove terminating zero
++cur;
found = 1;
break;
}
}
// variable referred by template script is not
// registered to this tempalte object
ASSERT( found );
} while(1);
}
/***** implementation for class ScriptSection *****/
int ScriptSection::mIdCounter = 0;
ScriptSection::ScriptSection( const string& name,
const string& body,
ScriptTemplate* pSectionTemplate,
ScriptTemplate* pReferenceTemplate,
bool autoHide,
bool sorted
)
: mpParent ( NULL ),
mName ( name ),
mBody ( body ),
mAutoHide( autoHide ),
mSortOn ( sorted ),
mpSectTempl( pSectionTemplate ),
mpRefTempl ( pReferenceTemplate ),
mRefCount( 0 ),
mArrSize( 0 )
{
// generate GUID
char buf[32];
sprintf( buf, "%d", ++mIdCounter );
mId = buf;
}
ScriptSection::~ScriptSection()
{
SectListT lst = mSubsections;
while( mSubsections.size() )
mSubsections[0]->RemoveRef();
for( size_t i = 0; i != mReferences.size(); ++i )
mReferences[i]->RemoveRef();
}
void ScriptSection::AddRef()
{
++mRefCount;
}
void ScriptSection::RemoveRef()
{
if ( !mRefCount || !(--mRefCount) )
{
if (mpParent)
{
// remove ourselves from parent's list
SectListT& lst = mpParent->mSubsections;
for( size_t i = 0; i != lst.size(); ++i )
if ( lst[i] == this )
{
lst.erase( &lst[i] );
break;
}
}
delete this;
}
}
ScriptSection* ScriptSection::GetSubsection( const char* name )
{
// FOR NOW:: fixed section name length
char buf[128];
size_t cur = 0;
while( name[cur] && name[cur] != '/' )
{
buf[cur] = name[cur];
++cur;
}
ASSERT( cur < sizeof(buf) );
buf[cur] = '\0';
size_t sz = mSubsections.size();
for( size_t i = 0; i != sz; ++i )
{
// DBG::
//ScriptSection& sect = *mSubsections[i];
if ( mSubsections[i]->mName == buf )
{
if ( name[cur] == '/' )
// search recursivelly
return mSubsections[i]->GetSubsection( &name[cur+1] );
else
return mSubsections[i];
}
}
return 0;
}
void ScriptSection::AddSection( ScriptSection* pSection,
bool addToReferencesToo
)
{
mSubsections.push_back( pSection );
pSection->AddRef();
// can add section to multiple containers
ASSERT( pSection->mpParent == 0 );
pSection->mpParent = this;
if ( addToReferencesToo )
AddReference( pSection );
}
void ScriptSection::AddReference( ScriptSection* pReferredSection )
{
mReferences.push_back( pReferredSection );
pReferredSection->AddRef();
// set up mandatory fields used by ScriptTemplate
mArrSize = mReferences.size();
if ( mArrSize )
mRefFirst = (void*)&mReferences[0];
}
SectListT& ScriptSection::GetSubsections()
{
return mSubsections;
}
// static method:
void ScriptSection::RegisterTemplate( ScriptTemplate& sectionTempalte )
{
int nameOfs, bodyOfs, idOfs,
arrRefOfs, arrSizeOfs, refTemplOfs;
// obtaining offsets of member vars
GET_VAR_OFS( ScriptSection, mName, &nameOfs )
GET_VAR_OFS( ScriptSection, mBody, &bodyOfs )
GET_VAR_OFS( ScriptSection, mId, &idOfs )
GET_VAR_OFS( ScriptSection, mRefFirst, &arrRefOfs )
GET_VAR_OFS( ScriptSection, mArrSize, &arrSizeOfs )
GET_VAR_OFS( ScriptSection, mpRefTempl, &refTemplOfs )
// registering member variables with given script template
sectionTempalte.AddStringVar( "NAME", nameOfs );
sectionTempalte.AddStringVar( "BODY", bodyOfs );
sectionTempalte.AddStringVar( "ID", idOfs );
sectionTempalte.AddObjectRefArray( "REFLIST",
arrRefOfs, arrSizeOfs, refTemplOfs );
}
void ScriptSection::Print( ScriptStream& stm )
{
// TBD:: sorting
// print out this content first
if ( mpSectTempl )
mpSectTempl->PrintScript( this, stm );
// attach contents subsections at the end of this content
for( size_t i = 0; i != mSubsections.size(); ++i )
mSubsections[i]->Print( stm );
}
void ScriptSection::DoRemoveEmptySections(int& nRemoved, SectListT& removedLst)
{
for( size_t i = 0; i != mSubsections.size(); ++i )
{
ScriptSection& sect = *mSubsections[i];
sect.DoRemoveEmptySections( nRemoved, removedLst );
if (sect.mAutoHide )
if ( sect.mReferences.size() == 0 )
{
bool found = 0;
for( size_t k = 0; k != removedLst.size(); ++k )
if ( removedLst[k] == &sect )
{
found = 1;
break;
}
if ( !found )
{
removedLst.push_back( &sect );
++nRemoved;
delete &sect;
--i;
}
}
}
}
void ScriptSection::DoRemoveDeadLinks( SectListT& removedLst)
{
size_t dsz = removedLst.size();
for( size_t i = 0; i != mSubsections.size(); ++i )
{
mSubsections[i]->DoRemoveDeadLinks( removedLst );
}
for( size_t n = 0; n != mReferences.size(); ++n )
{
for( size_t k = 0; k != dsz; ++k )
if ( removedLst[k] == mReferences[n] )
{
mReferences.erase( &mReferences[n] );
--n;
// set up mandatory fields used by ScriptTemplate
mArrSize = mReferences.size();
if ( mArrSize )
mRefFirst = (void*)&mReferences[0];
break;
}
}
}
void ScriptSection::RemoveEmptySections()
{
// FIXME:: this is very_very_very slow alg.! +"doesn't work"
int nRemoved = 0;
do
{
SectListT removedLst;
nRemoved = 0;
DoRemoveEmptySections( nRemoved, removedLst );
DoRemoveDeadLinks( removedLst );
}
while( nRemoved );
}
/***** Iimplementation for class DocGeneratorBase *****/
bool DocGeneratorBase::SaveDocument( const char* fname,
const char* fopenOptions,
ScriptSection* pFromSection
)
{
FILE* fp = fopen( fname, fopenOptions );
if ( (int)fp == -1 ) return 0;
ScriptStream stm;
// check if derived class agrees about saving it
if ( !OnSaveDocument( stm ) ) return 0;
if ( pFromSection )
pFromSection->Print( stm );
else
{
ScriptSection* pTopSect = GetTopSection();
ASSERT( pTopSect );
pTopSect->Print( stm );
}
size_t nWrite = fwrite( stm.GetBuf(), 1, stm.GetBufSize(), fp );
if ( nWrite != stm.GetBufSize() ) return 0;
fclose( fp );
return 1;
// that^s it
}

View File

@ -0,0 +1,676 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: Contrib. demo
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 22/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#if defined( wxUSE_TEMPLATE_STL )
#include <map>
#else
#include <wxstlac.h>
#endif
#include "sourcepainter.h"
const int MAX_KEYWORD_LEN = 16;
struct KeywordT
{
char keyWord[MAX_KEYWORD_LEN];
int rank;
};
// source fragment ranks :
// 0 - nomral text
// 1 - basic types
// 2 - reserved words
// multil-language keywords map
static KeywordT __gKeyWords[] =
{
{ "for", 1 },
{ "FOR", 1 },
{ "For", 1 },
{ "next", 1 },
{ "Next", 1 },
{ "NEXT", 1 },
{ "if", 1 },
{ "If", 1 },
{ "IF", 1 },
{ "then", 1 },
{ "Then", 1 },
{ "THEN", 1 },
{ "else", 1 },
{ "Else", 1 },
{ "ELSE", 1 },
{ "do", 1 },
{ "Do", 1 },
{ "DO", 1 },
{ "break", 1 },
{ "Break", 1 },
{ "BREAK", 1 },
{ "continue", 1 },
{ "goto", 1 },
{ "Goto", 1 },
{ "GOTO", 1 },
{ "switch", 1 },
{ "default", 1 },
{ "case", 1 },
{ "repeat", 1 },
{ "Repeat", 1 },
{ "REPEAT", 1 },
{ "until", 1 },
{ "Until", 1 },
{ "UNTIL", 1 },
{ "return", 1 },
{ "Return", 1 },
{ "RETURN", 1 },
{ "unit", 1 },
{ "Unit", 1 },
{ "UNIT", 1 },
{ "procedure", 1 },
{ "Procedure", 1 },
{ "PROCEDURE", 1 },
{ "function", 1 },
{ "Function", 1 },
{ "FUNCTION", 1 },
{ "begin", 1 },
{ "Begin", 1 },
{ "BEGIN", 1 },
{ "End", 1 },
{ "END", 1 },
////////////////////////////////////////////////////
{ "enum", 1 },
{ "static", 1 },
{ "const", 1 },
{ "mutable", 1 },
{ "volatile", 1 },
{ "__asm", 1 },
{ "asm", 1 },
{ "typeid", 1 },
{ "sizeof", 1 },
{ "typeof", 1 },
{ "native", 1 },
{ "#include", 1 },
{ "#define", 1 },
{ "#def", 1 },
{ "#undef", 1 },
{ "#ifdef", 1 },
{ "#ifndef", 1 },
{ "#if", 1 },
{ "#endif", 1 },
{ "#elif", 1 },
{ "#else", 1 },
{ "#pragma", 1 },
{ "#line", 1 },
{ "package", 1 },
{ "import", 1 },
{ "export", 1 },
////////////////////////////////////////////////////
{ "dynamic_cast", 1 },
{ "const_cast", 1 },
//////// some hacks for VB /////////
{ "sub", 1 },
{ "Sub", 1 },
{ "SUB", 1 },
{ "as", 1 },
{ "As", 1 },
{ "AS", 1 },
/////// data types ///////
{ "int" , 1 },
{ "integer", 1 },
{ "Integer", 1 },
{ "INTEGER", 1 },
{ "real", 1 },
{ "Real", 1 },
{ "REAL", 1 },
{ "float", 1 },
{ "Float", 1 },
{ "FLOAT", 1 },
{ "char", 1 },
{ "Char", 1 },
{ "CHAR", 1 },
{ "register", 1 },
{ "string", 1 },
{ "String", 1 },
{ "STRING", 1 },
{ "array", 1 },
{ "Array", 1 },
{ "ARRAY", 1 },
{ "packed", 1 },
{ "Packed", 1 },
{ "PACKED", 1 },
{ "property", 1 },
{ "Property", 1 },
{ "PROPERTY", 1 },
{ "unsigned", 1 },
{ "long", 1 },
{ "double", 1 },
{ "short", 1 },
{ "bool", 1 },
{ "longint", 1 },
{ "Longint", 1 },
{ "LONGINT", 1 },
{ "extended", 1 },
{ "Extended", 1 },
{ "EXTENTED", 1 },
{ "pointer", 1 },
{ "Pointer", 1 },
{ "POINTER", 1 },
{ "and", 1 },
{ "And", 1 },
{ "AND", 1 },
{ "or", 1 },
{ "Or", 1 },
{ "OR", 1 },
{ "xor", 1 },
{ "Xor", 1 },
{ "XOR", 1 },
{ "void", 1 },
{ "__stdcall", 1 },
{ "__declspec", 1 },
{ "extern", 1 },
{ "stdcall", 1 },
{ "dllimport", 1 },
{ "dllexport", 1 },
{ "__cdecl", 1 },
{ "cdecl", 1 },
{ "template", 1 },
{ "typedef", 1 },
{ "naked", 1 },
{ "try", 1 },
{ "catch", 1 },
{ "throw", 2 }, // C++
{ "throws", 1 }, // Java
{ "finalize", 1 },
// "STL-suport"
{ "size_t", 1 },
{ "NPOS", 1 },
{ "vector", 1 },
{ "list", 1 },
{ "map", 1 },
{ "multimap", 1 },
{ "external", 1 },
{ "External", 1 },
{ "EXTERNAL", 1 },
//////////// meta-information //////////////
{ "virtual", 2 },
{ "Virtual", 2 },
{ "override", 2 },
{ "Override", 2 },
{ "class", 2 },
{ "Class", 2 },
{ "CLASS", 2 },
{ "struct", 2 },
{ "union", 2 },
{ "record", 2 },
{ "Record", 2 },
{ "RECORD", 2 },
{ "form", 1 },
{ "Form", 1 },
{ "FORM", 1 },
{ "namespace", 2 },
{ "interface" , 2 },
{ "abstract", 2 },
{ "Interface" , 2 },
{ "INTERFACE" , 2 },
{ "implementation", 2 },
{ "Implementation", 2 },
{ "IMPLEMENTATION", 2 },
{ "label", 2 },
{ "Label", 2 },
{ "LABEL", 2 },
{ "implements", 2 },
{ "public", 2 },
{ "private", 2 },
{ "protected", 2 },
{ "this", 2 },
{ "This", 2 },
{ "THIS", 2 },
{ "new", 2 },
{ "New", 2 },
{ "NEW", 2 },
{ "delete", 2 },
{ "inline", 2 },
{ "operator", 2 },
{ "Inherited", 2 },
{ "Inherited", 2 },
{ "final", 2 },
{ "implements", 2 },
{ "super", 2 },
// even more...
{ "java", 2 },
{ "Java", 2 },
{ "JAVA", 2 },
{ "delphi", 2 },
{ "Delphi", 2 },
{ "SmallTalk", 2 },
{ "Smalltalk", 2 },
{ "smalltalk", 2 },
{ "assembler", 2 },
{ "Assembler", 2 },
{ "Basic", 2 },
{ "BASIC", 2 },
{ "basic", 2 },
{ "CORBA", 2 },
{ "COBOL", 2 },
{ "ADA", 2 },
{ "LISP", 2 },
// just for fun...
{ "life", 2 },
{ "sucks", 2 },
{ "rules", 2 },
{ "Quake", 2 },
{ "QuakeWorld", 2 },
{ "[ag_slammer]",2 },
{ "Aleksandras", 2 },
{ "Gluchovas" , 2 },
{ "Alex", 2 },
{ "alex", 2 },
{ "aleks", 2 },
{ "aleksas", 3 },
{ "AlexSoft", 2 },
{ "Alexsoft", 2 },
{ "SpringSky", 2 },
{ "SK_Team", 2 },
{ "soften", 2 },
{ "UB40", 2 },
{ "U96", 2 }
};
struct less_c_str
{
inline bool operator()( char* x, char* y) const
{ return ( strcmp( x,y ) < 0 );
}
};
#if defined( wxUSE_TEMPLATE_STL )
typedef map< char*, char*, less_c_str > KeywordMapT;
#else
typedef char* CharPtrT;
typedef WXSTL_MAP( CharPtrT, CharPtrT ,less_c_str) KeywordMapT;
#endif
static KeywordMapT __gMultiLangMap;
static int __gMapReady = 0;
void check_keyword_map( int keywordMapNr )
{
if ( !__gMapReady )
{
__gMapReady = 1;
// "make sure" the address of the first member of non-polimorphic class
// coinsides with the address of the instance
KeywordT dummy;
if ( (char*)& dummy != &dummy.keyWord[0] )
throw;
int size = sizeof(__gKeyWords) / sizeof( KeywordT );
for( int i = 0; i != size; ++i )
__gMultiLangMap.insert(
KeywordMapT::value_type( (char*)&__gKeyWords[i],
(char*)&__gKeyWords[i]
)
);
}
}
int get_rank( char* start, char* end )
{
// FIXME:: what if end is no longer leagal adress?
char tmp = *end;
*end = '\0'; // put temporary terminator
KeywordMapT::iterator i;
if ( (i = __gMultiLangMap.find( start ) ) != __gMultiLangMap.end() )
{
KeywordT* pKey = (KeywordT*)(*i).second;
*end = tmp;
return pKey->rank;
}
else
{
*end = tmp;
return 0;
}
}
static inline void store_range( SPBlockListT& results, int rank, int range_len )
{
if ( !range_len ) return;
results.push_back ( ( rank << 16 ) | ( range_len ) );
}
#define STORE_RANGE store_range( results, cur_rank, cur_range_len );\
cur_rank = cur_range_len = 0;
#define NEXT_CHAR cur_range_len++; \
++cur; \
continue;
static inline int is_alpha( char ch )
{
return ( (( ch >= '_' ) && ( ch <= 'z' )) ||
(( ch >= 'A' ) && ( ch <= 'Z' ))
);
}
// _ . .
// Ziema atEjo netikEtai
static void heighlight_syntax( char* str, int strLen,
SPBlockListT& results, bool& isComment )
{
bool isMultiline = 0;
char* cur = str;
char* end = str + strLen;
int cur_rank = ( isComment == 1 ) ? RANK_GREEN : RANK_BLACK;
int cur_range_len = 0;
while ( cur != end )
{
int has_next = ( cur+1 != end );
if ( isComment )
{
if ( *cur == '*' )
if ( has_next && *(cur+1) == '/' )
{
// turn off multiline comment mode
cur += 2;
cur_range_len += 2;
isComment = 0;
isMultiline = 0;
STORE_RANGE;
continue;
}
++cur_range_len;
++cur;
continue;
}
/*
if ( *cur == 10 )
if ( isComment )
if ( isMultiline )
{
cur_rank = RANK_GREEN;
cur_range_len = end - cur;
STORE_RANGE;
isComment = 0;
isMultiline = 0;
continue;
}*/
if ( *cur == '/' )
{
if ( has_next )
{
if ( *(cur+1) == '/' )
{
STORE_RANGE;
char* eol = cur;
while ( eol < end && *eol != 10 )
++eol;
cur_rank = RANK_GREEN;
cur_range_len = eol - cur;
cur = eol;
STORE_RANGE;
continue;
}
if ( *(cur+1) == '*' )
{
STORE_RANGE;
cur_rank = RANK_GREEN;
cur_range_len = 2;
isComment = 1;
cur += 2;
isMultiline = 1;
continue;
}
}
NEXT_CHAR;
}
if ( ( is_alpha( *cur ) || *(cur) == '#' )
&& has_next
)
{
if ( is_alpha( *(cur+1) ) )
{
char* start = cur;
cur += 2;
while ( cur != end && is_alpha(*cur) ) ++cur;
int wordRank;
if ( (wordRank = get_rank( start, cur )) > 0 )
{
STORE_RANGE;
store_range( results, wordRank, int(cur-start) );
cur_rank = cur_range_len = 0;
continue;
}
cur_range_len += ( cur-start );
continue;
}
else
NEXT_CHAR;
}
NEXT_CHAR;
}
if ( cur_range_len > 0 ) STORE_RANGE;
}
/***** Implementation for class SourcePainter ******/
SourcePainter::SourcePainter( bool assembleResultString )
: mCollectResultsOn( assembleResultString ),
mIsInComment( FALSE ),
mCommentIsMultiline( FALSE )
{
check_keyword_map(0);
}
void SourcePainter::ProcessSource( char* src, int srcLen )
{
// TBD:: multilne state...
heighlight_syntax( src, srcLen, mBlocks, mIsInComment );
if ( mCollectResultsOn )
mResultStr += string( src, srcLen );
}
void SourcePainter::SetState( bool isInComment,
bool commentIsMultiline )
{
mIsInComment = isInComment;
mCommentIsMultiline = commentIsMultiline;
}
void SourcePainter::Init(bool assembleResultString)
{
mIsInComment = 0;
mCommentIsMultiline = 0;
mCollectResultsOn = assembleResultString;
mResultStr = "";
mBlocks.erase( mBlocks.begin(), mBlocks.end() );
}
static int rank_tags_map[] =
{
TAG_BLACK_FONT,
TAG_BLUE_FONT,
TAG_RED_FONT,
TAG_GREEN_FONT
};
void SourcePainter::GetResultString(string& result, MarkupTagsT tags)
{
// this method works, only if results of processing
// are collected
ASSERT( mCollectResultsOn );
result = "";
int pos = 0;
for( size_t i = 0; i != mBlocks.size(); ++i )
{
int desc = mBlocks[i];
int len = desc & 0xFFFF;
int rank = (desc >> 16) & 0xFFFF;
result += tags[ rank_tags_map[rank] ].start;
for( int n = 0; n != len; ++n )
result += mResultStr[pos+n];
pos += len;
result += tags[ rank_tags_map[rank] ].end;
}
}
SPBlockListT& SourcePainter::GetBlocks()
{
return mBlocks;
}
bool SourcePainter::IsKeyword( char* word, int wordLen )
{
check_keyword_map(0);
int rank = get_rank( word, word + wordLen );
return ( rank == RANK_BLUE || rank == RANK_RED );
}

View File

@ -0,0 +1,543 @@
/////////////////////////////////////////////////////////////////////////////
// Name: No names yet.
// Purpose: Contrib. demo
// Author: Aleksandras Gluchovas
// Modified by:
// Created: 22/09/98
// RCS-ID: $Id$
// Copyright: (c) Aleskandars Gluchovas
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
#pragma implementation "srcparser.h"
#pragma interface
#endif
// For compilers that support precompilation, includes "wx/wx.h".
#include "wx/wxprec.h"
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/wx.h"
#endif
#include <malloc.h>
#include <stdio.h>
#include "srcparser.h"
/***** Implementation for class spVisitor *****/
void spVisitor::VisitAll( spContext& atContext,
bool sortContent
)
{
mSiblingSkipped = FALSE;
mChildSkipped = FALSE;
mContextMask = SP_CTX_ANY; // FIXME:: should be an arg.
if ( sortContent && !atContext.IsSorted() )
atContext.SortMembers();
mpCurCxt = &atContext; // FIXME:: this is dirty, restoring it each time
if ( atContext.GetContextType() & mContextMask )
atContext.AcceptVisitor( *this );
MMemberListT& members = atContext.GetMembers();
for( size_t i = 0; i != members.size(); ++i )
{
if ( mSiblingSkipped )
return;
if ( !mChildSkipped )
{
size_t prevSz = members.size();
// visit members of the context recursivelly
VisitAll( *members[i], sortContent );
if ( members.size() != prevSz )
--i; // current member was removed!
mChildSkipped = 0;
}
}
}
void spVisitor::RemoveCurrentContext()
{
if ( mpCurCxt->GetParent() )
mpCurCxt->GetParent()->RemoveChild( mpCurCxt );
}
void spVisitor::SkipSiblings()
{
mSiblingSkipped = TRUE;
}
void spVisitor::SkipChildren()
{
mChildSkipped = TRUE;
}
void spVisitor::SetFilter( int contextMask )
{
mContextMask = contextMask;
}
/***** Implementation for class spComment *****/
bool spComment::IsMultiline() const
{
return mIsMultiline;
}
bool spComment::StartsParagraph() const
{
return mStartsPar;
}
string& spComment::GetText()
{
return mText;
}
string spComment::GetText() const
{
return mText;
}
/***** Implementation for class spContext *****/
spContext::spContext()
: mpParent ( NULL ),
mpFirstOccurence( NULL ),
mAlreadySorted ( FALSE ),
mSrcLineNo (-1),
mSrcOffset (-1),
mContextLength(-1),
mLastScrLineNo(-1),
mHeaderLength (-1),
mFooterLength (-1),
mFirstCharPos (-1),
mLastCharPos (-1),
mVisibility( SP_VIS_PRIVATE ),
mIsVirtualContext ( FALSE ),
mVirtualContextHasChildren( FALSE ),
mpUserData( NULL )
{}
void spContext::RemoveChildren()
{
for( size_t i = 0; i != mMembers.size(); ++i )
delete mMembers[i];
mMembers.erase( mMembers.begin(), mMembers.end() );
}
spContext::~spContext()
{
RemoveChildren();
for( size_t i = 0; i != mComments.size(); ++i )
delete mComments[i];
}
bool spContext::IsSorted()
{
return mAlreadySorted;
}
void spContext::GetContextList( MMemberListT& lst, int contextMask )
{
for( size_t i = 0; i != mMembers.size(); ++i )
{
spContext& member = *mMembers[i];
if ( member.GetContextType() & contextMask )
lst.push_back( &member );
// collect required contexts recursively
member.GetContextList( lst, contextMask );
}
}
bool spContext::HasComments()
{
return ( mComments.size() != 0 );
}
void spContext::RemoveChild( spContext* pChild )
{
for( size_t i = 0; i != mMembers.size(); ++i )
if ( mMembers[i] == pChild )
{
mMembers.erase( &mMembers[i] );
delete pChild;
return;
}
// the given child should exist on the parent's list
wxASSERT( 0 );
}
spContext* spContext::GetEnclosingContext( int mask )
{
spContext* cur = this->GetParent();
while ( cur && !(cur->GetContextType() & mask) )
cur = cur->GetParent();
return cur;
}
bool spContext::PositionIsKnown()
{
return ( mSrcOffset != (-1) && mContextLength != (-1) );
}
bool spContext::IsVirtualContext()
{
return mIsVirtualContext;
}
bool spContext::VitualContextHasChildren()
{
return mVirtualContextHasChildren;
}
string spContext::GetVirtualContextBody()
{
wxASSERT( mIsVirtualContext );
return mVirtualContextBody;
}
string spContext::GetFooterOfVirtualContextBody()
{
wxASSERT( mIsVirtualContext );
return mVittualContextFooter;
}
void spContext::SetVirtualContextBody( const string& body,
bool hasChildren,
const string& footer )
{
mVirtualContextHasChildren = hasChildren;
mVirtualContextBody = body;
mVittualContextFooter = footer;
// atuomaticllay becomes virtual context
mIsVirtualContext = TRUE;
}
string spContext::GetBody( spContext* pCtx )
{
if ( ( pCtx == NULL || pCtx == this ) && mIsVirtualContext )
return mVirtualContextBody;
if ( GetParent() )
return GetParent()->GetBody( ( pCtx != NULL ) ? pCtx : this );
else
return ""; // source-fragment cannot be found
}
string spContext::GetHeader( spContext* pCtx )
{
if ( GetParent() )
return GetParent()->GetHeader( ( pCtx != NULL ) ? pCtx : this );
else
return ""; // source-fragment cannot be found
}
bool spContext::IsFirstOccurence()
{
return ( mpFirstOccurence != 0 );
}
spContext* spContext::GetFirstOccurence()
{
// this object should not itself be
// the first occurence of the context
wxASSERT( mpFirstOccurence != 0 );
return mpFirstOccurence;
}
void spContext::AddMember( spContext* pMember )
{
mMembers.push_back( pMember );
pMember->mpParent = this;
}
void spContext::AddComment( spComment* pComment )
{
mComments.push_back( pComment );
}
MMemberListT& spContext::GetMembers()
{
return mMembers;
}
spContext* spContext::FindContext( const string& identifier,
int contextType,
bool searchSubMembers
)
{
for( size_t i = 0; i != mMembers.size(); ++i )
{
spContext& member = *mMembers[i];
if ( member.GetName() == identifier &&
( contextType & member.GetContextType() )
)
return &member;
if ( searchSubMembers )
{
spContext* result =
member.FindContext( identifier, contextType, 1 );
if ( result ) return result;
}
}
return 0;
}
void spContext::RemoveThisContext()
{
if ( mpParent )
mpParent->RemoveChild( this );
else
// context should have a parent
wxASSERT(0);
}
spContext* spContext::GetOutterContext()
{
return mpParent;
}
bool spContext::HasOutterContext()
{
return ( mpParent != 0 );
}
bool spContext::IsInFile()
{
return ( GetOutterContext()->GetContextType() == SP_CTX_FILE );
}
bool spContext::IsInNameSpace()
{
return ( GetOutterContext()->GetContextType() == SP_CTX_NAMESPACE );
}
bool spContext::IsInClass()
{
return ( GetOutterContext()->GetContextType() == SP_CTX_CLASS );
}
bool spContext::IsInOperation()
{
return ( GetOutterContext()->GetContextType() == SP_CTX_OPERATION );
}
spClass& spContext::GetClass()
{
wxASSERT( GetOutterContext()->GetType() == SP_CTX_CLASS );
return *((spClass*)mpParent );
}
spFile& spContext::GetFile()
{
wxASSERT( GetOutterContext()->GetType() == SP_CTX_FILE );
return *((spFile*)mpParent );
}
spNameSpace& spContext::GetNameSpace()
{
wxASSERT( GetOutterContext()->GetType() == SP_CTX_NAMESPACE );
return *((spNameSpace*)mpParent );
}
spOperation& spContext::GetOperation()
{
wxASSERT( GetOutterContext()->GetType() == SP_CTX_OPERATION );
return *((spOperation*)mpParent );
}
/***** Implementation for class spClass *****/
void spClass::SortMembers()
{
// TBD::
}
/***** Implementation for class spOperation *****/
spOperation::spOperation()
: mHasDefinition( FALSE )
{}
string spOperation::GetFullName(MarkupTagsT tags)
{
string txt = tags[TAG_BOLD].start + mRetType;
txt += " ";
txt += mName;
txt += "( ";
txt += tags[TAG_BOLD].end;
for( size_t i = 0; i != mMembers.size(); ++i )
{
// DBG::
wxASSERT( mMembers[i]->GetContextType() == SP_CTX_PARAMETER );
spParameter& param = *((spParameter*)mMembers[i]);
if ( i != 0 )
txt += ", ";
txt += tags[TAG_BOLD].start;
txt += param.mType;
txt += tags[TAG_BOLD].end;
txt += tags[TAG_ITALIC].start;
txt += " ";
txt += param.mName;
if ( param.mInitVal != "" )
{
txt += " = ";
txt += tags[TAG_BOLD].start;
txt += param.mInitVal;
txt += tags[TAG_BOLD].end;
}
txt += tags[TAG_ITALIC].end;;
}
txt += tags[TAG_BOLD].start;
txt += " )";
txt += tags[TAG_BOLD].end;
// TBD:: constantness of method
return txt;
}
/***** Implemenentation for class spPreprocessorLine *****/
string spPreprocessorLine::CPP_GetIncludedFileNeme()
{
wxASSERT( GetStatementType() == SP_PREP_DEF_INCLUDE_FILE );
size_t i = 0;
while( i < mLine.length() && mLine[i] != '"' && mLine[i] != '<' )
++i;
++i;
size_t start = i;
while( i < mLine.length() && mLine[i] != '"' && mLine[i] != '>' )
++i;
if ( start < mLine.length() )
{
string fname;
fname.append( mLine, start, ( i - start ) );
return fname;
}
else
return ""; // syntax error probably
}
/***** Implemenentation for class SourceParserBase *****/
SourceParserBase::SourceParserBase()
: mpFileBuf( NULL ),
mFileBufSz( 0 ),
mpPlugin( NULL )
{}
SourceParserBase::~SourceParserBase()
{
if ( mpFileBuf ) free( mpFileBuf );
if ( mpPlugin ) delete mpPlugin;
}
spFile* SourceParserBase::ParseFile( const char* fname )
{
// FIXME:: the below should not be fixed!
const size_t MAX_BUF_SIZE = 1024*256;
if ( !mpFileBuf ) mpFileBuf = (char*)malloc( MAX_BUF_SIZE );
mFileBufSz = MAX_BUF_SIZE;
FILE* fp = fopen( fname, "rt" );
if ( (int)fp == -1 || !fp ) return NULL;
int sz = fread( mpFileBuf, 1, mFileBufSz, fp );
return Parse( mpFileBuf, mpFileBuf + sz );
}
void SourceParserBase::SetPlugin( SourceParserPlugin* pPlugin )
{
if ( mpPlugin ) delete mpPlugin;
mpPlugin = pPlugin;
}

View File

@ -0,0 +1,31 @@
////////////////////
//
// craeted by Alex
//
////////////////////
// For compilers that support precompilation, includes "wx.h".
#include "wx/wxprec.h"
#include <memory.h>
#ifndef WX_PRECOMP
#include "wx/defs.h"
#endif
char *
copystring (const char *s)
{
if (s == NULL) s = "";
size_t len = strlen (s) + 1;
char *news = new char[len];
memcpy (news, s, len); // Should be the fastest
return news;
}
const char *wxGetTranslation(const char *str)
{
return str;
}