Release 970112
Sat Jan 11 18:17:59 1997 Alexandre Julliard <julliard@lrc.epfl.ch> * [controls/menu.c] Updated to new Win32 types. * [controls/listbox.c] Fixed Winfile extended selection bug. * [files/directory.c] Changed DIR_SearchPath to return both long and short file names. * [files/dos_fs.c] Implemented VFAT ioctl to retrieve the original short filenames from a VFAT filesystem (Linux only for now). Replaced DOSFS_GetUnixFileName()/DOSFS_GetDosTrueName() by DOS_GetFullName(). Properly implemented GetShortPathName() and GetFullPathName(). Made all functions re-entrant. * [files/file.c] [misc/main.c] Replaced -allowreadonly option by -failreadonly. The default is now to report success when opening a read-only file for writing. * [objects/metafile.c] Fixed bug in DIB bitmaps pointer calculation. * [scheduler/process.c] Implemented environment strings and Get/SetStdHandle with process environment block. * [tools/build.c] Rewrote BuildContext32() to avoid instructions that may not be supported by all assemblers. Fri Jan 10 17:11:09 1997 David Faure <david.faure@ifhamy.insa-lyon.fr> * [windows/event.c] Created table keyc2vkey, which associate a vkey(+extended bit) to any keycode. Changed EVENT_event_to_vkey to use this table to return the correct vkey. Changed EVENT_ToAscii to get the keycode from this table too. Assigned OEM specific vkeys arbitrarily. Fri Jan 10 09:26:17 1997 John Harvey <john@division.co.uk> * [misc/winsock.c] [misc/winsoc_async.c] Fixed svr4 header files. Changed bzero() to memset(). * [tools/fnt2bdf.c] Removed bcopy() and used memcpy() instead. * [debugger/msc.c] Include string.h instead of strings.h * [debugger/stabs.c] Include string.h instead of strings.h. Define __ELF__ for svr4 systems. * [loader/signal.c] Use wait() instead of wait4() which doesnt exist on Unixware. * [memory/global.c] Use sysconf() instead of getpagesize() for svr4 systems. Thu Jan 9 21:07:20 1997 Robert Pouliot <krynos@clic.net> * [Make.rules.in] [Makefile.in] [make_os2.sh] [rc/Makefile.in] [tools/Makefile.in] [documentation/wine_os2.txt] Patches for OS/2 support. Note that it doesn't compile yet. Tue Jan 7 20:03:53 1997 Eric Youngdale <eric@sub2304.jic.com> * [debugger/*] Many more debugger improvements (see debugger/README for details). Tue Jan 7 15:12:21 1997 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de> * [windows/graphics.c] [objects/text.c] [graphics/x11drv/*] [graphics/metafiledrv/*] Moved some device dependent code into the resp. subdirs. * [include/gdi.h] [include/metafiledrv.h] [include/x11drv.h] Prototypes added, DC_FUNCTIONS: GetPixel added, some unnecessary functions removed. * [objects/region.c] CreatePolyPolygonRgn32 added. * [files/dos_fs.c] QueryDosDevice added. * [misc/lstr.c] FormatMessage: broken heap management fixed. * [scheduler/process.c] [scheduler/thread.c] Get/SetThreadPriority/PriorityClass added. Mon Jan 6 21:55:30 1997 Philippe De Muyter <phdm@info.ucl.ac.be> * [misc/keyboard.c] ToAscii : Use EVENT_ToAscii instead. * [windows/event.c] keypad_key : Do not convert XK_Mode_switch to VK_MENU; recognize keypad cursor keys. EVENT_event_to_vkey : New function, to transform a X keycode into a MSwin vkey + extended bit. EVENT_ToAscii : New function, to transform a vkey + extended bit (+ key state table) into ascii char(s), using XLookupString, and recognizing dead chars. EVENT_key : Transform AltGr into Ctrl+Alt sequence; call EVENT_event_to_vkey for keycode to vkey conversion; fixed previous, context and extended bits. * [windows/keyboard.c] Include stddebug.h, to get -debugmsg messages. GetKeyState : Handle VK_MBUTTON case. GetKeyboardState, SetKeyboardState : Debugging messages added. * [windows/message.c] TranslateMessage : Handle dead chars. Mon Jan 6 20:10:11 1997 Dominik Strasser <bm424953@muenchen.org> * [if1632/crtdll.spec] [misc/crtdll.c] C++ functions new/delete/set_new_handler implemented. Mon Jan 6 15:48:15 1997 Frans van Dorsselaer <dorssel@rulhmpc49.LeidenUniv.nl> * [controls/edit.c] [include/windows.h] Moved the edit control to 32 bits. Included new (win95) message definitions in windows.h Implemented EM_SCROLLCARET, EM_SETMARGINS, EM_GETMARGINS, EM_GETLIMITTEXT, EM_POSFROMCHAR, EM_CHARFROMPOS. Broke EM_SETWORDBREAKPROC (internal wordwrap still works). Fixed some bugs, introduced a couple of others. Text buffer is now initially in 32-bit heap. * [controls/EDIT.TODO] [controls/combo.c] [controls/widgets.c] [if1632/wprocs.spec] [library/miscstubs.c] [windows/defdlg.c] [misc/commdlg.c] Updated to work with 32-bit edit control. Sat Jan 4 22:07:27 1997 O.Flebbe <O.Flebbe@science-computing.uni-tuebingen.de> * [loader/pe_image.c] Use mmap rather then malloc. Better workaround for clean segments.
This commit is contained in:
parent
9ea19e54cb
commit
c6c09442c4
18
ANNOUNCE
18
ANNOUNCE
|
@ -1,13 +1,15 @@
|
||||||
This is release 970101 of Wine, the MS Windows emulator. This is still a
|
This is release 970112 of Wine, the MS Windows emulator. This is still a
|
||||||
developer's only release. There are many bugs and many unimplemented API
|
developer's only release. There are many bugs and many unimplemented API
|
||||||
features. Most applications still do not work correctly.
|
features. Most applications still do not work correctly.
|
||||||
|
|
||||||
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
|
Patches should be submitted to "julliard@lrc.epfl.ch". Please don't
|
||||||
forget to include a ChangeLog entry.
|
forget to include a ChangeLog entry.
|
||||||
|
|
||||||
WHAT'S NEW with Wine-970101: (see ChangeLog for details)
|
WHAT'S NEW with Wine-970112: (see ChangeLog for details)
|
||||||
- Win32 handle management and related stuff.
|
- Better support for non-US keyboards.
|
||||||
- Several files moved around, new directories created.
|
- Support for VFAT filesystem short names.
|
||||||
|
- Many improvements to the built-in debugger.
|
||||||
|
- More Win32 stuff.
|
||||||
- Lots of bug fixes.
|
- Lots of bug fixes.
|
||||||
|
|
||||||
See the README file in the distribution for installation instructions.
|
See the README file in the distribution for installation instructions.
|
||||||
|
@ -16,10 +18,10 @@ Because of lags created by using mirror, this message may reach you before
|
||||||
the release is available at the ftp sites. The sources will be available
|
the release is available at the ftp sites. The sources will be available
|
||||||
from the following locations:
|
from the following locations:
|
||||||
|
|
||||||
ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970101.tar.gz
|
ftp://sunsite.unc.edu/pub/Linux/ALPHA/wine/development/Wine-970112.tar.gz
|
||||||
ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970101.tar.gz
|
ftp://tsx-11.mit.edu/pub/linux/ALPHA/Wine/development/Wine-970112.tar.gz
|
||||||
ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970101.tar.gz
|
ftp://ftp.infomagic.com/pub/mirrors/linux/wine/development/Wine-970112.tar.gz
|
||||||
ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-970101.tar.gz
|
ftp://aris.com/pub/linux/ALPHA/Wine/development/Wine-970112.tar.gz
|
||||||
|
|
||||||
It should also be available from any site that mirrors tsx-11 or sunsite.
|
It should also be available from any site that mirrors tsx-11 or sunsite.
|
||||||
|
|
||||||
|
|
150
ChangeLog
150
ChangeLog
|
@ -1,3 +1,153 @@
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
Sat Jan 11 18:17:59 1997 Alexandre Julliard <julliard@lrc.epfl.ch>
|
||||||
|
|
||||||
|
* [controls/menu.c]
|
||||||
|
Updated to new Win32 types.
|
||||||
|
|
||||||
|
* [controls/listbox.c]
|
||||||
|
Fixed Winfile extended selection bug.
|
||||||
|
|
||||||
|
* [files/directory.c]
|
||||||
|
Changed DIR_SearchPath to return both long and short file names.
|
||||||
|
|
||||||
|
* [files/dos_fs.c]
|
||||||
|
Implemented VFAT ioctl to retrieve the original short filenames
|
||||||
|
from a VFAT filesystem (Linux only for now).
|
||||||
|
Replaced DOSFS_GetUnixFileName()/DOSFS_GetDosTrueName() by
|
||||||
|
DOS_GetFullName().
|
||||||
|
Properly implemented GetShortPathName() and GetFullPathName().
|
||||||
|
Made all functions re-entrant.
|
||||||
|
|
||||||
|
* [files/file.c] [misc/main.c]
|
||||||
|
Replaced -allowreadonly option by -failreadonly. The default is
|
||||||
|
now to report success when opening a read-only file for writing.
|
||||||
|
|
||||||
|
* [objects/metafile.c]
|
||||||
|
Fixed bug in DIB bitmaps pointer calculation.
|
||||||
|
|
||||||
|
* [scheduler/process.c]
|
||||||
|
Implemented environment strings and Get/SetStdHandle with process
|
||||||
|
environment block.
|
||||||
|
|
||||||
|
* [tools/build.c]
|
||||||
|
Rewrote BuildContext32() to avoid instructions that may not be
|
||||||
|
supported by all assemblers.
|
||||||
|
|
||||||
|
Fri Jan 10 17:11:09 1997 David Faure <david.faure@ifhamy.insa-lyon.fr>
|
||||||
|
|
||||||
|
* [windows/event.c]
|
||||||
|
Created table keyc2vkey, which associate a vkey(+extended bit) to
|
||||||
|
any keycode. Changed EVENT_event_to_vkey to use this table to
|
||||||
|
return the correct vkey. Changed EVENT_ToAscii to get the keycode
|
||||||
|
from this table too. Assigned OEM specific vkeys arbitrarily.
|
||||||
|
|
||||||
|
Fri Jan 10 09:26:17 1997 John Harvey <john@division.co.uk>
|
||||||
|
|
||||||
|
* [misc/winsock.c] [misc/winsoc_async.c]
|
||||||
|
Fixed svr4 header files.
|
||||||
|
Changed bzero() to memset().
|
||||||
|
|
||||||
|
* [tools/fnt2bdf.c]
|
||||||
|
Removed bcopy() and used memcpy() instead.
|
||||||
|
|
||||||
|
* [debugger/msc.c]
|
||||||
|
Include string.h instead of strings.h
|
||||||
|
|
||||||
|
* [debugger/stabs.c]
|
||||||
|
Include string.h instead of strings.h.
|
||||||
|
Define __ELF__ for svr4 systems.
|
||||||
|
|
||||||
|
* [loader/signal.c]
|
||||||
|
Use wait() instead of wait4() which doesnt exist on Unixware.
|
||||||
|
|
||||||
|
* [memory/global.c]
|
||||||
|
Use sysconf() instead of getpagesize() for svr4 systems.
|
||||||
|
|
||||||
|
Thu Jan 9 21:07:20 1997 Robert Pouliot <krynos@clic.net>
|
||||||
|
|
||||||
|
* [Make.rules.in] [Makefile.in] [make_os2.sh] [rc/Makefile.in]
|
||||||
|
[tools/Makefile.in] [documentation/wine_os2.txt]
|
||||||
|
Patches for OS/2 support. Note that it doesn't compile yet.
|
||||||
|
|
||||||
|
Tue Jan 7 20:03:53 1997 Eric Youngdale <eric@sub2304.jic.com>
|
||||||
|
|
||||||
|
* [debugger/*]
|
||||||
|
Many more debugger improvements (see debugger/README for details).
|
||||||
|
|
||||||
|
Tue Jan 7 15:12:21 1997 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
|
||||||
|
|
||||||
|
* [windows/graphics.c] [objects/text.c] [graphics/x11drv/*]
|
||||||
|
[graphics/metafiledrv/*]
|
||||||
|
Moved some device dependent code into the resp. subdirs.
|
||||||
|
|
||||||
|
* [include/gdi.h] [include/metafiledrv.h] [include/x11drv.h]
|
||||||
|
Prototypes added,
|
||||||
|
DC_FUNCTIONS: GetPixel added, some unnecessary functions removed.
|
||||||
|
|
||||||
|
* [objects/region.c]
|
||||||
|
CreatePolyPolygonRgn32 added.
|
||||||
|
|
||||||
|
* [files/dos_fs.c]
|
||||||
|
QueryDosDevice added.
|
||||||
|
|
||||||
|
* [misc/lstr.c]
|
||||||
|
FormatMessage: broken heap management fixed.
|
||||||
|
|
||||||
|
* [scheduler/process.c] [scheduler/thread.c]
|
||||||
|
Get/SetThreadPriority/PriorityClass added.
|
||||||
|
|
||||||
|
Mon Jan 6 21:55:30 1997 Philippe De Muyter <phdm@info.ucl.ac.be>
|
||||||
|
|
||||||
|
* [misc/keyboard.c]
|
||||||
|
ToAscii : Use EVENT_ToAscii instead.
|
||||||
|
|
||||||
|
* [windows/event.c]
|
||||||
|
keypad_key : Do not convert XK_Mode_switch to VK_MENU; recognize
|
||||||
|
keypad cursor keys.
|
||||||
|
EVENT_event_to_vkey : New function, to transform a X keycode
|
||||||
|
into a MSwin vkey + extended bit.
|
||||||
|
EVENT_ToAscii : New function, to transform a vkey + extended bit
|
||||||
|
(+ key state table) into ascii char(s), using XLookupString, and
|
||||||
|
recognizing dead chars.
|
||||||
|
EVENT_key : Transform AltGr into Ctrl+Alt sequence; call
|
||||||
|
EVENT_event_to_vkey for keycode to vkey conversion; fixed
|
||||||
|
previous, context and extended bits.
|
||||||
|
|
||||||
|
* [windows/keyboard.c]
|
||||||
|
Include stddebug.h, to get -debugmsg messages.
|
||||||
|
GetKeyState : Handle VK_MBUTTON case.
|
||||||
|
GetKeyboardState, SetKeyboardState : Debugging messages added.
|
||||||
|
|
||||||
|
* [windows/message.c]
|
||||||
|
TranslateMessage : Handle dead chars.
|
||||||
|
|
||||||
|
Mon Jan 6 20:10:11 1997 Dominik Strasser <bm424953@muenchen.org>
|
||||||
|
|
||||||
|
* [if1632/crtdll.spec] [misc/crtdll.c]
|
||||||
|
C++ functions new/delete/set_new_handler implemented.
|
||||||
|
|
||||||
|
Mon Jan 6 15:48:15 1997 Frans van Dorsselaer <dorssel@rulhmpc49.LeidenUniv.nl>
|
||||||
|
|
||||||
|
* [controls/edit.c] [include/windows.h]
|
||||||
|
Moved the edit control to 32 bits.
|
||||||
|
Included new (win95) message definitions in windows.h
|
||||||
|
Implemented EM_SCROLLCARET, EM_SETMARGINS, EM_GETMARGINS,
|
||||||
|
EM_GETLIMITTEXT, EM_POSFROMCHAR, EM_CHARFROMPOS.
|
||||||
|
Broke EM_SETWORDBREAKPROC (internal wordwrap still works).
|
||||||
|
Fixed some bugs, introduced a couple of others.
|
||||||
|
Text buffer is now initially in 32-bit heap.
|
||||||
|
|
||||||
|
* [controls/EDIT.TODO] [controls/combo.c] [controls/widgets.c]
|
||||||
|
[if1632/wprocs.spec] [library/miscstubs.c] [windows/defdlg.c]
|
||||||
|
[misc/commdlg.c]
|
||||||
|
Updated to work with 32-bit edit control.
|
||||||
|
|
||||||
|
Sat Jan 4 22:07:27 1997 O.Flebbe <O.Flebbe@science-computing.uni-tuebingen.de>
|
||||||
|
|
||||||
|
* [loader/pe_image.c]
|
||||||
|
Use mmap rather then malloc. Better workaround for clean
|
||||||
|
segments.
|
||||||
|
|
||||||
----------------------------------------------------------------------
|
----------------------------------------------------------------------
|
||||||
Wed Jan 1 15:36:17 1997 Alexandre Julliard <julliard@lrc.epfl.ch>
|
Wed Jan 1 15:36:17 1997 Alexandre Julliard <julliard@lrc.epfl.ch>
|
||||||
|
|
||||||
|
|
|
@ -31,9 +31,9 @@ DIVINCL = -I$(TOPSRCDIR)/include -I$(TOPOBJDIR)/include -I$(SRCDIR) -I.
|
||||||
ALLCFLAGS = $(CFLAGS) $(DEFS) $(OPTIONS) $(DIVINCL) $(X_CFLAGS)
|
ALLCFLAGS = $(CFLAGS) $(DEFS) $(OPTIONS) $(DIVINCL) $(X_CFLAGS)
|
||||||
LDCOMBINE = ld -r
|
LDCOMBINE = ld -r
|
||||||
RM = rm -f
|
RM = rm -f
|
||||||
BUILD = $(TOPOBJDIR)/tools/build
|
BUILD = $(TOPOBJDIR)/tools/build@PROGEXT@
|
||||||
MAKEDEP = $(TOPOBJDIR)/tools/makedep
|
MAKEDEP = $(TOPOBJDIR)/tools/makedep@PROGEXT@
|
||||||
WINERC = $(TOPOBJDIR)/rc/winerc
|
WINERC = $(TOPOBJDIR)/rc/winerc@PROGEXT@
|
||||||
WINESTUB = $(TOPOBJDIR)/library/winestub.o
|
WINESTUB = $(TOPOBJDIR)/library/winestub.o
|
||||||
SUBMAKE = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(CFLAGS)' 'OPTIONS=$(OPTIONS)'
|
SUBMAKE = $(MAKE) 'CC=$(CC)' 'CFLAGS=$(CFLAGS)' 'OPTIONS=$(OPTIONS)'
|
||||||
@SET_MAKE@
|
@SET_MAKE@
|
||||||
|
@ -72,12 +72,17 @@ OBJS = $(GEN_C_SRCS:.c=.o) $(C_SRCS:.c=.o) \
|
||||||
# Rule to rebuild resource compiler
|
# Rule to rebuild resource compiler
|
||||||
|
|
||||||
$(WINERC) check_winerc:
|
$(WINERC) check_winerc:
|
||||||
cd $(TOPOBJDIR)/rc; $(SUBMAKE) winerc
|
cd $(TOPOBJDIR)/rc; $(SUBMAKE) winerc@PROGEXT@
|
||||||
|
|
||||||
# Rule to rebuild the makedep program
|
# Rule to rebuild the 'makedep' program
|
||||||
|
|
||||||
$(MAKEDEP) check_makedep:
|
$(MAKEDEP) check_makedep:
|
||||||
cd $(TOPOBJDIR)/tools; $(SUBMAKE) makedep
|
cd $(TOPOBJDIR)/tools; $(SUBMAKE) makedep@PROGEXT@
|
||||||
|
|
||||||
|
# Rule to rebuild the 'build' program
|
||||||
|
|
||||||
|
$(BUILD) checkbuild:
|
||||||
|
cd $(TOPOBJDIR)/tools; $(SUBMAKE) build@PROGEXT@
|
||||||
|
|
||||||
# Rule for main module
|
# Rule for main module
|
||||||
|
|
||||||
|
|
|
@ -550,6 +550,7 @@ ac_configure=$ac_aux_dir/configure # This should be Cygnus configure.
|
||||||
|
|
||||||
# We want these before the checks, so the checks can modify their values.
|
# We want these before the checks, so the checks can modify their values.
|
||||||
test -z "$LDLIBS" && LDLIBS=-lm
|
test -z "$LDLIBS" && LDLIBS=-lm
|
||||||
|
test -z "$PROGEXT" && PROGEXT=""
|
||||||
|
|
||||||
|
|
||||||
# Check whether --with-library or --without-library was given.
|
# Check whether --with-library or --without-library was given.
|
||||||
|
@ -580,7 +581,7 @@ fi
|
||||||
|
|
||||||
|
|
||||||
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
|
echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6
|
||||||
echo "configure:584: checking whether ${MAKE-make} sets \${MAKE}" >&5
|
echo "configure:585: checking whether ${MAKE-make} sets \${MAKE}" >&5
|
||||||
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
|
set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'`
|
||||||
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
|
@ -609,7 +610,7 @@ fi
|
||||||
# Extract the first word of "gcc", so it can be a program name with args.
|
# Extract the first word of "gcc", so it can be a program name with args.
|
||||||
set dummy gcc; ac_word=$2
|
set dummy gcc; ac_word=$2
|
||||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||||
echo "configure:613: checking for $ac_word" >&5
|
echo "configure:614: checking for $ac_word" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
|
@ -638,7 +639,7 @@ if test -z "$CC"; then
|
||||||
# Extract the first word of "cc", so it can be a program name with args.
|
# Extract the first word of "cc", so it can be a program name with args.
|
||||||
set dummy cc; ac_word=$2
|
set dummy cc; ac_word=$2
|
||||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||||
echo "configure:642: checking for $ac_word" >&5
|
echo "configure:643: checking for $ac_word" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
|
@ -686,7 +687,7 @@ fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
|
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
|
||||||
echo "configure:690: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
|
echo "configure:691: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
|
||||||
|
|
||||||
ac_ext=c
|
ac_ext=c
|
||||||
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
|
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
|
||||||
|
@ -696,11 +697,11 @@ ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS
|
||||||
cross_compiling=$ac_cv_prog_cc_cross
|
cross_compiling=$ac_cv_prog_cc_cross
|
||||||
|
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 700 "configure"
|
#line 701 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
main(){return(0);}
|
main(){return(0);}
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:704: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:705: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
ac_cv_prog_cc_works=yes
|
ac_cv_prog_cc_works=yes
|
||||||
# If we can't run a trivial program, we are probably using a cross compiler.
|
# If we can't run a trivial program, we are probably using a cross compiler.
|
||||||
if (./conftest; exit) 2>/dev/null; then
|
if (./conftest; exit) 2>/dev/null; then
|
||||||
|
@ -720,12 +721,12 @@ if test $ac_cv_prog_cc_works = no; then
|
||||||
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
|
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
|
||||||
fi
|
fi
|
||||||
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
|
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
|
||||||
echo "configure:724: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
|
echo "configure:725: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
|
||||||
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
|
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
|
||||||
cross_compiling=$ac_cv_prog_cc_cross
|
cross_compiling=$ac_cv_prog_cc_cross
|
||||||
|
|
||||||
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
|
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
|
||||||
echo "configure:729: checking whether we are using GNU C" >&5
|
echo "configure:730: checking whether we are using GNU C" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
|
@ -734,7 +735,7 @@ else
|
||||||
yes;
|
yes;
|
||||||
#endif
|
#endif
|
||||||
EOF
|
EOF
|
||||||
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:738: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
|
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:739: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
|
||||||
ac_cv_prog_gcc=yes
|
ac_cv_prog_gcc=yes
|
||||||
else
|
else
|
||||||
ac_cv_prog_gcc=no
|
ac_cv_prog_gcc=no
|
||||||
|
@ -749,7 +750,7 @@ if test $ac_cv_prog_gcc = yes; then
|
||||||
ac_save_CFLAGS="$CFLAGS"
|
ac_save_CFLAGS="$CFLAGS"
|
||||||
CFLAGS=
|
CFLAGS=
|
||||||
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
|
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
|
||||||
echo "configure:753: checking whether ${CC-cc} accepts -g" >&5
|
echo "configure:754: checking whether ${CC-cc} accepts -g" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
|
@ -777,7 +778,7 @@ else
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
|
echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6
|
||||||
echo "configure:781: checking how to run the C preprocessor" >&5
|
echo "configure:782: checking how to run the C preprocessor" >&5
|
||||||
# On Suns, sometimes $CPP names a directory.
|
# On Suns, sometimes $CPP names a directory.
|
||||||
if test -n "$CPP" && test -d "$CPP"; then
|
if test -n "$CPP" && test -d "$CPP"; then
|
||||||
CPP=
|
CPP=
|
||||||
|
@ -792,13 +793,13 @@ else
|
||||||
# On the NeXT, cc -E runs the code through the compiler's parser,
|
# On the NeXT, cc -E runs the code through the compiler's parser,
|
||||||
# not just through cpp.
|
# not just through cpp.
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 796 "configure"
|
#line 797 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
Syntax Error
|
Syntax Error
|
||||||
EOF
|
EOF
|
||||||
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
||||||
{ (eval echo configure:802: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
{ (eval echo configure:803: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||||
ac_err=`grep -v '^ *+' conftest.out`
|
ac_err=`grep -v '^ *+' conftest.out`
|
||||||
if test -z "$ac_err"; then
|
if test -z "$ac_err"; then
|
||||||
:
|
:
|
||||||
|
@ -809,13 +810,13 @@ else
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
CPP="${CC-cc} -E -traditional-cpp"
|
CPP="${CC-cc} -E -traditional-cpp"
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 813 "configure"
|
#line 814 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
Syntax Error
|
Syntax Error
|
||||||
EOF
|
EOF
|
||||||
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
||||||
{ (eval echo configure:819: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
{ (eval echo configure:820: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||||
ac_err=`grep -v '^ *+' conftest.out`
|
ac_err=`grep -v '^ *+' conftest.out`
|
||||||
if test -z "$ac_err"; then
|
if test -z "$ac_err"; then
|
||||||
:
|
:
|
||||||
|
@ -842,7 +843,7 @@ echo "$ac_t""$CPP" 1>&6
|
||||||
# Uses ac_ vars as temps to allow command line to override cache and checks.
|
# Uses ac_ vars as temps to allow command line to override cache and checks.
|
||||||
# --without-x overrides everything else, but does not touch the cache.
|
# --without-x overrides everything else, but does not touch the cache.
|
||||||
echo $ac_n "checking for X""... $ac_c" 1>&6
|
echo $ac_n "checking for X""... $ac_c" 1>&6
|
||||||
echo "configure:846: checking for X" >&5
|
echo "configure:847: checking for X" >&5
|
||||||
|
|
||||||
# Check whether --with-x or --without-x was given.
|
# Check whether --with-x or --without-x was given.
|
||||||
if test "${with_x+set}" = set; then
|
if test "${with_x+set}" = set; then
|
||||||
|
@ -904,12 +905,12 @@ if test "$ac_x_includes" = NO; then
|
||||||
|
|
||||||
# First, try using that file with no special directory specified.
|
# First, try using that file with no special directory specified.
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 908 "configure"
|
#line 909 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
#include <$x_direct_test_include>
|
#include <$x_direct_test_include>
|
||||||
EOF
|
EOF
|
||||||
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
||||||
{ (eval echo configure:913: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
{ (eval echo configure:914: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||||
ac_err=`grep -v '^ *+' conftest.out`
|
ac_err=`grep -v '^ *+' conftest.out`
|
||||||
if test -z "$ac_err"; then
|
if test -z "$ac_err"; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
|
@ -978,14 +979,14 @@ if test "$ac_x_libraries" = NO; then
|
||||||
ac_save_LIBS="$LIBS"
|
ac_save_LIBS="$LIBS"
|
||||||
LIBS="-l$x_direct_test_library $LIBS"
|
LIBS="-l$x_direct_test_library $LIBS"
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 982 "configure"
|
#line 983 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
${x_direct_test_function}()
|
${x_direct_test_function}()
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:989: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:990: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
LIBS="$ac_save_LIBS"
|
LIBS="$ac_save_LIBS"
|
||||||
# We can link X programs with no special library path.
|
# We can link X programs with no special library path.
|
||||||
|
@ -1091,17 +1092,17 @@ else
|
||||||
case "`(uname -sr) 2>/dev/null`" in
|
case "`(uname -sr) 2>/dev/null`" in
|
||||||
"SunOS 5"*)
|
"SunOS 5"*)
|
||||||
echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
|
echo $ac_n "checking whether -R must be followed by a space""... $ac_c" 1>&6
|
||||||
echo "configure:1095: checking whether -R must be followed by a space" >&5
|
echo "configure:1096: checking whether -R must be followed by a space" >&5
|
||||||
ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
|
ac_xsave_LIBS="$LIBS"; LIBS="$LIBS -R$x_libraries"
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1098 "configure"
|
#line 1099 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1105: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:1106: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
ac_R_nospace=yes
|
ac_R_nospace=yes
|
||||||
else
|
else
|
||||||
|
@ -1117,14 +1118,14 @@ rm -f conftest*
|
||||||
else
|
else
|
||||||
LIBS="$ac_xsave_LIBS -R $x_libraries"
|
LIBS="$ac_xsave_LIBS -R $x_libraries"
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1121 "configure"
|
#line 1122 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1128: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:1129: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
ac_R_space=yes
|
ac_R_space=yes
|
||||||
else
|
else
|
||||||
|
@ -1156,7 +1157,7 @@ rm -f conftest*
|
||||||
# libraries were built with DECnet support. And karl@cs.umb.edu says
|
# libraries were built with DECnet support. And karl@cs.umb.edu says
|
||||||
# the Alpha needs dnet_stub (dnet does not exist).
|
# the Alpha needs dnet_stub (dnet does not exist).
|
||||||
echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
|
echo $ac_n "checking for dnet_ntoa in -ldnet""... $ac_c" 1>&6
|
||||||
echo "configure:1160: checking for dnet_ntoa in -ldnet" >&5
|
echo "configure:1161: checking for dnet_ntoa in -ldnet" >&5
|
||||||
ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
|
ac_lib_var=`echo dnet'_'dnet_ntoa | sed 'y%./+-%__p_%'`
|
||||||
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
|
@ -1164,7 +1165,7 @@ else
|
||||||
ac_save_LIBS="$LIBS"
|
ac_save_LIBS="$LIBS"
|
||||||
LIBS="-ldnet $LIBS"
|
LIBS="-ldnet $LIBS"
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1168 "configure"
|
#line 1169 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
/* Override any gcc2 internal prototype to avoid an error. */
|
/* Override any gcc2 internal prototype to avoid an error. */
|
||||||
/* We use char because int might match the return type of a gcc2
|
/* We use char because int might match the return type of a gcc2
|
||||||
|
@ -1175,7 +1176,7 @@ int main() {
|
||||||
dnet_ntoa()
|
dnet_ntoa()
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1179: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:1180: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
eval "ac_cv_lib_$ac_lib_var=yes"
|
eval "ac_cv_lib_$ac_lib_var=yes"
|
||||||
else
|
else
|
||||||
|
@ -1197,7 +1198,7 @@ fi
|
||||||
|
|
||||||
if test $ac_cv_lib_dnet_dnet_ntoa = no; then
|
if test $ac_cv_lib_dnet_dnet_ntoa = no; then
|
||||||
echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
|
echo $ac_n "checking for dnet_ntoa in -ldnet_stub""... $ac_c" 1>&6
|
||||||
echo "configure:1201: checking for dnet_ntoa in -ldnet_stub" >&5
|
echo "configure:1202: checking for dnet_ntoa in -ldnet_stub" >&5
|
||||||
ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
|
ac_lib_var=`echo dnet_stub'_'dnet_ntoa | sed 'y%./+-%__p_%'`
|
||||||
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
|
@ -1205,7 +1206,7 @@ else
|
||||||
ac_save_LIBS="$LIBS"
|
ac_save_LIBS="$LIBS"
|
||||||
LIBS="-ldnet_stub $LIBS"
|
LIBS="-ldnet_stub $LIBS"
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1209 "configure"
|
#line 1210 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
/* Override any gcc2 internal prototype to avoid an error. */
|
/* Override any gcc2 internal prototype to avoid an error. */
|
||||||
/* We use char because int might match the return type of a gcc2
|
/* We use char because int might match the return type of a gcc2
|
||||||
|
@ -1216,7 +1217,7 @@ int main() {
|
||||||
dnet_ntoa()
|
dnet_ntoa()
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1220: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:1221: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
eval "ac_cv_lib_$ac_lib_var=yes"
|
eval "ac_cv_lib_$ac_lib_var=yes"
|
||||||
else
|
else
|
||||||
|
@ -1245,12 +1246,12 @@ fi
|
||||||
# The nsl library prevents programs from opening the X display
|
# The nsl library prevents programs from opening the X display
|
||||||
# on Irix 5.2, according to dickey@clark.net.
|
# on Irix 5.2, according to dickey@clark.net.
|
||||||
echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
|
echo $ac_n "checking for gethostbyname""... $ac_c" 1>&6
|
||||||
echo "configure:1249: checking for gethostbyname" >&5
|
echo "configure:1250: checking for gethostbyname" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_func_gethostbyname'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1254 "configure"
|
#line 1255 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
/* System header to define __stub macros and hopefully few prototypes,
|
/* System header to define __stub macros and hopefully few prototypes,
|
||||||
which can conflict with char gethostbyname(); below. */
|
which can conflict with char gethostbyname(); below. */
|
||||||
|
@ -1273,7 +1274,7 @@ gethostbyname();
|
||||||
|
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1277: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:1278: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
eval "ac_cv_func_gethostbyname=yes"
|
eval "ac_cv_func_gethostbyname=yes"
|
||||||
else
|
else
|
||||||
|
@ -1294,7 +1295,7 @@ fi
|
||||||
|
|
||||||
if test $ac_cv_func_gethostbyname = no; then
|
if test $ac_cv_func_gethostbyname = no; then
|
||||||
echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
|
echo $ac_n "checking for gethostbyname in -lnsl""... $ac_c" 1>&6
|
||||||
echo "configure:1298: checking for gethostbyname in -lnsl" >&5
|
echo "configure:1299: checking for gethostbyname in -lnsl" >&5
|
||||||
ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
|
ac_lib_var=`echo nsl'_'gethostbyname | sed 'y%./+-%__p_%'`
|
||||||
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
|
@ -1302,7 +1303,7 @@ else
|
||||||
ac_save_LIBS="$LIBS"
|
ac_save_LIBS="$LIBS"
|
||||||
LIBS="-lnsl $LIBS"
|
LIBS="-lnsl $LIBS"
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1306 "configure"
|
#line 1307 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
/* Override any gcc2 internal prototype to avoid an error. */
|
/* Override any gcc2 internal prototype to avoid an error. */
|
||||||
/* We use char because int might match the return type of a gcc2
|
/* We use char because int might match the return type of a gcc2
|
||||||
|
@ -1313,7 +1314,7 @@ int main() {
|
||||||
gethostbyname()
|
gethostbyname()
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1317: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:1318: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
eval "ac_cv_lib_$ac_lib_var=yes"
|
eval "ac_cv_lib_$ac_lib_var=yes"
|
||||||
else
|
else
|
||||||
|
@ -1343,12 +1344,12 @@ fi
|
||||||
# -lsocket must be given before -lnsl if both are needed.
|
# -lsocket must be given before -lnsl if both are needed.
|
||||||
# We assume that if connect needs -lnsl, so does gethostbyname.
|
# We assume that if connect needs -lnsl, so does gethostbyname.
|
||||||
echo $ac_n "checking for connect""... $ac_c" 1>&6
|
echo $ac_n "checking for connect""... $ac_c" 1>&6
|
||||||
echo "configure:1347: checking for connect" >&5
|
echo "configure:1348: checking for connect" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_func_connect'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1352 "configure"
|
#line 1353 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
/* System header to define __stub macros and hopefully few prototypes,
|
/* System header to define __stub macros and hopefully few prototypes,
|
||||||
which can conflict with char connect(); below. */
|
which can conflict with char connect(); below. */
|
||||||
|
@ -1371,7 +1372,7 @@ connect();
|
||||||
|
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1375: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:1376: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
eval "ac_cv_func_connect=yes"
|
eval "ac_cv_func_connect=yes"
|
||||||
else
|
else
|
||||||
|
@ -1392,7 +1393,7 @@ fi
|
||||||
|
|
||||||
if test $ac_cv_func_connect = no; then
|
if test $ac_cv_func_connect = no; then
|
||||||
echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
|
echo $ac_n "checking for connect in -lsocket""... $ac_c" 1>&6
|
||||||
echo "configure:1396: checking for connect in -lsocket" >&5
|
echo "configure:1397: checking for connect in -lsocket" >&5
|
||||||
ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
|
ac_lib_var=`echo socket'_'connect | sed 'y%./+-%__p_%'`
|
||||||
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
|
@ -1400,7 +1401,7 @@ else
|
||||||
ac_save_LIBS="$LIBS"
|
ac_save_LIBS="$LIBS"
|
||||||
LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
|
LIBS="-lsocket $X_EXTRA_LIBS $LIBS"
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1404 "configure"
|
#line 1405 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
/* Override any gcc2 internal prototype to avoid an error. */
|
/* Override any gcc2 internal prototype to avoid an error. */
|
||||||
/* We use char because int might match the return type of a gcc2
|
/* We use char because int might match the return type of a gcc2
|
||||||
|
@ -1411,7 +1412,7 @@ int main() {
|
||||||
connect()
|
connect()
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1415: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:1416: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
eval "ac_cv_lib_$ac_lib_var=yes"
|
eval "ac_cv_lib_$ac_lib_var=yes"
|
||||||
else
|
else
|
||||||
|
@ -1435,12 +1436,12 @@ fi
|
||||||
|
|
||||||
# gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
|
# gomez@mi.uni-erlangen.de says -lposix is necessary on A/UX.
|
||||||
echo $ac_n "checking for remove""... $ac_c" 1>&6
|
echo $ac_n "checking for remove""... $ac_c" 1>&6
|
||||||
echo "configure:1439: checking for remove" >&5
|
echo "configure:1440: checking for remove" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_func_remove'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1444 "configure"
|
#line 1445 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
/* System header to define __stub macros and hopefully few prototypes,
|
/* System header to define __stub macros and hopefully few prototypes,
|
||||||
which can conflict with char remove(); below. */
|
which can conflict with char remove(); below. */
|
||||||
|
@ -1463,7 +1464,7 @@ remove();
|
||||||
|
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1467: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:1468: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
eval "ac_cv_func_remove=yes"
|
eval "ac_cv_func_remove=yes"
|
||||||
else
|
else
|
||||||
|
@ -1484,7 +1485,7 @@ fi
|
||||||
|
|
||||||
if test $ac_cv_func_remove = no; then
|
if test $ac_cv_func_remove = no; then
|
||||||
echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
|
echo $ac_n "checking for remove in -lposix""... $ac_c" 1>&6
|
||||||
echo "configure:1488: checking for remove in -lposix" >&5
|
echo "configure:1489: checking for remove in -lposix" >&5
|
||||||
ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
|
ac_lib_var=`echo posix'_'remove | sed 'y%./+-%__p_%'`
|
||||||
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
|
@ -1492,7 +1493,7 @@ else
|
||||||
ac_save_LIBS="$LIBS"
|
ac_save_LIBS="$LIBS"
|
||||||
LIBS="-lposix $LIBS"
|
LIBS="-lposix $LIBS"
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1496 "configure"
|
#line 1497 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
/* Override any gcc2 internal prototype to avoid an error. */
|
/* Override any gcc2 internal prototype to avoid an error. */
|
||||||
/* We use char because int might match the return type of a gcc2
|
/* We use char because int might match the return type of a gcc2
|
||||||
|
@ -1503,7 +1504,7 @@ int main() {
|
||||||
remove()
|
remove()
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1507: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:1508: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
eval "ac_cv_lib_$ac_lib_var=yes"
|
eval "ac_cv_lib_$ac_lib_var=yes"
|
||||||
else
|
else
|
||||||
|
@ -1527,12 +1528,12 @@ fi
|
||||||
|
|
||||||
# BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
|
# BSDI BSD/OS 2.1 needs -lipc for XOpenDisplay.
|
||||||
echo $ac_n "checking for shmat""... $ac_c" 1>&6
|
echo $ac_n "checking for shmat""... $ac_c" 1>&6
|
||||||
echo "configure:1531: checking for shmat" >&5
|
echo "configure:1532: checking for shmat" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_func_shmat'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1536 "configure"
|
#line 1537 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
/* System header to define __stub macros and hopefully few prototypes,
|
/* System header to define __stub macros and hopefully few prototypes,
|
||||||
which can conflict with char shmat(); below. */
|
which can conflict with char shmat(); below. */
|
||||||
|
@ -1555,7 +1556,7 @@ shmat();
|
||||||
|
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1559: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:1560: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
eval "ac_cv_func_shmat=yes"
|
eval "ac_cv_func_shmat=yes"
|
||||||
else
|
else
|
||||||
|
@ -1576,7 +1577,7 @@ fi
|
||||||
|
|
||||||
if test $ac_cv_func_shmat = no; then
|
if test $ac_cv_func_shmat = no; then
|
||||||
echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
|
echo $ac_n "checking for shmat in -lipc""... $ac_c" 1>&6
|
||||||
echo "configure:1580: checking for shmat in -lipc" >&5
|
echo "configure:1581: checking for shmat in -lipc" >&5
|
||||||
ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
|
ac_lib_var=`echo ipc'_'shmat | sed 'y%./+-%__p_%'`
|
||||||
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
|
@ -1584,7 +1585,7 @@ else
|
||||||
ac_save_LIBS="$LIBS"
|
ac_save_LIBS="$LIBS"
|
||||||
LIBS="-lipc $LIBS"
|
LIBS="-lipc $LIBS"
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1588 "configure"
|
#line 1589 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
/* Override any gcc2 internal prototype to avoid an error. */
|
/* Override any gcc2 internal prototype to avoid an error. */
|
||||||
/* We use char because int might match the return type of a gcc2
|
/* We use char because int might match the return type of a gcc2
|
||||||
|
@ -1595,7 +1596,7 @@ int main() {
|
||||||
shmat()
|
shmat()
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1599: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:1600: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
eval "ac_cv_lib_$ac_lib_var=yes"
|
eval "ac_cv_lib_$ac_lib_var=yes"
|
||||||
else
|
else
|
||||||
|
@ -1628,7 +1629,7 @@ fi
|
||||||
# libraries we check for below, so use a different variable.
|
# libraries we check for below, so use a different variable.
|
||||||
# --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
|
# --interran@uluru.Stanford.EDU, kb@cs.umb.edu.
|
||||||
echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
|
echo $ac_n "checking for IceConnectionNumber in -lICE""... $ac_c" 1>&6
|
||||||
echo "configure:1632: checking for IceConnectionNumber in -lICE" >&5
|
echo "configure:1633: checking for IceConnectionNumber in -lICE" >&5
|
||||||
ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
|
ac_lib_var=`echo ICE'_'IceConnectionNumber | sed 'y%./+-%__p_%'`
|
||||||
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
|
@ -1636,7 +1637,7 @@ else
|
||||||
ac_save_LIBS="$LIBS"
|
ac_save_LIBS="$LIBS"
|
||||||
LIBS="-lICE $LIBS"
|
LIBS="-lICE $LIBS"
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1640 "configure"
|
#line 1641 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
/* Override any gcc2 internal prototype to avoid an error. */
|
/* Override any gcc2 internal prototype to avoid an error. */
|
||||||
/* We use char because int might match the return type of a gcc2
|
/* We use char because int might match the return type of a gcc2
|
||||||
|
@ -1647,7 +1648,7 @@ int main() {
|
||||||
IceConnectionNumber()
|
IceConnectionNumber()
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1651: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:1652: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
eval "ac_cv_lib_$ac_lib_var=yes"
|
eval "ac_cv_lib_$ac_lib_var=yes"
|
||||||
else
|
else
|
||||||
|
@ -1676,7 +1677,7 @@ do
|
||||||
# Extract the first word of "$ac_prog", so it can be a program name with args.
|
# Extract the first word of "$ac_prog", so it can be a program name with args.
|
||||||
set dummy $ac_prog; ac_word=$2
|
set dummy $ac_prog; ac_word=$2
|
||||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||||
echo "configure:1680: checking for $ac_word" >&5
|
echo "configure:1681: checking for $ac_word" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
|
@ -1708,7 +1709,7 @@ test -n "$YACC" || YACC="yacc"
|
||||||
# Extract the first word of "flex", so it can be a program name with args.
|
# Extract the first word of "flex", so it can be a program name with args.
|
||||||
set dummy flex; ac_word=$2
|
set dummy flex; ac_word=$2
|
||||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||||
echo "configure:1712: checking for $ac_word" >&5
|
echo "configure:1713: checking for $ac_word" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
|
@ -1741,7 +1742,7 @@ then
|
||||||
*) ac_lib=l ;;
|
*) ac_lib=l ;;
|
||||||
esac
|
esac
|
||||||
echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6
|
echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6
|
||||||
echo "configure:1745: checking for yywrap in -l$ac_lib" >&5
|
echo "configure:1746: checking for yywrap in -l$ac_lib" >&5
|
||||||
ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'`
|
ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'`
|
||||||
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
|
@ -1749,7 +1750,7 @@ else
|
||||||
ac_save_LIBS="$LIBS"
|
ac_save_LIBS="$LIBS"
|
||||||
LIBS="-l$ac_lib $LIBS"
|
LIBS="-l$ac_lib $LIBS"
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1753 "configure"
|
#line 1754 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
/* Override any gcc2 internal prototype to avoid an error. */
|
/* Override any gcc2 internal prototype to avoid an error. */
|
||||||
/* We use char because int might match the return type of a gcc2
|
/* We use char because int might match the return type of a gcc2
|
||||||
|
@ -1760,7 +1761,7 @@ int main() {
|
||||||
yywrap()
|
yywrap()
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1764: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:1765: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
eval "ac_cv_lib_$ac_lib_var=yes"
|
eval "ac_cv_lib_$ac_lib_var=yes"
|
||||||
else
|
else
|
||||||
|
@ -1785,7 +1786,7 @@ fi
|
||||||
# Extract the first word of "ranlib", so it can be a program name with args.
|
# Extract the first word of "ranlib", so it can be a program name with args.
|
||||||
set dummy ranlib; ac_word=$2
|
set dummy ranlib; ac_word=$2
|
||||||
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
|
||||||
echo "configure:1789: checking for $ac_word" >&5
|
echo "configure:1790: checking for $ac_word" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
|
@ -1822,7 +1823,7 @@ fi
|
||||||
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
|
# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff"
|
||||||
# ./install, which can be erroneously created by make from ./install.sh.
|
# ./install, which can be erroneously created by make from ./install.sh.
|
||||||
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
|
echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6
|
||||||
echo "configure:1826: checking for a BSD compatible install" >&5
|
echo "configure:1827: checking for a BSD compatible install" >&5
|
||||||
if test -z "$INSTALL"; then
|
if test -z "$INSTALL"; then
|
||||||
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
|
@ -1872,7 +1873,7 @@ test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}'
|
||||||
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
|
test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644'
|
||||||
|
|
||||||
echo $ac_n "checking for i386_set_ldt in -li386""... $ac_c" 1>&6
|
echo $ac_n "checking for i386_set_ldt in -li386""... $ac_c" 1>&6
|
||||||
echo "configure:1876: checking for i386_set_ldt in -li386" >&5
|
echo "configure:1877: checking for i386_set_ldt in -li386" >&5
|
||||||
ac_lib_var=`echo i386'_'i386_set_ldt | sed 'y%./+-%__p_%'`
|
ac_lib_var=`echo i386'_'i386_set_ldt | sed 'y%./+-%__p_%'`
|
||||||
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
|
@ -1880,7 +1881,7 @@ else
|
||||||
ac_save_LIBS="$LIBS"
|
ac_save_LIBS="$LIBS"
|
||||||
LIBS="-li386 $LIBS"
|
LIBS="-li386 $LIBS"
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1884 "configure"
|
#line 1885 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
/* Override any gcc2 internal prototype to avoid an error. */
|
/* Override any gcc2 internal prototype to avoid an error. */
|
||||||
/* We use char because int might match the return type of a gcc2
|
/* We use char because int might match the return type of a gcc2
|
||||||
|
@ -1891,7 +1892,7 @@ int main() {
|
||||||
i386_set_ldt()
|
i386_set_ldt()
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1895: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:1896: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
eval "ac_cv_lib_$ac_lib_var=yes"
|
eval "ac_cv_lib_$ac_lib_var=yes"
|
||||||
else
|
else
|
||||||
|
@ -1917,7 +1918,7 @@ if test "x${GCC}" = "xyes"
|
||||||
then
|
then
|
||||||
CFLAGS="$CFLAGS -Wall"
|
CFLAGS="$CFLAGS -Wall"
|
||||||
echo $ac_n "checking "for gcc strength-reduce bug"""... $ac_c" 1>&6
|
echo $ac_n "checking "for gcc strength-reduce bug"""... $ac_c" 1>&6
|
||||||
echo "configure:1921: checking "for gcc strength-reduce bug"" >&5
|
echo "configure:1922: checking "for gcc strength-reduce bug"" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_c_gcc_strength_bug'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_c_gcc_strength_bug'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
|
@ -1925,7 +1926,7 @@ else
|
||||||
ac_cv_c_gcc_strength_bug="yes"
|
ac_cv_c_gcc_strength_bug="yes"
|
||||||
else
|
else
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1929 "configure"
|
#line 1930 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
|
|
||||||
int main(void) {
|
int main(void) {
|
||||||
|
@ -1936,7 +1937,7 @@ int main(void) {
|
||||||
exit( Array[1] != -2 );
|
exit( Array[1] != -2 );
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1940: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
|
if { (eval echo configure:1941: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
|
||||||
then
|
then
|
||||||
ac_cv_c_gcc_strength_bug="no"
|
ac_cv_c_gcc_strength_bug="no"
|
||||||
else
|
else
|
||||||
|
@ -1959,7 +1960,7 @@ fi
|
||||||
|
|
||||||
|
|
||||||
echo $ac_n "checking "whether external symbols need an underscore prefix"""... $ac_c" 1>&6
|
echo $ac_n "checking "whether external symbols need an underscore prefix"""... $ac_c" 1>&6
|
||||||
echo "configure:1963: checking "whether external symbols need an underscore prefix"" >&5
|
echo "configure:1964: checking "whether external symbols need an underscore prefix"" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_c_extern_prefix'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_c_extern_prefix'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
|
@ -1971,14 +1972,14 @@ _ac_test:
|
||||||
.long 0
|
.long 0
|
||||||
EOF
|
EOF
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 1975 "configure"
|
#line 1976 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
extern int ac_test;
|
extern int ac_test;
|
||||||
int main() {
|
int main() {
|
||||||
if (ac_test) return 1
|
if (ac_test) return 1
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:1982: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:1983: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
ac_cv_c_extern_prefix="yes"
|
ac_cv_c_extern_prefix="yes"
|
||||||
else
|
else
|
||||||
|
@ -2004,21 +2005,21 @@ fi
|
||||||
if test "$MAIN_TARGET" = "libwine.so.1.0"
|
if test "$MAIN_TARGET" = "libwine.so.1.0"
|
||||||
then
|
then
|
||||||
echo $ac_n "checking "whether we can build a dll"""... $ac_c" 1>&6
|
echo $ac_n "checking "whether we can build a dll"""... $ac_c" 1>&6
|
||||||
echo "configure:2008: checking "whether we can build a dll"" >&5
|
echo "configure:2009: checking "whether we can build a dll"" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_c_dll'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_c_dll'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
saved_cflags=$CFLAGS
|
saved_cflags=$CFLAGS
|
||||||
CFLAGS="$CFLAGS -fPIC -shared -Wl,-soname,conftest.so.1.0"
|
CFLAGS="$CFLAGS -fPIC -shared -Wl,-soname,conftest.so.1.0"
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 2015 "configure"
|
#line 2016 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
return 1
|
return 1
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:2022: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:2023: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
ac_cv_c_dll="yes"
|
ac_cv_c_dll="yes"
|
||||||
else
|
else
|
||||||
|
@ -2045,12 +2046,12 @@ fi
|
||||||
for ac_func in memmove tcgetattr usleep
|
for ac_func in memmove tcgetattr usleep
|
||||||
do
|
do
|
||||||
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
|
echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
|
||||||
echo "configure:2049: checking for $ac_func" >&5
|
echo "configure:2050: checking for $ac_func" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 2054 "configure"
|
#line 2055 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
/* System header to define __stub macros and hopefully few prototypes,
|
/* System header to define __stub macros and hopefully few prototypes,
|
||||||
which can conflict with char $ac_func(); below. */
|
which can conflict with char $ac_func(); below. */
|
||||||
|
@ -2073,7 +2074,7 @@ $ac_func();
|
||||||
|
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:2077: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
if { (eval echo configure:2078: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
eval "ac_cv_func_$ac_func=yes"
|
eval "ac_cv_func_$ac_func=yes"
|
||||||
else
|
else
|
||||||
|
@ -2098,12 +2099,12 @@ fi
|
||||||
done
|
done
|
||||||
|
|
||||||
echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6
|
echo $ac_n "checking whether stat file-mode macros are broken""... $ac_c" 1>&6
|
||||||
echo "configure:2102: checking whether stat file-mode macros are broken" >&5
|
echo "configure:2103: checking whether stat file-mode macros are broken" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_header_stat_broken'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 2107 "configure"
|
#line 2108 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
|
@ -2154,12 +2155,12 @@ EOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo $ac_n "checking for working const""... $ac_c" 1>&6
|
echo $ac_n "checking for working const""... $ac_c" 1>&6
|
||||||
echo "configure:2158: checking for working const" >&5
|
echo "configure:2159: checking for working const" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 2163 "configure"
|
#line 2164 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
|
@ -2208,7 +2209,7 @@ ccp = (char const *const *) p;
|
||||||
|
|
||||||
; return 0; }
|
; return 0; }
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:2212: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
if { (eval echo configure:2213: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
ac_cv_c_const=yes
|
ac_cv_c_const=yes
|
||||||
else
|
else
|
||||||
|
@ -2229,12 +2230,12 @@ EOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
|
echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6
|
||||||
echo "configure:2233: checking for ANSI C header files" >&5
|
echo "configure:2234: checking for ANSI C header files" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 2238 "configure"
|
#line 2239 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
@ -2242,7 +2243,7 @@ else
|
||||||
#include <float.h>
|
#include <float.h>
|
||||||
EOF
|
EOF
|
||||||
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
|
||||||
{ (eval echo configure:2246: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
{ (eval echo configure:2247: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
|
||||||
ac_err=`grep -v '^ *+' conftest.out`
|
ac_err=`grep -v '^ *+' conftest.out`
|
||||||
if test -z "$ac_err"; then
|
if test -z "$ac_err"; then
|
||||||
rm -rf conftest*
|
rm -rf conftest*
|
||||||
|
@ -2259,7 +2260,7 @@ rm -f conftest*
|
||||||
if test $ac_cv_header_stdc = yes; then
|
if test $ac_cv_header_stdc = yes; then
|
||||||
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
|
# SunOS 4.x string.h does not declare mem*, contrary to ANSI.
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 2263 "configure"
|
#line 2264 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
EOF
|
EOF
|
||||||
|
@ -2277,7 +2278,7 @@ fi
|
||||||
if test $ac_cv_header_stdc = yes; then
|
if test $ac_cv_header_stdc = yes; then
|
||||||
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
|
# ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 2281 "configure"
|
#line 2282 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
EOF
|
EOF
|
||||||
|
@ -2298,7 +2299,7 @@ if test "$cross_compiling" = yes; then
|
||||||
:
|
:
|
||||||
else
|
else
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 2302 "configure"
|
#line 2303 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
|
#define ISLOWER(c) ('a' <= (c) && (c) <= 'z')
|
||||||
|
@ -2309,7 +2310,7 @@ if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2);
|
||||||
exit (0); }
|
exit (0); }
|
||||||
|
|
||||||
EOF
|
EOF
|
||||||
if { (eval echo configure:2313: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
|
if { (eval echo configure:2314: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest && (./conftest; exit) 2>/dev/null
|
||||||
then
|
then
|
||||||
:
|
:
|
||||||
else
|
else
|
||||||
|
@ -2333,12 +2334,12 @@ EOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo $ac_n "checking for size_t""... $ac_c" 1>&6
|
echo $ac_n "checking for size_t""... $ac_c" 1>&6
|
||||||
echo "configure:2337: checking for size_t" >&5
|
echo "configure:2338: checking for size_t" >&5
|
||||||
if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
|
if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then
|
||||||
echo $ac_n "(cached) $ac_c" 1>&6
|
echo $ac_n "(cached) $ac_c" 1>&6
|
||||||
else
|
else
|
||||||
cat > conftest.$ac_ext <<EOF
|
cat > conftest.$ac_ext <<EOF
|
||||||
#line 2342 "configure"
|
#line 2343 "configure"
|
||||||
#include "confdefs.h"
|
#include "confdefs.h"
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#if STDC_HEADERS
|
#if STDC_HEADERS
|
||||||
|
@ -2531,6 +2532,7 @@ s%@oldincludedir@%$oldincludedir%g
|
||||||
s%@infodir@%$infodir%g
|
s%@infodir@%$infodir%g
|
||||||
s%@mandir@%$mandir%g
|
s%@mandir@%$mandir%g
|
||||||
s%@LDLIBS@%$LDLIBS%g
|
s%@LDLIBS@%$LDLIBS%g
|
||||||
|
s%@PROGEXT@%$PROGEXT%g
|
||||||
s%@MAIN_TARGET@%$MAIN_TARGET%g
|
s%@MAIN_TARGET@%$MAIN_TARGET%g
|
||||||
s%@OPTIONS@%$OPTIONS%g
|
s%@OPTIONS@%$OPTIONS%g
|
||||||
s%@SET_MAKE@%$SET_MAKE%g
|
s%@SET_MAKE@%$SET_MAKE%g
|
||||||
|
|
|
@ -8,6 +8,7 @@ AC_CONFIG_AUX_DIR(tools)
|
||||||
|
|
||||||
# We want these before the checks, so the checks can modify their values.
|
# We want these before the checks, so the checks can modify their values.
|
||||||
test -z "$LDLIBS" && LDLIBS=-lm AC_SUBST(LDLIBS)
|
test -z "$LDLIBS" && LDLIBS=-lm AC_SUBST(LDLIBS)
|
||||||
|
test -z "$PROGEXT" && PROGEXT="" AC_SUBST(PROGEXT)
|
||||||
|
|
||||||
dnl **** Command-line arguments ****
|
dnl **** Command-line arguments ****
|
||||||
|
|
||||||
|
|
|
@ -4,25 +4,48 @@ in doing actual work on edit.c only C & D will be of interest to you.
|
||||||
|
|
||||||
A) basic policy
|
A) basic policy
|
||||||
B) special functions
|
B) special functions
|
||||||
C) not implemented
|
C) not implemented / implementation ideas / implementation problems
|
||||||
D) known bugs
|
D) known bugs / features
|
||||||
|
|
||||||
A) Basic Policy
|
A) Basic Policy
|
||||||
|
|
||||||
|
All messages are handled by EditWndProc(), which is the only external
|
||||||
|
function call. All other functions are static (local to edit.c).
|
||||||
|
|
||||||
|
All Windows Messages (WM_XXX) are 32-bit, since the edit control is now a
|
||||||
|
32-bit registered class. The message are dealt with through the helper
|
||||||
|
functions EDIT_WM_XXX().
|
||||||
|
|
||||||
|
The edit control messages can be either 16 or 32 bit, depending on the type
|
||||||
|
of application that sends the message. Wherever possible EditWndProc()
|
||||||
|
converts the 16-bit message parameters to parameters corresponding to their
|
||||||
|
32-bit counterparts. The message is then handled by the appropriate
|
||||||
|
EDIT_EM_XXX() helper function. Sometimes it is not possible to handle the
|
||||||
|
16-bit and 32-bit versions in the same way, in which case both helper
|
||||||
|
functions EDIT_EM_XXX16() and EDIT_EM_XXX() are defined.
|
||||||
|
|
||||||
|
All other functions are called EDIT_XXX().
|
||||||
|
|
||||||
|
Note: Sometimes a function is internally used a bit different than the specs
|
||||||
|
of a similar function. For instance EDIT_SetSel() is used internally and
|
||||||
|
should not be mixed up with EDIT_EM_SetSel(), a message handler that _does_
|
||||||
|
conform to the specs of EM_SETSEL.
|
||||||
|
|
||||||
The code has been made in such a way, that functions try to call other
|
The code has been made in such a way, that functions try to call other
|
||||||
(documented) functions if that is sufficient. This might sometimes not be
|
(documented) functions if that is sufficient. This might sometimes not be
|
||||||
the most efficient way, but it keeps the code clear. This way I tried to keep
|
the most efficient way, but it keeps the code clear. This way I tried to
|
||||||
the number of functions that rely on the internal EDITSTATE structure as
|
keep the number of functions that rely on the internal EDITSTATE structure
|
||||||
low as possible. For instance EDIT_WM_Cut() simply calls EDIT_WM_Copy() and
|
as low as possible. For instance EDIT_WM_Cut() simply calls EDIT_WM_Copy()
|
||||||
EDIT_WM_Clear(). The latter two are well documented message handlers, so
|
and EDIT_WM_Clear(). The latter two are well documented message handlers,
|
||||||
as long as they are right EDIT_WM_Cut() will never have to change again.
|
so as long as they are right EDIT_WM_Cut() will never have to change again.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
The best thing to do, when you want to know the offset of line 3, is calling
|
The best thing to do, when you want to know the offset of line 3, is calling
|
||||||
EDIT_EM_LineIndex(). Again this is a well documented message handler. Don't
|
EDIT_EM_LineIndex(). Again this is a well documented message handler.
|
||||||
look at es->LineDefs[2].offset. It would just be another reference to the
|
Don't look at es->LineDefs[2].offset. It would just be another reference to
|
||||||
internal structure, and that would make it more difficult to change things.
|
the internal structure, and that would make it more difficult to change
|
||||||
Refer to EDIT_WM_???? and EDIT_EM_????? functions as much as possible.
|
things. Refer to EDIT_WM_???? and EDIT_EM_????? functions as much as
|
||||||
|
possible.
|
||||||
|
|
||||||
The WND * pointer is used internally whenever possible. Although it is not
|
The WND * pointer is used internally whenever possible. Although it is not
|
||||||
the real HWND, it improves performance enough to use it.
|
the real HWND, it improves performance enough to use it.
|
||||||
|
@ -33,20 +56,35 @@ faster. Although sometimes the response time might appear to be slow, it
|
||||||
would be much slower even, when everything would be painted instantly. This
|
would be much slower even, when everything would be painted instantly. This
|
||||||
is especially true for scrollbar tracking and selection changes..
|
is especially true for scrollbar tracking and selection changes..
|
||||||
|
|
||||||
|
The text buffer is a kind of tricky. Initially the edit control allocates a
|
||||||
|
HLOCAL32 buffer (32 bit linear memory handler). However, 16 bit application
|
||||||
|
might send a EM_GETHANDLE message and expect a HLOCAL16 (16 bit SEG:OFF
|
||||||
|
handler). From that moment on we have to keep using this 16 bit memory
|
||||||
|
handler, because it is supposed to be valid at all times after EM_GETHANDLE.
|
||||||
|
What we do is create a HLOCAL16 buffer, copy the text, and do pointer
|
||||||
|
conversion.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
B) Special functions
|
B) Special functions
|
||||||
|
|
||||||
The edit control needs to use local heap memory because applications may
|
Several helper functions try to make your life easier when dealing with the
|
||||||
rely on EM_GETHANDLE. This is bad, but it can't be helped, we have to live
|
allocated buffer. In principle Windows can move memory blocks around unless
|
||||||
with that. For this reason there is a nice EDIT_GetPointer() function,
|
they are locked. Currently, WINE doesn't do this, but it might in the
|
||||||
which locks the heap buffer *only once*, no matter how often it is called.
|
future.
|
||||||
Only at the end of the message handler EDIT_ReleasePointer() is called. You
|
|
||||||
don't have to worry about unlocking the heap. Calling EDIT_GetPointer() is
|
For this reason there is a nice EDIT_GetPointer() function, which locks the
|
||||||
very fast if the buffer is already locked.
|
heap buffer *only once*, no matter how often it is called. It then returns a
|
||||||
This way, the buffer gets locked / unlock only once every message, although
|
nice 32-bit pointer to linear memory. Calling EDIT_GetPointer() is very fast
|
||||||
EDIT_GetPointer() may actually have been called a hundred times.
|
if the buffer is already locked, so you can call it whenever you feel it
|
||||||
Only when the actual HLOCAL is needed (for example to ReAlloc), a call to
|
*might* be useful.
|
||||||
|
|
||||||
|
At the end of EditWndProc(), EDIT_ReleasePointer() is automatically called
|
||||||
|
which cleans up the initialized pointer. So you don't have to worry about
|
||||||
|
unlocking the memory block. This way, the buffer gets locked / unlock only
|
||||||
|
once every message, although EDIT_GetPointer() may actually have been called
|
||||||
|
a hundred times. Only when the actual HLOCAL is needed (for example to
|
||||||
|
ReAlloc), an extra call (besides the cleanup at the end of EditWndProc()) to
|
||||||
EDIT_ReleasePointer() is needed. Look for instance in EDIT_MakeFit().
|
EDIT_ReleasePointer() is needed. Look for instance in EDIT_MakeFit().
|
||||||
|
|
||||||
This brings us to EDIT_MakeFit(). It automatically re-allocates the buffer
|
This brings us to EDIT_MakeFit(). It automatically re-allocates the buffer
|
||||||
|
@ -55,6 +93,9 @@ returned, otherwise FALSE. Only when the buffer contents may grow you need
|
||||||
to call EDIT_MakeFit(). Currently this is only in EDIT_ReplaceSel() and
|
to call EDIT_MakeFit(). Currently this is only in EDIT_ReplaceSel() and
|
||||||
EDIT_WM_SetText().
|
EDIT_WM_SetText().
|
||||||
|
|
||||||
|
EDIT_GetPointer(), EDIT_ReleasePointer and EDIT_MakeFit() are aware of the
|
||||||
|
HLOCAL32 / HLOCAL16 business.
|
||||||
|
|
||||||
EDIT_BuildLineDefs() is the most important function in edit.c. It builds
|
EDIT_BuildLineDefs() is the most important function in edit.c. It builds
|
||||||
the internal EDITSTATE structure. As soon as text *might* have changed, or
|
the internal EDITSTATE structure. As soon as text *might* have changed, or
|
||||||
when the appearance of the text on the screen *might* have changed, call
|
when the appearance of the text on the screen *might* have changed, call
|
||||||
|
@ -64,47 +105,93 @@ rely on the stuff this function builds.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
C) Not Implemented
|
C) Not Implemented / Implementation Ideas / Implementation Problems
|
||||||
|
|
||||||
|
Styles:
|
||||||
|
|
||||||
- ES_PASSWORD
|
|
||||||
- ES_CENTER
|
- ES_CENTER
|
||||||
- ES_RIGHT
|
- ES_RIGHT
|
||||||
- EM_SETRECT
|
- ES_NUMBER (new since win95)
|
||||||
- EM_SETRECTNP
|
|
||||||
- EM_FMTLINES
|
|
||||||
- ES_AUTOVSCROLL (every multi line *is* auto vscroll)
|
|
||||||
- ES_AUTOHSCROLL (multi line can be yes or no, but single line only yes)
|
|
||||||
- WM_UNDO (=EM_UNDO)
|
|
||||||
- EM_CANUNDO
|
|
||||||
- EM_SCROLL (scrolling works, but this appears to be an undocumented message)
|
|
||||||
- ES_LOWERCASE
|
|
||||||
- ES_UPPERCASE
|
|
||||||
- ES_OEMCONVERT
|
- ES_OEMCONVERT
|
||||||
- ES_WANTRETURN
|
- ES_WANTRETURN
|
||||||
- probably much, MUCH more
|
|
||||||
|
|
||||||
I encountered several undocumented messages, or message parameters.
|
None of these should be difficult to include. I just didn't have the time
|
||||||
EditWndProc() reports any unknown message with an id > WM_USER.
|
yet. Feel free ...
|
||||||
|
|
||||||
|
- ES_AUTOVSCROLL (every multi line control *is* auto vscroll)
|
||||||
|
- ES_AUTOHSCROLL (every single line control *is* auto hscroll)
|
||||||
|
(for multi line controls it works : wordwrap)
|
||||||
|
|
||||||
|
Much, much more difficult. It comes down to this: When there is no
|
||||||
|
autoscrolling, the edit control should first check whether the new text
|
||||||
|
(after a typed key for instance) would fit. If not, an EN_MAXTEXT should be
|
||||||
|
sent. However, currently this would require the actual change to be made,
|
||||||
|
then call EDIT_BuildLineDefs() and then find out that the new text doesn't
|
||||||
|
fit. After all this, things should be put back in the state before the
|
||||||
|
changes. Given the fact that even normal UNDO doesn't work ...
|
||||||
|
|
||||||
|
Messages:
|
||||||
|
|
||||||
|
- EM_SETRECT
|
||||||
|
- EM_SETRECTNP
|
||||||
|
- EM_SETMARGINS (new since win95)
|
||||||
|
- EM_FMTLINES
|
||||||
|
|
||||||
|
These shouldn't be really difficult either. They just confine the visual
|
||||||
|
output to something different than the client rectangle. Currently the
|
||||||
|
client area is used everywhere in the code. At some points this should
|
||||||
|
really be so (GetClientRect32()), whereas at other points it should be the
|
||||||
|
format rectangle (EDIT_EM_GetRect()). Both functions are now used, but
|
||||||
|
inconsistently and mixed up ! If you implement the formatting rectangle /
|
||||||
|
margins, be sure to check all references to RECT's, and how they are /
|
||||||
|
should be obtained.
|
||||||
|
|
||||||
|
- EM_FMTLINES
|
||||||
|
|
||||||
|
This means: insert or remove the soft linebreak character (\r\r\n). Probably
|
||||||
|
invented by MS to suit their implementation of the edit control. However,
|
||||||
|
with WINE's implementation I've never come up with occasions where it is
|
||||||
|
actually useful (we never insert \r\r\n, and applications always request
|
||||||
|
removal). If you are a purist ... implementation shouldn't be difficult.
|
||||||
|
Take care to check if the text still fits the buffer after insertion. If
|
||||||
|
not, notify with EN_ERRSPACE.
|
||||||
|
|
||||||
|
- WM_UNDO (=EM_UNDO)
|
||||||
|
|
||||||
|
I'm working on it. It is, however, not trivial. Luckily the only function
|
||||||
|
where actual text changes is EM_REPLACESEL, so this is the only spot where
|
||||||
|
we have to worry about UNDO capabilities. Before you try: contact me. I
|
||||||
|
already have ideas and might start implementing it myself really soon.
|
||||||
|
|
||||||
|
- EM_SETWORDBREAKPROC
|
||||||
|
|
||||||
|
Not really difficult. It used to work, but since we moved to 32 bits there
|
||||||
|
are now two kinds of callback functions. And I don't know the 32-bit specs
|
||||||
|
for the WordBreakProc() ... Look it up and uncomment the code that is still
|
||||||
|
there for 16 bit callback.
|
||||||
|
|
||||||
|
- EM_SCROLL
|
||||||
|
|
||||||
|
Supposed to be the same as WM_VSCROLL, but not quite. In other words:
|
||||||
|
poorly documented. Somebody that knows ?
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
D) Known bugs.
|
D) Known bugs / Features
|
||||||
|
|
||||||
- Scrolling is weird, sometimes. The current code makes the scrollbar
|
- The control still calls GetTabbedTextExtent() and TabbedTextOut() in
|
||||||
of Notepad work, but the scrollbar code itself is broken. Currently
|
their 16 bit version (since the 32 bit versions don't yet exist).
|
||||||
the scroll code of edit.c is *not* according to specs. Instead, it
|
Therefore the tab list is 16 bits (should be 32).
|
||||||
is according to the broken scrollbar code. If that gets fixed, this
|
- Scrollbar tracking is broken.
|
||||||
should be fixed, too.
|
- Lots of API calls are to 16 bit functions, because their 32 bit
|
||||||
- The clipboard is broken. Whenever things go wrong with
|
versions haven't been implemented yet (e.g. clipboard).
|
||||||
cut/copy/paste, it is probably the clipboard that messes up things,
|
- Turning on WordWrap with 16-bit Notepad leaves part of the horizontal
|
||||||
not edit.c.
|
|
||||||
- Turning on WordWrap with Notepad leaves part of the horizontal
|
|
||||||
scrollbar visible (problem with WM_ERASEBKGND ???).
|
scrollbar visible (problem with WM_ERASEBKGND ???).
|
||||||
|
- FIXME's (grep for them).
|
||||||
|
|
||||||
|
|
||||||
I am still very actively changing things. Especially I am working
|
I am working on Undo capabilities. If you want to do things, other than bug
|
||||||
on Undo capabilities. If you want to do things, other than bug fixes,
|
fixes, please mail me so we can synchronize.
|
||||||
please mail me so we can synchronize.
|
|
||||||
|
|
||||||
Frans van Dorsselaer
|
Frans van Dorsselaer
|
||||||
dorssel@rulhm1.LeidenUniv.nl
|
dorssel@rulhm1.LeidenUniv.nl
|
||||||
|
|
|
@ -756,7 +756,7 @@ static LRESULT CBGetEditSel(HWND hwnd, WPARAM16 wParam, LPARAM lParam)
|
||||||
|
|
||||||
if ((lphc->dwStyle & 3) == CBS_DROPDOWNLIST)
|
if ((lphc->dwStyle & 3) == CBS_DROPDOWNLIST)
|
||||||
return CB_ERR; /* err, documented for CBSetEditSel */
|
return CB_ERR; /* err, documented for CBSetEditSel */
|
||||||
return SendMessage16(lphc->hWndEdit, EM_GETSEL, 0, 0);
|
return SendMessage16(lphc->hWndEdit, EM_GETSEL16, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -770,7 +770,7 @@ static LRESULT CBSetEditSel(HWND hwnd, WPARAM16 wParam, LPARAM lParam)
|
||||||
|
|
||||||
if ((lphc->dwStyle & 3) == CBS_DROPDOWNLIST)
|
if ((lphc->dwStyle & 3) == CBS_DROPDOWNLIST)
|
||||||
return CB_ERR;
|
return CB_ERR;
|
||||||
return SendMessage16(lphc->hWndEdit, EM_SETSEL, 0, lParam);
|
return SendMessage16(lphc->hWndEdit, EM_SETSEL16, 0, lParam);
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
|
|
2498
controls/edit.c
2498
controls/edit.c
File diff suppressed because it is too large
Load Diff
|
@ -1487,7 +1487,7 @@ LRESULT LISTBOX_Directory( WND *wnd, LB_DESCR *descr, UINT32 attrib,
|
||||||
if (long_names) strcpy( buffer, entry.cFileName );
|
if (long_names) strcpy( buffer, entry.cFileName );
|
||||||
else strcpy( buffer, entry.cAlternateFileName );
|
else strcpy( buffer, entry.cAlternateFileName );
|
||||||
}
|
}
|
||||||
if (!long_names) AnsiLower( buffer );
|
if (!long_names) CharLower32A( buffer );
|
||||||
pos = LISTBOX_FindFileStrPos( wnd, descr, buffer );
|
pos = LISTBOX_FindFileStrPos( wnd, descr, buffer );
|
||||||
if ((ret = LISTBOX_InsertString( wnd, descr, pos, buffer )) < 0)
|
if ((ret = LISTBOX_InsertString( wnd, descr, pos, buffer )) < 0)
|
||||||
break;
|
break;
|
||||||
|
@ -2206,8 +2206,12 @@ LRESULT ListBoxWndProc(HWND32 hwnd, UINT32 msg, WPARAM32 wParam, LPARAM lParam)
|
||||||
|
|
||||||
case LB_SELITEMRANGE16:
|
case LB_SELITEMRANGE16:
|
||||||
case LB_SELITEMRANGE32:
|
case LB_SELITEMRANGE32:
|
||||||
return LISTBOX_SelectItemRange( wnd, descr, LOWORD(lParam),
|
if (LOWORD(lParam) <= HIWORD(lParam))
|
||||||
HIWORD(lParam), wParam );
|
return LISTBOX_SelectItemRange( wnd, descr, LOWORD(lParam),
|
||||||
|
HIWORD(lParam), wParam );
|
||||||
|
else
|
||||||
|
return LISTBOX_SelectItemRange( wnd, descr, HIWORD(lParam),
|
||||||
|
LOWORD(lParam), wParam );
|
||||||
|
|
||||||
case LB_SELITEMRANGEEX16:
|
case LB_SELITEMRANGEEX16:
|
||||||
case LB_SELITEMRANGEEX32:
|
case LB_SELITEMRANGEEX32:
|
||||||
|
|
949
controls/menu.c
949
controls/menu.c
File diff suppressed because it is too large
Load Diff
|
@ -23,10 +23,7 @@
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
#include "gdi.h"
|
#include "gdi.h"
|
||||||
#include "msdos.h"
|
|
||||||
#include "listbox.h"
|
#include "listbox.h"
|
||||||
#include "dos_fs.h"
|
|
||||||
#include "drive.h"
|
|
||||||
#include "heap.h"
|
#include "heap.h"
|
||||||
#include "stddebug.h"
|
#include "stddebug.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
@ -698,81 +695,6 @@ int ListBoxSetCurSel(LPHEADLIST lphl, WORD wIndex)
|
||||||
|
|
||||||
LONG ListBoxDirectory(LPHEADLIST lphl, UINT attrib, LPCSTR filespec)
|
LONG ListBoxDirectory(LPHEADLIST lphl, UINT attrib, LPCSTR filespec)
|
||||||
{
|
{
|
||||||
#if 0
|
|
||||||
char mask[13];
|
|
||||||
char* temp = NULL;
|
|
||||||
const char* ptr;
|
|
||||||
int skip, count;
|
|
||||||
LONG ret;
|
|
||||||
DOS_DIRENT entry;
|
|
||||||
char *path, *p;
|
|
||||||
|
|
||||||
dprintf_listbox(stddeb, "ListBoxDirectory: '%s' %04x\n", filespec, attrib);
|
|
||||||
if (!filespec) return LB_ERR;
|
|
||||||
if (!(ptr = DOSFS_GetUnixFileName( filespec, FALSE ))) return LB_ERR;
|
|
||||||
path = xstrdup(ptr);
|
|
||||||
p = strrchr( path, '/' );
|
|
||||||
*p++ = '\0';
|
|
||||||
if (!(ptr = DOSFS_ToDosFCBFormat( p )) ||
|
|
||||||
!(temp = SEGPTR_ALLOC( sizeof(char) * 16 )) )
|
|
||||||
{
|
|
||||||
free( path );
|
|
||||||
return LB_ERR;
|
|
||||||
}
|
|
||||||
|
|
||||||
strcpy( mask, ptr );
|
|
||||||
|
|
||||||
dprintf_listbox(stddeb, "ListBoxDirectory: path=%s mask=%s\n", path, mask);
|
|
||||||
|
|
||||||
skip = ret = 0;
|
|
||||||
attrib &= ~FA_LABEL;
|
|
||||||
while ((count = DOSFS_FindNext( path, mask, NULL, 0,
|
|
||||||
attrib, skip, &entry )) > 0)
|
|
||||||
{
|
|
||||||
skip += count;
|
|
||||||
if (entry.attr & FA_DIRECTORY)
|
|
||||||
{
|
|
||||||
if ((attrib & DDL_DIRECTORY) && strcmp(entry.name, ". "))
|
|
||||||
{
|
|
||||||
sprintf(temp, "[%s]", DOSFS_ToDosDTAFormat( entry.name ) );
|
|
||||||
AnsiLower( temp );
|
|
||||||
if ((ret = ListBoxAddString(lphl, SEGPTR_GET(temp))) == LB_ERR) break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else /* not a directory */
|
|
||||||
{
|
|
||||||
if (!(attrib & DDL_EXCLUSIVE) ||
|
|
||||||
((attrib & (FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_ARCHIVE)) ==
|
|
||||||
(entry.attr & (FA_RDONLY|FA_HIDDEN|FA_SYSTEM|FA_ARCHIVE))))
|
|
||||||
{
|
|
||||||
strcpy( temp, DOSFS_ToDosDTAFormat( entry.name ) );
|
|
||||||
AnsiLower( temp );
|
|
||||||
if ((ret = ListBoxAddString(lphl, SEGPTR_GET(temp))) == LB_ERR) break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
dprintf_listbox(stddeb,"\tn - %i, file '%s'\n", count, temp);
|
|
||||||
}
|
|
||||||
if (attrib & DDL_DRIVES)
|
|
||||||
{
|
|
||||||
int x;
|
|
||||||
DWORD oldstyle = lphl->dwStyle;
|
|
||||||
|
|
||||||
lphl->dwStyle &= ~LBS_SORT;
|
|
||||||
strcpy( temp, "[-a-]" );
|
|
||||||
for (x = 0; x < MAX_DOS_DRIVES; x++, temp[2]++)
|
|
||||||
{
|
|
||||||
if (DRIVE_IsValid(x))
|
|
||||||
if ((ret = ListBoxAddString(lphl, SEGPTR_GET(temp))) == LB_ERR) break;
|
|
||||||
}
|
|
||||||
lphl->dwStyle = oldstyle;
|
|
||||||
}
|
|
||||||
|
|
||||||
free( path );
|
|
||||||
SEGPTR_FREE( temp );
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
#endif
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,8 +18,12 @@
|
||||||
|
|
||||||
/* Window procedures */
|
/* Window procedures */
|
||||||
|
|
||||||
|
extern LRESULT EditWndProc( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
|
||||||
|
LPARAM lParam );
|
||||||
extern LRESULT ListBoxWndProc( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
|
extern LRESULT ListBoxWndProc( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
|
||||||
LPARAM lParam );
|
LPARAM lParam );
|
||||||
|
extern LRESULT PopupMenuWndProc( HWND32 hwnd, UINT32 msg, WPARAM32 wParam,
|
||||||
|
LPARAM lParam );
|
||||||
|
|
||||||
/* Win16 class info */
|
/* Win16 class info */
|
||||||
|
|
||||||
|
@ -42,12 +46,6 @@ static const BUILTIN_CLASS_INFO16 WIDGETS_BuiltinClasses16[] =
|
||||||
8, 0, "ComboBoxWndProc", "ComboBox" },
|
8, 0, "ComboBoxWndProc", "ComboBox" },
|
||||||
{ CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS,
|
{ CS_GLOBALCLASS | CS_DBLCLKS | CS_SAVEBITS,
|
||||||
8, 0, "ComboLBoxWndProc", "ComboLBox" },
|
8, 0, "ComboLBoxWndProc", "ComboLBox" },
|
||||||
{ CS_GLOBALCLASS | CS_PARENTDC | CS_DBLCLKS,
|
|
||||||
sizeof(DWORD), 0, "EditWndProc", "Edit" },
|
|
||||||
{ CS_GLOBALCLASS | CS_SAVEBITS,
|
|
||||||
sizeof(HMENU32), 0, "PopupMenuWndProc", POPUPMENU_CLASS_NAME },
|
|
||||||
{ CS_GLOBALCLASS | CS_SAVEBITS,
|
|
||||||
DLGWINDOWEXTRA, 0, "DefDlgProc", DIALOG_CLASS_NAME },
|
|
||||||
{ CS_GLOBALCLASS, sizeof(MDICLIENTINFO),
|
{ CS_GLOBALCLASS, sizeof(MDICLIENTINFO),
|
||||||
STOCK_LTGRAY_BRUSH, "MDIClientWndProc", "MDIClient" }
|
STOCK_LTGRAY_BRUSH, "MDIClientWndProc", "MDIClient" }
|
||||||
};
|
};
|
||||||
|
@ -61,12 +59,18 @@ static WNDCLASS32A WIDGETS_BuiltinClasses32[] =
|
||||||
{
|
{
|
||||||
{ CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC,
|
{ CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC,
|
||||||
ButtonWndProc, 0, sizeof(BUTTONINFO), 0, 0, 0, 0, 0, "Button" },
|
ButtonWndProc, 0, sizeof(BUTTONINFO), 0, 0, 0, 0, 0, "Button" },
|
||||||
|
{ CS_GLOBALCLASS | CS_DBLCLKS /*| CS_PARENTDC*/,
|
||||||
|
EditWndProc, 0, sizeof(void *), 0, 0, 0, 0, 0, "Edit" },
|
||||||
{ CS_GLOBALCLASS | CS_DBLCLKS /*| CS_PARENTDC*/,
|
{ CS_GLOBALCLASS | CS_DBLCLKS /*| CS_PARENTDC*/,
|
||||||
ListBoxWndProc, 0, sizeof(void *), 0, 0, 0, 0, 0, "ListBox" },
|
ListBoxWndProc, 0, sizeof(void *), 0, 0, 0, 0, 0, "ListBox" },
|
||||||
|
{ CS_GLOBALCLASS | CS_SAVEBITS, PopupMenuWndProc,
|
||||||
|
0, sizeof(HMENU32), 0, 0, 0, 0, 0, POPUPMENU_CLASS_NAME },
|
||||||
{ CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC,
|
{ CS_GLOBALCLASS | CS_DBLCLKS | CS_VREDRAW | CS_HREDRAW | CS_PARENTDC,
|
||||||
ScrollBarWndProc, 0, sizeof(SCROLLBAR_INFO), 0, 0, 0, 0, 0, "ScrollBar"},
|
ScrollBarWndProc, 0, sizeof(SCROLLBAR_INFO), 0, 0, 0, 0, 0, "ScrollBar"},
|
||||||
{ CS_GLOBALCLASS, DesktopWndProc, 0, sizeof(DESKTOPINFO),
|
{ CS_GLOBALCLASS, DesktopWndProc, 0, sizeof(DESKTOPINFO),
|
||||||
0, 0, 0, 0, 0, DESKTOP_CLASS_NAME }
|
0, 0, 0, 0, 0, DESKTOP_CLASS_NAME },
|
||||||
|
{ CS_GLOBALCLASS | CS_SAVEBITS, DefDlgProc32A, 0, DLGWINDOWEXTRA,
|
||||||
|
0, 0, 0, 0, 0, DIALOG_CLASS_NAME }
|
||||||
};
|
};
|
||||||
|
|
||||||
#define NB_BUILTIN_CLASSES32 \
|
#define NB_BUILTIN_CLASSES32 \
|
||||||
|
|
|
@ -8,14 +8,18 @@ MODULE = debugger
|
||||||
C_SRCS = \
|
C_SRCS = \
|
||||||
break.c \
|
break.c \
|
||||||
db_disasm.c \
|
db_disasm.c \
|
||||||
|
display.c \
|
||||||
editline.c \
|
editline.c \
|
||||||
|
expr.c \
|
||||||
hash.c \
|
hash.c \
|
||||||
info.c \
|
info.c \
|
||||||
memory.c \
|
memory.c \
|
||||||
msc.c \
|
msc.c \
|
||||||
registers.c \
|
registers.c \
|
||||||
|
source.c \
|
||||||
stabs.c \
|
stabs.c \
|
||||||
stack.c
|
stack.c \
|
||||||
|
types.c
|
||||||
|
|
||||||
GEN_C_SRCS = \
|
GEN_C_SRCS = \
|
||||||
y.tab.c \
|
y.tab.c \
|
||||||
|
@ -23,6 +27,12 @@ GEN_C_SRCS = \
|
||||||
|
|
||||||
all: $(MODULE).o
|
all: $(MODULE).o
|
||||||
|
|
||||||
|
#
|
||||||
|
# This is a special test program that helps debug the internal debugger.
|
||||||
|
#
|
||||||
|
debug: $(MODULE).o dbgmain.o ../misc/xmalloc.o
|
||||||
|
$(CC) -o debug $(MODULE).o dbgmain.o ../misc/xmalloc.o
|
||||||
|
|
||||||
@MAKE_RULES@
|
@MAKE_RULES@
|
||||||
|
|
||||||
y.tab.c y.tab.h: dbg.y
|
y.tab.c y.tab.h: dbg.y
|
||||||
|
|
426
debugger/README
426
debugger/README
|
@ -1,17 +1,423 @@
|
||||||
|
|
||||||
This is the core of the Wine debugger. Many pieces have been
|
This is the core of the Wine debugger. Many pieces have been
|
||||||
shamelessly stolen - the reverse assember was stolen from gdb more or
|
shamelessly stolen - the reverse assember was stolen from Mach more or
|
||||||
less intact. It turns out that there are two variables that are set
|
less intact. It turns out that there are two variables that are set
|
||||||
differently if you are reverse assembling 16 bit code, and on the
|
differently if you are reverse assembling 16 bit code, and on the
|
||||||
whole it seems to work. There may be bugs for all I know.
|
whole it seems to work.
|
||||||
|
|
||||||
As far as non-linux systems are concerned, I simply ripped off
|
NEWS:
|
||||||
the linux configuration files from gdb. Other systems may be close
|
|
||||||
enough for these to work properly, but some tweaking may be required.
|
|
||||||
|
|
||||||
I apologize for the non-portability of this, but I wrote the
|
The internal debugger has *tons* more capability than it did before.
|
||||||
whole thing in about 4 hours, most of the time spent debugging a
|
I have enclosed some examples that show usage at the end of this file.
|
||||||
stupid mistake in the parser.
|
New features include:
|
||||||
|
|
||||||
-Eric
|
1) Ability of debugger to read debug information from wine executable
|
||||||
|
*and* from Win32 executables. Local variable and line number information is
|
||||||
|
also read and processed.
|
||||||
|
|
||||||
|
2) The internal debugger is capable of 'stepping' to the next
|
||||||
|
line number, just like gdb. Examples of the commands are:
|
||||||
|
|
||||||
|
step
|
||||||
|
stepi
|
||||||
|
si
|
||||||
|
step 3
|
||||||
|
si 5
|
||||||
|
next
|
||||||
|
nexti
|
||||||
|
cont 4
|
||||||
|
finish
|
||||||
|
|
||||||
|
All of these should be exactly like how gdb does things.
|
||||||
|
|
||||||
|
3) The internal debugger now has a sense of what source file and line
|
||||||
|
number a given PC is at. New commands to support this are just like gdb,
|
||||||
|
and include:
|
||||||
|
|
||||||
|
list
|
||||||
|
dir
|
||||||
|
show dir
|
||||||
|
|
||||||
|
there are a variety of formats of arguments for the list command. All
|
||||||
|
permutations supported by gdb should also be supported.
|
||||||
|
|
||||||
|
4) The internal debugger knows about datatypes of various objects,
|
||||||
|
for both Win32 *and* the debugging information in the wine executable itself.
|
||||||
|
I have enclosed an example of how this works at the end.
|
||||||
|
|
||||||
|
5) There are more ways the 'b' command can be used to set breakpoints.
|
||||||
|
Examples are:
|
||||||
|
|
||||||
|
b *0x8190000
|
||||||
|
b 1100
|
||||||
|
b Usage
|
||||||
|
b
|
||||||
|
|
||||||
|
I don't think this covers all of the permutations that gdb accepts (this should
|
||||||
|
be cleaned up someday so that all possibilities are acceptable).
|
||||||
|
|
||||||
|
6) The 'print' and 'x' commands should behave more or less exactly
|
||||||
|
as they do under gdb. The difference is that the way the data is presented
|
||||||
|
will be slightly different, but the content should be fundamentally the same.
|
||||||
|
|
||||||
|
7) The internal debugger now supports conditional breakpoints, and
|
||||||
|
automatic display expressions. An example is at the end of this file. The
|
||||||
|
syntax and usage should be identical to that of gdb.
|
||||||
|
|
||||||
|
NOTES:
|
||||||
|
|
||||||
|
If it weren't for the fact that gdb doesn't grok the Win32 debug
|
||||||
|
information, you could just use gdb. The internal debugger should be able
|
||||||
|
to read and use debugging information for both Win32 and also for the
|
||||||
|
Wine executable, making it possible to debug the combination of the two
|
||||||
|
together as if it were one large (very large) entity.
|
||||||
|
|
||||||
|
LIMITATIONS AND DIFFERENCES FROM GDB:
|
||||||
|
|
||||||
|
You cannot use type casts in expressions that you give to the
|
||||||
|
debugger. The hardest part about adding support for this is fixing
|
||||||
|
the parser/lexer to know when it is handling a type cast, and when it
|
||||||
|
is handling any other type of parenthesized expression. With lexer
|
||||||
|
states, it may be possible to keep track of what we would expect at
|
||||||
|
any given moment, but it would be tedious to go through and make sure
|
||||||
|
that the state is set up correctly for all of the different operators
|
||||||
|
and characters that we accept, and I am not yet convinced that this would
|
||||||
|
even work.
|
||||||
|
|
||||||
|
You cannot set a breakpoint by file and line number as you can
|
||||||
|
with gdb. Adding support for this wouldn't be all that tough, I guess, but
|
||||||
|
it would be a nuisance. You can set a breakpoint given a function and
|
||||||
|
line number, however. An example would be 'b main:2993'. It turns out
|
||||||
|
that the way the internal data structures are arranged it is a whole lot
|
||||||
|
easier to do things in this way than it would be to try and get the
|
||||||
|
source:line type of breakpoint working, but it would probably be worth it
|
||||||
|
to try.
|
||||||
|
|
||||||
|
Getting stack traces through Wine itself can be a bit tricky.
|
||||||
|
This is because by default the thing is built with optimization
|
||||||
|
enabled, and as a result sometimes functions don't get frames, and
|
||||||
|
lots of variables are optimized into registers. You can turn off
|
||||||
|
optimization for a few key source files if it will help you.
|
||||||
|
|
||||||
|
Memory consumption is getting to be a real problem. I think 32Mb is
|
||||||
|
no longer sufficient to debug wine - 48 or 64 is probably a whole lot better.
|
||||||
|
Unfortunately I cannot shut down X to save memory :-).
|
||||||
|
|
||||||
|
*************************************************************************
|
||||||
|
EXAMPLES:
|
||||||
|
|
||||||
|
Here is an example of how I tracked down a bug in Wine. The program
|
||||||
|
is something that just maps and dumps the contents of a Win32 executable.
|
||||||
|
It was dying for some reason.
|
||||||
|
|
||||||
|
Start the first time through.
|
||||||
|
|
||||||
|
bash$ ls -l dumpexe.exe
|
||||||
|
-rw-rw-r-- 1 eric devel 168448 Jan 4 13:51 dumpexe.exe
|
||||||
|
bash$ ./wine -debug './dumpexe.exe -symbol ./dumpexe.exe'
|
||||||
|
Warning: invalid dir 'e:\test' in path, deleting it.
|
||||||
|
Win32 task 'W32SXXXX': Breakpoint 1 at 0x081a3450
|
||||||
|
Loading symbols from ELF file ./wine...
|
||||||
|
Loading symbols from ELF file /usr/X11R6/lib/libXpm.so.4.6...
|
||||||
|
Loading symbols from ELF file /usr/X11R6/lib/libSM.so.6.0...
|
||||||
|
Loading symbols from ELF file /usr/X11R6/lib/libICE.so.6.0...
|
||||||
|
Loading symbols from ELF file /usr/X11R6/lib/libXext.so.6.0...
|
||||||
|
Loading symbols from ELF file /usr/X11R6/lib/libX11.so.6.0...
|
||||||
|
Loading symbols from ELF file /lib/libm.so.5.0.5...
|
||||||
|
Loading symbols from ELF file /lib/libc.so.5.2.18...
|
||||||
|
Loading symbols from ELF file /lib/ld-linux.so.1...
|
||||||
|
Loading symbols from Win32 file ./dumpexe.exe...
|
||||||
|
Stopped on breakpoint 1 at 0x081a3450 (_mainCRTStartup)
|
||||||
|
In 32 bit mode.
|
||||||
|
*** Invalid address 0x414c5ff8 (KERNEL32_NULL_THUNK_DATA+0x3930ee6c)
|
||||||
|
0x081a3450 (_mainCRTStartup): movl %fs:0,%eax
|
||||||
|
Wine-dbg>b DumpFile
|
||||||
|
Breakpoint 2 at 0x081a0078 (DumpFile+0x9 [dumpexe.c:2723])
|
||||||
|
Wine-dbg>c
|
||||||
|
Dump File: ./dumpexe.exe
|
||||||
|
Stopped on breakpoint 2 at 0x081a0078 (DumpFile+0x9 [dumpexe.c:2723])
|
||||||
|
Enter path to file dumpexe.c: ../de
|
||||||
|
2723 HANDLE hFile = NULL;
|
||||||
|
0x081a0078 (DumpFile+0x9 [dumpexe.c:2723]): movl $0x0,0xfffffff4(%ebp)
|
||||||
|
Wine-dbg>list
|
||||||
|
2723 HANDLE hFile = NULL;
|
||||||
|
2724 HANDLE hMap = NULL;
|
||||||
|
2725 PSTR lpMap = NULL;
|
||||||
|
2726 DWORD dwFileSize = 0;
|
||||||
|
2727 DWORD dwFileSizeHigh = 0;
|
||||||
|
2728
|
||||||
|
2729 PIMAGE_DOS_HEADER lpImageDOS = NULL;
|
||||||
|
2730 PIMAGE_FILE_HEADER lpImageFile = NULL;
|
||||||
|
2731 PIMAGE_NT_HEADERS lpImageNT = NULL;
|
||||||
|
2732
|
||||||
|
2733 /*
|
||||||
|
Wine-dbg>n 10
|
||||||
|
2747 dwFileSize = GetFileSize(hFile, &dwFileSizeHigh);
|
||||||
|
0x081a00ea (DumpFile+0x7b [dumpexe.c:2747]): leal 0xfffffff0(%ebp),%eax
|
||||||
|
Wine-dbg>n
|
||||||
|
2749 && (GetLastError() != NO_ERROR) )
|
||||||
|
0x081a00fb (DumpFile+0x8c [dumpexe.c:2749]): cmpl $-1,0xffffffe8(%ebp)
|
||||||
|
Wine-dbg>x/d dwFileSize
|
||||||
|
x/d dwFileSize
|
||||||
|
168448
|
||||||
|
Wine-dbg>n
|
||||||
|
2758 PAGE_READONLY, 0, 0, (LPSTR) NULL);
|
||||||
|
0x081a0124 (DumpFile+0xb5 [dumpexe.c:2758]): pushl $0x0
|
||||||
|
Wine-dbg>list 2750
|
||||||
|
list 2750
|
||||||
|
2750 {
|
||||||
|
2751 Fatal("Cannot get size of file %s", lpFileName);
|
||||||
|
2752 }
|
||||||
|
2753
|
||||||
|
2754 /*
|
||||||
|
2755 * map the file
|
||||||
|
2756 */
|
||||||
|
2757 hMap = CreateFileMapping(hFile, (LPSECURITY_ATTRIBUTES) NULL,
|
||||||
|
2758 PAGE_READONLY, 0, 0, (LPSTR) NULL);
|
||||||
|
2759 if( hMap == NULL )
|
||||||
|
2760 {
|
||||||
|
Wine-dbg>n
|
||||||
|
2759 if( hMap == NULL )
|
||||||
|
0x081a013b (DumpFile+0xcc [dumpexe.c:2759]): cmpl $0,0xfffffffc(%ebp)
|
||||||
|
Wine-dbg>x hMap
|
||||||
|
08e48c30
|
||||||
|
Wine-dbg>n
|
||||||
|
2767 lpMap = (LPSTR) MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
|
||||||
|
0x081a0156 (DumpFile+0xe7 [dumpexe.c:2767]): pushl $0x0
|
||||||
|
Wine-dbg>n
|
||||||
|
2768 if( lpMap == NULL )
|
||||||
|
0x081a016b (DumpFile+0xfc [dumpexe.c:2768]): cmpl $0,0xffffffe0(%ebp)
|
||||||
|
Wine-dbg>print lpMap
|
||||||
|
0x414c5f40
|
||||||
|
Wine-dbg>x lpMap
|
||||||
|
40007000
|
||||||
|
Wine-dbg> x/10x 0x40007000
|
||||||
|
x/10x 0x40007000
|
||||||
|
0x40007000 (KERNEL32_NULL_THUNK_DATA+0x37e4fe74): *** Invalid address 0x40007000 (KERNEL32_NULL_THUNK_DATA+0x37e4fe74)
|
||||||
|
Wine-dbg>quit
|
||||||
|
$
|
||||||
|
|
||||||
|
*******************************************************************
|
||||||
|
The first time through, we find that MapViewOfFile isn't mapping the file
|
||||||
|
correctly into the virtual address space. Try running again, and step into
|
||||||
|
MapViewOfFile to figure out what went wrong.
|
||||||
|
*******************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
bash$ ./wine -debug './dumpexe.exe -symbol ./dumpexe.exe'
|
||||||
|
Warning: invalid dir 'e:\test' in path, deleting it.
|
||||||
|
Win32 task 'W32SXXXX': Breakpoint 1 at 0x081a3450
|
||||||
|
Loading symbols from ELF file ./wine...
|
||||||
|
Loading symbols from ELF file /usr/X11R6/lib/libXpm.so.4.6...
|
||||||
|
Loading symbols from ELF file /usr/X11R6/lib/libSM.so.6.0...
|
||||||
|
Loading symbols from ELF file /usr/X11R6/lib/libICE.so.6.0...
|
||||||
|
Loading symbols from ELF file /usr/X11R6/lib/libXext.so.6.0...
|
||||||
|
Loading symbols from ELF file /usr/X11R6/lib/libX11.so.6.0...
|
||||||
|
Loading symbols from ELF file /lib/libm.so.5.0.5...
|
||||||
|
Loading symbols from ELF file /lib/libc.so.5.2.18...
|
||||||
|
Loading symbols from ELF file /lib/ld-linux.so.1...
|
||||||
|
Loading symbols from Win32 file ./dumpexe.exe...
|
||||||
|
Stopped on breakpoint 1 at 0x081a3450 (_mainCRTStartup)
|
||||||
|
In 32 bit mode.
|
||||||
|
*** Invalid address 0x414c5ff8 (KERNEL32_NULL_THUNK_DATA+0x3930ee6c)
|
||||||
|
0x081a3450 (_mainCRTStartup): movl %fs:0,%eax
|
||||||
|
Wine-dbg>b DumpFile:2767
|
||||||
|
Breakpoint 2 at 0x081a0156 (DumpFile+0xe7 [dumpexe.c:2767])
|
||||||
|
Wine-dbg>c
|
||||||
|
Dump File: ./dumpexe.exe
|
||||||
|
Stopped on breakpoint 2 at 0x081a0156 (DumpFile+0xe7 [dumpexe.c:2767])
|
||||||
|
Enter path to file dumpexe.c: ../de
|
||||||
|
2767 lpMap = (LPSTR) MapViewOfFile(hMap, FILE_MAP_READ, 0, 0, 0);
|
||||||
|
0x081a0156 (DumpFile+0xe7 [dumpexe.c:2767]): pushl $0x0
|
||||||
|
Wine-dbg>step
|
||||||
|
390 0385 stdcall MapViewOfFile(long long long long long) MapViewOfFile
|
||||||
|
0x080d793c (KERNEL32_385 [kernel32.spec:390]): pushl %ebp
|
||||||
|
Wine-dbg>step
|
||||||
|
223 if (!debugging_relay) return;
|
||||||
|
0x080c83dc (RELAY_DebugCallFrom32+0xc [relay.c:223]): cmpw $0,0x644a
|
||||||
|
Wine-dbg>
|
||||||
|
244 }
|
||||||
|
0x080c848e (RELAY_DebugCallFrom32+0xbe [relay.c:244]): leal 0xfffffff4(%ebp),%esp
|
||||||
|
Wine-dbg>
|
||||||
|
103 return MapViewOfFileEx(handle,access,offhi,offlo,size,0);
|
||||||
|
0x080911a4 (MapViewOfFile+0x14 [file.c:103]): pushl $0x0
|
||||||
|
Wine-dbg>
|
||||||
|
113 FILEMAP_OBJECT *fmap = (FILEMAP_OBJECT*)handle;
|
||||||
|
0x080911cf (MapViewOfFileEx+0xf [file.c:113]): movl 0x8(%ebp),%esi
|
||||||
|
Wine-dbg>n
|
||||||
|
115 if (!size) size = fmap->size;
|
||||||
|
0x080911d2 (MapViewOfFileEx+0x12 [file.c:115]): testl %ebx,%ebx
|
||||||
|
Wine-dbg>list
|
||||||
|
list
|
||||||
|
115 if (!size) size = fmap->size;
|
||||||
|
116 if (!size) size = 1;
|
||||||
|
117 return mmap ((caddr_t)st, size, fmap->prot,
|
||||||
|
118 MAP_ANON|MAP_PRIVATE,
|
||||||
|
119 FILE_GetUnixHandle(fmap->hfile),
|
||||||
|
120 offlo);
|
||||||
|
121 }
|
||||||
|
122
|
||||||
|
123 /***********************************************************************
|
||||||
|
124 * UnmapViewOfFile (KERNEL32.385)
|
||||||
|
125 */
|
||||||
|
Wine-dbg>x size
|
||||||
|
00000000
|
||||||
|
Wine-dbg>n
|
||||||
|
116 if (!size) size = 1;
|
||||||
|
0x080911d9 (MapViewOfFileEx+0x19 [file.c:116]): testl %ebx,%ebx
|
||||||
|
Wine-dbg>x size
|
||||||
|
00000000
|
||||||
|
Wine-dbg>n
|
||||||
|
117 return mmap ((caddr_t)st, size, fmap->prot,
|
||||||
|
0x080911e2 (MapViewOfFileEx+0x22 [file.c:117]): pushl %eax
|
||||||
|
Wine-dbg>x size
|
||||||
|
00000000
|
||||||
|
Wine-dbg>info local
|
||||||
|
MapViewOfFileEx:handle == 0x08e48c90
|
||||||
|
MapViewOfFileEx:access == 0x00000004
|
||||||
|
MapViewOfFileEx:offhi == 0x00000000
|
||||||
|
MapViewOfFileEx:offlo == 0x00000000
|
||||||
|
MapViewOfFileEx:size == 0x00000000
|
||||||
|
MapViewOfFileEx:st == 0x00000000
|
||||||
|
MapViewOfFileEx:offlo optimized into register $eax
|
||||||
|
MapViewOfFileEx:size optimized into register $ebx
|
||||||
|
MapViewOfFileEx:st optimized into register $edi
|
||||||
|
MapViewOfFileEx:fmap optimized into register $esi
|
||||||
|
Wine-dbg>print $ebx
|
||||||
|
0x0001
|
||||||
|
Wine-dbg>bt
|
||||||
|
bt
|
||||||
|
Backtrace:
|
||||||
|
=>0 0x080911e2 (MapViewOfFileEx+0x22 [file.c:117])
|
||||||
|
1 0x080911b0 (MapViewOfFile+0x20(handle=0x8e48c90, access=0x4, offhi=0x0, offlo=0x0, size=0x0) [file.c:104])
|
||||||
|
2 0x08104ab5 (CallFrom32_stdcall_5+0x25 [callfrom32.s])
|
||||||
|
3 0x081a0168 (DumpFile+0xf9(lpFileName=0x414c61ed) [dumpexe.c:2767])
|
||||||
|
4 0x081a0c35 (main+0x410(argc=0x3, argv=0x414c61cc) [dumpexe.c:3078])
|
||||||
|
5 0x081a3514 (_mainCRTStartup+0xc4)
|
||||||
|
6 0x0810549f (Code_Start+0x13 [callto32.s])
|
||||||
|
7 0x0802fdac (TASK_CallToStart+0x8c [task.c:373])
|
||||||
|
|
||||||
|
Wine-dbg>
|
||||||
|
|
||||||
|
*******************************************************************
|
||||||
|
Notice that you can step through the thunks into our own transfer
|
||||||
|
routines. You will notice that the source line displays as something
|
||||||
|
like:
|
||||||
|
|
||||||
|
390 0385 stdcall MapViewOfFile(long long long long long) MapViewOfFile
|
||||||
|
|
||||||
|
This is just the source line from the spec file that caused the transfer
|
||||||
|
routine to be generated. From this you can step again, and you step
|
||||||
|
into the relay logging code - keep stepping and you eventually step into
|
||||||
|
the actual function that does the dirty work.
|
||||||
|
|
||||||
|
At this point an examination of the source to the Win32 program
|
||||||
|
and an examination of the source to win32/file.s showed where the problem
|
||||||
|
was. When you specify 0 for the size of the object in CreateFileMapping,
|
||||||
|
it is supposed to use the entire size of the file as the size of the
|
||||||
|
object. Instead we were just blindly copying the number over.
|
||||||
|
|
||||||
|
*******************************************************************
|
||||||
|
|
||||||
|
Wine-dbg>b main
|
||||||
|
Breakpoint 1 at 0x080108c0 (main [dbgmain.c:213])
|
||||||
|
Wine-dbg>print breakpoints[1]
|
||||||
|
{addr={type=0x08043000, seg=0, off=134285504}, addrlen=' ', opcode='U', enabled=1, skipcount=0, in_use=1}
|
||||||
|
|
||||||
|
Wine-dbg> print breakpoints[1].enabled
|
||||||
|
1
|
||||||
|
Wine-dbg>set breakpoints[0].enabled = 0
|
||||||
|
Wine-dbg>print breakpoints[0].enabled
|
||||||
|
0
|
||||||
|
|
||||||
|
Wine-dbg>print type_hash_table[1]->type
|
||||||
|
STRUCT
|
||||||
|
|
||||||
|
Wine-dbg>print type_hash_table[1]
|
||||||
|
0x08072020
|
||||||
|
Wine-dbg>print *type_hash_table[1]
|
||||||
|
print *type_hash_table[1]
|
||||||
|
{type=STRUCT, next=0x00000000, name="LOGPALETTE", un={basic={basic_type=8, output_format=" V M", basic_size=-128, b_signed=0}, bitfield={bitoff=8, nbits=0, basetype=0x081d56c0}, pointer={pointsto=0x00000008}, funct={rettype=0x00000008}, array={start=8, end=136140480, basictype=0x08043e80}, structure={size=8, members=0x081d56c0}, enumeration={members=0x00000008}}}
|
||||||
|
Wine-dbg>
|
||||||
|
|
||||||
|
*******************************************************************
|
||||||
|
|
||||||
|
This example shows how you can print out various data structures.
|
||||||
|
Note that enumerated types are displayed in the symbolic form, and strings
|
||||||
|
are displayed in the expected manner.
|
||||||
|
|
||||||
|
You can use the set command to set more or less anything. Note
|
||||||
|
however that you cannot use enumerated types on the RHS of the expression.
|
||||||
|
|
||||||
|
Finally, type casts are not yet supported in the expression
|
||||||
|
handling. There is sufficient information stored internally to be
|
||||||
|
able to handle this - the main challenge is that the parser would
|
||||||
|
need to be fixed to correctly parse the type cast.
|
||||||
|
|
||||||
|
*******************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
Wine-dbg>list
|
||||||
|
2986 if( argc <= 1 )
|
||||||
|
2987 {
|
||||||
|
2988 Usage(argv[0]);
|
||||||
|
2989 }
|
||||||
|
2990
|
||||||
|
2991 for( i = 1; i < argc; i++ )
|
||||||
|
2992 {
|
||||||
|
2993 if( strncmp(argv[i], "-dos", sizeof("-dos") - 1) == 0 )
|
||||||
|
2994 {
|
||||||
|
2995 DmpCtrl.bDumpDOSHeader = TRUE;
|
||||||
|
2996 }
|
||||||
|
Wine-dbg>b 2993
|
||||||
|
Breakpoint 3 at 0x081a8861 (main+0x3c [dumpexe.c:2993])
|
||||||
|
Wine-dbg>condition 3 i == 2
|
||||||
|
Wine-dbg>c
|
||||||
|
Stopped on breakpoint 3 at 0x081a8861 (main+0x3c [dumpexe.c:2993])
|
||||||
|
2993 if( strncmp(argv[i], "-dos", sizeof("-dos") - 1) == 0 )
|
||||||
|
0x081a8861 (main+0x3c [dumpexe.c:2993]): pushl $0x4
|
||||||
|
Wine-dbg>print i
|
||||||
|
2
|
||||||
|
Wine-dbg>print argv[i]
|
||||||
|
"./dumpexe.exe"
|
||||||
|
|
||||||
|
*******************************************************************
|
||||||
|
|
||||||
|
This example shows how to use conditional breakpoints.
|
||||||
|
Here is another one that demonstrates another cool feature
|
||||||
|
conditional breakpoints that involve a function call:
|
||||||
|
|
||||||
|
condition 3 strcmp(argv[i], "./dumpexe.exe") == 0
|
||||||
|
|
||||||
|
*******************************************************************
|
||||||
|
|
||||||
|
|
||||||
|
Wine-dbg>list
|
||||||
|
2986 if( argc <= 1 )
|
||||||
|
2987 {
|
||||||
|
2988 Usage(argv[0]);
|
||||||
|
2989 }
|
||||||
|
2990
|
||||||
|
2991 for( i = 1; i < argc; i++ )
|
||||||
|
2992 {
|
||||||
|
2993 if( strncmp(argv[i], "-dos", sizeof("-dos") - 1) == 0 )
|
||||||
|
2994 {
|
||||||
|
2995 DmpCtrl.bDumpDOSHeader = TRUE;
|
||||||
|
2996 }
|
||||||
|
Wine-dbg>b 2993
|
||||||
|
Breakpoint 3 at 0x081a8861 (main+0x3c [dumpexe.c:2993])
|
||||||
|
Wine-dbg>condition 3 strcmp(argv[i], "./dumpexe.exe") == 0
|
||||||
|
Wine-dbg>info break
|
||||||
|
Breakpoints:
|
||||||
|
1: y 0x081ab450 (_mainCRTStartup)
|
||||||
|
2: y 0x081a882e (main+0x9 [dumpexe.c:2986])
|
||||||
|
3: y 0x081a8861 (main+0x3c [dumpexe.c:2993])
|
||||||
|
stop when ( strcmp(( argv[i] ), "./dumpexe.exe") == 0 )
|
||||||
|
Wine-dbg>c
|
||||||
|
Stopped on breakpoint 3 at 0x081a8861 (main+0x3c [dumpexe.c:2993])
|
||||||
|
2993 if( strncmp(argv[i], "-dos", sizeof("-dos") - 1) == 0 )
|
||||||
|
0x081a8861 (main+0x3c [dumpexe.c:2993]): pushl $0x4
|
||||||
|
Wine-dbg>print i
|
||||||
|
2
|
||||||
|
Wine-dbg>print argv[i]
|
||||||
|
"./dumpexe.exe"
|
||||||
|
Wine-dbg>
|
||||||
|
|
|
@ -3,28 +3,42 @@ way or another. No commitment to actually do these, but these sound
|
||||||
possible to me right now. In no particular order. If someone else
|
possible to me right now. In no particular order. If someone else
|
||||||
wants to dig in, feel free.
|
wants to dig in, feel free.
|
||||||
|
|
||||||
1) Some kind of crude display capability. Not too hard, I guess.
|
1) Some kind of watchpoint capability. Pretty easy once we have a
|
||||||
Just keep a list of addresses, counts and formats that we
|
|
||||||
want displayed each time we enter the debugger.
|
|
||||||
|
|
||||||
2) Some kind of single step capability.
|
|
||||||
I am not sure - I think you just set a flag
|
|
||||||
in AFLAGS, and you get an interrupt back again.
|
|
||||||
The signal type would proabably be different, however,
|
|
||||||
but Wine could easily be patched to accept this one as well.
|
|
||||||
The main problem with this is that gdb normally runs in a
|
|
||||||
separate process so it is easy to single step second process.
|
|
||||||
Here we are all part of the same process. Perhaps we could look
|
|
||||||
ahead to the end of the instruction and set another breakpoint?
|
|
||||||
|
|
||||||
3) Some kind of breakpoint capability.
|
|
||||||
Requires single step. When we restart, we
|
|
||||||
remove the breakpoint, single step one instruction
|
|
||||||
replace the breakpoint, and then continue.
|
|
||||||
|
|
||||||
4) Some kind of watchpoint capability. Pretty easy once we have a
|
|
||||||
single step capability, but we end up running the program
|
single step capability, but we end up running the program
|
||||||
really slowly one instruction at a time.
|
really slowly one instruction at a time. Use hardware debug
|
||||||
|
registers for this???
|
||||||
|
|
||||||
5) Some kind of .wdbinit file.
|
2) Some kind of .wdbinit file.
|
||||||
|
|
||||||
|
3) Add 'info line' command. Not all *that* useful, but it would tell you
|
||||||
|
the range of PC for a given source line.
|
||||||
|
|
||||||
|
4) Add search directory list for PDB files. We have the path in the
|
||||||
|
DOS notation (i.e. C:\foo\bar\xxx.c), which may be a useful hint.
|
||||||
|
Maybe not.
|
||||||
|
|
||||||
|
5) Add support for emacs mode so that you can run under emacs and have
|
||||||
|
the source pop up automatically. Only useful once the list command
|
||||||
|
is implemented.
|
||||||
|
|
||||||
|
6 Add support for Borland. I have heard rumors that Borland is forthcoming
|
||||||
|
with info about how their stuff works, so this might not be that
|
||||||
|
bad.
|
||||||
|
|
||||||
|
7 Add support for Win16. Not sure if this is really worth the trouble. How
|
||||||
|
much are people really going to use this in the long run???
|
||||||
|
|
||||||
|
8) Some of the newer displays are still a little bit sparse on information.
|
||||||
|
Make these more like gdb.
|
||||||
|
|
||||||
|
9) Don't bother to disassemble an instruction when we stop at a breakpoint
|
||||||
|
and if we have a valid source line we are displaying.
|
||||||
|
|
||||||
|
10) Add support for '/i', etc in display command. Make sure 'display/i $eip'
|
||||||
|
does the correct thing, and then skip automatic disassembly completely.
|
||||||
|
|
||||||
|
11) Limit amount of information displayed with print command.
|
||||||
|
|
||||||
|
12) Make sure operator precedence works OK.
|
||||||
|
|
||||||
|
****************
|
||||||
|
|
274
debugger/break.c
274
debugger/break.c
|
@ -14,15 +14,17 @@
|
||||||
|
|
||||||
#define INT3 0xcc /* int 3 opcode */
|
#define INT3 0xcc /* int 3 opcode */
|
||||||
|
|
||||||
#define MAX_BREAKPOINTS 25
|
#define MAX_BREAKPOINTS 100
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
DBG_ADDR addr;
|
DBG_ADDR addr;
|
||||||
BYTE addrlen;
|
BYTE addrlen;
|
||||||
BYTE opcode;
|
BYTE opcode;
|
||||||
BOOL16 enabled;
|
BOOL16 enabled;
|
||||||
BOOL16 in_use;
|
WORD skipcount;
|
||||||
|
BOOL16 in_use;
|
||||||
|
struct expr * condition;
|
||||||
} BREAKPOINT;
|
} BREAKPOINT;
|
||||||
|
|
||||||
static BREAKPOINT breakpoints[MAX_BREAKPOINTS];
|
static BREAKPOINT breakpoints[MAX_BREAKPOINTS];
|
||||||
|
@ -65,7 +67,7 @@ static void DEBUG_SetOpcode( const DBG_ADDR *addr, BYTE op )
|
||||||
* Determine if the instruction at CS:EIP is an instruction that
|
* Determine if the instruction at CS:EIP is an instruction that
|
||||||
* we need to step over (like a call or a repetitive string move).
|
* we need to step over (like a call or a repetitive string move).
|
||||||
*/
|
*/
|
||||||
static BOOL32 DEBUG_IsStepOverInstr(void)
|
static BOOL32 DEBUG_IsStepOverInstr()
|
||||||
{
|
{
|
||||||
BYTE *instr = (BYTE *)PTR_SEG_OFF_TO_LIN( CS_reg(&DEBUG_context),
|
BYTE *instr = (BYTE *)PTR_SEG_OFF_TO_LIN( CS_reg(&DEBUG_context),
|
||||||
EIP_reg(&DEBUG_context) );
|
EIP_reg(&DEBUG_context) );
|
||||||
|
@ -125,6 +127,31 @@ static BOOL32 DEBUG_IsStepOverInstr(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* DEBUG_IsFctReturn
|
||||||
|
*
|
||||||
|
* Determine if the instruction at CS:EIP is an instruction that
|
||||||
|
* is a function return.
|
||||||
|
*/
|
||||||
|
BOOL32 DEBUG_IsFctReturn(void)
|
||||||
|
{
|
||||||
|
BYTE *instr = (BYTE *)PTR_SEG_OFF_TO_LIN( CS_reg(&DEBUG_context),
|
||||||
|
EIP_reg(&DEBUG_context) );
|
||||||
|
|
||||||
|
for (;;)
|
||||||
|
{
|
||||||
|
switch(*instr)
|
||||||
|
{
|
||||||
|
case 0xc2:
|
||||||
|
case 0xc3:
|
||||||
|
return TRUE;
|
||||||
|
default:
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DEBUG_SetBreakpoints
|
* DEBUG_SetBreakpoints
|
||||||
*
|
*
|
||||||
|
@ -205,6 +232,7 @@ void DEBUG_AddBreakpoint( const DBG_ADDR *address )
|
||||||
breakpoints[num].opcode = *p;
|
breakpoints[num].opcode = *p;
|
||||||
breakpoints[num].enabled = TRUE;
|
breakpoints[num].enabled = TRUE;
|
||||||
breakpoints[num].in_use = TRUE;
|
breakpoints[num].in_use = TRUE;
|
||||||
|
breakpoints[num].skipcount = 0;
|
||||||
fprintf( stderr, "Breakpoint %d at ", num );
|
fprintf( stderr, "Breakpoint %d at ", num );
|
||||||
DEBUG_PrintAddress( &breakpoints[num].addr, breakpoints[num].addrlen,
|
DEBUG_PrintAddress( &breakpoints[num].addr, breakpoints[num].addrlen,
|
||||||
TRUE );
|
TRUE );
|
||||||
|
@ -226,6 +254,7 @@ void DEBUG_DelBreakpoint( int num )
|
||||||
}
|
}
|
||||||
breakpoints[num].enabled = FALSE;
|
breakpoints[num].enabled = FALSE;
|
||||||
breakpoints[num].in_use = FALSE;
|
breakpoints[num].in_use = FALSE;
|
||||||
|
breakpoints[num].skipcount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -242,6 +271,7 @@ void DEBUG_EnableBreakpoint( int num, BOOL32 enable )
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
breakpoints[num].enabled = enable;
|
breakpoints[num].enabled = enable;
|
||||||
|
breakpoints[num].skipcount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -263,6 +293,12 @@ void DEBUG_InfoBreakpoints(void)
|
||||||
DEBUG_PrintAddress( &breakpoints[i].addr, breakpoints[i].addrlen,
|
DEBUG_PrintAddress( &breakpoints[i].addr, breakpoints[i].addrlen,
|
||||||
TRUE);
|
TRUE);
|
||||||
fprintf( stderr, "\n" );
|
fprintf( stderr, "\n" );
|
||||||
|
if( breakpoints[i].condition != NULL )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "\t\tstop when ");
|
||||||
|
DEBUG_DisplayExpr(breakpoints[i].condition);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -274,10 +310,12 @@ void DEBUG_InfoBreakpoints(void)
|
||||||
* Determine if we should continue execution after a SIGTRAP signal when
|
* Determine if we should continue execution after a SIGTRAP signal when
|
||||||
* executing in the given mode.
|
* executing in the given mode.
|
||||||
*/
|
*/
|
||||||
BOOL32 DEBUG_ShouldContinue( enum exec_mode mode )
|
BOOL32 DEBUG_ShouldContinue( enum exec_mode mode, int * count )
|
||||||
{
|
{
|
||||||
DBG_ADDR addr;
|
DBG_ADDR addr;
|
||||||
|
DBG_ADDR cond_addr;
|
||||||
int bpnum;
|
int bpnum;
|
||||||
|
struct list_id list;
|
||||||
|
|
||||||
/* If not single-stepping, back up over the int3 instruction */
|
/* If not single-stepping, back up over the int3 instruction */
|
||||||
if (!(EFL_reg(&DEBUG_context) & STEP_FLAG)) EIP_reg(&DEBUG_context)--;
|
if (!(EFL_reg(&DEBUG_context) & STEP_FLAG)) EIP_reg(&DEBUG_context)--;
|
||||||
|
@ -291,20 +329,98 @@ BOOL32 DEBUG_ShouldContinue( enum exec_mode mode )
|
||||||
|
|
||||||
if ((bpnum != 0) && (bpnum != -1))
|
if ((bpnum != 0) && (bpnum != -1))
|
||||||
{
|
{
|
||||||
|
if( breakpoints[bpnum].condition != NULL )
|
||||||
|
{
|
||||||
|
cond_addr = DEBUG_EvalExpr(breakpoints[bpnum].condition);
|
||||||
|
if( cond_addr.type == NULL )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Something wrong - unable to evaluate this expression.
|
||||||
|
*/
|
||||||
|
fprintf(stderr, "Unable to evaluate expression ");
|
||||||
|
DEBUG_DisplayExpr(breakpoints[bpnum].condition);
|
||||||
|
fprintf(stderr, "\nTurning off condition\n");
|
||||||
|
DEBUG_AddBPCondition(bpnum, NULL);
|
||||||
|
}
|
||||||
|
else if( ! DEBUG_GetExprValue( &cond_addr, NULL) )
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( breakpoints[bpnum].skipcount > 0 )
|
||||||
|
{
|
||||||
|
breakpoints[bpnum].skipcount--;
|
||||||
|
if( breakpoints[bpnum].skipcount > 0 )
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
fprintf( stderr, "Stopped on breakpoint %d at ", bpnum );
|
fprintf( stderr, "Stopped on breakpoint %d at ", bpnum );
|
||||||
DEBUG_PrintAddress( &breakpoints[bpnum].addr,
|
DEBUG_PrintAddress( &breakpoints[bpnum].addr,
|
||||||
breakpoints[bpnum].addrlen, TRUE );
|
breakpoints[bpnum].addrlen, TRUE );
|
||||||
fprintf( stderr, "\n" );
|
fprintf( stderr, "\n" );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* See if there is a source file for this bp. If so,
|
||||||
|
* then dig it out and display one line.
|
||||||
|
*/
|
||||||
|
DEBUG_FindNearestSymbol( &addr, TRUE, NULL, 0, &list);
|
||||||
|
if( list.sourcefile != NULL )
|
||||||
|
{
|
||||||
|
DEBUG_List(&list, NULL, 0);
|
||||||
|
}
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If our mode indicates that we are stepping line numbers,
|
||||||
|
* get the current function, and figure out if we are exactly
|
||||||
|
* on a line number or not.
|
||||||
|
*/
|
||||||
|
if( mode == EXEC_STEP_OVER
|
||||||
|
|| mode == EXEC_STEP_INSTR )
|
||||||
|
{
|
||||||
|
if( DEBUG_CheckLinenoStatus(&addr) == AT_LINENUMBER )
|
||||||
|
{
|
||||||
|
(*count)--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( mode == EXEC_STEPI_OVER
|
||||||
|
|| mode == EXEC_STEPI_INSTR )
|
||||||
|
|
||||||
|
{
|
||||||
|
(*count)--;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( *count > 0 || mode == EXEC_FINISH )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* We still need to execute more instructions.
|
||||||
|
*/
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If we are about to stop, then print out the source line if we
|
||||||
|
* have it.
|
||||||
|
*/
|
||||||
|
if( (mode != EXEC_CONT && mode != EXEC_FINISH) )
|
||||||
|
{
|
||||||
|
DEBUG_FindNearestSymbol( &addr, TRUE, NULL, 0, &list);
|
||||||
|
if( list.sourcefile != NULL )
|
||||||
|
{
|
||||||
|
DEBUG_List(&list, NULL, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* If there's no breakpoint and we are not single-stepping, then we */
|
/* If there's no breakpoint and we are not single-stepping, then we */
|
||||||
/* must have encountered an int3 in the Windows program; let's skip it. */
|
/* must have encountered an int3 in the Windows program; let's skip it. */
|
||||||
if ((bpnum == -1) && !(EFL_reg(&DEBUG_context) & STEP_FLAG))
|
if ((bpnum == -1) && !(EFL_reg(&DEBUG_context) & STEP_FLAG))
|
||||||
EIP_reg(&DEBUG_context)++;
|
EIP_reg(&DEBUG_context)++;
|
||||||
|
|
||||||
/* no breakpoint, continue if in continuous mode */
|
/* no breakpoint, continue if in continuous mode */
|
||||||
return (mode == EXEC_CONT);
|
return (mode == EXEC_CONT || mode == EXEC_FINISH);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -314,16 +430,102 @@ BOOL32 DEBUG_ShouldContinue( enum exec_mode mode )
|
||||||
* Set the breakpoints to the correct state to restart execution
|
* Set the breakpoints to the correct state to restart execution
|
||||||
* in the given mode.
|
* in the given mode.
|
||||||
*/
|
*/
|
||||||
void DEBUG_RestartExecution( enum exec_mode mode, int instr_len )
|
enum exec_mode DEBUG_RestartExecution( enum exec_mode mode, int count )
|
||||||
{
|
{
|
||||||
DBG_ADDR addr;
|
DBG_ADDR addr;
|
||||||
|
DBG_ADDR addr2;
|
||||||
|
int bp;
|
||||||
|
int delta;
|
||||||
|
int status;
|
||||||
|
unsigned int * value;
|
||||||
|
enum exec_mode ret_mode;
|
||||||
|
BYTE *instr;
|
||||||
|
|
||||||
addr.seg = (CS_reg(&DEBUG_context) == WINE_CODE_SELECTOR) ?
|
addr.seg = (CS_reg(&DEBUG_context) == WINE_CODE_SELECTOR) ?
|
||||||
0 : CS_reg(&DEBUG_context);
|
0 : CS_reg(&DEBUG_context);
|
||||||
addr.off = EIP_reg(&DEBUG_context);
|
addr.off = EIP_reg(&DEBUG_context);
|
||||||
|
|
||||||
if (DEBUG_FindBreakpoint( &addr ) != -1)
|
/*
|
||||||
mode = EXEC_STEP_INSTR; /* If there's a breakpoint, skip it */
|
* This is the mode we will be running in after we finish. We would like
|
||||||
|
* to be able to modify this in certain cases.
|
||||||
|
*/
|
||||||
|
ret_mode = mode;
|
||||||
|
|
||||||
|
bp = DEBUG_FindBreakpoint( &addr );
|
||||||
|
if ( bp != -1 && bp != 0)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* If we have set a new value, then save it in the BP number.
|
||||||
|
*/
|
||||||
|
if( count != 0 && mode == EXEC_CONT )
|
||||||
|
{
|
||||||
|
breakpoints[bp].skipcount = count;
|
||||||
|
}
|
||||||
|
mode = EXEC_STEPI_INSTR; /* If there's a breakpoint, skip it */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if( mode == EXEC_CONT && count > 1 )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"Not stopped at any breakpoint; argument ignored.\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( mode == EXEC_FINISH && DEBUG_IsFctReturn() )
|
||||||
|
{
|
||||||
|
mode = ret_mode = EXEC_STEPI_INSTR;
|
||||||
|
}
|
||||||
|
|
||||||
|
instr = (BYTE *)PTR_SEG_OFF_TO_LIN( CS_reg(&DEBUG_context),
|
||||||
|
EIP_reg(&DEBUG_context) );
|
||||||
|
/*
|
||||||
|
* See if the function we are stepping into has debug info
|
||||||
|
* and line numbers. If not, then we step over it instead.
|
||||||
|
* FIXME - we need to check for things like thunks or trampolines,
|
||||||
|
* as the actual function may in fact have debug info.
|
||||||
|
*/
|
||||||
|
if( *instr == 0xe8 )
|
||||||
|
{
|
||||||
|
delta = *(unsigned int*) (instr + 1);
|
||||||
|
addr2 = addr;
|
||||||
|
DEBUG_Disasm(&addr2, FALSE);
|
||||||
|
addr2.off += delta;
|
||||||
|
|
||||||
|
status = DEBUG_CheckLinenoStatus(&addr2);
|
||||||
|
/*
|
||||||
|
* Anytime we have a trampoline, step over it.
|
||||||
|
*/
|
||||||
|
if( ((mode == EXEC_STEP_OVER) || (mode == EXEC_STEPI_OVER))
|
||||||
|
&& status == FUNC_IS_TRAMPOLINE )
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
fprintf(stderr, "Not stepping into trampoline at %x (no lines)\n",
|
||||||
|
addr2.off);
|
||||||
|
#endif
|
||||||
|
mode = EXEC_STEP_OVER_TRAMPOLINE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( mode == EXEC_STEP_INSTR && status == FUNC_HAS_NO_LINES )
|
||||||
|
{
|
||||||
|
#if 0
|
||||||
|
fprintf(stderr, "Not stepping into function at %x (no lines)\n",
|
||||||
|
addr2.off);
|
||||||
|
#endif
|
||||||
|
mode = EXEC_STEP_OVER;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if( mode == EXEC_STEP_INSTR )
|
||||||
|
{
|
||||||
|
if( DEBUG_CheckLinenoStatus(&addr) == FUNC_HAS_NO_LINES )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Single stepping until exit from function, \n");
|
||||||
|
fprintf(stderr, "which has no line number information.\n");
|
||||||
|
|
||||||
|
ret_mode = mode = EXEC_FINISH;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
switch(mode)
|
switch(mode)
|
||||||
{
|
{
|
||||||
|
@ -332,14 +534,35 @@ void DEBUG_RestartExecution( enum exec_mode mode, int instr_len )
|
||||||
DEBUG_SetBreakpoints( TRUE );
|
DEBUG_SetBreakpoints( TRUE );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case EXEC_STEP_OVER_TRAMPOLINE:
|
||||||
|
/*
|
||||||
|
* This is the means by which we step over our conversion stubs
|
||||||
|
* in callfrom*.s and callto*.s. We dig the appropriate address
|
||||||
|
* off the stack, and we set the breakpoint there instead of the
|
||||||
|
* address just after the call.
|
||||||
|
*/
|
||||||
|
value = (unsigned int *) ESP_reg(&DEBUG_context) + 2;
|
||||||
|
addr.off = *value;
|
||||||
|
EFL_reg(&DEBUG_context) &= ~STEP_FLAG;
|
||||||
|
breakpoints[0].addr = addr;
|
||||||
|
breakpoints[0].enabled = TRUE;
|
||||||
|
breakpoints[0].in_use = TRUE;
|
||||||
|
breakpoints[0].skipcount = 0;
|
||||||
|
breakpoints[0].opcode = *(BYTE *)DBG_ADDR_TO_LIN( &addr );
|
||||||
|
DEBUG_SetBreakpoints( TRUE );
|
||||||
|
break;
|
||||||
|
|
||||||
|
case EXEC_FINISH:
|
||||||
|
case EXEC_STEPI_OVER: /* Stepping over a call */
|
||||||
case EXEC_STEP_OVER: /* Stepping over a call */
|
case EXEC_STEP_OVER: /* Stepping over a call */
|
||||||
if (DEBUG_IsStepOverInstr())
|
if (DEBUG_IsStepOverInstr())
|
||||||
{
|
{
|
||||||
EFL_reg(&DEBUG_context) &= ~STEP_FLAG;
|
EFL_reg(&DEBUG_context) &= ~STEP_FLAG;
|
||||||
addr.off += instr_len;
|
DEBUG_Disasm(&addr, FALSE);
|
||||||
breakpoints[0].addr = addr;
|
breakpoints[0].addr = addr;
|
||||||
breakpoints[0].enabled = TRUE;
|
breakpoints[0].enabled = TRUE;
|
||||||
breakpoints[0].in_use = TRUE;
|
breakpoints[0].in_use = TRUE;
|
||||||
|
breakpoints[0].skipcount = 0;
|
||||||
breakpoints[0].opcode = *(BYTE *)DBG_ADDR_TO_LIN( &addr );
|
breakpoints[0].opcode = *(BYTE *)DBG_ADDR_TO_LIN( &addr );
|
||||||
DEBUG_SetBreakpoints( TRUE );
|
DEBUG_SetBreakpoints( TRUE );
|
||||||
break;
|
break;
|
||||||
|
@ -347,7 +570,32 @@ void DEBUG_RestartExecution( enum exec_mode mode, int instr_len )
|
||||||
/* else fall through to single-stepping */
|
/* else fall through to single-stepping */
|
||||||
|
|
||||||
case EXEC_STEP_INSTR: /* Single-stepping an instruction */
|
case EXEC_STEP_INSTR: /* Single-stepping an instruction */
|
||||||
|
case EXEC_STEPI_INSTR: /* Single-stepping an instruction */
|
||||||
EFL_reg(&DEBUG_context) |= STEP_FLAG;
|
EFL_reg(&DEBUG_context) |= STEP_FLAG;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
return ret_mode;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DEBUG_AddBPCondition(int num, struct expr * exp)
|
||||||
|
{
|
||||||
|
if ((num <= 0) || (num >= next_bp) || !breakpoints[num].in_use)
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Invalid breakpoint number %d\n", num );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( breakpoints[num].condition != NULL )
|
||||||
|
{
|
||||||
|
DEBUG_FreeExpr(breakpoints[num].condition);
|
||||||
|
breakpoints[num].condition = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( exp != NULL )
|
||||||
|
{
|
||||||
|
breakpoints[num].condition = DEBUG_CloneExpr(exp);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -71,6 +71,13 @@
|
||||||
*/
|
*/
|
||||||
static BOOL32 db_disasm_16 = FALSE;
|
static BOOL32 db_disasm_16 = FALSE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Flag to indicate whether we need to display instruction,
|
||||||
|
* or whether we just need to know the address of the next
|
||||||
|
* instruction.
|
||||||
|
*/
|
||||||
|
static BOOL32 db_display = FALSE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Size attributes
|
* Size attributes
|
||||||
*/
|
*/
|
||||||
|
@ -1009,7 +1016,7 @@ static void db_task_printsym(unsigned int addr, int size)
|
||||||
break;
|
break;
|
||||||
case LONG:
|
case LONG:
|
||||||
{
|
{
|
||||||
DBG_ADDR address = { 0, addr };
|
DBG_ADDR address = { NULL, 0, addr };
|
||||||
DEBUG_PrintAddress( &address, db_disasm_16 ? 16 : 32, TRUE );
|
DEBUG_PrintAddress( &address, db_disasm_16 ? 16 : 32, TRUE );
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -1057,6 +1064,11 @@ void db_disasm_esc( DBG_ADDR *addr, int inst, int short_addr,
|
||||||
const char * name;
|
const char * name;
|
||||||
|
|
||||||
get_value_inc(regmodrm, addr, 1, FALSE);
|
get_value_inc(regmodrm, addr, 1, FALSE);
|
||||||
|
if( !db_display )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
fp = &db_Esc_inst[inst - 0xd8][f_reg(regmodrm)];
|
fp = &db_Esc_inst[inst - 0xd8][f_reg(regmodrm)];
|
||||||
mod = f_mod(regmodrm);
|
mod = f_mod(regmodrm);
|
||||||
if (mod != 3) {
|
if (mod != 3) {
|
||||||
|
@ -1128,7 +1140,7 @@ void db_disasm_esc( DBG_ADDR *addr, int inst, int short_addr,
|
||||||
* Disassemble instruction at 'addr'. addr is changed to point to the
|
* Disassemble instruction at 'addr'. addr is changed to point to the
|
||||||
* start of the next instruction.
|
* start of the next instruction.
|
||||||
*/
|
*/
|
||||||
void DEBUG_Disasm( DBG_ADDR *addr )
|
void DEBUG_Disasm( DBG_ADDR *addr, int display )
|
||||||
{
|
{
|
||||||
int inst;
|
int inst;
|
||||||
int size;
|
int size;
|
||||||
|
@ -1146,6 +1158,11 @@ void DEBUG_Disasm( DBG_ADDR *addr )
|
||||||
int len;
|
int len;
|
||||||
struct i_addr address;
|
struct i_addr address;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set this so we get can supress the printout if we need to.
|
||||||
|
*/
|
||||||
|
db_display = display;
|
||||||
|
|
||||||
if (!addr->seg) db_disasm_16 = FALSE;
|
if (!addr->seg) db_disasm_16 = FALSE;
|
||||||
else db_disasm_16 = !(GET_SEL_FLAGS(addr->seg) & LDT_FLAGS_32BIT);
|
else db_disasm_16 = !(GET_SEL_FLAGS(addr->seg) & LDT_FLAGS_32BIT);
|
||||||
|
|
||||||
|
@ -1263,145 +1280,242 @@ void DEBUG_Disasm( DBG_ADDR *addr )
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i_size == SDEP) {
|
if (i_size == SDEP) {
|
||||||
if (size == WORD)
|
if( db_display )
|
||||||
|
{
|
||||||
|
if (size == WORD)
|
||||||
fprintf(stderr,i_name);
|
fprintf(stderr,i_name);
|
||||||
else
|
else
|
||||||
fprintf(stderr,ip->i_extra);
|
fprintf(stderr,ip->i_extra);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
fprintf(stderr,i_name);
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,i_name);
|
||||||
|
}
|
||||||
if (i_size != NONE) {
|
if (i_size != NONE) {
|
||||||
if (i_size == BYTE) {
|
if (i_size == BYTE) {
|
||||||
fprintf(stderr,"b");
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"b");
|
||||||
|
}
|
||||||
size = BYTE;
|
size = BYTE;
|
||||||
}
|
}
|
||||||
else if (i_size == WORD) {
|
else if (i_size == WORD) {
|
||||||
fprintf(stderr,"w");
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"w");
|
||||||
|
}
|
||||||
size = WORD;
|
size = WORD;
|
||||||
}
|
}
|
||||||
else if (size == WORD)
|
else if (size == WORD)
|
||||||
fprintf(stderr,"w");
|
{
|
||||||
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"w");
|
||||||
|
}
|
||||||
|
}
|
||||||
else
|
else
|
||||||
fprintf(stderr,"l");
|
{
|
||||||
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"l");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fprintf(stderr,"\t");
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"\t");
|
||||||
|
}
|
||||||
for (first = TRUE;
|
for (first = TRUE;
|
||||||
i_mode != 0;
|
i_mode != 0;
|
||||||
i_mode >>= 8, first = FALSE)
|
i_mode >>= 8, first = FALSE)
|
||||||
{
|
{
|
||||||
if (!first)
|
if (!first && db_display)
|
||||||
fprintf(stderr,",");
|
fprintf(stderr,",");
|
||||||
|
|
||||||
switch (i_mode & 0xFF) {
|
switch (i_mode & 0xFF) {
|
||||||
|
|
||||||
case E:
|
case E:
|
||||||
db_print_address(seg, size, &address);
|
if( db_display )
|
||||||
|
{
|
||||||
|
db_print_address(seg, size, &address);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Eind:
|
case Eind:
|
||||||
fprintf(stderr,"*");
|
if( db_display )
|
||||||
db_print_address(seg, size, &address);
|
{
|
||||||
|
fprintf(stderr,"*");
|
||||||
|
db_print_address(seg, size, &address);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Ew:
|
case Ew:
|
||||||
db_print_address(seg, WORD, &address);
|
if( db_display )
|
||||||
|
{
|
||||||
|
db_print_address(seg, WORD, &address);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Eb:
|
case Eb:
|
||||||
db_print_address(seg, BYTE, &address);
|
if( db_display )
|
||||||
|
{
|
||||||
|
db_print_address(seg, BYTE, &address);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case R:
|
case R:
|
||||||
fprintf(stderr,"%s", db_reg[size][f_reg(regmodrm)]);
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%s", db_reg[size][f_reg(regmodrm)]);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Rw:
|
case Rw:
|
||||||
fprintf(stderr,"%s", db_reg[WORD][f_reg(regmodrm)]);
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%s", db_reg[WORD][f_reg(regmodrm)]);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Ri:
|
case Ri:
|
||||||
fprintf(stderr,"%s", db_reg[size][f_rm(inst)]);
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%s", db_reg[size][f_rm(inst)]);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S:
|
case S:
|
||||||
fprintf(stderr,"%s", db_seg_reg[f_reg(regmodrm)]);
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%s", db_seg_reg[f_reg(regmodrm)]);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Si:
|
case Si:
|
||||||
fprintf(stderr,"%s", db_seg_reg[f_reg(inst)]);
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%s", db_seg_reg[f_reg(inst)]);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case A:
|
case A:
|
||||||
fprintf(stderr,"%s", db_reg[size][0]); /* acc */
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%s", db_reg[size][0]); /* acc */
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case BX:
|
case BX:
|
||||||
if (seg)
|
if( db_display )
|
||||||
|
{
|
||||||
|
if (seg)
|
||||||
fprintf(stderr,"%s:", seg);
|
fprintf(stderr,"%s:", seg);
|
||||||
fprintf(stderr,"(%s)", short_addr ? "%bx" : "%ebx");
|
fprintf(stderr,"(%s)", short_addr ? "%bx" : "%ebx");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CL:
|
case CL:
|
||||||
fprintf(stderr,"%%cl");
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%%cl");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DX:
|
case DX:
|
||||||
fprintf(stderr,"%%dx");
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%%dx");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case SI:
|
case SI:
|
||||||
if (seg)
|
if( db_display )
|
||||||
|
{
|
||||||
|
if (seg)
|
||||||
fprintf(stderr,"%s:", seg);
|
fprintf(stderr,"%s:", seg);
|
||||||
fprintf(stderr,"(%s)", short_addr ? "%si" : "%esi");
|
fprintf(stderr,"(%s)", short_addr ? "%si" : "%esi");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DI:
|
case DI:
|
||||||
fprintf(stderr,"%%es:(%s)", short_addr ? "%di" : "%edi");
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%%es:(%s)", short_addr ? "%di" : "%edi");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case CR:
|
case CR:
|
||||||
fprintf(stderr,"%%cr%d", f_reg(regmodrm));
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%%cr%d", f_reg(regmodrm));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case DR:
|
case DR:
|
||||||
fprintf(stderr,"%%dr%d", f_reg(regmodrm));
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%%dr%d", f_reg(regmodrm));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case TR:
|
case TR:
|
||||||
fprintf(stderr,"%%tr%d", f_reg(regmodrm));
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"%%tr%d", f_reg(regmodrm));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case I:
|
case I:
|
||||||
len = db_lengths[size];
|
len = db_lengths[size];
|
||||||
get_value_inc(imm, addr, len, FALSE);/* unsigned */
|
get_value_inc(imm, addr, len, FALSE);/* unsigned */
|
||||||
fprintf(stderr,"$0x%x", imm);
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"$0x%x", imm);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Is:
|
case Is:
|
||||||
len = db_lengths[size];
|
len = db_lengths[size];
|
||||||
get_value_inc(imm, addr, len, TRUE); /* signed */
|
get_value_inc(imm, addr, len, TRUE); /* signed */
|
||||||
fprintf(stderr,"$%d", imm);
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"$%d", imm);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Ib:
|
case Ib:
|
||||||
get_value_inc(imm, addr, 1, FALSE); /* unsigned */
|
get_value_inc(imm, addr, 1, FALSE); /* unsigned */
|
||||||
fprintf(stderr,"$0x%x", imm);
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"$0x%x", imm);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Ibs:
|
case Ibs:
|
||||||
get_value_inc(imm, addr, 1, TRUE); /* signed */
|
get_value_inc(imm, addr, 1, TRUE); /* signed */
|
||||||
fprintf(stderr,"$%d", imm);
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"$%d", imm);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Iw:
|
case Iw:
|
||||||
get_value_inc(imm, addr, 2, FALSE); /* unsigned */
|
get_value_inc(imm, addr, 2, FALSE); /* unsigned */
|
||||||
fprintf(stderr,"$0x%x", imm);
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"$0x%x", imm);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Il:
|
case Il:
|
||||||
get_value_inc(imm, addr, 4, FALSE);
|
get_value_inc(imm, addr, 4, FALSE);
|
||||||
fprintf(stderr,"$0x%x", imm);
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"$0x%x", imm);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case O:
|
case O:
|
||||||
|
@ -1411,6 +1525,11 @@ void DEBUG_Disasm( DBG_ADDR *addr )
|
||||||
else {
|
else {
|
||||||
get_value_inc(displ, addr, 4, TRUE);
|
get_value_inc(displ, addr, 4, TRUE);
|
||||||
}
|
}
|
||||||
|
if( !db_display )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (seg)
|
if (seg)
|
||||||
fprintf(stderr,"%s:%d",seg, displ);
|
fprintf(stderr,"%s:%d",seg, displ);
|
||||||
else
|
else
|
||||||
|
@ -1419,6 +1538,11 @@ void DEBUG_Disasm( DBG_ADDR *addr )
|
||||||
|
|
||||||
case Db:
|
case Db:
|
||||||
get_value_inc(displ, addr, 1, TRUE);
|
get_value_inc(displ, addr, 1, TRUE);
|
||||||
|
if( !db_display )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (short_addr) {
|
if (short_addr) {
|
||||||
/* offset only affects low 16 bits */
|
/* offset only affects low 16 bits */
|
||||||
displ = (addr->off & 0xffff0000)
|
displ = (addr->off & 0xffff0000)
|
||||||
|
@ -1439,15 +1563,25 @@ void DEBUG_Disasm( DBG_ADDR *addr )
|
||||||
get_value_inc(displ, addr, 4, TRUE);
|
get_value_inc(displ, addr, 4, TRUE);
|
||||||
displ += addr->off;
|
displ += addr->off;
|
||||||
}
|
}
|
||||||
|
if( !db_display )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
db_task_printsym( displ, short_addr ? WORD : LONG);
|
db_task_printsym( displ, short_addr ? WORD : LONG);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case o1:
|
case o1:
|
||||||
fprintf(stderr,"$1");
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"$1");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case o3:
|
case o3:
|
||||||
fprintf(stderr,"$3");
|
if( db_display )
|
||||||
|
{
|
||||||
|
fprintf(stderr,"$3");
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case OS:
|
case OS:
|
||||||
|
@ -1457,8 +1591,12 @@ void DEBUG_Disasm( DBG_ADDR *addr )
|
||||||
short_addr ? 2 : 4, FALSE );
|
short_addr ? 2 : 4, FALSE );
|
||||||
get_value_inc( address.seg, addr, /* segment */
|
get_value_inc( address.seg, addr, /* segment */
|
||||||
2, FALSE );
|
2, FALSE );
|
||||||
DEBUG_PrintAddress( &address, short_addr ? 16 : 32,
|
if( db_display )
|
||||||
TRUE );
|
{
|
||||||
|
DEBUG_PrintAddress( &address, short_addr ? 16 : 32,
|
||||||
|
TRUE );
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
359
debugger/dbg.y
359
debugger/dbg.y
|
@ -16,11 +16,14 @@
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
|
|
||||||
|
#include "expr.h"
|
||||||
|
|
||||||
extern FILE * yyin;
|
extern FILE * yyin;
|
||||||
unsigned int dbg_mode = 0;
|
unsigned int dbg_mode = 0;
|
||||||
int curr_frame = 0;
|
int curr_frame = 0;
|
||||||
|
|
||||||
static enum exec_mode dbg_exec_mode = EXEC_CONT;
|
static enum exec_mode dbg_exec_mode = EXEC_CONT;
|
||||||
|
static int dbg_exec_count = 0;
|
||||||
|
|
||||||
void issue_prompt(void);
|
void issue_prompt(void);
|
||||||
void mode_command(int);
|
void mode_command(int);
|
||||||
|
@ -36,17 +39,18 @@ int yyerror(char *);
|
||||||
enum debug_regs reg;
|
enum debug_regs reg;
|
||||||
char * string;
|
char * string;
|
||||||
int integer;
|
int integer;
|
||||||
|
struct list_id listing;
|
||||||
|
struct expr * expression;
|
||||||
}
|
}
|
||||||
|
|
||||||
%token tCONT tSTEP tLIST tNEXT tQUIT tHELP tBACKTRACE tINFO tWALK tUP tDOWN
|
%token tCONT tSTEP tLIST tNEXT tQUIT tHELP tBACKTRACE tINFO tWALK tUP tDOWN
|
||||||
%token tENABLE tDISABLE tBREAK tDELETE tSET tMODE tPRINT tEXAM tDEFINE tABORT
|
%token tENABLE tDISABLE tBREAK tDELETE tSET tMODE tPRINT tEXAM tABORT
|
||||||
%token tCLASS tMODULE tSTACK tSEGMENTS tREGS tWND tQUEUE tLOCAL
|
%token tCLASS tMODULE tSTACK tSEGMENTS tREGS tWND tQUEUE tLOCAL
|
||||||
%token tNO_SYMBOL tEOL
|
%token tEOL tSTRING
|
||||||
%token tSYMBOLFILE
|
%token tFRAME tSHARE tCOND tDISPLAY tUNDISPLAY
|
||||||
%token tFRAME
|
%token tSTEPI tNEXTI tFINISH tSHOW tDIR
|
||||||
|
%token <string> tPATH
|
||||||
|
%token <string> tIDENTIFIER tSTRING
|
||||||
%token <string> tIDENTIFIER
|
|
||||||
%token <integer> tNUM tFORMAT
|
%token <integer> tNUM tFORMAT
|
||||||
%token <reg> tREG
|
%token <reg> tREG
|
||||||
|
|
||||||
|
@ -62,14 +66,19 @@ int yyerror(char *);
|
||||||
%left '&'
|
%left '&'
|
||||||
%left OP_EQ OP_NE
|
%left OP_EQ OP_NE
|
||||||
%left '<' '>' OP_LE OP_GE
|
%left '<' '>' OP_LE OP_GE
|
||||||
%left OP_SHL OP_SHR
|
%left OP_SHL OP_SHR OP_DRF
|
||||||
%left '+' '-'
|
%left '+' '-'
|
||||||
%left '*' '/' '%'
|
%left '*' '/' '%'
|
||||||
%left OP_SIGN '!' '~' OP_DEREF /* OP_INC OP_DEC OP_ADDR */
|
%left OP_SIGN '!' '~' OP_DEREF /* OP_INC OP_DEC OP_ADDR */
|
||||||
|
%left '.' '['
|
||||||
%nonassoc ':'
|
%nonassoc ':'
|
||||||
|
|
||||||
%type <integer> expr
|
%type <expression> expr lval lvalue
|
||||||
%type <address> addr segaddr symbol
|
%type <address> expr_addr lval_addr
|
||||||
|
%type <integer> expr_value
|
||||||
|
%type <string> pathname
|
||||||
|
|
||||||
|
%type <listing> list_arg
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
@ -83,14 +92,28 @@ line: command
|
||||||
command:
|
command:
|
||||||
tQUIT tEOL { exit(0); }
|
tQUIT tEOL { exit(0); }
|
||||||
| tHELP tEOL { DEBUG_Help(); }
|
| tHELP tEOL { DEBUG_Help(); }
|
||||||
| tCONT tEOL { dbg_exec_mode = EXEC_CONT; return 0; }
|
| tHELP tINFO tEOL { DEBUG_HelpInfo(); }
|
||||||
| tSTEP tEOL { dbg_exec_mode = EXEC_STEP_INSTR; return 0; }
|
| tCONT tEOL { dbg_exec_count = 1;
|
||||||
| tNEXT tEOL { dbg_exec_mode = EXEC_STEP_OVER; return 0; }
|
dbg_exec_mode = EXEC_CONT; return 0; }
|
||||||
| tLIST tEOL { DEBUG_List( NULL, 15 ); }
|
| tCONT tNUM tEOL { dbg_exec_count = $2;
|
||||||
| tLIST addr tEOL { DEBUG_List( &$2, 15 ); }
|
dbg_exec_mode = EXEC_CONT; return 0; }
|
||||||
|
| tSTEP tEOL { dbg_exec_count = 1;
|
||||||
|
dbg_exec_mode = EXEC_STEP_INSTR; return 0; }
|
||||||
|
| tNEXT tEOL { dbg_exec_count = 1;
|
||||||
|
dbg_exec_mode = EXEC_STEP_OVER; return 0; }
|
||||||
|
| tSTEP tNUM tEOL { dbg_exec_count = $2;
|
||||||
|
dbg_exec_mode = EXEC_STEP_INSTR; return 0; }
|
||||||
|
| tNEXT tNUM tEOL { dbg_exec_count = $2;
|
||||||
|
dbg_exec_mode = EXEC_STEP_OVER; return 0; }
|
||||||
|
| tSTEPI tEOL { dbg_exec_count = 1;
|
||||||
|
dbg_exec_mode = EXEC_STEPI_INSTR; return 0; }
|
||||||
|
| tNEXTI tEOL { dbg_exec_count = 1;
|
||||||
|
dbg_exec_mode = EXEC_STEPI_OVER; return 0; }
|
||||||
|
| tSTEPI tNUM tEOL { dbg_exec_count = $2;
|
||||||
|
dbg_exec_mode = EXEC_STEPI_INSTR; return 0; }
|
||||||
|
| tNEXTI tNUM tEOL { dbg_exec_count = $2;
|
||||||
|
dbg_exec_mode = EXEC_STEPI_OVER; return 0; }
|
||||||
| tABORT tEOL { kill(getpid(), SIGABRT); }
|
| tABORT tEOL { kill(getpid(), SIGABRT); }
|
||||||
| tSYMBOLFILE tIDENTIFIER tEOL { DEBUG_ReadSymbolTable( $2 ); }
|
|
||||||
| tDEFINE tIDENTIFIER addr tEOL { DEBUG_AddSymbol( $2, &$3, NULL ); }
|
|
||||||
| tMODE tNUM tEOL { mode_command($2); }
|
| tMODE tNUM tEOL { mode_command($2); }
|
||||||
| tENABLE tNUM tEOL { DEBUG_EnableBreakpoint( $2, TRUE ); }
|
| tENABLE tNUM tEOL { DEBUG_EnableBreakpoint( $2, TRUE ); }
|
||||||
| tDISABLE tNUM tEOL { DEBUG_EnableBreakpoint( $2, FALSE ); }
|
| tDISABLE tNUM tEOL { DEBUG_EnableBreakpoint( $2, FALSE ); }
|
||||||
|
@ -100,7 +123,20 @@ command:
|
||||||
| tUP tNUM tEOL { DEBUG_SetFrame( curr_frame + $2 ); }
|
| tUP tNUM tEOL { DEBUG_SetFrame( curr_frame + $2 ); }
|
||||||
| tDOWN tEOL { DEBUG_SetFrame( curr_frame - 1 ); }
|
| tDOWN tEOL { DEBUG_SetFrame( curr_frame - 1 ); }
|
||||||
| tDOWN tNUM tEOL { DEBUG_SetFrame( curr_frame - $2 ); }
|
| tDOWN tNUM tEOL { DEBUG_SetFrame( curr_frame - $2 ); }
|
||||||
| tFRAME expr tEOL { DEBUG_SetFrame( $2 ); }
|
| tFRAME tNUM tEOL { DEBUG_SetFrame( $2 ); }
|
||||||
|
| tFINISH tEOL { dbg_exec_count = 0;
|
||||||
|
dbg_exec_mode = EXEC_FINISH; return 0; }
|
||||||
|
| tSHOW tDIR tEOL { DEBUG_ShowDir(); }
|
||||||
|
| tDIR pathname tEOL { DEBUG_AddPath( $2 ); }
|
||||||
|
| tDIR tEOL { DEBUG_NukePath(); }
|
||||||
|
| tDISPLAY expr tEOL { DEBUG_AddDisplay($2); }
|
||||||
|
| tDELETE tDISPLAY tNUM tEOL { DEBUG_DelDisplay( $3 ); }
|
||||||
|
| tDELETE tDISPLAY tEOL { DEBUG_DelDisplay( -1 ); }
|
||||||
|
| tUNDISPLAY tNUM tEOL { DEBUG_DelDisplay( $2 ); }
|
||||||
|
| tUNDISPLAY tEOL { DEBUG_DelDisplay( -1 ); }
|
||||||
|
| tCOND tNUM tEOL { DEBUG_AddBPCondition($2, NULL); }
|
||||||
|
| tCOND tNUM expr tEOL { DEBUG_AddBPCondition($2, $3); }
|
||||||
|
| list_command
|
||||||
| set_command
|
| set_command
|
||||||
| x_command
|
| x_command
|
||||||
| print_command
|
| print_command
|
||||||
|
@ -109,47 +145,110 @@ command:
|
||||||
| walk_command
|
| walk_command
|
||||||
|
|
||||||
set_command:
|
set_command:
|
||||||
tSET tREG '=' expr tEOL { DEBUG_SetRegister( $2, $4 ); }
|
tSET tREG '=' expr_value tEOL { DEBUG_SetRegister( $2, $4 );
|
||||||
| tSET '*' addr '=' expr tEOL { DEBUG_WriteMemory( &$3, $5 ); }
|
DEBUG_FreeExprMem(); }
|
||||||
| tSET tIDENTIFIER '=' addr tEOL { if (!DEBUG_SetSymbolValue( $2, &$4 ))
|
| tSET lval_addr '=' expr_value tEOL { DEBUG_WriteMemory( &$2, $4 );
|
||||||
{
|
DEBUG_FreeExprMem(); }
|
||||||
fprintf( stderr,
|
|
||||||
"Symbol %s not found\n", $2 );
|
pathname:
|
||||||
YYERROR;
|
tIDENTIFIER { $$ = $1; }
|
||||||
}
|
| tPATH { $$ = $1; }
|
||||||
}
|
|
||||||
|
list_command:
|
||||||
|
tLIST tEOL { DEBUG_List( NULL, NULL, 10 ); }
|
||||||
|
| tLIST '-' tEOL { DEBUG_List( NULL, NULL, -10 ); }
|
||||||
|
| tLIST list_arg tEOL { DEBUG_List( & $2, NULL, 10 ); }
|
||||||
|
| tLIST ',' list_arg tEOL { DEBUG_List( NULL, & $3, -10 ); }
|
||||||
|
| tLIST list_arg ',' list_arg tEOL { DEBUG_List( & $2, & $4, 0 ); }
|
||||||
|
|
||||||
|
list_arg:
|
||||||
|
tNUM { $$.sourcefile = NULL; $$.line = $1; }
|
||||||
|
| pathname ':' tNUM { $$.sourcefile = $1; $$.line = $3; }
|
||||||
|
| tIDENTIFIER { DEBUG_GetFuncInfo( & $$, NULL, $1); }
|
||||||
|
| pathname ':' tIDENTIFIER { DEBUG_GetFuncInfo( & $$, $1, $3); }
|
||||||
|
| '*' expr_addr { DEBUG_FindNearestSymbol( & $2, FALSE, NULL,
|
||||||
|
0, & $$ );
|
||||||
|
DEBUG_FreeExprMem(); }
|
||||||
|
|
||||||
x_command:
|
x_command:
|
||||||
tEXAM addr tEOL { DEBUG_ExamineMemory( &$2, 1, 'x'); }
|
tEXAM expr_addr tEOL { DEBUG_ExamineMemory( &$2, 1, 'x');
|
||||||
| tEXAM tFORMAT addr tEOL { DEBUG_ExamineMemory( &$3, $2>>8, $2&0xff ); }
|
DEBUG_FreeExprMem(); }
|
||||||
|
| tEXAM tFORMAT expr_addr tEOL { DEBUG_ExamineMemory( &$3, $2>>8, $2&0xff );
|
||||||
|
DEBUG_FreeExprMem(); }
|
||||||
|
|
||||||
print_command:
|
print_command:
|
||||||
tPRINT addr tEOL { DEBUG_Print( &$2, 1, 'x' ); }
|
tPRINT expr_addr tEOL { DEBUG_Print( &$2, 1, 0, 0 );
|
||||||
| tPRINT tFORMAT addr tEOL { DEBUG_Print( &$3, $2 >> 8, $2 & 0xff ); }
|
DEBUG_FreeExprMem(); }
|
||||||
|
| tPRINT tFORMAT expr_addr tEOL { DEBUG_Print( &$3, $2 >> 8, $2 & 0xff, 0 );
|
||||||
|
DEBUG_FreeExprMem(); }
|
||||||
|
|
||||||
break_command:
|
break_command:
|
||||||
tBREAK '*' addr tEOL { DEBUG_AddBreakpoint( &$3 ); }
|
tBREAK '*' expr_addr tEOL { DEBUG_AddBreakpoint( &$3 );
|
||||||
| tBREAK symbol tEOL { DEBUG_AddBreakpoint( &$2 ); }
|
DEBUG_FreeExprMem(); }
|
||||||
| tBREAK symbol '+' expr tEOL { DBG_ADDR addr = $2;
|
| tBREAK tIDENTIFIER tEOL { DBG_ADDR addr;
|
||||||
addr.off += $4;
|
if( DEBUG_GetSymbolValue($2, -1, &addr, TRUE) )
|
||||||
DEBUG_AddBreakpoint( &addr );
|
{
|
||||||
}
|
DEBUG_AddBreakpoint( &addr );
|
||||||
| tBREAK tEOL { DBG_ADDR addr = { CS_reg(&DEBUG_context),
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr,"Unable to add breakpoint\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| tBREAK tIDENTIFIER ':' tNUM tEOL { DBG_ADDR addr;
|
||||||
|
if( DEBUG_GetSymbolValue($2, $4, &addr, TRUE) )
|
||||||
|
{
|
||||||
|
DEBUG_AddBreakpoint( &addr );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr,"Unable to add breakpoint\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
| tBREAK tNUM tEOL { struct name_hash *nh;
|
||||||
|
DBG_ADDR addr = { NULL,
|
||||||
|
CS_reg(&DEBUG_context),
|
||||||
|
EIP_reg(&DEBUG_context) };
|
||||||
|
|
||||||
|
DBG_FIX_ADDR_SEG( &addr, CS_reg(&DEBUG_context) );
|
||||||
|
DEBUG_FindNearestSymbol(&addr, TRUE,
|
||||||
|
&nh, 0, NULL);
|
||||||
|
if( nh != NULL )
|
||||||
|
{
|
||||||
|
DEBUG_GetLineNumberAddr(nh,
|
||||||
|
$2, &addr, TRUE);
|
||||||
|
DEBUG_AddBreakpoint( &addr );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr,"Unable to add breakpoint\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
| tBREAK tEOL { DBG_ADDR addr = { NULL,
|
||||||
|
CS_reg(&DEBUG_context),
|
||||||
EIP_reg(&DEBUG_context) };
|
EIP_reg(&DEBUG_context) };
|
||||||
DEBUG_AddBreakpoint( &addr );
|
DEBUG_AddBreakpoint( &addr );
|
||||||
}
|
}
|
||||||
|
|
||||||
info_command:
|
info_command:
|
||||||
tINFO tBREAK tEOL { DEBUG_InfoBreakpoints(); }
|
tINFO tBREAK tEOL { DEBUG_InfoBreakpoints(); }
|
||||||
| tINFO tCLASS expr tEOL { CLASS_DumpClass( (CLASS *)$3 ); }
|
| tINFO tCLASS expr_value tEOL { CLASS_DumpClass( (CLASS *)$3 );
|
||||||
| tINFO tMODULE expr tEOL { MODULE_DumpModule( $3 ); }
|
DEBUG_FreeExprMem(); }
|
||||||
| tINFO tQUEUE expr tEOL { QUEUE_DumpQueue( $3 ); }
|
| tINFO tSHARE tEOL { DEBUG_InfoShare(); }
|
||||||
|
| tINFO tMODULE expr_value tEOL { MODULE_DumpModule( $3 );
|
||||||
|
DEBUG_FreeExprMem(); }
|
||||||
|
| tINFO tQUEUE expr_value tEOL { QUEUE_DumpQueue( $3 );
|
||||||
|
DEBUG_FreeExprMem(); }
|
||||||
| tINFO tREGS tEOL { DEBUG_InfoRegisters(); }
|
| tINFO tREGS tEOL { DEBUG_InfoRegisters(); }
|
||||||
| tINFO tSEGMENTS expr tEOL { LDT_Print( SELECTOR_TO_ENTRY($3), 1 ); }
|
| tINFO tSEGMENTS expr_value tEOL { LDT_Print( SELECTOR_TO_ENTRY($3), 1 );
|
||||||
|
DEBUG_FreeExprMem(); }
|
||||||
| tINFO tSEGMENTS tEOL { LDT_Print( 0, -1 ); }
|
| tINFO tSEGMENTS tEOL { LDT_Print( 0, -1 ); }
|
||||||
| tINFO tSTACK tEOL { DEBUG_InfoStack(); }
|
| tINFO tSTACK tEOL { DEBUG_InfoStack(); }
|
||||||
| tINFO tWND expr tEOL { WIN_DumpWindow( $3 ); }
|
| tINFO tWND expr_value tEOL { WIN_DumpWindow( $3 );
|
||||||
|
DEBUG_FreeExprMem(); }
|
||||||
| tINFO tLOCAL tEOL { DEBUG_InfoLocals(); }
|
| tINFO tLOCAL tEOL { DEBUG_InfoLocals(); }
|
||||||
|
| tINFO tDISPLAY tEOL { DEBUG_InfoDisplay(); }
|
||||||
|
|
||||||
walk_command:
|
walk_command:
|
||||||
tWALK tCLASS tEOL { CLASS_WalkClasses(); }
|
tWALK tCLASS tEOL { CLASS_WalkClasses(); }
|
||||||
|
@ -158,70 +257,78 @@ walk_command:
|
||||||
| tWALK tWND tEOL { WIN_WalkWindows( 0, 0 ); }
|
| tWALK tWND tEOL { WIN_WalkWindows( 0, 0 ); }
|
||||||
| tWALK tWND tNUM tEOL { WIN_WalkWindows( $3, 0 ); }
|
| tWALK tWND tNUM tEOL { WIN_WalkWindows( $3, 0 ); }
|
||||||
|
|
||||||
symbol:
|
expr_addr:
|
||||||
tIDENTIFIER { if (!DEBUG_GetSymbolValue( $1, -1, &$$ ))
|
expr { $$ = DEBUG_EvalExpr($1) }
|
||||||
{
|
|
||||||
fprintf( stderr, "Symbol %s not found\n", $1 );
|
|
||||||
YYERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
| tIDENTIFIER ':' tNUM { if (!DEBUG_GetSymbolValue( $1, $3, &$$ ))
|
|
||||||
{
|
|
||||||
fprintf( stderr, "No code at %s:%d\n", $1, $3 );
|
|
||||||
YYERROR;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
addr:
|
|
||||||
expr { $$.seg = 0xffffffff; $$.off = $1; }
|
|
||||||
| segaddr { $$ = $1; }
|
|
||||||
|
|
||||||
segaddr:
|
|
||||||
expr ':' expr { $$.seg = $1; $$.off = $3; }
|
|
||||||
| symbol { $$ = $1; }
|
|
||||||
| symbol '+' expr { $$ = $1; $$.off += $3; }
|
|
||||||
| symbol '-' expr { $$ = $1; $$.off -= $3; }
|
|
||||||
|
|
||||||
|
expr_value:
|
||||||
|
expr { DBG_ADDR addr = DEBUG_EvalExpr($1);
|
||||||
|
$$ = *(unsigned int *) addr.off; }
|
||||||
|
/*
|
||||||
|
* The expr rule builds an expression tree. When we are done, we call
|
||||||
|
* EvalExpr to evaluate the value of the expression. The advantage of
|
||||||
|
* the two-step approach is that it is possible to save expressions for
|
||||||
|
* use in 'display' commands, and in conditional watchpoints.
|
||||||
|
*/
|
||||||
expr:
|
expr:
|
||||||
tNUM { $$ = $1; }
|
tNUM { $$ = DEBUG_ConstExpr($1); }
|
||||||
| tREG { $$ = DEBUG_GetRegister($1); }
|
| tSTRING { $$ = DEBUG_StringExpr($1); }
|
||||||
| expr OP_LOR expr { $$ = $1 || $3; }
|
| tREG { $$ = DEBUG_RegisterExpr($1); }
|
||||||
| expr OP_LAND expr { $$ = $1 && $3; }
|
| tIDENTIFIER { $$ = DEBUG_SymbolExpr($1); }
|
||||||
| expr '|' expr { $$ = $1 | $3; }
|
| expr OP_DRF tIDENTIFIER { $$ = DEBUG_StructPExpr($1, $3); }
|
||||||
| expr '&' expr { $$ = $1 & $3; }
|
| expr '.' tIDENTIFIER { $$ = DEBUG_StructExpr($1, $3); }
|
||||||
| expr '^' expr { $$ = $1 ^ $3; }
|
| tIDENTIFIER '(' ')' { $$ = DEBUG_CallExpr($1, 0); }
|
||||||
| expr OP_EQ expr { $$ = $1 == $3; }
|
| tIDENTIFIER '(' expr ')' { $$ = DEBUG_CallExpr($1, 1, $3); }
|
||||||
| expr '>' expr { $$ = $1 > $3; }
|
| tIDENTIFIER '(' expr ',' expr ')' { $$ = DEBUG_CallExpr($1, 2, $3,
|
||||||
| expr '<' expr { $$ = $1 < $3; }
|
$5); }
|
||||||
| expr OP_GE expr { $$ = $1 >= $3; }
|
| tIDENTIFIER '(' expr ',' expr ',' expr ')' { $$ = DEBUG_CallExpr($1, 3, $3, $5, $7); }
|
||||||
| expr OP_LE expr { $$ = $1 <= $3; }
|
| tIDENTIFIER '(' expr ',' expr ',' expr ',' expr ')' { $$ = DEBUG_CallExpr($1, 3, $3, $5, $7, $9); }
|
||||||
| expr OP_NE expr { $$ = $1 != $3; }
|
| tIDENTIFIER '(' expr ',' expr ',' expr ',' expr ',' expr ')' { $$ = DEBUG_CallExpr($1, 3, $3, $5, $7, $9, $11); }
|
||||||
| expr OP_SHL expr { $$ = (unsigned)$1 << $3; }
|
| expr '[' expr ']' { $$ = DEBUG_BinopExpr(EXP_OP_ARR, $1, $3); }
|
||||||
| expr OP_SHR expr { $$ = (unsigned)$1 >> $3; }
|
| expr ':' expr { $$ = DEBUG_BinopExpr(EXP_OP_SEG, $1, $3); }
|
||||||
| expr '+' expr { $$ = $1 + $3; }
|
| expr OP_LOR expr { $$ = DEBUG_BinopExpr(EXP_OP_LOR, $1, $3); }
|
||||||
| expr '-' expr { $$ = $1 - $3; }
|
| expr OP_LAND expr { $$ = DEBUG_BinopExpr(EXP_OP_LAND, $1, $3); }
|
||||||
| expr '*' expr { $$ = $1 * $3; }
|
| expr '|' expr { $$ = DEBUG_BinopExpr(EXP_OP_OR, $1, $3); }
|
||||||
| expr '/' expr { if ($3)
|
| expr '&' expr { $$ = DEBUG_BinopExpr(EXP_OP_AND, $1, $3); }
|
||||||
if ($3 == -1 && $1 == 0x80000000l)
|
| expr '^' expr { $$ = DEBUG_BinopExpr(EXP_OP_XOR, $1, $3); }
|
||||||
yyerror ("Division overflow");
|
| expr OP_EQ expr { $$ = DEBUG_BinopExpr(EXP_OP_EQ, $1, $3); }
|
||||||
else $$ = $1 / $3;
|
| expr '>' expr { $$ = DEBUG_BinopExpr(EXP_OP_GT, $1, $3); }
|
||||||
else yyerror ("Division by zero");
|
| expr '<' expr { $$ = DEBUG_BinopExpr(EXP_OP_LT, $1, $3); }
|
||||||
}
|
| expr OP_GE expr { $$ = DEBUG_BinopExpr(EXP_OP_GE, $1, $3); }
|
||||||
| expr '%' expr { if ($3)
|
| expr OP_LE expr { $$ = DEBUG_BinopExpr(EXP_OP_LE, $1, $3); }
|
||||||
if ($3 == -1 && $1 == 0x80000000l)
|
| expr OP_NE expr { $$ = DEBUG_BinopExpr(EXP_OP_NE, $1, $3); }
|
||||||
$$ = 0; /* A sensible result in this case. */
|
| expr OP_SHL expr { $$ = DEBUG_BinopExpr(EXP_OP_SHL, $1, $3); }
|
||||||
else $$ = $1 % $3;
|
| expr OP_SHR expr { $$ = DEBUG_BinopExpr(EXP_OP_SHR, $1, $3); }
|
||||||
else yyerror ("Division by zero");
|
| expr '+' expr { $$ = DEBUG_BinopExpr(EXP_OP_ADD, $1, $3); }
|
||||||
}
|
| expr '-' expr { $$ = DEBUG_BinopExpr(EXP_OP_SUB, $1, $3); }
|
||||||
| '-' expr %prec OP_SIGN { $$ = -$2; }
|
| expr '*' expr { $$ = DEBUG_BinopExpr(EXP_OP_MUL, $1, $3); }
|
||||||
|
| expr '/' expr { $$ = DEBUG_BinopExpr(EXP_OP_DIV, $1, $3); }
|
||||||
|
| expr '%' expr { $$ = DEBUG_BinopExpr(EXP_OP_REM, $1, $3); }
|
||||||
|
| '-' expr %prec OP_SIGN { $$ = DEBUG_UnopExpr(EXP_OP_NEG, $2); }
|
||||||
| '+' expr %prec OP_SIGN { $$ = $2; }
|
| '+' expr %prec OP_SIGN { $$ = $2; }
|
||||||
| '!' expr { $$ = !$2; }
|
| '!' expr { $$ = DEBUG_UnopExpr(EXP_OP_NOT, $2); }
|
||||||
| '~' expr { $$ = ~$2; }
|
| '~' expr { $$ = DEBUG_UnopExpr(EXP_OP_LNOT, $2); }
|
||||||
| '(' expr ')' { $$ = $2; }
|
| '(' expr ')' { $$ = $2; }
|
||||||
/* For parser technical reasons we can't use "addr" here. */
|
| '*' expr %prec OP_DEREF { $$ = DEBUG_UnopExpr(EXP_OP_DEREF, $2); }
|
||||||
| '*' expr %prec OP_DEREF { DBG_ADDR addr = { 0xffffffff, $2 };
|
| '&' expr %prec OP_DEREF { $$ = DEBUG_UnopExpr(EXP_OP_ADDR, $2); }
|
||||||
$$ = DEBUG_ReadMemory( &addr ); }
|
|
||||||
| '*' segaddr %prec OP_DEREF { $$ = DEBUG_ReadMemory( &$2 ); }
|
/*
|
||||||
|
* The lvalue rule builds an expression tree. This is a limited form
|
||||||
|
* of expression that is suitable to be used as an lvalue.
|
||||||
|
*/
|
||||||
|
lval_addr:
|
||||||
|
lval { $$ = DEBUG_EvalExpr($1) }
|
||||||
|
|
||||||
|
lval:
|
||||||
|
lvalue { $$ = $1; }
|
||||||
|
| '*' expr { $$ = DEBUG_UnopExpr(EXP_OP_FORCE_DEREF, $2); }
|
||||||
|
|
||||||
|
lvalue:
|
||||||
|
tNUM { $$ = DEBUG_ConstExpr($1); }
|
||||||
|
| tREG { $$ = DEBUG_RegisterExpr($1); }
|
||||||
|
| tIDENTIFIER { $$ = DEBUG_SymbolExpr($1); }
|
||||||
|
| lvalue OP_DRF tIDENTIFIER { $$ = DEBUG_StructPExpr($1, $3); }
|
||||||
|
| lvalue '.' tIDENTIFIER { $$ = DEBUG_StructExpr($1, $3); }
|
||||||
|
| lvalue '[' expr ']' { $$ = DEBUG_BinopExpr(EXP_OP_ARR, $1, $3); }
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
@ -249,7 +356,7 @@ static void DEBUG_Main( int signal )
|
||||||
static int loaded_symbols = 0;
|
static int loaded_symbols = 0;
|
||||||
static BOOL32 in_debugger = FALSE;
|
static BOOL32 in_debugger = FALSE;
|
||||||
char SymbolTableFile[256];
|
char SymbolTableFile[256];
|
||||||
int instr_len = 0, newmode;
|
int newmode;
|
||||||
BOOL32 ret_ok;
|
BOOL32 ret_ok;
|
||||||
#ifdef YYDEBUG
|
#ifdef YYDEBUG
|
||||||
yydebug = 0;
|
yydebug = 0;
|
||||||
|
@ -268,6 +375,12 @@ static void DEBUG_Main( int signal )
|
||||||
if (!loaded_symbols)
|
if (!loaded_symbols)
|
||||||
{
|
{
|
||||||
loaded_symbols++;
|
loaded_symbols++;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize the type handling stuff.
|
||||||
|
*/
|
||||||
|
DEBUG_InitTypes();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In some cases we can read the stabs information directly
|
* In some cases we can read the stabs information directly
|
||||||
* from the executable. If this is the case, we don't need
|
* from the executable. If this is the case, we don't need
|
||||||
|
@ -294,12 +407,22 @@ static void DEBUG_Main( int signal )
|
||||||
DEBUG_LoadEntryPoints();
|
DEBUG_LoadEntryPoints();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((signal != SIGTRAP) || !DEBUG_ShouldContinue( dbg_exec_mode ))
|
#if 0
|
||||||
|
fprintf(stderr, "Entering debugger PC=%x, mode=%d, count=%d\n",
|
||||||
|
EIP_reg(&DEBUG_context),
|
||||||
|
dbg_exec_mode, dbg_exec_count);
|
||||||
|
|
||||||
|
sleep(1);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
if ((signal != SIGTRAP) || !DEBUG_ShouldContinue( dbg_exec_mode,
|
||||||
|
&dbg_exec_count ))
|
||||||
{
|
{
|
||||||
DBG_ADDR addr;
|
DBG_ADDR addr;
|
||||||
|
|
||||||
addr.seg = CS_reg(&DEBUG_context);
|
addr.seg = CS_reg(&DEBUG_context);
|
||||||
addr.off = EIP_reg(&DEBUG_context);
|
addr.off = EIP_reg(&DEBUG_context);
|
||||||
|
addr.type = NULL;
|
||||||
DBG_FIX_ADDR_SEG( &addr, 0 );
|
DBG_FIX_ADDR_SEG( &addr, 0 );
|
||||||
|
|
||||||
/* Put the display in a correct state */
|
/* Put the display in a correct state */
|
||||||
|
@ -314,6 +437,8 @@ static void DEBUG_Main( int signal )
|
||||||
if (newmode != dbg_mode)
|
if (newmode != dbg_mode)
|
||||||
fprintf(stderr,"In %d bit mode.\n", dbg_mode = newmode);
|
fprintf(stderr,"In %d bit mode.\n", dbg_mode = newmode);
|
||||||
|
|
||||||
|
DEBUG_DoDisplay();
|
||||||
|
|
||||||
if (signal != SIGTRAP) /* This is a real crash, dump some info */
|
if (signal != SIGTRAP) /* This is a real crash, dump some info */
|
||||||
{
|
{
|
||||||
DEBUG_InfoRegisters();
|
DEBUG_InfoRegisters();
|
||||||
|
@ -326,6 +451,14 @@ static void DEBUG_Main( int signal )
|
||||||
}
|
}
|
||||||
DEBUG_BackTrace();
|
DEBUG_BackTrace();
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Do a quiet backtrace so that we have an idea of what the situation
|
||||||
|
* is WRT the source files.
|
||||||
|
*/
|
||||||
|
DEBUG_SilentBackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
/* Show where we crashed */
|
/* Show where we crashed */
|
||||||
curr_frame = 0;
|
curr_frame = 0;
|
||||||
|
@ -333,9 +466,8 @@ static void DEBUG_Main( int signal )
|
||||||
fprintf(stderr,": ");
|
fprintf(stderr,": ");
|
||||||
if (DBG_CHECK_READ_PTR( &addr, 1 ))
|
if (DBG_CHECK_READ_PTR( &addr, 1 ))
|
||||||
{
|
{
|
||||||
DEBUG_Disasm( &addr );
|
DEBUG_Disasm( &addr, TRUE );
|
||||||
fprintf(stderr,"\n");
|
fprintf(stderr,"\n");
|
||||||
instr_len = addr.off - EIP_reg(&DEBUG_context);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ret_ok = 0;
|
ret_ok = 0;
|
||||||
|
@ -352,7 +484,17 @@ static void DEBUG_Main( int signal )
|
||||||
} while (!ret_ok);
|
} while (!ret_ok);
|
||||||
}
|
}
|
||||||
|
|
||||||
DEBUG_RestartExecution( dbg_exec_mode, instr_len );
|
dbg_exec_mode = DEBUG_RestartExecution( dbg_exec_mode, dbg_exec_count );
|
||||||
|
/*
|
||||||
|
* This will have gotten absorbed into the breakpoint info
|
||||||
|
* if it was used. Otherwise it would have been ignored.
|
||||||
|
* In any case, we don't mess with it any more.
|
||||||
|
*/
|
||||||
|
if( dbg_exec_mode == EXEC_CONT )
|
||||||
|
{
|
||||||
|
dbg_exec_count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
in_debugger = FALSE;
|
in_debugger = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -375,6 +517,7 @@ void DebugBreak16( CONTEXT *regs )
|
||||||
{
|
{
|
||||||
const char *module = MODULE_GetModuleName( GetExePtr(GetCurrentTask()) );
|
const char *module = MODULE_GetModuleName( GetExePtr(GetCurrentTask()) );
|
||||||
fprintf( stderr, "%s called DebugBreak\n", module ? module : "???" );
|
fprintf( stderr, "%s called DebugBreak\n", module ? module : "???" );
|
||||||
|
DEBUG_context = *regs;
|
||||||
DEBUG_Main( SIGTRAP );
|
DEBUG_Main( SIGTRAP );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,232 @@
|
||||||
|
/*
|
||||||
|
* File dbgmain.c - main wrapper for internal debugger test bed.
|
||||||
|
*
|
||||||
|
* Copyright (C) 1997, Eric Youngdale.
|
||||||
|
*/
|
||||||
|
#include <signal.h>
|
||||||
|
|
||||||
|
#include <ldt.h>
|
||||||
|
#include <windows.h>
|
||||||
|
#include <toolhelp.h>
|
||||||
|
#include <module.h>
|
||||||
|
#include <debugger.h>
|
||||||
|
#include <class.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
|
||||||
|
#include "debugger.h"
|
||||||
|
#include "peexe.h"
|
||||||
|
|
||||||
|
ldt_copy_entry ldt_copy[LDT_SIZE];
|
||||||
|
unsigned char ldt_flags_copy[LDT_SIZE];
|
||||||
|
|
||||||
|
Display * display;
|
||||||
|
|
||||||
|
int
|
||||||
|
XUngrabPointer( Display * d, Time t)
|
||||||
|
{
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
XUngrabServer( Display * d )
|
||||||
|
{
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
XFlush(Display * d )
|
||||||
|
{
|
||||||
|
return(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
HTASK16 GetCurrentTask()
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
HMODULE16 GetExePtr(HANDLE16 h)
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
LPSTR MODULE_GetModuleName( HMODULE16 hModule )
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
int PROFILE_GetWineIniString( const char *section, const char *key_name,
|
||||||
|
const char *def, char *buffer, int len )
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CLASS_DumpClass( CLASS *class )
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MODULE_DumpModule( HMODULE16 hmodule )
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QUEUE_DumpQueue( HQUEUE16 hQueue )
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WIN_DumpWindow( HWND32 hwnd )
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void CLASS_WalkClasses()
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void MODULE_WalkModules()
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void QUEUE_WalkQueues()
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void WIN_WalkWindows( HWND32 hwnd, int indent )
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
NE_MODULE *MODULE_GetPtr( HMODULE16 hModule )
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
FARPROC16 MODULE_GetEntryPoint( HMODULE16 hModule, WORD ordinal )
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void LDT_Print( int start, int length )
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
LPVOID GlobalLock16(HGLOBAL16 h)
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL16 ModuleFirst(MODULEENTRY *lpModule)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL16 ModuleNext(MODULEENTRY *lpModule)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL16 IsBadReadPtr16(SEGPTR s,UINT16 o)
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOL32 IsBadReadPtr32(LPCVOID s,UINT32 o)
|
||||||
|
{
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct qwert
|
||||||
|
{
|
||||||
|
unsigned flag1:1;
|
||||||
|
unsigned flag3:3;
|
||||||
|
signed remain:11;
|
||||||
|
unsigned whatsup:17;
|
||||||
|
} vvv;
|
||||||
|
|
||||||
|
int xyzzy(const char * qwe, int ijk)
|
||||||
|
{
|
||||||
|
return strlen(qwe) + ijk;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int * xxx;
|
||||||
|
unsigned int * yyy;
|
||||||
|
|
||||||
|
int xxx3[10];
|
||||||
|
|
||||||
|
char vdv[100];
|
||||||
|
|
||||||
|
struct deferred_debug_info
|
||||||
|
{
|
||||||
|
struct deferred_debug_info * next;
|
||||||
|
char * load_addr;
|
||||||
|
char * module_name;
|
||||||
|
char * dbg_info;
|
||||||
|
int dbg_size;
|
||||||
|
struct PE_Debug_dir * dbgdir;
|
||||||
|
struct pe_data * pe;
|
||||||
|
struct pe_segment_table * sectp;
|
||||||
|
int nsect;
|
||||||
|
short int dbg_index;
|
||||||
|
char loaded;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct CodeViewDebug
|
||||||
|
{
|
||||||
|
char cv_nbtype[8];
|
||||||
|
unsigned int cv_timestamp;
|
||||||
|
char cv_unknown[4];
|
||||||
|
char cv_name[1];
|
||||||
|
};
|
||||||
|
|
||||||
|
test_pdbstuff()
|
||||||
|
{
|
||||||
|
struct deferred_debug_info deefer;
|
||||||
|
struct PE_Debug_dir dinfo;
|
||||||
|
struct CodeViewDebug cdebug;
|
||||||
|
struct pe_segment_table sects[10];
|
||||||
|
|
||||||
|
memset(&deefer, 0, sizeof(deefer));
|
||||||
|
memset(&dinfo, 0, sizeof(dinfo));
|
||||||
|
memset(&cdebug, 0, sizeof(cdebug));
|
||||||
|
memset(§s, 0, sizeof(sects));
|
||||||
|
|
||||||
|
deefer.dbg_info = (char *) &cdebug;
|
||||||
|
dinfo.timestamp = 812932395;
|
||||||
|
cdebug.cv_timestamp = 833392137 /* 841951397 */;
|
||||||
|
deefer.dbgdir = &dinfo;
|
||||||
|
deefer.sectp = §s;
|
||||||
|
deefer.nsect = 10;
|
||||||
|
|
||||||
|
DEBUG_InitTypes();
|
||||||
|
DEBUG_ProcessPDBFile(&deefer, "../dumpexe.pdb");
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
main(int argc, char * argv[])
|
||||||
|
{
|
||||||
|
extern char * DEBUG_argv0;
|
||||||
|
SIGCONTEXT reg;
|
||||||
|
|
||||||
|
strcpy(vdv, "This is a test");
|
||||||
|
memset(&vvv, 0xff, sizeof(vvv));
|
||||||
|
vvv.whatsup = 0;
|
||||||
|
vvv.flag3 = 0;
|
||||||
|
vvv.remain = 0x401;
|
||||||
|
DEBUG_argv0 = argv[0];
|
||||||
|
xxx = (unsigned int*) &vvv;
|
||||||
|
yyy = xxx + 5;
|
||||||
|
xxx3[5] = 7;
|
||||||
|
|
||||||
|
test_pdbstuff();
|
||||||
|
|
||||||
|
memset(®, 0, sizeof(reg));
|
||||||
|
wine_debug(SIGSEGV, ®);
|
||||||
|
return 0;
|
||||||
|
}
|
110
debugger/debug.l
110
debugger/debug.l
|
@ -34,11 +34,23 @@ static int syntax_error;
|
||||||
DIGIT [0-9]
|
DIGIT [0-9]
|
||||||
HEXDIGIT [0-9a-fA-F]
|
HEXDIGIT [0-9a-fA-F]
|
||||||
FORMAT [bcdiswx]
|
FORMAT [bcdiswx]
|
||||||
IDENTIFIER [_a-zA-Z\.~][_a-zA-Z0-9\.~@]*
|
IDENTIFIER [_a-zA-Z~][_a-zA-Z0-9~@]*
|
||||||
|
PATHNAME [/_a-zA-Z\.~][/_a-zA-Z0-9\.~@]*
|
||||||
|
STRING \"[^\n"]+\"
|
||||||
|
|
||||||
|
%s FORMAT_EXPECTED
|
||||||
|
%s PATH_EXPECTED
|
||||||
|
%s INFO_CMD
|
||||||
|
%s HELP_CMD
|
||||||
|
%s DEL_CMD
|
||||||
|
%s WALK_CMD
|
||||||
|
%s SHOW_CMD
|
||||||
|
%s NOCMD
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
\n { syntax_error = 0; return tEOL; } /*Indicates end of command*/
|
\n { BEGIN(0); syntax_error = 0;
|
||||||
|
return tEOL; } /*Indicates end of command. Reset state. */
|
||||||
|
|
||||||
"||" { return OP_LOR; }
|
"||" { return OP_LOR; }
|
||||||
"&&" { return OP_LAND; }
|
"&&" { return OP_LAND; }
|
||||||
|
@ -48,16 +60,24 @@ IDENTIFIER [_a-zA-Z\.~][_a-zA-Z0-9\.~@]*
|
||||||
">=" { return OP_GE; }
|
">=" { return OP_GE; }
|
||||||
"<<" { return OP_SHL; }
|
"<<" { return OP_SHL; }
|
||||||
">>" { return OP_SHR; }
|
">>" { return OP_SHR; }
|
||||||
[-+<=>|&^()*/%:!~] { return *yytext; }
|
"->" { return OP_DRF; }
|
||||||
|
[-+<=>|&^()*/%:!~,\.] { return *yytext; }
|
||||||
|
"[" { return *yytext; }
|
||||||
|
"]" { return *yytext; }
|
||||||
|
|
||||||
"0x"{HEXDIGIT}+ { sscanf(yytext, "%x", &yylval.integer); return tNUM; }
|
"0x"{HEXDIGIT}+ { sscanf(yytext, "%x", &yylval.integer); return tNUM; }
|
||||||
{DIGIT}+ { sscanf(yytext, "%d", &yylval.integer); return tNUM; }
|
{DIGIT}+ { sscanf(yytext, "%d", &yylval.integer); return tNUM; }
|
||||||
|
|
||||||
"/"{DIGIT}+{FORMAT} { char * last;
|
|
||||||
|
<FORMAT_EXPECTED>"/"{DIGIT}+{FORMAT} { char * last;
|
||||||
yylval.integer = strtol( yytext+1, &last, NULL );
|
yylval.integer = strtol( yytext+1, &last, NULL );
|
||||||
yylval.integer = (yylval.integer << 8) | *last;
|
yylval.integer = (yylval.integer << 8) | *last;
|
||||||
return tFORMAT; }
|
return tFORMAT; }
|
||||||
"/"{FORMAT} { yylval.integer = (1 << 8) | yytext[1]; return tFORMAT; }
|
|
||||||
|
|
||||||
|
<FORMAT_EXPECTED>"/"{FORMAT} { yylval.integer = (1 << 8) | yytext[1]; return tFORMAT; }
|
||||||
|
|
||||||
|
{STRING} { yylval.string = make_symbol(yytext); return tSTRING; }
|
||||||
|
|
||||||
$pc { yylval.reg = REG_EIP; return tREG; }
|
$pc { yylval.reg = REG_EIP; return tREG; }
|
||||||
$flags { yylval.reg = REG_EFL; return tREG; }
|
$flags { yylval.reg = REG_EFL; return tREG; }
|
||||||
|
@ -86,49 +106,60 @@ $ss { yylval.reg = REG_SS; return tREG; }
|
||||||
$fs { yylval.reg = REG_FS; return tREG; }
|
$fs { yylval.reg = REG_FS; return tREG; }
|
||||||
$gs { yylval.reg = REG_GS; return tREG; }
|
$gs { yylval.reg = REG_GS; return tREG; }
|
||||||
|
|
||||||
up { return tUP; }
|
<INITIAL>info|inf|in { BEGIN(INFO_CMD); return tINFO; }
|
||||||
down|dow|do { return tDOWN; }
|
<INITIAL>up { BEGIN(NOCMD); return tUP; }
|
||||||
frame|fram|fra|fr { return tFRAME; }
|
<INITIAL>down|dow|do { BEGIN(NOCMD); return tDOWN; }
|
||||||
locals|local|loca|loc { return tLOCAL; }
|
<INITIAL>frame|fram|fra|fr { BEGIN(NOCMD); return tFRAME; }
|
||||||
info|inf|in { return tINFO; }
|
<INITIAL>list|lis|li|l { BEGIN(PATH_EXPECTED); return tLIST; }
|
||||||
show|sho|sh { return tINFO; }
|
<INITIAL>enable|enabl|enab|ena { BEGIN(NOCMD); return tENABLE;}
|
||||||
list|lis|li|l { return tLIST; }
|
<INITIAL>disable|disabl|disab|disa|dis { BEGIN(NOCMD); return tDISABLE; }
|
||||||
break|brea|bre|br|b { return tBREAK; }
|
<INITIAL,INFO_CMD,DEL_CMD>display|displa|displ|disp { BEGIN(NOCMD); return tDISPLAY; }
|
||||||
enable|enabl|enab|ena { return tENABLE;}
|
<INITIAL>undisplay|undispla|undispl|undisp|undis|undi|und { BEGIN(NOCMD); return tUNDISPLAY; }
|
||||||
disable|disabl|disab|disa|dis { return tDISABLE; }
|
<INITIAL>delete|delet|dele|del { BEGIN(DEL_CMD); return tDELETE; }
|
||||||
delete|delet|dele|del { return tDELETE; }
|
<INITIAL>quit|qui|qu|q { BEGIN(NOCMD); return tQUIT; }
|
||||||
quit|qui|qu|q { return tQUIT; }
|
<INITIAL>set|se { BEGIN(NOCMD); return tSET; }
|
||||||
set|se { return tSET; }
|
<INITIAL>walk|w { BEGIN(WALK_CMD); return tWALK; }
|
||||||
walk|w { return tWALK; }
|
<INITIAL>x { BEGIN(FORMAT_EXPECTED); return tEXAM; }
|
||||||
x { return tEXAM; }
|
<INITIAL>help|hel|he|"?" { BEGIN(HELP_CMD); return tHELP; }
|
||||||
|
|
||||||
class|clas|cla { return tCLASS; }
|
<INITIAL>backtrace|backtrac|backtra|backt|back|bac|ba|bt { BEGIN(NOCMD); return tBACKTRACE; }
|
||||||
module|modul|modu|mod { return tMODULE; }
|
<INITIAL>where|wher|whe { BEGIN(NOCMD); return tBACKTRACE; }
|
||||||
queue|queu|que { return tQUEUE; }
|
|
||||||
registers|regs|reg|re { return tREGS; }
|
|
||||||
segments|segment|segm|seg|se { return tSEGMENTS; }
|
|
||||||
stack|stac|sta|st { return tSTACK; }
|
|
||||||
window|windo|wind|win|wnd { return tWND; }
|
|
||||||
|
|
||||||
help|hel|he|"?" { return tHELP; }
|
<INITIAL>cont|con|co|c { BEGIN(NOCMD); return tCONT; }
|
||||||
|
<INITIAL>condition|conditio|conditi|condit|condi|cond { BEGIN(NOCMD); return tCOND; }
|
||||||
|
<INITIAL>step|ste|st|s { BEGIN(NOCMD); return tSTEP; }
|
||||||
|
<INITIAL>next|nex|ne|n { BEGIN(NOCMD); return tNEXT; }
|
||||||
|
<INITIAL>stepi|si { BEGIN(NOCMD); return tSTEPI; }
|
||||||
|
<INITIAL>nexti|ni { BEGIN(NOCMD); return tNEXTI; }
|
||||||
|
<INITIAL>finish|finis|fini|fin|fi { BEGIN(NOCMD); return tFINISH; }
|
||||||
|
|
||||||
backtrace|backtrac|backtra|backt|back|bac|ba|bt { return tBACKTRACE; }
|
<INITIAL>abort|abor|abo { BEGIN(NOCMD); return tABORT; }
|
||||||
where|wher|whe { return tBACKTRACE; }
|
<INITIAL>print|prin|pri|pr|p { BEGIN(FORMAT_EXPECTED); return tPRINT; }
|
||||||
|
|
||||||
cont|con|co|c { return tCONT; }
|
<INITIAL>mode { BEGIN(NOCMD); return tMODE; }
|
||||||
step|ste|st|s { return tSTEP; }
|
<INITIAL>show|sho|sh { BEGIN(SHOW_CMD); return tSHOW; }
|
||||||
next|nex|ne|n { return tNEXT; }
|
|
||||||
|
|
||||||
symbolfile|symbolfil|symbolfi|symbolf|symbol|symbo|symb { return tSYMBOLFILE; }
|
<INFO_CMD,INITIAL>break|brea|bre|br|b { BEGIN(PATH_EXPECTED); return tBREAK; }
|
||||||
|
|
||||||
define|defin|defi|def|de { return tDEFINE; }
|
<INFO_CMD>share|shar|sha { return tSHARE; }
|
||||||
abort|abor|abo { return tABORT; }
|
<INFO_CMD>locals|local|loca|loc { return tLOCAL; }
|
||||||
print|prin|pri|pr|p { return tPRINT; }
|
<INFO_CMD,WALK_CMD>class|clas|cla { return tCLASS; }
|
||||||
|
<INFO_CMD,WALK_CMD>module|modul|modu|mod { return tMODULE; }
|
||||||
|
<INFO_CMD,WALK_CMD>queue|queu|que { return tQUEUE; }
|
||||||
|
<INFO_CMD>registers|regs|reg|re { return tREGS; }
|
||||||
|
<INFO_CMD>segments|segment|segm|seg|se { return tSEGMENTS; }
|
||||||
|
<INFO_CMD>stack|stac|sta|st { return tSTACK; }
|
||||||
|
<INFO_CMD,WALK_CMD>window|windo|wind|win|wnd { return tWND; }
|
||||||
|
<HELP_CMD>info|inf|in { return tINFO; }
|
||||||
|
|
||||||
mode { return tMODE; }
|
<INITIAL,SHOW_CMD>directories|directorie|directori|director|directo|direct|direc|direc|dir {
|
||||||
|
BEGIN(PATH_EXPECTED); return tDIR; }
|
||||||
|
|
||||||
{IDENTIFIER} { yylval.string = make_symbol(yytext); return tIDENTIFIER; }
|
{IDENTIFIER} { yylval.string = make_symbol(yytext); return tIDENTIFIER; }
|
||||||
|
|
||||||
|
<PATH_EXPECTED>{PATHNAME} { yylval.string = make_symbol(yytext); return tPATH; }
|
||||||
|
|
||||||
|
|
||||||
[ \t]+ /* Eat up whitespace */
|
[ \t]+ /* Eat up whitespace */
|
||||||
|
|
||||||
. { if (syntax_error == 0)
|
. { if (syntax_error == 0)
|
||||||
|
@ -137,6 +168,7 @@ mode { return tMODE; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
%%
|
%%
|
||||||
|
|
||||||
#ifndef yywrap
|
#ifndef yywrap
|
||||||
|
@ -217,7 +249,7 @@ static int dbg_read(char * buf, int size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *local_symbols[10];
|
static char *local_symbols[30];
|
||||||
static int next_symbol;
|
static int next_symbol;
|
||||||
|
|
||||||
char * make_symbol(char * symbol){
|
char * make_symbol(char * symbol){
|
||||||
|
|
|
@ -0,0 +1,127 @@
|
||||||
|
/*
|
||||||
|
* File display.c - display handling for Wine internal debugger.
|
||||||
|
*
|
||||||
|
* Copyright (C) 1997, Eric Youngdale.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <neexe.h>
|
||||||
|
#include "module.h"
|
||||||
|
#include "selectors.h"
|
||||||
|
#include "debugger.h"
|
||||||
|
#include "toolhelp.h"
|
||||||
|
#include "xmalloc.h"
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#define MAX_DISPLAY 25
|
||||||
|
static struct expr * displaypoints[MAX_DISPLAY];
|
||||||
|
|
||||||
|
int
|
||||||
|
DEBUG_AddDisplay(struct expr * exp)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* First find a slot where we can store this display.
|
||||||
|
*/
|
||||||
|
for(i=0; i < MAX_DISPLAY; i++ )
|
||||||
|
{
|
||||||
|
if( displaypoints[i] == NULL )
|
||||||
|
{
|
||||||
|
displaypoints[i] = DEBUG_CloneExpr(exp);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DEBUG_InfoDisplay()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* First find a slot where we can store this display.
|
||||||
|
*/
|
||||||
|
for(i=0; i < MAX_DISPLAY; i++ )
|
||||||
|
{
|
||||||
|
if( displaypoints[i] != NULL )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%d : ", i+1);
|
||||||
|
DEBUG_DisplayExpr(displaypoints[i]);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DEBUG_DoDisplay()
|
||||||
|
{
|
||||||
|
DBG_ADDR addr;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* First find a slot where we can store this display.
|
||||||
|
*/
|
||||||
|
for(i=0; i < MAX_DISPLAY; i++ )
|
||||||
|
{
|
||||||
|
if( displaypoints[i] != NULL )
|
||||||
|
{
|
||||||
|
addr = DEBUG_EvalExpr(displaypoints[i]);
|
||||||
|
if( addr.type == NULL )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Unable to evaluate expression ");
|
||||||
|
DEBUG_DisplayExpr(displaypoints[i]);
|
||||||
|
fprintf(stderr, "\nDisabling...\n");
|
||||||
|
DEBUG_DelDisplay(i);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%d : ", i + 1);
|
||||||
|
DEBUG_DisplayExpr(displaypoints[i]);
|
||||||
|
fprintf(stderr, " = ");
|
||||||
|
DEBUG_Print( &addr, 1, 0, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DEBUG_DelDisplay(int displaynum)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if( displaynum >= MAX_DISPLAY || displaynum == 0 || displaynum < -1 )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Invalid display number\n");
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
if( displaynum == -1 )
|
||||||
|
{
|
||||||
|
for(i=0; i < MAX_DISPLAY; i++ )
|
||||||
|
{
|
||||||
|
if( displaypoints[i] != NULL )
|
||||||
|
{
|
||||||
|
DEBUG_FreeExpr(displaypoints[i]);
|
||||||
|
displaypoints[i] = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( displaypoints[displaynum - 1] != NULL )
|
||||||
|
{
|
||||||
|
DEBUG_FreeExpr(displaypoints[displaynum - 1]);
|
||||||
|
displaypoints[displaynum - 1] = NULL;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
|
@ -0,0 +1,878 @@
|
||||||
|
/*
|
||||||
|
* File expr.c - expression handling for Wine internal debugger.
|
||||||
|
*
|
||||||
|
* Copyright (C) 1997, Eric Youngdale.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <neexe.h>
|
||||||
|
#include "module.h"
|
||||||
|
#include "selectors.h"
|
||||||
|
#include "debugger.h"
|
||||||
|
#include "toolhelp.h"
|
||||||
|
#include "xmalloc.h"
|
||||||
|
|
||||||
|
#include "expr.h"
|
||||||
|
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
struct expr
|
||||||
|
{
|
||||||
|
unsigned int perm;
|
||||||
|
unsigned int type:31;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int value;
|
||||||
|
} constant;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
const char * str;
|
||||||
|
} string;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned int value;
|
||||||
|
} u_const;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
const char * name;
|
||||||
|
} symbol;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
enum debug_regs reg;
|
||||||
|
int result;
|
||||||
|
} rgister;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int unop_type;
|
||||||
|
struct expr * exp1;
|
||||||
|
int result;
|
||||||
|
} unop;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int binop_type;
|
||||||
|
int result;
|
||||||
|
struct expr * exp1;
|
||||||
|
struct expr * exp2;
|
||||||
|
} binop;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
struct expr * exp1;
|
||||||
|
const char * element_name;
|
||||||
|
int result;
|
||||||
|
} structure;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
struct expr * base;
|
||||||
|
struct expr * index;
|
||||||
|
} array;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
const char * funcname;
|
||||||
|
int nargs;
|
||||||
|
int result;
|
||||||
|
struct expr * arg[5];
|
||||||
|
} call;
|
||||||
|
|
||||||
|
} un;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define EXPR_TYPE_CONST 0
|
||||||
|
#define EXPR_TYPE_US_CONST 1
|
||||||
|
#define EXPR_TYPE_SYMBOL 2
|
||||||
|
#define EXPR_TYPE_REGISTER 3
|
||||||
|
#define EXPR_TYPE_BINOP 4
|
||||||
|
#define EXPR_TYPE_UNOP 5
|
||||||
|
#define EXPR_TYPE_STRUCT 6
|
||||||
|
#define EXPR_TYPE_PSTRUCT 7
|
||||||
|
#define EXPR_TYPE_ARRAY 8
|
||||||
|
#define EXPR_TYPE_CALL 9
|
||||||
|
#define EXPR_TYPE_STRING 10
|
||||||
|
|
||||||
|
static char expr_list[4096];
|
||||||
|
static int next_expr_free = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is how we turn an expression address into the actual value.
|
||||||
|
* This works well in the 32 bit domain - not sure at all about the
|
||||||
|
* 16 bit world.
|
||||||
|
*/
|
||||||
|
#define VAL(_exp) DEBUG_GetExprValue(&_exp, NULL)
|
||||||
|
|
||||||
|
static
|
||||||
|
struct expr *
|
||||||
|
DEBUG_GetFreeExpr()
|
||||||
|
{
|
||||||
|
struct expr * rtn;
|
||||||
|
|
||||||
|
rtn = (struct expr *) &expr_list[next_expr_free];
|
||||||
|
|
||||||
|
next_expr_free += sizeof(struct expr);
|
||||||
|
return rtn;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DEBUG_FreeExprMem()
|
||||||
|
{
|
||||||
|
next_expr_free = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
struct expr *
|
||||||
|
DEBUG_RegisterExpr(enum debug_regs regno)
|
||||||
|
{
|
||||||
|
struct expr * ex;
|
||||||
|
|
||||||
|
ex = DEBUG_GetFreeExpr();
|
||||||
|
|
||||||
|
ex->type = EXPR_TYPE_REGISTER;
|
||||||
|
ex->un.rgister.reg = regno;
|
||||||
|
return ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct expr *
|
||||||
|
DEBUG_SymbolExpr(const char * name)
|
||||||
|
{
|
||||||
|
struct expr * ex;
|
||||||
|
|
||||||
|
ex = DEBUG_GetFreeExpr();
|
||||||
|
|
||||||
|
ex->type = EXPR_TYPE_SYMBOL;
|
||||||
|
ex->un.symbol.name = name;
|
||||||
|
return ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct expr *
|
||||||
|
DEBUG_ConstExpr(int value)
|
||||||
|
{
|
||||||
|
struct expr * ex;
|
||||||
|
|
||||||
|
ex = DEBUG_GetFreeExpr();
|
||||||
|
|
||||||
|
ex->type = EXPR_TYPE_CONST;
|
||||||
|
ex->un.constant.value = value;
|
||||||
|
return ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct expr *
|
||||||
|
DEBUG_StringExpr(const char * str)
|
||||||
|
{
|
||||||
|
struct expr * ex;
|
||||||
|
char * pnt;
|
||||||
|
ex = DEBUG_GetFreeExpr();
|
||||||
|
|
||||||
|
ex->type = EXPR_TYPE_STRING;
|
||||||
|
ex->un.string.str = str+1;
|
||||||
|
pnt = strrchr(ex->un.string.str, '"');
|
||||||
|
if( pnt != NULL )
|
||||||
|
{
|
||||||
|
*pnt = '\0';
|
||||||
|
}
|
||||||
|
return ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct expr *
|
||||||
|
DEBUG_USConstExpr(unsigned int value)
|
||||||
|
{
|
||||||
|
struct expr * ex;
|
||||||
|
|
||||||
|
ex = DEBUG_GetFreeExpr();
|
||||||
|
|
||||||
|
ex->type = EXPR_TYPE_CONST;
|
||||||
|
ex->un.u_const.value = value;
|
||||||
|
return ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct expr *
|
||||||
|
DEBUG_BinopExpr(int operator_type, struct expr * exp1, struct expr * exp2)
|
||||||
|
{
|
||||||
|
struct expr * ex;
|
||||||
|
|
||||||
|
ex = DEBUG_GetFreeExpr();
|
||||||
|
|
||||||
|
ex->type = EXPR_TYPE_BINOP;
|
||||||
|
ex->un.binop.binop_type = operator_type;
|
||||||
|
ex->un.binop.exp1 = exp1;
|
||||||
|
ex->un.binop.exp2 = exp2;
|
||||||
|
return ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct expr *
|
||||||
|
DEBUG_UnopExpr(int operator_type, struct expr * exp1)
|
||||||
|
{
|
||||||
|
struct expr * ex;
|
||||||
|
|
||||||
|
ex = DEBUG_GetFreeExpr();
|
||||||
|
|
||||||
|
ex->type = EXPR_TYPE_UNOP;
|
||||||
|
ex->un.unop.unop_type = operator_type;
|
||||||
|
ex->un.unop.exp1 = exp1;
|
||||||
|
return ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct expr *
|
||||||
|
DEBUG_StructExpr(struct expr * exp, const char * element)
|
||||||
|
{
|
||||||
|
struct expr * ex;
|
||||||
|
|
||||||
|
ex = DEBUG_GetFreeExpr();
|
||||||
|
|
||||||
|
ex->type = EXPR_TYPE_STRUCT;
|
||||||
|
ex->un.structure.exp1 = exp;
|
||||||
|
ex->un.structure.element_name = element;
|
||||||
|
return ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct expr *
|
||||||
|
DEBUG_StructPExpr(struct expr * exp, const char * element)
|
||||||
|
{
|
||||||
|
struct expr * ex;
|
||||||
|
|
||||||
|
ex = DEBUG_GetFreeExpr();
|
||||||
|
|
||||||
|
ex->type = EXPR_TYPE_PSTRUCT;
|
||||||
|
ex->un.structure.exp1 = exp;
|
||||||
|
ex->un.structure.element_name = element;
|
||||||
|
return ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct expr *
|
||||||
|
DEBUG_CallExpr(const char * funcname, int nargs, ...)
|
||||||
|
{
|
||||||
|
struct expr * ex;
|
||||||
|
va_list ap;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
ex = DEBUG_GetFreeExpr();
|
||||||
|
|
||||||
|
ex->type = EXPR_TYPE_CALL;
|
||||||
|
ex->un.call.funcname = funcname;
|
||||||
|
ex->un.call.nargs = nargs;
|
||||||
|
|
||||||
|
va_start(ap, nargs);
|
||||||
|
for(i=0; i < nargs; i++)
|
||||||
|
{
|
||||||
|
ex->un.call.arg[i] = va_arg(ap, struct expr *);
|
||||||
|
}
|
||||||
|
va_end(ap);
|
||||||
|
return ex;
|
||||||
|
}
|
||||||
|
|
||||||
|
DBG_ADDR
|
||||||
|
DEBUG_EvalExpr(struct expr * exp)
|
||||||
|
{
|
||||||
|
DBG_ADDR rtn;
|
||||||
|
int i;
|
||||||
|
DBG_ADDR exp1;
|
||||||
|
DBG_ADDR exp2;
|
||||||
|
unsigned int cexp[5];
|
||||||
|
int (*fptr)();
|
||||||
|
int scale1;
|
||||||
|
int scale2;
|
||||||
|
int scale3;
|
||||||
|
struct datatype * type1;
|
||||||
|
struct datatype * type2;
|
||||||
|
|
||||||
|
rtn.type = NULL;
|
||||||
|
rtn.off = NULL;
|
||||||
|
rtn.seg = NULL;
|
||||||
|
|
||||||
|
switch(exp->type)
|
||||||
|
{
|
||||||
|
case EXPR_TYPE_STRING:
|
||||||
|
rtn.type = DEBUG_TypeString;
|
||||||
|
rtn.off = (unsigned int) &exp->un.string.str;
|
||||||
|
rtn.seg = 0;
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_CONST:
|
||||||
|
rtn.type = DEBUG_TypeIntConst;
|
||||||
|
rtn.off = (unsigned int) &exp->un.constant.value;
|
||||||
|
rtn.seg = 0;
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_US_CONST:
|
||||||
|
rtn.type = DEBUG_TypeUSInt;
|
||||||
|
rtn.off = (unsigned int) &exp->un.u_const.value;
|
||||||
|
rtn.seg = 0;
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_SYMBOL:
|
||||||
|
if( !DEBUG_GetSymbolValue(exp->un.symbol.name, -1, &rtn, FALSE ) )
|
||||||
|
{
|
||||||
|
rtn.type = NULL;
|
||||||
|
rtn.off = 0;
|
||||||
|
rtn.seg = 0;
|
||||||
|
};
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_PSTRUCT:
|
||||||
|
exp1 = DEBUG_EvalExpr(exp->un.structure.exp1);
|
||||||
|
if( exp1.type == NULL )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
rtn.off = DEBUG_TypeDerefPointer(&exp1, &type1);
|
||||||
|
if( type1 == NULL )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
rtn.type = type1;
|
||||||
|
DEBUG_FindStructElement(&rtn, exp->un.structure.element_name,
|
||||||
|
&exp->un.structure.result);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_STRUCT:
|
||||||
|
exp1 = DEBUG_EvalExpr(exp->un.structure.exp1);
|
||||||
|
if( exp1.type == NULL )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
rtn = exp1;
|
||||||
|
DEBUG_FindStructElement(&rtn, exp->un.structure.element_name,
|
||||||
|
&exp->un.structure.result);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_CALL:
|
||||||
|
/*
|
||||||
|
* First, evaluate all of the arguments. If any of them are not
|
||||||
|
* evaluable, then bail.
|
||||||
|
*/
|
||||||
|
for(i=0; i < exp->un.call.nargs; i++)
|
||||||
|
{
|
||||||
|
exp1 = DEBUG_EvalExpr(exp->un.call.arg[i]);
|
||||||
|
if( exp1.type == NULL )
|
||||||
|
{
|
||||||
|
return rtn;
|
||||||
|
}
|
||||||
|
cexp[i] = DEBUG_GetExprValue(&exp1, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now look up the address of the function itself.
|
||||||
|
*/
|
||||||
|
if( !DEBUG_GetSymbolValue(exp->un.call.funcname, -1, &rtn, FALSE ) )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Failed to find symbol\n");
|
||||||
|
break;
|
||||||
|
};
|
||||||
|
|
||||||
|
fptr = (int (*)()) rtn.off;
|
||||||
|
switch(exp->un.call.nargs)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
exp->un.call.result = (*fptr)();
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
exp->un.call.result = (*fptr)(cexp[0]);
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
exp->un.call.result = (*fptr)(cexp[0], cexp[1]);
|
||||||
|
break;
|
||||||
|
case 3:
|
||||||
|
exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2]);
|
||||||
|
break;
|
||||||
|
case 4:
|
||||||
|
exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2], cexp[3]);
|
||||||
|
break;
|
||||||
|
case 5:
|
||||||
|
exp->un.call.result = (*fptr)(cexp[0], cexp[1], cexp[2], cexp[3], cexp[4]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
rtn.type = DEBUG_TypeInt;
|
||||||
|
rtn.off = (unsigned int) &exp->un.call.result;
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_REGISTER:
|
||||||
|
rtn.type = DEBUG_TypeIntConst;
|
||||||
|
exp->un.rgister.result = DEBUG_GetRegister(exp->un.rgister.reg);
|
||||||
|
rtn.off = (unsigned int) &exp->un.rgister.result;
|
||||||
|
rtn.seg = 0;
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_BINOP:
|
||||||
|
exp1 = DEBUG_EvalExpr(exp->un.binop.exp1);
|
||||||
|
exp2 = DEBUG_EvalExpr(exp->un.binop.exp2);
|
||||||
|
if( exp1.type == NULL || exp2.type == NULL )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if( exp1.type == DEBUG_TypeIntConst && exp2.type == DEBUG_TypeIntConst )
|
||||||
|
{
|
||||||
|
rtn.type = exp1.type;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rtn.type = DEBUG_TypeInt;
|
||||||
|
}
|
||||||
|
rtn.off = (unsigned int) &exp->un.binop.result;
|
||||||
|
switch(exp->un.binop.binop_type)
|
||||||
|
{
|
||||||
|
case EXP_OP_ADD:
|
||||||
|
type1 = DEBUG_GetPointerType(exp1.type);
|
||||||
|
type2 = DEBUG_GetPointerType(exp2.type);
|
||||||
|
scale1 = 1;
|
||||||
|
scale2 = 1;
|
||||||
|
if( type1 != NULL && type2 != NULL )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if( type1 != NULL )
|
||||||
|
{
|
||||||
|
scale2 = DEBUG_GetObjectSize(type1);
|
||||||
|
rtn.type = exp1.type;
|
||||||
|
}
|
||||||
|
else if( type2 != NULL )
|
||||||
|
{
|
||||||
|
scale1 = DEBUG_GetObjectSize(type2);
|
||||||
|
rtn.type = exp2.type;
|
||||||
|
}
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = (VAL(exp1) * scale1 + scale2 * VAL(exp2));
|
||||||
|
break;
|
||||||
|
case EXP_OP_SUB:
|
||||||
|
type1 = DEBUG_GetPointerType(exp1.type);
|
||||||
|
type2 = DEBUG_GetPointerType(exp2.type);
|
||||||
|
scale1 = 1;
|
||||||
|
scale2 = 1;
|
||||||
|
scale3 = 1;
|
||||||
|
if( type1 != NULL && type2 != NULL )
|
||||||
|
{
|
||||||
|
if( type1 != type2 )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
scale3 = DEBUG_GetObjectSize(type1);
|
||||||
|
}
|
||||||
|
else if( type1 != NULL )
|
||||||
|
{
|
||||||
|
scale2 = DEBUG_GetObjectSize(type1);
|
||||||
|
rtn.type = exp1.type;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if( type2 != NULL )
|
||||||
|
{
|
||||||
|
scale1 = DEBUG_GetObjectSize(type2);
|
||||||
|
rtn.type = exp2.type;
|
||||||
|
}
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = (VAL(exp1) - VAL(exp2)) / scale3;
|
||||||
|
break;
|
||||||
|
case EXP_OP_SEG:
|
||||||
|
rtn.seg = VAL(exp1);
|
||||||
|
exp->un.binop.result = VAL(exp2);
|
||||||
|
break;
|
||||||
|
case EXP_OP_LOR:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = (VAL(exp1) || VAL(exp2));
|
||||||
|
break;
|
||||||
|
case EXP_OP_LAND:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = (VAL(exp1) && VAL(exp2));
|
||||||
|
break;
|
||||||
|
case EXP_OP_OR:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = (VAL(exp1) | VAL(exp2));
|
||||||
|
break;
|
||||||
|
case EXP_OP_AND:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = (VAL(exp1) & VAL(exp2));
|
||||||
|
break;
|
||||||
|
case EXP_OP_XOR:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = (VAL(exp1) ^ VAL(exp2));
|
||||||
|
break;
|
||||||
|
case EXP_OP_EQ:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = (VAL(exp1) == VAL(exp2));
|
||||||
|
break;
|
||||||
|
case EXP_OP_GT:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = (VAL(exp1) > VAL(exp2));
|
||||||
|
break;
|
||||||
|
case EXP_OP_LT:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = (VAL(exp1) < VAL(exp2));
|
||||||
|
break;
|
||||||
|
case EXP_OP_GE:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = (VAL(exp1) >= VAL(exp2));
|
||||||
|
break;
|
||||||
|
case EXP_OP_LE:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = (VAL(exp1) <= VAL(exp2));
|
||||||
|
break;
|
||||||
|
case EXP_OP_NE:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = (VAL(exp1) != VAL(exp2));
|
||||||
|
break;
|
||||||
|
case EXP_OP_SHL:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = ((unsigned) VAL(exp1) << VAL(exp2));
|
||||||
|
break;
|
||||||
|
case EXP_OP_SHR:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = ((unsigned) VAL(exp1) << VAL(exp2));
|
||||||
|
break;
|
||||||
|
case EXP_OP_MUL:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = (VAL(exp1) * VAL(exp2));
|
||||||
|
break;
|
||||||
|
case EXP_OP_DIV:
|
||||||
|
if( VAL(exp2) != 0 )
|
||||||
|
{
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = (VAL(exp1) / VAL(exp2));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rtn.seg = 0;
|
||||||
|
rtn.type = NULL;
|
||||||
|
rtn.off = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EXP_OP_REM:
|
||||||
|
if( VAL(exp2) != 0 )
|
||||||
|
{
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.binop.result = (VAL(exp1) % VAL(exp2));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rtn.seg = 0;
|
||||||
|
rtn.type = NULL;
|
||||||
|
rtn.off = 0;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EXP_OP_ARR:
|
||||||
|
DEBUG_ArrayIndex(&exp1, &rtn, VAL(exp2));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_UNOP:
|
||||||
|
exp1 = DEBUG_EvalExpr(exp->un.unop.exp1);
|
||||||
|
if( exp1.type == NULL )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
rtn.off = (unsigned int) &exp->un.unop.result;
|
||||||
|
if( exp1.type == DEBUG_TypeIntConst )
|
||||||
|
{
|
||||||
|
rtn.type = exp1.type;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rtn.type = DEBUG_TypeInt;
|
||||||
|
}
|
||||||
|
switch(exp->un.binop.binop_type)
|
||||||
|
{
|
||||||
|
case EXP_OP_NEG:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.unop.result = -VAL(exp1);
|
||||||
|
break;
|
||||||
|
case EXP_OP_NOT:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.unop.result = !VAL(exp1);
|
||||||
|
break;
|
||||||
|
case EXP_OP_LNOT:
|
||||||
|
rtn.seg = 0;
|
||||||
|
exp->un.unop.result = ~VAL(exp1);
|
||||||
|
break;
|
||||||
|
case EXP_OP_DEREF:
|
||||||
|
rtn.seg = 0;
|
||||||
|
rtn.off = (unsigned int) DEBUG_TypeDerefPointer(&exp1, &rtn.type);
|
||||||
|
break;
|
||||||
|
case EXP_OP_FORCE_DEREF:
|
||||||
|
rtn.seg = 0;
|
||||||
|
rtn.off = *(unsigned int *) exp1.off;
|
||||||
|
break;
|
||||||
|
case EXP_OP_ADDR:
|
||||||
|
rtn.seg = 0;
|
||||||
|
rtn.type = DEBUG_FindOrMakePointerType(exp1.type);
|
||||||
|
exp->un.unop.result = exp1.off;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr,"Unexpected expression.\n");
|
||||||
|
exit(123);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rtn;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
DEBUG_DisplayExpr(struct expr * exp)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
|
||||||
|
switch(exp->type)
|
||||||
|
{
|
||||||
|
case EXPR_TYPE_REGISTER:
|
||||||
|
DEBUG_PrintRegister(exp->un.rgister.reg);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_US_CONST:
|
||||||
|
fprintf(stderr, "%ud", exp->un.u_const.value);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_CONST:
|
||||||
|
fprintf(stderr, "%d", exp->un.u_const.value);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_STRING:
|
||||||
|
fprintf(stderr, "\"%s\"", exp->un.string.str);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_SYMBOL:
|
||||||
|
fprintf(stderr, "%s" , exp->un.symbol.name);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_PSTRUCT:
|
||||||
|
DEBUG_DisplayExpr(exp->un.structure.exp1);
|
||||||
|
fprintf(stderr, "->%s", exp->un.structure.element_name);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_STRUCT:
|
||||||
|
DEBUG_DisplayExpr(exp->un.structure.exp1);
|
||||||
|
fprintf(stderr, ".%s", exp->un.structure.element_name);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_CALL:
|
||||||
|
/*
|
||||||
|
* First, evaluate all of the arguments. If any of them are not
|
||||||
|
* evaluable, then bail.
|
||||||
|
*/
|
||||||
|
fprintf(stderr, "%s(",exp->un.call.funcname);
|
||||||
|
for(i=0; i < exp->un.call.nargs; i++)
|
||||||
|
{
|
||||||
|
DEBUG_DisplayExpr(exp->un.call.arg[i]);
|
||||||
|
if( i != exp->un.call.nargs - 1 )
|
||||||
|
{
|
||||||
|
fprintf(stderr, ", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(stderr, ")");
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_BINOP:
|
||||||
|
fprintf(stderr, "( ");
|
||||||
|
DEBUG_DisplayExpr(exp->un.binop.exp1);
|
||||||
|
switch(exp->un.binop.binop_type)
|
||||||
|
{
|
||||||
|
case EXP_OP_ADD:
|
||||||
|
fprintf(stderr, " + ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_SUB:
|
||||||
|
fprintf(stderr, " - ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_SEG:
|
||||||
|
fprintf(stderr, ":");
|
||||||
|
break;
|
||||||
|
case EXP_OP_LOR:
|
||||||
|
fprintf(stderr, " || ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_LAND:
|
||||||
|
fprintf(stderr, " && ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_OR:
|
||||||
|
fprintf(stderr, " | ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_AND:
|
||||||
|
fprintf(stderr, " & ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_XOR:
|
||||||
|
fprintf(stderr, " ^ ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_EQ:
|
||||||
|
fprintf(stderr, " == ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_GT:
|
||||||
|
fprintf(stderr, " > ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_LT:
|
||||||
|
fprintf(stderr, " < ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_GE:
|
||||||
|
fprintf(stderr, " >= ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_LE:
|
||||||
|
fprintf(stderr, " <= ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_NE:
|
||||||
|
fprintf(stderr, " != ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_SHL:
|
||||||
|
fprintf(stderr, " << ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_SHR:
|
||||||
|
fprintf(stderr, " >> ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_MUL:
|
||||||
|
fprintf(stderr, " * ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_DIV:
|
||||||
|
fprintf(stderr, " / ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_REM:
|
||||||
|
fprintf(stderr, " %% ");
|
||||||
|
break;
|
||||||
|
case EXP_OP_ARR:
|
||||||
|
fprintf(stderr, "[");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
DEBUG_DisplayExpr(exp->un.binop.exp2);
|
||||||
|
if( exp->un.binop.binop_type == EXP_OP_ARR )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "]");
|
||||||
|
}
|
||||||
|
fprintf(stderr, " )");
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_UNOP:
|
||||||
|
switch(exp->un.binop.binop_type)
|
||||||
|
{
|
||||||
|
case EXP_OP_NEG:
|
||||||
|
fprintf(stderr, "-");
|
||||||
|
break;
|
||||||
|
case EXP_OP_NOT:
|
||||||
|
fprintf(stderr, "!");
|
||||||
|
break;
|
||||||
|
case EXP_OP_LNOT:
|
||||||
|
fprintf(stderr, "~");
|
||||||
|
break;
|
||||||
|
case EXP_OP_DEREF:
|
||||||
|
fprintf(stderr, "*");
|
||||||
|
break;
|
||||||
|
case EXP_OP_ADDR:
|
||||||
|
fprintf(stderr, "&");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
DEBUG_DisplayExpr(exp->un.unop.exp1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr,"Unexpected expression.\n");
|
||||||
|
exit(123);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct expr *
|
||||||
|
DEBUG_CloneExpr(struct expr * exp)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
struct expr * rtn;
|
||||||
|
|
||||||
|
rtn = (struct expr *) xmalloc(sizeof(struct expr));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* First copy the contents of the expression itself.
|
||||||
|
*/
|
||||||
|
*rtn = *exp;
|
||||||
|
|
||||||
|
|
||||||
|
switch(exp->type)
|
||||||
|
{
|
||||||
|
case EXPR_TYPE_REGISTER:
|
||||||
|
case EXPR_TYPE_US_CONST:
|
||||||
|
case EXPR_TYPE_CONST:
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_STRING:
|
||||||
|
rtn->un.string.str = xstrdup(exp->un.string.str);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_SYMBOL:
|
||||||
|
rtn->un.symbol.name = xstrdup(exp->un.symbol.name);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_PSTRUCT:
|
||||||
|
case EXPR_TYPE_STRUCT:
|
||||||
|
rtn->un.structure.exp1 = DEBUG_CloneExpr(exp->un.structure.exp1);
|
||||||
|
rtn->un.structure.element_name = xstrdup(exp->un.structure.element_name);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_CALL:
|
||||||
|
/*
|
||||||
|
* First, evaluate all of the arguments. If any of them are not
|
||||||
|
* evaluable, then bail.
|
||||||
|
*/
|
||||||
|
for(i=0; i < exp->un.call.nargs; i++)
|
||||||
|
{
|
||||||
|
rtn->un.call.arg[i] = DEBUG_CloneExpr(exp->un.call.arg[i]);
|
||||||
|
}
|
||||||
|
rtn->un.call.funcname = xstrdup(exp->un.call.funcname);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_BINOP:
|
||||||
|
rtn->un.binop.exp1 = DEBUG_CloneExpr(exp->un.binop.exp1);
|
||||||
|
rtn->un.binop.exp2 = DEBUG_CloneExpr(exp->un.binop.exp2);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_UNOP:
|
||||||
|
rtn->un.unop.exp1 = DEBUG_CloneExpr(exp->un.unop.exp1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr,"Unexpected expression.\n");
|
||||||
|
exit(123);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rtn;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Recursively go through an expression tree and free all memory associated
|
||||||
|
* with it.
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
DEBUG_FreeExpr(struct expr * exp)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
switch(exp->type)
|
||||||
|
{
|
||||||
|
case EXPR_TYPE_REGISTER:
|
||||||
|
case EXPR_TYPE_US_CONST:
|
||||||
|
case EXPR_TYPE_CONST:
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_STRING:
|
||||||
|
free((char *) exp->un.string.str);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_SYMBOL:
|
||||||
|
free((char *) exp->un.symbol.name);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_PSTRUCT:
|
||||||
|
case EXPR_TYPE_STRUCT:
|
||||||
|
DEBUG_FreeExpr(exp->un.structure.exp1);
|
||||||
|
free((char *) exp->un.structure.element_name);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_CALL:
|
||||||
|
/*
|
||||||
|
* First, evaluate all of the arguments. If any of them are not
|
||||||
|
* evaluable, then bail.
|
||||||
|
*/
|
||||||
|
for(i=0; i < exp->un.call.nargs; i++)
|
||||||
|
{
|
||||||
|
DEBUG_FreeExpr(exp->un.call.arg[i]);
|
||||||
|
}
|
||||||
|
free((char *) exp->un.call.funcname);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_BINOP:
|
||||||
|
DEBUG_FreeExpr(exp->un.binop.exp1);
|
||||||
|
DEBUG_FreeExpr(exp->un.binop.exp2);
|
||||||
|
break;
|
||||||
|
case EXPR_TYPE_UNOP:
|
||||||
|
DEBUG_FreeExpr(exp->un.unop.exp1);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr,"Unexpected expression.\n");
|
||||||
|
exit(123);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(exp);
|
||||||
|
return TRUE;
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
#define EXP_OP_LOR 0x01
|
||||||
|
#define EXP_OP_LAND 0x02
|
||||||
|
#define EXP_OP_OR 0x03
|
||||||
|
#define EXP_OP_AND 0x04
|
||||||
|
#define EXP_OP_XOR 0x05
|
||||||
|
#define EXP_OP_EQ 0x06
|
||||||
|
#define EXP_OP_GT 0x07
|
||||||
|
#define EXP_OP_LT 0x08
|
||||||
|
#define EXP_OP_GE 0x09
|
||||||
|
#define EXP_OP_LE 0x0a
|
||||||
|
#define EXP_OP_NE 0x0b
|
||||||
|
#define EXP_OP_SHL 0x0c
|
||||||
|
#define EXP_OP_SHR 0x0d
|
||||||
|
#define EXP_OP_ADD 0x0e
|
||||||
|
#define EXP_OP_SUB 0x0f
|
||||||
|
#define EXP_OP_MUL 0x10
|
||||||
|
#define EXP_OP_DIV 0x11
|
||||||
|
#define EXP_OP_REM 0x12
|
||||||
|
#define EXP_OP_NEG 0x13
|
||||||
|
#define EXP_OP_NOT 0x24
|
||||||
|
#define EXP_OP_LNOT 0x25
|
||||||
|
#define EXP_OP_DEREF 0x26
|
||||||
|
#define EXP_OP_ADDR 0x27
|
||||||
|
#define EXP_OP_ARR 0x28
|
||||||
|
#define EXP_OP_SEG 0x29
|
||||||
|
#define EXP_OP_FORCE_DEREF 0x2a
|
882
debugger/hash.c
882
debugger/hash.c
File diff suppressed because it is too large
Load Diff
143
debugger/info.c
143
debugger/info.c
|
@ -8,66 +8,56 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "debugger.h"
|
#include "debugger.h"
|
||||||
|
#include "expr.h"
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DEBUG_Print
|
* DEBUG_Print
|
||||||
*
|
*
|
||||||
* Implementation of the 'print' command.
|
* Implementation of the 'print' command.
|
||||||
*/
|
*/
|
||||||
void DEBUG_Print( const DBG_ADDR *addr, int count, char format )
|
void DEBUG_PrintBasic( const DBG_ADDR *addr, int count, char format )
|
||||||
{
|
{
|
||||||
if (count != 1)
|
char * default_format;
|
||||||
|
long long int value;
|
||||||
|
|
||||||
|
if( addr->type == NULL )
|
||||||
{
|
{
|
||||||
fprintf( stderr, "Count other than 1 is meaningless in 'print' command\n" );
|
fprintf(stderr, "Unable to evaluate expression\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (addr->seg && (addr->seg != 0xffffffff))
|
default_format = NULL;
|
||||||
{
|
value = DEBUG_GetExprValue((DBG_ADDR *) addr, &default_format);
|
||||||
switch(format)
|
|
||||||
{
|
|
||||||
case 'x':
|
|
||||||
fprintf( stderr, "0x%04lx:", addr->seg );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'd':
|
switch(format)
|
||||||
fprintf( stderr, "%ld:", addr->seg );
|
|
||||||
break;
|
|
||||||
|
|
||||||
case 'c':
|
|
||||||
break; /* No segment to print */
|
|
||||||
|
|
||||||
case 'i':
|
|
||||||
case 's':
|
|
||||||
case 'w':
|
|
||||||
case 'b':
|
|
||||||
break; /* Meaningless format */
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
switch(format)
|
|
||||||
{
|
{
|
||||||
case 'x':
|
case 'x':
|
||||||
if (addr->seg) fprintf( stderr, "0x%04lx\n", addr->off );
|
if (addr->seg) fprintf( stderr, "0x%04lx", (long unsigned int) value );
|
||||||
else fprintf( stderr, "0x%08lx\n", addr->off );
|
else fprintf( stderr, "0x%08lx", (long unsigned int) value );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'd':
|
case 'd':
|
||||||
fprintf( stderr, "%ld\n", addr->off );
|
fprintf( stderr, "%ld\n", (long int) value );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'c':
|
case 'c':
|
||||||
fprintf( stderr, "%d = '%c'\n",
|
fprintf( stderr, "%d = '%c'",
|
||||||
(char)(addr->off & 0xff), (char)(addr->off & 0xff) );
|
(char)(value & 0xff), (char)(value & 0xff) );
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'i':
|
case 'i':
|
||||||
case 's':
|
case 's':
|
||||||
case 'w':
|
case 'w':
|
||||||
case 'b':
|
case 'b':
|
||||||
fprintf( stderr, "Format specifier '%c' is meaningless in 'print' command\n", format );
|
fprintf( stderr, "Format specifier '%c' is meaningless in 'print' command\n", format );
|
||||||
break;
|
case 0:
|
||||||
|
if( default_format != NULL )
|
||||||
|
{
|
||||||
|
fprintf( stderr, default_format, value );
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -76,17 +66,19 @@ void DEBUG_Print( const DBG_ADDR *addr, int count, char format )
|
||||||
*
|
*
|
||||||
* Print an 16- or 32-bit address, with the nearest symbol if any.
|
* Print an 16- or 32-bit address, with the nearest symbol if any.
|
||||||
*/
|
*/
|
||||||
struct name_hash *
|
struct symbol_info
|
||||||
DEBUG_PrintAddress( const DBG_ADDR *addr, int addrlen, int flag )
|
DEBUG_PrintAddress( const DBG_ADDR *addr, int addrlen, int flag )
|
||||||
{
|
{
|
||||||
struct name_hash * nh;
|
struct symbol_info rtn;
|
||||||
const char *name = DEBUG_FindNearestSymbol( addr, flag, &nh, 0 );
|
|
||||||
|
const char *name = DEBUG_FindNearestSymbol( addr, flag, &rtn.sym, 0,
|
||||||
|
&rtn.list );
|
||||||
|
|
||||||
if (addr->seg) fprintf( stderr, "0x%04lx:", addr->seg );
|
if (addr->seg) fprintf( stderr, "0x%04lx:", addr->seg );
|
||||||
if (addrlen == 16) fprintf( stderr, "0x%04lx", addr->off );
|
if (addrlen == 16) fprintf( stderr, "0x%04lx", addr->off );
|
||||||
else fprintf( stderr, "0x%08lx", addr->off );
|
else fprintf( stderr, "0x%08lx", addr->off );
|
||||||
if (name) fprintf( stderr, " (%s)", name );
|
if (name) fprintf( stderr, " (%s)", name );
|
||||||
return nh;
|
return rtn;
|
||||||
}
|
}
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DEBUG_PrintAddressAndArgs
|
* DEBUG_PrintAddressAndArgs
|
||||||
|
@ -95,19 +87,21 @@ DEBUG_PrintAddress( const DBG_ADDR *addr, int addrlen, int flag )
|
||||||
* Similar to DEBUG_PrintAddress, but we print the arguments to
|
* Similar to DEBUG_PrintAddress, but we print the arguments to
|
||||||
* each function (if known). This is useful in a backtrace.
|
* each function (if known). This is useful in a backtrace.
|
||||||
*/
|
*/
|
||||||
struct name_hash *
|
struct symbol_info
|
||||||
DEBUG_PrintAddressAndArgs( const DBG_ADDR *addr, int addrlen,
|
DEBUG_PrintAddressAndArgs( const DBG_ADDR *addr, int addrlen,
|
||||||
unsigned int ebp, int flag )
|
unsigned int ebp, int flag )
|
||||||
{
|
{
|
||||||
struct name_hash * nh;
|
struct symbol_info rtn;
|
||||||
const char *name = DEBUG_FindNearestSymbol( addr, flag, &nh, ebp );
|
|
||||||
|
const char *name = DEBUG_FindNearestSymbol( addr, flag, &rtn.sym, ebp,
|
||||||
|
&rtn.list );
|
||||||
|
|
||||||
if (addr->seg) fprintf( stderr, "0x%04lx:", addr->seg );
|
if (addr->seg) fprintf( stderr, "0x%04lx:", addr->seg );
|
||||||
if (addrlen == 16) fprintf( stderr, "0x%04lx", addr->off );
|
if (addrlen == 16) fprintf( stderr, "0x%04lx", addr->off );
|
||||||
else fprintf( stderr, "0x%08lx", addr->off );
|
else fprintf( stderr, "0x%08lx", addr->off );
|
||||||
if (name) fprintf( stderr, " (%s)", name );
|
if (name) fprintf( stderr, " (%s)", name );
|
||||||
|
|
||||||
return nh;
|
return rtn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -121,23 +115,28 @@ void DEBUG_Help(void)
|
||||||
int i = 0;
|
int i = 0;
|
||||||
static const char * const helptext[] =
|
static const char * const helptext[] =
|
||||||
{
|
{
|
||||||
"The commands accepted by the Wine debugger are a small subset",
|
"The commands accepted by the Wine debugger are a reasonable",
|
||||||
"of the commands that gdb would accept.",
|
"of the commands that gdb accepts.",
|
||||||
"The commands currently are:",
|
"The commands currently are:",
|
||||||
" break [*<addr>] delete break bpnum",
|
" break [*<addr>] delete break bpnum",
|
||||||
" disable bpnum enable bpnum",
|
" disable bpnum enable bpnum",
|
||||||
|
" condition <bpnum> [<expr>]",
|
||||||
|
|
||||||
" help quit",
|
" help quit",
|
||||||
" bt cont",
|
" bt cont [N]",
|
||||||
" step next",
|
" step [N] next [N]",
|
||||||
|
" stepi [N] nexti [N]",
|
||||||
" x <addr> print <expr>",
|
" x <addr> print <expr>",
|
||||||
" set <reg> = <expr> set *<addr> = <expr>",
|
" set <reg> = <expr> set *<addr> = <expr>",
|
||||||
" symbolfile <filename> define <identifier> <addr>",
|
" up down",
|
||||||
" up down\n",
|
" list <lines> frame <n>",
|
||||||
" list <addr> frame <n>\n",
|
" finish show dir",
|
||||||
|
" dir <path> display <expr>",
|
||||||
|
" delete display <disnum> undisplay <disnum>\n",
|
||||||
|
|
||||||
"Wine-specific commands:",
|
"Wine-specific commands:",
|
||||||
" mode [16,32] walk [wnd,class,queue] <handle>",
|
" mode [16,32] walk [wnd,class,queue] <handle>",
|
||||||
" info [reg,stack,break,segments,locals] info [wnd, queue] <handle>\n",
|
" info (see 'help info' for options)\n",
|
||||||
|
|
||||||
"The 'x' command accepts repeat counts and formats (including 'i') in the",
|
"The 'x' command accepts repeat counts and formats (including 'i') in the",
|
||||||
"same way that gdb does.\n",
|
"same way that gdb does.\n",
|
||||||
|
@ -155,25 +154,31 @@ NULL
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DEBUG_List
|
* DEBUG_HelpInfo
|
||||||
*
|
*
|
||||||
* Implementation of the 'list' command.
|
* Implementation of the 'help info' command.
|
||||||
*/
|
*/
|
||||||
void DEBUG_List( DBG_ADDR *addr, int count )
|
void DEBUG_HelpInfo(void)
|
||||||
{
|
{
|
||||||
static DBG_ADDR lasttime = { 0xffffffff, 0 };
|
int i = 0;
|
||||||
|
static const char * const infotext[] =
|
||||||
|
{
|
||||||
|
"The info commands allow you to get assorted bits of interesting stuff",
|
||||||
|
"to be displayed. The options are:",
|
||||||
|
" info break Dumps information about breakpoints",
|
||||||
|
" info display Shows auto-display expressions in use",
|
||||||
|
" info locals Displays values of all local vars for current frame",
|
||||||
|
" info module Displays information about all modules",
|
||||||
|
" info queue <handle> Dumps queue information",
|
||||||
|
" info reg Displays values in all registers at top of stack",
|
||||||
|
" info segments Dumps information about all known segments",
|
||||||
|
" info share Dumps information about shared libraries",
|
||||||
|
" info stack Dumps information about top of stack",
|
||||||
|
" info wnd <handle> Dumps information about all windows",
|
||||||
|
"",
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
if (addr == NULL) addr = &lasttime;
|
while(infotext[i]) fprintf(stderr,"%s\n", infotext[i++]);
|
||||||
DBG_FIX_ADDR_SEG( addr, CS_reg(&DEBUG_context) );
|
|
||||||
while (count-- > 0)
|
|
||||||
{
|
|
||||||
DEBUG_PrintAddress( addr, dbg_mode, FALSE );
|
|
||||||
fprintf( stderr, ": " );
|
|
||||||
if (!DBG_CHECK_READ_PTR( addr, 1 )) return;
|
|
||||||
DEBUG_Disasm( addr );
|
|
||||||
fprintf (stderr, "\n");
|
|
||||||
}
|
|
||||||
lasttime = *addr;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -142,15 +142,31 @@ void DEBUG_WriteMemory( const DBG_ADDR *address, int value )
|
||||||
*/
|
*/
|
||||||
void DEBUG_ExamineMemory( const DBG_ADDR *address, int count, char format )
|
void DEBUG_ExamineMemory( const DBG_ADDR *address, int count, char format )
|
||||||
{
|
{
|
||||||
DBG_ADDR addr = *address;
|
DBG_ADDR addr = * address;
|
||||||
unsigned char * pnt;
|
unsigned int * dump;
|
||||||
unsigned int * dump;
|
int i;
|
||||||
unsigned short int * wdump;
|
unsigned char * pnt;
|
||||||
int i;
|
struct datatype * testtype;
|
||||||
|
unsigned short int * wdump;
|
||||||
|
|
||||||
DBG_FIX_ADDR_SEG( &addr, (format == 'i') ?
|
DBG_FIX_ADDR_SEG( &addr, (format == 'i') ?
|
||||||
CS_reg(&DEBUG_context) : DS_reg(&DEBUG_context) );
|
CS_reg(&DEBUG_context) : DS_reg(&DEBUG_context) );
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Dereference pointer to get actual memory address we need to be
|
||||||
|
* reading. We will use the same segment as what we have already,
|
||||||
|
* and hope that this is a sensible thing to do.
|
||||||
|
*/
|
||||||
|
if( addr.type != NULL )
|
||||||
|
{
|
||||||
|
if (!DBG_CHECK_READ_PTR( &addr, 1 )) return;
|
||||||
|
DEBUG_TypeDerefPointer(&addr, &testtype);
|
||||||
|
if( testtype != NULL || addr.type == DEBUG_TypeIntConst )
|
||||||
|
{
|
||||||
|
addr.off = DEBUG_GetExprValue(&addr, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (format != 'i' && count > 1)
|
if (format != 'i' && count > 1)
|
||||||
{
|
{
|
||||||
DEBUG_PrintAddress( &addr, dbg_mode, FALSE );
|
DEBUG_PrintAddress( &addr, dbg_mode, FALSE );
|
||||||
|
@ -179,7 +195,7 @@ void DEBUG_ExamineMemory( const DBG_ADDR *address, int count, char format )
|
||||||
DEBUG_PrintAddress( &addr, dbg_mode, TRUE );
|
DEBUG_PrintAddress( &addr, dbg_mode, TRUE );
|
||||||
fprintf(stderr,": ");
|
fprintf(stderr,": ");
|
||||||
if (!DBG_CHECK_READ_PTR( &addr, 1 )) return;
|
if (!DBG_CHECK_READ_PTR( &addr, 1 )) return;
|
||||||
DEBUG_Disasm( &addr );
|
DEBUG_Disasm( &addr, TRUE );
|
||||||
fprintf(stderr,"\n");
|
fprintf(stderr,"\n");
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
|
|
2029
debugger/msc.c
2029
debugger/msc.c
File diff suppressed because it is too large
Load Diff
|
@ -48,6 +48,41 @@ void DEBUG_SetRegister( enum debug_regs reg, int val )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int
|
||||||
|
DEBUG_PrintRegister(enum debug_regs reg)
|
||||||
|
{
|
||||||
|
switch(reg)
|
||||||
|
{
|
||||||
|
case REG_EAX: fprintf(stderr, "%%eax"); break;
|
||||||
|
case REG_EBX: fprintf(stderr, "%%ebx"); break;
|
||||||
|
case REG_ECX: fprintf(stderr, "%%ecx"); break;
|
||||||
|
case REG_EDX: fprintf(stderr, "%%edx"); break;
|
||||||
|
case REG_ESI: fprintf(stderr, "%%esi"); break;
|
||||||
|
case REG_EDI: fprintf(stderr, "%%edi"); break;
|
||||||
|
case REG_EBP: fprintf(stderr, "%%ebp"); break;
|
||||||
|
case REG_EFL: fprintf(stderr, "%%efl"); break;
|
||||||
|
case REG_EIP: fprintf(stderr, "%%eip"); break;
|
||||||
|
case REG_ESP: fprintf(stderr, "%%esp"); break;
|
||||||
|
case REG_AX: fprintf(stderr, "%%ax"); break;
|
||||||
|
case REG_BX: fprintf(stderr, "%%bx"); break;
|
||||||
|
case REG_CX: fprintf(stderr, "%%cx"); break;
|
||||||
|
case REG_DX: fprintf(stderr, "%%dx"); break;
|
||||||
|
case REG_SI: fprintf(stderr, "%%si"); break;
|
||||||
|
case REG_DI: fprintf(stderr, "%%di"); break;
|
||||||
|
case REG_BP: fprintf(stderr, "%%bp"); break;
|
||||||
|
case REG_FL: fprintf(stderr, "%%fl"); break;
|
||||||
|
case REG_IP: fprintf(stderr, "%%ip"); break;
|
||||||
|
case REG_SP: fprintf(stderr, "%%sp"); break;
|
||||||
|
case REG_CS: fprintf(stderr, "%%cs"); break;
|
||||||
|
case REG_DS: fprintf(stderr, "%%ds"); break;
|
||||||
|
case REG_ES: fprintf(stderr, "%%es"); break;
|
||||||
|
case REG_SS: fprintf(stderr, "%%ss"); break;
|
||||||
|
case REG_FS: fprintf(stderr, "%%fs"); break;
|
||||||
|
case REG_GS: fprintf(stderr, "%%gs"); break;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DEBUG_GetRegister
|
* DEBUG_GetRegister
|
||||||
*
|
*
|
||||||
|
|
|
@ -0,0 +1,433 @@
|
||||||
|
/*
|
||||||
|
* File source.c - source file handling for internal debugger.
|
||||||
|
*
|
||||||
|
* Copyright (C) 1997, Eric Youngdale.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
|
||||||
|
#include "win.h"
|
||||||
|
#include "pe_image.h"
|
||||||
|
#include "peexe.h"
|
||||||
|
#include "debugger.h"
|
||||||
|
#include "peexe.h"
|
||||||
|
#include "xmalloc.h"
|
||||||
|
|
||||||
|
struct searchlist
|
||||||
|
{
|
||||||
|
char * path;
|
||||||
|
struct searchlist * next;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
struct open_filelist
|
||||||
|
{
|
||||||
|
char * path;
|
||||||
|
char * real_path;
|
||||||
|
struct open_filelist * next;
|
||||||
|
unsigned int size;
|
||||||
|
signed int nlines;
|
||||||
|
unsigned int * linelist;
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct open_filelist * ofiles;
|
||||||
|
|
||||||
|
static struct searchlist * listhead;
|
||||||
|
static char DEBUG_current_sourcefile[PATH_MAX];
|
||||||
|
static int DEBUG_start_sourceline = -1;
|
||||||
|
static int DEBUG_end_sourceline = -1;
|
||||||
|
|
||||||
|
void
|
||||||
|
DEBUG_ShowDir()
|
||||||
|
{
|
||||||
|
struct searchlist * sl;
|
||||||
|
|
||||||
|
fprintf(stderr,"Search list :\n");
|
||||||
|
for(sl = listhead; sl; sl = sl->next)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "\t%s\n", sl->path);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DEBUG_AddPath(const char * path)
|
||||||
|
{
|
||||||
|
struct searchlist * sl;
|
||||||
|
|
||||||
|
sl = (struct searchlist *) xmalloc(sizeof(struct searchlist));
|
||||||
|
if( sl == NULL )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sl->next = listhead;
|
||||||
|
sl->path = xstrdup(path);
|
||||||
|
listhead = sl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DEBUG_NukePath()
|
||||||
|
{
|
||||||
|
struct searchlist * sl;
|
||||||
|
struct searchlist * nxt;
|
||||||
|
|
||||||
|
for(sl = listhead; sl; sl = nxt)
|
||||||
|
{
|
||||||
|
nxt = sl->next;
|
||||||
|
free(sl->path);
|
||||||
|
free(sl);
|
||||||
|
}
|
||||||
|
|
||||||
|
listhead = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
void
|
||||||
|
DEBUG_DisplaySource(char * sourcefile, int start, int end)
|
||||||
|
{
|
||||||
|
char * addr;
|
||||||
|
char buffer[1024];
|
||||||
|
int fd;
|
||||||
|
int i;
|
||||||
|
struct open_filelist * ol;
|
||||||
|
int nlines;
|
||||||
|
char * pnt;
|
||||||
|
struct searchlist * sl;
|
||||||
|
struct stat statbuf;
|
||||||
|
int status;
|
||||||
|
char tmppath[PATH_MAX];
|
||||||
|
|
||||||
|
/*
|
||||||
|
* First see whether we have the file open already. If so, then
|
||||||
|
* use that, otherwise we have to try and open it.
|
||||||
|
*/
|
||||||
|
for(ol = ofiles; ol; ol = ol->next)
|
||||||
|
{
|
||||||
|
if( strcmp(ol->path, sourcefile) == 0 )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ol == NULL )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Try again, stripping the path from the opened file.
|
||||||
|
*/
|
||||||
|
for(ol = ofiles; ol; ol = ol->next)
|
||||||
|
{
|
||||||
|
pnt = strrchr(ol->path, '/');
|
||||||
|
if( pnt != NULL && strcmp(pnt + 1, sourcefile) == 0 )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ol == NULL )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* See if this is a DOS style name or not.
|
||||||
|
*/
|
||||||
|
pnt = strchr(sourcefile, '\\' );
|
||||||
|
if( pnt == NULL )
|
||||||
|
{
|
||||||
|
pnt = strchr(sourcefile, '/' );
|
||||||
|
if( pnt == NULL )
|
||||||
|
{
|
||||||
|
pnt = sourcefile;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Crapola. We need to try and open the file.
|
||||||
|
*/
|
||||||
|
status = stat(sourcefile, &statbuf);
|
||||||
|
if( status != -1 )
|
||||||
|
{
|
||||||
|
strcpy(tmppath, sourcefile);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for(sl = listhead; sl; sl = sl->next)
|
||||||
|
{
|
||||||
|
strcpy(tmppath, sl->path);
|
||||||
|
if( tmppath[strlen(tmppath)-1] != '/' )
|
||||||
|
{
|
||||||
|
strcat(tmppath, "/");
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Now append the base file name.
|
||||||
|
*/
|
||||||
|
strcat(tmppath, pnt);
|
||||||
|
|
||||||
|
status = stat(tmppath, &statbuf);
|
||||||
|
if( status != -1 )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( sl == NULL )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Still couldn't find it. Ask user for path to add.
|
||||||
|
*/
|
||||||
|
fprintf(stderr,"Enter path to file %s: ", sourcefile);
|
||||||
|
fgets(tmppath, sizeof(tmppath), stdin);
|
||||||
|
|
||||||
|
if( tmppath[strlen(tmppath)-1] == '\n' )
|
||||||
|
{
|
||||||
|
tmppath[strlen(tmppath)-1] = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
if( tmppath[strlen(tmppath)-1] != '/' )
|
||||||
|
{
|
||||||
|
strcat(tmppath, "/");
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Now append the base file name.
|
||||||
|
*/
|
||||||
|
strcat(tmppath, pnt);
|
||||||
|
|
||||||
|
status = stat(tmppath, &statbuf);
|
||||||
|
if( status == -1 )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* OK, I guess the user doesn't really want to see it
|
||||||
|
* after all.
|
||||||
|
*/
|
||||||
|
ol = (struct open_filelist *) xmalloc(sizeof(*ol));
|
||||||
|
ol->path = xstrdup(sourcefile);
|
||||||
|
ol->real_path = NULL;
|
||||||
|
ol->next = ofiles;
|
||||||
|
ol->nlines = 0;
|
||||||
|
ol->linelist = NULL;
|
||||||
|
ofiles = ol;
|
||||||
|
fprintf(stderr,"Unable to open file %s\n", tmppath);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* Create header for file.
|
||||||
|
*/
|
||||||
|
ol = (struct open_filelist *) xmalloc(sizeof(*ol));
|
||||||
|
ol->path = xstrdup(sourcefile);
|
||||||
|
ol->real_path = xstrdup(tmppath);
|
||||||
|
ol->next = ofiles;
|
||||||
|
ol->nlines = 0;
|
||||||
|
ol->linelist = NULL;
|
||||||
|
ol->size = statbuf.st_size;
|
||||||
|
ofiles = ol;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now open and map the file.
|
||||||
|
*/
|
||||||
|
fd = open(tmppath, O_RDONLY);
|
||||||
|
if( fd == -1 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
addr = mmap(0, statbuf.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||||
|
if( addr == (char *) -1 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now build up the line number mapping table.
|
||||||
|
*/
|
||||||
|
ol->nlines = 1;
|
||||||
|
pnt = addr;
|
||||||
|
while(pnt < addr + ol->size )
|
||||||
|
{
|
||||||
|
if( *pnt++ == '\n' )
|
||||||
|
{
|
||||||
|
ol->nlines++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ol->nlines++;
|
||||||
|
ol->linelist = (unsigned int*) xmalloc(ol->nlines * sizeof(unsigned int) );
|
||||||
|
|
||||||
|
nlines = 0;
|
||||||
|
pnt = addr;
|
||||||
|
ol->linelist[nlines++] = 0;
|
||||||
|
while(pnt < addr + ol->size )
|
||||||
|
{
|
||||||
|
if( *pnt++ == '\n' )
|
||||||
|
{
|
||||||
|
ol->linelist[nlines++] = pnt - addr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ol->linelist[nlines++] = pnt - addr;
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* We know what the file is, we just need to reopen it and remap it.
|
||||||
|
*/
|
||||||
|
fd = open(ol->real_path, O_RDONLY);
|
||||||
|
if( fd == -1 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
addr = mmap(0, ol->size, PROT_READ, MAP_PRIVATE, fd, 0);
|
||||||
|
if( addr == (char *) -1 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* All we need to do is to display the source lines here.
|
||||||
|
*/
|
||||||
|
for(i=start - 1; i <= end - 1; i++)
|
||||||
|
{
|
||||||
|
if( i < 0 || i >= ol->nlines - 1)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&buffer, 0, sizeof(buffer));
|
||||||
|
if( ol->linelist[i+1] != ol->linelist[i] )
|
||||||
|
{
|
||||||
|
memcpy(&buffer, addr + ol->linelist[i],
|
||||||
|
(ol->linelist[i+1] - ol->linelist[i]) - 1);
|
||||||
|
}
|
||||||
|
fprintf(stderr,"%d\t%s\n", i + 1, buffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
munmap(addr, ol->size);
|
||||||
|
close(fd);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DEBUG_List(struct list_id * source1, struct list_id * source2,
|
||||||
|
int delta)
|
||||||
|
{
|
||||||
|
int end;
|
||||||
|
int start;
|
||||||
|
char * sourcefile;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We need to see what source file we need. Hopefully we only have
|
||||||
|
* one specified, otherwise we might as well punt.
|
||||||
|
*/
|
||||||
|
if( source1 != NULL
|
||||||
|
&& source2 != NULL
|
||||||
|
&& source1->sourcefile != NULL
|
||||||
|
&& source2->sourcefile != NULL
|
||||||
|
&& strcmp(source1->sourcefile, source2->sourcefile) != 0 )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Ambiguous source file specification.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
sourcefile = NULL;
|
||||||
|
if( source1 != NULL && source1->sourcefile != NULL )
|
||||||
|
{
|
||||||
|
sourcefile = source1->sourcefile;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( sourcefile == NULL
|
||||||
|
&& source2 != NULL
|
||||||
|
&& source2->sourcefile != NULL )
|
||||||
|
{
|
||||||
|
sourcefile = source2->sourcefile;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( sourcefile == NULL )
|
||||||
|
{
|
||||||
|
sourcefile = (char *) &DEBUG_current_sourcefile;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( sourcefile == NULL )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "No source file specified.\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now figure out the line number range to be listed.
|
||||||
|
*/
|
||||||
|
start = -1;
|
||||||
|
end = -1;
|
||||||
|
|
||||||
|
if( source1 != NULL )
|
||||||
|
{
|
||||||
|
start = source1->line;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( source2 != NULL )
|
||||||
|
{
|
||||||
|
end = source2->line;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( start == -1 && end == -1 )
|
||||||
|
{
|
||||||
|
if( delta < 0 )
|
||||||
|
{
|
||||||
|
end = DEBUG_start_sourceline;
|
||||||
|
start = end + delta;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
start = DEBUG_end_sourceline;
|
||||||
|
end = start + delta;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( start == -1 )
|
||||||
|
{
|
||||||
|
start = end + delta;
|
||||||
|
}
|
||||||
|
else if (end == -1)
|
||||||
|
{
|
||||||
|
end = start + delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now call this function to do the dirty work.
|
||||||
|
*/
|
||||||
|
DEBUG_DisplaySource(sourcefile, start, end);
|
||||||
|
|
||||||
|
if( sourcefile != (char *) &DEBUG_current_sourcefile )
|
||||||
|
{
|
||||||
|
strcpy(DEBUG_current_sourcefile, sourcefile);
|
||||||
|
}
|
||||||
|
DEBUG_start_sourceline = start;
|
||||||
|
DEBUG_end_sourceline = end;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
main()
|
||||||
|
{
|
||||||
|
int i, j;
|
||||||
|
DEBUG_AddPath("../../de");
|
||||||
|
while(1==1)
|
||||||
|
{
|
||||||
|
fscanf(stdin,"%d %d", &i, &j);
|
||||||
|
DEBUG_DisplaySource("dumpexe.c", i, j);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
909
debugger/stabs.c
909
debugger/stabs.c
File diff suppressed because it is too large
Load Diff
174
debugger/stack.c
174
debugger/stack.c
|
@ -19,17 +19,14 @@
|
||||||
struct bt_info
|
struct bt_info
|
||||||
{
|
{
|
||||||
unsigned int eip;
|
unsigned int eip;
|
||||||
|
unsigned int ess;
|
||||||
unsigned int ebp;
|
unsigned int ebp;
|
||||||
struct name_hash * frame;
|
struct symbol_info frame;
|
||||||
};
|
};
|
||||||
|
|
||||||
static int nframe;
|
static int nframe;
|
||||||
static struct bt_info * frames = NULL;
|
static struct bt_info * frames = NULL;
|
||||||
int curr_frame;
|
int curr_frame;
|
||||||
static char * reg_name[] =
|
|
||||||
{
|
|
||||||
"eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"
|
|
||||||
};
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
@ -62,12 +59,14 @@ void DEBUG_InfoStack(void)
|
||||||
{ /* 32-bit mode */
|
{ /* 32-bit mode */
|
||||||
addr.seg = 0;
|
addr.seg = 0;
|
||||||
addr.off = ESP_reg(&DEBUG_context);
|
addr.off = ESP_reg(&DEBUG_context);
|
||||||
|
addr.type = NULL;
|
||||||
DEBUG_ExamineMemory( &addr, 24, 'x' );
|
DEBUG_ExamineMemory( &addr, 24, 'x' );
|
||||||
}
|
}
|
||||||
else /* 16-bit mode */
|
else /* 16-bit mode */
|
||||||
{
|
{
|
||||||
addr.seg = SS_reg(&DEBUG_context);
|
addr.seg = SS_reg(&DEBUG_context);
|
||||||
addr.off = SP_reg(&DEBUG_context);
|
addr.off = SP_reg(&DEBUG_context);
|
||||||
|
addr.type = NULL;
|
||||||
DEBUG_ExamineMemory( &addr, 24, 'w' );
|
DEBUG_ExamineMemory( &addr, 24, 'w' );
|
||||||
}
|
}
|
||||||
fprintf(stderr,"\n");
|
fprintf(stderr,"\n");
|
||||||
|
@ -153,94 +152,76 @@ void DEBUG_BackTrace(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DEBUG_GetSymbolValue
|
* DEBUG_SilentBackTrace
|
||||||
*
|
*
|
||||||
* Get the address of a named symbol from the current stack frame.
|
* Display a stack back-trace.
|
||||||
*/
|
*/
|
||||||
BOOL32 DEBUG_GetStackSymbolValue( const char * name, DBG_ADDR *addr )
|
void DEBUG_SilentBackTrace(void)
|
||||||
{
|
{
|
||||||
struct name_hash * curr_func;
|
DBG_ADDR addr;
|
||||||
int i;
|
int frameno = 0;
|
||||||
|
|
||||||
/*
|
nframe = 1;
|
||||||
* If we don't have a valid backtrace, then just return.
|
if (frames) free( frames );
|
||||||
*/
|
frames = (struct bt_info *) xmalloc( sizeof(struct bt_info) );
|
||||||
if( frames == NULL )
|
|
||||||
|
if (SS_reg(&DEBUG_context) == WINE_DATA_SELECTOR) /* 32-bit mode */
|
||||||
{
|
{
|
||||||
return FALSE;
|
addr.seg = 0;
|
||||||
|
addr.off = EIP_reg(&DEBUG_context);
|
||||||
|
frames[0].eip = addr.off;
|
||||||
|
DEBUG_FindNearestSymbol( &addr, TRUE, &frames[0].frame.sym, 0,
|
||||||
|
&frames[0].frame.list);
|
||||||
|
frames[0].ebp = addr.off = EBP_reg(&DEBUG_context);
|
||||||
|
frameno++;
|
||||||
|
|
||||||
|
while (addr.off)
|
||||||
|
{
|
||||||
|
FRAME32 *frame = (FRAME32 *)addr.off;
|
||||||
|
if (!DBG_CHECK_READ_PTR( &addr, sizeof(FRAME32) )) return;
|
||||||
|
if (!frame->ip) break;
|
||||||
|
nframe++;
|
||||||
|
frames = (struct bt_info *)xrealloc(frames,
|
||||||
|
nframe*sizeof(struct bt_info));
|
||||||
|
addr.off = frame->ip;
|
||||||
|
frames[frameno].eip = addr.off;
|
||||||
|
frames[frameno].ebp = frame->bp;
|
||||||
|
DEBUG_FindNearestSymbol( &addr, TRUE,
|
||||||
|
&frames[frameno].frame.sym, frame->bp,
|
||||||
|
&frames[frameno].frame.list);
|
||||||
|
frameno++;
|
||||||
|
addr.off = frame->bp;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else /* 16-bit mode */
|
||||||
curr_func = frames[curr_frame].frame;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If we don't know what the current function is, then we also have
|
|
||||||
* nothing to report here.
|
|
||||||
*/
|
|
||||||
if( curr_func == NULL )
|
|
||||||
{
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
for(i=0; i < curr_func->n_locals; i++ )
|
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Test the range of validity of the local variable. This
|
* Not implemented here. I am not entirely sure how best to handle
|
||||||
* comes up with RBRAC/LBRAC stabs in particular.
|
* this stuff.
|
||||||
*/
|
*/
|
||||||
if( (curr_func->local_vars[i].pc_start != 0)
|
|
||||||
&& ((frames[curr_frame].eip - curr_func->addr.off)
|
|
||||||
< curr_func->local_vars[i].pc_start) )
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( (curr_func->local_vars[i].pc_end != 0)
|
|
||||||
&& ((frames[curr_frame].eip - curr_func->addr.off)
|
|
||||||
> curr_func->local_vars[i].pc_end) )
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( strcmp(name, curr_func->local_vars[i].name) == 0 )
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* OK, we found it. Now figure out what to do with this.
|
|
||||||
*/
|
|
||||||
if( curr_func->local_vars[i].regno != 0 )
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* Register variable. We don't know how to treat
|
|
||||||
* this yet.
|
|
||||||
*/
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
addr->seg = 0;
|
|
||||||
addr->off = frames[curr_frame].ebp + curr_func->local_vars[i].offset;
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
DEBUG_SetFrame(int newframe)
|
DEBUG_SetFrame(int newframe)
|
||||||
{
|
{
|
||||||
int rtn = FALSE;
|
int rtn = FALSE;
|
||||||
/*
|
|
||||||
* Nothing for now. Add support later.
|
|
||||||
*/
|
|
||||||
|
|
||||||
curr_frame = newframe;
|
curr_frame = newframe;
|
||||||
|
|
||||||
|
if( curr_frame >= nframe )
|
||||||
|
{
|
||||||
|
curr_frame = nframe - 1;
|
||||||
|
}
|
||||||
|
|
||||||
if( curr_frame < 0 )
|
if( curr_frame < 0 )
|
||||||
{
|
{
|
||||||
curr_frame = 0;
|
curr_frame = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( curr_frame >= nframe )
|
if( frames[curr_frame].frame.list.sourcefile != NULL )
|
||||||
{
|
{
|
||||||
curr_frame = nframe - 1;
|
DEBUG_List(&frames[curr_frame].frame.list, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
rtn = TRUE;
|
rtn = TRUE;
|
||||||
|
@ -248,13 +229,9 @@ DEBUG_SetFrame(int newframe)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
DEBUG_InfoLocals()
|
DEBUG_GetCurrentFrame(struct name_hash ** name, unsigned int * eip,
|
||||||
|
unsigned int * ebp)
|
||||||
{
|
{
|
||||||
struct name_hash * curr_func;
|
|
||||||
int i;
|
|
||||||
int rtn = FALSE;
|
|
||||||
unsigned int * ptr;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we don't have a valid backtrace, then just return.
|
* If we don't have a valid backtrace, then just return.
|
||||||
*/
|
*/
|
||||||
|
@ -263,54 +240,19 @@ DEBUG_InfoLocals()
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
curr_func = frames[curr_frame].frame;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If we don't know what the current function is, then we also have
|
* If we don't know what the current function is, then we also have
|
||||||
* nothing to report here.
|
* nothing to report here.
|
||||||
*/
|
*/
|
||||||
if( curr_func == NULL )
|
if( frames[curr_frame].frame.sym == NULL )
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(i=0; i < curr_func->n_locals; i++ )
|
*name = frames[curr_frame].frame.sym;
|
||||||
{
|
*eip = frames[curr_frame].eip;
|
||||||
/*
|
*ebp = frames[curr_frame].ebp;
|
||||||
* Test the range of validity of the local variable. This
|
|
||||||
* comes up with RBRAC/LBRAC stabs in particular.
|
|
||||||
*/
|
|
||||||
if( (curr_func->local_vars[i].pc_start != 0)
|
|
||||||
&& ((frames[curr_frame].eip - curr_func->addr.off)
|
|
||||||
< curr_func->local_vars[i].pc_start) )
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( (curr_func->local_vars[i].pc_end != 0)
|
return TRUE;
|
||||||
&& ((frames[curr_frame].eip - curr_func->addr.off)
|
|
||||||
> curr_func->local_vars[i].pc_end) )
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if( curr_func->local_vars[i].offset == 0 )
|
|
||||||
{
|
|
||||||
fprintf(stderr, "%s:%s optimized into register $%s \n",
|
|
||||||
curr_func->name, curr_func->local_vars[i].name,
|
|
||||||
reg_name[curr_func->local_vars[i].regno]);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ptr = (unsigned int *) (frames[curr_frame].ebp
|
|
||||||
+ curr_func->local_vars[i].offset);
|
|
||||||
fprintf(stderr, "%s:%s == 0x%8.8x\n",
|
|
||||||
curr_func->name, curr_func->local_vars[i].name,
|
|
||||||
*ptr);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
rtn = TRUE;
|
|
||||||
|
|
||||||
return (rtn);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,809 @@
|
||||||
|
/*
|
||||||
|
* File types.c - datatype handling stuff for internal debugger.
|
||||||
|
*
|
||||||
|
* Copyright (C) 1997, Eric Youngdale.
|
||||||
|
*
|
||||||
|
* This really doesn't do much at the moment, but it forms the framework
|
||||||
|
* upon which full support for datatype handling will eventually be hung.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <malloc.h>
|
||||||
|
|
||||||
|
#include "win.h"
|
||||||
|
#include "pe_image.h"
|
||||||
|
#include "peexe.h"
|
||||||
|
#include "debugger.h"
|
||||||
|
#include "peexe.h"
|
||||||
|
#include "xmalloc.h"
|
||||||
|
|
||||||
|
#define NR_TYPE_HASH 521
|
||||||
|
|
||||||
|
struct en_values
|
||||||
|
{
|
||||||
|
struct en_values* next;
|
||||||
|
char * name;
|
||||||
|
int value;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct member
|
||||||
|
{
|
||||||
|
struct member * next;
|
||||||
|
char * name;
|
||||||
|
struct datatype * type;
|
||||||
|
int offset;
|
||||||
|
int size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct datatype
|
||||||
|
{
|
||||||
|
enum debug_type type;
|
||||||
|
struct datatype * next;
|
||||||
|
char * name;
|
||||||
|
union
|
||||||
|
{
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
char basic_type;
|
||||||
|
char * output_format;
|
||||||
|
char basic_size;
|
||||||
|
unsigned b_signed:1;
|
||||||
|
} basic;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
unsigned short bitoff;
|
||||||
|
unsigned short nbits;
|
||||||
|
struct datatype * basetype;
|
||||||
|
} bitfield;
|
||||||
|
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
struct datatype * pointsto;
|
||||||
|
} pointer;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
struct datatype * rettype;
|
||||||
|
} funct;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int start;
|
||||||
|
int end;
|
||||||
|
struct datatype * basictype;
|
||||||
|
} array;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
int size;
|
||||||
|
struct member * members;
|
||||||
|
} structure;
|
||||||
|
struct
|
||||||
|
{
|
||||||
|
struct en_values * members;
|
||||||
|
} enumeration;
|
||||||
|
} un;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define BASIC_INT 1
|
||||||
|
#define BASIC_CHAR 2
|
||||||
|
#define BASIC_LONG 3
|
||||||
|
#define BASIC_UINT 4
|
||||||
|
#define BASIC_LUI 5
|
||||||
|
#define BASIC_LONGLONG 6
|
||||||
|
#define BASIC_ULONGLONGI 7
|
||||||
|
#define BASIC_SHORT 8
|
||||||
|
#define BASIC_SHORTUI 9
|
||||||
|
#define BASIC_SCHAR 10
|
||||||
|
#define BASIC_UCHAR 11
|
||||||
|
#define BASIC_FLT 12
|
||||||
|
#define BASIC_LONG_DOUBLE 13
|
||||||
|
#define BASIC_DOUBLE 14
|
||||||
|
#define BASIC_CMPLX_INT 15
|
||||||
|
#define BASIC_CMPLX_FLT 16
|
||||||
|
#define BASIC_CMPLX_DBL 17
|
||||||
|
#define BASIC_CMPLX_LONG_DBL 18
|
||||||
|
#define BASIC_VOID 19
|
||||||
|
|
||||||
|
struct datatype * DEBUG_TypeInt = NULL;
|
||||||
|
struct datatype * DEBUG_TypeIntConst = NULL;
|
||||||
|
struct datatype * DEBUG_TypeUSInt = NULL;
|
||||||
|
struct datatype * DEBUG_TypeString = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* All of the types that have been defined so far.
|
||||||
|
*/
|
||||||
|
static struct datatype * type_hash_table[NR_TYPE_HASH + 1];
|
||||||
|
static struct datatype * pointer_types = NULL;
|
||||||
|
|
||||||
|
static unsigned int type_hash( const char * name )
|
||||||
|
{
|
||||||
|
unsigned int hash = 0;
|
||||||
|
unsigned int tmp;
|
||||||
|
const char * p;
|
||||||
|
|
||||||
|
p = name;
|
||||||
|
|
||||||
|
while (*p)
|
||||||
|
{
|
||||||
|
hash = (hash << 4) + *p++;
|
||||||
|
|
||||||
|
if( (tmp = (hash & 0xf0000000)) )
|
||||||
|
{
|
||||||
|
hash ^= tmp >> 24;
|
||||||
|
}
|
||||||
|
hash &= ~tmp;
|
||||||
|
}
|
||||||
|
return hash % NR_TYPE_HASH;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static struct datatype *
|
||||||
|
DEBUG_InitBasic(int type, char * name, int size, int b_signed,
|
||||||
|
char * output_format)
|
||||||
|
{
|
||||||
|
int hash;
|
||||||
|
|
||||||
|
struct datatype * dt;
|
||||||
|
dt = (struct datatype *) xmalloc(sizeof(struct datatype));
|
||||||
|
|
||||||
|
if( dt != NULL )
|
||||||
|
{
|
||||||
|
if( name != NULL )
|
||||||
|
{
|
||||||
|
hash = type_hash(name);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hash = NR_TYPE_HASH;
|
||||||
|
}
|
||||||
|
|
||||||
|
dt->type = BASIC;
|
||||||
|
dt->name = name;
|
||||||
|
dt->next = type_hash_table[hash];
|
||||||
|
type_hash_table[hash] = dt;
|
||||||
|
dt->un.basic.basic_type = type;
|
||||||
|
dt->un.basic.basic_size = size;
|
||||||
|
dt->un.basic.b_signed = b_signed;
|
||||||
|
dt->un.basic.output_format = output_format;
|
||||||
|
}
|
||||||
|
|
||||||
|
return dt;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct datatype *
|
||||||
|
DEBUG_NewDataType(enum debug_type xtype, const char * typename)
|
||||||
|
{
|
||||||
|
struct datatype * dt = NULL;
|
||||||
|
int hash;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The last bucket is special, and is used to hold typeless names.
|
||||||
|
*/
|
||||||
|
if( typename == NULL )
|
||||||
|
{
|
||||||
|
hash = NR_TYPE_HASH;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
hash = type_hash(typename);
|
||||||
|
}
|
||||||
|
|
||||||
|
if( typename != NULL )
|
||||||
|
{
|
||||||
|
for( dt = type_hash_table[hash]; dt; dt = dt->next )
|
||||||
|
{
|
||||||
|
if( xtype != dt->type || dt->name == NULL
|
||||||
|
|| dt->name[0] != typename[0])
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( strcmp(dt->name, typename) == 0 )
|
||||||
|
{
|
||||||
|
return dt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( dt == NULL )
|
||||||
|
{
|
||||||
|
dt = (struct datatype *) xmalloc(sizeof(struct datatype));
|
||||||
|
|
||||||
|
if( dt != NULL )
|
||||||
|
{
|
||||||
|
memset(dt, 0, sizeof(*dt));
|
||||||
|
|
||||||
|
dt->type = xtype;
|
||||||
|
if( typename != NULL )
|
||||||
|
{
|
||||||
|
dt->name = xstrdup(typename);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dt->name = NULL;
|
||||||
|
}
|
||||||
|
if( xtype == POINTER )
|
||||||
|
{
|
||||||
|
dt->next = pointer_types;
|
||||||
|
pointer_types = dt;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dt->next = type_hash_table[hash];
|
||||||
|
type_hash_table[hash] = dt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dt;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct datatype *
|
||||||
|
DEBUG_FindOrMakePointerType(struct datatype * reftype)
|
||||||
|
{
|
||||||
|
struct datatype * dt = NULL;
|
||||||
|
|
||||||
|
if( reftype != NULL )
|
||||||
|
{
|
||||||
|
for( dt = pointer_types; dt; dt = dt->next )
|
||||||
|
{
|
||||||
|
if( dt->type != POINTER )
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( dt->un.pointer.pointsto == reftype )
|
||||||
|
{
|
||||||
|
return dt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if( dt == NULL )
|
||||||
|
{
|
||||||
|
dt = (struct datatype *) xmalloc(sizeof(struct datatype));
|
||||||
|
|
||||||
|
if( dt != NULL )
|
||||||
|
{
|
||||||
|
dt->type = POINTER;
|
||||||
|
dt->un.pointer.pointsto = reftype;
|
||||||
|
dt->next = pointer_types;
|
||||||
|
pointer_types = dt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return dt;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
DEBUG_InitTypes()
|
||||||
|
{
|
||||||
|
static int beenhere = 0;
|
||||||
|
struct datatype * chartype;
|
||||||
|
|
||||||
|
if( beenhere++ != 0 )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Special version of int used with constants of various kinds.
|
||||||
|
*/
|
||||||
|
DEBUG_TypeIntConst = DEBUG_InitBasic(BASIC_INT,NULL,4,1,"%d");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize a few builtin types.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
DEBUG_TypeInt = DEBUG_InitBasic(BASIC_INT,"int",4,1,"%d");
|
||||||
|
chartype = DEBUG_InitBasic(BASIC_CHAR,"char",1,1,"'%c'");
|
||||||
|
DEBUG_InitBasic(BASIC_LONG,"long int",4,1,"%d");
|
||||||
|
DEBUG_TypeUSInt = DEBUG_InitBasic(BASIC_UINT,"unsigned int",4,0,"%d");
|
||||||
|
DEBUG_InitBasic(BASIC_LUI,"long unsigned int",4,0,"%d");
|
||||||
|
DEBUG_InitBasic(BASIC_LONGLONG,"long long int",8,1,"%ld");
|
||||||
|
DEBUG_InitBasic(BASIC_ULONGLONGI,"long long unsigned int",8,0,"%ld");
|
||||||
|
DEBUG_InitBasic(BASIC_SHORT,"short int",2,1,"%d");
|
||||||
|
DEBUG_InitBasic(BASIC_SHORTUI,"short unsigned int",2,0,"%d");
|
||||||
|
DEBUG_InitBasic(BASIC_SCHAR,"signed char",1,1,"'%c'");
|
||||||
|
DEBUG_InitBasic(BASIC_UCHAR,"unsigned char",1,0,"'%c'");
|
||||||
|
DEBUG_InitBasic(BASIC_FLT,"float",4,0,"%f");
|
||||||
|
DEBUG_InitBasic(BASIC_LONG_DOUBLE,"double",8,0,"%lf");
|
||||||
|
DEBUG_InitBasic(BASIC_DOUBLE,"long double",12,0,NULL);
|
||||||
|
DEBUG_InitBasic(BASIC_CMPLX_INT,"complex int",8,1,NULL);
|
||||||
|
DEBUG_InitBasic(BASIC_CMPLX_FLT,"complex float",8,0,NULL);
|
||||||
|
DEBUG_InitBasic(BASIC_CMPLX_DBL,"complex double",16,0,NULL);
|
||||||
|
DEBUG_InitBasic(BASIC_CMPLX_LONG_DBL,"complex long double",24,0,NULL);
|
||||||
|
DEBUG_InitBasic(BASIC_VOID,"void",0,0,NULL);
|
||||||
|
|
||||||
|
DEBUG_TypeString = DEBUG_NewDataType(POINTER, NULL);
|
||||||
|
DEBUG_SetPointerType(DEBUG_TypeString, chartype);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now initialize the builtins for codeview.
|
||||||
|
*/
|
||||||
|
DEBUG_InitCVDataTypes();
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
long long int
|
||||||
|
DEBUG_GetExprValue(DBG_ADDR * addr, char ** format)
|
||||||
|
{
|
||||||
|
unsigned int rtn;
|
||||||
|
struct datatype * type2 = NULL;
|
||||||
|
struct en_values * e;
|
||||||
|
char * def_format = "0x%x";
|
||||||
|
|
||||||
|
rtn = 0;
|
||||||
|
assert(addr->type != NULL);
|
||||||
|
|
||||||
|
switch(addr->type->type)
|
||||||
|
{
|
||||||
|
case BASIC:
|
||||||
|
memcpy(&rtn, (char *) addr->off, addr->type->un.basic.basic_size);
|
||||||
|
if( (addr->type->un.basic.b_signed)
|
||||||
|
&& ((addr->type->un.basic.basic_size & 3) != 0)
|
||||||
|
&& ((rtn >> (addr->type->un.basic.basic_size * 8 - 1)) != 0) )
|
||||||
|
{
|
||||||
|
rtn = rtn | ((-1) << (addr->type->un.basic.basic_size * 8));
|
||||||
|
}
|
||||||
|
if( addr->type->un.basic.output_format != NULL )
|
||||||
|
{
|
||||||
|
def_format = addr->type->un.basic.output_format;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Check for single character prints that are out of range.
|
||||||
|
*/
|
||||||
|
if( addr->type->un.basic.basic_size == 1
|
||||||
|
&& strcmp(def_format, "'%c'") == 0
|
||||||
|
&& ((rtn < 0x20) || (rtn > 0x80)) )
|
||||||
|
{
|
||||||
|
def_format = "%d";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case POINTER:
|
||||||
|
if (!DBG_CHECK_READ_PTR( addr, 1 )) return 0;
|
||||||
|
rtn = (unsigned int) *((unsigned char **)addr->off);
|
||||||
|
type2 = addr->type->un.pointer.pointsto;
|
||||||
|
if( type2->type == BASIC && type2->un.basic.basic_size == 1 )
|
||||||
|
{
|
||||||
|
def_format = "\"%s\"";
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
def_format = "0x%8.8x";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case ARRAY:
|
||||||
|
case STRUCT:
|
||||||
|
if (!DBG_CHECK_READ_PTR( addr, 1 )) return 0;
|
||||||
|
rtn = (unsigned int) *((unsigned char **)addr->off);
|
||||||
|
def_format = "0x%8.8x";
|
||||||
|
break;
|
||||||
|
case ENUM:
|
||||||
|
rtn = (unsigned int) *((unsigned char **)addr->off);
|
||||||
|
for(e = addr->type->un.enumeration.members; e; e = e->next )
|
||||||
|
{
|
||||||
|
if( e->value == rtn )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if( e != NULL )
|
||||||
|
{
|
||||||
|
rtn = (int) e->name;
|
||||||
|
def_format = "%s";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
def_format = "%d";
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
rtn = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if( format != NULL )
|
||||||
|
{
|
||||||
|
*format = def_format;
|
||||||
|
}
|
||||||
|
return rtn;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
DEBUG_TypeDerefPointer(DBG_ADDR * addr, struct datatype ** newtype)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Make sure that this really makes sense.
|
||||||
|
*/
|
||||||
|
if( addr->type->type != POINTER )
|
||||||
|
{
|
||||||
|
*newtype = NULL;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
*newtype = addr->type->un.pointer.pointsto;
|
||||||
|
return *(unsigned int*) (addr->off);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
DEBUG_FindStructElement(DBG_ADDR * addr, const char * ele_name, int * tmpbuf)
|
||||||
|
{
|
||||||
|
struct member * m;
|
||||||
|
unsigned int mask;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure that this really makes sense.
|
||||||
|
*/
|
||||||
|
if( addr->type->type != STRUCT )
|
||||||
|
{
|
||||||
|
addr->type = NULL;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(m = addr->type->un.structure.members; m; m = m->next)
|
||||||
|
{
|
||||||
|
if( strcmp(m->name, ele_name) == 0 )
|
||||||
|
{
|
||||||
|
addr->type = m->type;
|
||||||
|
if( (m->offset & 7) != 0 || (m->size & 7) != 0)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Bitfield operation. We have to extract the field and store
|
||||||
|
* it in a temporary buffer so that we get it all right.
|
||||||
|
*/
|
||||||
|
*tmpbuf = ((*(int* ) (addr->off + (m->offset >> 3))) >> (m->offset & 7));
|
||||||
|
addr->off = (int) tmpbuf;
|
||||||
|
|
||||||
|
mask = 0xffffffff << (m->size);
|
||||||
|
*tmpbuf &= ~mask;
|
||||||
|
/*
|
||||||
|
* OK, now we have the correct part of the number.
|
||||||
|
* Check to see whether the basic type is signed or not, and if so,
|
||||||
|
* we need to sign extend the number.
|
||||||
|
*/
|
||||||
|
if( m->type->type == BASIC && m->type->un.basic.b_signed != 0
|
||||||
|
&& (*tmpbuf & (1 << (m->size - 1))) != 0 )
|
||||||
|
{
|
||||||
|
*tmpbuf |= mask;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
addr->off += (m->offset >> 3);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
addr->type = NULL;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DEBUG_SetStructSize(struct datatype * dt, int size)
|
||||||
|
{
|
||||||
|
assert(dt->type == STRUCT);
|
||||||
|
dt->un.structure.size = size;
|
||||||
|
dt->un.structure.members = NULL;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DEBUG_CopyFieldlist(struct datatype * dt, struct datatype * dt2)
|
||||||
|
{
|
||||||
|
|
||||||
|
assert( dt->type == dt2->type && ((dt->type == STRUCT) || (dt->type == ENUM)));
|
||||||
|
|
||||||
|
if( dt->type == STRUCT )
|
||||||
|
{
|
||||||
|
dt->un.structure.members = dt2->un.structure.members;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dt->un.enumeration.members = dt2->un.enumeration.members;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DEBUG_AddStructElement(struct datatype * dt, char * name, struct datatype * type,
|
||||||
|
int offset, int size)
|
||||||
|
{
|
||||||
|
struct member * m;
|
||||||
|
struct member * last;
|
||||||
|
struct en_values * e;
|
||||||
|
|
||||||
|
if( dt->type == STRUCT )
|
||||||
|
{
|
||||||
|
for(last = dt->un.structure.members; last; last = last->next)
|
||||||
|
{
|
||||||
|
if( (last->name[0] == name[0])
|
||||||
|
&& (strcmp(last->name, name) == 0) )
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
if( last->next == NULL )
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
m = (struct member *) xmalloc(sizeof(struct member));
|
||||||
|
if( m == FALSE )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
m->name = xstrdup(name);
|
||||||
|
m->type = type;
|
||||||
|
m->offset = offset;
|
||||||
|
m->size = size;
|
||||||
|
if( last == NULL )
|
||||||
|
{
|
||||||
|
m->next = dt->un.structure.members;
|
||||||
|
dt->un.structure.members = m;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
last->next = m;
|
||||||
|
m->next = NULL;
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* If the base type is bitfield, then adjust the offsets here so that we
|
||||||
|
* are able to look things up without lots of falter-all.
|
||||||
|
*/
|
||||||
|
if( type->type == BITFIELD )
|
||||||
|
{
|
||||||
|
m->offset += m->type->un.bitfield.bitoff;
|
||||||
|
m->size = m->type->un.bitfield.nbits;
|
||||||
|
m->type = m->type->un.bitfield.basetype;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if( dt->type == ENUM )
|
||||||
|
{
|
||||||
|
e = (struct en_values *) xmalloc(sizeof(struct en_values));
|
||||||
|
if( e == FALSE )
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
e->name = xstrdup(name);
|
||||||
|
e->value = offset;
|
||||||
|
e->next = dt->un.enumeration.members;
|
||||||
|
dt->un.enumeration.members = e;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assert(FALSE);
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct datatype *
|
||||||
|
DEBUG_GetPointerType(struct datatype * dt)
|
||||||
|
{
|
||||||
|
if( dt->type == POINTER )
|
||||||
|
{
|
||||||
|
return dt->un.pointer.pointsto;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DEBUG_SetPointerType(struct datatype * dt, struct datatype * dt2)
|
||||||
|
{
|
||||||
|
switch(dt->type)
|
||||||
|
{
|
||||||
|
case POINTER:
|
||||||
|
dt->un.pointer.pointsto = dt2;
|
||||||
|
break;
|
||||||
|
case FUNC:
|
||||||
|
dt->un.funct.rettype = dt2;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DEBUG_SetArrayParams(struct datatype * dt, int min, int max, struct datatype * dt2)
|
||||||
|
{
|
||||||
|
assert(dt->type == ARRAY);
|
||||||
|
dt->un.array.start = min;
|
||||||
|
dt->un.array.end = max;
|
||||||
|
dt->un.array.basictype = dt2;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
DEBUG_SetBitfieldParams(struct datatype * dt, int offset, int nbits,
|
||||||
|
struct datatype * dt2)
|
||||||
|
{
|
||||||
|
assert(dt->type == BITFIELD);
|
||||||
|
dt->un.bitfield.bitoff = offset;
|
||||||
|
dt->un.bitfield.nbits = nbits;
|
||||||
|
dt->un.bitfield.basetype = dt2;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
int DEBUG_GetObjectSize(struct datatype * dt)
|
||||||
|
{
|
||||||
|
if( dt == NULL )
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(dt->type)
|
||||||
|
{
|
||||||
|
case BASIC:
|
||||||
|
return dt->un.basic.basic_size;
|
||||||
|
case POINTER:
|
||||||
|
return sizeof(int *);
|
||||||
|
case STRUCT:
|
||||||
|
return dt->un.structure.size;
|
||||||
|
case ENUM:
|
||||||
|
return sizeof(int);
|
||||||
|
case ARRAY:
|
||||||
|
return (dt->un.array.end - dt->un.array.start)
|
||||||
|
* DEBUG_GetObjectSize(dt->un.array.basictype);
|
||||||
|
case BITFIELD:
|
||||||
|
/*
|
||||||
|
* Bitfields have to be handled seperately later on
|
||||||
|
* when we insert the element into the structure.
|
||||||
|
*/
|
||||||
|
return 0;
|
||||||
|
case TYPEDEF:
|
||||||
|
case FUNC:
|
||||||
|
case CONST:
|
||||||
|
assert(FALSE);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned int
|
||||||
|
DEBUG_ArrayIndex(DBG_ADDR * addr, DBG_ADDR * result, int index)
|
||||||
|
{
|
||||||
|
int size;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Make sure that this really makes sense.
|
||||||
|
*/
|
||||||
|
if( addr->type->type == POINTER )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Get the base type, so we know how much to index by.
|
||||||
|
*/
|
||||||
|
size = DEBUG_GetObjectSize(addr->type->un.pointer.pointsto);
|
||||||
|
result->type = addr->type->un.pointer.pointsto;
|
||||||
|
result->off = (*(unsigned int*) (addr->off)) + size * index;
|
||||||
|
}
|
||||||
|
else if (addr->type->type == ARRAY)
|
||||||
|
{
|
||||||
|
size = DEBUG_GetObjectSize(addr->type->un.array.basictype);
|
||||||
|
result->type = addr->type->un.array.basictype;
|
||||||
|
result->off = addr->off + size * (index - addr->type->un.array.start);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* DEBUG_Print
|
||||||
|
*
|
||||||
|
* Implementation of the 'print' command.
|
||||||
|
*/
|
||||||
|
void DEBUG_Print( const DBG_ADDR *addr, int count, char format, int level )
|
||||||
|
{
|
||||||
|
DBG_ADDR addr1;
|
||||||
|
int i;
|
||||||
|
struct member * m;
|
||||||
|
char * pnt;
|
||||||
|
int size;
|
||||||
|
long long int value;
|
||||||
|
|
||||||
|
if (count != 1)
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Count other than 1 is meaningless in 'print' command\n" );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( addr->type == NULL )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "Unable to evaluate expression\n");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( format == 'i' || format == 's' || format == 'w' || format == 'b' )
|
||||||
|
{
|
||||||
|
fprintf( stderr, "Format specifier '%c' is meaningless in 'print' command\n", format );
|
||||||
|
format = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
switch(addr->type->type)
|
||||||
|
{
|
||||||
|
case BASIC:
|
||||||
|
case ENUM:
|
||||||
|
case CONST:
|
||||||
|
case POINTER:
|
||||||
|
DEBUG_PrintBasic(addr, 1, format);
|
||||||
|
break;
|
||||||
|
case STRUCT:
|
||||||
|
fprintf(stderr, "{");
|
||||||
|
for(m = addr->type->un.structure.members; m; m = m->next)
|
||||||
|
{
|
||||||
|
addr1 = *addr;
|
||||||
|
DEBUG_FindStructElement(&addr1, m->name,
|
||||||
|
(int *) &value);
|
||||||
|
fprintf(stderr, "%s=", m->name);
|
||||||
|
DEBUG_Print(&addr1, 1, format, level + 1);
|
||||||
|
if( m->next != NULL )
|
||||||
|
{
|
||||||
|
fprintf(stderr, ", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fprintf(stderr, "}");
|
||||||
|
break;
|
||||||
|
case ARRAY:
|
||||||
|
/*
|
||||||
|
* Loop over all of the entries, printing stuff as we go.
|
||||||
|
*/
|
||||||
|
size = DEBUG_GetObjectSize(addr->type->un.array.basictype);
|
||||||
|
if( size == 1 )
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
* Special handling for character arrays.
|
||||||
|
*/
|
||||||
|
pnt = (char *) addr->off;
|
||||||
|
fprintf(stderr, "\"");
|
||||||
|
for( i=addr->type->un.array.start; i < addr->type->un.array.end; i++ )
|
||||||
|
{
|
||||||
|
fputc(*pnt++, stderr);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "\"");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
addr1 = *addr;
|
||||||
|
addr1.type = addr->type->un.array.basictype;
|
||||||
|
fprintf(stderr, "{");
|
||||||
|
for( i=addr->type->un.array.start; i <= addr->type->un.array.end; i++ )
|
||||||
|
{
|
||||||
|
DEBUG_Print(&addr1, 1, format, level + 1);
|
||||||
|
addr1.off += size;
|
||||||
|
if( i == addr->type->un.array.end )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, ", ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
assert(FALSE);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( level == 0 )
|
||||||
|
{
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,35 @@
|
||||||
|
Running & Compiling WINE in OS/2
|
||||||
|
|
||||||
|
Here is what you need to (try to) compile Wine for OS/2:
|
||||||
|
EMX 0.9c (fix 2)
|
||||||
|
XFree86 3.2 OS/2 (with development libraries)
|
||||||
|
bash, gnu make, grep, tar, bison, flex
|
||||||
|
sed (a working copy of)
|
||||||
|
diff and patch are recommended
|
||||||
|
|
||||||
|
To compile:
|
||||||
|
sh
|
||||||
|
tools/make_os2.sh
|
||||||
|
make depend
|
||||||
|
make (make doesn't work yet... I will need to do some others patch, or
|
||||||
|
you may do it...)
|
||||||
|
|
||||||
|
Currently:
|
||||||
|
- configure and make depend work...
|
||||||
|
- make doesn't work
|
||||||
|
- the selectors numbers (0) are wrong...
|
||||||
|
|
||||||
|
What needs to be redone:
|
||||||
|
File functions, I/O access (do it!), Interrupt (if int unknow, call
|
||||||
|
current RealMode one...), verify that everything is thread safe (how
|
||||||
|
does Win95/NT handle multi-thread?), move X functions in some files
|
||||||
|
(and make a wrapper, to use PM instead latter), etc...
|
||||||
|
|
||||||
|
The good things:
|
||||||
|
- OS/2 have DOS interrupts
|
||||||
|
- OS/2 have I/O port access
|
||||||
|
- OS/2 have multi-thread
|
||||||
|
- Merlin have Open32 (to be used later...)
|
||||||
|
|
||||||
|
Robert Pouliot <krynos@clic.net>
|
||||||
|
January 9, 1997
|
|
@ -6,13 +6,13 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
#include "dos_fs.h"
|
|
||||||
#include "drive.h"
|
#include "drive.h"
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "heap.h"
|
#include "heap.h"
|
||||||
|
@ -43,25 +43,20 @@ static int DIR_GetPath( const char *keyname, const char *defval,
|
||||||
char **dos_path, char **unix_path )
|
char **dos_path, char **unix_path )
|
||||||
{
|
{
|
||||||
char path[MAX_PATHNAME_LEN];
|
char path[MAX_PATHNAME_LEN];
|
||||||
const char *dos_name ,*unix_name;
|
DOS_FULL_NAME full_name;
|
||||||
|
|
||||||
BY_HANDLE_FILE_INFORMATION info;
|
BY_HANDLE_FILE_INFORMATION info;
|
||||||
|
|
||||||
PROFILE_GetWineIniString( "wine", keyname, defval, path, sizeof(path) );
|
PROFILE_GetWineIniString( "wine", keyname, defval, path, sizeof(path) );
|
||||||
if (!(unix_name = DOSFS_GetUnixFileName( path, TRUE )) ||
|
if (!DOSFS_GetFullName( path, TRUE, &full_name ) ||
|
||||||
!FILE_Stat( unix_name, &info ) ||
|
!FILE_Stat( full_name.long_name, &info ) ||
|
||||||
!(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
!(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
||||||
{
|
{
|
||||||
fprintf(stderr, "Invalid path '%s' for %s directory\n", path, keyname);
|
fprintf(stderr, "Invalid path '%s' for %s directory\n", path, keyname);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!(dos_name = DOSFS_GetDosTrueName( unix_name, TRUE )))
|
*unix_path = HEAP_strdupA( SystemHeap, 0, full_name.long_name );
|
||||||
{
|
*dos_path = HEAP_strdupA( SystemHeap, 0, full_name.short_name );
|
||||||
fprintf( stderr, "Could not get DOS name for %s directory '%s'\n",
|
|
||||||
keyname, unix_name );
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
*unix_path = HEAP_strdupA( SystemHeap, 0, unix_name );
|
|
||||||
*dos_path = HEAP_strdupA( SystemHeap, 0, dos_name );
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -72,7 +67,7 @@ static int DIR_GetPath( const char *keyname, const char *defval,
|
||||||
void DIR_ParseWindowsPath( char *path )
|
void DIR_ParseWindowsPath( char *path )
|
||||||
{
|
{
|
||||||
char *p;
|
char *p;
|
||||||
const char *dos_name ,*unix_name;
|
DOS_FULL_NAME full_name;
|
||||||
BY_HANDLE_FILE_INFORMATION info;
|
BY_HANDLE_FILE_INFORMATION info;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -87,22 +82,18 @@ void DIR_ParseWindowsPath( char *path )
|
||||||
MAX_PATH_ELEMENTS );
|
MAX_PATH_ELEMENTS );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (!(unix_name = DOSFS_GetUnixFileName( path, TRUE )) ||
|
if (!DOSFS_GetFullName( path, TRUE, &full_name ) ||
|
||||||
!FILE_Stat( unix_name, &info ) ||
|
!FILE_Stat( full_name.long_name, &info ) ||
|
||||||
!(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
!(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
||||||
{
|
{
|
||||||
fprintf(stderr,"Warning: invalid dir '%s' in path, deleting it.\n",
|
fprintf(stderr,"Warning: invalid dir '%s' in path, deleting it.\n",
|
||||||
path );
|
path );
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (!(dos_name = DOSFS_GetDosTrueName( unix_name, TRUE )))
|
DIR_UnixPath[DIR_PathElements] = HEAP_strdupA( SystemHeap, 0,
|
||||||
{
|
full_name.long_name );
|
||||||
fprintf( stderr, "Warning: could not get DOS name for '%s' in path, deleting it.\n",
|
DIR_DosPath[DIR_PathElements] = HEAP_strdupA( SystemHeap, 0,
|
||||||
unix_name );
|
full_name.short_name );
|
||||||
continue;
|
|
||||||
}
|
|
||||||
DIR_UnixPath[DIR_PathElements] = HEAP_strdupA(SystemHeap,0,unix_name);
|
|
||||||
DIR_DosPath[DIR_PathElements] = HEAP_strdupA(SystemHeap,0,dos_name);
|
|
||||||
DIR_PathElements++;
|
DIR_PathElements++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,9 +128,8 @@ int DIR_Init(void)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
cwd = DOSFS_GetDosTrueName( path, TRUE );
|
|
||||||
DRIVE_SetCurrentDrive( drive );
|
DRIVE_SetCurrentDrive( drive );
|
||||||
DRIVE_Chdir( drive, cwd + 2 );
|
DRIVE_Chdir( drive, cwd );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(DIR_GetPath( "windows", "c:\\windows",
|
if (!(DIR_GetPath( "windows", "c:\\windows",
|
||||||
|
@ -344,7 +334,8 @@ BOOL16 CreateDirectory16( LPCSTR path, LPVOID dummy )
|
||||||
*/
|
*/
|
||||||
BOOL32 CreateDirectory32A( LPCSTR path, LPSECURITY_ATTRIBUTES lpsecattribs )
|
BOOL32 CreateDirectory32A( LPCSTR path, LPSECURITY_ATTRIBUTES lpsecattribs )
|
||||||
{
|
{
|
||||||
const char *unixName;
|
DOS_FULL_NAME full_name;
|
||||||
|
LPCSTR unixName;
|
||||||
|
|
||||||
dprintf_file( stddeb, "CreateDirectory32A(%s,%p)\n", path, lpsecattribs );
|
dprintf_file( stddeb, "CreateDirectory32A(%s,%p)\n", path, lpsecattribs );
|
||||||
if ((unixName = DOSFS_IsDevice( path )) != NULL)
|
if ((unixName = DOSFS_IsDevice( path )) != NULL)
|
||||||
|
@ -353,8 +344,8 @@ BOOL32 CreateDirectory32A( LPCSTR path, LPSECURITY_ATTRIBUTES lpsecattribs )
|
||||||
DOS_ERROR( ER_AccessDenied, EC_AccessDenied, SA_Abort, EL_Disk );
|
DOS_ERROR( ER_AccessDenied, EC_AccessDenied, SA_Abort, EL_Disk );
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (!(unixName = DOSFS_GetUnixFileName( path, FALSE ))) return 0;
|
if (!DOSFS_GetFullName( path, FALSE, &full_name )) return 0;
|
||||||
if ((mkdir( unixName, 0777 ) == -1) && (errno != EEXIST))
|
if ((mkdir( full_name.long_name, 0777 ) == -1) && (errno != EEXIST))
|
||||||
{
|
{
|
||||||
FILE_SetDosError();
|
FILE_SetDosError();
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -409,7 +400,8 @@ BOOL16 RemoveDirectory16( LPCSTR path )
|
||||||
*/
|
*/
|
||||||
BOOL32 RemoveDirectory32A( LPCSTR path )
|
BOOL32 RemoveDirectory32A( LPCSTR path )
|
||||||
{
|
{
|
||||||
const char *unixName;
|
DOS_FULL_NAME full_name;
|
||||||
|
LPCSTR unixName;
|
||||||
|
|
||||||
dprintf_file(stddeb, "RemoveDirectory: '%s'\n", path );
|
dprintf_file(stddeb, "RemoveDirectory: '%s'\n", path );
|
||||||
|
|
||||||
|
@ -419,8 +411,8 @@ BOOL32 RemoveDirectory32A( LPCSTR path )
|
||||||
DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
|
DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
if (!(unixName = DOSFS_GetUnixFileName( path, TRUE ))) return FALSE;
|
if (!DOSFS_GetFullName( path, TRUE, &full_name )) return FALSE;
|
||||||
if (rmdir( unixName ) == -1)
|
if (rmdir( full_name.long_name ) == -1)
|
||||||
{
|
{
|
||||||
FILE_SetDosError();
|
FILE_SetDosError();
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -441,6 +433,56 @@ BOOL32 RemoveDirectory32W( LPCWSTR path )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* DIR_TryPath
|
||||||
|
*
|
||||||
|
* Helper function for DIR_SearchPath.
|
||||||
|
*/
|
||||||
|
static BOOL32 DIR_TryPath( LPCSTR unix_dir, LPCSTR dos_dir, LPCSTR name,
|
||||||
|
DOS_FULL_NAME *full_name )
|
||||||
|
{
|
||||||
|
LPSTR p_l = full_name->long_name + strlen(unix_dir) + 1;
|
||||||
|
LPSTR p_s = full_name->short_name + strlen(dos_dir) + 1;
|
||||||
|
|
||||||
|
if ((p_s >= full_name->short_name + sizeof(full_name->short_name) - 14) ||
|
||||||
|
(p_l >= full_name->long_name + sizeof(full_name->long_name) - 1))
|
||||||
|
{
|
||||||
|
DOS_ERROR( ER_PathNotFound, EC_NotFound, SA_Abort, EL_Disk );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (!DOSFS_FindUnixName( unix_dir, name, p_l,
|
||||||
|
sizeof(full_name->long_name) - (p_l - full_name->long_name),
|
||||||
|
p_s, DRIVE_GetFlags( dos_dir[0] - 'A' ) ))
|
||||||
|
return FALSE;
|
||||||
|
strcpy( full_name->long_name, unix_dir );
|
||||||
|
p_l[-1] = '/';
|
||||||
|
strcpy( full_name->short_name, dos_dir );
|
||||||
|
p_s[-1] = '\\';
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* DIR_TryModulePath
|
||||||
|
*
|
||||||
|
* Helper function for DIR_SearchPath.
|
||||||
|
*/
|
||||||
|
static BOOL32 DIR_TryModulePath( LPCSTR name, DOS_FULL_NAME *full_name )
|
||||||
|
{
|
||||||
|
/* FIXME: for now, GetModuleFileName32A can't return more */
|
||||||
|
/* than OFS_MAXPATHNAME. This may change with Win32. */
|
||||||
|
char buffer[OFS_MAXPATHNAME];
|
||||||
|
LPSTR p;
|
||||||
|
|
||||||
|
if (!GetCurrentTask()) return FALSE;
|
||||||
|
GetModuleFileName32A( GetCurrentTask(), buffer, sizeof(buffer) );
|
||||||
|
if (!(p = strrchr( buffer, '\\' ))) return FALSE;
|
||||||
|
if (sizeof(buffer) - (++p - buffer) <= strlen(name)) return FALSE;
|
||||||
|
strcpy( p, name );
|
||||||
|
return DOSFS_GetFullName( buffer, TRUE, full_name );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DIR_SearchPath
|
* DIR_SearchPath
|
||||||
*
|
*
|
||||||
|
@ -450,17 +492,24 @@ BOOL32 RemoveDirectory32W( LPCWSTR path )
|
||||||
* FIXME: should return long path names.
|
* FIXME: should return long path names.
|
||||||
*/
|
*/
|
||||||
DWORD DIR_SearchPath( LPCSTR path, LPCSTR name, LPCSTR ext,
|
DWORD DIR_SearchPath( LPCSTR path, LPCSTR name, LPCSTR ext,
|
||||||
DWORD buflen, LPSTR buffer, LPSTR *lastpart,
|
DOS_FULL_NAME *full_name, BOOL32 win32 )
|
||||||
BOOL32 win32 )
|
|
||||||
{
|
{
|
||||||
DWORD len;
|
DWORD len;
|
||||||
LPSTR tmp;
|
LPCSTR p;
|
||||||
int i;
|
int i;
|
||||||
|
LPSTR tmp = NULL;
|
||||||
|
BOOL32 ret = TRUE;
|
||||||
|
|
||||||
/* First check the supplied parameters */
|
/* First check the supplied parameters */
|
||||||
|
|
||||||
if (strchr( name, '.' )) ext = NULL; /* Ignore the specified extension */
|
if (!(p = strrchr( name, '\\' ))) p = name;
|
||||||
|
if (!(p = strrchr( p, '/' ))) p = name;
|
||||||
|
if (strchr( p, '.' )) ext = NULL; /* Ignore the specified extension */
|
||||||
|
if ((*name && (name[1] == ':')) ||
|
||||||
|
strchr( name, '/' ) || strchr( name, '\\' ))
|
||||||
|
path = NULL; /* Ignore path if name already contains a path */
|
||||||
if (path && !*path) path = NULL; /* Ignore empty path */
|
if (path && !*path) path = NULL; /* Ignore empty path */
|
||||||
|
|
||||||
len = strlen(name);
|
len = strlen(name);
|
||||||
if (ext) len += strlen(ext);
|
if (ext) len += strlen(ext);
|
||||||
if (path) len += strlen(path) + 1;
|
if (path) len += strlen(path) + 1;
|
||||||
|
@ -482,110 +531,52 @@ DWORD DIR_SearchPath( LPCSTR path, LPCSTR name, LPCSTR ext,
|
||||||
}
|
}
|
||||||
else strcpy( tmp, name );
|
else strcpy( tmp, name );
|
||||||
if (ext) strcat( tmp, ext );
|
if (ext) strcat( tmp, ext );
|
||||||
|
name = tmp;
|
||||||
}
|
}
|
||||||
else tmp = (LPSTR)name;
|
|
||||||
|
|
||||||
/* If we have an explicit path, everything's easy */
|
/* If we have an explicit path, everything's easy */
|
||||||
|
|
||||||
if (path || (*tmp && (tmp[1] == ':')) ||
|
if (path || (*name && (name[1] == ':')) ||
|
||||||
strchr( tmp, '/' ) || strchr( tmp, '\\' ))
|
strchr( name, '/' ) || strchr( name, '\\' ))
|
||||||
{
|
{
|
||||||
if (!DOSFS_GetUnixFileName( tmp, TRUE )) goto not_found;
|
ret = DOSFS_GetFullName( name, TRUE, full_name );
|
||||||
lstrcpyn32A( buffer, tmp, buflen );
|
goto done;
|
||||||
if (tmp != name) HeapFree( GetProcessHeap(), 0, tmp );
|
|
||||||
return len;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Try the path of the current executable (for Win32 search order) */
|
/* Try the path of the current executable (for Win32 search order) */
|
||||||
|
|
||||||
if (win32 && GetCurrentTask())
|
if (win32 && DIR_TryModulePath( name, full_name )) goto done;
|
||||||
{
|
|
||||||
LPSTR p;
|
|
||||||
GetModuleFileName32A( GetCurrentTask(), buffer, buflen );
|
|
||||||
if ((p = strrchr( buffer, '\\' )))
|
|
||||||
{
|
|
||||||
lstrcpyn32A( p + 1, tmp, (INT32)buflen - (p - buffer) );
|
|
||||||
if (DOSFS_GetUnixFileName( buffer, TRUE ))
|
|
||||||
{
|
|
||||||
*p = '\0';
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Try the current directory */
|
/* Try the current directory */
|
||||||
|
|
||||||
if (DOSFS_GetUnixFileName( tmp, TRUE ))
|
if (DOSFS_GetFullName( name, TRUE, full_name )) goto done;
|
||||||
{
|
|
||||||
GetCurrentDirectory32A( buflen, buffer );
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Try the Windows directory */
|
/* Try the Windows directory */
|
||||||
|
|
||||||
if (DOSFS_FindUnixName( DIR_WindowsUnixDir, name, NULL, 0,
|
if (DIR_TryPath( DIR_WindowsUnixDir, DIR_WindowsDosDir, name, full_name ))
|
||||||
DRIVE_GetFlags( DIR_WindowsDosDir[0] - 'A' ) ))
|
goto done;
|
||||||
{
|
|
||||||
lstrcpyn32A( buffer, DIR_WindowsDosDir, buflen );
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Try the Windows system directory */
|
/* Try the Windows system directory */
|
||||||
|
|
||||||
if (DOSFS_FindUnixName( DIR_SystemUnixDir, name, NULL, 0,
|
if (DIR_TryPath( DIR_SystemUnixDir, DIR_SystemDosDir, name, full_name ))
|
||||||
DRIVE_GetFlags( DIR_SystemDosDir[0] - 'A' ) ))
|
goto done;
|
||||||
{
|
|
||||||
lstrcpyn32A( buffer, DIR_SystemDosDir, buflen );
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Try the path of the current executable (for Win16 search order) */
|
/* Try the path of the current executable (for Win16 search order) */
|
||||||
|
|
||||||
if (!win32 && GetCurrentTask())
|
if (!win32 && DIR_TryModulePath( name, full_name )) goto done;
|
||||||
{
|
|
||||||
LPSTR p;
|
|
||||||
GetModuleFileName32A( GetCurrentTask(), buffer, buflen );
|
|
||||||
if ((p = strrchr( buffer, '\\' )))
|
|
||||||
{
|
|
||||||
lstrcpyn32A( p + 1, tmp, (INT32)buflen - (p - buffer) );
|
|
||||||
if (DOSFS_GetUnixFileName( buffer, TRUE ))
|
|
||||||
{
|
|
||||||
*p = '\0';
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/* Try all directories in path */
|
/* Try all directories in path */
|
||||||
|
|
||||||
for (i = 0; i < DIR_PathElements; i++)
|
for (i = 0; i < DIR_PathElements; i++)
|
||||||
{
|
{
|
||||||
if (DOSFS_FindUnixName( DIR_UnixPath[i], name, NULL, 0,
|
if (DIR_TryPath( DIR_UnixPath[i], DIR_DosPath[i], name, full_name ))
|
||||||
DRIVE_GetFlags( DIR_DosPath[i][0] - 'A' ) ))
|
goto done;
|
||||||
{
|
|
||||||
lstrcpyn32A( buffer, DIR_DosPath[i], buflen );
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
not_found:
|
ret = FALSE;
|
||||||
if (tmp != name) HeapFree( GetProcessHeap(), 0, tmp );
|
done:
|
||||||
SetLastError( ERROR_FILE_NOT_FOUND );
|
if (tmp) HeapFree( GetProcessHeap(), 0, tmp );
|
||||||
DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
|
return ret;
|
||||||
return 0;
|
|
||||||
|
|
||||||
found:
|
|
||||||
len = strlen(buffer);
|
|
||||||
if (lastpart) *lastpart = buffer + len + 1;
|
|
||||||
if (len + 1 < buflen)
|
|
||||||
{
|
|
||||||
buffer += len;
|
|
||||||
*buffer++ = '\\';
|
|
||||||
buflen -= len + 1;
|
|
||||||
lstrcpyn32A( buffer, tmp, buflen );
|
|
||||||
}
|
|
||||||
len += strlen(tmp) + 1;
|
|
||||||
if (tmp != name) HeapFree( GetProcessHeap(), 0, tmp );
|
|
||||||
return len;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -595,7 +586,17 @@ found:
|
||||||
DWORD SearchPath32A( LPCSTR path, LPCSTR name, LPCSTR ext, DWORD buflen,
|
DWORD SearchPath32A( LPCSTR path, LPCSTR name, LPCSTR ext, DWORD buflen,
|
||||||
LPSTR buffer, LPSTR *lastpart )
|
LPSTR buffer, LPSTR *lastpart )
|
||||||
{
|
{
|
||||||
return DIR_SearchPath( path, name, ext, buflen, buffer, lastpart, TRUE );
|
LPSTR p, res;
|
||||||
|
DOS_FULL_NAME full_name;
|
||||||
|
|
||||||
|
if (!DIR_SearchPath( path, name, ext, &full_name, TRUE )) return 0;
|
||||||
|
lstrcpyn32A( buffer, full_name.short_name, buflen );
|
||||||
|
res = full_name.long_name +
|
||||||
|
strlen(DRIVE_GetRoot( full_name.short_name[0] - 'A' ));
|
||||||
|
if (*res && (buflen > 3)) lstrcpyn32A( buffer + 3, res + 1, buflen - 3 );
|
||||||
|
for (p = buffer; *p; p++) if (*p == '/') *p = '\\';
|
||||||
|
if (lastpart) *lastpart = strrchr( buffer, '\\' ) + 1;
|
||||||
|
return *res ? strlen(res) + 2 : 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -605,25 +606,30 @@ DWORD SearchPath32A( LPCSTR path, LPCSTR name, LPCSTR ext, DWORD buflen,
|
||||||
DWORD SearchPath32W( LPCWSTR path, LPCWSTR name, LPCWSTR ext, DWORD buflen,
|
DWORD SearchPath32W( LPCWSTR path, LPCWSTR name, LPCWSTR ext, DWORD buflen,
|
||||||
LPWSTR buffer, LPWSTR *lastpart )
|
LPWSTR buffer, LPWSTR *lastpart )
|
||||||
{
|
{
|
||||||
|
LPWSTR p;
|
||||||
|
LPSTR res;
|
||||||
|
DOS_FULL_NAME full_name;
|
||||||
|
|
||||||
LPSTR pathA = HEAP_strdupWtoA( GetProcessHeap(), 0, path );
|
LPSTR pathA = HEAP_strdupWtoA( GetProcessHeap(), 0, path );
|
||||||
LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
|
LPSTR nameA = HEAP_strdupWtoA( GetProcessHeap(), 0, name );
|
||||||
LPSTR extA = HEAP_strdupWtoA( GetProcessHeap(), 0, ext );
|
LPSTR extA = HEAP_strdupWtoA( GetProcessHeap(), 0, ext );
|
||||||
LPSTR lastpartA;
|
DWORD ret = DIR_SearchPath( pathA, nameA, extA, &full_name, TRUE );
|
||||||
LPSTR bufferA = HeapAlloc( GetProcessHeap(), 0, buflen + 1 );
|
|
||||||
|
|
||||||
DWORD ret = DIR_SearchPath( pathA, nameA, extA, buflen, bufferA,
|
|
||||||
&lastpartA, TRUE );
|
|
||||||
lstrcpyAtoW( buffer, bufferA );
|
|
||||||
if (lastpart)
|
|
||||||
{
|
|
||||||
if (lastpartA) *lastpart = buffer + (lastpartA - bufferA);
|
|
||||||
else *lastpart = NULL;
|
|
||||||
}
|
|
||||||
HeapFree( GetProcessHeap(), 0, bufferA );
|
|
||||||
HeapFree( GetProcessHeap(), 0, extA );
|
HeapFree( GetProcessHeap(), 0, extA );
|
||||||
HeapFree( GetProcessHeap(), 0, nameA );
|
HeapFree( GetProcessHeap(), 0, nameA );
|
||||||
HeapFree( GetProcessHeap(), 0, pathA );
|
HeapFree( GetProcessHeap(), 0, pathA );
|
||||||
return ret;
|
if (!ret) return 0;
|
||||||
|
|
||||||
|
lstrcpynAtoW( buffer, full_name.short_name, buflen );
|
||||||
|
res = full_name.long_name +
|
||||||
|
strlen(DRIVE_GetRoot( full_name.short_name[0] - 'A' ));
|
||||||
|
if (*res && (buflen > 3)) lstrcpynAtoW( buffer + 3, res + 1, buflen - 3 );
|
||||||
|
for (p = buffer; *p; p++) if (*p == '/') *p = '\\';
|
||||||
|
if (lastpart)
|
||||||
|
{
|
||||||
|
for (p = *lastpart = buffer; *p; p++)
|
||||||
|
if (*p == '\\') *lastpart = p + 1;
|
||||||
|
}
|
||||||
|
return *res ? strlen(res) + 2 : 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
761
files/dos_fs.c
761
files/dos_fs.c
File diff suppressed because it is too large
Load Diff
|
@ -25,7 +25,6 @@
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "dos_fs.h"
|
|
||||||
#include "drive.h"
|
#include "drive.h"
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "heap.h"
|
#include "heap.h"
|
||||||
|
@ -410,8 +409,9 @@ UINT32 DRIVE_GetFlags( int drive )
|
||||||
*/
|
*/
|
||||||
int DRIVE_Chdir( int drive, const char *path )
|
int DRIVE_Chdir( int drive, const char *path )
|
||||||
{
|
{
|
||||||
|
DOS_FULL_NAME full_name;
|
||||||
char buffer[MAX_PATHNAME_LEN];
|
char buffer[MAX_PATHNAME_LEN];
|
||||||
const char *unix_cwd, *dos_cwd;
|
LPSTR unix_cwd;
|
||||||
BY_HANDLE_FILE_INFORMATION info;
|
BY_HANDLE_FILE_INFORMATION info;
|
||||||
TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
|
TDB *pTask = (TDB *)GlobalLock16( GetCurrentTask() );
|
||||||
|
|
||||||
|
@ -420,31 +420,30 @@ int DRIVE_Chdir( int drive, const char *path )
|
||||||
buffer[0] += drive;
|
buffer[0] += drive;
|
||||||
lstrcpyn32A( buffer + 2, path, sizeof(buffer) - 2 );
|
lstrcpyn32A( buffer + 2, path, sizeof(buffer) - 2 );
|
||||||
|
|
||||||
if (!(unix_cwd = DOSFS_GetUnixFileName( buffer, TRUE ))) return 0;
|
if (!DOSFS_GetFullName( buffer, TRUE, &full_name )) return 0;
|
||||||
if (!FILE_Stat( unix_cwd, &info )) return 0;
|
if (!FILE_Stat( full_name.long_name, &info )) return 0;
|
||||||
if (!(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
if (!(info.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
|
||||||
{
|
{
|
||||||
DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
|
DOS_ERROR( ER_FileNotFound, EC_NotFound, SA_Abort, EL_Disk );
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
unix_cwd += strlen( DOSDrives[drive].root );
|
unix_cwd = full_name.long_name + strlen( DOSDrives[drive].root );
|
||||||
while (*unix_cwd == '/') unix_cwd++;
|
while (*unix_cwd == '/') unix_cwd++;
|
||||||
buffer[2] = '/';
|
|
||||||
lstrcpyn32A( buffer + 3, unix_cwd, sizeof(buffer) - 3 );
|
|
||||||
if (!(dos_cwd = DOSFS_GetDosTrueName( buffer, TRUE ))) return 0;
|
|
||||||
|
|
||||||
dprintf_dosfs( stddeb, "DRIVE_Chdir(%c:): unix_cwd=%s dos_cwd=%s\n",
|
dprintf_dosfs( stddeb, "DRIVE_Chdir(%c:): unix_cwd=%s dos_cwd=%s\n",
|
||||||
'A' + drive, unix_cwd, dos_cwd + 3 );
|
'A' + drive, unix_cwd, full_name.short_name + 3 );
|
||||||
|
|
||||||
HeapFree( SystemHeap, 0, DOSDrives[drive].dos_cwd );
|
HeapFree( SystemHeap, 0, DOSDrives[drive].dos_cwd );
|
||||||
HeapFree( SystemHeap, 0, DOSDrives[drive].unix_cwd );
|
HeapFree( SystemHeap, 0, DOSDrives[drive].unix_cwd );
|
||||||
DOSDrives[drive].dos_cwd = HEAP_strdupA( SystemHeap, 0, dos_cwd + 3 );
|
DOSDrives[drive].dos_cwd = HEAP_strdupA( SystemHeap, 0,
|
||||||
|
full_name.short_name + 3 );
|
||||||
DOSDrives[drive].unix_cwd = HEAP_strdupA( SystemHeap, 0, unix_cwd );
|
DOSDrives[drive].unix_cwd = HEAP_strdupA( SystemHeap, 0, unix_cwd );
|
||||||
|
|
||||||
if (pTask && (pTask->curdrive & 0x80) &&
|
if (pTask && (pTask->curdrive & 0x80) &&
|
||||||
((pTask->curdrive & ~0x80) == drive))
|
((pTask->curdrive & ~0x80) == drive))
|
||||||
{
|
{
|
||||||
lstrcpyn32A( pTask->curdir, dos_cwd + 2, sizeof(pTask->curdir) );
|
lstrcpyn32A( pTask->curdir, full_name.short_name + 2,
|
||||||
|
sizeof(pTask->curdir) );
|
||||||
DRIVE_LastTask = GetCurrentTask();
|
DRIVE_LastTask = GetCurrentTask();
|
||||||
}
|
}
|
||||||
return 1;
|
return 1;
|
||||||
|
|
320
files/file.c
320
files/file.c
|
@ -20,7 +20,6 @@
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "winerror.h"
|
#include "winerror.h"
|
||||||
#include "dos_fs.h"
|
|
||||||
#include "drive.h"
|
#include "drive.h"
|
||||||
#include "file.h"
|
#include "file.h"
|
||||||
#include "global.h"
|
#include "global.h"
|
||||||
|
@ -212,11 +211,8 @@ static HFILE32 FILE_OpenUnixFile( const char *name, int mode )
|
||||||
|
|
||||||
if ((file->unix_handle = open( name, mode, 0666 )) == -1)
|
if ((file->unix_handle = open( name, mode, 0666 )) == -1)
|
||||||
{
|
{
|
||||||
if (Options.allowReadOnly && (mode == O_RDWR))
|
if (!Options.failReadOnly && (mode == O_RDWR))
|
||||||
{
|
file->unix_handle = open( name, O_RDONLY );
|
||||||
if ((file->unix_handle = open( name, O_RDONLY )) != -1)
|
|
||||||
fprintf( stderr, "Warning: could not open %s for writing, opening read-only.\n", name );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if ((file->unix_handle == -1) || (fstat( file->unix_handle, &st ) == -1))
|
if ((file->unix_handle == -1) || (fstat( file->unix_handle, &st ) == -1))
|
||||||
{
|
{
|
||||||
|
@ -243,6 +239,7 @@ static HFILE32 FILE_OpenUnixFile( const char *name, int mode )
|
||||||
*/
|
*/
|
||||||
HFILE32 FILE_Open( LPCSTR path, INT32 mode )
|
HFILE32 FILE_Open( LPCSTR path, INT32 mode )
|
||||||
{
|
{
|
||||||
|
DOS_FULL_NAME full_name;
|
||||||
const char *unixName;
|
const char *unixName;
|
||||||
|
|
||||||
dprintf_file(stddeb, "FILE_Open: '%s' %04x\n", path, mode );
|
dprintf_file(stddeb, "FILE_Open: '%s' %04x\n", path, mode );
|
||||||
|
@ -257,9 +254,11 @@ HFILE32 FILE_Open( LPCSTR path, INT32 mode )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else /* check for filename, don't check for last entry if creating */
|
else /* check for filename, don't check for last entry if creating */
|
||||||
if (!(unixName = DOSFS_GetUnixFileName( path, !(mode & O_CREAT) )))
|
{
|
||||||
|
if (!DOSFS_GetFullName( path, !(mode & O_CREAT), &full_name ))
|
||||||
return HFILE_ERROR32;
|
return HFILE_ERROR32;
|
||||||
|
unixName = full_name.long_name;
|
||||||
|
}
|
||||||
return FILE_OpenUnixFile( unixName, mode );
|
return FILE_OpenUnixFile( unixName, mode );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -272,6 +271,7 @@ static HFILE32 FILE_Create( LPCSTR path, int mode, int unique )
|
||||||
HFILE32 handle;
|
HFILE32 handle;
|
||||||
DOS_FILE *file;
|
DOS_FILE *file;
|
||||||
const char *unixName;
|
const char *unixName;
|
||||||
|
DOS_FULL_NAME full_name;
|
||||||
|
|
||||||
dprintf_file(stddeb, "FILE_Create: '%s' %04x %d\n", path, mode, unique );
|
dprintf_file(stddeb, "FILE_Create: '%s' %04x %d\n", path, mode, unique );
|
||||||
|
|
||||||
|
@ -285,12 +285,12 @@ static HFILE32 FILE_Create( LPCSTR path, int mode, int unique )
|
||||||
if ((handle = FILE_Alloc( &file )) == INVALID_HANDLE_VALUE32)
|
if ((handle = FILE_Alloc( &file )) == INVALID_HANDLE_VALUE32)
|
||||||
return INVALID_HANDLE_VALUE32;
|
return INVALID_HANDLE_VALUE32;
|
||||||
|
|
||||||
if (!(unixName = DOSFS_GetUnixFileName( path, FALSE )))
|
if (!DOSFS_GetFullName( path, FALSE, &full_name ))
|
||||||
{
|
{
|
||||||
CloseHandle( handle );
|
CloseHandle( handle );
|
||||||
return INVALID_HANDLE_VALUE32;
|
return INVALID_HANDLE_VALUE32;
|
||||||
}
|
}
|
||||||
if ((file->unix_handle = open( unixName,
|
if ((file->unix_handle = open( full_name.long_name,
|
||||||
O_CREAT | O_TRUNC | O_RDWR | (unique ? O_EXCL : 0),
|
O_CREAT | O_TRUNC | O_RDWR | (unique ? O_EXCL : 0),
|
||||||
mode )) == -1)
|
mode )) == -1)
|
||||||
{
|
{
|
||||||
|
@ -301,7 +301,7 @@ static HFILE32 FILE_Create( LPCSTR path, int mode, int unique )
|
||||||
|
|
||||||
/* File created OK, now fill the DOS_FILE */
|
/* File created OK, now fill the DOS_FILE */
|
||||||
|
|
||||||
file->unix_name = HEAP_strdupA( SystemHeap, 0, unixName );
|
file->unix_name = HEAP_strdupA( SystemHeap, 0, full_name.long_name );
|
||||||
return handle;
|
return handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -317,9 +317,9 @@ static void FILE_FillInfo( struct stat *st, BY_HANDLE_FILE_INFORMATION *info )
|
||||||
if (S_ISDIR(st->st_mode))
|
if (S_ISDIR(st->st_mode))
|
||||||
info->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
|
info->dwFileAttributes |= FILE_ATTRIBUTE_DIRECTORY;
|
||||||
|
|
||||||
DOSFS_UnixTimeToFileTime( st->st_mtime, &info->ftCreationTime );
|
DOSFS_UnixTimeToFileTime( st->st_mtime, &info->ftCreationTime, 0 );
|
||||||
DOSFS_UnixTimeToFileTime( st->st_mtime, &info->ftLastWriteTime );
|
DOSFS_UnixTimeToFileTime( st->st_mtime, &info->ftLastWriteTime, 0 );
|
||||||
DOSFS_UnixTimeToFileTime( st->st_atime, &info->ftLastAccessTime );
|
DOSFS_UnixTimeToFileTime( st->st_atime, &info->ftLastAccessTime, 0 );
|
||||||
|
|
||||||
info->dwVolumeSerialNumber = 0; /* FIXME */
|
info->dwVolumeSerialNumber = 0; /* FIXME */
|
||||||
info->nFileSizeHigh = 0;
|
info->nFileSizeHigh = 0;
|
||||||
|
@ -385,9 +385,11 @@ DWORD GetFileAttributes16( LPCSTR name )
|
||||||
*/
|
*/
|
||||||
DWORD GetFileAttributes32A( LPCSTR name )
|
DWORD GetFileAttributes32A( LPCSTR name )
|
||||||
{
|
{
|
||||||
|
DOS_FULL_NAME full_name;
|
||||||
BY_HANDLE_FILE_INFORMATION info;
|
BY_HANDLE_FILE_INFORMATION info;
|
||||||
|
|
||||||
if (!FILE_Stat( name, &info )) return -1;
|
if (!DOSFS_GetFullName( name, TRUE, &full_name )) return -1;
|
||||||
|
if (!FILE_Stat( full_name.long_name, &info )) return -1;
|
||||||
return info.dwFileAttributes;
|
return info.dwFileAttributes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -500,8 +502,9 @@ UINT16 GetTempFileName16( BYTE drive, LPCSTR prefix, UINT16 unique,
|
||||||
UINT32 GetTempFileName32A( LPCSTR path, LPCSTR prefix, UINT32 unique,
|
UINT32 GetTempFileName32A( LPCSTR path, LPCSTR prefix, UINT32 unique,
|
||||||
LPSTR buffer)
|
LPSTR buffer)
|
||||||
{
|
{
|
||||||
LPSTR p;
|
DOS_FULL_NAME full_name;
|
||||||
int i;
|
int i;
|
||||||
|
LPSTR p;
|
||||||
UINT32 num = unique ? (unique & 0xffff) : time(NULL) & 0xffff;
|
UINT32 num = unique ? (unique & 0xffff) : time(NULL) & 0xffff;
|
||||||
|
|
||||||
if (!path) return 0;
|
if (!path) return 0;
|
||||||
|
@ -511,36 +514,38 @@ UINT32 GetTempFileName32A( LPCSTR path, LPCSTR prefix, UINT32 unique,
|
||||||
for (i = 3; (i > 0) && (*prefix); i--) *p++ = *prefix++;
|
for (i = 3; (i > 0) && (*prefix); i--) *p++ = *prefix++;
|
||||||
sprintf( p, "%04x.tmp", num );
|
sprintf( p, "%04x.tmp", num );
|
||||||
|
|
||||||
if (unique)
|
|
||||||
{
|
|
||||||
lstrcpyn32A( buffer, DOSFS_GetDosTrueName( buffer, FALSE ), 144 );
|
|
||||||
dprintf_file( stddeb, "GetTempFileName: returning %s\n", buffer );
|
|
||||||
if (-1==access(DOSFS_GetUnixFileName(buffer,TRUE),W_OK))
|
|
||||||
fprintf(stderr,"Warning: GetTempFileName returns '%s', which doesn't seem to be writeable. Please check your configuration file if this generates a failure.\n",buffer);
|
|
||||||
return unique;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Now try to create it */
|
/* Now try to create it */
|
||||||
|
|
||||||
do
|
if (!unique)
|
||||||
{
|
{
|
||||||
HFILE32 handle;
|
do
|
||||||
if ((handle = FILE_Create(buffer,0666,TRUE)) != INVALID_HANDLE_VALUE32)
|
{
|
||||||
{ /* We created it */
|
HFILE32 handle = FILE_Create( buffer, 0666, TRUE );
|
||||||
dprintf_file( stddeb, "GetTempFileName: created %s\n", buffer );
|
if (handle != INVALID_HANDLE_VALUE32)
|
||||||
CloseHandle( handle );
|
{ /* We created it */
|
||||||
break;
|
dprintf_file( stddeb, "GetTempFileName: created %s\n", buffer);
|
||||||
}
|
CloseHandle( handle );
|
||||||
if (DOS_ExtendedError != ER_FileExists) break; /* No need to go on */
|
break;
|
||||||
num++;
|
}
|
||||||
sprintf( p, "%04x.tmp", num );
|
if (DOS_ExtendedError != ER_FileExists)
|
||||||
} while (num != (unique & 0xffff));
|
break; /* No need to go on */
|
||||||
|
num++;
|
||||||
|
sprintf( p, "%04x.tmp", num );
|
||||||
|
} while (num != (unique & 0xffff));
|
||||||
|
}
|
||||||
|
|
||||||
lstrcpyn32A( buffer, DOSFS_GetDosTrueName( buffer, FALSE ), 144 );
|
/* Get the full path name */
|
||||||
|
|
||||||
|
if (DOSFS_GetFullName( buffer, FALSE, &full_name ))
|
||||||
|
{
|
||||||
|
if (access( full_name.long_name, W_OK ) == -1)
|
||||||
|
fprintf( stderr,
|
||||||
|
"Warning: GetTempFileName returns '%s', which doesn't seem to be writeable.\n"
|
||||||
|
"Please check your configuration file if this generates a failure.\n",
|
||||||
|
buffer);
|
||||||
|
}
|
||||||
dprintf_file( stddeb, "GetTempFileName: returning %s\n", buffer );
|
dprintf_file( stddeb, "GetTempFileName: returning %s\n", buffer );
|
||||||
if (-1==access(DOSFS_GetUnixFileName(buffer,TRUE),W_OK))
|
return unique ? unique : num;
|
||||||
fprintf(stderr,"Warning: GetTempFileName returns '%s', which doesn't seem to be writeable. Please check your configuration file if this generates a failure.\n",buffer);
|
|
||||||
return num;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -576,7 +581,7 @@ static HFILE32 FILE_DoOpenFile( LPCSTR name, OFSTRUCT *ofs, UINT32 mode,
|
||||||
HFILE32 hFileRet;
|
HFILE32 hFileRet;
|
||||||
FILETIME filetime;
|
FILETIME filetime;
|
||||||
WORD filedatetime[2];
|
WORD filedatetime[2];
|
||||||
const char *unixName, *dosName;
|
DOS_FULL_NAME full_name;
|
||||||
char *p;
|
char *p;
|
||||||
int unixMode;
|
int unixMode;
|
||||||
|
|
||||||
|
@ -589,9 +594,10 @@ static HFILE32 FILE_DoOpenFile( LPCSTR name, OFSTRUCT *ofs, UINT32 mode,
|
||||||
|
|
||||||
if (mode & OF_PARSE)
|
if (mode & OF_PARSE)
|
||||||
{
|
{
|
||||||
if (!(dosName = DOSFS_GetDosTrueName( name, FALSE ))) goto error;
|
if (!GetFullPathName32A( name, sizeof(ofs->szPathName),
|
||||||
lstrcpyn32A( ofs->szPathName, dosName, sizeof(ofs->szPathName) );
|
ofs->szPathName, NULL )) goto error;
|
||||||
ofs->fFixedDisk = (GetDriveType16( dosName[0]-'A' ) != DRIVE_REMOVABLE);
|
ofs->fFixedDisk = (GetDriveType16( ofs->szPathName[0]-'A' )
|
||||||
|
!= DRIVE_REMOVABLE);
|
||||||
dprintf_file( stddeb, "OpenFile(%s): OF_PARSE, res = '%s'\n",
|
dprintf_file( stddeb, "OpenFile(%s): OF_PARSE, res = '%s'\n",
|
||||||
name, ofs->szPathName );
|
name, ofs->szPathName );
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -604,8 +610,8 @@ static HFILE32 FILE_DoOpenFile( LPCSTR name, OFSTRUCT *ofs, UINT32 mode,
|
||||||
{
|
{
|
||||||
if ((hFileRet = FILE_Create(name,0666,FALSE))== INVALID_HANDLE_VALUE32)
|
if ((hFileRet = FILE_Create(name,0666,FALSE))== INVALID_HANDLE_VALUE32)
|
||||||
goto error;
|
goto error;
|
||||||
lstrcpyn32A( ofs->szPathName, DOSFS_GetDosTrueName( name, FALSE ),
|
GetFullPathName32A( name, sizeof(ofs->szPathName),
|
||||||
sizeof(ofs->szPathName) );
|
ofs->szPathName, NULL );
|
||||||
goto success;
|
goto success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -614,11 +620,7 @@ static HFILE32 FILE_DoOpenFile( LPCSTR name, OFSTRUCT *ofs, UINT32 mode,
|
||||||
if ((mode & OF_SEARCH) && !(mode & OF_REOPEN))
|
if ((mode & OF_SEARCH) && !(mode & OF_REOPEN))
|
||||||
{
|
{
|
||||||
/* First try the file name as is */
|
/* First try the file name as is */
|
||||||
if ((unixName = DOSFS_GetUnixFileName( name, TRUE )) != NULL)
|
if (DOSFS_GetFullName( name, TRUE, &full_name )) goto found;
|
||||||
{
|
|
||||||
lstrcpyn32A( ofs->szPathName, name, sizeof(ofs->szPathName) );
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
/* Now remove the path */
|
/* Now remove the path */
|
||||||
if (name[0] && (name[1] == ':')) name += 2;
|
if (name[0] && (name[1] == ':')) name += 2;
|
||||||
if ((p = strrchr( name, '\\' ))) name = p + 1;
|
if ((p = strrchr( name, '\\' ))) name = p + 1;
|
||||||
|
@ -628,20 +630,17 @@ static HFILE32 FILE_DoOpenFile( LPCSTR name, OFSTRUCT *ofs, UINT32 mode,
|
||||||
|
|
||||||
/* Now look for the file */
|
/* Now look for the file */
|
||||||
|
|
||||||
if (!DIR_SearchPath( NULL, name, NULL, sizeof(ofs->szPathName),
|
if (!DIR_SearchPath( NULL, name, NULL, &full_name, win32 )) goto not_found;
|
||||||
ofs->szPathName, NULL, win32 ))
|
|
||||||
goto not_found;
|
|
||||||
if (!(unixName = DOSFS_GetUnixFileName( ofs->szPathName, TRUE )))
|
|
||||||
goto not_found;
|
|
||||||
|
|
||||||
found:
|
found:
|
||||||
dprintf_file( stddeb, "OpenFile: found '%s'\n", unixName );
|
dprintf_file( stddeb, "OpenFile: found %s = %s\n",
|
||||||
lstrcpyn32A(ofs->szPathName, DOSFS_GetDosTrueName( ofs->szPathName, FALSE),
|
full_name.long_name, full_name.short_name );
|
||||||
sizeof(ofs->szPathName) );
|
lstrcpyn32A( ofs->szPathName, full_name.short_name,
|
||||||
|
sizeof(ofs->szPathName) );
|
||||||
|
|
||||||
if (mode & OF_DELETE)
|
if (mode & OF_DELETE)
|
||||||
{
|
{
|
||||||
if (unlink( unixName ) == -1) goto not_found;
|
if (unlink( full_name.long_name ) == -1) goto not_found;
|
||||||
dprintf_file( stddeb, "OpenFile(%s): OF_DELETE return = OK\n", name);
|
dprintf_file( stddeb, "OpenFile(%s): OF_DELETE return = OK\n", name);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -657,8 +656,8 @@ found:
|
||||||
unixMode = O_RDONLY; break;
|
unixMode = O_RDONLY; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((hFileRet = FILE_OpenUnixFile( unixName, unixMode )) == HFILE_ERROR32)
|
hFileRet = FILE_OpenUnixFile( full_name.long_name, unixMode );
|
||||||
goto not_found;
|
if (hFileRet == HFILE_ERROR32) goto not_found;
|
||||||
GetFileTime( hFileRet, NULL, NULL, &filetime );
|
GetFileTime( hFileRet, NULL, NULL, &filetime );
|
||||||
FileTimeToDosDateTime( &filetime, &filedatetime[0], &filedatetime[1] );
|
FileTimeToDosDateTime( &filetime, &filedatetime[0], &filedatetime[1] );
|
||||||
if ((mode & OF_VERIFY) && (mode & OF_REOPEN))
|
if ((mode & OF_VERIFY) && (mode & OF_REOPEN))
|
||||||
|
@ -715,7 +714,7 @@ HFILE32 OpenFile32( LPCSTR name, OFSTRUCT *ofs, UINT32 mode )
|
||||||
*/
|
*/
|
||||||
HFILE16 _lclose16( HFILE16 hFile )
|
HFILE16 _lclose16( HFILE16 hFile )
|
||||||
{
|
{
|
||||||
dprintf_file( stddeb, "_lclose: handle %d\n", hFile );
|
dprintf_file( stddeb, "_lclose16: handle %d\n", hFile );
|
||||||
return CloseHandle( hFile ) ? 0 : HFILE_ERROR16;
|
return CloseHandle( hFile ) ? 0 : HFILE_ERROR16;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -725,7 +724,7 @@ HFILE16 _lclose16( HFILE16 hFile )
|
||||||
*/
|
*/
|
||||||
HFILE32 _lclose32( HFILE32 hFile )
|
HFILE32 _lclose32( HFILE32 hFile )
|
||||||
{
|
{
|
||||||
dprintf_file( stddeb, "_lclose: handle %d\n", hFile );
|
dprintf_file( stddeb, "_lclose32: handle %d\n", hFile );
|
||||||
return CloseHandle( hFile ) ? 0 : HFILE_ERROR32;
|
return CloseHandle( hFile ) ? 0 : HFILE_ERROR32;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -816,12 +815,45 @@ HFILE32 _lcreat_uniq( LPCSTR path, INT32 attr )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* SetFilePointer (KERNEL32.492)
|
||||||
|
*/
|
||||||
|
DWORD SetFilePointer( HFILE32 hFile, LONG distance, LONG *highword,
|
||||||
|
DWORD method )
|
||||||
|
{
|
||||||
|
DOS_FILE *file;
|
||||||
|
int origin, result;
|
||||||
|
|
||||||
|
if (highword && *highword)
|
||||||
|
{
|
||||||
|
fprintf( stderr, "SetFilePointer: 64-bit offsets not supported yet\n");
|
||||||
|
SetLastError( ERROR_INVALID_PARAMETER );
|
||||||
|
return 0xffffffff;
|
||||||
|
}
|
||||||
|
dprintf_file( stddeb, "SetFilePointer: handle %d offset %ld origin %ld\n",
|
||||||
|
hFile, distance, method );
|
||||||
|
|
||||||
|
if (!(file = FILE_GetFile( hFile ))) return 0xffffffff;
|
||||||
|
switch(method)
|
||||||
|
{
|
||||||
|
case 1: origin = SEEK_CUR; break;
|
||||||
|
case 2: origin = SEEK_END; break;
|
||||||
|
default: origin = SEEK_SET; break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((result = lseek( file->unix_handle, distance, origin )) == -1)
|
||||||
|
FILE_SetDosError();
|
||||||
|
FILE_ReleaseFile( file );
|
||||||
|
return (DWORD)result;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* _llseek16 (KERNEL.84)
|
* _llseek16 (KERNEL.84)
|
||||||
*/
|
*/
|
||||||
LONG _llseek16( HFILE16 hFile, LONG lOffset, INT16 nOrigin )
|
LONG _llseek16( HFILE16 hFile, LONG lOffset, INT16 nOrigin )
|
||||||
{
|
{
|
||||||
return _llseek32( hFile, lOffset, nOrigin );
|
return SetFilePointer( hFile, lOffset, NULL, nOrigin );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -830,24 +862,7 @@ LONG _llseek16( HFILE16 hFile, LONG lOffset, INT16 nOrigin )
|
||||||
*/
|
*/
|
||||||
LONG _llseek32( HFILE32 hFile, LONG lOffset, INT32 nOrigin )
|
LONG _llseek32( HFILE32 hFile, LONG lOffset, INT32 nOrigin )
|
||||||
{
|
{
|
||||||
DOS_FILE *file;
|
return SetFilePointer( hFile, lOffset, NULL, nOrigin );
|
||||||
int origin, result;
|
|
||||||
|
|
||||||
dprintf_file( stddeb, "_llseek: handle %d, offset %ld, origin %d\n",
|
|
||||||
hFile, lOffset, nOrigin);
|
|
||||||
|
|
||||||
if (!(file = FILE_GetFile( hFile ))) return HFILE_ERROR32;
|
|
||||||
switch(nOrigin)
|
|
||||||
{
|
|
||||||
case 1: origin = SEEK_CUR; break;
|
|
||||||
case 2: origin = SEEK_END; break;
|
|
||||||
default: origin = SEEK_SET; break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((result = lseek( file->unix_handle, lOffset, origin )) == -1)
|
|
||||||
FILE_SetDosError();
|
|
||||||
FILE_ReleaseFile( file );
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -961,47 +976,27 @@ UINT16 SetHandleCount16( UINT16 count )
|
||||||
HGLOBAL16 hPDB = GetCurrentPDB();
|
HGLOBAL16 hPDB = GetCurrentPDB();
|
||||||
PDB *pdb = (PDB *)GlobalLock16( hPDB );
|
PDB *pdb = (PDB *)GlobalLock16( hPDB );
|
||||||
BYTE *files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr );
|
BYTE *files = PTR_SEG_TO_LIN( pdb->fileHandlesPtr );
|
||||||
WORD i;
|
|
||||||
|
|
||||||
dprintf_file( stddeb, "SetHandleCount(%d)\n", count );
|
dprintf_file( stddeb, "SetHandleCount(%d)\n", count );
|
||||||
|
|
||||||
if (count < 20) count = 20; /* No point in going below 20 */
|
if (count < 20) count = 20; /* No point in going below 20 */
|
||||||
else if (count > 254) count = 254;
|
else if (count > 254) count = 254;
|
||||||
|
|
||||||
/* If shrinking the table, make sure all extra file handles are closed */
|
|
||||||
if (count < pdb->nbFiles)
|
|
||||||
{
|
|
||||||
for (i = count; i < pdb->nbFiles; i++)
|
|
||||||
if (files[i] != 0xff) /* File open */
|
|
||||||
{
|
|
||||||
DOS_ERROR( ER_TooManyOpenFiles, EC_ProgramError,
|
|
||||||
SA_Abort, EL_Disk );
|
|
||||||
return pdb->nbFiles;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (count == 20)
|
if (count == 20)
|
||||||
{
|
{
|
||||||
if (pdb->nbFiles > 20)
|
if (pdb->nbFiles > 20)
|
||||||
{
|
{
|
||||||
memcpy( pdb->fileHandles, files, 20 );
|
memcpy( pdb->fileHandles, files, 20 );
|
||||||
#ifdef WINELIB
|
GlobalFree16( pdb->hFileHandles );
|
||||||
GlobalFree32( (HGLOBAL32)pdb->fileHandlesPtr );
|
|
||||||
pdb->fileHandlesPtr = (SEGPTR)pdb->fileHandles;
|
|
||||||
#else
|
|
||||||
GlobalFree16( GlobalHandle16( SELECTOROF(pdb->fileHandlesPtr) ));
|
|
||||||
pdb->fileHandlesPtr = (SEGPTR)MAKELONG( 0x18,
|
pdb->fileHandlesPtr = (SEGPTR)MAKELONG( 0x18,
|
||||||
GlobalHandleToSel( hPDB ) );
|
GlobalHandleToSel( hPDB ) );
|
||||||
#endif
|
pdb->hFileHandles = 0;
|
||||||
pdb->nbFiles = 20;
|
pdb->nbFiles = 20;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else /* More than 20, need a new file handles table */
|
else /* More than 20, need a new file handles table */
|
||||||
{
|
{
|
||||||
BYTE *newfiles;
|
BYTE *newfiles;
|
||||||
#ifdef WINELIB
|
|
||||||
newfiles = (BYTE *)GlobalAlloc32( GMEM_FIXED, count );
|
|
||||||
#else
|
|
||||||
HGLOBAL16 newhandle = GlobalAlloc16( GMEM_MOVEABLE, count );
|
HGLOBAL16 newhandle = GlobalAlloc16( GMEM_MOVEABLE, count );
|
||||||
if (!newhandle)
|
if (!newhandle)
|
||||||
{
|
{
|
||||||
|
@ -1009,21 +1004,16 @@ UINT16 SetHandleCount16( UINT16 count )
|
||||||
return pdb->nbFiles;
|
return pdb->nbFiles;
|
||||||
}
|
}
|
||||||
newfiles = (BYTE *)GlobalLock16( newhandle );
|
newfiles = (BYTE *)GlobalLock16( newhandle );
|
||||||
#endif /* WINELIB */
|
|
||||||
if (count > pdb->nbFiles)
|
if (count > pdb->nbFiles)
|
||||||
{
|
{
|
||||||
memcpy( newfiles, files, pdb->nbFiles );
|
memcpy( newfiles, files, pdb->nbFiles );
|
||||||
memset( newfiles + pdb->nbFiles, 0xff, count - pdb->nbFiles );
|
memset( newfiles + pdb->nbFiles, 0xff, count - pdb->nbFiles );
|
||||||
}
|
}
|
||||||
else memcpy( newfiles, files, count );
|
else memcpy( newfiles, files, count );
|
||||||
#ifdef WINELIB
|
if (pdb->nbFiles > 20) GlobalFree16( pdb->hFileHandles );
|
||||||
if (pdb->nbFiles > 20) GlobalFree32( (HGLOBAL32)pdb->fileHandlesPtr );
|
|
||||||
pdb->fileHandlesPtr = (SEGPTR)newfiles;
|
|
||||||
#else
|
|
||||||
if (pdb->nbFiles > 20)
|
|
||||||
GlobalFree16( GlobalHandle16( SELECTOROF(pdb->fileHandlesPtr) ));
|
|
||||||
pdb->fileHandlesPtr = WIN16_GlobalLock16( newhandle );
|
pdb->fileHandlesPtr = WIN16_GlobalLock16( newhandle );
|
||||||
#endif /* WINELIB */
|
pdb->hFileHandles = newhandle;
|
||||||
pdb->nbFiles = count;
|
pdb->nbFiles = count;
|
||||||
}
|
}
|
||||||
return pdb->nbFiles;
|
return pdb->nbFiles;
|
||||||
|
@ -1095,6 +1085,7 @@ BOOL16 DeleteFile16( LPCSTR path )
|
||||||
*/
|
*/
|
||||||
BOOL32 DeleteFile32A( LPCSTR path )
|
BOOL32 DeleteFile32A( LPCSTR path )
|
||||||
{
|
{
|
||||||
|
DOS_FULL_NAME full_name;
|
||||||
const char *unixName;
|
const char *unixName;
|
||||||
|
|
||||||
dprintf_file(stddeb, "DeleteFile: '%s'\n", path );
|
dprintf_file(stddeb, "DeleteFile: '%s'\n", path );
|
||||||
|
@ -1106,8 +1097,8 @@ BOOL32 DeleteFile32A( LPCSTR path )
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(unixName = DOSFS_GetUnixFileName( path, TRUE ))) return FALSE;
|
if (!DOSFS_GetFullName( path, TRUE, &full_name )) return FALSE;
|
||||||
if (unlink( unixName ) == -1)
|
if (unlink( full_name.long_name ) == -1)
|
||||||
{
|
{
|
||||||
FILE_SetDosError();
|
FILE_SetDosError();
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -1153,6 +1144,99 @@ DWORD GetFileType( HFILE32 hFile )
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* MoveFile32A (KERNEL32.387)
|
||||||
|
*/
|
||||||
|
BOOL32 MoveFile32A( LPCSTR fn1, LPCSTR fn2 )
|
||||||
|
{
|
||||||
|
DOS_FULL_NAME full_name1, full_name2;
|
||||||
|
|
||||||
|
dprintf_file( stddeb, "MoveFile32A(%s,%s)\n", fn1, fn2 );
|
||||||
|
|
||||||
|
if (!DOSFS_GetFullName( fn1, TRUE, &full_name1 )) return FALSE;
|
||||||
|
if (!DOSFS_GetFullName( fn2, FALSE, &full_name2 )) return FALSE;
|
||||||
|
/* FIXME: should not replace an existing file */
|
||||||
|
/* FIXME: should handle renaming across devices */
|
||||||
|
if (rename( full_name1.long_name, full_name2.long_name ) == -1)
|
||||||
|
{
|
||||||
|
FILE_SetDosError();
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* MoveFile32W (KERNEL32.390)
|
||||||
|
*/
|
||||||
|
BOOL32 MoveFile32W( LPCWSTR fn1, LPCWSTR fn2 )
|
||||||
|
{
|
||||||
|
LPSTR afn1 = HEAP_strdupWtoA( GetProcessHeap(), 0, fn1 );
|
||||||
|
LPSTR afn2 = HEAP_strdupWtoA( GetProcessHeap(), 0, fn2 );
|
||||||
|
BOOL32 res = MoveFile32A( afn1, afn2 );
|
||||||
|
HeapFree( GetProcessHeap(), 0, afn1 );
|
||||||
|
HeapFree( GetProcessHeap(), 0, afn2 );
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* CopyFile32A (KERNEL32.36)
|
||||||
|
*/
|
||||||
|
BOOL32 CopyFile32A( LPCSTR source, LPCSTR dest, BOOL32 fail_if_exists )
|
||||||
|
{
|
||||||
|
HFILE32 h1, h2;
|
||||||
|
BY_HANDLE_FILE_INFORMATION info;
|
||||||
|
UINT32 count;
|
||||||
|
BOOL32 ret = FALSE;
|
||||||
|
int mode;
|
||||||
|
char buffer[2048];
|
||||||
|
|
||||||
|
if ((h1 = _lopen32( source, OF_READ )) == HFILE_ERROR32) return FALSE;
|
||||||
|
if (!GetFileInformationByHandle( h1, &info ))
|
||||||
|
{
|
||||||
|
CloseHandle( h1 );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
mode = (info.dwFileAttributes & FILE_ATTRIBUTE_READONLY) ? 0444 : 0666;
|
||||||
|
if ((h2 = FILE_Create( dest, mode, fail_if_exists )) == HFILE_ERROR32)
|
||||||
|
{
|
||||||
|
CloseHandle( h1 );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
while ((count = _lread32( h2, buffer, sizeof(buffer) )) > 0)
|
||||||
|
{
|
||||||
|
char *p = buffer;
|
||||||
|
while (count > 0)
|
||||||
|
{
|
||||||
|
INT32 res = _lwrite32( h2, p, count );
|
||||||
|
if (res <= 0) goto done;
|
||||||
|
p += res;
|
||||||
|
count -= res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ret = TRUE;
|
||||||
|
done:
|
||||||
|
CloseHandle( h1 );
|
||||||
|
CloseHandle( h2 );
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**************************************************************************
|
||||||
|
* CopyFile32W (KERNEL32.37)
|
||||||
|
*/
|
||||||
|
BOOL32 CopyFile32W( LPCWSTR source, LPCWSTR dest, BOOL32 fail_if_exists )
|
||||||
|
{
|
||||||
|
LPSTR sourceA = HEAP_strdupWtoA( GetProcessHeap(), 0, source );
|
||||||
|
LPSTR destA = HEAP_strdupWtoA( GetProcessHeap(), 0, dest );
|
||||||
|
BOOL32 ret = CopyFile32A( sourceA, destA, fail_if_exists );
|
||||||
|
HeapFree( GetProcessHeap(), 0, sourceA );
|
||||||
|
HeapFree( GetProcessHeap(), 0, destA );
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* SetFileTime (KERNEL32.493)
|
* SetFileTime (KERNEL32.493)
|
||||||
*/
|
*/
|
||||||
|
@ -1172,11 +1256,11 @@ BOOL32 SetFileTime( HFILE32 hFile,
|
||||||
lpLastWriteTime
|
lpLastWriteTime
|
||||||
);
|
);
|
||||||
if (lpLastAccessTime)
|
if (lpLastAccessTime)
|
||||||
utimbuf.actime = DOSFS_FileTimeToUnixTime(lpLastAccessTime);
|
utimbuf.actime = DOSFS_FileTimeToUnixTime(lpLastAccessTime, NULL);
|
||||||
else
|
else
|
||||||
utimbuf.actime = 0; /* FIXME */
|
utimbuf.actime = 0; /* FIXME */
|
||||||
if (lpLastWriteTime)
|
if (lpLastWriteTime)
|
||||||
utimbuf.modtime = DOSFS_FileTimeToUnixTime(lpLastWriteTime);
|
utimbuf.modtime = DOSFS_FileTimeToUnixTime(lpLastWriteTime, NULL);
|
||||||
else
|
else
|
||||||
utimbuf.modtime = 0; /* FIXME */
|
utimbuf.modtime = 0; /* FIXME */
|
||||||
if (-1==utime(file->unix_name,&utimbuf))
|
if (-1==utime(file->unix_name,&utimbuf))
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "dos_fs.h"
|
#include "file.h"
|
||||||
#include "heap.h"
|
#include "heap.h"
|
||||||
#include "stddebug.h"
|
#include "stddebug.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
@ -36,6 +36,8 @@ typedef struct
|
||||||
BOOL32 changed;
|
BOOL32 changed;
|
||||||
PROFILESECTION *section;
|
PROFILESECTION *section;
|
||||||
char *dos_name;
|
char *dos_name;
|
||||||
|
char *unix_name;
|
||||||
|
char *filename;
|
||||||
} PROFILE;
|
} PROFILE;
|
||||||
|
|
||||||
|
|
||||||
|
@ -332,8 +334,7 @@ static BOOL32 PROFILE_FlushFile(void)
|
||||||
FILE *file = NULL;
|
FILE *file = NULL;
|
||||||
|
|
||||||
if (!CurProfile.changed || !CurProfile.dos_name) return TRUE;
|
if (!CurProfile.changed || !CurProfile.dos_name) return TRUE;
|
||||||
if (!(unix_name = DOSFS_GetUnixFileName( CurProfile.dos_name, FALSE )) ||
|
if (!(unix_name = CurProfile.unix_name) || !(file = fopen(unix_name, "w")))
|
||||||
!(file = fopen( unix_name, "w" )))
|
|
||||||
{
|
{
|
||||||
/* Try to create it in $HOME/.wine */
|
/* Try to create it in $HOME/.wine */
|
||||||
/* FIXME: this will need a more general solution */
|
/* FIXME: this will need a more general solution */
|
||||||
|
@ -343,7 +344,7 @@ static BOOL32 PROFILE_FlushFile(void)
|
||||||
strcat( buffer, "/.wine/" );
|
strcat( buffer, "/.wine/" );
|
||||||
p = buffer + strlen(buffer);
|
p = buffer + strlen(buffer);
|
||||||
strcpy( p, strrchr( CurProfile.dos_name, '\\' ) + 1 );
|
strcpy( p, strrchr( CurProfile.dos_name, '\\' ) + 1 );
|
||||||
AnsiLower( p );
|
CharLower32A( p );
|
||||||
file = fopen( buffer, "w" );
|
file = fopen( buffer, "w" );
|
||||||
unix_name = buffer;
|
unix_name = buffer;
|
||||||
}
|
}
|
||||||
|
@ -372,24 +373,32 @@ static BOOL32 PROFILE_FlushFile(void)
|
||||||
*/
|
*/
|
||||||
static BOOL32 PROFILE_Open( LPCSTR filename )
|
static BOOL32 PROFILE_Open( LPCSTR filename )
|
||||||
{
|
{
|
||||||
|
DOS_FULL_NAME full_name;
|
||||||
char buffer[MAX_PATHNAME_LEN];
|
char buffer[MAX_PATHNAME_LEN];
|
||||||
const char *dos_name, *unix_name;
|
|
||||||
char *newdos_name, *p;
|
char *newdos_name, *p;
|
||||||
FILE *file = NULL;
|
FILE *file = NULL;
|
||||||
|
|
||||||
|
if (CurProfile.filename && !strcmp( filename, CurProfile.filename ))
|
||||||
|
{
|
||||||
|
dprintf_profile( stddeb, "PROFILE_Open(%s): already opened\n",
|
||||||
|
filename );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
if (strchr( filename, '/' ) || strchr( filename, '\\' ) ||
|
if (strchr( filename, '/' ) || strchr( filename, '\\' ) ||
|
||||||
strchr( filename, ':' ))
|
strchr( filename, ':' ))
|
||||||
{
|
{
|
||||||
if (!(dos_name = DOSFS_GetDosTrueName( filename, FALSE))) return FALSE;
|
if (!DOSFS_GetFullName( filename, FALSE, &full_name )) return FALSE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GetWindowsDirectory32A( buffer, sizeof(buffer) );
|
GetWindowsDirectory32A( buffer, sizeof(buffer) );
|
||||||
strcat( buffer, "\\" );
|
strcat( buffer, "\\" );
|
||||||
strcat( buffer, filename );
|
strcat( buffer, filename );
|
||||||
if (!(dos_name = DOSFS_GetDosTrueName( buffer, FALSE ))) return FALSE;
|
if (!DOSFS_GetFullName( buffer, FALSE, &full_name )) return FALSE;
|
||||||
}
|
}
|
||||||
if (CurProfile.dos_name && !strcmp( dos_name, CurProfile.dos_name ))
|
if (CurProfile.dos_name &&
|
||||||
|
!strcmp( full_name.short_name, CurProfile.dos_name ))
|
||||||
{
|
{
|
||||||
dprintf_profile( stddeb, "PROFILE_Open(%s): already opened\n",
|
dprintf_profile( stddeb, "PROFILE_Open(%s): already opened\n",
|
||||||
filename );
|
filename );
|
||||||
|
@ -398,12 +407,15 @@ static BOOL32 PROFILE_Open( LPCSTR filename )
|
||||||
|
|
||||||
/* Flush the previous profile */
|
/* Flush the previous profile */
|
||||||
|
|
||||||
newdos_name = HEAP_strdupA( SystemHeap, 0, dos_name );
|
newdos_name = HEAP_strdupA( SystemHeap, 0, full_name.short_name );
|
||||||
PROFILE_FlushFile();
|
PROFILE_FlushFile();
|
||||||
PROFILE_Free( CurProfile.section );
|
PROFILE_Free( CurProfile.section );
|
||||||
if (CurProfile.dos_name) HeapFree( SystemHeap, 0, CurProfile.dos_name );
|
if (CurProfile.dos_name) HeapFree( SystemHeap, 0, CurProfile.dos_name );
|
||||||
|
if (CurProfile.unix_name) HeapFree( SystemHeap, 0, CurProfile.unix_name );
|
||||||
|
if (CurProfile.filename) HeapFree( SystemHeap, 0, CurProfile.filename );
|
||||||
CurProfile.section = NULL;
|
CurProfile.section = NULL;
|
||||||
CurProfile.dos_name = newdos_name;
|
CurProfile.dos_name = newdos_name;
|
||||||
|
CurProfile.filename = HEAP_strdupA( SystemHeap, 0, filename );
|
||||||
|
|
||||||
/* Try to open the profile file, first in $HOME/.wine */
|
/* Try to open the profile file, first in $HOME/.wine */
|
||||||
|
|
||||||
|
@ -414,15 +426,22 @@ static BOOL32 PROFILE_Open( LPCSTR filename )
|
||||||
strcat( buffer, "/.wine/" );
|
strcat( buffer, "/.wine/" );
|
||||||
p = buffer + strlen(buffer);
|
p = buffer + strlen(buffer);
|
||||||
strcpy( p, strrchr( newdos_name, '\\' ) + 1 );
|
strcpy( p, strrchr( newdos_name, '\\' ) + 1 );
|
||||||
AnsiLower( p );
|
CharLower32A( p );
|
||||||
if ((file = fopen( buffer, "r" )))
|
if ((file = fopen( buffer, "r" )))
|
||||||
dprintf_profile( stddeb, "Found it in %s\n", buffer );
|
{
|
||||||
|
dprintf_profile( stddeb, "PROFILE_Open(%s): found it in %s\n",
|
||||||
|
filename, buffer );
|
||||||
|
CurProfile.unix_name = HEAP_strdupA( SystemHeap, 0, buffer );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!file && ((unix_name = DOSFS_GetUnixFileName( dos_name, TRUE ))))
|
if (!file)
|
||||||
{
|
{
|
||||||
if ((file = fopen( unix_name, "r" )))
|
CurProfile.unix_name = HEAP_strdupA( SystemHeap, 0,
|
||||||
dprintf_profile( stddeb, "Found it in %s\n", unix_name );
|
full_name.long_name );
|
||||||
|
if ((file = fopen( full_name.long_name, "r" )))
|
||||||
|
dprintf_profile( stddeb, "PROFILE_Open(%s): found it in %s\n",
|
||||||
|
filename, full_name.long_name );
|
||||||
}
|
}
|
||||||
|
|
||||||
if (file)
|
if (file)
|
||||||
|
@ -435,7 +454,6 @@ static BOOL32 PROFILE_Open( LPCSTR filename )
|
||||||
/* Does not exist yet, we will create it in PROFILE_FlushFile */
|
/* Does not exist yet, we will create it in PROFILE_FlushFile */
|
||||||
fprintf( stderr, "Warning: profile file %s not found\n", newdos_name );
|
fprintf( stderr, "Warning: profile file %s not found\n", newdos_name );
|
||||||
}
|
}
|
||||||
dprintf_profile( stddeb, "PROFILE_Open(%s): successful\n", filename );
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -7,8 +7,10 @@ MODULE = metafiledrv
|
||||||
|
|
||||||
C_SRCS = \
|
C_SRCS = \
|
||||||
bitblt.c \
|
bitblt.c \
|
||||||
|
graphics.c \
|
||||||
init.c \
|
init.c \
|
||||||
mapping.c
|
mapping.c \
|
||||||
|
text.c
|
||||||
|
|
||||||
all: $(MODULE).o
|
all: $(MODULE).o
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,190 @@
|
||||||
|
/*
|
||||||
|
* Metafile driver graphics functions
|
||||||
|
*
|
||||||
|
* Copyright 1993, 1994 Alexandre Julliard
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "graphics.h"
|
||||||
|
#include "gdi.h"
|
||||||
|
#include "dc.h"
|
||||||
|
#include "metafile.h"
|
||||||
|
#include "region.h"
|
||||||
|
#include "xmalloc.h"
|
||||||
|
#include "metafiledrv.h"
|
||||||
|
#include "stddebug.h"
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* MFDRV_MoveToEx
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
MFDRV_MoveToEx(DC *dc,INT32 x,INT32 y,LPPOINT32 pt)
|
||||||
|
{
|
||||||
|
if (!MF_MetaParam2(dc,META_MOVETO,x,y))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (pt)
|
||||||
|
{
|
||||||
|
pt->x = dc->w.CursPosX;
|
||||||
|
pt->y = dc->w.CursPosY;
|
||||||
|
}
|
||||||
|
dc->w.CursPosX = x;
|
||||||
|
dc->w.CursPosY = y;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MFDRV_LineTo
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
MFDRV_LineTo( DC *dc, INT32 x, INT32 y )
|
||||||
|
{
|
||||||
|
return MF_MetaParam2(dc, META_LINETO, x, y);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MFDRV_Arc
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
MFDRV_Arc( DC *dc, INT32 left, INT32 top, INT32 right, INT32 bottom,
|
||||||
|
INT32 xstart, INT32 ystart, INT32 xend, INT32 yend )
|
||||||
|
{
|
||||||
|
return MF_MetaParam8(dc, META_ARC, left, top, right, bottom,
|
||||||
|
xstart, ystart, xend, yend);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MFDRV_Pie
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
MFDRV_Pie( DC *dc, INT32 left, INT32 top, INT32 right, INT32 bottom,
|
||||||
|
INT32 xstart, INT32 ystart, INT32 xend, INT32 yend )
|
||||||
|
{
|
||||||
|
return MF_MetaParam8(dc, META_PIE, left, top, right, bottom,
|
||||||
|
xstart, ystart, xend, yend);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MFDRV_Chord
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
MFDRV_Chord( DC *dc, INT32 left, INT32 top, INT32 right, INT32 bottom,
|
||||||
|
INT32 xstart, INT32 ystart, INT32 xend, INT32 yend )
|
||||||
|
{
|
||||||
|
return MF_MetaParam8(dc, META_CHORD, left, top, right, bottom,
|
||||||
|
xstart, ystart, xend, yend);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MFDRV_Ellipse
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
MFDRV_Ellipse( DC *dc, INT32 left, INT32 top, INT32 right, INT32 bottom )
|
||||||
|
{
|
||||||
|
return MF_MetaParam4(dc, META_ELLIPSE, left, top, right, bottom);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MFDRV_Rectangle
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
MFDRV_Rectangle(DC *dc, INT32 left, INT32 top, INT32 right, INT32 bottom)
|
||||||
|
{
|
||||||
|
return MF_MetaParam4(dc, META_RECTANGLE, left, top, right, bottom);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MFDRV_RoundRect
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
MFDRV_RoundRect( DC *dc, INT32 left, INT32 top, INT32 right,
|
||||||
|
INT32 bottom, INT32 ell_width, INT32 ell_height )
|
||||||
|
{
|
||||||
|
return MF_MetaParam6(dc, META_ROUNDRECT, left, top, right, bottom,
|
||||||
|
ell_width, ell_height);
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MFDRV_SetPixel
|
||||||
|
*/
|
||||||
|
COLORREF
|
||||||
|
MFDRV_SetPixel( DC *dc, INT32 x, INT32 y, COLORREF color )
|
||||||
|
{
|
||||||
|
return MF_MetaParam4(dc, META_SETPIXEL, x, y,HIWORD(color),LOWORD(color));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* MFDRV_Polyline
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
MFDRV_Polyline( DC *dc, const LPPOINT32 pt, INT32 count )
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
LPPOINT16 pt16;
|
||||||
|
BOOL16 ret;
|
||||||
|
|
||||||
|
pt16 = (LPPOINT16)xmalloc(sizeof(POINT16)*count);
|
||||||
|
for (i=count;i--;) CONV_POINT32TO16(&(pt[i]),&(pt16[i]));
|
||||||
|
ret = MF_MetaPoly(dc, META_POLYLINE, pt16, count);
|
||||||
|
|
||||||
|
free(pt16);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* MFDRV_Polygon
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
MFDRV_Polygon( DC *dc, LPPOINT32 pt, INT32 count )
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
LPPOINT16 pt16;
|
||||||
|
BOOL16 ret;
|
||||||
|
|
||||||
|
pt16 = (LPPOINT16)xmalloc(sizeof(POINT16)*count);
|
||||||
|
for (i=count;i--;) CONV_POINT32TO16(&(pt[i]),&(pt16[i]));
|
||||||
|
ret = MF_MetaPoly(dc, META_POLYGON, pt16, count);
|
||||||
|
|
||||||
|
free(pt16);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* PolyPolygon
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
MFDRV_PolyPolygon( DC *dc, LPPOINT32 pt, LPINT32 counts, UINT32 polygons)
|
||||||
|
{
|
||||||
|
int i,j;
|
||||||
|
LPPOINT16 pt16;
|
||||||
|
LPPOINT32 curpt=pt;
|
||||||
|
BOOL32 ret;
|
||||||
|
|
||||||
|
for (i=0;i<polygons;i++) {
|
||||||
|
pt16=(LPPOINT16)xmalloc(sizeof(POINT16)*counts[i]);
|
||||||
|
for (j=counts[i];j--;) CONV_POINT32TO16(&(curpt[j]),&(pt16[j]));
|
||||||
|
ret = MF_MetaPoly(dc, META_POLYGON, pt16, counts[i]);
|
||||||
|
free(pt16);
|
||||||
|
if (!ret)
|
||||||
|
return FALSE;
|
||||||
|
curpt+=counts[i];
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* MFDRV_ExtFloodFill
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
MFDRV_ExtFloodFill( DC *dc, INT32 x, INT32 y, COLORREF color, UINT32 fillType )
|
||||||
|
{
|
||||||
|
return MF_MetaParam4(dc,META_FLOODFILL,x,y,HIWORD(color),LOWORD(color));
|
||||||
|
}
|
|
@ -16,41 +16,38 @@ static BOOL32 MFDRV_DeleteDC( DC *dc );
|
||||||
|
|
||||||
static const DC_FUNCTIONS MFDRV_Funcs =
|
static const DC_FUNCTIONS MFDRV_Funcs =
|
||||||
{
|
{
|
||||||
NULL, /* pArc */
|
MFDRV_Arc, /* pArc */
|
||||||
MFDRV_BitBlt, /* pBitBlt */
|
MFDRV_BitBlt, /* pBitBlt */
|
||||||
NULL, /* pChord */
|
MFDRV_Chord, /* pChord */
|
||||||
NULL, /* pCreateDC */
|
NULL, /* pCreateDC */
|
||||||
MFDRV_DeleteDC, /* pDeleteDC */
|
MFDRV_DeleteDC, /* pDeleteDC */
|
||||||
NULL, /* pDeleteObject */
|
NULL, /* pDeleteObject */
|
||||||
NULL, /* pEllipse */
|
MFDRV_Ellipse, /* pEllipse */
|
||||||
NULL, /* pEscape */
|
NULL, /* pEscape */
|
||||||
NULL, /* pExcludeClipRect */
|
NULL, /* pExcludeClipRect */
|
||||||
NULL, /* pExcludeVisRect */
|
NULL, /* pExcludeVisRect */
|
||||||
NULL, /* pExtFloodFill */
|
MFDRV_ExtFloodFill, /* pExtFloodFill */
|
||||||
NULL, /* pExtTextOut */
|
MFDRV_ExtTextOut, /* pExtTextOut */
|
||||||
NULL, /* pFillRgn */
|
NULL /* no implementation */, /* pGetPixel */
|
||||||
NULL, /* pFloodFill */
|
|
||||||
NULL, /* pFrameRgn */
|
|
||||||
NULL, /* pGetTextExtentPoint */
|
NULL, /* pGetTextExtentPoint */
|
||||||
NULL, /* pGetTextMetrics */
|
NULL, /* pGetTextMetrics */
|
||||||
NULL, /* pIntersectClipRect */
|
NULL, /* pIntersectClipRect */
|
||||||
NULL, /* pIntersectVisRect */
|
NULL, /* pIntersectVisRect */
|
||||||
NULL, /* pInvertRgn */
|
MFDRV_LineTo, /* pLineTo */
|
||||||
NULL, /* pLineTo */
|
MFDRV_MoveToEx, /* pMoveToEx */
|
||||||
NULL, /* pMoveToEx */
|
|
||||||
NULL, /* pOffsetClipRgn */
|
NULL, /* pOffsetClipRgn */
|
||||||
MFDRV_OffsetViewportOrg, /* pOffsetViewportOrg */
|
MFDRV_OffsetViewportOrg, /* pOffsetViewportOrg */
|
||||||
MFDRV_OffsetWindowOrg, /* pOffsetWindowOrg */
|
MFDRV_OffsetWindowOrg, /* pOffsetWindowOrg */
|
||||||
NULL, /* pPaintRgn */
|
NULL, /* pPaintRgn */
|
||||||
MFDRV_PatBlt, /* pPatBlt */
|
MFDRV_PatBlt, /* pPatBlt */
|
||||||
NULL, /* pPie */
|
MFDRV_Pie, /* pPie */
|
||||||
NULL, /* pPolyPolygon */
|
MFDRV_PolyPolygon, /* pPolyPolygon */
|
||||||
NULL, /* pPolygon */
|
MFDRV_Polygon, /* pPolygon */
|
||||||
NULL, /* pPolyline */
|
MFDRV_Polyline, /* pPolyline */
|
||||||
NULL, /* pRealizePalette */
|
NULL, /* pRealizePalette */
|
||||||
NULL, /* pRectangle */
|
MFDRV_Rectangle, /* pRectangle */
|
||||||
NULL, /* pRestoreDC */
|
NULL, /* pRestoreDC */
|
||||||
NULL, /* pRoundRect */
|
MFDRV_RoundRect, /* pRoundRect */
|
||||||
NULL, /* pSaveDC */
|
NULL, /* pSaveDC */
|
||||||
MFDRV_ScaleViewportExt, /* pScaleViewportExt */
|
MFDRV_ScaleViewportExt, /* pScaleViewportExt */
|
||||||
MFDRV_ScaleWindowExt, /* pScaleWindowExt */
|
MFDRV_ScaleWindowExt, /* pScaleWindowExt */
|
||||||
|
@ -63,7 +60,7 @@ static const DC_FUNCTIONS MFDRV_Funcs =
|
||||||
NULL, /* pSetDIBitsToDevice */
|
NULL, /* pSetDIBitsToDevice */
|
||||||
MFDRV_SetMapMode, /* pSetMapMode */
|
MFDRV_SetMapMode, /* pSetMapMode */
|
||||||
NULL, /* pSetMapperFlags */
|
NULL, /* pSetMapperFlags */
|
||||||
NULL, /* pSetPixel */
|
MFDRV_SetPixel, /* pSetPixel */
|
||||||
NULL, /* pSetPolyFillMode */
|
NULL, /* pSetPolyFillMode */
|
||||||
NULL, /* pSetROP2 */
|
NULL, /* pSetROP2 */
|
||||||
NULL, /* pSetRelAbs */
|
NULL, /* pSetRelAbs */
|
||||||
|
@ -77,8 +74,7 @@ static const DC_FUNCTIONS MFDRV_Funcs =
|
||||||
MFDRV_SetWindowExt, /* pSetWindowExt */
|
MFDRV_SetWindowExt, /* pSetWindowExt */
|
||||||
MFDRV_SetWindowOrg, /* pSetWindowOrg */
|
MFDRV_SetWindowOrg, /* pSetWindowOrg */
|
||||||
MFDRV_StretchBlt, /* pStretchBlt */
|
MFDRV_StretchBlt, /* pStretchBlt */
|
||||||
NULL, /* pStretchDIBits */
|
NULL /* pStretchDIBits */
|
||||||
NULL /* pTextOut */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -237,4 +233,3 @@ BOOL16 DeleteMetaFile16( HMETAFILE16 hmf )
|
||||||
{
|
{
|
||||||
return !GlobalFree16( hmf );
|
return !GlobalFree16( hmf );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,39 @@
|
||||||
|
/*
|
||||||
|
* metafile driver text functions
|
||||||
|
*
|
||||||
|
* Copyright 1993, 1994 Alexandre Julliard
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include "windows.h"
|
||||||
|
#include "dc.h"
|
||||||
|
#include "gdi.h"
|
||||||
|
#include "callback.h"
|
||||||
|
#include "heap.h"
|
||||||
|
#include "metafile.h"
|
||||||
|
#include "metafiledrv.h"
|
||||||
|
#include "stddebug.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#include "xmalloc.h"
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* MFDRV_ExtTextOut
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
MFDRV_ExtTextOut( DC *dc, INT32 x, INT32 y, UINT32 flags,
|
||||||
|
const RECT32 *lprect, LPCSTR str, UINT32 count,
|
||||||
|
const INT32 *lpDx )
|
||||||
|
{
|
||||||
|
RECT16 rect16;
|
||||||
|
LPINT16 lpdx16 = lpDx?(LPINT16)xmalloc(sizeof(INT16)*count):NULL;
|
||||||
|
BOOL32 ret;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if (lprect) CONV_RECT32TO16(lprect,&rect16);
|
||||||
|
if (lpdx16) for (i=count;i--;) lpdx16[i]=lpDx[i];
|
||||||
|
ret=MF_ExtTextOut(dc,x,y,flags,lprect?&rect16:NULL,str,count,lpdx16);
|
||||||
|
if (lpdx16) free(lpdx16);
|
||||||
|
return ret;
|
||||||
|
}
|
|
@ -50,14 +50,11 @@ static const DC_FUNCTIONS WIN16DRV_Funcs =
|
||||||
NULL, /* pExcludeVisRect */
|
NULL, /* pExcludeVisRect */
|
||||||
NULL, /* pExtFloodFill */
|
NULL, /* pExtFloodFill */
|
||||||
NULL, /* pExtTextOut */
|
NULL, /* pExtTextOut */
|
||||||
NULL, /* pFillRgn */
|
NULL, /* pGetPixel */
|
||||||
NULL, /* pFloodFill */
|
|
||||||
NULL, /* pFrameRgn */
|
|
||||||
WIN16DRV_GetTextExtentPoint, /* pGetTextExtentPoint */
|
WIN16DRV_GetTextExtentPoint, /* pGetTextExtentPoint */
|
||||||
WIN16DRV_GetTextMetrics, /* pGetTextMetrics */
|
WIN16DRV_GetTextMetrics, /* pGetTextMetrics */
|
||||||
NULL, /* pIntersectClipRect */
|
NULL, /* pIntersectClipRect */
|
||||||
NULL, /* pIntersectVisRect */
|
NULL, /* pIntersectVisRect */
|
||||||
NULL, /* pInvertRgn */
|
|
||||||
NULL, /* pLineTo */
|
NULL, /* pLineTo */
|
||||||
NULL, /* pMoveToEx */
|
NULL, /* pMoveToEx */
|
||||||
NULL, /* pOffsetClipRgn */
|
NULL, /* pOffsetClipRgn */
|
||||||
|
@ -99,8 +96,7 @@ static const DC_FUNCTIONS WIN16DRV_Funcs =
|
||||||
NULL, /* pSetWindowExt (optional) */
|
NULL, /* pSetWindowExt (optional) */
|
||||||
NULL, /* pSetWindowOrg (optional) */
|
NULL, /* pSetWindowOrg (optional) */
|
||||||
NULL, /* pStretchBlt */
|
NULL, /* pStretchBlt */
|
||||||
NULL, /* pStretchDIBits */
|
NULL /* pStretchDIBits */
|
||||||
NULL /* pTextOut */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,9 @@ C_SRCS = \
|
||||||
bitblt.c \
|
bitblt.c \
|
||||||
clipping.c \
|
clipping.c \
|
||||||
font.c \
|
font.c \
|
||||||
init.c
|
graphics.c \
|
||||||
|
init.c \
|
||||||
|
text.c
|
||||||
|
|
||||||
all: $(MODULE).o
|
all: $(MODULE).o
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,678 @@
|
||||||
|
/*
|
||||||
|
* X11 graphics driver graphics functions
|
||||||
|
*
|
||||||
|
* Copyright 1993,1994 Alexandre Julliard
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xutil.h>
|
||||||
|
#include <X11/Intrinsic.h>
|
||||||
|
#ifndef PI
|
||||||
|
#define PI M_PI
|
||||||
|
#endif
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "x11drv.h"
|
||||||
|
#include "bitmap.h"
|
||||||
|
#include "gdi.h"
|
||||||
|
#include "graphics.h"
|
||||||
|
#include "dc.h"
|
||||||
|
#include "bitmap.h"
|
||||||
|
#include "callback.h"
|
||||||
|
#include "metafile.h"
|
||||||
|
#include "syscolor.h"
|
||||||
|
#include "stddebug.h"
|
||||||
|
#include "palette.h"
|
||||||
|
#include "color.h"
|
||||||
|
#include "region.h"
|
||||||
|
#include "struct32.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#include "xmalloc.h"
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* X11DRV_MoveToEx
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
X11DRV_MoveToEx(DC *dc,INT32 x,INT32 y,LPPOINT32 pt) {
|
||||||
|
if (pt)
|
||||||
|
{
|
||||||
|
pt->x = dc->w.CursPosX;
|
||||||
|
pt->y = dc->w.CursPosY;
|
||||||
|
}
|
||||||
|
dc->w.CursPosX = x;
|
||||||
|
dc->w.CursPosY = y;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* X11DRV_LineTo
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
X11DRV_LineTo( DC *dc, INT32 x, INT32 y )
|
||||||
|
{
|
||||||
|
if (DC_SetupGCForPen( dc ))
|
||||||
|
XDrawLine(display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + XLPTODP( dc, dc->w.CursPosX ),
|
||||||
|
dc->w.DCOrgY + YLPTODP( dc, dc->w.CursPosY ),
|
||||||
|
dc->w.DCOrgX + XLPTODP( dc, x ),
|
||||||
|
dc->w.DCOrgY + YLPTODP( dc, y ) );
|
||||||
|
dc->w.CursPosX = x;
|
||||||
|
dc->w.CursPosY = y;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* GRAPH_DrawArc
|
||||||
|
*
|
||||||
|
* Helper functions for Arc(), Chord() and Pie().
|
||||||
|
* 'lines' is the number of lines to draw: 0 for Arc, 1 for Chord, 2 for Pie.
|
||||||
|
*/
|
||||||
|
static BOOL32
|
||||||
|
X11DRV_DrawArc( DC *dc, INT32 left, INT32 top, INT32 right,
|
||||||
|
INT32 bottom, INT32 xstart, INT32 ystart,
|
||||||
|
INT32 xend, INT32 yend, INT32 lines )
|
||||||
|
{
|
||||||
|
INT32 xcenter, ycenter, istart_angle, idiff_angle, tmp;
|
||||||
|
double start_angle, end_angle;
|
||||||
|
XPoint points[3];
|
||||||
|
|
||||||
|
left = XLPTODP( dc, left );
|
||||||
|
top = YLPTODP( dc, top );
|
||||||
|
right = XLPTODP( dc, right );
|
||||||
|
bottom = YLPTODP( dc, bottom );
|
||||||
|
xstart = XLPTODP( dc, xstart );
|
||||||
|
ystart = YLPTODP( dc, ystart );
|
||||||
|
xend = XLPTODP( dc, xend );
|
||||||
|
yend = YLPTODP( dc, yend );
|
||||||
|
if ((left == right) || (top == bottom)) return FALSE;
|
||||||
|
|
||||||
|
xcenter = (right + left) / 2;
|
||||||
|
ycenter = (bottom + top) / 2;
|
||||||
|
start_angle = atan2( (double)(ycenter-ystart)*(right-left),
|
||||||
|
(double)(xstart-xcenter)*(bottom-top) );
|
||||||
|
end_angle = atan2( (double)(ycenter-yend)*(right-left),
|
||||||
|
(double)(xend-xcenter)*(bottom-top) );
|
||||||
|
istart_angle = (INT32)(start_angle * 180 * 64 / PI);
|
||||||
|
idiff_angle = (INT32)((end_angle - start_angle) * 180 * 64 / PI );
|
||||||
|
if (idiff_angle <= 0) idiff_angle += 360 * 64;
|
||||||
|
if (left > right) { tmp=left; left=right; right=tmp; }
|
||||||
|
if (top > bottom) { tmp=top; top=bottom; bottom=tmp; }
|
||||||
|
|
||||||
|
/* Fill arc with brush if Chord() or Pie() */
|
||||||
|
|
||||||
|
if ((lines > 0) && DC_SetupGCForBrush( dc ))
|
||||||
|
{
|
||||||
|
XSetArcMode( display, dc->u.x.gc, (lines==1) ? ArcChord : ArcPieSlice);
|
||||||
|
XFillArc( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
|
||||||
|
right-left-1, bottom-top-1, istart_angle, idiff_angle );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Draw arc and lines */
|
||||||
|
|
||||||
|
if (!DC_SetupGCForPen( dc )) return TRUE;
|
||||||
|
XDrawArc( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
|
||||||
|
right-left-1, bottom-top-1, istart_angle, idiff_angle );
|
||||||
|
if (!lines) return TRUE;
|
||||||
|
|
||||||
|
points[0].x = dc->w.DCOrgX + xcenter + (int)(cos(start_angle) * (right-left) / 2);
|
||||||
|
points[0].y = dc->w.DCOrgY + ycenter - (int)(sin(start_angle) * (bottom-top) / 2);
|
||||||
|
points[1].x = dc->w.DCOrgX + xcenter + (int)(cos(end_angle) * (right-left) / 2);
|
||||||
|
points[1].y = dc->w.DCOrgY + ycenter - (int)(sin(end_angle) * (bottom-top) / 2);
|
||||||
|
if (lines == 2)
|
||||||
|
{
|
||||||
|
points[2] = points[1];
|
||||||
|
points[1].x = dc->w.DCOrgX + xcenter;
|
||||||
|
points[1].y = dc->w.DCOrgY + ycenter;
|
||||||
|
}
|
||||||
|
XDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
points, lines+1, CoordModeOrigin );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* X11DRV_Arc
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
X11DRV_Arc( DC *dc, INT32 left, INT32 top, INT32 right, INT32 bottom,
|
||||||
|
INT32 xstart, INT32 ystart, INT32 xend, INT32 yend )
|
||||||
|
{
|
||||||
|
return X11DRV_DrawArc( dc, left, top, right, bottom,
|
||||||
|
xstart, ystart, xend, yend, 0 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* X11DRV_Pie
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
X11DRV_Pie( DC *dc, INT32 left, INT32 top, INT32 right, INT32 bottom,
|
||||||
|
INT32 xstart, INT32 ystart, INT32 xend, INT32 yend )
|
||||||
|
{
|
||||||
|
return X11DRV_DrawArc( dc, left, top, right, bottom,
|
||||||
|
xstart, ystart, xend, yend, 2 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* X11DRV_Chord
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
X11DRV_Chord( DC *dc, INT32 left, INT32 top, INT32 right, INT32 bottom,
|
||||||
|
INT32 xstart, INT32 ystart, INT32 xend, INT32 yend )
|
||||||
|
{
|
||||||
|
return X11DRV_DrawArc( dc, left, top, right, bottom,
|
||||||
|
xstart, ystart, xend, yend, 1 );
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* X11DRV_Ellipse
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
X11DRV_Ellipse( DC *dc, INT32 left, INT32 top, INT32 right, INT32 bottom )
|
||||||
|
{
|
||||||
|
left = XLPTODP( dc, left );
|
||||||
|
top = YLPTODP( dc, top );
|
||||||
|
right = XLPTODP( dc, right );
|
||||||
|
bottom = YLPTODP( dc, bottom );
|
||||||
|
if ((left == right) || (top == bottom)) return FALSE;
|
||||||
|
|
||||||
|
if (right < left) { INT32 tmp = right; right = left; left = tmp; }
|
||||||
|
if (bottom < top) { INT32 tmp = bottom; bottom = top; top = tmp; }
|
||||||
|
|
||||||
|
if ((dc->u.x.pen.style == PS_INSIDEFRAME) &&
|
||||||
|
(dc->u.x.pen.width < right-left-1) &&
|
||||||
|
(dc->u.x.pen.width < bottom-top-1))
|
||||||
|
{
|
||||||
|
left += dc->u.x.pen.width / 2;
|
||||||
|
right -= (dc->u.x.pen.width + 1) / 2;
|
||||||
|
top += dc->u.x.pen.width / 2;
|
||||||
|
bottom -= (dc->u.x.pen.width + 1) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DC_SetupGCForBrush( dc ))
|
||||||
|
XFillArc( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
|
||||||
|
right-left-1, bottom-top-1, 0, 360*64 );
|
||||||
|
if (DC_SetupGCForPen( dc ))
|
||||||
|
XDrawArc( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
|
||||||
|
right-left-1, bottom-top-1, 0, 360*64 );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* X11DRV_Rectangle
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
X11DRV_Rectangle(DC *dc, INT32 left, INT32 top, INT32 right, INT32 bottom)
|
||||||
|
{
|
||||||
|
INT32 width;
|
||||||
|
left = XLPTODP( dc, left );
|
||||||
|
top = YLPTODP( dc, top );
|
||||||
|
right = XLPTODP( dc, right );
|
||||||
|
bottom = YLPTODP( dc, bottom );
|
||||||
|
|
||||||
|
if (right < left) { INT32 tmp = right; right = left; left = tmp; }
|
||||||
|
if (bottom < top) { INT32 tmp = bottom; bottom = top; top = tmp; }
|
||||||
|
|
||||||
|
if ((left == right) || (top == bottom))
|
||||||
|
{
|
||||||
|
if (DC_SetupGCForPen( dc ))
|
||||||
|
XDrawLine(display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left,
|
||||||
|
dc->w.DCOrgY + top,
|
||||||
|
dc->w.DCOrgX + right,
|
||||||
|
dc->w.DCOrgY + bottom);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
width = dc->u.x.pen.width;
|
||||||
|
if (!width) width = 1;
|
||||||
|
if(dc->u.x.pen.style == PS_NULL) width = 0;
|
||||||
|
|
||||||
|
if ((dc->u.x.pen.style == PS_INSIDEFRAME) &&
|
||||||
|
(width < right-left) && (width < bottom-top))
|
||||||
|
{
|
||||||
|
left += width / 2;
|
||||||
|
right -= (width + 1) / 2;
|
||||||
|
top += width / 2;
|
||||||
|
bottom -= (width + 1) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (DC_SetupGCForBrush( dc ))
|
||||||
|
XFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left + (width + 1) / 2,
|
||||||
|
dc->w.DCOrgY + top + (width + 1) / 2,
|
||||||
|
right-left-width-1, bottom-top-width-1);
|
||||||
|
if (DC_SetupGCForPen( dc ))
|
||||||
|
XDrawRectangle( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
|
||||||
|
right-left-1, bottom-top-1 );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* X11DRV_RoundRect
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
X11DRV_RoundRect( DC *dc, INT32 left, INT32 top, INT32 right,
|
||||||
|
INT32 bottom, INT32 ell_width, INT32 ell_height )
|
||||||
|
{
|
||||||
|
dprintf_graphics(stddeb, "X11DRV_RoundRect(%d %d %d %d %d %d\n",
|
||||||
|
left, top, right, bottom, ell_width, ell_height);
|
||||||
|
|
||||||
|
left = XLPTODP( dc, left );
|
||||||
|
top = YLPTODP( dc, top );
|
||||||
|
right = XLPTODP( dc, right );
|
||||||
|
bottom = YLPTODP( dc, bottom );
|
||||||
|
ell_width = abs( ell_width * dc->vportExtX / dc->wndExtX );
|
||||||
|
ell_height = abs( ell_height * dc->vportExtY / dc->wndExtY );
|
||||||
|
|
||||||
|
/* Fix the coordinates */
|
||||||
|
|
||||||
|
if (right < left) { INT32 tmp = right; right = left; left = tmp; }
|
||||||
|
if (bottom < top) { INT32 tmp = bottom; bottom = top; top = tmp; }
|
||||||
|
if (ell_width > right - left) ell_width = right - left;
|
||||||
|
if (ell_height > bottom - top) ell_height = bottom - top;
|
||||||
|
|
||||||
|
if (DC_SetupGCForBrush( dc ))
|
||||||
|
{
|
||||||
|
if (ell_width && ell_height)
|
||||||
|
{
|
||||||
|
XFillArc( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
|
||||||
|
ell_width, ell_height, 90 * 64, 90 * 64 );
|
||||||
|
XFillArc( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left, dc->w.DCOrgY + bottom - ell_height,
|
||||||
|
ell_width, ell_height, 180 * 64, 90 * 64 );
|
||||||
|
XFillArc( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + right - ell_width,
|
||||||
|
dc->w.DCOrgY + bottom - ell_height,
|
||||||
|
ell_width, ell_height, 270 * 64, 90 * 64 );
|
||||||
|
XFillArc( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + right - ell_width, dc->w.DCOrgY + top,
|
||||||
|
ell_width, ell_height, 0, 90 * 64 );
|
||||||
|
}
|
||||||
|
if (ell_width < right - left)
|
||||||
|
{
|
||||||
|
XFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left + ell_width / 2,
|
||||||
|
dc->w.DCOrgY + top,
|
||||||
|
right - left - ell_width, ell_height / 2 );
|
||||||
|
XFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left + ell_width / 2,
|
||||||
|
dc->w.DCOrgY + bottom - (ell_height+1) / 2,
|
||||||
|
right - left - ell_width, (ell_height+1) / 2 );
|
||||||
|
}
|
||||||
|
if (ell_height < bottom - top)
|
||||||
|
{
|
||||||
|
XFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left,
|
||||||
|
dc->w.DCOrgY + top + ell_height / 2,
|
||||||
|
right - left, bottom - top - ell_height );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (DC_SetupGCForPen(dc))
|
||||||
|
{
|
||||||
|
if (ell_width && ell_height)
|
||||||
|
{
|
||||||
|
XDrawArc( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left, dc->w.DCOrgY + top,
|
||||||
|
ell_width, ell_height, 90 * 64, 90 * 64 );
|
||||||
|
XDrawArc( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left, dc->w.DCOrgY + bottom - ell_height,
|
||||||
|
ell_width, ell_height, 180 * 64, 90 * 64 );
|
||||||
|
XDrawArc( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + right - ell_width,
|
||||||
|
dc->w.DCOrgY + bottom - ell_height,
|
||||||
|
ell_width, ell_height, 270 * 64, 90 * 64 );
|
||||||
|
XDrawArc( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + right - ell_width, dc->w.DCOrgY + top,
|
||||||
|
ell_width, ell_height, 0, 90 * 64 );
|
||||||
|
}
|
||||||
|
if (ell_width < right - left)
|
||||||
|
{
|
||||||
|
XDrawLine( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left + ell_width / 2,
|
||||||
|
dc->w.DCOrgY + top,
|
||||||
|
dc->w.DCOrgX + right - ell_width / 2,
|
||||||
|
dc->w.DCOrgY + top );
|
||||||
|
XDrawLine( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left + ell_width / 2,
|
||||||
|
dc->w.DCOrgY + bottom,
|
||||||
|
dc->w.DCOrgX + right - ell_width / 2,
|
||||||
|
dc->w.DCOrgY + bottom );
|
||||||
|
}
|
||||||
|
if (ell_height < bottom - top)
|
||||||
|
{
|
||||||
|
XDrawLine( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + right,
|
||||||
|
dc->w.DCOrgY + top + ell_height / 2,
|
||||||
|
dc->w.DCOrgX + right,
|
||||||
|
dc->w.DCOrgY + bottom - ell_height / 2 );
|
||||||
|
XDrawLine( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + left,
|
||||||
|
dc->w.DCOrgY + top + ell_height / 2,
|
||||||
|
dc->w.DCOrgX + left,
|
||||||
|
dc->w.DCOrgY + bottom - ell_height / 2 );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* X11DRV_SetPixel
|
||||||
|
*/
|
||||||
|
COLORREF
|
||||||
|
X11DRV_SetPixel( DC *dc, INT32 x, INT32 y, COLORREF color )
|
||||||
|
{
|
||||||
|
Pixel pixel;
|
||||||
|
|
||||||
|
x = dc->w.DCOrgX + XLPTODP( dc, x );
|
||||||
|
y = dc->w.DCOrgY + YLPTODP( dc, y );
|
||||||
|
pixel = COLOR_ToPhysical( dc, color );
|
||||||
|
|
||||||
|
XSetForeground( display, dc->u.x.gc, pixel );
|
||||||
|
XSetFunction( display, dc->u.x.gc, GXcopy );
|
||||||
|
XDrawPoint( display, dc->u.x.drawable, dc->u.x.gc, x, y );
|
||||||
|
|
||||||
|
/* inefficient but simple... */
|
||||||
|
|
||||||
|
return COLOR_ToLogical(pixel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* X11DRV_GetPixel
|
||||||
|
*/
|
||||||
|
COLORREF
|
||||||
|
X11DRV_GetPixel( DC *dc, INT32 x, INT32 y )
|
||||||
|
{
|
||||||
|
static Pixmap pixmap = 0;
|
||||||
|
XImage * image;
|
||||||
|
int pixel;
|
||||||
|
|
||||||
|
x = dc->w.DCOrgX + XLPTODP( dc, x );
|
||||||
|
y = dc->w.DCOrgY + YLPTODP( dc, y );
|
||||||
|
if (dc->w.flags & DC_MEMORY)
|
||||||
|
{
|
||||||
|
image = XGetImage( display, dc->u.x.drawable, x, y, 1, 1,
|
||||||
|
AllPlanes, ZPixmap );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* If we are reading from the screen, use a temporary copy */
|
||||||
|
/* to avoid a BadMatch error */
|
||||||
|
if (!pixmap) pixmap = XCreatePixmap( display, rootWindow,
|
||||||
|
1, 1, dc->w.bitsPerPixel );
|
||||||
|
XCopyArea( display, dc->u.x.drawable, pixmap, BITMAP_colorGC,
|
||||||
|
x, y, 1, 1, 0, 0 );
|
||||||
|
image = XGetImage( display, pixmap, 0, 0, 1, 1, AllPlanes, ZPixmap );
|
||||||
|
}
|
||||||
|
pixel = XGetPixel( image, 0, 0 );
|
||||||
|
XDestroyImage( image );
|
||||||
|
|
||||||
|
return COLOR_ToLogical(pixel);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* X11DRV_PaintRgn
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
X11DRV_PaintRgn( DC *dc, HRGN32 hrgn )
|
||||||
|
{
|
||||||
|
RECT32 box;
|
||||||
|
HRGN32 tmpVisRgn, prevVisRgn;
|
||||||
|
HDC32 hdc = dc->hSelf; /* FIXME: should not mix dc/hdc this way */
|
||||||
|
|
||||||
|
/* Modify visible region */
|
||||||
|
|
||||||
|
if (!(prevVisRgn = SaveVisRgn( hdc ))) return FALSE;
|
||||||
|
if (!(tmpVisRgn = CreateRectRgn32( 0, 0, 0, 0 )))
|
||||||
|
{
|
||||||
|
RestoreVisRgn( hdc );
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
CombineRgn32( tmpVisRgn, prevVisRgn, hrgn, RGN_AND );
|
||||||
|
SelectVisRgn( hdc, tmpVisRgn );
|
||||||
|
DeleteObject32( tmpVisRgn );
|
||||||
|
|
||||||
|
/* Fill the region */
|
||||||
|
|
||||||
|
GetRgnBox32( dc->w.hGCClipRgn, &box );
|
||||||
|
if (DC_SetupGCForBrush( dc ))
|
||||||
|
XFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + box.left, dc->w.DCOrgY + box.top,
|
||||||
|
box.right-box.left, box.bottom-box.top );
|
||||||
|
|
||||||
|
/* Restore the visible region */
|
||||||
|
|
||||||
|
RestoreVisRgn( hdc );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* X11DRV_Polyline
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
X11DRV_Polyline( DC *dc, const LPPOINT32 pt, INT32 count )
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
|
||||||
|
if (DC_SetupGCForPen( dc ))
|
||||||
|
for (i = 0; i < count-1; i ++)
|
||||||
|
XDrawLine (display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + XLPTODP(dc, pt [i].x),
|
||||||
|
dc->w.DCOrgY + YLPTODP(dc, pt [i].y),
|
||||||
|
dc->w.DCOrgX + XLPTODP(dc, pt [i+1].x),
|
||||||
|
dc->w.DCOrgY + YLPTODP(dc, pt [i+1].y));
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* X11DRV_Polygon
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
X11DRV_Polygon( DC *dc, LPPOINT32 pt, INT32 count )
|
||||||
|
{
|
||||||
|
register int i;
|
||||||
|
XPoint *points;
|
||||||
|
|
||||||
|
points = (XPoint *) xmalloc (sizeof (XPoint) * (count+1));
|
||||||
|
for (i = 0; i < count; i++)
|
||||||
|
{
|
||||||
|
points[i].x = dc->w.DCOrgX + XLPTODP( dc, pt[i].x );
|
||||||
|
points[i].y = dc->w.DCOrgY + YLPTODP( dc, pt[i].y );
|
||||||
|
}
|
||||||
|
points[count] = points[0];
|
||||||
|
|
||||||
|
if (DC_SetupGCForBrush( dc ))
|
||||||
|
XFillPolygon( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
points, count+1, Complex, CoordModeOrigin);
|
||||||
|
|
||||||
|
if (DC_SetupGCForPen ( dc ))
|
||||||
|
XDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
points, count+1, CoordModeOrigin );
|
||||||
|
|
||||||
|
free( points );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* X11DRV_PolyPolygon
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
X11DRV_PolyPolygon( DC *dc, LPPOINT32 pt, LPINT32 counts, UINT32 polygons)
|
||||||
|
{
|
||||||
|
HRGN32 hrgn;
|
||||||
|
|
||||||
|
/* FIXME: The points should be converted to device coords before */
|
||||||
|
/* creating the region. But as CreatePolyPolygonRgn is not */
|
||||||
|
/* really correct either, it doesn't matter much... */
|
||||||
|
/* At least the outline will be correct :-) */
|
||||||
|
hrgn = CreatePolyPolygonRgn32( pt, counts, polygons, dc->w.polyFillMode );
|
||||||
|
X11DRV_PaintRgn( dc, hrgn );
|
||||||
|
DeleteObject32( hrgn );
|
||||||
|
|
||||||
|
/* Draw the outline of the polygons */
|
||||||
|
|
||||||
|
if (DC_SetupGCForPen ( dc ))
|
||||||
|
{
|
||||||
|
int i, j, max = 0;
|
||||||
|
XPoint *points;
|
||||||
|
|
||||||
|
for (i = 0; i < polygons; i++) if (counts[i] > max) max = counts[i];
|
||||||
|
points = (XPoint *) xmalloc( sizeof(XPoint) * (max+1) );
|
||||||
|
|
||||||
|
for (i = 0; i < polygons; i++)
|
||||||
|
{
|
||||||
|
for (j = 0; j < counts[i]; j++)
|
||||||
|
{
|
||||||
|
points[j].x = dc->w.DCOrgX + XLPTODP( dc, pt->x );
|
||||||
|
points[j].y = dc->w.DCOrgY + YLPTODP( dc, pt->y );
|
||||||
|
pt++;
|
||||||
|
}
|
||||||
|
points[j] = points[0];
|
||||||
|
XDrawLines( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
points, j + 1, CoordModeOrigin );
|
||||||
|
}
|
||||||
|
free( points );
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* X11DRV_InternalFloodFill
|
||||||
|
*
|
||||||
|
* Internal helper function for flood fill.
|
||||||
|
* (xorg,yorg) is the origin of the X image relative to the drawable.
|
||||||
|
* (x,y) is relative to the origin of the X image.
|
||||||
|
*/
|
||||||
|
static void X11DRV_InternalFloodFill(XImage *image, DC *dc,
|
||||||
|
int x, int y,
|
||||||
|
int xOrg, int yOrg,
|
||||||
|
Pixel pixel, WORD fillType )
|
||||||
|
{
|
||||||
|
int left, right;
|
||||||
|
|
||||||
|
#define TO_FLOOD(x,y) ((fillType == FLOODFILLBORDER) ? \
|
||||||
|
(XGetPixel(image,x,y) != pixel) : \
|
||||||
|
(XGetPixel(image,x,y) == pixel))
|
||||||
|
|
||||||
|
if (!TO_FLOOD(x,y)) return;
|
||||||
|
|
||||||
|
/* Find left and right boundaries */
|
||||||
|
|
||||||
|
left = right = x;
|
||||||
|
while ((left > 0) && TO_FLOOD( left-1, y )) left--;
|
||||||
|
while ((right < image->width) && TO_FLOOD( right, y )) right++;
|
||||||
|
XFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
xOrg + left, yOrg + y, right-left, 1 );
|
||||||
|
|
||||||
|
/* Set the pixels of this line so we don't fill it again */
|
||||||
|
|
||||||
|
for (x = left; x < right; x++)
|
||||||
|
{
|
||||||
|
if (fillType == FLOODFILLBORDER) XPutPixel( image, x, y, pixel );
|
||||||
|
else XPutPixel( image, x, y, ~pixel );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fill the line above */
|
||||||
|
|
||||||
|
if (--y >= 0)
|
||||||
|
{
|
||||||
|
x = left;
|
||||||
|
while (x < right)
|
||||||
|
{
|
||||||
|
while ((x < right) && !TO_FLOOD(x,y)) x++;
|
||||||
|
if (x >= right) break;
|
||||||
|
while ((x < right) && TO_FLOOD(x,y)) x++;
|
||||||
|
X11DRV_InternalFloodFill(image, dc, x-1, y,
|
||||||
|
xOrg, yOrg, pixel, fillType );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fill the line below */
|
||||||
|
|
||||||
|
if ((y += 2) < image->height)
|
||||||
|
{
|
||||||
|
x = left;
|
||||||
|
while (x < right)
|
||||||
|
{
|
||||||
|
while ((x < right) && !TO_FLOOD(x,y)) x++;
|
||||||
|
if (x >= right) break;
|
||||||
|
while ((x < right) && TO_FLOOD(x,y)) x++;
|
||||||
|
X11DRV_InternalFloodFill(image, dc, x-1, y,
|
||||||
|
xOrg, yOrg, pixel, fillType );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#undef TO_FLOOD
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* X11DRV_DoFloodFill
|
||||||
|
*
|
||||||
|
* Main flood-fill routine.
|
||||||
|
*/
|
||||||
|
static BOOL32 X11DRV_DoFloodFill( DC *dc, RECT32 *rect, INT32 x, INT32 y,
|
||||||
|
COLORREF color, UINT32 fillType )
|
||||||
|
{
|
||||||
|
XImage *image;
|
||||||
|
|
||||||
|
if (!(image = XGetImage( display, dc->u.x.drawable,
|
||||||
|
dc->w.DCOrgX + rect->left,
|
||||||
|
dc->w.DCOrgY + rect->top,
|
||||||
|
rect->right - rect->left,
|
||||||
|
rect->bottom - rect->top,
|
||||||
|
AllPlanes, ZPixmap ))) return FALSE;
|
||||||
|
|
||||||
|
if (DC_SetupGCForBrush( dc ))
|
||||||
|
{
|
||||||
|
/* ROP mode is always GXcopy for flood-fill */
|
||||||
|
XSetFunction( display, dc->u.x.gc, GXcopy );
|
||||||
|
X11DRV_InternalFloodFill(image, dc,
|
||||||
|
XLPTODP(dc,x) - rect->left,
|
||||||
|
YLPTODP(dc,y) - rect->top,
|
||||||
|
dc->w.DCOrgX + rect->left,
|
||||||
|
dc->w.DCOrgY + rect->top,
|
||||||
|
COLOR_ToPhysical( dc, color ), fillType );
|
||||||
|
}
|
||||||
|
|
||||||
|
XDestroyImage( image );
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**********************************************************************
|
||||||
|
* X11DRV_ExtFloodFill
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
X11DRV_ExtFloodFill( DC *dc, INT32 x, INT32 y, COLORREF color,
|
||||||
|
UINT32 fillType )
|
||||||
|
{
|
||||||
|
RECT32 rect;
|
||||||
|
HDC32 hdc = dc->hSelf; /* FIXME */
|
||||||
|
|
||||||
|
dprintf_graphics( stddeb, "X11DRV_ExtFloodFill %d,%d %06lx %d\n",
|
||||||
|
x, y, color, fillType );
|
||||||
|
|
||||||
|
if (!PtVisible32( hdc, x, y )) return FALSE;
|
||||||
|
if (GetRgnBox32( dc->w.hGCClipRgn, &rect ) == ERROR) return FALSE;
|
||||||
|
|
||||||
|
return CallTo32_LargeStack( (int(*)())X11DRV_DoFloodFill, 6,
|
||||||
|
dc, &rect, x, y, color, fillType );
|
||||||
|
}
|
|
@ -16,41 +16,38 @@ static BOOL32 X11DRV_DeleteDC( DC *dc );
|
||||||
|
|
||||||
static const DC_FUNCTIONS X11DRV_Funcs =
|
static const DC_FUNCTIONS X11DRV_Funcs =
|
||||||
{
|
{
|
||||||
NULL, /* pArc */
|
X11DRV_Arc, /* pArc */
|
||||||
X11DRV_BitBlt, /* pBitBlt */
|
X11DRV_BitBlt, /* pBitBlt */
|
||||||
NULL, /* pChord */
|
X11DRV_Chord, /* pChord */
|
||||||
X11DRV_CreateDC, /* pCreateDC */
|
X11DRV_CreateDC, /* pCreateDC */
|
||||||
X11DRV_DeleteDC, /* pDeleteDC */
|
X11DRV_DeleteDC, /* pDeleteDC */
|
||||||
NULL, /* pDeleteObject */
|
NULL, /* pDeleteObject */
|
||||||
NULL, /* pEllipse */
|
X11DRV_Ellipse, /* pEllipse */
|
||||||
NULL, /* pEscape */
|
NULL, /* pEscape */
|
||||||
NULL, /* pExcludeClipRect */
|
NULL, /* pExcludeClipRect */
|
||||||
NULL, /* pExcludeVisRect */
|
NULL, /* pExcludeVisRect */
|
||||||
NULL, /* pExtFloodFill */
|
X11DRV_ExtFloodFill, /* pExtFloodFill */
|
||||||
NULL, /* pExtTextOut */
|
X11DRV_ExtTextOut, /* pExtTextOut */
|
||||||
NULL, /* pFillRgn */
|
X11DRV_GetPixel, /* pGetPixel */
|
||||||
NULL, /* pFloodFill */
|
|
||||||
NULL, /* pFrameRgn */
|
|
||||||
X11DRV_GetTextExtentPoint, /* pGetTextExtentPoint */
|
X11DRV_GetTextExtentPoint, /* pGetTextExtentPoint */
|
||||||
NULL, /* pGetTextMetrics */
|
NULL, /* pGetTextMetrics */
|
||||||
NULL, /* pIntersectClipRect */
|
NULL, /* pIntersectClipRect */
|
||||||
NULL, /* pIntersectVisRect */
|
NULL, /* pIntersectVisRect */
|
||||||
NULL, /* pInvertRgn */
|
X11DRV_LineTo, /* pLineTo */
|
||||||
NULL, /* pLineTo */
|
X11DRV_MoveToEx, /* pMoveToEx */
|
||||||
NULL, /* pMoveToEx */
|
|
||||||
NULL, /* pOffsetClipRgn */
|
NULL, /* pOffsetClipRgn */
|
||||||
NULL, /* pOffsetViewportOrg (optional) */
|
NULL, /* pOffsetViewportOrg (optional) */
|
||||||
NULL, /* pOffsetWindowOrg (optional) */
|
NULL, /* pOffsetWindowOrg (optional) */
|
||||||
NULL, /* pPaintRgn */
|
X11DRV_PaintRgn, /* pPaintRgn */
|
||||||
X11DRV_PatBlt, /* pPatBlt */
|
X11DRV_PatBlt, /* pPatBlt */
|
||||||
NULL, /* pPie */
|
X11DRV_Pie, /* pPie */
|
||||||
NULL, /* pPolyPolygon */
|
X11DRV_PolyPolygon, /* pPolyPolygon */
|
||||||
NULL, /* pPolygon */
|
X11DRV_Polygon, /* pPolygon */
|
||||||
NULL, /* pPolyline */
|
X11DRV_Polyline, /* pPolyline */
|
||||||
NULL, /* pRealizePalette */
|
NULL, /* pRealizePalette */
|
||||||
NULL, /* pRectangle */
|
X11DRV_Rectangle, /* pRectangle */
|
||||||
NULL, /* pRestoreDC */
|
NULL, /* pRestoreDC */
|
||||||
NULL, /* pRoundRect */
|
X11DRV_RoundRect, /* pRoundRect */
|
||||||
NULL, /* pSaveDC */
|
NULL, /* pSaveDC */
|
||||||
NULL, /* pScaleViewportExt (optional) */
|
NULL, /* pScaleViewportExt (optional) */
|
||||||
NULL, /* pScaleWindowExt (optional) */
|
NULL, /* pScaleWindowExt (optional) */
|
||||||
|
@ -63,7 +60,7 @@ static const DC_FUNCTIONS X11DRV_Funcs =
|
||||||
NULL, /* pSetDIBitsToDevice */
|
NULL, /* pSetDIBitsToDevice */
|
||||||
NULL, /* pSetMapMode (optional) */
|
NULL, /* pSetMapMode (optional) */
|
||||||
NULL, /* pSetMapperFlags */
|
NULL, /* pSetMapperFlags */
|
||||||
NULL, /* pSetPixel */
|
X11DRV_SetPixel, /* pSetPixel */
|
||||||
NULL, /* pSetPolyFillMode */
|
NULL, /* pSetPolyFillMode */
|
||||||
NULL, /* pSetROP2 */
|
NULL, /* pSetROP2 */
|
||||||
NULL, /* pSetRelAbs */
|
NULL, /* pSetRelAbs */
|
||||||
|
@ -77,8 +74,7 @@ static const DC_FUNCTIONS X11DRV_Funcs =
|
||||||
NULL, /* pSetWindowExt (optional) */
|
NULL, /* pSetWindowExt (optional) */
|
||||||
NULL, /* pSetWindowOrg (optional) */
|
NULL, /* pSetWindowOrg (optional) */
|
||||||
X11DRV_StretchBlt, /* pStretchBlt */
|
X11DRV_StretchBlt, /* pStretchBlt */
|
||||||
NULL, /* pStretchDIBits */
|
NULL /* pStretchDIBits */
|
||||||
NULL /* pTextOut */
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static DeviceCaps X11DRV_DevCaps;
|
static DeviceCaps X11DRV_DevCaps;
|
||||||
|
|
|
@ -0,0 +1,260 @@
|
||||||
|
/*
|
||||||
|
* X11 graphics driver text functions
|
||||||
|
*
|
||||||
|
* Copyright 1993,1994 Alexandre Julliard
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <X11/Xlib.h>
|
||||||
|
#include <X11/Xatom.h>
|
||||||
|
#include "windows.h"
|
||||||
|
#include "dc.h"
|
||||||
|
#include "gdi.h"
|
||||||
|
/*#include "callback.h"*/
|
||||||
|
#include "heap.h"
|
||||||
|
#include "x11drv.h"
|
||||||
|
#include "stddebug.h"
|
||||||
|
/* #define DEBUG_TEXT */
|
||||||
|
#include "debug.h"
|
||||||
|
#include "xmalloc.h"
|
||||||
|
|
||||||
|
#define SWAP_INT(a,b) { int t = a; a = b; b = t; }
|
||||||
|
|
||||||
|
|
||||||
|
extern int CLIPPING_IntersectClipRect( DC * dc, short left, short top,
|
||||||
|
short right, short bottom, UINT16 flags);
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* X11DRV_ExtTextOut
|
||||||
|
*/
|
||||||
|
BOOL32
|
||||||
|
X11DRV_ExtTextOut( DC *dc, INT32 x, INT32 y, UINT32 flags,
|
||||||
|
const RECT32 *lprect, LPCSTR str, UINT32 count,
|
||||||
|
const INT32 *lpDx )
|
||||||
|
{
|
||||||
|
HRGN32 hRgnClip = 0;
|
||||||
|
int dir, ascent, descent, i;
|
||||||
|
XCharStruct info;
|
||||||
|
XFontStruct *font;
|
||||||
|
RECT32 rect;
|
||||||
|
|
||||||
|
if (!DC_SetupGCForText( dc )) return TRUE;
|
||||||
|
font = dc->u.x.font.fstruct;
|
||||||
|
|
||||||
|
dprintf_text(stddeb,"ExtTextOut: hdc=%04x %d,%d '%*.*s', %d flags=%d\n",
|
||||||
|
dc->hSelf, x, y, count, count, str, count, flags);
|
||||||
|
if (lprect != NULL) dprintf_text(stddeb, "\trect=(%d,%d- %d,%d)\n",
|
||||||
|
lprect->left, lprect->top,
|
||||||
|
lprect->right, lprect->bottom );
|
||||||
|
|
||||||
|
/* Setup coordinates */
|
||||||
|
|
||||||
|
if (dc->w.textAlign & TA_UPDATECP)
|
||||||
|
{
|
||||||
|
x = dc->w.CursPosX;
|
||||||
|
y = dc->w.CursPosY;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & (ETO_OPAQUE | ETO_CLIPPED)) /* there's a rectangle */
|
||||||
|
{
|
||||||
|
if (!lprect) /* not always */
|
||||||
|
{
|
||||||
|
SIZE32 sz;
|
||||||
|
if (flags & ETO_CLIPPED) /* Can't clip with no rectangle */
|
||||||
|
return FALSE;
|
||||||
|
if (!X11DRV_GetTextExtentPoint( dc, str, count, &sz ))
|
||||||
|
return FALSE;
|
||||||
|
rect.left = XLPTODP( dc, x );
|
||||||
|
rect.right = XLPTODP( dc, x+sz.cx );
|
||||||
|
rect.top = YLPTODP( dc, y );
|
||||||
|
rect.bottom = YLPTODP( dc, y+sz.cy );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rect.left = XLPTODP( dc, lprect->left );
|
||||||
|
rect.right = XLPTODP( dc, lprect->right );
|
||||||
|
rect.top = YLPTODP( dc, lprect->top );
|
||||||
|
rect.bottom = YLPTODP( dc, lprect->bottom );
|
||||||
|
}
|
||||||
|
if (rect.right < rect.left) SWAP_INT( rect.left, rect.right );
|
||||||
|
if (rect.bottom < rect.top) SWAP_INT( rect.top, rect.bottom );
|
||||||
|
}
|
||||||
|
|
||||||
|
x = XLPTODP( dc, x );
|
||||||
|
y = YLPTODP( dc, y );
|
||||||
|
|
||||||
|
dprintf_text(stddeb,"\treal coord: x=%i, y=%i, rect=(%d,%d-%d,%d)\n",
|
||||||
|
x, y, rect.left, rect.top, rect.right, rect.bottom);
|
||||||
|
|
||||||
|
/* Draw the rectangle */
|
||||||
|
|
||||||
|
if (flags & ETO_OPAQUE)
|
||||||
|
{
|
||||||
|
XSetForeground( display, dc->u.x.gc, dc->w.backgroundPixel );
|
||||||
|
XFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + rect.left, dc->w.DCOrgY + rect.top,
|
||||||
|
rect.right-rect.left, rect.bottom-rect.top );
|
||||||
|
}
|
||||||
|
if (!count) return TRUE; /* Nothing more to do */
|
||||||
|
|
||||||
|
/* Compute text starting position */
|
||||||
|
|
||||||
|
XTextExtents( font, str, count, &dir, &ascent, &descent, &info );
|
||||||
|
|
||||||
|
if (lpDx) /* have explicit character cell x offsets */
|
||||||
|
{
|
||||||
|
/* sum lpDx array and add the width of last character */
|
||||||
|
|
||||||
|
info.width = XTextWidth( font, str + count - 1, 1) + dc->w.charExtra;
|
||||||
|
if (str[count-1] == (char)dc->u.x.font.metrics.tmBreakChar)
|
||||||
|
info.width += dc->w.breakExtra;
|
||||||
|
|
||||||
|
for (i = 0; i < count; i++) info.width += lpDx[i];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
info.width += count*dc->w.charExtra + dc->w.breakExtra*dc->w.breakCount;
|
||||||
|
|
||||||
|
switch( dc->w.textAlign & (TA_LEFT | TA_RIGHT | TA_CENTER) )
|
||||||
|
{
|
||||||
|
case TA_LEFT:
|
||||||
|
if (dc->w.textAlign & TA_UPDATECP)
|
||||||
|
dc->w.CursPosX = XDPTOLP( dc, x + info.width );
|
||||||
|
break;
|
||||||
|
case TA_RIGHT:
|
||||||
|
x -= info.width;
|
||||||
|
if (dc->w.textAlign & TA_UPDATECP) dc->w.CursPosX = XDPTOLP( dc, x );
|
||||||
|
break;
|
||||||
|
case TA_CENTER:
|
||||||
|
x -= info.width / 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch( dc->w.textAlign & (TA_TOP | TA_BOTTOM | TA_BASELINE) )
|
||||||
|
{
|
||||||
|
case TA_TOP:
|
||||||
|
y += font->ascent;
|
||||||
|
break;
|
||||||
|
case TA_BOTTOM:
|
||||||
|
y -= font->descent;
|
||||||
|
break;
|
||||||
|
case TA_BASELINE:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Set the clip region */
|
||||||
|
|
||||||
|
if (flags & ETO_CLIPPED)
|
||||||
|
{
|
||||||
|
hRgnClip = dc->w.hClipRgn;
|
||||||
|
CLIPPING_IntersectClipRect( dc, rect.left, rect.top, rect.right,
|
||||||
|
rect.bottom, CLIP_INTERSECT|CLIP_KEEPRGN );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Draw the text background if necessary */
|
||||||
|
|
||||||
|
if (dc->w.backgroundMode != TRANSPARENT)
|
||||||
|
{
|
||||||
|
/* If rectangle is opaque and clipped, do nothing */
|
||||||
|
if (!(flags & ETO_CLIPPED) || !(flags & ETO_OPAQUE))
|
||||||
|
{
|
||||||
|
/* Only draw if rectangle is not opaque or if some */
|
||||||
|
/* text is outside the rectangle */
|
||||||
|
if (!(flags & ETO_OPAQUE) ||
|
||||||
|
(x < rect.left) ||
|
||||||
|
(x + info.width >= rect.right) ||
|
||||||
|
(y-font->ascent < rect.top) ||
|
||||||
|
(y+font->descent >= rect.bottom))
|
||||||
|
{
|
||||||
|
XSetForeground( display, dc->u.x.gc, dc->w.backgroundPixel );
|
||||||
|
XFillRectangle( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + x,
|
||||||
|
dc->w.DCOrgY + y - font->ascent,
|
||||||
|
info.width,
|
||||||
|
font->ascent + font->descent );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Draw the text (count > 0 verified) */
|
||||||
|
|
||||||
|
XSetForeground( display, dc->u.x.gc, dc->w.textPixel );
|
||||||
|
if (!dc->w.charExtra && !dc->w.breakExtra && !lpDx)
|
||||||
|
{
|
||||||
|
XDrawString( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + x, dc->w.DCOrgY + y, str, count );
|
||||||
|
}
|
||||||
|
else /* Now the fun begins... */
|
||||||
|
{
|
||||||
|
XTextItem *items, *pitem;
|
||||||
|
int delta;
|
||||||
|
|
||||||
|
/* allocate max items */
|
||||||
|
|
||||||
|
pitem = items = xmalloc( count * sizeof(XTextItem) );
|
||||||
|
delta = i = 0;
|
||||||
|
while (i < count)
|
||||||
|
{
|
||||||
|
/* initialize text item with accumulated delta */
|
||||||
|
|
||||||
|
pitem->chars = (char *)str + i;
|
||||||
|
pitem->delta = delta;
|
||||||
|
pitem->nchars = 0;
|
||||||
|
pitem->font = None;
|
||||||
|
delta = 0;
|
||||||
|
|
||||||
|
/* stuff characters into the same XTextItem until new delta
|
||||||
|
* becomes non-zero */
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (lpDx) delta += lpDx[i] - XTextWidth( font, str + i, 1);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
delta += dc->w.charExtra;
|
||||||
|
if (str[i] == (char)dc->u.x.font.metrics.tmBreakChar)
|
||||||
|
delta += dc->w.breakExtra;
|
||||||
|
}
|
||||||
|
pitem->nchars++;
|
||||||
|
}
|
||||||
|
while ((++i < count) && !delta);
|
||||||
|
pitem++;
|
||||||
|
}
|
||||||
|
|
||||||
|
XDrawText( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + x, dc->w.DCOrgY + y, items, pitem - items );
|
||||||
|
free( items );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Draw underline and strike-out if needed */
|
||||||
|
|
||||||
|
if (dc->u.x.font.metrics.tmUnderlined)
|
||||||
|
{
|
||||||
|
long linePos, lineWidth;
|
||||||
|
if (!XGetFontProperty( font, XA_UNDERLINE_POSITION, &linePos ))
|
||||||
|
linePos = font->descent-1;
|
||||||
|
if (!XGetFontProperty( font, XA_UNDERLINE_THICKNESS, &lineWidth ))
|
||||||
|
lineWidth = 0;
|
||||||
|
else if (lineWidth == 1) lineWidth = 0;
|
||||||
|
XSetLineAttributes( display, dc->u.x.gc, lineWidth,
|
||||||
|
LineSolid, CapRound, JoinBevel );
|
||||||
|
XDrawLine( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + x, dc->w.DCOrgY + y + linePos,
|
||||||
|
dc->w.DCOrgX + x + info.width, dc->w.DCOrgY + y + linePos );
|
||||||
|
}
|
||||||
|
if (dc->u.x.font.metrics.tmStruckOut)
|
||||||
|
{
|
||||||
|
long lineAscent, lineDescent;
|
||||||
|
if (!XGetFontProperty( font, XA_STRIKEOUT_ASCENT, &lineAscent ))
|
||||||
|
lineAscent = font->ascent / 3;
|
||||||
|
if (!XGetFontProperty( font, XA_STRIKEOUT_DESCENT, &lineDescent ))
|
||||||
|
lineDescent = -lineAscent;
|
||||||
|
XSetLineAttributes( display, dc->u.x.gc, lineAscent + lineDescent,
|
||||||
|
LineSolid, CapRound, JoinBevel );
|
||||||
|
XDrawLine( display, dc->u.x.drawable, dc->u.x.gc,
|
||||||
|
dc->w.DCOrgX + x, dc->w.DCOrgY + y - lineAscent,
|
||||||
|
dc->w.DCOrgX + x + info.width, dc->w.DCOrgY + y - lineAscent );
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags & ETO_CLIPPED) SelectClipRgn32( dc->hSelf, hRgnClip );
|
||||||
|
return TRUE;
|
||||||
|
}
|
|
@ -81,9 +81,6 @@ all: checkbuild $(MODULE).o
|
||||||
|
|
||||||
$(SPEC_FILES): $(BUILD)
|
$(SPEC_FILES): $(BUILD)
|
||||||
|
|
||||||
$(BUILD) checkbuild:
|
|
||||||
cd $(TOPOBJDIR)/tools; $(SUBMAKE) build
|
|
||||||
|
|
||||||
callfrom16.s: $(SPEC_FILES)
|
callfrom16.s: $(SPEC_FILES)
|
||||||
$(BUILD) -o $@ -callfrom16 `cat $(SPEC_FILES) | grep CallFrom16_ | sed 's/.*CallFrom16_\(.*\)/\1/' | sort | uniq`
|
$(BUILD) -o $@ -callfrom16 `cat $(SPEC_FILES) | grep CallFrom16_ | sed 's/.*CallFrom16_\(.*\)/\1/' | sort | uniq`
|
||||||
|
|
||||||
|
|
|
@ -198,7 +198,7 @@ base 1
|
||||||
0193 stub SetThreadToken
|
0193 stub SetThreadToken
|
||||||
0194 stub SetTokenInformation
|
0194 stub SetTokenInformation
|
||||||
0195 stub StartServiceA
|
0195 stub StartServiceA
|
||||||
0196 stub StartServiceCtrlDispatcherA
|
0196 stdcall StartServiceCtrlDispatcherA(ptr) StartServiceCtrlDispatcher32A
|
||||||
0197 stub StartServiceCtrlDispatcherW
|
0197 stdcall StartServiceCtrlDispatcherW(ptr) StartServiceCtrlDispatcher32W
|
||||||
0198 stub StartServiceW
|
0198 stub StartServiceW
|
||||||
0199 stub UnlockServiceDatabase
|
0199 stub UnlockServiceDatabase
|
||||||
|
|
|
@ -3,9 +3,9 @@ name crtdll
|
||||||
type win32
|
type win32
|
||||||
base 1
|
base 1
|
||||||
|
|
||||||
001 cdecl ??2@YAPAXI@Z(long) CRTDLL_malloc
|
001 cdecl ??2@YAPAXI@Z(long) CRTDLL_new
|
||||||
002 cdecl ??3@YAXPAX@Z(long) CRTDLL_free
|
002 cdecl ??3@YAXPAX@Z(long) CRTDLL_delete
|
||||||
003 stub ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z
|
003 cdecl ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z(ptr) CRTDLL_set_new_handler
|
||||||
004 stub _CIacos
|
004 stub _CIacos
|
||||||
005 stub _CIasin
|
005 stub _CIasin
|
||||||
006 stub _CIatan
|
006 stub _CIatan
|
||||||
|
|
|
@ -61,8 +61,8 @@ base 1
|
||||||
0054 stdcall CreatePatternBrush(long) CreatePatternBrush32
|
0054 stdcall CreatePatternBrush(long) CreatePatternBrush32
|
||||||
0055 stdcall CreatePen(long long long) CreatePen32
|
0055 stdcall CreatePen(long long long) CreatePen32
|
||||||
0056 stdcall CreatePenIndirect(ptr) CreatePenIndirect32
|
0056 stdcall CreatePenIndirect(ptr) CreatePenIndirect32
|
||||||
0057 stub CreatePolyPolygonRgn
|
0057 stdcall CreatePolyPolygonRgn(ptr ptr long long) CreatePolyPolygonRgn32
|
||||||
0058 stub CreatePolygonRgn
|
0058 stdcall CreatePolygonRgn(ptr long long) CreatePolygonRgn32
|
||||||
0059 stdcall CreateRectRgn(long long long long) CreateRectRgn32
|
0059 stdcall CreateRectRgn(long long long long) CreateRectRgn32
|
||||||
0060 stdcall CreateRectRgnIndirect(ptr) CreateRectRgnIndirect32
|
0060 stdcall CreateRectRgnIndirect(ptr) CreateRectRgnIndirect32
|
||||||
0061 stdcall CreateRoundRectRgn(long long long long long long)
|
0061 stdcall CreateRoundRectRgn(long long long long long long)
|
||||||
|
@ -276,7 +276,7 @@ base 1
|
||||||
0268 stub PolyBezier
|
0268 stub PolyBezier
|
||||||
0269 stub PolyBezierTo
|
0269 stub PolyBezierTo
|
||||||
0270 stub PolyDraw
|
0270 stub PolyDraw
|
||||||
0271 stub PolyPolygon
|
0271 stdcall PolyPolygon(long ptr ptr long) PolyPolygon32
|
||||||
0272 stub PolyPolyline
|
0272 stub PolyPolyline
|
||||||
0273 stub PolyTextOutA
|
0273 stub PolyTextOutA
|
||||||
0274 stub PolyTextOutW
|
0274 stub PolyTextOutW
|
||||||
|
|
|
@ -204,7 +204,7 @@ type win16
|
||||||
204 stub SwapRecording
|
204 stub SwapRecording
|
||||||
205 stub CVWBreak
|
205 stub CVWBreak
|
||||||
206 pascal16 AllocSelectorArray(word) AllocSelectorArray
|
206 pascal16 AllocSelectorArray(word) AllocSelectorArray
|
||||||
207 return IsDBCSLeadByte 2 0
|
207 pascal16 IsDBCSLeadByte(word) IsDBCSLeadByte16
|
||||||
216 pascal RegEnumKey(long long ptr long) RegEnumKey16
|
216 pascal RegEnumKey(long long ptr long) RegEnumKey16
|
||||||
217 pascal RegOpenKey(long ptr ptr) RegOpenKey16
|
217 pascal RegOpenKey(long ptr ptr) RegOpenKey16
|
||||||
218 pascal RegCreateKey(long ptr ptr) RegCreateKey16
|
218 pascal RegCreateKey(long ptr ptr) RegCreateKey16
|
||||||
|
|
|
@ -39,7 +39,7 @@ base 1
|
||||||
0034 stub ContinueDebugEvent
|
0034 stub ContinueDebugEvent
|
||||||
0035 stub ConvertDefaultLocale
|
0035 stub ConvertDefaultLocale
|
||||||
0036 stdcall CopyFileA(ptr ptr long) CopyFile32A
|
0036 stdcall CopyFileA(ptr ptr long) CopyFile32A
|
||||||
0037 stub CopyFileW
|
0037 stdcall CopyFileW(ptr ptr long) CopyFile32W
|
||||||
0038 stub CreateConsoleScreenBuffer
|
0038 stub CreateConsoleScreenBuffer
|
||||||
0039 stdcall CreateDirectoryA(ptr ptr) CreateDirectory32A
|
0039 stdcall CreateDirectoryA(ptr ptr) CreateDirectory32A
|
||||||
0040 stdcall CreateDirectoryExA(ptr ptr ptr) CreateDirectoryEx32A
|
0040 stdcall CreateDirectoryExA(ptr ptr ptr) CreateDirectoryEx32A
|
||||||
|
@ -143,8 +143,8 @@ base 1
|
||||||
0138 stdcall FormatMessageA() WIN32_FormatMessage32A
|
0138 stdcall FormatMessageA() WIN32_FormatMessage32A
|
||||||
0139 stdcall FormatMessageW() WIN32_FormatMessage32W
|
0139 stdcall FormatMessageW() WIN32_FormatMessage32W
|
||||||
0140 stub FreeConsole
|
0140 stub FreeConsole
|
||||||
0141 stdcall FreeEnvironmentStringsA(ptr) FreeEnvironmentStringsA
|
0141 stdcall FreeEnvironmentStringsA(ptr) FreeEnvironmentStrings32A
|
||||||
0142 stdcall FreeEnvironmentStringsW(ptr) FreeEnvironmentStringsW
|
0142 stdcall FreeEnvironmentStringsW(ptr) FreeEnvironmentStrings32W
|
||||||
0143 stdcall FreeLibrary(long) FreeLibrary32
|
0143 stdcall FreeLibrary(long) FreeLibrary32
|
||||||
0144 stub FreeLibraryAndExitThread
|
0144 stub FreeLibraryAndExitThread
|
||||||
0145 stdcall FreeResource(long) FreeResource32
|
0145 stdcall FreeResource(long) FreeResource32
|
||||||
|
@ -212,9 +212,9 @@ base 1
|
||||||
0207 stdcall GetDiskFreeSpaceW(ptr ptr ptr ptr ptr) GetDiskFreeSpace32W
|
0207 stdcall GetDiskFreeSpaceW(ptr ptr ptr ptr ptr) GetDiskFreeSpace32W
|
||||||
0208 stdcall GetDriveTypeA(ptr) GetDriveType32A
|
0208 stdcall GetDriveTypeA(ptr) GetDriveType32A
|
||||||
0209 stdcall GetDriveTypeW(ptr) GetDriveType32W
|
0209 stdcall GetDriveTypeW(ptr) GetDriveType32W
|
||||||
0210 stdcall GetEnvironmentStrings() GetEnvironmentStrings
|
0210 stdcall GetEnvironmentStrings() GetEnvironmentStrings32A
|
||||||
0211 stub GetEnvironmentStringsA
|
0211 stdcall GetEnvironmentStringsA() GetEnvironmentStrings32A
|
||||||
0212 stdcall GetEnvironmentStringsW() GetEnvironmentStringsW
|
0212 stdcall GetEnvironmentStringsW() GetEnvironmentStrings32W
|
||||||
0213 stdcall GetEnvironmentVariableA(ptr ptr long) GetEnvironmentVariable32A
|
0213 stdcall GetEnvironmentVariableA(ptr ptr long) GetEnvironmentVariable32A
|
||||||
0214 stdcall GetEnvironmentVariableW(ptr ptr long) GetEnvironmentVariable32W
|
0214 stdcall GetEnvironmentVariableW(ptr ptr long) GetEnvironmentVariable32W
|
||||||
0215 stub GetExitCodeProcess
|
0215 stub GetExitCodeProcess
|
||||||
|
@ -252,7 +252,7 @@ base 1
|
||||||
0247 stub GetNumberOfConsoleMouseButtons
|
0247 stub GetNumberOfConsoleMouseButtons
|
||||||
0248 stdcall GetOEMCP() GetOEMCP
|
0248 stdcall GetOEMCP() GetOEMCP
|
||||||
0249 stub GetOverlappedResult
|
0249 stub GetOverlappedResult
|
||||||
0250 stub GetPriorityClass
|
0250 stdcall GetPriorityClass(long) GetPriorityClass
|
||||||
0251 stdcall GetPrivateProfileIntA(ptr ptr long ptr) GetPrivateProfileInt32A
|
0251 stdcall GetPrivateProfileIntA(ptr ptr long ptr) GetPrivateProfileInt32A
|
||||||
0252 stdcall GetPrivateProfileIntW(ptr ptr long ptr) GetPrivateProfileInt32W
|
0252 stdcall GetPrivateProfileIntW(ptr ptr long ptr) GetPrivateProfileInt32W
|
||||||
0253 stub GetPrivateProfileSectionA
|
0253 stub GetPrivateProfileSectionA
|
||||||
|
@ -296,9 +296,9 @@ base 1
|
||||||
0291 stdcall GetTempFileNameW(ptr ptr long ptr) GetTempFileName32W
|
0291 stdcall GetTempFileNameW(ptr ptr long ptr) GetTempFileName32W
|
||||||
0292 stdcall GetTempPathA(long ptr) GetTempPath32A
|
0292 stdcall GetTempPathA(long ptr) GetTempPath32A
|
||||||
0293 stdcall GetTempPathW(long ptr) GetTempPath32W
|
0293 stdcall GetTempPathW(long ptr) GetTempPath32W
|
||||||
0294 stdcall GetThreadContext(long ptr) GetThreadContext
|
0294 stdcall GetThreadContext(long ptr) GetThreadContext
|
||||||
0295 stub GetThreadLocale
|
0295 stdcall GetThreadLocale() GetThreadLocale
|
||||||
0296 stub GetThreadPriority
|
0296 stdcall GetThreadPriority(long) GetThreadPriority
|
||||||
0297 stub GetThreadSelectorEntry
|
0297 stub GetThreadSelectorEntry
|
||||||
0298 stub GetThreadTimes
|
0298 stub GetThreadTimes
|
||||||
0299 stdcall GetTickCount() GetTickCount
|
0299 stdcall GetTickCount() GetTickCount
|
||||||
|
@ -360,8 +360,8 @@ base 1
|
||||||
0355 stub IsBadStringPtrA
|
0355 stub IsBadStringPtrA
|
||||||
0356 stub IsBadStringPtrW
|
0356 stub IsBadStringPtrW
|
||||||
0357 stdcall IsBadWritePtr(ptr long) WIN32_IsBadWritePtr
|
0357 stdcall IsBadWritePtr(ptr long) WIN32_IsBadWritePtr
|
||||||
0358 return IsDBCSLeadByte 4 0
|
0358 stdcall IsDBCSLeadByte(long) IsDBCSLeadByte32
|
||||||
0359 stub IsDBCSLeadByteEx
|
0359 stdcall IsDBCSLeadByteEx(long long) IsDBCSLeadByteEx
|
||||||
0360 stub IsValidCodePage
|
0360 stub IsValidCodePage
|
||||||
0361 stdcall IsValidLocale(long long) IsValidLocale
|
0361 stdcall IsValidLocale(long long) IsValidLocale
|
||||||
0362 stub LCMapStringA
|
0362 stub LCMapStringA
|
||||||
|
@ -415,8 +415,8 @@ base 1
|
||||||
0410 stub PrepareTape
|
0410 stub PrepareTape
|
||||||
0411 stub PulseEvent
|
0411 stub PulseEvent
|
||||||
0412 stub PurgeComm
|
0412 stub PurgeComm
|
||||||
0413 stub QueryDosDeviceA
|
0413 stdcall QueryDosDeviceA(ptr ptr long) QueryDosDevice32A
|
||||||
0414 stub QueryDosDeviceW
|
0414 stdcall QueryDosDeviceW(ptr ptr long) QueryDosDevice32W
|
||||||
0415 stdcall QueryPerformanceCounter(ptr) QueryPerformanceCounter
|
0415 stdcall QueryPerformanceCounter(ptr) QueryPerformanceCounter
|
||||||
0416 stub QueryPerformanceFrequency
|
0416 stub QueryPerformanceFrequency
|
||||||
0417 stub QueryWin31IniFilesMappedToRegistry
|
0417 stub QueryWin31IniFilesMappedToRegistry
|
||||||
|
@ -505,20 +505,20 @@ base 1
|
||||||
0500 stub SetLocaleInfoW
|
0500 stub SetLocaleInfoW
|
||||||
0501 stub SetMailslotInfo
|
0501 stub SetMailslotInfo
|
||||||
0502 stub SetNamedPipeHandleState
|
0502 stub SetNamedPipeHandleState
|
||||||
0503 stub SetPriorityClass
|
0503 stdcall SetPriorityClass(long long) SetPriorityClass
|
||||||
0504 stub SetProcessShutdownParameters
|
0504 stub SetProcessShutdownParameters
|
||||||
0505 stub SetProcessWorkingSetSize
|
0505 stub SetProcessWorkingSetSize
|
||||||
0506 stub SetStdHandle
|
0506 stdcall SetStdHandle(long long) SetStdHandle
|
||||||
0507 stdcall SetSystemTime(ptr) SetSystemTime
|
0507 stdcall SetSystemTime(ptr) SetSystemTime
|
||||||
0508 stub SetSystemTimeAdjustment
|
0508 stub SetSystemTimeAdjustment
|
||||||
0509 stub SetTapeParameters
|
0509 stub SetTapeParameters
|
||||||
0510 stub SetTapePosition
|
0510 stub SetTapePosition
|
||||||
0511 stdcall SetThreadAffinityMask(long long) SetThreadAffinityMask
|
0511 stdcall SetThreadAffinityMask(long long) SetThreadAffinityMask
|
||||||
0512 stub SetThreadContext
|
0512 stub SetThreadContext
|
||||||
0513 stub SetThreadLocale
|
0513 stub SetThreadLocale
|
||||||
0514 stub SetThreadPriority
|
0514 stdcall SetThreadPriority(long long) SetThreadPriority
|
||||||
0515 stdcall SetTimeZoneInformation(ptr) SetTimeZoneInformation
|
0515 stdcall SetTimeZoneInformation(ptr) SetTimeZoneInformation
|
||||||
0516 stdcall SetUnhandledExceptionFilter(ptr) SetUnhandledExceptionFilter
|
0516 stdcall SetUnhandledExceptionFilter(ptr) SetUnhandledExceptionFilter
|
||||||
0517 stub SetVDMCurrentDirectories
|
0517 stub SetVDMCurrentDirectories
|
||||||
0518 stub SetVolumeLabelA
|
0518 stub SetVolumeLabelA
|
||||||
0519 stub SetVolumeLabelW
|
0519 stub SetVolumeLabelW
|
||||||
|
|
|
@ -267,7 +267,7 @@ base 0
|
||||||
263 stub RtlAddAuditAccessAce
|
263 stub RtlAddAuditAccessAce
|
||||||
264 stub RtlAdjustPrivilege
|
264 stub RtlAdjustPrivilege
|
||||||
265 stub RtlAllocateAndInitializeSid
|
265 stub RtlAllocateAndInitializeSid
|
||||||
266 stub RtlAllocateHeap
|
266 stdcall RtlAllocateHeap(long long long) HeapAlloc
|
||||||
267 stub RtlAnsiCharToUnicodeChar
|
267 stub RtlAnsiCharToUnicodeChar
|
||||||
268 stub RtlAnsiStringToUnicodeSize
|
268 stub RtlAnsiStringToUnicodeSize
|
||||||
269 stub RtlAnsiStringToUnicodeString
|
269 stub RtlAnsiStringToUnicodeString
|
||||||
|
@ -310,7 +310,7 @@ base 0
|
||||||
306 stub RtlCreateAcl
|
306 stub RtlCreateAcl
|
||||||
307 stub RtlCreateAndSetSD
|
307 stub RtlCreateAndSetSD
|
||||||
308 stub RtlCreateEnvironment
|
308 stub RtlCreateEnvironment
|
||||||
309 stub RtlCreateHeap
|
309 stdcall RtlCreateHeap(long long long) HeapCreate
|
||||||
310 stub RtlCreateProcessParameters
|
310 stub RtlCreateProcessParameters
|
||||||
311 stub RtlCreateQueryDebugBuffer
|
311 stub RtlCreateQueryDebugBuffer
|
||||||
312 stub RtlCreateRegistryKey
|
312 stub RtlCreateRegistryKey
|
||||||
|
@ -375,7 +375,7 @@ base 0
|
||||||
371 stub RtlFormatCurrentUserKeyPath
|
371 stub RtlFormatCurrentUserKeyPath
|
||||||
372 stub RtlFormatMessage
|
372 stub RtlFormatMessage
|
||||||
373 stub RtlFreeAnsiString
|
373 stub RtlFreeAnsiString
|
||||||
374 stub RtlFreeHeap
|
374 stdcall RtlFreeHeap(long long long) HeapFree
|
||||||
375 stub RtlFreeOemString
|
375 stub RtlFreeOemString
|
||||||
376 stub RtlFreeSid
|
376 stub RtlFreeSid
|
||||||
377 stub RtlFreeUnicodeString
|
377 stub RtlFreeUnicodeString
|
||||||
|
@ -494,7 +494,7 @@ base 0
|
||||||
490 stub RtlSetTimeZoneInformation
|
490 stub RtlSetTimeZoneInformation
|
||||||
491 stub RtlSetUserFlagsHeap
|
491 stub RtlSetUserFlagsHeap
|
||||||
492 stub RtlSetUserValueHeap
|
492 stub RtlSetUserValueHeap
|
||||||
493 stub RtlSizeHeap
|
493 stdcall RtlSizeHeap(long long long) HeapSize
|
||||||
494 stub RtlSplay
|
494 stub RtlSplay
|
||||||
495 stub RtlStartRXact
|
495 stub RtlStartRXact
|
||||||
496 stdcall RtlSubAuthorityCountSid(ptr) RtlSubAuthorityCountSid
|
496 stdcall RtlSubAuthorityCountSid(ptr) RtlSubAuthorityCountSid
|
||||||
|
@ -880,7 +880,7 @@ base 0
|
||||||
876 stub _strupr
|
876 stub _strupr
|
||||||
877 stub _ultoa
|
877 stub _ultoa
|
||||||
878 stub _vsnprintf
|
878 stub _vsnprintf
|
||||||
879 stub _wcsicmp
|
879 stdcall _wcsicmp(ptr ptr) lstrcmpi32W
|
||||||
880 stub _wcslwr
|
880 stub _wcslwr
|
||||||
881 stub _wcsnicmp
|
881 stub _wcsnicmp
|
||||||
882 stub _wcsupr
|
882 stub _wcsupr
|
||||||
|
|
|
@ -186,9 +186,8 @@ void RELAY_Unimplemented32( int nb_args, void *relay_addr,
|
||||||
* 'stack' points to the called function address on the 32-bit stack.
|
* 'stack' points to the called function address on the 32-bit stack.
|
||||||
* Stack layout:
|
* Stack layout:
|
||||||
* ... ...
|
* ... ...
|
||||||
* (stack+12) arg2
|
* (stack+8) arg2
|
||||||
* (stack+8) arg1
|
* (stack+4) arg1
|
||||||
* (stack+4) 16-bit ds
|
|
||||||
* (stack) func to call
|
* (stack) func to call
|
||||||
*/
|
*/
|
||||||
void RELAY_DebugCallTo16( int* stack, int nbargs )
|
void RELAY_DebugCallTo16( int* stack, int nbargs )
|
||||||
|
@ -196,8 +195,8 @@ void RELAY_DebugCallTo16( int* stack, int nbargs )
|
||||||
if (!debugging_relay) return;
|
if (!debugging_relay) return;
|
||||||
|
|
||||||
printf( "CallTo16(func=%04x:%04x,ds=%04x",
|
printf( "CallTo16(func=%04x:%04x,ds=%04x",
|
||||||
HIWORD(stack[0]), LOWORD(stack[0]), LOWORD(stack[1]) );
|
HIWORD(stack[0]), LOWORD(stack[0]), CURRENT_DS );
|
||||||
stack += 2;
|
stack++;
|
||||||
while (nbargs--) printf( ",0x%04x", *stack++ );
|
while (nbargs--) printf( ",0x%04x", *stack++ );
|
||||||
printf( ")\n" );
|
printf( ")\n" );
|
||||||
}
|
}
|
||||||
|
|
|
@ -148,20 +148,20 @@ heap 65520
|
||||||
146 pascal16 GetClipboardFormatName(word ptr s_word) GetClipboardFormatName
|
146 pascal16 GetClipboardFormatName(word ptr s_word) GetClipboardFormatName
|
||||||
147 pascal16 SetClipboardViewer(word) SetClipboardViewer
|
147 pascal16 SetClipboardViewer(word) SetClipboardViewer
|
||||||
148 pascal16 GetClipboardViewer() GetClipboardViewer
|
148 pascal16 GetClipboardViewer() GetClipboardViewer
|
||||||
149 pascal16 ChangeClipboardChain(word ptr) ChangeClipboardChain
|
149 pascal16 ChangeClipboardChain(word ptr) ChangeClipboardChain16
|
||||||
150 pascal16 LoadMenu(word segptr) LoadMenu16
|
150 pascal16 LoadMenu(word segptr) LoadMenu16
|
||||||
151 pascal16 CreateMenu() CreateMenu
|
151 pascal16 CreateMenu() CreateMenu16
|
||||||
152 pascal16 DestroyMenu(word) DestroyMenu
|
152 pascal16 DestroyMenu(word) DestroyMenu16
|
||||||
153 pascal16 ChangeMenu(word word segptr word word) ChangeMenu16
|
153 pascal16 ChangeMenu(word word segptr word word) ChangeMenu16
|
||||||
154 pascal16 CheckMenuItem(word word word) CheckMenuItem
|
154 pascal16 CheckMenuItem(word word word) CheckMenuItem16
|
||||||
155 pascal16 EnableMenuItem(word word word) EnableMenuItem
|
155 pascal16 EnableMenuItem(word word word) EnableMenuItem16
|
||||||
156 pascal16 GetSystemMenu(word word) GetSystemMenu
|
156 pascal16 GetSystemMenu(word word) GetSystemMenu16
|
||||||
157 pascal16 GetMenu(word) GetMenu
|
157 pascal16 GetMenu(word) GetMenu16
|
||||||
158 pascal16 SetMenu(word word) SetMenu
|
158 pascal16 SetMenu(word word) SetMenu16
|
||||||
159 pascal16 GetSubMenu(word word) GetSubMenu
|
159 pascal16 GetSubMenu(word word) GetSubMenu16
|
||||||
160 pascal16 DrawMenuBar(word) DrawMenuBar
|
160 pascal16 DrawMenuBar(word) DrawMenuBar16
|
||||||
161 pascal16 GetMenuString(word word ptr s_word word) GetMenuString
|
161 pascal16 GetMenuString(word word ptr s_word word) GetMenuString16
|
||||||
162 pascal16 HiliteMenuItem(word word word word) HiliteMenuItem
|
162 pascal16 HiliteMenuItem(word word word word) HiliteMenuItem16
|
||||||
163 pascal16 CreateCaret(word word word word) CreateCaret
|
163 pascal16 CreateCaret(word word word word) CreateCaret
|
||||||
164 pascal16 DestroyCaret() DestroyCaret
|
164 pascal16 DestroyCaret() DestroyCaret
|
||||||
165 pascal16 SetCaretPos(word word) SetCaretPos
|
165 pascal16 SetCaretPos(word word) SetCaretPos
|
||||||
|
@ -252,7 +252,7 @@ heap 65520
|
||||||
247 pascal16 GetCursor() GetCursor
|
247 pascal16 GetCursor() GetCursor
|
||||||
248 pascal16 GetOpenClipboardWindow() GetOpenClipboardWindow
|
248 pascal16 GetOpenClipboardWindow() GetOpenClipboardWindow
|
||||||
249 pascal16 GetAsyncKeyState(word) GetAsyncKeyState
|
249 pascal16 GetAsyncKeyState(word) GetAsyncKeyState
|
||||||
250 pascal16 GetMenuState(word word word) GetMenuState
|
250 pascal16 GetMenuState(word word word) GetMenuState16
|
||||||
251 pascal SendDriverMessage(word word long long) SendDriverMessage
|
251 pascal SendDriverMessage(word word long long) SendDriverMessage
|
||||||
252 pascal16 OpenDriver(ptr ptr long) OpenDriver
|
252 pascal16 OpenDriver(ptr ptr long) OpenDriver
|
||||||
253 pascal CloseDriver(word long long) CloseDriver
|
253 pascal CloseDriver(word long long) CloseDriver
|
||||||
|
@ -266,8 +266,8 @@ heap 65520
|
||||||
DeferWindowPos
|
DeferWindowPos
|
||||||
261 pascal16 EndDeferWindowPos(word) EndDeferWindowPos
|
261 pascal16 EndDeferWindowPos(word) EndDeferWindowPos
|
||||||
262 pascal16 GetWindow(word word) GetWindow
|
262 pascal16 GetWindow(word word) GetWindow
|
||||||
263 pascal16 GetMenuItemCount(word) GetMenuItemCount
|
263 pascal16 GetMenuItemCount(word) GetMenuItemCount16
|
||||||
264 pascal16 GetMenuItemID(word word) GetMenuItemID
|
264 pascal16 GetMenuItemID(word word) GetMenuItemID16
|
||||||
265 pascal16 ShowOwnedPopups(word word) ShowOwnedPopups
|
265 pascal16 ShowOwnedPopups(word word) ShowOwnedPopups
|
||||||
266 pascal16 SetMessageQueue(word) SetMessageQueue
|
266 pascal16 SetMessageQueue(word) SetMessageQueue
|
||||||
267 pascal16 ShowScrollBar(word word word) ShowScrollBar16
|
267 pascal16 ShowScrollBar(word word word) ShowScrollBar16
|
||||||
|
@ -283,7 +283,7 @@ heap 65520
|
||||||
277 pascal16 GetDlgCtrlID(word) GetDlgCtrlID
|
277 pascal16 GetDlgCtrlID(word) GetDlgCtrlID
|
||||||
278 pascal16 GetDesktopHwnd() GetDesktopHwnd
|
278 pascal16 GetDesktopHwnd() GetDesktopHwnd
|
||||||
279 stub OldSetDeskPattern
|
279 stub OldSetDeskPattern
|
||||||
280 stub SetSystemMenu
|
280 pascal16 SetSystemMenu(word word) SetSystemMenu16
|
||||||
281 pascal16 GetSysColorBrush(word) GetSysColorBrush16
|
281 pascal16 GetSysColorBrush(word) GetSysColorBrush16
|
||||||
282 pascal16 SelectPalette(word word word) SelectPalette
|
282 pascal16 SelectPalette(word word word) SelectPalette
|
||||||
283 pascal16 RealizePalette(word) RealizePalette
|
283 pascal16 RealizePalette(word) RealizePalette
|
||||||
|
@ -324,7 +324,7 @@ heap 65520
|
||||||
343 stub GetFilePortName
|
343 stub GetFilePortName
|
||||||
356 stub LoadDIBCursorHandler
|
356 stub LoadDIBCursorHandler
|
||||||
357 stub LoadDIBIconHandler
|
357 stub LoadDIBIconHandler
|
||||||
358 pascal16 IsMenu(word) IsMenu
|
358 pascal16 IsMenu(word) IsMenu16
|
||||||
359 pascal16 GetDCEx(word word long) GetDCEx16
|
359 pascal16 GetDCEx(word word long) GetDCEx16
|
||||||
362 pascal16 DCHook(word word long long) DCHook
|
362 pascal16 DCHook(word word long long) DCHook
|
||||||
364 stub LookupIconIDFromDirectoryEx
|
364 stub LookupIconIDFromDirectoryEx
|
||||||
|
@ -364,13 +364,13 @@ heap 65520
|
||||||
409 stub InitThreadInput
|
409 stub InitThreadInput
|
||||||
410 pascal16 InsertMenu(word word word word segptr) InsertMenu16
|
410 pascal16 InsertMenu(word word word word segptr) InsertMenu16
|
||||||
411 pascal16 AppendMenu(word word word segptr) AppendMenu16
|
411 pascal16 AppendMenu(word word word segptr) AppendMenu16
|
||||||
412 pascal16 RemoveMenu(word word word) RemoveMenu
|
412 pascal16 RemoveMenu(word word word) RemoveMenu16
|
||||||
413 pascal16 DeleteMenu(word word word) DeleteMenu
|
413 pascal16 DeleteMenu(word word word) DeleteMenu16
|
||||||
414 pascal16 ModifyMenu(word word word word segptr) ModifyMenu16
|
414 pascal16 ModifyMenu(word word word word segptr) ModifyMenu16
|
||||||
415 pascal16 CreatePopupMenu() CreatePopupMenu
|
415 pascal16 CreatePopupMenu() CreatePopupMenu16
|
||||||
416 pascal16 TrackPopupMenu(word word s_word s_word s_word word ptr) TrackPopupMenu16
|
416 pascal16 TrackPopupMenu(word word s_word s_word s_word word ptr) TrackPopupMenu16
|
||||||
417 pascal GetMenuCheckMarkDimensions() GetMenuCheckMarkDimensions
|
417 pascal GetMenuCheckMarkDimensions() GetMenuCheckMarkDimensions
|
||||||
418 pascal16 SetMenuItemBitmaps(word word word word word) SetMenuItemBitmaps
|
418 pascal16 SetMenuItemBitmaps(word word word word word) SetMenuItemBitmaps16
|
||||||
420 pascal16 wsprintf() WIN16_wsprintf16
|
420 pascal16 wsprintf() WIN16_wsprintf16
|
||||||
421 pascal16 wvsprintf(ptr ptr ptr) wvsprintf16
|
421 pascal16 wvsprintf(ptr ptr ptr) wvsprintf16
|
||||||
422 pascal16 DlgDirSelectEx(word ptr word word) DlgDirSelectEx16
|
422 pascal16 DlgDirSelectEx(word ptr word word) DlgDirSelectEx16
|
||||||
|
@ -379,14 +379,14 @@ heap 65520
|
||||||
428 stub TileWindows
|
428 stub TileWindows
|
||||||
429 stub CascadeWindows
|
429 stub CascadeWindows
|
||||||
430 pascal16 lstrcmp(ptr ptr) lstrcmp16
|
430 pascal16 lstrcmp(ptr ptr) lstrcmp16
|
||||||
431 pascal AnsiUpper(segptr) WIN16_AnsiUpper
|
431 pascal AnsiUpper(segptr) AnsiUpper16
|
||||||
432 pascal AnsiLower(segptr) WIN16_AnsiLower
|
432 pascal AnsiLower(segptr) AnsiLower16
|
||||||
433 pascal16 IsCharAlpha(byte) IsCharAlpha16
|
433 pascal16 IsCharAlpha(byte) IsCharAlpha16
|
||||||
434 pascal16 IsCharAlphanumeric(byte) IsCharAlphanumeric16
|
434 pascal16 IsCharAlphanumeric(byte) IsCharAlphanumeric16
|
||||||
435 pascal16 IsCharUpper(byte) IsCharUpper16
|
435 pascal16 IsCharUpper(byte) IsCharUpper16
|
||||||
436 pascal16 IsCharLower(byte) IsCharLower16
|
436 pascal16 IsCharLower(byte) IsCharLower16
|
||||||
437 pascal16 AnsiUpperBuff(ptr word) AnsiUpperBuff
|
437 pascal16 AnsiUpperBuff(ptr word) AnsiUpperBuff16
|
||||||
438 pascal16 AnsiLowerBuff(ptr word) AnsiLowerBuff
|
438 pascal16 AnsiLowerBuff(ptr word) AnsiLowerBuff16
|
||||||
441 stub InsertMenuItem
|
441 stub InsertMenuItem
|
||||||
443 stub GetMenuItemInfo
|
443 stub GetMenuItemInfo
|
||||||
445 pascal DefFrameProc(word word word word long) DefFrameProc16
|
445 pascal DefFrameProc(word word word word long) DefFrameProc16
|
||||||
|
@ -413,8 +413,8 @@ heap 65520
|
||||||
466 pascal16 DrawFocusRect(word ptr) DrawFocusRect16
|
466 pascal16 DrawFocusRect(word ptr) DrawFocusRect16
|
||||||
470 stub StringFunc
|
470 stub StringFunc
|
||||||
471 pascal16 lstrcmpi(ptr ptr) lstrcmpi16
|
471 pascal16 lstrcmpi(ptr ptr) lstrcmpi16
|
||||||
472 pascal AnsiNext(segptr) AnsiNext
|
472 pascal AnsiNext(segptr) AnsiNext16
|
||||||
473 pascal AnsiPrev(segptr segptr) AnsiPrev
|
473 pascal AnsiPrev(segptr segptr) AnsiPrev16
|
||||||
475 pascal16 SetScrollInfo(word s_word ptr word) SetScrollInfo16
|
475 pascal16 SetScrollInfo(word s_word ptr word) SetScrollInfo16
|
||||||
476 pascal16 GetScrollInfo(word s_word ptr) GetScrollInfo16
|
476 pascal16 GetScrollInfo(word s_word ptr) GetScrollInfo16
|
||||||
477 stub GetKeyboardLayoutName
|
477 stub GetKeyboardLayoutName
|
||||||
|
|
|
@ -23,7 +23,7 @@ base 1
|
||||||
0018 stdcall CallWindowProcW(ptr long long long long) CallWindowProc32W
|
0018 stdcall CallWindowProcW(ptr long long long long) CallWindowProc32W
|
||||||
0019 stub CascadeChildWindows
|
0019 stub CascadeChildWindows
|
||||||
0020 stub CascadeWindows
|
0020 stub CascadeWindows
|
||||||
0021 stub ChangeClipboardChain
|
0021 stdcall ChangeClipboardChain(long long) ChangeClipboardChain32
|
||||||
0022 stdcall ChangeMenuA(long long ptr long long) ChangeMenu32A
|
0022 stdcall ChangeMenuA(long long ptr long long) ChangeMenu32A
|
||||||
0023 stdcall ChangeMenuW(long long ptr long long) ChangeMenu32W
|
0023 stdcall ChangeMenuW(long long ptr long long) ChangeMenu32W
|
||||||
0024 stdcall CharLowerA(ptr) CharLower32A
|
0024 stdcall CharLowerA(ptr) CharLower32A
|
||||||
|
@ -47,7 +47,7 @@ base 1
|
||||||
0042 stdcall CharUpperBuffW(ptr long) CharUpperBuff32W
|
0042 stdcall CharUpperBuffW(ptr long) CharUpperBuff32W
|
||||||
0043 stdcall CharUpperW(ptr) CharUpper32W
|
0043 stdcall CharUpperW(ptr) CharUpper32W
|
||||||
0044 stdcall CheckDlgButton(long long long) CheckDlgButton
|
0044 stdcall CheckDlgButton(long long long) CheckDlgButton
|
||||||
0045 stdcall CheckMenuItem(long long long) CheckMenuItem
|
0045 stdcall CheckMenuItem(long long long) CheckMenuItem32
|
||||||
0046 stub CheckMenuRadioItem
|
0046 stub CheckMenuRadioItem
|
||||||
0047 stdcall CheckRadioButton(long long long long) CheckRadioButton
|
0047 stdcall CheckRadioButton(long long long long) CheckRadioButton
|
||||||
0048 stdcall ChildWindowFromPoint(long long long) ChildWindowFromPoint32
|
0048 stdcall ChildWindowFromPoint(long long long) ChildWindowFromPoint32
|
||||||
|
@ -82,8 +82,8 @@ base 1
|
||||||
0077 stub CreateIconIndirect
|
0077 stub CreateIconIndirect
|
||||||
0078 stub CreateMDIWindowA
|
0078 stub CreateMDIWindowA
|
||||||
0079 stub CreateMDIWindowW
|
0079 stub CreateMDIWindowW
|
||||||
0080 stdcall CreateMenu() CreateMenu
|
0080 stdcall CreateMenu() CreateMenu32
|
||||||
0081 stdcall CreatePopupMenu() CreatePopupMenu
|
0081 stdcall CreatePopupMenu() CreatePopupMenu32
|
||||||
0082 stdcall CreateWindowExA(long ptr ptr long long long long long
|
0082 stdcall CreateWindowExA(long ptr ptr long long long long long
|
||||||
long long long ptr) CreateWindowEx32A
|
long long long ptr) CreateWindowEx32A
|
||||||
0083 stdcall CreateWindowExW(long ptr ptr long long long long long
|
0083 stdcall CreateWindowExW(long ptr ptr long long long long long
|
||||||
|
@ -132,12 +132,12 @@ base 1
|
||||||
0125 stdcall DefWindowProcA(long long long long) DefWindowProc32A
|
0125 stdcall DefWindowProcA(long long long long) DefWindowProc32A
|
||||||
0126 stdcall DefWindowProcW(long long long long) DefWindowProc32W
|
0126 stdcall DefWindowProcW(long long long long) DefWindowProc32W
|
||||||
0127 stdcall DeferWindowPos(long long long long long long long long) DeferWindowPos
|
0127 stdcall DeferWindowPos(long long long long long long long long) DeferWindowPos
|
||||||
0128 stdcall DeleteMenu(long long long) DeleteMenu
|
0128 stdcall DeleteMenu(long long long) DeleteMenu32
|
||||||
0129 stub DestroyAcceleratorTable
|
0129 stub DestroyAcceleratorTable
|
||||||
0130 stdcall DestroyCaret() DestroyCaret
|
0130 stdcall DestroyCaret() DestroyCaret
|
||||||
0131 stub DestroyCursor
|
0131 stub DestroyCursor
|
||||||
0132 stub DestroyIcon
|
0132 stub DestroyIcon
|
||||||
0133 stdcall DestroyMenu(long) DestroyMenu
|
0133 stdcall DestroyMenu(long) DestroyMenu32
|
||||||
0134 stdcall DestroyWindow(long) DestroyWindow
|
0134 stdcall DestroyWindow(long) DestroyWindow
|
||||||
0135 stdcall DialogBoxIndirectParamA(long ptr long ptr long) DialogBoxIndirectParam32A
|
0135 stdcall DialogBoxIndirectParamA(long ptr long ptr long) DialogBoxIndirectParam32A
|
||||||
0136 stub DialogBoxIndirectParamAorW
|
0136 stub DialogBoxIndirectParamAorW
|
||||||
|
@ -164,7 +164,7 @@ base 1
|
||||||
0157 stdcall DrawFrameControl(long ptr long long) DrawFrameControl32
|
0157 stdcall DrawFrameControl(long ptr long long) DrawFrameControl32
|
||||||
0158 stdcall DrawIcon(long long long long) DrawIcon
|
0158 stdcall DrawIcon(long long long long) DrawIcon
|
||||||
0159 stub DrawIconEx
|
0159 stub DrawIconEx
|
||||||
0160 stdcall DrawMenuBar(long) DrawMenuBar
|
0160 stdcall DrawMenuBar(long) DrawMenuBar32
|
||||||
0161 stub DrawStateA
|
0161 stub DrawStateA
|
||||||
0162 stub DrawStateW
|
0162 stub DrawStateW
|
||||||
0163 stdcall DrawTextA(long ptr long ptr long) DrawText32A
|
0163 stdcall DrawTextA(long ptr long ptr long) DrawText32A
|
||||||
|
@ -172,13 +172,13 @@ base 1
|
||||||
0165 stub DrawTextExW
|
0165 stub DrawTextExW
|
||||||
0166 stdcall DrawTextW(long ptr long ptr long) DrawText32W
|
0166 stdcall DrawTextW(long ptr long ptr long) DrawText32W
|
||||||
0167 stub EditWndProc
|
0167 stub EditWndProc
|
||||||
0168 stdcall EmptyClipboard() EmptyClipboard
|
0168 stdcall EmptyClipboard() EmptyClipboard
|
||||||
0169 stdcall EnableMenuItem(long long long) EnableMenuItem
|
0169 stdcall EnableMenuItem(long long long) EnableMenuItem32
|
||||||
0170 stdcall EnableScrollBar(long long long) EnableScrollBar32
|
0170 stdcall EnableScrollBar(long long long) EnableScrollBar32
|
||||||
0171 stdcall EnableWindow(long long) EnableWindow
|
0171 stdcall EnableWindow(long long) EnableWindow
|
||||||
0172 stdcall EndDeferWindowPos(long) EndDeferWindowPos
|
0172 stdcall EndDeferWindowPos(long) EndDeferWindowPos
|
||||||
0173 stdcall EndDialog(long long) EndDialog
|
0173 stdcall EndDialog(long long) EndDialog
|
||||||
0174 stub EndMenu
|
0174 stdcall EndMenu() EndMenu
|
||||||
0175 stdcall EndPaint(long ptr) EndPaint32
|
0175 stdcall EndPaint(long ptr) EndPaint32
|
||||||
0176 stub EndTask
|
0176 stub EndTask
|
||||||
0177 stdcall EnumChildWindows(long ptr long) THUNK_EnumChildWindows32
|
0177 stdcall EnumChildWindows(long ptr long) THUNK_EnumChildWindows32
|
||||||
|
@ -260,19 +260,19 @@ base 1
|
||||||
0253 stub GetKeyboardState
|
0253 stub GetKeyboardState
|
||||||
0254 stub GetKeyboardType
|
0254 stub GetKeyboardType
|
||||||
0255 stub GetLastActivePopup
|
0255 stub GetLastActivePopup
|
||||||
0256 stdcall GetMenu(long) GetMenu
|
0256 stdcall GetMenu(long) GetMenu32
|
||||||
0257 stub GetMenuCheckMarkDimensions
|
0257 stdcall GetMenuCheckMarkDimensions() GetMenuCheckMarkDimensions
|
||||||
0258 stub GetMenuContextHelpId
|
0258 stub GetMenuContextHelpId
|
||||||
0259 stub GetMenuDefaultItem
|
0259 stub GetMenuDefaultItem
|
||||||
0260 stub GetMenuIndex
|
0260 stub GetMenuIndex
|
||||||
0261 stdcall GetMenuItemCount(long) GetMenuItemCount
|
0261 stdcall GetMenuItemCount(long) GetMenuItemCount32
|
||||||
0262 stdcall GetMenuItemID(long long) GetMenuItemID
|
0262 stdcall GetMenuItemID(long long) GetMenuItemID32
|
||||||
0263 stub GetMenuItemInfoA
|
0263 stub GetMenuItemInfoA
|
||||||
0264 stub GetMenuItemInfoW
|
0264 stub GetMenuItemInfoW
|
||||||
0265 stub GetMenuItemRect
|
0265 stub GetMenuItemRect
|
||||||
0266 stdcall GetMenuState(long long long) GetMenuState
|
0266 stdcall GetMenuState(long long long) GetMenuState32
|
||||||
0267 stdcall GetMenuStringA(long long ptr long long) GetMenuString
|
0267 stdcall GetMenuStringA(long long ptr long long) GetMenuString32A
|
||||||
0268 stub GetMenuStringW
|
0268 stdcall GetMenuStringW(long long ptr long long) GetMenuString32W
|
||||||
0269 stdcall GetMessageA(ptr long long long) USER32_GetMessageA
|
0269 stdcall GetMessageA(ptr long long long) USER32_GetMessageA
|
||||||
0270 stub GetMessageExtraInfo
|
0270 stub GetMessageExtraInfo
|
||||||
0271 stub GetMessagePos
|
0271 stub GetMessagePos
|
||||||
|
@ -291,10 +291,10 @@ base 1
|
||||||
0284 stdcall GetScrollPos(long long) GetScrollPos32
|
0284 stdcall GetScrollPos(long long) GetScrollPos32
|
||||||
0285 stdcall GetScrollRange(long long ptr ptr) GetScrollRange32
|
0285 stdcall GetScrollRange(long long ptr ptr) GetScrollRange32
|
||||||
0286 return GetShellWindow 0 0
|
0286 return GetShellWindow 0 0
|
||||||
0287 stdcall GetSubMenu(long long) GetSubMenu
|
0287 stdcall GetSubMenu(long long) GetSubMenu32
|
||||||
0288 stdcall GetSysColor(long) GetSysColor
|
0288 stdcall GetSysColor(long) GetSysColor
|
||||||
0289 stdcall GetSysColorBrush(long) GetSysColorBrush32
|
0289 stdcall GetSysColorBrush(long) GetSysColorBrush32
|
||||||
0290 stdcall GetSystemMenu(long long) GetSystemMenu
|
0290 stdcall GetSystemMenu(long long) GetSystemMenu32
|
||||||
0291 stdcall GetSystemMetrics(long) GetSystemMetrics
|
0291 stdcall GetSystemMetrics(long) GetSystemMetrics
|
||||||
0292 stdcall GetTabbedTextExtentA(long ptr long long ptr) GetTabbedTextExtent
|
0292 stdcall GetTabbedTextExtentA(long ptr long long ptr) GetTabbedTextExtent
|
||||||
0293 stub GetTabbedTextExtentW
|
0293 stub GetTabbedTextExtentW
|
||||||
|
@ -321,7 +321,7 @@ base 1
|
||||||
0314 stub GrayStringA
|
0314 stub GrayStringA
|
||||||
0315 stub GrayStringW
|
0315 stub GrayStringW
|
||||||
0316 stdcall HideCaret(long) HideCaret
|
0316 stdcall HideCaret(long) HideCaret
|
||||||
0317 stub HiliteMenuItem
|
0317 stdcall HiliteMenuItem(long long long long) HiliteMenuItem32
|
||||||
0318 stub ImpersonateDdeClientWindow
|
0318 stub ImpersonateDdeClientWindow
|
||||||
0319 stub InSendMessage
|
0319 stub InSendMessage
|
||||||
0320 stdcall InflateRect(ptr long long) InflateRect32
|
0320 stdcall InflateRect(ptr long long) InflateRect32
|
||||||
|
@ -349,7 +349,7 @@ base 1
|
||||||
0342 stub IsDialogMessageW
|
0342 stub IsDialogMessageW
|
||||||
0343 stdcall IsDlgButtonChecked(long long) IsDlgButtonChecked
|
0343 stdcall IsDlgButtonChecked(long long) IsDlgButtonChecked
|
||||||
0344 stdcall IsIconic(long) IsIconic
|
0344 stdcall IsIconic(long) IsIconic
|
||||||
0345 stdcall IsMenu(long) IsMenu
|
0345 stdcall IsMenu(long) IsMenu32
|
||||||
0346 stdcall IsRectEmpty(ptr) IsRectEmpty32
|
0346 stdcall IsRectEmpty(ptr) IsRectEmpty32
|
||||||
0347 stdcall IsWindow(long) IsWindow
|
0347 stdcall IsWindow(long) IsWindow
|
||||||
0348 stdcall IsWindowEnabled(long) IsWindowEnabled
|
0348 stdcall IsWindowEnabled(long) IsWindowEnabled
|
||||||
|
@ -444,7 +444,7 @@ base 1
|
||||||
0437 stdcall RegisterWindowMessageW(ptr) RegisterWindowMessage32W
|
0437 stdcall RegisterWindowMessageW(ptr) RegisterWindowMessage32W
|
||||||
0438 stdcall ReleaseCapture() ReleaseCapture
|
0438 stdcall ReleaseCapture() ReleaseCapture
|
||||||
0439 stdcall ReleaseDC(long long) ReleaseDC32
|
0439 stdcall ReleaseDC(long long) ReleaseDC32
|
||||||
0440 stdcall RemoveMenu(long long long) RemoveMenu
|
0440 stdcall RemoveMenu(long long long) RemoveMenu32
|
||||||
0441 stdcall RemovePropA(long ptr) RemoveProp32A
|
0441 stdcall RemovePropA(long ptr) RemoveProp32A
|
||||||
0442 stdcall RemovePropW(long ptr) RemoveProp32W
|
0442 stdcall RemovePropW(long ptr) RemoveProp32W
|
||||||
0443 stub ReplyMessage
|
0443 stub ReplyMessage
|
||||||
|
@ -490,10 +490,10 @@ base 1
|
||||||
0483 stub SetKeyboardState
|
0483 stub SetKeyboardState
|
||||||
0484 stdcall SetLastErrorEx(long long) SetLastErrorEx
|
0484 stdcall SetLastErrorEx(long long) SetLastErrorEx
|
||||||
0485 stub SetLogonNotifyWindow
|
0485 stub SetLogonNotifyWindow
|
||||||
0486 stdcall SetMenu(long long) SetMenu
|
0486 stdcall SetMenu(long long) SetMenu32
|
||||||
0487 stub SetMenuContextHelpId
|
0487 stub SetMenuContextHelpId
|
||||||
0488 stub SetMenuDefaultItem
|
0488 stub SetMenuDefaultItem
|
||||||
0489 stub SetMenuItemBitmaps
|
0489 stdcall SetMenuItemBitmaps(long long long long long) SetMenuItemBitmaps32
|
||||||
0490 stub SetMenuItemInfoA
|
0490 stub SetMenuItemInfoA
|
||||||
0491 stub SetMenuItemInfoW
|
0491 stub SetMenuItemInfoW
|
||||||
0492 stub SetMessageExtraInfo
|
0492 stub SetMessageExtraInfo
|
||||||
|
@ -511,7 +511,7 @@ base 1
|
||||||
0504 stub SetSysColors
|
0504 stub SetSysColors
|
||||||
0505 stub SetSysColorsTemp
|
0505 stub SetSysColorsTemp
|
||||||
0506 stub SetSystemCursor
|
0506 stub SetSystemCursor
|
||||||
0507 stub SetSystemMenu
|
0507 stdcall SetSystemMenu(long long) SetSystemMenu32
|
||||||
0508 stdcall SetSystemTimer(long long long ptr) SetSystemTimer32
|
0508 stdcall SetSystemTimer(long long long ptr) SetSystemTimer32
|
||||||
0509 stub SetThreadDesktop
|
0509 stub SetThreadDesktop
|
||||||
0510 stdcall SetTimer(long long long ptr) SetTimer32
|
0510 stdcall SetTimer(long long long ptr) SetTimer32
|
||||||
|
|
|
@ -5,9 +5,6 @@ type win16
|
||||||
2 pascal StaticWndProc(word word word long) StaticWndProc
|
2 pascal StaticWndProc(word word word long) StaticWndProc
|
||||||
3 pascal ScrollBarWndProc(word word word long) ScrollBarWndProc
|
3 pascal ScrollBarWndProc(word word word long) ScrollBarWndProc
|
||||||
5 pascal ComboBoxWndProc(word word word long) ComboBoxWndProc
|
5 pascal ComboBoxWndProc(word word word long) ComboBoxWndProc
|
||||||
6 pascal EditWndProc(word word word long) EditWndProc
|
|
||||||
7 pascal PopupMenuWndProc(word word word long) PopupMenuWndProc
|
|
||||||
9 pascal DefDlgProc(word word word long) DefDlgProc16
|
|
||||||
10 pascal MDIClientWndProc(word word word long) MDIClientWndProc
|
10 pascal MDIClientWndProc(word word word long) MDIClientWndProc
|
||||||
14 pascal FileOpenDlgProc(word word word long) FileOpenDlgProc
|
14 pascal FileOpenDlgProc(word word word long) FileOpenDlgProc
|
||||||
15 pascal FileSaveDlgProc(word word word long) FileSaveDlgProc
|
15 pascal FileSaveDlgProc(word word word long) FileSaveDlgProc
|
||||||
|
|
|
@ -5,6 +5,9 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __WINE_ACCEL_H
|
||||||
|
#define __WINE_ACCEL_H
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -23,3 +26,5 @@ typedef struct {
|
||||||
#define CONTROL_ACCEL 0x08
|
#define CONTROL_ACCEL 0x08
|
||||||
#define ALT_ACCEL 0x10
|
#define ALT_ACCEL 0x10
|
||||||
#define SYSTEM_ACCEL 0x80
|
#define SYSTEM_ACCEL 0x80
|
||||||
|
|
||||||
|
#endif /* __WINE_ACCEL_H */
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
* Copyright 1993 Alexandre Julliard
|
* Copyright 1993 Alexandre Julliard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef ATOM_H
|
#ifndef __WINE_ATOM_H
|
||||||
#define ATOM_H
|
#define __WINE_ATOM_H
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
|
||||||
|
@ -25,4 +25,4 @@ typedef struct
|
||||||
HANDLE16 entries[1];
|
HANDLE16 entries[1];
|
||||||
} ATOMTABLE;
|
} ATOMTABLE;
|
||||||
|
|
||||||
#endif /* ATOM_H */
|
#endif /* __WINE_ATOM_H */
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
* Copyright 1994 Alexandre Julliard
|
* Copyright 1994 Alexandre Julliard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef BUTTON_H
|
#ifndef __WINE_BUTTON_H
|
||||||
#define BUTTON_H
|
#define __WINE_BUTTON_H
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
|
||||||
|
@ -31,4 +31,4 @@ typedef struct
|
||||||
extern LRESULT ButtonWndProc( HWND32 hWnd, UINT32 uMsg,
|
extern LRESULT ButtonWndProc( HWND32 hWnd, UINT32 uMsg,
|
||||||
WPARAM32 wParam, LPARAM lParam );
|
WPARAM32 wParam, LPARAM lParam );
|
||||||
|
|
||||||
#endif /* BUTTON_H */
|
#endif /* __WINE_BUTTON_H */
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
* Copyright 1993 Alexandre Julliard
|
* Copyright 1993 Alexandre Julliard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CLASS_H
|
#ifndef __WINE_CLASS_H
|
||||||
#define CLASS_H
|
#define __WINE_CLASS_H
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "winproc.h"
|
#include "winproc.h"
|
||||||
|
@ -40,4 +40,4 @@ extern void CLASS_WalkClasses(void);
|
||||||
extern void CLASS_FreeModuleClasses( HMODULE16 hModule );
|
extern void CLASS_FreeModuleClasses( HMODULE16 hModule );
|
||||||
extern CLASS *CLASS_FindClassByAtom( ATOM atom, HINSTANCE16 hinstance );
|
extern CLASS *CLASS_FindClassByAtom( ATOM atom, HINSTANCE16 hinstance );
|
||||||
|
|
||||||
#endif /* CLASS_H */
|
#endif /* __WINE_CLASS_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef COMM_H
|
#ifndef __WINE_COMM_H
|
||||||
#define COMM_H
|
#define __WINE_COMM_H
|
||||||
|
|
||||||
#define MAX_PORTS 16
|
#define MAX_PORTS 16
|
||||||
|
|
||||||
|
@ -14,4 +14,4 @@ struct DosDeviceStruct {
|
||||||
|
|
||||||
extern void COMM_Init(void);
|
extern void COMM_Init(void);
|
||||||
|
|
||||||
#endif /* COMM_H */
|
#endif /* __WINE_COMM_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef _WINE_CRTDLL_H
|
#ifndef __WINE_CRTDLL_H
|
||||||
#define _WINE_CRTDLL_H
|
#define __WINE_CRTDLL_H
|
||||||
|
|
||||||
#define CRTDLL_LC_ALL 0
|
#define CRTDLL_LC_ALL 0
|
||||||
#define CRTDLL_LC_COLLATE 1
|
#define CRTDLL_LC_COLLATE 1
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
* Copyright 1993 Alexandre Julliard
|
* Copyright 1993 Alexandre Julliard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef DCE_H
|
#ifndef __WINE_DCE_H
|
||||||
#define DCE_H
|
#define __WINE_DCE_H
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "win.h"
|
#include "win.h"
|
||||||
|
@ -50,4 +50,4 @@ extern DCE* DCE_AllocDCE( HWND32 hWnd, DCE_TYPE type );
|
||||||
extern void DCE_FreeDCE( DCE *dce );
|
extern void DCE_FreeDCE( DCE *dce );
|
||||||
extern INT16 DCE_ExcludeRgn( HDC32, WND*, HRGN32 );
|
extern INT16 DCE_ExcludeRgn( HDC32, WND*, HRGN32 );
|
||||||
|
|
||||||
#endif /* DCE_H */
|
#endif /* __WINE_DCE_H */
|
||||||
|
|
|
@ -14,17 +14,58 @@
|
||||||
|
|
||||||
#define STEP_FLAG 0x100 /* single step flag */
|
#define STEP_FLAG 0x100 /* single step flag */
|
||||||
|
|
||||||
|
#define SYM_FUNC 0x0
|
||||||
|
#define SYM_DATA 0x1
|
||||||
|
#define SYM_WIN32 0x2
|
||||||
|
#define SYM_WINE 0x4
|
||||||
|
#define SYM_INVALID 0x8
|
||||||
|
#define SYM_TRAMPOLINE 0x10
|
||||||
|
#define SYM_STEP_THROUGH 0x20
|
||||||
|
|
||||||
|
enum debug_type {BASIC, CONST, POINTER, ARRAY, STRUCT, ENUM, TYPEDEF, FUNC, BITFIELD};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return values for DEBUG_CheckLinenoStatus. Used to determine
|
||||||
|
* what to do when the 'step' command is given.
|
||||||
|
*/
|
||||||
|
#define FUNC_HAS_NO_LINES (0)
|
||||||
|
#define NOT_ON_LINENUMBER (1)
|
||||||
|
#define AT_LINENUMBER (2)
|
||||||
|
#define FUNC_IS_TRAMPOLINE (3)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* For constants generated by the parser, we use this datatype
|
||||||
|
*/
|
||||||
|
extern struct datatype * DEBUG_TypeInt;
|
||||||
|
extern struct datatype * DEBUG_TypeIntConst;
|
||||||
|
extern struct datatype * DEBUG_TypeUSInt;
|
||||||
|
extern struct datatype * DEBUG_TypeString;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
|
struct datatype * type;
|
||||||
DWORD seg; /* 0xffffffff means current default segment (cs or ds) */
|
DWORD seg; /* 0xffffffff means current default segment (cs or ds) */
|
||||||
DWORD off;
|
DWORD off;
|
||||||
} DBG_ADDR;
|
} DBG_ADDR;
|
||||||
|
|
||||||
|
struct list_id
|
||||||
|
{
|
||||||
|
char * sourcefile;
|
||||||
|
int line;
|
||||||
|
};
|
||||||
|
|
||||||
struct wine_lines {
|
struct wine_lines {
|
||||||
unsigned long line_number;
|
unsigned long line_number;
|
||||||
DBG_ADDR pc_offset;
|
DBG_ADDR pc_offset;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct symbol_info
|
||||||
|
{
|
||||||
|
struct name_hash * sym;
|
||||||
|
struct list_id list;
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct wine_lines WineLineNo;
|
typedef struct wine_lines WineLineNo;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -34,30 +75,15 @@ typedef struct wine_lines WineLineNo;
|
||||||
*/
|
*/
|
||||||
struct wine_locals {
|
struct wine_locals {
|
||||||
unsigned int regno:8; /* For register symbols */
|
unsigned int regno:8; /* For register symbols */
|
||||||
unsigned int offset:24; /* offset from esp/ebp to symbol */
|
signed int offset:24; /* offset from esp/ebp to symbol */
|
||||||
unsigned int pc_start; /* For RBRAC/LBRAC */
|
unsigned int pc_start; /* For RBRAC/LBRAC */
|
||||||
unsigned int pc_end; /* For RBRAC/LBRAC */
|
unsigned int pc_end; /* For RBRAC/LBRAC */
|
||||||
char * name; /* Name of symbol */
|
char * name; /* Name of symbol */
|
||||||
|
struct datatype * type; /* Datatype of symbol */
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct wine_locals WineLocals;
|
typedef struct wine_locals WineLocals;
|
||||||
|
|
||||||
struct name_hash
|
|
||||||
{
|
|
||||||
struct name_hash * next;
|
|
||||||
char * name;
|
|
||||||
char * sourcefile;
|
|
||||||
|
|
||||||
int n_locals;
|
|
||||||
int locals_alloc;
|
|
||||||
WineLocals * local_vars;
|
|
||||||
|
|
||||||
int n_lines;
|
|
||||||
int lines_alloc;
|
|
||||||
WineLineNo * linetab;
|
|
||||||
|
|
||||||
DBG_ADDR addr;
|
|
||||||
};
|
|
||||||
|
|
||||||
#define DBG_FIX_ADDR_SEG(addr,default) \
|
#define DBG_FIX_ADDR_SEG(addr,default) \
|
||||||
{ if ((addr)->seg == 0xffffffff) (addr)->seg = (default); \
|
{ if ((addr)->seg == 0xffffffff) (addr)->seg = (default); \
|
||||||
|
@ -97,8 +123,16 @@ enum debug_regs
|
||||||
enum exec_mode
|
enum exec_mode
|
||||||
{
|
{
|
||||||
EXEC_CONT, /* Continuous execution */
|
EXEC_CONT, /* Continuous execution */
|
||||||
EXEC_STEP_OVER, /* Stepping over a call */
|
EXEC_STEP_OVER, /* Stepping over a call to next source line */
|
||||||
EXEC_STEP_INSTR /* Single-stepping an instruction */
|
EXEC_STEP_INSTR, /* Step to next source line, stepping in if needed */
|
||||||
|
EXEC_STEPI_OVER, /* Stepping over a call */
|
||||||
|
EXEC_STEPI_INSTR, /* Single-stepping an instruction */
|
||||||
|
EXEC_FINISH, /* Step until we exit current frame */
|
||||||
|
EXEC_STEP_OVER_TRAMPOLINE /* Step over trampoline. Requires that
|
||||||
|
* we dig the real return value off the stack
|
||||||
|
* and set breakpoint there - not at the
|
||||||
|
* instr just after the call.
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
extern CONTEXT DEBUG_context; /* debugger/registers.c */
|
extern CONTEXT DEBUG_context; /* debugger/registers.c */
|
||||||
|
@ -112,40 +146,91 @@ extern void DEBUG_DelBreakpoint( int num );
|
||||||
extern void DEBUG_EnableBreakpoint( int num, BOOL32 enable );
|
extern void DEBUG_EnableBreakpoint( int num, BOOL32 enable );
|
||||||
extern void DEBUG_InfoBreakpoints(void);
|
extern void DEBUG_InfoBreakpoints(void);
|
||||||
extern BOOL32 DEBUG_HandleTrap(void);
|
extern BOOL32 DEBUG_HandleTrap(void);
|
||||||
extern BOOL32 DEBUG_ShouldContinue( enum exec_mode mode );
|
extern BOOL32 DEBUG_ShouldContinue( enum exec_mode mode, int * count );
|
||||||
extern void DEBUG_RestartExecution( enum exec_mode mode, int instr_len );
|
extern enum exec_mode DEBUG_RestartExecution( enum exec_mode mode, int count );
|
||||||
|
extern BOOL32 DEBUG_IsFctReturn(void);
|
||||||
|
|
||||||
/* debugger/db_disasm.c */
|
/* debugger/db_disasm.c */
|
||||||
extern void DEBUG_Disasm( DBG_ADDR *addr );
|
extern void DEBUG_Disasm( DBG_ADDR *addr, int display );
|
||||||
|
|
||||||
|
/* debugger/expr.c */
|
||||||
|
extern void DEBUG_FreeExprMem(void);
|
||||||
|
struct expr * DEBUG_RegisterExpr(enum debug_regs);
|
||||||
|
struct expr * DEBUG_SymbolExpr(const char * name);
|
||||||
|
struct expr * DEBUG_ConstExpr(int val);
|
||||||
|
struct expr * DEBUG_StringExpr(const char * str);
|
||||||
|
struct expr * DEBUG_SegAddr(struct expr *, struct expr *);
|
||||||
|
struct expr * DEBUG_USConstExpr(unsigned int val);
|
||||||
|
struct expr * DEBUG_BinopExpr(int oper, struct expr *, struct expr *);
|
||||||
|
struct expr * DEBUG_UnopExpr(int oper, struct expr *);
|
||||||
|
struct expr * DEBUG_StructPExpr(struct expr *, const char * element);
|
||||||
|
struct expr * DEBUG_StructExpr(struct expr *, const char * element);
|
||||||
|
struct expr * DEBUG_ArrayExpr(struct expr *, struct expr * index);
|
||||||
|
struct expr * DEBUG_CallExpr(const char *, int nargs, ...);
|
||||||
|
extern int DEBUG_ExprValue(DBG_ADDR *, unsigned int *);
|
||||||
|
DBG_ADDR DEBUG_EvalExpr(struct expr *);
|
||||||
|
extern int DEBUG_AddDisplay(struct expr * exp);
|
||||||
|
extern int DEBUG_DelDisplay(int displaynum);
|
||||||
|
extern struct expr * DEBUG_CloneExpr(struct expr * exp);
|
||||||
|
extern int DEBUG_FreeExpr(struct expr * exp);
|
||||||
|
extern int DEBUG_DisplayExpr(struct expr * exp);
|
||||||
|
|
||||||
|
/* more debugger/break.c */
|
||||||
|
extern int DEBUG_AddBPCondition(int bpnum, struct expr * exp);
|
||||||
|
|
||||||
|
/* debugger/display.c */
|
||||||
|
extern int DEBUG_DoDisplay(void);
|
||||||
|
extern int DEBUG_AddDisplay(struct expr * exp);
|
||||||
|
extern int DEBUG_DoDisplay(void);
|
||||||
|
extern int DEBUG_DelDisplay(int displaynum);
|
||||||
|
extern int DEBUG_InfoDisplay(void);
|
||||||
|
|
||||||
/* debugger/hash.c */
|
/* debugger/hash.c */
|
||||||
extern struct name_hash * DEBUG_AddSymbol( const char *name,
|
extern struct name_hash * DEBUG_AddSymbol( const char *name,
|
||||||
|
const DBG_ADDR *addr,
|
||||||
|
const char * sourcefile,
|
||||||
|
int flags);
|
||||||
|
extern struct name_hash * DEBUG_AddInvSymbol( const char *name,
|
||||||
const DBG_ADDR *addr,
|
const DBG_ADDR *addr,
|
||||||
const char * sourcefile);
|
const char * sourcefile);
|
||||||
extern BOOL32 DEBUG_GetSymbolValue( const char * name, const int lineno,
|
extern BOOL32 DEBUG_GetSymbolValue( const char * name, const int lineno,
|
||||||
DBG_ADDR *addr );
|
DBG_ADDR *addr, int );
|
||||||
extern BOOL32 DEBUG_SetSymbolValue( const char * name, const DBG_ADDR *addr );
|
extern BOOL32 DEBUG_SetSymbolValue( const char * name, const DBG_ADDR *addr );
|
||||||
extern const char * DEBUG_FindNearestSymbol( const DBG_ADDR *addr, int flag,
|
extern const char * DEBUG_FindNearestSymbol( const DBG_ADDR *addr, int flag,
|
||||||
struct name_hash ** rtn,
|
struct name_hash ** rtn,
|
||||||
unsigned int ebp);
|
unsigned int ebp,
|
||||||
|
struct list_id * source);
|
||||||
extern void DEBUG_ReadSymbolTable( const char * filename );
|
extern void DEBUG_ReadSymbolTable( const char * filename );
|
||||||
extern void DEBUG_LoadEntryPoints(void);
|
extern void DEBUG_LoadEntryPoints(void);
|
||||||
extern void DEBUG_AddLineNumber( struct name_hash * func, int line_num,
|
extern void DEBUG_AddLineNumber( struct name_hash * func, int line_num,
|
||||||
unsigned long offset );
|
unsigned long offset );
|
||||||
extern void DEBUG_AddLocal( struct name_hash * func, int regno,
|
extern struct wine_locals *
|
||||||
|
DEBUG_AddLocal( struct name_hash * func, int regno,
|
||||||
int offset,
|
int offset,
|
||||||
int pc_start,
|
int pc_start,
|
||||||
int pc_end,
|
int pc_end,
|
||||||
char * name);
|
char * name);
|
||||||
|
extern int DEBUG_CheckLinenoStatus(const DBG_ADDR *addr);
|
||||||
|
extern void DEBUG_GetFuncInfo(struct list_id * ret, const char * file,
|
||||||
|
const char * func);
|
||||||
|
extern int DEBUG_SetSymbolSize(struct name_hash * sym, unsigned int len);
|
||||||
|
extern int DEBUG_SetSymbolBPOff(struct name_hash * sym, unsigned int len);
|
||||||
|
extern int DEBUG_GetSymbolAddr(struct name_hash * sym, DBG_ADDR * addr);
|
||||||
|
extern int DEBUG_cmp_sym(const void * p1, const void * p2);
|
||||||
|
extern BOOL32 DEBUG_GetLineNumberAddr( struct name_hash *, const int lineno,
|
||||||
|
DBG_ADDR *addr, int bp_flag );
|
||||||
|
|
||||||
|
extern int DEBUG_SetLocalSymbolType(struct wine_locals * sym,
|
||||||
|
struct datatype * type);
|
||||||
|
BOOL32 DEBUG_Normalize(struct name_hash * nh );
|
||||||
|
|
||||||
/* debugger/info.c */
|
/* debugger/info.c */
|
||||||
extern void DEBUG_Print( const DBG_ADDR *addr, int count, char format );
|
extern void DEBUG_PrintBasic( const DBG_ADDR *addr, int count, char format );
|
||||||
extern struct name_hash * DEBUG_PrintAddress( const DBG_ADDR *addr,
|
extern struct symbol_info DEBUG_PrintAddress( const DBG_ADDR *addr,
|
||||||
int addrlen, int flag );
|
int addrlen, int flag );
|
||||||
extern void DEBUG_Help(void);
|
extern void DEBUG_Help(void);
|
||||||
extern void DEBUG_List( DBG_ADDR *addr, int count );
|
extern void DEBUG_HelpInfo(void);
|
||||||
extern struct name_hash * DEBUG_PrintAddressAndArgs( const DBG_ADDR *addr,
|
extern struct symbol_info DEBUG_PrintAddressAndArgs( const DBG_ADDR *addr,
|
||||||
int addrlen,
|
int addrlen,
|
||||||
unsigned int ebp,
|
unsigned int ebp,
|
||||||
int flag );
|
int flag );
|
||||||
|
@ -164,13 +249,17 @@ extern void DEBUG_InfoRegisters(void);
|
||||||
extern BOOL32 DEBUG_ValidateRegisters(void);
|
extern BOOL32 DEBUG_ValidateRegisters(void);
|
||||||
extern void DEBUG_SetSigContext( const SIGCONTEXT *sigcontext );
|
extern void DEBUG_SetSigContext( const SIGCONTEXT *sigcontext );
|
||||||
extern void DEBUG_GetSigContext( SIGCONTEXT *sigcontext );
|
extern void DEBUG_GetSigContext( SIGCONTEXT *sigcontext );
|
||||||
|
extern int DEBUG_PrintRegister(enum debug_regs reg);
|
||||||
|
|
||||||
/* debugger/stack.c */
|
/* debugger/stack.c */
|
||||||
extern void DEBUG_InfoStack(void);
|
extern void DEBUG_InfoStack(void);
|
||||||
extern void DEBUG_BackTrace(void);
|
extern void DEBUG_BackTrace(void);
|
||||||
extern BOOL32 DEBUG_GetStackSymbolValue( const char * name, DBG_ADDR *addr );
|
extern void DEBUG_SilentBackTrace(void);
|
||||||
extern int DEBUG_InfoLocals(void);
|
extern int DEBUG_InfoLocals(void);
|
||||||
extern int DEBUG_SetFrame(int newframe);
|
extern int DEBUG_SetFrame(int newframe);
|
||||||
|
extern int DEBUG_GetCurrentFrame(struct name_hash ** name,
|
||||||
|
unsigned int * eip,
|
||||||
|
unsigned int * ebp);
|
||||||
|
|
||||||
/* debugger/stabs.c */
|
/* debugger/stabs.c */
|
||||||
extern int DEBUG_ReadExecutableDbgInfo(void);
|
extern int DEBUG_ReadExecutableDbgInfo(void);
|
||||||
|
@ -179,6 +268,42 @@ extern int DEBUG_ReadExecutableDbgInfo(void);
|
||||||
extern int DEBUG_RegisterDebugInfo(int, struct pe_data *pe,
|
extern int DEBUG_RegisterDebugInfo(int, struct pe_data *pe,
|
||||||
int, unsigned long, unsigned long);
|
int, unsigned long, unsigned long);
|
||||||
extern int DEBUG_ProcessDeferredDebug(void);
|
extern int DEBUG_ProcessDeferredDebug(void);
|
||||||
|
extern int DEBUG_RegisterELFDebugInfo(int load_addr, u_long size, char * name);
|
||||||
|
extern void DEBUG_InfoShare(void);
|
||||||
|
extern void DEBUG_InitCVDataTypes(void);
|
||||||
|
|
||||||
|
/* debugger/types.c */
|
||||||
|
extern void DEBUG_InitTypes(void);
|
||||||
|
extern struct datatype * DEBUG_NewDataType(enum debug_type xtype,
|
||||||
|
const char * typename);
|
||||||
|
extern unsigned int
|
||||||
|
DEBUG_TypeDerefPointer(DBG_ADDR * addr, struct datatype ** newtype);
|
||||||
|
extern int DEBUG_AddStructElement(struct datatype * dt,
|
||||||
|
char * name, struct datatype * type,
|
||||||
|
int offset, int size);
|
||||||
|
extern int DEBUG_SetStructSize(struct datatype * dt, int size);
|
||||||
|
extern int DEBUG_SetPointerType(struct datatype * dt, struct datatype * dt2);
|
||||||
|
extern int DEBUG_SetArrayParams(struct datatype * dt, int min, int max,
|
||||||
|
struct datatype * dt2);
|
||||||
|
extern void DEBUG_Print( const DBG_ADDR *addr, int count, char format, int level );
|
||||||
|
extern unsigned int DEBUG_FindStructElement(DBG_ADDR * addr,
|
||||||
|
const char * ele_name, int * tmpbuf);
|
||||||
|
extern struct datatype * DEBUG_GetPointerType(struct datatype * dt);
|
||||||
|
extern int DEBUG_GetObjectSize(struct datatype * dt);
|
||||||
|
extern unsigned int DEBUG_ArrayIndex(DBG_ADDR * addr, DBG_ADDR * result, int index);
|
||||||
|
extern struct datatype * DEBUG_FindOrMakePointerType(struct datatype * reftype);
|
||||||
|
extern long long int DEBUG_GetExprValue(DBG_ADDR * addr, char ** format);
|
||||||
|
extern int DEBUG_SetBitfieldParams(struct datatype * dt, int offset,
|
||||||
|
int nbits, struct datatype * dt2);
|
||||||
|
extern int DEBUG_CopyFieldlist(struct datatype * dt, struct datatype * dt2);
|
||||||
|
|
||||||
|
|
||||||
|
/* debugger/source.c */
|
||||||
|
extern void DEBUG_ShowDir(void);
|
||||||
|
extern void DEBUG_AddPath(const char * path);
|
||||||
|
extern void DEBUG_List(struct list_id * line1, struct list_id * line2,
|
||||||
|
int delta);
|
||||||
|
extern void DEBUG_NukePath(void);
|
||||||
|
|
||||||
/* debugger/dbg.y */
|
/* debugger/dbg.y */
|
||||||
extern void DEBUG_EnterDebugger(void);
|
extern void DEBUG_EnterDebugger(void);
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
* Copyright 1994 Alexandre Julliard
|
* Copyright 1994 Alexandre Julliard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef DESKTOP_H
|
#ifndef __WINE_DESKTOP_H
|
||||||
#define DESKTOP_H
|
#define __WINE_DESKTOP_H
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
|
||||||
|
@ -21,4 +21,4 @@ extern BOOL32 DESKTOP_SetPattern( LPCSTR pattern );
|
||||||
extern LRESULT DesktopWndProc( HWND32 hwnd, UINT32 message,
|
extern LRESULT DesktopWndProc( HWND32 hwnd, UINT32 message,
|
||||||
WPARAM32 wParam, LPARAM lParam );
|
WPARAM32 wParam, LPARAM lParam );
|
||||||
|
|
||||||
#endif /* DESKTOP_H */
|
#endif /* __WINE_DESKTOP_H */
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
* Copyright 1993 Alexandre Julliard
|
* Copyright 1993 Alexandre Julliard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef DIALOG_H
|
#ifndef __WINE_DIALOG_H
|
||||||
#define DIALOG_H
|
#define __WINE_DIALOG_H
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "winproc.h"
|
#include "winproc.h"
|
||||||
|
@ -44,4 +44,4 @@ extern HWND32 DIALOG_CreateIndirect( HINSTANCE32 hInst, LPCSTR dlgTemplate,
|
||||||
WINDOWPROCTYPE procType );
|
WINDOWPROCTYPE procType );
|
||||||
extern INT32 DIALOG_DoDialogBox( HWND32 hwnd, HWND32 owner );
|
extern INT32 DIALOG_DoDialogBox( HWND32 hwnd, HWND32 owner );
|
||||||
|
|
||||||
#endif /* DIALOG_H */
|
#endif /* __WINE_DIALOG_H */
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
* dlgs.h - Common dialog's dialog control ID numbers *
|
* dlgs.h - Common dialog's dialog control ID numbers *
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
|
|
||||||
#ifndef DLGS_H
|
#ifndef __WINE_DLGS_H
|
||||||
#define DLGS_H
|
#define __WINE_DLGS_H
|
||||||
|
|
||||||
#define ctlFirst 0x0400
|
#define ctlFirst 0x0400
|
||||||
#define ctlLast 0x04ff
|
#define ctlLast 0x04ff
|
||||||
|
@ -183,4 +183,4 @@
|
||||||
#define FORMATDLGORD31 1543
|
#define FORMATDLGORD31 1543
|
||||||
#define FORMATDLGORD30 1544
|
#define FORMATDLGORD30 1544
|
||||||
|
|
||||||
#endif /* #ifdef DLGS_H */
|
#endif /* #ifdef __WINE_DLGS_H */
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
/*
|
|
||||||
* DOS file system declarations
|
|
||||||
*
|
|
||||||
* Copyright 1996 Alexandre Julliard
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef __WINE_DOS_FS_H
|
|
||||||
#define __WINE_DOS_FS_H
|
|
||||||
|
|
||||||
#include <time.h>
|
|
||||||
#include "windows.h"
|
|
||||||
|
|
||||||
#define MAX_PATHNAME_LEN 1024
|
|
||||||
|
|
||||||
#define IS_END_OF_NAME(ch) (!(ch) || ((ch) == '/') || ((ch) == '\\'))
|
|
||||||
|
|
||||||
extern void DOSFS_ToDosDateTime( time_t unixtime, WORD *pDate, WORD *pTime );
|
|
||||||
extern time_t DOSFS_DosDateTimeToUnixTime(WORD,WORD);
|
|
||||||
extern const char *DOSFS_ToDosFCBFormat( const char *name );
|
|
||||||
extern const char *DOSFS_ToDosDTAFormat( const char *name );
|
|
||||||
extern const char *DOSFS_IsDevice( const char *name );
|
|
||||||
extern BOOL32 DOSFS_FindUnixName( const char *path, const char *name,
|
|
||||||
char *buffer, int maxlen,
|
|
||||||
UINT32 drive_flags );
|
|
||||||
extern const char * DOSFS_GetUnixFileName( const char * name, int check_last );
|
|
||||||
extern const char * DOSFS_GetDosTrueName( const char *name, int unix_format );
|
|
||||||
extern int DOSFS_GetDosFileName( const char *name, char *buffer, int len );
|
|
||||||
extern time_t DOSFS_FileTimeToUnixTime( const FILETIME *ft );
|
|
||||||
extern void DOSFS_UnixTimeToFileTime(time_t unixtime,LPFILETIME ft);
|
|
||||||
extern int DOSFS_FindNext( const char *path, const char *short_mask,
|
|
||||||
const char *long_mask, int drive, BYTE attr,
|
|
||||||
int skip, WIN32_FIND_DATA32A *entry );
|
|
||||||
|
|
||||||
#endif /* __WINE_DOS_FS_H */
|
|
|
@ -2,6 +2,9 @@
|
||||||
* Drivers definitions
|
* Drivers definitions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __WINE_DRIVER_H
|
||||||
|
#define __WINE_DRIVER_H
|
||||||
|
|
||||||
#define DRV_LOAD 0x0001
|
#define DRV_LOAD 0x0001
|
||||||
#define DRV_ENABLE 0x0002
|
#define DRV_ENABLE 0x0002
|
||||||
#define DRV_OPEN 0x0003
|
#define DRV_OPEN 0x0003
|
||||||
|
@ -64,5 +67,4 @@ HMODULE16 GetDriverModuleHandle(HDRVR16 hDriver);
|
||||||
HDRVR16 GetNextDriver(HDRVR16, DWORD);
|
HDRVR16 GetNextDriver(HDRVR16, DWORD);
|
||||||
BOOL16 GetDriverInfo(HDRVR16, DRIVERINFOSTRUCT16 *);
|
BOOL16 GetDriverInfo(HDRVR16, DRIVERINFOSTRUCT16 *);
|
||||||
|
|
||||||
|
#endif /* __WINE_DRIVER_H */
|
||||||
|
|
||||||
|
|
|
@ -7,9 +7,23 @@
|
||||||
#ifndef __WINE_FILE_H
|
#ifndef __WINE_FILE_H
|
||||||
#define __WINE_FILE_H
|
#define __WINE_FILE_H
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "handle32.h"
|
#include "handle32.h"
|
||||||
|
|
||||||
|
#define MAX_PATHNAME_LEN 1024
|
||||||
|
|
||||||
|
/* Definition of a full DOS file name */
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
char long_name[MAX_PATHNAME_LEN]; /* Long pathname in Unix format */
|
||||||
|
char short_name[MAX_PATHNAME_LEN]; /* Short pathname in DOS 8.3 format */
|
||||||
|
int drive;
|
||||||
|
} DOS_FULL_NAME;
|
||||||
|
|
||||||
|
#define IS_END_OF_NAME(ch) (!(ch) || ((ch) == '/') || ((ch) == '\\'))
|
||||||
|
|
||||||
|
|
||||||
/* files/file.c */
|
/* files/file.c */
|
||||||
extern void FILE_Destroy( K32OBJ *ptr );
|
extern void FILE_Destroy( K32OBJ *ptr );
|
||||||
extern void FILE_SetDosError(void);
|
extern void FILE_SetDosError(void);
|
||||||
|
@ -29,7 +43,21 @@ extern UINT32 DIR_GetTempUnixDir( LPSTR path, UINT32 count );
|
||||||
extern UINT32 DIR_GetDosPath( INT32 element, LPSTR path, UINT32 count );
|
extern UINT32 DIR_GetDosPath( INT32 element, LPSTR path, UINT32 count );
|
||||||
extern UINT32 DIR_GetUnixPath( INT32 element, LPSTR path, UINT32 count );
|
extern UINT32 DIR_GetUnixPath( INT32 element, LPSTR path, UINT32 count );
|
||||||
extern DWORD DIR_SearchPath( LPCSTR path, LPCSTR name, LPCSTR ext,
|
extern DWORD DIR_SearchPath( LPCSTR path, LPCSTR name, LPCSTR ext,
|
||||||
DWORD buflen, LPSTR buffer, LPSTR *lastpart,
|
DOS_FULL_NAME *full_name, BOOL32 win32 );
|
||||||
BOOL32 win32 );
|
|
||||||
|
/* files/dos_fs.c */
|
||||||
|
extern void DOSFS_UnixTimeToFileTime( time_t unixtime, LPFILETIME ft,
|
||||||
|
DWORD remainder );
|
||||||
|
extern time_t DOSFS_FileTimeToUnixTime( const FILETIME *ft, DWORD *remainder );
|
||||||
|
extern BOOL32 DOSFS_ToDosFCBFormat( LPCSTR name, LPSTR buffer );
|
||||||
|
extern const char *DOSFS_IsDevice( const char *name );
|
||||||
|
extern BOOL32 DOSFS_FindUnixName( LPCSTR path, LPCSTR name, LPSTR long_buf,
|
||||||
|
INT32 long_len, LPSTR short_buf,
|
||||||
|
BOOL32 ignore_case );
|
||||||
|
extern BOOL32 DOSFS_GetFullName( LPCSTR name, BOOL32 check_last,
|
||||||
|
DOS_FULL_NAME *full );
|
||||||
|
extern int DOSFS_FindNext( const char *path, const char *short_mask,
|
||||||
|
const char *long_mask, int drive, BYTE attr,
|
||||||
|
int skip, WIN32_FIND_DATA32A *entry );
|
||||||
|
|
||||||
#endif /* __WINE_FILE_H */
|
#endif /* __WINE_FILE_H */
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
* Copyright 1993 Alexandre Julliard
|
* Copyright 1993 Alexandre Julliard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef GDI_H
|
#ifndef __WINE_GDI_H
|
||||||
#define GDI_H
|
#define __WINE_GDI_H
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "ldt.h"
|
#include "ldt.h"
|
||||||
|
@ -158,14 +158,11 @@ typedef struct tagDC_FUNCS
|
||||||
INT32 (*pExcludeVisRect)(DC*,INT32,INT32,INT32,INT32);
|
INT32 (*pExcludeVisRect)(DC*,INT32,INT32,INT32,INT32);
|
||||||
BOOL32 (*pExtFloodFill)(DC*,INT32,INT32,COLORREF,UINT32);
|
BOOL32 (*pExtFloodFill)(DC*,INT32,INT32,COLORREF,UINT32);
|
||||||
BOOL32 (*pExtTextOut)(DC*,INT32,INT32,UINT32,const RECT32*,LPCSTR,UINT32,const INT32*);
|
BOOL32 (*pExtTextOut)(DC*,INT32,INT32,UINT32,const RECT32*,LPCSTR,UINT32,const INT32*);
|
||||||
BOOL32 (*pFillRgn)(DC*,HRGN32,HBRUSH32);
|
COLORREF (*pGetPixel)(DC*,INT32,INT32);
|
||||||
BOOL32 (*pFloodFill)(DC*,INT32,INT32,COLORREF);
|
|
||||||
BOOL32 (*pFrameRgn)(DC*,HRGN32,HBRUSH32,INT32,INT32);
|
|
||||||
BOOL32 (*pGetTextExtentPoint)(DC*,LPCSTR,INT32,LPSIZE32);
|
BOOL32 (*pGetTextExtentPoint)(DC*,LPCSTR,INT32,LPSIZE32);
|
||||||
BOOL32 (*pGetTextMetrics)(DC*,TEXTMETRIC32A*);
|
BOOL32 (*pGetTextMetrics)(DC*,TEXTMETRIC32A*);
|
||||||
INT32 (*pIntersectClipRect)(DC*,INT32,INT32,INT32,INT32);
|
INT32 (*pIntersectClipRect)(DC*,INT32,INT32,INT32,INT32);
|
||||||
INT32 (*pIntersectVisRect)(DC*,INT32,INT32,INT32,INT32);
|
INT32 (*pIntersectVisRect)(DC*,INT32,INT32,INT32,INT32);
|
||||||
BOOL32 (*pInvertRgn)(DC*,HRGN32);
|
|
||||||
BOOL32 (*pLineTo)(DC*,INT32,INT32);
|
BOOL32 (*pLineTo)(DC*,INT32,INT32);
|
||||||
BOOL32 (*pMoveToEx)(DC*,INT32,INT32,LPPOINT32);
|
BOOL32 (*pMoveToEx)(DC*,INT32,INT32,LPPOINT32);
|
||||||
INT32 (*pOffsetClipRgn)(DC*,INT32,INT32);
|
INT32 (*pOffsetClipRgn)(DC*,INT32,INT32);
|
||||||
|
@ -208,7 +205,6 @@ typedef struct tagDC_FUNCS
|
||||||
BOOL32 (*pSetWindowOrg)(DC*,INT32,INT32);
|
BOOL32 (*pSetWindowOrg)(DC*,INT32,INT32);
|
||||||
BOOL32 (*pStretchBlt)(DC*,INT32,INT32,INT32,INT32,DC*,INT32,INT32,INT32,INT32,DWORD);
|
BOOL32 (*pStretchBlt)(DC*,INT32,INT32,INT32,INT32,DC*,INT32,INT32,INT32,INT32,DWORD);
|
||||||
INT32 (*pStretchDIBits)(DC*,INT32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,LPSTR,LPBITMAPINFO,WORD,DWORD);
|
INT32 (*pStretchDIBits)(DC*,INT32,INT32,INT32,INT32,INT32,INT32,INT32,INT32,LPSTR,LPBITMAPINFO,WORD,DWORD);
|
||||||
BOOL32 (*pTextOut)(DC*,INT32,INT32,LPCSTR,INT32);
|
|
||||||
} DC_FUNCTIONS;
|
} DC_FUNCTIONS;
|
||||||
|
|
||||||
/* DC hook codes */
|
/* DC hook codes */
|
||||||
|
@ -299,4 +295,4 @@ extern Window rootWindow;
|
||||||
extern int screenWidth, screenHeight, screenDepth;
|
extern int screenWidth, screenHeight, screenDepth;
|
||||||
extern int desktopX, desktopY; /* misc/main.c */
|
extern int desktopX, desktopY; /* misc/main.c */
|
||||||
|
|
||||||
#endif /* GDI_H */
|
#endif /* __WINE_GDI_H */
|
||||||
|
|
|
@ -43,45 +43,4 @@ typedef struct
|
||||||
extern void K32OBJ_IncCount( K32OBJ *ptr );
|
extern void K32OBJ_IncCount( K32OBJ *ptr );
|
||||||
extern void K32OBJ_DecCount( K32OBJ *ptr );
|
extern void K32OBJ_DecCount( K32OBJ *ptr );
|
||||||
|
|
||||||
|
|
||||||
/* The _*_OBJECT structures contain information needed about each
|
|
||||||
* particular type of handle. This information is a combination of
|
|
||||||
* equivalent UNIX-style handles/descriptors and general information
|
|
||||||
* that the Win32 API might request.
|
|
||||||
*
|
|
||||||
* The KERNEL_OBJECT structure must be the first member of any specific
|
|
||||||
* kernel object type's structure.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
unsigned long magic;
|
|
||||||
} KERNEL_OBJECT;
|
|
||||||
|
|
||||||
|
|
||||||
/* Object number definitions. These numbers are used to
|
|
||||||
* validate the kernel object by comparison against the
|
|
||||||
* object's 'magic' value.
|
|
||||||
*/
|
|
||||||
#define KERNEL_OBJECT_UNUSED 2404554046UL
|
|
||||||
#define KERNEL_OBJECT_THREAD (KERNEL_OBJECT_UNUSED + 1)
|
|
||||||
#define KERNEL_OBJECT_PROCESS (KERNEL_OBJECT_UNUSED + 2)
|
|
||||||
#define KERNEL_OBJECT_FILE (KERNEL_OBJECT_UNUSED + 3)
|
|
||||||
#define KERNEL_OBJECT_SEMAPHORE (KERNEL_OBJECT_UNUSED + 4)
|
|
||||||
#define KERNEL_OBJECT_EVENT (KERNEL_OBJECT_UNUSED + 5)
|
|
||||||
#define KERNEL_OBJECT_REGKEY (KERNEL_OBJECT_UNUSED + 6)
|
|
||||||
#define KERNEL_OBJECT_FILEMAP (KERNEL_OBJECT_UNUSED + 7)
|
|
||||||
#define KERNEL_OBJECT_VRANGE (KERNEL_OBJECT_UNUSED + 8)
|
|
||||||
#define KERNEL_OBJECT_HEAP (KERNEL_OBJECT_UNUSED + 9)
|
|
||||||
#define KERNEL_OBJECT_HEAPITEM (KERNEL_OBJECT_UNUSED + 10)
|
|
||||||
|
|
||||||
/* Functions for checking kernel objects.
|
|
||||||
*/
|
|
||||||
int ValidateKernelObject(KERNEL_OBJECT *ptr);
|
|
||||||
|
|
||||||
/* For now, CreateKernelObject and ReleaseKernelObject will
|
|
||||||
* simply map to malloc() and free().
|
|
||||||
*/
|
|
||||||
#define CreateKernelObject(size) (malloc(size))
|
|
||||||
#define ReleaseKernelObject(ptr) (free(ptr))
|
|
||||||
|
|
||||||
#endif /* __WINE_HANDLE32_H */
|
#endif /* __WINE_HANDLE32_H */
|
||||||
|
|
|
@ -3,6 +3,9 @@
|
||||||
* Copyright 1996 Marcus Meissner
|
* Copyright 1996 Marcus Meissner
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __WINE_LZEXPAND_H
|
||||||
|
#define __WINE_LZEXPAND_H
|
||||||
|
|
||||||
#define LZERROR_BADINHANDLE 0xFFFF /* -1 */
|
#define LZERROR_BADINHANDLE 0xFFFF /* -1 */
|
||||||
#define LZERROR_BADOUTHANDLE 0xFFFE /* -2 */
|
#define LZERROR_BADOUTHANDLE 0xFFFE /* -2 */
|
||||||
#define LZERROR_READ 0xFFFD /* -3 */
|
#define LZERROR_READ 0xFFFD /* -3 */
|
||||||
|
@ -11,3 +14,5 @@
|
||||||
#define LZERROR_GLOBLOCK 0xFFFA /* -6 */
|
#define LZERROR_GLOBLOCK 0xFFFA /* -6 */
|
||||||
#define LZERROR_BADVALUE 0xFFF9 /* -7 */
|
#define LZERROR_BADVALUE 0xFFF9 /* -7 */
|
||||||
#define LZERROR_UNKNOWNALG 0xFFF8 /* -8 */
|
#define LZERROR_UNKNOWNALG 0xFFF8 /* -8 */
|
||||||
|
|
||||||
|
#endif /* __WINE_LZEXPAND_H */
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
* MDI structure definitions.
|
* MDI structure definitions.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MDI_H
|
#ifndef __WINE_MDI_H
|
||||||
#define MDI_H
|
#define __WINE_MDI_H
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
|
||||||
|
@ -43,5 +43,5 @@ typedef struct
|
||||||
HWND self;
|
HWND self;
|
||||||
} MDICLIENTINFO;
|
} MDICLIENTINFO;
|
||||||
|
|
||||||
#endif /* MDI_H */
|
#endif /* __WINE_MDI_H */
|
||||||
|
|
||||||
|
|
|
@ -5,16 +5,14 @@
|
||||||
#ifndef __WINE_MENU_H
|
#ifndef __WINE_MENU_H
|
||||||
#define __WINE_MENU_H
|
#define __WINE_MENU_H
|
||||||
|
|
||||||
extern BOOL MENU_Init(void);
|
extern BOOL32 MENU_Init(void);
|
||||||
extern HMENU16 MENU_GetDefSysMenu(void);
|
extern HMENU32 MENU_GetDefSysMenu(void);
|
||||||
extern void MENU_InitSysMenuPopup(HMENU16 hmenu, DWORD style, DWORD clsStyle);
|
extern void MENU_InitSysMenuPopup(HMENU32 hmenu, DWORD style, DWORD clsStyle);
|
||||||
extern UINT MENU_GetMenuBarHeight( HWND hwnd, UINT menubarWidth,
|
extern UINT32 MENU_GetMenuBarHeight( HWND32 hwnd, UINT32 menubarWidth,
|
||||||
int orgX, int orgY );
|
INT32 orgX, INT32 orgY );
|
||||||
extern void MENU_TrackMouseMenuBar( WND* , INT16 ht, POINT16 pt );
|
extern void MENU_TrackMouseMenuBar( WND *wnd, INT32 ht, POINT32 pt );
|
||||||
extern void MENU_TrackKbdMenuBar( WND*, UINT16 wParam, INT16 vkey);
|
extern void MENU_TrackKbdMenuBar( WND *wnd, UINT32 wParam, INT32 vkey );
|
||||||
extern UINT MENU_DrawMenuBar( HDC32 hDC, LPRECT16 lprect,
|
extern UINT32 MENU_DrawMenuBar( HDC32 hDC, LPRECT32 lprect,
|
||||||
HWND hwnd, BOOL suppress_draw );
|
HWND32 hwnd, BOOL32 suppress_draw );
|
||||||
extern LRESULT PopupMenuWndProc( HWND hwnd, UINT message,
|
|
||||||
WPARAM16 wParam, LPARAM lParam );
|
|
||||||
|
|
||||||
#endif /* __WINE_MENU_H */
|
#endif /* __WINE_MENU_H */
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
* Copyright David W. Metcalfe, 1994
|
* Copyright David W. Metcalfe, 1994
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef METAFILE_H
|
#ifndef __WINE_METAFILE_H
|
||||||
#define METAFILE_H
|
#define __WINE_METAFILE_H
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
|
||||||
|
@ -37,5 +37,5 @@ BOOL32 MF_StretchBlt(DC *dcDest, short xDest, short yDest, short widthDest,
|
||||||
short heightDest, DC *dcSrc, short xSrc, short ySrc,
|
short heightDest, DC *dcSrc, short xSrc, short ySrc,
|
||||||
short widthSrc, short heightSrc, DWORD rop);
|
short widthSrc, short heightSrc, DWORD rop);
|
||||||
|
|
||||||
#endif /* METAFILE_H */
|
#endif /* __WINE_METAFILE_H */
|
||||||
|
|
||||||
|
|
|
@ -43,5 +43,33 @@ extern BOOL32 MFDRV_ScaleViewportExt( struct tagDC *dc, INT32 xNum,
|
||||||
INT32 xDenom, INT32 yNum, INT32 yDenom );
|
INT32 xDenom, INT32 yNum, INT32 yDenom );
|
||||||
extern BOOL32 MFDRV_ScaleWindowExt( struct tagDC *dc, INT32 xNum, INT32 xDenom,
|
extern BOOL32 MFDRV_ScaleWindowExt( struct tagDC *dc, INT32 xNum, INT32 xDenom,
|
||||||
INT32 yNum, INT32 yDenom );
|
INT32 yNum, INT32 yDenom );
|
||||||
|
extern BOOL32 MFDRV_MoveToEx(struct tagDC *dc, INT32 x, INT32 y, LPPOINT32 pt);
|
||||||
|
extern BOOL32 MFDRV_LineTo( struct tagDC *dc, INT32 x, INT32 y );
|
||||||
|
extern BOOL32 MFDRV_Arc( struct tagDC *dc, INT32 left, INT32 top, INT32 right,
|
||||||
|
INT32 bottom, INT32 xstart, INT32 ystart, INT32 xend,
|
||||||
|
INT32 yend );
|
||||||
|
extern BOOL32 MFDRV_Pie( struct tagDC *dc, INT32 left, INT32 top, INT32 right,
|
||||||
|
INT32 bottom, INT32 xstart, INT32 ystart, INT32 xend,
|
||||||
|
INT32 yend );
|
||||||
|
extern BOOL32 MFDRV_Chord( struct tagDC *dc, INT32 left, INT32 top, INT32 right,
|
||||||
|
INT32 bottom, INT32 xstart, INT32 ystart, INT32 xend,
|
||||||
|
INT32 yend );
|
||||||
|
extern BOOL32 MFDRV_Ellipse( struct tagDC *dc, INT32 left, INT32 top,
|
||||||
|
INT32 right, INT32 bottom );
|
||||||
|
extern BOOL32 MFDRV_Rectangle( struct tagDC *dc, INT32 left, INT32 top,
|
||||||
|
INT32 right, INT32 bottom);
|
||||||
|
extern BOOL32 MFDRV_RoundRect( struct tagDC *dc, INT32 left, INT32 top,
|
||||||
|
INT32 right, INT32 bottom, INT32 ell_width,
|
||||||
|
INT32 ell_height );
|
||||||
|
extern COLORREF MFDRV_SetPixel( struct tagDC *dc, INT32 x, INT32 y, COLORREF color );
|
||||||
|
extern BOOL32 MFDRV_Polyline( struct tagDC *dc, const LPPOINT32 pt,INT32 count);
|
||||||
|
extern BOOL32 MFDRV_Polygon( struct tagDC *dc, LPPOINT32 pt, INT32 count );
|
||||||
|
extern BOOL32 MFDRV_PolyPolygon( struct tagDC *dc, LPPOINT32 pt, LPINT32 counts,
|
||||||
|
UINT32 polygons);
|
||||||
|
extern BOOL32 MFDRV_ExtFloodFill( struct tagDC *dc, INT32 x, INT32 y,
|
||||||
|
COLORREF color, UINT32 fillType );
|
||||||
|
extern BOOL32 MFDRV_ExtTextOut( struct tagDC *dc, INT32 x, INT32 y,
|
||||||
|
UINT32 flags, const RECT32 *lprect, LPCSTR str,
|
||||||
|
UINT32 count, const INT32 *lpDx );
|
||||||
|
|
||||||
#endif /* __WINE_METAFILEDRV_H */
|
#endif /* __WINE_METAFILEDRV_H */
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
* MMSYSTEM - Multimedia Wine Extension ... :-)
|
* MMSYSTEM - Multimedia Wine Extension ... :-)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef MMSYSTEM_H
|
#ifndef __WINE_MMSYSTEM_H
|
||||||
#define MMSYSTEM_H
|
#define __WINE_MMSYSTEM_H
|
||||||
|
|
||||||
typedef LPSTR HPSTR; /* a huge version of LPSTR */
|
typedef LPSTR HPSTR; /* a huge version of LPSTR */
|
||||||
typedef LPCSTR HPCSTR; /* a huge version of LPCSTR */
|
typedef LPCSTR HPCSTR; /* a huge version of LPCSTR */
|
||||||
|
@ -1539,7 +1539,4 @@ DWORD widMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
|
||||||
DWORD wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
|
DWORD wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser,
|
||||||
DWORD dwParam1, DWORD dwParam2);
|
DWORD dwParam1, DWORD dwParam2);
|
||||||
|
|
||||||
#endif /* MMSYSTEM_H */
|
#endif /* __WINE_MMSYSTEM_H */
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
* Copyright 1995 Alexandre Julliard
|
* Copyright 1995 Alexandre Julliard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _WINE_MODULE_H
|
#ifndef __WINE_MODULE_H
|
||||||
#define _WINE_MODULE_H
|
#define __WINE_MODULE_H
|
||||||
|
|
||||||
#include "wintypes.h"
|
#include "wintypes.h"
|
||||||
#include "pe_image.h"
|
#include "pe_image.h"
|
||||||
|
@ -140,4 +140,4 @@ extern BOOL16 NE_LoadSegment( HMODULE16 hModule, WORD segnum );
|
||||||
extern void NE_FixupPrologs( NE_MODULE *pModule );
|
extern void NE_FixupPrologs( NE_MODULE *pModule );
|
||||||
extern void NE_InitializeDLLs( HMODULE16 hModule );
|
extern void NE_InitializeDLLs( HMODULE16 hModule );
|
||||||
|
|
||||||
#endif /* _WINE_MODULE_H */
|
#endif /* __WINE_MODULE_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef __MSDOS_H
|
#ifndef __WINE_MSDOS_H
|
||||||
#define __MSDOS_H
|
#define __WINE_MSDOS_H
|
||||||
|
|
||||||
#include <dirent.h>
|
#include <dirent.h>
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
@ -158,4 +158,4 @@ extern BYTE DOS_ErrorClass, DOS_ErrorAction, DOS_ErrorLocus;
|
||||||
#define EL_Serial 0x04
|
#define EL_Serial 0x04
|
||||||
#define EL_Memory 0x05
|
#define EL_Memory 0x05
|
||||||
|
|
||||||
#endif /* __MSDOS_H */
|
#endif /* __WINE_MSDOS_H */
|
||||||
|
|
|
@ -1,10 +1,8 @@
|
||||||
/* $Id: neexe.h,v 1.4 1993/07/04 04:04:21 root Exp root $
|
|
||||||
*/
|
|
||||||
/*
|
/*
|
||||||
* Copyright Robert J. Amstadt, 1993
|
* Copyright Robert J. Amstadt, 1993
|
||||||
*/
|
*/
|
||||||
#ifndef NEEXE_H
|
#ifndef __WINE_NEEXE_H
|
||||||
#define NEEXE_H
|
#define __WINE_NEEXE_H
|
||||||
|
|
||||||
#include "wintypes.h"
|
#include "wintypes.h"
|
||||||
|
|
||||||
|
@ -229,4 +227,4 @@ struct resource_typeinfo_s
|
||||||
int load_typeinfo (int, struct resource_typeinfo_s *);
|
int load_typeinfo (int, struct resource_typeinfo_s *);
|
||||||
int load_nameinfo (int, struct resource_nameinfo_s *);
|
int load_nameinfo (int, struct resource_nameinfo_s *);
|
||||||
|
|
||||||
#endif /* NEEXE_H */
|
#endif /* __WINE_NEEXE_H */
|
||||||
|
|
|
@ -21,5 +21,7 @@ extern LONG NC_HandleNCLButtonDown( HWND32 hwnd, WPARAM16 wParam,
|
||||||
extern LONG NC_HandleNCLButtonDblClk( WND *pWnd, WPARAM16 wParam, LPARAM lParam);
|
extern LONG NC_HandleNCLButtonDblClk( WND *pWnd, WPARAM16 wParam, LPARAM lParam);
|
||||||
extern LONG NC_HandleSysCommand( HWND32 hwnd, WPARAM16 wParam, POINT16 pt );
|
extern LONG NC_HandleSysCommand( HWND32 hwnd, WPARAM16 wParam, POINT16 pt );
|
||||||
extern LONG NC_HandleSetCursor( HWND32 hwnd, WPARAM16 wParam, LPARAM lParam );
|
extern LONG NC_HandleSetCursor( HWND32 hwnd, WPARAM16 wParam, LPARAM lParam );
|
||||||
|
extern void NC_DrawSysButton( HWND32 hwnd, HDC32 hdc, BOOL32 down );
|
||||||
|
extern BOOL32 NC_GetSysPopupPos( WND* wndPtr, RECT32* rect );
|
||||||
|
|
||||||
#endif /* __WINE_NONCLIENT_H */
|
#endif /* __WINE_NONCLIENT_H */
|
||||||
|
|
|
@ -2,6 +2,9 @@
|
||||||
* ole2.h - Declarations for OLE2
|
* ole2.h - Declarations for OLE2
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#ifndef __WINE_OLE2_H
|
||||||
|
#define __WINE_OLE2_H
|
||||||
|
|
||||||
typedef LONG HRESULT;
|
typedef LONG HRESULT;
|
||||||
|
|
||||||
#define S_OK 0
|
#define S_OK 0
|
||||||
|
@ -10,3 +13,5 @@ typedef LONG HRESULT;
|
||||||
/* OLE version */
|
/* OLE version */
|
||||||
#define rmm 23
|
#define rmm 23
|
||||||
#define rup 639
|
#define rup 639
|
||||||
|
|
||||||
|
#endif /* __WINE_OLE2_H */
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
* Copyright 1994 Alexandre Julliard
|
* Copyright 1994 Alexandre Julliard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef OPTIONS_H
|
#ifndef __WINE_OPTIONS_H
|
||||||
#define OPTIONS_H
|
#define __WINE_OPTIONS_H
|
||||||
|
|
||||||
#include "wintypes.h"
|
#include "wintypes.h"
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@ struct options
|
||||||
int backingstore; /* Use backing store */
|
int backingstore; /* Use backing store */
|
||||||
short cmdShow;
|
short cmdShow;
|
||||||
int debug;
|
int debug;
|
||||||
int allowReadOnly; /* Opening a read only file will succeed even
|
int failReadOnly; /* Opening a read only file will fail
|
||||||
if write access is requested */
|
if write access is requested */
|
||||||
WINE_MODE mode; /* Start Wine in selected mode
|
WINE_MODE mode; /* Start Wine in selected mode
|
||||||
(standard/enhanced) */
|
(standard/enhanced) */
|
||||||
|
@ -70,4 +70,4 @@ extern int PROFILE_GetWineIniString( const char *section, const char *key_name,
|
||||||
extern int PROFILE_GetWineIniInt( const char *section, const char *key_name,
|
extern int PROFILE_GetWineIniInt( const char *section, const char *key_name,
|
||||||
int def );
|
int def );
|
||||||
|
|
||||||
#endif
|
#endif /* __WINE_OPTIONS_H */
|
||||||
|
|
|
@ -253,4 +253,22 @@ struct PE_Debug_dir
|
||||||
#define IMAGE_REL_BASED_HIGHADJ 4
|
#define IMAGE_REL_BASED_HIGHADJ 4
|
||||||
#define IMAGE_REL_BASED_MIPS_JMPADDR 5
|
#define IMAGE_REL_BASED_MIPS_JMPADDR 5
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is the structure that appears at the very start of a .DBG file.
|
||||||
|
*/
|
||||||
|
struct PE_DBG_FileHeader {
|
||||||
|
unsigned short int Signature;
|
||||||
|
unsigned short int Flags;
|
||||||
|
unsigned short int Machine;
|
||||||
|
unsigned short int Characteristics;
|
||||||
|
unsigned int TimeDateStamp;
|
||||||
|
unsigned int CheckSum;
|
||||||
|
unsigned int ImageBase;
|
||||||
|
unsigned int SizeOfImage;
|
||||||
|
unsigned int NumberOfSections;
|
||||||
|
unsigned int ExportedNamesSize;
|
||||||
|
unsigned int DebugDirectorySize;
|
||||||
|
unsigned int Reserved[ 3 ];
|
||||||
|
};
|
||||||
|
|
||||||
#endif /* __WINE_PEEXE_H */
|
#endif /* __WINE_PEEXE_H */
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "handle32.h"
|
#include "handle32.h"
|
||||||
|
#include "task.h"
|
||||||
|
|
||||||
/* Process handle entry */
|
/* Process handle entry */
|
||||||
typedef struct
|
typedef struct
|
||||||
|
@ -29,13 +30,13 @@ typedef struct
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
LPSTR environ; /* 00 Process environment strings */
|
LPSTR environ; /* 00 Process environment strings */
|
||||||
DWORD unknown1; /* 04 Unknown */
|
DWORD env_size; /* 04 Environment size (was: Unknown) */
|
||||||
LPSTR cmd_line; /* 08 Command line */
|
LPSTR cmd_line; /* 08 Command line */
|
||||||
LPSTR cur_dir; /* 0c Current directory */
|
LPSTR cur_dir; /* 0c Current directory */
|
||||||
STARTUPINFO32A *startup_info; /* 10 Startup information */
|
STARTUPINFO32A *startup_info; /* 10 Startup information */
|
||||||
HANDLE32 hStdin; /* 14 Handle for standard input */
|
HANDLE32 hStdin; /* 14 Handle for standard input */
|
||||||
HANDLE32 hStdout; /* 18 Handle for standard output */
|
HANDLE32 hStdout; /* 18 Handle for standard output */
|
||||||
HANDLE32 hStderr; /* 1c Handle for standard error */
|
HANDLE32 hStderr; /* 1c Handle for standard error */
|
||||||
DWORD unknown2; /* 20 Unknown */
|
DWORD unknown2; /* 20 Unknown */
|
||||||
DWORD inherit_console; /* 24 Inherit console flag */
|
DWORD inherit_console; /* 24 Inherit console flag */
|
||||||
DWORD break_type; /* 28 Console events flag */
|
DWORD break_type; /* 28 Console events flag */
|
||||||
|
@ -66,7 +67,7 @@ typedef struct _PDB32
|
||||||
HANDLE32 system_heap; /* 34 System heap to allocate handles */
|
HANDLE32 system_heap; /* 34 System heap to allocate handles */
|
||||||
HTASK32 task; /* 38 Win16 task */
|
HTASK32 task; /* 38 Win16 task */
|
||||||
void *mem_map_files; /* 3c Pointer to mem-mapped files */
|
void *mem_map_files; /* 3c Pointer to mem-mapped files */
|
||||||
ENVDB *env_DB; /* 40 Environment database */
|
ENVDB *env_db; /* 40 Environment database */
|
||||||
HANDLE_TABLE *handle_table; /* 44 Handle table */
|
HANDLE_TABLE *handle_table; /* 44 Handle table */
|
||||||
struct _PDB32 *parent; /* 48 Parent process */
|
struct _PDB32 *parent; /* 48 Parent process */
|
||||||
void *modref_list; /* 4c MODREF list */
|
void *modref_list; /* 4c MODREF list */
|
||||||
|
@ -91,13 +92,15 @@ typedef struct _PDB32
|
||||||
WORD error_mode; /* b6 Error mode */
|
WORD error_mode; /* b6 Error mode */
|
||||||
K32OBJ *load_done_evt; /* b8 Event for process loading done */
|
K32OBJ *load_done_evt; /* b8 Event for process loading done */
|
||||||
DWORD unknown7; /* bc Unknown */
|
DWORD unknown7; /* bc Unknown */
|
||||||
|
DWORD unknown8; /* c0 Unknown (NT) */
|
||||||
|
LCID locale; /* c4 Locale to be queried by GetThreadLocale (NT) */
|
||||||
} PDB32;
|
} PDB32;
|
||||||
|
|
||||||
extern HANDLE32 PROCESS_AllocHandle( K32OBJ *ptr, DWORD flags);
|
extern HANDLE32 PROCESS_AllocHandle( K32OBJ *ptr, DWORD flags);
|
||||||
extern K32OBJ *PROCESS_GetObjPtr( HANDLE32 handle, K32OBJ_TYPE type );
|
extern K32OBJ *PROCESS_GetObjPtr( HANDLE32 handle, K32OBJ_TYPE type );
|
||||||
extern BOOL32 PROCESS_SetObjPtr( HANDLE32 handle, K32OBJ *ptr, DWORD flags );
|
extern BOOL32 PROCESS_SetObjPtr( HANDLE32 handle, K32OBJ *ptr, DWORD flags );
|
||||||
|
|
||||||
extern PDB32 *PROCESS_Create(void);
|
extern PDB32 *PROCESS_Create( TDB *pTask );
|
||||||
extern void PROCESS_Destroy( K32OBJ *ptr );
|
extern void PROCESS_Destroy( K32OBJ *ptr );
|
||||||
|
|
||||||
extern PDB32 *pCurrentProcess;
|
extern PDB32 *pCurrentProcess;
|
||||||
|
|
|
@ -5,8 +5,8 @@
|
||||||
* Copyright 1994 Alexandre Julliard
|
* Copyright 1994 Alexandre Julliard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SCROLL_H
|
#ifndef __WINE_SCROLL_H
|
||||||
#define SCROLL_H
|
#define __WINE_SCROLL_H
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
|
||||||
|
@ -26,4 +26,4 @@ extern void SCROLL_DrawScrollBar( HWND32 hwnd, HDC32 hdc, INT32 nBar,
|
||||||
extern void SCROLL_HandleScrollEvent( HWND32 hwnd, INT32 nBar,
|
extern void SCROLL_HandleScrollEvent( HWND32 hwnd, INT32 nBar,
|
||||||
UINT32 msg, POINT32 pt );
|
UINT32 msg, POINT32 pt );
|
||||||
|
|
||||||
#endif /* SCROLL_H */
|
#endif /* __WINE_SCROLL_H */
|
||||||
|
|
|
@ -40,6 +40,11 @@ extern void SELECTOR_FreeBlock( WORD sel, WORD count );
|
||||||
#define WINE_CODE_SELECTOR 0x17
|
#define WINE_CODE_SELECTOR 0x17
|
||||||
#endif /* svr4 || SCO_DS */
|
#endif /* svr4 || SCO_DS */
|
||||||
|
|
||||||
|
#ifdef __EMX__
|
||||||
|
#define WINE_DATA_SELECTOR 0x00 /* FIXME: This is wrong */
|
||||||
|
#define WINE_CODE_SELECTOR 0x00
|
||||||
|
#endif /* OS/2 */
|
||||||
|
|
||||||
#else /* WINELIB */
|
#else /* WINELIB */
|
||||||
|
|
||||||
#define WINE_DATA_SELECTOR 0x00
|
#define WINE_DATA_SELECTOR 0x00
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Shell Library definitions
|
* Shell Library definitions
|
||||||
*/
|
*/
|
||||||
#include "wintypes.h"
|
|
||||||
|
|
||||||
#ifndef __WINE_SHELL_H
|
#ifndef __WINE_SHELL_H
|
||||||
#define __WINE_SHELL_H
|
#define __WINE_SHELL_H
|
||||||
|
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
* Copyright 1994 Alexandre Julliard
|
* Copyright 1994 Alexandre Julliard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef STATIC_H
|
#ifndef __WINE_STATIC_H
|
||||||
#define STATIC_H
|
#define __WINE_STATIC_H
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
|
||||||
|
@ -19,4 +19,4 @@ typedef struct
|
||||||
|
|
||||||
extern LRESULT StaticWndProc(HWND hWnd,UINT uMsg,WPARAM16 wParam,LPARAM lParam );
|
extern LRESULT StaticWndProc(HWND hWnd,UINT uMsg,WPARAM16 wParam,LPARAM lParam );
|
||||||
|
|
||||||
#endif /* STATIC_H */
|
#endif /* __WINE_STATIC_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef __STRESS_H
|
#ifndef __WINE_STRESS_H
|
||||||
#define __STRESS_H
|
#define __WINE_STRESS_H
|
||||||
|
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
|
|
||||||
|
@ -27,4 +27,4 @@ void UnAllocFileHandles(void);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* __STRESS_H */
|
#endif /* __WINE_STRESS_H */
|
||||||
|
|
|
@ -5,12 +5,12 @@
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _STRING32_H
|
#ifndef __WINE_STRING32_H
|
||||||
#define _STRING32_H
|
#define __WINE_STRING32_H
|
||||||
|
|
||||||
#include "wintypes.h"
|
#include "wintypes.h"
|
||||||
|
|
||||||
LPWSTR STRING32_DupAnsiToUni(LPCSTR src);
|
LPWSTR STRING32_DupAnsiToUni(LPCSTR src);
|
||||||
LPWSTR STRING32_strdupW(LPCWSTR);
|
LPWSTR STRING32_strdupW(LPCWSTR);
|
||||||
|
|
||||||
#endif
|
#endif /* __WINE_STRING32_H */
|
||||||
|
|
|
@ -3,12 +3,6 @@
|
||||||
#define __WINE__STRUCT32_H
|
#define __WINE__STRUCT32_H
|
||||||
#include "handle32.h"
|
#include "handle32.h"
|
||||||
|
|
||||||
void STRUCT32_RECT32to16(const RECT32*,RECT16*);
|
|
||||||
void STRUCT32_RECT16to32(const RECT16*,RECT32*);
|
|
||||||
void STRUCT32_POINT32to16(const POINT32*,POINT16*);
|
|
||||||
void STRUCT32_POINT16to32(const POINT16*,POINT32*);
|
|
||||||
void STRUCT32_SIZE16to32(const SIZE16*, SIZE32*);
|
|
||||||
|
|
||||||
extern void STRUCT32_MINMAXINFO32to16( const MINMAXINFO32*, MINMAXINFO16* );
|
extern void STRUCT32_MINMAXINFO32to16( const MINMAXINFO32*, MINMAXINFO16* );
|
||||||
extern void STRUCT32_MINMAXINFO16to32( const MINMAXINFO16*, MINMAXINFO32* );
|
extern void STRUCT32_MINMAXINFO16to32( const MINMAXINFO16*, MINMAXINFO32* );
|
||||||
extern void STRUCT32_WINDOWPOS32to16( const WINDOWPOS32*, WINDOWPOS16* );
|
extern void STRUCT32_WINDOWPOS32to16( const WINDOWPOS32*, WINDOWPOS16* );
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
* Copyright Alexandre Julliard, 1994
|
* Copyright Alexandre Julliard, 1994
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SYSCOLOR_H
|
#ifndef __WINE_SYSCOLOR_H
|
||||||
#define SYSCOLOR_H
|
#define __WINE_SYSCOLOR_H
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
|
||||||
|
@ -37,4 +37,4 @@ struct SysColorObjects
|
||||||
extern void SYSCOLOR_Init(void);
|
extern void SYSCOLOR_Init(void);
|
||||||
extern struct SysColorObjects sysColorObjects;
|
extern struct SysColorObjects sysColorObjects;
|
||||||
|
|
||||||
#endif /* SYSCOLOR_H */
|
#endif /* __WINE_SYSCOLOR_H */
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
* Copyright 1994 Alexandre Julliard
|
* Copyright 1994 Alexandre Julliard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef SYSMETRICS_H
|
#ifndef __WINE_SYSMETRICS_H
|
||||||
#define SYSMETRICS_H
|
#define __WINE_SYSMETRICS_H
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
|
||||||
|
@ -77,4 +77,4 @@
|
||||||
extern void SYSMETRICS_Init(void);
|
extern void SYSMETRICS_Init(void);
|
||||||
extern short sysMetrics[SM_CMETRICS+1];
|
extern short sysMetrics[SM_CMETRICS+1];
|
||||||
|
|
||||||
#endif
|
#endif /* __WINE_SYSMETRICS_H */
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
* Copyright 1995 Alexandre Julliard
|
* Copyright 1995 Alexandre Julliard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _WINE_TASK_H
|
#ifndef __WINE_TASK_H
|
||||||
#define _WINE_TASK_H
|
#define __WINE_TASK_H
|
||||||
|
|
||||||
#include "wintypes.h"
|
#include "wintypes.h"
|
||||||
|
|
||||||
|
@ -28,7 +28,8 @@ typedef struct
|
||||||
WORD reserved2[2];
|
WORD reserved2[2];
|
||||||
WORD nbFiles; /* 32 Number of file handles */
|
WORD nbFiles; /* 32 Number of file handles */
|
||||||
SEGPTR fileHandlesPtr; /* 34 Pointer to file handle table */
|
SEGPTR fileHandlesPtr; /* 34 Pointer to file handle table */
|
||||||
WORD reserved3[18];
|
HANDLE16 hFileHandles; /* 38 Handle to fileHandlesPtr */
|
||||||
|
WORD reserved3[17];
|
||||||
BYTE fcb1[16]; /* 5c First FCB */
|
BYTE fcb1[16]; /* 5c First FCB */
|
||||||
BYTE fcb2[20]; /* 6c Second FCB */
|
BYTE fcb2[20]; /* 6c Second FCB */
|
||||||
BYTE cmdLine[128]; /* 80 Command-line (first byte is len)*/
|
BYTE cmdLine[128]; /* 80 Command-line (first byte is len)*/
|
||||||
|
@ -117,4 +118,4 @@ extern HTASK16 TASK_CreateTask( HMODULE16 hModule, HINSTANCE16 hInstance,
|
||||||
extern void TASK_KillCurrentTask( INT16 exitCode );
|
extern void TASK_KillCurrentTask( INT16 exitCode );
|
||||||
extern HTASK16 TASK_GetNextTask( HTASK16 hTask );
|
extern HTASK16 TASK_GetNextTask( HTASK16 hTask );
|
||||||
|
|
||||||
#endif /* _WINE_TASK_H */
|
#endif /* __WINE_TASK_H */
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#ifndef __TOOLHELP_H
|
#ifndef __WINE_TOOLHELP_H
|
||||||
#define __TOOLHELP_H
|
#define __WINE_TOOLHELP_H
|
||||||
|
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
|
||||||
|
@ -343,4 +343,4 @@ struct {
|
||||||
FARPROC16 lpfnErrorAddr;
|
FARPROC16 lpfnErrorAddr;
|
||||||
void **lpBadParam;
|
void **lpBadParam;
|
||||||
} NFYLOGPARAMERROR;
|
} NFYLOGPARAMERROR;
|
||||||
#endif /* __TOOLHELP_H */
|
#endif /* __WINE_TOOLHELP_H */
|
||||||
|
|
|
@ -4,8 +4,8 @@
|
||||||
* Copyright 1993 Alexandre Julliard
|
* Copyright 1993 Alexandre Julliard
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef USER_H
|
#ifndef __WINE_USER_H
|
||||||
#define USER_H
|
#define __WINE_USER_H
|
||||||
|
|
||||||
#include "ldt.h"
|
#include "ldt.h"
|
||||||
#include "local.h"
|
#include "local.h"
|
||||||
|
@ -23,4 +23,4 @@ extern WORD USER_HeapSel;
|
||||||
#define USER_HEAP_SEG_ADDR(handle) \
|
#define USER_HEAP_SEG_ADDR(handle) \
|
||||||
((handle) ? PTR_SEG_OFF_TO_SEGPTR(USER_HeapSel, (handle)) : (SEGPTR)0)
|
((handle) ? PTR_SEG_OFF_TO_SEGPTR(USER_HeapSel, (handle)) : (SEGPTR)0)
|
||||||
|
|
||||||
#endif /* USER_H */
|
#endif /* __WINE_USER_H */
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue