From 5819953c2ac390b6b716b1c2744f3400448baf56 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 21 Apr 1994 01:20:00 +0000 Subject: [PATCH] Release 940420 Wed Apr 20 14:53:35 1994 Bob Amstadt (bob@pooh) * [tools/build.c] [if1632/call.S] [if1632/Imakefile] Fixed bug for non-Linux systems. Apr 18, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) * [windows/win.c] Bug fixed in CreateWindowEx() : Now use SetMenu() for menubar setup. New empty stub for function SetSysModalWindow(). * [misc/exec.c] New empty stub for function ExitWindows(). * [objects/font.c] New empty stub for function EnumFonts(). * New file [misc/property.c] New functions RemoveProp(), GetProp(), SetProp() & EnumProps(). * New file [misc/shell.c] New empty stubs for function RegisterShellProc(), ShellExecute() & ShellProc(). * New files [loader/task.c] & [include/task.h] Move functions GetWindowTask(), GetNumTask(), EnumTaskWindows() from 'loader/library.c'. * [if1632/user.c] [if1632/kernel.c] Put Atoms functions entries. * [controls/combo.c] New functions DirDlgSelectComboBox() & DirDlgListComboBox(). * [controls/listbox.c] New functions DirDlgSelect() & DirDlgList(). Sun Apr 17 20:57:59 1994 Erik Bos (erik@trashcan.hacktic.nl) * [objects/test.c] GrayString() added. * [if1632/callback.c] CallGrayStringProc() added. * [if1632/relay.c] [if1632/mmsystem.spec] Added. * [if1632/kernel.spec] [if1632/user.spec] Added forgotten specs for atom functions. Tue Apr 12 00:05:31 1994 Bob Amstadt (bob@pooh) * misc/spy.c (SpyInit): Added more message types * [windows/mdi.c] [include/mdi.h] Maximizing and restoring child windows. Tiling of child windows. Mon Apr 11 20:48:28 1994 Alexandre Julliard (julliard@lamisun.epfl.ch) * [windows/winpos.c] Revert focus and activation to previous window when hiding a window. * [windows/syscolor.c] Implemented system color objects (brushes and pens created at SetSysColor() time for better performance). * [windows/graphics.c] [windows/nonclient.c] [controls/button.c] Changed painting code to use system color objects. * [windows/message.c] New function MSG_InternalGetMessage() for internal messages loops (e.g. for dialogs or menus). * [windows/hook.c] [include/hook.h] (New files) Beginning of the window hooks implementation. * [windows/dialog.c] Use new function MSG_InternalGetMessage() in DialogBox(). * [if1632/callback.c] Added function CallHookProc(). Apr 11, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) * [windows/event.c] Bug fix : WM_CHARs are sent to focused window like WM_KEY???. * [misc/exec.c] Nothing much more than a stub for LoadModule(), I saw there a lot to be done in that corner, I will come back later ... * [loader/library.c] New functions GetWindowTask(), GetNumTask(), EnumTaskWindows() and associated modules & tasks linked-lists. (it's only an 'emerging bud', more to come next weeks). * [loader/wine.c] Use LoadLibrary() instead of LoadImage() for 'sysres.dll'. * [control/menu.c] You can now click outside menu region without problem. Keyboard navig more smootly, even if a child has the focus. Bug fix in InsertItem(), (bad linklist when insert point not found). change Realloc for Free & Alloc in ModifyItem(). MF_STRING now set BLACK_PEN to fix bug of bad color of the underscores done by DrawText(), (maybe it should done in DrawText() itself ?). Sun Apr 10 14:06:08 1994 Erik Bos (erik@trashcan.hacktic.nl) * [misc/profile.c] .INI files will now be stored in / loaded from the windows dir if no path is supplied. * [if1632/kernel.spec] Fixed GetDriveType's prototype. * [if1632/winsock.spec] [include/winsock.h] [misc/winsocket.c] Fixed prototypes: winsock uses a word as socket handle not an int. * [misc/winsocket.c] Added heap allocation for returned structures. Added non-blocking WSAAsyncGetXbyY() functions as blocking ones. * [loader/wine.c] Added IsDLLLoaded(), used in LoadImage() to prevent loading a dll multiple times. Directory is added to wine's path when a fullpath is supplied when starting wine. LoadImage(): DLL filename used instead DLL's own internal name, fixes 'Bad DLL name' errors. Sat Apr 9 08:26:03 1994 David Metcalfe * [controls/edit.c] [controls/widgets.c] First release of edit control. --- BUGS | 4 +- ChangeLog | 141 + Configure | 0 PROPOSED_LICENSE | 29 - README | 17 + WIN31-APPLETS | 45 - ansi2oem.trl | Bin 256 -> 0 bytes autoconf.h | 6 +- controls/Imakefile | 1 + controls/button.c | 92 +- controls/combo.c | 32 +- controls/edit.c | 2384 +++++++++++++++++ controls/listbox.c | 25 + controls/menu.c | 355 +-- controls/widgets.c | 3 + debugger/bfd.h | 1421 ---------- debugger/break.c | 83 + debugger/defs.h | 818 ------ debugger/fopen-same.h | 27 - debugger/gdbcore.h | 119 - debugger/opcodes/Imakefile | 29 + debugger/{ => opcodes}/ansidecl.h | 68 +- debugger/opcodes/bfd.h | 2171 +++++++++++++++ debugger/opcodes/dis-asm.h | 179 ++ debugger/opcodes/dis-asm.h-fsf | 178 ++ debugger/opcodes/dis-buf.c | 70 + debugger/opcodes/i386-dis.c | 2029 ++++++++++++++ .../{i386-pinsn.c => opcodes/i386-dis.c-fsf} | 239 +- debugger/{ => opcodes}/obstack.h | 230 +- debugger/tm-i386v.h | 324 --- debugger/tm.h | 27 - debugger/xm-i386v.h | 45 - debugger/xm.h | 26 - etc/commdlg-ordinals | 26 + etc/ddeml-ordinals | 38 + etc/lzexpand-ordinals | 12 + etc/mmsystem-ordinals | 136 + etc/netapi20-ordinals | 146 + etc/olecli-ordinals | 178 ++ etc/olesvr-ordinals | 23 + etc/shell-ordinals | 26 + etc/toolhelp-ordinals | 35 + etc/win87em-ordinals | 5 + if1632/Imakefile | 6 +- if1632/call.S | 13 +- if1632/callback.c | 40 + if1632/findfunc | 0 if1632/gdi.spec | 1 + if1632/kernel.spec | 20 +- if1632/mmsystem.spec | 74 + if1632/pop.h | 16 + if1632/shell.spec | 36 + if1632/system.spec | 3 + if1632/toolhelp.spec | 3 + if1632/user.spec | 26 + if1632/winsock.spec | 38 +- include/driver.h | 70 + include/gdi.h | 3 +- include/hook.h | 42 + include/mdi.h | 2 + include/menu.h | 3 +- include/message.h | 2 + include/metafile.h | 45 + include/mmsystem.h | 1390 ++++++++++ include/msdos.h | 1 + include/regfunc.h | 24 +- include/shell.h | 40 + include/syscolor.h | 39 + include/task.h | 27 + include/user.h | 3 +- include/win.h | 10 +- include/windows.h | 248 +- include/wine.h | 3 +- include/winsock.h | 92 +- loader/Imakefile | 1 + loader/library.c | 147 +- loader/task.c | 159 ++ loader/wine.c | 37 +- misc/Imakefile | 2 + misc/audio.c | 97 + misc/dos_fs.c | 2 - misc/driver.c | 181 ++ misc/exec.c | 74 +- misc/file.c | 62 +- misc/lstr.c | 14 +- misc/main.c | 12 +- misc/message.c | 78 +- misc/mmsystem.c | 1031 +++++++ misc/network.c | 119 + misc/profile.c | 31 +- misc/property.c | 197 ++ misc/shell.c | 71 + misc/spy.c | 15 +- misc/winsocket.c | 574 +++- miscemu/int10.c | 1 + miscemu/int1a.c | 1 + miscemu/int21.c | 9 +- miscemu/int25.c | 14 +- miscemu/int26.c | 13 +- miscemu/int2f.c | 26 + miscemu/ioports.c | 1 + objects/font.c | 36 +- objects/metafile.c | 444 +++ objects/text.c | 26 +- oem2ansi.trl | Bin 256 -> 0 bytes oemansi.exe | Bin 13927 -> 0 bytes sysres.dll | Bin 110592 -> 0 bytes test/blandmdi.exe | Bin 35928 -> 0 bytes test/widget.exe | Bin 321606 -> 0 bytes tools/Imakefile | 2 +- tools/build.c | 207 +- tools/build.c.save | 847 ++++++ windows/Imakefile | 1 + windows/caret.c | 2 +- windows/defwnd.c | 13 +- windows/dialog.c | 23 +- windows/event.c | 2 +- windows/graphics.c | 24 +- windows/hook.c | 122 + windows/mdi.c | 364 ++- windows/message.c | 43 +- windows/nonclient.c | 41 +- windows/syscolor.c | 78 +- windows/win.c | 51 +- windows/winpos.c | 25 +- wine.ini | 57 +- 126 files changed, 15468 insertions(+), 4071 deletions(-) mode change 100755 => 100644 Configure delete mode 100644 PROPOSED_LICENSE delete mode 100644 WIN31-APPLETS delete mode 100755 ansi2oem.trl create mode 100644 controls/edit.c delete mode 100644 debugger/bfd.h create mode 100644 debugger/break.c delete mode 100644 debugger/defs.h delete mode 100644 debugger/fopen-same.h delete mode 100644 debugger/gdbcore.h create mode 100644 debugger/opcodes/Imakefile rename debugger/{ => opcodes}/ansidecl.h (61%) create mode 100644 debugger/opcodes/bfd.h create mode 100644 debugger/opcodes/dis-asm.h create mode 100644 debugger/opcodes/dis-asm.h-fsf create mode 100644 debugger/opcodes/dis-buf.c create mode 100644 debugger/opcodes/i386-dis.c rename debugger/{i386-pinsn.c => opcodes/i386-dis.c-fsf} (91%) rename debugger/{ => opcodes}/obstack.h (70%) delete mode 100644 debugger/tm-i386v.h delete mode 100644 debugger/tm.h delete mode 100644 debugger/xm-i386v.h delete mode 100644 debugger/xm.h create mode 100644 etc/commdlg-ordinals create mode 100644 etc/ddeml-ordinals create mode 100644 etc/lzexpand-ordinals create mode 100644 etc/mmsystem-ordinals create mode 100644 etc/netapi20-ordinals create mode 100644 etc/olecli-ordinals create mode 100644 etc/olesvr-ordinals create mode 100644 etc/shell-ordinals create mode 100644 etc/toolhelp-ordinals create mode 100644 etc/win87em-ordinals mode change 100755 => 100644 if1632/findfunc create mode 100644 if1632/mmsystem.spec create mode 100644 if1632/pop.h create mode 100644 if1632/system.spec create mode 100644 if1632/toolhelp.spec create mode 100644 include/driver.h create mode 100644 include/hook.h create mode 100644 include/metafile.h create mode 100644 include/mmsystem.h create mode 100644 include/shell.h create mode 100644 include/syscolor.h create mode 100644 include/task.h create mode 100644 loader/task.c create mode 100644 misc/audio.c create mode 100644 misc/driver.c create mode 100644 misc/mmsystem.c create mode 100644 misc/network.c create mode 100644 misc/property.c create mode 100644 misc/shell.c create mode 100644 miscemu/int2f.c create mode 100644 objects/metafile.c delete mode 100755 oem2ansi.trl delete mode 100755 oemansi.exe delete mode 100755 sysres.dll delete mode 100644 test/blandmdi.exe delete mode 100755 test/widget.exe create mode 100644 tools/build.c.save create mode 100644 windows/hook.c diff --git a/BUGS b/BUGS index d005f852b85..3d5372275cc 100644 --- a/BUGS +++ b/BUGS @@ -1,5 +1,5 @@ - EBP and ESP are sometimes corrupted while running 16-bit code. - Dialog Boxes created by WM_CREATE handler aren't visible - RegisterClass() with hbrBackground = COLOR_APPWORKSPACE+1 does not work. -- MDI client area needs to resize when frame does -- Need to generate WM_CHILDACTIVATE \ No newline at end of file +- MDI does not send WM_GETMINMAX message. +- InitializeLoadedDLLs() can't init LZEXPAND.DLL. (cs:ip => 0:0) diff --git a/ChangeLog b/ChangeLog index c69135a14a8..d446171d14c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,144 @@ +Wed Apr 20 14:53:35 1994 Bob Amstadt (bob@pooh) + + * [tools/build.c] [if1632/call.S] [if1632/Imakefile] + Fixed bug for non-Linux systems. + +Apr 18, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) + + * [windows/win.c] + Bug fixed in CreateWindowEx() : Now use SetMenu() for menubar setup. + New empty stub for function SetSysModalWindow(). + + * [misc/exec.c] + New empty stub for function ExitWindows(). + + * [objects/font.c] + New empty stub for function EnumFonts(). + + * New file [misc/property.c] + New functions RemoveProp(), GetProp(), SetProp() & EnumProps(). + + * New file [misc/shell.c] + New empty stubs for function RegisterShellProc(), + ShellExecute() & ShellProc(). + + * New files [loader/task.c] & [include/task.h] + Move functions GetWindowTask(), GetNumTask(), EnumTaskWindows() + from 'loader/library.c'. + + * [loader/library.c] + + * [if1632/user.c] [if1632/kernel.c] + Put Atoms functions entries. + + * [controls/combo.c] + New functions DirDlgSelectComboBox() & DirDlgListComboBox(). + + * [controls/listbox.c] + New functions DirDlgSelect() & DirDlgList(). + +Sun Apr 17 20:57:59 1994 Erik Bos (erik@trashcan.hacktic.nl) + + * [objects/test.c] + GrayString() added. + + * [if1632/callback.c] + CallGrayStringProc() added. + + * [if1632/relay.c] [if1632/mmsystem.spec] + Added. + + * [if1632/kernel.spec] [if1632/user.spec] + Added forgotten specs for atom functions. + +---------------------------------------------------------------------- +Tue Apr 12 00:05:31 1994 Bob Amstadt (bob@pooh) + + * misc/spy.c (SpyInit): Added more message types + + * [windows/mdi.c] [include/mdi.h] + Maximizing and restoring child windows. + Tiling of child windows. + +Mon Apr 11 20:48:28 1994 Alexandre Julliard (julliard@lamisun.epfl.ch) + + * [windows/winpos.c] + Revert focus and activation to previous window when hiding a window. + + * [windows/syscolor.c] + Implemented system color objects (brushes and pens created at + SetSysColor() time for better performance). + + * [windows/graphics.c] [windows/nonclient.c] [controls/button.c] + Changed painting code to use system color objects. + + * [windows/message.c] + New function MSG_InternalGetMessage() for internal messages + loops (e.g. for dialogs or menus). + + * [windows/hook.c] [include/hook.h] (New files) + Beginning of the window hooks implementation. + + * [windows/dialog.c] + Use new function MSG_InternalGetMessage() in DialogBox(). + + * [if1632/callback.c] + Added function CallHookProc(). + +Apr 11, 94 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte) + + * [windows/event.c] + Bug fix : WM_CHARs are sent to focused window like WM_KEY???. + + * [misc/exec.c] + Nothing much more than a stub for LoadModule(), I saw there a lot + to be done in that corner, I will come back later ... + + * [loader/library.c] + New functions GetWindowTask(), GetNumTask(), EnumTaskWindows() + and associated modules & tasks linked-lists. + (it's only an 'emerging bud', more to come next weeks). + + * [loader/wine.c] + Use LoadLibrary() instead of LoadImage() for 'sysres.dll'. + + * [control/menu.c] + You can now click outside menu region without problem. + Keyboard navig more smootly, even if a child has the focus. + Bug fix in InsertItem(), (bad linklist when insert point not found). + change Realloc for Free & Alloc in ModifyItem(). + MF_STRING now set BLACK_PEN to fix bug of bad color of the underscores + done by DrawText(), (maybe it should done in DrawText() itself ?). + +Sun Apr 10 14:06:08 1994 Erik Bos (erik@trashcan.hacktic.nl) + + * [misc/profile.c] + .INI files will now be stored in / loaded from the windows dir + if no path is supplied. + + * [if1632/kernel.spec] + Fixed GetDriveType's prototype. + + * [if1632/winsock.spec] [include/winsock.h] [misc/winsocket.c] + Fixed prototypes: winsock uses a word as socket handle not an int. + + * [misc/winsocket.c] + Added heap allocation for returned structures. + Added non-blocking WSAAsyncGetXbyY() functions as blocking ones. + + * [loader/wine.c] + Added IsDLLLoaded(), used in LoadImage() to prevent loading + a dll multiple times. + Directory is added to wine's path when a fullpath is supplied when + starting wine. + LoadImage(): DLL filename used instead DLL's own internal name, + fixes 'Bad DLL name' errors. + +Sat Apr 9 08:26:03 1994 David Metcalfe + + * [controls/edit.c] [controls/widgets.c] + First release of edit control. + ---------------------------------------------------------------------- Tue Apr 5 14:36:59 1994 Bob Amstadt (bob@pooh) diff --git a/Configure b/Configure old mode 100755 new mode 100644 diff --git a/PROPOSED_LICENSE b/PROPOSED_LICENSE deleted file mode 100644 index a7d2f7a94a3..00000000000 --- a/PROPOSED_LICENSE +++ /dev/null @@ -1,29 +0,0 @@ -You may without charge, royalty or other payment, copy and -distribute copies of this work and derivative works of this work -in source or binary form provided that: (1) -you appropriately publish on each copy an appropriate copyright -notice; (2) faithfully reproduce all prior copyright notices -included in the original work (you may also add your own -copyright notice); and (3) agree to indemnify and hold all prior -authors, copyright holders and licensors of the work harmless -from and against all damages arising from use of the work. - -You may distribute sources of derivative works of the work -provided that (1) (a) all source files of the original work that -have been modified, (b) all source files of the derivative work -that contain any party of the original work, and (c) all source -files of the derivative work that are necessary to compile, link -and run the derivative work without unresolved external calls and -with the same functionality of the original work ("Necessary -Sources") carry a prominent notice explaining the nature and date -of the modification and/or creation. You are encouraged to make -the Necessary Sources available under this license in order to -further the development and acceptance of the work. - -EXCEPT AS OTHERWISE RESTRICTED BY LAW, THIS WORK IS PROVIDED -WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES OF ANY KIND, INCLUDING -BUT NOT LIMITED TO, ANY IMPLIED WARRANTIES OF FITNESS FOR A -PARTICULAR PURPOSE, MERCHANTABILITY OR TITLE. EXCEPT AS -OTHERWISE PROVIDED BY LAW, NO AUTHOR, COPYRIGHT HOLDER OR -LICENSOR SHALL BE LIABLE TO YOU FOR DAMAGES OF ANY KIND, EVEN IF -ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. diff --git a/README b/README index abc84a9a3b4..4e3c6a3056a 100644 --- a/README +++ b/README @@ -115,6 +115,9 @@ For example: to run Windows' solitaire: wine /usr/windows/sol.exe (using a unixfilename) +note: the path of the file will also be added to the path when + a full name is supplied on the commandline. + Have a nice game of solitaire, but be careful. Emulation isn't perfect. So, occassionally it will crash. @@ -168,6 +171,20 @@ bob@amscons.com 7. WHAT'S NEW +WHAT'S NEW with Wine-940420: (see ChangeLog for details) + - new property functions + - new listbox and combo box functions + - GrayString() and CallGrayStringProc() + - and many many bug fixes! + +WHAT'S NEW with Wine-940412: (see ChangeLog for details) + - menuing improvements + - drawing performance improvements + - beginnings of hooks + - MDI maximizing and tiling + - improvements in winsock implementation + - and many many bug fixes! + WHAT'S NEW with Wine-940405: (see ChangeLog for details) - Mouse activation of menus working again - GetprocAddress() diff --git a/WIN31-APPLETS b/WIN31-APPLETS deleted file mode 100644 index edc64e4b6d0..00000000000 --- a/WIN31-APPLETS +++ /dev/null @@ -1,45 +0,0 @@ - Status of MS Windows 3.1 Applets - - -September 13, 1993 - -I copied the following DLLs from my Windows (3.1) directory to my Wine -directory. Below I show how most of the programs included with -Windows 3.1 died. - - commdlg.dll olesvr.dll recorder.dll - olecli.dll pbrush.dll toolhelp.dll - -Scott Laird (lair@midway.uchicago.edu) - - -calc.exe dies no USER.89 (CreateDialog) -calendar.exe dies no KERNEL.60 (FindResource) -cardfile.exe cannot read relocation info -charmap.exe dies no USER.89 (CreateDialog) -clipbrd.exe dies no error -clock.exe dies no KERNEL.60 (FindResource) -control.exe dies no KERNEL.90 (lstrlen) -drwatson.exe dies no KERNEL.36 (GetCurrentTask) -mplayer.exe no MMSYSTEM.dll -notepad.exe dies no error -nwpopup.exe dies no KERNEL.47 (GetModuleHandle) -packager.exe cannot read relocation info -pbrush.exe cannot read relocation info -pifedit.exe dies no KERNEL.60 (FindResource) -printman.exe dies no KERNEL.107 (SetErrorMode) -progman.exe dies no error -recorder.exe cannot read relocation info -regedit.exe dies no KERNEL.90 (lstrlen) -sol.exe ** RUNS ** -soundrec.exe no MMSYSTEM.dll -sysedit.exe dies no USER.159 (GetSubMenu) -terminal.exe dies int21 2a -winfile.exe DOS ax=2fdf, dies no KERNEL.107 -winhelp.exe dies no KERNEL.60 (FindResource) -winmine.exe dies no USER.256 (GetDesktopWindow) -winpopup.exe no NETAPI -wintutor.exe 'Cannot load WINTUTOR.DAT' (file present) -write.exe cannot read relocation info - - diff --git a/ansi2oem.trl b/ansi2oem.trl deleted file mode 100755 index 2805bb3ddd83dbac6e13bac8e6574d5803874095..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmZQzWMXDvWn<^yMC+6cQE@6%&_`l#-T_m6KOcR8m$^Ra4i{)Y8_`)zddH zG%_|ZH8Z!cw6eCbwX=6{baHlab#wRd^z!!c_45x13kuy*zw{<(KWm6DgOTcukR|KsCdWA$euzjO?juV1q|euX0t^z~0_aGl`l z>InocOZ|ahW`%!fXy~lS_=l|vniE^vCboAqb#(SF?CDNfGIi19{3+k^r!St?SQ$S9 E01P!;XaE2J diff --git a/autoconf.h b/autoconf.h index 223fbc15817..e6e34a8176f 100644 --- a/autoconf.h +++ b/autoconf.h @@ -1,2 +1,6 @@ /* autoconf.h generated automatically. Run Configure. */ -#error You must run Configure before you can build the makefiles. + + + +#define WINE_INI_GLOBAL "/home/alex/wine/wine.conf" +#define AutoDefines diff --git a/controls/Imakefile b/controls/Imakefile index 0f76706fd33..261529412c8 100644 --- a/controls/Imakefile +++ b/controls/Imakefile @@ -9,6 +9,7 @@ SRCS = \ menu.c \ scroll.c \ static.c \ + edit.o \ desktop.c \ widgets.c diff --git a/controls/button.c b/controls/button.c index f58057b261e..8d968199f70 100644 --- a/controls/button.c +++ b/controls/button.c @@ -10,12 +10,10 @@ static char Copyright2[] = "Copyright David Metcalfe, 1993"; #include #include "win.h" #include "user.h" +#include "syscolor.h" LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam); -static COLORREF color_windowtext, color_windowframe, color_btnface, - color_btnshadow, color_btntext, color_btnhighlight; - static BOOL pressed; #define NOTIFY_PARENT(hWndCntrl, wNotifyCode) \ @@ -203,14 +201,6 @@ LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam) lResult = -1L; else { - /* initialise colours used for button rendering: */ - color_windowtext = GetSysColor(COLOR_WINDOWTEXT); - color_windowframe = GetSysColor(COLOR_WINDOWFRAME); - color_btnface = GetSysColor(COLOR_BTNFACE); - color_btnshadow = GetSysColor(COLOR_BTNSHADOW); - color_btntext = GetSysColor(COLOR_BTNTEXT); - color_btnhighlight = GetSysColor(COLOR_BTNHIGHLIGHT); - (WORD)(*(wndPtr->wExtra)) = 0; pressed = FALSE; lResult = 0L; @@ -246,12 +236,6 @@ LONG ButtonWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam) break; case WM_SYSCOLORCHANGE: - color_windowtext = GetSysColor(COLOR_WINDOWTEXT); - color_windowframe = GetSysColor(COLOR_WINDOWFRAME); - color_btnface = GetSysColor(COLOR_BTNFACE); - color_btnshadow = GetSysColor(COLOR_BTNSHADOW); - color_btntext = GetSysColor(COLOR_BTNTEXT); - color_btnhighlight = GetSysColor(COLOR_BTNHIGHLIGHT); InvalidateRect(hWnd, NULL, TRUE); break; @@ -296,7 +280,7 @@ static LONG PB_Paint(HWND hWnd) static LONG PB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam) { -/* SetFocus(hWnd); */ + SetFocus(hWnd); SetCapture(hWnd); pressed = TRUE; InvalidateRect(hWnd, NULL, FALSE); @@ -334,8 +318,8 @@ static LONG PB_KillFocus(HWND hWnd) static void DrawRaisedPushButton(HDC hDC, HWND hButton, RECT rc) { - HPEN hOldPen, hFramePen; - HBRUSH hOldBrush, hShadowBrush, hHighlightBrush, hBackgrndBrush; + HPEN hOldPen; + HBRUSH hOldBrush; HRGN rgn1, rgn2, rgn; int len; static char text[50+1]; @@ -343,13 +327,9 @@ static void DrawRaisedPushButton(HDC hDC, HWND hButton, RECT rc) DWORD dwTextSize; int delta; TEXTMETRIC tm; - int i; - hFramePen = CreatePen(PS_SOLID, 1, color_windowframe); - hBackgrndBrush = CreateSolidBrush(color_btnface); - - hOldPen = (HPEN)SelectObject(hDC, (HANDLE)hFramePen); - hOldBrush = (HBRUSH)SelectObject(hDC, (HANDLE)hBackgrndBrush); + hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowFrame); + hOldBrush = (HBRUSH)SelectObject(hDC, sysColorObjects.hbrushBtnFace); SetBkMode(hDC, TRANSPARENT); rgn = CreateRectRgn(0, 0, 0, 0); @@ -380,10 +360,9 @@ static void DrawRaisedPushButton(HDC hDC, HWND hButton, RECT rc) points[4].y = rc.top+1; points[5].x = rc.left+2; points[5].y = rc.top+1; - hHighlightBrush = CreateSolidBrush(color_btnhighlight); rgn2 = CreatePolygonRgn(points, DIM(points), ALTERNATE); CombineRgn(rgn, rgn1, rgn2, RGN_AND); - FillRgn(hDC, rgn2, hHighlightBrush); + FillRgn(hDC, rgn2, sysColorObjects.hbrushBtnHighlight); /* draw button shadow: */ points[0].x = rc.left+2; @@ -398,10 +377,9 @@ static void DrawRaisedPushButton(HDC hDC, HWND hButton, RECT rc) points[4].y = rc.top; points[5].x = rc.right-1; points[5].y = rc.bottom; - hShadowBrush = CreateSolidBrush(color_btnshadow); rgn2 = CreatePolygonRgn(points, DIM(points), ALTERNATE); CombineRgn(rgn, rgn1, rgn2, RGN_AND); - FillRgn(hDC, rgn2, hShadowBrush); + FillRgn(hDC, rgn2, sysColorObjects.hbrushBtnShadow); /* do we have the focus? */ if (len >= 1 && GetFocus() == hButton) { @@ -416,9 +394,6 @@ static void DrawRaisedPushButton(HDC hDC, HWND hButton, RECT rc) SelectObject(hDC, (HANDLE)hOldPen); SelectObject(hDC, (HANDLE)hOldBrush); - DeleteObject((HANDLE)hFramePen); - DeleteObject((HANDLE)hShadowBrush); - DeleteObject((HANDLE)hBackgrndBrush); DeleteObject((HANDLE)rgn1); DeleteObject((HANDLE)rgn2); DeleteObject((HANDLE)rgn); @@ -427,20 +402,16 @@ static void DrawRaisedPushButton(HDC hDC, HWND hButton, RECT rc) static void DrawPressedPushButton(HDC hDC, HWND hButton, RECT rc) { - HPEN hOldPen, hShadowPen, hFramePen; - HBRUSH hOldBrush, hBackgrndBrush; - HRGN rgn1, rgn2, rgn; + HPEN hOldPen; + HBRUSH hOldBrush; int len; static char text[50+1]; DWORD dwTextSize; int delta; TEXTMETRIC tm; - hFramePen = CreatePen(PS_SOLID, 1, color_windowframe); - hBackgrndBrush = CreateSolidBrush(color_btnface); - - hOldBrush = (HBRUSH)SelectObject(hDC, (HANDLE)hBackgrndBrush); - hOldPen = (HPEN)SelectObject(hDC, (HANDLE)hFramePen); + hOldBrush = (HBRUSH)SelectObject(hDC, sysColorObjects.hbrushBtnFace); + hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowFrame); SetBkMode(hDC, TRANSPARENT); /* give parent a chance to alter parameters: */ @@ -449,11 +420,9 @@ static void DrawPressedPushButton(HDC hDC, HWND hButton, RECT rc) Rectangle(hDC, rc.left, rc.top, rc.right, rc.bottom); /* draw button shadow: */ - hShadowPen = CreatePen(PS_SOLID, 1, color_btnshadow); - SelectObject(hDC, (HANDLE)hShadowPen); - MoveTo(hDC, rc.left+1, rc.bottom-1); - LineTo(hDC, rc.left+1, rc.top+1); - LineTo(hDC, rc.right-1, rc.top+1); + SelectObject(hDC, sysColorObjects.hbrushBtnShadow ); + PatBlt(hDC, rc.left+1, rc.top+1, 1, rc.bottom-rc.top-2, PATCOPY ); + PatBlt(hDC, rc.left+1, rc.top+1, rc.right-rc.left-2, 1, PATCOPY ); /* draw button label, if any: */ len = GetWindowText(hButton, text, sizeof text); @@ -476,9 +445,6 @@ static void DrawPressedPushButton(HDC hDC, HWND hButton, RECT rc) SelectObject(hDC, (HANDLE)hOldPen); SelectObject(hDC, (HANDLE)hOldBrush); - DeleteObject((HANDLE)hBackgrndBrush); - DeleteObject(SelectObject(hDC, (HANDLE)hFramePen)); - DeleteObject(SelectObject(hDC, (HANDLE)hShadowPen)); } @@ -491,7 +457,7 @@ static LONG CB_Paint(HWND hWnd) PAINTSTRUCT ps; RECT rc, rc3; HDC hDC; - HPEN hPen, hOldPen; + HPEN hOldPen; HBRUSH hBrush, hGrayBrush; int textlen, delta; char *text; @@ -503,8 +469,7 @@ static LONG CB_Paint(HWND hWnd) hDC = BeginPaint(hWnd, &ps); GetClientRect(hWnd, &rc); - hPen = CreatePen(PS_SOLID, 1, color_windowtext); - hOldPen = (HPEN)SelectObject(hDC, (HANDLE)hPen); + hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowText); hGrayBrush = (HBRUSH)GetStockObject(LTGRAY_BRUSH); hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC, @@ -555,6 +520,7 @@ static LONG CB_Paint(HWND hWnd) DrawFocusRect(hDC, &rc); } + SelectObject(hDC, hOldPen); USER_HEAP_FREE(hText); GlobalUnlock(hWnd); EndPaint(hWnd, &ps); @@ -577,7 +543,7 @@ static LONG CB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam) rc.right = tm.tmHeight; if (PtInRect(&rc, MAKEPOINT(lParam))) { -/* SetFocus(hWnd); */ + SetFocus(hWnd); SetCapture(hWnd); pressed = TRUE; InvalidateRect(hWnd, NULL, FALSE); @@ -704,7 +670,7 @@ static LONG RB_Paint(HWND hWnd) PAINTSTRUCT ps; RECT rc; HDC hDC; - HPEN hPen, hOldPen; + HPEN hOldPen; HBRUSH hBrush, hOldBrush; int textlen, delta; char *text; @@ -716,8 +682,7 @@ static LONG RB_Paint(HWND hWnd) hDC = BeginPaint(hWnd, &ps); GetClientRect(hWnd, &rc); - hPen = CreatePen(PS_SOLID, 1, color_windowtext); - hOldPen = (HPEN)SelectObject(hDC, (HANDLE)hPen); + hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowText); hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC, MAKELPARAM(hWnd, CTLCOLOR_BTN)); @@ -737,7 +702,7 @@ static LONG RB_Paint(HWND hWnd) if ((WORD)(*(wndPtr->wExtra)) == 1) { - hBrush = CreateSolidBrush(color_windowtext); + hBrush = CreateSolidBrush( GetNearestColor(hDC, GetSysColor(COLOR_WINDOWTEXT))); hOldBrush = (HBRUSH)SelectObject(hDC, (HANDLE)hBrush); Ellipse(hDC, 3, rc.top + delta + 3, tm.tmHeight - 3, tm.tmHeight + delta -3); @@ -759,6 +724,7 @@ static LONG RB_Paint(HWND hWnd) DrawFocusRect(hDC, &rc); } + SelectObject(hDC, hOldPen ); USER_HEAP_FREE(hText); GlobalUnlock(hWnd); EndPaint(hWnd, &ps); @@ -781,7 +747,7 @@ static LONG RB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam) rc.right = tm.tmHeight; if (PtInRect(&rc, MAKEPOINT(lParam))) { -/* SetFocus(hWnd); */ + SetFocus(hWnd); SetCapture(hWnd); pressed = TRUE; InvalidateRect(hWnd, NULL, FALSE); @@ -880,7 +846,7 @@ static LONG GB_Paint(HWND hWnd) PAINTSTRUCT ps; RECT rc; HDC hDC; - HPEN hPen, hOldPen; + HPEN hOldPen; HBRUSH hBrush; int textlen; char *text; @@ -890,8 +856,7 @@ static LONG GB_Paint(HWND hWnd) hDC = BeginPaint(hWnd, &ps); GetClientRect(hWnd, &rc); - hPen = CreatePen(PS_SOLID, 1, color_windowtext); - hOldPen = (HPEN)SelectObject(hDC, (HANDLE)hPen); + hOldPen = (HPEN)SelectObject(hDC, sysColorObjects.hpenWindowText); hBrush = SendMessage(GetParent(hWnd), WM_CTLCOLOR, (WORD)hDC, MAKELPARAM(hWnd, CTLCOLOR_BTN)); @@ -911,6 +876,7 @@ static LONG GB_Paint(HWND hWnd) rc.bottom = size.cy; DrawText(hDC, text, textlen, &rc, DT_SINGLELINE); + SelectObject(hDC, hOldPen ); USER_HEAP_FREE(hText); EndPaint(hWnd, &ps); } @@ -947,7 +913,7 @@ static LONG UB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam) { RECT rc; -/* SetFocus(hWnd); */ + SetFocus(hWnd); SetCapture(hWnd); GetClientRect(hWnd, &rc); if (PtInRect(&rc, MAKEPOINT(lParam))) @@ -1013,7 +979,7 @@ static LONG OB_LButtonDown(HWND hWnd, WORD wParam, LONG lParam) HANDLE hDis; LPDRAWITEMSTRUCT lpdis; WND *wndPtr = WIN_FindWndPtr(hWnd); -/* SetFocus(hWnd); */ + SetFocus(hWnd); SetCapture(hWnd); hDC = GetDC(hWnd); GetClientRect(hWnd, &rc); diff --git a/controls/combo.c b/controls/combo.c index ae1860173c4..06fac4c7498 100644 --- a/controls/combo.c +++ b/controls/combo.c @@ -61,13 +61,12 @@ LONG ComboBoxWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ) width = rect.right - rect.left; height = rect.bottom - rect.top; SetWindowPos(hwnd, 0, 0, 0, width + bm.bmHeight, bm.bmHeight, - SWP_NOMOVE | SWP_NOZORDER); + SWP_NOMOVE | SWP_NOZORDER); CreateComboStruct(hwnd); lphc = ComboGetStorageHeader(hwnd); if (lphc == NULL) return 0; if (wndPtr->dwStyle & CBS_SIMPLE) -/* lphc->hWndEdit = CreateWindow("EDIT", "", */ - lphc->hWndEdit = CreateWindow("STATIC", "", + lphc->hWndEdit = CreateWindow("EDIT", "", WS_CHILD | WS_CLIPCHILDREN | WS_VISIBLE | SS_LEFT, 0, 0, width - bm.bmHeight, bm.bmHeight, hwnd, 1, wndPtr->hInstance, 0L); @@ -370,3 +369,30 @@ int CreateComboStruct(HWND hwnd) +/************************************************************************ + * DlgDirSelectComboBox [USER.194] + */ +BOOL DlgDirSelectComboBox(HWND hDlg, LPSTR lpStr, int nIDLBox) +{ + printf("DlgDirSelectComboBox(%04X, '%s', %d) \n", hDlg, lpStr, nIDLBox); +} + + +/************************************************************************ + * DlgDirListComboBox [USER.195] + */ +int DlgDirListComboBox(HWND hDlg, LPSTR lpPathSpec, + int nIDLBox, int nIDStat, WORD wType) +{ + HWND hWnd; + LPHEADCOMBO lphc; + printf("DlgDirListComboBox(%04X, '%s', %d, %d, %04X) \n", + hDlg, lpPathSpec, nIDLBox, nIDStat, wType); + hWnd = GetDlgItem(hDlg, nIDLBox); + lphc = ComboGetStorageHeader(hWnd); + SendMessage(lphc->hWndLBox, LB_RESETCONTENT, 0, 0L); + return SendMessage(lphc->hWndLBox, LB_DIR, wType, (DWORD)lpPathSpec); +} + + + diff --git a/controls/edit.c b/controls/edit.c new file mode 100644 index 00000000000..55678c066a9 --- /dev/null +++ b/controls/edit.c @@ -0,0 +1,2384 @@ +/* + * Edit control + * + * Copyright David W. Metcalfe, 1994 + * + * Release 1, April 1994 + */ + +static char Copyright[] = "Copyright David W. Metcalfe, 1994"; + +#include +#include +#include +#include "win.h" +#include "class.h" +#include "user.h" + +/* +#define DEBUG_EDIT +*/ + +#define NOTIFY_PARENT(hWndCntrl, wNotifyCode) \ + SendMessage(GetParent(hWndCntrl), WM_COMMAND, \ + GetDlgCtrlID(hWndCntrl), MAKELPARAM(hWndCntrl, wNotifyCode)); + +#define MAXTEXTLEN 32000 /* maximum text buffer length */ +#define EDITLEN 1024 /* starting length for multi-line control */ +#define ENTRYLEN 256 /* starting length for single line control */ +#define GROWLENGTH 64 /* buffers grow by this much */ + +#define HSCROLLDIM (ClientWidth(wndPtr) / 3) + /* "line" dimension for horizontal scroll */ + +#define EDIT_HEAP_ALLOC(size) USER_HEAP_ALLOC(GMEM_MOVEABLE,size) +#define EDIT_HEAP_REALLOC(handle,size) USER_HEAP_REALLOC(handle,size,\ + GMEM_MOVEABLE) +#define EDIT_HEAP_ADDR(handle) USER_HEAP_ADDR(handle) +#define EDIT_HEAP_FREE(handle) USER_HEAP_FREE(handle) + +typedef struct +{ + int wlines; /* number of lines of text */ + int wtop; /* top line that is displayed */ + int wleft; /* left pixel that is displayed */ + unsigned int textlen; /* text buffer length */ + int textwidth; /* width of longest line in pixels */ + RECT fmtrc; /* rectangle in which to format text */ + int txtht; /* height of text line in pixels */ + HANDLE hText; /* handle to text buffer */ + HANDLE hCharWidths; /* widths of chars in font */ + HANDLE hTextPtrs; /* list of line offsets */ + HANDLE hBlankLine; /* to fill blank lines quickly */ + int CurrCol; /* current column */ + int CurrLine; /* current line */ + int WndCol; /* current window column */ + int WndRow; /* current window row */ + BOOL TextChanged; /* TRUE if text has changed */ + BOOL PaintBkgd; /* paint control background */ + unsigned int MaxTextLen; /* maximum text buffer length */ + int SelBegLine; /* beginning line of selection */ + int SelBegCol; /* beginning column of selection */ + int SelEndLine; /* ending line of selection */ + int SelEndCol; /* ending column of selection */ +} EDITSTATE; + + +#define ClientWidth(wndPtr) (wndPtr->rectClient.right - \ + wndPtr->rectClient.left) +#define ClientHeight(wndPtr, es) ((wndPtr->rectClient.bottom - \ + wndPtr->rectClient.top) / es->txtht) +#define EditBufLen(wndPtr) (wndPtr->dwStyle & ES_MULTILINE \ + ? EDITLEN : ENTRYLEN) +#define CurrChar (EDIT_TextLine(hwnd, es->CurrLine) + es->CurrCol) +#define SelMarked(es) (es->SelBegLine != -1 && es->SelBegCol != -1 && \ + es->SelEndLine != -1 && es->SelEndCol != -1) + +/* macros to access window styles */ +#define IsAutoVScroll() (wndPtr->dwStyle & ES_AUTOVSCROLL) +#define IsAutoHScroll() (wndPtr->dwStyle & ES_AUTOHSCROLL) +#define IsMultiLine() (wndPtr->dwStyle & ES_MULTILINE) +#define IsVScrollBar() (wndPtr->dwStyle & WS_VSCROLL) +#define IsHScrollBar() (wndPtr->dwStyle & WS_HSCROLL) + +/* internal variables */ +static BOOL TextMarking; /* TRUE if text marking in progress */ +static BOOL ButtonDown; /* TRUE if left mouse button down */ +static int ButtonRow; /* row in text buffer when button pressed */ +static int ButtonCol; /* col in text buffer when button pressed */ +static BOOL Print = FALSE; + + +LONG EditWndProc(HWND hWnd, WORD uMsg, WORD wParam, LONG lParam); +long EDIT_CreateMsg(HWND hwnd, LONG lParam); +void EDIT_ClearTextPointers(HWND hwnd); +void EDIT_BuildTextPointers(HWND hwnd); +void EDIT_ModTextPointers(HWND hwnd, int lineno, int var); +void EDIT_PaintMsg(HWND hwnd); +HANDLE EDIT_GetTextLine(HWND hwnd, int selection); +char *EDIT_TextLine(HWND hwnd, int sel); +int EDIT_LineLength(EDITSTATE *es, char *str, int len); +void EDIT_WriteTextLine(HWND hwnd, RECT *rc, int y); +void EDIT_WriteText(HWND hwnd, char *lp, int off, int len, int row, + int col, RECT *rc, BOOL blank, BOOL reverse); +HANDLE EDIT_GetStr(EDITSTATE *es, char *lp, int off, int len, int *diff); +void EDIT_CharMsg(HWND hwnd, WORD wParam); +void EDIT_KeyTyped(HWND hwnd, short ch); +int EDIT_CharWidth(EDITSTATE *es, short ch); +void EDIT_Forward(HWND hwnd); +void EDIT_Downward(HWND hwnd); +void EDIT_Upward(HWND hwnd); +void EDIT_Backward(HWND hwnd); +void EDIT_End(HWND hwnd); +void EDIT_Home(HWND hwnd); +void EDIT_StickEnd(HWND hwnd); +void EDIT_KeyDownMsg(HWND hwnd, WORD wParam); +void EDIT_KeyHScroll(HWND hwnd, WORD opt); +void EDIT_KeyVScrollLine(HWND hwnd, WORD opt); +void EDIT_KeyVScrollPage(HWND hwnd, WORD opt); +void EDIT_KeyVScrollDoc(HWND hwnd, WORD opt); +int EDIT_ComputeVScrollPos(HWND hwnd); +int EDIT_ComputeHScrollPos(HWND hwnd); +void EDIT_DelKey(HWND hwnd); +void EDIT_VScrollMsg(HWND hwnd, WORD wParam, LONG lParam); +void EDIT_VScrollLine(HWND hwnd, WORD opt); +void EDIT_VScrollPage(HWND hwnd, WORD opt); +void EDIT_HScrollMsg(HWND hwnd, WORD wParam, LONG lParam); +void EDIT_SizeMsg(HWND hwnd, WORD wParam, LONG lParam); +void EDIT_LButtonDownMsg(HWND hwnd, WORD wParam, LONG lParam); +void EDIT_MouseMoveMsg(HWND hwnd, WORD wParam, LONG lParam); +int EDIT_PixelToChar(HWND hwnd, int row, int *pixel); +LONG EDIT_SetTextMsg(HWND hwnd, LONG lParam); +void EDIT_ClearText(HWND hwnd); +void EDIT_SetSelMsg(HWND hwnd, LONG lParam); +void EDIT_GetLineCol(HWND hwnd, int off, int *line, int *col); +void EDIT_DeleteSel(HWND hwnd); +void EDIT_ClearSel(HWND hwnd); +int EDIT_TextLineNumber(HWND hwnd, char *lp); +void EDIT_SetAnchor(HWND hwnd, int row, int col); +void EDIT_ExtendSel(HWND hwnd, int x, int y); +void EDIT_StopMarking(HWND hwnd); +LONG EDIT_GetLineMsg(HWND hwnd, WORD wParam, LONG lParam); +LONG EDIT_GetSelMsg(HWND hwnd); +LONG EDIT_LineFromCharMsg(HWND hwnd, WORD wParam); +LONG EDIT_LineIndexMsg(HWND hwnd, WORD wParam); +void swap(int *a, int *b); + + +LONG EditWndProc(HWND hwnd, WORD uMsg, WORD wParam, LONG lParam) +{ + LONG lResult = 0L; + HDC hdc; + char *textPtr; + int len; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + switch (uMsg) { + case EM_CANUNDO: + /* cannot process undo message */ + lResult = 0L; + break; + + case EM_FMTLINES: + printf("edit: cannot process EM_FMTLINES message\n"); + lResult = 0L; + break; + + case EM_GETFIRSTVISIBLELINE: + lResult = es->wtop; + break; + + case EM_GETHANDLE: + printf("edit: cannot process EM_GETHANDLE message\n"); + break; + + case EM_GETLINE: + if (IsMultiLine()) + lResult = EDIT_GetLineMsg(hwnd, wParam, lParam); + else + lResult = 0L; + break; + + case EM_GETLINECOUNT: + if (IsMultiLine()) + lResult = es->wlines; + else + lResult = 0L; + break; + + case EM_GETMODIFY: + lResult = es->TextChanged; + break; + + case EM_GETPASSWORDCHAR: + printf("edit: cannot process EM_GETPASSWORDCHAR message\n"); + break; + + case EM_GETRECT: + GetWindowRect(hwnd, (LPRECT)lParam); + break; + + case EM_GETSEL: + lResult = EDIT_GetSelMsg(hwnd); + break; + + case EM_GETWORDBREAKPROC: + printf("edit: cannot process EM_GETWORDBREAKPROC message\n"); + break; + + case EM_LIMITTEXT: + es->MaxTextLen = wParam; + break; + + case EM_LINEFROMCHAR: + lResult = EDIT_LineFromCharMsg(hwnd, wParam); + break; + + case EM_LINEINDEX: + if (IsMultiLine()) + lResult = EDIT_LineIndexMsg(hwnd, wParam); + else + lResult = 0L; + break; + + case EM_LINELENGTH: + printf("edit: cannot process EM_LINELENGTH message\n"); + break; + + case EM_LINESCROLL: + printf("edit: cannot process EM_LINESCROLL message\n"); + break; + + case EM_REPLACESEL: + printf("edit: cannot process EM_REPLACESEL message\n"); + break; + + case EM_SETHANDLE: + printf("edit: cannot process EM_SETHANDLE message\n"); + break; + + case EM_SETMODIFY: + es->TextChanged = wParam; + break; + + case EM_SETPASSWORDCHAR: + printf("edit: cannot process EM_SETPASSWORDCHAR message\n"); + break; + + case EM_SETREADONLY: + printf("edit: cannot process EM_SETREADONLY message\n"); + break; + + case EM_SETRECT: + case EM_SETRECTNP: + printf("edit: cannot process EM_SETRECT(NP) message\n"); + break; + + case EM_SETSEL: + HideCaret(hwnd); + EDIT_SetSelMsg(hwnd, lParam); + SetCaretPos(es->WndCol, es->WndRow * es->txtht); + ShowCaret(hwnd); + break; + + case EM_SETTABSTOPS: + printf("edit: cannot process EM_SETTABSTOPS message\n"); + break; + + case EM_SETWORDBREAKPROC: + printf("edit: cannot process EM_SETWORDBREAKPROC message\n"); + break; + + case WM_CHAR: + EDIT_CharMsg(hwnd, wParam); + break; + + case WM_CREATE: + lResult = EDIT_CreateMsg(hwnd, lParam); + break; + + case WM_DESTROY: + EDIT_HEAP_FREE(es->hTextPtrs); + EDIT_HEAP_FREE(es->hCharWidths); + EDIT_HEAP_FREE((HANDLE)(*(wndPtr->wExtra))); + break; + + case WM_ENABLE: + InvalidateRect(hwnd, NULL, FALSE); + break; + + case WM_GETTEXT: + textPtr = (LPSTR)EDIT_HEAP_ADDR(es->hText); + if ((int)wParam > (len = strlen(textPtr))) + { + strcpy((char *)lParam, textPtr); + lResult = (DWORD)len; + } + else + lResult = 0L; + break; + + case WM_GETTEXTLENGTH: + textPtr = (LPSTR)EDIT_HEAP_ADDR(es->hText); + lResult = (DWORD)strlen(textPtr); + break; + + case WM_HSCROLL: + EDIT_HScrollMsg(hwnd, wParam, lParam); + break; + + case WM_KEYDOWN: + EDIT_KeyDownMsg(hwnd, wParam); + break; + + case WM_KILLFOCUS: + DestroyCaret(); + NOTIFY_PARENT(hwnd, EN_KILLFOCUS); + break; + + case WM_LBUTTONDOWN: + HideCaret(hwnd); + EDIT_LButtonDownMsg(hwnd, wParam, lParam); + SetCaretPos(es->WndCol, es->WndRow * es->txtht); + ShowCaret(hwnd); + break; + + case WM_LBUTTONUP: + ButtonDown = FALSE; + if (TextMarking) + EDIT_StopMarking(hwnd); + break; + + case WM_MOUSEMOVE: + HideCaret(hwnd); + EDIT_MouseMoveMsg(hwnd, wParam, lParam); + SetCaretPos(es->WndCol, es->WndRow * es->txtht); + ShowCaret(hwnd); + break; + + case WM_MOVE: + lResult = 0; + break; + + case WM_PAINT: + EDIT_PaintMsg(hwnd); + break; + + case WM_SETFOCUS: + es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + CreateCaret(hwnd, 0, 2, es->txtht); + SetCaretPos(es->WndCol, es->WndRow * es->txtht); + ShowCaret(hwnd); + NOTIFY_PARENT(hwnd, EN_SETFOCUS); + break; + + case WM_SETFONT: + break; + + case WM_SETTEXT: + EDIT_SetTextMsg(hwnd, lParam); + break; + + case WM_SIZE: + EDIT_SizeMsg(hwnd, wParam, lParam); + lResult = 0; + break; + + case WM_VSCROLL: + EDIT_VScrollMsg(hwnd, wParam, lParam); + break; + + default: + lResult = DefWindowProc(hwnd, uMsg, wParam, lParam); + break; + } + + GlobalUnlock(hwnd); + return lResult; +} + + +/********************************************************************* + * WM_CREATE message function + */ + +long EDIT_CreateMsg(HWND hwnd, LONG lParam) +{ + HDC hdc; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es; + CLASS *classPtr; + short *charWidths; + TEXTMETRIC tm; + char *text; + unsigned int *textPtrs; + + /* allocate space for state variable structure */ + (HANDLE)(*(wndPtr->wExtra)) = + EDIT_HEAP_ALLOC(sizeof(EDITSTATE)); + es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + es->hTextPtrs = EDIT_HEAP_ALLOC(sizeof(int)); + textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs); + es->hCharWidths = EDIT_HEAP_ALLOC(256 * sizeof(short)); + + /* initialize state variable structure */ + /* --- char width array */ + hdc = GetDC(hwnd); + charWidths = (short *)EDIT_HEAP_ADDR(es->hCharWidths); + memset(charWidths, 0, 256 * sizeof(short)); + GetCharWidth(hdc, 0, 255, charWidths); + + /* --- text buffer */ + es->MaxTextLen = MAXTEXTLEN + 1; + if (!(wndPtr->hText)) + { + es->textlen = EditBufLen(wndPtr); + es->hText = EDIT_HEAP_ALLOC(EditBufLen(wndPtr) + 2); + text = (LPSTR)EDIT_HEAP_ADDR(es->hText); + memset(text, 0, es->textlen + 2); + EDIT_ClearTextPointers(hwnd); + } + else + { + es->hText = wndPtr->hText; + wndPtr->hText = 0; + es->textlen = GetWindowTextLength(hwnd) + 1; + EDIT_BuildTextPointers(hwnd); + } + + /* --- other structure variables */ + GetTextMetrics(hdc, &tm); + es->txtht = tm.tmHeight + tm.tmExternalLeading; + es->wlines = 0; + es->wtop = es->wleft = 0; + es->CurrCol = es->CurrLine = 0; + es->WndCol = es->WndRow = 0; + es->TextChanged = FALSE; + es->textwidth = 0; + es->SelBegLine = es->SelBegCol = -1; + es->SelEndLine = es->SelEndCol = -1; + + /* allocate space for a line full of blanks to speed up */ + /* line filling */ + es->hBlankLine = EDIT_HEAP_ALLOC((ClientWidth(wndPtr) / + charWidths[32]) + 2); + text = EDIT_HEAP_ADDR(es->hBlankLine); + memset(text, ' ', (ClientWidth(wndPtr) / charWidths[32]) + 2); + + /* set up text cursor for edit class */ + CLASS_FindClassByName("EDIT", &classPtr); + classPtr->wc.hCursor = LoadCursor(0, IDC_IBEAM); + + /* paint background on first WM_PAINT */ + es->PaintBkgd = TRUE; + + ReleaseDC(hwnd, hdc); + return 0L; +} + + +/********************************************************************* + * EDIT_ClearTextPointers + * + * Clear and initialize text line pointer array. + */ + +void EDIT_ClearTextPointers(HWND hwnd) +{ + unsigned int *textPtrs; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + es->hTextPtrs = EDIT_HEAP_REALLOC(es->hTextPtrs, sizeof(int)); + textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs); + *textPtrs = 0; +} + + +/********************************************************************* + * EDIT_BuildTextPointers + * + * Build array of pointers to text lines. + */ + +#define INITLINES 100 + +void EDIT_BuildTextPointers(HWND hwnd) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + char *text, *cp; + int incrs = INITLINES; + unsigned int off, len, temp; + EDITSTATE *es; + unsigned int *textPtrs; + short *charWidths; + + es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + text = (char *)EDIT_HEAP_ADDR(es->hText); + textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs); + charWidths = (short *)EDIT_HEAP_ADDR(es->hCharWidths); + + es->textwidth = es->wlines = 0; + cp = text; + + /* advance through text buffer */ + while (*cp) + { + /* increase size of text pointer array */ + if (incrs == INITLINES) + { + incrs = 0; + es->hTextPtrs = EDIT_HEAP_REALLOC(es->hTextPtrs, + (es->wlines + INITLINES) * sizeof(int)); + textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs); + } + off = (unsigned int)(cp - text); /* offset of beginning of line */ + *(textPtrs + es->wlines) = off; + es->wlines++; + incrs++; + len = 0; + + /* advance through current line */ + while (*cp && *cp != '\n') + { + len += charWidths[*cp]; /* width of line in pixels */ + cp++; + } + es->textwidth = max(es->textwidth, len); + if (*cp) + cp++; /* skip '\n' */ + } + off = (unsigned int)(cp - text); /* offset of beginning of line */ + *(textPtrs + es->wlines) = off; +} + + +/********************************************************************* + * EDIT_ModTextPointers + * + * Modify text pointers from a specified position. + */ + +void EDIT_ModTextPointers(HWND hwnd, int lineno, int var) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + unsigned int *textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs); + + while (lineno < es->wlines) + *(textPtrs + lineno++) += var; +} + + +/********************************************************************* + * WM_PAINT message function + */ + +void EDIT_PaintMsg(HWND hwnd) +{ + PAINTSTRUCT ps; + HDC hdc; + int y; + RECT rc; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + hdc = BeginPaint(hwnd, &ps); + rc = ps.rcPaint; + +#ifdef DEBUG_EDIT + printf("WM_PAINT: rc=(%d,%d), (%d,%d)\n", rc.left, rc.top, + rc.right, rc.bottom); +#endif + + if (es->PaintBkgd) + FillWindow(GetParent(hwnd), hwnd, hdc, CTLCOLOR_EDIT); + + for (y = (rc.top / es->txtht); y <= (rc.bottom / es->txtht); y++) + { + if (y < es->wlines - es->wtop) + EDIT_WriteTextLine(hwnd, &rc, y + es->wtop); + } + + EndPaint(hwnd, &ps); +} + + +/********************************************************************* + * EDIT_GetTextLine + * + * Get a copy of the text in the specified line. + */ + +HANDLE EDIT_GetTextLine(HWND hwnd, int selection) +{ + char *line; + HANDLE hLine; + int len = 0; + char *cp, *cp1; + +#ifdef DEBUG_EDIT + printf("GetTextLine %d\n", selection); +#endif + cp = cp1 = EDIT_TextLine(hwnd, selection); + /* advance through line */ + while (*cp && *cp != '\n') + { + len++; + cp++; + } + + /* store selected line and return handle */ + hLine = EDIT_HEAP_ALLOC(len + 6); + line = (char *)EDIT_HEAP_ADDR(hLine); + memmove(line, cp1, len); + line[len] = '\0'; + return hLine; +} + + +/********************************************************************* + * EDIT_TextLine + * + * Return a pointer to the text in the specified line. + */ + +char *EDIT_TextLine(HWND hwnd, int sel) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + char *text = (char *)EDIT_HEAP_ADDR(es->hText); + unsigned int *textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs); + + return (text + *(textPtrs + sel)); +} + + +/********************************************************************* + * EDIT_LineLength + * + * Return length of line _str_ of length _len_ characters in pixels. + */ + +int EDIT_LineLength(EDITSTATE *es, char *str, int len) +{ + int i, plen = 0; + short *charWidths = (short *)EDIT_HEAP_ADDR(es->hCharWidths); + + for (i = 0; i < len; i++) + plen += charWidths[*(str + i)]; + +#ifdef DEBUG_EDIT + printf("EDIT_LineLength: returning %d\n", plen); +#endif + return plen; +} + + +/********************************************************************* + * EDIT_WriteTextLine + * + * Write the line of text at offset _y_ in text buffer to a window. + */ + +void EDIT_WriteTextLine(HWND hwnd, RECT *rect, int y) +{ + int len = 0; + unsigned char line[200]; + HANDLE hLine; + unsigned char *lp; + int lnlen, lnlen1; + int col, off = 0; + int sbl, sel, sbc, sec; + RECT rc; + div_t num; + BOOL trunc = FALSE; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + /* initialize rectangle if NULL, else copy */ + if (rect) + CopyRect(&rc, rect); + else + GetClientRect(hwnd, &rc); + +#ifdef DEBUG_EDIT + printf("WriteTextLine %d\n", y); +#endif + + /* make sure y is inside the window */ + if (y < es->wtop || y > (es->wtop + ClientHeight(wndPtr, es))) + { +#ifdef DEBUG_EDIT + printf("EDIT_WriteTextLine: y (%d) is not a displayed line\n", y); +#endif + return; + } + + /* make sure rectangle is within window */ + if (rc.left >= ClientWidth(wndPtr) - 1) + { +#ifdef DEBUG_EDIT + printf("EDIT_WriteTextLine: rc.left (%d) is greater than right edge\n", + rc.left); +#endif + return; + } + if (rc.right <= 0) + { +#ifdef DEBUG_EDIT + printf("EDIT_WriteTextLine: rc.right (%d) is less than left edge\n", + rc.right); +#endif + return; + } + if (y - es->wtop < (rc.top / es->txtht) || + y - es->wtop > (rc.bottom / es->txtht)) + { +#ifdef DEBUG_EDIT + printf("EDIT_WriteTextLine: y (%d) is outside window\n", y); +#endif + return; + } + + /* get the text and length of line */ + if ((hLine = EDIT_GetTextLine(hwnd, y)) == 0) + return; + lp = (unsigned char *)EDIT_HEAP_ADDR(hLine); + lnlen = EDIT_LineLength(es, lp, strlen(lp)); + lnlen1 = lnlen; + + /* build the line to display */ + if (lnlen < es->wleft) + lnlen = 0; + else + off += es->wleft; + + if (lnlen > rc.left) + { + off += rc.left; + lnlen = lnlen1 - off; + len = min(lnlen, rc.right - rc.left); + } + + if (SelMarked(es)) + { + sbl = es->SelBegLine; + sel = es->SelEndLine; + sbc = es->SelBegCol; + sec = es->SelEndCol; + + /* put lowest marker first */ + if (sbl > sel) + { + swap(&sbl, &sel); + swap(&sbc, &sec); + } + if (sbl == sel && sbc > sec) + swap(&sbc, &sec); + + if (y < sbl || y > sel) + EDIT_WriteText(hwnd, lp, off, len, y - es->wtop, rc.left, &rc, + TRUE, FALSE); + else if (y > sbl && y < sel) + EDIT_WriteText(hwnd, lp, off, len, y - es->wtop, rc.left, &rc, + TRUE, TRUE); + else if (y == sbl) + { + col = EDIT_LineLength(es, lp, sbc); + if (col > (es->wleft + rc.left)) + { + len = min(col - off, rc.right - off); + EDIT_WriteText(hwnd, lp, off, len, y - es->wtop, + rc.left, &rc, FALSE, FALSE); + off = col; + } + if (y == sel) + { + col = EDIT_LineLength(es, lp, sec); + if (col < (es->wleft + rc.right)) + { + len = min(col - off, rc.right - off); + EDIT_WriteText(hwnd, lp, off, len, y - es->wtop, + off - es->wleft, &rc, FALSE, TRUE); + off = col; + len = min(lnlen - off, rc.right - off); + EDIT_WriteText(hwnd, lp, off, len, y - es->wtop, + off - es->wleft, &rc, TRUE, FALSE); + } + else + { + len = min(lnlen - off, rc.right - off); + EDIT_WriteText(hwnd, lp, off, len, y - es->wtop, + off - es->wleft, &rc, TRUE, TRUE); + } + } + else + { + len = min(lnlen - off, rc.right - off); + if (col < (es->wleft + rc.right)) + EDIT_WriteText(hwnd, lp, off, len, y - es->wtop, + off - es->wleft, &rc, TRUE, TRUE); + } + } + else if (y == sel) + { + col = EDIT_LineLength(es, lp, sec); + if (col < (es->wleft + rc.right)) + { + len = min(col - off, rc.right - off); + EDIT_WriteText(hwnd, lp, off, len, y - es->wtop, + off - es->wleft, &rc, FALSE, TRUE); + off = col; + len = min(lnlen - off, rc.right - off); + EDIT_WriteText(hwnd, lp, off, len, y - es->wtop, + off - es->wleft, &rc, TRUE, FALSE); + } + } + } + else + EDIT_WriteText(hwnd, lp, off, len, y - es->wtop, rc.left, &rc, + TRUE, FALSE); + + EDIT_HEAP_FREE(hLine); +} + + +/********************************************************************* + * EDIT_WriteText + * + * Write text to a window + * lp - text line + * off - offset in text line (in pixels) + * len - length from off (in pixels) + * row - line in window + * col - column in window + * rc - rectangle in which to display line + * blank - blank remainder of line? + * reverse - reverse color of line? + */ + +void EDIT_WriteText(HWND hwnd, char *lp, int off, int len, int row, + int col, RECT *rc, BOOL blank, BOOL reverse) +{ + HDC hdc; + HANDLE hStr; + char *str, *blanks; + int diff, num_spaces; + HRGN hrgnClip; + COLORREF oldTextColor, oldBkgdColor; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + short *charWidths = (short *)EDIT_HEAP_ADDR(es->hCharWidths); + +#ifdef DEBUG_EDIT + printf("EDIT_WriteText lp=%s, off=%d, len=%d, row=%d, col=%d, reverse=%d\n", lp, off, len, row, col, reverse); +#endif + + hdc = GetDC(hwnd); + hStr = EDIT_GetStr(es, lp, off, len, &diff); + str = (char *)EDIT_HEAP_ADDR(hStr); + hrgnClip = CreateRectRgnIndirect(rc); + SelectClipRgn(hdc, hrgnClip); + + SendMessage(GetParent(hwnd), WM_CTLCOLOR, (WORD)hdc, + MAKELPARAM(hwnd, CTLCOLOR_EDIT)); + + if (reverse) + { + oldBkgdColor = GetBkColor(hdc); + oldTextColor = GetTextColor(hdc); + SetBkColor(hdc, oldTextColor); + SetTextColor(hdc, oldBkgdColor); + } + + TextOut(hdc, col - diff, row * es->txtht, str, strlen(str)); + + if (reverse) + { + SetBkColor(hdc, oldBkgdColor); + SetTextColor(hdc, oldTextColor); + } + + /* blank out remainder of line if appropriate */ + if (blank) + { + if ((rc->right - col) > len) + { + blanks = EDIT_HEAP_ADDR(es->hBlankLine); + num_spaces = (rc->right - col - len) / charWidths[32]; + TextOut(hdc, col + len, row * es->txtht, blanks, num_spaces); + } + } + + EDIT_HEAP_FREE(hStr); + ReleaseDC(hwnd, hdc); +} + + +/********************************************************************* + * EDIT_GetStr + * + * Return sub-string starting at pixel _off_ of length _len_ pixels. + * If _off_ is part way through a character, the negative offset of + * the beginning of the character is returned in _diff_, else _diff_ + * will be zero. + */ + +HANDLE EDIT_GetStr(EDITSTATE *es, char *lp, int off, int len, int *diff) +{ + HANDLE hStr; + char *str; + int ch = 0, i = 0, j, tmp; + int ch1; + short *charWidths = (short *)EDIT_HEAP_ADDR(es->hCharWidths); + +#ifdef DEBUG_EDIT + printf("EDIT_GetStr %s %d %d\n", lp, off, len); +#endif + + while (i < off) + { + i += charWidths[*(lp + ch)]; + ch++; + } + + /* if stepped past _off_, go back a character */ + if (i - off) + i -= charWidths[*(lp + --ch)]; + *diff = off - i; + ch1 = ch; + + while (i < len + off) + { + i += charWidths[*(lp + ch)]; + ch++; + } + + hStr = EDIT_HEAP_ALLOC(ch - ch1 + 3); + str = (char *)EDIT_HEAP_ADDR(hStr); + for (i = ch1, j = 0; i < ch; i++, j++) + str[j] = lp[i]; + str[++j] = '\0'; +#ifdef DEBUG_EDIT + printf("EDIT_GetStr: returning %s\n", str); +#endif + return hStr; +} + + +/********************************************************************* + * WM_CHAR message function + */ + +void EDIT_CharMsg(HWND hwnd, WORD wParam) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + +#ifdef DEBUG_EDIT + printf("EDIT_CharMsg: wParam=%c\n", (char)wParam); +#endif + + switch (wParam) + { + case '\r': + case '\n': + if (!IsMultiLine()) + break; + wParam = '\n'; + EDIT_KeyTyped(hwnd, wParam); + break; + + default: + if (wParam >= 20 && wParam <= 126) + EDIT_KeyTyped(hwnd, wParam); + break; + } +} + + +/********************************************************************* + * EDIT_KeyTyped + * + * Process keystrokes that produce displayable characters. + */ + +void EDIT_KeyTyped(HWND hwnd, short ch) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + char *text = (char *)EDIT_HEAP_ADDR(es->hText); + char *currchar = CurrChar; + RECT rc; + BOOL FullPaint = FALSE; + +#ifdef DEBUG_EDIT + printf("EDIT_KeyTyped: ch=%c\n", (char)ch); +#endif + + /* delete selected text (if any) */ + if (SelMarked(es)) + EDIT_DeleteSel(hwnd); + + /* test for typing at end of maximum buffer size */ + if (currchar == text + es->MaxTextLen) + { + NOTIFY_PARENT(hwnd, EN_ERRSPACE); + return; + } + + if (*currchar == '\0') + { + /* insert a newline at end of text */ + *currchar = '\n'; + *(currchar + 1) = '\0'; + EDIT_BuildTextPointers(hwnd); + } + + /* insert the typed character */ + if (text[es->textlen - 1] != '\0') + { + /* current text buffer is full */ + if (es->textlen == es->MaxTextLen) + { + /* text buffer is at maximum size */ + NOTIFY_PARENT(hwnd, EN_ERRSPACE); + return; + } + + /* increase the text buffer size */ + es->textlen += GROWLENGTH; + /* but not above maximum size */ + if (es->textlen > es->MaxTextLen) + es->textlen = es->MaxTextLen; + es->hText = EDIT_HEAP_REALLOC(es->hText, es->textlen + 2); + if (!es->hText) + NOTIFY_PARENT(hwnd, EN_ERRSPACE); + text = (char *)EDIT_HEAP_ADDR(es->hText); + text[es->textlen - 1] = '\0'; + currchar = CurrChar; + } + /* make space for new character and put char in buffer */ + memmove(currchar + 1, currchar, strlen(currchar) + 1); + *currchar = ch; + EDIT_ModTextPointers(hwnd, es->CurrLine + 1, 1); + es->TextChanged = TRUE; + NOTIFY_PARENT(hwnd, EN_UPDATE); + + /* re-adjust textwidth, if necessary, and redraw line */ + HideCaret(hwnd); + if (IsMultiLine() && es->wlines > 1) + { + es->textwidth = max(es->textwidth, + EDIT_LineLength(es, EDIT_TextLine(hwnd, es->CurrLine), + (int)(EDIT_TextLine(hwnd, es->CurrLine + 1) - + EDIT_TextLine(hwnd, es->CurrLine)))); + } + else + es->textwidth = max(es->textwidth, + EDIT_LineLength(es, text, strlen(text))); + EDIT_WriteTextLine(hwnd, NULL, es->wtop + es->WndRow); + + if (ch == '\n') + { + if (es->wleft > 0) + FullPaint = TRUE; + es->wleft = 0; + EDIT_BuildTextPointers(hwnd); + EDIT_End(hwnd); + EDIT_Forward(hwnd); + + /* invalidate rest of window */ + GetClientRect(hwnd, &rc); + if (!FullPaint) + rc.top = es->WndRow * es->txtht; + InvalidateRect(hwnd, &rc, FALSE); + + SetCaretPos(es->WndCol, es->WndRow * es->txtht); + ShowCaret(hwnd); + UpdateWindow(hwnd); + NOTIFY_PARENT(hwnd, EN_CHANGE); + return; + } + + /* test end of window */ + if (es->WndCol >= ClientWidth(wndPtr) - EDIT_CharWidth(es, ch)) + { + /* TODO:- Word wrap to be handled here */ + +/* if (!(currchar == text + es->MaxTextLen - 2)) */ + EDIT_KeyHScroll(hwnd, SB_LINEDOWN); + } + es->WndCol += EDIT_CharWidth(es, ch); + es->CurrCol++; + SetCaretPos(es->WndCol, es->WndRow * es->txtht); + ShowCaret(hwnd); + NOTIFY_PARENT(hwnd, EN_CHANGE); +} + + +/********************************************************************* + * EDIT_CharWidth + * + * Return the width of the given character in pixels. + */ + +int EDIT_CharWidth(EDITSTATE *es, short ch) +{ + short *charWidths = (short *)EDIT_HEAP_ADDR(es->hCharWidths); + + return (charWidths[ch]); +} + + +/********************************************************************* + * EDIT_Forward + * + * Cursor right key: move right one character position. + */ + +void EDIT_Forward(HWND hwnd) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + char *text = (char *)EDIT_HEAP_ADDR(es->hText); + char *cc = CurrChar + 1; + + if (*cc == '\0') + return; + + if (*CurrChar == '\n') + { + EDIT_Home(hwnd); + EDIT_Downward(hwnd); + } + else + { + es->WndCol += EDIT_CharWidth(es, *CurrChar); + es->CurrCol++; + if (es->WndCol >= ClientWidth(wndPtr)) + EDIT_KeyHScroll(hwnd, SB_LINEDOWN); + } +} + + + +/********************************************************************* + * EDIT_Downward + * + * Cursor down key: move down one line. + */ + +void EDIT_Downward(HWND hwnd) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + +#ifdef DEBUG_EDIT + printf("EDIT_Downward: WndRow=%d, wtop=%d, wlines=%d\n", es->WndRow, es->wtop, es->wlines); +#endif + + if (IsMultiLine() && (es->WndRow + es->wtop + 1 < es->wlines)) + { + es->CurrLine++; + if (es->WndRow == ClientHeight(wndPtr, es) - 1) + { + es->WndRow++; + EDIT_KeyVScrollLine(hwnd, SB_LINEDOWN); + } + else + es->WndRow++; + EDIT_StickEnd(hwnd); + } +} + + +/********************************************************************* + * EDIT_Upward + * + * Cursor up key: move up one line. + */ + +void EDIT_Upward(HWND hwnd) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + if (IsMultiLine() && es->CurrLine != 0) + { + --es->CurrLine; + if (es->WndRow == 0) + { + --es->WndRow; + EDIT_KeyVScrollLine(hwnd, SB_LINEUP); + } + else + --es->WndRow; + EDIT_StickEnd(hwnd); + } +} + + +/********************************************************************* + * EDIT_Backward + * + * Cursor left key: move left one character position. + */ + +void EDIT_Backward(HWND hwnd) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + char *text = (char *)EDIT_HEAP_ADDR(es->hText); + + if (es->CurrCol) + { + --es->CurrCol; + es->WndCol -= EDIT_CharWidth(es, *CurrChar); + if (es->WndCol < 0) + EDIT_KeyHScroll(hwnd, SB_LINEUP); + } + else if (IsMultiLine() && es->CurrLine != 0) + { + EDIT_Upward(hwnd); + EDIT_End(hwnd); + } +} + + +/********************************************************************* + * EDIT_End + * + * End key: move to end of line. + */ + +void EDIT_End(HWND hwnd) +{ + RECT rc; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + char *text = (char *)EDIT_HEAP_ADDR(es->hText); + + while (*CurrChar && *CurrChar != '\n') + { + es->WndCol += EDIT_CharWidth(es, *CurrChar); + es->CurrCol++; + } + + if (es->WndCol >= ClientWidth(wndPtr)) + { + es->wleft = es->WndCol - ClientWidth(wndPtr) + HSCROLLDIM; + es->WndCol -= es->wleft; + InvalidateRect(hwnd, NULL, FALSE); + UpdateWindow(hwnd); + } +} + + +/********************************************************************* + * EDIT_Home + * + * Home key: move to beginning of line. + */ + +void EDIT_Home(HWND hwnd) +{ + RECT rc; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + es->CurrCol = es->WndCol = 0; + if (es->wleft != 0) + { + es->wleft = 0; + InvalidateRect(hwnd, NULL, FALSE); + UpdateWindow(hwnd); + } +} + + +/********************************************************************* + * EDIT_StickEnd + * + * Stick the cursor to the end of the line. + */ + +void EDIT_StickEnd(HWND hwnd) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + char currpel; + + char *cp = EDIT_TextLine(hwnd, es->CurrLine); + char *cp1 = strchr(cp, '\n'); + int len = cp1 ? (int)(cp1 - cp) : 0; + + es->CurrCol = min(len, es->CurrCol); + es->WndCol = min(EDIT_LineLength(es, cp, len) - es->wleft, es->WndCol); + currpel = EDIT_LineLength(es, cp, es->CurrCol); + + if (es->wleft > currpel) + { + es->wleft = max(0, currpel - 20); + es->WndCol = currpel - es->wleft; + UpdateWindow(hwnd); + } + else if (currpel - es->wleft >= ClientWidth(wndPtr)) + { + es->wleft = currpel - (ClientWidth(wndPtr) - 5); + es->WndCol = currpel - es->wleft; + UpdateWindow(hwnd); + } +} + + +/********************************************************************* + * WM_KEYDOWN message function + */ + +void EDIT_KeyDownMsg(HWND hwnd, WORD wParam) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + +#ifdef DEBUG_EDIT + printf("EDIT_KeyDownMsg: key=%x\n", wParam); +#endif + + HideCaret(hwnd); + switch (wParam) + { + case VK_UP: + if (SelMarked(es)) + EDIT_ClearSel(hwnd); + if (IsMultiLine()) + EDIT_Upward(hwnd); + else + EDIT_Backward(hwnd); + break; + + case VK_DOWN: + if (SelMarked(es)) + EDIT_ClearSel(hwnd); + if (IsMultiLine()) + EDIT_Downward(hwnd); + else + EDIT_Forward(hwnd); + break; + + case VK_RIGHT: + if (SelMarked(es)) + EDIT_ClearSel(hwnd); + EDIT_Forward(hwnd); + break; + + case VK_LEFT: + if (SelMarked(es)) + EDIT_ClearSel(hwnd); + EDIT_Backward(hwnd); + break; + + case VK_HOME: + if (SelMarked(es)) + EDIT_ClearSel(hwnd); + EDIT_Home(hwnd); + break; + + case VK_END: + if (SelMarked(es)) + EDIT_ClearSel(hwnd); + EDIT_End(hwnd); + break; + + case VK_PRIOR: + if (IsMultiLine()) + { + if (SelMarked(es)) + EDIT_ClearSel(hwnd); + EDIT_KeyVScrollPage(hwnd, SB_PAGEUP); + } + break; + + case VK_NEXT: + if (IsMultiLine()) + { + if (SelMarked(es)) + EDIT_ClearSel(hwnd); + EDIT_KeyVScrollPage(hwnd, SB_PAGEDOWN); + } + break; + + case VK_BACK: + if (SelMarked(es)) + EDIT_DeleteSel(hwnd); + else + { + if (es->CurrCol == 0 && es->CurrLine == 0) + break; + EDIT_Backward(hwnd); + EDIT_DelKey(hwnd); + } + break; + + case VK_DELETE: + if (SelMarked(es)) + EDIT_DeleteSel(hwnd); + else + EDIT_DelKey(hwnd); + break; + } + + SetCaretPos(es->WndCol, es->WndRow * es->txtht); + ShowCaret(hwnd); +} + + +/********************************************************************* + * EDIT_KeyHScroll + * + * Scroll text horizontally using cursor keys. + */ + +void EDIT_KeyHScroll(HWND hwnd, WORD opt) +{ + RECT rc; + int hscrollpos; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + if (opt == SB_LINEDOWN) + { + es->wleft += HSCROLLDIM; + es->WndCol -= HSCROLLDIM; + } + else + { + if (es->wleft == 0) + return; + if (es->wleft - HSCROLLDIM < 0) + { + es->WndCol += es->wleft; + es->wleft = 0; + } + else + { + es->wleft -= HSCROLLDIM; + es->WndCol += HSCROLLDIM; + } + } + + InvalidateRect(hwnd, NULL, FALSE); + UpdateWindow(hwnd); + + if (IsHScrollBar()) + { + hscrollpos = EDIT_ComputeHScrollPos(hwnd); + SetScrollPos(hwnd, SB_HORZ, hscrollpos, TRUE); + } +} + + +/********************************************************************* + * EDIT_KeyVScrollLine + * + * Scroll text vertically by one line using keyboard. + */ + +void EDIT_KeyVScrollLine(HWND hwnd, WORD opt) +{ + RECT rc; + int y, vscrollpos; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + if (!IsMultiLine()) + return; + + if (opt == SB_LINEDOWN) + { + /* move down one line */ + if (es->wtop + ClientHeight(wndPtr, es) >= es->wlines) + return; + es->wtop++; + } + else + { + /* move up one line */ + if (es->wtop == 0) + return; + --es->wtop; + } + + if (IsWindowVisible(hwnd)) + { + /* adjust client bottom to nearest whole line */ + GetClientRect(hwnd, &rc); + rc.bottom = (rc.bottom / es->txtht) * es->txtht; + + if (opt == SB_LINEUP) + { + /* move up one line (scroll window down) */ + ScrollWindow(hwnd, 0, es->txtht, &rc, &rc); + /* write top line */ + EDIT_WriteTextLine(hwnd, NULL, es->wtop); + es->WndRow++; + } + else + { + /* move down one line (scroll window up) */ + ScrollWindow(hwnd, 0, -(es->txtht), &rc, &rc); + /* write bottom line */ + y = (((rc.bottom - rc.top) / es->txtht) - 1); + EDIT_WriteTextLine(hwnd, NULL, es->wtop + y); + --es->WndRow; + } + } + + /* reset the vertical scroll bar */ + if (IsVScrollBar()) + { + vscrollpos = EDIT_ComputeVScrollPos(hwnd); + SetScrollPos(hwnd, SB_VERT, vscrollpos, TRUE); + } +} + + +/********************************************************************* + * EDIT_KeyVScrollPage + * + * Scroll text vertically by one page using keyboard. + */ + +void EDIT_KeyVScrollPage(HWND hwnd, WORD opt) +{ + RECT rc; + int vscrollpos; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + if (IsMultiLine()) + { + if (opt == SB_PAGEUP) + { + if (es->wtop) + es->wtop -= ClientHeight(wndPtr, es); + } + else + { + if (es->wtop + ClientHeight(wndPtr, es) < es->wlines) + { + es->wtop += ClientHeight(wndPtr, es); + if (es->wtop > es->wlines - ClientHeight(wndPtr, es)) + es->wtop = es->wlines - ClientHeight(wndPtr, es); + } + } + if (es->wtop < 0) + es->wtop = 0; + + es->CurrLine = es->wtop + es->WndRow; + EDIT_StickEnd(hwnd); + InvalidateRect(hwnd, NULL, TRUE); + UpdateWindow(hwnd); + + /* reset the vertical scroll bar */ + if (IsVScrollBar()) + { + vscrollpos = EDIT_ComputeVScrollPos(hwnd); + SetScrollPos(hwnd, SB_VERT, vscrollpos, TRUE); + } + } +} + + +/********************************************************************* + * EDIT_KeyVScrollDoc + * + * Scroll text to top and bottom of document using keyboard. + */ + +void EDIT_KeyVScrollDoc(HWND hwnd, WORD opt) +{ + RECT rc; + int vscrollpos; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + if (!IsMultiLine()) + return; + + if (opt == SB_TOP) + es->wtop = es->wleft = 0; + else if (es->wtop + ClientHeight(wndPtr, es) < es->wlines) + { + es->wtop = es->wlines - ClientHeight(wndPtr, es); + es->wleft = 0; + } + + es->CurrLine = es->wlines; + es->WndRow = es->wlines - es->wtop; + EDIT_End(hwnd); + InvalidateRect(hwnd, NULL, TRUE); + UpdateWindow(hwnd); + + /* reset the vertical scroll bar */ + if (IsVScrollBar()) + { + vscrollpos = EDIT_ComputeVScrollPos(hwnd); + SetScrollPos(hwnd, SB_VERT, vscrollpos, TRUE); + } +} + + +/********************************************************************* + * EDIT_ComputeVScrollPos + * + * Compute the vertical scroll bar position from the window + * position and text width. + */ + +int EDIT_ComputeVScrollPos(HWND hwnd) +{ + int vscrollpos; + short minpos, maxpos; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + GetScrollRange(hwnd, SB_VERT, &minpos, &maxpos); + + if (es->wlines > ClientHeight(wndPtr, es)) + vscrollpos = (double)(es->wtop) / (double)(es->wlines - + ClientHeight(wndPtr, es)) * (maxpos - minpos); + else + vscrollpos = minpos; + + return vscrollpos; +} + + +/********************************************************************* + * EDIT_ComputeHScrollPos + * + * Compute the horizontal scroll bar position from the window + * position and text width. + */ + +int EDIT_ComputeHScrollPos(HWND hwnd) +{ + int hscrollpos; + short minpos, maxpos; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + GetScrollRange(hwnd, SB_HORZ, &minpos, &maxpos); + + if (es->textwidth > ClientWidth(wndPtr)) + hscrollpos = (double)(es->wleft) / (double)(es->textwidth - + ClientWidth(wndPtr)) * (maxpos - minpos); + else + hscrollpos = minpos; + + return hscrollpos; +} + + +/********************************************************************* + * EDIT_DelKey + * + * Delete character to right of cursor. + */ + +void EDIT_DelKey(HWND hwnd) +{ + RECT rc; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + char *currchar = CurrChar; + BOOL repaint = *currchar == '\n'; + + if (IsMultiLine() && *currchar == '\n' && *(currchar + 1) == '\0') + return; + strcpy(currchar, currchar + 1); + NOTIFY_PARENT(hwnd, EN_UPDATE); + + if (repaint) + { + EDIT_BuildTextPointers(hwnd); + GetClientRect(hwnd, &rc); + rc.top = es->WndRow * es->txtht; + InvalidateRect(hwnd, &rc, FALSE); + UpdateWindow(hwnd); + } + else + { + EDIT_ModTextPointers(hwnd, es->CurrLine + 1, -1); + EDIT_WriteTextLine(hwnd, NULL, es->WndRow + es->wtop); + } + + es->TextChanged = TRUE; + NOTIFY_PARENT(hwnd, EN_CHANGE); +} + +/********************************************************************* + * WM_VSCROLL message function + */ + +void EDIT_VScrollMsg(HWND hwnd, WORD wParam, LONG lParam) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + if (IsMultiLine()) + { + HideCaret(hwnd); + + switch (wParam) + { + case SB_LINEUP: + case SB_LINEDOWN: + EDIT_VScrollLine(hwnd, wParam); + break; + + case SB_PAGEUP: + case SB_PAGEDOWN: + EDIT_VScrollPage(hwnd, wParam); + break; + } + } + + SetCaretPos(es->WndCol, es->WndRow); + ShowCaret(hwnd); +} + + +/********************************************************************* + * EDIT_VScrollLine + * + * Scroll text vertically by one line using scrollbars. + */ + +void EDIT_VScrollLine(HWND hwnd, WORD opt) +{ + RECT rc; + int y; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + +#ifdef DEBUG_EDIT + printf("EDIT_VScrollLine: direction=%d\n", opt); +#endif + + if (opt == SB_LINEDOWN) + { + /* move down one line */ + if (es->wtop + ClientHeight(wndPtr, es) >= es->wlines) + return; + es->wtop++; + printf("Scroll line down: wtop=%d\n", es->wtop); + } + else + { + /* move up one line */ + if (es->wtop == 0) + return; + --es->wtop; + printf("Scroll line up: wtop=%d\n", es->wtop); + } + + if (IsWindowVisible(hwnd)) + { + /* adjust client bottom to nearest whole line */ + GetClientRect(hwnd, &rc); + rc.bottom = (rc.bottom / es->txtht) * es->txtht; + + if (opt == SB_LINEUP) + { + /* move up one line (scroll window down) */ + ScrollWindow(hwnd, 0, es->txtht, &rc, &rc); + /* write top line */ + EDIT_WriteTextLine(hwnd, NULL, es->wtop); + es->WndRow++; + } + else + { + /* move down one line (scroll window up) */ + ScrollWindow(hwnd, 0, -(es->txtht), &rc, &rc); + /* write bottom line */ + y = ((rc.bottom - rc.top / es->txtht) - 1); + EDIT_WriteTextLine(hwnd, NULL, es->wtop + y); + --es->WndRow; + } + } +} + + +/********************************************************************* + * EDIT_VScrollPage + * + * Scroll text vertically by one page using keyboard. + */ + +void EDIT_VScrollPage(HWND hwnd, WORD opt) +{ + RECT rc; + int vscrollpos; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + if (opt == SB_PAGEUP) + { + if (es->wtop) + es->wtop -= ClientHeight(wndPtr, es); + } + else + { + if (es->wtop + ClientHeight(wndPtr, es) < es->wlines) + { + es->wtop += ClientHeight(wndPtr, es); + if (es->wtop > es->wlines - ClientHeight(wndPtr, es)) + es->wtop = es->wlines - ClientHeight(wndPtr, es); + } + } + if (es->wtop < 0) + es->wtop = 0; + + InvalidateRect(hwnd, NULL, TRUE); + UpdateWindow(hwnd); + + /* reset the vertical scroll bar */ + if (IsVScrollBar()) + { + vscrollpos = EDIT_ComputeVScrollPos(hwnd); + SetScrollPos(hwnd, SB_VERT, vscrollpos, TRUE); + } +} + + +/********************************************************************* + * WM_HSCROLL message function + */ + +void EDIT_HScrollMsg(HWND hwnd, WORD wParam, LONG lParam) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + switch (wParam) + { + case SB_LINEUP: + case SB_LINEDOWN: + HideCaret(hwnd); + + SetCaretPos(es->WndCol, es->WndRow * es->txtht); + ShowCaret(hwnd); + break; + } +} + + +/********************************************************************* + * WM_SIZE message function + */ + +void EDIT_SizeMsg(HWND hwnd, WORD wParam, LONG lParam) +{ + RECT rc; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + if (wParam != SIZE_MAXIMIZED && wParam != SIZE_RESTORED) return; + + InvalidateRect(hwnd, NULL, TRUE); + es->PaintBkgd = TRUE; + UpdateWindow(hwnd); +} + + +/********************************************************************* + * WM_LBUTTONDOWN message function + */ + +void EDIT_LButtonDownMsg(HWND hwnd, WORD wParam, LONG lParam) +{ + char *cp, *cp1; + int len; + BOOL end = FALSE; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + if (SelMarked(es)) + EDIT_ClearSel(hwnd); + + es->WndRow = HIWORD(lParam) / es->txtht; + if (es->WndRow > es->wlines - es->wtop - 1) + { + if (es->wlines) + es->WndRow = es->wlines - es->wtop - 1; + else + es->WndRow = 0; + end = TRUE; + } + es->CurrLine = es->wtop + es->WndRow; + + cp = EDIT_TextLine(hwnd, es->CurrLine); + cp1 = strchr(cp, '\n'); + len = cp1 ? (int)(cp1 - cp) : 0; + + es->WndCol = LOWORD(lParam); + if (es->WndCol > EDIT_LineLength(es, cp, len) - es->wleft || end) + es->WndCol = EDIT_LineLength(es, cp, len) - es->wleft; + es->CurrCol = EDIT_PixelToChar(hwnd, es->CurrLine, &(es->WndCol)); + + ButtonDown = TRUE; + ButtonRow = es->CurrLine; + ButtonCol = es->CurrCol; +} + + +/********************************************************************* + * WM_MOUSEMOVE message function + */ + +void EDIT_MouseMoveMsg(HWND hwnd, WORD wParam, LONG lParam) +{ + if (wParam != MK_LBUTTON) + return; + + if (ButtonDown) + { + EDIT_SetAnchor(hwnd, ButtonRow, ButtonCol); + TextMarking = TRUE; + ButtonDown = FALSE; + } + + if (TextMarking) + EDIT_ExtendSel(hwnd, LOWORD(lParam), HIWORD(lParam)); +} + + +/********************************************************************* + * EDIT_PixelToChar + * + * Convert a pixel offset in the given row to a character offset, + * adjusting the pixel offset to the nearest whole character if + * necessary. + */ + +int EDIT_PixelToChar(HWND hwnd, int row, int *pixel) +{ + int ch = 0, i = 0; + char *text; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + short *charWidths = (short *)EDIT_HEAP_ADDR(es->hCharWidths); + +#ifdef DEBUG_EDIT + printf("EDIT_PixelToChar: row=%d, pixel=%d\n", row, *pixel); +#endif + + text = EDIT_TextLine(hwnd, row); + while (i < *pixel) + { + i += charWidths[*(text + ch)]; + ch++; + } + + /* if stepped past _pixel_, go back a character */ + if (i - *pixel) + i -= charWidths[*(text + ch)]; + *pixel = i; + return ch; +} + + +/********************************************************************* + * WM_SETTEXT message function + */ + +LONG EDIT_SetTextMsg(HWND hwnd, LONG lParam) +{ + int len; + char *text; + RECT rc; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + if (strlen((char *)lParam) <= es->MaxTextLen) + { + len = strlen((char *)lParam); + EDIT_ClearText(hwnd); + es->textlen = len; + es->hText = EDIT_HEAP_REALLOC(es->hText, len + 3); + text = EDIT_HEAP_ADDR(es->hText); + strcpy(text, (char *)lParam); + text[len] = '\n'; + text[len + 1] = '\0'; + text[len + 2] = '\0'; + EDIT_BuildTextPointers(hwnd); + InvalidateRect(hwnd, NULL, TRUE); + es->PaintBkgd = TRUE; + es->TextChanged = TRUE; + return 0L; + } + else + return EN_ERRSPACE; +} + + +/********************************************************************* + * EDIT_ClearText + * + * Clear text from text buffer. + */ + +void EDIT_ClearText(HWND hwnd) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + unsigned int blen = EditBufLen(wndPtr) + 2; + char *text; + + es->hText = EDIT_HEAP_REALLOC(es->hText, blen); + text = EDIT_HEAP_ADDR(es->hText); + memset(text, 0, blen); + es->textlen = 0; + es->wlines = 0; + es->CurrLine = es->CurrCol = 0; + es->WndRow = es->WndCol = 0; + es->wleft = es->wtop = 0; + es->textwidth = 0; + es->TextChanged = FALSE; + EDIT_ClearTextPointers(hwnd); +} + + +/********************************************************************* + * EM_SETSEL message function + */ + +void EDIT_SetSelMsg(HWND hwnd, LONG lParam) +{ + int so, eo; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + if ((short)(lParam) < 0 || (short)(lParam >> 16) < 0) + return; + so = LOWORD(lParam); + eo = HIWORD(lParam); + if (so > eo) + swap(&so, &eo); + + EDIT_GetLineCol(hwnd, so, &(es->SelBegLine), &(es->SelBegCol)); + EDIT_GetLineCol(hwnd, eo, &(es->SelEndLine), &(es->SelEndCol)); + + es->CurrLine = es->SelEndLine; + es->CurrCol = es->SelEndCol; + es->WndRow = es->SelEndLine - es->wtop; + if (es->WndRow < 0) + { + es->wtop = es->SelEndLine; + es->WndRow = 0; + } + es->WndCol = EDIT_LineLength(es, EDIT_TextLine(hwnd, es->SelEndLine), + es->SelEndCol) - es->wleft; + + InvalidateRect(hwnd, NULL, TRUE); + UpdateWindow(hwnd); +} + + +/********************************************************************* + * EDIT_GetLineCol + * + * Return line and column in text buffer from character offset. + */ + +void EDIT_GetLineCol(HWND hwnd, int off, int *line, int *col) +{ + int lineno; + char *cp, *cp1; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + char *text = (char *)EDIT_HEAP_ADDR(es->hText); + unsigned int *textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs); + + if (off > strlen(text)) off = strlen(text); + for (lineno = 0; lineno < es->wlines; lineno++) + { + cp = text + *(textPtrs + lineno); + if (off == (int)(cp - text)) + { + *line = lineno; + *col = 0; + return; + } + if (off < (int)(cp - text)) + break; + cp1 = cp; + } + *line = lineno - 1; + *col = off - (int)(cp1 - text); + if (*(text + *col) == '\0') + (*col)--; +} + + +/********************************************************************* + * EDIT_DeleteSel + * + * Delete the current selected text (if any) + */ + +void EDIT_DeleteSel(HWND hwnd) +{ + char *bbl, *bel; + int len; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + char *text = (char *)EDIT_HEAP_ADDR(es->hText); + + if (SelMarked(es)) + { + bbl = EDIT_TextLine(hwnd, es->SelBegLine) + es->SelBegCol; + bel = EDIT_TextLine(hwnd, es->SelEndLine) + es->SelEndCol; + len = (int)(bel - bbl); + es->TextChanged = TRUE; + strcpy(bbl, bel); + + es->CurrLine = es->SelBegLine; + es->CurrCol = es->SelBegCol; + es->WndRow = es->SelBegLine - es->wtop; + if (es->WndRow < 0) + { + es->wtop = es->SelBegLine; + es->WndRow = 0; + } + es->WndCol = EDIT_LineLength(es, bbl - es->SelBegCol, + es->SelBegCol) - es->wleft; + + EDIT_BuildTextPointers(hwnd); + es->PaintBkgd = TRUE; + EDIT_ClearSel(hwnd); + } +} + + +/********************************************************************* + * EDIT_ClearSel + * + * Clear the current selection. + */ + +void EDIT_ClearSel(HWND hwnd) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + es->SelBegLine = es->SelBegCol = -1; + es->SelEndLine = es->SelEndCol = -1; + + InvalidateRect(hwnd, NULL, TRUE); + UpdateWindow(hwnd); +} + + +/********************************************************************* + * EDIT_TextLineNumber + * + * Return the line number in the text buffer of the supplied + * character pointer. + */ + +int EDIT_TextLineNumber(HWND hwnd, char *lp) +{ + int lineno; + char *cp; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + char *text = (char *)EDIT_HEAP_ADDR(es->hText); + unsigned int *textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs); + + for (lineno = 0; lineno < es->wlines; lineno++) + { + cp = text + *(textPtrs + lineno); + if (cp == lp) + return lineno; + if (cp > lp) + break; + } + return lineno - 1; +} + + +/********************************************************************* + * EDIT_SetAnchor + * + * Set down anchor for text marking. + */ + +void EDIT_SetAnchor(HWND hwnd, int row, int col) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + EDIT_ClearSel(hwnd); + es->SelBegLine = es->SelEndLine = row; + es->SelBegCol = es->SelEndCol = col; + InvalidateRect(hwnd, NULL, FALSE); + UpdateWindow(hwnd); +} + + +/********************************************************************* + * EDIT_ExtendSel + * + * Extend selection to the given screen co-ordinates. + */ + +void EDIT_ExtendSel(HWND hwnd, int x, int y) +{ + int bbl, bel; + int ptop, pbot; + char *cp, *cp1; + int len; + BOOL end = FALSE; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + +#ifdef DEBUG_EDIT + printf("EDIT_ExtendSel: x=%d, y=%d\n", x, y); +#endif + + ptop = min(es->SelBegLine, es->SelEndLine); + pbot = max(es->SelBegLine, es->SelEndLine); + cp = EDIT_TextLine(hwnd, es->wtop + y / es->txtht); + cp1 = strchr(cp, '\n'); + len = cp1 ? (int)(cp1 - cp) : 0; + + es->WndRow = y / es->txtht; + if (es->WndRow > es->wlines - es->wtop - 1) + { + if (es->wlines) + es->WndRow = es->wlines - es->wtop - 1; + else + es->WndRow = 0; + end = TRUE; + } + es->CurrLine = es->wtop + es->WndRow; + es->SelEndLine = es->CurrLine; + + es->WndCol = x; + if (es->WndCol > EDIT_LineLength(es, cp, len) - es->wleft || end) + es->WndCol = EDIT_LineLength(es, cp, len) - es->wleft; + es->CurrCol = EDIT_PixelToChar(hwnd, es->CurrLine, &(es->WndCol)); + es->SelEndCol = es->CurrCol; + + bbl = min(es->SelBegLine, es->SelEndLine); + bel = max(es->SelBegLine, es->SelEndLine); + while (ptop < bbl) + { + EDIT_WriteTextLine(hwnd, NULL, ptop); + ptop++; + } + for (y = bbl; y <= bel; y++) + EDIT_WriteTextLine(hwnd, NULL, y); + while (pbot > bel) + { + EDIT_WriteTextLine(hwnd, NULL, pbot); + --pbot; + } +} + + +/********************************************************************* + * EDIT_StopMarking + * + * Stop text marking (selection). + */ + +void EDIT_StopMarking(HWND hwnd) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + TextMarking = FALSE; + if (es->SelBegLine > es->SelEndLine) + { + swap(&(es->SelBegLine), &(es->SelEndLine)); + swap(&(es->SelBegCol), &(es->SelEndCol)); + } + if (es->SelBegLine == es->SelEndLine && es->SelBegCol > es->SelEndCol) + swap(&(es->SelBegCol), &(es->SelEndCol)); +} + + +/********************************************************************* + * EM_GETLINE message function + */ + +LONG EDIT_GetLineMsg(HWND hwnd, WORD wParam, LONG lParam) +{ + char *cp, *cp1; + int len; + char *buffer = (char *)lParam; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + cp = EDIT_TextLine(hwnd, wParam); + cp1 = EDIT_TextLine(hwnd, wParam + 1); + len = min((int)(cp1 - cp), (WORD)(*buffer)); + strncpy(buffer, cp, len); + + return (LONG)len; +} + + +/********************************************************************* + * EM_GETSEL message function + */ + +LONG EDIT_GetSelMsg(HWND hwnd) +{ + int so, eo; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + unsigned int *textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs); + + so = *(textPtrs + es->SelBegLine) + es->SelBegCol; + eo = *(textPtrs + es->SelEndLine) + es->SelEndCol; + + return MAKELONG(so, eo); +} + + +/********************************************************************* + * EM_LINEFROMCHAR message function + */ + +LONG EDIT_LineFromCharMsg(HWND hwnd, WORD wParam) +{ + int row, col; + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + + if (wParam == 0xffff) /* really -1 */ + return (LONG)(es->SelBegLine); + else + EDIT_GetLineCol(hwnd, wParam, &row, &col); + + return (LONG)row; +} + + +/********************************************************************* + * EM_LINEINDEX message function + */ + +LONG EDIT_LineIndexMsg(HWND hwnd, WORD wParam) +{ + WND *wndPtr = WIN_FindWndPtr(hwnd); + EDITSTATE *es = (EDITSTATE *)EDIT_HEAP_ADDR((HANDLE)(*(wndPtr->wExtra))); + unsigned int *textPtrs = (unsigned int *)EDIT_HEAP_ADDR(es->hTextPtrs); + + if (wParam == 0xffff) /* really -1 */ + wParam = es->CurrLine; + + return (LONG)(*(textPtrs + wParam)); +} + + +/********************************************************************* + * Utility functions + */ + +void swap(int *a, int *b) +{ + int x; + + x = *a; + *a = *b; + *b = x; +} + diff --git a/controls/listbox.c b/controls/listbox.c index a20eea90138..70a6c54c01c 100644 --- a/controls/listbox.c +++ b/controls/listbox.c @@ -1260,3 +1260,28 @@ int ListBoxFindNextMatch(HWND hwnd, WORD wChar) } +/************************************************************************ + * DlgDirSelect [USER.99] + */ +BOOL DlgDirSelect(HWND hDlg, LPSTR lpStr, int nIDLBox) +{ + printf("DlgDirSelect(%04X, '%s', %d) \n", hDlg, lpStr, nIDLBox); +} + + +/************************************************************************ + * DlgDirList [USER.100] + */ +int DlgDirList(HWND hDlg, LPSTR lpPathSpec, + int nIDLBox, int nIDStat, WORD wType) +{ + HWND hWnd; + printf("DlgDirList(%04X, '%s', %d, %d, %04X) \n", + hDlg, lpPathSpec, nIDLBox, nIDStat, wType); + hWnd = GetDlgItem(hDlg, nIDLBox); + ListBoxResetContent(hWnd); + return ListBoxDirectory(hWnd, wType, lpPathSpec); +} + + + diff --git a/controls/menu.c b/controls/menu.c index 9ab0366b600..7a79e9f28f6 100644 --- a/controls/menu.c +++ b/controls/menu.c @@ -29,7 +29,8 @@ static BOOL MenuHasFocus = FALSE; LPPOPUPMENU PopupMenuGetStorageHeader(HWND hwnd); LPPOPUPMENU PopupMenuGetWindowAndStorage(HWND hwnd, WND **wndPtr); -void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop); +void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop, + BOOL suppress_draw); BOOL MenuButtonDown(HWND hWnd, LPPOPUPMENU lppop, int x, int y); void MenuButtonUp(HWND hWnd, LPPOPUPMENU lppop, int x, int y); void MenuMouseMove(HWND hWnd, LPPOPUPMENU lppop, WORD wParam, int x, int y); @@ -39,7 +40,7 @@ BOOL ExecFocusedMenuItem(HWND hWnd, LPPOPUPMENU lppop); void MenuItemSelect(HWND hWnd, LPPOPUPMENU lppop, WORD wIndex); LPMENUITEM MenuFindItem(LPPOPUPMENU lppop, int x, int y, WORD *lpRet); LPMENUITEM MenuFindItemBySelKey(LPPOPUPMENU lppop, WORD key, WORD *lpRet); -BOOL ActivateMenuFocus(HWND hWnd); +BOOL ActivateMenuBarFocus(HWND hWnd); BOOL MenuFocusLoop(HWND hWnd, LPPOPUPMENU lpmenu); void PopupMenuCalcSize(HWND hwnd); void MenuBarCalcSize(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop); @@ -87,6 +88,9 @@ LONG PopupMenuWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ) hStdCheck = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_CHECK); if (hStdMnArrow == (HBITMAP)NULL) hStdMnArrow = LoadBitmap((HANDLE)NULL, (LPSTR)OBM_MNARROW); +#ifdef DEBUG_MENU + printf("PopupMenu End of WM_CREATE !\n"); +#endif return 0; case WM_DESTROY: lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); @@ -137,6 +141,7 @@ LONG PopupMenuWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ) #endif if (lppop->SysFlag) MenuHasFocus = FALSE; SetFocus(lppop->hWndPrev); + if (GetCapture() != 0) ReleaseCapture(); break; } lppop->FocusedItem = (WORD)-1; @@ -271,55 +276,61 @@ ProceedSPACE: lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); printf("PopupMenuWndProc hWnd=%04X WM_CHAR wParam=%04X !\n", hwnd, wParam); #endif if (lParam < 0L) break; + hwnd = GetFocus(); lppop = PopupMenuGetWindowAndStorage(hwnd, &wndPtr); if (lppop == NULL) break; - if (wParam == VK_ESCAPE) { - if (lppop->BarFlag) { + switch(wParam) { + case VK_ESCAPE: + if (lppop->BarFlag) { #ifdef DEBUG_MENU - printf("VK_ESCAPE // Unselect all MenuBar's Items !\n"); + printf("VK_ESCAPE // Unselect all MenuBar's Items !\n"); #endif - if (lppop->FocusedItem != (WORD)-1) - MenuItemSelect(hwnd, lppop, -1); - } - if (lppop->SysFlag) { + if (lppop->FocusedItem != (WORD)-1) + MenuItemSelect(hwnd, lppop, -1); + } + if (lppop->SysFlag) { #ifdef DEBUG_MENU - printf("VK_ESCAPE // SysMenu !\n"); + printf("VK_ESCAPE // SysMenu !\n"); #endif - ShowWindow(hwnd, SW_HIDE); + ShowWindow(hwnd, SW_HIDE); + break; + } + if (lppop->hWndParent != 0) { +#ifdef DEBUG_MENU + printf("VK_ESCAPE // Hide only SubPopup !\n"); +#endif + lppop2 = PopupMenuGetWindowAndStorage(lppop->hWndParent, &wndPtr); + if (lppop2 == NULL) break; + HideAllSubPopupMenu(lppop2); + break; + } + else { +#ifdef DEBUG_MENU + printf("VK_ESCAPE // Hide Root Popup !\n"); +#endif + ShowWindow(hwnd, SW_HIDE); + MenuHasFocus = FALSE; + } break; - } - if (lppop->hWndParent != 0) { -#ifdef DEBUG_MENU - printf("VK_ESCAPE // Hide only SubPopup !\n"); -#endif - lppop2 = PopupMenuGetWindowAndStorage(lppop->hWndParent, &wndPtr); - if (lppop2 == NULL) break; - HideAllSubPopupMenu(lppop2); + default: + if (wParam >= 'a' && wParam <= 'z') wParam -= 'a' - 'A'; + lpitem = MenuFindItemBySelKey(lppop, wParam, &wRet); + if (lpitem != NULL) { + printf("ShortKey Found wRet=%d !\n", wRet); + MenuItemSelect(hwnd, lppop, wRet); + lppop->FocusedItem = wRet; + goto ProceedSPACE; + } + printf("ShortKey Not Found wParam=%04X wRet=%d lpitem=%08X !\n", + wParam, wRet, lpitem); + if (lppop->hWndParent != (HWND)NULL) + SendMessage(lppop->hWndParent, WM_MENUCHAR, wParam, + MAKELONG(0, 0)); + else + SendMessage(lppop->ownerWnd, WM_MENUCHAR, wParam, + MAKELONG(0, 0)); break; - } - else { -#ifdef DEBUG_MENU - printf("VK_ESCAPE // Hide Root Popup !\n"); -#endif - ShowWindow(hwnd, SW_HIDE); - MenuHasFocus = FALSE; - } - break; } - if (wParam >= 'a' && wParam <= 'z') wParam -= 'a' - 'A'; - lpitem = MenuFindItemBySelKey(lppop, wParam, &wRet); - if (lpitem != NULL) { - printf("Found wRet=%d !\n", wRet); - MenuItemSelect(hwnd, lppop, wRet); - lppop->FocusedItem = wRet; - goto ProceedSPACE; - } - if (lppop->hWndParent != (HWND)NULL) - SendMessage(lppop->hWndParent, WM_MENUCHAR, wParam, - MAKELONG(0, 0)); - else - SendMessage(lppop->ownerWnd, WM_MENUCHAR, wParam, - MAKELONG(0, 0)); break; case WM_PAINT: #ifdef DEBUG_MENU @@ -352,7 +363,6 @@ BOOL ExecFocusedMenuItem(HWND hWnd, LPPOPUPMENU lppop) lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu); if (lppop2 == NULL) return FALSE; lppop2->hWndParent = hWnd; - lppop2->hWndPrev = GetFocus(); GetClientRect(hWnd, &rect); if (lppop->BarFlag) { GetWindowRect(hWnd, &rect); @@ -398,9 +408,11 @@ BOOL MenuButtonDown(HWND hWnd, LPPOPUPMENU lppop, int x, int y) LPPOPUPMENU lppop2; if (lppop == NULL) return; lpitem = MenuFindItem(lppop, x, y, &wRet); + printf("MenuButtonDown hWnd=%04X x=%d y=%d // wRet=%d lpitem=%08X !\n", + hWnd, x, y, wRet, lpitem); #ifdef DEBUG_MENU - printf("MenuButtonDown // x=%d y=%d // wRet=%d lpitem=%08X !\n", - x, y, wRet, lpitem); + printf("MenuButtonDown hWnd=%04X x=%d y=%d // wRet=%d lpitem=%08X !\n", + hWnd, x, y, wRet, lpitem); #endif if (lpitem != NULL) { MenuItemSelect(hWnd, lppop, wRet); @@ -409,7 +421,6 @@ BOOL MenuButtonDown(HWND hWnd, LPPOPUPMENU lppop, int x, int y) lppop2 = (LPPOPUPMENU) GlobalLock(hSubMenu); if (lppop2 == NULL) return; lppop2->hWndParent = hWnd; - lppop2->hWndPrev = GetFocus(); if (lppop->BarFlag) { GetWindowRect(hWnd, &rect); y = rect.top + lppop->rect.bottom; @@ -517,7 +528,6 @@ void MenuMouseMove(HWND hWnd, LPPOPUPMENU lppop, WORD wParam, int x, int y) } if (lppop->BarFlag) { lppop2->hWndParent = hWnd; - lppop2->hWndPrev = GetFocus(); GetWindowRect(hWnd, &rect); rect.top += lppop->rect.bottom; TrackPopupMenu(hSubMenu, TPM_LEFTBUTTON, @@ -534,7 +544,6 @@ void MenuMouseMove(HWND hWnd, LPPOPUPMENU lppop, WORD wParam, int x, int y) void ResetHiliteFlags(LPPOPUPMENU lppop) { - HDC hDC; LPMENUITEM lpitem; int i; if (lppop == NULL) return; @@ -731,6 +740,7 @@ void StdDrawPopupMenu(HWND hwnd) FillRect(hDC, &rect3, GetStockObject(BLACK_BRUSH)); InflateRect(&rect3, 0, -2); rect3.left += lppop->CheckWidth; + hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN)); if ((x = GetShortCutPos(lpitem->item_text)) != (WORD)-1) { DrawText(hDC, lpitem->item_text, x, &rect3, DT_LEFT | DT_VCENTER | DT_SINGLELINE); @@ -740,6 +750,7 @@ void StdDrawPopupMenu(HWND hwnd) else DrawText(hDC, lpitem->item_text, -1, &rect3, DT_LEFT | DT_VCENTER | DT_SINGLELINE); + SelectObject(hDC, hOldPen); SetTextColor(hDC, OldTextColor); SetBkMode(hDC, OldBkMode); SelectObject(hDC, hOldFont); @@ -764,7 +775,8 @@ EndOfPaint: -void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop) +void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop, + BOOL suppress_draw) { LPMENUITEM lpitem; HBRUSH hBrush; @@ -782,7 +794,11 @@ void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop) printf("StdDrawMenuBar(%04X, %08X, %08X); !\n", hDC, lprect, lppop); #endif MenuBarCalcSize(hDC, lprect, lppop); + if (suppress_draw) + return; + hOldFont = SelectObject(hDC, GetStockObject(SYSTEM_FONT)); + hOldPen = SelectObject(hDC, GetStockObject(BLACK_PEN)); hBrush = GetStockObject(WHITE_BRUSH); CopyRect(&rect, lprect); FillRect(hDC, &rect, hBrush); @@ -850,6 +866,7 @@ void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop) lpitem = (LPMENUITEM)lpitem->next; } EndOfPaint: + SelectObject(hDC, hOldPen); SelectObject(hDC, hOldFont); } @@ -886,12 +903,13 @@ LPMENUITEM MenuFindItemBySelKey(LPPOPUPMENU lppop, WORD key, WORD *lpRet) LPMENUITEM lpitem; UINT i; if (lppop == NULL) return NULL; + if (lppop->nItems == 0) return NULL; lpitem = lppop->firstItem; for(i = 0; i < lppop->nItems; i++) { if (lpitem == NULL) return NULL; #ifdef DEBUG_MENUFINDITEM - printf("FindItemBySelKey // key=%d lpitem->sel_key=%d\n", + printf("FindItemBySelKey // key=%04X lpitem->sel_key=%04X\n", key, lpitem->sel_key); #endif if (key == lpitem->sel_key) { @@ -1289,6 +1307,7 @@ BOOL InsertMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewIt menu = (LPPOPUPMENU) GlobalLock(hMenu); if (menu == NULL) return FALSE; lpitem = FindMenuItem(hMenu, nPos, wFlags); + if (lpitem == NULL) lpitem = menu->firstItem; hNewItem = GlobalAlloc(GMEM_MOVEABLE, sizeof(MENUITEM)); if (hNewItem == 0) { GlobalUnlock(hMenu); @@ -1303,21 +1322,31 @@ BOOL InsertMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewIt lpitem2->item_flags = wFlags; lpitem2->item_id = wItemID; if (!(wFlags & (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | - MF_MENUBREAK | MF_SEPARATOR))) { - lpitem2->item_text = GlobalQuickAlloc(strlen(lpNewItem) + 1); - strcpy(lpitem2->item_text, lpNewItem); + MF_MENUBREAK | MF_SEPARATOR))) { +/* lpitem2->item_text = GlobalQuickAlloc(strlen(lpNewItem) + 1); */ + lpitem2->item_text = GlobalLock(GlobalAlloc(GMEM_MOVEABLE, strlen(lpNewItem) + 1)); + if (lpitem2->item_text != NULL) + strcpy(lpitem2->item_text, lpNewItem); + else { + printf("InsertMenu // Bad Alloc !\n"); + return FALSE; + } lpitem2->sel_key = GetSelectionKey(lpitem2->item_text); } else { - lpitem2->item_text = lpNewItem; - } - - lpitem2->prev = lpitem; - if (lpitem->next != NULL) - lpitem2->next = lpitem->next; - else + lpitem2->item_text = lpNewItem; + } + if (lpitem == NULL) { + menu->firstItem = lpitem2; + lpitem2->prev = NULL; lpitem2->next = NULL; - lpitem->next = lpitem2; + } + else { + lpitem2->prev = lpitem; + lpitem2->next = lpitem->next; + if (lpitem2->next != NULL) lpitem2->next->prev = lpitem2; + lpitem->next = lpitem2; + } lpitem2->child = NULL; lpitem2->parent = NULL; menu->nItems++; @@ -1338,10 +1367,10 @@ BOOL AppendMenu(HMENU hMenu, WORD wFlags, WORD wItemID, LPSTR lpNewItem) #ifdef DEBUG_MENU if ((wFlags & (MF_BITMAP | MF_SEPARATOR | MF_MENUBREAK | MF_OWNERDRAW)) == 0) printf("AppendMenu (%04X, %04X, %04X, '%s') !\n", - hMenu, wFlags, wItemID, lpNewItem); + hMenu, wFlags, wItemID, lpNewItem); else printf("AppendMenu (%04X, %04X, %04X, %08X) !\n", - hMenu, wFlags, wItemID, lpNewItem); + hMenu, wFlags, wItemID, lpNewItem); #endif menu = (LPPOPUPMENU) GlobalLock(hMenu); if (menu == NULL) return FALSE; @@ -1365,15 +1394,20 @@ BOOL AppendMenu(HMENU hMenu, WORD wFlags, WORD wItemID, LPSTR lpNewItem) lpitem2->item_flags = wFlags; lpitem2->item_id = wItemID; if (!(wFlags & (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | - MF_MENUBREAK | MF_SEPARATOR))) { - lpitem2->item_text = GlobalQuickAlloc(strlen(lpNewItem) + 1); - strcpy(lpitem2->item_text, lpNewItem); + MF_MENUBREAK | MF_SEPARATOR))) { +/* lpitem2->item_text = GlobalQuickAlloc(strlen(lpNewItem) + 1); */ + lpitem2->item_text = GlobalLock(GlobalAlloc(GMEM_MOVEABLE, strlen(lpNewItem) + 1)); + if (lpitem2->item_text != NULL) + strcpy(lpitem2->item_text, lpNewItem); + else { + printf("AppendMenu // Bad Alloc !\n"); + return FALSE; + } lpitem2->sel_key = GetSelectionKey(lpitem2->item_text); } else { - lpitem2->item_text = lpNewItem; - } - + lpitem2->item_text = lpNewItem; + } if (lpitem == NULL) menu->firstItem = lpitem2; else @@ -1411,10 +1445,10 @@ BOOL RemoveMenu(HMENU hMenu, WORD nPos, WORD wFlags) lpitem->prev->next = lpitem->next; lpitem->next->prev = lpitem->prev; if (!(lpitem->item_flags & - (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | - MF_MENUBREAK | MF_SEPARATOR))) { - GlobalFree(lpitem->item_text); - } + (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | + MF_MENUBREAK | MF_SEPARATOR))) { + GlobalFree((HANDLE)lpitem->item_text); + } GlobalFree(lpitem); GlobalUnlock(hMenu); return TRUE; @@ -1433,42 +1467,34 @@ BOOL RemoveMenu(HMENU hMenu, WORD nPos, WORD wFlags) */ BOOL DeleteMenu(HMENU hMenu, WORD nPos, WORD wFlags) { - LPPOPUPMENU menu; - LPMENUITEM lpitem; - int i; + LPPOPUPMENU menu; + LPMENUITEM lpitem; + int i; #ifdef DEBUG_MENU - printf("DeleteMenu (%04X, %04X, %04X) !\n", hMenu, nPos, wFlags); + printf("DeleteMenu (%04X, %04X, %04X) !\n", hMenu, nPos, wFlags); #endif - menu = (LPPOPUPMENU) GlobalLock(hMenu); - if (menu == NULL) - { + menu = (LPPOPUPMENU) GlobalLock(hMenu); + if (menu == NULL) { + GlobalUnlock(hMenu); + return FALSE; + } + lpitem = FindMenuItem(hMenu, nPos, wFlags); + if (lpitem != NULL) { + if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) + DestroyMenu((HMENU)lpitem->item_id); + if (!(lpitem->item_flags & + (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | + MF_MENUBREAK | MF_SEPARATOR))) { + GlobalFree((HANDLE)lpitem->item_text); + } + if (lpitem->prev) lpitem->prev->next = lpitem->next; + if (lpitem->next) lpitem->next->prev = lpitem->prev; + GlobalFree(lpitem); + GlobalUnlock(hMenu); + return TRUE; + } GlobalUnlock(hMenu); return FALSE; - } - - lpitem = FindMenuItem(hMenu, nPos, wFlags); - if (lpitem != NULL) - { - if ((lpitem->item_flags & MF_POPUP) == MF_POPUP) - DestroyMenu((HMENU)lpitem->item_id); - - if (!(lpitem->item_flags & - (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | - MF_MENUBREAK | MF_SEPARATOR))) - { - GlobalFree(lpitem->item_text); - } - if (lpitem->prev) - lpitem->prev->next = lpitem->next; - if (lpitem->next) - lpitem->next->prev = lpitem->prev; - GlobalFree(lpitem); - GlobalUnlock(hMenu); - return TRUE; - } - - GlobalUnlock(hMenu); - return FALSE; } @@ -1477,37 +1503,42 @@ BOOL DeleteMenu(HMENU hMenu, WORD nPos, WORD wFlags) */ BOOL ModifyMenu(HMENU hMenu, WORD nPos, WORD wFlags, WORD wItemID, LPSTR lpNewItem) { - WND *wndPtr; - LPPOPUPMENU menu; - LPMENUITEM lpitem; - int i; + WND *wndPtr; + LPPOPUPMENU menu; + LPMENUITEM lpitem; + int i; #ifdef DEBUG_MENU - printf("ModifyMenu (%04X, %04X, %04X, %04X, %08X) !\n", - hMenu, nPos, wFlags, wItemID, lpNewItem); + printf("ModifyMenu (%04X, %04X, %04X, %04X, %08X) !\n", + hMenu, nPos, wFlags, wItemID, lpNewItem); #endif - menu = (LPPOPUPMENU) GlobalLock(hMenu); - if (menu == NULL) return FALSE; - lpitem = menu->firstItem; - for (i = 0; i < menu->nItems; i++) { - if (lpitem == NULL) break; - if (i == nPos) { - lpitem->item_flags = wFlags; - lpitem->item_id = wItemID; - if (!(lpitem->item_flags & - (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | - MF_MENUBREAK | MF_SEPARATOR))) { - lpitem->item_text = GlobalReAlloc(lpitem->item_text, - strlen(lpNewItem) + 1, - GLOBAL_FLAGS_MOVEABLE); - strcpy(lpitem->item_text, lpNewItem); - } - else - lpitem->item_text = lpNewItem; - GlobalUnlock(hMenu); - return(TRUE); - } - lpitem = (LPMENUITEM)lpitem->next; - } + menu = (LPPOPUPMENU) GlobalLock(hMenu); + if (menu == NULL) return FALSE; + lpitem = menu->firstItem; + for (i = 0; i < menu->nItems; i++) { + if (lpitem == NULL) break; + if (i == nPos) { + lpitem->item_flags = wFlags; + lpitem->item_id = wItemID; + if (!(lpitem->item_flags & + (MF_BITMAP | MF_OWNERDRAW | MF_MENUBARBREAK | + MF_MENUBREAK | MF_SEPARATOR))) { + GlobalFree((HANDLE)lpitem->item_text); +/* lpitem->item_text = GlobalQuickAlloc(strlen(lpNewItem) + 1); */ + lpitem->item_text = GlobalLock(GlobalAlloc(GMEM_MOVEABLE, strlen(lpNewItem) + 1)); + printf("ModifyMenu %08X %08X '%s') !\n", + lpitem->item_text, lpNewItem, lpNewItem); + if (lpitem->item_text != NULL) + strcpy(lpitem->item_text, lpNewItem); + else + printf("ModifyMenu // Bad Alloc !\n"); + } + else + lpitem->item_text = lpNewItem; + GlobalUnlock(hMenu); + return(TRUE); + } + lpitem = (LPMENUITEM)lpitem->next; + } GlobalUnlock(hMenu); return FALSE; } @@ -1561,13 +1592,25 @@ BOOL TrackPopupMenu(HMENU hMenu, WORD wFlags, short x, short y, hMenu, wFlags, x, y, nReserved, hWnd, lpRect); #endif lppop = (LPPOPUPMENU) GlobalLock(hMenu); - if (lppop == NULL) return FALSE; + if (lppop == NULL) { + printf("TrackPopupMenu // Bad menu handle %04X !\n", hMenu); + return FALSE; + } wndPtr = WIN_FindWndPtr(hWnd); + if (wndPtr == NULL) { + printf("TrackPopupMenu // Bad window handle %04X !\n", hWnd); + return FALSE; + } lppop->ownerWnd = hWnd; + lppop->hWndPrev = GetFocus(); if (lppop->hWnd == (HWND)NULL) { lppop->hWnd = CreateWindow("POPUPMENU", "", WS_POPUP | WS_VISIBLE, x, y, lppop->Width, lppop->Height, (HWND)NULL, 0, wndPtr->hInstance, (LPSTR)lppop); + if (lppop->hWnd == 0) { + printf("TrackPopupMenu // Can't create PopupMenu window !\n"); + return FALSE; + } } else { ShowWindow(lppop->hWnd, SW_SHOW); @@ -1581,12 +1624,12 @@ BOOL TrackPopupMenu(HMENU hMenu, WORD wFlags, short x, short y, SetWindowPos(lppop->hWnd, 0, x, y, lppop->Width + 2, lppop->Height, SWP_NOZORDER); } + SetFocus(lppop->hWnd); if (!MenuHasFocus) { #ifdef DEBUG_MENU printf("TrackPopupMenu // before MenuFocusLoop !\n"); #endif MenuFocusLoop(hWnd, NULL); -/* ActivateMenuFocus(hWnd); */ #ifdef DEBUG_MENU printf("TrackPopupMenu // after MenuFocusLoop !\n"); #endif @@ -1596,23 +1639,32 @@ BOOL TrackPopupMenu(HMENU hMenu, WORD wFlags, short x, short y, } -BOOL ActivateMenuFocus(HWND hWnd) +BOOL ActivateMenuBarFocus(HWND hWnd) { WND *wndPtr; LPPOPUPMENU lpmenu; BOOL bRet; MSG msg; if (MenuHasFocus) return FALSE; - wndPtr = WIN_FindWndPtr(hWnd); + wndPtr = WIN_FindWndPtr(hWnd); if (wndPtr == NULL) return FALSE; #ifdef DEBUG_MENU - printf("ActivateMenuFocus (%04X) !\n", hWnd); + printf("ActivateMenuBarFocus (%04X) !\n", hWnd); #endif + while((wndPtr->dwStyle & WS_CHILD) == WS_CHILD) { + hWnd = GetParent(hWnd); + printf("ActivateMenuBarFocus // next Parent=%04X !\n", hWnd); + wndPtr = WIN_FindWndPtr(hWnd); + if (wndPtr == NULL) return FALSE; + } if ((wndPtr->dwStyle & WS_CHILD) == 0 && wndPtr->wIDmenu != 0) { lpmenu = (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu); + if (lpmenu == NULL) return FALSE; + lpmenu->hWndPrev = GetFocus(); + SetFocus(hWnd); MenuItemSelect(hWnd, lpmenu, 0); bRet = MenuFocusLoop(hWnd, lpmenu); - if (lpmenu != NULL) GlobalUnlock(wndPtr->wIDmenu); + GlobalUnlock(wndPtr->wIDmenu); return bRet; } return FALSE; @@ -1688,7 +1740,6 @@ void NC_TrackSysMenu(HWND hWnd) lpsys->hWndParent = hWnd; if (!IsWindowVisible(lpsys->hWnd)) { GetWindowRect(hWnd, &rect); - lpsys->hWndPrev = GetFocus(); #ifdef DEBUG_MENU printf("NC_TrackSysMenu lpsys->hWnd=%04X !\n", lpsys->hWnd); #endif @@ -1707,7 +1758,6 @@ void NC_TrackSysMenu(HWND hWnd) printf("NC_TrackSysMenu // before MenuFocusLoop !\n"); #endif MenuFocusLoop(hWnd, NULL); -/* ActivateMenuFocus(hWnd); */ #ifdef DEBUG_MENU printf("NC_TrackSysMenu // after MenuFocusLoop !\n"); #endif @@ -1890,18 +1940,23 @@ HMENU GetMenu(HWND hWnd) */ BOOL SetMenu(HWND hWnd, HMENU hMenu) { - LPPOPUPMENU lppop; + LPPOPUPMENU lpmenu; WND * wndPtr = WIN_FindWndPtr(hWnd); - if (wndPtr == NULL) return FALSE; + if (wndPtr == NULL) { + printf("SetMenu(%04X, %04X) // Bad window handle !\n", hWnd, hMenu); + return FALSE; + } #ifdef DEBUG_MENU printf("SetMenu(%04X, %04X);\n", hWnd, hMenu); #endif wndPtr->wIDmenu = hMenu; - if (hMenu == 0) return TRUE; - lppop = (LPPOPUPMENU) GlobalLock(hMenu); - if (lppop == NULL) return FALSE; - lppop->ownerWnd = hWnd; - ResetHiliteFlags(lppop); + lpmenu = (LPPOPUPMENU) GlobalLock(hMenu); + if (lpmenu == NULL) { + printf("SetMenu(%04X, %04X) // Bad menu handle !\n", hWnd, hMenu); + return FALSE; + } + lpmenu->ownerWnd = hWnd; + ResetHiliteFlags(lpmenu); GlobalUnlock(hMenu); return TRUE; } @@ -1961,7 +2016,7 @@ void DrawMenuBar(HWND hWnd) if (lppop == NULL) return; if ((lppop->rect.bottom - lppop->rect.top) != 0) { hDC = GetWindowDC(hWnd); - StdDrawMenuBar(hDC, &lppop->rect, lppop); + StdDrawMenuBar(hDC, &lppop->rect, lppop, FALSE); ReleaseDC(hWnd, hDC); } else diff --git a/controls/widgets.c b/controls/widgets.c index c56daba5363..356c60627e4 100644 --- a/controls/widgets.c +++ b/controls/widgets.c @@ -16,6 +16,7 @@ LONG StaticWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ); LONG ScrollBarWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ); LONG ListBoxWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam ); LONG ComboBoxWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam ); +LONG EditWndProc( HWND hwnd, WORD message, WORD wParam, LONG lParam ); LONG PopupMenuWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam ); LONG DesktopWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam ); LONG MDIClientWndProc ( HWND hwnd, WORD message, WORD wParam, LONG lParam ); @@ -33,6 +34,8 @@ static WNDCLASS WIDGETS_BuiltinClasses[] = 0, 0, 0, 0, NULL, "LISTBOX" }, { CS_GLOBALCLASS, (LONG(*)())ComboBoxWndProc, 0, 8, 0, 0, 0, 0, NULL, "COMBOBOX" }, + { CS_GLOBALCLASS, (LONG(*)())EditWndProc, 0, 2, + 0, 0, 0, 0, NULL, "EDIT" }, { CS_GLOBALCLASS, (LONG(*)())PopupMenuWndProc, 0, 8, 0, 0, 0, 0, NULL, "POPUPMENU" }, { CS_GLOBALCLASS, (LONG(*)())DesktopWndProc, 0, sizeof(DESKTOPINFO), diff --git a/debugger/bfd.h b/debugger/bfd.h deleted file mode 100644 index 430b0abc4bd..00000000000 --- a/debugger/bfd.h +++ /dev/null @@ -1,1421 +0,0 @@ -/* A -*- C -*- header file for the bfd library - Copyright 1990, 1991, 1992 Free Software Foundation, Inc. - Contributed by Cygnus Support. - -This file is part of BFD, the Binary File Descriptor library. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* bfd.h -- The only header file required by users of the bfd library - -This file is generated from various .c files, if you change it, your -bits may be lost. - -All the prototypes and definitions following the comment "THE FOLLOWING -IS EXTRACTED FROM THE SOURCE" are extracted from the source files for -BFD. If you change it, someone oneday will extract it from the source -again, and your changes will be lost. To save yourself from this bind, -change the definitions in the source in the bfd directory. Type "make -docs" and then "make headers" in that directory, and magically this file -will change to reflect your changes. - -If you don't have the tools to perform the extraction, then you are -safe from someone on your system trampling over your header files. -You should still maintain the equivalence between the source and this -file though; every change you make to the .c file should be reflected -here. */ - -#ifndef __BFD_H_SEEN__ -#define __BFD_H_SEEN__ - -#include "ansidecl.h" -#include "obstack.h" - -/* Make it easier to declare prototypes (puts conditional here) */ -#ifndef PROTO -# if __STDC__ -# define PROTO(type, name, arglist) type name arglist -# else -# define PROTO(type, name, arglist) type name () -# endif -#endif - -#define BFD_VERSION "2.0" - -/* forward declaration */ -typedef struct _bfd bfd; - -/* General rules: functions which are boolean return true on success - and false on failure (unless they're a predicate). -- bfd.doc */ -/* I'm sure this is going to break something and someone is going to - force me to change it. */ -/* typedef enum boolean {false, true} boolean; */ -/* Yup, SVR4 has a "typedef enum boolean" in -fnf */ -typedef enum bfd_boolean {false, true} boolean; - -/* A pointer to a position in a file. */ -/* FIXME: This should be using off_t from . - For now, try to avoid breaking stuff by not including here. - This will break on systems with 64-bit file offsets (e.g. 4.4BSD). - Probably the best long-term answer is to avoid using file_ptr AND off_t - in this header file, and to handle this in the BFD implementation - rather than in its interface. */ -/* typedef off_t file_ptr; */ -typedef long int file_ptr; - -/* Support for different sizes of target format ints and addresses */ - -#ifdef HOST_64_BIT -typedef HOST_64_BIT rawdata_offset; -typedef HOST_64_BIT bfd_vma; -typedef HOST_64_BIT bfd_word; -typedef HOST_64_BIT bfd_offset; -typedef HOST_64_BIT bfd_size_type; -typedef HOST_64_BIT symvalue; -typedef HOST_64_BIT bfd_64_type; -#define fprintf_vma(s,x) \ - fprintf(s,"%08x%08x", uint64_typeHIGH(x), uint64_typeLOW(x)) -#else -typedef struct {int a,b;} bfd_64_type; -typedef unsigned long rawdata_offset; -typedef unsigned long bfd_vma; -typedef unsigned long bfd_offset; -typedef unsigned long bfd_word; -typedef unsigned long bfd_size; -typedef unsigned long symvalue; -typedef unsigned long bfd_size_type; -#define fprintf_vma(s,x) fprintf(s, "%08lx", x) -#endif -#define printf_vma(x) fprintf_vma(stdout,x) - -typedef unsigned int flagword; /* 32 bits of flags */ - -/** File formats */ - -typedef enum bfd_format { - bfd_unknown = 0, /* file format is unknown */ - bfd_object, /* linker/assember/compiler output */ - bfd_archive, /* object archive file */ - bfd_core, /* core dump */ - bfd_type_end} /* marks the end; don't use it! */ - bfd_format; - -/* Object file flag values */ -#define NO_FLAGS 0x00 -#define HAS_RELOC 0x01 -#define EXEC_P 0x02 -#define HAS_LINENO 0x04 -#define HAS_DEBUG 0x08 -#define HAS_SYMS 0x10 -#define HAS_LOCALS 0x20 -#define DYNAMIC 0x40 -#define WP_TEXT 0x80 -#define D_PAGED 0x100 -#define BFD_IS_RELAXABLE 0x200 - -/* symbols and relocation */ - -typedef unsigned long symindex; - -#define BFD_NO_MORE_SYMBOLS ((symindex) ~0) - -typedef enum bfd_symclass { - bfd_symclass_unknown = 0, - bfd_symclass_fcommon, /* fortran common symbols */ - bfd_symclass_global, /* global symbol, what a surprise */ - bfd_symclass_debugger, /* some debugger symbol */ - bfd_symclass_undefined /* none known */ - } symclass; - - -typedef int symtype; /* Who knows, yet? */ - - -/* general purpose part of a symbol; - target specific parts will be found in libcoff.h, liba.out.h etc */ - - -#define bfd_get_section(x) ((x)->section) -#define bfd_get_output_section(x) ((x)->section->output_section) -#define bfd_set_section(x,y) ((x)->section) = (y) -#define bfd_asymbol_base(x) ((x)->section?((x)->section->vma):0) -#define bfd_asymbol_value(x) (bfd_asymbol_base(x) + x->value) -#define bfd_asymbol_name(x) ((x)->name) - -/* This is a type pun with struct ranlib on purpose! */ -typedef struct carsym { - char *name; - file_ptr file_offset; /* look here to find the file */ -} carsym; /* to make these you call a carsymogen */ - - -/* Used in generating armaps. Perhaps just a forward definition would do? */ -struct orl { /* output ranlib */ - char **name; /* symbol name */ - file_ptr pos; /* bfd* or file position */ - int namidx; /* index into string table */ -}; - - - -/* Linenumber stuff */ -typedef struct lineno_cache_entry { - unsigned int line_number; /* Linenumber from start of function*/ - union { - struct symbol_cache_entry *sym; /* Function name */ - unsigned long offset; /* Offset into section */ - } u; -} alent; - -/* object and core file sections */ - - -#define align_power(addr, align) \ - ( ((addr) + ((1<<(align))-1)) & (-1 << (align))) - -typedef struct sec *sec_ptr; - -#define bfd_get_section_name(bfd, ptr) ((ptr)->name + 0) -#define bfd_get_section_vma(bfd, ptr) ((ptr)->vma + 0) -#define bfd_get_section_alignment(bfd, ptr) ((ptr)->alignment_power + 0) -#define bfd_section_name(bfd, ptr) ((ptr)->name) -#define bfd_section_size(bfd, ptr) (bfd_get_section_size_before_reloc(ptr)) -#define bfd_section_vma(bfd, ptr) ((ptr)->vma) -#define bfd_section_alignment(bfd, ptr) ((ptr)->alignment_power) -#define bfd_get_section_flags(bfd, ptr) ((ptr)->flags + 0) -#define bfd_get_section_userdata(bfd, ptr) ((ptr)->userdata) - -#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (val)), ((ptr)->user_set_vma = true), true) -#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),true) -#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),true) - -typedef struct stat stat_type; - -/** Error handling */ - -typedef enum bfd_error { - no_error = 0, system_call_error, invalid_target, - wrong_format, invalid_operation, no_memory, - no_symbols, no_relocation_info, - no_more_archived_files, malformed_archive, - symbol_not_found, file_not_recognized, - file_ambiguously_recognized, no_contents, - bfd_error_nonrepresentable_section, - no_debug_section, bad_value, - invalid_error_code} bfd_ec; - -extern bfd_ec bfd_error; -struct reloc_cache_entry; -struct bfd_seclet_struct ; - - -typedef struct bfd_error_vector { - PROTO(void,(* nonrepresentable_section ),(CONST bfd *CONST abfd, - CONST char *CONST name)); - PROTO(void,(* undefined_symbol),(CONST struct reloc_cache_entry *rel, - CONST struct bfd_seclet_struct *sec - )); - PROTO(void, (* reloc_value_truncated),(CONST struct - reloc_cache_entry *rel, - struct bfd_seclet_struct *sec)); - - PROTO(void, (* reloc_dangerous),(CONST struct reloc_cache_entry *rel, - CONST struct bfd_seclet_struct *sec)); - -} bfd_error_vector_type; - -PROTO (CONST char *, bfd_errmsg, (bfd_ec error_tag)); -PROTO (void, bfd_perror, (CONST char *message)); - - -typedef enum bfd_print_symbol -{ - bfd_print_symbol_name, - bfd_print_symbol_more, - bfd_print_symbol_all, - bfd_print_symbol_nm /* Pretty format suitable for nm program. */ -} bfd_print_symbol_type; - - - -/* The code that implements targets can initialize a jump table with this - macro. It must name all its routines the same way (a prefix plus - the standard routine suffix), or it must #define the routines that - are not so named, before calling JUMP_TABLE in the initializer. */ - -/* Semi-portable string concatenation in cpp */ -#ifndef CAT -#ifdef __STDC__ -#define CAT(a,b) a##b -#else -#define CAT(a,b) a/**/b -#endif -#endif - -#define JUMP_TABLE(NAME)\ -CAT(NAME,_core_file_failing_command),\ -CAT(NAME,_core_file_failing_signal),\ -CAT(NAME,_core_file_matches_executable_p),\ -CAT(NAME,_slurp_armap),\ -CAT(NAME,_slurp_extended_name_table),\ -CAT(NAME,_truncate_arname),\ -CAT(NAME,_write_armap),\ -CAT(NAME,_close_and_cleanup), \ -CAT(NAME,_set_section_contents),\ -CAT(NAME,_get_section_contents),\ -CAT(NAME,_new_section_hook),\ -CAT(NAME,_get_symtab_upper_bound),\ -CAT(NAME,_get_symtab),\ -CAT(NAME,_get_reloc_upper_bound),\ -CAT(NAME,_canonicalize_reloc),\ -CAT(NAME,_make_empty_symbol),\ -CAT(NAME,_print_symbol),\ -CAT(NAME,_get_lineno),\ -CAT(NAME,_set_arch_mach),\ -CAT(NAME,_openr_next_archived_file),\ -CAT(NAME,_find_nearest_line),\ -CAT(NAME,_generic_stat_arch_elt),\ -CAT(NAME,_sizeof_headers),\ -CAT(NAME,_bfd_debug_info_start),\ -CAT(NAME,_bfd_debug_info_end),\ -CAT(NAME,_bfd_debug_info_accumulate),\ -CAT(NAME,_bfd_get_relocated_section_contents),\ -CAT(NAME,_bfd_relax_section) - -#define COFF_SWAP_TABLE \ - coff_swap_aux_in, coff_swap_sym_in, coff_swap_lineno_in, \ - coff_swap_aux_out, coff_swap_sym_out, \ - coff_swap_lineno_out, coff_swap_reloc_out, \ - coff_swap_filehdr_out, coff_swap_aouthdr_out, \ - coff_swap_scnhdr_out - - - -/* User program access to BFD facilities */ - -extern CONST short _bfd_host_big_endian; -#define HOST_BYTE_ORDER_BIG_P (*(char *)&_bfd_host_big_endian) - -/* The bfd itself */ - -/* Cast from const char * to char * so that caller can assign to - a char * without a warning. */ -#define bfd_get_filename(abfd) ((char *) (abfd)->filename) -#define bfd_get_format(abfd) ((abfd)->format) -#define bfd_get_target(abfd) ((abfd)->xvec->name) -#define bfd_get_file_flags(abfd) ((abfd)->flags) -#define bfd_applicable_file_flags(abfd) ((abfd)->xvec->object_flags) -#define bfd_applicable_section_flags(abfd) ((abfd)->xvec->section_flags) -#define bfd_my_archive(abfd) ((abfd)->my_archive) -#define bfd_has_map(abfd) ((abfd)->has_armap) -#define bfd_header_twiddle_required(abfd) \ - ((((abfd)->xvec->header_byteorder_big_p) \ - != (boolean)HOST_BYTE_ORDER_BIG_P) ? true:false) - -#define bfd_valid_reloc_types(abfd) ((abfd)->xvec->valid_reloc_types) -#define bfd_usrdata(abfd) ((abfd)->usrdata) - -#define bfd_get_start_address(abfd) ((abfd)->start_address) -#define bfd_get_symcount(abfd) ((abfd)->symcount) -#define bfd_get_outsymbols(abfd) ((abfd)->outsymbols) -#define bfd_count_sections(abfd) ((abfd)->section_count) -#define bfd_get_architecture(abfd) ((abfd)->obj_arch) -#define bfd_get_machine(abfd) ((abfd)->obj_machine) - -#define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char) - -#define BYTE_SIZE 1 -#define SHORT_SIZE 2 -#define LONG_SIZE 4 - -/* And more from the source. */ -void EXFUN(bfd_init, (void)); -bfd *EXFUN(bfd_openr, (CONST char *filename, CONST char*target)); -bfd *EXFUN(bfd_fdopenr, (CONST char *filename, CONST char *target, int fd)); -bfd *EXFUN(bfd_openw, (CONST char *filename, CONST char *target)); -boolean EXFUN(bfd_close, (bfd *)); -boolean EXFUN(bfd_close_all_done, (bfd *)); -bfd_size_type EXFUN(bfd_alloc_size, (bfd *abfd)); -bfd *EXFUN(bfd_create, (CONST char *filename, bfd *template)); -#define bfd_put_8(abfd, val, ptr) \ - (*((char *)ptr) = (char)val) -#define bfd_get_8(abfd, ptr) \ - (*((char *)ptr)) -#define bfd_put_16(abfd, val, ptr) \ - BFD_SEND(abfd, bfd_putx16, (val,ptr)) -#define bfd_get_16(abfd, ptr) \ - BFD_SEND(abfd, bfd_getx16, (ptr)) -#define bfd_put_32(abfd, val, ptr) \ - BFD_SEND(abfd, bfd_putx32, (val,ptr)) -#define bfd_get_32(abfd, ptr) \ - BFD_SEND(abfd, bfd_getx32, (ptr)) -#define bfd_put_64(abfd, val, ptr) \ - BFD_SEND(abfd, bfd_putx64, (val, ptr)) -#define bfd_get_64(abfd, ptr) \ - BFD_SEND(abfd, bfd_getx64, (ptr)) -#define bfd_h_put_8(abfd, val, ptr) \ - (*((char *)ptr) = (char)val) -#define bfd_h_get_8(abfd, ptr) \ - (*((char *)ptr)) -#define bfd_h_put_16(abfd, val, ptr) \ - BFD_SEND(abfd, bfd_h_putx16,(val,ptr)) -#define bfd_h_get_16(abfd, ptr) \ - BFD_SEND(abfd, bfd_h_getx16,(ptr)) -#define bfd_h_put_32(abfd, val, ptr) \ - BFD_SEND(abfd, bfd_h_putx32,(val,ptr)) -#define bfd_h_get_32(abfd, ptr) \ - BFD_SEND(abfd, bfd_h_getx32,(ptr)) -#define bfd_h_put_64(abfd, val, ptr) \ - BFD_SEND(abfd, bfd_h_putx64,(val, ptr)) -#define bfd_h_get_64(abfd, ptr) \ - BFD_SEND(abfd, bfd_h_getx64,(ptr)) -typedef struct sec -{ - /* The name of the section, the name isn't a copy, the pointer is - the same as that passed to bfd_make_section. */ - - CONST char *name; - - - /* Which section is it 0.nth */ - - int index; - - /* The next section in the list belonging to the BFD, or NULL. */ - - struct sec *next; - - /* The field flags contains attributes of the section. Some of - flags are read in from the object file, and some are - synthesized from other information. */ - - flagword flags; - -#define SEC_NO_FLAGS 0x000 - - /* Tells the OS to allocate space for this section when loaded. - This would clear for a section containing debug information - only. */ - - -#define SEC_ALLOC 0x001 - /* Tells the OS to load the section from the file when loading. - This would be clear for a .bss section */ - -#define SEC_LOAD 0x002 - /* The section contains data still to be relocated, so there will - be some relocation information too. */ - -#define SEC_RELOC 0x004 - - /* Obsolete ? */ - -#define SEC_BALIGN 0x008 - - /* A signal to the OS that the section contains read only - data. */ -#define SEC_READONLY 0x010 - - /* The section contains code only. */ - -#define SEC_CODE 0x020 - - /* The section contains data only. */ - -#define SEC_DATA 0x040 - - /* The section will reside in ROM. */ - -#define SEC_ROM 0x080 - - /* The section contains constructor information. This section - type is used by the linker to create lists of constructors and - destructors used by <>. When a back end sees a symbol - which should be used in a constructor list, it creates a new - section for the type of name (eg <<__CTOR_LIST__>>), attaches - the symbol to it and builds a relocation. To build the lists - of constructors, all the linker has to to is catenate all the - sections called <<__CTOR_LIST__>> and relocte the data - contained within - exactly the operations it would peform on - standard data. */ - -#define SEC_CONSTRUCTOR 0x100 - - /* The section is a constuctor, and should be placed at the - end of the . */ - - -#define SEC_CONSTRUCTOR_TEXT 0x1100 - -#define SEC_CONSTRUCTOR_DATA 0x2100 - -#define SEC_CONSTRUCTOR_BSS 0x3100 - - - /* The section has contents - a bss section could be - <> | <>, a debug section could be - <> */ - -#define SEC_HAS_CONTENTS 0x200 - - /* An instruction to the linker not to output sections - containing this flag even if they have information which - would normally be written. */ - -#define SEC_NEVER_LOAD 0x400 - - - - bfd_vma vma; - boolean user_set_vma; - - /* The size of the section in bytes, as it will be output. - contains a value even if the section has no contents (eg, the - size of <<.bss>>). This will be filled in after relocation */ - - bfd_size_type _cooked_size; - - /* The size on disk of the section in bytes originally. Normally this - value is the same as the size, but if some relaxing has - been done, then this value will be bigger. */ - - bfd_size_type _raw_size; - - /* If this section is going to be output, then this value is the - offset into the output section of the first byte in the input - section. Eg, if this was going to start at the 100th byte in - the output section, this value would be 100. */ - - bfd_vma output_offset; - - /* The output section through which to map on output. */ - - struct sec *output_section; - - /* The alignment requirement of the section, as an exponent - eg - 3 aligns to 2^3 (or 8) */ - - unsigned int alignment_power; - - /* If an input section, a pointer to a vector of relocation - records for the data in this section. */ - - struct reloc_cache_entry *relocation; - - /* If an output section, a pointer to a vector of pointers to - relocation records for the data in this section. */ - - struct reloc_cache_entry **orelocation; - - /* The number of relocation records in one of the above */ - - unsigned reloc_count; - - /* Information below is back end specific - and not always used - or updated - - File position of section data */ - - file_ptr filepos; - - /* File position of relocation info */ - - file_ptr rel_filepos; - - /* File position of line data */ - - file_ptr line_filepos; - - /* Pointer to data for applications */ - - PTR userdata; - - struct lang_output_section *otheruserdata; - - /* Attached line number information */ - - alent *lineno; - - /* Number of line number records */ - - unsigned int lineno_count; - - /* When a section is being output, this value changes as more - linenumbers are written out */ - - file_ptr moving_line_filepos; - - /* what the section number is in the target world */ - - int target_index; - - PTR used_by_bfd; - - /* If this is a constructor section then here is a list of the - relocations created to relocate items within it. */ - - struct relent_chain *constructor_chain; - - /* The BFD which owns the section. */ - - bfd *owner; - - boolean reloc_done; - /* A symbol which points at this section only */ - struct symbol_cache_entry *symbol; - struct symbol_cache_entry **symbol_ptr_ptr; - struct bfd_seclet_struct *seclets_head; - struct bfd_seclet_struct *seclets_tail; -} asection ; - - -#define BFD_ABS_SECTION_NAME "*ABS*" -#define BFD_UND_SECTION_NAME "*UND*" -#define BFD_COM_SECTION_NAME "*COM*" - - /* the absolute section */ - extern asection bfd_abs_section; - /* Pointer to the undefined section */ - extern asection bfd_und_section; - /* Pointer to the common section */ - extern asection bfd_com_section; - - extern struct symbol_cache_entry *bfd_abs_symbol; - extern struct symbol_cache_entry *bfd_com_symbol; - extern struct symbol_cache_entry *bfd_und_symbol; -#define bfd_get_section_size_before_reloc(section) \ - (section->reloc_done ? (abort(),1): (section)->_raw_size) -#define bfd_get_section_size_after_reloc(section) \ - ((section->reloc_done) ? (section)->_cooked_size: (abort(),1)) -asection *EXFUN(bfd_get_section_by_name, (bfd *abfd, CONST char *name)); -asection *EXFUN(bfd_make_section_old_way, (bfd *, CONST char *name)); -asection * EXFUN(bfd_make_section, (bfd *, CONST char *name)); -boolean EXFUN(bfd_set_section_flags, (bfd *, asection *, flagword)); -void EXFUN(bfd_map_over_sections, (bfd *abfd, - void (*func)(bfd *abfd, - asection *sect, - PTR obj), - PTR obj)); -boolean EXFUN(bfd_set_section_size, (bfd *, asection *, bfd_size_type val)); -boolean EXFUN(bfd_set_section_contents - , (bfd *abfd, - asection *section, - PTR data, - file_ptr offset, - bfd_size_type count)); -boolean EXFUN(bfd_get_section_contents - , (bfd *abfd, asection *section, PTR location, - file_ptr offset, bfd_size_type count)); -enum bfd_architecture -{ - bfd_arch_unknown, /* File arch not known */ - bfd_arch_obscure, /* Arch known, not one of these */ - bfd_arch_m68k, /* Motorola 68xxx */ - bfd_arch_vax, /* DEC Vax */ - bfd_arch_i960, /* Intel 960 */ - /* The order of the following is important. - lower number indicates a machine type that - only accepts a subset of the instructions - available to machines with higher numbers. - The exception is the "ca", which is - incompatible with all other machines except - "core". */ - -#define bfd_mach_i960_core 1 -#define bfd_mach_i960_ka_sa 2 -#define bfd_mach_i960_kb_sb 3 -#define bfd_mach_i960_mc 4 -#define bfd_mach_i960_xa 5 -#define bfd_mach_i960_ca 6 - - bfd_arch_a29k, /* AMD 29000 */ - bfd_arch_sparc, /* SPARC */ - bfd_arch_mips, /* MIPS Rxxxx */ - bfd_arch_i386, /* Intel 386 */ - bfd_arch_we32k, /* AT&T WE32xxx */ - bfd_arch_tahoe, /* CCI/Harris Tahoe */ - bfd_arch_i860, /* Intel 860 */ - bfd_arch_romp, /* IBM ROMP PC/RT */ - bfd_arch_alliant, /* Alliant */ - bfd_arch_convex, /* Convex */ - bfd_arch_m88k, /* Motorola 88xxx */ - bfd_arch_pyramid, /* Pyramid Technology */ - bfd_arch_h8300, /* Hitachi H8/300 */ - bfd_arch_rs6000, /* IBM RS/6000 */ - bfd_arch_hppa, /* HP PA RISC */ - bfd_arch_z8k, /* Zilog Z8000 */ -#define bfd_mach_z8001 1 -#define bfd_mach_z8002 2 - bfd_arch_last - }; - -typedef struct bfd_arch_info -{ - int bits_per_word; - int bits_per_address; - int bits_per_byte; - enum bfd_architecture arch; - long mach; - char *arch_name; - CONST char *printable_name; - unsigned int section_align_power; - /* true if this is the default machine for the architecture */ - boolean the_default; - CONST struct bfd_arch_info * EXFUN((*compatible), - (CONST struct bfd_arch_info *a, - CONST struct bfd_arch_info *b)); - - boolean EXFUN((*scan),(CONST struct bfd_arch_info *,CONST char *)); - unsigned int EXFUN((*disassemble),(bfd_vma addr, CONST char *data, - PTR stream)); - - struct bfd_arch_info *next; -} bfd_arch_info_type; -CONST char *EXFUN(bfd_printable_name, (bfd *abfd)); -bfd_arch_info_type *EXFUN(bfd_scan_arch, (CONST char *)); -CONST bfd_arch_info_type *EXFUN(bfd_arch_get_compatible, ( - CONST bfd *abfd, - CONST bfd *bbfd)); -void EXFUN(bfd_set_arch_info, (bfd *, bfd_arch_info_type *)); -enum bfd_architecture EXFUN(bfd_get_arch, (bfd *abfd)); -unsigned long EXFUN(bfd_get_mach, (bfd *abfd)); -unsigned int EXFUN(bfd_arch_bits_per_byte, (bfd *abfd)); -unsigned int EXFUN(bfd_arch_bits_per_address, (bfd *abfd)); -bfd_arch_info_type * EXFUN(bfd_get_arch_info, (bfd *)); -bfd_arch_info_type *EXFUN(bfd_lookup_arch - , (enum bfd_architecture - arch, - long machine)); -CONST char * EXFUN(bfd_printable_arch_mach - , (enum bfd_architecture arch, unsigned long machine)); -typedef enum bfd_reloc_status -{ - /* No errors detected */ - bfd_reloc_ok, - - /* The relocation was performed, but there was an overflow. */ - bfd_reloc_overflow, - - /* The address to relocate was not within the section supplied*/ - bfd_reloc_outofrange, - - /* Used by special functions */ - bfd_reloc_continue, - - /* Unused */ - bfd_reloc_notsupported, - - /* Unsupported relocation size requested. */ - bfd_reloc_other, - - /* The symbol to relocate against was undefined.*/ - bfd_reloc_undefined, - - /* The relocation was performed, but may not be ok - presently - generated only when linking i960 coff files with i960 b.out - symbols. */ - bfd_reloc_dangerous - } - bfd_reloc_status_type; - - -typedef struct reloc_cache_entry -{ - /* A pointer into the canonical table of pointers */ - struct symbol_cache_entry **sym_ptr_ptr; - - /* offset in section */ - rawdata_offset address; - - /* addend for relocation value */ - bfd_vma addend; - - /* Pointer to how to perform the required relocation */ - CONST struct reloc_howto_struct *howto; - -} arelent; - -typedef CONST struct reloc_howto_struct -{ - /* The type field has mainly a documetary use - the back end can - to what it wants with it, though the normally the back end's - external idea of what a reloc number would be would be stored - in this field. For example, the a PC relative word relocation - in a coff environment would have the type 023 - because that's - what the outside world calls a R_PCRWORD reloc. */ - unsigned int type; - - /* The value the final relocation is shifted right by. This drops - unwanted data from the relocation. */ - unsigned int rightshift; - - /* The size of the item to be relocated - 0, is one byte, 1 is 2 - bytes, 3 is four bytes. A -ve value indicates that the - result is to be subtracted from the data*/ - int size; - - /* Now obsolete */ - unsigned int bitsize; - - /* Notes that the relocation is relative to the location in the - data section of the addend. The relocation function will - subtract from the relocation value the address of the location - being relocated. */ - boolean pc_relative; - - /* Now obsolete */ - unsigned int bitpos; - - /* Now obsolete */ - boolean absolute; - - /* Causes the relocation routine to return an error if overflow - is detected when relocating. */ - boolean complain_on_overflow; - - /* If this field is non null, then the supplied function is - called rather than the normal function. This allows really - strange relocation methods to be accomodated (eg, i960 callj - instructions). */ - bfd_reloc_status_type EXFUN ((*special_function), - (bfd *abfd, - arelent *reloc_entry, - struct symbol_cache_entry *symbol, - PTR data, - asection *input_section, - bfd *output_bfd )); - - /* The textual name of the relocation type. */ - char *name; - - /* When performing a partial link, some formats must modify the - relocations rather than the data - this flag signals this.*/ - boolean partial_inplace; - - /* The src_mask is used to select what parts of the read in data - are to be used in the relocation sum. Eg, if this was an 8 bit - bit of data which we read and relocated, this would be - 0x000000ff. When we have relocs which have an addend, such as - sun4 extended relocs, the value in the offset part of a - relocating field is garbage so we never use it. In this case - the mask would be 0x00000000. */ - bfd_word src_mask; - - /* The dst_mask is what parts of the instruction are replaced - into the instruction. In most cases src_mask == dst_mask, - except in the above special case, where dst_mask would be - 0x000000ff, and src_mask would be 0x00000000. */ - bfd_word dst_mask; - - /* When some formats create PC relative instructions, they leave - the value of the pc of the place being relocated in the offset - slot of the instruction, so that a PC relative relocation can - be made just by adding in an ordinary offset (eg sun3 a.out). - Some formats leave the displacement part of an instruction - empty (eg m88k bcs), this flag signals the fact.*/ - boolean pcrel_offset; - -} reloc_howto_type; -#define HOWTO(C, R,S,B, P, BI, ABS, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \ - {(unsigned)C,R,S,B, P, BI, ABS,O,SF,NAME,INPLACE,MASKSRC,MASKDST,PC} -#define NEWHOWTO( FUNCTION, NAME,SIZE,REL,IN) HOWTO(0,0,SIZE,0,REL,0,false,false,FUNCTION, NAME,false,0,0,IN) - -#define HOWTO_PREPARE(relocation, symbol) \ - { \ - if (symbol != (asymbol *)NULL) { \ - if (symbol->section == &bfd_com_section) { \ - relocation = 0; \ - } \ - else { \ - relocation = symbol->value; \ - } \ - } \ -} -typedef unsigned char bfd_byte; - -typedef struct relent_chain { - arelent relent; - struct relent_chain *next; -} arelent_chain; -bfd_reloc_status_type -EXFUN(bfd_perform_relocation - , (bfd * abfd, - arelent *reloc_entry, - PTR data, - asection *input_section, - bfd *output_bfd)); -typedef enum bfd_reloc_code_real - -{ - /* 16 bits wide, simple reloc */ - BFD_RELOC_16, - - /* 8 bits wide, but used to form an address like 0xffnn */ - BFD_RELOC_8_FFnn, - - /* 8 bits wide, simple */ - BFD_RELOC_8, - - /* 8 bits wide, pc relative */ - BFD_RELOC_8_PCREL, - - /* The type of reloc used to build a contructor table - at the - moment probably a 32 bit wide abs address, but the cpu can - choose. */ - - BFD_RELOC_CTOR, - - /* 32 bits wide, simple reloc */ - BFD_RELOC_32, - /* 32 bits, PC-relative */ - BFD_RELOC_32_PCREL, - - /* High 22 bits of 32-bit value; simple reloc. */ - BFD_RELOC_HI22, - /* Low 10 bits. */ - BFD_RELOC_LO10, - - /* Reloc types used for i960/b.out. */ - BFD_RELOC_24_PCREL, - BFD_RELOC_I960_CALLJ, - - BFD_RELOC_16_PCREL, - /* 32-bit pc-relative, shifted right 2 bits (i.e., 30-bit - word displacement, e.g. for SPARC) */ - BFD_RELOC_32_PCREL_S2, - - /* now for the sparc/elf codes */ - BFD_RELOC_NONE, /* actually used */ - BFD_RELOC_SPARC_WDISP22, - BFD_RELOC_SPARC22, - BFD_RELOC_SPARC13, - BFD_RELOC_SPARC_BASE13, - BFD_RELOC_SPARC_GOT10, - BFD_RELOC_SPARC_GOT13, - BFD_RELOC_SPARC_GOT22, - BFD_RELOC_SPARC_PC10, - BFD_RELOC_SPARC_PC22, - BFD_RELOC_SPARC_WPLT30, - BFD_RELOC_SPARC_COPY, - BFD_RELOC_SPARC_GLOB_DAT, - BFD_RELOC_SPARC_JMP_SLOT, - BFD_RELOC_SPARC_RELATIVE, - BFD_RELOC_SPARC_UA32, - - /* this one is a.out specific? */ - BFD_RELOC_SPARC_BASE22, - - /* this must be the highest numeric value */ - BFD_RELOC_UNUSED - } bfd_reloc_code_real_type; -CONST struct reloc_howto_struct * -EXFUN(bfd_reloc_type_lookup , (bfd *abfd, bfd_reloc_code_real_type code)); -typedef struct symbol_cache_entry -{ - /* A pointer to the BFD which owns the symbol. This information - is necessary so that a back end can work out what additional - (invisible to the application writer) information is carried - with the symbol. */ - - struct _bfd *the_bfd; - - /* The text of the symbol. The name is left alone, and not copied - the - application may not alter it. */ - CONST char *name; - - /* The value of the symbol.*/ - symvalue value; - - /* Attributes of a symbol: */ - -#define BSF_NO_FLAGS 0x00 - - /* The symbol has local scope; <> in <>. The value - is the offset into the section of the data. */ -#define BSF_LOCAL 0x01 - - /* The symbol has global scope; initialized data in <>. The - value is the offset into the section of the data. */ -#define BSF_GLOBAL 0x02 - - /* Obsolete */ -#define BSF_IMPORT 0x04 - - /* The symbol has global scope, and is exported. The value is - the offset into the section of the data. */ -#define BSF_EXPORT 0x08 - - /* The symbol is undefined. <> in <>. The value has - no meaning. */ -#define BSF_UNDEFINED_OBS 0x10 - - /* The symbol is common, initialized to zero; default in - <>. The value is the size of the object in bytes. */ -#define BSF_FORT_COMM_OBS 0x20 - - /* A normal C symbol would be one of: - <>, <>, <> or - <> */ - - /* The symbol is a debugging record. The value has an arbitary - meaning. */ -#define BSF_DEBUGGING 0x40 - - /* Used by the linker */ -#define BSF_KEEP 0x10000 -#define BSF_KEEP_G 0x80000 - - /* Unused */ -#define BSF_WEAK 0x100000 -#define BSF_CTOR 0x200000 - - /* This symbol was created to point to a section, e.g. ELF's - STT_SECTION symbols. */ -#define BSF_SECTION_SYM 0x400000 - - /* The symbol used to be a common symbol, but now it is - allocated. */ -#define BSF_OLD_COMMON 0x800000 - - /* The default value for common data. */ -#define BFD_FORT_COMM_DEFAULT_VALUE 0 - - /* In some files the type of a symbol sometimes alters its - location in an output file - ie in coff a <> symbol - which is also <> symbol appears where it was - declared and not at the end of a section. This bit is set - by the target BFD part to convey this information. */ - -#define BSF_NOT_AT_END 0x40000 - - /* Signal that the symbol is the label of constructor section. */ -#define BSF_CONSTRUCTOR 0x1000000 - - /* Signal that the symbol is a warning symbol. If the symbol - is a warning symbol, then the value field (I know this is - tacky) will point to the asymbol which when referenced will - cause the warning. */ -#define BSF_WARNING 0x2000000 - - /* Signal that the symbol is indirect. The value of the symbol - is a pointer to an undefined asymbol which contains the - name to use instead. */ -#define BSF_INDIRECT 0x4000000 - - /* BSF_FILE marks symbols that contain a file name. This is used - for ELF STT_FILE symbols. */ -#define BSF_FILE 0x08000000 - - flagword flags; - - /* A pointer to the section to which this symbol is - relative. This will always be non NULL, there are special - sections for undefined and absolute symbols */ - struct sec *section; - - /* Back end special data. This is being phased out in favour - of making this a union. */ - PTR udata; - -} asymbol; -#define get_symtab_upper_bound(abfd) \ - BFD_SEND (abfd, _get_symtab_upper_bound, (abfd)) -#define bfd_canonicalize_symtab(abfd, location) \ - BFD_SEND (abfd, _bfd_canonicalize_symtab,\ - (abfd, location)) -boolean EXFUN(bfd_set_symtab , (bfd *, asymbol **, unsigned int )); -void EXFUN(bfd_print_symbol_vandf, (PTR file, asymbol *symbol)); -#define bfd_make_empty_symbol(abfd) \ - BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd)) -#define bfd_make_debug_symbol(abfd,ptr,size) \ - BFD_SEND (abfd, _bfd_make_debug_symbol, (abfd, ptr, size)) -int EXFUN(bfd_decode_symclass, (asymbol *symbol)); -struct _bfd -{ - /* The filename the application opened the BFD with. */ - CONST char *filename; - - /* A pointer to the target jump table. */ - struct bfd_target *xvec; - - /* To avoid dragging too many header files into every file that - includes `<>', IOSTREAM has been declared as a "char - *", and MTIME as a "long". Their correct types, to which they - are cast when used, are "FILE *" and "time_t". The iostream - is the result of an fopen on the filename. */ - char *iostream; - - /* Is the file being cached */ - - boolean cacheable; - - /* Marks whether there was a default target specified when the - BFD was opened. This is used to select what matching algorithm - to use to chose the back end. */ - - boolean target_defaulted; - - /* The caching routines use these to maintain a - least-recently-used list of BFDs */ - - struct _bfd *lru_prev, *lru_next; - - /* When a file is closed by the caching routines, BFD retains - state information on the file here: - */ - - file_ptr where; - - /* and here:*/ - - boolean opened_once; - - /* Set if we have a locally maintained mtime value, rather than - getting it from the file each time: */ - - boolean mtime_set; - - /* File modified time, if mtime_set is true: */ - - long mtime; - - /* Reserved for an unimplemented file locking extension.*/ - - int ifd; - - /* The format which belongs to the BFD.*/ - - bfd_format format; - - /* The direction the BFD was opened with*/ - - enum bfd_direction {no_direction = 0, - read_direction = 1, - write_direction = 2, - both_direction = 3} direction; - - /* Format_specific flags*/ - - flagword flags; - - /* Currently my_archive is tested before adding origin to - anything. I believe that this can become always an add of - origin, with origin set to 0 for non archive files. */ - - file_ptr origin; - - /* Remember when output has begun, to stop strange things - happening. */ - boolean output_has_begun; - - /* Pointer to linked list of sections*/ - struct sec *sections; - - /* The number of sections */ - unsigned int section_count; - - /* Stuff only useful for object files: - The start address. */ - bfd_vma start_address; - - /* Used for input and output*/ - unsigned int symcount; - - /* Symbol table for output BFD*/ - struct symbol_cache_entry **outsymbols; - - /* Pointer to structure which contains architecture information*/ - struct bfd_arch_info *arch_info; - - /* Stuff only useful for archives:*/ - PTR arelt_data; - struct _bfd *my_archive; - struct _bfd *next; - struct _bfd *archive_head; - boolean has_armap; - - /* Used by the back end to hold private data. */ - - union - { - struct aout_data_struct *aout_data; - struct artdata *aout_ar_data; - struct _oasys_data *oasys_obj_data; - struct _oasys_ar_data *oasys_ar_data; - struct coff_tdata *coff_obj_data; - struct ieee_data_struct *ieee_data; - struct ieee_ar_data_struct *ieee_ar_data; - struct srec_data_struct *srec_data; - struct srec_data_struct *tekhex_data; - struct elf_obj_tdata *elf_obj_data; - struct bout_data_struct *bout_data; - struct sun_core_struct *sun_core_data; - struct trad_core_struct *trad_core_data; - struct hppa_data_struct *hppa_data; - PTR any; - } tdata; - - /* Used by the application to hold private data*/ - PTR usrdata; - - /* Where all the allocated stuff under this BFD goes */ - struct obstack memory; - - /* Is this really needed in addition to usrdata? */ - asymbol **ld_symbols; -}; - -unsigned int EXFUN(bfd_get_reloc_upper_bound, (bfd *abfd, asection *sect)); -unsigned int EXFUN(bfd_canonicalize_reloc - , (bfd *abfd, - asection *sec, - arelent **loc, - asymbol **syms)); -boolean EXFUN(bfd_set_file_flags, (bfd *abfd, flagword flags)); -void EXFUN(bfd_set_reloc - , (bfd *abfd, asection *sec, arelent **rel, unsigned int count) - - ); -boolean EXFUN(bfd_set_start_address, (bfd *, bfd_vma)); -long EXFUN(bfd_get_mtime, (bfd *)); -#define bfd_sizeof_headers(abfd, reloc) \ - BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, reloc)) - -#define bfd_find_nearest_line(abfd, sec, syms, off, file, func, line) \ - BFD_SEND (abfd, _bfd_find_nearest_line, (abfd, sec, syms, off, file, func, line)) - - /* Do these three do anything useful at all, for any back end? */ -#define bfd_debug_info_start(abfd) \ - BFD_SEND (abfd, _bfd_debug_info_start, (abfd)) - -#define bfd_debug_info_end(abfd) \ - BFD_SEND (abfd, _bfd_debug_info_end, (abfd)) - -#define bfd_debug_info_accumulate(abfd, section) \ - BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section)) - - -#define bfd_stat_arch_elt(abfd, stat) \ - BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat)) - -#define bfd_coff_swap_aux_in(a,e,t,c,i) \ - BFD_SEND (a, _bfd_coff_swap_aux_in, (a,e,t,c,i)) - -#define bfd_coff_swap_sym_in(a,e,i) \ - BFD_SEND (a, _bfd_coff_swap_sym_in, (a,e,i)) - -#define bfd_coff_swap_lineno_in(a,e,i) \ - BFD_SEND ( a, _bfd_coff_swap_lineno_in, (a,e,i)) - -#define bfd_set_arch_mach(abfd, arch, mach)\ - BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach)) - -#define bfd_coff_swap_reloc_out(abfd, i, o) \ - BFD_SEND (abfd, _bfd_coff_swap_reloc_out, (abfd, i, o)) - -#define bfd_coff_swap_lineno_out(abfd, i, o) \ - BFD_SEND (abfd, _bfd_coff_swap_lineno_out, (abfd, i, o)) - -#define bfd_coff_swap_aux_out(abfd, i, t,c,o) \ - BFD_SEND (abfd, _bfd_coff_swap_aux_out, (abfd, i,t,c, o)) - -#define bfd_coff_swap_sym_out(abfd, i,o) \ - BFD_SEND (abfd, _bfd_coff_swap_sym_out, (abfd, i, o)) - -#define bfd_coff_swap_scnhdr_out(abfd, i,o) \ - BFD_SEND (abfd, _bfd_coff_swap_scnhdr_out, (abfd, i, o)) - -#define bfd_coff_swap_filehdr_out(abfd, i,o) \ - BFD_SEND (abfd, _bfd_coff_swap_filehdr_out, (abfd, i, o)) - -#define bfd_coff_swap_aouthdr_out(abfd, i,o) \ - BFD_SEND (abfd, _bfd_coff_swap_aouthdr_out, (abfd, i, o)) - -#define bfd_get_relocated_section_contents(abfd, seclet, data) \ - BFD_SEND (abfd, _bfd_get_relocated_section_contents, (abfd, seclet, data)) - -#define bfd_relax_section(abfd, section, symbols) \ - BFD_SEND (abfd, _bfd_relax_section, (abfd, section, symbols)) -symindex EXFUN(bfd_get_next_mapent, (bfd *, symindex previous, carsym ** sym)); -boolean EXFUN(bfd_set_archive_head, (bfd *output, bfd *new_head)); -bfd *EXFUN(bfd_get_elt_at_index, (bfd * archive, int index)); -bfd* EXFUN(bfd_openr_next_archived_file, (bfd *archive, bfd *previous)); -CONST char *EXFUN(bfd_core_file_failing_command, (bfd *)); -int EXFUN(bfd_core_file_failing_signal, (bfd *)); -boolean EXFUN(core_file_matches_executable_p - , (bfd *core_bfd, bfd *exec_bfd)); -#define SDEF(ret, name, arglist) \ - PROTO(ret,(*name),arglist) -#define SDEF_FMT(ret, name, arglist) \ - PROTO(ret,(*name[bfd_type_end]),arglist) -#define BFD_SEND(bfd, message, arglist) \ - ((*((bfd)->xvec->message)) arglist) -#define BFD_SEND_FMT(bfd, message, arglist) \ - (((bfd)->xvec->message[(int)((bfd)->format)]) arglist) -typedef struct bfd_target -{ - char *name; - enum target_flavour { - bfd_target_unknown_flavour, - bfd_target_aout_flavour, - bfd_target_coff_flavour, - bfd_target_elf_flavour, - bfd_target_ieee_flavour, - bfd_target_oasys_flavour, - bfd_target_tekhex_flavour, - bfd_target_srec_flavour, - bfd_target_hppa_flavour} flavour; - boolean byteorder_big_p; - boolean header_byteorder_big_p; - flagword object_flags; - flagword section_flags; - char symbol_leading_char; - char ar_pad_char; - unsigned short ar_max_namelen; - unsigned int align_power_min; - SDEF (bfd_vma, bfd_getx64, (bfd_byte *)); - SDEF (void, bfd_putx64, (bfd_vma, bfd_byte *)); - SDEF (bfd_vma, bfd_getx32, (bfd_byte *)); - SDEF (void, bfd_putx32, (bfd_vma, bfd_byte *)); - SDEF (bfd_vma, bfd_getx16, (bfd_byte *)); - SDEF (void, bfd_putx16, (bfd_vma, bfd_byte *)); - SDEF (bfd_vma, bfd_h_getx64, (bfd_byte *)); - SDEF (void, bfd_h_putx64, (bfd_vma, bfd_byte *)); - SDEF (bfd_vma, bfd_h_getx32, (bfd_byte *)); - SDEF (void, bfd_h_putx32, (bfd_vma, bfd_byte *)); - SDEF (bfd_vma, bfd_h_getx16, (bfd_byte *)); - SDEF (void, bfd_h_putx16, (bfd_vma, bfd_byte *)); - SDEF_FMT (struct bfd_target *, _bfd_check_format, (bfd *)); - SDEF_FMT (boolean, _bfd_set_format, (bfd *)); - SDEF_FMT (boolean, _bfd_write_contents, (bfd *)); - SDEF (char *, _core_file_failing_command, (bfd *)); - SDEF (int, _core_file_failing_signal, (bfd *)); - SDEF (boolean, _core_file_matches_executable_p, (bfd *, bfd *)); - SDEF (boolean, _bfd_slurp_armap, (bfd *)); - SDEF (boolean, _bfd_slurp_extended_name_table, (bfd *)); - SDEF (void, _bfd_truncate_arname, (bfd *, CONST char *, char *)); - SDEF (boolean, write_armap, (bfd *arch, - unsigned int elength, - struct orl *map, - unsigned int orl_count, - int stridx)); - SDEF (boolean, _close_and_cleanup, (bfd *)); - SDEF (boolean, _bfd_set_section_contents, (bfd *, sec_ptr, PTR, - file_ptr, bfd_size_type)); - SDEF (boolean, _bfd_get_section_contents, (bfd *, sec_ptr, PTR, - file_ptr, bfd_size_type)); - SDEF (boolean, _new_section_hook, (bfd *, sec_ptr)); - SDEF (unsigned int, _get_symtab_upper_bound, (bfd *)); - SDEF (unsigned int, _bfd_canonicalize_symtab, - (bfd *, struct symbol_cache_entry **)); - SDEF (unsigned int, _get_reloc_upper_bound, (bfd *, sec_ptr)); - SDEF (unsigned int, _bfd_canonicalize_reloc, (bfd *, sec_ptr, arelent **, - struct symbol_cache_entry**)); - SDEF (struct symbol_cache_entry *, _bfd_make_empty_symbol, (bfd *)); - SDEF (void, _bfd_print_symbol, (bfd *, PTR, struct symbol_cache_entry *, - bfd_print_symbol_type)); -#define bfd_print_symbol(b,p,s,e) BFD_SEND(b, _bfd_print_symbol, (b,p,s,e)) - SDEF (alent *, _get_lineno, (bfd *, struct symbol_cache_entry *)); - - SDEF (boolean, _bfd_set_arch_mach, (bfd *, enum bfd_architecture, - unsigned long)); - - SDEF (bfd *, openr_next_archived_file, (bfd *arch, bfd *prev)); - SDEF (boolean, _bfd_find_nearest_line, - (bfd *abfd, struct sec *section, - struct symbol_cache_entry **symbols,bfd_vma offset, - CONST char **file, CONST char **func, unsigned int *line)); - SDEF (int, _bfd_stat_arch_elt, (bfd *, struct stat *)); - - SDEF (int, _bfd_sizeof_headers, (bfd *, boolean)); - - SDEF (void, _bfd_debug_info_start, (bfd *)); - SDEF (void, _bfd_debug_info_end, (bfd *)); - SDEF (void, _bfd_debug_info_accumulate, (bfd *, struct sec *)); - SDEF (bfd_byte *, _bfd_get_relocated_section_contents, (bfd*,struct bfd_seclet_struct *, bfd_byte *data)); - SDEF (boolean,_bfd_relax_section,(bfd *, struct sec *, struct symbol_cache_entry **)); - SDEF(void, _bfd_coff_swap_aux_in,( - bfd *abfd , - PTR ext, - int type, - int class , - PTR in)); - - SDEF(void, _bfd_coff_swap_sym_in,( - bfd *abfd , - PTR ext, - PTR in)); - - SDEF(void, _bfd_coff_swap_lineno_in, ( - bfd *abfd, - PTR ext, - PTR in)); - - SDEF(unsigned int, _bfd_coff_swap_aux_out,( - bfd *abfd, - PTR in, - int type, - int class, - PTR ext)); - - SDEF(unsigned int, _bfd_coff_swap_sym_out,( - bfd *abfd, - PTR in, - PTR ext)); - - SDEF(unsigned int, _bfd_coff_swap_lineno_out,( - bfd *abfd, - PTR in, - PTR ext)); - - SDEF(unsigned int, _bfd_coff_swap_reloc_out,( - bfd *abfd, - PTR src, - PTR dst)); - - SDEF(unsigned int, _bfd_coff_swap_filehdr_out,( - bfd *abfd, - PTR in, - PTR out)); - - SDEF(unsigned int, _bfd_coff_swap_aouthdr_out,( - bfd *abfd, - PTR in, - PTR out)); - - SDEF(unsigned int, _bfd_coff_swap_scnhdr_out,( - bfd *abfd, - PTR in, - PTR out)); - - /* See documentation on reloc types. */ - SDEF (CONST struct reloc_howto_struct *, - reloc_type_lookup, - (bfd *abfd, bfd_reloc_code_real_type code)); - - /* Complete and utter crock, currently used for the assembler - when creating COFF files. */ - SDEF (asymbol *, _bfd_make_debug_symbol, ( - bfd *abfd, - void *ptr, - unsigned long size)); - PTR backend_data; -} bfd_target; -bfd_target *EXFUN(bfd_find_target, (CONST char *, bfd *)); -CONST char **EXFUN(bfd_target_list, (void)); -boolean EXFUN(bfd_check_format, (bfd *abfd, bfd_format format)); -boolean EXFUN(bfd_set_format, (bfd *, bfd_format)); -CONST char *EXFUN(bfd_format_string, (bfd_format)); -#endif diff --git a/debugger/break.c b/debugger/break.c new file mode 100644 index 00000000000..4778bb7abc2 --- /dev/null +++ b/debugger/break.c @@ -0,0 +1,83 @@ + +#include + +#define N_BP 25 + +struct wine_bp{ + unsigned long addr; + char in_use; + char enabled; + unsigned char databyte; +}; + +static struct wine_bp wbp[N_BP] = {{0,},}; + +void info_break() +{ + int j; + fprintf(stderr,"Breakpoint status\n"); + for(j=0; j= N_BP || bpnum < 0) + fprintf(stderr,"Breakpoint number out of range\n"); + + wbp[bpnum].enabled = 0; +} + +void enable_break(int bpnum) +{ + if(bpnum >= N_BP || bpnum < 0) + fprintf(stderr,"Breakpoint number out of range\n"); + + wbp[bpnum].enabled = 1; +} + +void add_break(unsigned long addr) +{ + int j; + for(j=0; j - -/* First include ansidecl.h so we can use the various macro definitions - here and in all subsequent file inclusions. */ - -#include "ansidecl.h" - -/* An address in the program being debugged. Host byte order. */ -typedef unsigned int CORE_ADDR; - -#define min(a, b) ((a) < (b) ? (a) : (b)) -#define max(a, b) ((a) > (b) ? (a) : (b)) - -/* The character C++ uses to build identifiers that must be unique from - the program's identifiers (such as $this and $$vptr). */ -#define CPLUS_MARKER '$' /* May be overridden to '.' for SysV */ - -#include /* System call error return status */ - -extern int quit_flag; -extern int immediate_quit; - -extern void -quit PARAMS ((void)); - -#define QUIT { if (quit_flag) quit (); } - -/* Command classes are top-level categories into which commands are broken - down for "help" purposes. - Notes on classes: class_alias is for alias commands which are not - abbreviations of the original command. class-pseudo is for commands - which are not really commands nor help topics ("stop"). */ - -enum command_class -{ - /* Special args to help_list */ - all_classes = -2, all_commands = -1, - /* Classes of commands */ - no_class = -1, class_run = 0, class_vars, class_stack, - class_files, class_support, class_info, class_breakpoint, - class_alias, class_obscure, class_user, class_maintenance, - class_pseudo -}; - -/* the cleanup list records things that have to be undone - if an error happens (descriptors to be closed, memory to be freed, etc.) - Each link in the chain records a function to call and an - argument to give it. - - Use make_cleanup to add an element to the cleanup chain. - Use do_cleanups to do all cleanup actions back to a given - point in the chain. Use discard_cleanups to remove cleanups - from the chain back to a given point, not doing them. */ - -struct cleanup -{ - struct cleanup *next; - void (*function) PARAMS ((PTR)); - PTR arg; -}; - -/* From blockframe.c */ - -extern int -inside_entry_func PARAMS ((CORE_ADDR)); - -extern int -inside_entry_file PARAMS ((CORE_ADDR addr)); - -extern int -inside_main_func PARAMS ((CORE_ADDR pc)); - -/* From cplus-dem.c */ - -extern char * -cplus_demangle PARAMS ((const char *, int)); - -extern char * -cplus_mangle_opname PARAMS ((char *, int)); - -/* From libmmalloc.a (memory mapped malloc library) */ - -extern PTR -mmalloc_attach PARAMS ((int, PTR)); - -extern PTR -mmalloc_detach PARAMS ((PTR)); - -extern PTR -mmalloc PARAMS ((PTR, long)); - -extern PTR -mrealloc PARAMS ((PTR, PTR, long)); - -extern void -mfree PARAMS ((PTR, PTR)); - -extern int -mmalloc_setkey PARAMS ((PTR, int, PTR)); - -extern PTR -mmalloc_getkey PARAMS ((PTR, int)); - -/* From utils.c */ - -extern char * -demangle_and_match PARAMS ((const char *, const char *, int)); - -extern int -strcmp_iw PARAMS ((const char *, const char *)); - -extern char * -safe_strerror PARAMS ((int)); - -extern char * -safe_strsignal PARAMS ((int)); - -extern void -init_malloc PARAMS ((PTR)); - -extern void -request_quit PARAMS ((int)); - -extern void -do_cleanups PARAMS ((struct cleanup *)); - -extern void -discard_cleanups PARAMS ((struct cleanup *)); - -/* The bare make_cleanup function is one of those rare beasts that - takes almost any type of function as the first arg and anything that - will fit in a "void *" as the second arg. - - Should be, once all calls and called-functions are cleaned up: -extern struct cleanup * -make_cleanup PARAMS ((void (*function) (PTR), PTR)); - - Until then, lint and/or various type-checking compiler options will - complain about make_cleanup calls. It'd be wrong to just cast things, - since the type actually passed when the function is called would be - wrong. */ - -extern struct cleanup * -make_cleanup (); - -extern struct cleanup * -save_cleanups PARAMS ((void)); - -extern void -restore_cleanups PARAMS ((struct cleanup *)); - -extern void -free_current_contents PARAMS ((char **)); - -extern void -null_cleanup PARAMS ((char **)); - -extern int -myread PARAMS ((int, char *, int)); - -extern int -query (); - -extern void -wrap_here PARAMS ((char *)); - -extern void -reinitialize_more_filter PARAMS ((void)); - -extern int -print_insn PARAMS ((CORE_ADDR, CORE_ADDR, FILE *, int)); - -extern void -fputs_filtered PARAMS ((const char *, FILE *)); - -extern void -puts_filtered PARAMS ((char *)); - -extern void -vfprintf_filtered (); - -extern void -fprintf_filtered (); - -extern void -fprintfi_filtered (); - -extern void -printf_filtered (); - -extern void -printfi_filtered (); - -extern void -print_spaces PARAMS ((int, FILE *)); - -extern void -print_spaces_filtered PARAMS ((int, FILE *)); - -extern char * -n_spaces PARAMS ((int)); - -extern void -printchar PARAMS ((int, FILE *, int)); - -extern char * -strdup_demangled PARAMS ((const char *)); - -extern void -fprint_symbol PARAMS ((FILE *, char *)); - -extern void -fputs_demangled PARAMS ((char *, FILE *, int)); - -extern void -perror_with_name PARAMS ((char *)); - -extern void -print_sys_errmsg PARAMS ((char *, int)); - -/* From regex.c */ - -extern char * -re_comp PARAMS ((char *)); - -/* From symfile.c */ - -extern void -symbol_file_command PARAMS ((char *, int)); - -/* From main.c */ - -extern char * -skip_quoted PARAMS ((char *)); - -extern char * -gdb_readline PARAMS ((char *)); - -extern char * -command_line_input PARAMS ((char *, int)); - -extern void -print_prompt PARAMS ((void)); - -extern int -batch_mode PARAMS ((void)); - -extern int -input_from_terminal_p PARAMS ((void)); - -extern int -catch_errors PARAMS ((int (*) (char *), char *, char *)); - -/* From printcmd.c */ - -extern void -set_next_address PARAMS ((CORE_ADDR)); - -extern void -print_address_symbolic PARAMS ((CORE_ADDR, FILE *, int, char *)); - -extern void -print_address PARAMS ((CORE_ADDR, FILE *)); - -/* From source.c */ - -extern int -openp PARAMS ((char *, int, char *, int, int, char **)); - -extern void -mod_path PARAMS ((char *, char **)); - -extern void -directory_command PARAMS ((char *, int)); - -extern void -init_source_path PARAMS ((void)); - -/* From findvar.c */ - -extern int -read_relative_register_raw_bytes PARAMS ((int, char *)); - -/* From readline (but not in any readline .h files). */ - -extern char * -tilde_expand PARAMS ((char *)); - -/* Structure for saved commands lines - (for breakpoints, defined commands, etc). */ - -struct command_line -{ - struct command_line *next; - char *line; -}; - -extern struct command_line * -read_command_lines PARAMS ((void)); - -extern void -free_command_lines PARAMS ((struct command_line **)); - -/* String containing the current directory (what getwd would return). */ - -extern char *current_directory; - -/* Default radixes for input and output. Only some values supported. */ -extern unsigned input_radix; -extern unsigned output_radix; - -/* Baud rate specified for communication with serial target systems. */ -extern char *baud_rate; - -/* Languages represented in the symbol table and elsewhere. */ - -enum language -{ - language_unknown, /* Language not known */ - language_auto, /* Placeholder for automatic setting */ - language_c, /* C */ - language_cplus, /* C++ */ - language_m2 /* Modula-2 */ -}; - -/* Return a format string for printf that will print a number in the local - (language-specific) hexadecimal format. Result is static and is - overwritten by the next call. local_hex_format_custom takes printf - options like "08" or "l" (to produce e.g. %08x or %lx). */ - -#define local_hex_format() (current_language->la_hex_format) - -extern char * -local_hex_format_custom PARAMS ((char *)); /* language.c */ - -/* Return a string that contains a number formatted in the local - (language-specific) hexadecimal format. Result is static and is - overwritten by the next call. local_hex_string_custom takes printf - options like "08" or "l". */ - -extern char * -local_hex_string PARAMS ((int)); /* language.c */ - -extern char * -local_hex_string_custom PARAMS ((int, char *)); /* language.c */ - - -/* Host machine definition. This will be a symlink to one of the - xm-*.h files, built by the `configure' script. */ - -#include "xm.h" - -/* If the xm.h file did not define the mode string used to open the - files, assume that binary files are opened the same way as text - files */ -#ifndef FOPEN_RB -#include "fopen-same.h" -#endif - -/* - * Allow things in gdb to be declared "const". If compiling ANSI, it - * just works. If compiling with gcc but non-ansi, redefine to __const__. - * If non-ansi, non-gcc, then eliminate "const" entirely, making those - * objects be read-write rather than read-only. - */ - -#ifndef const -#ifndef __STDC__ -# ifdef __GNUC__ -# define const __const__ -# else -# define const /*nothing*/ -# endif /* GNUC */ -#endif /* STDC */ -#endif /* const */ - -#ifndef volatile -#ifndef __STDC__ -# ifdef __GNUC__ -# define volatile __volatile__ -# else -# define volatile /*nothing*/ -# endif /* GNUC */ -#endif /* STDC */ -#endif /* volatile */ - -/* Some compilers (many AT&T SVR4 compilers for instance), do not accept - declarations of functions that never return (exit for instance) as - "volatile void". For such compilers "NORETURN" can be defined away - to keep them happy */ - -#ifndef NORETURN -# ifdef __lucid -# define NORETURN /*nothing*/ -# else -# define NORETURN volatile -# endif -#endif - -/* Defaults for system-wide constants (if not defined by xm.h, we fake it). */ - -#if !defined (UINT_MAX) -#define UINT_MAX 0xffffffff -#endif - -#if !defined (LONG_MAX) -#define LONG_MAX 0x7fffffff -#endif - -#if !defined (INT_MAX) -#define INT_MAX 0x7fffffff -#endif - -#if !defined (INT_MIN) -/* Two's complement, 32 bit. */ -#define INT_MIN -0x80000000 -#endif - -/* Number of bits in a char or unsigned char for the target machine. - Just like CHAR_BIT in but describes the target machine. */ -#if !defined (TARGET_CHAR_BIT) -#define TARGET_CHAR_BIT 8 -#endif - -/* Number of bits in a short or unsigned short for the target machine. */ -#if !defined (TARGET_SHORT_BIT) -#define TARGET_SHORT_BIT (sizeof (short) * TARGET_CHAR_BIT) -#endif - -/* Number of bits in an int or unsigned int for the target machine. */ -#if !defined (TARGET_INT_BIT) -#define TARGET_INT_BIT (sizeof (int) * TARGET_CHAR_BIT) -#endif - -/* Number of bits in a long or unsigned long for the target machine. */ -#if !defined (TARGET_LONG_BIT) -#define TARGET_LONG_BIT (sizeof (long) * TARGET_CHAR_BIT) -#endif - -/* Number of bits in a long long or unsigned long long for the target machine. */ -#if !defined (TARGET_LONG_LONG_BIT) -#define TARGET_LONG_LONG_BIT (2 * TARGET_LONG_BIT) -#endif - -/* Number of bits in a float for the target machine. */ -#if !defined (TARGET_FLOAT_BIT) -#define TARGET_FLOAT_BIT (sizeof (float) * TARGET_CHAR_BIT) -#endif - -/* Number of bits in a double for the target machine. */ -#if !defined (TARGET_DOUBLE_BIT) -#define TARGET_DOUBLE_BIT (sizeof (double) * TARGET_CHAR_BIT) -#endif - -/* Number of bits in a long double for the target machine. */ -#if !defined (TARGET_LONG_DOUBLE_BIT) -#define TARGET_LONG_DOUBLE_BIT (2 * TARGET_DOUBLE_BIT) -#endif - -/* Number of bits in a "complex" for the target machine. */ -#if !defined (TARGET_COMPLEX_BIT) -#define TARGET_COMPLEX_BIT (2 * TARGET_FLOAT_BIT) -#endif - -/* Number of bits in a "double complex" for the target machine. */ -#if !defined (TARGET_DOUBLE_COMPLEX_BIT) -#define TARGET_DOUBLE_COMPLEX_BIT (2 * TARGET_DOUBLE_BIT) -#endif - -/* Number of bits in a pointer for the target machine */ -#if !defined (TARGET_PTR_BIT) -#define TARGET_PTR_BIT TARGET_INT_BIT -#endif - -/* Convert a LONGEST to an int. This is used in contexts (e.g. number - of arguments to a function, number in a value history, register - number, etc.) where the value must not be larger than can fit - in an int. */ -#if !defined (longest_to_int) -#if defined (LONG_LONG) -#define longest_to_int(x) (((x) > INT_MAX || (x) < INT_MIN) \ - ? (error ("Value out of range."),0) : (int) (x)) -#else /* No LONG_LONG. */ -/* Assume sizeof (int) == sizeof (long). */ -#define longest_to_int(x) ((int) (x)) -#endif /* No LONG_LONG. */ -#endif /* No longest_to_int. */ - -/* This should not be a typedef, because "unsigned LONGEST" needs - to work. LONG_LONG is defined if the host has "long long". */ - -#ifndef LONGEST -# ifdef LONG_LONG -# define LONGEST long long -# else -# define LONGEST long -# endif -#endif - -/* Assorted functions we can declare, now that const and volatile are - defined. */ - -extern char * -savestring PARAMS ((const char *, int)); - -extern char * -msavestring PARAMS ((void *, const char *, int)); - -extern char * -strsave PARAMS ((const char *)); - -extern char * -mstrsave PARAMS ((void *, const char *)); - -extern char * -concat PARAMS ((char *, ...)); - -extern PTR -xmalloc PARAMS ((long)); - -extern PTR -xrealloc PARAMS ((PTR, long)); - -extern PTR -xmmalloc PARAMS ((PTR, long)); - -extern PTR -xmrealloc PARAMS ((PTR, PTR, long)); - -extern PTR -mmalloc PARAMS ((PTR, long)); - -extern PTR -mrealloc PARAMS ((PTR, PTR, long)); - -extern void -mfree PARAMS ((PTR, PTR)); - -extern int -mmcheck PARAMS ((PTR, void (*) (void))); - -extern int -mmtrace PARAMS ((void)); - -extern int -parse_escape PARAMS ((char **)); - -extern const char * const reg_names[]; - -extern NORETURN void /* Does not return to the caller. */ -error (); - -extern NORETURN void /* Does not return to the caller. */ -fatal (); - -extern NORETURN void /* Not specified as volatile in ... */ -exit PARAMS ((int)); /* 4.10.4.3 */ - -extern NORETURN void /* Does not return to the caller. */ -nomem PARAMS ((long)); - -extern NORETURN void /* Does not return to the caller. */ -return_to_top_level PARAMS ((void)); - -extern void -warning_setup PARAMS ((void)); - -extern void -warning (); - -/* Global functions from other, non-gdb GNU thingies (libiberty for - instance) */ - -extern char * -basename PARAMS ((char *)); - -extern char * -getenv PARAMS ((const char *)); - -extern char ** -buildargv PARAMS ((char *)); - -extern void -freeargv PARAMS ((char **)); - -extern char * -strerrno PARAMS ((int)); - -extern char * -strsigno PARAMS ((int)); - -extern int -errno_max PARAMS ((void)); - -extern int -signo_max PARAMS ((void)); - -extern int -strtoerrno PARAMS ((char *)); - -extern int -strtosigno PARAMS ((char *)); - -extern char * -strsignal PARAMS ((int)); - -/* From other system libraries */ - -#ifndef PSIGNAL_IN_SIGNAL_H -extern void -psignal PARAMS ((unsigned, char *)); -#endif - -/* For now, we can't include because it conflicts with - "../include/getopt.h". (FIXME) - - However, if a function is defined in the ANSI C standard and a prototype - for that function is defined and visible in any header file in an ANSI - conforming environment, then that prototype must match the definition in - the ANSI standard. So we can just duplicate them here without conflict, - since they must be the same in all conforming ANSI environments. If - these cause problems, then the environment is not ANSI conformant. */ - -#ifdef __STDC__ -#include -#endif - -extern int -fclose PARAMS ((FILE *stream)); /* 4.9.5.1 */ - -extern void -perror PARAMS ((const char *)); /* 4.9.10.4 */ - -extern double -atof PARAMS ((const char *nptr)); /* 4.10.1.1 */ - -extern int -atoi PARAMS ((const char *)); /* 4.10.1.2 */ - -#ifndef MALLOC_INCOMPATIBLE - -extern PTR -malloc PARAMS ((size_t size)); /* 4.10.3.3 */ - -extern PTR -realloc PARAMS ((void *ptr, size_t size)); /* 4.10.3.4 */ - -extern void -free PARAMS ((void *)); /* 4.10.3.2 */ - -#endif /* MALLOC_INCOMPATIBLE */ - -extern void -qsort PARAMS ((void *base, size_t nmemb, /* 4.10.5.2 */ - size_t size, - int (*comp)(const void *, const void *))); - -#ifndef MEM_FNS_DECLARED /* Some non-ANSI use void *, not char *. */ -extern PTR -memcpy PARAMS ((void *, const void *, size_t)); /* 4.11.2.1 */ -#endif - -extern int -memcmp PARAMS ((const void *, const void *, size_t)); /* 4.11.4.1 */ - -extern char * -strchr PARAMS ((const char *, int)); /* 4.11.5.2 */ - -extern char * -strrchr PARAMS ((const char *, int)); /* 4.11.5.5 */ - -extern char * -strstr PARAMS ((const char *, const char *)); /* 4.11.5.7 */ - -extern char * -strtok PARAMS ((char *, const char *)); /* 4.11.5.8 */ - -#ifndef MEM_FNS_DECLARED /* Some non-ANSI use void *, not char *. */ -extern PTR -memset PARAMS ((void *, int, size_t)); /* 4.11.6.1 */ -#endif - -extern char * -strerror PARAMS ((int)); /* 4.11.6.2 */ - -/* Various possibilities for alloca. */ -#ifndef alloca -# ifdef __GNUC__ -# define alloca __builtin_alloca -# else -# ifdef sparc -# include /* NOTE: Doesn't declare alloca() */ -# endif -# ifdef __STDC__ - extern void *alloca (size_t); -# else /* __STDC__ */ - extern char *alloca (); -# endif -# endif -#endif - -/* TARGET_BYTE_ORDER and HOST_BYTE_ORDER must be defined to one of these. */ - -#if !defined (BIG_ENDIAN) -#define BIG_ENDIAN 4321 -#endif - -#if !defined (LITTLE_ENDIAN) -#define LITTLE_ENDIAN 1234 -#endif - -/* Target-system-dependent parameters for GDB. - - The standard thing is to include defs.h. However, files that are - specific to a particular target can define TM_FILE_OVERRIDE before - including defs.h, then can include any particular tm-file they desire. */ - -/* Target machine definition. This will be a symlink to one of the - tm-*.h files, built by the `configure' script. */ - -#ifndef TM_FILE_OVERRIDE -#include "tm.h" -#endif - -/* The bit byte-order has to do just with numbering of bits in - debugging symbols and such. Conceptually, it's quite separate - from byte/word byte order. */ - -#if !defined (BITS_BIG_ENDIAN) -#if TARGET_BYTE_ORDER == BIG_ENDIAN -#define BITS_BIG_ENDIAN 1 -#endif /* Big endian. */ - -#if TARGET_BYTE_ORDER == LITTLE_ENDIAN -#define BITS_BIG_ENDIAN 0 -#endif /* Little endian. */ -#endif /* BITS_BIG_ENDIAN not defined. */ - -/* Swap LEN bytes at BUFFER between target and host byte-order. */ -#if TARGET_BYTE_ORDER == HOST_BYTE_ORDER -#define SWAP_TARGET_AND_HOST(buffer,len) -#else /* Target and host byte order differ. */ -#define SWAP_TARGET_AND_HOST(buffer,len) \ - { \ - char tmp; \ - char *p = (char *)(buffer); \ - char *q = ((char *)(buffer)) + len - 1; \ - for (; p < q; p++, q--) \ - { \ - tmp = *q; \ - *q = *p; \ - *p = tmp; \ - } \ - } -#endif /* Target and host byte order differ. */ - -/* On some machines there are bits in addresses which are not really - part of the address, but are used by the kernel, the hardware, etc. - for special purposes. ADDR_BITS_REMOVE takes out any such bits - so we get a "real" address such as one would find in a symbol - table. ADDR_BITS_SET sets those bits the way the system wants - them. */ -#if !defined (ADDR_BITS_REMOVE) -#define ADDR_BITS_REMOVE(addr) (addr) -#define ADDR_BITS_SET(addr) (addr) -#endif /* No ADDR_BITS_REMOVE. */ - -/* From valops.c */ - -extern CORE_ADDR -push_bytes PARAMS ((CORE_ADDR, char *, int)); - -/* In some modules, we don't have a definition of REGISTER_TYPE yet, so we - must avoid prototyping this function for now. FIXME. Should be: -extern CORE_ADDR -push_word PARAMS ((CORE_ADDR, REGISTER_TYPE)); - */ -extern CORE_ADDR -push_word (); - -/* Some parts of gdb might be considered optional, in the sense that they - are not essential for being able to build a working, usable debugger - for a specific environment. For example, the maintenance commands - are there for the benefit of gdb maintainers. As another example, - some environments really don't need gdb's that are able to read N - different object file formats. In order to make it possible (but - not necessarily recommended) to build "stripped down" versions of - gdb, the following defines control selective compilation of those - parts of gdb which can be safely left out when necessary. Note that - the default is to include everything. */ - -#ifndef MAINTENANCE_CMDS -#define MAINTENANCE_CMDS 1 -#endif - -#endif /* !defined (DEFS_H) */ diff --git a/debugger/fopen-same.h b/debugger/fopen-same.h deleted file mode 100644 index 0f37529d33e..00000000000 --- a/debugger/fopen-same.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Macros for the 'type' part of an fopen, freopen or fdopen. - - [Update] - - This version is for "same" systems, where text and binary files are - the same. An example is Unix. Many Unix systems could also add a - "b" to the string, indicating binary files, but some reject this - (and thereby don't conform to ANSI C, but what else is new?). - - This file is designed for inclusion by host-dependent .h files. No - user application should include it directly, since that would make - the application unable to be configured for both "same" and "binary" - variant systems. */ - -#define FOPEN_RB "r" -#define FOPEN_WB "w" -#define FOPEN_AB "a" -#define FOPEN_RUB "r+" -#define FOPEN_WUB "w+" -#define FOPEN_AUB "a+" - -#define FOPEN_RT "r" -#define FOPEN_WT "w" -#define FOPEN_AT "a" -#define FOPEN_RUT "r+" -#define FOPEN_WUT "w+" -#define FOPEN_AUT "a+" diff --git a/debugger/gdbcore.h b/debugger/gdbcore.h deleted file mode 100644 index e9c8466be3e..00000000000 --- a/debugger/gdbcore.h +++ /dev/null @@ -1,119 +0,0 @@ -/* Machine independent variables that describe the core file under GDB. - Copyright 1986, 1987, 1989, 1990, 1992 Free Software Foundation, Inc. - -This file is part of GDB. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -/* Interface routines for core, executable, etc. */ - -#if !defined (GDBCORE_H) -#define GDBCORE_H 1 - -#include "bfd.h" /* Binary File Description */ - -/* Return the name of the executable file as a string. - ERR nonzero means get error if there is none specified; - otherwise return 0 in that case. */ - -extern char * -get_exec_file PARAMS ((int err)); - -/* Nonzero if there is a core file. */ - -extern int -have_core_file_p PARAMS ((void)); - -/* Read "memory data" from whatever target or inferior we have. - Returns zero if successful, errno value if not. EIO is used - for address out of bounds. If breakpoints are inserted, returns - shadow contents, not the breakpoints themselves. From breakpoint.c. */ - -extern int -read_memory_nobpt PARAMS ((CORE_ADDR memaddr, char *myaddr, unsigned len)); - -/* Report a memory error with error(). */ - -extern void -memory_error PARAMS ((int status, CORE_ADDR memaddr)); - -/* Like target_read_memory, but report an error if can't read. */ - -extern void -read_memory PARAMS ((CORE_ADDR memaddr, char *myaddr, int len)); - -/* Read an integer from debugged memory, given address and number of bytes. */ - -extern long -read_memory_integer PARAMS ((CORE_ADDR memaddr, int len)); - -/* If this is prototyped, need to deal with void* vs. char*. */ - -extern void -write_memory PARAMS ((CORE_ADDR memaddr, char *myaddr, int len)); - -/* Hook for `exec_file_command' command to call. */ - -extern void (*exec_file_display_hook) PARAMS ((char *filename)); - -extern void -specify_exec_file_hook PARAMS ((void (*hook) (char *filename))); - -/* Binary File Diddlers for the exec and core files */ -extern bfd *core_bfd; -extern bfd *exec_bfd; - -/* Whether to open exec and core files read-only or read-write. */ - -extern int write_files; - -extern void -core_file_command PARAMS ((char *filename, int from_tty)); - -extern void -exec_file_command PARAMS ((char *filename, int from_tty)); - -extern void -validate_files PARAMS ((void)); - -extern unsigned int -register_addr PARAMS ((int regno, int blockend)); - -extern int -xfer_core_file PARAMS ((CORE_ADDR memaddr, char *myaddr, int len)); - -extern void -fetch_core_registers PARAMS ((char *core_reg_sect, unsigned core_reg_size, - int which, unsigned int reg_addr)); - -extern void -registers_fetched PARAMS ((void)); - -#if !defined (KERNEL_U_ADDR) -extern CORE_ADDR kernel_u_addr; -#define KERNEL_U_ADDR kernel_u_addr -#endif - -/* The target vector for core files */ -extern struct target_ops core_ops; - - /* target vector functions called directly from elsewhere */ -void -core_open PARAMS ((char *, int)); - -void -core_detach PARAMS ((char *, int)); - -#endif /* !defined (GDBCORE_H) */ diff --git a/debugger/opcodes/Imakefile b/debugger/opcodes/Imakefile new file mode 100644 index 00000000000..1178f7624ff --- /dev/null +++ b/debugger/opcodes/Imakefile @@ -0,0 +1,29 @@ +#include "../../Wine.tmpl" + +MODULE = opcodes + +#ifdef i386 +#define xi386 1 +#undef i386 +#endif + +SRCS = \ + dis-buf.c \ + i386-dis.c + +OBJS = \ + dis-buf.o \ + i386-dis.o + +#ifdef xi386 +#define i386 1 +#undef xi386 +#endif + +WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS)) +DependTarget() +CleanTarget() + +includes:: + +install:: diff --git a/debugger/ansidecl.h b/debugger/opcodes/ansidecl.h similarity index 61% rename from debugger/ansidecl.h rename to debugger/opcodes/ansidecl.h index 68e4d7547ec..3c0dcb3d9fc 100644 --- a/debugger/ansidecl.h +++ b/debugger/opcodes/ansidecl.h @@ -1,5 +1,5 @@ /* ANSI and traditional C compatability macros - Copyright 1991 Free Software Foundation, Inc. + Copyright 1991, 1992 Free Software Foundation, Inc. This file is part of the GNU C Library. This program is free software; you can redistribute it and/or modify @@ -24,12 +24,14 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ ----- ---- - ---------- ----------- - ---------- PTR `void *' `char *' LONG_DOUBLE `long double' `double' - CONST `const' `' VOLATILE `volatile' `' SIGNED `signed' `' PTRCONST `void *const' `char *' + ANSI_PROTOTYPES 1 not defined - DEFUN(name, arglist, args) + CONST is also defined, but is obsolete. Just use const. + + DEFUN (name, arglist, args) Defines function NAME. @@ -41,19 +43,38 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ be separated with `AND'. For functions with a variable number of arguments, the last thing listed should be `DOTS'. - DEFUN_VOID(name) + DEFUN_VOID (name) Defines a function NAME, which takes no arguments. - EXFUN(name, prototype) + obsolete -- EXFUN (name, (prototype)) -- obsolete. - Is used in an external function declaration. - In ANSI C it is `NAMEPROTOTYPE' (so PROTOTYPE should be enclosed in + Replaced by PARAMS. Do not use; will disappear someday soon. + Was used in external function declarations. + In ANSI C it is `NAME PROTOTYPE' (so PROTOTYPE should be enclosed in parentheses). In traditional C it is `NAME()'. - For a function that takes no arguments, PROTOTYPE should be `(NOARGS)'. + For a function that takes no arguments, PROTOTYPE should be `(void)'. + + PARAMS ((args)) + + We could use the EXFUN macro to handle prototype declarations, but + the name is misleading and the result is ugly. So we just define a + simple macro to handle the parameter lists, as in: + + static int foo PARAMS ((int, char)); + + This produces: `static int foo();' or `static int foo (int, char);' + + EXFUN would have done it like this: + + static int EXFUN (foo, (int, char)); + + but the function is not external...and it's hard to visually parse + the function name out of the mess. EXFUN should be considered + obsolete; new code should be written to use PARAMS. For example: - extern int EXFUN(printf, (CONST char *format DOTS)); + extern int printf PARAMS ((CONST char *format DOTS)); int DEFUN(fprintf, (stream, format), FILE *stream AND CONST char *format DOTS) { ... } void DEFUN_VOID(abort) { ... } @@ -69,7 +90,10 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* LINTLIBRARY */ -#ifdef __STDC__ +#if defined (__STDC__) || defined (_AIX) || (defined (__mips) && defined (_SYSTYPE_SVR4)) +/* All known AIX compilers implement these things (but don't always + define __STDC__). The RISC/OS MIPS compiler defines these things + in SVR4 mode, but does not define __STDC__. */ #define PTR void * #define PTRCONST void *CONST @@ -84,24 +108,11 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #define EXFUN(name, proto) name proto #define DEFUN(name, arglist, args) name(args) -#define DEFUN_VOID(name) name(NOARGS) +#define DEFUN_VOID(name) name(void) -#define PROTO(type, name, arglist) type name arglist - -/* We could use the EXFUN macro to handle prototypes, but - the name is misleading and the result is ugly. So just define a - simple macro to handle the parameter lists, as in: - - static int foo PARAMS ((int, char)); - - EXFUN would do it like this: - - static int EXFUN (foo, (int, char)); - - but the function is not external... EXFUN should be considered - obsolete, and new code written to use PARAMS. */ - -#define PARAMS(paramlist) paramlist +#define PROTO(type, name, arglist) type name arglist +#define PARAMS(paramlist) paramlist +#define ANSI_PROTOTYPES 1 #else /* Not ANSI C. */ @@ -112,6 +123,9 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #define AND ; #define NOARGS #define CONST +#ifndef const /* some systems define it in header files for non-ansi mode */ +#define const +#endif #define VOLATILE #define SIGNED #define DOTS diff --git a/debugger/opcodes/bfd.h b/debugger/opcodes/bfd.h new file mode 100644 index 00000000000..ed068d92e43 --- /dev/null +++ b/debugger/opcodes/bfd.h @@ -0,0 +1,2171 @@ +/* Main header file for the bfd library -- portable access to object files. + Copyright 1990, 1991, 1992, 1993, 1994 Free Software Foundation, Inc. + Contributed by Cygnus Support. + +** NOTE: bfd.h and bfd-in2.h are GENERATED files. Don't change them; +** instead, change bfd-in.h or the other BFD source files processed to +** generate these files. + +This file is part of BFD, the Binary File Descriptor library. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* bfd.h -- The only header file required by users of the bfd library + +The bfd.h file is generated from bfd-in.h and various .c files; if you +change it, your changes will probably be lost. + +All the prototypes and definitions following the comment "THE FOLLOWING +IS EXTRACTED FROM THE SOURCE" are extracted from the source files for +BFD. If you change it, someone oneday will extract it from the source +again, and your changes will be lost. To save yourself from this bind, +change the definitions in the source in the bfd directory. Type "make +docs" and then "make headers" in that directory, and magically this file +will change to reflect your changes. + +If you don't have the tools to perform the extraction, then you are +safe from someone on your system trampling over your header files. +You should still maintain the equivalence between the source and this +file though; every change you make to the .c file should be reflected +here. */ + +#ifndef __BFD_H_SEEN__ +#define __BFD_H_SEEN__ + +#include "ansidecl.h" +#include "obstack.h" + +/* These two lines get substitutions done by commands in Makefile.in. */ +#define BFD_VERSION "cygnus-2.3" +#define BFD_ARCH_SIZE 32 + +#if BFD_ARCH_SIZE >= 64 +#define BFD64 +#endif + +#ifndef INLINE +#if __GNUC__ >= 2 +#define INLINE __inline__ +#else +#define INLINE +#endif +#endif + +/* 64-bit type definition (if any) from bfd's sysdep.h goes here */ + + +/* forward declaration */ +typedef struct _bfd bfd; + +/* To squelch erroneous compiler warnings ("illegal pointer + combination") from the SVR3 compiler, we would like to typedef + boolean to int (it doesn't like functions which return boolean. + Making sure they are never implicitly declared to return int + doesn't seem to help). But this file is not configured based on + the host. */ +/* General rules: functions which are boolean return true on success + and false on failure (unless they're a predicate). -- bfd.doc */ +/* I'm sure this is going to break something and someone is going to + force me to change it. */ +/* typedef enum boolean {false, true} boolean; */ +/* Yup, SVR4 has a "typedef enum boolean" in -fnf */ +/* It gets worse if the host also defines a true/false enum... -sts */ +#ifndef TRUE_FALSE_ALREADY_DEFINED +typedef enum bfd_boolean {false, true} boolean; +#define BFD_TRUE_FALSE +#else +typedef enum bfd_boolean {bfd_false, bfd_true} boolean; +#endif + +/* A pointer to a position in a file. */ +/* FIXME: This should be using off_t from . + For now, try to avoid breaking stuff by not including here. + This will break on systems with 64-bit file offsets (e.g. 4.4BSD). + Probably the best long-term answer is to avoid using file_ptr AND off_t + in this header file, and to handle this in the BFD implementation + rather than in its interface. */ +/* typedef off_t file_ptr; */ +typedef long int file_ptr; + +/* Support for different sizes of target format ints and addresses. If the + host implements 64-bit values, it defines BFD_HOST_64_BIT to be the appropriate + type. Otherwise, this code will fall back on gcc's "long long" type if gcc + is being used. BFD_HOST_64_BIT must be defined in such a way as to be a valid + type name by itself or with "unsigned" prefixed. It should be a signed + type by itself. + + If neither is the case, then compilation will fail if 64-bit targets are + requested. If you don't request any 64-bit targets, you should be safe. */ + +#ifdef BFD64 + +#if defined (__GNUC__) && !defined (BFD_HOST_64_BIT) +#define BFD_HOST_64_BIT long long +typedef BFD_HOST_64_BIT int64_type; +typedef unsigned BFD_HOST_64_BIT uint64_type; +#endif + +#if !defined (uint64_type) && defined (__GNUC__) +#define uint64_type unsigned long long +#define int64_type long long +#endif +#ifndef uint64_typeLOW +#define uint64_typeLOW(x) ((unsigned long)(((x) & 0xffffffff))) +#define uint64_typeHIGH(x) ((unsigned long)(((x) >> 32) & 0xffffffff)) +#endif + +typedef unsigned BFD_HOST_64_BIT bfd_vma; +typedef BFD_HOST_64_BIT bfd_signed_vma; +typedef unsigned BFD_HOST_64_BIT bfd_size_type; +typedef unsigned BFD_HOST_64_BIT symvalue; +#ifndef fprintf_vma +#define fprintf_vma(s,x) \ + fprintf(s,"%08lx%08lx", uint64_typeHIGH(x), uint64_typeLOW(x)) +#define sprintf_vma(s,x) \ + sprintf(s,"%08lx%08lx", uint64_typeHIGH(x), uint64_typeLOW(x)) +#endif +#else /* not BFD64 */ + +/* Represent a target address. Also used as a generic unsigned type + which is guaranteed to be big enough to hold any arithmetic types + we need to deal with. */ +typedef unsigned long bfd_vma; + +/* A generic signed type which is guaranteed to be big enough to hold any + arithmetic types we need to deal with. Can be assumed to be compatible + with bfd_vma in the same way that signed and unsigned ints are compatible + (as parameters, in assignment, etc). */ +typedef long bfd_signed_vma; + +typedef unsigned long symvalue; +typedef unsigned long bfd_size_type; + +/* Print a bfd_vma x on stream s. */ +#define fprintf_vma(s,x) fprintf(s, "%08lx", x) +#define sprintf_vma(s,x) sprintf(s, "%08lx", x) +#endif /* not BFD64 */ +#define printf_vma(x) fprintf_vma(stdout,x) + +typedef unsigned int flagword; /* 32 bits of flags */ + +/** File formats */ + +typedef enum bfd_format { + bfd_unknown = 0, /* file format is unknown */ + bfd_object, /* linker/assember/compiler output */ + bfd_archive, /* object archive file */ + bfd_core, /* core dump */ + bfd_type_end} /* marks the end; don't use it! */ + bfd_format; + +/* Values that may appear in the flags field of a BFD. These also + appear in the object_flags field of the bfd_target structure, where + they indicate the set of flags used by that backend (not all flags + are meaningful for all object file formats) (FIXME: at the moment, + the object_flags values have mostly just been copied from backend + to another, and are not necessarily correct). */ + +/* No flags. */ +#define NO_FLAGS 0x00 + +/* BFD contains relocation entries. */ +#define HAS_RELOC 0x01 + +/* BFD is directly executable. */ +#define EXEC_P 0x02 + +/* BFD has line number information (basically used for F_LNNO in a + COFF header). */ +#define HAS_LINENO 0x04 + +/* BFD has debugging information. */ +#define HAS_DEBUG 0x08 + +/* BFD has symbols. */ +#define HAS_SYMS 0x10 + +/* BFD has local symbols (basically used for F_LSYMS in a COFF + header). */ +#define HAS_LOCALS 0x20 + +/* BFD is a dynamic object. */ +#define DYNAMIC 0x40 + +/* Text section is write protected (if D_PAGED is not set, this is + like an a.out NMAGIC file) (the linker sets this by default, but + clears it for -r or -N). */ +#define WP_TEXT 0x80 + +/* BFD is dynamically paged (this is like an a.out ZMAGIC file) (the + linker sets this by default, but clears it for -r or -n or -N). */ +#define D_PAGED 0x100 + +/* BFD is relaxable (this means that bfd_relax_section may be able to + do something). */ +#define BFD_IS_RELAXABLE 0x200 + +/* symbols and relocation */ + +/* A count of carsyms (canonical archive symbols). */ +typedef unsigned long symindex; + +#define BFD_NO_MORE_SYMBOLS ((symindex) ~0) + +/* General purpose part of a symbol X; + target specific parts are in libcoff.h, libaout.h, etc. */ + +#define bfd_get_section(x) ((x)->section) +#define bfd_get_output_section(x) ((x)->section->output_section) +#define bfd_set_section(x,y) ((x)->section) = (y) +#define bfd_asymbol_base(x) ((x)->section->vma) +#define bfd_asymbol_value(x) (bfd_asymbol_base(x) + (x)->value) +#define bfd_asymbol_name(x) ((x)->name) +/*Perhaps future: #define bfd_asymbol_bfd(x) ((x)->section->owner)*/ +#define bfd_asymbol_bfd(x) ((x)->the_bfd) +#define bfd_asymbol_flavour(x) (bfd_asymbol_bfd(x)->xvec->flavour) + +/* A canonical archive symbol. */ +/* This is a type pun with struct ranlib on purpose! */ +typedef struct carsym { + char *name; + file_ptr file_offset; /* look here to find the file */ +} carsym; /* to make these you call a carsymogen */ + + +/* Used in generating armaps (archive tables of contents). + Perhaps just a forward definition would do? */ +struct orl { /* output ranlib */ + char **name; /* symbol name */ + file_ptr pos; /* bfd* or file position */ + int namidx; /* index into string table */ +}; + + + +/* Linenumber stuff */ +typedef struct lineno_cache_entry { + unsigned int line_number; /* Linenumber from start of function*/ + union { + struct symbol_cache_entry *sym; /* Function name */ + unsigned long offset; /* Offset into section */ + } u; +} alent; + +/* object and core file sections */ + + +#define align_power(addr, align) \ + ( ((addr) + ((1<<(align))-1)) & (-1 << (align))) + +typedef struct sec *sec_ptr; + +#define bfd_get_section_name(bfd, ptr) ((ptr)->name + 0) +#define bfd_get_section_vma(bfd, ptr) ((ptr)->vma + 0) +#define bfd_get_section_alignment(bfd, ptr) ((ptr)->alignment_power + 0) +#define bfd_section_name(bfd, ptr) ((ptr)->name) +#define bfd_section_size(bfd, ptr) (bfd_get_section_size_before_reloc(ptr)) +#define bfd_section_vma(bfd, ptr) ((ptr)->vma) +#define bfd_section_alignment(bfd, ptr) ((ptr)->alignment_power) +#define bfd_get_section_flags(bfd, ptr) ((ptr)->flags + 0) +#define bfd_get_section_userdata(bfd, ptr) ((ptr)->userdata) + +#define bfd_is_com_section(ptr) (((ptr)->flags & SEC_IS_COMMON) != 0) + +#define bfd_set_section_vma(bfd, ptr, val) (((ptr)->vma = (ptr)->lma= (val)), ((ptr)->user_set_vma = true), true) +#define bfd_set_section_alignment(bfd, ptr, val) (((ptr)->alignment_power = (val)),true) +#define bfd_set_section_userdata(bfd, ptr, val) (((ptr)->userdata = (val)),true) + +typedef struct stat stat_type; + +typedef enum bfd_print_symbol +{ + bfd_print_symbol_name, + bfd_print_symbol_more, + bfd_print_symbol_all +} bfd_print_symbol_type; + +/* Information about a symbol that nm needs. */ + +typedef struct _symbol_info +{ + symvalue value; + char type; + CONST char *name; /* Symbol name. */ + char stab_other; /* Unused. */ + short stab_desc; /* Info for N_TYPE. */ + CONST char *stab_name; +} symbol_info; + +/* Hash table routines. There is no way to free up a hash table. */ + +/* An element in the hash table. Most uses will actually use a larger + structure, and an instance of this will be the first field. */ + +struct bfd_hash_entry +{ + /* Next entry for this hash code. */ + struct bfd_hash_entry *next; + /* String being hashed. */ + const char *string; + /* Hash code. This is the full hash code, not the index into the + table. */ + unsigned long hash; +}; + +/* A hash table. */ + +struct bfd_hash_table +{ + /* The hash array. */ + struct bfd_hash_entry **table; + /* The number of slots in the hash table. */ + unsigned int size; + /* A function used to create new elements in the hash table. The + first entry is itself a pointer to an element. When this + function is first invoked, this pointer will be NULL. However, + having the pointer permits a hierarchy of method functions to be + built each of which calls the function in the superclass. Thus + each function should be written to allocate a new block of memory + only if the argument is NULL. */ + struct bfd_hash_entry *(*newfunc) PARAMS ((struct bfd_hash_entry *, + struct bfd_hash_table *, + const char *)); + /* An obstack for this hash table. */ + struct obstack memory; +}; + +/* Initialize a hash table. */ +extern boolean bfd_hash_table_init + PARAMS ((struct bfd_hash_table *, + struct bfd_hash_entry *(*) (struct bfd_hash_entry *, + struct bfd_hash_table *, + const char *))); + +/* Initialize a hash table specifying a size. */ +extern boolean bfd_hash_table_init_n + PARAMS ((struct bfd_hash_table *, + struct bfd_hash_entry *(*) (struct bfd_hash_entry *, + struct bfd_hash_table *, + const char *), + unsigned int size)); + +/* Free up a hash table. */ +extern void bfd_hash_table_free PARAMS ((struct bfd_hash_table *)); + +/* Look up a string in a hash table. If CREATE is true, a new entry + will be created for this string if one does not already exist. The + COPY argument must be true if this routine should copy the string + into newly allocated memory when adding an entry. */ +extern struct bfd_hash_entry *bfd_hash_lookup + PARAMS ((struct bfd_hash_table *, const char *, boolean create, + boolean copy)); + +/* Base method for creating a hash table entry. */ +extern struct bfd_hash_entry *bfd_hash_newfunc + PARAMS ((struct bfd_hash_entry *, struct bfd_hash_table *, + const char *)); + +/* Grab some space for a hash table entry. */ +extern PTR bfd_hash_allocate PARAMS ((struct bfd_hash_table *, + unsigned int)); + +/* Traverse a hash table in a random order, calling a function on each + element. If the function returns false, the traversal stops. The + INFO argument is passed to the function. */ +extern void bfd_hash_traverse PARAMS ((struct bfd_hash_table *, + boolean (*) (struct bfd_hash_entry *, + PTR), + PTR info)); + +/* Semi-portable string concatenation in cpp. + The CAT4 hack is to avoid a problem with some strict ANSI C preprocessors. + The problem is, "32_" is not a valid preprocessing token, and we don't + want extra underscores (e.g., "nlm_32_"). The XCAT2 macro will cause the + inner CAT macros to be evaluated first, producing still-valid pp-tokens. + Then the final concatenation can be done. (Sigh.) */ +#ifndef CAT +#ifdef SABER +#define CAT(a,b) a##b +#define CAT3(a,b,c) a##b##c +#define CAT4(a,b,c,d) a##b##c##d +#else +#if defined(__STDC__) || defined(ALMOST_STDC) +#define CAT(a,b) a##b +#define CAT3(a,b,c) a##b##c +#define XCAT2(a,b) CAT(a,b) +#define CAT4(a,b,c,d) XCAT2(CAT(a,b),CAT(c,d)) +#else +#define CAT(a,b) a/**/b +#define CAT3(a,b,c) a/**/b/**/c +#define CAT4(a,b,c,d) a/**/b/**/c/**/d +#endif +#endif +#endif + +#define COFF_SWAP_TABLE (PTR) &bfd_coff_std_swap_table + +/* User program access to BFD facilities */ + +/* Cast from const char * to char * so that caller can assign to + a char * without a warning. */ +#define bfd_get_filename(abfd) ((char *) (abfd)->filename) +#define bfd_get_cacheable(abfd) ((abfd)->cacheable) +#define bfd_get_format(abfd) ((abfd)->format) +#define bfd_get_target(abfd) ((abfd)->xvec->name) +#define bfd_get_flavour(abfd) ((abfd)->xvec->flavour) +#define bfd_get_file_flags(abfd) ((abfd)->flags) +#define bfd_applicable_file_flags(abfd) ((abfd)->xvec->object_flags) +#define bfd_applicable_section_flags(abfd) ((abfd)->xvec->section_flags) +#define bfd_my_archive(abfd) ((abfd)->my_archive) +#define bfd_has_map(abfd) ((abfd)->has_armap) + +#define bfd_valid_reloc_types(abfd) ((abfd)->xvec->valid_reloc_types) +#define bfd_usrdata(abfd) ((abfd)->usrdata) + +#define bfd_get_start_address(abfd) ((abfd)->start_address) +#define bfd_get_symcount(abfd) ((abfd)->symcount) +#define bfd_get_outsymbols(abfd) ((abfd)->outsymbols) +#define bfd_count_sections(abfd) ((abfd)->section_count) + +#define bfd_get_symbol_leading_char(abfd) ((abfd)->xvec->symbol_leading_char) + +#define bfd_set_cacheable(abfd,bool) (((abfd)->cacheable = (bool)), true) + +/* Byte swapping routines. */ + +bfd_vma bfd_getb64 PARAMS ((const unsigned char *)); +bfd_vma bfd_getl64 PARAMS ((const unsigned char *)); +bfd_signed_vma bfd_getb_signed_64 PARAMS ((const unsigned char *)); +bfd_signed_vma bfd_getl_signed_64 PARAMS ((const unsigned char *)); +bfd_vma bfd_getb32 PARAMS ((const unsigned char *)); +bfd_vma bfd_getl32 PARAMS ((const unsigned char *)); +bfd_signed_vma bfd_getb_signed_32 PARAMS ((const unsigned char *)); +bfd_signed_vma bfd_getl_signed_32 PARAMS ((const unsigned char *)); +bfd_vma bfd_getb16 PARAMS ((const unsigned char *)); +bfd_vma bfd_getl16 PARAMS ((const unsigned char *)); +bfd_signed_vma bfd_getb_signed_16 PARAMS ((const unsigned char *)); +bfd_signed_vma bfd_getl_signed_16 PARAMS ((const unsigned char *)); +void bfd_putb64 PARAMS ((bfd_vma, unsigned char *)); +void bfd_putl64 PARAMS ((bfd_vma, unsigned char *)); +void bfd_putb32 PARAMS ((bfd_vma, unsigned char *)); +void bfd_putl32 PARAMS ((bfd_vma, unsigned char *)); +void bfd_putb16 PARAMS ((bfd_vma, unsigned char *)); +void bfd_putl16 PARAMS ((bfd_vma, unsigned char *)); + +/* Externally visible ECOFF routines. */ + +#if defined(__STDC__) || defined(ALMOST_STDC) +struct ecoff_debug_info; +struct ecoff_debug_swap; +struct ecoff_extr; +struct symbol_cache_entry; +struct bfd_link_info; +#endif +extern bfd_vma bfd_ecoff_get_gp_value PARAMS ((bfd * abfd)); +extern boolean bfd_ecoff_set_gp_value PARAMS ((bfd *abfd, bfd_vma gp_value)); +extern boolean bfd_ecoff_set_regmasks + PARAMS ((bfd *abfd, unsigned long gprmask, unsigned long fprmask, + unsigned long *cprmask)); +extern PTR bfd_ecoff_debug_init + PARAMS ((bfd *output_bfd, struct ecoff_debug_info *output_debug, + const struct ecoff_debug_swap *output_swap, + struct bfd_link_info *)); +extern void bfd_ecoff_debug_free + PARAMS ((PTR handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, + const struct ecoff_debug_swap *output_swap, + struct bfd_link_info *)); +extern boolean bfd_ecoff_debug_accumulate + PARAMS ((PTR handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, + const struct ecoff_debug_swap *output_swap, + bfd *input_bfd, struct ecoff_debug_info *input_debug, + const struct ecoff_debug_swap *input_swap, + struct bfd_link_info *)); +extern boolean bfd_ecoff_debug_accumulate_other + PARAMS ((PTR handle, bfd *output_bfd, struct ecoff_debug_info *output_debug, + const struct ecoff_debug_swap *output_swap, bfd *input_bfd, + struct bfd_link_info *)); +extern boolean bfd_ecoff_debug_externals + PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, + const struct ecoff_debug_swap *swap, + boolean relocateable, + boolean (*get_extr) (struct symbol_cache_entry *, + struct ecoff_extr *), + void (*set_index) (struct symbol_cache_entry *, + bfd_size_type))); +extern boolean bfd_ecoff_debug_one_external + PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, + const struct ecoff_debug_swap *swap, + const char *name, struct ecoff_extr *esym)); +extern bfd_size_type bfd_ecoff_debug_size + PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, + const struct ecoff_debug_swap *swap)); +extern boolean bfd_ecoff_write_debug + PARAMS ((bfd *abfd, struct ecoff_debug_info *debug, + const struct ecoff_debug_swap *swap, file_ptr where)); +extern boolean bfd_ecoff_write_accumulated_debug + PARAMS ((PTR handle, bfd *abfd, struct ecoff_debug_info *debug, + const struct ecoff_debug_swap *swap, + struct bfd_link_info *info, file_ptr where)); + +/* And more from the source. */ +void +bfd_init PARAMS ((void)); + +bfd * +bfd_openr PARAMS ((CONST char *filename, CONST char *target)); + +bfd * +bfd_fdopenr PARAMS ((CONST char *filename, CONST char *target, int fd)); + +bfd * +bfd_openw PARAMS ((CONST char *filename, CONST char *target)); + +boolean +bfd_close PARAMS ((bfd *abfd)); + +boolean +bfd_close_all_done PARAMS ((bfd *)); + +bfd_size_type +bfd_alloc_size PARAMS ((bfd *abfd)); + +bfd * +bfd_create PARAMS ((CONST char *filename, bfd *templ)); + + + /* Byte swapping macros for user section data. */ + +#define bfd_put_8(abfd, val, ptr) \ + (*((unsigned char *)(ptr)) = (unsigned char)(val)) +#define bfd_put_signed_8 \ + bfd_put_8 +#define bfd_get_8(abfd, ptr) \ + (*(unsigned char *)(ptr)) +#define bfd_get_signed_8(abfd, ptr) \ + ((*(unsigned char *)(ptr) ^ 0x80) - 0x80) + +#define bfd_put_16(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_putx16, ((val),(ptr))) +#define bfd_put_signed_16 \ + bfd_put_16 +#define bfd_get_16(abfd, ptr) \ + BFD_SEND(abfd, bfd_getx16, (ptr)) +#define bfd_get_signed_16(abfd, ptr) \ + BFD_SEND (abfd, bfd_getx_signed_16, (ptr)) + +#define bfd_put_32(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_putx32, ((val),(ptr))) +#define bfd_put_signed_32 \ + bfd_put_32 +#define bfd_get_32(abfd, ptr) \ + BFD_SEND(abfd, bfd_getx32, (ptr)) +#define bfd_get_signed_32(abfd, ptr) \ + BFD_SEND(abfd, bfd_getx_signed_32, (ptr)) + +#define bfd_put_64(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_putx64, ((val), (ptr))) +#define bfd_put_signed_64 \ + bfd_put_64 +#define bfd_get_64(abfd, ptr) \ + BFD_SEND(abfd, bfd_getx64, (ptr)) +#define bfd_get_signed_64(abfd, ptr) \ + BFD_SEND(abfd, bfd_getx_signed_64, (ptr)) + + + /* Byte swapping macros for file header data. */ + +#define bfd_h_put_8(abfd, val, ptr) \ + bfd_put_8 (abfd, val, ptr) +#define bfd_h_put_signed_8(abfd, val, ptr) \ + bfd_put_8 (abfd, val, ptr) +#define bfd_h_get_8(abfd, ptr) \ + bfd_get_8 (abfd, ptr) +#define bfd_h_get_signed_8(abfd, ptr) \ + bfd_get_signed_8 (abfd, ptr) + +#define bfd_h_put_16(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_h_putx16,(val,ptr)) +#define bfd_h_put_signed_16 \ + bfd_h_put_16 +#define bfd_h_get_16(abfd, ptr) \ + BFD_SEND(abfd, bfd_h_getx16,(ptr)) +#define bfd_h_get_signed_16(abfd, ptr) \ + BFD_SEND(abfd, bfd_h_getx_signed_16, (ptr)) + +#define bfd_h_put_32(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_h_putx32,(val,ptr)) +#define bfd_h_put_signed_32 \ + bfd_h_put_32 +#define bfd_h_get_32(abfd, ptr) \ + BFD_SEND(abfd, bfd_h_getx32,(ptr)) +#define bfd_h_get_signed_32(abfd, ptr) \ + BFD_SEND(abfd, bfd_h_getx_signed_32, (ptr)) + +#define bfd_h_put_64(abfd, val, ptr) \ + BFD_SEND(abfd, bfd_h_putx64,(val, ptr)) +#define bfd_h_put_signed_64 \ + bfd_h_put_64 +#define bfd_h_get_64(abfd, ptr) \ + BFD_SEND(abfd, bfd_h_getx64,(ptr)) +#define bfd_h_get_signed_64(abfd, ptr) \ + BFD_SEND(abfd, bfd_h_getx_signed_64, (ptr)) + +typedef struct sec +{ + /* The name of the section; the name isn't a copy, the pointer is + the same as that passed to bfd_make_section. */ + + CONST char *name; + + /* Which section is it; 0..nth. */ + + int index; + + /* The next section in the list belonging to the BFD, or NULL. */ + + struct sec *next; + + /* The field flags contains attributes of the section. Some + flags are read in from the object file, and some are + synthesized from other information. */ + + flagword flags; + +#define SEC_NO_FLAGS 0x000 + + /* Tells the OS to allocate space for this section when loading. + This is clear for a section containing debug information + only. */ +#define SEC_ALLOC 0x001 + + /* Tells the OS to load the section from the file when loading. + This is clear for a .bss section. */ +#define SEC_LOAD 0x002 + + /* The section contains data still to be relocated, so there is + some relocation information too. */ +#define SEC_RELOC 0x004 + +#if 0 /* Obsolete ? */ +#define SEC_BALIGN 0x008 +#endif + + /* A signal to the OS that the section contains read only + data. */ +#define SEC_READONLY 0x010 + + /* The section contains code only. */ +#define SEC_CODE 0x020 + + /* The section contains data only. */ +#define SEC_DATA 0x040 + + /* The section will reside in ROM. */ +#define SEC_ROM 0x080 + + /* The section contains constructor information. This section + type is used by the linker to create lists of constructors and + destructors used by <>. When a back end sees a symbol + which should be used in a constructor list, it creates a new + section for the type of name (e.g., <<__CTOR_LIST__>>), attaches + the symbol to it, and builds a relocation. To build the lists + of constructors, all the linker has to do is catenate all the + sections called <<__CTOR_LIST__>> and relocate the data + contained within - exactly the operations it would peform on + standard data. */ +#define SEC_CONSTRUCTOR 0x100 + + /* The section is a constuctor, and should be placed at the + end of the text, data, or bss section(?). */ +#define SEC_CONSTRUCTOR_TEXT 0x1100 +#define SEC_CONSTRUCTOR_DATA 0x2100 +#define SEC_CONSTRUCTOR_BSS 0x3100 + + /* The section has contents - a data section could be + <> | <>; a debug section could be + <> */ +#define SEC_HAS_CONTENTS 0x200 + + /* An instruction to the linker to not output the section + even if it has information which would normally be written. */ +#define SEC_NEVER_LOAD 0x400 + + /* The section is a shared library section. The linker must leave + these completely alone, as the vma and size are used when + the executable is loaded. */ +#define SEC_SHARED_LIBRARY 0x800 + + /* The section is a common section (symbols may be defined + multiple times, the value of a symbol is the amount of + space it requires, and the largest symbol value is the one + used). Most targets have exactly one of these (which we + translate to bfd_com_section), but ECOFF has two. */ +#define SEC_IS_COMMON 0x8000 + + /* The section contains only debugging information. For + example, this is set for ELF .debug and .stab sections. + strip tests this flag to see if a section can be + discarded. */ +#define SEC_DEBUGGING 0x10000 + + /* The contents of this section are held in memory pointed to + by the contents field. This is checked by + bfd_get_section_contents, and the data is retrieved from + memory if appropriate. */ +#define SEC_IN_MEMORY 0x20000 + + /* End of section flags. */ + + /* The virtual memory address of the section - where it will be + at run time. The symbols are relocated against this. The + user_set_vma flag is maintained by bfd; if it's not set, the + backend can assign addresses (for example, in <>, where + the default address for <<.data>> is dependent on the specific + target and various flags). */ + + bfd_vma vma; + boolean user_set_vma; + + /* The load address of the section - where it would be in a + rom image; really only used for writing section header + information. */ + + bfd_vma lma; + + /* The size of the section in bytes, as it will be output. + contains a value even if the section has no contents (e.g., the + size of <<.bss>>). This will be filled in after relocation */ + + bfd_size_type _cooked_size; + + /* The original size on disk of the section, in bytes. Normally this + value is the same as the size, but if some relaxing has + been done, then this value will be bigger. */ + + bfd_size_type _raw_size; + + /* If this section is going to be output, then this value is the + offset into the output section of the first byte in the input + section. E.g., if this was going to start at the 100th byte in + the output section, this value would be 100. */ + + bfd_vma output_offset; + + /* The output section through which to map on output. */ + + struct sec *output_section; + + /* The alignment requirement of the section, as an exponent of 2 - + e.g., 3 aligns to 2^3 (or 8). */ + + unsigned int alignment_power; + + /* If an input section, a pointer to a vector of relocation + records for the data in this section. */ + + struct reloc_cache_entry *relocation; + + /* If an output section, a pointer to a vector of pointers to + relocation records for the data in this section. */ + + struct reloc_cache_entry **orelocation; + + /* The number of relocation records in one of the above */ + + unsigned reloc_count; + + /* Information below is back end specific - and not always used + or updated. */ + + /* File position of section data */ + + file_ptr filepos; + + /* File position of relocation info */ + + file_ptr rel_filepos; + + /* File position of line data */ + + file_ptr line_filepos; + + /* Pointer to data for applications */ + + PTR userdata; + + /* If the SEC_IN_MEMORY flag is set, this points to the actual + contents. */ + unsigned char *contents; + + /* Attached line number information */ + + alent *lineno; + + /* Number of line number records */ + + unsigned int lineno_count; + + /* When a section is being output, this value changes as more + linenumbers are written out */ + + file_ptr moving_line_filepos; + + /* What the section number is in the target world */ + + int target_index; + + PTR used_by_bfd; + + /* If this is a constructor section then here is a list of the + relocations created to relocate items within it. */ + + struct relent_chain *constructor_chain; + + /* The BFD which owns the section. */ + + bfd *owner; + + boolean reloc_done; + /* A symbol which points at this section only */ + struct symbol_cache_entry *symbol; + struct symbol_cache_entry **symbol_ptr_ptr; + + struct bfd_link_order *link_order_head; + struct bfd_link_order *link_order_tail; +} asection ; + + + /* These sections are global, and are managed by BFD. The application + and target back end are not permitted to change the values in + these sections. */ +#define BFD_ABS_SECTION_NAME "*ABS*" +#define BFD_UND_SECTION_NAME "*UND*" +#define BFD_COM_SECTION_NAME "*COM*" +#define BFD_IND_SECTION_NAME "*IND*" + + /* the absolute section */ +extern asection bfd_abs_section; + /* Pointer to the undefined section */ +extern asection bfd_und_section; + /* Pointer to the common section */ +extern asection bfd_com_section; + /* Pointer to the indirect section */ +extern asection bfd_ind_section; + +extern struct symbol_cache_entry *bfd_abs_symbol; +extern struct symbol_cache_entry *bfd_com_symbol; +extern struct symbol_cache_entry *bfd_und_symbol; +extern struct symbol_cache_entry *bfd_ind_symbol; +#define bfd_get_section_size_before_reloc(section) \ + (section->reloc_done ? (abort(),1): (section)->_raw_size) +#define bfd_get_section_size_after_reloc(section) \ + ((section->reloc_done) ? (section)->_cooked_size: (abort(),1)) +asection * +bfd_get_section_by_name PARAMS ((bfd *abfd, CONST char *name)); + +asection * +bfd_make_section_old_way PARAMS ((bfd *abfd, CONST char *name)); + +asection * +bfd_make_section_anyway PARAMS ((bfd *abfd, CONST char *name)); + +asection * +bfd_make_section PARAMS ((bfd *, CONST char *name)); + +boolean +bfd_set_section_flags PARAMS ((bfd *abfd, asection *sec, flagword flags)); + +void +bfd_map_over_sections PARAMS ((bfd *abfd, + void (*func)(bfd *abfd, + asection *sect, + PTR obj), + PTR obj)); + +boolean +bfd_set_section_size PARAMS ((bfd *abfd, asection *sec, bfd_size_type val)); + +boolean +bfd_set_section_contents + PARAMS ((bfd *abfd, + asection *section, + PTR data, + file_ptr offset, + bfd_size_type count)); + +boolean +bfd_get_section_contents + PARAMS ((bfd *abfd, asection *section, PTR location, + file_ptr offset, bfd_size_type count)); + +boolean +bfd_copy_private_section_data PARAMS ((bfd *ibfd, asection *isec, bfd *obfd, asection *osec)); + +#define bfd_copy_private_section_data(ibfd, isection, obfd, osection) \ + BFD_SEND (ibfd, _bfd_copy_private_section_data, \ + (ibfd, isection, obfd, osection)) +enum bfd_architecture +{ + bfd_arch_unknown, /* File arch not known */ + bfd_arch_obscure, /* Arch known, not one of these */ + bfd_arch_m68k, /* Motorola 68xxx */ + bfd_arch_vax, /* DEC Vax */ + bfd_arch_i960, /* Intel 960 */ + /* The order of the following is important. + lower number indicates a machine type that + only accepts a subset of the instructions + available to machines with higher numbers. + The exception is the "ca", which is + incompatible with all other machines except + "core". */ + +#define bfd_mach_i960_core 1 +#define bfd_mach_i960_ka_sa 2 +#define bfd_mach_i960_kb_sb 3 +#define bfd_mach_i960_mc 4 +#define bfd_mach_i960_xa 5 +#define bfd_mach_i960_ca 6 + + bfd_arch_a29k, /* AMD 29000 */ + bfd_arch_sparc, /* SPARC */ + bfd_arch_mips, /* MIPS Rxxxx */ + bfd_arch_i386, /* Intel 386 */ + bfd_arch_we32k, /* AT&T WE32xxx */ + bfd_arch_tahoe, /* CCI/Harris Tahoe */ + bfd_arch_i860, /* Intel 860 */ + bfd_arch_romp, /* IBM ROMP PC/RT */ + bfd_arch_alliant, /* Alliant */ + bfd_arch_convex, /* Convex */ + bfd_arch_m88k, /* Motorola 88xxx */ + bfd_arch_pyramid, /* Pyramid Technology */ + bfd_arch_h8300, /* Hitachi H8/300 */ +#define bfd_mach_h8300 1 +#define bfd_mach_h8300h 2 + bfd_arch_powerpc, /* PowerPC */ + bfd_arch_rs6000, /* IBM RS/6000 */ + bfd_arch_hppa, /* HP PA RISC */ + bfd_arch_z8k, /* Zilog Z8000 */ +#define bfd_mach_z8001 1 +#define bfd_mach_z8002 2 + bfd_arch_h8500, /* Hitachi H8/500 */ + bfd_arch_sh, /* Hitachi SH */ + bfd_arch_alpha, /* Dec Alpha */ + bfd_arch_last + }; + +typedef struct bfd_arch_info +{ + int bits_per_word; + int bits_per_address; + int bits_per_byte; + enum bfd_architecture arch; + long mach; + char *arch_name; + CONST char *printable_name; + unsigned int section_align_power; + /* true if this is the default machine for the architecture */ + boolean the_default; + CONST struct bfd_arch_info * (*compatible) + PARAMS ((CONST struct bfd_arch_info *a, + CONST struct bfd_arch_info *b)); + + boolean (*scan) PARAMS ((CONST struct bfd_arch_info *, CONST char *)); + /* How to disassemble an instruction, producing a printable + representation on a specified stdio stream. This isn't + defined for most processors at present, because of the size + of the additional tables it would drag in, and because gdb + wants to use a different interface. */ + unsigned int (*disassemble) PARAMS ((bfd_vma addr, CONST char *data, + PTR stream)); + + struct bfd_arch_info *next; +} bfd_arch_info_type; +CONST char * +bfd_printable_name PARAMS ((bfd *abfd)); + +bfd_arch_info_type * +bfd_scan_arch PARAMS ((CONST char *string)); + +CONST bfd_arch_info_type * +bfd_arch_get_compatible PARAMS (( + CONST bfd *abfd, + CONST bfd *bbfd)); + +void +bfd_set_arch_info PARAMS ((bfd *abfd, bfd_arch_info_type *arg)); + +enum bfd_architecture +bfd_get_arch PARAMS ((bfd *abfd)); + +unsigned long +bfd_get_mach PARAMS ((bfd *abfd)); + +unsigned int +bfd_arch_bits_per_byte PARAMS ((bfd *abfd)); + +unsigned int +bfd_arch_bits_per_address PARAMS ((bfd *abfd)); + +bfd_arch_info_type * +bfd_get_arch_info PARAMS ((bfd *abfd)); + +bfd_arch_info_type * +bfd_lookup_arch + PARAMS ((enum bfd_architecture + arch, + long machine)); + +CONST char * +bfd_printable_arch_mach + PARAMS ((enum bfd_architecture arch, unsigned long machine)); + +typedef enum bfd_reloc_status +{ + /* No errors detected */ + bfd_reloc_ok, + + /* The relocation was performed, but there was an overflow. */ + bfd_reloc_overflow, + + /* The address to relocate was not within the section supplied. */ + bfd_reloc_outofrange, + + /* Used by special functions */ + bfd_reloc_continue, + + /* Unsupported relocation size requested. */ + bfd_reloc_notsupported, + + /* Unused */ + bfd_reloc_other, + + /* The symbol to relocate against was undefined. */ + bfd_reloc_undefined, + + /* The relocation was performed, but may not be ok - presently + generated only when linking i960 coff files with i960 b.out + symbols. If this type is returned, the error_message argument + to bfd_perform_relocation will be set. */ + bfd_reloc_dangerous + } + bfd_reloc_status_type; + + +typedef struct reloc_cache_entry +{ + /* A pointer into the canonical table of pointers */ + struct symbol_cache_entry **sym_ptr_ptr; + + /* offset in section */ + bfd_size_type address; + + /* addend for relocation value */ + bfd_vma addend; + + /* Pointer to how to perform the required relocation */ + const struct reloc_howto_struct *howto; + +} arelent; +enum complain_overflow +{ + /* Do not complain on overflow. */ + complain_overflow_dont, + + /* Complain if the bitfield overflows, whether it is considered + as signed or unsigned. */ + complain_overflow_bitfield, + + /* Complain if the value overflows when considered as signed + number. */ + complain_overflow_signed, + + /* Complain if the value overflows when considered as an + unsigned number. */ + complain_overflow_unsigned +}; + +typedef struct reloc_howto_struct +{ + /* The type field has mainly a documetary use - the back end can + do what it wants with it, though normally the back end's + external idea of what a reloc number is stored + in this field. For example, a PC relative word relocation + in a coff environment has the type 023 - because that's + what the outside world calls a R_PCRWORD reloc. */ + unsigned int type; + + /* The value the final relocation is shifted right by. This drops + unwanted data from the relocation. */ + unsigned int rightshift; + + /* The size of the item to be relocated. This is *not* a + power-of-two measure. To get the number of bytes operated + on by a type of relocation, use bfd_get_reloc_size. */ + int size; + + /* The number of bits in the item to be relocated. This is used + when doing overflow checking. */ + unsigned int bitsize; + + /* Notes that the relocation is relative to the location in the + data section of the addend. The relocation function will + subtract from the relocation value the address of the location + being relocated. */ + boolean pc_relative; + + /* The bit position of the reloc value in the destination. + The relocated value is left shifted by this amount. */ + unsigned int bitpos; + + /* What type of overflow error should be checked for when + relocating. */ + enum complain_overflow complain_on_overflow; + + /* If this field is non null, then the supplied function is + called rather than the normal function. This allows really + strange relocation methods to be accomodated (e.g., i960 callj + instructions). */ + bfd_reloc_status_type (*special_function) + PARAMS ((bfd *abfd, + arelent *reloc_entry, + struct symbol_cache_entry *symbol, + PTR data, + asection *input_section, + bfd *output_bfd, + char **error_message)); + + /* The textual name of the relocation type. */ + char *name; + + /* When performing a partial link, some formats must modify the + relocations rather than the data - this flag signals this.*/ + boolean partial_inplace; + + /* The src_mask selects which parts of the read in data + are to be used in the relocation sum. E.g., if this was an 8 bit + bit of data which we read and relocated, this would be + 0x000000ff. When we have relocs which have an addend, such as + sun4 extended relocs, the value in the offset part of a + relocating field is garbage so we never use it. In this case + the mask would be 0x00000000. */ + bfd_vma src_mask; + + /* The dst_mask selects which parts of the instruction are replaced + into the instruction. In most cases src_mask == dst_mask, + except in the above special case, where dst_mask would be + 0x000000ff, and src_mask would be 0x00000000. */ + bfd_vma dst_mask; + + /* When some formats create PC relative instructions, they leave + the value of the pc of the place being relocated in the offset + slot of the instruction, so that a PC relative relocation can + be made just by adding in an ordinary offset (e.g., sun3 a.out). + Some formats leave the displacement part of an instruction + empty (e.g., m88k bcs); this flag signals the fact.*/ + boolean pcrel_offset; + +} reloc_howto_type; +#define HOWTO(C, R,S,B, P, BI, O, SF, NAME, INPLACE, MASKSRC, MASKDST, PC) \ + {(unsigned)C,R,S,B, P, BI, O,SF,NAME,INPLACE,MASKSRC,MASKDST,PC} +#define NEWHOWTO( FUNCTION, NAME,SIZE,REL,IN) HOWTO(0,0,SIZE,0,REL,0,complain_overflow_dont,FUNCTION, NAME,false,0,0,IN) + +#define HOWTO_PREPARE(relocation, symbol) \ + { \ + if (symbol != (asymbol *)NULL) { \ + if (bfd_is_com_section (symbol->section)) { \ + relocation = 0; \ + } \ + else { \ + relocation = symbol->value; \ + } \ + } \ +} +int +bfd_get_reloc_size PARAMS ((const reloc_howto_type *)); + +typedef unsigned char bfd_byte; + +typedef struct relent_chain { + arelent relent; + struct relent_chain *next; +} arelent_chain; +bfd_reloc_status_type + +bfd_perform_relocation + PARAMS ((bfd *abfd, + arelent *reloc_entry, + PTR data, + asection *input_section, + bfd *output_bfd, + char **error_message)); + +typedef enum bfd_reloc_code_real +{ + /* Basic absolute relocations */ + BFD_RELOC_64, + BFD_RELOC_32, + BFD_RELOC_26, + BFD_RELOC_16, + BFD_RELOC_14, + BFD_RELOC_8, + + /* PC-relative relocations */ + BFD_RELOC_64_PCREL, + BFD_RELOC_32_PCREL, + BFD_RELOC_24_PCREL, /* used by i960 */ + BFD_RELOC_16_PCREL, + BFD_RELOC_8_PCREL, + + /* Linkage-table relative */ + BFD_RELOC_32_BASEREL, + BFD_RELOC_16_BASEREL, + BFD_RELOC_8_BASEREL, + + /* The type of reloc used to build a contructor table - at the moment + probably a 32 bit wide abs address, but the cpu can choose. */ + BFD_RELOC_CTOR, + + /* 8 bits wide, but used to form an address like 0xffnn */ + BFD_RELOC_8_FFnn, + + /* 32-bit pc-relative, shifted right 2 bits (i.e., 30-bit + word displacement, e.g. for SPARC) */ + BFD_RELOC_32_PCREL_S2, + /* signed 16-bit pc-relative, shifted right 2 bits (e.g. for MIPS) */ + BFD_RELOC_16_PCREL_S2, + /* this is used on the Alpha */ + BFD_RELOC_23_PCREL_S2, + + /* High 22 bits of 32-bit value, placed into lower 22 bits of + target word; simple reloc. */ + BFD_RELOC_HI22, + /* Low 10 bits. */ + BFD_RELOC_LO10, + + /* For systems that allocate a Global Pointer register, these are + displacements off that register. These relocation types are + handled specially, because the value the register will have is + decided relatively late. */ + BFD_RELOC_GPREL16, + BFD_RELOC_GPREL32, + + /* Reloc types used for i960/b.out. */ + BFD_RELOC_I960_CALLJ, + + /* now for the sparc/elf codes */ + BFD_RELOC_NONE, /* actually used */ + BFD_RELOC_SPARC_WDISP22, + BFD_RELOC_SPARC22, + BFD_RELOC_SPARC13, + BFD_RELOC_SPARC_GOT10, + BFD_RELOC_SPARC_GOT13, + BFD_RELOC_SPARC_GOT22, + BFD_RELOC_SPARC_PC10, + BFD_RELOC_SPARC_PC22, + BFD_RELOC_SPARC_WPLT30, + BFD_RELOC_SPARC_COPY, + BFD_RELOC_SPARC_GLOB_DAT, + BFD_RELOC_SPARC_JMP_SLOT, + BFD_RELOC_SPARC_RELATIVE, + BFD_RELOC_SPARC_UA32, + + /* these are a.out specific? */ + BFD_RELOC_SPARC_BASE13, + BFD_RELOC_SPARC_BASE22, + + + /* Alpha ECOFF relocations. Some of these treat the symbol or "addend" + in some special way. */ + /* For GPDISP_HI16 ("gpdisp") relocations, the symbol is ignored when + writing; when reading, it will be the absolute section symbol. The + addend is the displacement in bytes of the "lda" instruction from + the "ldah" instruction (which is at the address of this reloc). */ + BFD_RELOC_ALPHA_GPDISP_HI16, + /* For GPDISP_LO16 ("ignore") relocations, the symbol is handled as + with GPDISP_HI16 relocs. The addend is ignored when writing the + relocations out, and is filled in with the file's GP value on + reading, for convenience. */ + BFD_RELOC_ALPHA_GPDISP_LO16, + + /* The Alpha LITERAL/LITUSE relocs are produced by a symbol reference; + the assembler turns it into a LDQ instruction to load the address of + the symbol, and then fills in a register in the real instruction. + + The LITERAL reloc, at the LDQ instruction, refers to the .lita + section symbol. The addend is ignored when writing, but is filled + in with the file's GP value on reading, for convenience, as with the + GPDISP_LO16 reloc. + + The LITUSE reloc, on the instruction using the loaded address, gives + information to the linker that it might be able to use to optimize + away some literal section references. The symbol is ignored (read + as the absolute section symbol), and the "addend" indicates the type + of instruction using the register: + 1 - "memory" fmt insn + 2 - byte-manipulation (byte offset reg) + 3 - jsr (target of branch) + + The GNU linker currently doesn't do any of this optimizing. */ + BFD_RELOC_ALPHA_LITERAL, + BFD_RELOC_ALPHA_LITUSE, + + /* The HINT relocation indicates a value that should be filled into the + "hint" field of a jmp/jsr/ret instruction, for possible branch- + prediction logic which may be provided on some processors. */ + BFD_RELOC_ALPHA_HINT, + + /* Bits 27..2 of the relocation address shifted right 2 bits; + simple reloc otherwise. */ + BFD_RELOC_MIPS_JMP, + + /* High 16 bits of 32-bit value; simple reloc. */ + BFD_RELOC_HI16, + /* High 16 bits of 32-bit value but the low 16 bits will be sign + extended and added to form the final result. If the low 16 + bits form a negative number, we need to add one to the high value + to compensate for the borrow when the low bits are added. */ + BFD_RELOC_HI16_S, + /* Low 16 bits. */ + BFD_RELOC_LO16, + /* Like BFD_RELOC_HI16_S, but PC relative. */ + BFD_RELOC_PCREL_HI16_S, + /* Like BFD_RELOC_LO16, but PC relative. */ + BFD_RELOC_PCREL_LO16, + + /* relocation relative to the global pointer. */ +#define BFD_RELOC_MIPS_GPREL BFD_RELOC_GPREL16 + + /* Relocation against a MIPS literal section. */ + BFD_RELOC_MIPS_LITERAL, + + /* MIPS ELF relocations. */ + BFD_RELOC_MIPS_GOT16, + BFD_RELOC_MIPS_CALL16, +#define BFD_RELOC_MIPS_GPREL32 BFD_RELOC_GPREL32 + + /* These are, so far, specific to HPPA processors. I'm not sure that some + don't duplicate other reloc types, such as BFD_RELOC_32 and _32_PCREL. + Also, many more were in the list I got that don't fit in well in the + model BFD uses, so I've omitted them for now. If we do make this reloc + type get used for code that really does implement the funky reloc types, + they'll have to be added to this list. */ + BFD_RELOC_HPPA_32, + BFD_RELOC_HPPA_11, + BFD_RELOC_HPPA_14, + BFD_RELOC_HPPA_17, + + BFD_RELOC_HPPA_L21, + BFD_RELOC_HPPA_R11, + BFD_RELOC_HPPA_R14, + BFD_RELOC_HPPA_R17, + BFD_RELOC_HPPA_LS21, + BFD_RELOC_HPPA_RS11, + BFD_RELOC_HPPA_RS14, + BFD_RELOC_HPPA_RS17, + BFD_RELOC_HPPA_LD21, + BFD_RELOC_HPPA_RD11, + BFD_RELOC_HPPA_RD14, + BFD_RELOC_HPPA_RD17, + BFD_RELOC_HPPA_LR21, + BFD_RELOC_HPPA_RR14, + BFD_RELOC_HPPA_RR17, + + BFD_RELOC_HPPA_GOTOFF_11, + BFD_RELOC_HPPA_GOTOFF_14, + BFD_RELOC_HPPA_GOTOFF_L21, + BFD_RELOC_HPPA_GOTOFF_R11, + BFD_RELOC_HPPA_GOTOFF_R14, + BFD_RELOC_HPPA_GOTOFF_LS21, + BFD_RELOC_HPPA_GOTOFF_RS11, + BFD_RELOC_HPPA_GOTOFF_RS14, + BFD_RELOC_HPPA_GOTOFF_LD21, + BFD_RELOC_HPPA_GOTOFF_RD11, + BFD_RELOC_HPPA_GOTOFF_RD14, + BFD_RELOC_HPPA_GOTOFF_LR21, + BFD_RELOC_HPPA_GOTOFF_RR14, + + BFD_RELOC_HPPA_DLT_32, + BFD_RELOC_HPPA_DLT_11, + BFD_RELOC_HPPA_DLT_14, + BFD_RELOC_HPPA_DLT_L21, + BFD_RELOC_HPPA_DLT_R11, + BFD_RELOC_HPPA_DLT_R14, + + BFD_RELOC_HPPA_ABS_CALL_11, + BFD_RELOC_HPPA_ABS_CALL_14, + BFD_RELOC_HPPA_ABS_CALL_17, + BFD_RELOC_HPPA_ABS_CALL_L21, + BFD_RELOC_HPPA_ABS_CALL_R11, + BFD_RELOC_HPPA_ABS_CALL_R14, + BFD_RELOC_HPPA_ABS_CALL_R17, + BFD_RELOC_HPPA_ABS_CALL_LS21, + BFD_RELOC_HPPA_ABS_CALL_RS11, + BFD_RELOC_HPPA_ABS_CALL_RS14, + BFD_RELOC_HPPA_ABS_CALL_RS17, + BFD_RELOC_HPPA_ABS_CALL_LD21, + BFD_RELOC_HPPA_ABS_CALL_RD11, + BFD_RELOC_HPPA_ABS_CALL_RD14, + BFD_RELOC_HPPA_ABS_CALL_RD17, + BFD_RELOC_HPPA_ABS_CALL_LR21, + BFD_RELOC_HPPA_ABS_CALL_RR14, + BFD_RELOC_HPPA_ABS_CALL_RR17, + + BFD_RELOC_HPPA_PCREL_CALL_11, + BFD_RELOC_HPPA_PCREL_CALL_12, + BFD_RELOC_HPPA_PCREL_CALL_14, + BFD_RELOC_HPPA_PCREL_CALL_17, + BFD_RELOC_HPPA_PCREL_CALL_L21, + BFD_RELOC_HPPA_PCREL_CALL_R11, + BFD_RELOC_HPPA_PCREL_CALL_R14, + BFD_RELOC_HPPA_PCREL_CALL_R17, + BFD_RELOC_HPPA_PCREL_CALL_LS21, + BFD_RELOC_HPPA_PCREL_CALL_RS11, + BFD_RELOC_HPPA_PCREL_CALL_RS14, + BFD_RELOC_HPPA_PCREL_CALL_RS17, + BFD_RELOC_HPPA_PCREL_CALL_LD21, + BFD_RELOC_HPPA_PCREL_CALL_RD11, + BFD_RELOC_HPPA_PCREL_CALL_RD14, + BFD_RELOC_HPPA_PCREL_CALL_RD17, + BFD_RELOC_HPPA_PCREL_CALL_LR21, + BFD_RELOC_HPPA_PCREL_CALL_RR14, + BFD_RELOC_HPPA_PCREL_CALL_RR17, + + BFD_RELOC_HPPA_PLABEL_32, + BFD_RELOC_HPPA_PLABEL_11, + BFD_RELOC_HPPA_PLABEL_14, + BFD_RELOC_HPPA_PLABEL_L21, + BFD_RELOC_HPPA_PLABEL_R11, + BFD_RELOC_HPPA_PLABEL_R14, + + BFD_RELOC_HPPA_UNWIND_ENTRY, + BFD_RELOC_HPPA_UNWIND_ENTRIES, + + /* i386/elf relocations */ + BFD_RELOC_386_GOT32, + BFD_RELOC_386_PLT32, + BFD_RELOC_386_COPY, + BFD_RELOC_386_GLOB_DAT, + BFD_RELOC_386_JUMP_SLOT, + BFD_RELOC_386_RELATIVE, + BFD_RELOC_386_GOTOFF, + BFD_RELOC_386_GOTPC, + + /* PowerPC/POWER (RS/6000) relocs. */ + /* 26 bit relative branch. Low two bits must be zero. High 24 + bits installed in bits 6 through 29 of instruction. */ + BFD_RELOC_PPC_B26, + /* 26 bit absolute branch, like BFD_RELOC_PPC_B26 but absolute. */ + BFD_RELOC_PPC_BA26, + /* 16 bit TOC relative reference. */ + BFD_RELOC_PPC_TOC16, + + /* this must be the highest numeric value */ + BFD_RELOC_UNUSED + } bfd_reloc_code_real_type; +const struct reloc_howto_struct * + +bfd_reloc_type_lookup PARAMS ((bfd *abfd, bfd_reloc_code_real_type code)); + + +typedef struct symbol_cache_entry +{ + /* A pointer to the BFD which owns the symbol. This information + is necessary so that a back end can work out what additional + information (invisible to the application writer) is carried + with the symbol. + + This field is *almost* redundant, since you can use section->owner + instead, except that some symbols point to the global sections + bfd_{abs,com,und}_section. This could be fixed by making + these globals be per-bfd (or per-target-flavor). FIXME. */ + + struct _bfd *the_bfd; /* Use bfd_asymbol_bfd(sym) to access this field. */ + + /* The text of the symbol. The name is left alone, and not copied; the + application may not alter it. */ + CONST char *name; + + /* The value of the symbol. This really should be a union of a + numeric value with a pointer, since some flags indicate that + a pointer to another symbol is stored here. */ + symvalue value; + + /* Attributes of a symbol: */ + +#define BSF_NO_FLAGS 0x00 + + /* The symbol has local scope; <> in <>. The value + is the offset into the section of the data. */ +#define BSF_LOCAL 0x01 + + /* The symbol has global scope; initialized data in <>. The + value is the offset into the section of the data. */ +#define BSF_GLOBAL 0x02 + + /* The symbol has global scope and is exported. The value is + the offset into the section of the data. */ +#define BSF_EXPORT BSF_GLOBAL /* no real difference */ + + /* A normal C symbol would be one of: + <>, <>, <> or + <> */ + + /* The symbol is a debugging record. The value has an arbitary + meaning. */ +#define BSF_DEBUGGING 0x08 + + /* The symbol denotes a function entry point. Used in ELF, + perhaps others someday. */ +#define BSF_FUNCTION 0x10 + + /* Used by the linker. */ +#define BSF_KEEP 0x20 +#define BSF_KEEP_G 0x40 + + /* A weak global symbol, overridable without warnings by + a regular global symbol of the same name. */ +#define BSF_WEAK 0x80 + + /* This symbol was created to point to a section, e.g. ELF's + STT_SECTION symbols. */ +#define BSF_SECTION_SYM 0x100 + + /* The symbol used to be a common symbol, but now it is + allocated. */ +#define BSF_OLD_COMMON 0x200 + + /* The default value for common data. */ +#define BFD_FORT_COMM_DEFAULT_VALUE 0 + + /* In some files the type of a symbol sometimes alters its + location in an output file - ie in coff a <> symbol + which is also <> symbol appears where it was + declared and not at the end of a section. This bit is set + by the target BFD part to convey this information. */ + +#define BSF_NOT_AT_END 0x400 + + /* Signal that the symbol is the label of constructor section. */ +#define BSF_CONSTRUCTOR 0x800 + + /* Signal that the symbol is a warning symbol. If the symbol + is a warning symbol, then the value field (I know this is + tacky) will point to the asymbol which when referenced will + cause the warning. */ +#define BSF_WARNING 0x1000 + + /* Signal that the symbol is indirect. The value of the symbol + is a pointer to an undefined asymbol which contains the + name to use instead. */ +#define BSF_INDIRECT 0x2000 + + /* BSF_FILE marks symbols that contain a file name. This is used + for ELF STT_FILE symbols. */ +#define BSF_FILE 0x4000 + + /* Symbol is from dynamic linking information. */ +#define BSF_DYNAMIC 0x8000 + + flagword flags; + + /* A pointer to the section to which this symbol is + relative. This will always be non NULL, there are special + sections for undefined and absolute symbols */ + struct sec *section; + + /* Back end special data. This is being phased out in favour + of making this a union. */ + PTR udata; + +} asymbol; +#define bfd_get_symtab_upper_bound(abfd) \ + BFD_SEND (abfd, _bfd_get_symtab_upper_bound, (abfd)) +boolean +bfd_is_local_label PARAMS ((bfd *abfd, asymbol *sym)); + +#define bfd_is_local_label(abfd, sym) \ + BFD_SEND (abfd, _bfd_is_local_label,(abfd, sym)) +#define bfd_canonicalize_symtab(abfd, location) \ + BFD_SEND (abfd, _bfd_canonicalize_symtab,\ + (abfd, location)) +boolean +bfd_set_symtab PARAMS ((bfd *abfd, asymbol **location, unsigned int count)); + +void +bfd_print_symbol_vandf PARAMS ((PTR file, asymbol *symbol)); + +#define bfd_make_empty_symbol(abfd) \ + BFD_SEND (abfd, _bfd_make_empty_symbol, (abfd)) +#define bfd_make_debug_symbol(abfd,ptr,size) \ + BFD_SEND (abfd, _bfd_make_debug_symbol, (abfd, ptr, size)) +int +bfd_decode_symclass PARAMS ((asymbol *symbol)); + +void +bfd_symbol_info PARAMS ((asymbol *symbol, symbol_info *ret)); + +struct _bfd +{ + /* The filename the application opened the BFD with. */ + CONST char *filename; + + /* A pointer to the target jump table. */ + struct bfd_target *xvec; + + /* To avoid dragging too many header files into every file that + includes `<>', IOSTREAM has been declared as a "char + *", and MTIME as a "long". Their correct types, to which they + are cast when used, are "FILE *" and "time_t". The iostream + is the result of an fopen on the filename. */ + char *iostream; + + /* Is the file descriptor being cached? That is, can it be closed as + needed, and re-opened when accessed later? */ + + boolean cacheable; + + /* Marks whether there was a default target specified when the + BFD was opened. This is used to select which matching algorithm + to use to choose the back end. */ + + boolean target_defaulted; + + /* The caching routines use these to maintain a + least-recently-used list of BFDs */ + + struct _bfd *lru_prev, *lru_next; + + /* When a file is closed by the caching routines, BFD retains + state information on the file here: */ + + file_ptr where; + + /* and here: (``once'' means at least once) */ + + boolean opened_once; + + /* Set if we have a locally maintained mtime value, rather than + getting it from the file each time: */ + + boolean mtime_set; + + /* File modified time, if mtime_set is true: */ + + long mtime; + + /* Reserved for an unimplemented file locking extension.*/ + + int ifd; + + /* The format which belongs to the BFD. (object, core, etc.) */ + + bfd_format format; + + /* The direction the BFD was opened with*/ + + enum bfd_direction {no_direction = 0, + read_direction = 1, + write_direction = 2, + both_direction = 3} direction; + + /* Format_specific flags*/ + + flagword flags; + + /* Currently my_archive is tested before adding origin to + anything. I believe that this can become always an add of + origin, with origin set to 0 for non archive files. */ + + file_ptr origin; + + /* Remember when output has begun, to stop strange things + from happening. */ + boolean output_has_begun; + + /* Pointer to linked list of sections*/ + struct sec *sections; + + /* The number of sections */ + unsigned int section_count; + + /* Stuff only useful for object files: + The start address. */ + bfd_vma start_address; + + /* Used for input and output*/ + unsigned int symcount; + + /* Symbol table for output BFD (with symcount entries) */ + struct symbol_cache_entry **outsymbols; + + /* Pointer to structure which contains architecture information*/ + struct bfd_arch_info *arch_info; + + /* Stuff only useful for archives:*/ + PTR arelt_data; + struct _bfd *my_archive; /* The containing archive BFD. */ + struct _bfd *next; /* The next BFD in the archive. */ + struct _bfd *archive_head; /* The first BFD in the archive. */ + boolean has_armap; + + /* A chain of BFD structures involved in a link. */ + struct _bfd *link_next; + + /* A field used by _bfd_generic_link_add_archive_symbols. This will + be used only for archive elements. */ + int archive_pass; + + /* Used by the back end to hold private data. */ + + union + { + struct aout_data_struct *aout_data; + struct artdata *aout_ar_data; + struct _oasys_data *oasys_obj_data; + struct _oasys_ar_data *oasys_ar_data; + struct coff_tdata *coff_obj_data; + struct ecoff_tdata *ecoff_obj_data; + struct ieee_data_struct *ieee_data; + struct ieee_ar_data_struct *ieee_ar_data; + struct srec_data_struct *srec_data; + struct tekhex_data_struct *tekhex_data; + struct elf_obj_tdata *elf_obj_data; + struct nlm_obj_tdata *nlm_obj_data; + struct bout_data_struct *bout_data; + struct sun_core_struct *sun_core_data; + struct trad_core_struct *trad_core_data; + struct som_data_struct *som_data; + struct hpux_core_struct *hpux_core_data; + struct hppabsd_core_struct *hppabsd_core_data; + struct sgi_core_struct *sgi_core_data; + struct lynx_core_struct *lynx_core_data; + struct osf_core_struct *osf_core_data; + struct cisco_core_struct *cisco_core_data; + PTR any; + } tdata; + + /* Used by the application to hold private data*/ + PTR usrdata; + + /* Where all the allocated stuff under this BFD goes */ + struct obstack memory; +}; + +typedef enum bfd_error +{ + bfd_error_no_error = 0, + bfd_error_system_call, + bfd_error_invalid_target, + bfd_error_wrong_format, + bfd_error_invalid_operation, + bfd_error_no_memory, + bfd_error_no_symbols, + bfd_error_no_more_archived_files, + bfd_error_malformed_archive, + bfd_error_file_not_recognized, + bfd_error_file_ambiguously_recognized, + bfd_error_no_contents, + bfd_error_nonrepresentable_section, + bfd_error_no_debug_section, + bfd_error_bad_value, + bfd_error_file_truncated, + bfd_error_invalid_error_code +} bfd_error_type; + +bfd_error_type +bfd_get_error PARAMS ((void)); + +void +bfd_set_error PARAMS ((bfd_error_type error_tag)); + +CONST char * +bfd_errmsg PARAMS ((bfd_error_type error_tag)); + +void +bfd_perror PARAMS ((CONST char *message)); + +long +bfd_get_reloc_upper_bound PARAMS ((bfd *abfd, asection *sect)); + +long +bfd_canonicalize_reloc + PARAMS ((bfd *abfd, + asection *sec, + arelent **loc, + asymbol **syms)); + +void +bfd_set_reloc + PARAMS ((bfd *abfd, asection *sec, arelent **rel, unsigned int count) + + ); + +boolean +bfd_set_file_flags PARAMS ((bfd *abfd, flagword flags)); + +boolean +bfd_set_start_address PARAMS ((bfd *abfd, bfd_vma vma)); + +long +bfd_get_mtime PARAMS ((bfd *abfd)); + +long +bfd_get_size PARAMS ((bfd *abfd)); + +int +bfd_get_gp_size PARAMS ((bfd *abfd)); + +void +bfd_set_gp_size PARAMS ((bfd *abfd, int i)); + +bfd_vma +bfd_scan_vma PARAMS ((CONST char *string, CONST char **end, int base)); + +boolean +bfd_copy_private_bfd_data PARAMS ((bfd *ibfd, bfd *obfd)); + +#define bfd_copy_private_bfd_data(ibfd, obfd) \ + BFD_SEND (ibfd, _bfd_copy_private_bfd_data, \ + (ibfd, obfd)) +#define bfd_sizeof_headers(abfd, reloc) \ + BFD_SEND (abfd, _bfd_sizeof_headers, (abfd, reloc)) + +#define bfd_find_nearest_line(abfd, sec, syms, off, file, func, line) \ + BFD_SEND (abfd, _bfd_find_nearest_line, (abfd, sec, syms, off, file, func, line)) + + /* Do these three do anything useful at all, for any back end? */ +#define bfd_debug_info_start(abfd) \ + BFD_SEND (abfd, _bfd_debug_info_start, (abfd)) + +#define bfd_debug_info_end(abfd) \ + BFD_SEND (abfd, _bfd_debug_info_end, (abfd)) + +#define bfd_debug_info_accumulate(abfd, section) \ + BFD_SEND (abfd, _bfd_debug_info_accumulate, (abfd, section)) + + +#define bfd_stat_arch_elt(abfd, stat) \ + BFD_SEND (abfd, _bfd_stat_arch_elt,(abfd, stat)) + +#define bfd_set_arch_mach(abfd, arch, mach)\ + BFD_SEND ( abfd, _bfd_set_arch_mach, (abfd, arch, mach)) + +#define bfd_get_relocated_section_contents(abfd, link_info, link_order, data, relocateable, symbols) \ + BFD_SEND (abfd, _bfd_get_relocated_section_contents, \ + (abfd, link_info, link_order, data, relocateable, symbols)) + +#define bfd_relax_section(abfd, section, link_info, again) \ + BFD_SEND (abfd, _bfd_relax_section, (abfd, section, link_info, again)) + +#define bfd_link_hash_table_create(abfd) \ + BFD_SEND (abfd, _bfd_link_hash_table_create, (abfd)) + +#define bfd_link_add_symbols(abfd, info) \ + BFD_SEND (abfd, _bfd_link_add_symbols, (abfd, info)) + +#define bfd_final_link(abfd, info) \ + BFD_SEND (abfd, _bfd_final_link, (abfd, info)) + +#define bfd_free_cached_info(abfd) \ + BFD_SEND (abfd, _bfd_free_cached_info, (abfd)) + +#define bfd_get_dynamic_symtab_upper_bound(abfd) \ + BFD_SEND (abfd, _bfd_get_dynamic_symtab_upper_bound, (abfd)) + +#define bfd_canonicalize_dynamic_symtab(abfd, asymbols) \ + BFD_SEND (abfd, _bfd_canonicalize_dynamic_symtab, (abfd, asymbols)) + +#define bfd_get_dynamic_reloc_upper_bound(abfd) \ + BFD_SEND (abfd, _bfd_get_dynamic_reloc_upper_bound, (abfd)) + +#define bfd_canonicalize_dynamic_reloc(abfd, arels, asyms) \ + BFD_SEND (abfd, _bfd_canonicalize_dynamic_reloc, (abfd, arels, asyms)) + +symindex +bfd_get_next_mapent PARAMS ((bfd *abfd, symindex previous, carsym **sym)); + +boolean +bfd_set_archive_head PARAMS ((bfd *output, bfd *new_head)); + +bfd * +bfd_get_elt_at_index PARAMS ((bfd *archive, int index)); + +bfd * +bfd_openr_next_archived_file PARAMS ((bfd *archive, bfd *previous)); + +CONST char * +bfd_core_file_failing_command PARAMS ((bfd *abfd)); + +int +bfd_core_file_failing_signal PARAMS ((bfd *abfd)); + +boolean +core_file_matches_executable_p + PARAMS ((bfd *core_bfd, bfd *exec_bfd)); + +#define BFD_SEND(bfd, message, arglist) \ + ((*((bfd)->xvec->message)) arglist) + +#ifdef DEBUG_BFD_SEND +#undef BFD_SEND +#define BFD_SEND(bfd, message, arglist) \ + (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \ + ((*((bfd)->xvec->message)) arglist) : \ + (bfd_assert (__FILE__,__LINE__), NULL)) +#endif +#define BFD_SEND_FMT(bfd, message, arglist) \ + (((bfd)->xvec->message[(int)((bfd)->format)]) arglist) + +#ifdef DEBUG_BFD_SEND +#undef BFD_SEND_FMT +#define BFD_SEND_FMT(bfd, message, arglist) \ + (((bfd) && (bfd)->xvec && (bfd)->xvec->message) ? \ + (((bfd)->xvec->message[(int)((bfd)->format)]) arglist) : \ + (bfd_assert (__FILE__,__LINE__), NULL)) +#endif +enum bfd_flavour { + bfd_target_unknown_flavour, + bfd_target_aout_flavour, + bfd_target_coff_flavour, + bfd_target_ecoff_flavour, + bfd_target_elf_flavour, + bfd_target_ieee_flavour, + bfd_target_nlm_flavour, + bfd_target_oasys_flavour, + bfd_target_tekhex_flavour, + bfd_target_srec_flavour, + bfd_target_som_flavour, + bfd_target_os9k_flavour}; + + /* Forward declaration. */ +typedef struct bfd_link_info _bfd_link_info; + +typedef struct bfd_target +{ + char *name; + enum bfd_flavour flavour; + boolean byteorder_big_p; + boolean header_byteorder_big_p; + flagword object_flags; + flagword section_flags; + char symbol_leading_char; + char ar_pad_char; + unsigned short ar_max_namelen; + unsigned int align_power_min; + bfd_vma (*bfd_getx64) PARAMS ((const bfd_byte *)); + bfd_signed_vma (*bfd_getx_signed_64) PARAMS ((const bfd_byte *)); + void (*bfd_putx64) PARAMS ((bfd_vma, bfd_byte *)); + bfd_vma (*bfd_getx32) PARAMS ((const bfd_byte *)); + bfd_signed_vma (*bfd_getx_signed_32) PARAMS ((const bfd_byte *)); + void (*bfd_putx32) PARAMS ((bfd_vma, bfd_byte *)); + bfd_vma (*bfd_getx16) PARAMS ((const bfd_byte *)); + bfd_signed_vma (*bfd_getx_signed_16) PARAMS ((const bfd_byte *)); + void (*bfd_putx16) PARAMS ((bfd_vma, bfd_byte *)); + bfd_vma (*bfd_h_getx64) PARAMS ((const bfd_byte *)); + bfd_signed_vma (*bfd_h_getx_signed_64) PARAMS ((const bfd_byte *)); + void (*bfd_h_putx64) PARAMS ((bfd_vma, bfd_byte *)); + bfd_vma (*bfd_h_getx32) PARAMS ((const bfd_byte *)); + bfd_signed_vma (*bfd_h_getx_signed_32) PARAMS ((const bfd_byte *)); + void (*bfd_h_putx32) PARAMS ((bfd_vma, bfd_byte *)); + bfd_vma (*bfd_h_getx16) PARAMS ((const bfd_byte *)); + bfd_signed_vma (*bfd_h_getx_signed_16) PARAMS ((const bfd_byte *)); + void (*bfd_h_putx16) PARAMS ((bfd_vma, bfd_byte *)); + struct bfd_target * (*_bfd_check_format[bfd_type_end]) PARAMS ((bfd *)); + boolean (*_bfd_set_format[bfd_type_end]) PARAMS ((bfd *)); + boolean (*_bfd_write_contents[bfd_type_end]) PARAMS ((bfd *)); + + /* Generic entry points. */ +#define BFD_JUMP_TABLE_GENERIC(NAME)\ +CAT(NAME,_close_and_cleanup),\ +CAT(NAME,_bfd_free_cached_info),\ +CAT(NAME,_new_section_hook),\ +CAT(NAME,_get_section_contents) + /* Called when the BFD is being closed to do any necessary cleanup. */ + boolean (*_close_and_cleanup) PARAMS ((bfd *)); + /* Ask the BFD to free all cached information. */ + boolean (*_bfd_free_cached_info) PARAMS ((bfd *)); + /* Called when a new section is created. */ + boolean (*_new_section_hook) PARAMS ((bfd *, sec_ptr)); + /* Read the contents of a section. */ + boolean (*_bfd_get_section_contents) PARAMS ((bfd *, sec_ptr, PTR, + file_ptr, bfd_size_type)); + + /* Entry points to copy private data. */ +#define BFD_JUMP_TABLE_COPY(NAME)\ +CAT(NAME,_bfd_copy_private_bfd_data),\ +CAT(NAME,_bfd_copy_private_section_data) + /* Called to copy BFD general private data from one object file + to another. */ + boolean (*_bfd_copy_private_bfd_data) PARAMS ((bfd *, bfd *)); + /* Called to copy BFD private section data from one object file + to another. */ + boolean (*_bfd_copy_private_section_data) PARAMS ((bfd *, sec_ptr, + bfd *, sec_ptr)); + + /* Core file entry points. */ +#define BFD_JUMP_TABLE_CORE(NAME)\ +CAT(NAME,_core_file_failing_command),\ +CAT(NAME,_core_file_failing_signal),\ +CAT(NAME,_core_file_matches_executable_p) + char * (*_core_file_failing_command) PARAMS ((bfd *)); + int (*_core_file_failing_signal) PARAMS ((bfd *)); + boolean (*_core_file_matches_executable_p) PARAMS ((bfd *, bfd *)); + + /* Archive entry points. */ +#define BFD_JUMP_TABLE_ARCHIVE(NAME)\ +CAT(NAME,_slurp_armap),\ +CAT(NAME,_slurp_extended_name_table),\ +CAT(NAME,_truncate_arname),\ +CAT(NAME,_write_armap),\ +CAT(NAME,_openr_next_archived_file),\ +CAT(NAME,_generic_stat_arch_elt) + boolean (*_bfd_slurp_armap) PARAMS ((bfd *)); + boolean (*_bfd_slurp_extended_name_table) PARAMS ((bfd *)); + void (*_bfd_truncate_arname) PARAMS ((bfd *, CONST char *, char *)); + boolean (*write_armap) PARAMS ((bfd *arch, + unsigned int elength, + struct orl *map, + unsigned int orl_count, + int stridx)); + bfd * (*openr_next_archived_file) PARAMS ((bfd *arch, bfd *prev)); + int (*_bfd_stat_arch_elt) PARAMS ((bfd *, struct stat *)); + + /* Entry points used for symbols. */ +#define BFD_JUMP_TABLE_SYMBOLS(NAME)\ +CAT(NAME,_get_symtab_upper_bound),\ +CAT(NAME,_get_symtab),\ +CAT(NAME,_make_empty_symbol),\ +CAT(NAME,_print_symbol),\ +CAT(NAME,_get_symbol_info),\ +CAT(NAME,_bfd_is_local_label),\ +CAT(NAME,_get_lineno),\ +CAT(NAME,_find_nearest_line),\ +CAT(NAME,_bfd_make_debug_symbol) + long (*_bfd_get_symtab_upper_bound) PARAMS ((bfd *)); + long (*_bfd_canonicalize_symtab) PARAMS ((bfd *, + struct symbol_cache_entry **)); + struct symbol_cache_entry * + (*_bfd_make_empty_symbol) PARAMS ((bfd *)); + void (*_bfd_print_symbol) PARAMS ((bfd *, PTR, + struct symbol_cache_entry *, + bfd_print_symbol_type)); +#define bfd_print_symbol(b,p,s,e) BFD_SEND(b, _bfd_print_symbol, (b,p,s,e)) + void (*_bfd_get_symbol_info) PARAMS ((bfd *, + struct symbol_cache_entry *, + symbol_info *)); +#define bfd_get_symbol_info(b,p,e) BFD_SEND(b, _bfd_get_symbol_info, (b,p,e)) + boolean (*_bfd_is_local_label) PARAMS ((bfd *, asymbol *)); + + alent * (*_get_lineno) PARAMS ((bfd *, struct symbol_cache_entry *)); + boolean (*_bfd_find_nearest_line) PARAMS ((bfd *abfd, + struct sec *section, struct symbol_cache_entry **symbols, + bfd_vma offset, CONST char **file, CONST char **func, + unsigned int *line)); + /* Back-door to allow format-aware applications to create debug symbols + while using BFD for everything else. Currently used by the assembler + when creating COFF files. */ + asymbol * (*_bfd_make_debug_symbol) PARAMS (( + bfd *abfd, + void *ptr, + unsigned long size)); + + /* Routines for relocs. */ +#define BFD_JUMP_TABLE_RELOCS(NAME)\ +CAT(NAME,_get_reloc_upper_bound),\ +CAT(NAME,_canonicalize_reloc),\ +CAT(NAME,_bfd_reloc_type_lookup) + long (*_get_reloc_upper_bound) PARAMS ((bfd *, sec_ptr)); + long (*_bfd_canonicalize_reloc) PARAMS ((bfd *, sec_ptr, arelent **, + struct symbol_cache_entry **)); + /* See documentation on reloc types. */ + CONST struct reloc_howto_struct * + (*reloc_type_lookup) PARAMS ((bfd *abfd, + bfd_reloc_code_real_type code)); + + /* Routines used when writing an object file. */ +#define BFD_JUMP_TABLE_WRITE(NAME)\ +CAT(NAME,_set_arch_mach),\ +CAT(NAME,_set_section_contents) + boolean (*_bfd_set_arch_mach) PARAMS ((bfd *, enum bfd_architecture, + unsigned long)); + boolean (*_bfd_set_section_contents) PARAMS ((bfd *, sec_ptr, PTR, + file_ptr, bfd_size_type)); + + /* Routines used by the linker. */ +#define BFD_JUMP_TABLE_LINK(NAME)\ +CAT(NAME,_sizeof_headers),\ +CAT(NAME,_bfd_get_relocated_section_contents),\ +CAT(NAME,_bfd_relax_section),\ +CAT(NAME,_bfd_link_hash_table_create),\ +CAT(NAME,_bfd_link_add_symbols),\ +CAT(NAME,_bfd_final_link) + int (*_bfd_sizeof_headers) PARAMS ((bfd *, boolean)); + bfd_byte * (*_bfd_get_relocated_section_contents) PARAMS ((bfd *, + struct bfd_link_info *, struct bfd_link_order *, + bfd_byte *data, boolean relocateable, + struct symbol_cache_entry **)); + + boolean (*_bfd_relax_section) PARAMS ((bfd *, struct sec *, + struct bfd_link_info *, boolean *again)); + + /* Create a hash table for the linker. Different backends store + different information in this table. */ + struct bfd_link_hash_table *(*_bfd_link_hash_table_create) PARAMS ((bfd *)); + + /* Add symbols from this object file into the hash table. */ + boolean (*_bfd_link_add_symbols) PARAMS ((bfd *, struct bfd_link_info *)); + + /* Do a link based on the link_order structures attached to each + section of the BFD. */ + boolean (*_bfd_final_link) PARAMS ((bfd *, struct bfd_link_info *)); + + /* Routines to handle dynamic symbols and relocs. */ +#define BFD_JUMP_TABLE_DYNAMIC(NAME)\ +CAT(NAME,_get_dynamic_symtab_upper_bound),\ +CAT(NAME,_canonicalize_dynamic_symtab),\ +CAT(NAME,_get_dynamic_reloc_upper_bound),\ +CAT(NAME,_canonicalize_dynamic_reloc) + /* Get the amount of memory required to hold the dynamic symbols. */ + long (*_bfd_get_dynamic_symtab_upper_bound) PARAMS ((bfd *)); + /* Read in the dynamic symbols. */ + long (*_bfd_canonicalize_dynamic_symtab) + PARAMS ((bfd *, struct symbol_cache_entry **)); + /* Get the amount of memory required to hold the dynamic relocs. */ + long (*_bfd_get_dynamic_reloc_upper_bound) PARAMS ((bfd *)); + /* Read in the dynamic relocs. */ + long (*_bfd_canonicalize_dynamic_reloc) + PARAMS ((bfd *, arelent **, struct symbol_cache_entry **)); + + PTR backend_data; +} bfd_target; +bfd_target * +bfd_find_target PARAMS ((CONST char *target_name, bfd *abfd)); + +CONST char ** +bfd_target_list PARAMS ((void)); + +boolean +bfd_check_format PARAMS ((bfd *abfd, bfd_format format)); + +boolean +bfd_check_format_matches PARAMS ((bfd *abfd, bfd_format format, char ***matching)); + +boolean +bfd_set_format PARAMS ((bfd *abfd, bfd_format format)); + +CONST char * +bfd_format_string PARAMS ((bfd_format format)); + +#endif diff --git a/debugger/opcodes/dis-asm.h b/debugger/opcodes/dis-asm.h new file mode 100644 index 00000000000..e38f5fdfc1c --- /dev/null +++ b/debugger/opcodes/dis-asm.h @@ -0,0 +1,179 @@ +/* Interface between the opcode library and its callers. + Written by Cygnus Support, 1993. + + The opcode library (libopcodes.a) provides instruction decoders for + a large variety of instruction sets, callable with an identical + interface, for making instruction-processing programs more independent + of the instruction set being processed. */ + +#include +#include "bfd.h" + +typedef int (*fprintf_ftype) PARAMS((FILE*, const char*, ...)); + +enum dis_insn_type { + dis_noninsn, /* Not a valid instruction */ + dis_nonbranch, /* Not a branch instruction */ + dis_branch, /* Unconditional branch */ + dis_condbranch, /* Conditional branch */ + dis_jsr, /* Jump to subroutine */ + dis_condjsr, /* Conditional jump to subroutine */ + dis_dref, /* Data reference instruction */ + dis_dref2 /* Two data references in instruction */ +}; + +/* This struct is passed into the instruction decoding routine, + and is passed back out into each callback. The various fields are used + for conveying information from your main routine into your callbacks, + for passing information into the instruction decoders (such as the + addresses of the callback functions), or for passing information + back from the instruction decoders to their callers. + + It must be initialized before it is first passed; this can be done + by hand, or using one of the initialization macros below. */ + +typedef struct disassemble_info { + fprintf_ftype fprintf_func; + FILE *stream; + PTR application_data; + + /* For use by the disassembler. */ + int flags; + PTR private_data; + + /* Function used to get bytes to disassemble. MEMADDR is the + address of the stuff to be disassembled, MYADDR is the address to + put the bytes in, and LENGTH is the number of bytes to read. + INFO is a pointer to this struct. + Returns an errno value or 0 for success. */ + int (*read_memory_func) + PARAMS ((bfd_vma memaddr, bfd_byte *myaddr, int length, + struct disassemble_info *info)); + + /* Function which should be called if we get an error that we can't + recover from. STATUS is the errno value from read_memory_func and + MEMADDR is the address that we were trying to read. INFO is a + pointer to this struct. */ + void (*memory_error_func) + PARAMS ((int status, bfd_vma memaddr, struct disassemble_info *info)); + + /* Function called to print ADDR. */ + void (*print_address_func) + PARAMS ((bfd_vma addr, struct disassemble_info *info)); + + /* These are for buffer_read_memory. */ + bfd_byte *buffer; + bfd_vma buffer_vma; + int buffer_length; + + /* Results from instruction decoders. Not all decoders yet support + this information. This info is set each time an instruction is + decoded, and is only valid for the last such instruction. + + To determine whether this decoder supports this information, set + insn_info_valid to 0, decode an instruction, then check it. */ + + char insn_info_valid; /* Branch info has been set. */ + char branch_delay_insns; /* How many sequential insn's will run before + a branch takes effect. (0 = normal) */ + char data_size; /* Size of data reference in insn, in bytes */ + enum dis_insn_type insn_type; /* Type of instruction */ + bfd_vma target; /* Target address of branch or dref, if known; + zero if unknown. */ + bfd_vma target2; /* Second target address for dref2 */ + +} disassemble_info; + + + + + + +/* Standard disassemblers. Disassemble one instruction at the given + target address. Return number of bytes processed. */ +typedef int (*disassembler_ftype) + PARAMS((bfd_vma, disassemble_info *)); + +extern int print_insn_big_mips PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_mips PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i286 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i386 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_m68k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_z8001 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_z8002 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8300 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8300h PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8500 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_alpha PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_sparc PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_big_a29k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_a29k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i960 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_sh PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_hppa PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_m88k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_big_powerpc PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_powerpc PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_rs6000 PARAMS ((bfd_vma, disassemble_info*)); + +/* Fetch the disassembler for a given BFD, if that support is available. */ +extern disassembler_ftype disassembler PARAMS ((bfd *)); + + +/* This block of definitions is for particular callers who read instructions + into a buffer before calling the instruction decoder. */ + +/* Here is a function which callers may wish to use for read_memory_func. + It gets bytes from a buffer. */ +extern int buffer_read_memory + PARAMS ((bfd_vma, bfd_byte *, int, struct disassemble_info *)); + +/* This function goes with buffer_read_memory. + It prints a message using info->fprintf_func and info->stream. */ +extern void perror_memory PARAMS ((int, bfd_vma, struct disassemble_info *)); + + +/* Just print the address is hex. This is included for completeness even + though both GDB and objdump provide their own (to print symbolic + addresses). */ +extern void generic_print_address + PARAMS ((bfd_vma, struct disassemble_info *)); + +#define INIT_DISASSEMBLE_INFO(INFO, STREAM) \ + (INFO).fprintf_func = (fprintf_ftype)fprintf, \ + (INFO).stream = (STREAM), \ + (INFO).buffer = NULL, \ + (INFO).buffer_vma = 0, \ + (INFO).buffer_length = 0, \ + (INFO).read_memory_func = buffer_read_memory, \ + (INFO).memory_error_func = perror_memory, \ + (INFO).print_address_func = generic_print_address, \ + (INFO).insn_info_valid = 0 + + + + +/* This block of definitions is for calling the instruction decoders + from GDB. */ + +/* GDB--Like target_read_memory, but slightly different parameters. */ +extern int +dis_asm_read_memory PARAMS ((bfd_vma memaddr, bfd_byte *myaddr, int len, + disassemble_info *info)); + +/* GDB--Like memory_error with slightly different parameters. */ +extern void +dis_asm_memory_error + PARAMS ((int status, bfd_vma memaddr, disassemble_info *info)); + +/* GDB--Like print_address with slightly different parameters. */ +extern void +dis_asm_print_address PARAMS ((bfd_vma addr, disassemble_info *info)); + +#define GDB_INIT_DISASSEMBLE_INFO(INFO, STREAM) \ + (INFO).fprintf_func = (fprintf_ftype)fprintf_filtered, \ + (INFO).stream = (STREAM), \ + (INFO).read_memory_func = dis_asm_read_memory, \ + (INFO).memory_error_func = dis_asm_memory_error, \ + (INFO).print_address_func = dis_asm_print_address, \ + (INFO).insn_info_valid = 0 diff --git a/debugger/opcodes/dis-asm.h-fsf b/debugger/opcodes/dis-asm.h-fsf new file mode 100644 index 00000000000..0e02a7e2f36 --- /dev/null +++ b/debugger/opcodes/dis-asm.h-fsf @@ -0,0 +1,178 @@ +/* Interface between the opcode library and its callers. + Written by Cygnus Support, 1993. + + The opcode library (libopcodes.a) provides instruction decoders for + a large variety of instruction sets, callable with an identical + interface, for making instruction-processing programs more independent + of the instruction set being processed. */ + +#include +#include "bfd.h" + +typedef int (*fprintf_ftype) PARAMS((FILE*, const char*, ...)); + +enum dis_insn_type { + dis_noninsn, /* Not a valid instruction */ + dis_nonbranch, /* Not a branch instruction */ + dis_branch, /* Unconditional branch */ + dis_condbranch, /* Conditional branch */ + dis_jsr, /* Jump to subroutine */ + dis_condjsr, /* Conditional jump to subroutine */ + dis_dref, /* Data reference instruction */ + dis_dref2 /* Two data references in instruction */ +}; + +/* This struct is passed into the instruction decoding routine, + and is passed back out into each callback. The various fields are used + for conveying information from your main routine into your callbacks, + for passing information into the instruction decoders (such as the + addresses of the callback functions), or for passing information + back from the instruction decoders to their callers. + + It must be initialized before it is first passed; this can be done + by hand, or using one of the initialization macros below. */ + +typedef struct disassemble_info { + fprintf_ftype fprintf_func; + FILE *stream; + PTR application_data; + + /* For use by the disassembler. */ + int flags; + PTR private_data; + + /* Function used to get bytes to disassemble. MEMADDR is the + address of the stuff to be disassembled, MYADDR is the address to + put the bytes in, and LENGTH is the number of bytes to read. + INFO is a pointer to this struct. + Returns an errno value or 0 for success. */ + int (*read_memory_func) + PARAMS ((bfd_vma memaddr, bfd_byte *myaddr, int length, + struct disassemble_info *info)); + + /* Function which should be called if we get an error that we can't + recover from. STATUS is the errno value from read_memory_func and + MEMADDR is the address that we were trying to read. INFO is a + pointer to this struct. */ + void (*memory_error_func) + PARAMS ((int status, bfd_vma memaddr, struct disassemble_info *info)); + + /* Function called to print ADDR. */ + void (*print_address_func) + PARAMS ((bfd_vma addr, struct disassemble_info *info)); + + /* These are for buffer_read_memory. */ + bfd_byte *buffer; + bfd_vma buffer_vma; + int buffer_length; + + /* Results from instruction decoders. Not all decoders yet support + this information. This info is set each time an instruction is + decoded, and is only valid for the last such instruction. + + To determine whether this decoder supports this information, set + insn_info_valid to 0, decode an instruction, then check it. */ + + char insn_info_valid; /* Branch info has been set. */ + char branch_delay_insns; /* How many sequential insn's will run before + a branch takes effect. (0 = normal) */ + char data_size; /* Size of data reference in insn, in bytes */ + enum dis_insn_type insn_type; /* Type of instruction */ + bfd_vma target; /* Target address of branch or dref, if known; + zero if unknown. */ + bfd_vma target2; /* Second target address for dref2 */ + +} disassemble_info; + + + + + + +/* Standard disassemblers. Disassemble one instruction at the given + target address. Return number of bytes processed. */ +typedef int (*disassembler_ftype) + PARAMS((bfd_vma, disassemble_info *)); + +extern int print_insn_big_mips PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_mips PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i386 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_m68k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_z8001 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_z8002 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8300 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8300h PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_h8500 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_alpha PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_sparc PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_big_a29k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_a29k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_i960 PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_sh PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_hppa PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_m88k PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_big_powerpc PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_little_powerpc PARAMS ((bfd_vma, disassemble_info*)); +extern int print_insn_rs6000 PARAMS ((bfd_vma, disassemble_info*)); + +/* Fetch the disassembler for a given BFD, if that support is available. */ +extern disassembler_ftype disassembler PARAMS ((bfd *)); + + +/* This block of definitions is for particular callers who read instructions + into a buffer before calling the instruction decoder. */ + +/* Here is a function which callers may wish to use for read_memory_func. + It gets bytes from a buffer. */ +extern int buffer_read_memory + PARAMS ((bfd_vma, bfd_byte *, int, struct disassemble_info *)); + +/* This function goes with buffer_read_memory. + It prints a message using info->fprintf_func and info->stream. */ +extern void perror_memory PARAMS ((int, bfd_vma, struct disassemble_info *)); + + +/* Just print the address is hex. This is included for completeness even + though both GDB and objdump provide their own (to print symbolic + addresses). */ +extern void generic_print_address + PARAMS ((bfd_vma, struct disassemble_info *)); + +#define INIT_DISASSEMBLE_INFO(INFO, STREAM) \ + (INFO).fprintf_func = (fprintf_ftype)fprintf, \ + (INFO).stream = (STREAM), \ + (INFO).buffer = NULL, \ + (INFO).buffer_vma = 0, \ + (INFO).buffer_length = 0, \ + (INFO).read_memory_func = buffer_read_memory, \ + (INFO).memory_error_func = perror_memory, \ + (INFO).print_address_func = generic_print_address, \ + (INFO).insn_info_valid = 0 + + + + +/* This block of definitions is for calling the instruction decoders + from GDB. */ + +/* GDB--Like target_read_memory, but slightly different parameters. */ +extern int +dis_asm_read_memory PARAMS ((bfd_vma memaddr, bfd_byte *myaddr, int len, + disassemble_info *info)); + +/* GDB--Like memory_error with slightly different parameters. */ +extern void +dis_asm_memory_error + PARAMS ((int status, bfd_vma memaddr, disassemble_info *info)); + +/* GDB--Like print_address with slightly different parameters. */ +extern void +dis_asm_print_address PARAMS ((bfd_vma addr, disassemble_info *info)); + +#define GDB_INIT_DISASSEMBLE_INFO(INFO, STREAM) \ + (INFO).fprintf_func = (fprintf_ftype)fprintf_filtered, \ + (INFO).stream = (STREAM), \ + (INFO).read_memory_func = dis_asm_read_memory, \ + (INFO).memory_error_func = dis_asm_memory_error, \ + (INFO).print_address_func = dis_asm_print_address, \ + (INFO).insn_info_valid = 0 diff --git a/debugger/opcodes/dis-buf.c b/debugger/opcodes/dis-buf.c new file mode 100644 index 00000000000..d184b28405a --- /dev/null +++ b/debugger/opcodes/dis-buf.c @@ -0,0 +1,70 @@ +/* Disassemble from a buffer, for GNU. + Copyright (C) 1993, 1994 Free Software Foundation, Inc. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +#include "dis-asm.h" +#include "sysdep.h" +#include + +/* Get LENGTH bytes from info's buffer, at target address memaddr. + Transfer them to myaddr. */ +int +buffer_read_memory (memaddr, myaddr, length, info) + bfd_vma memaddr; + bfd_byte *myaddr; + int length; + struct disassemble_info *info; +{ + if (memaddr < info->buffer_vma + || memaddr + length > info->buffer_vma + info->buffer_length) + /* Out of bounds. Use EIO because GDB uses it. */ + return EIO; + memcpy (myaddr, info->buffer + (memaddr - info->buffer_vma), length); + return 0; +} + +/* Print an error message. We can assume that this is in response to + an error return from buffer_read_memory. */ +void +perror_memory (status, memaddr, info) + int status; + bfd_vma memaddr; + struct disassemble_info *info; +{ + if (status != EIO) + /* Can't happen. */ + (*info->fprintf_func) (info->stream, "Unknown error %d\n", status); + else + /* Actually, address between memaddr and memaddr + len was + out of bounds. */ + (*info->fprintf_func) (info->stream, + "Address 0x%x is out of bounds.\n", memaddr); +} + +/* This could be in a separate file, to save miniscule amounts of space + in statically linked executables. */ + +/* Just print the address is hex. This is included for completeness even + though both GDB and objdump provide their own (to print symbolic + addresses). */ + +void +generic_print_address (addr, info) + bfd_vma addr; + struct disassemble_info *info; +{ + (*info->fprintf_func) (info->stream, "0x%x", addr); +} diff --git a/debugger/opcodes/i386-dis.c b/debugger/opcodes/i386-dis.c new file mode 100644 index 00000000000..9d5e1792e1b --- /dev/null +++ b/debugger/opcodes/i386-dis.c @@ -0,0 +1,2029 @@ +/* Print i386 instructions for GDB, the GNU debugger. + Copyright (C) 1988, 1989, 1991, 1993, 1994 Free Software Foundation, Inc. + +This file is part of GDB. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ + +/* + * 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu) + * July 1988 + * modified by John Hassey (hassey@dg-rtp.dg.com) + */ + +/* + * The main tables describing the instructions is essentially a copy + * of the "Opcode Map" chapter (Appendix A) of the Intel 80386 + * Programmers Manual. Usually, there is a capital letter, followed + * by a small letter. The capital letter tell the addressing mode, + * and the small letter tells about the operand size. Refer to + * the Intel manual for details. + */ + +#include "dis-asm.h" +#include "sysdep.h" + +#define MAXLEN 20 + +#include + +struct dis_private +{ + /* Points to first byte not fetched. */ + bfd_byte *max_fetched; + bfd_byte the_buffer[MAXLEN]; + bfd_vma insn_start; + jmp_buf bailout; +}; + +/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive) + to ADDR (exclusive) are valid. Returns 1 for success, longjmps + on error. */ +#define FETCH_DATA(info, addr) \ + ((addr) <= ((struct dis_private *)(info->private_data))->max_fetched \ + ? 1 : fetch_data ((info), (addr))) + +static int +fetch_data (info, addr) + struct disassemble_info *info; + bfd_byte *addr; +{ + int status; + struct dis_private *priv = (struct dis_private *)info->private_data; + bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer); + + status = (*info->read_memory_func) (start, + priv->max_fetched, + addr - priv->max_fetched, + info); + if (status != 0) + { + (*info->memory_error_func) (status, start, info); + longjmp (priv->bailout, 1); + } + else + priv->max_fetched = addr; + return 1; +} + +#define Eb OP_E, b_mode +#define indirEb OP_indirE, b_mode +#define Gb OP_G, b_mode +#define Ev OP_E, v_mode +#define indirEv OP_indirE, v_mode +#define Ew OP_E, w_mode +#define Ma OP_E, v_mode +#define M OP_E, 0 +#define Mp OP_E, 0 /* ? */ +#define Gv OP_G, v_mode +#define Gw OP_G, w_mode +#define Rw OP_rm, w_mode +#define Rd OP_rm, d_mode +#define Ib OP_I, b_mode +#define sIb OP_sI, b_mode /* sign extened byte */ +#define Iv OP_I, v_mode +#define Iw OP_I, w_mode +#define Jb OP_J, b_mode +#define Jv OP_J, v_mode +#define ONE OP_ONE, 0 +#define Cd OP_C, d_mode +#define Dd OP_D, d_mode +#define Td OP_T, d_mode + +#define eAX OP_REG, eAX_reg +#define eBX OP_REG, eBX_reg +#define eCX OP_REG, eCX_reg +#define eDX OP_REG, eDX_reg +#define eSP OP_REG, eSP_reg +#define eBP OP_REG, eBP_reg +#define eSI OP_REG, eSI_reg +#define eDI OP_REG, eDI_reg +#define AL OP_REG, al_reg +#define CL OP_REG, cl_reg +#define DL OP_REG, dl_reg +#define BL OP_REG, bl_reg +#define AH OP_REG, ah_reg +#define CH OP_REG, ch_reg +#define DH OP_REG, dh_reg +#define BH OP_REG, bh_reg +#define AX OP_REG, ax_reg +#define DX OP_REG, dx_reg +#define indirDX OP_REG, indir_dx_reg + +#define Sw OP_SEG, w_mode +#define Ap OP_DIR, lptr +#define Av OP_DIR, v_mode +#define Ob OP_OFF, b_mode +#define Ov OP_OFF, v_mode +#define Xb OP_DSSI, b_mode +#define Xv OP_DSSI, v_mode +#define Yb OP_ESDI, b_mode +#define Yv OP_ESDI, v_mode + +#define es OP_REG, es_reg +#define ss OP_REG, ss_reg +#define cs OP_REG, cs_reg +#define ds OP_REG, ds_reg +#define fs OP_REG, fs_reg +#define gs OP_REG, gs_reg + +int OP_E(), OP_indirE(), OP_G(), OP_I(), OP_sI(), OP_REG(); +int OP_J(), OP_SEG(); +int OP_DIR(), OP_OFF(), OP_DSSI(), OP_ESDI(), OP_ONE(), OP_C(); +int OP_D(), OP_T(), OP_rm(); + +static void dofloat (), putop (), append_prefix (), set_op (); +static int get16 (), get32 (); + +#define b_mode 1 +#define v_mode 2 +#define w_mode 3 +#define d_mode 4 + +#define es_reg 100 +#define cs_reg 101 +#define ss_reg 102 +#define ds_reg 103 +#define fs_reg 104 +#define gs_reg 105 +#define eAX_reg 107 +#define eCX_reg 108 +#define eDX_reg 109 +#define eBX_reg 110 +#define eSP_reg 111 +#define eBP_reg 112 +#define eSI_reg 113 +#define eDI_reg 114 + +#define lptr 115 + +#define al_reg 116 +#define cl_reg 117 +#define dl_reg 118 +#define bl_reg 119 +#define ah_reg 120 +#define ch_reg 121 +#define dh_reg 122 +#define bh_reg 123 + +#define ax_reg 124 +#define cx_reg 125 +#define dx_reg 126 +#define bx_reg 127 +#define sp_reg 128 +#define bp_reg 129 +#define si_reg 130 +#define di_reg 131 + +#define indir_dx_reg 150 + +#define GRP1b NULL, NULL, 0 +#define GRP1S NULL, NULL, 1 +#define GRP1Ss NULL, NULL, 2 +#define GRP2b NULL, NULL, 3 +#define GRP2S NULL, NULL, 4 +#define GRP2b_one NULL, NULL, 5 +#define GRP2S_one NULL, NULL, 6 +#define GRP2b_cl NULL, NULL, 7 +#define GRP2S_cl NULL, NULL, 8 +#define GRP3b NULL, NULL, 9 +#define GRP3S NULL, NULL, 10 +#define GRP4 NULL, NULL, 11 +#define GRP5 NULL, NULL, 12 +#define GRP6 NULL, NULL, 13 +#define GRP7 NULL, NULL, 14 +#define GRP8 NULL, NULL, 15 + +#define FLOATCODE 50 +#define FLOAT NULL, NULL, FLOATCODE + +struct dis386 { + char *name; + int (*op1)(); + int bytemode1; + int (*op2)(); + int bytemode2; + int (*op3)(); + int bytemode3; +}; + +struct dis386 dis386[] = { + /* 00 */ + { "addb", Eb, Gb }, + { "addS", Ev, Gv }, + { "addb", Gb, Eb }, + { "addS", Gv, Ev }, + { "addb", AL, Ib }, + { "addS", eAX, Iv }, + { "pushl", es }, + { "popl", es }, + /* 08 */ + { "orb", Eb, Gb }, + { "orS", Ev, Gv }, + { "orb", Gb, Eb }, + { "orS", Gv, Ev }, + { "orb", AL, Ib }, + { "orS", eAX, Iv }, + { "pushl", cs }, + { "(bad)" }, /* 0x0f extended opcode escape */ + /* 10 */ + { "adcb", Eb, Gb }, + { "adcS", Ev, Gv }, + { "adcb", Gb, Eb }, + { "adcS", Gv, Ev }, + { "adcb", AL, Ib }, + { "adcS", eAX, Iv }, + { "pushl", ss }, + { "popl", ss }, + /* 18 */ + { "sbbb", Eb, Gb }, + { "sbbS", Ev, Gv }, + { "sbbb", Gb, Eb }, + { "sbbS", Gv, Ev }, + { "sbbb", AL, Ib }, + { "sbbS", eAX, Iv }, + { "pushl", ds }, + { "popl", ds }, + /* 20 */ + { "andb", Eb, Gb }, + { "andS", Ev, Gv }, + { "andb", Gb, Eb }, + { "andS", Gv, Ev }, + { "andb", AL, Ib }, + { "andS", eAX, Iv }, + { "(bad)" }, /* SEG ES prefix */ + { "daa" }, + /* 28 */ + { "subb", Eb, Gb }, + { "subS", Ev, Gv }, + { "subb", Gb, Eb }, + { "subS", Gv, Ev }, + { "subb", AL, Ib }, + { "subS", eAX, Iv }, + { "(bad)" }, /* SEG CS prefix */ + { "das" }, + /* 30 */ + { "xorb", Eb, Gb }, + { "xorS", Ev, Gv }, + { "xorb", Gb, Eb }, + { "xorS", Gv, Ev }, + { "xorb", AL, Ib }, + { "xorS", eAX, Iv }, + { "(bad)" }, /* SEG SS prefix */ + { "aaa" }, + /* 38 */ + { "cmpb", Eb, Gb }, + { "cmpS", Ev, Gv }, + { "cmpb", Gb, Eb }, + { "cmpS", Gv, Ev }, + { "cmpb", AL, Ib }, + { "cmpS", eAX, Iv }, + { "(bad)" }, /* SEG DS prefix */ + { "aas" }, + /* 40 */ + { "incS", eAX }, + { "incS", eCX }, + { "incS", eDX }, + { "incS", eBX }, + { "incS", eSP }, + { "incS", eBP }, + { "incS", eSI }, + { "incS", eDI }, + /* 48 */ + { "decS", eAX }, + { "decS", eCX }, + { "decS", eDX }, + { "decS", eBX }, + { "decS", eSP }, + { "decS", eBP }, + { "decS", eSI }, + { "decS", eDI }, + /* 50 */ + { "pushS", eAX }, + { "pushS", eCX }, + { "pushS", eDX }, + { "pushS", eBX }, + { "pushS", eSP }, + { "pushS", eBP }, + { "pushS", eSI }, + { "pushS", eDI }, + /* 58 */ + { "popS", eAX }, + { "popS", eCX }, + { "popS", eDX }, + { "popS", eBX }, + { "popS", eSP }, + { "popS", eBP }, + { "popS", eSI }, + { "popS", eDI }, + /* 60 */ + { "pusha" }, + { "popa" }, + { "boundS", Gv, Ma }, + { "arpl", Ew, Gw }, + { "(bad)" }, /* seg fs */ + { "(bad)" }, /* seg gs */ + { "(bad)" }, /* op size prefix */ + { "(bad)" }, /* adr size prefix */ + /* 68 */ + { "pushS", Iv }, /* 386 book wrong */ + { "imulS", Gv, Ev, Iv }, + { "pushl", sIb }, /* push of byte really pushes 4 bytes */ + { "imulS", Gv, Ev, Ib }, + { "insb", Yb, indirDX }, + { "insS", Yv, indirDX }, + { "outsb", indirDX, Xb }, + { "outsS", indirDX, Xv }, + /* 70 */ + { "jo", Jb }, + { "jno", Jb }, + { "jb", Jb }, + { "jae", Jb }, + { "je", Jb }, + { "jne", Jb }, + { "jbe", Jb }, + { "ja", Jb }, + /* 78 */ + { "js", Jb }, + { "jns", Jb }, + { "jp", Jb }, + { "jnp", Jb }, + { "jl", Jb }, + { "jnl", Jb }, + { "jle", Jb }, + { "jg", Jb }, + /* 80 */ + { GRP1b }, + { GRP1S }, + { "(bad)" }, + { GRP1Ss }, + { "testb", Eb, Gb }, + { "testS", Ev, Gv }, + { "xchgb", Eb, Gb }, + { "xchgS", Ev, Gv }, + /* 88 */ + { "movb", Eb, Gb }, + { "movS", Ev, Gv }, + { "movb", Gb, Eb }, + { "movS", Gv, Ev }, + { "movw", Ew, Sw }, + { "leaS", Gv, M }, + { "movw", Sw, Ew }, + { "popS", Ev }, + /* 90 */ + { "nop" }, + { "xchgS", eCX, eAX }, + { "xchgS", eDX, eAX }, + { "xchgS", eBX, eAX }, + { "xchgS", eSP, eAX }, + { "xchgS", eBP, eAX }, + { "xchgS", eSI, eAX }, + { "xchgS", eDI, eAX }, + /* 98 */ + { "cwtl" }, + { "cltd" }, + { "lcall", Ap }, + { "(bad)" }, /* fwait */ + { "pushf" }, + { "popf" }, + { "sahf" }, + { "lahf" }, + /* a0 */ + { "movb", AL, Ob }, + { "movS", eAX, Ov }, + { "movb", Ob, AL }, + { "movS", Ov, eAX }, + { "movsb", Yb, Xb }, + { "movsS", Yv, Xv }, + { "cmpsb", Yb, Xb }, + { "cmpsS", Yv, Xv }, + /* a8 */ + { "testb", AL, Ib }, + { "testS", eAX, Iv }, + { "stosb", Yb, AL }, + { "stosS", Yv, eAX }, + { "lodsb", AL, Xb }, + { "lodsS", eAX, Xv }, + { "scasb", AL, Yb }, + { "scasS", eAX, Yv }, + /* b0 */ + { "movb", AL, Ib }, + { "movb", CL, Ib }, + { "movb", DL, Ib }, + { "movb", BL, Ib }, + { "movb", AH, Ib }, + { "movb", CH, Ib }, + { "movb", DH, Ib }, + { "movb", BH, Ib }, + /* b8 */ + { "movS", eAX, Iv }, + { "movS", eCX, Iv }, + { "movS", eDX, Iv }, + { "movS", eBX, Iv }, + { "movS", eSP, Iv }, + { "movS", eBP, Iv }, + { "movS", eSI, Iv }, + { "movS", eDI, Iv }, + /* c0 */ + { GRP2b }, + { GRP2S }, + { "ret", Iw }, + { "ret" }, + { "lesS", Gv, Mp }, + { "ldsS", Gv, Mp }, + { "movb", Eb, Ib }, + { "movS", Ev, Iv }, + /* c8 */ + { "enter", Iw, Ib }, + { "leave" }, + { "lret", Iw }, + { "lret" }, + { "int3" }, + { "int", Ib }, + { "into" }, + { "iret" }, + /* d0 */ + { GRP2b_one }, + { GRP2S_one }, + { GRP2b_cl }, + { GRP2S_cl }, + { "aam", Ib }, + { "aad", Ib }, + { "(bad)" }, + { "xlat" }, + /* d8 */ + { FLOAT }, + { FLOAT }, + { FLOAT }, + { FLOAT }, + { FLOAT }, + { FLOAT }, + { FLOAT }, + { FLOAT }, + /* e0 */ + { "loopne", Jb }, + { "loope", Jb }, + { "loop", Jb }, + { "jCcxz", Jb }, + { "inb", AL, Ib }, + { "inS", eAX, Ib }, + { "outb", Ib, AL }, + { "outS", Ib, eAX }, + /* e8 */ + { "call", Av }, + { "jmp", Jv }, + { "ljmp", Ap }, + { "jmp", Jb }, + { "inb", AL, indirDX }, + { "inS", eAX, indirDX }, + { "outb", indirDX, AL }, + { "outS", indirDX, eAX }, + /* f0 */ + { "(bad)" }, /* lock prefix */ + { "(bad)" }, + { "(bad)" }, /* repne */ + { "(bad)" }, /* repz */ + { "hlt" }, + { "cmc" }, + { GRP3b }, + { GRP3S }, + /* f8 */ + { "clc" }, + { "stc" }, + { "cli" }, + { "sti" }, + { "cld" }, + { "std" }, + { GRP4 }, + { GRP5 }, +}; + +struct dis386 dis386_twobyte[] = { + /* 00 */ + { GRP6 }, + { GRP7 }, + { "larS", Gv, Ew }, + { "lslS", Gv, Ew }, + { "(bad)" }, + { "(bad)" }, + { "clts" }, + { "(bad)" }, + /* 08 */ + { "invd" }, + { "wbinvd" }, + { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* 10 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* 18 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* 20 */ + /* these are all backward in appendix A of the intel book */ + { "movl", Rd, Cd }, + { "movl", Rd, Dd }, + { "movl", Cd, Rd }, + { "movl", Dd, Rd }, + { "movl", Rd, Td }, + { "(bad)" }, + { "movl", Td, Rd }, + { "(bad)" }, + /* 28 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* 30 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* 38 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* 40 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* 48 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* 50 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* 58 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* 60 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* 68 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* 70 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* 78 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* 80 */ + { "jo", Jv }, + { "jno", Jv }, + { "jb", Jv }, + { "jae", Jv }, + { "je", Jv }, + { "jne", Jv }, + { "jbe", Jv }, + { "ja", Jv }, + /* 88 */ + { "js", Jv }, + { "jns", Jv }, + { "jp", Jv }, + { "jnp", Jv }, + { "jl", Jv }, + { "jge", Jv }, + { "jle", Jv }, + { "jg", Jv }, + /* 90 */ + { "seto", Eb }, + { "setno", Eb }, + { "setb", Eb }, + { "setae", Eb }, + { "sete", Eb }, + { "setne", Eb }, + { "setbe", Eb }, + { "seta", Eb }, + /* 98 */ + { "sets", Eb }, + { "setns", Eb }, + { "setp", Eb }, + { "setnp", Eb }, + { "setl", Eb }, + { "setge", Eb }, + { "setle", Eb }, + { "setg", Eb }, + /* a0 */ + { "pushl", fs }, + { "popl", fs }, + { "(bad)" }, + { "btS", Ev, Gv }, + { "shldS", Ev, Gv, Ib }, + { "shldS", Ev, Gv, CL }, + { "(bad)" }, + { "(bad)" }, + /* a8 */ + { "pushl", gs }, + { "popl", gs }, + { "(bad)" }, + { "btsS", Ev, Gv }, + { "shrdS", Ev, Gv, Ib }, + { "shrdS", Ev, Gv, CL }, + { "(bad)" }, + { "imulS", Gv, Ev }, + /* b0 */ + { "cmpxchgb", Eb, Gb }, + { "cmpxchgS", Ev, Gv }, + { "lssS", Gv, Mp }, /* 386 lists only Mp */ + { "btrS", Ev, Gv }, + { "lfsS", Gv, Mp }, /* 386 lists only Mp */ + { "lgsS", Gv, Mp }, /* 386 lists only Mp */ + { "movzbS", Gv, Eb }, + { "movzwS", Gv, Ew }, + /* b8 */ + { "(bad)" }, + { "(bad)" }, + { GRP8 }, + { "btcS", Ev, Gv }, + { "bsfS", Gv, Ev }, + { "bsrS", Gv, Ev }, + { "movsbS", Gv, Eb }, + { "movswS", Gv, Ew }, + /* c0 */ + { "xaddb", Eb, Gb }, + { "xaddS", Ev, Gv }, + { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* c8 */ + { "bswap", eAX }, + { "bswap", eCX }, + { "bswap", eDX }, + { "bswap", eBX }, + { "bswap", eSP }, + { "bswap", eBP }, + { "bswap", eSI }, + { "bswap", eDI }, + /* d0 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* d8 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* e0 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* e8 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* f0 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + /* f8 */ + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, +}; + +static char obuf[100]; +static char *obufp; +static char scratchbuf[100]; +static unsigned char *start_codep; +static unsigned char *codep; +static disassemble_info *the_info; +static int mod; +static int rm; +static int reg; +static void oappend (); + +static char *names32[]={ + "%eax","%ecx","%edx","%ebx", "%esp","%ebp","%esi","%edi", +}; +static char *names16[] = { + "%ax","%cx","%dx","%bx","%sp","%bp","%si","%di", +}; +static char *names8[] = { + "%al","%cl","%dl","%bl","%ah","%ch","%dh","%bh", +}; +static char *names_seg[] = { + "%es","%cs","%ss","%ds","%fs","%gs","%?","%?", +}; + +struct dis386 grps[][8] = { + /* GRP1b */ + { + { "addb", Eb, Ib }, + { "orb", Eb, Ib }, + { "adcb", Eb, Ib }, + { "sbbb", Eb, Ib }, + { "andb", Eb, Ib }, + { "subb", Eb, Ib }, + { "xorb", Eb, Ib }, + { "cmpb", Eb, Ib } + }, + /* GRP1S */ + { + { "addS", Ev, Iv }, + { "orS", Ev, Iv }, + { "adcS", Ev, Iv }, + { "sbbS", Ev, Iv }, + { "andS", Ev, Iv }, + { "subS", Ev, Iv }, + { "xorS", Ev, Iv }, + { "cmpS", Ev, Iv } + }, + /* GRP1Ss */ + { + { "addS", Ev, sIb }, + { "orS", Ev, sIb }, + { "adcS", Ev, sIb }, + { "sbbS", Ev, sIb }, + { "andS", Ev, sIb }, + { "subS", Ev, sIb }, + { "xorS", Ev, sIb }, + { "cmpS", Ev, sIb } + }, + /* GRP2b */ + { + { "rolb", Eb, Ib }, + { "rorb", Eb, Ib }, + { "rclb", Eb, Ib }, + { "rcrb", Eb, Ib }, + { "shlb", Eb, Ib }, + { "shrb", Eb, Ib }, + { "(bad)" }, + { "sarb", Eb, Ib }, + }, + /* GRP2S */ + { + { "rolS", Ev, Ib }, + { "rorS", Ev, Ib }, + { "rclS", Ev, Ib }, + { "rcrS", Ev, Ib }, + { "shlS", Ev, Ib }, + { "shrS", Ev, Ib }, + { "(bad)" }, + { "sarS", Ev, Ib }, + }, + /* GRP2b_one */ + { + { "rolb", Eb }, + { "rorb", Eb }, + { "rclb", Eb }, + { "rcrb", Eb }, + { "shlb", Eb }, + { "shrb", Eb }, + { "(bad)" }, + { "sarb", Eb }, + }, + /* GRP2S_one */ + { + { "rolS", Ev }, + { "rorS", Ev }, + { "rclS", Ev }, + { "rcrS", Ev }, + { "shlS", Ev }, + { "shrS", Ev }, + { "(bad)" }, + { "sarS", Ev }, + }, + /* GRP2b_cl */ + { + { "rolb", Eb, CL }, + { "rorb", Eb, CL }, + { "rclb", Eb, CL }, + { "rcrb", Eb, CL }, + { "shlb", Eb, CL }, + { "shrb", Eb, CL }, + { "(bad)" }, + { "sarb", Eb, CL }, + }, + /* GRP2S_cl */ + { + { "rolS", Ev, CL }, + { "rorS", Ev, CL }, + { "rclS", Ev, CL }, + { "rcrS", Ev, CL }, + { "shlS", Ev, CL }, + { "shrS", Ev, CL }, + { "(bad)" }, + { "sarS", Ev, CL } + }, + /* GRP3b */ + { + { "testb", Eb, Ib }, + { "(bad)", Eb }, + { "notb", Eb }, + { "negb", Eb }, + { "mulb", AL, Eb }, + { "imulb", AL, Eb }, + { "divb", AL, Eb }, + { "idivb", AL, Eb } + }, + /* GRP3S */ + { + { "testS", Ev, Iv }, + { "(bad)" }, + { "notS", Ev }, + { "negS", Ev }, + { "mulS", eAX, Ev }, + { "imulS", eAX, Ev }, + { "divS", eAX, Ev }, + { "idivS", eAX, Ev }, + }, + /* GRP4 */ + { + { "incb", Eb }, + { "decb", Eb }, + { "(bad)" }, + { "(bad)" }, + { "(bad)" }, + { "(bad)" }, + { "(bad)" }, + { "(bad)" }, + }, + /* GRP5 */ + { + { "incS", Ev }, + { "decS", Ev }, + { "call", indirEv }, + { "lcall", indirEv }, + { "jmp", indirEv }, + { "ljmp", indirEv }, + { "pushS", Ev }, + { "(bad)" }, + }, + /* GRP6 */ + { + { "sldt", Ew }, + { "str", Ew }, + { "lldt", Ew }, + { "ltr", Ew }, + { "verr", Ew }, + { "verw", Ew }, + { "(bad)" }, + { "(bad)" } + }, + /* GRP7 */ + { + { "sgdt", Ew }, + { "sidt", Ew }, + { "lgdt", Ew }, + { "lidt", Ew }, + { "smsw", Ew }, + { "(bad)" }, + { "lmsw", Ew }, + { "invlpg", Ew }, + }, + /* GRP8 */ + { + { "(bad)" }, + { "(bad)" }, + { "(bad)" }, + { "(bad)" }, + { "btS", Ev, Ib }, + { "btsS", Ev, Ib }, + { "btrS", Ev, Ib }, + { "btcS", Ev, Ib }, + } +}; + +#define PREFIX_REPZ 1 +#define PREFIX_REPNZ 2 +#define PREFIX_LOCK 4 +#define PREFIX_CS 8 +#define PREFIX_SS 0x10 +#define PREFIX_DS 0x20 +#define PREFIX_ES 0x40 +#define PREFIX_FS 0x80 +#define PREFIX_GS 0x100 +#define PREFIX_DATA 0x200 +#define PREFIX_ADR 0x400 +#define PREFIX_FWAIT 0x800 + +static int prefixes; + +static void +ckprefix () +{ + prefixes = 0; + while (1) + { + FETCH_DATA (the_info, codep + 1); + switch (*codep) + { + case 0xf3: + prefixes |= PREFIX_REPZ; + break; + case 0xf2: + prefixes |= PREFIX_REPNZ; + break; + case 0xf0: + prefixes |= PREFIX_LOCK; + break; + case 0x2e: + prefixes |= PREFIX_CS; + break; + case 0x36: + prefixes |= PREFIX_SS; + break; + case 0x3e: + prefixes |= PREFIX_DS; + break; + case 0x26: + prefixes |= PREFIX_ES; + break; + case 0x64: + prefixes |= PREFIX_FS; + break; + case 0x65: + prefixes |= PREFIX_GS; + break; + case 0x66: + prefixes |= PREFIX_DATA; + break; + case 0x67: + prefixes |= PREFIX_ADR; + break; + case 0x9b: + prefixes |= PREFIX_FWAIT; + break; + default: + return; + } + codep++; + } +} + +static int dflag; +static int aflag; + +static char op1out[100], op2out[100], op3out[100]; +static int op_address[3], op_ad, op_index[3]; +static int start_pc; + + +/* + * On the 386's of 1988, the maximum length of an instruction is 15 bytes. + * (see topic "Redundant prefixes" in the "Differences from 8086" + * section of the "Virtual 8086 Mode" chapter.) + * 'pc' should be the address of this instruction, it will + * be used to print the target address if this is a relative jump or call + * The function returns the length of this instruction in bytes. + */ +static int +print_insn_i286_or_i386 (pc, info) + bfd_vma pc; + disassemble_info *info; +{ + struct dis386 *dp; + int i; + int enter_instruction; + char *first, *second, *third; + int needcomma; + + struct dis_private priv; + bfd_byte *inbuf = priv.the_buffer; + + info->private_data = (PTR) &priv; + priv.max_fetched = priv.the_buffer; + priv.insn_start = pc; + if (setjmp (priv.bailout) != 0) + /* Error return. */ + return -1; + + obuf[0] = 0; + op1out[0] = 0; + op2out[0] = 0; + op3out[0] = 0; + + op_index[0] = op_index[1] = op_index[2] = -1; + + the_info = info; + start_pc = pc; + start_codep = inbuf; + codep = inbuf; + + ckprefix (); + + FETCH_DATA (info, codep + 1); + if (*codep == 0xc8) + enter_instruction = 1; + else + enter_instruction = 0; + + obufp = obuf; + + if (prefixes & PREFIX_REPZ) + oappend ("repz "); + if (prefixes & PREFIX_REPNZ) + oappend ("repnz "); + if (prefixes & PREFIX_LOCK) + oappend ("lock "); + + if ((prefixes & PREFIX_FWAIT) + && ((*codep < 0xd8) || (*codep > 0xdf))) + { + /* fwait not followed by floating point instruction */ + (*info->fprintf_func) (info->stream, "fwait"); + return (1); + } + + if (prefixes & PREFIX_DATA) + dflag ^= 1; + + if (prefixes & PREFIX_ADR) + { + aflag ^= 1; + oappend ("addr16 "); + } + + if (*codep == 0x0f) + { + FETCH_DATA (info, codep + 2); + dp = &dis386_twobyte[*++codep]; + } + else + dp = &dis386[*codep]; + codep++; + + /* Fetch the mod/reg/rm byte. FIXME: We should be only fetching + this if we need it. As it is, this code loses if there is a + one-byte instruction (without a mod/reg/rm byte) at the end of + the address space. */ + + FETCH_DATA (info, codep + 1); + mod = (*codep >> 6) & 3; + reg = (*codep >> 3) & 7; + rm = *codep & 7; + + if (dp->name == NULL && dp->bytemode1 == FLOATCODE) + { + dofloat (); + } + else + { + if (dp->name == NULL) + dp = &grps[dp->bytemode1][reg]; + + putop (dp->name); + + obufp = op1out; + op_ad = 2; + if (dp->op1) + (*dp->op1)(dp->bytemode1); + + obufp = op2out; + op_ad = 1; + if (dp->op2) + (*dp->op2)(dp->bytemode2); + + obufp = op3out; + op_ad = 0; + if (dp->op3) + (*dp->op3)(dp->bytemode3); + } + + obufp = obuf + strlen (obuf); + for (i = strlen (obuf); i < 6; i++) + oappend (" "); + oappend (" "); + (*info->fprintf_func) (info->stream, "%s", obuf); + + /* enter instruction is printed with operands in the + * same order as the intel book; everything else + * is printed in reverse order + */ + if (enter_instruction) + { + first = op1out; + second = op2out; + third = op3out; + op_ad = op_index[0]; + op_index[0] = op_index[2]; + op_index[2] = op_ad; + } + else + { + first = op3out; + second = op2out; + third = op1out; + } + needcomma = 0; + if (*first) + { + if (op_index[0] != -1) + (*info->print_address_func) (op_address[op_index[0]], info); + else + (*info->fprintf_func) (info->stream, "%s", first); + needcomma = 1; + } + if (*second) + { + if (needcomma) + (*info->fprintf_func) (info->stream, ","); + if (op_index[1] != -1) + (*info->print_address_func) (op_address[op_index[1]], info); + else + (*info->fprintf_func) (info->stream, "%s", second); + needcomma = 1; + } + if (*third) + { + if (needcomma) + (*info->fprintf_func) (info->stream, ","); + if (op_index[2] != -1) + (*info->print_address_func) (op_address[op_index[2]], info); + else + (*info->fprintf_func) (info->stream, "%s", third); + } + return (codep - inbuf); +} + +int +print_insn_i286 (pc, info) + bfd_vma pc; + disassemble_info *info; +{ + dflag = 0; + aflag = 0; + return print_insn_i286_or_i386 (pc, info); +} + +int +print_insn_i386 (pc, info) + bfd_vma pc; + disassemble_info *info; +{ + dflag = 1; + aflag = 1; + return print_insn_i286_or_i386 (pc, info, 36); +} + +char *float_mem[] = { + /* d8 */ + "fadds", + "fmuls", + "fcoms", + "fcomps", + "fsubs", + "fsubrs", + "fdivs", + "fdivrs", + /* d9 */ + "flds", + "(bad)", + "fsts", + "fstps", + "fldenv", + "fldcw", + "fNstenv", + "fNstcw", + /* da */ + "fiaddl", + "fimull", + "ficoml", + "ficompl", + "fisubl", + "fisubrl", + "fidivl", + "fidivrl", + /* db */ + "fildl", + "(bad)", + "fistl", + "fistpl", + "(bad)", + "fldt", + "(bad)", + "fstpt", + /* dc */ + "faddl", + "fmull", + "fcoml", + "fcompl", + "fsubl", + "fsubrl", + "fdivl", + "fdivrl", + /* dd */ + "fldl", + "(bad)", + "fstl", + "fstpl", + "frstor", + "(bad)", + "fNsave", + "fNstsw", + /* de */ + "fiadd", + "fimul", + "ficom", + "ficomp", + "fisub", + "fisubr", + "fidiv", + "fidivr", + /* df */ + "fild", + "(bad)", + "fist", + "fistp", + "fbld", + "fildll", + "fbstp", + "fistpll", +}; + +#define ST OP_ST, 0 +#define STi OP_STi, 0 +int OP_ST(), OP_STi(); + +#define FGRPd9_2 NULL, NULL, 0 +#define FGRPd9_4 NULL, NULL, 1 +#define FGRPd9_5 NULL, NULL, 2 +#define FGRPd9_6 NULL, NULL, 3 +#define FGRPd9_7 NULL, NULL, 4 +#define FGRPda_5 NULL, NULL, 5 +#define FGRPdb_4 NULL, NULL, 6 +#define FGRPde_3 NULL, NULL, 7 +#define FGRPdf_4 NULL, NULL, 8 + +struct dis386 float_reg[][8] = { + /* d8 */ + { + { "fadd", ST, STi }, + { "fmul", ST, STi }, + { "fcom", STi }, + { "fcomp", STi }, + { "fsub", ST, STi }, + { "fsubr", ST, STi }, + { "fdiv", ST, STi }, + { "fdivr", ST, STi }, + }, + /* d9 */ + { + { "fld", STi }, + { "fxch", STi }, + { FGRPd9_2 }, + { "(bad)" }, + { FGRPd9_4 }, + { FGRPd9_5 }, + { FGRPd9_6 }, + { FGRPd9_7 }, + }, + /* da */ + { + { "(bad)" }, + { "(bad)" }, + { "(bad)" }, + { "(bad)" }, + { "(bad)" }, + { FGRPda_5 }, + { "(bad)" }, + { "(bad)" }, + }, + /* db */ + { + { "(bad)" }, + { "(bad)" }, + { "(bad)" }, + { "(bad)" }, + { FGRPdb_4 }, + { "(bad)" }, + { "(bad)" }, + { "(bad)" }, + }, + /* dc */ + { + { "fadd", STi, ST }, + { "fmul", STi, ST }, + { "(bad)" }, + { "(bad)" }, + { "fsub", STi, ST }, + { "fsubr", STi, ST }, + { "fdiv", STi, ST }, + { "fdivr", STi, ST }, + }, + /* dd */ + { + { "ffree", STi }, + { "(bad)" }, + { "fst", STi }, + { "fstp", STi }, + { "fucom", STi }, + { "fucomp", STi }, + { "(bad)" }, + { "(bad)" }, + }, + /* de */ + { + { "faddp", STi, ST }, + { "fmulp", STi, ST }, + { "(bad)" }, + { FGRPde_3 }, + { "fsubp", STi, ST }, + { "fsubrp", STi, ST }, + { "fdivp", STi, ST }, + { "fdivrp", STi, ST }, + }, + /* df */ + { + { "(bad)" }, + { "(bad)" }, + { "(bad)" }, + { "(bad)" }, + { FGRPdf_4 }, + { "(bad)" }, + { "(bad)" }, + { "(bad)" }, + }, +}; + + +char *fgrps[][8] = { + /* d9_2 0 */ + { + "fnop","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", + }, + + /* d9_4 1 */ + { + "fchs","fabs","(bad)","(bad)","ftst","fxam","(bad)","(bad)", + }, + + /* d9_5 2 */ + { + "fld1","fldl2t","fldl2e","fldpi","fldlg2","fldln2","fldz","(bad)", + }, + + /* d9_6 3 */ + { + "f2xm1","fyl2x","fptan","fpatan","fxtract","fprem1","fdecstp","fincstp", + }, + + /* d9_7 4 */ + { + "fprem","fyl2xp1","fsqrt","fsincos","frndint","fscale","fsin","fcos", + }, + + /* da_5 5 */ + { + "(bad)","fucompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", + }, + + /* db_4 6 */ + { + "feni(287 only)","fdisi(287 only)","fNclex","fNinit", + "fNsetpm(287 only)","(bad)","(bad)","(bad)", + }, + + /* de_3 7 */ + { + "(bad)","fcompp","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", + }, + + /* df_4 8 */ + { + "fNstsw","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)","(bad)", + }, +}; + +static void +dofloat () +{ + struct dis386 *dp; + unsigned char floatop; + + floatop = codep[-1]; + + if (mod != 3) + { + putop (float_mem[(floatop - 0xd8) * 8 + reg]); + obufp = op1out; + OP_E (v_mode); + return; + } + codep++; + + dp = &float_reg[floatop - 0xd8][reg]; + if (dp->name == NULL) + { + putop (fgrps[dp->bytemode1][rm]); + /* instruction fnstsw is only one with strange arg */ + if (floatop == 0xdf + && FETCH_DATA (the_info, codep + 1) + && *codep == 0xe0) + strcpy (op1out, "%eax"); + } + else + { + putop (dp->name); + obufp = op1out; + if (dp->op1) + (*dp->op1)(dp->bytemode1); + obufp = op2out; + if (dp->op2) + (*dp->op2)(dp->bytemode2); + } +} + +/* ARGSUSED */ +int +OP_ST (ignore) + int ignore; +{ + oappend ("%st"); + return (0); +} + +/* ARGSUSED */ +int +OP_STi (ignore) + int ignore; +{ + sprintf (scratchbuf, "%%st(%d)", rm); + oappend (scratchbuf); + return (0); +} + + +/* capital letters in template are macros */ +static void +putop (template) + char *template; +{ + char *p; + + for (p = template; *p; p++) + { + switch (*p) + { + default: + *obufp++ = *p; + break; + case 'C': /* For jcxz/jecxz */ + if (aflag == 0) + *obufp++ = 'e'; + break; + case 'N': + if ((prefixes & PREFIX_FWAIT) == 0) + *obufp++ = 'n'; + break; + case 'S': + /* operand size flag */ + if (dflag) + *obufp++ = 'l'; + else + *obufp++ = 'w'; + break; + } + } + *obufp = 0; +} + +static void +oappend (s) + char *s; +{ + strcpy (obufp, s); + obufp += strlen (s); + *obufp = 0; +} + +static void +append_prefix () +{ + if (prefixes & PREFIX_CS) + oappend ("%cs:"); + if (prefixes & PREFIX_DS) + oappend ("%ds:"); + if (prefixes & PREFIX_SS) + oappend ("%ss:"); + if (prefixes & PREFIX_ES) + oappend ("%es:"); + if (prefixes & PREFIX_FS) + oappend ("%fs:"); + if (prefixes & PREFIX_GS) + oappend ("%gs:"); +} + +int +OP_indirE (bytemode) + int bytemode; +{ + oappend ("*"); + OP_E (bytemode); + return (0); +} + +int +OP_E (bytemode) + int bytemode; +{ + int disp; + int havesib; + int base; + int index; + int scale; + int havebase; + + /* skip mod/rm byte */ + codep++; + + havesib = 0; + havebase = 0; + disp = 0; + + if (mod == 3) + { + switch (bytemode) + { + case b_mode: + oappend (names8[rm]); + break; + case w_mode: + oappend (names16[rm]); + break; + case v_mode: + if (dflag) + oappend (names32[rm]); + else + oappend (names16[rm]); + break; + default: + oappend (""); + break; + } + return (0); + } + + append_prefix (); + + if (bytemode == w_mode || (bytemode == v_mode && !dflag)) + { + if (mod == 0 && rm == 6) + { + sprintf (scratchbuf, "0x%04.4x", get16 ()); + oappend (scratchbuf); + return 0; + } + + if (mod == 1) + { + FETCH_DATA (the_info, codep + 1); + disp = *(char *)codep++; + } + else if (mod == 2) + disp = get16 (); + else + disp = 0; + if (disp != 0) + { + sprintf (scratchbuf, "0x%x", disp & 0xffff); + oappend (scratchbuf); + } + + switch (rm) + { + case 0: + oappend ("(%bx,%si)"); + break; + case 1: + oappend ("(%bx,%di)"); + break; + case 2: + oappend ("(%bp,%si)"); + break; + case 3: + oappend ("(%bp,%di)"); + break; + case 4: + oappend ("(%si)"); + break; + case 5: + oappend ("(%di)"); + break; + case 6: + oappend ("(%bp)"); + break; + case 7: + oappend ("(%bx)"); + break; + } + return 0; + } + + if (rm == 4) + { + havesib = 1; + havebase = 1; + FETCH_DATA (the_info, codep + 1); + scale = (*codep >> 6) & 3; + index = (*codep >> 3) & 7; + base = *codep & 7; + codep++; + } + + switch (mod) + { + case 0: + switch (rm) + { + case 4: + /* implies havesib and havebase */ + if (base == 5) { + havebase = 0; + disp = get32 (); + } + break; + case 5: + disp = get32 (); + break; + default: + havebase = 1; + base = rm; + break; + } + break; + case 1: + FETCH_DATA (the_info, codep + 1); + disp = *(char *)codep++; + if (rm != 4) + { + havebase = 1; + base = rm; + } + break; + case 2: + disp = get32 (); + if (rm != 4) + { + havebase = 1; + base = rm; + } + break; + } + + if (mod != 0 || rm == 5 || (havesib && base == 5)) + { + sprintf (scratchbuf, "0x%x", disp); + oappend (scratchbuf); + } + + if (havebase || havesib) + { + oappend ("("); + if (havebase) + oappend (names32[base]); + if (havesib) + { + if (index != 4) + { + sprintf (scratchbuf, ",%s", names32[index]); + oappend (scratchbuf); + } + sprintf (scratchbuf, ",%d", 1 << scale); + oappend (scratchbuf); + } + oappend (")"); + } + return (0); +} + +int +OP_G (bytemode) + int bytemode; +{ + switch (bytemode) + { + case b_mode: + oappend (names8[reg]); + break; + case w_mode: + oappend (names16[reg]); + break; + case d_mode: + oappend (names32[reg]); + break; + case v_mode: + if (dflag) + oappend (names32[reg]); + else + oappend (names16[reg]); + break; + default: + oappend (""); + break; + } + return (0); +} + +static int +get32 () +{ + int x = 0; + + FETCH_DATA (the_info, codep + 4); + x = *codep++ & 0xff; + x |= (*codep++ & 0xff) << 8; + x |= (*codep++ & 0xff) << 16; + x |= (*codep++ & 0xff) << 24; + return (x); +} + +static int +get16 () +{ + int x = 0; + + FETCH_DATA (the_info, codep + 2); + x = *codep++ & 0xff; + x |= (*codep++ & 0xff) << 8; + return (x); +} + +static void +set_op (op) + int op; +{ + op_index[op_ad] = op_ad; + op_address[op_ad] = op; +} + +int +OP_REG (code) + int code; +{ + char *s; + + switch (code) + { + case indir_dx_reg: s = "(%dx)"; break; + case ax_reg: case cx_reg: case dx_reg: case bx_reg: + case sp_reg: case bp_reg: case si_reg: case di_reg: + s = names16[code - ax_reg]; + break; + case es_reg: case ss_reg: case cs_reg: + case ds_reg: case fs_reg: case gs_reg: + s = names_seg[code - es_reg]; + break; + case al_reg: case ah_reg: case cl_reg: case ch_reg: + case dl_reg: case dh_reg: case bl_reg: case bh_reg: + s = names8[code - al_reg]; + break; + case eAX_reg: case eCX_reg: case eDX_reg: case eBX_reg: + case eSP_reg: case eBP_reg: case eSI_reg: case eDI_reg: + if (dflag) + s = names32[code - eAX_reg]; + else + s = names16[code - eAX_reg]; + break; + default: + s = ""; + break; + } + oappend (s); + return (0); +} + +int +OP_I (bytemode) + int bytemode; +{ + int op; + + switch (bytemode) + { + case b_mode: + FETCH_DATA (the_info, codep + 1); + op = *codep++ & 0xff; + break; + case v_mode: + if (dflag) + op = get32 (); + else + op = get16 (); + break; + case w_mode: + op = get16 (); + break; + default: + oappend (""); + return (0); + } + sprintf (scratchbuf, "$0x%x", op); + oappend (scratchbuf); + return (0); +} + +int +OP_sI (bytemode) + int bytemode; +{ + int op; + + switch (bytemode) + { + case b_mode: + FETCH_DATA (the_info, codep + 1); + op = *(char *)codep++; + break; + case v_mode: + if (dflag) + op = get32 (); + else + op = (short)get16(); + break; + case w_mode: + op = (short)get16 (); + break; + default: + oappend (""); + return (0); + } + sprintf (scratchbuf, "$0x%x", op); + oappend (scratchbuf); + return (0); +} + +int +OP_J (bytemode) + int bytemode; +{ + int disp; + int mask = -1; + + switch (bytemode) + { + case b_mode: + FETCH_DATA (the_info, codep + 1); + disp = *(char *)codep++; + break; + case v_mode: + if (dflag) + disp = get32 (); + else + { + disp = (short)get16 (); + /* for some reason, a data16 prefix on a jump instruction + means that the pc is masked to 16 bits after the + displacement is added! */ + mask = 0xffff; + } + break; + default: + oappend (""); + return (0); + } + disp = (start_pc + codep - start_codep + disp) & mask; + set_op (disp); + sprintf (scratchbuf, "0x%x", disp); + oappend (scratchbuf); + return (0); +} + +/* ARGSUSED */ +int +OP_SEG (dummy) + int dummy; +{ + static char *sreg[] = { + "%es","%cs","%ss","%ds","%fs","%gs","%?","%?", + }; + + oappend (sreg[reg]); + return (0); +} + +int +OP_DIR (size) + int size; +{ + int seg, offset; + + switch (size) + { + case lptr: + if (aflag) + { + offset = get32 (); + seg = get16 (); + } + else + { + offset = get16 (); + seg = get16 (); + } + sprintf (scratchbuf, "0x%x,0x%x", seg, offset); + oappend (scratchbuf); + break; + case v_mode: + if (aflag) + offset = get32 (); + else + offset = (short)get16 (); + + offset = start_pc + codep - start_codep + offset; + set_op (offset); + sprintf (scratchbuf, "0x%x", offset); + oappend (scratchbuf); + break; + default: + oappend (""); + break; + } + return (0); +} + +/* ARGSUSED */ +int +OP_OFF (bytemode) + int bytemode; +{ + int off; + + if (aflag) + off = get32 (); + else + off = get16 (); + + sprintf (scratchbuf, "0x%x", off); + oappend (scratchbuf); + return (0); +} + +/* ARGSUSED */ +int +OP_ESDI (dummy) + int dummy; +{ + oappend ("%es:("); + oappend (aflag ? "%edi" : "%di"); + oappend (")"); + return (0); +} + +/* ARGSUSED */ +int +OP_DSSI (dummy) + int dummy; +{ + oappend ("%ds:("); + oappend (aflag ? "%esi" : "%si"); + oappend (")"); + return (0); +} + +/* ARGSUSED */ +int +OP_ONE (dummy) + int dummy; +{ + oappend ("1"); + return (0); +} + +/* ARGSUSED */ +int +OP_C (dummy) + int dummy; +{ + codep++; /* skip mod/rm */ + sprintf (scratchbuf, "%%cr%d", reg); + oappend (scratchbuf); + return (0); +} + +/* ARGSUSED */ +int +OP_D (dummy) + int dummy; +{ + codep++; /* skip mod/rm */ + sprintf (scratchbuf, "%%db%d", reg); + oappend (scratchbuf); + return (0); +} + +/* ARGSUSED */ +int +OP_T (dummy) + int dummy; +{ + codep++; /* skip mod/rm */ + sprintf (scratchbuf, "%%tr%d", reg); + oappend (scratchbuf); + return (0); +} + +int +OP_rm (bytemode) + int bytemode; +{ + switch (bytemode) + { + case d_mode: + oappend (names32[rm]); + break; + case w_mode: + oappend (names16[rm]); + break; + } + return (0); +} diff --git a/debugger/i386-pinsn.c b/debugger/opcodes/i386-dis.c-fsf similarity index 91% rename from debugger/i386-pinsn.c rename to debugger/opcodes/i386-dis.c-fsf index 9a633611ef9..7f9641dc156 100644 --- a/debugger/i386-pinsn.c +++ b/debugger/opcodes/i386-dis.c-fsf @@ -1,5 +1,5 @@ /* Print i386 instructions for GDB, the GNU debugger. - Copyright (C) 1988, 1989, 1991 Free Software Foundation, Inc. + Copyright (C) 1988, 1989, 1991, 1993, 1994 Free Software Foundation, Inc. This file is part of GDB. @@ -20,6 +20,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ /* * 80386 instruction printer by Pace Willisson (pace@prep.ai.mit.edu) * July 1988 + * modified by John Hassey (hassey@dg-rtp.dg.com) */ /* @@ -31,12 +32,51 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ * the Intel manual for details. */ -#include "defs.h" +#include "dis-asm.h" +#include "sysdep.h" -#include +#define MAXLEN 20 -/* For the GDB interface at the bottom of the file... */ -#include "gdbcore.h" +#include + +struct dis_private +{ + /* Points to first byte not fetched. */ + bfd_byte *max_fetched; + bfd_byte the_buffer[MAXLEN]; + bfd_vma insn_start; + jmp_buf bailout; +}; + +/* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive) + to ADDR (exclusive) are valid. Returns 1 for success, longjmps + on error. */ +#define FETCH_DATA(info, addr) \ + ((addr) <= ((struct dis_private *)(info->private_data))->max_fetched \ + ? 1 : fetch_data ((info), (addr))) + +static int +fetch_data (info, addr) + struct disassemble_info *info; + bfd_byte *addr; +{ + int status; + struct dis_private *priv = (struct dis_private *)info->private_data; + bfd_vma start = priv->insn_start + (priv->max_fetched - priv->the_buffer); + + status = (*info->read_memory_func) (start, + priv->max_fetched, + addr - priv->max_fetched, + info); + if (status != 0) + { + (*info->memory_error_func) (status, start, info); + longjmp (priv->bailout, 1); + } + else + priv->max_fetched = addr; + return 1; +} #define Eb OP_E, b_mode #define indirEb OP_indirE, b_mode @@ -376,8 +416,8 @@ struct dis386 dis386[] = { { "stosS", Yv, eAX }, { "lodsb", AL, Xb }, { "lodsS", eAX, Xv }, - { "scasb", AL, Xb }, - { "scasS", eAX, Xv }, + { "scasb", AL, Yb }, + { "scasS", eAX, Yv }, /* b0 */ { "movb", AL, Ib }, { "movb", CL, Ib }, @@ -481,7 +521,9 @@ struct dis386 dis386_twobyte[] = { { "clts" }, { "(bad)" }, /* 08 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "invd" }, + { "wbinvd" }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, /* 10 */ { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, @@ -587,8 +629,8 @@ struct dis386 dis386_twobyte[] = { { "(bad)" }, { "imulS", Gv, Ev }, /* b0 */ - { "(bad)" }, - { "(bad)" }, + { "cmpxchgb", Eb, Gb }, + { "cmpxchgS", Ev, Gv }, { "lssS", Gv, Mp }, /* 386 lists only Mp */ { "btrS", Ev, Gv }, { "lfsS", Gv, Mp }, /* 386 lists only Mp */ @@ -605,11 +647,19 @@ struct dis386 dis386_twobyte[] = { { "movsbS", Gv, Eb }, { "movswS", Gv, Ew }, /* c0 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "xaddb", Eb, Gb }, + { "xaddS", Ev, Gv }, + { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, /* c8 */ - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, - { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, + { "bswap", eAX }, + { "bswap", eCX }, + { "bswap", eDX }, + { "bswap", eBX }, + { "bswap", eSP }, + { "bswap", eBP }, + { "bswap", eSI }, + { "bswap", eDI }, /* d0 */ { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, { "(bad)" }, @@ -635,6 +685,7 @@ static char *obufp; static char scratchbuf[100]; static unsigned char *start_codep; static unsigned char *codep; +static disassemble_info *the_info; static int mod; static int rm; static int reg; @@ -817,7 +868,7 @@ struct dis386 grps[][8] = { { "smsw", Ew }, { "(bad)" }, { "lmsw", Ew }, - { "(bad)" }, + { "invlpg", Ew }, }, /* GRP8 */ { @@ -853,6 +904,7 @@ ckprefix () prefixes = 0; while (1) { + FETCH_DATA (the_info, codep + 1); switch (*codep) { case 0xf3: @@ -904,27 +956,21 @@ static int aflag; static char op1out[100], op2out[100], op3out[100]; static int op_address[3], op_ad, op_index[3]; static int start_pc; -extern void fputs_filtered (); + /* - * disassemble the first instruction in 'inbuf'. You have to make - * sure all of the bytes of the instruction are filled in. * On the 386's of 1988, the maximum length of an instruction is 15 bytes. * (see topic "Redundant prefixes" in the "Differences from 8086" * section of the "Virtual 8086 Mode" chapter.) * 'pc' should be the address of this instruction, it will * be used to print the target address if this is a relative jump or call - * 'outbuf' gets filled in with the disassembled instruction. it should - * be long enough to hold the longest disassembled instruction. - * 100 bytes is certainly enough, unless symbol printing is added later * The function returns the length of this instruction in bytes. */ int -i386dis (pc, inbuf, stream) - int pc; - unsigned char *inbuf; - FILE *stream; +print_insn_i386 (pc, info) + bfd_vma pc; + disassemble_info *info; { struct dis386 *dp; int i; @@ -932,19 +978,31 @@ i386dis (pc, inbuf, stream) char *first, *second, *third; int needcomma; + struct dis_private priv; + bfd_byte *inbuf = priv.the_buffer; + + info->private_data = (PTR) &priv; + priv.max_fetched = priv.the_buffer; + priv.insn_start = pc; + if (setjmp (priv.bailout) != 0) + /* Error return. */ + return -1; + obuf[0] = 0; op1out[0] = 0; op2out[0] = 0; op3out[0] = 0; op_index[0] = op_index[1] = op_index[2] = -1; - + + the_info = info; start_pc = pc; start_codep = inbuf; codep = inbuf; ckprefix (); - + + FETCH_DATA (info, codep + 1); if (*codep == 0xc8) enter_instruction = 1; else @@ -963,12 +1021,14 @@ i386dis (pc, inbuf, stream) && ((*codep < 0xd8) || (*codep > 0xdf))) { /* fwait not followed by floating point instruction */ - fputs_filtered ("fwait", stream); + (*info->fprintf_func) (info->stream, "fwait"); return (1); } /* these would be initialized to 0 if disassembling for 8086 or 286 */ - + dflag = 1; + aflag = 1; + if (prefixes & PREFIX_DATA) dflag ^= 1; @@ -979,14 +1039,24 @@ i386dis (pc, inbuf, stream) } if (*codep == 0x0f) - dp = &dis386_twobyte[*++codep]; + { + FETCH_DATA (info, codep + 2); + dp = &dis386_twobyte[*++codep]; + } else dp = &dis386[*codep]; codep++; + + /* Fetch the mod/reg/rm byte. FIXME: We should be only fetching + this if we need it. As it is, this code loses if there is a + one-byte instruction (without a mod/reg/rm byte) at the end of + the address space. */ + + FETCH_DATA (info, codep + 1); mod = (*codep >> 6) & 3; reg = (*codep >> 3) & 7; rm = *codep & 7; - + if (dp->name == NULL && dp->bytemode1 == FLOATCODE) { dofloat (); @@ -1018,7 +1088,7 @@ i386dis (pc, inbuf, stream) for (i = strlen (obuf); i < 6; i++) oappend (" "); oappend (" "); - fputs_filtered (obuf, stream); + (*info->fprintf_func) (info->stream, "%s", obuf); /* enter instruction is printed with operands in the * same order as the intel book; everything else @@ -1043,29 +1113,29 @@ i386dis (pc, inbuf, stream) if (*first) { if (op_index[0] != -1) - print_address (op_address[op_index[0]], stream); + (*info->print_address_func) (op_address[op_index[0]], info); else - fputs_filtered (first, stream); + (*info->fprintf_func) (info->stream, "%s", first); needcomma = 1; } if (*second) { if (needcomma) - fputs_filtered (",", stream); + (*info->fprintf_func) (info->stream, ","); if (op_index[1] != -1) - print_address (op_address[op_index[1]], stream); + (*info->print_address_func) (op_address[op_index[1]], info); else - fputs_filtered (second, stream); + (*info->fprintf_func) (info->stream, "%s", second); needcomma = 1; } if (*third) { if (needcomma) - fputs_filtered (",", stream); + (*info->fprintf_func) (info->stream, ","); if (op_index[2] != -1) - print_address (op_address[op_index[2]], stream); + (*info->print_address_func) (op_address[op_index[2]], info); else - fputs_filtered (third, stream); + (*info->fprintf_func) (info->stream, "%s", third); } return (codep - inbuf); } @@ -1321,7 +1391,9 @@ dofloat () { putop (fgrps[dp->bytemode1][rm]); /* instruction fnstsw is only one with strange arg */ - if (floatop == 0xdf && *codep == 0xe0) + if (floatop == 0xdf + && FETCH_DATA (the_info, codep + 1) + && *codep == 0xe0) strcpy (op1out, "%eax"); } else @@ -1467,61 +1539,11 @@ OP_E (bytemode) } append_prefix (); - - if (bytemode == w_mode || (bytemode == v_mode && !dflag)) - { - if (mod == 0 && rm == 6) - { - sprintf(scratchbuf, "%04.4x", get16()); - oappend(scratchbuf); - return 0; - } - - disp = 0; - if (mod == 1) - disp = *(char *)codep++; - else if (mod == 2) - disp = get16(); - if (disp != 0) - { - sprintf(scratchbuf, "0x%x", disp); - oappend(scratchbuf); - } - - switch (rm) - { - case 0: - oappend("(%bx,%si)"); - break; - case 1: - oappend("(%bx,%di)"); - break; - case 2: - oappend("(%bp,%si)"); - break; - case 3: - oappend("(%bp,%di)"); - break; - case 4: - oappend("(%si)"); - break; - case 5: - oappend("(%di)"); - break; - case 6: - oappend("(%bp)"); - break; - case 7: - oappend("(%bx)"); - break; - } - return 0; - } - if (rm == 4) { havesib = 1; havebase = 1; + FETCH_DATA (the_info, codep + 1); scale = (*codep >> 6) & 3; index = (*codep >> 3) & 7; base = *codep & 7; @@ -1550,6 +1572,7 @@ OP_E (bytemode) } break; case 1: + FETCH_DATA (the_info, codep + 1); disp = *(char *)codep++; if (rm != 4) { @@ -1625,7 +1648,8 @@ static int get32 () { int x = 0; - + + FETCH_DATA (the_info, codep + 4); x = *codep++ & 0xff; x |= (*codep++ & 0xff) << 8; x |= (*codep++ & 0xff) << 16; @@ -1637,7 +1661,8 @@ static int get16 () { int x = 0; - + + FETCH_DATA (the_info, codep + 2); x = *codep++ & 0xff; x |= (*codep++ & 0xff) << 8; return (x); @@ -1696,6 +1721,7 @@ OP_I (bytemode) switch (bytemode) { case b_mode: + FETCH_DATA (the_info, codep + 1); op = *codep++ & 0xff; break; case v_mode: @@ -1725,6 +1751,7 @@ OP_sI (bytemode) switch (bytemode) { case b_mode: + FETCH_DATA (the_info, codep + 1); op = *(char *)codep++; break; case v_mode: @@ -1755,6 +1782,7 @@ OP_J (bytemode) switch (bytemode) { case b_mode: + FETCH_DATA (the_info, codep + 1); disp = *(char *)codep++; break; case v_mode: @@ -1929,28 +1957,3 @@ OP_rm (bytemode) } return (0); } - -#define MAXLEN 20 - -int -print_insn (realmemaddr, memaddr, stream, addrlen) - CORE_ADDR memaddr, realmemaddr; - FILE *stream; - int addrlen; -{ - unsigned char buffer[MAXLEN]; - - if(addrlen == 32){ - dflag = 1; - aflag = 1; - } else { - dflag = 0; - aflag = 0; - }; - - - read_memory (memaddr, (char *) buffer, MAXLEN); - - return (i386dis ((int)realmemaddr, buffer, stream)); -} - diff --git a/debugger/obstack.h b/debugger/opcodes/obstack.h similarity index 70% rename from debugger/obstack.h rename to debugger/opcodes/obstack.h index 72832ee5505..28061a02193 100644 --- a/debugger/obstack.h +++ b/debugger/opcodes/obstack.h @@ -1,17 +1,17 @@ /* obstack.h - object stack macros - Copyright (C) 1988 Free Software Foundation, Inc. + Copyright (C) 1988, 89, 90, 91, 92, 93, 94 Free Software Foundation, Inc. This program is free software; you can redistribute it and/or modify it -under the terms of the GNU General Public License as published by the +under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. +GNU Library General Public License for more details. -You should have received a copy of the GNU General Public License +You should have received a copy of the GNU Library General Public License along with this program; if not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ @@ -41,7 +41,7 @@ as the first argument. One motivation for this package is the problem of growing char strings in symbol tables. Unless you are "fascist pig with a read-only mind" -[Gosper's immortal quote from HAKMEM item 154, out of context] you +--Gosper's immortal quote from HAKMEM item 154, out of context--you would not like to put any arbitrary upper limit on the length of your symbols. @@ -92,7 +92,7 @@ Summary: Exactly one object is growing in an obstack at any one time. You can run one obstack per control block. You may have as many control blocks as you dare. - Because of the way we do it, you can `unwind' a obstack + Because of the way we do it, you can `unwind' an obstack back to a previous state. (You may remove objects much as you would with a stack.) */ @@ -100,8 +100,8 @@ Summary: /* Don't do the contents of this file more than once. */ -#ifndef __OBSTACKS__ -#define __OBSTACKS__ +#ifndef __OBSTACK_H__ +#define __OBSTACK_H__ /* We use subtraction of (char *)0 instead of casting to int because on word-addressable machines a simple cast to int @@ -115,6 +115,29 @@ Summary: #define __INT_TO_PTR(P) ((P) + (char *)0) #endif +/* We need the type of the resulting object. In ANSI C it is ptrdiff_t + but in traditional C it is usually long. If we are in ANSI C and + don't already have ptrdiff_t get it. */ + +#if defined (__STDC__) && ! defined (offsetof) +#if defined (__GNUC__) && defined (IN_GCC) +/* On Next machine, the system's stddef.h screws up if included + after we have defined just ptrdiff_t, so include all of stddef.h. + Otherwise, define just ptrdiff_t, which is all we need. */ +#ifndef __NeXT__ +#define __need_ptrdiff_t +#endif +#endif + +#include +#endif + +#ifdef __STDC__ +#define PTR_INT_TYPE ptrdiff_t +#else +#define PTR_INT_TYPE long +#endif + struct _obstack_chunk /* Lives at front of each chunk. */ { char *limit; /* 1 past end of this chunk */ @@ -129,39 +152,33 @@ struct obstack /* control current object in current chunk */ char *object_base; /* address of object we are building */ char *next_free; /* where to add next char to current object */ char *chunk_limit; /* address of char after current chunk */ - int temp; /* Temporary for some macros. */ + PTR_INT_TYPE temp; /* Temporary for some macros. */ int alignment_mask; /* Mask of alignment for each object. */ struct _obstack_chunk *(*chunkfun) (); /* User's fcn to allocate a chunk. */ void (*freefun) (); /* User's function to free a chunk. */ - void *area_id; /* Select which region to alloc/free in */ - int flags; /* Miscellaneous special purpose flags */ + char *extra_arg; /* first arg for chunk alloc/dealloc funcs */ + unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */ + unsigned maybe_empty_object:1;/* There is a possibility that the current + chunk contains a zero-length object. This + prevents freeing the chunk if we allocate + a bigger chunk to replace it. */ + unsigned alloc_failed:1; /* chunk alloc func returned 0 */ }; -/* Declare bits for flags word. */ - -/* Means there is a possibility the current chunk contains a zero-length - object. This prevents freeing the chunk if we allocate a bigger chunk - to replace it. */ - -#define OBSTACK_MAYBE_EMPTY_OBJECT (1 << 0) - -/* Means that the allocation and deallocation functions take two arguments, - ala the mmalloc package. The first argument is a generic pointer that - is saved in the area_id member of the obstack struct. */ - -#define OBSTACK_MMALLOC_LIKE (1 << 1) - /* Declare the external functions we use; they are in obstack.c. */ #ifdef __STDC__ - extern void _obstack_newchunk (struct obstack *, int); - extern void _obstack_free (struct obstack *, void *); - extern void _obstack_begin (struct obstack *, int, int, - void *(*) (int), void (*) (int), void *, int); +extern void _obstack_newchunk (struct obstack *, int); +extern void _obstack_free (struct obstack *, void *); +extern int _obstack_begin (struct obstack *, int, int, + void *(*) (), void (*) ()); +extern int _obstack_begin_1 (struct obstack *, int, int, + void *(*) (), void (*) (), void *); #else - extern void _obstack_newchunk (); - extern void _obstack_free (); - extern void _obstack_begin (); +extern void _obstack_newchunk (); +extern void _obstack_free (); +extern int _obstack_begin (); +extern int _obstack_begin_1 (); #endif #ifdef __STDC__ @@ -211,7 +228,7 @@ int obstack_chunk_size (struct obstack *obstack); Note that this might not be the final address of the object because a new chunk might be needed to hold the final size. */ -#define obstack_base(h) ((h)->object_base) +#define obstack_base(h) ((h)->alloc_failed ? 0 : (h)->object_base) /* Size for allocating ordinary chunks. */ @@ -219,7 +236,7 @@ int obstack_chunk_size (struct obstack *obstack); /* Pointer to next byte not yet allocated in current chunk. */ -#define obstack_next_free(h) ((h)->next_free) +#define obstack_next_free(h) ((h)->alloc_failed ? 0 : (h)->next_free) /* Mask specifying low bits that should be clear in address of an object. */ @@ -227,16 +244,19 @@ int obstack_chunk_size (struct obstack *obstack); #define obstack_init(h) \ _obstack_begin ((h), 0, 0, \ - (void *(*) ()) obstack_chunk_alloc, (void (*) ())obstack_chunk_free, (void *) 0, 0) + (void *(*) ()) obstack_chunk_alloc, (void (*) ()) obstack_chunk_free) #define obstack_begin(h, size) \ _obstack_begin ((h), (size), 0, \ - (void *(*) ()) obstack_chunk_alloc, (void (*) ())obstack_chunk_free, (void *) 0, 0) + (void *(*) ()) obstack_chunk_alloc, (void (*) ()) obstack_chunk_free) -#define obstack_full_begin(h,size,alignment,chunkfun,freefun,area_id,flags) \ +#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \ _obstack_begin ((h), (size), (alignment), \ - (void *(*) ()) (chunkfun), (void (*) ()) (freefun), \ - (area_id), (flags)) + (void *(*) ()) (chunkfun), (void (*) ()) (freefun)) + +#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \ + _obstack_begin_1 ((h), (size), (alignment), \ + (void *(*) ()) (chunkfun), (void (*) ()) (freefun), (arg)) #define obstack_chunkfun(h, newchunkfun) \ ((h) -> chunkfun = (struct _obstack_chunk *(*)()) (newchunkfun)) @@ -261,6 +281,7 @@ int obstack_chunk_size (struct obstack *obstack); #define obstack_object_size(OBSTACK) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ + __o->alloc_failed ? 0 : \ (unsigned) (__o->next_free - __o->object_base); }) #define obstack_room(OBSTACK) \ @@ -268,38 +289,40 @@ int obstack_chunk_size (struct obstack *obstack); ({ struct obstack *__o = (OBSTACK); \ (unsigned) (__o->chunk_limit - __o->next_free); }) -/* Note that the call to _obstack_newchunk is enclosed in (..., 0) - so that we can avoid having void expressions - in the arms of the conditional expression. - Casting the third operand to void was tried before, - but some compilers won't accept it. */ #define obstack_grow(OBSTACK,where,length) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ int __len = (length); \ - ((__o->next_free + __len > __o->chunk_limit) \ - ? (_obstack_newchunk (__o, __len), 0) : 0); \ - bcopy (where, __o->next_free, __len); \ - __o->next_free += __len; \ + if (__o->next_free + __len > __o->chunk_limit) \ + _obstack_newchunk (__o, __len); \ + if (!__o->alloc_failed) \ + { \ + bcopy (where, __o->next_free, __len); \ + __o->next_free += __len; \ + } \ (void) 0; }) #define obstack_grow0(OBSTACK,where,length) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ int __len = (length); \ - ((__o->next_free + __len + 1 > __o->chunk_limit) \ - ? (_obstack_newchunk (__o, __len + 1), 0) : 0), \ - bcopy (where, __o->next_free, __len), \ - __o->next_free += __len, \ - *(__o->next_free)++ = 0; \ + if (__o->next_free + __len + 1 > __o->chunk_limit) \ + _obstack_newchunk (__o, __len + 1); \ + if (!__o->alloc_failed) \ + { \ + bcopy (where, __o->next_free, __len); \ + __o->next_free += __len; \ + *(__o->next_free)++ = 0; \ + } \ (void) 0; }) #define obstack_1grow(OBSTACK,datum) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ - ((__o->next_free + 1 > __o->chunk_limit) \ - ? (_obstack_newchunk (__o, 1), 0) : 0), \ - *(__o->next_free)++ = (datum); \ + if (__o->next_free + 1 > __o->chunk_limit) \ + _obstack_newchunk (__o, 1); \ + if (!__o->alloc_failed) \ + *(__o->next_free)++ = (datum); \ (void) 0; }) /* These assume that the obstack alignment is good enough for pointers or ints, @@ -309,29 +332,32 @@ __extension__ \ #define obstack_ptr_grow(OBSTACK,datum) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ - ((__o->next_free + sizeof (void *) > __o->chunk_limit) \ - ? (_obstack_newchunk (__o, sizeof (void *)), 0) : 0), \ - *(*(void ***)&__o->next_free)++ = ((void *)datum); \ + if (__o->next_free + sizeof (void *) > __o->chunk_limit) \ + _obstack_newchunk (__o, sizeof (void *)); \ + if (!__o->alloc_failed) \ + *((void **)__o->next_free)++ = ((void *)datum); \ (void) 0; }) #define obstack_int_grow(OBSTACK,datum) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ - ((__o->next_free + sizeof (int) > __o->chunk_limit) \ - ? (_obstack_newchunk (__o, sizeof (int)), 0) : 0), \ - *(*(int **)&__o->next_free)++ = ((int)datum); \ + if (__o->next_free + sizeof (int) > __o->chunk_limit) \ + _obstack_newchunk (__o, sizeof (int)); \ + if (!__o->alloc_failed) \ + *((int *)__o->next_free)++ = ((int)datum); \ (void) 0; }) -#define obstack_ptr_grow_fast(h,aptr) (*(*(void ***)&(h)->next_free)++ = (void *)aptr) -#define obstack_int_grow_fast(h,aint) (*(*(int **)&(h)->next_free)++ = (int)aint) +#define obstack_ptr_grow_fast(h,aptr) (*((void **)(h)->next_free)++ = (void *)aptr) +#define obstack_int_grow_fast(h,aint) (*((int *)(h)->next_free)++ = (int)aint) #define obstack_blank(OBSTACK,length) \ __extension__ \ ({ struct obstack *__o = (OBSTACK); \ int __len = (length); \ - ((__o->chunk_limit - __o->next_free < __len) \ - ? (_obstack_newchunk (__o, __len), 0) : 0); \ - __o->next_free += __len; \ + if (__o->chunk_limit - __o->next_free < __len) \ + _obstack_newchunk (__o, __len); \ + if (!__o->alloc_failed) \ + __o->next_free += __len; \ (void) 0; }) #define obstack_alloc(OBSTACK,length) \ @@ -357,16 +383,22 @@ __extension__ \ #define obstack_finish(OBSTACK) \ __extension__ \ ({ struct obstack *__o1 = (OBSTACK); \ - void *value = (void *) __o1->object_base; \ - if (__o1->next_free == value) \ - __o1->flags |= OBSTACK_MAYBE_EMPTY_OBJECT; \ - __o1->next_free \ - = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\ - & ~ (__o1->alignment_mask)); \ - ((__o1->next_free - (char *)__o1->chunk \ - > __o1->chunk_limit - (char *)__o1->chunk) \ - ? (__o1->next_free = __o1->chunk_limit) : 0); \ - __o1->object_base = __o1->next_free; \ + void *value; \ + if (__o1->alloc_failed) \ + value = 0; \ + else \ + { \ + value = (void *) __o1->object_base; \ + if (__o1->next_free == value) \ + __o1->maybe_empty_object = 1; \ + __o1->next_free \ + = __INT_TO_PTR ((__PTR_TO_INT (__o1->next_free)+__o1->alignment_mask)\ + & ~ (__o1->alignment_mask)); \ + if (__o1->next_free - (char *)__o1->chunk \ + > __o1->chunk_limit - (char *)__o1->chunk) \ + __o1->next_free = __o1->chunk_limit; \ + __o1->object_base = __o1->next_free; \ + } \ value; }) #define obstack_free(OBSTACK, OBJ) \ @@ -380,48 +412,61 @@ __extension__ \ #else /* not __GNUC__ or not __STDC__ */ #define obstack_object_size(h) \ - (unsigned) ((h)->next_free - (h)->object_base) + (unsigned) ((h)->alloc_failed ? 0 : (h)->next_free - (h)->object_base) #define obstack_room(h) \ (unsigned) ((h)->chunk_limit - (h)->next_free) +/* Note that the call to _obstack_newchunk is enclosed in (..., 0) + so that we can avoid having void expressions + in the arms of the conditional expression. + Casting the third operand to void was tried before, + but some compilers won't accept it. */ + #define obstack_grow(h,where,length) \ ( (h)->temp = (length), \ (((h)->next_free + (h)->temp > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ - bcopy (where, (h)->next_free, (h)->temp), \ - (h)->next_free += (h)->temp) + ((h)->alloc_failed ? 0 : \ + (bcopy (where, (h)->next_free, (h)->temp), \ + (h)->next_free += (h)->temp))) #define obstack_grow0(h,where,length) \ ( (h)->temp = (length), \ (((h)->next_free + (h)->temp + 1 > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), (h)->temp + 1), 0) : 0), \ - bcopy (where, (h)->next_free, (h)->temp), \ + ((h)->alloc_failed ? 0 : \ + (bcopy (where, (h)->next_free, (h)->temp), \ (h)->next_free += (h)->temp, \ - *((h)->next_free)++ = 0) + *((h)->next_free)++ = 0))) #define obstack_1grow(h,datum) \ ( (((h)->next_free + 1 > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), 1), 0) : 0), \ - *((h)->next_free)++ = (datum)) + ((h)->alloc_failed ? 0 : \ + (*((h)->next_free)++ = (datum)))) #define obstack_ptr_grow(h,datum) \ ( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \ - *(*(char ***)&(h)->next_free)++ = ((char *)datum)) + ((h)->alloc_failed ? 0 : \ + (*((char **)(((h)->next_free+=sizeof(char *))-sizeof(char *))) = ((char *)datum)))) #define obstack_int_grow(h,datum) \ ( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \ ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \ - *(*(int **)&(h)->next_free)++ = ((int)datum)) + ((h)->alloc_failed ? 0 : \ + (*((int *)(((h)->next_free+=sizeof(int))-sizeof(int))) = ((int)datum)))) + +#define obstack_ptr_grow_fast(h,aptr) (*((char **)(h)->next_free)++ = (char *)aptr) +#define obstack_int_grow_fast(h,aint) (*((int *)(h)->next_free)++ = (int)aint) -#define obstack_ptr_grow_fast(h,aptr) (*(*(char ***)&(h)->next_free)++ = (char *)aptr) -#define obstack_int_grow_fast(h,aint) (*(*(int **)&(h)->next_free)++ = (int)aint) #define obstack_blank(h,length) \ ( (h)->temp = (length), \ (((h)->chunk_limit - (h)->next_free < (h)->temp) \ ? (_obstack_newchunk ((h), (h)->temp), 0) : 0), \ - (h)->next_free += (h)->temp) + ((h)->alloc_failed ? 0 : \ + ((h)->next_free += (h)->temp))) #define obstack_alloc(h,length) \ (obstack_blank ((h), (length)), obstack_finish ((h))) @@ -433,8 +478,9 @@ __extension__ \ (obstack_grow0 ((h), (where), (length)), obstack_finish ((h))) #define obstack_finish(h) \ -( ((h)->next_free == (h)->object_base \ - ? (((h)->flags |= OBSTACK_MAYBE_EMPTY_OBJECT), 0) \ +( (h)->alloc_failed ? 0 : \ + (((h)->next_free == (h)->object_base \ + ? (((h)->maybe_empty_object = 1), 0) \ : 0), \ (h)->temp = __PTR_TO_INT ((h)->object_base), \ (h)->next_free \ @@ -444,7 +490,7 @@ __extension__ \ > (h)->chunk_limit - (char *)(h)->chunk) \ ? ((h)->next_free = (h)->chunk_limit) : 0), \ (h)->object_base = (h)->next_free, \ - __INT_TO_PTR ((h)->temp)) + __INT_TO_PTR ((h)->temp))) #ifdef __STDC__ #define obstack_free(h,obj) \ @@ -464,4 +510,4 @@ __extension__ \ #endif /* not __GNUC__ or not __STDC__ */ -#endif /* not __OBSTACKS__ */ +#endif /* not __OBSTACK_H__ */ diff --git a/debugger/tm-i386v.h b/debugger/tm-i386v.h deleted file mode 100644 index bfd0e35daa2..00000000000 --- a/debugger/tm-i386v.h +++ /dev/null @@ -1,324 +0,0 @@ -/* Macro definitions for i386, Unix System V. - Copyright 1986, 1987, 1989, 1991, 1992 Free Software Foundation, Inc. - -This file is part of GDB. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#if !defined (TM_I386V_H) -#define TM_I386V_H 1 - -/* - * Changes for 80386 by Pace Willisson (pace@prep.ai.mit.edu) - * July 1988 - */ - -#define TARGET_BYTE_ORDER LITTLE_ENDIAN - -/* define this if you don't have the extension to coff that allows - * file names to appear in the string table - * (aux.x_file.x_foff) - */ -#define COFF_NO_LONG_FILE_NAMES - -/* turn this on when rest of gdb is ready */ -#define IEEE_FLOAT - -/* Define this if the C compiler puts an underscore at the front - of external names before giving them to the linker. */ - -/* #define NAMES_HAVE_UNDERSCORE */ - -/* number of traps that happen between exec'ing the shell - * to run an inferior, and when we finally get to - * the inferior code. This is 2 on most implementations. - */ -#ifndef START_INFERIOR_TRAPS_EXPECTED -#define START_INFERIOR_TRAPS_EXPECTED 4 -#endif - -/* Offset from address of function to start of its code. - Zero on most machines. */ - -#define FUNCTION_START_OFFSET 0 - -/* Advance PC across any function entry prologue instructions - to reach some "real" code. */ - -#define SKIP_PROLOGUE(frompc) {(frompc) = i386_skip_prologue((frompc));} - -extern int -i386_skip_prologue PARAMS ((int)); - -/* Immediately after a function call, return the saved pc. - Can't always go through the frames for this because on some machines - the new frame is not set up until the new function executes - some instructions. */ - -#define SAVED_PC_AFTER_CALL(frame) \ - (read_memory_integer (read_register (SP_REGNUM), 4)) - -/* Address of end of stack space. */ - -#define STACK_END_ADDR 0x80000000 - -/* Stack grows downward. */ - -#define INNER_THAN < - -/* Sequence of bytes for breakpoint instruction. */ - -#define BREAKPOINT {0xcc} - -/* Amount PC must be decremented by after a breakpoint. - This is often the number of bytes in BREAKPOINT - but not always. */ - -#ifndef DECR_PC_AFTER_BREAK -#define DECR_PC_AFTER_BREAK 1 -#endif - -/* Nonzero if instruction at PC is a return instruction. */ - -#define ABOUT_TO_RETURN(pc) (read_memory_integer (pc, 1) == 0xc3) - -/* Return 1 if P points to an invalid floating point value. - LEN is the length in bytes -- not relevant on the 386. */ - -#define INVALID_FLOAT(p, len) (0) - -/* Say how long (ordinary) registers are. */ - -#define REGISTER_TYPE long - -/* Number of machine registers */ - -#define NUM_REGS 16 - -/* Initializer for an array of names of registers. - There should be NUM_REGS strings in this initializer. */ - -/* the order of the first 8 registers must match the compiler's - * numbering scheme (which is the same as the 386 scheme) - * also, this table must match regmap in i386-pinsn.c. - */ -#define REGISTER_NAMES { "eax", "ecx", "edx", "ebx", \ - "esp", "ebp", "esi", "edi", \ - "eip", "ps", "cs", "ss", \ - "ds", "es", "fs", "gs", \ - } - -/* Register numbers of various important registers. - Note that some of these values are "real" register numbers, - and correspond to the general registers of the machine, - and some are "phony" register numbers which are too large - to be actual register numbers as far as the user is concerned - but do serve to get the desired values when passed to read_register. */ - -#define FP_REGNUM 5 /* Contains address of executing stack frame */ -#define SP_REGNUM 4 /* Contains address of top of stack */ - -#define PC_REGNUM 8 -#define PS_REGNUM 9 - -/* Total amount of space needed to store our copies of the machine's - register state, the array `registers'. */ -#define REGISTER_BYTES (NUM_REGS * 4) - -/* Index within `registers' of the first byte of the space for - register N. */ - -#define REGISTER_BYTE(N) ((N)*4) - -/* Number of bytes of storage in the actual machine representation - for register N. */ - -#define REGISTER_RAW_SIZE(N) (4) - -/* Number of bytes of storage in the program's representation - for register N. */ - -#define REGISTER_VIRTUAL_SIZE(N) (4) - -/* Largest value REGISTER_RAW_SIZE can have. */ - -#define MAX_REGISTER_RAW_SIZE 4 - -/* Largest value REGISTER_VIRTUAL_SIZE can have. */ - -#define MAX_REGISTER_VIRTUAL_SIZE 4 - -/* Nonzero if register N requires conversion - from raw format to virtual format. */ - -#define REGISTER_CONVERTIBLE(N) (0) - -/* Convert data from raw format for register REGNUM - to virtual format for register REGNUM. */ - -#define REGISTER_CONVERT_TO_VIRTUAL(REGNUM,FROM,TO) \ - {memcpy ((TO), (FROM), 4);} - -/* Convert data from virtual format for register REGNUM - to raw format for register REGNUM. */ - -#define REGISTER_CONVERT_TO_RAW(REGNUM,FROM,TO) \ - {memcpy ((TO), (FROM), 4);} - -/* Return the GDB type object for the "standard" data type - of data in register N. */ -/* Perhaps si and di should go here, but potentially they could be - used for things other than address. */ -#define REGISTER_VIRTUAL_TYPE(N) \ - ((N) == PC_REGNUM || (N) == FP_REGNUM || (N) == SP_REGNUM ? \ - lookup_pointer_type (builtin_type_void) : builtin_type_int) - -/* Store the address of the place in which to copy the structure the - subroutine will return. This is called from call_function. */ - -#define STORE_STRUCT_RETURN(ADDR, SP) \ - { (SP) -= sizeof (ADDR); \ - write_memory ((SP), (char *) &(ADDR), sizeof (ADDR)); } - -/* Extract from an array REGBUF containing the (raw) register state - a function return value of type TYPE, and copy that, in virtual format, - into VALBUF. */ - -#define EXTRACT_RETURN_VALUE(TYPE,REGBUF,VALBUF) \ - memcpy ((VALBUF), (REGBUF), TYPE_LENGTH (TYPE)) - -/* Write into appropriate registers a function return value - of type TYPE, given in virtual format. */ - -#define STORE_RETURN_VALUE(TYPE,VALBUF) \ - write_register_bytes (0, VALBUF, TYPE_LENGTH (TYPE)) - -/* Extract from an array REGBUF containing the (raw) register state - the address in which a function should return its structure value, - as a CORE_ADDR (or an expression that can be used as one). */ - -#define EXTRACT_STRUCT_VALUE_ADDRESS(REGBUF) (*(int *)(REGBUF)) - - -/* Describe the pointer in each stack frame to the previous stack frame - (its caller). */ - -/* FRAME_CHAIN takes a frame's nominal address - and produces the frame's chain-pointer. */ - -#define FRAME_CHAIN(thisframe) \ - (!inside_entry_file ((thisframe)->pc) ? \ - read_memory_integer ((thisframe)->frame, 4) :\ - 0) - -/* Define other aspects of the stack frame. */ - -/* A macro that tells us whether the function invocation represented - by FI does not have a frame on the stack associated with it. If it - does not, FRAMELESS is set to 1, else 0. */ -#define FRAMELESS_FUNCTION_INVOCATION(FI, FRAMELESS) \ - (FRAMELESS) = frameless_look_for_prologue(FI) - -#define FRAME_SAVED_PC(FRAME) (read_memory_integer ((FRAME)->frame + 4, 4)) - -#define FRAME_ARGS_ADDRESS(fi) ((fi)->frame) - -#define FRAME_LOCALS_ADDRESS(fi) ((fi)->frame) - -/* Return number of args passed to a frame. - Can return -1, meaning no way to tell. */ - -#define FRAME_NUM_ARGS(numargs, fi) (numargs) = i386_frame_num_args(fi) - -#ifdef __STDC__ /* Forward decl's for prototypes */ -struct frame_info; -struct frame_saved_regs; -#endif - -extern int -i386_frame_num_args PARAMS ((struct frame_info *)); - -/* Return number of bytes at start of arglist that are not really args. */ - -#define FRAME_ARGS_SKIP 8 - -/* Put here the code to store, into a struct frame_saved_regs, - the addresses of the saved registers of frame described by FRAME_INFO. - This includes special registers such as pc and fp saved in special - ways in the stack frame. sp is even more special: - the address we return for it IS the sp for the next frame. */ - -#define FRAME_FIND_SAVED_REGS(frame_info, frame_saved_regs) \ -{ i386_frame_find_saved_regs ((frame_info), &(frame_saved_regs)); } - -extern void -i386_frame_find_saved_regs PARAMS ((struct frame_info *, - struct frame_saved_regs *)); - - -/* Things needed for making the inferior call functions. */ - -/* Push an empty stack frame, to record the current PC, etc. */ - -#define PUSH_DUMMY_FRAME { i386_push_dummy_frame (); } - -extern void -i386_push_dummy_frame PARAMS ((void)); - -/* Discard from the stack the innermost frame, restoring all registers. */ - -#define POP_FRAME { i386_pop_frame (); } - -extern void -i386_pop_frame PARAMS ((void)); - -/* this is - * call 11223344 (32 bit relative) - * int3 - */ - -#define CALL_DUMMY { 0x223344e8, 0xcc11 } - -#define CALL_DUMMY_LENGTH 8 - -#define CALL_DUMMY_START_OFFSET 0 /* Start execution at beginning of dummy */ - -/* Insert the specified number of args and function address - into a call sequence of the above form stored at DUMMYNAME. */ - -#define FIX_CALL_DUMMY(dummyname, pc, fun, nargs, args, type, gcc_p) \ -{ \ - int from, to, delta, loc; \ - loc = (int)(read_register (SP_REGNUM) - CALL_DUMMY_LENGTH); \ - from = loc + 5; \ - to = (int)(fun); \ - delta = to - from; \ - *((char *)(dummyname) + 1) = (delta & 0xff); \ - *((char *)(dummyname) + 2) = ((delta >> 8) & 0xff); \ - *((char *)(dummyname) + 3) = ((delta >> 16) & 0xff); \ - *((char *)(dummyname) + 4) = ((delta >> 24) & 0xff); \ -} - -extern void -print_387_control_word PARAMS ((unsigned int)); - -extern void -print_387_status_word PARAMS ((unsigned int)); - -/* Offset from SP to first arg on stack at first instruction of a function */ - -#define SP_ARG0 (1 * 4) - -#endif /* !defined (TM_I386V_H) */ diff --git a/debugger/tm.h b/debugger/tm.h deleted file mode 100644 index f36505f5ac1..00000000000 --- a/debugger/tm.h +++ /dev/null @@ -1,27 +0,0 @@ -/* Macro definitions for linux. - Copyright (C) 1992 Free Software Foundation, Inc. -This file is part of GDB. -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#if !defined (TM_LINUX_H) -#define TM_LINUX_H 1 -/* number of traps that happen between exec'ing the shell - * to run an inferior, and when we finally get to - * the inferior code. This is 2 on most implementations. - */ -#define START_INFERIOR_TRAPS_EXPECTED 2 -#include "tm-i386v.h" -/* Define this if the C compiler puts an underscore at the front - of external names before giving them to the linker. */ -#define NAMES_HAVE_UNDERSCORE -#endif /* !defined (TM_LINUX_H) */ diff --git a/debugger/xm-i386v.h b/debugger/xm-i386v.h deleted file mode 100644 index cff23190cdf..00000000000 --- a/debugger/xm-i386v.h +++ /dev/null @@ -1,45 +0,0 @@ -/* Host support for i386. - Copyright 1986, 1987, 1989, 1992 Free Software Foundation, Inc. - Changes for 80386 by Pace Willisson (pace@prep.ai.mit.edu), July 1988. - -This file is part of GDB. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#define HOST_BYTE_ORDER LITTLE_ENDIAN - -/* I'm running gdb 3.4 under 386/ix 2.0.2, which is a derivative of AT&T's -Sys V/386 3.2. - -On some machines, gdb crashes when it's starting up while calling the -vendor's termio tgetent() routine. It always works when run under -itself (actually, under 3.2, it's not an infinitely recursive bug.) -After some poking around, it appears that depending on the environment -size, or whether you're running YP, or the phase of the moon or something, -the stack is not always long-aligned when main() is called, and tgetent() -takes strong offense at that. On some machines this bug never appears, but -on those where it does, it occurs quite reliably. */ -#define ALIGN_STACK_ON_STARTUP - -/* define USG if you are using sys5 /usr/include's */ -#define USG - -#define HAVE_TERMIO - -/* This is the amount to subtract from u.u_ar0 - to get the offset in the core file of the register values. */ - -#define KERNEL_U_ADDR 0xe0000000 - diff --git a/debugger/xm.h b/debugger/xm.h deleted file mode 100644 index f265c737678..00000000000 --- a/debugger/xm.h +++ /dev/null @@ -1,26 +0,0 @@ -/* Native support for linux, for GDB, the GNU debugger. - Copyright (C) 1986, 1987, 1989, 1992 Free Software Foundation, Inc. - -This file is part of GDB. - -This program is free software; you can redistribute it and/or modify -it under the terms of the GNU General Public License as published by -the Free Software Foundation; either version 2 of the License, or -(at your option) any later version. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU General Public License for more details. - -You should have received a copy of the GNU General Public License -along with this program; if not, write to the Free Software -Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ - -#include "xm-i386v.h" - -/* This is the amount to subtract from u.u_ar0 - to get the offset in the core file of the register values. */ -#undef KERNEL_U_ADDR -#define KERNEL_U_ADDR 0x0 -#define PSIGNAL_IN_SIGNAL_H diff --git a/etc/commdlg-ordinals b/etc/commdlg-ordinals new file mode 100644 index 00000000000..b4c9e2a17e5 --- /dev/null +++ b/etc/commdlg-ordinals @@ -0,0 +1,26 @@ + 1 2 0c17 GETOPENFILENAME exported, shared data + 2 2 0c48 GETSAVEFILENAME exported, shared data + 5 1 0ea1 CHOOSECOLOR exported, shared data + 6 2 42a3 FILEOPENDLGPROC exported, shared data + 7 2 446a FILESAVEDLGPROC exported, shared data + 8 1 0197 COLORDLGPROC exported, shared data + 9 6 0000 LOADALTERBITMAP exported, shared data + 11 5 0000 FINDTEXT exported, shared data + 12 5 019c REPLACETEXT exported, shared data + 13 5 036d FINDTEXTDLGPROC exported, shared data + 14 5 0582 REPLACETEXTDLGPROC exported, shared data + 15 4 0000 CHOOSEFONT exported, shared data + 16 4 02b0 FORMATCHARDLGPROC exported, shared data + 18 4 184e FONTSTYLEENUMPROC exported, shared data + 19 4 1096 FONTFAMILYENUMPROC exported, shared data + 20 3 0c94 PRINTDLG exported, shared data + 21 3 371f PRINTDLGPROC exported, shared data + 22 3 307a PRINTSETUPDLGPROC exported, shared data + 23 3 0000 EDITINTEGERONLY exported, shared data + 25 1 1b46 WANTARROWS exported, shared data + 26 6 01e7 COMMDLGEXTENDEDERROR exported, shared data + 27 2 0c79 GETFILETITLE exported, shared data + 28 6 01ad WEP exported, shared data + 29 2 10a5 DWLBSUBCLASS exported, shared data + 30 3 0056 DWUPARROWHACK exported, shared data + 31 2 100f DWOKSUBCLASS exported, shared data diff --git a/etc/ddeml-ordinals b/etc/ddeml-ordinals new file mode 100644 index 00000000000..e4588c5db37 --- /dev/null +++ b/etc/ddeml-ordinals @@ -0,0 +1,38 @@ + 1 2 002c WEP exported, shared data + 2 1 0010 DDEINITIALIZE exported, shared data + 3 1 03ae DDEUNINITIALIZE exported, shared data + 4 1 068a DDECONNECTLIST exported, shared data + 5 1 0948 DDEQUERYNEXTSERVER exported, shared data + 6 1 0a46 DDEDISCONNECTLIST exported, shared data + 7 1 0aac DDECONNECT exported, shared data + 8 1 0b4a DDEDISCONNECT exported, shared data + 9 1 0dac DDEQUERYCONVINFO exported, shared data + 10 1 1020 DDESETUSERHANDLE exported, shared data + 11 1 1204 DDECLIENTTRANSACTION exported, shared data + 12 1 1bf0 DDEABANDONTRANSACTION exported, shared data + 13 1 1118 DDEPOSTADVISE exported, shared data + 14 1 14e8 DDECREATEDATAHANDLE exported, shared data + 15 1 1598 DDEADDDATA exported, shared data + 16 1 17a8 DDEGETDATA exported, shared data + 17 1 188a DDEACCESSDATA exported, shared data + 18 1 1916 DDEUNACCESSDATA exported, shared data + 19 1 1946 DDEFREEDATAHANDLE exported, shared data + 20 1 14a8 DDEGETLASTERROR exported, shared data + 21 1 19a4 DDECREATESTRINGHANDLE exported, shared data + 22 1 1a40 DDEFREESTRINGHANDLE exported, shared data + 23 1 1b14 DDEQUERYSTRING exported, shared data + 24 1 1aac DDEKEEPSTRINGHANDLE exported, shared data + 26 1 1d98 DDEENABLECALLBACK exported, shared data + 27 1 1ed4 DDENAMESERVICE exported, shared data + 28 1 4614 CLIENTWNDPROC exported, shared data + 29 1 523a SERVERWNDPROC exported, shared data + 30 1 5480 SUBFRAMEWNDPROC exported, shared data + 31 1 5558 DMGWNDPROC exported, shared data + 32 1 5758 CONVLISTWNDPROC exported, shared data + 33 1 35f2 MONITORWNDPROC exported, shared data + 34 1 2fb0 DDESENDHOOKPROC exported, shared data + 35 1 309e DDEPOSTHOOKPROC exported, shared data + 36 1 1bb0 DDECMPSTRINGHANDLES exported, shared data + 37 1 0be0 DDERECONNECT exported, shared data + 38 1 6b8a INITENUM exported, shared data + 39 1 036a TERMDLGPROC exported, shared data diff --git a/etc/lzexpand-ordinals b/etc/lzexpand-ordinals new file mode 100644 index 00000000000..803da9589df --- /dev/null +++ b/etc/lzexpand-ordinals @@ -0,0 +1,12 @@ + 1 4 015c LZCOPY exported, shared data + 2 2 0262 LZOPENFILE exported, shared data + 3 2 0000 LZINIT exported, shared data + 4 2 02ee LZSEEK exported, shared data + 5 2 03d6 LZREAD exported, shared data + 6 2 06f0 LZCLOSE exported, shared data + 7 4 0000 LZSTART exported, shared data + 8 4 013a COPYLZFILE exported, shared data + 9 4 00a6 LZDONE exported, shared data + 10 2 01bc GETEXPANDEDNAME exported, shared data + 11 3 0000 WEP exported, shared data + 12 11 035e ___EXPORTEDSTUB exported, shared data diff --git a/etc/mmsystem-ordinals b/etc/mmsystem-ordinals new file mode 100644 index 00000000000..6f0a2682042 --- /dev/null +++ b/etc/mmsystem-ordinals @@ -0,0 +1,136 @@ + 1 2 0014 WEP exported, shared data + 2 4 0000 SNDPLAYSOUND exported, shared data + 5 2 02b0 MMSYSTEMGETVERSION exported, shared data + 6 4 0028 DRIVERPROC exported, shared data + 30 1 030a OUTPUTDEBUGSTR exported, shared data + 31 1 03ab DRIVERCALLBACK exported, shared data + 32 1 0312 STACKENTER exported, shared data + 33 1 0370 STACKLEAVE exported, shared data + 34 2 0484 MMDRVINSTALL exported, shared data +101 8 005d JOYGETNUMDEVS exported, shared data +102 8 001a JOYGETDEVCAPS exported, shared data +103 8 0073 JOYGETPOS exported, shared data +104 8 00b5 JOYGETTHRESHOLD exported, shared data +105 8 00ec JOYRELEASECAPTURE exported, shared data +106 8 013e JOYSETCAPTURE exported, shared data +107 8 021d JOYSETTHRESHOLD exported, shared data +109 8 0251 JOYSETCALIBRATION exported, shared data +1100 4 057e DRVOPEN exported, shared data +1101 4 0583 DRVCLOSE exported, shared data +1102 4 058d DRVSENDMESSAGE exported, shared data +1103 4 0588 DRVGETMODULEHANDLE exported, shared data +1104 4 0592 DRVDEFDRIVERPROC exported, shared data +1210 7 02a5 MMIOOPEN exported, shared data +1211 7 0457 MMIOCLOSE exported, shared data +1212 7 04b4 MMIOREAD exported, shared data +1213 7 062b MMIOWRITE exported, shared data +1214 7 07e9 MMIOSEEK exported, shared data +1215 7 0929 MMIOGETINFO exported, shared data +1216 7 0996 MMIOSETINFO exported, shared data +1217 7 0a68 MMIOSETBUFFER exported, shared data +1218 7 0cd8 MMIOFLUSH exported, shared data +1219 7 0da7 MMIOADVANCE exported, shared data +1220 7 0ed3 MMIOSTRINGTOFOURCC exported, shared data +1221 7 0f6e MMIOINSTALLIOPROC exported, shared data +1222 7 1073 MMIOSENDMESSAGE exported, shared data +1223 7 1360 MMIODESCEND exported, shared data +1224 7 1562 MMIOASCEND exported, shared data +1225 7 16a5 MMIOCREATECHUNK exported, shared data +1226 7 01d2 MMIORENAME exported, shared data +201 6 015f MIDIOUTGETNUMDEVS exported, shared data +202 6 016a MIDIOUTGETDEVCAPS exported, shared data +203 6 0266 MIDIOUTGETERRORTEXT exported, shared data +204 6 02a7 MIDIOUTOPEN exported, shared data +205 6 03c4 MIDIOUTCLOSE exported, shared data +206 6 0410 MIDIOUTPREPAREHEADER exported, shared data +207 6 0485 MIDIOUTUNPREPAREHEADER exported, shared data +208 1 0121 MIDIOUTSHORTMSG exported, shared data +209 1 0156 MIDIOUTLONGMSG exported, shared data +210 1 01b4 MIDIOUTRESET exported, shared data +211 6 01b6 MIDIOUTGETVOLUME exported, shared data +212 6 01f7 MIDIOUTSETVOLUME exported, shared data +213 6 04ff MIDIOUTCACHEPATCHES exported, shared data +214 6 0571 MIDIOUTCACHEDRUMPATCHES exported, shared data +215 6 0a5c MIDIOUTGETID exported, shared data +216 1 00eb MIDIOUTMESSAGE exported, shared data +301 6 05e3 MIDIINGETNUMDEVS exported, shared data +302 6 0625 MIDIINGETDEVCAPS exported, shared data +303 6 0671 MIDIINGETERRORTEXT exported, shared data +304 6 06b2 MIDIINOPEN exported, shared data +305 6 07cf MIDIINCLOSE exported, shared data +306 6 081b MIDIINPREPAREHEADER exported, shared data +307 6 0890 MIDIINUNPREPAREHEADER exported, shared data +308 6 090a MIDIINADDBUFFER exported, shared data +309 6 0976 MIDIINSTART exported, shared data +310 6 09aa MIDIINSTOP exported, shared data +311 6 09de MIDIINRESET exported, shared data +312 6 0a12 MIDIINGETID exported, shared data +313 6 05ee MIDIINMESSAGE exported, shared data +350 8 0531 AUXGETNUMDEVS exported, shared data +351 8 053c AUXGETDEVCAPS exported, shared data +352 8 0582 AUXGETVOLUME exported, shared data +353 8 05bd AUXSETVOLUME exported, shared data +354 8 04df AUXOUTMESSAGE exported, shared data +401 3 0866 WAVEOUTGETNUMDEVS exported, shared data +402 3 08a6 WAVEOUTGETDEVCAPS exported, shared data +403 3 09a2 WAVEOUTGETERRORTEXT exported, shared data +404 3 09e3 WAVEOUTOPEN exported, shared data +405 3 0b81 WAVEOUTCLOSE exported, shared data +406 3 0bc8 WAVEOUTPREPAREHEADER exported, shared data +407 3 0c54 WAVEOUTUNPREPAREHEADER exported, shared data +408 3 0cdd WAVEOUTWRITE exported, shared data +409 3 0d4a WAVEOUTPAUSE exported, shared data +410 3 0d7c WAVEOUTRESTART exported, shared data +411 3 0dae WAVEOUTRESET exported, shared data +412 3 0e12 WAVEOUTGETPOSITION exported, shared data +413 3 0e62 WAVEOUTGETPITCH exported, shared data +414 3 0eb0 WAVEOUTSETPITCH exported, shared data +415 3 08f2 WAVEOUTGETVOLUME exported, shared data +416 3 0933 WAVEOUTSETVOLUME exported, shared data +417 3 0ee4 WAVEOUTGETPLAYBACKRATE exported, shared data +418 3 0f32 WAVEOUTSETPLAYBACKRATE exported, shared data +419 3 0de0 WAVEOUTBREAKLOOP exported, shared data +420 3 14bf WAVEOUTGETID exported, shared data +421 3 0871 WAVEOUTMESSAGE exported, shared data +501 3 0f66 WAVEINGETNUMDEVS exported, shared data +502 3 0fa6 WAVEINGETDEVCAPS exported, shared data +503 3 0ff2 WAVEINGETERRORTEXT exported, shared data +504 3 1033 WAVEINOPEN exported, shared data +505 3 11d1 WAVEINCLOSE exported, shared data +506 3 1218 WAVEINPREPAREHEADER exported, shared data +507 3 129c WAVEINUNPREPAREHEADER exported, shared data +508 3 1325 WAVEINADDBUFFER exported, shared data +509 3 138f WAVEINSTART exported, shared data +510 3 13c1 WAVEINSTOP exported, shared data +511 3 13f3 WAVEINRESET exported, shared data +512 3 1425 WAVEINGETPOSITION exported, shared data +513 3 1475 WAVEINGETID exported, shared data +514 3 0f71 WAVEINMESSAGE exported, shared data +601 1 0000 TIMEGETSYSTEMTIME exported, shared data +602 1 0029 TIMESETEVENT exported, shared data +603 1 0292 TIMEKILLEVENT exported, shared data +604 8 0000 TIMEGETDEVCAPS exported, shared data +605 1 0288 TIMEBEGINPERIOD exported, shared data +606 1 028d TIMEENDPERIOD exported, shared data +607 1 029a TIMEGETTIME exported, shared data +701 5 04af MCISENDCOMMAND exported, shared data +702 5 1258 MCISENDSTRING exported, shared data +703 5 1588 MCIGETDEVICEID exported, shared data +704 5 3994 MCIPARSECOMMAND exported, shared data +705 5 2d4c MCILOADCOMMANDRESOURCE exported, shared data +706 5 136f MCIGETERRORSTRING exported, shared data +707 5 2a1d MCISETDRIVERDATA exported, shared data +708 5 29d3 MCIGETDRIVERDATA exported, shared data +710 5 2a6f MCIDRIVERYIELD exported, shared data +711 1 0275 MCIDRIVERNOTIFY exported, shared data +712 5 1293 MCIEXECUTE exported, shared data +713 5 2fb9 MCIFREECOMMANDRESOURCE exported, shared data +714 5 2acd MCISETYIELDPROC exported, shared data +715 5 1454 MCIGETDEVICEIDFROMELEMENTID exported, shared data +716 5 2b3c MCIGETYIELDPROC exported, shared data +717 5 15a5 MCIGETCREATORTASK exported, shared data +900 4 05fa MMTASKCREATE exported, shared data +902 4 05be MMTASKBLOCK exported, shared data +903 1 0264 MMTASKSIGNAL exported, shared data +904 4 05b9 MMGETCURRENTTASK exported, shared data +905 4 0598 MMTASKYIELD exported, shared data diff --git a/etc/netapi20-ordinals b/etc/netapi20-ordinals new file mode 100644 index 00000000000..3666511fe40 --- /dev/null +++ b/etc/netapi20-ordinals @@ -0,0 +1,146 @@ + 1 3 0000 NETACCESSADD exported, shared data + 2 3 0128 NETACCESSDEL exported, shared data + 3 3 01ea NETACCESSENUM exported, shared data + 4 3 0318 NETACCESSGETINFO exported, shared data + 5 3 042a NETACCESSSETINFO exported, shared data + 6 4 0030 NETALERTRAISE exported, shared data + 7 4 0000 NETALERTSTART exported, shared data + 8 4 0018 NETALERTSTOP exported, shared data + 9 10 00f4 NETAUDITCLEAR exported, shared data + 10 10 024a NETAUDITOPEN exported, shared data + 11 10 0000 NETAUDITWRITE exported, shared data + 12 3 0110 NETACCESSCHECK exported, shared data + 13 12 0000 NETBIOSCLOSE exported, shared data + 14 12 0018 NETBIOSENUM exported, shared data + 15 12 0030 NETBIOSGETINFO exported, shared data + 16 12 0048 NETBIOSOPEN exported, shared data + 17 12 0060 NETBIOSSUBMIT exported, shared data + 18 7 0000 NETCHARDEVCONTROL exported, shared data + 19 7 0056 NETCHARDEVENUM exported, shared data + 20 7 00f2 NETCHARDEVGETINFO exported, shared data + 21 7 016e NETCHARDEVQENUM exported, shared data + 22 7 043c NETCHARDEVQGETINFO exported, shared data + 23 7 04b2 NETCHARDEVQPURGE exported, shared data + 24 7 0562 NETCHARDEVQSETINFO exported, shared data + 25 6 0330 NETCONFIGGET exported, shared data + 26 6 0150 NETCONFIGGETALL exported, shared data + 27 18 0000 NETCONNECTIONENUM exported, shared data + 28 1 00a8 WEP exported, shared data + 29 10 0030 NETERRORLOGCLEAR exported, shared data + 30 10 01c0 NETERRORLOGOPEN exported, shared data + 31 10 0018 NETERRORLOGWRITE exported, shared data + 32 18 0256 NETFILECLOSE exported, shared data + 33 18 044a NETFILEENUM exported, shared data + 34 18 0516 NETFILEGETINFO exported, shared data + 35 3 05f8 NETGROUPADD exported, shared data + 36 3 067e NETGROUPADDUSER exported, shared data + 37 3 06dc NETGROUPDEL exported, shared data + 38 3 073a NETGROUPDELUSER exported, shared data + 39 3 0798 NETGROUPENUM exported, shared data + 40 3 0894 NETGROUPGETUSERS exported, shared data + 43 11 01cc NETMESSAGELOGFILEGET exported, shared data + 44 11 0338 NETMESSAGELOGFILESET exported, shared data + 45 11 0718 NETMESSAGENAMEADD exported, shared data + 46 11 0844 NETMESSAGENAMEDEL exported, shared data + 47 11 096c NETMESSAGENAMEENUM exported, shared data + 48 11 0d2a NETMESSAGENAMEFWD exported, shared data + 49 11 0b00 NETMESSAGENAMEGETINFO exported, shared data + 50 11 0d7a NETMESSAGENAMEUNFWD exported, shared data + 51 13 0000 NETPROFILELOAD exported, shared data + 52 13 037e NETPROFILESAVE exported, shared data + 53 18 0b98 NETSERVERADMINCOMMAND exported, shared data + 54 18 00b8 NETSERVERDISKENUM exported, shared data + 55 18 0c62 NETSERVERGETINFO exported, shared data + 56 18 0cf2 NETSERVERSETINFO exported, shared data + 57 19 0134 NETSERVICECONTROL exported, shared data + 58 19 02f0 NETSERVICEENUM exported, shared data + 59 19 044a NETSERVICEINSTALL exported, shared data + 60 19 011c NETSERVICESTATUS exported, shared data + 61 18 0676 NETSESSIONDEL exported, shared data + 62 18 05c4 NETSESSIONENUM exported, shared data + 63 18 06dc NETSESSIONGETINFO exported, shared data + 64 18 0798 NETSHAREADD exported, shared data + 65 18 0968 NETSHARECHECK exported, shared data + 66 18 082a NETSHAREDEL exported, shared data + 67 18 09d6 NETSHAREENUM exported, shared data + 68 18 0ab6 NETSHAREGETINFO exported, shared data + 69 18 08a2 NETSHARESETINFO exported, shared data + 70 18 0d88 NETSTATISTICSCLEAR exported, shared data + 71 18 0de0 NETSTATISTICSGET exported, shared data + 72 16 06f2 NETREMOTETOD exported, shared data + 73 21 0000 NETUSEADD exported, shared data + 74 21 032a NETUSEDEL exported, shared data + 75 21 0502 NETUSEENUM exported, shared data + 76 21 0664 NETUSEGETINFO exported, shared data + 77 3 0ab8 NETUSERADD exported, shared data + 78 3 0c26 NETUSERDEL exported, shared data + 79 3 0c84 NETUSERENUM exported, shared data + 80 3 0f9a NETUSERGETGROUPS exported, shared data + 81 3 0ef4 NETUSERGETINFO exported, shared data + 82 3 1132 NETUSERPASSWORDSET exported, shared data + 83 3 0d2c NETUSERSETINFO exported, shared data + 84 9 0858 NETWKSTAGETINFO exported, shared data + 85 9 0a22 NETWKSTASETINFO exported, shared data + 86 9 0000 NETWKSTASETUID exported, shared data + 91 16 0380 NETREMOTEMOVE exported, shared data + 92 16 0000 NETREMOTECOPY exported, shared data + 93 16 0368 NETREMOTEEXEC exported, shared data +105 3 1570 NETUSERVALIDATE exported, shared data +116 19 0000 NETSERVICEGETINFO exported, shared data +117 7 050a NETCHARDEVQPURGESELF exported, shared data +172 3 0506 NETACCESSGETUSERPERMS exported, shared data +174 7 0226 NETHANDLEGETINFO exported, shared data +175 7 0326 NETHANDLESETINFO exported, shared data +176 3 0974 NETGROUPSETUSERS exported, shared data +177 3 0816 NETGROUPGETINFO exported, shared data +178 3 08fe NETGROUPSETINFO exported, shared data +179 3 1404 NETUSERSETGROUPS exported, shared data +182 3 1588 NETUSERVALIDATE2 exported, shared data +184 3 1004 NETUSERMODALSGET exported, shared data +185 3 10a2 NETUSERMODALSSET exported, shared data +186 3 0d14 NETUSERINIT exported, shared data +189 26 0000 NETGETDCNAME exported, shared data +196 6 01e0 NETCONFIGGET2 exported, shared data +197 6 0000 NETCONFIGGETALL2 exported, shared data +198 18 0e5e NETSTATISTICSGET2 exported, shared data +199 10 02f4 NETERRORLOGREAD exported, shared data +200 10 04b2 NETAUDITREAD exported, shared data +201 18 02ae NETFILEENUM2 exported, shared data +259 17 0000 NETUSERRESTRICT exported, shared data +266 26 06dc NETLOGONENUM exported, shared data +277 9 027c NETWKSTASETUID2 exported, shared data +280 18 0f9e NETFILEGETINFO2 exported, shared data +282 18 0f40 NETFILECLOSE2 exported, shared data +299 25 0b34 I_NETPATHTYPE exported, shared data +300 25 0000 I_NETPATHCANONICALIZE exported, shared data +301 25 0932 I_NETPATHCOMPARE exported, shared data +302 25 1afe I_NETNAMEVALIDATE exported, shared data +303 25 173e I_NETNAMECANONICALIZE exported, shared data +304 25 196e I_NETNAMECOMPARE exported, shared data +305 25 1cee I_NETLISTCANONICALIZE exported, shared data +306 25 22c2 I_NETLISTTRAVERSE exported, shared data +501 8 0000 DOSDELETEMAILSLOT exported, shared data +502 8 0072 DOSMAILSLOTINFO exported, shared data +503 8 00ec DOSMAKEMAILSLOT exported, shared data +504 8 0320 DOSPEEKMAILSLOT exported, shared data +523 8 0454 DOSREADMAILSLOT exported, shared data +524 8 058a DOSWRITEMAILSLOT exported, shared data +525 11 0000 NETMESSAGEBUFFERSEND exported, shared data +526 11 0e1e NETMESSAGEFILESEND exported, shared data +527 5 0000 NETSERVERENUM exported, shared data +528 5 013a NETSERVERENUM2 exported, shared data +529 20 0000 NETSPECIALSMB exported, shared data +530 2 0010 DOSMAKENMPIPE exported, shared data +531 2 004c DOSCONNECTNMPIPE exported, shared data +532 2 002e DOSDISCONNECTNMPIPE exported, shared data +533 2 006a DOSSETNMPHANDSTATE exported, shared data +534 2 010a DOSWAITNMPIPE exported, shared data +535 2 01d2 DOSTRANSACTNMPIPE exported, shared data +536 2 02e5 DOSQNMPHANDSTATE exported, shared data +537 2 0388 DOSQNMPIPEINFO exported, shared data +538 2 044d DOSPEEKNMPIPE exported, shared data +539 2 057d DOSCALLNMPIPE exported, shared data +540 2 06cf DOSRAWREADNMPIPE exported, shared data +541 2 07b6 DOSRAWWRITENMPIPE exported, shared data +542 2 0b4f DOSREADASYNCNMPIPE exported, shared data +543 2 0d73 DOSWRITEASYNCNMPIPE exported, shared data diff --git a/etc/olecli-ordinals b/etc/olecli-ordinals new file mode 100644 index 00000000000..2438fa11225 --- /dev/null +++ b/etc/olecli-ordinals @@ -0,0 +1,178 @@ + 1 1 0000 WEP exported, shared data + 2 3 004e OLEDELETE exported, shared data + 3 3 00c6 OLESAVETOSTREAM exported, shared data + 4 3 0122 OLELOADFROMSTREAM exported, shared data + 6 3 0400 OLECLONE exported, shared data + 7 3 04ec OLECOPYFROMLINK exported, shared data + 8 3 0606 OLEEQUAL exported, shared data + 9 3 0674 OLEQUERYLINKFROMCLIP exported, shared data + 10 3 06a0 OLEQUERYCREATEFROMCLIP exported, shared data + 11 3 06cc OLECREATELINKFROMCLIP exported, shared data + 12 3 08a2 OLECREATEFROMCLIP exported, shared data + 13 3 0b52 OLECOPYTOCLIPBOARD exported, shared data + 14 3 1d48 OLEQUERYTYPE exported, shared data + 15 3 0b8e OLESETHOSTNAMES exported, shared data + 16 3 0c04 OLESETTARGETDEVICE exported, shared data + 17 3 0c84 OLESETBOUNDS exported, shared data + 18 3 0ce0 OLEQUERYBOUNDS exported, shared data + 19 3 0da0 OLEDRAW exported, shared data + 20 3 0e24 OLEQUERYOPEN exported, shared data + 21 3 0e60 OLEACTIVATE exported, shared data + 22 3 0eea OLEUPDATE exported, shared data + 23 3 0f26 OLERECONNECT exported, shared data + 24 3 0f62 OLEGETLINKUPDATEOPTIONS exported, shared data + 25 3 0fbe OLESETLINKUPDATEOPTIONS exported, shared data + 26 3 0ffc OLEENUMFORMATS exported, shared data + 27 3 0eae OLECLOSE exported, shared data + 28 3 107e OLEGETDATA exported, shared data + 29 3 10dc OLESETDATA exported, shared data + 30 3 0010 OLEQUERYPROTOCOL exported, shared data + 31 3 111e OLEQUERYOUTOFDATE exported, shared data + 32 3 115a OLEOBJECTCONVERT exported, shared data + 33 3 121a OLECREATEFROMTEMPLATE exported, shared data + 34 3 13b4 OLECREATE exported, shared data + 35 3 1ba6 OLEQUERYRELEASESTATUS exported, shared data + 36 3 1c04 OLEQUERYRELEASEERROR exported, shared data + 37 3 1c40 OLEQUERYRELEASEMETHOD exported, shared data + 38 3 16fa OLECREATEFROMFILE exported, shared data + 39 3 190a OLECREATELINKFROMFILE exported, shared data + 40 3 008a OLERELEASE exported, shared data + 41 2 093e OLEREGISTERCLIENTDOC exported, shared data + 42 2 0a9e OLEREVOKECLIENTDOC exported, shared data + 43 2 0bb6 OLERENAMECLIENTDOC exported, shared data + 44 2 0c8e OLEREVERTCLIENTDOC exported, shared data + 45 2 0cc8 OLESAVEDCLIENTDOC exported, shared data + 46 3 1c7c OLERENAME exported, shared data + 47 2 0cf6 OLEENUMOBJECTS exported, shared data + 48 3 1d00 OLEQUERYNAME exported, shared data + 49 3 0c42 OLESETCOLORSCHEME exported, shared data + 50 3 1034 OLEREQUESTDATA exported, shared data + 54 4 0000 OLELOCKSERVER exported, shared data + 55 4 025a OLEUNLOCKSERVER exported, shared data + 56 3 0d3c OLEQUERYSIZE exported, shared data + 57 3 1cbe OLEEXECUTE exported, shared data + 58 3 152e OLECREATEINVISIBLE exported, shared data + 59 3 1da4 OLEQUERYCLIENTVERSION exported, shared data + 60 3 46d4 OLEISDCMETA exported, shared data +100 4 0c28 DOCWNDPROC exported, shared data +101 4 0d2c SRVRWNDPROC exported, shared data +102 14 0838 MFCALLBACKFUNC exported, shared data +110 5 0000 DEFLOADFROMSTREAM exported, shared data +111 5 00fe DEFCREATEFROMCLIP exported, shared data +112 5 0180 DEFCREATELINKFROMCLIP exported, shared data +113 5 01be DEFCREATEFROMTEMPLATE exported, shared data +114 5 01fe DEFCREATE exported, shared data +115 5 023e DEFCREATEFROMFILE exported, shared data +116 5 028e DEFCREATELINKFROMFILE exported, shared data +117 5 02e0 DEFCREATEINVISIBLE exported, shared data +200 4 04e0 LERELEASE exported, shared data +201 4 1e52 LESHOW exported, shared data +202 3 2508 LEGETDATA exported, shared data +203 4 3a54 LESETDATA exported, shared data +204 4 37ee LESETHOSTNAMES exported, shared data +205 4 386e LESETTARGETDEVICE exported, shared data +206 4 3922 LESETBOUNDS exported, shared data +207 3 27be LESAVETOSTREAM exported, shared data +208 3 1fde LECLONE exported, shared data +209 4 052a LECOPYFROMLINK exported, shared data +210 6 0134 LEEQUAL exported, shared data +211 3 227a LECOPY exported, shared data +212 3 2e00 LEQUERYTYPE exported, shared data +213 3 2370 LEQUERYBOUNDS exported, shared data +214 3 23fc LEDRAW exported, shared data +215 4 2108 LEQUERYOPEN exported, shared data +216 4 219a LEACTIVATE exported, shared data +218 4 2200 LEUPDATE exported, shared data +219 4 2cb4 LERECONNECT exported, shared data +220 3 2454 LEENUMFORMAT exported, shared data +221 6 00c8 LEQUERYPROTOCOL exported, shared data +222 3 2638 LEQUERYOUTOFDATE exported, shared data +223 6 01c2 LEOBJECTCONVERT exported, shared data +224 4 07fa LECHANGEDATA exported, shared data +225 4 2c16 LECLOSE exported, shared data +226 3 2e72 LEGETUPDATEOPTIONS exported, shared data +227 4 337a LESETUPDATEOPTIONS exported, shared data +228 4 4a44 LEEXECUTE exported, shared data +229 6 0000 LEOBJECTLONG exported, shared data +230 4 322c LECREATEINVISIBLE exported, shared data +300 9 0000 MFRELEASE exported, shared data +301 9 0258 MFGETDATA exported, shared data +302 3 42f2 MFSAVETOSTREAM exported, shared data +303 9 0082 MFCLONE exported, shared data +304 9 0174 MFEQUAL exported, shared data +305 9 01f0 MFCOPY exported, shared data +307 3 446a MFQUERYBOUNDS exported, shared data +308 14 05cc MFDRAW exported, shared data +309 9 0234 MFENUMFORMAT exported, shared data +310 9 0302 MFCHANGEDATA exported, shared data +400 11 0000 BMRELEASE exported, shared data +401 11 0254 BMGETDATA exported, shared data +402 3 4b92 BMSAVETOSTREAM exported, shared data +403 11 006e BMCLONE exported, shared data +404 11 00e4 BMEQUAL exported, shared data +405 3 4c8c BMCOPY exported, shared data +407 3 4ce0 BMQUERYBOUNDS exported, shared data +408 14 0000 BMDRAW exported, shared data +409 11 0230 BMENUMFORMAT exported, shared data +410 3 5004 BMCHANGEDATA exported, shared data +500 12 0000 DIBRELEASE exported, shared data +501 12 01ea DIBGETDATA exported, shared data +502 3 536c DIBSAVETOSTREAM exported, shared data +503 12 006e DIBCLONE exported, shared data +504 12 00e4 DIBEQUAL exported, shared data +505 12 011c DIBCOPY exported, shared data +507 12 016c DIBQUERYBOUNDS exported, shared data +508 14 02f2 DIBDRAW exported, shared data +509 12 01c6 DIBENUMFORMAT exported, shared data +510 12 028a DIBCHANGEDATA exported, shared data +600 10 0000 GENRELEASE exported, shared data +601 10 049e GENGETDATA exported, shared data +602 10 0438 GENSETDATA exported, shared data +603 3 4750 GENSAVETOSTREAM exported, shared data +604 10 0082 GENCLONE exported, shared data +605 10 012e GENEQUAL exported, shared data +606 10 0164 GENCOPY exported, shared data +608 3 4b60 GENQUERYBOUNDS exported, shared data +609 14 05b2 GENDRAW exported, shared data +610 10 04e0 GENENUMFORMAT exported, shared data +611 10 0222 GENCHANGEDATA exported, shared data +701 13 0034 ERRSHOW exported, shared data +702 13 0186 ERRSETDATA exported, shared data +703 13 0082 ERRSETHOSTNAMES exported, shared data +704 13 009c ERRSETTARGETDEVICE exported, shared data +705 13 00d0 ERRSETBOUNDS exported, shared data +706 13 0068 ERRCOPYFROMLINK exported, shared data +707 13 00ea ERRQUERYOPEN exported, shared data +708 13 0104 ERRACTIVATE exported, shared data +709 13 0138 ERRCLOSE exported, shared data +710 13 0152 ERRUPDATE exported, shared data +711 13 016c ERRRECONNECT exported, shared data +712 13 0222 ERRQUERYPROTOCOL exported, shared data +713 13 01ba ERRQUERYOUTOFDATE exported, shared data +714 13 01d4 ERROBJECTCONVERT exported, shared data +715 13 01ee ERRGETUPDATEOPTIONS exported, shared data +716 13 0208 ERRSETUPDATEOPTIONS exported, shared data +717 13 0256 ERREXECUTE exported, shared data +718 13 0270 ERROBJECTLONG exported, shared data +800 7 0000 PBLOADFROMSTREAM exported, shared data +801 7 00ac PBCREATEFROMCLIP exported, shared data +802 7 017a PBCREATELINKFROMCLIP exported, shared data +803 7 0212 PBCREATEFROMTEMPLATE exported, shared data +804 7 02a8 PBCREATE exported, shared data +805 7 06f4 PBDRAW exported, shared data +806 7 0626 PBQUERYBOUNDS exported, shared data +807 7 0818 PBCOPYTOCLIPBOARD exported, shared data +808 7 033e PBCREATEFROMFILE exported, shared data +809 7 03e0 PBCREATELINKFROMFILE exported, shared data +810 7 0768 PBENUMFORMATS exported, shared data +811 7 07a8 PBGETDATA exported, shared data +812 7 0492 PBCREATEINVISIBLE exported, shared data +910 3 3e50 OBJQUERYNAME exported, shared data +911 3 3f06 OBJRENAME exported, shared data +912 3 410e OBJQUERYTYPE exported, shared data +913 3 4154 OBJQUERYSIZE exported, shared data +950 8 0456 CONNECTDLGPROC exported, shared data +951 8 0000 SETNETNAME exported, shared data +952 8 011a CHECKNETDRIVE exported, shared data +953 8 025c SETNEXTNETDRIVE exported, shared data +954 8 0696 GETTASKVISIBLEWINDOW exported, shared data diff --git a/etc/olesvr-ordinals b/etc/olesvr-ordinals new file mode 100644 index 00000000000..02deb6bc406 --- /dev/null +++ b/etc/olesvr-ordinals @@ -0,0 +1,23 @@ + 1 1 0000 WEP exported, shared data + 2 3 036e OLEREGISTERSERVER exported, shared data + 3 3 05f0 OLEREVOKESERVER exported, shared data + 4 3 3d46 OLEBLOCKSERVER exported, shared data + 5 3 3d92 OLEUNBLOCKSERVER exported, shared data + 6 3 1108 OLEREGISTERSERVERDOC exported, shared data + 7 3 12dc OLEREVOKESERVERDOC exported, shared data + 8 3 13a2 OLERENAMESERVERDOC exported, shared data + 9 3 1528 OLEREVERTSERVERDOC exported, shared data + 10 3 14ba OLESAVEDSERVERDOC exported, shared data + 11 3 2140 OLEREVOKEOBJECT exported, shared data + 12 3 0354 OLEQUERYSERVERVERSION exported, shared data + 21 3 07a2 SRVRWNDPROC exported, shared data + 22 3 1728 DOCWNDPROC exported, shared data + 23 3 23b2 ITEMWNDPROC exported, shared data + 24 3 2d3c SENDDATAMSG exported, shared data + 25 3 22ac FINDITEMWND exported, shared data + 26 3 2a5c ITEMCALLBACK exported, shared data + 27 3 0752 TERMINATECLIENTS exported, shared data + 28 3 1554 TERMINATEDOCCLIENTS exported, shared data + 29 3 222e DELETECLIENTINFO exported, shared data + 30 3 2cbc SENDRENAMEMSG exported, shared data + 31 3 2c5e ENUMFORTERMINATE exported, shared data diff --git a/etc/shell-ordinals b/etc/shell-ordinals new file mode 100644 index 00000000000..aa26138013f --- /dev/null +++ b/etc/shell-ordinals @@ -0,0 +1,26 @@ + 1 2 15cc REGOPENKEY exported, shared data + 2 2 15fa REGCREATEKEY exported, shared data + 3 2 1670 REGCLOSEKEY exported, shared data + 4 2 1628 REGDELETEKEY exported, shared data + 5 2 16f4 REGSETVALUE exported, shared data + 6 2 168e REGQUERYVALUE exported, shared data + 7 2 14dc REGENUMKEY exported, shared data + 8 7 0000 WEP exported, shared data + 9 6 0052 DRAGACCEPTFILES exported, shared data + 11 6 0094 DRAGQUERYFILE exported, shared data + 12 6 0142 DRAGFINISH exported, shared data + 13 6 0000 DRAGQUERYPOINT exported, shared data + 20 4 110a SHELLEXECUTE exported, shared data + 21 4 1154 FINDEXECUTABLE exported, shared data + 22 9 0000 SHELLABOUT exported, shared data + 32 9 0829 WCI exported, shared data + 33 9 0136 ABOUTDLGPROC exported, shared data + 34 10 021a EXTRACTICON exported, shared data + 36 10 08dc EXTRACTASSOCIATEDICON exported, shared data + 37 5 00ae DOENVIRONMENTSUBST exported, shared data + 38 5 0000 FINDENVIRONMENTSTRING exported, shared data + 39 10 026e INTERNALEXTRACTICON exported, shared data +100 4 0550 HERETHARBETYGARS exported, shared data +101 8 010e FINDEXEDLGPROC exported, shared data +102 4 128c REGISTERSHELLHOOK exported, shared data +103 4 11ca SHELLHOOKPROC exported, shared data diff --git a/etc/toolhelp-ordinals b/etc/toolhelp-ordinals new file mode 100644 index 00000000000..2118519faca --- /dev/null +++ b/etc/toolhelp-ordinals @@ -0,0 +1,35 @@ + 1 1 018a WEP exported, shared data + 50 1 057b GLOBALHANDLETOSEL exported, shared data + 51 1 0318 GLOBALFIRST exported, shared data + 52 1 0399 GLOBALNEXT exported, shared data + 53 1 02a2 GLOBALINFO exported, shared data + 54 1 0417 GLOBALENTRYHANDLE exported, shared data + 55 1 04a9 GLOBALENTRYMODULE exported, shared data + 56 1 090e LOCALINFO exported, shared data + 57 1 095e LOCALFIRST exported, shared data + 58 1 09e9 LOCALNEXT exported, shared data + 59 1 0a90 MODULEFIRST exported, shared data + 60 1 0ad9 MODULENEXT exported, shared data + 61 1 0b15 MODULEFINDNAME exported, shared data + 62 1 0b8c MODULEFINDHANDLE exported, shared data + 63 1 0caa TASKFIRST exported, shared data + 64 1 0ced TASKNEXT exported, shared data + 65 1 0d2e TASKFINDHANDLE exported, shared data + 66 1 0f1c STACKTRACEFIRST exported, shared data + 67 1 0f67 STACKTRACECSIPFIRST exported, shared data + 68 1 0fca STACKTRACENEXT exported, shared data + 69 1 28b0 CLASSFIRST exported, shared data + 70 1 2925 CLASSNEXT exported, shared data + 71 1 11ce SYSTEMHEAPINFO exported, shared data + 72 1 13f4 MEMMANINFO exported, shared data + 73 1 1b72 NOTIFYREGISTER exported, shared data + 74 1 1c29 NOTIFYUNREGISTER exported, shared data + 75 1 2060 INTERRUPTREGISTER exported, shared data + 76 1 2111 INTERRUPTUNREGISTER exported, shared data + 77 1 26ea TERMINATEAPP exported, shared data + 78 1 29c4 MEMORYREAD exported, shared data + 79 1 2b6c MEMORYWRITE exported, shared data + 80 1 2dae TIMERCOUNT exported, shared data + 81 1 0d68 TASKSETCSIP exported, shared data + 82 1 0d97 TASKGETCSIP exported, shared data + 83 1 0dc0 TASKSWITCH exported, shared data diff --git a/etc/win87em-ordinals b/etc/win87em-ordinals new file mode 100644 index 00000000000..00ee2aba339 --- /dev/null +++ b/etc/win87em-ordinals @@ -0,0 +1,5 @@ + 1 1 002a __FPMATH exported + 2 1 0089 WEP exported + 3 1 01ab __WIN87EMINFO exported + 4 1 0220 __WIN87EMRESTORE exported + 5 1 01e3 __WIN87EMSAVE exported diff --git a/if1632/Imakefile b/if1632/Imakefile index deee54f928a..72d1b096e34 100644 --- a/if1632/Imakefile +++ b/if1632/Imakefile @@ -46,9 +46,13 @@ WineRelocatableTarget($(TOP)/$(MODULE),,$(OBJS)) DependTarget() CleanTarget() +pop.h: $(TOP)/tools/build + $(TOP)/tools/build -p + includes:: install:: clean:: - $(RM) dll* dtb* + $(RM) dll* dtb* pop.h + touch pop.h diff --git a/if1632/call.S b/if1632/call.S index 420d7bbd91e..7210e686152 100644 --- a/if1632/call.S +++ b/if1632/call.S @@ -361,18 +361,7 @@ _ReturnFromRegisterFunc: * address again. */ add $6,%esp /* argument count, return address */ - popw %gs - add $2,%esp - popw %fs - add $2,%esp - popw %es - add $2,%esp - popw %ds - add $2,%esp - popal - add $16,%esp /* trapno, err, eip, cs */ - popfl - add $20,%esp /* esp, ss, i387, oldmask, cr2 */ +#include "pop.h" /* restore context */ /* * Return to original caller. diff --git a/if1632/callback.c b/if1632/callback.c index 82c71de459b..ac2ab9f79be 100644 --- a/if1632/callback.c +++ b/if1632/callback.c @@ -142,6 +142,8 @@ void FreeProcInstance(FARPROC func) LONG CallWindowProc( FARPROC func, HWND hwnd, WORD message, WORD wParam, LONG lParam ) { + SpyMessage(hwnd, message, wParam, lParam); + if (Is16bitAddress(func)) { PushOn16( CALLBACK_SIZE_WORD, hwnd ); @@ -176,6 +178,44 @@ void CallLineDDAProc(FARPROC func, short xPos, short yPos, long lParam) } } +/********************************************************************** + * CallHookProc + */ +DWORD CallHookProc( HOOKPROC func, short code, WPARAM wParam, LPARAM lParam ) +{ + if (Is16bitAddress(func)) + { + PushOn16( CALLBACK_SIZE_WORD, code ); + PushOn16( CALLBACK_SIZE_WORD, wParam ); + PushOn16( CALLBACK_SIZE_LONG, lParam ); + return CallTo16((unsigned int) func, + FindDataSegmentForCode((unsigned long) func)); + } + else + { + return (*func)( code, wParam, lParam ); + } +} + +/********************************************************************** + * CallGrayStringProc + */ +BOOL CallGrayStringProc(FARPROC func, HDC hdc, LPARAM lParam, INT cch ) +{ + if (Is16bitAddress(func)) + { + PushOn16( CALLBACK_SIZE_WORD, hdc ); + PushOn16( CALLBACK_SIZE_LONG, lParam ); + PushOn16( CALLBACK_SIZE_WORD, cch ); + return CallTo16((unsigned int) func, + FindDataSegmentForCode((unsigned long) func)); + } + else + { + return (*func)( hdc, lParam, cch ); + } +} + /* ------------------------------------------------------------------------ */ /* * The following functions realize the Catch/Throw functionality. diff --git a/if1632/findfunc b/if1632/findfunc old mode 100755 new mode 100644 diff --git a/if1632/gdi.spec b/if1632/gdi.spec index b1a46fbbdbd..027100ef2b3 100644 --- a/if1632/gdi.spec +++ b/if1632/gdi.spec @@ -80,6 +80,7 @@ length 490 67 pascal DPtoLP(word ptr s_word) DPtoLP(1 2 3) 68 pascal DeleteDC(word) DeleteDC(1) 69 pascal DeleteObject(word) DeleteObject(1) +70 pascal EnumFonts(word ptr ptr ptr) EnumFonts(1 2 3 4) 72 pascal EqualRgn(word word) EqualRgn(1 2) 73 pascal ExcludeVisRect(word s_word s_word s_word s_word) ExcludeVisRect(1 2 3 4 5) diff --git a/if1632/kernel.spec b/if1632/kernel.spec index 44722896358..d21f57c0f35 100644 --- a/if1632/kernel.spec +++ b/if1632/kernel.spec @@ -5,7 +5,6 @@ id 1 length 415 3 pascal GetVersion() GetVersion() -#return GetVersion 0 0x301 4 pascal LocalInit(word word word) WIN16_LocalInit(1 2 3) 5 pascal LocalAlloc(word word) WIN16_LocalAlloc(1 2) 6 pascal LocalReAlloc(word word word) WIN16_LocalReAlloc(1 2 3) @@ -28,10 +27,12 @@ length 415 23 pascal LockSegment(s_word) KERNEL_LockSegment(1) 24 pascal UnlockSegment(s_word) KERNEL_UnlockSegment(1) 25 pascal GlobalCompact(long) GlobalCompact(1) +#29 pascal Yield() Yield() 30 pascal WaitEvent(word) KERNEL_WaitEvent(1) 34 pascal SetTaskQueue(word word) SetTaskQueue(1 2) 35 pascal GetTaskQueue(word) GetTaskQueue(1) 36 pascal GetCurrentTask() GetCurrentTask() +45 pascal LoadModule(ptr ptr) LoadModule(1 2) 47 pascal GetModuleHandle(ptr) GetModuleHandle(1) 48 pascal GetModuleUsage(word) GetModuleUsage(1) 49 pascal GetModuleFileName(word ptr s_word) GetModuleFileName(1 2 3) @@ -46,6 +47,12 @@ length 415 62 pascal LockResource(word) LockResource(1) 63 pascal FreeResource(word) FreeResource(1) 64 pascal AccessResource(word word) AccessResource(1 2) +68 pascal InitAtomTable(word) InitAtomTable(1) +69 pascal FindAtom(ptr) FindAtom(1) +70 pascal AddAtom(ptr) AddAtom(1) +71 pascal DeleteAtom(word) DeleteAtom(1) +72 pascal GetAtomName(word ptr word) GetAtomName(1 2 3) +73 pascal GetAtomHandle(word) GetAtomHandle(1) 74 pascal OpenFile(ptr ptr word) OpenFile(1 2 3) 81 pascal _lclose(word) _lclose(1) 82 pascal _lread(word ptr word) _lread(1 2 3) @@ -82,9 +89,9 @@ length 415 #132 return GetWinFlags 0 0x413 134 pascal GetWindowsDirectory(ptr word) GetWindowsDirectory(1 2) 135 pascal GetSystemDirectory(ptr word) GetSystemDirectory(1 2) -136 pascal GetDriveType(byte) GetWindowsDirectory(1) +136 pascal GetDriveType(byte) GetDriveType(1) 137 pascal FatalAppExit(word ptr) FatalAppExit(1 2) -152 return GetNumTasks 0 1 +152 pascal GetNumTasks() GetNumTasks() 154 return GlobalNotify 4 0 163 pascal GlobalLRUOldest(word) ReturnArg(1) 164 pascal GlobalLRUNewest(word) ReturnArg(1) @@ -105,4 +112,11 @@ length 415 57 pascal GetProfileInt(ptr ptr word) GetProfileInt(1 2 3) 58 pascal GetProfileString(ptr ptr ptr ptr word) GetProfileString(1 2 3 4 5) 199 pascal SetHandleCount(word) SetHandleCount(1) +68 pascal InitAtomTable(word) InitAtomTable(1) +69 pascal FindAtom(ptr) FindAtom(1) +70 pascal AddAtom(ptr) AddAtom(1) +71 pascal DeleteAtom(word) DeleteAtom(1) +72 pascal GetAtomName(word ptr s_word) GetAtomName(1 2 3) +73 pascal GetAtomHandle(word) GetAtomHandle(1) 353 pascal lstrcpyn(ptr ptr word) lstrcpyn(1 2 3) + diff --git a/if1632/mmsystem.spec b/if1632/mmsystem.spec new file mode 100644 index 00000000000..b9d01e78f1e --- /dev/null +++ b/if1632/mmsystem.spec @@ -0,0 +1,74 @@ +# $Id: mmsystem.spec,v 1.3 1993/07/04 04:04:21 root Exp root $ +# +name mmsystem +id 11 +length 706 + +1 pascal LIBMAIN(word word word ptr) MCI_LibMain(1 2 3 4) +2 pascal SNDPLAYSOUND(ptr word) sndPlaySound(1 2) +5 pascal MMSYSTEMGETVERSION() mmsystemGetVersion() +30 pascal OUTPUTDEBUGSTR(ptr) OutputDebugStr(1) +201 pascal MIDIOUTGETNUMDEVS() midiOutGetNumDevs() +202 pascal MIDIOUTGETDEVCAPS(word ptr word) midiOutGetDevCaps(1 2 3) +203 pascal MIDIOUTGETERRORTEXT(word ptr word) midiOutGetErrorText(1 2 3) +204 pascal MIDIOUTOPEN(ptr word ptr long long long) midiOutOpen(1 2 3 4 5 6) +205 pascal MIDIOUTCLOSE(word) midiOutClose(1) +206 pascal MIDIOUTPREPAREHEADER(word ptr word) midiOutPrepareHeader(1 2 3) +207 pascal MIDIOUTUNPREPAREHEADER(word ptr word) midiOutUnprepareHeader(1 2 3) +208 pascal MIDIOUTSHORTMSG(word long) midiOutShortMsg(1 2) +209 pascal MIDIOUTLONGMSG(word ptr word) midiOutLongMsg(1 2 3) +210 pascal MIDIOUTRESET(word) midiOutReset(1) +211 pascal MIDIOUTGETVOLUME(word ptr) midiOutGetVolume(1 2) +212 pascal MIDIOUTSETVOLUME(word long) midiOutSetVolume(1 2) +215 pascal MIDIOUTGETID(word ptr) midiOutGetID(1 2) +301 pascal MIDIINGETNUMDEVS() midiInGetNumDevs() +302 pascal MIDIINGETDEVCAPS(word ptr word) midiInGetDevCaps(1 2 3) +303 pascal MIDIINGETERRORTEXT(word ptr word) midiInGetErrorText(1 2 3) +304 pascal MIDIINOPEN(ptr word ptr long long long) midiInOpen(1 2 3 4 5 6) +305 pascal MIDIINCLOSE(word) midiInClose(1) +306 pascal MIDIINPREPAREHEADER(word ptr word) midiInPrepareHeader(1 2 3) +307 pascal MIDIINUNPREPAREHEADER(word ptr word) midiInUnprepareHeader(1 2 3) +309 pascal MIDIINSTART(word) midiInStart(1) +310 pascal MIDIINSTOP(word) midiInStop(1) +311 pascal MIDIINRESET(word) midiInReset(1) +312 pascal MIDIINGETID(word ptr) midiInGetID(1 2) +350 pascal AUXGETNUMDEVS() auxGetNumDevs() +351 pascal AUXGETDEVCAPS(word ptr word) auxGetDevCaps(1 2 3) +352 pascal AUXGETVOLUME(word ptr) auxGetVolume(1 2) +353 pascal AUXSETVOLUME(word long) auxSetVolume(1 2) +401 pascal WAVEOUTGETNUMDEVS() waveOutGetNumDevs() +402 pascal WAVEOUTGETDEVCAPS(word ptr word) waveOutGetDevCaps(1 2 3) +403 pascal WAVEOUTGETERRORTEXT(word ptr word) waveOutGetErrorText(1 2 3) +404 pascal WAVEOUTOPEN(ptr word ptr long long long) waveOutOpen(1 2 3 4 5 6) +405 pascal WAVEOUTCLOSE(word) waveOutClose(1) +406 pascal WAVEOUTPREPAREHEADER(word ptr word) waveOutPrepareHeader(1 2 3) +407 pascal WAVEOUTUNPREPAREHEADER(word ptr word) waveOutUnprepareHeader(1 2 3) +408 pascal WAVEOUTWRITE(word ptr word) waveOutWrite(1 2 3) +409 pascal WAVEOUTPAUSE(word) waveOutPause(1) +410 pascal WAVEOUTRESTART(word) waveOutRestart(1) +411 pascal WAVEOUTRESET(word) waveOutReset(1) +412 pascal WAVEOUTGETPOSITION(word ptr word) waveOutGetPosition(1 2 3) +413 pascal WAVEOUTGETPITCH(word ptr) waveOutGetPitch(1 2) +414 pascal WAVEOUTSETPITCH(word long) waveOutSetPitch(1 2) +415 pascal WAVEOUTGETVOLUME(word ptr) waveOutGetVolume(1 2) +416 pascal WAVEOUTSETVOLUME(word long) waveOutSetVolume(1 2) +417 pascal WAVEOUTGETPLAYBACKRATE(word ptr) waveOutGetPlaybackRate(1 2) +418 pascal WAVEOUTSETPLAYBACKRATE(word long) waveOutSetPlaybackRate(1 2) +419 pascal WAVEOUTBREAKLOOP(word) waveOutBreakLoop(1) +420 pascal WAVEOUTGETID(word ptr) waveOutGetID(1 2) +501 pascal WAVEINGETNUMDEVS() waveInGetNumDevs() +502 pascal WAVEINGETDEVCAPS(word ptr word) waveInGetDevCaps(1 2 3) +503 pascal WAVEINGETERRORTEXT(word ptr word) waveInGetErrorText(1 2 3) +504 pascal WAVEINOPEN(ptr word ptr long long long) waveInOpen(1 2 3 4 5 6) +505 pascal WAVEINCLOSE(word) waveInClose(1) +506 pascal WAVEINPREPAREHEADER(word ptr word) waveInPrepareHeader(1 2 3) +507 pascal WAVEINUNPREPAREHEADER(word ptr word) waveInUnprepareHeader(1 2 3) +508 pascal WAVEINADDBUFFER(word ptr word) waveInAddBuffer(1 2 3) +509 pascal WAVEINSTART(word) waveInStart(1) +510 pascal WAVEINSTOP(word) waveInStop(1) +511 pascal WAVEINRESET(word) waveInReset(1) +513 pascal WAVEINGETID(word ptr) waveInGetID(1 2) +701 pascal MCISENDCOMMAND(word word long long) mciSendCommand(1 2 3 4) +702 pascal MCISENDSTRING(ptr ptr word word) mciSendString(1 2 3 4) +703 pascal MCIGETDEVICEID(ptr) mciSendCommand(1) +706 pascal MCIGETERRORSTRING(long ptr word) mciGetErrorString(1 2 3) diff --git a/if1632/pop.h b/if1632/pop.h new file mode 100644 index 00000000000..ff2d96106e2 --- /dev/null +++ b/if1632/pop.h @@ -0,0 +1,16 @@ + add $8,%esp + popw %es + add $2,%esp + popw %ds + add $2,%esp + popl %edi + popl %esi + popl %ebp + add $4,%esp + popl %ebx + popl %edx + popl %ecx + popl %eax + add $16,%esp + popfl + add $20,%esp diff --git a/if1632/shell.spec b/if1632/shell.spec index 0a027573509..16d2a9ee556 100644 --- a/if1632/shell.spec +++ b/if1632/shell.spec @@ -3,3 +3,39 @@ name shell id 6 length 256 + +# +# WARNING ! These functions are not documented, so I didn't look for +# proper parameters. It's just to have stub for PROGMAN.EXE ... +# + + 1 pascal RegOpenKey() RegOpenKey() + 2 pascal RegCreateKey() RegCreateKey() + 3 pascal RegCloseKey() RegCloseKey() + 4 pascal RegDeleteKey() RegDeleteKey() + 20 pascal ShellExecute(ptr) ShellExecute(1) +102 pascal RegisterShellHook(ptr) RegisterShellHook(1) +103 pascal ShellHookProc() ShellHookProc() + +# 8 7 0000 WEP exported, shared data +# 33 9 0136 ABOUTDLGPROC exported, shared data +# 34 10 021a EXTRACTICON exported, shared data +# 21 4 1154 FINDEXECUTABLE exported, shared data +# 9 6 0052 DRAGACCEPTFILES exported, shared data +#100 4 0550 HERETHARBETYGARS exported, shared data +# 38 5 0000 FINDENVIRONMENTSTRING exported, shared data +# 7 2 14dc REGENUMKEY exported, shared data +# 37 5 00ae DOENVIRONMENTSUBST exported, shared data +# 20 4 110a SHELLEXECUTE exported, shared data +#101 8 010e FINDEXEDLGPROC exported, shared data +# 11 6 0094 DRAGQUERYFILE exported, shared data +# 13 6 0000 DRAGQUERYPOINT exported, shared data +# 5 2 16f4 REGSETVALUE exported, shared data +# 39 10 026e INTERNALEXTRACTICON exported, shared data +# 22 9 0000 SHELLABOUT exported, shared data +# 6 2 168e REGQUERYVALUE exported, shared data +# 32 9 0829 WCI exported, shared data +# 36 10 08dc EXTRACTASSOCIATEDICON exported, shared data +# 12 6 0142 DRAGFINISH exported, shared data + + diff --git a/if1632/system.spec b/if1632/system.spec new file mode 100644 index 00000000000..b37eb9fd7b9 --- /dev/null +++ b/if1632/system.spec @@ -0,0 +1,3 @@ +name system +id 12 +length 20 diff --git a/if1632/toolhelp.spec b/if1632/toolhelp.spec new file mode 100644 index 00000000000..0037da9b2d0 --- /dev/null +++ b/if1632/toolhelp.spec @@ -0,0 +1,3 @@ +name toolhelp +id 13 +length 83 diff --git a/if1632/user.spec b/if1632/user.spec index d79948c5999..2b6ea2f9f43 100644 --- a/if1632/user.spec +++ b/if1632/user.spec @@ -7,6 +7,7 @@ length 540 1 pascal MessageBox(word ptr ptr word) MessageBox(1 2 3 4) 5 pascal InitApp(word) USER_InitApp(1) 6 pascal PostQuitMessage(word) PostQuitMessage(1) +7 pascal ExitWindows(long word) ExitWindows(1 2) 10 pascal SetTimer(word word word ptr) SetTimer(1 2 3 4) 11 pascal SetSystemTimer(word word word ptr) SetSystemTimer(1 2 3 4) 12 pascal KillTimer(word word) KillTimer(1 2) @@ -21,6 +22,10 @@ length 540 21 pascal GetDoubleClickTime() GetDoubleClickTime() 22 pascal SetFocus(word) SetFocus(1) 23 pascal GetFocus() GetFocus() +24 pascal RemoveProp(word ptr) RemoveProp(1 2) +25 pascal GetProp(word ptr) GetProp(1 2) +26 pascal SetProp(word ptr word) SetProp(1 2 3) +27 pascal EnumProps(word ptr) EnumProps(1 2) 28 pascal ClientToScreen(word ptr) ClientToScreen(1 2) 29 pascal ScreenToClient(word ptr) ScreenToClient(1 2) 30 pascal WindowFromPoint(long) WindowFromPoint(1) @@ -91,6 +96,8 @@ length 540 96 pascal CheckRadioButton(word word word word) CheckRadioButton(1 2 3 4) 97 pascal CheckDlgButton(word word word) CheckDlgButton(1 2 3) 98 pascal IsDlgButtonChecked(word word) IsDlgButtonChecked(1 2) +99 pascal DlgDirSelect(word ptr word) DlgDirSelect(1 2 3) +100 pascal DlgDirList(word ptr word word word) DlgDirList(1 2 3 4 5) 101 pascal SendDlgItemMessage(word word word word long) SendDlgItemMessage(1 2 3 4 5) 102 pascal AdjustWindowRect(ptr long word) AdjustWindowRect(1 2 3) @@ -107,7 +114,9 @@ length 540 118 pascal RegisterWindowMessage(ptr) RegisterWindowMessage(1) 119 pascal GetMessagePos() GetMessagePos() 120 pascal GetMessageTime() GetMessageTime() +121 pascal SetWindowsHook(s_word ptr) SetWindowsHook(1 2) 122 pascal CallWindowProc(ptr word word word long) CallWindowProc(1 2 3 4 5) +123 pascal CallMsgFilter(ptr s_word) CallMsgFilter(1 2) 124 pascal UpdateWindow(word) UpdateWindow(1) 125 pascal InvalidateRect(word ptr word) InvalidateRect(1 2 3) 126 pascal InvalidateRgn(word word word) InvalidateRgn(1 2 3) @@ -164,9 +173,14 @@ length 540 181 pascal SetSysColors(word ptr ptr) SetSysColors(1 2 3) 182 pascal KillSystemTimer(word word) KillSystemTimer(1 2) 183 pascal GetCaretPos(ptr) GetCaretPos(1) +185 pascal GrayString(word word ptr ptr word word word word word) + GrayString(1 2 3 4 5 6 7 8 9) +188 pascal SetSysModalWindow(word) SetSysModalWindow(1) 190 pascal GetUpdateRect(word ptr word) GetUpdateRect(1 2 3) 191 pascal ChildWindowFromPoint(word long) ChildWindowFromPoint(1 2) 193 pascal IsClipboardFormatAvailable(word) IsClipboardFormatAvailable(1) +194 pascal DlgDirSelectComboBox(word ptr word) DlgDirSelectComboBox(1 2 3) +195 pascal DlgDirListComboBox(word ptr word word word) DlgDirListComboBox(1 2 3 4 5) 200 pascal OpenComm(ptr word word) OpenComm(1 2 3) 201 pascal SetCommState(ptr) SetCommState(1) 202 pascal GetCommState(word ptr) GetCommState(1 2) @@ -189,12 +203,16 @@ length 540 220 pascal LoadMenuIndirect(ptr) LoadMenuIndirect(1) 221 pascal ScrollDC(word s_word s_word ptr ptr word ptr) ScrollDC(1 2 3 4 5 6 7) +224 pascal GetWindowTask(word) GetWindowTask(1) +225 pascal EnumTaskWindows(word ptr long) EnumTaskWindows(1 2 3) 227 pascal GetNextDlgGroupItem(word word word) GetNextDlgGroupItem(1 2 3) 228 pascal GetNextDlgTabItem(word word word) GetNextDlgTabItem(1 2 3) 229 pascal GetTopWindow(word) GetTopWindow(1) 230 pascal GetNextWindow(word word) GetNextWindow(1 2) 232 pascal SetWindowPos(word word word word word word word) SetWindowPos(1 2 3 4 5 6 7) +234 pascal UnhookWindowsHook(s_word ptr) UnhookWindowsHook(1 2) +235 pascal DefHookProc(s_word word long ptr) DefHookProc(1 2 3 4) 236 pascal GetCapture() GetCapture() 237 pascal GetUpdateRgn(word word word) GetUpdateRgn(1 2 3) 238 pascal ExcludeUpdateRgn(word word) ExcludeUpdateRgn(1 2) @@ -205,12 +223,17 @@ length 540 CreateDialogParam(1 2 3 4 5) 242 pascal CreateDialogIndirectParam(word ptr word ptr long) CreateDialogIndirectParam(1 2 3 4 5) +243 pascal GetDialogBaseUnits() GetDialogBaseUnits() 244 pascal EqualRect(ptr ptr) EqualRect(1 2) 248 pascal GetOpenClipboardWindow() GetOpenClipboardWindow() 258 pascal MapWindowPoints(word word ptr word) MapWindowPoints(1 2 3 4) 262 pascal GetWindow(word word) GetWindow(1 2) 266 pascal SetMessageQueue(word) SetMessageQueue(1) 267 pascal ShowScrollBar(word word word) ShowScrollBar(1 2 3) +268 pascal GlobalAddAtom(ptr) GlobalAddAtom(1) +269 pascal GlobalDeleteAtom(word) GlobalDeleteAtom(1) +270 pascal GlobalFindAtom(ptr) GlobalFindAtom(1) +271 pascal GlobalGetAtomName(word ptr s_word) GlobalGetAtomName(1 2 3) 272 pascal IsZoomed(word) IsZoomed(1) 277 pascal GetDlgCtrlID(word) GetDlgCtrlID(1) 282 pascal SelectPalette(word word word) SelectPalette(1 2 3) @@ -219,6 +242,9 @@ length 540 286 pascal GetDesktopWindow() GetDesktopWindow() 288 pascal GetMessageExtraInfo() GetMessageExtraInfo() 290 pascal RedrawWindow(word ptr word word) RedrawWindow(1 2 3 4) +291 pascal SetWindowsHookEx(s_word ptr word word) SetWindowsHookEx(1 2 3 4) +292 pascal UnhookWindowsHookEx(ptr) UnhookWindowsHookEx(1) +293 pascal CallNextHookEx(ptr s_word word long) CallNextHookEx(1 2 3 4) 308 pascal DefDlgProc(word word word long) DefDlgProc(1 2 3 4) 319 pascal ScrollWindowEx(word s_word s_word ptr ptr word ptr word) ScrollWindowEx(1 2 3 4 5 6 7 8) diff --git a/if1632/winsock.spec b/if1632/winsock.spec index ba0e5fbc230..84ade1dfae5 100644 --- a/if1632/winsock.spec +++ b/if1632/winsock.spec @@ -7,44 +7,44 @@ name winsock id 9 length 155 -1 pascal accept(long ptr ptr) Winsock_accept(1 2 3) -2 pascal bind(long ptr word) Winsock_bind(1 2 3) -3 pascal closesocket(long) Winsock_closesocket(1) -4 pascal connect(long ptr word) Winsock_connect(1 2 3) -5 pascal getpeername(long ptr ptr) Winsock_getpeername(1 2 3) -6 pascal getsockname(long ptr ptr) Winsock_getsockname(1 2 3) -7 pascal getsockopt(long word word ptr ptr) +1 pascal accept(word ptr ptr) Winsock_accept(1 2 3) +2 pascal bind(word ptr word) Winsock_bind(1 2 3) +3 pascal closesocket(word) Winsock_closesocket(1) +4 pascal connect(word ptr word) Winsock_connect(1 2 3) +5 pascal getpeername(word ptr ptr) Winsock_getpeername(1 2 3) +6 pascal getsockname(word ptr ptr) Winsock_getsockname(1 2 3) +7 pascal getsockopt(word word word ptr ptr) Winsock_getsockopt(1 2 3 4 5) 8 pascal htonl(long) Winsock_htonl(1) 9 pascal htons(word) Winsock_htons(1) -10 pascal inet_addr(ptr) Winsock_inet_addr(1) +10 pascal inet_addr(long) Winsock_inet_addr(1) 11 pascal inet_ntoa(long) Winsock_inet_ntoa(1) -12 pascal ioctlsocket(long long ptr) Winsock_ioctlsocket(1 2 3) -13 pascal listen(long word) Winsock_listen(1 2) +12 pascal ioctlsocket(word long ptr) Winsock_ioctlsocket(1 2 3) +13 pascal listen(word word) Winsock_listen(1 2) 14 pascal ntohl(long) Winsock_ntohl(1) 15 pascal ntohs(word) Winsock_ntohs(1) -16 pascal recv(long ptr word word) Winsock_recv(1 2 3 4) -17 pascal recvfrom(long ptr word word ptr ptr) +16 pascal recv(word ptr word word) Winsock_recv(1 2 3 4) +17 pascal recvfrom(word ptr word word ptr ptr) Winsock_recvfrom(1 2 3 4 5 6) 18 pascal select(word ptr ptr ptr ptr word) Winsock_select(1 2 3 4 5 6) -19 pascal send(long ptr word word) Winsock_send(1 2 3 4) -20 pascal sendto(long ptr word word ptr ptr) +19 pascal send(word ptr word word) Winsock_send(1 2 3 4) +20 pascal sendto(word ptr word word ptr ptr) Winsock_sendto(1 2 3 4 5 6) -21 pascal setsockopt(long word word ptr word) +21 pascal setsockopt(word word word ptr word) Winsock_setsockopt(1 2 3 4 5) -22 pascal shutdown(long word) Winsock_shutdown(1 2) +22 pascal shutdown(word word) Winsock_shutdown(1 2) 23 pascal socket(word word word) Winsock_socket(1 2 3) 51 pascal gethostbyaddr(ptr word word) Winsock_gethostbyaddr(1 2 3) 52 pascal gethostbyname(ptr) Winsock_gethostbyname(1) 53 pascal getprotobyname(ptr) Winsock_getprotobyname(1) 54 pascal getprotobynumber(word) Winsock_getprotobynumber(1) -55 pascal getservbyname(ptr) Winsock_getservbyname(1) +55 pascal getservbyname(ptr ptr) Winsock_getservbyname(1 2) 56 pascal getservbyport(word ptr) Winsock_getservbyport(1 2) 57 pascal gethostname(ptr word) Winsock_gethostname(1 2) -101 pascal WSAAsyncSelect(long word word long) +101 pascal WSAAsyncSelect(word word word long) WSAAsyncSelect(1 2 3 4) 102 pascal WSAAsyncGetHostByAddr(word word ptr word word ptr word) WSAAsyncGetHostByAddr(1 2 3 4 5 6 7) @@ -68,4 +68,4 @@ length 155 115 pascal WSAStartup(word ptr) WSAStartup(1 2) 116 pascal WSACleanup() WSACleanup() -151 pascal __WSAFDIsSet(long ptr) WSAFDIsSet(1 2) +151 pascal __WSAFDIsSet(word ptr) WSAFDIsSet(1 2) diff --git a/include/driver.h b/include/driver.h new file mode 100644 index 00000000000..efc1f0b8b66 --- /dev/null +++ b/include/driver.h @@ -0,0 +1,70 @@ +/* + * Drivers definitions + */ + +#define DRV_LOAD 0x0001 +#define DRV_ENABLE 0x0002 +#define DRV_OPEN 0x0003 +#define DRV_CLOSE 0x0004 +#define DRV_DISABLE 0x0005 +#define DRV_FREE 0x0006 +#define DRV_CONFIGURE 0x0007 +#define DRV_QUERYCONFIGURE 0x0008 +#define DRV_INSTALL 0x0009 +#define DRV_REMOVE 0x000A +#define DRV_EXITSESSION 0x000B +#define DRV_EXITAPPLICATION 0x000C +#define DRV_POWER 0x000F + +#define DRV_RESERVED 0x0800 +#define DRV_USER 0x4000 + +#define DRVCNF_CANCEL 0x0000 +#define DRVCNF_OK 0x0001 +#define DRVCNF_RESTART 0x0002 + +#define DRVEA_NORMALEXIT 0x0001 +#define DRVEA_ABNORMALEXIT 0x0002 + +#define GND_FIRSTINSTANCEONLY 0x00000001 + +#define GND_FORWARD 0x00000000 +#define GND_REVERSE 0x00000002 + +typedef struct { + DWORD dwDCISize; + LPCSTR lpszDCISectionName; + LPCSTR lpszDCIAliasName; + } DRVCONFIGINFO; +typedef DRVCONFIGINFO FAR* LPDRVCONFIGINFO; + +typedef struct { + UINT length; + HDRVR hDriver; + HINSTANCE hModule; + char szAliasName[128]; + } DRIVERINFOSTRUCT; +typedef DRIVERINFOSTRUCT FAR* LPDRIVERINFOSTRUCT; + +typedef LRESULT (CALLBACK* DRIVERPROC)(DWORD, HDRVR, UINT, LPARAM, LPARAM); + +typedef struct { + DRIVERINFOSTRUCT dis; + WORD count; + void *lpPrevItem; + void *lpNextItem; + DRIVERPROC lpDrvProc; + } DRIVERITEM; +typedef DRIVERITEM FAR* LPDRIVERITEM; + +LRESULT DefDriverProc(DWORD dwDevID, HDRVR hDriv, WORD wMsg, + DWORD dwParam1, DWORD dwParam2); +HDRVR WINAPI OpenDriver(LPSTR szDriverName, LPSTR szSectionName, LPARAM lParam2); +LRESULT WINAPI CloseDriver(HDRVR hDriver, LPARAM lParam1, LPARAM lParam2); +LRESULT WINAPI SendDriverMessage(HDRVR hDriver, WORD message, LPARAM lParam1, LPARAM lParam2); +HINSTANCE WINAPI GetDriverModuleHandle(HDRVR hDriver); +HDRVR WINAPI GetNextDriver(HDRVR, DWORD); +BOOL WINAPI GetDriverInfo(HDRVR, DRIVERINFOSTRUCT FAR*); + + + diff --git a/include/gdi.h b/include/gdi.h index 3ec95eaac7c..27b4d3d38db 100644 --- a/include/gdi.h +++ b/include/gdi.h @@ -290,8 +290,9 @@ typedef struct tagDC extern MDESC *GDI_Heap; #define GDI_HEAP_ALLOC(f,size) ((int)HEAP_Alloc(&GDI_Heap,f,size) & 0xffff) -#define GDI_HEAP_ADDR(handle) ((void *)((handle)|((int)GDI_Heap & 0xffff0000))) #define GDI_HEAP_FREE(handle) (HEAP_Free(&GDI_Heap,GDI_HEAP_ADDR(handle))) +#define GDI_HEAP_ADDR(handle) \ + ((void *)((handle) ? ((handle) | ((int)GDI_Heap & 0xffff0000)) : 0)) #endif diff --git a/include/hook.h b/include/hook.h new file mode 100644 index 00000000000..94f23f89419 --- /dev/null +++ b/include/hook.h @@ -0,0 +1,42 @@ +/* + * Windows hook definitions + * + * Copyright 1994 Alexandre Julliard + */ + +#ifndef HOOK_H +#define HOOK_H + +#include "windows.h" +#include "user.h" + + /* Hook data (pointed to by a HHOOK) */ +typedef struct +{ + HHOOK next; /* Next hook in chain */ + HOOKPROC proc; /* Hook procedure */ + short id; /* Hook id (WH_???) */ + HTASK htask; /* Task owning this hook */ +} HOOKDATA; + + +#define FIRST_HOOK WH_MSGFILTER +#define LAST_HOOK WH_SHELL + +#define SYSTEM_HOOK(id) (systemHooks[(id)-FIRST_HOOK]) +#define TASK_HOOK(id) (taskHooks[(id)-FIRST_HOOK]) +#define INTERNAL_CALL_HOOK(hhook,code,wparam,lparam) \ + ((hhook) ? CallHookProc(((HOOKDATA*)(hhook))->proc,code,wparam,lparam) : 0) + +#define CALL_SYSTEM_HOOK(id,code,wparam,lparam) \ + INTERNAL_CALL_HOOK(SYSTEM_HOOK(id),code,wparam,lparam) +#define CALL_TASK_HOOK(id,code,wparam,lparam) \ + INTERNAL_CALL_HOOK(TASK_HOOK(id),code,wparam,lparam) + +extern DWORD CallHookProc( HOOKPROC func, short code, + WPARAM wParam, LPARAM lParam ); /* callback.c */ + +extern HHOOK systemHooks[]; +extern HHOOK taskHooks[]; + +#endif /* HOOK_H */ diff --git a/include/mdi.h b/include/mdi.h index b6d179ebb9e..40f43990b52 100644 --- a/include/mdi.h +++ b/include/mdi.h @@ -28,6 +28,8 @@ typedef struct HWND hwndHitTest; BOOL flagMenuAltered; BOOL flagChildMaximized; + RECT rectMaximize; + RECT rectRestore; } MDICLIENTINFO; #endif /* MDI_H */ diff --git a/include/menu.h b/include/menu.h index 19a66441e9f..c5f513a087c 100644 --- a/include/menu.h +++ b/include/menu.h @@ -65,7 +65,8 @@ typedef struct char item_text[1]; /* Text for menu item */ } MENUITEMTEMPLATE; -void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop); +void StdDrawMenuBar(HDC hDC, LPRECT lprect, LPPOPUPMENU lppop, + BOOL suppress_draw); BOOL MenuButtonDown(HWND hWnd, LPPOPUPMENU lppop, int x, int y); void MenuButtonUp(HWND hWnd, LPPOPUPMENU lppop, int x, int y); void MenuMouseMove(HWND hWnd, LPPOPUPMENU lppop, WORD wParam, int x, int y); diff --git a/include/message.h b/include/message.h index 905d182a02c..5e6e9e867ca 100644 --- a/include/message.h +++ b/include/message.h @@ -53,5 +53,7 @@ extern BOOL MSG_CreateSysMsgQueue( int size ); extern void hardware_event( WORD message, WORD wParam, LONG lParam, int xPos, int yPos, DWORD time, DWORD extraInfo ); extern BOOL MSG_GetHardwareMessage( LPMSG msg ); +extern BOOL MSG_InternalGetMessage( LPMSG msg, HWND hwnd, + short code, BOOL sendIdle ); #endif /* MESSAGE_H */ diff --git a/include/metafile.h b/include/metafile.h new file mode 100644 index 00000000000..0a3e5e91c24 --- /dev/null +++ b/include/metafile.h @@ -0,0 +1,45 @@ +/* + * Metafile definitions + * + * Copyright David W. Metcalfe, 1994 + */ + +#ifndef METAFILE_H +#define METAFILE_H + +#include "windows.h" + +#define MFHEADERSIZE (sizeof(METAHEADER)) +#define MFVERSION 0x300 +#define META_EOF 0x0000 + +typedef struct tagMETAFILE +{ + WORD wMagic; /* `PO' */ + char Filename[80]; /* metafile name, if disk based */ + int hFile; /* MSDOS file handle for metafile */ + HANDLE hMetaHdr; /* handle of metafile header */ + int MetaOffset; /* offset of current record in metafile */ + HANDLE hBuffer; /* handle of buffer for disk based metafiles */ +} METAFILE; +typedef METAFILE *LPMETAFILE; + + +BOOL MF_WriteRecord(HMETAFILE hmf, METARECORD *mr, WORD rlen); +BOOL MF_MetaParam1(DC *dc, short func, short param1); +BOOL MF_MetaParam2(DC *dc, short func, short param1, short param2); +BOOL MF_MetaParam4(DC *dc, short func, short param1, short param2, + short param3, short param4); +BOOL MF_MetaParam6(DC *dc, short func, short param1, short param2, + short param3, short param4, short param5, short param6); +BOOL MF_MetaParam8(DC *dc, short func, short param1, short param2, + short param3, short param4, short param5, + short param6, short param7, short param8); +BOOL MF_CreateBrushIndirect(DC *dc, LOGBRUSH *logbrush); +BOOL MF_CreatePatternBrush(DC *dc, LOGBRUSH *logbrush); +BOOL MF_CreatePenIndirect(DC *dc, LOGPEN *logpen); +BOOL MF_TextOut(DC *dc, short x, short y, LPSTR str, short count); +BOOL MF_MetaPoly(DC *dc, short func, LPPOINT pt, short count); + +#endif /* METAFILE_H */ + diff --git a/include/mmsystem.h b/include/mmsystem.h new file mode 100644 index 00000000000..ac6dd229da7 --- /dev/null +++ b/include/mmsystem.h @@ -0,0 +1,1390 @@ +/* + * MMSYSTEM - Multimedia Wine Extension ... :-) + */ + +#ifndef MMSYSTEM_H +#define MMSYSTEM_H + +typedef LPSTR HPSTR; /* a huge version of LPSTR */ +typedef LPCSTR HPCSTR; /* a huge version of LPCSTR */ + +#define MAXPNAMELEN 32 /* max product name length (including NULL) */ +#define MAXERRORLENGTH 128 /* max error text length (including NULL) */ + +typedef WORD VERSION; /* major (high byte), minor (low byte) */ + +typedef struct { + UINT wType; /* indicates the contents of the union */ + union { + DWORD ms; /* milliseconds */ + DWORD sample; /* samples */ + DWORD cb; /* byte count */ + struct { /* SMPTE */ + BYTE hour; /* hours */ + BYTE min; /* minutes */ + BYTE sec; /* seconds */ + BYTE frame; /* frames */ + BYTE fps; /* frames per second */ + BYTE dummy; /* pad */ + } smpte; + struct { /* MIDI */ + DWORD songptrpos; /* song pointer position */ + } midi; + } u; + } MMTIME; +typedef MMTIME FAR *LPMMTIME; + +#define TIME_MS 0x0001 /* time in milliseconds */ +#define TIME_SAMPLES 0x0002 /* number of wave samples */ +#define TIME_BYTES 0x0004 /* current byte offset */ +#define TIME_SMPTE 0x0008 /* SMPTE time */ +#define TIME_MIDI 0x0010 /* MIDI time */ + +#define MM_JOY1MOVE 0x3A0 /* joystick */ +#define MM_JOY2MOVE 0x3A1 +#define MM_JOY1ZMOVE 0x3A2 +#define MM_JOY2ZMOVE 0x3A3 +#define MM_JOY1BUTTONDOWN 0x3B5 +#define MM_JOY2BUTTONDOWN 0x3B6 +#define MM_JOY1BUTTONUP 0x3B7 +#define MM_JOY2BUTTONUP 0x3B8 + +#define MM_MCINOTIFY 0x3B9 /* MCI */ + +#define MM_WOM_OPEN 0x3BB /* waveform output */ +#define MM_WOM_CLOSE 0x3BC +#define MM_WOM_DONE 0x3BD + +#define MM_WIM_OPEN 0x3BE /* waveform input */ +#define MM_WIM_CLOSE 0x3BF +#define MM_WIM_DATA 0x3C0 + +#define MM_MIM_OPEN 0x3C1 /* MIDI input */ +#define MM_MIM_CLOSE 0x3C2 +#define MM_MIM_DATA 0x3C3 +#define MM_MIM_LONGDATA 0x3C4 +#define MM_MIM_ERROR 0x3C5 +#define MM_MIM_LONGERROR 0x3C6 + +#define MM_MOM_OPEN 0x3C7 /* MIDI output */ +#define MM_MOM_CLOSE 0x3C8 +#define MM_MOM_DONE 0x3C9 + + +#define MMSYSERR_BASE 0 +#define WAVERR_BASE 32 +#define MIDIERR_BASE 64 +#define TIMERR_BASE 96 +#define JOYERR_BASE 160 +#define MCIERR_BASE 256 + +#define MCI_STRING_OFFSET 512 +#define MCI_VD_OFFSET 1024 +#define MCI_CD_OFFSET 1088 +#define MCI_WAVE_OFFSET 1152 +#define MCI_SEQ_OFFSET 1216 + +#define MMSYSERR_NOERROR 0 /* no error */ +#define MMSYSERR_ERROR (MMSYSERR_BASE + 1) /* unspecified error */ +#define MMSYSERR_BADDEVICEID (MMSYSERR_BASE + 2) /* device ID out of range */ +#define MMSYSERR_NOTENABLED (MMSYSERR_BASE + 3) /* driver failed enable */ +#define MMSYSERR_ALLOCATED (MMSYSERR_BASE + 4) /* device already allocated */ +#define MMSYSERR_INVALHANDLE (MMSYSERR_BASE + 5) /* device handle is invalid */ +#define MMSYSERR_NODRIVER (MMSYSERR_BASE + 6) /* no device driver present */ +#define MMSYSERR_NOMEM (MMSYSERR_BASE + 7) /* memory allocation error */ +#define MMSYSERR_NOTSUPPORTED (MMSYSERR_BASE + 8) /* function isn't supported */ +#define MMSYSERR_BADERRNUM (MMSYSERR_BASE + 9) /* error value out of range */ +#define MMSYSERR_INVALFLAG (MMSYSERR_BASE + 10) /* invalid flag passed */ +#define MMSYSERR_INVALPARAM (MMSYSERR_BASE + 11) /* invalid parameter passed */ +#define MMSYSERR_LASTERROR (MMSYSERR_BASE + 11) /* last error in range */ + +#define CALLBACK_TYPEMASK 0x00070000l /* callback type mask */ +#define CALLBACK_NULL 0x00000000l /* no callback */ +#define CALLBACK_WINDOW 0x00010000l /* dwCallback is a HWND */ +#define CALLBACK_TASK 0x00020000l /* dwCallback is a HTASK */ +#define CALLBACK_FUNCTION 0x00030000l /* dwCallback is a FARPROC */ + +typedef void (CALLBACK DRVCALLBACK) (HDRVR h, UINT uMessage, DWORD dwUser, DWORD dw1, DWORD dw2); + +typedef DRVCALLBACK FAR *LPDRVCALLBACK; + +#define MM_MICROSOFT 1 /* Microsoft Corp. */ + +#define MM_MIDI_MAPPER 1 /* MIDI Mapper */ +#define MM_WAVE_MAPPER 2 /* Wave Mapper */ + +#define MM_SNDBLST_MIDIOUT 3 /* Sound Blaster MIDI output port */ +#define MM_SNDBLST_MIDIIN 4 /* Sound Blaster MIDI input port */ +#define MM_SNDBLST_SYNTH 5 /* Sound Blaster internal synthesizer */ +#define MM_SNDBLST_WAVEOUT 6 /* Sound Blaster waveform output */ +#define MM_SNDBLST_WAVEIN 7 /* Sound Blaster waveform input */ + +#define MM_ADLIB 9 /* Ad Lib-compatible synthesizer */ + +#define MM_MPU401_MIDIOUT 10 /* MPU401-compatible MIDI output port */ +#define MM_MPU401_MIDIIN 11 /* MPU401-compatible MIDI input port */ + +#define MM_PC_JOYSTICK 12 /* Joystick adapter */ + + +WORD WINAPI mmsystemGetVersion(void); +void WINAPI OutputDebugStr(LPCSTR); + +BOOL WINAPI sndPlaySound(LPCSTR lpszSoundName, UINT uFlags); + +#define SND_SYNC 0x0000 /* play synchronously (default) */ +#define SND_ASYNC 0x0001 /* play asynchronously */ +#define SND_NODEFAULT 0x0002 /* don't use default sound */ +#define SND_MEMORY 0x0004 /* lpszSoundName points to a memory file */ +#define SND_LOOP 0x0008 /* loop the sound until next sndPlaySound */ +#define SND_NOSTOP 0x0010 /* don't stop any currently playing sound */ + +/* waveform audio error return values */ +#define WAVERR_BADFORMAT (WAVERR_BASE + 0) /* unsupported wave format */ +#define WAVERR_STILLPLAYING (WAVERR_BASE + 1) /* still something playing */ +#define WAVERR_UNPREPARED (WAVERR_BASE + 2) /* header not prepared */ +#define WAVERR_SYNC (WAVERR_BASE + 3) /* device is synchronous */ +#define WAVERR_LASTERROR (WAVERR_BASE + 3) /* last error in range */ + +DECLARE_HANDLE(HWAVE); +DECLARE_HANDLE(HWAVEIN); +DECLARE_HANDLE(HWAVEOUT); +typedef HWAVEIN FAR *LPHWAVEIN; +typedef HWAVEOUT FAR *LPHWAVEOUT; +typedef DRVCALLBACK WAVECALLBACK; +typedef WAVECALLBACK FAR *LPWAVECALLBACK; + +#define WOM_OPEN MM_WOM_OPEN +#define WOM_CLOSE MM_WOM_CLOSE +#define WOM_DONE MM_WOM_DONE +#define WIM_OPEN MM_WIM_OPEN +#define WIM_CLOSE MM_WIM_CLOSE +#define WIM_DATA MM_WIM_DATA + +#define WAVE_MAPPER (-1) + +#define WAVE_FORMAT_QUERY 0x0001 +#define WAVE_ALLOWSYNC 0x0002 + +typedef struct { + LPSTR lpData; /* pointer to locked data buffer */ + DWORD dwBufferLength; /* length of data buffer */ + DWORD dwBytesRecorded; /* used for input only */ + DWORD dwUser; /* for client's use */ + DWORD dwFlags; /* assorted flags (see defines) */ + DWORD dwLoops; /* loop control counter */ + struct wavehdr_tag FAR *lpNext; /* reserved for driver */ + DWORD reserved; /* reserved for driver */ +} WAVEHDR; +typedef WAVEHDR FAR *LPWAVEHDR; + +#define WHDR_DONE 0x00000001 /* done bit */ +#define WHDR_PREPARED 0x00000002 /* set if this header has been prepared */ +#define WHDR_BEGINLOOP 0x00000004 /* loop start block */ +#define WHDR_ENDLOOP 0x00000008 /* loop end block */ +#define WHDR_INQUEUE 0x00000010 /* reserved for driver */ + +typedef struct { + UINT wMid; /* manufacturer ID */ + UINT wPid; /* product ID */ + VERSION vDriverVersion; /* version of the driver */ + char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */ + DWORD dwFormats; /* formats supported */ + UINT wChannels; /* number of sources supported */ + DWORD dwSupport; /* functionality supported by driver */ +} WAVEOUTCAPS; +typedef WAVEOUTCAPS FAR *LPWAVEOUTCAPS; + +#define WAVECAPS_PITCH 0x0001 /* supports pitch control */ +#define WAVECAPS_PLAYBACKRATE 0x0002 /* supports playback rate control */ +#define WAVECAPS_VOLUME 0x0004 /* supports volume control */ +#define WAVECAPS_LRVOLUME 0x0008 /* separate left-right volume control */ +#define WAVECAPS_SYNC 0x0010 + +typedef struct { + UINT wMid; /* manufacturer ID */ + UINT wPid; /* product ID */ + VERSION vDriverVersion; /* version of the driver */ + char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */ + DWORD dwFormats; /* formats supported */ + UINT wChannels; /* number of channels supported */ +} WAVEINCAPS; +typedef WAVEINCAPS FAR *LPWAVEINCAPS; + +#define WAVE_INVALIDFORMAT 0x00000000 /* invalid format */ +#define WAVE_FORMAT_1M08 0x00000001 /* 11.025 kHz, Mono, 8-bit */ +#define WAVE_FORMAT_1S08 0x00000002 /* 11.025 kHz, Stereo, 8-bit */ +#define WAVE_FORMAT_1M16 0x00000004 /* 11.025 kHz, Mono, 16-bit */ +#define WAVE_FORMAT_1S16 0x00000008 /* 11.025 kHz, Stereo, 16-bit */ +#define WAVE_FORMAT_2M08 0x00000010 /* 22.05 kHz, Mono, 8-bit */ +#define WAVE_FORMAT_2S08 0x00000020 /* 22.05 kHz, Stereo, 8-bit */ +#define WAVE_FORMAT_2M16 0x00000040 /* 22.05 kHz, Mono, 16-bit */ +#define WAVE_FORMAT_2S16 0x00000080 /* 22.05 kHz, Stereo, 16-bit */ +#define WAVE_FORMAT_4M08 0x00000100 /* 44.1 kHz, Mono, 8-bit */ +#define WAVE_FORMAT_4S08 0x00000200 /* 44.1 kHz, Stereo, 8-bit */ +#define WAVE_FORMAT_4M16 0x00000400 /* 44.1 kHz, Mono, 16-bit */ +#define WAVE_FORMAT_4S16 0x00000800 /* 44.1 kHz, Stereo, 16-bit */ + +/* general format structure common to all formats */ +typedef struct { + WORD wFormatTag; /* format type */ + WORD nChannels; /* number of channels (i.e. mono, stereo, etc.) */ + DWORD nSamplesPerSec; /* sample rate */ + DWORD nAvgBytesPerSec; /* for buffer estimation */ + WORD nBlockAlign; /* block size of data */ +} WAVEFORMAT; +typedef WAVEFORMAT FAR *LPWAVEFORMAT; + +#define WAVE_FORMAT_PCM 1 + +typedef struct { + WAVEFORMAT wf; + WORD wBitsPerSample; +} PCMWAVEFORMAT; +typedef PCMWAVEFORMAT FAR *LPPCMWAVEFORMAT; + +UINT WINAPI waveOutGetNumDevs(void); +UINT WINAPI waveOutGetDevCaps(UINT uDeviceID, WAVEOUTCAPS FAR* lpCaps, + UINT uSize); +UINT WINAPI waveOutGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume); +UINT WINAPI waveOutSetVolume(UINT uDeviceID, DWORD dwVolume); +UINT WINAPI waveOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize); +UINT WINAPI waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize); +UINT WINAPI waveOutOpen(HWAVEOUT FAR* lphWaveOut, UINT uDeviceID, + const WAVEFORMAT FAR* lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags); +UINT WINAPI waveOutClose(HWAVEOUT hWaveOut); +UINT WINAPI waveOutPrepareHeader(HWAVEOUT hWaveOut, + WAVEHDR FAR* lpWaveOutHdr, UINT uSize); +UINT WINAPI waveOutUnprepareHeader(HWAVEOUT hWaveOut, + WAVEHDR FAR* lpWaveOutHdr, UINT uSize); +UINT WINAPI waveOutWrite(HWAVEOUT hWaveOut, WAVEHDR FAR* lpWaveOutHdr, + UINT uSize); +UINT WINAPI waveOutPause(HWAVEOUT hWaveOut); +UINT WINAPI waveOutRestart(HWAVEOUT hWaveOut); +UINT WINAPI waveOutReset(HWAVEOUT hWaveOut); +UINT WINAPI waveOutBreakLoop(HWAVEOUT hWaveOut); +UINT WINAPI waveOutGetPosition(HWAVEOUT hWaveOut, MMTIME FAR* lpInfo, + UINT uSize); +UINT WINAPI waveOutGetPitch(HWAVEOUT hWaveOut, DWORD FAR* lpdwPitch); +UINT WINAPI waveOutSetPitch(HWAVEOUT hWaveOut, DWORD dwPitch); +UINT WINAPI waveOutGetPlaybackRate(HWAVEOUT hWaveOut, DWORD FAR* lpdwRate); +UINT WINAPI waveOutSetPlaybackRate(HWAVEOUT hWaveOut, DWORD dwRate); +UINT WINAPI waveOutGetID(HWAVEOUT hWaveOut, UINT FAR* lpuDeviceID); + +DWORD WINAPI waveOutMessage(HWAVEOUT hWaveOut, UINT uMessage, DWORD dw1, DWORD dw2); + +UINT WINAPI waveInGetNumDevs(void); +UINT WINAPI waveInGetDevCaps(UINT uDeviceID, WAVEINCAPS FAR* lpCaps, + UINT uSize); +UINT WINAPI waveInGetErrorText(UINT uError, LPSTR lpText, UINT uSize); +UINT WINAPI waveInOpen(HWAVEIN FAR* lphWaveIn, UINT uDeviceID, + const WAVEFORMAT FAR* lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags); +UINT WINAPI waveInClose(HWAVEIN hWaveIn); +UINT WINAPI waveInPrepareHeader(HWAVEIN hWaveIn, + WAVEHDR FAR* lpWaveInHdr, UINT uSize); +UINT WINAPI waveInUnprepareHeader(HWAVEIN hWaveIn, + WAVEHDR FAR* lpWaveInHdr, UINT uSize); +UINT WINAPI waveInAddBuffer(HWAVEIN hWaveIn, + WAVEHDR FAR* lpWaveInHdr, UINT uSize); +UINT WINAPI waveInStart(HWAVEIN hWaveIn); +UINT WINAPI waveInStop(HWAVEIN hWaveIn); +UINT WINAPI waveInReset(HWAVEIN hWaveIn); +UINT WINAPI waveInGetPosition(HWAVEIN hWaveIn, MMTIME FAR* lpInfo, + UINT uSize); +UINT WINAPI waveInGetID(HWAVEIN hWaveIn, UINT FAR* lpuDeviceID); + +DWORD WINAPI waveInMessage(HWAVEIN hWaveIn, UINT uMessage, DWORD dw1, DWORD dw2); + +#define MIDIERR_UNPREPARED (MIDIERR_BASE + 0) /* header not prepared */ +#define MIDIERR_STILLPLAYING (MIDIERR_BASE + 1) /* still something playing */ +#define MIDIERR_NOMAP (MIDIERR_BASE + 2) /* no current map */ +#define MIDIERR_NOTREADY (MIDIERR_BASE + 3) /* hardware is still busy */ +#define MIDIERR_NODEVICE (MIDIERR_BASE + 4) /* port no longer connected */ +#define MIDIERR_INVALIDSETUP (MIDIERR_BASE + 5) /* invalid setup */ +#define MIDIERR_LASTERROR (MIDIERR_BASE + 5) /* last error in range */ + +DECLARE_HANDLE(HMIDI); +DECLARE_HANDLE(HMIDIIN); +DECLARE_HANDLE(HMIDIOUT); +typedef HMIDIIN FAR *LPHMIDIIN; +typedef HMIDIOUT FAR *LPHMIDIOUT; +typedef DRVCALLBACK MIDICALLBACK; +typedef MIDICALLBACK FAR *LPMIDICALLBACK; +#define MIDIPATCHSIZE 128 +typedef WORD PATCHARRAY[MIDIPATCHSIZE]; +typedef WORD FAR *LPPATCHARRAY; +typedef WORD KEYARRAY[MIDIPATCHSIZE]; +typedef WORD FAR *LPKEYARRAY; + +#define MIM_OPEN MM_MIM_OPEN +#define MIM_CLOSE MM_MIM_CLOSE +#define MIM_DATA MM_MIM_DATA +#define MIM_LONGDATA MM_MIM_LONGDATA +#define MIM_ERROR MM_MIM_ERROR +#define MIM_LONGERROR MM_MIM_LONGERROR +#define MOM_OPEN MM_MOM_OPEN +#define MOM_CLOSE MM_MOM_CLOSE +#define MOM_DONE MM_MOM_DONE + +#define MIDIMAPPER (-1) +#define MIDI_MAPPER (-1) + +/* flags for wFlags parm of + midiOutCachePatches(), + midiOutCacheDrumPatches() */ +#define MIDI_CACHE_ALL 1 +#define MIDI_CACHE_BESTFIT 2 +#define MIDI_CACHE_QUERY 3 +#define MIDI_UNCACHE 4 + +typedef struct { + UINT wMid; /* manufacturer ID */ + UINT wPid; /* product ID */ + VERSION vDriverVersion; /* version of the driver */ + char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */ + UINT wTechnology; /* type of device */ + UINT wVoices; /* # of voices (internal synth only) */ + UINT wNotes; /* max # of notes (internal synth only) */ + UINT wChannelMask; /* channels used (internal synth only) */ + DWORD dwSupport; /* functionality supported by driver */ +} MIDIOUTCAPS; +typedef MIDIOUTCAPS FAR *LPMIDIOUTCAPS; + +#define MOD_MIDIPORT 1 /* output port */ +#define MOD_SYNTH 2 /* generic internal synth */ +#define MOD_SQSYNTH 3 /* square wave internal synth */ +#define MOD_FMSYNTH 4 /* FM internal synth */ +#define MOD_MAPPER 5 /* MIDI mapper */ + +#define MIDICAPS_VOLUME 0x0001 /* supports volume control */ +#define MIDICAPS_LRVOLUME 0x0002 /* separate left-right volume control */ +#define MIDICAPS_CACHE 0x0004 + +typedef struct { + UINT wMid; /* manufacturer ID */ + UINT wPid; /* product ID */ + VERSION vDriverVersion; /* version of the driver */ + char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */ +} MIDIINCAPS; +typedef MIDIINCAPS FAR *LPMIDIINCAPS; + +typedef struct { + LPSTR lpData; /* pointer to locked data block */ + DWORD dwBufferLength; /* length of data in data block */ + DWORD dwBytesRecorded; /* used for input only */ + DWORD dwUser; /* for client's use */ + DWORD dwFlags; /* assorted flags (see defines) */ + struct midihdr_tag FAR *lpNext; /* reserved for driver */ + DWORD reserved; /* reserved for driver */ +} MIDIHDR; +typedef MIDIHDR FAR *LPMIDIHDR; + +#define MHDR_DONE 0x00000001 /* done bit */ +#define MHDR_PREPARED 0x00000002 /* set if header prepared */ +#define MHDR_INQUEUE 0x00000004 /* reserved for driver */ + +UINT WINAPI midiOutGetNumDevs(void); +UINT WINAPI midiOutGetDevCaps(UINT uDeviceID, + MIDIOUTCAPS FAR* lpCaps, UINT uSize); +UINT WINAPI midiOutGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume); +UINT WINAPI midiOutSetVolume(UINT uDeviceID, DWORD dwVolume); +UINT WINAPI midiOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize); +UINT WINAPI midiGetErrorText(UINT uError, LPSTR lpText, UINT uSize); +UINT WINAPI midiOutOpen(HMIDIOUT FAR* lphMidiOut, UINT uDeviceID, + DWORD dwCallback, DWORD dwInstance, DWORD dwFlags); +UINT WINAPI midiOutClose(HMIDIOUT hMidiOut); +UINT WINAPI midiOutPrepareHeader(HMIDIOUT hMidiOut, + MIDIHDR FAR* lpMidiOutHdr, UINT uSize); +UINT WINAPI midiOutUnprepareHeader(HMIDIOUT hMidiOut, + MIDIHDR FAR* lpMidiOutHdr, UINT uSize); +UINT WINAPI midiOutShortMsg(HMIDIOUT hMidiOut, DWORD dwMsg); +UINT WINAPI midiOutLongMsg(HMIDIOUT hMidiOut, + MIDIHDR FAR* lpMidiOutHdr, UINT uSize); +UINT WINAPI midiOutReset(HMIDIOUT hMidiOut); +UINT WINAPI midiOutCachePatches(HMIDIOUT hMidiOut, + UINT uBank, WORD FAR* lpwPatchArray, UINT uFlags); +UINT WINAPI midiOutCacheDrumPatches(HMIDIOUT hMidiOut, + UINT uPatch, WORD FAR* lpwKeyArray, UINT uFlags); +UINT WINAPI midiOutGetID(HMIDIOUT hMidiOut, UINT FAR* lpuDeviceID); + +DWORD WINAPI midiOutMessage(HMIDIOUT hMidiOut, UINT uMessage, DWORD dw1, DWORD dw2); + +UINT WINAPI midiInGetNumDevs(void); +UINT WINAPI midiInGetDevCaps(UINT uDeviceID, + LPMIDIINCAPS lpCaps, UINT uSize); +UINT WINAPI midiInGetErrorText(UINT uError, LPSTR lpText, UINT uSize); +UINT WINAPI midiInOpen(HMIDIIN FAR* lphMidiIn, UINT uDeviceID, + DWORD dwCallback, DWORD dwInstance, DWORD dwFlags); +UINT WINAPI midiInClose(HMIDIIN hMidiIn); +UINT WINAPI midiInPrepareHeader(HMIDIIN hMidiIn, + MIDIHDR FAR* lpMidiInHdr, UINT uSize); +UINT WINAPI midiInUnprepareHeader(HMIDIIN hMidiIn, + MIDIHDR FAR* lpMidiInHdr, UINT uSize); +UINT WINAPI midiInAddBuffer(HMIDIIN hMidiIn, + MIDIHDR FAR* lpMidiInHdr, UINT uSize); +UINT WINAPI midiInStart(HMIDIIN hMidiIn); +UINT WINAPI midiInStop(HMIDIIN hMidiIn); +UINT WINAPI midiInReset(HMIDIIN hMidiIn); +UINT WINAPI midiInGetID(HMIDIIN hMidiIn, UINT FAR* lpuDeviceID); + +DWORD WINAPI midiInMessage(HMIDIIN hMidiIn, UINT uMessage, DWORD dw1, DWORD dw2); + +#define AUX_MAPPER (-1) + +typedef struct { + UINT wMid; /* manufacturer ID */ + UINT wPid; /* product ID */ + VERSION vDriverVersion; /* version of the driver */ + char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */ + UINT wTechnology; /* type of device */ + DWORD dwSupport; /* functionality supported by driver */ +} AUXCAPS; +typedef AUXCAPS FAR *LPAUXCAPS; + +#define AUXCAPS_CDAUDIO 1 /* audio from internal CD-ROM drive */ +#define AUXCAPS_AUXIN 2 /* audio from auxiliary input jacks */ + +#define AUXCAPS_VOLUME 0x0001 /* supports volume control */ +#define AUXCAPS_LRVOLUME 0x0002 /* separate left-right volume control */ + +UINT WINAPI auxGetNumDevs(void); +UINT WINAPI auxGetDevCaps(UINT uDeviceID, AUXCAPS FAR* lpCaps, UINT uSize); +UINT WINAPI auxSetVolume(UINT uDeviceID, DWORD dwVolume); +UINT WINAPI auxGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume); + +DWORD WINAPI auxOutMessage(UINT uDeviceID, UINT uMessage, DWORD dw1, DWORD dw2); + +#define TIMERR_NOERROR (0) /* no error */ +#define TIMERR_NOCANDO (TIMERR_BASE+1) /* request not completed */ +#define TIMERR_STRUCT (TIMERR_BASE+33) /* time struct size */ + +typedef void (CALLBACK TIMECALLBACK) (UINT uTimerID, UINT uMessage, DWORD dwUser, DWORD dw1, DWORD dw2); + +typedef TIMECALLBACK FAR *LPTIMECALLBACK; + +#define TIME_ONESHOT 0 /* program timer for single event */ +#define TIME_PERIODIC 1 /* program for continuous periodic event */ + +typedef struct { + UINT wPeriodMin; /* minimum period supported */ + UINT wPeriodMax; /* maximum period supported */ + } TIMECAPS; +typedef TIMECAPS FAR *LPTIMECAPS; + +UINT WINAPI timeGetSystemTime(MMTIME FAR* lpTime, UINT uSize); +DWORD WINAPI timeGetTime(void); +UINT WINAPI timeSetEvent(UINT uDelay, UINT uResolution, + LPTIMECALLBACK lpFunction, DWORD dwUser, UINT uFlags); +UINT WINAPI timeKillEvent(UINT uTimerID); +UINT WINAPI timeGetDevCaps(TIMECAPS FAR* lpTimeCaps, UINT uSize); +UINT WINAPI timeBeginPeriod(UINT uPeriod); +UINT WINAPI timeEndPeriod(UINT uPeriod); + +#define JOYERR_NOERROR (0) /* no error */ +#define JOYERR_PARMS (JOYERR_BASE+5) /* bad parameters */ +#define JOYERR_NOCANDO (JOYERR_BASE+6) /* request not completed */ +#define JOYERR_UNPLUGGED (JOYERR_BASE+7) /* joystick is unplugged */ + +#define JOY_BUTTON1 0x0001 +#define JOY_BUTTON2 0x0002 +#define JOY_BUTTON3 0x0004 +#define JOY_BUTTON4 0x0008 +#define JOY_BUTTON1CHG 0x0100 +#define JOY_BUTTON2CHG 0x0200 +#define JOY_BUTTON3CHG 0x0400 +#define JOY_BUTTON4CHG 0x0800 + +#define JOYSTICKID1 0 +#define JOYSTICKID2 1 + +typedef struct { + UINT wMid; /* manufacturer ID */ + UINT wPid; /* product ID */ + char szPname[MAXPNAMELEN]; /* product name (NULL terminated string) */ + UINT wXmin; /* minimum x position value */ + UINT wXmax; /* maximum x position value */ + UINT wYmin; /* minimum y position value */ + UINT wYmax; /* maximum y position value */ + UINT wZmin; /* minimum z position value */ + UINT wZmax; /* maximum z position value */ + UINT wNumButtons; /* number of buttons */ + UINT wPeriodMin; /* minimum message period when captured */ + UINT wPeriodMax; /* maximum message period when captured */ + } JOYCAPS; +typedef JOYCAPS FAR *LPJOYCAPS; + +typedef struct { + UINT wXpos; /* x position */ + UINT wYpos; /* y position */ + UINT wZpos; /* z position */ + UINT wButtons; /* button states */ + } JOYINFO; +typedef JOYINFO FAR *LPJOYINFO; + +UINT WINAPI joyGetDevCaps(UINT uJoyID, JOYCAPS FAR* lpCaps, UINT uSize); +UINT WINAPI joyGetNumDevs(void); +UINT WINAPI joyGetPos(UINT uJoyID, JOYINFO FAR* lpInfo); +UINT WINAPI joyGetThreshold(UINT uJoyID, UINT FAR* lpuThreshold); +UINT WINAPI joyReleaseCapture(UINT uJoyID); +UINT WINAPI joySetCapture(HWND hwnd, UINT uJoyID, UINT uPeriod, + BOOL bChanged); +UINT WINAPI joySetThreshold(UINT uJoyID, UINT uThreshold); + +#define MMIOERR_BASE 256 +#define MMIOERR_FILENOTFOUND (MMIOERR_BASE + 1) /* file not found */ +#define MMIOERR_OUTOFMEMORY (MMIOERR_BASE + 2) /* out of memory */ +#define MMIOERR_CANNOTOPEN (MMIOERR_BASE + 3) /* cannot open */ +#define MMIOERR_CANNOTCLOSE (MMIOERR_BASE + 4) /* cannot close */ +#define MMIOERR_CANNOTREAD (MMIOERR_BASE + 5) /* cannot read */ +#define MMIOERR_CANNOTWRITE (MMIOERR_BASE + 6) /* cannot write */ +#define MMIOERR_CANNOTSEEK (MMIOERR_BASE + 7) /* cannot seek */ +#define MMIOERR_CANNOTEXPAND (MMIOERR_BASE + 8) /* cannot expand file */ +#define MMIOERR_CHUNKNOTFOUND (MMIOERR_BASE + 9) /* chunk not found */ +#define MMIOERR_UNBUFFERED (MMIOERR_BASE + 10) /* file is unbuffered */ + +#define CFSEPCHAR '+' /* compound file name separator char. */ + +typedef DWORD FOURCC; /* a four character code */ +DECLARE_HANDLE(HMMIO); /* a handle to an open file */ +typedef LRESULT (CALLBACK MMIOPROC)(LPSTR lpmmioinfo, UINT uMessage, + LPARAM lParam1, LPARAM lParam2); +typedef MMIOPROC FAR *LPMMIOPROC; + +typedef struct { + DWORD dwFlags; /* general status flags */ + FOURCC fccIOProc; /* pointer to I/O procedure */ + LPMMIOPROC pIOProc; /* pointer to I/O procedure */ + UINT wErrorRet; /* place for error to be returned */ + HTASK htask; /* alternate local task */ + /* fields maintained by MMIO functions during buffered I/O */ + LONG cchBuffer; /* size of I/O buffer (or 0L) */ + HPSTR pchBuffer; /* start of I/O buffer (or NULL) */ + HPSTR pchNext; /* pointer to next byte to read/write */ + HPSTR pchEndRead; /* pointer to last valid byte to read */ + HPSTR pchEndWrite; /* pointer to last byte to write */ + LONG lBufOffset; /* disk offset of start of buffer */ + /* fields maintained by I/O procedure */ + LONG lDiskOffset; /* disk offset of next read or write */ + DWORD adwInfo[3]; /* data specific to type of MMIOPROC */ + /* other fields maintained by MMIO */ + DWORD dwReserved1; /* reserved for MMIO use */ + DWORD dwReserved2; /* reserved for MMIO use */ + HMMIO hmmio; /* handle to open file */ +} MMIOINFO; +typedef MMIOINFO FAR *LPMMIOINFO; + +typedef struct _MMCKINFO +{ + FOURCC ckid; /* chunk ID */ + DWORD cksize; /* chunk size */ + FOURCC fccType; /* form type or list type */ + DWORD dwDataOffset; /* offset of data portion of chunk */ + DWORD dwFlags; /* flags used by MMIO functions */ +} MMCKINFO; +typedef MMCKINFO FAR *LPMMCKINFO; + +#define MMIO_RWMODE 0x00000003 /* open file for reading/writing/both */ +#define MMIO_SHAREMODE 0x00000070 /* file sharing mode number */ + +#define MMIO_CREATE 0x00001000 /* create new file (or truncate file) */ +#define MMIO_PARSE 0x00000100 /* parse new file returning path */ +#define MMIO_DELETE 0x00000200 /* create new file (or truncate file) */ +#define MMIO_EXIST 0x00004000 /* checks for existence of file */ +#define MMIO_ALLOCBUF 0x00010000 /* mmioOpen() should allocate a buffer */ +#define MMIO_GETTEMP 0x00020000 /* mmioOpen() should retrieve temp name */ + +#define MMIO_DIRTY 0x10000000 /* I/O buffer is dirty */ + +#define MMIO_READ 0x00000000 /* open file for reading only */ +#define MMIO_WRITE 0x00000001 /* open file for writing only */ +#define MMIO_READWRITE 0x00000002 /* open file for reading and writing */ + +#define MMIO_COMPAT 0x00000000 /* compatibility mode */ +#define MMIO_EXCLUSIVE 0x00000010 /* exclusive-access mode */ +#define MMIO_DENYWRITE 0x00000020 /* deny writing to other processes */ +#define MMIO_DENYREAD 0x00000030 /* deny reading to other processes */ +#define MMIO_DENYNONE 0x00000040 /* deny nothing to other processes */ + +#define MMIO_FHOPEN 0x0010 /* mmioClose: keep file handle open */ +#define MMIO_EMPTYBUF 0x0010 /* mmioFlush: empty the I/O buffer */ +#define MMIO_TOUPPER 0x0010 /* mmioStringToFOURCC: to u-case */ +#define MMIO_INSTALLPROC 0x00010000 /* mmioInstallIOProc: install MMIOProc */ +#define MMIO_GLOBALPROC 0x10000000 /* mmioInstallIOProc: install globally */ +#define MMIO_REMOVEPROC 0x00020000 /* mmioInstallIOProc: remove MMIOProc */ +#define MMIO_FINDPROC 0x00040000 /* mmioInstallIOProc: find an MMIOProc */ +#define MMIO_FINDCHUNK 0x0010 /* mmioDescend: find a chunk by ID */ +#define MMIO_FINDRIFF 0x0020 /* mmioDescend: find a LIST chunk */ +#define MMIO_FINDLIST 0x0040 /* mmioDescend: find a RIFF chunk */ +#define MMIO_CREATERIFF 0x0020 /* mmioCreateChunk: make a LIST chunk */ +#define MMIO_CREATELIST 0x0040 /* mmioCreateChunk: make a RIFF chunk */ + +#define MMIOM_READ MMIO_READ /* read */ +#define MMIOM_WRITE MMIO_WRITE /* write */ +#define MMIOM_SEEK 2 /* seek to a new position in file */ +#define MMIOM_OPEN 3 /* open file */ +#define MMIOM_CLOSE 4 /* close file */ +#define MMIOM_WRITEFLUSH 5 /* write and flush */ + +#define MMIOM_RENAME 6 /* rename specified file */ + +#define MMIOM_USER 0x8000 /* beginning of user-defined messages */ + +#define FOURCC_RIFF mmioFOURCC('R', 'I', 'F', 'F') +#define FOURCC_LIST mmioFOURCC('L', 'I', 'S', 'T') + +#define FOURCC_DOS mmioFOURCC('D', 'O', 'S', ' ') +#define FOURCC_MEM mmioFOURCC('M', 'E', 'M', ' ') + +#define MMIO_DEFAULTBUFFER 8192 /* default buffer size */ + +#define mmioFOURCC( ch0, ch1, ch2, ch3 ) \ + ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \ + ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) ) + +FOURCC WINAPI mmioStringToFOURCC(LPCSTR sz, UINT uFlags); +LPMMIOPROC WINAPI mmioInstallIOProc(FOURCC fccIOProc, LPMMIOPROC pIOProc, + DWORD dwFlags); +HMMIO WINAPI mmioOpen(LPSTR szFileName, MMIOINFO FAR* lpmmioinfo, + DWORD dwOpenFlags); + +UINT WINAPI mmioRename(LPCSTR szFileName, LPCSTR szNewFileName, + MMIOINFO FAR* lpmmioinfo, DWORD dwRenameFlags); + +UINT WINAPI mmioClose(HMMIO hmmio, UINT uFlags); +LONG WINAPI mmioRead(HMMIO hmmio, HPSTR pch, LONG cch); +LONG WINAPI mmioWrite(HMMIO hmmio, HPCSTR pch, LONG cch); +LONG WINAPI mmioSeek(HMMIO hmmio, LONG lOffset, int iOrigin); +UINT WINAPI mmioGetInfo(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags); +UINT WINAPI mmioSetInfo(HMMIO hmmio, const MMIOINFO FAR* lpmmioinfo, UINT uFlags); +UINT WINAPI mmioSetBuffer(HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, + UINT uFlags); +UINT WINAPI mmioFlush(HMMIO hmmio, UINT uFlags); +UINT WINAPI mmioAdvance(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags); +LRESULT WINAPI mmioSendMessage(HMMIO hmmio, UINT uMessage, + LPARAM lParam1, LPARAM lParam2); +UINT WINAPI mmioDescend(HMMIO hmmio, MMCKINFO FAR* lpck, + const MMCKINFO FAR* lpckParent, UINT uFlags); +UINT WINAPI mmioAscend(HMMIO hmmio, MMCKINFO FAR* lpck, UINT uFlags); +UINT WINAPI mmioCreateChunk(HMMIO hmmio, MMCKINFO FAR* lpck, UINT uFlags); + +typedef UINT (CALLBACK *YIELDPROC) (UINT uDeviceID, DWORD dwYieldData); + +DWORD WINAPI mciSendCommand (UINT uDeviceID, UINT uMessage, + DWORD dwParam1, DWORD dwParam2); +DWORD WINAPI mciSendString (LPCSTR lpstrCommand, + LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback); +UINT WINAPI mciGetDeviceID (LPCSTR lpstrName); +UINT WINAPI mciGetDeviceIDFromElementID (DWORD dwElementID, + LPCSTR lpstrType); +BOOL WINAPI mciGetErrorString (DWORD wError, LPSTR lpstrBuffer, + UINT uLength); +BOOL WINAPI mciSetYieldProc (UINT uDeviceID, YIELDPROC fpYieldProc, + DWORD dwYieldData); + +HTASK WINAPI mciGetCreatorTask(UINT uDeviceID); +YIELDPROC WINAPI mciGetYieldProc (UINT uDeviceID, DWORD FAR* lpdwYieldData); + +#define MCIERR_INVALID_DEVICE_ID (MCIERR_BASE + 1) +#define MCIERR_UNRECOGNIZED_KEYWORD (MCIERR_BASE + 3) +#define MCIERR_UNRECOGNIZED_COMMAND (MCIERR_BASE + 5) +#define MCIERR_HARDWARE (MCIERR_BASE + 6) +#define MCIERR_INVALID_DEVICE_NAME (MCIERR_BASE + 7) +#define MCIERR_OUT_OF_MEMORY (MCIERR_BASE + 8) +#define MCIERR_DEVICE_OPEN (MCIERR_BASE + 9) +#define MCIERR_CANNOT_LOAD_DRIVER (MCIERR_BASE + 10) +#define MCIERR_MISSING_COMMAND_STRING (MCIERR_BASE + 11) +#define MCIERR_PARAM_OVERFLOW (MCIERR_BASE + 12) +#define MCIERR_MISSING_STRING_ARGUMENT (MCIERR_BASE + 13) +#define MCIERR_BAD_INTEGER (MCIERR_BASE + 14) +#define MCIERR_PARSER_INTERNAL (MCIERR_BASE + 15) +#define MCIERR_DRIVER_INTERNAL (MCIERR_BASE + 16) +#define MCIERR_MISSING_PARAMETER (MCIERR_BASE + 17) +#define MCIERR_UNSUPPORTED_FUNCTION (MCIERR_BASE + 18) +#define MCIERR_FILE_NOT_FOUND (MCIERR_BASE + 19) +#define MCIERR_DEVICE_NOT_READY (MCIERR_BASE + 20) +#define MCIERR_INTERNAL (MCIERR_BASE + 21) +#define MCIERR_DRIVER (MCIERR_BASE + 22) +#define MCIERR_CANNOT_USE_ALL (MCIERR_BASE + 23) +#define MCIERR_MULTIPLE (MCIERR_BASE + 24) +#define MCIERR_EXTENSION_NOT_FOUND (MCIERR_BASE + 25) +#define MCIERR_OUTOFRANGE (MCIERR_BASE + 26) +#define MCIERR_FLAGS_NOT_COMPATIBLE (MCIERR_BASE + 28) +#define MCIERR_FILE_NOT_SAVED (MCIERR_BASE + 30) +#define MCIERR_DEVICE_TYPE_REQUIRED (MCIERR_BASE + 31) +#define MCIERR_DEVICE_LOCKED (MCIERR_BASE + 32) +#define MCIERR_DUPLICATE_ALIAS (MCIERR_BASE + 33) +#define MCIERR_BAD_CONSTANT (MCIERR_BASE + 34) +#define MCIERR_MUST_USE_SHAREABLE (MCIERR_BASE + 35) +#define MCIERR_MISSING_DEVICE_NAME (MCIERR_BASE + 36) +#define MCIERR_BAD_TIME_FORMAT (MCIERR_BASE + 37) +#define MCIERR_NO_CLOSING_QUOTE (MCIERR_BASE + 38) +#define MCIERR_DUPLICATE_FLAGS (MCIERR_BASE + 39) +#define MCIERR_INVALID_FILE (MCIERR_BASE + 40) +#define MCIERR_NULL_PARAMETER_BLOCK (MCIERR_BASE + 41) +#define MCIERR_UNNAMED_RESOURCE (MCIERR_BASE + 42) +#define MCIERR_NEW_REQUIRES_ALIAS (MCIERR_BASE + 43) +#define MCIERR_NOTIFY_ON_AUTO_OPEN (MCIERR_BASE + 44) +#define MCIERR_NO_ELEMENT_ALLOWED (MCIERR_BASE + 45) +#define MCIERR_NONAPPLICABLE_FUNCTION (MCIERR_BASE + 46) +#define MCIERR_ILLEGAL_FOR_AUTO_OPEN (MCIERR_BASE + 47) +#define MCIERR_FILENAME_REQUIRED (MCIERR_BASE + 48) +#define MCIERR_EXTRA_CHARACTERS (MCIERR_BASE + 49) +#define MCIERR_DEVICE_NOT_INSTALLED (MCIERR_BASE + 50) +#define MCIERR_GET_CD (MCIERR_BASE + 51) +#define MCIERR_SET_CD (MCIERR_BASE + 52) +#define MCIERR_SET_DRIVE (MCIERR_BASE + 53) +#define MCIERR_DEVICE_LENGTH (MCIERR_BASE + 54) +#define MCIERR_DEVICE_ORD_LENGTH (MCIERR_BASE + 55) +#define MCIERR_NO_INTEGER (MCIERR_BASE + 56) + +#define MCIERR_WAVE_OUTPUTSINUSE (MCIERR_BASE + 64) +#define MCIERR_WAVE_SETOUTPUTINUSE (MCIERR_BASE + 65) +#define MCIERR_WAVE_INPUTSINUSE (MCIERR_BASE + 66) +#define MCIERR_WAVE_SETINPUTINUSE (MCIERR_BASE + 67) +#define MCIERR_WAVE_OUTPUTUNSPECIFIED (MCIERR_BASE + 68) +#define MCIERR_WAVE_INPUTUNSPECIFIED (MCIERR_BASE + 69) +#define MCIERR_WAVE_OUTPUTSUNSUITABLE (MCIERR_BASE + 70) +#define MCIERR_WAVE_SETOUTPUTUNSUITABLE (MCIERR_BASE + 71) +#define MCIERR_WAVE_INPUTSUNSUITABLE (MCIERR_BASE + 72) +#define MCIERR_WAVE_SETINPUTUNSUITABLE (MCIERR_BASE + 73) + +#define MCIERR_SEQ_DIV_INCOMPATIBLE (MCIERR_BASE + 80) +#define MCIERR_SEQ_PORT_INUSE (MCIERR_BASE + 81) +#define MCIERR_SEQ_PORT_NONEXISTENT (MCIERR_BASE + 82) +#define MCIERR_SEQ_PORT_MAPNODEVICE (MCIERR_BASE + 83) +#define MCIERR_SEQ_PORT_MISCERROR (MCIERR_BASE + 84) +#define MCIERR_SEQ_TIMER (MCIERR_BASE + 85) +#define MCIERR_SEQ_PORTUNSPECIFIED (MCIERR_BASE + 86) +#define MCIERR_SEQ_NOMIDIPRESENT (MCIERR_BASE + 87) + +#define MCIERR_NO_WINDOW (MCIERR_BASE + 90) +#define MCIERR_CREATEWINDOW (MCIERR_BASE + 91) +#define MCIERR_FILE_READ (MCIERR_BASE + 92) +#define MCIERR_FILE_WRITE (MCIERR_BASE + 93) + +#define MCIERR_CUSTOM_DRIVER_BASE (MCIERR_BASE + 256) + +#define MCI_OPEN 0x0803 +#define MCI_CLOSE 0x0804 +#define MCI_ESCAPE 0x0805 +#define MCI_PLAY 0x0806 +#define MCI_SEEK 0x0807 +#define MCI_STOP 0x0808 +#define MCI_PAUSE 0x0809 +#define MCI_INFO 0x080A +#define MCI_GETDEVCAPS 0x080B +#define MCI_SPIN 0x080C +#define MCI_SET 0x080D +#define MCI_STEP 0x080E +#define MCI_RECORD 0x080F +#define MCI_SYSINFO 0x0810 +#define MCI_BREAK 0x0811 +#define MCI_SOUND 0x0812 +#define MCI_SAVE 0x0813 +#define MCI_STATUS 0x0814 +#define MCI_CUE 0x0830 +#define MCI_REALIZE 0x0840 +#define MCI_WINDOW 0x0841 +#define MCI_PUT 0x0842 +#define MCI_WHERE 0x0843 +#define MCI_FREEZE 0x0844 +#define MCI_UNFREEZE 0x0845 +#define MCI_LOAD 0x0850 +#define MCI_CUT 0x0851 +#define MCI_COPY 0x0852 +#define MCI_PASTE 0x0853 +#define MCI_UPDATE 0x0854 +#define MCI_RESUME 0x0855 +#define MCI_DELETE 0x0856 + +#define MCI_USER_MESSAGES (0x400 + DRV_MCI_FIRST) + +#define MCI_ALL_DEVICE_ID 0xFFFF + +#define MCI_DEVTYPE_VCR (MCI_STRING_OFFSET + 1) +#define MCI_DEVTYPE_VIDEODISC (MCI_STRING_OFFSET + 2) +#define MCI_DEVTYPE_OVERLAY (MCI_STRING_OFFSET + 3) +#define MCI_DEVTYPE_CD_AUDIO (MCI_STRING_OFFSET + 4) +#define MCI_DEVTYPE_DAT (MCI_STRING_OFFSET + 5) +#define MCI_DEVTYPE_SCANNER (MCI_STRING_OFFSET + 6) +#define MCI_DEVTYPE_ANIMATION (MCI_STRING_OFFSET + 7) +#define MCI_DEVTYPE_DIGITAL_VIDEO (MCI_STRING_OFFSET + 8) +#define MCI_DEVTYPE_OTHER (MCI_STRING_OFFSET + 9) +#define MCI_DEVTYPE_WAVEFORM_AUDIO (MCI_STRING_OFFSET + 10) +#define MCI_DEVTYPE_SEQUENCER (MCI_STRING_OFFSET + 11) + +#define MCI_DEVTYPE_FIRST MCI_DEVTYPE_VCR +#define MCI_DEVTYPE_LAST MCI_DEVTYPE_SEQUENCER + +#define MCI_MODE_NOT_READY (MCI_STRING_OFFSET + 12) +#define MCI_MODE_STOP (MCI_STRING_OFFSET + 13) +#define MCI_MODE_PLAY (MCI_STRING_OFFSET + 14) +#define MCI_MODE_RECORD (MCI_STRING_OFFSET + 15) +#define MCI_MODE_SEEK (MCI_STRING_OFFSET + 16) +#define MCI_MODE_PAUSE (MCI_STRING_OFFSET + 17) +#define MCI_MODE_OPEN (MCI_STRING_OFFSET + 18) + +#define MCI_FORMAT_MILLISECONDS 0 +#define MCI_FORMAT_HMS 1 +#define MCI_FORMAT_MSF 2 +#define MCI_FORMAT_FRAMES 3 +#define MCI_FORMAT_SMPTE_24 4 +#define MCI_FORMAT_SMPTE_25 5 +#define MCI_FORMAT_SMPTE_30 6 +#define MCI_FORMAT_SMPTE_30DROP 7 +#define MCI_FORMAT_BYTES 8 +#define MCI_FORMAT_SAMPLES 9 +#define MCI_FORMAT_TMSF 10 + +#define MCI_MSF_MINUTE(msf) ((BYTE)(msf)) +#define MCI_MSF_SECOND(msf) ((BYTE)(((WORD)(msf)) >> 8)) +#define MCI_MSF_FRAME(msf) ((BYTE)((msf)>>16)) + +#define MCI_MAKE_MSF(m, s, f) ((DWORD)(((BYTE)(m) | \ + ((WORD)(s)<<8)) | \ + (((DWORD)(BYTE)(f))<<16))) + +#define MCI_TMSF_TRACK(tmsf) ((BYTE)(tmsf)) +#define MCI_TMSF_MINUTE(tmsf) ((BYTE)(((WORD)(tmsf)) >> 8)) +#define MCI_TMSF_SECOND(tmsf) ((BYTE)((tmsf)>>16)) +#define MCI_TMSF_FRAME(tmsf) ((BYTE)((tmsf)>>24)) + +#define MCI_MAKE_TMSF(t, m, s, f) ((DWORD)(((BYTE)(t) | \ + ((WORD)(m)<<8)) | \ + (((DWORD)(BYTE)(s) | \ + ((WORD)(f)<<8))<<16))) + +#define MCI_HMS_HOUR(hms) ((BYTE)(hms)) +#define MCI_HMS_MINUTE(hms) ((BYTE)(((WORD)(hms)) >> 8)) +#define MCI_HMS_SECOND(hms) ((BYTE)((hms)>>16)) + +#define MCI_MAKE_HMS(h, m, s) ((DWORD)(((BYTE)(h) | \ + ((WORD)(m)<<8)) | \ + (((DWORD)(BYTE)(s))<<16))) + +#define MCI_NOTIFY_SUCCESSFUL 0x0001 +#define MCI_NOTIFY_SUPERSEDED 0x0002 +#define MCI_NOTIFY_ABORTED 0x0004 +#define MCI_NOTIFY_FAILURE 0x0008 + +#define MCI_NOTIFY 0x00000001L +#define MCI_WAIT 0x00000002L +#define MCI_FROM 0x00000004L +#define MCI_TO 0x00000008L +#define MCI_TRACK 0x00000010L + +#define MCI_OPEN_SHAREABLE 0x00000100L +#define MCI_OPEN_ELEMENT 0x00000200L +#define MCI_OPEN_ALIAS 0x00000400L +#define MCI_OPEN_ELEMENT_ID 0x00000800L +#define MCI_OPEN_TYPE_ID 0x00001000L +#define MCI_OPEN_TYPE 0x00002000L + +#define MCI_SEEK_TO_START 0x00000100L +#define MCI_SEEK_TO_END 0x00000200L + +#define MCI_STATUS_ITEM 0x00000100L +#define MCI_STATUS_START 0x00000200L + +#define MCI_STATUS_LENGTH 0x00000001L +#define MCI_STATUS_POSITION 0x00000002L +#define MCI_STATUS_NUMBER_OF_TRACKS 0x00000003L +#define MCI_STATUS_MODE 0x00000004L +#define MCI_STATUS_MEDIA_PRESENT 0x00000005L +#define MCI_STATUS_TIME_FORMAT 0x00000006L +#define MCI_STATUS_READY 0x00000007L +#define MCI_STATUS_CURRENT_TRACK 0x00000008L + +#define MCI_INFO_PRODUCT 0x00000100L +#define MCI_INFO_FILE 0x00000200L + +#define MCI_GETDEVCAPS_ITEM 0x00000100L + +#define MCI_GETDEVCAPS_CAN_RECORD 0x00000001L +#define MCI_GETDEVCAPS_HAS_AUDIO 0x00000002L +#define MCI_GETDEVCAPS_HAS_VIDEO 0x00000003L +#define MCI_GETDEVCAPS_DEVICE_TYPE 0x00000004L +#define MCI_GETDEVCAPS_USES_FILES 0x00000005L +#define MCI_GETDEVCAPS_COMPOUND_DEVICE 0x00000006L +#define MCI_GETDEVCAPS_CAN_EJECT 0x00000007L +#define MCI_GETDEVCAPS_CAN_PLAY 0x00000008L +#define MCI_GETDEVCAPS_CAN_SAVE 0x00000009L + +#define MCI_SYSINFO_QUANTITY 0x00000100L +#define MCI_SYSINFO_OPEN 0x00000200L +#define MCI_SYSINFO_NAME 0x00000400L +#define MCI_SYSINFO_INSTALLNAME 0x00000800L + +#define MCI_SET_DOOR_OPEN 0x00000100L +#define MCI_SET_DOOR_CLOSED 0x00000200L +#define MCI_SET_TIME_FORMAT 0x00000400L +#define MCI_SET_AUDIO 0x00000800L +#define MCI_SET_VIDEO 0x00001000L +#define MCI_SET_ON 0x00002000L +#define MCI_SET_OFF 0x00004000L + +#define MCI_SET_AUDIO_ALL 0x00000000L +#define MCI_SET_AUDIO_LEFT 0x00000001L +#define MCI_SET_AUDIO_RIGHT 0x00000002L + +#define MCI_BREAK_KEY 0x00000100L +#define MCI_BREAK_HWND 0x00000200L +#define MCI_BREAK_OFF 0x00000400L + +#define MCI_RECORD_INSERT 0x00000100L +#define MCI_RECORD_OVERWRITE 0x00000200L + +#define MCI_SOUND_NAME 0x00000100L + +#define MCI_SAVE_FILE 0x00000100L + +#define MCI_LOAD_FILE 0x00000100L + +typedef struct { + DWORD dwCallback; + } MCI_GENERIC_PARMS; +typedef MCI_GENERIC_PARMS FAR *LPMCI_GENERIC_PARMS; + +typedef struct { + DWORD dwCallback; + UINT wDeviceID; + UINT wReserved0; + LPCSTR lpstrDeviceType; + LPCSTR lpstrElementName; + LPCSTR lpstrAlias; + } MCI_OPEN_PARMS; +typedef MCI_OPEN_PARMS FAR *LPMCI_OPEN_PARMS; + +typedef struct { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; + } MCI_PLAY_PARMS; +typedef MCI_PLAY_PARMS FAR *LPMCI_PLAY_PARMS; + +typedef struct { + DWORD dwCallback; + DWORD dwTo; + } MCI_SEEK_PARMS; +typedef MCI_SEEK_PARMS FAR *LPMCI_SEEK_PARMS; + +typedef struct { + DWORD dwCallback; + DWORD dwReturn; + DWORD dwItem; + DWORD dwTrack; + } MCI_STATUS_PARMS; +typedef MCI_STATUS_PARMS FAR * LPMCI_STATUS_PARMS; + +typedef struct { + DWORD dwCallback; + LPSTR lpstrReturn; + DWORD dwRetSize; + } MCI_INFO_PARMS; +typedef MCI_INFO_PARMS FAR * LPMCI_INFO_PARMS; + +typedef struct { + DWORD dwCallback; + DWORD dwReturn; + DWORD dwItem; + } MCI_GETDEVCAPS_PARMS; +typedef MCI_GETDEVCAPS_PARMS FAR * LPMCI_GETDEVCAPS_PARMS; + +typedef struct { + DWORD dwCallback; + LPSTR lpstrReturn; + DWORD dwRetSize; + DWORD dwNumber; + UINT wDeviceType; + UINT wReserved0; + } MCI_SYSINFO_PARMS; +typedef MCI_SYSINFO_PARMS FAR * LPMCI_SYSINFO_PARMS; + +typedef struct { + DWORD dwCallback; + DWORD dwTimeFormat; + DWORD dwAudio; + } MCI_SET_PARMS; +typedef MCI_SET_PARMS FAR *LPMCI_SET_PARMS; + +typedef struct { + DWORD dwCallback; + int nVirtKey; + UINT wReserved0; + HWND hwndBreak; + UINT wReserved1; + } MCI_BREAK_PARMS; +typedef MCI_BREAK_PARMS FAR * LPMCI_BREAK_PARMS; + +typedef struct { + DWORD dwCallback; + LPCSTR lpstrSoundName; + } MCI_SOUND_PARMS; +typedef MCI_SOUND_PARMS FAR * LPMCI_SOUND_PARMS; + +typedef struct { + DWORD dwCallback; + LPCSTR lpfilename; + } MCI_SAVE_PARMS; +typedef MCI_SAVE_PARMS FAR * LPMCI_SAVE_PARMS; + +typedef struct { + DWORD dwCallback; + LPCSTR lpfilename; + } MCI_LOAD_PARMS; +typedef MCI_LOAD_PARMS FAR * LPMCI_LOAD_PARMS; + +typedef struct { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; + } MCI_RECORD_PARMS; +typedef MCI_RECORD_PARMS FAR *LPMCI_RECORD_PARMS; + +#define MCI_VD_MODE_PARK (MCI_VD_OFFSET + 1) + +#define MCI_VD_MEDIA_CLV (MCI_VD_OFFSET + 2) +#define MCI_VD_MEDIA_CAV (MCI_VD_OFFSET + 3) +#define MCI_VD_MEDIA_OTHER (MCI_VD_OFFSET + 4) + +#define MCI_VD_FORMAT_TRACK 0x4001 + +#define MCI_VD_PLAY_REVERSE 0x00010000L +#define MCI_VD_PLAY_FAST 0x00020000L +#define MCI_VD_PLAY_SPEED 0x00040000L +#define MCI_VD_PLAY_SCAN 0x00080000L +#define MCI_VD_PLAY_SLOW 0x00100000L + +#define MCI_VD_SEEK_REVERSE 0x00010000L + +#define MCI_VD_STATUS_SPEED 0x00004002L +#define MCI_VD_STATUS_FORWARD 0x00004003L +#define MCI_VD_STATUS_MEDIA_TYPE 0x00004004L +#define MCI_VD_STATUS_SIDE 0x00004005L +#define MCI_VD_STATUS_DISC_SIZE 0x00004006L + +#define MCI_VD_GETDEVCAPS_CLV 0x00010000L +#define MCI_VD_GETDEVCAPS_CAV 0x00020000L + +#define MCI_VD_SPIN_UP 0x00010000L +#define MCI_VD_SPIN_DOWN 0x00020000L + +#define MCI_VD_GETDEVCAPS_CAN_REVERSE 0x00004002L +#define MCI_VD_GETDEVCAPS_FAST_RATE 0x00004003L +#define MCI_VD_GETDEVCAPS_SLOW_RATE 0x00004004L +#define MCI_VD_GETDEVCAPS_NORMAL_RATE 0x00004005L + +#define MCI_VD_STEP_FRAMES 0x00010000L +#define MCI_VD_STEP_REVERSE 0x00020000L + +#define MCI_VD_ESCAPE_STRING 0x00000100L + +typedef struct { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; + DWORD dwSpeed; + } MCI_VD_PLAY_PARMS; +typedef MCI_VD_PLAY_PARMS FAR *LPMCI_VD_PLAY_PARMS; + +typedef struct { + DWORD dwCallback; + DWORD dwFrames; + } MCI_VD_STEP_PARMS; +typedef MCI_VD_STEP_PARMS FAR *LPMCI_VD_STEP_PARMS; + +typedef struct { + DWORD dwCallback; + LPCSTR lpstrCommand; + } MCI_VD_ESCAPE_PARMS; +typedef MCI_VD_ESCAPE_PARMS FAR *LPMCI_VD_ESCAPE_PARMS; + +#define MCI_WAVE_OPEN_BUFFER 0x00010000L + +#define MCI_WAVE_SET_FORMATTAG 0x00010000L +#define MCI_WAVE_SET_CHANNELS 0x00020000L +#define MCI_WAVE_SET_SAMPLESPERSEC 0x00040000L +#define MCI_WAVE_SET_AVGBYTESPERSEC 0x00080000L +#define MCI_WAVE_SET_BLOCKALIGN 0x00100000L +#define MCI_WAVE_SET_BITSPERSAMPLE 0x00200000L + +#define MCI_WAVE_INPUT 0x00400000L +#define MCI_WAVE_OUTPUT 0x00800000L + +#define MCI_WAVE_STATUS_FORMATTAG 0x00004001L +#define MCI_WAVE_STATUS_CHANNELS 0x00004002L +#define MCI_WAVE_STATUS_SAMPLESPERSEC 0x00004003L +#define MCI_WAVE_STATUS_AVGBYTESPERSEC 0x00004004L +#define MCI_WAVE_STATUS_BLOCKALIGN 0x00004005L +#define MCI_WAVE_STATUS_BITSPERSAMPLE 0x00004006L +#define MCI_WAVE_STATUS_LEVEL 0x00004007L + +#define MCI_WAVE_SET_ANYINPUT 0x04000000L +#define MCI_WAVE_SET_ANYOUTPUT 0x08000000L + +#define MCI_WAVE_GETDEVCAPS_INPUTS 0x00004001L +#define MCI_WAVE_GETDEVCAPS_OUTPUTS 0x00004002L + +typedef struct { + DWORD dwCallback; + UINT wDeviceID; + UINT wReserved0; + LPCSTR lpstrDeviceType; + LPCSTR lpstrElementName; + LPCSTR lpstrAlias; + DWORD dwBufferSeconds; + } MCI_WAVE_OPEN_PARMS; +typedef MCI_WAVE_OPEN_PARMS FAR *LPMCI_WAVE_OPEN_PARMS; + +typedef struct { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; + } MCI_WAVE_DELETE_PARMS; +typedef MCI_WAVE_DELETE_PARMS FAR *LPMCI_WAVE_DELETE_PARMS; + +typedef struct { + DWORD dwCallback; + DWORD dwTimeFormat; + DWORD dwAudio; + UINT wInput; + UINT wReserved0; + UINT wOutput; + UINT wReserved1; + UINT wFormatTag; + UINT wReserved2; + UINT nChannels; + UINT wReserved3; + DWORD nSamplesPerSec; + DWORD nAvgBytesPerSec; + UINT nBlockAlign; + UINT wReserved4; + UINT wBitsPerSample; + UINT wReserved5; + } MCI_WAVE_SET_PARMS; +typedef MCI_WAVE_SET_PARMS FAR * LPMCI_WAVE_SET_PARMS; + +#define MCI_SEQ_DIV_PPQN (0 + MCI_SEQ_OFFSET) +#define MCI_SEQ_DIV_SMPTE_24 (1 + MCI_SEQ_OFFSET) +#define MCI_SEQ_DIV_SMPTE_25 (2 + MCI_SEQ_OFFSET) +#define MCI_SEQ_DIV_SMPTE_30DROP (3 + MCI_SEQ_OFFSET) +#define MCI_SEQ_DIV_SMPTE_30 (4 + MCI_SEQ_OFFSET) + +#define MCI_SEQ_FORMAT_SONGPTR 0x4001 +#define MCI_SEQ_FILE 0x4002 +#define MCI_SEQ_MIDI 0x4003 +#define MCI_SEQ_SMPTE 0x4004 +#define MCI_SEQ_NONE 65533 + +#define MCI_SEQ_STATUS_TEMPO 0x00004002L +#define MCI_SEQ_STATUS_PORT 0x00004003L +#define MCI_SEQ_STATUS_SLAVE 0x00004007L +#define MCI_SEQ_STATUS_MASTER 0x00004008L +#define MCI_SEQ_STATUS_OFFSET 0x00004009L +#define MCI_SEQ_STATUS_DIVTYPE 0x0000400AL + +#define MCI_SEQ_SET_TEMPO 0x00010000L +#define MCI_SEQ_SET_PORT 0x00020000L +#define MCI_SEQ_SET_SLAVE 0x00040000L +#define MCI_SEQ_SET_MASTER 0x00080000L +#define MCI_SEQ_SET_OFFSET 0x01000000L + +typedef struct { + DWORD dwCallback; + DWORD dwTimeFormat; + DWORD dwAudio; + DWORD dwTempo; + DWORD dwPort; + DWORD dwSlave; + DWORD dwMaster; + DWORD dwOffset; + } MCI_SEQ_SET_PARMS; +typedef MCI_SEQ_SET_PARMS FAR * LPMCI_SEQ_SET_PARMS; + +#define MCI_ANIM_OPEN_WS 0x00010000L +#define MCI_ANIM_OPEN_PARENT 0x00020000L +#define MCI_ANIM_OPEN_NOSTATIC 0x00040000L + +#define MCI_ANIM_PLAY_SPEED 0x00010000L +#define MCI_ANIM_PLAY_REVERSE 0x00020000L +#define MCI_ANIM_PLAY_FAST 0x00040000L +#define MCI_ANIM_PLAY_SLOW 0x00080000L +#define MCI_ANIM_PLAY_SCAN 0x00100000L + +#define MCI_ANIM_STEP_REVERSE 0x00010000L +#define MCI_ANIM_STEP_FRAMES 0x00020000L + +#define MCI_ANIM_STATUS_SPEED 0x00004001L +#define MCI_ANIM_STATUS_FORWARD 0x00004002L +#define MCI_ANIM_STATUS_HWND 0x00004003L +#define MCI_ANIM_STATUS_HPAL 0x00004004L +#define MCI_ANIM_STATUS_STRETCH 0x00004005L + +#define MCI_ANIM_INFO_TEXT 0x00010000L + +#define MCI_ANIM_GETDEVCAPS_CAN_REVERSE 0x00004001L +#define MCI_ANIM_GETDEVCAPS_FAST_RATE 0x00004002L +#define MCI_ANIM_GETDEVCAPS_SLOW_RATE 0x00004003L +#define MCI_ANIM_GETDEVCAPS_NORMAL_RATE 0x00004004L +#define MCI_ANIM_GETDEVCAPS_PALETTES 0x00004006L +#define MCI_ANIM_GETDEVCAPS_CAN_STRETCH 0x00004007L +#define MCI_ANIM_GETDEVCAPS_MAX_WINDOWS 0x00004008L + +#define MCI_ANIM_REALIZE_NORM 0x00010000L +#define MCI_ANIM_REALIZE_BKGD 0x00020000L + +#define MCI_ANIM_WINDOW_HWND 0x00010000L +#define MCI_ANIM_WINDOW_STATE 0x00040000L +#define MCI_ANIM_WINDOW_TEXT 0x00080000L +#define MCI_ANIM_WINDOW_ENABLE_STRETCH 0x00100000L +#define MCI_ANIM_WINDOW_DISABLE_STRETCH 0x00200000L + +#define MCI_ANIM_WINDOW_DEFAULT 0x00000000L + +#define MCI_ANIM_RECT 0x00010000L +#define MCI_ANIM_PUT_SOURCE 0x00020000L +#define MCI_ANIM_PUT_DESTINATION 0x00040000L + +#define MCI_ANIM_WHERE_SOURCE 0x00020000L +#define MCI_ANIM_WHERE_DESTINATION 0x00040000L + +#define MCI_ANIM_UPDATE_HDC 0x00020000L + +typedef struct { + DWORD dwCallback; + UINT wDeviceID; + UINT wReserved0; + LPCSTR lpstrDeviceType; + LPCSTR lpstrElementName; + LPCSTR lpstrAlias; + DWORD dwStyle; + HWND hWndParent; + UINT wReserved1; + } MCI_ANIM_OPEN_PARMS; +typedef MCI_ANIM_OPEN_PARMS FAR *LPMCI_ANIM_OPEN_PARMS; + +typedef struct { + DWORD dwCallback; + DWORD dwFrom; + DWORD dwTo; + DWORD dwSpeed; + } MCI_ANIM_PLAY_PARMS; +typedef MCI_ANIM_PLAY_PARMS FAR *LPMCI_ANIM_PLAY_PARMS; + +typedef struct { + DWORD dwCallback; + DWORD dwFrames; + } MCI_ANIM_STEP_PARMS; +typedef MCI_ANIM_STEP_PARMS FAR *LPMCI_ANIM_STEP_PARMS; + +typedef struct { + DWORD dwCallback; + HWND hWnd; + UINT wReserved1; + UINT nCmdShow; + UINT wReserved2; + LPCSTR lpstrText; + } MCI_ANIM_WINDOW_PARMS; +typedef MCI_ANIM_WINDOW_PARMS FAR * LPMCI_ANIM_WINDOW_PARMS; + +typedef struct { + DWORD dwCallback; +#ifdef MCI_USE_OFFEXT + POINT ptOffset; + POINT ptExtent; +#else /* ifdef MCI_USE_OFFEXT */ + RECT rc; +#endif /* ifdef MCI_USE_OFFEXT */ + } MCI_ANIM_RECT_PARMS; +typedef MCI_ANIM_RECT_PARMS FAR * LPMCI_ANIM_RECT_PARMS; + +typedef struct { + DWORD dwCallback; + RECT rc; + HDC hDC; + } MCI_ANIM_UPDATE_PARMS; +typedef MCI_ANIM_UPDATE_PARMS FAR * LPMCI_ANIM_UPDATE_PARMS; + +#define MCI_OVLY_OPEN_WS 0x00010000L +#define MCI_OVLY_OPEN_PARENT 0x00020000L + +#define MCI_OVLY_STATUS_HWND 0x00004001L +#define MCI_OVLY_STATUS_STRETCH 0x00004002L + +#define MCI_OVLY_INFO_TEXT 0x00010000L + +#define MCI_OVLY_GETDEVCAPS_CAN_STRETCH 0x00004001L +#define MCI_OVLY_GETDEVCAPS_CAN_FREEZE 0x00004002L +#define MCI_OVLY_GETDEVCAPS_MAX_WINDOWS 0x00004003L + +#define MCI_OVLY_WINDOW_HWND 0x00010000L +#define MCI_OVLY_WINDOW_STATE 0x00040000L +#define MCI_OVLY_WINDOW_TEXT 0x00080000L +#define MCI_OVLY_WINDOW_ENABLE_STRETCH 0x00100000L +#define MCI_OVLY_WINDOW_DISABLE_STRETCH 0x00200000L + +#define MCI_OVLY_WINDOW_DEFAULT 0x00000000L + +#define MCI_OVLY_RECT 0x00010000L +#define MCI_OVLY_PUT_SOURCE 0x00020000L +#define MCI_OVLY_PUT_DESTINATION 0x00040000L +#define MCI_OVLY_PUT_FRAME 0x00080000L +#define MCI_OVLY_PUT_VIDEO 0x00100000L + +#define MCI_OVLY_WHERE_SOURCE 0x00020000L +#define MCI_OVLY_WHERE_DESTINATION 0x00040000L +#define MCI_OVLY_WHERE_FRAME 0x00080000L +#define MCI_OVLY_WHERE_VIDEO 0x00100000L + +typedef struct { + DWORD dwCallback; + UINT wDeviceID; + UINT wReserved0; + LPCSTR lpstrDeviceType; + LPCSTR lpstrElementName; + LPCSTR lpstrAlias; + DWORD dwStyle; + HWND hWndParent; + UINT wReserved1; + } MCI_OVLY_OPEN_PARMS; +typedef MCI_OVLY_OPEN_PARMS FAR *LPMCI_OVLY_OPEN_PARMS; + +typedef struct { + DWORD dwCallback; + HWND hWnd; + UINT wReserved1; + UINT nCmdShow; + UINT wReserved2; + LPCSTR lpstrText; + } MCI_OVLY_WINDOW_PARMS; +typedef MCI_OVLY_WINDOW_PARMS FAR * LPMCI_OVLY_WINDOW_PARMS; + +typedef struct { + DWORD dwCallback; +#ifdef MCI_USE_OFFEXT + POINT ptOffset; + POINT ptExtent; +#else /* ifdef MCI_USE_OFFEXT */ + RECT rc; +#endif /* ifdef MCI_USE_OFFEXT */ + } MCI_OVLY_RECT_PARMS; +typedef MCI_OVLY_RECT_PARMS FAR * LPMCI_OVLY_RECT_PARMS; + +typedef struct { + DWORD dwCallback; + LPCSTR lpfilename; + RECT rc; + } MCI_OVLY_SAVE_PARMS; +typedef MCI_OVLY_SAVE_PARMS FAR * LPMCI_OVLY_SAVE_PARMS; + +typedef struct { + DWORD dwCallback; + LPCSTR lpfilename; + RECT rc; + } MCI_OVLY_LOAD_PARMS; +typedef MCI_OVLY_LOAD_PARMS FAR * LPMCI_OVLY_LOAD_PARMS; + + +#endif /* MMSYSTEM_H */ + + diff --git a/include/msdos.h b/include/msdos.h index b06d56cea31..b394555c2a2 100644 --- a/include/msdos.h +++ b/include/msdos.h @@ -15,6 +15,7 @@ struct dosdirent { }; #define DOSVERSION 0x0330; +#define MAX_DOS_DRIVES 26 #define EAX context->sc_eax #define EBX context->sc_ebx diff --git a/include/regfunc.h b/include/regfunc.h index 96f2fef0ea3..d68a2d732ef 100644 --- a/include/regfunc.h +++ b/include/regfunc.h @@ -4,19 +4,21 @@ #ifndef REGFUNC_H #define REGFUNC_H +#include "wine.h" + extern unsigned short *Stack16Frame; -#define _CONTEXT &Stack16Frame[12] -#define _AX Stack16Frame[34] -#define _BX Stack16Frame[28] -#define _CX Stack16Frame[32] -#define _DX Stack16Frame[30] -#define _SP Stack16Frame[26] -#define _BP Stack16Frame[24] -#define _SI Stack16Frame[22] -#define _DI Stack16Frame[20] -#define _DS Stack16Frame[18] -#define _ES Stack16Frame[16] +#define _CONTEXT ((struct sigcontext_struct *) &Stack16Frame[12]) +#define _AX (_CONTEXT->sc_eax) +#define _BX (_CONTEXT->sc_ebx) +#define _CX (_CONTEXT->sc_ecx) +#define _DX (_CONTEXT->sc_edx) +#define _SP (_CONTEXT->sc_esp) +#define _BP (_CONTEXT->sc_ebp) +#define _SI (_CONTEXT->sc_esi) +#define _DI (_CONTEXT->sc_edi) +#define _DS (_CONTEXT->sc_ds) +#define _ES (_CONTEXT->sc_es) extern void ReturnFromRegisterFunc(void); diff --git a/include/shell.h b/include/shell.h new file mode 100644 index 00000000000..6a30151d129 --- /dev/null +++ b/include/shell.h @@ -0,0 +1,40 @@ +/* + * Shell Library definitions + */ + +#define ERROR_SUCCESS 0L +#define ERROR_BADDB 1L +#define ERROR_BADKEY 2L +#define ERROR_CANTOPEN 3L +#define ERROR_CANTREAD 4L +#define ERROR_CANTWRITE 5L +#define ERROR_OUTOFMEMORY 6L +#define ERROR_INVALID_PARAMETER 7L +#define ERROR_ACCESS_DENIED 8L + +#define REG_SZ 1 /* string type */ + +#define HKEY_CLASSES_ROOT 1 + +typedef DWORD HKEY; +typedef HKEY FAR* LPHKEY; + +typedef struct tagKEYSTRUCT { + HKEY hKey; + LPSTR lpSubKey; + DWORD dwType; + LPSTR lpValue; + struct tagKEYSTRUCT *lpPrevKey; + struct tagKEYSTRUCT *lpNextKey; + struct tagKEYSTRUCT *lpSubLvl; + } KEYSTRUCT; +typedef KEYSTRUCT *LPKEYSTRUCT; + +#define SE_ERR_SHARE 26 +#define SE_ERR_ASSOCINCOMPLETE 27 +#define SE_ERR_DDETIMEOUT 28 +#define SE_ERR_DDEFAIL 29 +#define SE_ERR_DDEBUSY 30 +#define SE_ERR_NOASSOC 31 + + diff --git a/include/syscolor.h b/include/syscolor.h new file mode 100644 index 00000000000..9bd12d546b6 --- /dev/null +++ b/include/syscolor.h @@ -0,0 +1,39 @@ +/* + * System color objects + * + * Copyright Alexandre Julliard, 1994 + */ + +#ifndef SYSCOLOR_H +#define SYSCOLOR_H + +#include "gdi.h" + +struct SysColorObjects +{ + HBRUSH hbrushScrollbar; /* COLOR_SCROLLBAR */ + /* COLOR_BACKGROUND */ + HBRUSH hbrushActiveCaption; /* COLOR_ACTIVECAPTION */ + HBRUSH hbrushInactiveCaption; /* COLOR_INACTIVECAPTION */ + /* COLOR_MENU */ + HBRUSH hbrushWindow; /* COLOR_WINDOW */ + HPEN hpenWindowFrame; /* COLOR_WINDOWFRAME */ + /* COLOR_MENUTEXT */ + HPEN hpenWindowText; /* COLOR_WINDOWTEXT */ + /* COLOR_CAPTIONTEXT */ + HBRUSH hbrushActiveBorder; /* COLOR_ACTIVEBORDER */ + HBRUSH hbrushInactiveBorder; /* COLOR_INACTIVEBORDER */ + /* COLOR_APPWORKSPACE */ + /* COLOR_HIGHLIGHT */ + /* COLOR_HIGHLIGHTTEXT */ + HBRUSH hbrushBtnFace; /* COLOR_BTNFACE */ + HBRUSH hbrushBtnShadow; /* COLOR_BTNSHADOW */ + /* COLOR_GRAYTEXT */ + /* COLOR_BTNTEXT */ + /* COLOR_INACTIVECAPTIONTEXT */ + HBRUSH hbrushBtnHighlight; /* COLOR_BTNHIGHLIGHT */ +}; + +extern struct SysColorObjects sysColorObjects; + +#endif /* SYSCOLOR_H */ diff --git a/include/task.h b/include/task.h new file mode 100644 index 00000000000..05aba515723 --- /dev/null +++ b/include/task.h @@ -0,0 +1,27 @@ +/* + * Task definitions + */ + +#ifndef TASK_H +#define TASK_H + +typedef struct { + HANDLE hTask; + HANDLE hModule; + HINSTANCE hInst; + int unix_pid; + HICON hIcon; + HWND *lpWndList; + void *lpPrevTask; + void *lpNextTask; +} TASKENTRY; +typedef TASKENTRY *LPTASKENTRY; + +#define MAXWIN_PER_TASK 256 + +HANDLE CreateNewTask(HINSTANCE hInst); +BOOL RemoveWindowFromTask(HTASK hTask, HWND hWnd); +BOOL AddWindowToTask(HTASK hTask, HWND hWnd); + +#endif /* TASK_H */ + diff --git a/include/user.h b/include/user.h index 166a7070eab..990428c98df 100644 --- a/include/user.h +++ b/include/user.h @@ -25,8 +25,9 @@ extern MDESC *USER_Heap; #define USER_HEAP_ALLOC(f,size) ((int)HEAP_Alloc(&USER_Heap,f,size) & 0xffff) #define USER_HEAP_REALLOC(handle,size,f) ((int)HEAP_ReAlloc(&USER_Heap, \ USER_HEAP_ADDR(handle),size,f) & 0xffff) -#define USER_HEAP_ADDR(handle) ((void *)((handle)|((int)USER_Heap&0xffff0000))) #define USER_HEAP_FREE(handle) (HEAP_Free(&USER_Heap,USER_HEAP_ADDR(handle))) +#define USER_HEAP_ADDR(handle) \ + ((void *)((handle) ? ((handle) | ((int)USER_Heap & 0xffff0000)) : 0)) #endif /* WINELIB */ diff --git a/include/win.h b/include/win.h index 26319115f52..0a4a566f708 100644 --- a/include/win.h +++ b/include/win.h @@ -36,19 +36,21 @@ typedef struct tagWND POINT ptMaxPos; /* Maximized window position */ HANDLE hmemTaskQ; /* Task queue global memory handle */ HRGN hrgnUpdate; /* Update region */ + HWND hwndPrevActive; /* Previous active top-level window */ HWND hwndLastActive; /* Last active popup hwnd */ FARPROC lpfnWndProc; /* Window procedure */ DWORD dwStyle; /* Window style (from CreateWindow) */ DWORD dwExStyle; /* Extended style (from CreateWindowEx) */ HANDLE hdce; /* Window DCE (if CS_OWNDC or CS_CLASSDC) */ - HMENU hmenuSystem; /* System menu */ - void *VScroll; /* Vertical ScrollBar Struct Pointer */ - void *HScroll; /* Horizontal ScrollBar Struct Pointer */ + void *VScroll; /* Vertical ScrollBar Struct Pointer */ + void *HScroll; /* Horizontal ScrollBar Struct Pointer */ WORD wIDmenu; /* ID or hmenu (from CreateWindow) */ HANDLE hText; /* Handle of window text */ WORD flags; /* Misc. flags (see below) */ Window window; /* X window */ - HMENU hSysMenu; /* window's copy of System Menu */ + HMENU hSysMenu; /* window's copy of System Menu */ + HANDLE hProp; /* Handle of Properties List */ + HTASK hTask; /* Task Handle of the owner */ WORD wExtra[1]; /* Window extra bytes */ } WND; diff --git a/include/windows.h b/include/windows.h index 7986183bb19..6d92dddfe22 100644 --- a/include/windows.h +++ b/include/windows.h @@ -9,15 +9,24 @@ typedef short INT; typedef unsigned short UINT; typedef unsigned short WORD; typedef unsigned long DWORD; -#ifndef _WINMAIN typedef unsigned short BOOL; typedef unsigned char BYTE; -#endif +typedef char *LPSTR; +typedef const char *LPCSTR; +typedef char *NPSTR; +typedef INT *LPINT; +typedef void *LPVOID; +typedef long (*FARPROC)(); +typedef FARPROC DLGPROC; +typedef int CATCHBUF[9]; +typedef int *LPCATCHBUF; +typedef FARPROC HOOKPROC; typedef long LONG; typedef UINT WPARAM; typedef LONG LPARAM; typedef LONG LRESULT; typedef WORD HANDLE; +typedef DWORD HHOOK; #define DECLARE_HANDLE(a) typedef HANDLE a; DECLARE_HANDLE(HTASK); @@ -37,19 +46,10 @@ DECLARE_HANDLE(HBITMAP); DECLARE_HANDLE(HBRUSH); DECLARE_HANDLE(LOCALHANDLE); -typedef char *LPSTR; -typedef const char *LPCSTR; -typedef char *NPSTR; -typedef short *LPINT; -typedef void *LPVOID; -typedef long (*FARPROC)(); -typedef FARPROC DLGPROC; -typedef int CATCHBUF[9]; -typedef int *LPCATCHBUF; #define TRUE 1 #define FALSE 0 -#define CW_USEDEFAULT ((short)0x8000) +#define CW_USEDEFAULT ((INT)0x8000) #define FAR #define NEAR #define PASCAL @@ -113,15 +113,15 @@ typedef int *LPCATCHBUF; #endif */ -typedef struct { short x, y; } POINT; +typedef struct { INT x, y; } POINT; typedef POINT *PPOINT; typedef POINT *NPPOINT; typedef POINT *LPPOINT; typedef struct { - short cx; - short cy; + INT cx; + INT cy; } SIZE, *LPSIZE; #define MAKEPOINT(l) (*((POINT *)&(l))) @@ -129,7 +129,7 @@ typedef struct #define MAKELPARAM(low, high) ((LONG)(((WORD)(low)) | \ (((DWORD)((WORD)(high))) << 16))) -typedef struct { short left, top, right, bottom; } RECT; +typedef struct { INT left, top, right, bottom; } RECT; typedef RECT *LPRECT; typedef RECT *NPRECT; typedef RECT *PRECT; @@ -167,7 +167,7 @@ typedef struct { #else LONG (*lpfnWndProc)() WINE_PACKED; #endif - short cbClsExtra, cbWndExtra; + INT cbClsExtra, cbWndExtra; HANDLE hInstance; HICON hIcon; HCURSOR hCursor; @@ -209,10 +209,10 @@ typedef struct { HINSTANCE hInstance; HMENU hMenu; HWND hwndParent; - short cy; - short cx; - short y; - short x; + INT cy; + INT cx; + INT y; + INT x; LONG style WINE_PACKED; char * lpszName WINE_PACKED; char * lpszClass WINE_PACKED; @@ -230,10 +230,10 @@ typedef struct LPSTR szClass; LPSTR szTitle; HANDLE hOwner; - short x; - short y; - short cx; - short cy; + INT x; + INT y; + INT cx; + INT cy; LONG style WINE_PACKED; LONG lParam WINE_PACKED; } MDICREATESTRUCT, *LPMDICREATESTRUCT; @@ -380,7 +380,118 @@ typedef struct #define SC_SCREENSAVE 0xf140 #define SC_HOTKEY 0xf150 - /* Dialogs */ +/***** Window hooks *****/ + + /* Hook values */ +#define WH_JOURNALRECORD 0 +#define WH_JOURNALPLAYBACK 1 +#define WH_KEYBOARD 2 +#define WH_GETMESSAGE 3 +#define WH_CALLWNDPROC 4 +#define WH_CBT 5 +#define WH_SYSMSGFILTER 6 +#define WH_MOUSE 7 +#define WH_HARDWARE 8 +#define WH_DEBUG 9 +#define WH_SHELL 10 +#define WH_MSGFILTER (-1) + + /* Hook action codes */ +#define HC_ACTION 0 +#define HC_GETNEXT 1 +#define HC_SKIP 2 +#define HC_NOREMOVE 3 +#define HC_NOREM HC_NOREMOVE +#define HC_SYSMODALON 4 +#define HC_SYSMODALOFF 5 + + /* CallMsgFilter() values */ +#define MSGF_DIALOGBOX 0 +#define MSGF_MENU 2 +#define MSGF_MOVE 3 +#define MSGF_SIZE 4 +#define MSGF_SCROLLBAR 5 +#define MSGF_NEXTWINDOW 6 +#define MSGF_MAINLOOP 8 +#define MSGF_USER 4096 + + /* Journalling hook values */ +#define HC_GETNEXT 1 +#define HC_SKIP 2 +#define HC_NOREMOVE 3 +#define HC_NOREM HC_NOREMOVE +#define HC_SYSMODALON 4 +#define HC_SYSMODALOFF 5 + + /* Journalling hook structure */ +typedef struct tagEVENTMSG +{ + UINT message; + UINT paramL; + UINT paramH; + DWORD time WINE_PACKED; +} EVENTMSG, *LPEVENTMSG; + + /* Mouse hook structure */ +typedef struct tagMOUSEHOOKSTRUCT +{ + POINT pt; + HWND hwnd; + WORD wHitTestCode; + DWORD dwExtraInfo; +} MOUSEHOOKSTRUCT, *LPMOUSEHOOKSTRUCT; + + /* Hardware hook structure */ +typedef struct tagHARDWAREHOOKSTRUCT +{ + HWND hWnd; + UINT wMessage; + WPARAM wParam; + LPARAM lParam WINE_PACKED; +} HARDWAREHOOKSTRUCT; + + /* CBT hook values */ +#define HCBT_MOVESIZE 0 +#define HCBT_MINMAX 1 +#define HCBT_QS 2 +#define HCBT_CREATEWND 3 +#define HCBT_DESTROYWND 4 +#define HCBT_ACTIVATE 5 +#define HCBT_CLICKSKIPPED 6 +#define HCBT_KEYSKIPPED 7 +#define HCBT_SYSCOMMAND 8 +#define HCBT_SETFOCUS 9 + + /* CBT hook structures */ +typedef struct tagCBT_CREATEWND +{ + CREATESTRUCT *lpcs; + HWND hwndInsertAfter; +} CBT_CREATEWND, *LPCBT_CREATEWND; + +typedef struct tagCBTACTIVATESTRUCT +{ + BOOL fMouse; + HWND hWndActive; +} CBTACTIVATESTRUCT; + + /* Shell hook values */ +#define HSHELL_WINDOWCREATED 1 +#define HSHELL_WINDOWDESTROYED 2 +#define HSHELL_ACTIVATESHELLWINDOW 3 + + /* Debug hook structure */ +typedef struct tagDEBUGHOOKINFO +{ + HANDLE hModuleHook; + LPARAM reserved WINE_PACKED; + LPARAM lParam WINE_PACKED; + WPARAM wParam; + short code; +} DEBUGHOOKINFO, *LPDEBUGHOOKINFO; + + +/***** Dialogs *****/ /* cbWndExtra bytes for dialog class */ #define DLGWINDOWEXTRA 30 @@ -529,10 +640,10 @@ typedef DWORD COLORREF; typedef struct tagBITMAP { - short bmType; - short bmWidth; - short bmHeight; - short bmWidthBytes; + INT bmType; + INT bmWidth; + INT bmHeight; + INT bmWidthBytes; BYTE bmPlanes; BYTE bmBitsPixel; void * bmBits WINE_PACKED; @@ -548,7 +659,7 @@ typedef struct tagLOGBRUSH { WORD lbStyle; COLORREF lbColor WINE_PACKED; - short lbHatch; + INT lbHatch; } LOGBRUSH, *PLOGBRUSH, *NPLOGBRUSH, *LPLOGBRUSH; /* Brush styles */ @@ -573,7 +684,7 @@ typedef struct tagLOGBRUSH #define LF_FACESIZE 32 typedef struct tagLOGFONT { - short lfHeight, lfWidth, lfEscapement, lfOrientation, lfWeight; + INT lfHeight, lfWidth, lfEscapement, lfOrientation, lfWeight; BYTE lfItalic, lfUnderline, lfStrikeOut, lfCharSet; BYTE lfOutPrecision, lfClipPrecision, lfQuality, lfPitchAndFamily; BYTE lfFaceName[LF_FACESIZE] WINE_PACKED; @@ -640,14 +751,14 @@ typedef struct tagLOGFONT typedef struct tagTEXTMETRIC { - short tmHeight; - short tmAscent; - short tmDescent; - short tmInternalLeading; - short tmExternalLeading; - short tmAveCharWidth; - short tmMaxCharWidth; - short tmWeight; + INT tmHeight; + INT tmAscent; + INT tmDescent; + INT tmInternalLeading; + INT tmExternalLeading; + INT tmAveCharWidth; + INT tmMaxCharWidth; + INT tmWeight; BYTE tmItalic; BYTE tmUnderlined; BYTE tmStruckOut; @@ -657,9 +768,9 @@ typedef struct tagTEXTMETRIC BYTE tmBreakChar; BYTE tmPitchAndFamily; BYTE tmCharSet; - short tmOverhang; - short tmDigitizedAspectX; - short tmDigitizedAspectY; + INT tmOverhang; + INT tmDigitizedAspectX; + INT tmDigitizedAspectY; } TEXTMETRIC, *PTEXTMETRIC, *NPTEXTMETRIC, *LPTEXTMETRIC; /* tmPitchAndFamily values */ @@ -966,10 +1077,10 @@ typedef BITMAPINFO *PBITMAPINFO; typedef struct tagBITMAPCOREHEADER { unsigned long bcSize; - unsigned short bcWidth; - unsigned short bcHeight; - unsigned short bcPlanes; - unsigned short bcBitCount; + UINT bcWidth; + UINT bcHeight; + UINT bcPlanes; + UINT bcBitCount; } BITMAPCOREHEADER; #define DIB_RGB_COLORS 0 @@ -2214,9 +2325,9 @@ Fa(ATOM,RegisterClass,LPWNDCLASS,a) Fa(BOOL,TranslateMessage,LPMSG,a) Fa(void,PostQuitMessage,int,a) Fa(BOOL,SetMessageQueue,int,a) -Fa(int,_lclose,int,a) -Fb(int,_lopen,LPSTR,a,int,b) -Fa(int,lstrlen,LPCSTR,a) +Fa(INT,_lclose,INT,a) +Fb(INT,_lopen,LPSTR,a,INT,b) +Fa(INT,lstrlen,LPCSTR,a) Fa(LONG,DispatchMessage,LPMSG,msg) Fa(void,UpdateWindow,HWND,a) Fa(ATOM,AddAtom,LPCSTR,a) @@ -2257,6 +2368,7 @@ Fa(BOOL,RemoveFontResource,LPSTR,a) Fa(BOOL,SetDeskWallPaper,LPSTR,a) Fa(BOOL,SetErrorMode,WORD,a) Fa(BOOL,SwapMouseButton,BOOL,a) +Fa(BOOL,UnhookWindowsHookEx,HHOOK,a) Fa(BOOL,UnrealizeObject,HBRUSH,a) Fa(BYTE,GetTempDrive,BYTE,a) Fa(DWORD,GetAspectRatioFilter,HDC,a) @@ -2351,7 +2463,7 @@ Fa(WORD,AllocSelector,WORD,a) Fa(WORD,ArrangeIconicWindows,HWND,a) Fa(WORD,EnumClipboardFormats,WORD,a) Fa(WORD,FreeSelector,WORD,a) -Fa(WORD,GetDriveType,int,a) +Fa(WORD,GetDriveType,INT,a) Fa(WORD,GetMenuItemCount,HMENU,a) Fa(WORD,GetTaskQueue,HANDLE,a) Fa(WORD,GetTextAlign,HDC,a) @@ -2423,14 +2535,14 @@ Fb(BOOL,ShowWindow,HWND,a,int,b) Fb(HDC,BeginPaint,HWND,a,LPPAINTSTRUCT,b) Fb(LPSTR,lstrcat,LPSTR,a,LPCSTR,b ) Fb(LPSTR,lstrcpy,LPSTR,a,LPCSTR,b ) -Fb(int,_lcreat,LPSTR,a,int,b) -Fb(int,lstrcmp,LPCSTR,a,LPCSTR,b ) -Fb(int,lstrcmpi,LPCSTR,a,LPCSTR,b ) +Fb(INT,_lcreat,LPSTR,a,INT,b) +Fb(INT,lstrcmp,LPCSTR,a,LPCSTR,b ) +Fb(INT,lstrcmpi,LPCSTR,a,LPCSTR,b ) Fb(void,EndPaint,HWND,a,LPPAINTSTRUCT,b) Fb(void,GetClientRect,HWND,a,LPRECT,b) Fb(void,SetDCState,HDC,a,HDC,b) Fb(BOOL,UnregisterClass,LPSTR,a,HANDLE,b) -Fb(BOOL,CallMsgFilter,LPMSG,a,int,b) +Fb(BOOL,CallMsgFilter,LPMSG,a,short,b) Fb(BOOL,ChangeClipboardChain,HWND,a,HWND,b) Fb(BOOL,EnableWindow,HWND,a,BOOL,b) Fb(BOOL,EnumWindows,FARPROC,a,LONG,b) @@ -2454,14 +2566,14 @@ Fb(BOOL,RestoreDC,HDC,a,short,b) Fb(BOOL,SetConvertParams,int,a,int,b) Fb(BOOL,SetMenu,HWND,a,HMENU,b) Fb(BOOL,TranslateMDISysAccel,HWND,a,LPMSG,b) -Fb(BOOL,UnhookWindowsHook,int,a,FARPROC,b) +Fb(BOOL,UnhookWindowsHook,short,a,HHOOK,b) Fb(DWORD,GetNearestColor,HDC,a,DWORD,b) Fb(DWORD,SetBkColor,HDC,a,COLORREF,b) Fb(DWORD,SetMapperFlags,HDC,a,DWORD,b) Fb(DWORD,SetTextColor,HDC,a,DWORD,b) Fb(FARPROC,GetProcAddress,HANDLE,a,LPSTR,b) Fb(FARPROC,MakeProcInstance,FARPROC,a,HANDLE,b) -Fb(FARPROC,SetWindowsHook,int,a,FARPROC,b) +Fb(HHOOK,SetWindowsHook,short,a,HOOKPROC,b) Fb(HANDLE,CopyMetaFile,HANDLE,a,LPSTR,b) Fb(HANDLE,GetProp,HWND,a,LPSTR,b) #ifndef GLOBAL_SOURCE @@ -2524,7 +2636,7 @@ Fb(WORD,SetTextAlign,HDC,a,WORD,b) Fb(WORD,SizeofResource,HANDLE,a,HANDLE,b) Fb(WORD,WinExec,LPSTR,a,WORD,b) Fb(int,AccessResource,HANDLE,a,HANDLE,b) -Fb(int,AnsiToOem,LPSTR,a,LPSTR,b) +Fb(INT,AnsiToOem,LPSTR,a,LPSTR,b) Fb(int,BuildCommDCB,LPSTR,a,DCB*,b) Fb(int,ConvertRequest,HWND,a,LPKANJISTRUCT,b) Fb(void,CopyRect,LPRECT,a,LPRECT,b) @@ -2567,9 +2679,9 @@ Fb(void,ValidateRect,HWND,a,LPRECT,b) Fb(void,ValidateRgn,HWND,a,HRGN,b) Fc(BOOL,LineTo,HDC,a,short,b,short,c) Fc(WORD,GetInternalWindowPos,HWND,a,LPRECT,b,LPPOINT,c) -Fc(LONG,_llseek,int,a,long,b,int,c) -Fc(WORD,_lread,int,a,LPSTR,b,int,c) -Fc(WORD,_lwrite,int,a,LPSTR,b,int,c) +Fc(LONG,_llseek,INT,a,LONG,b,INT,c) +Fc(WORD,_lread,INT,a,LPSTR,b,INT,c) +Fc(WORD,_lwrite,INT,a,LPSTR,b,INT,c) Fc(int,FillRect,HDC,a,LPRECT,b,HBRUSH,c) Fc(DWORD,MoveTo,HDC,a,short,b,short,c) Fc(BOOL,CheckMenuItem,HMENU,a,WORD,b,WORD,c) @@ -2645,7 +2757,7 @@ Fc(int,MulDiv,int,a,int,b,int,c) Fc(int,OffsetClipRgn,HDC,a,short,b,short,c) Fc(int,OffsetRgn,HRGN,a,short,b,short,c) Fc(int,OpenComm,LPSTR,a,WORD,b,WORD,c) -Fc(int,OpenFile,LPSTR,a,LPOFSTRUCT,b,WORD,c) +Fc(INT,OpenFile,LPSTR,a,LPOFSTRUCT,b,WORD,c) Fc(int,ReadComm,int,a,LPSTR,b,int,c) Fc(int,SetEnvironment,LPSTR,a,LPSTR,b,WORD,c) Fc(int,SetVoiceEnvelope,int,a,int,b,int,c) @@ -2655,12 +2767,12 @@ Fc(int,WriteComm,int,a,LPSTR,b,int,c) Fc(int,wvsprintf,LPSTR,a,LPSTR,b,LPSTR,c) Fc(short,SetTextJustification,HDC,a,short,b,short,c) Fc(void,AdjustWindowRect,LPRECT,a,DWORD,b,BOOL,c) -Fc(void,AnsiToOemBuff,LPSTR,a,LPSTR,b,int,c) +Fc(void,AnsiToOemBuff,LPSTR,a,LPSTR,b,INT,c) Fc(void,CheckDlgButton,HWND,a,WORD,b,WORD,c) Fc(void,InflateRect,LPRECT,a,short,b,short,c) Fc(void,InvalidateRect,HWND,a,LPRECT,b,BOOL,c) Fc(void,InvalidateRgn,HWND,a,HRGN,b,BOOL,c) -Fc(void,OemToAnsiBuff,LPSTR,a,LPSTR,b,int,c) +Fc(void,OemToAnsiBuff,LPSTR,a,LPSTR,b,INT,c) Fc(void,OffsetRect,LPRECT,a,short,b,short,c) Fc(void,SetDlgItemText,HWND,a,WORD,b,LPSTR,c) Fc(void,SetSysColors,int,a,LPINT,b,COLORREF*,c) @@ -2683,10 +2795,12 @@ Fd(BOOL,RedrawWindow,HWND,a,LPRECT,b,HRGN,c,UINT,d) Fd(BOOL,SetBitmapDimensionEx,HBITMAP,a,short,b,short,c,LPSIZE,d) Fd(BOOL,WinHelp,HWND,hwndMain,LPSTR,lpszHelp,WORD,usCommand,DWORD,ulData) Fd(BOOL,WritePrivateProfileString,LPSTR,a,LPSTR,b,LPSTR,c,LPSTR,d) -Fd(DWORD,DefHookProc,int,a,WORD,b,DWORD,c,FARPROC FAR*,d) +Fd(DWORD,DefHookProc,short,a,WORD,b,DWORD,c,HHOOK FAR*,d) +Fd(DWORD,CallNextHookEx,HHOOK,a,short,b,WPARAM,c,LPARAM,d) Fd(COLORREF,SetPixel,HDC,a,short,b,short,c,COLORREF,d) Fd(HDC,CreateDC,LPSTR,a,LPSTR,b,LPSTR,c,LPSTR,d) Fd(HDC,CreateIC,LPSTR,a,LPSTR,b,LPSTR,c,LPSTR,d) +Fd(HHOOK,SetWindowsHookEx,short,a,HOOKPROC,b,HINSTANCE,c,HTASK,d) Fd(HRGN,CreateEllipticRgn,short,a,short,b,short,c,short,d) Fd(HRGN,CreatePolyPolygonRgn,LPPOINT,a,LPINT,b,short,c,short,d) Fd(HRGN,CreateRectRgn,short,a,short,b,short,c,short,d) @@ -2713,7 +2827,7 @@ Fd(int,DialogBoxIndirect,HANDLE,a,HANDLE,b,HWND,c,FARPROC,d) Fd(int,EnumFonts,HDC,a,LPSTR,b,FARPROC,c,LPSTR,d) Fd(int,EnumObjects,HDC,a,int,b,FARPROC,c,LPSTR,d) Fd(int,GetDlgItemText,HWND,a,WORD,b,LPSTR,c,WORD,d) -Fd(int,GetTempFileName,BYTE,a,LPCSTR,b,UINT,c,LPSTR,d) +Fd(INT,GetTempFileName,BYTE,a,LPCSTR,b,UINT,c,LPSTR,d) Fd(int,LoadString,HANDLE,a,WORD,b,LPSTR,c,int,d) Fd(int,MessageBox,HWND,a,LPSTR,b,LPSTR,c,WORD,d) Fd(int,SetScrollPos,HWND,a,int,b,int,c,BOOL,d) @@ -2789,7 +2903,7 @@ Fh(int,ScrollWindowEx,HWND,a,short,b,short,c,LPRECT,d,LPRECT,e,HRGN,f,LPRECT,g,W Fi(BOOL,Arc,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom,int,xStart,int,yStart,int,xEnd,int,yEnd) Fi(BOOL,Chord,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom,int,xStart,int,yStart,int,xEnd,int,yEnd) Fi(BOOL,BitBlt,HDC,a,short,b,short,c,short,d,short,e,HDC,f,short,g,short,h,DWORD,i) -Fi(BOOL,GrayString,HDC,a,HBRUSH,b,FARPROC,c,DWORD,d,int,e,int,f,int,g,int,h,int,i) +Fi(BOOL,GrayString,HDC,a,HBRUSH,b,FARPROC,gsprc,LPARAM,lParam,INT,cch,INT,x,INT,y,INT,cx,INT,cy) Fi(BOOL,Pie,HDC,a,int,xLeft,int,yTop,int,xRight,int,yBottom,int,xStart,int,yStart,int,xEnd,int,yEnd) Fk(HWND,CreateWindow,LPSTR,szAppName,LPSTR,Label,DWORD,ol,short,x,short,y,short,w,short,h,HWND,d,HMENU,e,,HANDLE i,LPSTR,g) Fk(BOOL,StretchBlt,HDC,a,short,b,short,c,short,d,short,e,HDC,f,short,g,short,h,short,i,short,j,DWORD,k) diff --git a/include/wine.h b/include/wine.h index 28cda57fefe..69505e65a14 100644 --- a/include/wine.h +++ b/include/wine.h @@ -32,7 +32,8 @@ struct w_files extern struct w_files * wine_files; -#define MAX_DOS_DRIVES 26 +extern char *WineIniFileName(void); +extern char *WinIniFileName(void); #define WINE_INI WineIniFileName() #define WIN_INI WinIniFileName() diff --git a/include/winsock.h b/include/winsock.h index c36be06068c..3429f4a8866 100644 --- a/include/winsock.h +++ b/include/winsock.h @@ -79,7 +79,9 @@ struct sockproto { * Maximum queue length specifiable by listen. */ #define SOMAXCONN 5 + #define MSG_DONTROUTE 0x4 /* send without using routing tables */ + #define MSG_MAXIOVLEN 16 /* @@ -188,51 +190,6 @@ struct sockproto { /* no address, look for MX record */ #define WSANO_ADDRESS WSANO_DATA -/* - * Windows Sockets errors redefined as regular Berkeley error constants - - * AAARGH! * - -#define EWOULDBLOCK WSAEWOULDBLOCK -#define EINPROGRESS WSAEINPROGRESS -#define EALREADY WSAEALREADY -#define ENOTSOCK WSAENOTSOCK -#define EDESTADDRREQ WSAEDESTADDRREQ -#define EMSGSIZE WSAEMSGSIZE -#define EPROTOTYPE WSAEPROTOTYPE -#define ENOPROTOOPT WSAENOPROTOOPT -#define EPROTONOSUPPORT WSAEPROTONOSUPPORT -#define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT -#define EOPNOTSUPP WSAEOPNOTSUPP -#define EPFNOSUPPORT WSAEPFNOSUPPORT -#define EAFNOSUPPORT WSAEAFNOSUPPORT -#define EADDRINUSE WSAEADDRINUSE -#define EADDRNOTAVAIL WSAEADDRNOTAVAIL -#define ENETDOWN WSAENETDOWN -#define ENETUNREACH WSAENETUNREACH -#define ENETRESET WSAENETRESET -#define ECONNABORTED WSAECONNABORTED -#define ECONNRESET WSAECONNRESET -#define ENOBUFS WSAENOBUFS -#define EISCONN WSAEISCONN -#define ENOTCONN WSAENOTCONN -#define ESHUTDOWN WSAESHUTDOWN -#define ETOOMANYREFS WSAETOOMANYREFS -#define ETIMEDOUT WSAETIMEDOUT -#define ECONNREFUSED WSAECONNREFUSED -#define ELOOP WSAELOOP -#define ENAMETOOLONG WSAENAMETOOLONG -#define EHOSTDOWN WSAEHOSTDOWN -#define EHOSTUNREACH WSAEHOSTUNREACH -#define ENOTEMPTY WSAENOTEMPTY -#define EPROCLIM WSAEPROCLIM -#define EUSERS WSAEUSERS -#define EDQUOT WSAEDQUOT -#define ESTALE WSAESTALE -#define EREMOTE WSAEREMOTE - -*/ - /* Socket function prototypes */ #ifdef __cplusplus @@ -241,51 +198,50 @@ extern "C" { /* Microsoft Windows Extension function prototypes */ -int PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData); +INT PASCAL FAR WSAStartup(WORD wVersionRequired, LPWSADATA lpWSAData); -int PASCAL FAR WSACleanup(void); +INT PASCAL FAR WSACleanup(void); -void PASCAL FAR WSASetLastError(int iError); +void PASCAL FAR WSASetLastError(INT iError); -int PASCAL FAR WSAGetLastError(void); +INT PASCAL FAR WSAGetLastError(void); BOOL PASCAL FAR WSAIsBlocking(void); -int PASCAL FAR WSAUnhookBlockingHook(void); +INT PASCAL FAR WSAUnhookBlockingHook(void); FARPROC PASCAL FAR WSASetBlockingHook(FARPROC lpBlockFunc); -int PASCAL FAR WSACancelBlockingCall(void); +INT PASCAL FAR WSACancelBlockingCall(void); HANDLE PASCAL FAR WSAAsyncGetServByName(HWND hWnd, u_int wMsg, - const char FAR * name, - const char FAR * proto, - char FAR * buf, int buflen); + const char FAR *name, + const char FAR *proto, + char FAR *buf, INT buflen); -HANDLE PASCAL FAR WSAAsyncGetServByPort(HWND hWnd, u_int wMsg, int port, - const char FAR * proto, char FAR * buf, - int buflen); +HANDLE PASCAL FAR WSAAsyncGetServByPort(HWND hWnd, u_int wMsg, INT port, + const char FAR *proto, char FAR *buf, + INT buflen); HANDLE PASCAL FAR WSAAsyncGetProtoByName(HWND hWnd, u_int wMsg, - const char FAR * name, char FAR * buf, - int buflen); + const char FAR *name, char FAR *buf, + INT buflen); HANDLE PASCAL FAR WSAAsyncGetProtoByNumber(HWND hWnd, u_int wMsg, - int number, char FAR * buf, - int buflen); + INT number, char FAR *buf, + INT buflen); HANDLE PASCAL FAR WSAAsyncGetHostByName(HWND hWnd, u_int wMsg, - const char FAR * name, char FAR * buf, - int buflen); + const char FAR *name, char FAR *buf, + INT buflen); HANDLE PASCAL FAR WSAAsyncGetHostByAddr(HWND hWnd, u_int wMsg, - const char FAR * addr, int len, int type, - const char FAR * buf, int buflen); + const char FAR *addr, INT len, INT type, + char FAR *buf, INT buflen); -int PASCAL FAR WSACancelAsyncRequest(HANDLE hAsyncTaskHandle); +INT PASCAL FAR WSACancelAsyncRequest(HANDLE hAsyncTaskHandle); -int PASCAL FAR WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, - long lEvent); +INT PASCAL FAR WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, long lEvent); #ifdef __cplusplus } diff --git a/loader/Imakefile b/loader/Imakefile index df538543359..68297d2c15f 100644 --- a/loader/Imakefile +++ b/loader/Imakefile @@ -10,6 +10,7 @@ SRCS = \ signal.c \ library.c \ resource.c \ + task.c \ wine.c OBJS = $(SRCS:.c=.o) diff --git a/loader/library.c b/loader/library.c index 39ea0bba1bb..4e60f1df3b8 100644 --- a/loader/library.c +++ b/loader/library.c @@ -1,3 +1,8 @@ +/* + * Modules & Libraries functions + */ +static char Copyright[] = "Copyright Martin Ayotte, 1994"; + #ifndef WINELIB #include #include @@ -10,30 +15,25 @@ #include "windows.h" #include "wine.h" #include "dlls.h" +#include "task.h" -typedef struct module_table_entry -{ +typedef struct { + LPSTR ModuleName; + LPSTR FileName; + WORD Count; + HANDLE hModule; HINSTANCE hInst; - LPSTR name; - WORD count; + void *lpPrevModule; + void *lpNextModule; } MODULEENTRY; +typedef MODULEENTRY *LPMODULEENTRY; + +static LPMODULEENTRY lpModList = NULL; extern struct w_files * wine_files; - #define N_BUILTINS 10 - extern struct dll_name_table_entry_s dll_builtin_table[N_BUILTINS]; -/********************************************************************** - * GetCurrentTask [KERNEL.36] - */ -HTASK GetCurrentTask() -{ - int pid = getpid(); - printf("GetCurrentTask() returned %d !\n", pid); - return pid; -} - /********************************************************************** * GetModuleHandle [KERNEL.47] @@ -69,11 +69,11 @@ HANDLE GetModuleHandle(LPSTR lpModuleName) */ int GetModuleUsage(HANDLE hModule) { - struct w_files *w; - printf("GetModuleUsage(%04X);\n", hModule); - w = GetFileInfo(hModule); -/* return w->Usage; */ - return 1; + struct w_files *w; + printf("GetModuleUsage(%04X);\n", hModule); + w = GetFileInfo(hModule); +/* return w->Usage; */ + return 1; } @@ -100,10 +100,44 @@ int GetModuleFileName(HANDLE hModule, LPSTR lpFileName, short nSize) HANDLE LoadLibrary(LPSTR libname) { HANDLE hModule; + LPMODULEENTRY lpMod = lpModList; + LPMODULEENTRY lpNewMod; printf("LoadLibrary '%s'\n", libname); - hModule = LoadImage(libname, DLL); - printf("LoadLibrary returned hModule=%04X\n", hModule); - return hModule; + if (lpMod != NULL) { + while (TRUE) { + if (strcmp(libname, lpMod->FileName) == 0) { + lpMod->Count++; + printf("LoadLibrary // already loaded hInst=%04X\n", lpMod->hInst); + return lpMod->hInst; + } + if (lpMod->lpNextModule == NULL) break; + lpMod = lpMod->lpNextModule; + } + } + hModule = GlobalAlloc(GMEM_MOVEABLE, sizeof(MODULEENTRY)); + lpNewMod = (LPMODULEENTRY) GlobalLock(hModule); +#ifdef DEBUG_LIBRARY + printf("LoadLibrary // creating new module entry %08X\n", lpNewMod); +#endif + if (lpNewMod == NULL) return 0; + if (lpModList == NULL) { + lpModList = lpNewMod; + lpNewMod->lpPrevModule = NULL; + } + else { + lpMod->lpNextModule = lpNewMod; + lpNewMod->lpPrevModule = lpMod; + } + lpNewMod->lpNextModule = NULL; + lpNewMod->hModule = hModule; + lpNewMod->ModuleName = NULL; + lpNewMod->FileName = (LPSTR) malloc(strlen(libname)); + if (lpNewMod->FileName != NULL) strcpy(lpNewMod->FileName, libname); + lpNewMod->hInst = LoadImage(libname, DLL); + lpNewMod->Count = 1; + printf("LoadLibrary returned Library hInst=%04X\n", lpNewMod->hInst); + GlobalUnlock(hModule); + return lpNewMod->hInst; } @@ -112,8 +146,24 @@ HANDLE LoadLibrary(LPSTR libname) */ void FreeLibrary(HANDLE hLib) { + LPMODULEENTRY lpMod = lpModList; printf("FreeLibrary(%04X);\n", hLib); - if (hLib != (HANDLE)NULL) GlobalFree(hLib); + while (lpMod != NULL) { + if (lpMod->hInst == hLib) { + if (lpMod->Count == 1) { + if (hLib != (HANDLE)NULL) GlobalFree(hLib); + if (lpMod->ModuleName != NULL) free(lpMod->ModuleName); + if (lpMod->FileName != NULL) free(lpMod->FileName); + GlobalFree(lpMod->hModule); + printf("FreeLibrary // freed !\n"); + return; + } + lpMod->Count--; + printf("FreeLibrary // Count decremented !\n"); + return; + } + lpMod = lpMod->lpNextModule; + } } @@ -128,26 +178,39 @@ FARPROC GetProcAddress(HANDLE hModule, char *proc_name) int ordinal, len; char * cpnt; char C[128]; - if (hModule == 0) { - printf("GetProcAddress: Bad Module handle=%#04X\n", hModule); - return NULL; - } + HTASK hTask; + LPTASKENTRY lpTask; if (hModule >= 0xF000) { if ((int) proc_name & 0xffff0000) { - printf("GetProcAddress: builtin %#04x, '%s'\n", hModule, proc_name); + printf("GetProcAddress: builtin %#04X, '%s'\n", + hModule, proc_name); /* wOrdin = FindOrdinalFromName(struct dll_table_entry_s *dll_table, proc_name); */ } else { - printf("GetProcAddress: builtin %#04x, %d\n", hModule, (int) proc_name); + printf("GetProcAddress: builtin %#04X, %d\n", + hModule, (int)proc_name); } return NULL; } + if (hModule == 0) { + hTask = GetCurrentTask(); + printf("GetProcAddress // GetCurrentTask()=%04X\n", hTask); + lpTask = (LPTASKENTRY) GlobalLock(hTask); + if (lpTask == NULL) { + printf("GetProcAddress: can't find current module handle !\n"); + return NULL; + } + hModule = lpTask->hInst; + printf("GetProcAddress: current module=%04X instance=%04X!\n", + lpTask->hModule, lpTask->hInst); + GlobalUnlock(hTask); + } while (w && w->hinstance != hModule) w = w->next; - printf("GetProcAddress // Module Found ! w->filename='%s'\n", w->filename); if (w == NULL) return NULL; - if ((int) proc_name & 0xffff0000) { + printf("GetProcAddress // Module Found ! w->filename='%s'\n", w->filename); + if ((int)proc_name & 0xFFFF0000) { AnsiUpper(proc_name); - printf("GetProcAddress: %#04x, '%s'\n", hModule, proc_name); + printf("GetProcAddress: %04X, '%s'\n", hModule, proc_name); cpnt = w->nrname_table; while(TRUE) { if (((int) cpnt) - ((int)w->nrname_table) > @@ -155,11 +218,19 @@ FARPROC GetProcAddress(HANDLE hModule, char *proc_name) len = *cpnt++; strncpy(C, cpnt, len); C[len] = '\0'; +#ifdef DEBUG_MODULE printf("pointing Function '%s' !\n", C); - if (strncmp(cpnt, proc_name, len) == 0) break; +#endif + if (strncmp(cpnt, proc_name, len) == 0) { + ordinal = *((unsigned short *) (cpnt + len)); + break; + } cpnt += len + 2; }; - ordinal = *((unsigned short *) (cpnt + len)); + if (ordinal == 0) { + printf("GetProcAddress // function '%s' not found !\n", proc_name); + return NULL; + } } else { printf("GetProcAddress: %#04x, %d\n", hModule, (int) proc_name); @@ -167,13 +238,13 @@ FARPROC GetProcAddress(HANDLE hModule, char *proc_name) } ret = GetEntryPointFromOrdinal(w, ordinal); if (ret == -1) { - printf("GetProcAddress // Function not found !\n"); + printf("GetProcAddress // Function #%d not found !\n", ordinal); return NULL; } addr = ret & 0xffff; sel = (ret >> 16); printf("GetProcAddress // ret=%08X sel=%04X addr=%04X\n", ret, sel, addr); - return ret; + return (FARPROC) ret; } #endif /* ifndef WINELIB */ diff --git a/loader/task.c b/loader/task.c new file mode 100644 index 00000000000..46bb89be5fb --- /dev/null +++ b/loader/task.c @@ -0,0 +1,159 @@ +/* + * Tasks functions + */ +static char Copyright[] = "Copyright Martin Ayotte, 1994"; + +#include +#include +#include +#include "windows.h" +#include "wine.h" +#include "task.h" + +static LPTASKENTRY lpTaskList = NULL; +static int nTaskCount = 0; + + + +/********************************************************************** + * GetCurrentTask [KERNEL.36] + */ +HTASK GetCurrentTask() +{ + LPTASKENTRY lpTask = lpTaskList; + int pid = getpid(); + printf("GetCurrentTask() // unix_pid=%08X !\n", pid); + if (lpTask == NULL) return 0; + while (TRUE) { + printf("GetCurrentTask() // searching lpTask->unix_pid=%08 !\n", lpTask->unix_pid); + if (lpTask->unix_pid == pid) break; + if (lpTask->lpNextTask == NULL) return 0; + lpTask = lpTask->lpNextTask; + } + printf("GetCurrentTask() returned hTask=%04X !\n", lpTask->hTask); + return lpTask->hTask; +} + + +/********************************************************************** + * GetNumTasks [KERNEL.152] + */ +WORD GetNumTasks() +{ + printf("GetNumTasks() returned %d !\n", nTaskCount); + return nTaskCount; +} + + +/********************************************************************** + * GetWindowTask [USER.224] + */ +HTASK GetWindowTask(HWND hWnd) +{ + printf("GetWindowTask(%04X) !\n", hWnd); + return 0; +} + + +/********************************************************************** + * EnumTaskWindows [USER.225] + */ +BOOL EnumTaskWindows(HANDLE hTask, FARPROC lpEnumFunc, LONG lParam) +{ + printf("EnumTaskWindows(%04X, %08X, %08X) !\n", hTask, lpEnumFunc, lParam); + return FALSE; +} + + +/********************************************************************** + * CreateNewTask [internal] + */ +HANDLE CreateNewTask(HINSTANCE hInst) +{ + HANDLE hTask; + LPTASKENTRY lpTask = lpTaskList; + LPTASKENTRY lpNewTask; + if (lpTask != NULL) { + while (TRUE) { + if (lpTask->lpNextTask == NULL) break; + lpTask = lpTask->lpNextTask; + } + } + hTask = GlobalAlloc(GMEM_MOVEABLE, sizeof(TASKENTRY)); + lpNewTask = (LPTASKENTRY) GlobalLock(hTask); +#ifdef DEBUG_TASK + printf("CreateNewTask entry allocated %08X\n", lpNewTask); +#endif + if (lpNewTask == NULL) return 0; + if (lpTaskList == NULL) { + lpTaskList = lpNewTask; + lpNewTask->lpPrevTask = NULL; + } + else { + lpTask->lpNextTask = lpNewTask; + lpNewTask->lpPrevTask = lpTask; + } + lpNewTask->lpNextTask = NULL; + lpNewTask->hIcon = 0; + lpNewTask->hModule = 0; + lpNewTask->hTask = hTask; + lpNewTask->lpWndList = (HWND *) malloc(MAXWIN_PER_TASK * sizeof(HWND)); + if (lpNewTask->lpWndList != NULL) + memset((LPSTR)lpNewTask->lpWndList, 0, MAXWIN_PER_TASK * sizeof(HWND)); + lpNewTask->hInst = hInst; + lpNewTask->unix_pid = getpid(); + printf("CreateNewTask // unix_pid=%08X return hTask=%04X\n", + lpNewTask->unix_pid, hTask); + GlobalUnlock(hTask); + return hTask; +} + + +/********************************************************************** + * AddWindowToTask [internal] + */ +BOOL AddWindowToTask(HTASK hTask, HWND hWnd) +{ + HWND *wptr; + int count = 0; + LPTASKENTRY lpTask = lpTaskList; + printf("AddWindowToTask(%04X, %04X); !\n", hTask, hWnd); + while (TRUE) { + if (lpTask->hTask == hTask) break; + if (lpTask == NULL) return FALSE; + lpTask = lpTask->lpNextTask; + } + wptr = lpTask->lpWndList; + if (wptr == NULL) return FALSE; + while (*(wptr++) != 0) { + if (++count >= MAXWIN_PER_TASK) return FALSE; + } + *wptr = hWnd; + return TRUE; +} + + +/********************************************************************** + * RemoveWindowFromTask [internal] + */ +BOOL RemoveWindowFromTask(HTASK hTask, HWND hWnd) +{ + HWND *wptr; + int count = 0; + LPTASKENTRY lpTask = lpTaskList; + printf("AddWindowToTask(%04X, %04X); !\n", hTask, hWnd); + while (TRUE) { + if (lpTask->hTask == hTask) break; + if (lpTask == NULL) return FALSE; + lpTask = lpTask->lpNextTask; + } + wptr = lpTask->lpWndList; + if (wptr == NULL) return FALSE; + while (*(wptr++) != hWnd) { + if (++count >= MAXWIN_PER_TASK) return FALSE; + } + *wptr = 0; + return TRUE; +} + + diff --git a/loader/wine.c b/loader/wine.c index 4edecaaaa33..8236853d788 100644 --- a/loader/wine.c +++ b/loader/wine.c @@ -49,6 +49,7 @@ HINSTANCE hSysRes; static char *DLL_Extensions[] = { "dll", "exe", NULL }; static char *EXE_Extensions[] = { "exe", NULL }; +static char *WinePath = NULL; FILE *SpyFp = NULL; @@ -154,7 +155,6 @@ HINSTANCE LoadImage(char *modulename, int filetype) wpnt1->next = wpnt; }; wpnt->next = NULL; - wpnt->resnamtab = (RESNAMTAB *) -1; /* * Open file for reading. @@ -248,6 +248,8 @@ HINSTANCE LoadImage(char *modulename, int filetype) */ for(i=0; ine_header->n_mod_ref_tab; i++){ char buff[14]; + char buff2[256]; + int fd, j; GetModuleName(wpnt, i + 1, buff); #ifndef WINELIB @@ -263,27 +265,38 @@ return(wpnt->hinstance); } -#ifndef WINELIB /********************************************************************** * main */ -int _WinMain(int argc, char **argv) +_WinMain(int argc, char **argv) { int segment; char *p; char *sysresname; char filename[100]; + char syspath[256]; + char exe_path[256]; #ifdef WINESTAT char * cp; #endif struct w_files * wpnt; int cs_reg, ds_reg, ss_reg, ip_reg, sp_reg; + int i; int rv; Argc = argc - 1; Argv = argv + 1; - if (LoadImage(Argv[0], EXE) == (HINSTANCE) NULL ) { + WinePath = malloc(1024); + + getcwd(WinePath, 512); + + if ((p = getenv("WINEPATH")) != NULL) { + strcat(WinePath, ";"); + strcat(WinePath, p); + } + + if ((hInstMain = LoadImage(Argv[0], EXE)) == (HINSTANCE) NULL ) { fprintf(stderr, "wine: can't find %s!.\n", Argv[0]); exit(1); } @@ -380,7 +393,6 @@ void InitializeLoadedDLLs() } } } -#endif /********************************************************************** @@ -390,8 +402,10 @@ char * GetImportedName(int fd, struct mz_header_s *mz_header, struct ne_header_s *ne_header, int name_offset, char *buffer) { + char *p; int length; int status; + int i; status = lseek(fd, mz_header->ne_offset + ne_header->iname_tab_offset + name_offset, SEEK_SET); @@ -412,6 +426,7 @@ GetModuleName(struct w_files * wpnt, int index, char *buffer) int fd = wpnt->fd; struct mz_header_s *mz_header = wpnt->mz_header; struct ne_header_s *ne_header = wpnt->ne_header; + char *p; int length; WORD name_offset, status; int i; @@ -699,4 +714,16 @@ FixupSegment(struct w_files * wpnt, int segment_num) return 0; } +/********************************************************************** + * GetProcAddress + */ +FARPROC GetProcAddress(HINSTANCE hinstance, char *proc_name) +{ + if ((int) proc_name & 0xffff0000) + printf("GetProcAddress: %#04x, '%s'\n", hinstance, proc_name); + else + printf("GetProcAddress: %#04x, %d\n", hinstance, (int) proc_name); + + return NULL; +} #endif diff --git a/misc/Imakefile b/misc/Imakefile index 2979b52987c..e0812622291 100644 --- a/misc/Imakefile +++ b/misc/Imakefile @@ -15,7 +15,9 @@ SRCS = \ main.c \ message.c \ profile.c \ + property.c \ rect.c \ + shell.c \ sound.c \ spy.c \ stress.c \ diff --git a/misc/audio.c b/misc/audio.c new file mode 100644 index 00000000000..97a2e60c2b4 --- /dev/null +++ b/misc/audio.c @@ -0,0 +1,97 @@ +/* + * Sample Wine Driver for Linux + * + * Copyright 1994 Martin Ayotte + */ + +static char Copyright[] = "Copyright Martin Ayotte, 1994"; + +#include "stdio.h" +#include "windows.h" +#include "win.h" +#include "user.h" +#include "driver.h" +#include "mmsystem.h" + + +/************************************************************************** +* DriverProc [sample driver] +*/ +LRESULT DriverProc(DWORD dwDevID, HDRVR hDriv, WORD wMsg, + DWORD dwParam1, DWORD dwParam2) +{ + switch(wMsg) { + case DRV_LOAD: + return (LRESULT)1L; + case DRV_FREE: + return (LRESULT)1L; + case DRV_OPEN: + return (LRESULT)1L; + case DRV_CLOSE: + return (LRESULT)1L; + case DRV_ENABLE: + return (LRESULT)1L; + case DRV_DISABLE: + return (LRESULT)1L; + case DRV_QUERYCONFIGURE: + return (LRESULT)1L; + case DRV_CONFIGURE: + MessageBox((HWND)NULL, "Sample MultiMedia Linux Driver !", + "MMLinux Driver", MB_OK); + return (LRESULT)1L; + case DRV_INSTALL: + return (LRESULT)DRVCNF_RESTART; + case DRV_REMOVE: + return (LRESULT)DRVCNF_RESTART; + default: + return DefDriverProc(dwDevID, hDriv, wMsg, dwParam1, dwParam2); + } +} + +/************************************************************************** +* wodMessage [sample driver] +*/ +DWORD wodMessage(WORD wDevID, WORD wMsg, DWORD dwUser, + DWORD dwParam1, DWORD dwParam2) +{ +} + +/************************************************************************** +* widMessage [sample driver] +*/ +DWORD widMessage(WORD wDevID, WORD wMsg, DWORD dwUser, + DWORD dwParam1, DWORD dwParam2) +{ +} + +/************************************************************************** +* auxMessage [sample driver] +*/ +DWORD auxMessage(WORD wDevID, WORD wMsg, DWORD dwUser, + DWORD dwParam1, DWORD dwParam2) +{ +} + +/************************************************************************** +* midMessage [sample driver] +*/ +DWORD midMessage(WORD wDevID, WORD wMsg, DWORD dwUser, + DWORD dwParam1, DWORD dwParam2) +{ +} + +/************************************************************************** +* modMessage [sample driver] +*/ +DWORD modMessage(WORD wDevID, WORD wMsg, DWORD dwUser, + DWORD dwParam1, DWORD dwParam2) +{ +} + + +/* +BOOL DriverCallback(DWORD dwCallBack, UINT uFlags, HANDLE hDev, + WORD wMsg, DWORD dwUser, DWORD dwParam1, DWORD dwParam2); +*/ + + diff --git a/misc/dos_fs.c b/misc/dos_fs.c index 9c9e9ef6fbe..78ee54cad3e 100644 --- a/misc/dos_fs.c +++ b/misc/dos_fs.c @@ -572,8 +572,6 @@ fprintf(stderr,"FindFile: looking for %s\n", filename); strncat(buffer, "/", buflen - strlen(buffer)); strncat(buffer, f->d_name, buflen - strlen(buffer)); - fprintf(stderr,"$$%s$$\n", buffer); - stat(buffer, &filestat); if (S_ISREG(filestat.st_mode)) { closedir(d); diff --git a/misc/driver.c b/misc/driver.c new file mode 100644 index 00000000000..a3e4975cc0c --- /dev/null +++ b/misc/driver.c @@ -0,0 +1,181 @@ +/* + * Wine Drivers functions + * + * Copyright 1994 Martin Ayotte + */ + +static char Copyright[] = "Copyright Martin Ayotte, 1994"; + +#include "stdio.h" +#include "windows.h" +#include "win.h" +#include "user.h" +#include "driver.h" + +LPDRIVERITEM lpDrvItemList = NULL; + +/************************************************************************** + * SendDriverMessage [USER.251] + */ +LRESULT WINAPI SendDriverMessage(HDRVR hDriver, WORD msg, LPARAM lParam1, LPARAM lParam2) +{ + printf("SendDriverMessage(%04X, %04X, %08X, %08X);\n", + hDriver, msg, lParam1, lParam2); +} + +/************************************************************************** + * OpenDriver [USER.252] + */ +HDRVR OpenDriver(LPSTR lpDriverName, LPSTR lpSectionName, LPARAM lParam) +{ + HDRVR hDrvr; + LPDRIVERITEM lpnewdrv; + LPDRIVERITEM lpdrv = lpDrvItemList; + char DrvName[128]; + printf("OpenDriver('%s', '%s', %08X);\n", + lpDriverName, lpSectionName, lParam); + if (lpSectionName == NULL) lpSectionName = "drivers"; + GetPrivateProfileString(lpSectionName, lpDriverName, + "", DrvName, sizeof(DrvName), "SYSTEM.INI"); + printf("OpenDriver // DrvName='%s'\n", DrvName); + if (strlen(DrvName) < 1) return 0; + while (lpdrv != NULL) { + if (lpdrv->lpNextItem == NULL) break; + lpdrv = lpdrv->lpNextItem; + } + hDrvr = GlobalAlloc(GMEM_MOVEABLE, sizeof(DRIVERITEM)); + lpnewdrv = (LPDRIVERITEM) GlobalLock(hDrvr); + if (lpnewdrv == NULL) return 0; + lpnewdrv->dis.length = sizeof(DRIVERINFOSTRUCT); + lpnewdrv->dis.hModule = LoadImage("DrvName", DLL); + if (lpnewdrv->dis.hModule == 0) { + GlobalUnlock(hDrvr); + GlobalFree(hDrvr); + return 0; + } + lpnewdrv->dis.hDriver = hDrvr; + strcpy(lpnewdrv->dis.szAliasName, lpDriverName); + lpnewdrv->count = 0; + lpnewdrv->lpNextItem = NULL; + if (lpDrvItemList == NULL || lpdrv == NULL) { + lpDrvItemList = lpnewdrv; + lpnewdrv->lpPrevItem = NULL; + } + else { + lpdrv->lpNextItem = lpnewdrv; + lpnewdrv->lpPrevItem = lpdrv; + } + lpnewdrv->lpDrvProc = NULL; + printf("OpenDriver // hDrvr=%04X loaded !\n", hDrvr); + return hDrvr; +} + +/************************************************************************** + * CloseDriver [USER.253] + */ +LRESULT CloseDriver(HDRVR hDrvr, LPARAM lParam1, LPARAM lParam2) +{ + LPDRIVERITEM lpdrv; + printf("CloseDriver(%04X, %08X, %08X);\n", hDrvr, lParam1, lParam2); + lpdrv = (LPDRIVERITEM) GlobalLock(hDrvr); + if (lpdrv != NULL && lpdrv->dis.hDriver == hDrvr) { + if (lpdrv->lpPrevItem) + ((LPDRIVERITEM)lpdrv->lpPrevItem)->lpNextItem = lpdrv->lpNextItem; + if (lpdrv->lpNextItem) + ((LPDRIVERITEM)lpdrv->lpNextItem)->lpPrevItem = lpdrv->lpPrevItem; + GlobalUnlock(hDrvr); + GlobalFree(hDrvr); + printf("CloseDriver // hDrvr=%04X closed !\n", hDrvr); + return TRUE; + } + return FALSE; +} + +/************************************************************************** + * GetDriverModuleHandle [USER.254] + */ +HANDLE GetDriverModuleHandle(HDRVR hDrvr) +{ + LPDRIVERITEM lpdrv; + HANDLE hModule = 0; + printf("GetDriverModuleHandle(%04X);\n", hDrvr); + lpdrv = (LPDRIVERITEM) GlobalLock(hDrvr); + if (lpdrv != NULL) { + hModule = lpdrv->dis.hModule; + GlobalUnlock(hDrvr); + } + return hModule; +} + +/************************************************************************** + * DefDriverProc [USER.255] + */ +LRESULT DefDriverProc(DWORD dwDevID, HDRVR hDriv, WORD wMsg, + DWORD dwParam1, DWORD dwParam2) +{ + switch(wMsg) { + case DRV_LOAD: + return (LRESULT)0L; + case DRV_FREE: + return (LRESULT)0L; + case DRV_OPEN: + return (LRESULT)0L; + case DRV_CLOSE: + return (LRESULT)0L; + case DRV_ENABLE: + return (LRESULT)0L; + case DRV_DISABLE: + return (LRESULT)0L; + case DRV_QUERYCONFIGURE: + return (LRESULT)0L; + case DRV_CONFIGURE: + MessageBox((HWND)NULL, "Driver isn't configurable !", + "Wine Driver", MB_OK); + return (LRESULT)0L; + case DRV_INSTALL: + return (LRESULT)DRVCNF_RESTART; + case DRV_REMOVE: + return (LRESULT)DRVCNF_RESTART; + default: + return (LRESULT)0L; + } +} + +/************************************************************************** + * GetDriverInfo [USER.256] + */ +BOOL GetDriverInfo(HDRVR hDrvr, LPDRIVERINFOSTRUCT lpDrvInfo) +{ + LPDRIVERITEM lpdrv; + printf("GetDriverInfo(%04X, %08X);\n", hDrvr, lpDrvInfo); + if (lpDrvInfo == NULL) return FALSE; + lpdrv = (LPDRIVERITEM) GlobalLock(hDrvr); + if (lpdrv == NULL) return FALSE; + memcpy(lpDrvInfo, &lpdrv->dis, sizeof(DRIVERINFOSTRUCT)); + GlobalUnlock(hDrvr); + return TRUE; +} + +/************************************************************************** + * GetNextDriver [USER.257] + */ +HDRVR GetNextDriver(HDRVR hDrvr, DWORD dwFlags) +{ + LPDRIVERITEM lpdrv; + HDRVR hRetDrv = 0; + printf("GetNextDriver(%04X, %08X);\n", hDrvr, dwFlags); + lpdrv = (LPDRIVERITEM) GlobalLock(hDrvr); + if (lpdrv != NULL) { + if (dwFlags & GND_REVERSE) + if (lpdrv->lpPrevItem) + hRetDrv = ((LPDRIVERITEM)lpdrv->lpPrevItem)->dis.hDriver; + if (dwFlags & GND_FORWARD) + if (lpdrv->lpNextItem) + hRetDrv = ((LPDRIVERITEM)lpdrv->lpNextItem)->dis.hDriver; + GlobalUnlock(hDrvr); + } + return hRetDrv; + +} + + diff --git a/misc/exec.c b/misc/exec.c index f6730c610d9..bb372374efe 100644 --- a/misc/exec.c +++ b/misc/exec.c @@ -24,11 +24,37 @@ #define HELP_MULTIKEY 0x0201 #define HELP_SETWINPOS 0x0203 +typedef struct { + WORD wEnvSeg; + LPSTR lpCmdLine; + LPVOID lpCmdShow; + DWORD dwReserved; + } PARAMBLOCK; +HANDLE CreateNewTask(HINSTANCE hInst); + +/********************************************************************** + * LoadModule [KERNEL.45] + */ +HANDLE LoadModule(LPSTR modulefile, LPVOID lpParamBlk) +{ + PARAMBLOCK *pblk = lpParamBlk; + WORD *lpCmdShow; + printf("LoadModule '%s' %08X\n", modulefile, lpParamBlk); + if (lpParamBlk == NULL) return 0; + lpCmdShow = (WORD *)pblk->lpCmdShow; + return WinExec(pblk->lpCmdLine, lpCmdShow[1]); +} + + +/********************************************************************** + * WinExec [KERNEL.166] + */ WORD WinExec(LPSTR lpCmdLine, WORD nCmdShow) { int X, X2, C; char *ArgV[20]; + HANDLE hTask = 0; printf("WinExec('%s', %04X)\n", lpCmdLine, nCmdShow); ArgV[0] = "wine"; C = 1; @@ -38,35 +64,47 @@ WORD WinExec(LPSTR lpCmdLine, WORD nCmdShow) strncpy(ArgV[C], &lpCmdLine[X2], X - X2); ArgV[C][X - X2] = '\0'; C++; X2 = X + 1; - } - } + } + } ArgV[C] = NULL; for (C = 0; ; C++) { if (ArgV[C] == NULL) break; printf("--> '%s' \n", ArgV[C]); - } + } switch(fork()) { - case -1: - printf("Can't 'fork' process !\n"); - break; - case 0: - printf("New process started !\n"); - execvp(ArgV[0], ArgV); - printf("Child process died !\n"); - exit(1); - break; - default: - printf("Main process stay alive !\n"); - break; - } + case -1: + printf("Can't 'fork' process !\n"); + break; + case 0: + hTask = CreateNewTask(0); + printf("WinExec // New Task hTask=%04X !\n", hTask); + execvp(ArgV[0], ArgV); + printf("Child process died !\n"); + exit(1); + default: + printf("WinExec (Main process stay alive) hTask=%04X !\n", hTask); + break; + } for (C = 0; ; C++) { if (ArgV[C] == NULL) break; free(ArgV[C]); - } - return(TRUE); + } + return hTask; } +/********************************************************************** + * ExitWindows [USER.7] + */ +BOOL ExitWindows(DWORD dwReserved, WORD wRetCode) +{ + printf("EMPTY STUB !!! ExitWindows(%08X, %04X) !\n", dwReserved, wRetCode); +} + + +/********************************************************************** + * WinHelp [USER.171] + */ BOOL WinHelp(HWND hWnd, LPSTR lpHelpFile, WORD wCommand, DWORD dwData) { char str[256]; diff --git a/misc/file.c b/misc/file.c index 5d41f1cb929..47beada96da 100644 --- a/misc/file.c +++ b/misc/file.c @@ -17,7 +17,7 @@ * ************************************************************************/ -#define DEBUG_FILE +/* #define DEBUG_FILE */ #include #include @@ -34,7 +34,7 @@ char WindowsDirectory[256], SystemDirectory[256], TempDirectory[256]; Emulate the _lopen windows call ***************************************************************************/ -int _lopen (LPSTR lpPathName, int iReadWrite) +INT _lopen (LPSTR lpPathName, INT iReadWrite) { int handle; char *UnixFileName; @@ -61,7 +61,7 @@ int _lopen (LPSTR lpPathName, int iReadWrite) /*************************************************************************** _lread ***************************************************************************/ -WORD _lread (int hFile, LPSTR lpBuffer, int wBytes) +WORD _lread (INT hFile, LPSTR lpBuffer, INT wBytes) { int result; @@ -81,7 +81,7 @@ WORD _lread (int hFile, LPSTR lpBuffer, int wBytes) /**************************************************************************** _lwrite ****************************************************************************/ -WORD _lwrite (int hFile, LPSTR lpBuffer, int wBytes) +WORD _lwrite (INT hFile, LPSTR lpBuffer, INT wBytes) { int result; @@ -100,7 +100,7 @@ WORD _lwrite (int hFile, LPSTR lpBuffer, int wBytes) /*************************************************************************** _lclose ***************************************************************************/ -int _lclose (int hFile) +INT _lclose (INT hFile) { #ifdef DEBUG_FILE fprintf(stderr, "_lclose: handle %d\n", hFile); @@ -117,7 +117,7 @@ int _lclose (int hFile) Warning: This is nearly totally untested. It compiles, that's it... -SL 9/13/93 **************************************************************************/ -int OpenFile (LPSTR lpFileName, LPOFSTRUCT ofs, WORD wStyle) +INT OpenFile (LPSTR lpFileName, LPOFSTRUCT ofs, WORD wStyle) { int base,flags; @@ -168,7 +168,7 @@ WORD SetHandleCount (WORD wNumber) /*************************************************************************** _llseek ***************************************************************************/ -LONG _llseek (int hFile, LONG lOffset, int nOrigin) +LONG _llseek (INT hFile, LONG lOffset, INT nOrigin) { int origin; @@ -191,7 +191,7 @@ LONG _llseek (int hFile, LONG lOffset, int nOrigin) /*************************************************************************** _lcreate ***************************************************************************/ -LONG _lcreate (LPSTR lpszFilename, int fnAttribute) +INT _lcreate (LPSTR lpszFilename, INT fnAttribute) { int handle; char *UnixFileName; @@ -215,7 +215,7 @@ LONG _lcreate (LPSTR lpszFilename, int fnAttribute) /*************************************************************************** GetDriveType ***************************************************************************/ -UINT GetDriveType(int drive) +UINT GetDriveType(INT drive) { #ifdef DEBUG_FILE @@ -228,7 +228,7 @@ UINT GetDriveType(int drive) if (drive == 0 || drive == 1) return DRIVE_REMOVABLE; - return DRIVE_REMOVABLE; + return DRIVE_FIXED; } /*************************************************************************** @@ -279,7 +279,7 @@ UINT GetSystemDirectory(LPSTR lpszSysPath, UINT cbSysPath) /*************************************************************************** GetTempFileName ***************************************************************************/ -int GetTempFileName(BYTE bDriveLetter, LPCSTR lpszPrefixString, UINT uUnique, LPSTR lpszTempFileName) +INT GetTempFileName(BYTE bDriveLetter, LPCSTR lpszPrefixString, UINT uUnique, LPSTR lpszTempFileName) { int unique; char tempname[256]; @@ -292,7 +292,7 @@ int GetTempFileName(BYTE bDriveLetter, LPCSTR lpszPrefixString, UINT uUnique, LP strcpy(tempname,lpszPrefixString); tempname[3]='\0'; - sprintf(lpszTempFileName,"%s\\%s%d.tmp",WindowsDirectory, tempname, + sprintf(lpszTempFileName,"%s\\%s%d.tmp", TempDirectory, tempname, unique); ToDos(lpszTempFileName); @@ -318,46 +318,12 @@ WORD SetErrorMode(WORD x) ***************************************************************************/ long _hread(int hf, void FAR *hpvBuffer, long cbBuffer) { - long dataread = 0; - size_t status, size; - - while (cbBuffer) - { - size = cbBuffer < 30000 ? cbBuffer : 30000; - - status = read(hf, hpvBuffer, size); - if (status == -1) - return HFILE_ERROR; - if (status == 0) - return dataread; - - dataread += status; - hpvBuffer += status; - cbBuffer -= status; - } - return dataread; + return read(hf, hpvBuffer, cbBuffer); } /*************************************************************************** _hwrite ***************************************************************************/ long _hwrite(int hf, const void FAR *hpvBuffer, long cbBuffer) { - long datawritten = 0; - size_t status, size; - - while (cbBuffer) - { - size = cbBuffer < 30000 ? cbBuffer : 30000; - - status = write(hf, hpvBuffer, size); - if (status == -1) - return HFILE_ERROR; - if (status == 0) - return datawritten; - - datawritten += status; - hpvBuffer += status; - cbBuffer -= status; - } - return datawritten; + return write(hf, hpvBuffer, cbBuffer); } diff --git a/misc/lstr.c b/misc/lstr.c index cec274838ea..e6dc70153d3 100644 --- a/misc/lstr.c +++ b/misc/lstr.c @@ -23,13 +23,13 @@ LPSTR lstrcat(LPSTR target,LPCSTR source) } /* USER.430 */ -int lstrcmp(LPCSTR str1,LPCSTR str2) +INT lstrcmp(LPCSTR str1,LPCSTR str2) { return strcmp(str1,str2); } /* USER.471 */ -int lstrcmpi(LPCSTR str1,LPCSTR str2) +INT lstrcmpi(LPCSTR str1,LPCSTR str2) { int i; i=0; @@ -51,7 +51,7 @@ LPSTR lstrcpyn(LPSTR target,LPCSTR source,int n) } /* KERNEL.90 */ -int lstrlen(LPCSTR str) +INT lstrlen(LPCSTR str) { return strlen(str); } @@ -148,7 +148,7 @@ BOOL IsCharLower(char ch) static char Oem2Ansi[256]; static char Ansi2Oem[256]; -void InitOemAnsiTranslations() +void InitOemAnsiTranslations(void) { static int inited=0; /* should called called in some init function*/ int transfile,i; @@ -173,7 +173,7 @@ void InitOemAnsiTranslations() } /* AnsiToOem Keyboard.5 */ -int AnsiToOem(LPSTR lpAnsiStr, LPSTR lpOemStr) /* why is this int ??? */ +INT AnsiToOem(LPSTR lpAnsiStr, LPSTR lpOemStr) /* why is this int ??? */ { InitOemAnsiTranslations(); /* should called called in some init function*/ while(*lpAnsiStr){ @@ -193,7 +193,7 @@ BOOL OemToAnsi(LPSTR lpOemStr, LPSTR lpAnsiStr) /* why is this BOOL ???? */ } /* AnsiToOemBuff Keyboard.134 */ -void AnsiToOemBuff(LPSTR lpAnsiStr, LPSTR lpOemStr, int nLength) +void AnsiToOemBuff(LPSTR lpAnsiStr, LPSTR lpOemStr, INT nLength) { int i; InitOemAnsiTranslations(); /* should called called in some init function*/ @@ -202,7 +202,7 @@ void AnsiToOemBuff(LPSTR lpAnsiStr, LPSTR lpOemStr, int nLength) } /* OemToAnsi Keyboard.135 */ -void OemToAnsiBuff(LPSTR lpOemStr, LPSTR lpAnsiStr, int nLength) +void OemToAnsiBuff(LPSTR lpOemStr, LPSTR lpAnsiStr, INT nLength) { int i; InitOemAnsiTranslations(); /* should called called in some init function*/ diff --git a/misc/main.c b/misc/main.c index c98b72381a3..59106ca98d1 100644 --- a/misc/main.c +++ b/misc/main.c @@ -494,17 +494,7 @@ BOOL SystemParametersInfo (UINT uAction, UINT uParam, void FAR *lpvParam, UINT f */ void hmemcpy(void FAR *hpvDest, const void FAR *hpvSource, long cbCopy) { - size_t copysize; - - while (cbCopy) - { - copysize = cbCopy < 30000 ? cbCopy : 30000; - - memcpy(hpvDest, hpvSource, copysize); - hpvDest += copysize; - hpvSource += copysize; - cbCopy -= copysize; - } + memcpy(hpvDest, hpvSource, cbCopy); } /*********************************************************************** diff --git a/misc/message.c b/misc/message.c index 57428e7faf4..c5459632468 100644 --- a/misc/message.c +++ b/misc/message.c @@ -50,17 +50,22 @@ int MessageBox(HWND hWnd, LPSTR str, LPSTR title, WORD type) WND *wndPtr; WNDCLASS wndClass; MSG msg; - MSGBOX mb; - DWORD dwStyle; + MSGBOX mb; + DWORD dwStyle; HINSTANCE hInst; wndPtr = WIN_FindWndPtr(hWnd); + if (wndPtr == NULL) { + hInst = hSysRes; #ifdef DEBUG_MSGBOX - printf( "MessageBox: '%s'\n", str ); + printf("MessageBox(NULL, '%s', '%s', %04X)\n", str, title, type); #endif - if (wndPtr == NULL) - hInst = hSysRes; - else - hInst = wndPtr->hInstance; + } + else { + hInst = wndPtr->hInstance; +#ifdef DEBUG_MSGBOX + printf("MessageBox(%04X, '%s', '%s', %04X)\n", hWnd, str, title, type); +#endif + } wndClass.style = CS_HREDRAW | CS_VREDRAW ; wndClass.lpfnWndProc = (WNDPROC)SystemMessageBoxProc; wndClass.cbClsExtra = 0; @@ -71,7 +76,10 @@ int MessageBox(HWND hWnd, LPSTR str, LPSTR title, WORD type) wndClass.hbrBackground = GetStockObject(WHITE_BRUSH); wndClass.lpszMenuName = NULL; wndClass.lpszClassName = "MESSAGEBOX"; - if (!RegisterClass(&wndClass)) return 0; + if (!RegisterClass(&wndClass)) { + printf("Unable to Register class 'MESSAGEBOX' !\n"); + return 0; + } memset(&mb, 0, sizeof(MSGBOX)); mb.Title = title; mb.Str = str; @@ -82,11 +90,28 @@ int MessageBox(HWND hWnd, LPSTR str, LPSTR title, WORD type) hWndOld = GetFocus(); hDlg = CreateWindow("MESSAGEBOX", title, dwStyle, 100, 150, 400, 120, (HWND)NULL, (HMENU)NULL, hInst, (LPSTR)&mb); - if (hDlg == 0) return 0; + if (hDlg == 0) { + printf("Unable to create 'MESSAGEBOX' window !\n"); + return 0; + } +#ifdef DEBUG_MSGBOX + printf( "MessageBox // before Msg Loop !\n"); +#endif while(TRUE) { if (!mb.ActiveFlg) break; if (!GetMessage(&msg, (HWND)NULL, 0, 0)) break; TranslateMessage(&msg); + if ((type & (MB_SYSTEMMODAL | MB_TASKMODAL)) != 0 && + msg.hwnd != hDlg) { + switch(msg.message) { + case WM_KEYDOWN: + case WM_LBUTTONDOWN: + case WM_MBUTTONDOWN: + case WM_RBUTTONDOWN: + MessageBeep(0); + break; + } + } DispatchMessage(&msg); } SetFocus(hWndOld); @@ -97,6 +122,7 @@ int MessageBox(HWND hWnd, LPSTR str, LPSTR title, WORD type) return(mb.wRetVal); } + LPMSGBOX MsgBoxGetStorageHeader(HWND hwnd) { WND *wndPtr; @@ -119,6 +145,7 @@ LONG SystemMessageBoxProc(HWND hWnd, WORD message, WORD wParam, LONG lParam) CREATESTRUCT *createStruct; PAINTSTRUCT ps; HDC hDC; + DWORD OldTextColor; RECT rect; LPMSGBOX lpmb; LPMSGBOX lpmbInit; @@ -225,21 +252,26 @@ LONG SystemMessageBoxProc(HWND hWnd, WORD message, WORD wParam, LONG lParam) break; case WM_PAINT: #ifdef DEBUG_MSGBOX - printf("MessageBox WM_PAINT !\n"); + printf("MessageBox WM_PAINT !\n"); #endif - lpmb = MsgBoxGetStorageHeader(hWnd); - CopyRect(&rect, &lpmb->rectStr); - hDC = BeginPaint(hWnd, &ps); - if (lpmb->hIcon) - DrawIcon(hDC, lpmb->rectIcon.left, - lpmb->rectIcon.top, lpmb->hIcon); - DrawText(hDC, lpmb->Str, -1, &rect, - DT_CALCRECT | DT_CENTER | DT_WORDBREAK); - rect.top = lpmb->rectStr.bottom / 2 - rect.bottom / 2; - rect.bottom = lpmb->rectStr.bottom / 2 + rect.bottom / 2; - DrawText(hDC, lpmb->Str, -1, &rect, DT_CENTER | DT_WORDBREAK); - EndPaint(hWnd, &ps); - break; + lpmb = MsgBoxGetStorageHeader(hWnd); + CopyRect(&rect, &lpmb->rectStr); + hDC = BeginPaint(hWnd, &ps); + OldTextColor = SetTextColor(hDC, 0x00000000); + if (lpmb->hIcon) + DrawIcon(hDC, lpmb->rectIcon.left, + lpmb->rectIcon.top, lpmb->hIcon); + DrawText(hDC, lpmb->Str, -1, &rect, + DT_CALCRECT | DT_CENTER | DT_WORDBREAK); + rect.top = lpmb->rectStr.bottom / 2 - rect.bottom / 2; + rect.bottom = lpmb->rectStr.bottom / 2 + rect.bottom / 2; + DrawText(hDC, lpmb->Str, -1, &rect, DT_CENTER | DT_WORDBREAK); + SetTextColor(hDC, OldTextColor); + EndPaint(hWnd, &ps); +#ifdef DEBUG_MSGBOX + printf("MessageBox End of WM_PAINT !\n"); +#endif + break; case WM_DESTROY: #ifdef DEBUG_MSGBOX printf("MessageBox WM_DESTROY !\n"); diff --git a/misc/mmsystem.c b/misc/mmsystem.c new file mode 100644 index 00000000000..042974cb6ff --- /dev/null +++ b/misc/mmsystem.c @@ -0,0 +1,1031 @@ +/* + * MMSYTEM functions + * + * Copyright 1993 Martin Ayotte + */ + +static char Copyright[] = "Copyright Martin Ayotte, 1993"; + +#include "stdio.h" +#include "win.h" +#include "mmsystem.h" + + +int MCI_LibMain(HANDLE hInstance, WORD wDataSeg, + WORD cbHeapSize, LPSTR lpCmdLine) +{ + printf("MMSYSTEM DLL INIT ... hInst=%04X \n", hInstance); + return(TRUE); +} + + +BOOL WINAPI sndPlaySound(LPCSTR lpszSoundName, UINT uFlags) +{ + printf("sndPlaySound // lpszSoundName='%s' uFlags=%04X !\n", + lpszSoundName, uFlags); + return 0; +} + + + +WORD WINAPI mmsystemGetVersion() +{ + printf("mmsystemGetVersion // 0.4.0 ...?... :-) !\n"); + return(0x0040); +} + + +void WINAPI OutputDebugStr(LPCSTR str) +{ + printf("OutputDebugStr('%s');\n", str); +} + + +UINT WINAPI auxGetNumDevs() +{ + printf("auxGetNumDevs !\n"); + return 0; +} + + +UINT WINAPI auxGetDevCaps(UINT uDeviceID, AUXCAPS FAR* lpCaps, UINT uSize) +{ + printf("auxGetDevCaps !\n"); + return 0; +} + + +UINT WINAPI auxGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume) +{ + printf("auxGetVolume !\n"); + return 0; +} + + + +UINT WINAPI auxSetVolume(UINT uDeviceID, DWORD dwVolume) +{ + printf("auxSetVolume !\n"); + return 0; +} + + +DWORD WINAPI auxOutMessage(UINT uDeviceID, UINT uMessage, DWORD dw1, DWORD dw2) +{ + printf("auxOutMessage !\n"); + return 0L; +} + + + +BOOL mciGetErrorString (DWORD wError, LPSTR lpstrBuffer, UINT uLength) +{ + LPSTR msgptr; + int maxbuf; + if ((lpstrBuffer == NULL) || (uLength < 1)) return(FALSE); + lpstrBuffer[0] = '\0'; + switch(wError) { + case MCIERR_INVALID_DEVICE_ID: + msgptr = "Invalid MCI device ID. Use the ID returned when opening the MCI device."; + break; + case MCIERR_UNRECOGNIZED_KEYWORD: + msgptr = "The driver cannot recognize the specified command parameter."; + break; + case MCIERR_UNRECOGNIZED_COMMAND: + msgptr = "The driver cannot recognize the specified command."; + break; + case MCIERR_HARDWARE: + msgptr = "There is a problem with your media device. Make sure it is working correctly or contact the device manufacturer."; + break; + case MCIERR_INVALID_DEVICE_NAME: + msgptr = "The specified device is not open or is not recognized by MCI."; + break; + case MCIERR_OUT_OF_MEMORY: + msgptr = "Not enough memory available for this task. \nQuit one or more applications to increase available memory, and then try again."; + break; + case MCIERR_DEVICE_OPEN: + msgptr = "The device name is already being used as an alias by this application. Use a unique alias."; + break; + case MCIERR_CANNOT_LOAD_DRIVER: + msgptr = "There is an undetectable problem in loading the specified device driver."; + break; + case MCIERR_MISSING_COMMAND_STRING: + msgptr = "No command was specified."; + break; + case MCIERR_PARAM_OVERFLOW: + msgptr = "The output string was to large to fit in the return buffer. Increase the size of the buffer."; + break; + case MCIERR_MISSING_STRING_ARGUMENT: + msgptr = "The specified command requires a character-string parameter. Please provide one."; + break; + case MCIERR_BAD_INTEGER: + msgptr = "The specified integer is invalid for this command."; + break; + case MCIERR_PARSER_INTERNAL: + msgptr = "The device driver returned an invalid return type. Check with the device manufacturer about obtaining a new driver."; + break; + case MCIERR_DRIVER_INTERNAL: + msgptr = "There is a problem with the device driver. Check with the device manufacturer about obtaining a new driver."; + break; + case MCIERR_MISSING_PARAMETER: + msgptr = "The specified command requires a parameter. Please supply one."; + break; + case MCIERR_UNSUPPORTED_FUNCTION: + msgptr = "The MCI device you are using does not support the specified command."; + break; + case MCIERR_FILE_NOT_FOUND: + msgptr = "Cannot find the specified file. Make sure the path and filename are correct."; + break; + case MCIERR_DEVICE_NOT_READY: + msgptr = "The device driver is not ready."; + break; + case MCIERR_INTERNAL: + msgptr = "A problem occurred in initializing MCI. Try restarting Windows."; + break; + case MCIERR_DRIVER: + msgptr = "There is a problem with the device driver. The driver has closed. Cannot access error."; + break; + case MCIERR_CANNOT_USE_ALL: + msgptr = "Cannot use 'all' as the device name with the specified command."; + break; + case MCIERR_MULTIPLE: + msgptr = "Errors occurred in more than one device. Specify each command and device separately to determine which devices caused the error"; + break; + case MCIERR_EXTENSION_NOT_FOUND: + msgptr = "Cannot determine the device type from the given filename extension."; + break; + case MCIERR_OUTOFRANGE: + msgptr = "The specified parameter is out of range for the specified command."; + break; + case MCIERR_FLAGS_NOT_COMPATIBLE: + msgptr = "The specified parameters cannot be used together."; + break; + case MCIERR_FILE_NOT_SAVED: + msgptr = "Cannot save the specified file. Make sure you have enough disk space or are still connected to the network."; + break; + case MCIERR_DEVICE_TYPE_REQUIRED: + msgptr = "Cannot find the specified device. Make sure it is installed or that the device name is spelled correctly."; + break; + case MCIERR_DEVICE_LOCKED: + msgptr = "The specified device is now being closed. Wait a few seconds, and then try again."; + break; + case MCIERR_DUPLICATE_ALIAS: + msgptr = "The specified alias is already being used in this application. Use a unique alias."; + break; + case MCIERR_BAD_CONSTANT: + msgptr = "The specified parameter is invalid for this command."; + break; + case MCIERR_MUST_USE_SHAREABLE: + msgptr = "The device driver is already in use. To share it, use the 'shareable' parameter with each 'open' command."; + break; + case MCIERR_MISSING_DEVICE_NAME: + msgptr = "The specified command requires an alias, file, driver, or device name. Please supply one."; + break; + case MCIERR_BAD_TIME_FORMAT: + msgptr = "The specified value for the time format is invalid. Refer to the MCI documentation for valid formats."; + break; + case MCIERR_NO_CLOSING_QUOTE: + msgptr = "A closing double-quotation mark is missing from the parameter value. Please supply one."; + break; + case MCIERR_DUPLICATE_FLAGS: + msgptr = "A parameter or value was specified twice. Only specify it once."; + break; + case MCIERR_INVALID_FILE: + msgptr = "The specified file cannot be played on the specified MCI device. The file may be corrupt, or not in the correct format."; + break; + case MCIERR_NULL_PARAMETER_BLOCK: + msgptr = "A null parameter block was passed to MCI."; + break; + case MCIERR_UNNAMED_RESOURCE: + msgptr = "Cannot save an unnamed file. Supply a filename."; + break; + case MCIERR_NEW_REQUIRES_ALIAS: + msgptr = "You must specify an alias when using the 'new' parameter."; + break; + case MCIERR_NOTIFY_ON_AUTO_OPEN: + msgptr = "Cannot use the 'notify' flag with auto-opened devices."; + break; + case MCIERR_NO_ELEMENT_ALLOWED: + msgptr = "Cannot use a filename with the specified device."; + break; + case MCIERR_NONAPPLICABLE_FUNCTION: + msgptr = "Cannot carry out the commands in the order specified. Correct the command sequence, and then try again."; + break; + case MCIERR_ILLEGAL_FOR_AUTO_OPEN: + msgptr = "Cannot carry out the specified command on an auto-opened device. Wait until the device is closed, and then try again."; + break; + case MCIERR_FILENAME_REQUIRED: + msgptr = "The filename is invalid. Make sure the filename is not longer than 8 characters, followed by a period and an extension."; + break; + case MCIERR_EXTRA_CHARACTERS: + msgptr = "Cannot specify extra characters after a string enclosed in quotation marks."; + break; + case MCIERR_DEVICE_NOT_INSTALLED: + msgptr = "The specified device is not installed on the system. Use the Drivers option in Control Panel to install the device."; + break; + case MCIERR_GET_CD: + msgptr = "Cannot access the specified file or MCI device. Try changing directories or restarting your computer."; + break; + case MCIERR_SET_CD: + msgptr = "Cannot access the specified file or MCI device because the application cannot change directories."; + break; + case MCIERR_SET_DRIVE: + msgptr = "Cannot access specified file or MCI device because the application cannot change drives."; + break; + case MCIERR_DEVICE_LENGTH: + msgptr = "Specify a device or driver name that is less than 79 characters."; + break; + case MCIERR_DEVICE_ORD_LENGTH: + msgptr = "Specify a device or driver name that is less than 69 characters."; + break; + case MCIERR_NO_INTEGER: + msgptr = "The specified command requires an integer parameter. Please provide one."; + break; + case MCIERR_WAVE_OUTPUTSINUSE: + msgptr = "All wave devices that can play files in the current format are in use. Wait until a wave device is free, and then try again."; + break; + case MCIERR_WAVE_SETOUTPUTINUSE: + msgptr = "Cannot set the current wave device for play back because it is in use. Wait until the device is free, and then try again."; + break; + case MCIERR_WAVE_INPUTSINUSE: + msgptr = "All wave devices that can record files in the current format are in use. Wait until a wave device is free, and then try again."; + break; + case MCIERR_WAVE_SETINPUTINUSE: + msgptr = "Cannot set the current wave device for recording because it is in use. Wait until the device is free, and then try again."; + break; + case MCIERR_WAVE_OUTPUTUNSPECIFIED: + msgptr = "Any compatible waveform playback device may be used."; + break; + case MCIERR_WAVE_INPUTUNSPECIFIED: + msgptr = "Any compatible waveform recording device may be used."; + break; + case MCIERR_WAVE_OUTPUTSUNSUITABLE: + msgptr = "No wave device that can play files in the current format is installed. Use the Drivers option to install the wave device."; + break; + case MCIERR_WAVE_SETOUTPUTUNSUITABLE: + msgptr = "The device you are trying to play to cannot recognize the current file format."; + break; + case MCIERR_WAVE_INPUTSUNSUITABLE: + msgptr = "No wave device that can record files in the current format is installed. Use the Drivers option to install the wave device."; + break; + case MCIERR_WAVE_SETINPUTUNSUITABLE: + msgptr = "The device you are trying to record from cannot recognize the current file format."; + break; + case MCIERR_NO_WINDOW: + msgptr = "There is no display window."; + break; + case MCIERR_CREATEWINDOW: + msgptr = "Could not create or use window."; + break; + case MCIERR_FILE_READ: + msgptr = "Cannot read the specified file. Make sure the file is still present, or check your disk or network connection."; + break; + case MCIERR_FILE_WRITE: + msgptr = "Cannot write to the specified file. Make sure you have enough disk space or are still connected to the network."; + break; + +/* +#define MCIERR_SEQ_DIV_INCOMPATIBLE (MCIERR_BASE + 80) +#define MCIERR_SEQ_PORT_INUSE (MCIERR_BASE + 81) +#define MCIERR_SEQ_PORT_NONEXISTENT (MCIERR_BASE + 82) +#define MCIERR_SEQ_PORT_MAPNODEVICE (MCIERR_BASE + 83) +#define MCIERR_SEQ_PORT_MISCERROR (MCIERR_BASE + 84) +#define MCIERR_SEQ_TIMER (MCIERR_BASE + 85) +#define MCIERR_SEQ_PORTUNSPECIFIED (MCIERR_BASE + 86) +#define MCIERR_SEQ_NOMIDIPRESENT (MCIERR_BASE + 87) + +msg# 513 : vcr +msg# 514 : videodisc +msg# 515 : overlay +msg# 516 : cdaudio +msg# 517 : dat +msg# 518 : scanner +msg# 519 : animation +msg# 520 : digitalvideo +msg# 521 : other +msg# 522 : waveaudio +msg# 523 : sequencer +msg# 524 : not ready +msg# 525 : stopped +msg# 526 : playing +msg# 527 : recording +msg# 528 : seeking +msg# 529 : paused +msg# 530 : open +msg# 531 : false +msg# 532 : true +msg# 533 : milliseconds +msg# 534 : hms +msg# 535 : msf +msg# 536 : frames +msg# 537 : smpte 24 +msg# 538 : smpte 25 +msg# 539 : smpte 30 +msg# 540 : smpte 30 drop +msg# 541 : bytes +msg# 542 : samples +msg# 543 : tmsf +*/ + default: + msgptr = "Unkown MCI Error !\n"; + break; + } + maxbuf = min(uLength - 1, strlen(msgptr)); + strncpy(lpstrBuffer, msgptr, maxbuf); + lpstrBuffer[maxbuf + 1] = '\0'; + return(TRUE); +} + + + +DWORD mciSendCommand(UINT wDevID, UINT wMsg, DWORD dwParam1, DWORD dwParam2) +{ + printf("mciSendCommand(%04X, %04X, %08X, %08X)\n", + wDevID, wMsg, dwParam1, dwParam2); + return MCIERR_DEVICE_NOT_INSTALLED; +} + + + + +UINT mciGetDeviceID (LPCSTR lpstrName) +{ + printf("mciGetDeviceID(%s)\n", lpstrName); + return 0; +} + + + +DWORD WINAPI mciSendString (LPCSTR lpstrCommand, + LPSTR lpstrReturnString, UINT uReturnLength, HWND hwndCallback) +{ + printf("mciSendString('%s', %lX, %u, %X)\n", + lpstrCommand, lpstrReturnString, + uReturnLength, hwndCallback); + return MCIERR_MISSING_COMMAND_STRING; +} + + + +HMMIO WINAPI mmioOpen(LPSTR szFileName, MMIOINFO FAR* lpmmioinfo, DWORD dwOpenFlags) +{ + printf("mmioOpen('%s', %08X, %08X);\n", szFileName, lpmmioinfo, dwOpenFlags); + return 0; +} + + + +UINT WINAPI mmioClose(HMMIO hmmio, UINT uFlags) +{ + printf("mmioClose(%04X, %04X);\n", hmmio, uFlags); + return 0; +} + + + +LONG WINAPI mmioRead(HMMIO hmmio, HPSTR pch, LONG cch) +{ + printf("mmioRead\n"); + return 0; +} + + + +LONG WINAPI mmioWrite(HMMIO hmmio, HPCSTR pch, LONG cch) +{ + printf("mmioWrite\n"); + return 0; +} + + +LONG WINAPI mmioSeek(HMMIO hmmio, LONG lOffset, int iOrigin) +{ + printf("mmioSeek\n"); + return 0; +} + + + +UINT WINAPI midiOutGetNumDevs(void) +{ + printf("midiOutGetNumDevs\n"); + return 0; +} + + + +UINT WINAPI midiOutGetDevCaps(UINT uDeviceID, + MIDIOUTCAPS FAR* lpCaps, UINT uSize) +{ + printf("midiOutGetDevCaps\n"); + return 0; +} + + +UINT WINAPI midiOutGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume) +{ + printf("midiOutGetVolume\n"); + return 0; +} + + +UINT WINAPI midiOutSetVolume(UINT uDeviceID, DWORD dwVolume) +{ + printf("midiOutSetVolume\n"); + return 0; +} + + +UINT WINAPI midiOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize) +{ + printf("midiOutGetErrorText\n"); + return(midiGetErrorText(uError, lpText, uSize)); +} + + +UINT WINAPI midiGetErrorText(UINT uError, LPSTR lpText, UINT uSize) +{ + LPSTR msgptr; + int maxbuf; + if ((lpText == NULL) || (uSize < 1)) return(FALSE); + lpText[0] = '\0'; + switch(uError) { + case MIDIERR_UNPREPARED: + msgptr = "The MIDI header was not prepared. Use the Prepare function to prepare the header, and then try again."; + break; + case MIDIERR_STILLPLAYING: + msgptr = "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing."; + break; + case MIDIERR_NOMAP: + msgptr = "A MIDI map was not found. There may be a problem with the driver, or the MIDIMAP.CFG file may be corrupt or missing."; + break; + case MIDIERR_NOTREADY: + msgptr = "The port is transmitting data to the device. Wait until the data has been transmitted, and then try again."; + break; + case MIDIERR_NODEVICE: + msgptr = "The current MIDI Mapper setup refers to a MIDI device that is not installed on the system. Use MIDI Mapper to edit the setup."; + break; + case MIDIERR_INVALIDSETUP: + msgptr = "The current MIDI setup is damaged. Copy the original MIDIMAP.CFG file to the Windows SYSTEM directory, and then try again."; + break; +/* +msg# 336 : Cannot use the song-pointer time format and the SMPTE time-format together. +msg# 337 : The specified MIDI device is already in use. Wait until it is free, and then try again. +msg# 338 : The specified MIDI device is not installed on the system. Use the Drivers option in Control Panel to install the driver. +msg# 339 : The current MIDI Mapper setup refers to a MIDI device that is not installed on the system. Use MIDI Mapper to edit the setup. +msg# 340 : An error occurred using the specified port. +msg# 341 : All multimedia timers are being used by other applications. Quit one of these applications, and then try again. +msg# 342 : There is no current MIDI port. +msg# 343 : There are no MIDI devices installed on the system. Use the Drivers option in Control Panel to install the driver. +*/ + default: + msgptr = "Unkown MIDI Error !\n"; + break; + } + maxbuf = min(uSize - 1, strlen(msgptr)); + strncpy(lpText, msgptr, maxbuf); + lpText[maxbuf + 1] = '\0'; + return(TRUE); +} + + +UINT WINAPI midiOutOpen(HMIDIOUT FAR* lphMidiOut, UINT uDeviceID, + DWORD dwCallback, DWORD dwInstance, DWORD dwFlags) +{ + printf("midiOutOpen\n"); + return 0; +} + + +UINT WINAPI midiOutClose(HMIDIOUT hMidiOut) +{ + printf("midiOutClose\n"); + return 0; +} + + +UINT WINAPI midiOutPrepareHeader(HMIDIOUT hMidiOut, + MIDIHDR FAR* lpMidiOutHdr, UINT uSize) +{ + printf("midiOutPrepareHeader\n"); + return 0; +} + + +UINT WINAPI midiOutUnprepareHeader(HMIDIOUT hMidiOut, + MIDIHDR FAR* lpMidiOutHdr, UINT uSize) +{ + printf("midiOutUnprepareHeader\n"); + return 0; +} + + +UINT WINAPI midiOutShortMsg(HMIDIOUT hMidiOut, DWORD dwMsg) +{ + printf("midiOutShortMsg\n"); + return 0; +} + + +UINT WINAPI midiOutLongMsg(HMIDIOUT hMidiOut, + MIDIHDR FAR* lpMidiOutHdr, UINT uSize) +{ + printf("midiOutLongMsg\n"); + return 0; +} + + +UINT WINAPI midiOutReset(HMIDIOUT hMidiOut) +{ + printf("midiOutReset\n"); + return 0; +} + + +UINT WINAPI midiOutCachePatches(HMIDIOUT hMidiOut, + UINT uBank, WORD FAR* lpwPatchArray, UINT uFlags) +{ + printf("midiOutCachePatches\n"); + return 0; +} + + +UINT WINAPI midiOutCacheDrumPatches(HMIDIOUT hMidiOut, + UINT uPatch, WORD FAR* lpwKeyArray, UINT uFlags) +{ + printf("midiOutCacheDrumPatches\n"); + return 0; +} + + +UINT WINAPI midiOutGetID(HMIDIOUT hMidiOut, UINT FAR* lpuDeviceID) +{ + printf("midiOutGetID\n"); + return 0; +} + + +DWORD WINAPI midiOutMessage(HMIDIOUT hMidiOut, UINT uMessage, DWORD dw1, DWORD dw2) +{ + printf("midiOutMessage\n"); + return 0; +} + + + + +UINT WINAPI midiInGetNumDevs(void) +{ + printf("midiInGetNumDevs\n"); + return 0; +} + + + +UINT WINAPI midiInGetDevCaps(UINT uDeviceID, + LPMIDIINCAPS lpCaps, UINT uSize) +{ + printf("midiInGetDevCaps\n"); + return 0; +} + + + +UINT WINAPI midiInGetErrorText(UINT uError, LPSTR lpText, UINT uSize) +{ + printf("midiInGetErrorText\n"); + return (midiGetErrorText(uError, lpText, uSize)); +} + + + +UINT WINAPI midiInOpen(HMIDIIN FAR* lphMidiIn, UINT uDeviceID, + DWORD dwCallback, DWORD dwInstance, DWORD dwFlags) +{ + printf("midiInOpen\n"); + return 0; +} + + + +UINT WINAPI midiInClose(HMIDIIN hMidiIn) +{ + printf("midiInClose\n"); + return 0; +} + + + + +UINT WINAPI midiInGetID(HMIDIIN hMidiIn, UINT FAR* lpuDeviceID) +{ + printf("midiInGetID\n"); + return 0; +} + + + +UINT WINAPI midiInPrepareHeader(HMIDIIN hMidiIn, + MIDIHDR FAR* lpMidiInHdr, UINT uSize) +{ + printf("midiInPrepareHeader\n"); + return 0; +} + + + +UINT WINAPI midiInUnprepareHeader(HMIDIIN hMidiIn, + MIDIHDR FAR* lpMidiInHdr, UINT uSize) +{ + printf("midiInUnprepareHeader\n"); + return 0; +} + + + +UINT WINAPI midiInAddBuffer(HMIDIIN hMidiIn, + MIDIHDR FAR* lpMidiInHdr, UINT uSize) +{ + printf("midiInAddBuffer\n"); + return 0; +} + + +UINT WINAPI midiInStart(HMIDIIN hMidiIn) +{ + printf("midiInStart\n"); + return 0; +} + + +UINT WINAPI midiInStop(HMIDIIN hMidiIn) +{ +printf("midiInStop\n"); +return 0; +} + + + +UINT WINAPI midiInReset(HMIDIIN hMidiIn) +{ +printf("midiInReset\n"); +return 0; +} + + + +UINT WINAPI waveOutGetNumDevs() +{ +printf("waveOutGetNumDevs\n"); +return 0; +} + + + +UINT WINAPI waveOutGetDevCaps(UINT uDeviceID, WAVEOUTCAPS FAR* lpCaps, UINT uSize) +{ +printf("waveOutGetDevCaps\n"); +return 0; +} + + +UINT WINAPI waveOutGetErrorText(UINT uError, LPSTR lpText, UINT uSize) +{ + printf("waveOutGetErrorText\n"); + return(waveGetErrorText(uError, lpText, uSize)); +} + + +UINT WINAPI waveGetErrorText(UINT uError, LPSTR lpText, UINT uSize) +{ + if ((lpText == NULL) || (uSize < 1)) return(FALSE); + lpText[0] = '\0'; + switch(uError) + { + case MMSYSERR_NOERROR: + sprintf(lpText, "The specified command was carried out."); + break; + case MMSYSERR_ERROR: + sprintf(lpText, "Undefined external error."); + break; + case MMSYSERR_BADDEVICEID: + sprintf(lpText, "A device ID has been used that is out of range for your system."); + break; + case MMSYSERR_NOTENABLED: + sprintf(lpText, "The driver was not enabled."); + break; + case MMSYSERR_ALLOCATED: + sprintf(lpText, "The specified device is already in use. Wait until it is free, and then try again."); + break; + case MMSYSERR_INVALHANDLE: + sprintf(lpText, "The specified device handle is invalid."); + break; + case MMSYSERR_NODRIVER: + sprintf(lpText, "There is no driver installed on your system !\n"); + break; + case MMSYSERR_NOMEM: + sprintf(lpText, "Not enough memory available for this task. Quit one or more applications to increase available memory, and then try again."); + break; + case MMSYSERR_NOTSUPPORTED: + sprintf(lpText, "This function is not supported. Use the Capabilities function to determine which functions and messages the driver supports."); + break; + case MMSYSERR_BADERRNUM: + sprintf(lpText, "An error number was specified that is not defined in the system."); + break; + case MMSYSERR_INVALFLAG: + sprintf(lpText, "An invalid flag was passed to a system function."); + break; + case MMSYSERR_INVALPARAM: + sprintf(lpText, "An invalid parameter was passed to a system function."); + break; + case WAVERR_BADFORMAT: + sprintf(lpText, "The specified format is not supported or cannot be translated. Use the Capabilities function to determine the supported formats"); + break; + case WAVERR_STILLPLAYING: + sprintf(lpText, "Cannot perform this operation while media data is still playing. Reset the device, or wait until the data is finished playing."); + break; + case WAVERR_UNPREPARED: + sprintf(lpText, "The wave header was not prepared. Use the Prepare function to prepare the header, and then try again."); + break; + case WAVERR_SYNC: + sprintf(lpText, "Cannot open the device without using the WAVE_ALLOWSYNC flag. Use the flag, and then try again."); + break; + + default: + sprintf(lpText, "Unkown MMSYSTEM Error !\n"); + break; + } + lpText[uSize - 1] = '\0'; + return(TRUE); +} + + +UINT WINAPI waveOutOpen(HWAVEOUT FAR* lphWaveOut, UINT uDeviceID, + const WAVEFORMAT FAR* lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags) +{ +printf("waveOutOpen\n"); +return 0; +} + + + +UINT WINAPI waveOutClose(HWAVEOUT hWaveOut) +{ +printf("waveOutClose\n"); +return 0; +} + + + +UINT WINAPI waveOutPrepareHeader(HWAVEOUT hWaveOut, + WAVEHDR FAR* lpWaveOutHdr, UINT uSize) +{ +printf("waveOutPrepareHeader\n"); +return 0; +} + + + +UINT WINAPI waveOutUnprepareHeader(HWAVEOUT hWaveOut, + WAVEHDR FAR* lpWaveOutHdr, UINT uSize) +{ +printf("waveOutUnprepareHeader\n"); +return 0; +} + + + +UINT WINAPI waveOutWrite(HWAVEOUT hWaveOut, WAVEHDR FAR* lpWaveOutHdr, UINT uSize) +{ +printf("waveOutWrite\n"); +return 0; +} + + +UINT WINAPI waveOutPause(HWAVEOUT hWaveOut) +{ +printf("waveOutPause\n"); +return 0; +} + + +UINT WINAPI waveOutRestart(HWAVEOUT hWaveOut) +{ +printf("waveOutRestart\n"); +return 0; +} + + +UINT WINAPI waveOutReset(HWAVEOUT hWaveOut) +{ +printf("waveOutReset\n"); +return 0; +} + + + +UINT WINAPI waveOutGetPosition(HWAVEOUT hWaveOut, MMTIME FAR* lpInfo, UINT uSize) +{ +printf("waveOutGetPosition\n"); +return 0; +} + + + +UINT WINAPI waveOutGetVolume(UINT uDeviceID, DWORD FAR* lpdwVolume) +{ +printf("waveOutGetVolume\n"); +return 0; +} + + +UINT WINAPI waveOutSetVolume(UINT uDeviceID, DWORD dwVolume) +{ +printf("waveOutSetVolume\n"); +return 0; +} + + + +UINT WINAPI waveOutGetID(HWAVEOUT hWaveOut, UINT FAR* lpuDeviceID) +{ +printf("waveOutGetID\n"); +return 0; +} + + + +UINT WINAPI waveOutGetPitch(HWAVEOUT hWaveOut, DWORD FAR* lpdwPitch) +{ +printf("waveOutGetPitch\n"); +return 0; +} + + + +UINT WINAPI waveOutSetPitch(HWAVEOUT hWaveOut, DWORD dwPitch) +{ +printf("waveOutSetPitch\n"); +return 0; +} + + +UINT WINAPI waveOutGetPlaybackRate(HWAVEOUT hWaveOut, DWORD FAR* lpdwRate) +{ +printf("waveOutGetPlaybackRate\n"); +return 0; +} + + + +UINT WINAPI waveOutSetPlaybackRate(HWAVEOUT hWaveOut, DWORD dwRate) +{ +printf("waveOutSetPlaybackRate\n"); +return 0; +} + + + + +UINT WINAPI waveOutBreakLoop(HWAVEOUT hWaveOut) +{ +printf("waveOutBreakLoop\n"); +return 0; +} + + + +UINT WINAPI waveInGetNumDevs() +{ +printf("waveInGetNumDevs\n"); +return 0; +} + + +UINT WINAPI waveInGetDevCaps(UINT uDeviceID, WAVEINCAPS FAR* lpCaps, UINT uSize) +{ +printf("waveInGetDevCaps\n"); +return 0; +} + + +UINT WINAPI waveInGetErrorText(UINT uError, LPSTR lpText, UINT uSize) +{ + printf("waveInGetErrorText\n"); + return(waveGetErrorText(uError, lpText, uSize)); +} + + +UINT WINAPI waveInOpen(HWAVEIN FAR* lphWaveIn, UINT uDeviceID, + const WAVEFORMAT FAR* lpFormat, DWORD dwCallback, DWORD dwInstance, DWORD dwFlags) +{ +printf("waveInOpen\n"); +return 0; +} + + +UINT WINAPI waveInClose(HWAVEIN hWaveIn) +{ +printf("waveInClose\n"); +return 0; +} + + +UINT WINAPI waveInPrepareHeader(HWAVEIN hWaveIn, + WAVEHDR FAR* lpWaveInHdr, UINT uSize) +{ +printf("waveInPrepareHeader\n"); +return 0; +} + + +UINT WINAPI waveInUnprepareHeader(HWAVEIN hWaveIn, + WAVEHDR FAR* lpWaveInHdr, UINT uSize) +{ +printf("waveInUnprepareHeader\n"); +return 0; +} + + + +UINT WINAPI waveInAddBuffer(HWAVEIN hWaveIn, + WAVEHDR FAR* lpWaveInHdr, UINT uSize) +{ +printf("waveInAddBuffer\n"); +return 0; +} + +UINT WINAPI waveInReset(HWAVEIN hWaveIn) +{ +printf("waveInReset\n"); +return 0; +} + + +UINT WINAPI waveInStart(HWAVEIN hWaveIn) +{ +printf("waveInStart\n"); +return 0; +} + + +UINT WINAPI waveInStop(HWAVEIN hWaveIn) +{ +printf("waveInStop\n"); +return 0; +} + + + +UINT WINAPI waveInGetPosition(HWAVEIN hWaveIn, MMTIME FAR* lpInfo, UINT uSize) +{ +printf("waveInGetPosition\n"); +return 0; +} + + +UINT WINAPI waveInGetID(HWAVEIN hWaveIn, UINT FAR* lpuDeviceID) +{ +printf("waveInGetID\n"); +return 0; +} + + +/* +UINT WINAPI mciGetDeviceIDFromElementID (DWORD dwElementID, + LPCSTR lpstrType); + +BOOL WINAPI mciSetYieldProc (UINT uDeviceID, YIELDPROC fpYieldProc, + DWORD dwYieldData); + +HTASK WINAPI mciGetCreatorTask(UINT uDeviceID); +YIELDPROC WINAPI mciGetYieldProc (UINT uDeviceID, DWORD FAR* lpdwYieldData); + + +FOURCC WINAPI mmioStringToFOURCC(LPCSTR sz, UINT uFlags); +LPMMIOPROC WINAPI mmioInstallIOProc(FOURCC fccIOProc, LPMMIOPROC pIOProc, + DWORD dwFlags); +UINT WINAPI mmioGetInfo(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags); +UINT WINAPI mmioSetInfo(HMMIO hmmio, const MMIOINFO FAR* lpmmioinfo, UINT uFlags); +UINT WINAPI mmioSetBuffer(HMMIO hmmio, LPSTR pchBuffer, LONG cchBuffer, + UINT uFlags); +UINT WINAPI mmioFlush(HMMIO hmmio, UINT uFlags); +UINT WINAPI mmioAdvance(HMMIO hmmio, MMIOINFO FAR* lpmmioinfo, UINT uFlags); +LRESULT WINAPI mmioSendMessage(HMMIO hmmio, UINT uMessage, + LPARAM lParam1, LPARAM lParam2); +UINT WINAPI mmioDescend(HMMIO hmmio, MMCKINFO FAR* lpck, + const MMCKINFO FAR* lpckParent, UINT uFlags); +UINT WINAPI mmioAscend(HMMIO hmmio, MMCKINFO FAR* lpck, UINT uFlags); +UINT WINAPI mmioCreateChunk(HMMIO hmmio, MMCKINFO FAR* lpck, UINT uFlags); + +DWORD WINAPI midiInMessage(HMIDIIN hMidiIn, UINT uMessage, DWORD dw1, DWORD dw2); + + +DWORD WINAPI waveOutMessage(HWAVEOUT hWaveOut, UINT uMessage, DWORD dw1, DWORD dw2); + +UINT WINAPI waveInAddBuffer(HWAVEIN hWaveIn, + WAVEHDR FAR* lpWaveInHdr, UINT uSize); +DWORD WINAPI waveInMessage(HWAVEIN hWaveIn, UINT uMessage, DWORD dw1, DWORD dw2); + +*/ + diff --git a/misc/network.c b/misc/network.c new file mode 100644 index 00000000000..60a4bb34ba6 --- /dev/null +++ b/misc/network.c @@ -0,0 +1,119 @@ +/* + * Network functions + */ + +#include "stdio.h" +#include "windows.h" +#include "win.h" +#include "user.h" + +#define WN_SUCCESS 0x0000 +#define WN_NOT_SUPPORTED 0x0001 +#define WN_NET_ERROR 0x0002 +#define WN_MORE_DATA 0x0003 +#define WN_BAD_POINTER 0x0004 +#define WN_BAD_VALUE 0x0005 +#define WN_BAD_PASSWORD 0x0006 +#define WN_ACCESS_DENIED 0x0007 +#define WN_FUNCTION_BUSY 0x0008 +#define WN_WINDOWS_ERROR 0x0009 +#define WN_BAD_USER 0x000A +#define WN_OUT_OF_MEMORY 0x000B +#define WN_CANCEL 0x000C +#define WN_CONTINUE 0x000D +#define WN_NOT_CONNECTED 0x0030 +#define WN_OPEN_FILES 0x0031 +#define WN_BAD_NETNAME 0x0032 +#define WN_BAD_LOCALNAME 0x0033 +#define WN_ALREADY_CONNECTED 0x0034 +#define WN_DEVICE_ERROR 0x0035 +#define WN_CONNECTION_CLOSED 0x0036 + +typedef LPSTR LPNETRESOURCE; + +/************************************************************************** + * WNetGetConnection [USER.512] + */ +int WNetGetConnection(LPSTR lpLocalName, + LPSTR lpRemoteName, UINT FAR *cbRemoteName) +{ + printf("EMPTY STUB !!! WNetGetConnection('%s', %08X, %08X);\n", + lpLocalName, lpRemoteName, cbRemoteName); + return WN_NET_ERROR; +} + +/************************************************************************** + * WNetGetUser [USER.516] + */ +UINT WNetGetUser(LPSTR lpLocalName, LPSTR lpUserName, DWORD *lpSize) +{ + printf("EMPTY STUB !!! WNetGetUser('%s', %08X, %08X);\n", + lpLocalName, lpUserName, lpSize); + return WN_NET_ERROR; +} + +/************************************************************************** + * WNetAddConnection [USER.517] + */ +UINT WNetAddConnection(LPSTR lpNetPath, LPSTR lpPassWord, LPSTR lpLocalName) +{ + printf("EMPTY STUB !!! WNetAddConnection('%s', %08X, '%s');\n", + lpNetPath, lpPassWord, lpLocalName); + return WN_NET_ERROR; +} + + +/************************************************************************** + * WNetCancelConnection [USER.518] + */ +UINT WNetCancelConnection(LPSTR lpName, BOOL bForce) +{ + printf("EMPTY STUB !!! WNetCancelConnection('%s', %04X);\n", + lpName, bForce); + return WN_NET_ERROR; +} + +/************************************************************************** + * WNetAddConnection2 [USER.???] + */ +UINT WNetAddConnection2(LPSTR lpNetPath, LPSTR lpPassWord, + LPSTR lpLocalName, LPSTR lpUserName) +{ + printf("EMPTY STUB !!! WNetAddConnection2('%s', %08X, '%s', '%s');\n", + lpNetPath, lpPassWord, lpLocalName, lpUserName); + return WN_NET_ERROR; +} + +/************************************************************************** + * WNetCloseEnum [USER.???] + */ +UINT WNetCloseEnum(HANDLE hEnum) +{ + printf("EMPTY STUB !!! WNetCloseEnum(%04X);\n", hEnum); + return WN_NET_ERROR; +} + +/************************************************************************** + * WNetEnumResource [USER.???] + */ +UINT WNetEnumResource(HANDLE hEnum, DWORD cRequ, + DWORD *lpCount, LPVOID lpBuf) +{ + printf("EMPTY STUB !!! WNetEnumResource(%04X, %08X, %08X, %08X);\n", + hEnum, cRequ, lpCount, lpBuf); + return WN_NET_ERROR; +} + +/************************************************************************** + * WNetOpenEnum [USER.???] + */ +UINT WNetOpenEnum(DWORD dwScope, DWORD dwType, + LPNETRESOURCE lpNet, HANDLE FAR *lphEnum) +{ + printf("EMPTY STUB !!! WNetOpenEnum(%08X, %08X, %08X, %08X);\n", + dwScope, dwType, lpNet, lphEnum); + return WN_NET_ERROR; +} + + + diff --git a/misc/profile.c b/misc/profile.c index 377924ade21..84cf8f52397 100644 --- a/misc/profile.c +++ b/misc/profile.c @@ -64,15 +64,34 @@ static TSecHeader *is_loaded (char *FileName) return 0; } -static TSecHeader *load (char *file) +static char *GetIniFileName(char *name) +{ + char temp[256]; + + if (strchr(name, '/')) + return name; + + if (strchr(name, '\\')) + return GetUnixFileName(name); + + GetWindowsDirectory(temp, sizeof(temp) ); + strcat(temp, "\\"); + strcat(temp, name); + + return GetUnixFileName(name); +} + +static TSecHeader *load (char *filename) { FILE *f; int state; TSecHeader *SecHeader = 0; char CharBuffer [STRSIZE]; - char *next; + char *next, *file; char c; - + + file = GetIniFileName(filename); + #ifdef DEBUG printf("Load %s\n", file); #endif @@ -82,6 +101,8 @@ static TSecHeader *load (char *file) #ifdef DEBUG printf("Loading %s\n", file); #endif + + state = FirstBrace; while ((c = getc (f)) != EOF){ if (c == '\r') /* Ignore Carriage Return */ @@ -337,13 +358,13 @@ static void dump_profile (TProfile *p) if (!p) return; dump_profile (p->link); - if ((profile = fopen (p->FileName, "w")) != NULL){ + if ((profile = fopen (GetIniFileName(p->FileName), "w")) != NULL){ dump_sections (profile, p->Section); fclose (profile); } } -void sync_profiles () +void sync_profiles (void) { dump_profile (Base); } diff --git a/misc/property.c b/misc/property.c new file mode 100644 index 00000000000..55abcb925b9 --- /dev/null +++ b/misc/property.c @@ -0,0 +1,197 @@ +/* + * Windows Properties Functions + */ +static char Copyright[] = "Copyright Martin Ayotte, 1994"; + +#define DEBUG_PROP + +#include +#include +#include +#include +#include "windows.h" +#include "heap.h" +#include "win.h" + +typedef struct { + LPSTR PropName; + WORD Atom; + HANDLE hData; + void *lpPrevProp; + void *lpNextProp; +} PROPENTRY; +typedef PROPENTRY *LPPROPENTRY; + + +/************************************************************************* + * RemoveProp [USER.24] + */ +HANDLE RemoveProp(HWND hWnd, LPSTR lpStr) +{ + WND *wndPtr; + LPPROPENTRY lpProp; + HANDLE hOldData; +#ifdef DEBUG_PROP + if (((DWORD)lpStr & 0xFFFF0000) == 0L) + printf("RemoveProp(%04X, Atom %04X)\n", hWnd, LOWORD((DWORD)lpStr)); + else + printf("RemoveProp(%04X, '%s')\n", hWnd, lpStr); +#endif + wndPtr = WIN_FindWndPtr(hWnd); + if (wndPtr == NULL) { + printf("RemoveProp // Bad Window handle !\n"); + return FALSE; + } + lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp); + if (lpProp == NULL) return 0; + while (TRUE) { + if (strcmp(lpProp->PropName, lpStr) == 0) { + printf("RemoveProp // Property found ! hData=%04X\n", lpProp->hData); + hOldData = lpProp->hData; + if (lpProp->lpPrevProp != NULL) + ((LPPROPENTRY)lpProp->lpPrevProp)->lpNextProp = + lpProp->lpNextProp; + if (lpProp->lpNextProp != NULL) + ((LPPROPENTRY)lpProp->lpNextProp)->lpPrevProp = + lpProp->lpPrevProp; + free(lpProp->PropName); + free(lpProp); + GlobalUnlock(wndPtr->hProp); + return hOldData; + } + if (lpProp->lpNextProp == NULL) break; + lpProp = lpProp->lpNextProp; + } + GlobalUnlock(wndPtr->hProp); + printf("RemoveProp // Property not found !\n"); + return 0; +} + + +/************************************************************************* + * GetProp [USER.25] + */ +HANDLE GetProp(HWND hWnd, LPSTR lpStr) +{ + WND *wndPtr; + LPPROPENTRY lpProp; +#ifdef DEBUG_PROP + if (((DWORD)lpStr & 0xFFFF0000) == 0L) + printf("GetProp(%04X, Atom %04X)\n", hWnd, LOWORD((DWORD)lpStr)); + else + printf("GetProp(%04X, '%s')\n", hWnd, lpStr); +#endif + wndPtr = WIN_FindWndPtr(hWnd); + if (wndPtr == NULL) { + printf("GetProp // Bad Window handle !\n"); + return FALSE; + } + lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp); + if (lpProp == NULL) return 0; + while (TRUE) { + if ((((DWORD)lpStr & 0xFFFF0000) == 0L && + lpProp->Atom == LOWORD((DWORD)lpStr)) || + (((DWORD)lpStr & 0xFFFF0000) != 0L && + strcmp(lpProp->PropName, lpStr) == 0)) { + printf("GetProp // Property found ! hData=%04X\n", lpProp->hData); + GlobalUnlock(wndPtr->hProp); + return lpProp->hData; + } + if (lpProp->lpNextProp == NULL) break; + lpProp = lpProp->lpNextProp; + } + printf("GetProp // Property not found !\n"); + GlobalUnlock(wndPtr->hProp); + return 0; +} + + +/************************************************************************* + * SetProp [USER.26] + */ +BOOL SetProp(HWND hWnd, LPSTR lpStr, HANDLE hData) +{ + WND *wndPtr; + HANDLE hNewProp; + LPPROPENTRY lpNewProp; + LPPROPENTRY lpProp; +#ifdef DEBUG_PROP + if (((DWORD)lpStr & 0xFFFF0000) == 0L) + printf("SetProp(%04X, Atom %04X, %04X)\n", + hWnd, LOWORD((DWORD)lpStr), hData); + else + printf("SetProp(%04X, '%s', %04X)\n", hWnd, lpStr, hData); +#endif + wndPtr = WIN_FindWndPtr(hWnd); + if (wndPtr == NULL) { + printf("SetProp // Bad Window handle !\n"); + return FALSE; + } + lpProp = (LPPROPENTRY) GlobalLock(wndPtr->hProp); + if (lpProp != NULL) { + while (TRUE) { + if (strcmp(lpProp->PropName, lpStr) == 0) { +#ifdef DEBUG_PROP + printf("SetProp // change already exinsting property !\n"); +#endif + lpProp->hData = hData; + GlobalUnlock(wndPtr->hProp); + return TRUE; + } + if (lpProp->lpNextProp == NULL) break; + lpProp = lpProp->lpNextProp; + } + } + hNewProp = GlobalAlloc(GMEM_MOVEABLE, sizeof(PROPENTRY)); + lpNewProp = (LPPROPENTRY) GlobalLock(hNewProp); + if (lpNewProp == NULL) { + printf("SetProp // Can't allocate Property entry !\n"); + GlobalUnlock(wndPtr->hProp); + return FALSE; + } +#ifdef DEBUG_PROP + printf("SetProp // entry allocated %08X\n", lpNewProp); +#endif + if (lpProp == NULL) { + wndPtr->hProp = hNewProp; + lpNewProp->lpPrevProp = NULL; +#ifdef DEBUG_PROP + printf("SetProp // first entry \n"); +#endif + } + else { + lpProp->lpNextProp = lpNewProp; + lpNewProp->lpPrevProp = lpProp; + } + lpNewProp->lpNextProp = NULL; + lpNewProp->hData = hData; + if (((DWORD)lpStr & 0xFFFF0000) == 0L) { + lpNewProp->PropName = NULL; + lpNewProp->Atom = LOWORD((DWORD)lpStr); + } + else { + lpNewProp->Atom = 0; + lpNewProp->PropName = malloc(strlen(lpStr)); + if (lpNewProp->PropName == NULL) { + printf("SetProp // Can't allocate memory for Property Name !\n"); + GlobalUnlock(wndPtr->hProp); + return FALSE; + } + strcpy(lpNewProp->PropName, lpStr); + } + GlobalUnlock(hNewProp); + GlobalUnlock(wndPtr->hProp); + return TRUE; +} + + +/************************************************************************* + * EnumProps [USER.27] + */ +int EnumProps(HWND hWnd, FARPROC lpEnumFunc) +{ + printf("EMPTY STUB !!! EnumProps(%04X, %08X)\n", hWnd, lpEnumFunc); + return -1; +} + + diff --git a/misc/shell.c b/misc/shell.c new file mode 100644 index 00000000000..f60d9ff17a3 --- /dev/null +++ b/misc/shell.c @@ -0,0 +1,71 @@ +/* + * Shell Library Functions + */ + +#include +#include +#include +#include +#include "windows.h" + + +/************************************************************************* + * RegOpenKey [SHELL.1] + */ +int RegOpenKey(void) +{ + printf("RegOpenKey : Empty Stub !!!\n"); +} + +/************************************************************************* + * RegCreateKey [SHELL.2] + */ +int RegCreateKey(void) +{ + printf("RegCreateKey : Empty Stub !!!\n"); +} + +/************************************************************************* + * RegCloseKey [SHELL.3] + */ +int RegCloseKey(void) +{ + printf("RegCloseKey : Empty Stub !!!\n"); +} + +/************************************************************************* + * RegDeleteKey [SHELL.4] + */ +int RegDeleteKey(void) +{ + printf("RegDeleteKey : Empty Stub !!!\n"); +} + + +/************************************************************************* + * ShellExecute [SHELL.20] + */ +int ShellExecute(LPSTR ptr) +{ + printf("ShellExecute : Empty Stub !!!\n"); +} + + +/************************************************************************* + * RegisterShellHook [SHELL.102] + */ +int RegisterShellHook(void *ptr) +{ + printf("RegisterShellHook : Empty Stub !!!\n"); +} + +/************************************************************************* + * ShellHookProc [SHELL.103] + */ +int ShellHookProc(void) +{ + printf("ShellHookProc : Empty Stub !!!\n"); +} + + + diff --git a/misc/spy.c b/misc/spy.c index bfc0042d89d..c52db357809 100644 --- a/misc/spy.c +++ b/misc/spy.c @@ -104,8 +104,17 @@ const char *MessageTypeNames[SPY_MAX_MSGNUM + 1] = NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, /* 0x00A0 */ - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, - NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, + "WM_NCMOUSEMOVE", /* 0x00A0 */ + "WM_NCLBUTTONDOWN", /* 0x00A1 */ + "WM_NCLBUTTONUP", /* 0x00A2 */ + "WM_NCLBUTTONDBLCLK", /* 0x00A3 */ + "WM_NCRBUTTONDOWN", /* 0x00A4 */ + "WM_NCRBUTTONUP", /* 0x00A5 */ + "WM_NCRBUTTONDBLCLK", /* 0x00A6 */ + "WM_NCMBUTTONDOWN", /* 0x00A7 */ + "WM_NCMBUTTONUP", /* 0x00A8 */ + "WM_NCMBUTTONDBLCLK", /* 0x00A9 */ + NULL, NULL, NULL, NULL, NULL, NULL, /* 0x00B0 */ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, @@ -248,7 +257,7 @@ void SpyMessage(HWND hwnd, WORD msg, WORD wParam, LONG lParam) return; if (msg > SPY_MAX_MSGNUM || MessageTypeNames[msg] == NULL) - msg_name[0] = '\0'; + sprintf(msg_name, "%04x", msg); else strcpy(msg_name, MessageTypeNames[msg]); diff --git a/misc/winsocket.c b/misc/winsocket.c index 0d520db709e..ea56ca873ce 100644 --- a/misc/winsocket.c +++ b/misc/winsocket.c @@ -11,112 +11,206 @@ #include #include #include +#include #include #include #include +#include "heap.h" #include "winsock.h" #define DEBUG_WINSOCK -/* XXX per task */ -WORD wsa_errno; -int wsa_initted; +static WORD wsa_errno; +static int wsa_initted; -WORD errno_to_wsaerrno(int errno) +#define dump_sockaddr(a) \ + fprintf(stderr, "sockaddr_in: family %d, address %s, port %d\n", \ + ((struct sockaddr_in *)a)->sin_family, \ + inet_ntoa(((struct sockaddr_in *)a)->sin_addr), \ + ntohs(((struct sockaddr_in *)a)->sin_port)) + +struct WinSockHeap { + char ntoa_buffer[32]; + + struct hostent hostent_addr; + struct hostent hostent_name; + struct protoent protoent_name; + struct protoent protoent_number; + struct servent servent_name; + struct servent servent_port; + + struct hostent WSAhostent_addr; + struct hostent WSAhostent_name; + struct protoent WSAprotoent_name; + struct protoent WSAprotoent_number; + struct servent WSAservent_name; + struct servent WSAservent_port; +}; + +static struct WinSockHeap *heap; + +static WORD wsaerrno(void) { - switch(errno) { - case ENETDOWN: - return WSAENETDOWN; - case EAFNOSUPPORT: - return WSAEAFNOSUPPORT; - case EMFILE: - return WSAEMFILE; - case ENOBUFS: - return WSAENOBUFS; - case EPROTONOSUPPORT: - return EPROTONOSUPPORT; - case EPROTOTYPE: - return WSAEPROTOTYPE; - case EBADF: - case ENOTSOCK: - return WSAENOTSOCK; - - default: +#ifdef DEBUG_WINSOCK #ifndef sun #if defined(__FreeBSD__) - fprintf(stderr, "winsock: errno_to_wsaerrno translation failure.\n\t: %s (%d)\n", - sys_errlist[errno], errno); + fprintf(stderr, "winsock: errno %d, (%s).\n", + errno, sys_errlist[errno]); #else - fprintf(stderr, "winsock: errno_to_wsaerrno translation failure.\n\t: %s (%d)\n", - strerror[errno], errno); + fprintf(stderr, "winsock: errno %d, (%s).\n", + errno, strerror(errno)); #endif #else - fprintf (stderr, "winsock: errno_to_wsaerrno translation failure.\n"); + fprintf(stderr, "winsock: errno %d\n", errno); #endif - return WSAENETDOWN; - } +#endif + + switch(errno) + { + case EINTR: return WSAEINTR; + case EACCES: return WSAEACCES; + case EFAULT: return WSAEFAULT; + case EINVAL: return WSAEINVAL; + case EMFILE: return WSAEMFILE; + case EWOULDBLOCK: return WSAEWOULDBLOCK; + case EINPROGRESS: return WSAEINPROGRESS; + case EALREADY: return WSAEALREADY; + case EBADF: + case ENOTSOCK: return WSAENOTSOCK; + case EDESTADDRREQ: return WSAEDESTADDRREQ; + case EMSGSIZE: return WSAEMSGSIZE; + case EPROTOTYPE: return WSAEPROTOTYPE; + case ENOPROTOOPT: return WSAENOPROTOOPT; + case EPROTONOSUPPORT: return WSAEPROTONOSUPPORT; + case ESOCKTNOSUPPORT: return WSAESOCKTNOSUPPORT; + case EOPNOTSUPP: return WSAEOPNOTSUPP; + case EPFNOSUPPORT: return WSAEPFNOSUPPORT; + case EAFNOSUPPORT: return WSAEAFNOSUPPORT; + case EADDRINUSE: return WSAEADDRINUSE; + case EADDRNOTAVAIL: return WSAEADDRNOTAVAIL; + case ENETDOWN: return WSAENETDOWN; + case ENETUNREACH: return WSAENETUNREACH; + case ENETRESET: return WSAENETRESET; + case ECONNABORTED: return WSAECONNABORTED; + case ECONNRESET: return WSAECONNRESET; + case ENOBUFS: return WSAENOBUFS; + case EISCONN: return WSAEISCONN; + case ENOTCONN: return WSAENOTCONN; + case ESHUTDOWN: return WSAESHUTDOWN; + case ETOOMANYREFS: return WSAETOOMANYREFS; + case ETIMEDOUT: return WSAETIMEDOUT; + case ECONNREFUSED: return WSAECONNREFUSED; + case ELOOP: return WSAELOOP; + case ENAMETOOLONG: return WSAENAMETOOLONG; + case EHOSTDOWN: return WSAEHOSTDOWN; + case EHOSTUNREACH: return WSAEHOSTUNREACH; + case ENOTEMPTY: return WSAENOTEMPTY; +/* case EPROCLIM: return WSAEPROCLIM; */ + case EUSERS: return WSAEUSERS; + case EDQUOT: return WSAEDQUOT; + case ESTALE: return WSAESTALE; + case EREMOTE: return WSAEREMOTE; + + default: + fprintf(stderr, "winsock: unknown error!\n"); + return WSAEOPNOTSUPP; + } +} + +static WORD errno_to_wsaerrno(void) +{ + wsa_errno = wsaerrno(); } -SOCKET Winsock_accept(SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen) +SOCKET Winsock_accept(SOCKET s, struct sockaddr FAR *addr, INT FAR *addrlen) { int sock; - if ((sock = accept(s, addr, addrlen)) < 0) { - wsa_errno = errno_to_wsaerrno(errno); +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_accept: socket %d, ptr %8x, length %d\n", s, (int) addr, addrlen); +#endif + + if ((sock = accept(s, addr, (int *) addrlen)) < 0) { + errno_to_wsaerrno(); return INVALID_SOCKET; } return sock; } -int Winsock_bind(SOCKET s, struct sockaddr FAR *name, int namelen) +INT Winsock_bind(SOCKET s, struct sockaddr FAR *name, INT namelen) { +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_bind: socket %d, ptr %8x, length %d\n", s, (int) name, namelen); + dump_sockaddr(name); +#endif + if (bind(s, name, namelen) < 0) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return SOCKET_ERROR; } return 0; } -int Winsock_closesocket(SOCKET s) +INT Winsock_closesocket(SOCKET s) { +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_closesocket: socket %d\n", s); +#endif + if (close(s) < 0) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return SOCKET_ERROR; } return 0; } -int Winsock_connect(SOCKET s, struct sockaddr FAR *name, int namelen) +INT Winsock_connect(SOCKET s, struct sockaddr FAR *name, INT namelen) { +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_connect: socket %d, ptr %8x, length %d\n", s, (int) name, namelen); + dump_sockaddr(name); +#endif + if (connect(s, name, namelen) < 0) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return SOCKET_ERROR; } return 0; } -int Winsock_getpeername(SOCKET s, struct sockaddr FAR *name, int FAR *namelen) +INT Winsock_getpeername(SOCKET s, struct sockaddr FAR *name, INT FAR *namelen) { - if (getpeername(s, name, namelen) < 0) { - wsa_errno = errno_to_wsaerrno(errno); +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_getpeername: socket: %d, ptr %8x, ptr %8x\n", s, (int) name, *namelen); + dump_sockaddr(name); +#endif + + if (getpeername(s, name, (int *) namelen) < 0) { + errno_to_wsaerrno(); return SOCKET_ERROR; } return 0; } -int Winsock_getsockname(SOCKET s, struct sockaddr FAR *name, int FAR *namelen) +INT Winsock_getsockname(SOCKET s, struct sockaddr FAR *name, INT FAR *namelen) { - if (getsockname(s, name, namelen) < 0) { - wsa_errno = errno_to_wsaerrno(errno); +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_getsockname: socket: %d, ptr %8x, ptr %8x\n", s, (int) name, (int) *namelen); +#endif + if (getsockname(s, name, (int *) namelen) < 0) { + errno_to_wsaerrno(); return SOCKET_ERROR; } return 0; } -int Winsock_getsockopt(SOCKET s, int loptname, char FAR *optval, int FAR *optlen) +INT Winsock_getsockopt(SOCKET s, INT loptname, char FAR *optval, INT FAR *optlen) { - if (getsockopt(s, 0, loptname, optval, optlen) < 0) { - wsa_errno = errno_to_wsaerrno(errno); +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_getsockopt: socket: %d, opt %d, ptr %8x, ptr %8x\n", s, loptname, (int) optval, (int) *optlen); +#endif + if (getsockopt(s, 0, (int) loptname, optval, (int *) optlen) < 0) { + errno_to_wsaerrno(); return SOCKET_ERROR; } return 0; @@ -141,26 +235,41 @@ char *Winsock_inet_ntoa(struct in_addr in) { char *s; +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_inet_ntoa: %8x\n", in); +#endif + if ((s = inet_ntoa(in)) == NULL) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return NULL; } - return s; + + strncpy(heap->ntoa_buffer, s, sizeof(heap->ntoa_buffer) ); + + return (char *) &heap->ntoa_buffer; } -int Winsock_ioctlsocket(SOCKET s, long cmd, u_long FAR *argp) +INT Winsock_ioctlsocket(SOCKET s, long cmd, u_long FAR *argp) { +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_ioctl: socket %d, cmd %d, ptr %8x\n", s, cmd, (int) argp); +#endif + if (ioctl(s, cmd, argp) < 0) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return SOCKET_ERROR; } return 0; } -int Winsock_listen(SOCKET s, int backlog) +INT Winsock_listen(SOCKET s, INT backlog) { +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_listen: socket %d, backlog %d\n", s, backlog); +#endif + if (listen(s, backlog) < 0) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return SOCKET_ERROR; } return 0; @@ -176,125 +285,174 @@ u_short Winsock_ntohs(u_short netshort) return( ntohs(netshort) ); } -int Winsock_recv(SOCKET s, char FAR *buf, int len, int flags) +INT Winsock_recv(SOCKET s, char FAR *buf, INT len, INT flags) { int length; +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_recv: socket %d, ptr %8x, length %d, flags %d\n", s, (int) buf, len, flags); +#endif + if ((length = recv(s, buf, len, flags)) < 0) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return SOCKET_ERROR; } return length; } -int Winsock_recvfrom(SOCKET s, char FAR *buf, int len, int flags, +INT Winsock_recvfrom(SOCKET s, char FAR *buf, INT len, INT flags, struct sockaddr FAR *from, int FAR *fromlen) { int length; +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_recvfrom: socket %d, ptr %8x, length %d, flags %d\n", s, buf, len, flags); +#endif + if ((length = recvfrom(s, buf, len, flags, from, fromlen)) < 0) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return SOCKET_ERROR; } return length; } -int Winsock_select(int nfds, fd_set FAR *readfds, fd_set FAR *writefds, +INT Winsock_select(INT nfds, fd_set FAR *readfds, fd_set FAR *writefds, fd_set FAR *exceptfds, struct timeval FAR *timeout) { +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_select: fd # %d, ptr %8x, ptr %8x, ptr %*X\n", nfds, readfds, writefds, exceptfds); +#endif + return(select(nfds, readfds, writefds, exceptfds, timeout)); } -int Winsock_send(SOCKET s, char FAR *buf, int len, int flags) +INT Winsock_send(SOCKET s, char FAR *buf, INT len, INT flags) { int length; +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_send: socket %d, ptr %8x, length %d, flags %d\n", s, buf, len, flags); +#endif + if ((length = send(s, buf, len, flags)) < 0) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return SOCKET_ERROR; } return length; } -int Winsock_sendto(SOCKET s, char FAR *buf, int len, int flags, - struct sockaddr FAR *to, int tolen) +INT Winsock_sendto(SOCKET s, char FAR *buf, INT len, INT flags, + struct sockaddr FAR *to, INT tolen) { int length; +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_sendto: socket %d, ptr %8x, length %d, flags %d\n", s, buf, len, flags); +#endif + if ((length = sendto(s, buf, len, flags, to, tolen)) < 0) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return SOCKET_ERROR; } return length; } -int Winsock_setsockopt(SOCKET s, int level, int optname, const char FAR *optval, - int optlen) +INT Winsock_setsockopt(SOCKET s, INT level, INT optname, const char FAR *optval, + INT optlen) { +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_setsockopt: socket %d, level %d, opt %d, ptr %8x, len %d\n", s, level, optname, (int) optval, optlen); +#endif + if (setsockopt(s, level, optname, optval, optlen) < 0) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return SOCKET_ERROR; } return 0; } -int Winsock_shutdown(SOCKET s, int how) +INT Winsock_shutdown(SOCKET s, INT how) { +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_shutdown: socket s %d, how %d\n", s, how); +#endif + if (shutdown(s, how) < 0) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return SOCKET_ERROR; } return 0; } -SOCKET Winsock_socket(WORD af, WORD type, WORD protocol) +SOCKET Winsock_socket(INT af, INT type, INT protocol) { int sock; #ifdef DEBUG_WINSOCK - printf("Winsock_socket: af=%d type=%d protocol=%d\n", af, type, protocol); + fprintf(stderr, "WSA_socket: af=%d type=%d protocol=%d\n", af, type, protocol); #endif -/* let the kernel do the dirty work.. - - if (!wsa_initted) { - wsa_errno = WSANOTINITIALISED; - return INVALID_SOCKET; - } -*/ if ((sock = socket(af, type, protocol)) < 0) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_socket: failed !\n"); +#endif return INVALID_SOCKET; } + if (sock > 0xffff) { + wsa_errno = WSAEMFILE; + return INVALID_SOCKET; + } + +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_socket: fd %d\n", sock); +#endif return sock; } -struct hostent *Winsock_gethostbyaddr(const char FAR *addr, int len, int type) +struct hostent *Winsock_gethostbyaddr(const char FAR *addr, INT len, INT type) { struct hostent *host; +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_gethostbyaddr: ptr %8x, len %d, type %d\n", (int) addr, len, type); +#endif + if ((host = gethostbyaddr(addr, len, type)) == NULL) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return NULL; } - return host; + memcpy(&heap->hostent_addr, host, sizeof(struct hostent)); + + return (struct hostent *) &heap->hostent_addr; } struct hostent *Winsock_gethostbyname(const char FAR *name) { struct hostent *host; +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_gethostbyname: name %s\n", name); +#endif + if ((host = gethostbyname(name)) == NULL) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return NULL; } - return host; + memcpy(&heap->hostent_name, host, sizeof(struct hostent)); + + return (struct hostent *) &heap->hostent_name; } -int Winsock_gethostname(char FAR *name, int namelen) +int Winsock_gethostname(char FAR *name, INT namelen) { + +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_gethostname: name %d, len %d\n", name, namelen); +#endif + if (gethostname(name, namelen) < 0) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return SOCKET_ERROR; } return 0; @@ -304,125 +462,238 @@ struct protoent *Winsock_getprotobyname(char FAR *name) { struct protoent *proto; +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_getprotobyname: name %s\n", name); +#endif + if ((proto = getprotobyname(name)) == NULL) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return NULL; } - return proto; + memcpy(&heap->protoent_name, proto, sizeof(struct protoent)); + + return (struct protoent *) &heap->protoent_name; } -struct protoent *Winsock_getprotobynumber(int number) +struct protoent *Winsock_getprotobynumber(INT number) { struct protoent *proto; +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_getprotobynumber: num %d\n", number); +#endif + if ((proto = getprotobynumber(number)) == NULL) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return NULL; } - return proto; + memcpy(&heap->protoent_number, proto, sizeof(struct protoent)); + + return (struct protoent *) &heap->protoent_number; } struct servent *Winsock_getservbyname(const char FAR *name, const char FAR *proto) { struct servent *service; +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_getservbyname: name %s, proto %s\n", name, proto); +#endif + if ((service = getservbyname(name, proto)) == NULL) { - wsa_errno = errno_to_wsaerrno(errno); + errno_to_wsaerrno(); return NULL; } - return service; + memcpy(&heap->servent_name, service, sizeof(struct servent)); + + return (struct servent *) &heap->servent_name; } -struct servent *Winsock_getservbyport(int port, const char FAR *proto) +struct servent *Winsock_getservbyport(INT port, const char FAR *proto) +{ + struct servent *service; + +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_getservbyport: port %d, name %s\n", port, proto); +#endif + + if ((service = getservbyport(port, proto)) == NULL) { + errno_to_wsaerrno(); + return NULL; + } + memcpy(&heap->servent_port, service, sizeof(struct servent)); + + return (struct servent *) &heap->servent_port; +} + +/******************** winsock specific functions ************************/ + +HANDLE WSAAsyncGetHostByAddr(HWND hWnd, u_int wMsg, const char FAR *addr, + INT len, INT type, char FAR *buf, INT buflen) +{ + struct hostent *host; + + if ((host = gethostbyaddr(addr, len, type)) == NULL) { + PostMessage(hWnd, wMsg, 1, wsaerrno() << 8); + + return 1; + } + + memcpy(buf, host, buflen); + PostMessage(hWnd, wMsg, 1, 0); + + return 1; +} + +HANDLE WSAAsyncGetHostByName(HWND hWnd, u_int wMsg, const char FAR *name, + char FAR *buf, INT buflen) +{ + struct hostent *host; + + if ((host = gethostbyname(name)) == NULL) { + PostMessage(hWnd, wMsg, 2, wsaerrno() << 8); + return 2; + } + + memcpy(buf, host, buflen); + PostMessage(hWnd, wMsg, 2, 0); + + return 2; +} + +HANDLE WSAAsyncGetProtoByName(HWND hWnd, u_int wMsg, const char FAR *name, + char FAR *buf, INT buflen) +{ + struct protoent *proto; + + if ((proto = getprotobyname(name)) == NULL) { + PostMessage(hWnd, wMsg, 3, wsaerrno() << 8); + return 3; + } + + memcpy(buf, proto, buflen); + PostMessage(hWnd, wMsg, 3, 0); + + return 3; +} + +HANDLE WSAAsyncGetProtoByNumber(HWND hWnd, u_int wMsg, INT number, + char FAR *buf, INT buflen) +{ + struct protoent *proto; + + if ((proto = getprotobynumber(number)) == NULL) { + PostMessage(hWnd, wMsg, 4, wsaerrno() << 8); + return 4; + } + + memcpy(buf, proto, buflen); + PostMessage(hWnd, wMsg, 4, 0); + + return 4; +} + +HANDLE WSAAsyncGetServByName(HWND hWnd, u_int wMsg, const char FAR *name, + const char FAR *proto, char FAR *buf, INT buflen) +{ + struct servent *service; + + if ((service = getservbyname(name, proto)) == NULL) { + PostMessage(hWnd, wMsg, 5, wsaerrno() << 8); + + return 5; + } + memcpy(buf, service, buflen); + PostMessage(hWnd, wMsg, 5, 0); + + return 5; +} + +HANDLE WSAAsyncGetServByPort(HWND hWnd, u_int wMsg, INT port, const char FAR + *proto, char FAR *buf, INT buflen) { struct servent *service; if ((service = getservbyport(port, proto)) == NULL) { - wsa_errno = errno_to_wsaerrno(errno); - return NULL; + PostMessage(hWnd, wMsg, 6, wsaerrno() << 8); + + return 6; } - return service; + memcpy(buf, service, buflen); + PostMessage(hWnd, wMsg, 6, 0); + + return 6; } -HANDLE WSAAsyncGetHostByAddr(HWND hWnd, u_int wMsg, const char FAR *addr, - int len, int type, const char FAR *buf, int buflen) +INT WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, long lEvent) { +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_AsyncSelect: socket %d, HWND %d, wMsg %d, event %d\n", s, hWnd, wMsg, lEvent); +#endif + fcntl(s, F_SETFL, O_NONBLOCK); -} - -HANDLE WSAAsyncGetHostByName(HWND hWnd, u_int wMsg, const char FAR *name, - char FAR *buf, int buflen) -{ - -} - -HANDLE WSAAsyncGetProtoByName(HWND hWnd, u_int wMsg, const char FAR *name, - char FAR *buf, int buflen) -{ + return 0; } -HANDLE WSAAsyncGetProtoByNumber(HWND hWnd, u_int wMsg, int number, - char FAR *buf, int buflen) -{ - -} - -HANDLE WSAAsyncGetServByName(HWND hWnd, u_int wMsg, const char FAR *name, - const char FAR *proto, char FAR *buf, int buflen) -{ - -} - -HANDLE WSAAsyncGetServByPort(HWND hWnd, u_int wMsg, int port, const char FAR - *proto, char FAR *buf, int buflen) -{ - -} - -int WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, long lEvent) -{ - -} - -int WSAFDIsSet(int fd, fd_set *set) +INT WSAFDIsSet(INT fd, fd_set *set) { return( FD_ISSET(fd, set) ); } -WSACancelAsyncRequest(HANDLE hAsyncTaskHandle) +INT WSACancelAsyncRequest(HANDLE hAsyncTaskHandle) { - +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_AsyncRequest: handle %d\n", hAsyncTaskHandle); +#endif + return 0; } -WSACancelBlockingCall ( void ) +INT WSACancelBlockingCall(void) { - +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_CancelBlockCall\n"); +#endif + return 0; } -int WSAGetLastError(void) +INT WSAGetLastError(void) { +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_GetLastError\n"); +#endif + return wsa_errno; } -void WSASetLastError(int iError) +void WSASetLastError(INT iError) { +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_SetLastErorr %d\n", iError); +#endif + wsa_errno = iError; } -BOOL WSAIsBlocking (void) +BOOL WSAIsBlocking(void) { - +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_IsBlocking\n"); +#endif } FARPROC WSASetBlockingHook(FARPROC lpBlockFunc) { - +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_SetBlockHook\n %8x", lpBlockFunc); +#endif } -int WSAUnhookBlockingHook(void) +INT WSAUnhookBlockingHook(void) { - +#ifdef DEBUG_WINSOCK + fprintf(stderr, "WSA_UnhookBlockingHook\n"); +#endif } WSADATA Winsock_data = { @@ -443,8 +714,11 @@ WSADATA Winsock_data = { NULL }; -int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) +INT WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) { + int HeapHandle; + MDESC *MyHeap; + #ifdef DEBUG_WINSOCK fprintf(stderr, "WSAStartup: verReq=%x\n", wVersionRequested); #endif @@ -452,10 +726,16 @@ int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) if (LOBYTE(wVersionRequested) < 1 || (LOBYTE(wVersionRequested) == 1 && HIBYTE(wVersionRequested) < 1)) - return WSAVERNOTSUPPORTED; + return WSAVERNOTSUPPORTED; if (!lpWSAData) return WSAEINVAL; + + if ((HeapHandle = GlobalAlloc(GMEM_FIXED,sizeof(struct WinSockHeap))) == 0) + return WSASYSNOTREADY; + + heap = (struct WinSockHeap *) GlobalLock(HeapHandle); + HEAP_Init(&MyHeap, heap, sizeof(struct WinSockHeap)); bcopy(&Winsock_data, lpWSAData, sizeof(Winsock_data)); @@ -464,7 +744,7 @@ int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData) return(0); } -int WSACleanup(void) +INT WSACleanup(void) { wsa_initted = 0; return 0; diff --git a/miscemu/int10.c b/miscemu/int10.c index 0f932bd4c2f..9ecc0d5775c 100644 --- a/miscemu/int10.c +++ b/miscemu/int10.c @@ -1,4 +1,5 @@ #include +#include #include "msdos.h" #include "wine.h" diff --git a/miscemu/int1a.c b/miscemu/int1a.c index 0d25a777b15..ee2f27ff25b 100644 --- a/miscemu/int1a.c +++ b/miscemu/int1a.c @@ -1,5 +1,6 @@ #include #include +#include #include "msdos.h" #include "wine.h" diff --git a/miscemu/int21.c b/miscemu/int21.c index 350f9e0baf0..d0f8003eb95 100644 --- a/miscemu/int21.c +++ b/miscemu/int21.c @@ -1246,7 +1246,9 @@ int do_int21(struct sigcontext_struct * context) EBX = DOSVERSION; EDX = 0x00; break; + default: + Barf(context); break; } break; @@ -1505,6 +1507,10 @@ int do_int21(struct sigcontext_struct * context) } break; + case 0x67: /* SET HANDLE COUNT */ + ResetCflag; + break; + case 0x68: /* "FFLUSH" - COMMIT FILE */ ResetCflag; break; @@ -1525,9 +1531,6 @@ int do_int21(struct sigcontext_struct * context) ResetCflag; break; - case 0x67: /* SET HANDLE COUNT */ - ResetCflag; - break; default: Barf(context); diff --git a/miscemu/int25.c b/miscemu/int25.c index f08c7a9c455..89d188de34f 100644 --- a/miscemu/int25.c +++ b/miscemu/int25.c @@ -1,4 +1,5 @@ #include +#include #include "msdos.h" #include "wine.h" @@ -15,15 +16,12 @@ int do_int25(struct sigcontext_struct *context) dataptr = (BYTE *) getdword(&dataptr[6]); - fprintf(stderr, "int25: abs diskread, drive %d, sector %d, " - "count %d, buffer %d\n", EAX & 0xff, begin, length, (int) dataptr); + } else { + begin = EDX & 0xffff; + length = ECX & 0xffff; } - - begin = EDX & 0xffff; - length = ECX & 0xffff; - - fprintf(stderr,"int25: abs diskread-2, drive %d, sector %d, count %d," - " buffer %d\n", EAX & 0xff, begin, length, (int) dataptr); + fprintf(stderr, "int25: abs diskread, drive %d, sector %d, " + "count %d, buffer %d\n", EAX & 0xff, begin, length, (int) dataptr); ResetCflag; return 1; diff --git a/miscemu/int26.c b/miscemu/int26.c index c4f84643b3d..5fb86a399a3 100644 --- a/miscemu/int26.c +++ b/miscemu/int26.c @@ -1,4 +1,5 @@ #include +#include #include "msdos.h" #include "wine.h" @@ -13,14 +14,12 @@ int do_int26(struct sigcontext_struct *context) length = getword(&dataptr[4]); dataptr = (BYTE *) getdword(&dataptr[6]); - fprintf(stderr, "int26: abs diskread, drive %d, sector %d, " - "count %d, buffer %d\n", EAX & 0xff, begin, length, (int) dataptr); + } else { + begin = EDX & 0xffff; + length = ECX & 0xffff; } - - begin = EDX & 0xffff; - length = ECX & 0xffff; - - fprintf(stderr,"int26: abs diskread-2, drive %d, sector %d, count %d," + + fprintf(stderr,"int26: abs diskwrite, drive %d, sector %d, count %d," " buffer %d\n", EAX & 0xff, begin, length, (int) dataptr); ResetCflag; diff --git a/miscemu/int2f.c b/miscemu/int2f.c new file mode 100644 index 00000000000..47807665241 --- /dev/null +++ b/miscemu/int2f.c @@ -0,0 +1,26 @@ +#include +#include +#include "msdos.h" +#include "wine.h" + +static void Barf(struct sigcontext_struct *context) +{ + fprintf(stderr, "int2f: unknown/not implemented parameters:\n"); + fprintf(stderr, "int2f: AX %04x, BX %04x, CX %04x, DX %04x, " + "SI %04x, DI %04x, DS %04x, ES %04x\n", + AX, BX, CX, DX, SI, DI, DS, ES); +} + +int do_int2f(struct sigcontext_struct *context) +{ + switch(context->sc_eax & 0xffff) + { + case 0x1600: /* windows enhanced mode install check */ + /* don't return anything as we're running in standard mode */ + break; + + default: + Barf(context); + }; + return 1; +} diff --git a/miscemu/ioports.c b/miscemu/ioports.c index 44fa971c4fe..bb2c8770763 100644 --- a/miscemu/ioports.c +++ b/miscemu/ioports.c @@ -1,4 +1,5 @@ #include +#include #include #include "msdos.h" #include "wine.h" diff --git a/objects/font.c b/objects/font.c index 382976b2235..b346d8a0321 100644 --- a/objects/font.c +++ b/objects/font.c @@ -348,6 +348,16 @@ BOOL GetTextMetrics( HDC hdc, LPTEXTMETRIC metrics ) } +/*********************************************************************** + * SetMapperFlags (GDI.349) + */ +DWORD SetMapperFlags(HDC hDC, DWORD dwFlag) +{ + printf("SetmapperFlags(%04X, %08X) // Empty Stub !\n", hDC, dwFlag); + return 0L; +} + + /***********************************************************************/ #define CI_NONEXISTCHAR(cs) (((cs)->width == 0) && \ @@ -378,16 +388,6 @@ BOOL GetTextMetrics( HDC hdc, LPTEXTMETRIC metrics ) CI_GET_CHAR_INFO(fs, fs->default_char, NULL, cs) -/*********************************************************************** - * SetMapperFlags (GDI.349) - */ -DWORD SetMapperFlags(HDC hDC, DWORD dwFlag) -{ - printf("SetmapperFlags(%04X, %08X) // Empty Stub !\n", hDC, dwFlag); - return 0L; -} - - /*********************************************************************** * GetCharWidth (GDI.350) */ @@ -415,6 +415,22 @@ BOOL GetCharWidth(HDC hdc, WORD wFirstChar, WORD wLastChar, LPINT lpBuffer) { CI_GET_CHAR_INFO(xfont, i, def, cs); *(lpBuffer + j) = cs->width; + if (*(lpBuffer + j) < 0) + *(lpBuffer + j) = 0; } return TRUE; } + + +/************************************************************************* + * EnumFonts [GDI.70] + */ +int EnumFonts(HDC hDC, LPSTR lpFaceName, FARPROC lpFontFunc, LPSTR lpData) +{ + printf("EMPTY STUB !!! EnumFonts(%04X, %08X, %08X, %08X)\n", + hDC, lpFaceName, lpFontFunc, lpData); + return -1; +} + + + diff --git a/objects/metafile.c b/objects/metafile.c new file mode 100644 index 00000000000..903cfa7cd63 --- /dev/null +++ b/objects/metafile.c @@ -0,0 +1,444 @@ +/* + * Metafile functions + * + * Copyright David W. Metcalfe, 1994 + */ + +static char Copyright[] = "Copyright David W. Metcalfe, 1994"; + +#include "windows.h" +#include "gdi.h" +#include "metafile.h" +#include "prototypes.h" + +#define DEBUG_METAFILE + +/****************************************************************** + * CreateMetafile GDI.125 + */ +HANDLE CreateMetaFile(LPSTR lpFilename) +{ + DC *dc; + HANDLE handle; + METAFILE *mf; + METAHEADER *mh; + +#ifdef DEBUG_METAFILE + printf("CreateMetaFile: %s\n", lpFilename); +#endif + + handle = GDI_AllocObject(sizeof(DC), METAFILE_DC_MAGIC); + if (!handle) return 0; + dc = (DC *)GDI_HEAP_ADDR(handle); + + if (!(dc->w.hMetaFile = GlobalAlloc(GMEM_MOVEABLE, sizeof(METAFILE)))) + return 0; + mf = (METAFILE *)GlobalLock(dc->w.hMetaFile); + if (!(mf->hMetaHdr = GlobalAlloc(GMEM_MOVEABLE, sizeof(METAHEADER)))) + { + GlobalFree(dc->w.hMetaFile); + return 0; + } + mh = (METAHEADER *)GlobalLock(mf->hMetaHdr); + + mf->wMagic = METAFILE_MAGIC; + mh->mtHeaderSize = MFHEADERSIZE / 2; + mh->mtVersion = MFVERSION; + mh->mtSize = MFHEADERSIZE / 2; + mh->mtNoObjects = 0; + mh->mtMaxRecord = 0; + mh->mtNoParameters = 0; + + if (lpFilename) /* disk based metafile */ + { + mh->mtType = 1; + strcpy(mf->Filename, lpFilename); + mf->hFile = _lcreat(lpFilename, 0); + if (_lwrite(mf->hFile, (char *)mh, MFHEADERSIZE) == -1) + { + GlobalFree(mf->hMetaHdr); + GlobalFree(dc->w.hMetaFile); + return 0; + } + } + else /* memory based metafile */ + mh->mtType = 0; + + GlobalUnlock(mf->hMetaHdr); + GlobalUnlock(dc->w.hMetaFile); + return handle; +} + + +/****************************************************************** + * CloseMetafile GDI.126 + */ +HMETAFILE CloseMetaFile(HDC hdc) +{ + DC *dc; + METAFILE *mf; + METAHEADER *mh; + HMETAFILE hmf; + char buffer[15]; + METARECORD *mr = (METARECORD *)&buffer; + +#ifdef DEBUG_METAFILE + printf("CloseMetaFile\n"); +#endif + + dc = (DC *)GDI_GetObjPtr(hdc, METAFILE_DC_MAGIC); + if (!dc) return 0; + mf = (METAFILE *)GlobalLock(dc->w.hMetaFile); + mh = (METAHEADER *)GlobalLock(mf->hMetaHdr); + + /* Construct the end of metafile record - this is undocumented + * but is created by MS Windows 3.1. + */ + mr->rdSize = 3; + mr->rdFunction = META_EOF; + MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2); + + if (mh->mtType == 1) /* disk based metafile */ + { + if (_llseek(mf->hFile, 0L, 0) == -1) + { + GlobalFree(mf->hMetaHdr); + GlobalFree(dc->w.hMetaFile); + return 0; + } + if (_lwrite(mf->hFile, (char *)mh, MFHEADERSIZE) == -1) + { + GlobalFree(mf->hMetaHdr); + GlobalFree(dc->w.hMetaFile); + return 0; + } + _lclose(mf->hFile); + } + + GlobalUnlock(mf->hMetaHdr); + hmf = dc->w.hMetaFile; + GDI_FreeObject(hdc); + return hmf; +} + + +/****************************************************************** + * DeleteMetafile GDI.127 + */ +BOOL DeleteMetaFile(HMETAFILE hmf) +{ + METAFILE *mf = (METAFILE *)GlobalLock(hmf); + + if (mf->wMagic != METAFILE_MAGIC) + return FALSE; + + GlobalFree(mf->hMetaHdr); + GlobalFree(hmf); + return TRUE; +} + + +/****************************************************************** + * MF_WriteRecord + */ +BOOL MF_WriteRecord(HMETAFILE hmf, METARECORD *mr, WORD rlen) +{ + DWORD len; + METAFILE *mf = (METAFILE *)GlobalLock(hmf); + METAHEADER *mh = (METAHEADER *)GlobalLock(mf->hMetaHdr); + + if (mh->mtType == 0) /* memory based metafile */ + { + len = mh->mtSize * 2 + rlen; + GlobalUnlock(mf->hMetaHdr); + mf->hMetaHdr = GlobalReAlloc(mf->hMetaHdr, len, GMEM_MOVEABLE); + mh = (METAHEADER *)GlobalLock(mf->hMetaHdr); + memcpy(mh + mh->mtSize * 2, mr, rlen); + } + else if (mh->mtType == 1) /* disk based metafile */ + { + if (_lwrite(mf->hFile, (char *)mr, rlen) == -1) + { + GlobalUnlock(mf->hMetaHdr); + return FALSE; + } + } + else + { + GlobalUnlock(mf->hMetaHdr); + return FALSE; + } + + mh->mtSize += rlen / 2; + mh->mtMaxRecord = max(mh->mtMaxRecord, rlen / 2); + GlobalUnlock(mf->hMetaHdr); + return TRUE; +} + + +/****************************************************************** + * MF_MetaParam1 + */ +BOOL MF_MetaParam1(DC *dc, short func, short param1) +{ + char buffer[8]; + METARECORD *mr = (METARECORD *)&buffer; + + mr->rdSize = 4; + mr->rdFunction = func; + *(mr->rdParam) = param1; + return MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2); +} + + +/****************************************************************** + * MF_MetaParam2 + */ +BOOL MF_MetaParam2(DC *dc, short func, short param1, short param2) +{ + char buffer[10]; + METARECORD *mr = (METARECORD *)&buffer; + + mr->rdSize = 5; + mr->rdFunction = func; + *(mr->rdParam) = param2; + *(mr->rdParam + 1) = param1; + return MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2); +} + + +/****************************************************************** + * MF_MetaParam4 + */ +BOOL MF_MetaParam4(DC *dc, short func, short param1, short param2, + short param3, short param4) +{ + char buffer[14]; + METARECORD *mr = (METARECORD *)&buffer; + + mr->rdSize = 7; + mr->rdFunction = func; + *(mr->rdParam) = param4; + *(mr->rdParam + 1) = param3; + *(mr->rdParam + 2) = param2; + *(mr->rdParam + 3) = param1; + return MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2); +} + + +/****************************************************************** + * MF_MetaParam6 + */ +BOOL MF_MetaParam6(DC *dc, short func, short param1, short param2, + short param3, short param4, short param5, short param6) +{ + char buffer[18]; + METARECORD *mr = (METARECORD *)&buffer; + + mr->rdSize = 9; + mr->rdFunction = func; + *(mr->rdParam) = param6; + *(mr->rdParam + 1) = param5; + *(mr->rdParam + 2) = param4; + *(mr->rdParam + 3) = param3; + *(mr->rdParam + 4) = param2; + *(mr->rdParam + 5) = param1; + return MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2); +} + + +/****************************************************************** + * MF_MetaParam8 + */ +BOOL MF_MetaParam8(DC *dc, short func, short param1, short param2, + short param3, short param4, short param5, + short param6, short param7, short param8) +{ + char buffer[22]; + METARECORD *mr = (METARECORD *)&buffer; + + mr->rdSize = 11; + mr->rdFunction = func; + *(mr->rdParam) = param8; + *(mr->rdParam + 1) = param7; + *(mr->rdParam + 2) = param6; + *(mr->rdParam + 3) = param5; + *(mr->rdParam + 4) = param4; + *(mr->rdParam + 5) = param3; + *(mr->rdParam + 6) = param2; + *(mr->rdParam + 7) = param1; + return MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2); +} + + +/****************************************************************** + * MF_CreateBrushIndirect + */ +BOOL MF_CreateBrushIndirect(DC *dc, LOGBRUSH *logbrush) +{ + char buffer[sizeof(METARECORD) - 2 + sizeof(LOGBRUSH)]; + METARECORD *mr = (METARECORD *)&buffer; + METAFILE *mf = (METAFILE *)GlobalLock(dc->w.hMetaFile); + METAHEADER *mh = (METAHEADER *)GlobalLock(mf->hMetaHdr); + +#ifdef DEBUG_METAFILE + printf("MF_CreateBrushIndirect\n"); +#endif + mr->rdSize = (sizeof(METARECORD) + sizeof(LOGBRUSH) - 2) / 2; + mr->rdFunction = META_CREATEBRUSHINDIRECT; + memcpy(&(mr->rdParam), logbrush, sizeof(LOGBRUSH)); + if (!MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2)) + return FALSE; + + mr->rdSize = sizeof(METARECORD) / 2; + mr->rdFunction = META_SELECTOBJECT; + *(mr->rdParam) = mh->mtNoObjects++; + return MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2); +} + + +/****************************************************************** + * MF_CreatePatternBrush + */ +BOOL MF_CreatePatternBrush(DC *dc, LOGBRUSH *logbrush) +{ + DWORD len, bmSize, biSize; + HANDLE hmr; + METARECORD *mr; + BITMAPOBJ *bmp; + BITMAPINFO *info; + char buffer[sizeof(METARECORD)]; + METAFILE *mf = (METAFILE *)GlobalLock(dc->w.hMetaFile); + METAHEADER *mh = (METAHEADER *)GlobalLock(mf->hMetaHdr); + + switch (logbrush->lbStyle) + { + case BS_PATTERN: + bmp = (BITMAPOBJ *)GDI_GetObjPtr(logbrush->lbHatch, BITMAP_MAGIC); + if (!bmp) return FALSE; + len = sizeof(METARECORD) + sizeof(BITMAPINFOHEADER) + + (bmp->bitmap.bmHeight * bmp->bitmap.bmWidthBytes) + 2; + if (!(hmr = GlobalAlloc(GMEM_MOVEABLE, len))) + return FALSE; + mr = (METARECORD *)GlobalLock(hmr); + memset(mr, 0, len); + mr->rdFunction = META_DIBCREATEPATTERNBRUSH; + mr->rdSize = len / 2; + *(mr->rdParam) = logbrush->lbStyle; + memcpy(mr->rdParam + (sizeof(BITMAPINFOHEADER) / 2) + 2, + bmp->bitmap.bmBits, + bmp->bitmap.bmHeight * bmp->bitmap.bmWidthBytes); + break; + + case BS_DIBPATTERN: + info = (BITMAPINFO *)GlobalLock(logbrush->lbHatch); + bmSize = info->bmiHeader.biSizeImage; + if (!bmSize) + bmSize = (info->bmiHeader.biWidth * info->bmiHeader.biBitCount + + 31) / 32 * 8 * info->bmiHeader.biHeight; + biSize = DIB_BitmapInfoSize(info, LOWORD(logbrush->lbColor)); + len = sizeof(METARECORD) + biSize + bmSize + 2; + if (!(hmr = GlobalAlloc(GMEM_MOVEABLE, len))) + return FALSE; + mr = (METARECORD *)GlobalLock(hmr); + memset(mr, 0, len); + mr->rdFunction = META_DIBCREATEPATTERNBRUSH; + mr->rdSize = len / 2; + *(mr->rdParam) = logbrush->lbStyle; + *(mr->rdParam + 1) = LOWORD(logbrush->lbColor); + memcpy(mr->rdParam + 2, info, biSize + bmSize); + break; + } + if (!MF_WriteRecord(dc->w.hMetaFile, mr, len)) + { + GlobalFree(hmr); + return FALSE; + } + + GlobalFree(hmr); + mr = (METARECORD *)&buffer; + mr->rdSize = sizeof(METARECORD) / 2; + mr->rdFunction = META_SELECTOBJECT; + (WORD)(*(mr->rdParam)) = mh->mtNoObjects++; + return MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2); +} + + +/****************************************************************** + * MF_CreatePenIndirect + */ +BOOL MF_CreatePenIndirect(DC *dc, LOGPEN *logpen) +{ + char buffer[sizeof(METARECORD) - 2 + sizeof(LOGPEN)]; + METARECORD *mr = (METARECORD *)&buffer; + METAFILE *mf = (METAFILE *)GlobalLock(dc->w.hMetaFile); + METAHEADER *mh = (METAHEADER *)GlobalLock(mf->hMetaHdr); + +#ifdef DEBUG_METAFILE + printf("MF_CreatePenIndirect\n"); +#endif + mr->rdSize = (sizeof(METARECORD) + sizeof(LOGPEN) - 2) / 2; + mr->rdFunction = META_CREATEPENINDIRECT; + memcpy(&(mr->rdParam), logpen, sizeof(LOGPEN)); + if (!MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2)) + return FALSE; + + mr->rdSize = sizeof(METARECORD) / 2; + mr->rdFunction = META_SELECTOBJECT; + (WORD)(*(mr->rdParam)) = mh->mtNoObjects++; + return MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2); +} + + +/****************************************************************** + * MF_TextOut + */ +BOOL MF_TextOut(DC *dc, short x, short y, LPSTR str, short count) +{ + BOOL rc; + DWORD len; + HANDLE hmr; + METARECORD *mr; + + len = sizeof(METARECORD) + count + 4; + if (!(hmr = GlobalAlloc(GMEM_MOVEABLE, len))) + return FALSE; + mr = (METARECORD *)GlobalLock(hmr); + memset(mr, 0, len); + + mr->rdSize = len / 2; + mr->rdFunction = META_TEXTOUT; + *(mr->rdParam) = count; + memcpy(mr->rdParam + 1, str, count); + *(mr->rdParam + (count / 2) + 1) = y; + *(mr->rdParam + (count / 2) + 2) = x; + rc = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2); + GlobalFree(hmr); + return rc; +} + + +/****************************************************************** + * MF_MetaPoly - implements Polygon and Polyline + */ +BOOL MF_MetaPoly(DC *dc, short func, LPPOINT pt, short count) +{ + BOOL rc; + DWORD len; + HANDLE hmr; + METARECORD *mr; + + len = sizeof(METARECORD) + (count * 4); + if (!(hmr = GlobalAlloc(GMEM_MOVEABLE, len))) + return FALSE; + mr = (METARECORD *)GlobalLock(hmr); + memset(mr, 0, len); + + mr->rdSize = len / 2; + mr->rdFunction = func; + *(mr->rdParam) = count; + memcpy(mr->rdParam + 1, pt, count * 4); + rc = MF_WriteRecord(dc->w.hMetaFile, mr, mr->rdSize * 2); + GlobalFree(hmr); + return rc; +} diff --git a/objects/text.c b/objects/text.c index a900baa136c..ae01b208841 100644 --- a/objects/text.c +++ b/objects/text.c @@ -7,7 +7,7 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993"; #include - +#include "windows.h" #include "gdi.h" #define TAB 9 @@ -265,7 +265,7 @@ BOOL TextOut( HDC hdc, short x, short y, LPSTR str, short count ) y = dc->w.CursPosY; } #ifdef DEBUG_TEXT - printf( "TextOut: %d,%d '%s'\n", x, y, str ); + printf( "TextOut: %d,%d '%s', %d\n", x, y, str, count ); #endif x = XLPTODP( dc, x ); y = YLPTODP( dc, y ); @@ -381,3 +381,25 @@ BOOL TextOut( HDC hdc, short x, short y, LPSTR str, short count ) return TRUE; } + +/*********************************************************************** + * GrayString (USER.185) + */ +BOOL GrayString(HDC hdc, HBRUSH hbr, FARPROC gsprc, LPARAM lParam, + INT cch, INT x, INT y, INT cx, INT cy) +{ + int s, current_color; + + if (gsprc) { + return CallGrayStringProc(gsprc, hdc, lParam, + cch ? cch : lstrlen((LPCSTR) lParam) ); + } else { + current_color = GetTextColor(hdc); + SetTextColor(hdc, GetSysColor(COLOR_GRAYTEXT) ); + s = TextOut(hdc, x, y, (LPSTR) lParam, + cch ? cch : lstrlen((LPCSTR) lParam) ); + SetTextColor(hdc, current_color); + + return s; + } +} diff --git a/oem2ansi.trl b/oem2ansi.trl deleted file mode 100755 index 20ab9f40bb2c6ea5e31314e363a4446be2e8e04e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256 zcmZQzWMXDvWn<^yqPshPQjrIodft)0Dtqm#3XtDC!rrnub+QFU{G*KXjpheWK?uaY+QUoVp4KS zYFc_mW>$7iZeD&tVNr2OX<2ziWmR=eZC(BGKQA9WdGPf4tJg2yzk74!=*eftzI^-i z`{(~_cNQ&P8qoak?dM+~FRt3PKYq>LJquUwj*pLD1_avLAPfS!y4t#6j;`)9AQK26 i;@a9kl|a?^54^F03 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 diff --git a/sysres.dll b/sysres.dll deleted file mode 100755 index 8b55d673859481cdf11c9ece12cd2e718c6dfcd8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110592 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 z zh-Dz{iOEUtAOsg1KelU1qm0yn`n^VMZwnWOn9vOh3$(UYTWvPHTHjk|uhm3gCNE)? z!lIVzi6PWEnmpJprh^K-5ChG^ zTCv8jyR}{bAfK#MTf#~RGKncNG${sz7yxmi%3@F7F6W@$EiBkFsBN&izk<;B${4{0 zoh3d0ng>N$6WiL7n`I1haKy$YmS)_5tif(N1ysg+OfA%((~#*90-3Tx+xR5|0v>GV zO@9)>DqR#2RD>UNCf*>Kw$&<-L>%3vt5MiZvLX7L!LKT!V3)fF&0?k%8zwoJ(o9x{4!DQ@ zlF$;55`psKf@Ps*jwA_!fg8h7zz2TP0jkj$tC^aO1sgc+Yc(31t!px2>erG3!-N>&{z)V}+mZZJ3BIlHx zi77J68-O3%>BfJDJptqFYQFKNlu!_)wM6jA6+(({dqoDrGV8uW};k zfYk}w*~3_I$=?A^Iu(F4JX~r1l?bfwM9RR})R-Q)si7kpMQ%2qL~DDZH-bScxw!yC$B8Gbh3^+g`Yu{9uov90*qe- zh_PbWuXL=jga}(H27z@JIR`ToX-!31nHFL;1hT=CrkSchRaI>c<94t9l z7g7>(`pTAN9y; zk-}X>;8#g{>-+h|2|xs3l7B~EUoZsDQ=h+?KF5j^uHD_ATgP{bg8$;3cjAj9r^UPP zzFXY5af2JB|BJHJ86W<1Nr#E>H*ThIqbTMl&-tBLh41NloaXcEWm#P(yZh<-^^e|s zvrOkV`Ca$7?#Hu#-ShALn>wGXlqlza^?NsOR_{H$Y?Q`K$ zeEDwk>#zMwk67+Dhp+7EZ1L{bUuk~(l|PQy*Y1A(kDA}hF;{zhx7mO7weN0x>7`e% z{MJACI~j_veb5|UedWrx{@LP{*A~C})vtc3f8{%`{?^Oi{Z=HnQM~j)^QHCI{>7EW zKe+sjmz5$vdG!4mB5>6HpCQ=4gs(bk|6jsJ`HYJ6;-4M=X7SD9N5y~E3;#AJ=ZmL{ zCpka<%^UsiZ2Z$#t}HeefA5uVZG8K?bOnFEc;Ez2qy&HT?Qd%D(PG_}`kd(tR% zdmlzeT9||JQHb`imdjy7l8kPek9oc~cjH|4IAyGtUseG# z<@@>ZsBgZX>pu~n#mf(*`vzPIFnO!K(I8Y&#`)YH<=v=r)n4$wu&LVfi2px#?tXj$ zJ}dq|tRyg#!i{vVnhHwsk_jD!e;*0vKXQ!2O()2=Q-b<-B&csY!Q^cvn7pk7kB^rh zz4;ciL?69LIh_72;`;l9@wfE6{>swN^H_fVBjxwF_*>;$Jjwgh^KVXs$CkgCt^X7N zLU=NP0j?2=2B;GR{#6dCeJZ}+PwiJ&Y)j1}_`En)KH~JCD6W&}5;xA?=FRUG#Zxyh zHTs1H#ihXfh7wfqok;NGq@TQfl^jVReFf#{=B>A*%XS=XBu*5x$S& zpCTRxcOw7oo1x!l{I}Bpt&Xd8>h{^b;b_%fIls7?k9R{if9m$9`#n$o8dF^2bDd9l z8{PkQar{XCFAfjCJp6x1`OqL^^qB5FCLU(0Iv*vU%pl?wDMa!*LAsrtRrBqfpt>Ci z>f1S9k8B`zjY6v=)A73+pn8-VS>7#vZu~A;%vS|207L&(4LKvP$HnJo($B`L+sesh z%U5RO`T8&LU7=Sz1zz!a1YaJ&pN!MXeLlc&ozJD)@bJ47M&RQAm*M!uscIj;_-0;7=Ia;#-kbmKYjuj_7caia7SdI?sIXck;I`sbmX2Or z9;O6wn|MlavFqXat<{Su!NpsD#g+g4U%r`Ma67(#Eys(3D^C|iE+VIj7AZlFKK*N} z=?RiMeSW|ha4p4e^TgBoBZKlbyngoJ?8CBr|KY>;-#_?U|NU%v`}<}2=$*%WE|ujz zynGj)CXe#nV`X{6WF_04Y<#ly&9kiW>YbwK{@45OALII2e(3FAm;dAa`SSmiKP_Lo z_2-o8DEu4*re%Oku!Qs#k@`5v%a@SaXOY_TXjo5`?;_1_gr$`RDE@@c-{te=Lq58$ zkJ6A<)>%FK$%CFa#uLZO|5W^X`Qzd@%fBeP1FO!JX^nqgN^UAE(dDd_zW$AftogI<>e&EzXwjK`KAx_*VI|@}2VG$39WgFP1I& zWbq~3c_)29K6(3p^7c9;C5$UZm1h1FEjjzqb=@yWHydcZ+3-FW-sAJ%`23L1Sz7lJ zt$Q8eLG%MY|C7&8aBKV_ZGN`gKe$wWK$4%8m)zoN^~sN}>;67j9H<9F^yDyGo?qqo F{{_zR9j5>Q diff --git a/test/blandmdi.exe b/test/blandmdi.exe deleted file mode 100644 index 6dc03d50d5aa188523b9c941efafb3cf7a501bb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35928 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 diff --git a/test/widget.exe b/test/widget.exe deleted file mode 100755 index 6d8fb2ff67d2ef6ad118d4dbfe1e569396b1dcb5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 321606 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®)*Mg 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

O8L*VyX=8itx+f zTZ8#v-=<=OfzP&%rTsOx%vi113rs?b4MkJIWLu0M`(USbS4)=%>aTt6@u$CeRrol1 z&ne)|B++Qh`r72+TE0|PP(y~Y@@p=;u20v^@iA4S1mF?=!}Ieu4P zGah4{DT3=UJ>i}GBc%*>PB8J161s&%{=BEOh%0hqI zju(J{AX&K%=(>g?FtNwRhxM86= zno#mgKi78GJ|kR{&6UiGoRV#@J^2r1KWu*+_%$J$z1I-nqmGL5t5lSyiJ!|UMKo2l zNdT=Te!9;9Qy(FxAtWd_Q|zns+6N~n?E$zBXh*^~8mb07d)Q8BUH_o>)j{VBqZ+ zpLgDQZ5QS1)`0>CE3aMf5x6l-Xdtz|rr)Z%DKQwBVl$SedFu`%`a` zfK)NzD0*#JVO8rnq*dbDh9B6*KuAZd{@2}&OD=PPDB^!0@#G@89~wvf2|p8!On^>~ zR4}oA(6K-%Bhud=W@=v~?G(6McTTlcN zH$6xkP(uute>=bXK9>#AABE|s=c87T#Rfu40EHi95$j+`S6!j1$+ zHYtKiiKF=Jg>ZqNkJm^7(E>GfLrMYGX5#*!;`B2Hm)G24M zeze?G9ffsm*dAwV(y1cD(Ax(M8tN=*c*ea#o`7!-QMAF{DY)L%_RLW^fV04QfrEtK zQA;Jik#oy7_gJXm82)Y{IW{3KGOZ({qp}cYoOBMq7p1^zm}B9jq#6Z!IzOJo*XQU% z^s2@2jfK99G8Gj{!)3<<+T$)F0?Wv6NrT~yc6uC|G`{pwBze)=Q{CiutW zt#cYDmCx{u*kH*AIQm%>VRW=!_UQE?|0np#?nx-}plRo4Bu$K0f6N zgsi&8W3;A3w(gKFO@?8fNP@~kTBueTX-kCUWV#Sl5`MIcy{yTpt)mJM7Zv|OM;DIz zKf(|AEVg=p+bRc7if+@$Xi@GQ(h_7O zkEyV5E=eoGijUA&*UOaxCr|G9YSWz3t4rPTveAMSw3y|8c-W%C^0HEQBW)F|>=5|H zqboDWb-Gi18HBZ~Lk^0>tPbcJ_Dl0`B+NB}thuBLgM?qDuG2XMRZuS2P)tqAT-OJR zbisQ|0~$lrolZ*)pAERaP;Wi4hQSoPMh@#E0FP5r0#}GBg#dA1B>#|h^~$G3p|jfN86TM0F)d(K+;H0FW5o5 zzCm~w9Hx*?w7Y>yEOREtaA-DuQc2hesoS2>dW<7>(6{NWhiwY@;GgIx{93Sbw~gbL z?ys&2K;Ml69c58lOI~v1M(YFBh~f)5k^)?f#JgFI{n!z37@j$)n}?D z+F>HkMNENzu-H!*S5%AfHrf$^pcL*0PEO1amqlXtx1m8B0l|QeZ6aC%AaW7aMsxmg zMT8(;2J6awZ8OmUcbH>Mr7ka^@#Uuc3ZWLj+~sXOUb%8{13&m@!E(3NP6?|ImK4QL z=9OQuge2DfFhu5NsF%^U=i?{z8u$gML;cFTT5|Lb4~8Ip%7`r2*r_oVW(^fl6h@t~ zO%qptY;tO}4&X`!;FeCCW$5(9%AkR2K#-U?G=N%k#+3>#Dyo~8krg1O2yQSdtXcSR zcME>A!TLS;B?boPcu$8G!Y@gVFlr_cigLIxQA~Dw3nfiA;8K%>Y0;tJUoPAIB@IOh z0(=yW#b>g?{8u}OZtN-RTyc%SKXGsJ{XHL>V*F3uw;scj!Ow*V2RU|!#(EscYQ;~= zu2M!DnRTosHVPNq2sBxqtnb&1weXKCfgi+Ly!hXV-zoi!fmqMgd#EY%(8}rt$hA%9^6-?aesX=-`RtzMeHUNe4; zrwhOSe)QkJ8$WLU?QbQml2wno4a}strf8sUfFG1^C}Y$J{OFeEmLj2L+nYlwbh%-e z!t1isq447q(z+F>=|~ua3i(QjAZd(=P?Xxo6iUovu{@pYHDZ3=6L$Jjs;N6>0P<5r zA*%Gn2fD;wc-LF07seUE;S00t!cp)qec$|BWBc*%z>o0#Vhl)s?=y#p+mbKpH&&kmJVq2ZjIy6g2=pdc1tGe>}_aTZ7RZ8guQDG&CMQ zVb!q)Bz9>0>KWk7ohm9$ky=6m94b*N>`h8ZV5RCbJ&dt1F@P*;qX**`;Dev}XH=aZ z_V@SThd3WB(!d9PM=d?%5J6|FfE!&I=}Y*jhnNShQe#t6VB+a|=dxwGMgu$T*32QaEw z%JBoGAb_5ilEha>yfuSwGYdBzNJ#UPw4o4jFRsFcN_Bs<6xo4KZDatAHO&_T4(2 zzUiicfAk6U5T9+@-&Uwza6j-{u;9>ypR*v(O10YIyc&=xYbX;*_(4_b-fIJ#gOxsK z;Rin4XZ(VJ3YtO;L1#yExLPcg7(Q<+RH?PTD_ZF32$ts_q;4f2oO4fui^)U)5I#0< z2G+|lopWM_5tT?TY%RtRD-)vy!IxLacW{I97JfuBInr6#-=mINumA)6f|$)Z34n_i z?=yaiKt~pAE9H(<3J#pO8u;lM!VjweetkVn{x$4K15e#U{c5!g>>`9fI23v136fa4 z0#!i=cw~rYEFnlVU}p?JhE&mjrJ8FNe!xp|hrFi^>#EpK2c!P-g`D^zUshiL9X@st ze#$q;vQ{t9XE1&`jqQL@`wl$Md+4cn*np|$5qmj)fs#CO;U^2yjmQ(qQ^n~P&dA8d3nEw~@XH?=pP1ExAd`(Dse(g8 zbp%8CR%E8J5`6@0g&d~IfaH-Fea}hwu`@9M|I{?j#hbJ{Ha@x(fDNE}{1u$J&IS9P zJ@QDiYZl+q0VwL)vre<|i|oPA`Y=^Q&&~S=+Ch3nMhrvWyrOFdWPBz|qdX8=sK=`z zS6@9jIZ5?;rTW~fVCcMB>MNFJ6hNUT4Xk8}S=m4PnGjXs6=`-e$+A{1$Rn0pH`*iO z%HdMs^h|B?NR0N8O3|MTn1)&H)Aw8OOJBmB0>9L2MJR@=olBM+fK~fmbhwg1WMlR% z2Df9L4df0F_?~^Xg@1}vswDl)msF`z;*2zo`}PR06&&Y)sBfm&pIaD1CQWRaQ5Tvp z9T93GUV_e-hxs9n7?NXPQphQ}7d%v%;W%}G4MzyNA_-$eO(pQPaoiHJld9_*RRqE< zmV-iR>Ph=#&qN{1Yf@ou8NQi{OI|Hxy&7sd6dgzNt2JrA_ z8%RCNiDQmA=5U{AoCQBwU_X=EtF8M9tf&~Ai*4W+{Aj_C*Hf#q58|47`Avd4b_=(17jNimmhv^rW1iS7ca~gTHI&t+B;b*h~&UW7`4mspd@Y`p8 z39AND|9kw%P+9kn^fja+%0l1Nb)}S$$;iSejT&qc(Mb8*gK9;3(1T@gE6zmxp`zd3 z7!2g-Q6tSm#O$17aE?v|Mkb!&R?<^PGCzTSF!puc0P_&Q4$=iuWgBO1OK`0XoYfow3a-KqbQLRCPgdPK#x$29TO zS?NFX&sn3Hh2L=LAp9)9)Kxb{DF6@1Ca27O4_=N83|ER>8Z$2sj>b>F2{Oo{u6r+o zLk_osKgxcrv_J7LV3hey_;G^ARB8jX%ETmt1f!bbrhEcABULM^&qjF?CO+x#Ou|z@ z399&*=rVp}E6&AhqBJuhMRo9MDCa`ND28U?*Px$e_87wle#abRJiW>B3%!w;T`k-6 z`Ptr3JfUZ=k3vW-0U7Wq;RPoC z`D4u*f?5f`^Jeic$cEwrtQ9dQ~-s9 zrQe|bKzUwQb-Y>~XKF@}j8Qms0KhMB@>W(B`80lVWH^a&ot4&O+l!a+LR#y z;%)>vfo7<3{8Y98Ejb??IOLp+pe{!F5tVvzoMMu#0;tu|7^c>UU-UfSDVEdsSDra! zDH7R`-vpolLv$^_#xIv*EcKyz2ZZMxjGrx>is7y~T}+EA{sTV{;pr`fVy&;Q#-tV{ zqyWP8wzZXut@w2_HY4}g$?!3AD6vuJ(D_3%wnM7p0MQrdtI#8ZN<6yW#7~$QG!Gqn z*LK!G5#G`SF7eNDq*6;zG>?nlP@#JlgAkQbS+MXZW^; z3lT=$VTKS&XpeIXxBFYFWrELn3{_qbKe*RO3BLd~8IYwhg(ym~W~f@O;)>WC zv82Mc!5Ae?ddYl+v+k|2+Ieyae9SPA`A? z?~dSH7!^4%3p9&YxJg+cN5g|XytFk+Oqv1T2IG2qa6vqB2{7vJIw{1b58OrBiQPqQ!A*pljUVTdhbKid zJg8Y#vf9OBg-DjQTmmO#+*vm8BSY0#BJ8A!9E_jP13s8{^wF=3bTk0|&H#oC?*l(Z zKm;7hVo*J#Vqd8kLq6ud$irI1ne>vA<&J;>eU-qSEpVo*ya*R>0;gl@Q4RG6?!a9g z?qa?Wq$_wR6PT&V*n}EkqR^k?XTW#@rb6PCL;C;H!bJ)2 zjS3w$f~XCrj^aQJTqxj@$R{*j5I-%O*i1x6n7Kh>Akn?Jq>;Lr*CLk6U$!LSsJR2n zp>>@;H9bM~6Mm9komyi>XY$Cy#Ef;(%7$ECg3}l3;`UX6SQ3pi!f^5jF z@ngfe95I%ij2F4`6TQ`$-aZUOsT@;YB*|(P@RLSlNL*0@C|sLt;3vq07316P6zRwy z%2yjGO96CUjcFYnjXbq*w>im;`1!O1hXRPKjg*1cnelRq{*wZ<^-w*=H`QvtIdlQ| zwbD<9!@>)ELeTuP1OqQx@JKwsLp6dF6EoDmRir7mNh$@Yx3`I30~Zld`cJ~!fDcN6 zUyDc6SL#8sAYEUVr@ROX4y2VOd`2AM+CHS5NAe)X>_=F$g3vemz zd(okXK68{RmD-QTL575%3&8_e^W~t${=i9+9QZXM)!wW(fpMwpl}C*GxJ5rxbGLE3Jih4r!=_l5-doU{8dcC>cMY z=H!Y(L)((^-!|!I>CM@f$oERYcf=7nc696xf6w#8z6k}|n>NlbAgv)pY zeQ5?5krHGCur>Kl2sMhH7dIbjBCk}1_+Y?<@pe5S^r9anT4RR=VR^xV#UZ|e?{`i3 zY2BdMb_@_kBuK`QqxwWJp=Ut&7H#SZHxGQieMf7yTjf407LbDqvO#M zd|{vo{92-MJcX+9B&WcSBMnYA@iTn=UboXsdLDlHQV6~f=qUzhJ;A zgI{yL=`8&CW($6*n+{pG*mdME$FFMqx+}@lxMzks$Dd=Flxj5vO4NfOW@>(eozM^j zOq9wJhw^+i+E*Jeeh1lKZXaz9kcfC7hqNjdI5k?HoVsRobZWRdUM%$Wj54>aK!<^+ zh|q!=0GlqfgqWC%(-DGi7JhPFI=hA=zlBg1SMcb(MpDQKi# zeC8?(yW1z|=#XdL(Ob$i%iTl440{gM24;wtmb*rnFQ-5{f67Or%awedB%O`u9#FS( z#8J&Io}wCE*8f41sW`yd6@tR3%Dbh0{w{pY9 zPvP&D!GZSMt-45=1d7IjG@H=)soY$PEg#jg)(j!30J2631=58qf?40h#MR_$#%Y?3 z-sB7P^hC0Tf!L6s;4!u%@@EvZI!3B5$+kon^p2vg2ji!rxY>lC#YMd{Pj?CF6k1C8 zW04O^B;EQ3N&&OM1d1)n}#WK3Xhv5VIbD0*~8 zW5`^Qa!E*_rr{AWFMrX-KxKefM06N2De&q*UpW(UGQ|>S)=Hrpf`$b?$BCu>CUEtX z1c{mq9BVN*$fv2UnoaFDS;83+J7Y{xP3O7DZSHjw&QjRE*5wfoIe(xn{t3T`3kH6X zt!0k-2AVR%ot;beiGOAw&dcFBd?Me11xq#Px~6y5d?BMJhNV0aO*OX^PEXZ56W8Rc z$KVW_g~4CV(?BLkF~Nl;DZLh|7FaZJhEo1;r6@BZ?2I48lv^#GOHHl8cwZ4y>lAeq zKJk`OFqFdSlvKsmTd&b;pi*%4(L8#|v+%m*Iw~<0GkUyX&f=S3ZH7T3yUW{wWz zoqA2Mpy&i%NkOtSe%{u>xCz03aI49TK5#?Rr@ z!;g^zc#P#Y;L}T6E^uX_sBXJc%E?o20<{L$Mh375o@jutCays&QejvFOCC5Ede(KI zB8}kG+nvdO@oQg1Rt=Zwr>mMOt*DG}lv_v{5VznK+5*_R1|~;} z7*$8daF1AI!VipkBziUR6R(t|bgFvS38q>^vs`bf3yH6v9M}8dA2fu2>IT33n8WQc zOLUWE;AxeSVsDaGH;>y}!XXKj(-dUWU=j&x`DIVNLa1f!mNHubUh(JB8wv$e4Ub`g zd_hLtMG!%qxVRa$SJ2cKz65LJ2C27*s*~tN_n!JXfW?Xu*0adz;AnLQUy8gK#xwE( z*+AguuAJnDJi-u;7xeySN>YCltmlwwOb4cMMOsSu`9x$eH2fRkx4`(l^61}50RrAq zlaIzwF4cO;{b1C|nCJr4`ap`nzTWS!4s&htp-uNQI3L_I zgu*XLw!R_U9EIU~>Vt`Yn1-ua#3(sL6p48@sJJdo{j;Fr8n-dbR8arUAn+w&Hq@2y z^MPOxtgwmcFU$wXQ6m3M6NI$WiB|luElGB{448bSGG0GQh8F$z@}pmQ^bz1E!`x4< zQY1(NzS2MmuE~rt%|UdNW*Z&I$Lx)o7AR(>tkfEwfV@GH$B&GkSr;b{+JZ_GKW2Cg z6=&nuJ5+K|+MRqUKt)LUh{eHwO)%q4>H0vuRHS21>cEE_nw^iqBU3U|)eCOiD5$@YYcns;cgX z6cFM%RaEc3R38`_?ZM@dda&q=SkOXILI@<;5k-WO@UtDy@iTzN51x#)$wqJ_z(}DR z(|%KaeIn;+PQ~G_-m!ilJ0K@U{@;?7ot;(dwVZ77Ir8p+8X4T$X6k)7PyC>&QJ_?< zsPHkaXxIMdy2(*Xix#$>ykexRo>VUJUnPR4=X3@Md)QF3Im)Wfi=ffTE;0ufcy0x<_i%p zM>NL|^!P_FPEbYynf?)a5Of-<)gIno#EHaPzN-yn?!HMKsp?b|^&c;WDDah& zMFgaO9hn-9L^Uu21>-096pRq2EvYsbL-F}ZgVuD~h6m?Oj+8t3^>g*!Z~zZK^28;F z9?}Av_#nSb$&3+9-M!UV3tNUT$fjqC3Ayn4Ud3Pv1g2k*fJmfn>Q2^I29w{D!e}Q} z_x5RKZx?)%T`1MvlDem|3Hzug*9edVMhPnF&T0tu4#U|9G>l)h6+e|W|0et+vw$)g z6?4q+aie`FGS~}dq#QB3T~wBTk*VtG zmwVYsgo}q9j33v%YG;mL&N)tN*RO;$@#9RTs~2i9nBG^Vn}=~PEgJ?d!@Ou{gVtT!wt*4Qlw%&2pRFqmD+$?yxXv3N%Mbiq+>$ z(fS=_rR)1~`%FH;)EtYkBp?xqT3S=3r}2t~sHRB_BbwNcd=jaFYw|n_lyQ)WTkb?z+vvR@Kw7$h7u^_6(!lS5CHsV* z`94+fu7xFo-c_V8=vZxqbrXRSDd&O zuxSc;*OZn`7HpP<4zwCkO6Hg_60M$cLPhv>Ht~Bl@Jko-o6;d4snRW@9SN!&K5E$l z9=kFiv(IouPI3=5E0EGL&rjfm+SRr<(N6#(`wSM1 zgU!-)Us{B4S<|(9W8o3HnY#fV6Q6gFUCb)F!T@!TiTU!61s|nQ{K_h*T7Hc zDgLJ@suO})Ni#;%Fi0{U(t120gj&$$iTT_4jg)vzoYLt=@z4g-ZN|Dvas4ms!&v` zWqUCH8ndmG8+k|vYT*NlC$*3LfP)D=J_MlfvtMKQh{N=2E+9$a(^@PrB2DLlrgtzC z|B^K@*RT^x)V4M}18+TjSH?hLEkgIal!EGz<|x!;2r#w0i=@Y>sHj9C7qs=6CVt6! z`})vPt^8YjFn(@=96u(bkU)sQ(EkFzS(h5WyFif)ppi)0vcDhv`ZBe6NUN`AH6c;@cfPV*SJQF z^VwEO;~n$`@vq2BHS*Fm6ej|9yKAju84vNbR^+{Y0~el(J*ml1I88G=uR=!F=)z`Ze&gcIe5M-8l$9LV(y`BG8ME zTyRvBCv5|7J6Q6eQ|g;#RDH5hxdwpFp&zZH>l{d!Qm#IMob(P6C!EQE3j9K7_wSea zu=pnX5#|>&Le4@{vx%(fAb|1%IhzBl!N`oPf!=;1jTXc4P=Ct7AzDda_Y#v$lO6bx z4Hjinoma)kGBWl@qM5bpc(qB-I8PPOf1L|FALj69Uv%KeLmSakl}+%oRrM*hfzsw6 z2T&K?oe(b3uP|a1iV$E=zTd=;F9=Fb$aaMMigf@P__0GGJ2^0RUt~r&7H6c`hDP+- zn#qRPTaO8jWk?N z-VytOU$0*2&+RWAU>rc;Tha14%#UM_YZOrHiY3wrAl+i1w8PNzKm$LYWl0mGC;vq= ziHM~K&3KwI#omx)QqaE{wPy)IXKWsT~TtcO>1|? zq1r@}E0BDK!99VlER+J;*z@)A{Ou4Q=|YYl0T}GZ5r-c*@qpAJ_$eg}EvFpW7V0cB zsQM@_d(H^7%#0+Q^0eeTM3-oCq^De+sHz`st&XT^bdxkNILN!09aZ4<5OH zxl|#AK1H#*dP;5l>{hWf61^#{A&t)yfeDDlOAho(RF;;?tIMWSmQ(G}x|%)7tgI+D z$0=Z7*mVQ=`I>95`vq^4AbhpSKiz*2e(Hc6*mr<2Bz-H#FX=hqmL6QGbPbd=O{ytX z0*r)k@yc}K7^;bPrdZgaXQbK%V4ATZ*DD6f5#H7t7ju`&jKy)WnN&TS`{7aE>A~;bXPb9{g0rBySO17T?Cw1z%JhK$yB}NBH?O zK$Bf>a8u`-_@zb>ehBd5#RRa-zh{>m`Rswk!Y@(+EDkJ{L9Wt3IXEXBMhe96wi3sL zmPY5gG#!XHzH0JVC2dMUxVE+~tuvCJjgA0#dB8v@r&UO}2SU;vWrD~^CZCWF363FB z5XP9;R$kZygW6s{E1(oLO(<&MoVazmKfW~!KL{3yoMhb_+RkT%Uu1~Q)|tQ$`y2R~ ze+L#bhGY#U!%ilGEjbFou;Jm!GU{7D0|3D!jvcK8Vp*E!)A)2Kpz z|F`%7j`35?ok`l%20Ad@EoUshz_)mxr*JR=!u;|BymDz_j7=-S%r1>#cFnXEO)$w9 z6?d%*J>>+PMbctP<(Z4fviGt#0;1vc5Sr;JbQm;!JKna`@Du_q?ba>7TK!VPha=P9 z%UmDfm;NNe)J4CQ;wlL>BgrSHXM#$N>gGG+Nq(E6#gznnyuKA`FUCME;JU8ciRT+X zv5UkR)|b@!Ig1&6`<ckJ zxP&z)8-VfC(JdSUGgUH8pbFS>z=)N$v0`Ndro2m{1$Gq3@uT7zMZek0dyRN3DJB?^^F2Qpp)+cSsLN}ru(APOt?a@br;YiEf%^= zI%+~|nMkptxRm6N@xgrptHw_o_gW|$8h>EP5{BQFEQu+A3?M~%MiYQ?j?L@J_pH7W zTJd3NjEW$hC1RyHPH1^C+?a`g>3nKXcUbUF`h}nP8&-w3QNGrDOl4E*_QDfRC_<0vs^Nuk4VC=|?5VyUe*zZ1fu zSRMd*(E{*G<(A$7r;fJ4rA)zsF+#$9U471mPG=a)7+^`lPVb)qr z1T(#aRZ1OtT~7ib<7j%YTud)6^n&OBC;W2g^1wlvRdDngw96T97QGPtP=LnIYFG7X z0?2LzX0)_o6TiOE;S2!z%bjX#SSdjUF-1dDF(4!W$Rw&S zzZ5`V2HRruPbyfYiz0%G@FP?Za;GaPNAKpFZpE72EOw2E38n*M7DVtFvWf4EjDVd| z6F*sZ5~E7~Xwr|jLp&K({A(usWc(C8z$R0Wso%iwa?Y#7f=FnwVAvqbt&|<-3Vul- zd#8BAsKGA$RIL~0Mp7V?*&sQ$)hbXTwl?W%6jqZgh<^v+*C?W3*K`e<#X>7FOnNZg z(^?q}a0&kq3njNfU$s7pemRANa`!v@>J)@~}(;KKU=;m(MO#FjWDA zN@WvkAUOG#(Zbn>T=jWfjCRP?FO>!cC6O)5tps2wi2?*lt4T>X*j68?I=Ysfe- ziaKfasns|MK!^BZewjdd;J^ZR65PbXuRF(2&E9}d{L?LQhi?u8oCuh7oU~yMp9}}^ z8B>*!`%5`~n2$g*hcE__LVOV+!Pi&ix1-dM{7a3*a=?@2A`G)QcJVtq(d|Zmg#%`8 z^>sQj>jFBu)To1(aw@bSBq{BeKSkIwlmK)g&hKx%0l+>Mv)ft7ZK33_XPu zyJ@RKgToYz27dXq#J?Q8_yj-2r4g>2f357Z3uOEdKVTi|M_~qjn2#KXwur~1Xw1BM zz!o7xg#~j}UrP5w(eNgSBvhE?LG(V!0`d+m0;REfN8m@472jF-0i7UOgN03#rMUwD zXlmi$xIR<8w6wO)=vJL)N8>Qw)xE~gddy6DVf_4C6p*GB+@T>#k>G7&2%r3BxwVsh z+*$Y;RQWMMND(l85g_`C5x>&5i6tcLN=Fc^w}X8!!;#idq@8IY=0G3|JZYGzk*KPw z&8AlFmHQxAgkQR#i~fa_gq%L|$V)oK((Y!bZ>6|^4o;B60D@zGRmwCT$+=k=aU2)A zH3cY_-&8!nX~Ndr(`+m5u!#u#8k*kze*WMDAPO+)zyJT^|6>R&ramv8lVx)c$+9`w zi(R|bM{|%Tu5p3%huLYHZ_nnxeq;8&d!Njft-CRM$BjF)8-DoP>?KF{Wy{_&o}G2& zgW2h$w`A|R{rlMmAO2;wcry^P%r%fBeav*_yY1BwOA$ zkiGp+zLI_7z605fJARVA?b5%<&OGmUu6rAJvn<@{jah={@mW|vQPYTwt_OfuKQitJFoag zcKqod%&y)2^K8*^*Jo`nIW~LoAH6jz9(QUs^4@P|fB5oZHu8b*W~ZHXL$-G8%h`Lj zd@Fm;)_=-2{-=M+2H*EUwz%uY?40-9mVNj$d$SwAb0FJt(?4cw&iiEc@dtmIz57ph zWv?xsoh?6QQ?|JH-fY95?Z0K8_{RUpO6wlVPCb1pJLPSEo(*pJ$LySU-j{v# zr~iZeHe{0z{%iJEdkw(U*|poVb!Y$AY{~MwvbVqI%h`KB^53$X?tLy> zvwBB%&+Y@+f>-=WcK5^Jlyzob{K2zX)_zgeKEE%!_ZJ7U4V&)IN~hnSt$FtsvK4DS zlJ$0dJX^Tn^z0qy@5xpyzdO5j=l-nt$~D9cz5=pzx`#l^4vSK>%Rd%U%V*0^0SX-OM9=( z{^-@Kv+BD)k)3nt-(@d8>h;;5-Sy+F`u2OWJDxg_UHgOm*=twdnytU;k!<2q4`*xN zd1JQX4MW*G|Kq*c&42sTY}MPZ%-;Rc2eXdXoRhuxV^3v&^4HI0>jwWg>wDt`+0v8G z%gz|&dH4M^yYw%f$X>B@Jp0P`4rDJr{OBzEzh07k`Nz*>o4)vT_QBhp$WC0oF+1sv zS7k4qzbI>OUz)x9Paet2)tj^Ns~^w)vQkiwQKIKxpTR)aC&;@ z&Yg!HcG$7}yX!7?ygBSJPTs}&yLR4n*9Di{zjf=fv9YPKy;FO~+OHkkeeLeCtz*l! z?wwl3;kC=I-EnREwL7*hyLM>np8B$_L$_VlKL7Lcub;nm?b`X;=)<2oe6V)yj`?eK zeE-_^_GLSk?P%Be%hs+Pnm@$H{5|uB?jPE*c4+OM%kIC7kNNZOU%zqV^v3B^r`J!f zU$}nZCDT7zcnSYbU3l6wn@e_Ha>>Gl3#WfH&Ho=QJoU?S>Rac|nX_ol+&kw`>qT?F zOhp$h1QE_UEn>TC&Mwf=U32CJ6gw9h3P4b;7ak@wb{_i&cO7=DpaG2O+otwTP3@g| z_1G5$##S~{tN8!Lu~(0c?HyYN96-ar_G{OI$?j!Sd$;acO9hpvVtg6|ZQ41>=Z>{o zcI;l(zPEi@J7+HA_C0GS+IQ^PF~qg@Jv-QIZ{O3-mG;}dyME*Pxj&k_V(tTiVtNG? z=JQ8C-udH&3)fGB3IFG6XZn(9Dpy}LXIFhu-6+g~1&bE$qQR%{!demiaq&n+zNx6jT}ky8r$FL-(%Tvv$wK9tqL< z_3P)Zm`*St5WoN(BpW0?)`LOdF%1xlHmcTCcFwNDcP&~pXD79HZKrom&)Eqfc1^<+q=o8$gea@nd$o}D|1an`v&OMBKrsrq_6lsrr zcBL601Sp6Cl7sjY035)(!|s~9b!saZz=yG!sZ~>ql!cTaDywviIzS1L~_T4^I)%Q%S-J;6Ji5)w(NL}m@Tyr+Q3>+jH zFEb3{|MUY8f!Yg*h5IEIf@1yL=}Q*PsqeZ?dTG4zb9QohCpUouNJu_R1hfKK zfI~t-Ku8Ak|FE441&fr!VTWCE*T${8u@eG8TLc7o_~I%l3rP!y5W++VvAA}}-rcAO zs^b>jv0G%&0rj>7=*rq16LYq#ZQl)4IS%Mb2(e5TO$RiKiGvzh3j}l5Z=4%ifo4~l zyRe%rb?=@FtNBFK7f!EOxNzh2oe&=Fh=l|U-LrEpby|2Vm78lUa@cfDJXk0;m;#c8 zKM)I03dn>^g>iru^{uS-1_b@r!V0xNVzFul0SQdZ1}V!O`nPotVnH*f>bZH_E$mco zj$2naOsKh$99rKvP<3wQ6!HL3q+PWqKCHce$Ncp#oBKeB!~;S>6qwsRJ-1ss0%IqT zK#iSJ7(bqi@32*#!t^d1$myMjP1CSc_gF*#ZE3_3a6qsSjF1Zpg|Rp`)Z|X;e(cWa zoyS5BwCD6~=7Z#6_t@Chy|@lo4gMr4!1C%b45ega+16`!Tz1=KTX(>9;Sd!Rd? zli1N7G?51}VT5#_aM)rY5F7p{S#J>9*p{VhVuT8eJh6n8mjsKVOg&;`f=rZ9ZRm&J zq@zGVPcCgk5Hl0cGC1AWlgK1piAj18aA~*$*P!W9jDj~37<*!g>x_v-QNE8Dn1DnV zDkz+TyrLoHiHR8X_x=0G5%u1YbaZrdWNZEVU;kQr?R}0y1rPh`w`LDd7n+fV&Q52C z$j}6bF=X&gQ}XDJv1*Kk!1BM2Nj12mlqv%{Kupm8tL2N$`K~zvt1&>4W_JD$HIZ2WKV0tn0*RL57g@DHyr>wy!64$BCFHWr&{>viJA zR~Y*CD`+rZJmjmV%j&3<$-z%wFAqX-E`R{DF_}HM!bO(#^^$UgB=Q7Cye1A{+winA zJnfEK7_9AV;`wfMxlJU4o_@Hvxc9G%dw)mDTwze*5cR7dfa+z@d`%YxL;{!Kuo5fF zZrAnt$)xi-eE5#GfA!s0RV%`gXl);vAkBP1Te1iq;tc<;i6@uaf9o@cCpGrkKMz>cUO zAwVb&5&N|q6y^}bP!fj*8!`gN-~dFDg$mqf*I`Aa#@{;Kectqx?rCv`_$SVZ1;H3J~SFMKhCsE02GNj2IruXL8&F4)!bm!-C0} zjcXK0@~Yra;2Lxn-V!xwaWVv);x9S|L4y^+19yNLkm1!^@Cgd9-@ev-DNrD=ZD~{% zS8hFB#z>ky$5eFiJuwIp>+A9(pBKaBi-k$LP&V{LE@TM@;ucbzM|iHifb}Z+e3eQ5ZL|IcLYlLkUSC?!iMh(7oHL* z;@a9BtK$$@i4eNRDkYK4^&>?f-s6Gny;*m;S&u>>6~-6iCXgMHJd!{v2il}AMi)@Z za9$(9!L~ym{sH585`rj1g#qste?Sa9&ZhU-C#+6{G=*9vY>xZU1@{Mwar5u#UHm|{ z{1=mE+TJkv7hpgw@DKYGKoM17rBY%Y2GEK)yH-5Bc)7g3@bUs4yu5hH#(Hp&{w^E` z0vCL$_(t~Rqxi)_>kt4=J4m9Afa&oI8(Ah4I|~+N2M0h1un@N_v4&MKonr+K@dr4dI0ywzEf%4AWoDs% zzB#oRdXoqP$J(Xv2;a!6Jh8b72%&_kkheSSaeFXs^k;n{XMeTchYW=egTdm{uYiCX z#ggxSKoS+q(hUa!UQ&v}U*I=5K?Sp91z~~K7L0^SxB(b8x<0|)u#4&y<;yS_kLL}h`>%I|D^NkH)Yi!X4JAM8*-1S#=4?!JIoSWKg$ zl~^1g%%603lPA~^C=tsH6V5%>T`uJ4881(y8;!=$YAB1aAUtECk+|t@# zQKiI7kWC~(2ch4A9K3$|T2*+B{dxslU$7}zgrnMwPaq7KdK7hNu9G}Vg|s?{UEEw; z+$fd6QNaM7^hy`tL#sm;8P~w_IK5c}jjS|O8aaQ#%g!P%cpEn4=3!Yp8oPu80BCOu zF1%~{&=@oteg9U;ry9T%J`C#p@j72sB(PZxAfft!!1)6y1v}uxTTyuG9g7z52aR_- z_OX%<7y5-kKssO-j6fxurT1CkzyVG64VyE>FFJc=Jg6~~1f~{zT zrc~Y$Sm1-wP=K221Hz~?gaaIHz6cEVBkGM+2+-~fPV0@vN~2Ss4f^Or2%~2Vy71vC z2?6ZK`<28WeurM*5>}|8$?MnuRA7(-rh&qc=k*0K&>mc&Xrz39NrUrPc-dShhQ3_* z?ec;?gXQbZ^_$@i8qov@8G$nyITxBx1stRV=3<+EFmGRxsJ7GKt`6(t@S*Yu4=9Jk zbP3S#Hn7DJ0RX6X@P%=szCtIXvpQ>ljk&cz1S#YJ(*G0Yh5>UQsXPUSgbFW~*)(fp)j8!J>ZZ%MSMU$NdIUKsqT&$RvCpR~qyuPZ!@Vzaq@T{_g?-p)p{f zh;9)gUM(-bkPR#-rM`f!@vOXMgN84j9)e)5^02Vp?V4Mv98a6#q&(gnL5SfE3x{!_ zZ-U>&@~~dlCsJ@Rg|tgG(KhHID?$p(M=k>cOS&Hw6a^_023QUOc->eTub#GrpWxyq(RRR1@$m|&_7}n zuh*B47GJK*2cB>_dRJ=0Q&ba$Xg0b3*WqyI2ug4i`6eRyQm0wy)<**jW)X}ce|+&k z0UIPl^&W4F%fFXym`8^UzO6`h35N>GI3gtw zN;(>BkDB;;{C@erJ$>~$R1koGAR&rByoMNW(KAgF1lKgM=JQN^OxyZu9j91-*<4T} zy3izq5DJ=Hc^o!}JHsKIDBy{qbXdO_;t|EBDp>fk+T*hz*q)lpCI=1&$xe3REd??(6c->~g2R6$WXy3;HPn;!h3*)?NUTiqfUS^2 zkFc9vuZvQ3_oZ1ksQD;TSyV(xAYB-&p01cM9(NQ5C7>~0sW;jK1ftOq9CAr(5fGz~ zZ>)|M7t=R>@$|nXVbnF|ESPga81w}IC|DE-uu=eIh1$T&sAKkGmrGX|LWNL=^r3kK z4%`6*7vbg`2n|?vS}7Oe2j-BPk5kA1@Ug1M;>y>q()&;)Dje)iWW)-B#m{nZ#Ty{EtiZx;O?l z7Bt|4eK63NAB{^O4pkDZ@$Cj8(Pl4xLB7yw9OE5iP7Oo@Z3GB-gGS;W{eE|mZ(=he zgl{8}$|W})B`{Qp0|(i%qz(j4UBh?~AoKwBK;yv!R$!m5Ar8o7Vk07{2qb+NqLT=O z@j_jY4=QHY<|n%28r}I?mE^S`c!vlqk|N^p??6!j0UYU6nN8yxCJf|GIDQ+^>^J)D z@ycM842sBsTdNp=#y%9yX%VtPEx5v3sdPx#S0`tI?$OgbuhqVk2!;Z5`%bI z1OQ!(ha5FuE^2@H@zO8605Hwch15jd1XbYMo8DzR~Og~-{i&+K>8=k$G% z=#QYtXc52v3O>BW0q_axjyi(37rDJ%Aa@iCj!VnVo45Fceo+<#a`7eiqlKgH(M!4! z%gu$R`T&GLA@y~O^_!cc;m%I?ej;1wkMU{VL|mJ|z!$_G84v;_iW*6M8E`bS+CUh{ zCvgq#*=0A%>Z4r1Pxp_FJk20>L1yRv(6-aDTr8H4G^H z75`XseQ_|-kOa>_5sd_dgbkm?Adjr&!Gk!6lLr_EfuOP4#tS;LI+;{|6{Voqw^ zqEbmh(Y&PqbY__(7iAe;C~h@fMz(HnIazcTZ=Kns#F zzBO9V{z9?*_QhLvA_p|-9uABt_4Qjj`4-MsCl5aEXkZPK$q9wzXiTXBIydGl!fW}>Z_ zA_^tFj)7WN5STv&jMa?gi<_U20|KFTbQGC!XQkem;TlAT`iuZdElw_QTSYZQz)d%1 zjoxgsXq;CZxEnZG>j~UmKms3?MD7Vg{DQW{Jhi}GU?8(GN{`SfkO>5^xp?u1|D~In zgOv#n)g|a*4Tq@1#J~v&yfYTe^I|tRU^U)>Q3eksawHH~$WzwU^D3hpD&)hWT6&O9 zB-yP&kww;NeX^(3*{qIAXn4QfhXNu{aiZ54bzh>v}RZ}mV3gC&NWH&bkA*A15BO&HwZ< z@5v^bUDUtZ>}~R5Sq+Fp5-3cdy6|DQMdYmX0W|zra}gX=1KXQ$fnDU)kp}n8%V%>G z27`Y)9sfJTkrE!2ZL1LEVNidX*#-vNX$lRASX8GdP z#S6O_WKRI|7Hxnc7mIMfun8M9n-D1KgbR2&cwo_NF`DiX*8 zLD5_@f^ND_@*tKSY1hT*&l5h=B|Y#^Py&V>?!<}-tl-Fk9I*L^x;8o0B2ASB>O+Bq zCqrT~O)=pCFif$vkCi1*u%9p&So+9=J!1&5y!?tP zguMz}A@P#vQ5*$-*+UPooTzC!9e)TAb{X{v2_N0-CT0|W|90h60GbM^%tsj}_W%J7 zt({?4666k!M_>dWitmF5)@Ty_Ppt2E`tUng*l*Na7eHY2qQWBOmwYDgvvLF%`jAf1 zorDzqHs)({?lE5og2jX^ied@sAob}sF7J^&*^{C|Wf*}E`oo^O7?WM#0=8s%|G;;izW~tQKW%f`o6mZ6ov~mGZ^}rn{KPy?MDNO9SIU)`iQ~- z78wlj^wbPY8CO^TjSgqQA%zFK+*!m3xgcezBLoDAe2%;!ZLfQ6^m$r3UeWc}QQ{ilpjJ-)_RlwT>5G~Q21wnv?kBra0<~lbKCa-yaM+^n zg927AfuXS$G`NF|JRb)Gt7ss`Sbqk2i$X*&LkUAp-!c=rYqtUtnMnJbZQ^G!UskZE z(QhFSj4xn17%WJH*KhFy*g$HDr>OOY3LJzn7mX4J+n5I^7$H62@&Z~+$R0>18L4bOeS5RF{%U>CWMO&z z#X6Xv6LukRiDVC=LPr`LN`E3w5f}^txISzE2=>5+ZgX*k(-isRL8cN?^2kVozR?AX z5JxC^f6^sTgaLvP4)_wYC^C@-C0Fc_Fb5#Bh<|kuoRl&lL-T#`2~gkpGytTuX$-We;G1j>LS7yv;siA;8>DBv0E&8JV- z7vEm2lRhj1gl6xF0c;Qy+<Vf#GKFVh@}5 z!~iVB1R7Y44h}@ik~5TM#-L|BcES z1A`PLfr1E*(}_@+;jl!ODbjG(n4V>I1}8)S3}#}1Th#d)uz?XtI#U-4A!CgGvL5081R-pw7q;l9CpQF z*H8-#9&0!KbokBnLA!@eUR{Ag9K#khk!0GE3{fp;T!G=0o|9yoDGlx zBqqDNliice-3chfHt0^8Jfa#?>TOZUxkw5{;X^Pp$WAC@{@Z_lb9UCa>Ro{YjL_6* zr1}s^AQu3Ilonu01jF$xdfiE?0YMx}W*$PALrI7kOz2%U+KA;ecYPx~xC|W{vs0Rb zbkg9U$#x{3u2&+t&?KE;(HAhE-U4N9oS{TapwQ)q!_%F~No(hHXZQBtKN zu~!Zslu5J2VONPXeSi=X5L6!cGaN|IWbtqQUvR)N!~r_!Av7zYfs`7u6Cx=Gc*h9Z@b2Mfy!nraTi0(g~rpQ*lcuI)6Ys2 z5R_Hx4^>sph+)vsTdXuxOh^tLFG$2x4hjsgVK&F1-+`9kz-g~^BT1x6@l8rpDv2`? zETMuJa9gBjN!}1T2m;LBsek-vZZopmQ1pE4olZUm5Nsl{AMCF?N}J3K1BMpZ{a6(KrJJLmxO8CyG~qKqslB zNdyyoEXYEILI12$2K*#sunq$b^FCifv&n% z>vXoFk3gVHL>Y=lSZUB5NDYh0o!yhs=E1>1e|z)99+dfnjF@x$uAQ2@b~bckCN-{>Cxsn#atqf^u; z_oJMKGSou|6cZvi)o+!`+zKPrsbOOHl*A#zfLP!=nevtKY{9TwxgsG5ofwVnxd#M+ zaMxvR1`f=7a3Nw?vL-4JFeo_S4M^kS`d$<=D!GS8K!^wftsQ~H44nP2b#jX~^bUHr zC$0Og>Nn|5nv+)7P$4B`z7k+!0SgKS!J%XiRv^Hl^)HuZeOGijudb$v6bJ!OIC%vQ zv^{x(iEmj9CZZFE00~5t_oNYANrw^;445p9_DZA?PY5lF{j~}R`7oNWAe5*>`T^#S zhEKW`(7+@rWPldHQuI;RPl^z?*y&D2P@xA5+x?U7AvU)7lXwNmgI-}B*J_1%k{?4r zbO=$1SA-FIMz=frm+RFw{bPZE-^_s2Qig2J1PF$!17aukt~!d15HeteURHjA3zbP9 zrjLaR0+9|?1AhPjF{l{9Q@iF1P(mf`WEDQ34={qnQdNM?bSGHoa{_?OP$5%aC`K(YwMat}H(o zF=%)uw-7)eglCsIql1U1QUF16C!&QDUn;*4f+SF`=}26*r-cu~AOd9#5XZISl}7k5 z5(vL)lauCcImLmbK_G5SBX9OBJgIPtuK2=N!g;n0rp!IoDoKf_>$)ZMq_4)B4#W|dExR3rj6HhxNAr}^z2Mt2Q;WGtZ3l0UsJ_0us;r8H` zOmezE-8>lq!)S6pf)6JHPqQhWp_Q=}eaI9L@tEiv<`cY=0|2B&{saVcI2%1ma|F*m zV=v}X-ZT|HAQpPY%wD+4NMglAV)|jQg~WkLaj=2aW!wTRQiBr=0woF&0HTw}wUy%) zkXV`F%M~5K01A|>hi4GLLFi8;P?SzZcX((!^5rKWfXq#3{MIHxvyVz{?{8A4C1+M} z>YJ^})7NI^dKpxxfB;If2>wh~^Ju}l{EOib6t)_xl#Jj4&Ot@$>dH!-)n;JO3mP-> z2jl`xG`l$KDW}YnzN}wzo)N$RM9MBk3jM?Gb~>9SXvQrh0`Y=nNj|L1!iK~Pk|=AA zC*V9dK?{Lwja#GP>#zRL?_L{oMN>NHUUWAlLitNd z!x!;lh+8mraYgS!ec;rPt6sHDLS=qU>_8il$fVh{y}hp}1TZ-7hjVl7RX_#9qziO# zNl&wYkVp|eBvQbKmDxZH44d&#G#f$?F!T`g5hKhXt8Y!sNso?1sto8Mh}1W4@91vZ zxfq>{`lFAdQ45(E)z|<2cRzgfR169ZNQ1ZH5I*sjT(c=ihLG-{H*KhoRA5BoN@Cdk zHd@9tkj!!e7CPZN%+*z$2~ft08N>TPr7YqQvrF9r1XiGcF5zSD6p=_h!UY_R7U2WT z1OxSf+Ee=3(7{NdK$1Lxg&Fgqw+Z&+5&*GVH>JM269&56BNyUmYqU9NzU7($KfK~p zRZcoGUh-GW8w54>2U1_j2p5zSwFL+L!ng?%XS6sTg3;+rBcFDuX?V*LGK2&Jzv28# z^m9Dp6dR|A8YLLP76tr4D!>O&s20TmD(D_25|=gH0xAGR3R3BCKF}dGNxKv9*~QL8 zddwt{hm)N#DZ&^ab`R`eZQqeo4@RSM$1yhVFF5s+lRp^(kPkL@>2Bta6;>H8atjwg z1bJwjZ36>iEmxMTRR@x6t(Oye1~5219QV%)_|O}y*v%w>sFO*f3IY#KL7Cb;k^r;Y zL4mDfb^r(2L%-laW6 zSlmqyM*Ypr5qIeDarg8o7nS0|A^;I_(A1zA910i01lS-%zT55gdN2S8kOiQC3iycr zF$DvZQV_snmZ_ft!_sEF((D?~04rzA#vQE1$97xPldv+`h3&O7x z%qQVRc;NqG21vb!`Hr$oAq1m2j=~|9ebrK7;HLA71m&s#0&zGCF&IIQKqL;IT|#X@ z9l6(h6mKXn6jHzkqh`ne5caz5T98EO8}LCspH>>#VX6x;l94#ZvsFSh;N#}WN7AS5 zDe7>$IoJdP0>NW@>ryU~YYv2f7xJyQx0f)jcQLw77$1%XN&^8^_xRUk?z4nFXUs>>}O zD9ky9k`zJ|9KAdRicr_@ZZ{bgv<@~Ugb&EDdC*4~w)YXqeqR{+umK!KUC!g?d>+q~ zk5m#dlz~V@*fpszU>7@ifXbxahYoZEKmfgz8YGqu&2sO-d6>Y$-0=PkHaJ0CN9Z}` zN7ii@OLw4>Q%359LrpMNvS_kFg6C=pE6@i@_ARP%e2efQuHo<#Zb4OYuY?M6h6yMf zl0OnKb%sOP03QY)DLZWKznk9e_wb5aK;Z79x&9R=_JG1yzx(0ufB1^|>k6R@_J;}T zgHDkZqkn#b$w}|*4ohtOARsR^xGxl-g4yL3R`8kyCiF6Tr%(cf0W;=jEe^o|hq$!< zQKI&>mxXUL^75`v;Yd&ut-z+9g|1j-=8qQfewVuF)&-$>{Em4-JRWm zLk}EoDMNq+=UQ;q!duSylM!5UjjlIE9v1sD_Dl{ZU1WETh41iU(x0{)SMS>Ipn`I# zP6P?5F`Wv7OIc^LAupzMz8&QxrAp>N;vf|Bd{O|iD2vBy$F((9OB)4@3J1tQca!fB zKG5G>q$b2yPH!{01318hj=c$r3XuMU+S6dS4ixbVYETDfxCTIg!f3=3IJ|tzY2v@* zj4mX?Gu{?R9RkFpMV{3f^T!e~@_#Kz`Tx7E-q}93+eeLclwknDh^amTKoJMI@Zb|>4&1?E?i4)F>CjIqSzt&CVFAXDAGy;h8tGyqnm^y~ ze%wV6s6~=BE0crK$IX6k|E?hnxJCE?3N7Z8!v!v;1Og$1*|oFfP>2-2pafwj5)rQy z1pdunf9q_EzVX@C*;F9(grFcD&Zbwrwx>;KZAFO!%#?BjHCyVq)?gY95~VNo5#y^U zi63l$1$2-NO9BEA7$MVdQqkhqru5^zxQYh zr|9=K14Ll(EH6&x0R&cFe2#1105LZ$#xuZbFglqG?c0=Q7~&b7?XAiyD$^O7&#gFz z*n|oxyJbs0wApQkldgG^?Ie?x^*$9_U4sI`Py+!<4szjABraEKv;L%yxB5-|I_6PH z9;o1#gtALMjXI3IAqktn@Uj094Cq?^83!Ub3)QfR4nJfX0FO_qX*?}QIT zu@bsgA4R?^)*+LpZ%WlG&y4G0Emh4rR0 zhPSLzRbkT%!UYZ#uaFF6)5mMIrL_&pa7(y{0s$J}pg!Of!J&L1>yu!hO7P7RDheIU zr=9I`fF=+&L1FVF(PFSUFr(g|_Dv>9r#GboZidDHgbV$}$cNhldRGaWbhztw zxi=}!A~Z0I0O1^D;KOmdo0E0wACiSCPecArBm$usiLFYOMpI(xjjROX3z%fu)!a8FY{hU&019-3lL6ZZr~B*f0!lhYfsH zJQ=?*-y=}i%Oq;5lBAO-l6ur{^*4KPVH=U`^=}9LRv58KH{OQl)Z}8xS2UcN zw_s3Cr(jrW3KcNcdlAdCGVPxF6sKZ3+eH+VhO*-MxK>3*``WLmNlq)r=J2(bS5|MC<6yMY6WqI0j)8rNmprsQd+jgpndTAS0GonO4SAD#?Tp z@?!iUlHmS&g?dVjbUfK=Bp{!$Dy;YkHbW^)OF4^2(TKqWExj1x1hT_&xD z5q{jIZ9SG{&G_iD!~oXiWhAof0HRB#K2YzR88M2BGGQ)-d&xj=fG;l)^p5YlyXKS3 zdf|yP3jhQhHj&BcbZd*$fmcupOmF`%`;rdD)TnLlNYl2Ju9{zGbqVBGZmsNnd9STX?rh$gKMY`szwyTKg1s)8~{UEd;t|Ig>+M- zi5HDgi+VLYj<%USa7rR$7M7|ra6u9w5)(=>P-3UfsTE`70h>|H{%x-}-I|gZ1_$As z{wIbB=Zq-w;JhoFUP`#(y?^IU@+0QMUFgT0dtU`yZ!9^TK^p{l#JVTXS*C{yXLZxJ^o0I2;9Y!tccDz%kL?99~_>4o_ zq!A40PW%&wUu?oyuD8i84gQ52be%g;Y|k;i5*I%t6up%v_9Y-dD3G><(+GsU3^8EE zqe7z?T-0)Q>2R;ZSQQM3m%2h=(C#dtqF2N<@_e~;OsdH!4s!*-Aw&NbU@-oLNWg`J zPUtXX&If!zCUuW7u3?a5Fid(qfHoB@gZ{gAO}O<@$`n+j`i6T2R{T3 zgZ`%#N2K|}Ngo16iJR{+-bcZqh=g!dF;ho@4dRe&!qlqYhe9HSU_q;MhYzCQ7KaI17Gcmc;KLRq#fWx0 z&X9A((|f#yV0G5cpd-T5pB0N#{a+r1XIOSW?U`+u{*egvwhWOA=xEHf#_?cIQAp zetb!nB0vCu7_bOK5DE(Mm052_VG+4A`=MasSr=UK!TGasiXn{16u}NuKq9c8vMmJ( z%I*wrnpQIL1vGS#qLf&OMp z=4g>Qu~g8xv%b0Y)5;Tqrn%IU%b$+Z$&wE|He40k9EJ%np+tEhBANPA%{}?Bb878=czTa_b2*pvK(PTV zDEV(<8S&;b7i@Qk;B3hhUH}0YoNbBK%)HIm=6#o0Bz#g~$s2b4XIpv$-HM0CWE-=E zfL#ILGX{bo55&NQo`qqvEcu9^!~ph{zO@-^PY4-A2}OdXSdc!4+}1W)vC3@R@xJ`iD0+&(i%K57XHyQ{_a04hAuw97?Acky~m| zqG9|(-{6tpAPyBJit*^o5WmosMkAPkNRqFA|2@|KRDFHzA*Gb(wGFrsI%ts8V4tgM z?Ur#<9K=Pm6b4j*wc>y#tT~D$DY6hSEBnPo)vR68VeFX;q44x9-~$)0zHo9FKsd1) zIGzok(c`4gSWhe$(ljqY$vsBso@!3*;NGx{1h zM#n#`Kn7~mVDSW%teRBM&@w#3C%1e6LT&{S3h(9)g20la!iKD1L}k55aL06$YnB`d z49Az#nO$c>pZc)8&ZTi)y#A*b7cV^VLP|gi`$hISyW-*Ga`IUh!CNvg8y8p@v*K8uhHNn@%ull7!-M|Hw`)59 zgib*c!O8q|JjJ6!YE2%+wZ=`W8Ol*5p+hVJ26BhQ%&x_YLWfD0&zd=)mZ(IX*TxSQ z9IDcX!Dv=H{$@>m;QQIhc!I?YV8m$2J-4uGM2Qe-Kq>8N+u?eE0ar+a&rt{jSgc?I z4DWr$B;oUz)3X3V7bkFfb#5^T7KG2Dl^OLWW|&qzGrvS1m`N)DD6AdUz!8CnMglsln2mCfpm!%7&Q>BB1BNj~z#U60l@Q;q{3I1>Ya6VBLXihJ;ao@KMcP^%3Kp0> zU%2qi%%Ve%a77!_%F>~D1xTQkS=i%yz+JlpnKl0Il331WD@F`1QA|o^GbP$CE z4PAsykRT@o$?tz!`3Z{t#8-^TqM;`gyY+`Jtn{r419m%+gW@dRs~n=0^dyzaC2@%T zb2#)9$Wqd&zz`qeBQvwg>1gb{D1Pfem(VwG3ld8-f!m=o?K{u9r%h69Pe0+igWbS- zy+~k)@>j7zGANZmz}?4A63QIG&>3o}UcxH-s}&dnrXf&36^7&MH2!h&M~T2lT*ZO4 z&rA@QxkymjOg#=5H~<9fHQ4NcAT(dZicn%LsIWh`9L?u&4a$@)TpE3N&DB715qE%4 zDun?QcF3rjhcq!kgP*nHBohFT4iu%xDrLB4>Jh+Do+-zecG*)MrvC3sI`N<&K4uiU z1|OxuwYl=m$~Ta-1`qH9>HABA`(8i!#AW39#U%uhkBQi1B@taFpB_&8)2Xd(V<)$c{m-$4uS=}vT`WONA|N8qDX@E zI;T(z8vDKH8564;=6|t(M2(j`HiTkL52`JJBDqwb{vx5%D}Wd)xFxNG4^m>MOC`c- z(a(lVvFC!ZB$F_K2Q^A-7$Jm{q)P@V6bToE2}od>*DxbHc(7@g4ZoOpq5{M+ZvON= zfs=@K{F81#*wh~?JThscK;U~C>Ut?K07&>C4t}6~2)C%63j=lfN+Gd53$q}~b0r-c z2*%|(A7<>dzd7k}K^y@fQgDL~#0x65rvS0|ta&)3&qa2b*~Rc#LJTB?NHF_>c*vrd zR!?N(nrrWpCFunPS^HZMLxT7YULha&Gb_hWfPip8TUsr{Qddq~!5UtP&PGUFOx0#d zp>I^{4glCInB#C#V+B5mD&g+KomUas1jQMf*v~k5k4d-93i|%ONbo$$rv`!Wn~DY z&ov2-pAas<0kISfJhmE}=ha$vh)V%zP6^R~&=x8k=?)H`p->;>1oy&#vPHBoktn>V z)p+ata&4(icemZR9dM~g0wwoUDU(@~Uq3r+p6;AJ0|3&hMYK8o)(E|4Or_*<+W3N}8(4v` zuL&U_!?RrV`GbAthbvW-J76J@dd!j!c5i(GDQJ|l>$l6ZUB7T84umd2*o4Xyj-De8G z!JyAoFM9oxL7$m(^cg8NNeEM;NPvX!tQCqIbSKiAkR}d?$rq8}q&~tXK=gZ#UQs^O z1$f{Zm=6dvmikbH!8dcW(#pFo!ejoB*)hqj0+YUw^g$c7-22ATWd#CT?(r6#Fo4o| z*{E^eC@1z3GVCAG-z0U=GoGQ0&(KH02AHs8Z0EBMABr|)O~9C&UdW)KaShu%TreHy z=ID7mq~ul{?SPnpr+2&t9oDWjJT1>G1zH-vs60cDDIoBM<`;grO)i)+Oo}prg1RK= zfkQD>6mSSII5&ob8yn^o%B5c6W8-{-J5o8QPfoi?A)5Hi3QTkFnc?DDQ>C z>uV^Xf3QFVI8i{!D79@5JmL_zJjlc310@J55OlY|0YWGUd|W8br2r4WxC{)J=Y=8I zE*ZcF7}hp8&>NRB<7XzACTCPQL?tv_DgePD{Y?`HigdQJI<^C@MLBp?xW%2?3_k0~3%(;_YPPemCv_+D`ZfRGU03qypUfZ$u90~>%MD#vA1 z&pxN!Pt$E$+Zb!}%K}WM?Rif8fDi%46?_1C$+B^N{`{OS7iSDRTM*wMMCuqQLvC- zD3e*}b+4^GzlIRk8`s~cma!1qwO8TD7tSi1Y#kRXj*qVhoT<&FV5w`wBQR5qD1IOy z0+4hYU<5%z7&hdCIGq3T>y0z6ZASsJLuJbRNypeRhob%fEvVG)Yu}2AG=&BC6Y`0<`v8M`fJ_hVs2hB}jA2MnN4FLr5g zW@6W=>;jQF6>F}L0TsC0?RA5jdAO)&%9-2sobEskPh<|WE0pj;x|MmP=m&`*X?RDY;G1GjS zaFL>YM}+AaPqXA{}yKKmwu`d-~31nS@JiQjejh zCSTZO2uPh2$KKkT>*v?U8yjz)e=FAbbLY zw;J%M5b_~BAa`I>PUt7pf8~Kd#4mVbW9jRk|MmA98yja=BNW0J0Hj2Vd!!CK#tx|9 z2*&XAaAMHBum8CHZR4PSa0LQPklI4*gM_K2Q>Ey3#a^6ZXo5g5jC_Mp^>HTKQQ2hJ z158j3$YBH~6Wdz(=K9Ts`oQut=^zF0<`1e^s7s=gI43Wz^$wR%X3hKo99RKEFu*Z@ zpe-RpLJFvyMhr5Cb3tL@PuGex1d{XL|MllzZ=7Fp5f1#q3xjyCv;mP&BJ5+S6DMP0 zW_z2<`D_CNIP6c~O>I!DN#~JOiZr%47gS>643ljEh(bTt&@pl#8F`ObLBXFn`kuye zY4f5E&w~ZFe#6UaC7`IH0h8_WA^-%3tQa0n+yn>wu7|!B!-u}Ts`=Ix($Dm-J zQ}wpCIGxN3s)Y}tP!?lEf`R2Kr{_DDhC3(XSniIGI9YuF481{b_6Da=Bi{hT2g8P| zHHuSfYagTp&#prltmh@bmB*UbKgoEv<+*r8lu}A~FM%@)?<&0<&s~nm_J0kOY%zrcg4Kw7-AGHnYa)H08wR zAQ9gup3;5T#rTn@Jc5NM`k|fKfdun*oF*iHWzo!xU@+gC})y>IP>5 ztB-1iC z{+X(fXXpcAgELtO84ZYfGlx%MG6j39b`jAg`j|6 zsFT<}hXDr>6F{k8A&xVh!VvLymss1t*I!3A|JdBc$$dkeLu z$G^FLL)%=Rzkv)(*r-~#Ecwj7vLwe4FA1@B{bmV6u9-(`ryCwfg~A3}T@9GyV9F3` zNCs{Yz$i-gZmb9#VsZXU36T`Sj8ZnFqfth^Q;qe~0JbU5!Ku&00bqb5aV|2Et=bzx!`e4d$q&y7pd06NP9$a& zW{_Yk1(1q5<%RKrrQpC?DmXc64g_Gp1no4(fcnOqt^%m!2n&*y{%{ab7|--IDt zD+03#GY6akYqui8soxNFrnNWvzsY14Sl|uO^qactIlcfGZ?fh!8<0YgxORNA0wQ22 zlkosThIOgAd*nG>kPqB~0)@}>Bxw?bKIhMW@yjKCL}vgQ_^})&y)m$w2ecvTz{}o2PK2j~$7yYz5zm!7O}6tse`nge z)GmTUC5PD04cn7oy8k&Z&MOd1F+d<|)FT=R4=PGj-HQk!C=ey8Tb^J;!9{ln8NPTM zLY)8N7w6~voHJ$0kbx(Dky9*~K*v>s$f&ql5|;w$zbok@7P&O0pDsD`(rm&d5@EZ4 zUK(Cm2~u#n>ma9XC>96w%m^k51i(ytTW!KMx7h#y=z*`=7e*QPVJV$w%10Wk1yM8#) z*_p=Ftr>)%=gg%Akq0%8#^2`T#oAqai!_^b%CJFCgZ;9_4Fy4(AQPg2+3ea@EN*Xk z0A)e5f3|l0jed|e#_A7CK)_85mUtmM2&-~}L*4`r5XoXMtLTFmfP_?-FR@=!!wZo} zBy~?zf@gQS@`*c~SZeUoYHFmM;2Mm@F_?4iwakZ|`aEnmE)dyhkCLm$NIUBzg z5Z=tf?T_|kAuw#9&Bj|nZu%&{GGC_=FK6Dj`G z96#dBJbZvKo$Bmx{r17Z)xkk2%k>N$XXMtn2Q?Y&7Kh3u!UkSl`34E-oro0Kgig5C zwyNrBe;jmny!IP#Fe#uQb-wicIbZMtXk61xwqLj+Q^`3U zO4T|h7t22ztZU?6#R<3bU}ZE}s&Qhhga8H9a>4oM7o-x-C2W#FP@be9#RdIq|JU6k zds;FA&Oa)q<0V+e!b>Euph5>7uyhS02X|hF90w)V-a;P&?*B$}`)(A!#|G~s!c?=C7-~vYThYL5#KKBF@&g!g7 z2d{$Q?~!}$Jto^4Kb_@sf5LL`tNow0|MT5Dt~oB*8`y0DzX)eVhW?=RCEa-dI`Uz9 z2Od90EQEqQgt+U9d!xOk$@k0IIIQ3lDGR{iPKyLqneveSi=CMl0v9tuHL<7?kc4FzUZL zxclkJPuq_WL7O}!I{hJ}FMC8|&_7T;AF+S?YP&)9y*&jt1fs?HoD(Kngi)Lbl8|r+0|`XV%bN2c)@X0BSuzx}vt~bwZZ z0?*tHI8G*D{+vpQUvP~O=)igVoRZn zrAnnLeZV06JP)naP~3iQuN&Fxt~@@!5(tp+%Ks&&Tu6qEN&*F^G~RfI@8Mx*ckru& z)st`j`N#bqwTgj^;`bQnQgBc>cyF8Qz=aRc0>5~~4!k3J>H9A1Rw$=eTi1WYDT0E9 zM{_;W9PZGABpc(Sojl(nH;5+{5(JoweY_WMtg-_91}T3p_&uVQ9#zoh69 zPQhqO9*(IEIADQWUhtA_KV!uk}Ya9c1D3A-IwB!>_RPQM(E4@n_* z#|MbRr~N)5RC&}tY=2A=2UlT5g9}7>skFP^)HN-SXH2=U4nTOsben=6mA%`o>Go{8 zzeW;`r5j4annh)~5K4p;yf{DKcpkZg9=zkxu%qGwC+?-kUB%7VSXo$Y3xRCW>avy< z>O}U;(eO2%aXDLQ3|i@SLIM*ikx(t23&*v^4hP$Z)BQ)(=ET8BQM93fjdZwNAVYw$ z>3auT@3g)5Zu*$w6-n0?bWkhWl>PUoyn|43+|0z;VndMxhqU;D1rN)~=wvY;N-!9y zZW2VuE?|Ro`#BvRPAjn2>0Nqgc!&_HR6xXjR@F1_mt%aJD=Kjz1!vfrV0$$suTcsN zz`?0&6e;UerudPE{ZHEsyy65d#OUZE&OsAT8{q}LulC*9K1|qe@1O0%4(-SEyN0L8 z-%ZgDt_lMLAxQ1le*^~dC9Cx*mN^my7!=kEEean50UmIK2GA3^P^#pdbpJwbDmlFE=zeT2l+z4JXws(8FDTHL-!J5(I3|0S3&G|GQx96Cu7W*H`k8h zy8Z_PK!`r54WyK~ej6l2Mq=O+*!T{c;e+`Uq){3YL3Ez2nfS2urYpbs<FV*{I-ZT!M{ofpzxgIC5+L z>Wo>9iJs)v+?5FvOQsgn$>3`46!49GnF)c>+!{7^?+&u#A7_->rqf4TTaS8ph0;ja zz$w@Sg)_iuD3QIptxpibDlZosEO8KVNc*huB`uj1ndB)d;R=xqKcXYllG?rCkWn0Q zD2Y^Y3E_x&JZU@c@jQcgo6_*+Z8FBpBNo*z1H4UY|3IL4<<-1Wtei*K6MX z5jsGKxQ5z?ZQRvI`Ou?40~b&P*1&;0Fx~+Q#dMD0`gAkUi%(6zx&9;N`)lN(#Ec+; z#gtTIH|zOkT!PnYe&urM!PTn#P{a~l!0c*a1IxJu30~!1td(wguX?I*^I#^H05Bac ze%ySKi(ugx-281VJwxAcB%|NIqiJCTi&65RakupdPtaIG0jR_c&LqQQug1r_cU$|2 z2H6vVqPT}K#G}RH^7@S_1Vh=3w%7wwFd@Yf;|s#UPM+AL=L`h#75w75SFSQ<3NdGc z33h3EjFcZ)X+N8y@TKi@1hNlL;Vx7R2ctSOE~;ORcls+S{5U7QaB8=7N159oAr7`- z1XtMy0|^m9@JcEBSV?X`ACjyIM=?SWG0ygJjCYXbF}yK&k5kb9(Vel zXJ&92z7apY=jD5$M2Q$)7|n(2KrqI4z~#HG$GGV3w(a9P+8lVy4S3zYYZD&Y`vi>X zJ7WbN!UMyB2pE`8qN=zMJ&wTv7}jWwLIlZ>J0mR`EhGgMzGp!JJUC@Q0<&ZYBM@Zu zx#44zHcN%FJGRDL{-mPeG3B-B@CSI*7!+FV@B_wH=YGp&1A&4bS5kze8H5pQCUP%Z}c;-rsj$vR+I#u{PNZf5b-v9R9 z-8-%{X3vU!`)xE~fB*69@h61h-PU_!Xt=UP)nv-nh+|J-LuQQh-` zZp+MmCn&tMBJ*2l!7v|JSdCV8Px-k`=2$yP$ke(r2dB7vzYh@<04zQ;QtngIrl|e+ zZvXMVO1W=BRm5>1hEOT1v$M5dn@EvB@a1UhOzF`hY6^iX;Q@`P2aF+TQg-K>&IJb7 z1Un1YhKnfWTpAEcBS~R|kYHsH2ns>qZ`^br>)Zp&W&60%;q1JZ-Gv1~s2Gtk&v1g@ znj}~t5Wfl%w7t#${?q&Y$Dj5QL)8Hk-~jY^Ow4#3mB4pE37F`I_2{4n!YD*1)u&K=~CWBmjdIc`s@d1B6ku+zyr%5XtGXiH^PF&=yZf+jz_ z#a3Sb#~tAX9gP_i$5Mw#__QKpcFoj6#&{6RT?hdq#Nx_o0`0op{sa(@_b)%$ahRGz z`J4>m9rnLRD3lNI(I4no=vg=spXXz`|)$&qWAO zOshkLpb$FD<3-ARC=K=(v zU@GK*;TU>a+!cTH!3go`@;xojmLP)qdePN+dFbpLO<8D`jC_T7`>!GgTTx8jdS17i10xq)||G%;wd>Sz#tO(KuICA4b{YSLqrG>99)%+0>aXg=Cksz z=T?9_c7HCegvCToBF4++TYeoQfy0?H@PUbAoHZa4=0qiAyjvl4dQ5!W?$OV_+kzC^ zMvEzzu17}WB%w+VO|WhU0z7Rq&*-d8#Q1<;*xWFIGiW%eidRrU6T~22euG*r1fh5Z zIi@;XxJUc$-KWR+%VPpY>1U8)L>BClhZYp_+fN*` z!a|xGD`P7BH%<~R#UQ&G+TmTcJ!S(gD2)?rQ{2nG+UK%&tu?hPNx zW;v)@)6wWRO7KJ;yfC@f==QS4#WP4NxjJX*bS47YgECR@XHu9%#jp)15J%oon0WlS zy$>sJ2^hiy+^o$2AV=_m6uV&&;)9&mC*%Z>=mZD?K*Sl??NoFq0S3pU;moHsmxK>4 zbTW!QJk(+vZAh6Bg^n%Xe|L*s31o4e8j zzKCDl?}qj4w;KX9ZWiAiwtPeinaY z()yfp8ZZSIFq_1hqKu$49Mi-(AOzBYURt0cYBum1&R-yC@|g@}_~Ax-<&m# zsJ?mZmj^Dzn9pWrXIVYKAS-;~=YxnSJY$?nSk5$tmtYJJ>Y#HFtH|1fJORVl&N~a<4mim&&Y$FG|H7{jY~$e^@~*Rt3*h( zAg^FA^mq;eOUyo}lBr`XeZV8qsc2`WoL@K(EUC6MM0(`LCeN`lmbw+IfgnpcEO_KY zzRw%%Sef;$Lv)i-{uU~z70#yfn$$Q3Kho?ud|;62QAPF|`&!00FpZ5;AR17CYAtX$ z$OTVu8_QATQYPR0;)y^oWsD|1e@+^;<~NcSkpG;U&yh!2aLrsHW=;VH1$N^^nNN%` z6zpPdF-bGZR$99lRj_z?WBxL#n4{hL42fGyjQu*+hcF~+WWCrleufg9PJw5r50IT6 z1Mv?x;1^@e3<~kd5EKa5pe!(za=T}#CZl1=G89dIB*`oHw3!R_!L-?cz>T^r2yh05 zqZX2w1m z3?FyAIJFnO*U1sm^_<6atAXQmGoK4gez(40JD9 z)lGepM2f_L-`a&0POH~|&r4z_X+#Xus31~csMaAs1VY34d}X|^JcOGIjBsQp2{u}( zTr#=?ASeVe!wa@Du;Y)Bk_};3>2EuAOtNRdli#0v#BauVyK``UBy@v)rw+lqkn{E~!JlK8AhK zuv+$De%Z<{S44+mxu*XII^+ee^sX*jn;EQOn8Mr{ zEZ~1bYg2bnAE`Oq^_>x75=qd2AHmCk(MJ22mX;7jAIzZijgmG<6&Qj<$ORV0HyMBP z_amuP2Zfky1BM3y!lo3O!ttts%jaXCw)-wmaSag&Cwv)Xe5brMgZ(nX=|ajxerL*_ z2AM>i^ILHW`QY3!evs2nRznc@1x?hGy(ojZ)uSF=Zn_x65F20YkX4VA5G?$-gLyN} z&gpoV4+Z!Vny+%&!(tz=uVn>3a-DnIj>CaO^jzHON1PU6-;?>J z-Iq=?b^f`r6GCvou+d5X(d^q^eIJ8xefWUwT4!TpE|${njctB#i?q5==fl&y$fw`| zF~)fiEdG{SuSVb7xPSxb1W+K3Aq)5(I0WzN7I2090Svft0c@_qe9Q$_w4Cppg>4qQ zTDrbafPk-Jp|EHp4{g`v98vZcvp;`=1M^`nc|B%wh<-t8>F-p+hy1*U-3;fTZ}-3X z7H>c$h#lJRL^=ZL735$iJfS~sKNP3HH=u}K0V+sD(Go-xRlQ_NAmM;e>7v1KB2yxg zLYhyQP?L6EbFb(C6KFXMzr-8j3&ktEMs?aUMkE#l3DGDp@J3}~APGj<7gFTl3abhz zvZ+nIRm;X{h64=Hk(=p z47QnhEnn6))JWr|ZC@6)B|z9)Diu=?R+{3Ju7k1jGvz(BFzntbOpi1|`x526wTYN*pFf84Dh)jTQ(*B%(4Fi!r9c zA_iv%hs5dt7TYV+gH_%N3T1DK5yT8n-!ir4r?Q+M!evCd{+@mP6Jfx`fSH@52q+Bm zBu7vXEW{8zBm`NNzr+P6KnNhb-W`OP4KEdmjjo+&#zsZMF2y9z%kOx z=(ajkraae(QeZZ1gIlm_tzPuTUrm1+1Xp zmI!?BDlb-?hHhR-V)>FE59H^C%&nbD$K^&l`+sJtkVsIY(;dpn41s81G%eF88_BpD zY61gWvcY>>e3;%csic}%5dbzg&jWBk0o@6XTY^L!qOhR$WPq@~6Vv7TpbG_~>R=4w>jdH%=VD8%%v zfmXXGBy_+B9Bf4zARs2NHbc&}f{X_&eU1!jlQ9-w=m%af$nW(8ZZs#IXoC&NPH7te zG*}GcQoJbqC`v(iJFyls%0k-?(*2ZMgO?=0udLB`oO_$qNn|ZG~LPiEjp{Q z86PcS*rSuxn#ryH~`rzRmzI$V$iGbk5R_Mv7lg#_HO z>jfam)P`+@&}r9; z?v>ih_UQZjdQI=s)4GpD)b8*PV1$e(&U9}#VAOnTWg@7;Wj2FOD8hn08NtF9Fj_8K z%Hnjmf#EaSbp$~feCB!$3Aqpr1_QyCeg<2#4x?bh1p*p_NG))Xkt^_h00B<$j8hMi z4JNXT5i*sWXAVHA#SHrPZooDoJGE&Na%*_) zKqV2ZQ;`Ru&gV>U(fr`5C80pDgHs)`^DPP}{iGsv5K$UN$^qR_Mr1IXXb7GIv-LV_ zwI(DmmIcm>*-6FUmMi>!HB%T|g6oZY%onzCJ&rrE~rFLs* z2spjVQ9!pG(vQkfQ1 z4r3Oi4Q5DGN)l8q!V|+lp+kPP;V{_pNE$-JCEGv<%3)4}8$XspO{Q9jg9U`ig*0VN zLx>n6gbm|rBn$v3Z2WemA=;1QMD0QCS$Fy+R?oke7i&Q9H+WNuJlDSdcc%yJS}#VJ z4{^W-I_f&Bt&B-fAs416PzIs{Xb2IF9WEFO=1SP`2|!!QhD3P_Mr?@@b&X#$PANr= z*@8=*3b=t+T`+b)2?GHfq#2mpG(yx;m1v186;Qj!i4+jrxS<0}?KE?i9bERBd!W*z37Iohu{C`o_=e1mf75Q=b-U_Dc1`JDG2EY zrncx#jB=nr#B`_lcQ(NrsINEvfP1O(PVN2@X>c?ykVm`yzvN@PYATC^-a# z6s5=kAvhdH@IjQ&&Qsz8q<|WVIwcnxcI~Sx%7Wxv%!1hS_VD{*)_^g1^hUeX*u#AX z!4(Py2DMX7gP&7sdYw9alM9g0c6{A*kx^ecs1UL8De*z>6E`&+G<~54JE|*0E2z-8 zhJ)n7gh%QXQ5s(OeNMe{k=6&rzyJuIGoly}_>%zPa8R;VX&8&HoFnOg(1-V9hd_p|aiPG-8MZM42xKY^1$Wa(oTX^9 zb`c3U-(2t<7?>N{voRP6^la_I&9i$Nt&PvI!Z3O6IR}}8#@^;WgJoRJz#u0|#rSFx zah*m}>M_ZVgjD1+=Sc)A{XhnW!vq6zD5RoQ0`(B4DdB>%6SZ3zO?QABjbjSJL3}VF z5F|tu?!J?Y)|Rs3i0>~toi#2<9cXMeJ{z+QRh+m2h}+uvH$ZClYYfnhyVOv44p8w* z)~KPmnVCL7(2nIM87y=Ssx_mKP}_60WK}^OgJ-6O!I7S1v{*|P>e*^Nsw{b4dP0XO z4W}A}h4?T?s`7gTG;l5jcOyLHX|ZPm+sis2OeHuz2#er2a0HEw5(3NX;#nJJB}dQkY1c^!O5 zTa94GLCY}EkVSJDFdMbQNride=u~S2FxXOu`y}JZl>m7L15UOXj6x$IIIBs{T7IPI z2MtPtg9^HKgRR}z5bRa%am$}LuhZ`91>Wdj;P&c{J!fOL*YsZd_~uq-`tTck^t=WL zECwy^Q4s1T2om%fgb7jTz-d(ljQk}6P8@1wT~0eOlFWev0Z*IFa4<+eq9l(ZWq$e7 zvh0LOMxCh%{=0B7`QRRRuB3vff_a>0@*yNNLaz9}T-jMQB7n+sG!RDa345#km4@nm zxHZq)25(RCZev32LmxFCAPo`;uQo89F3~CDCVZfa-i`=SzonTiVPVk}-oPM}{df|N z9G9{ZHgsbH_i7HM?1XG4Zly%ybm2cZ(O}R*KqEI0?9209L7tQIqEM3J!&Pwc3;;Xr zSHp7S(;#@OuAG7pHnqF<8gJt-{)=lpRbz|p3ENh*q+ptJ%em7OrzApI2$k9bLW6V!%eABm z+(6-k!YpZq7DkTC%{_PJ(iNu>w#61CEi^XAL^vWC2;9}T=Sm}I`a*IcA5vfKN-myp z!5j$^B?$-> z>ZNogn@Kr@!9a4F;j84DM1AeNGj3@Fwb@asN)O~)E6@NI-o&*`=WyAyq;Wy^!eO8x z*s$o+DnZc5uc)CXj1%syH5_b+?j>C_BtFP)H5+VCX_&RME|6+Gct(n=zv0U? zN1y|$p@S{?v}s1EMAuIC-$N?2&9~UVw2pv4G#ZQ%)Dl{i*fSi=irAwo72%-ZDM^aZ zKu-+gLP$ecGSY+tG&E-S^%sNl z1+7%0s+P0O7#%T`lW~Vp!5k}l#_~2I%{I<8Fx0ZLQV+tw4s?X!fM7rbMHLu1CUtbQ zf{J5359}{&6d=K=W_0co+((%lI0A?gjuc|V6$U0&4y)S#cKEaoVko@VJ+}86FnA%w zrnW$#p?#CNQBCo+CRxo$l&LG0dXsVhhP^#XD@j%Z1R^1Q!2tl$50@<_Dtf{_$+||p zt7Ur`$-px3?HvkNUxlHdHsn8C*$Bo!0}CDIIRF`7o?$Ui)zTRgjOkbEzyYe0uMaZ@ zND536?2(>xyx>oCuSO|-0JS*RyKR3ZcJTcM8Y>?{>TFW@?mvyOA2mQW}t)*NY2 z0Ziv!|6XTjXR%nE0f?*9ji2epeL7seBzZYJQ|1?da5;yEk&Kz`7STZn$YOv+-9IC? zvlo_fVEBaHj}QzUpd&(P92%yE<2Yb9deZ&y4!vG`@!4B6=GxG8mp^{?>p;_IN61r4 zE!gf#+Cas&;(MTN@2ipvF{56NH5Eacr@&~khP8i>qZ2Ryf}qk(=7mvX$0NwZ*tj?hZ&$YYb z23>=IVe!}*4&JD-i%g7Oh`1YlfO{9W{NDrbwUV~m;^JX<1Ox+blIAhE4%A9jcG%~d z9#@Ax=zgo^GbWj-E1$M-1MBt4Q z-0)TOWjIiW=t=nx5P`q~GMpZCT+3hcZry!!*S&+k5(XLxe`R+K4?e`0U;u$(?ISf{ zeY}3`5FqZ)^`t$mYkgot_jUHEB+>*3v_nZ7MLb}4tO^~4(3Ug>U@HUIF!)(iEppap zh%Y-0haTa;FUr!g_N>-$m2w($c@H`;a^+@Nw_=qM!wsxJ{QbtSm6w3AhbTRc!M$32CuOj1T}K#k)G2HS3*e)u%Ul{rRQ|1VaF|>sQ!CwO4tz^3Uw@c z*!6pQT2@nA*LKq_1SIOMJMov4zp(a*g1DB>ODTu`p4pQgkkH-Q^tMw4U_m+xLd|p)z99UJ5U0JDKGPp86EpGJJ}$^ zp~t$?sCEB)9!Lmk=U?~qlGKKt(lvk4+D!fh7}%gPo%N?-MJX_SU0doX@V z2ib~-k&z;$)vR|m60i*OF+t5m5yMg5}L!Hkd2`6G3&z1JX1$=aFV%d0j$k) z8%!1?7gCkbL8GuAu3F_smml5TO6HTku3eu$0S+nf@c8q2gv8TvGcpJgUn3gE3U~H} zg#$wzcVy?&?4Dk!alqbY@6`W$4#Gy#l4`7#t?k?@7eZKo1Ut#FD?)HBjhd@}_d@*Yu<*V|x2Vt3c)%kSp>y6_{VNl@%%s_@a*jgM+-PJaj{`g5e-oofx# zo_==CsQIap!TmeE)!v4!Kn%6jcM|pBNy}!)gHW25y=1y^sCTOM(P7lW%UY62LG?(n z{j9UIzrPdp=u8GU2#EfER`{|U{A&V}VslH3j?TCZ*M!T4$rH8bG-mgr z-Q&LL3cbtT!D~9~KEPuuARSwM+g8450t`Fg1MO?W2l$W;_xB=Sf(6SfMn0Pv>@<;p z0sV5L5DRSQiAjc;NBAJ^KqOY~zt0lza_4>O3oq#@Gu+Hx>omCl0Qb!d20@|kV^_$< zqw?MIwTFq_M3*m_&nMwUzD5bL0vx!`(N1$q8WRTKo9fT)u=8z%zdF|%<@Z3>_#oc6 z_q#u1c6sd@rh;vJlUYw%Tc6u5wx%fs1bJ$$bDn95(slE*D2ok7I*T-gKtayx+HepY zvKX9soCd1oaIg^zR=Ymx2Zp_w1=<3%m@`3H1a(4|ixM697WN(OyXpa|5`XehB)OV+ z7~4(xlDoSQBcD&?ll$li&yYVigp$yy1B&`nbV;j*R6D;{AI3+yXY9lqL3mty6Ktq) zz=5FaM}v6OsL1*JzP7pcOFbAH5DVnO90%)hOyts1LO#j2RlNLkTqOc_1=Gc!7Xs zji|y@P-w*;n$L<5xoKe$C}$uoNRLsE56i6UNUEZ~y>=I63Lu z?kw+NI>iXoB<4Yia__Q#27jvVa=YAF7AvTSWjk^JQBSol(!popQEKEM;m-IoFs>f!e;E&St5@xcKZ}&6 z(T;q)C!GuJiw&L-NjZ?fc?d_3p_5Awx5)4B^Y`wZ*Fj^tRdSEq?YKtAmc9RGOQh{(J z^ZUvCe3s#7xu29Pft~=1y!ZOS)*~p6b7kYKU2B*e?xS_j5rxMFmOW!Ilv}?(y(xla z`N`*pLP>upBn^Q>Nra)^wd^YeBR=D|{j~q=tdo#iXL)aLc2?%%WcFnCQ$-g5Bke#= z1{QQ;FxXCHeQ$fF<^D-sf1TRM^!HQ#hL>1gr=0RiEaX+no6?tc-_a}Ch;>~I zB%~-)IMxuuCoCiqSx?fRlz#~V{vpqN4lUuk-px4$2qPDRdtNp)V6ng;sl8BpWKTCz z$k(LZt@-qYK>|;(n}QF!iT&hm3>dmhG3d+Y{SX2i=E1>J%9U7t>b>4X%1XKcJyTNx_F3{t zo~Y$yvQ+;-oD7Qr|cQ%%cXj?lApq$N61BngAMLq8B@ zLW9}E+1XEZN7@or;976rxA`qCfxnMVsO#UW>u)(J&!Q*E$e|#J#mbF$jRr;r#|ClP zNDV*>b<3G#D$$o{^ICt*G{)&=%$hyI?MPsKHvVmP8jrH=IJSD6IF2RvlgDu4*r3RE`BHhltOwhX^?0u3v7ThC zsE7855*)R&ZF7PesUf4Gb5AeUe(Zf@J&7zjJi-_tl3j^pK9u#Rq#oGfdWsEP!z^7S zFUd5Pl9GF8nPQ~V1xKTo4D?+uN87WXE2_TL;u7C#{t4ySl9wG<%4PeH4`|5F6m34cji&Wpkq%*mr;;T4OeX+J!EY@~Gtbu&M z2hLgwI;{Bj`R1apP++b>r7Ir#270>7xKoIl9oP=M5xaXu5*~0@7ae59A4R-=K1-Ux zmja1YvP;qt8e*sKMd1(#W;A_~A;Q9$8jRvi4t5ex(_#%p$+$6_g@pV{&G1n;S9Yn~M+M2VcC2)$W#<{F0TsC$3-etjuO# z3?;c66C7xY1VWro;p~71Vqw+|ser?XMXm%Q)B;Dy<+^d&RIyDMKZk|EV04iDG@imE z0*jO{n}-Ss_^{$32a#Ls2ux3)C@~noz^Y!@U|wakGg{nM{KP``&TTnQJ#{CD$6npu z3~?0DFw3PvN`_oK-D^G}<|aQ$BC5q;Py$!0c-HS0NTA?AyNWRff&{}frbVHx8^3k3 zm&qrOce^fp7l;NvHbXy7q9O9Tm=TgQ`r;T;G6qD73N)zc$}yx8X5+M$UH}JB#Q-@@ z)RuZlN$7b{!1cPR#Ew|d#V=RHT3Jt4!6xZyZvawgPvf1cZH7ea`{Cktd%3eXJW@v^ zu}jW&9lmsb3*z5jE}r%`pFs#HL0VGYWN}!Y_RR1$^SW>17vaQ2l)CDm@ zqG3FhSiog^E71(#^X29Ti6mTYiwz`XIH83sC~Sbg;sen*(N`XgCVO$siwX!?&j*!g zl+Duct|Mo|_oJ6Op;}+jNjQyT(79ct)7~X1$YvzMGERFciIEOz1_x$)Fdsa&QUD;> zV*AQ9YUhZR1%c^HBLr9Az$uayr5E#^@%8CMo}t5r-I(dgwwNyg9g@3@o%~F4-=D@6 zmS{L#iS2|E%s`ZK9fRg!qa&}FU|0x`8Z(4EN~E=X9aj>CBeo?{c&^D9G*cqRFFq() zYpSw-iw1;IHsg)1oegKo(I~qRtMNI_doRyshRc-8k#iW{W{N^mfdjRNK{>_s#Le99 zRL!`W>43u#dvvngiv?fZJ6mg~H6W~*vQ;Mt$-r-5Qv?XRv2gg`?A2#ONuLx%vTrrE z&ldy{hP?}SaVHdjPHz$pBz>M7SxXP4T^Ns2DL1ES4uD|N+)liP?r0$tgafSO8WTIw?s2`wg3kc+?{L%pz5h2US$6s$!e94VJ^r|9UZU&a4T}qTThKLb=upH5RAII znpnt^N=HHpNp9nBwPvRAYZAvV9490bQkHEosF0ZFd;!9W-|lEJu@h#o?Bg&h5)0#)1+`&E~Ar_ZkJkj6WF}O?lIl zs}~qp)pB54w>BN@L|TvwDy7hmrXX}jf&nr-|M_y{LDrWYNFK*zH4?GD6wKYv?kD_7 zJg9k#HRMAOZ^45OYzDC>eiap79W)p1Uej8K-7|$PzpH2i;n3)2Pz^S40ur&%2VV@9i_$e#Nw2Wa3)&KRHIgVkB@*{zz5VO z>lhWDV>cHhF)IInHEhSYrFAU_TU%^wt!*r~>Ichp;2;|+no4JqrZrjsNn@dY+V>$k z0WT_+h+X&uhoUXMDiNU!J{P<4ugIH1GW;DRW{5tS0c3@`JZwIfh9X=W5$uj0IC?N$ zbU>0*W(l$p(PB5@Ll*Y|M+)y+?o>M9Az$rXBqV1xMYy9m0uF-A)KsQAm6?iW0D?k7 zwBq_Ysd+gM*6#hZh)aPV1s~W)gxL&swWX(ob*5r7Y;Aka?yYOG9CD{PKmr7G4;>*$ z>b4`(*%x+0M4PL-*bLM;3SGVqgP(^8z`@CL?o^iW0(I%X=0p1n3e|_N35aJF!ij|b zfuX?_=HiGXH32+!SRXF2;3HR(E7|#MDx3DF0R)F?v6K$s+qN;4;LD0xCh#MUm)~QbD#n1_mwu0|<&yZR=K6LNa%Zj;Kk6+y~G= zE<_Reef8HilWnmVFB0MdKW#C-X(GRZH2adsg_I_EB!^79d;Cf%Q4CBroAO7F?kz@& zSUAD3(LYlcdW5mKiR+Iw(J zfTEmghYaA5Q307&UD&P|HnoStc?l30OchO@j-VQ~O1i0=R))RWl##+*t@TqU7BiX7#`tc^#^C4R_+c#+3xGl``j!iI&1Pb- z7&zG_Q1QYDNyalxsk?4}06<~RqMPa$|334Eu{@rXe5e#4455z`@-0bG!i?0z7+mmV zyF4qN^w7lA)NjxT2m&;K2l{P~!U%|gidZ|+3JjS^dc3RiTqhnUdqQ9^hdKLe;Be3z zVVm!@Ej89al=u_r4HoE_W^jD4Yb*%z(OTGkkc@|~q01peazC-pDaxm$DHVS!G|pl< zLLKQG#?6yej6q#^M-CpV9GC(?l9tYmP_H@-+#SG;f5mE-EiXcp%qzozWbDJY6xQFdd0!eJ{7IDPZdX^Me1U};tV)O*k_3h1s%l@ z4t32LY@Z=f2_4jrQ7~XE4yd=od5Qu8PC7Tre6o2P&81)gq%Z*%g;AFr>}rl@?H}<^ zd&rw6`KE{m2qd#L7|5R`S3Jp~kklk~U7->v5ND|9Pb-S7MR~^oMVI!;c#jea{fG_F zp_{w|`lYP~gDj^n1>&F((^XfZ?V>G(CC#ToY0vb~^u()EabtrC1k%9Bqi1ZVGjleA z2#}btW;(c*tik{W=DkSJso^_|zz2yb=w!#i$W0RPILJ?s0H@Q;XP?mq;7|%dTS5Sa zgakDS6eO+U$wVp85wf8ZS{N5Zhpwz2{Qw|{1~ZY81dFg_EQmOPfyX5RaYQ4+oQcAW z?+;p(QL9=Pxqgj#!8}B8mo`yB0+LF}W5YmkIVKObpY;!gCPLHFkbeRjGSMm6;8eny z$Ur?YSNuW?>prQa2;}W#H_?-qxDWUaxCuANeY6Y&6GaW6oCIttGAXTY| z)4|ZV{MKn`H?fJsmxY?KWD?qcc12g!vJ?H+2PjS+xBxW$xs2f15B z!(iar3<%t7EjL~FP=0=)#*G!lxPt>mLr_rahTX)s zRzia67R<)9@A|27w?FT35CAa4Bp*@d$jGHOVxuW15}>wnco7s9QX4>mj+`bta&4)p$`%n?L@f!q z(A`(gmRh-j)4DcGy5fTrCVh0wfoNQQbd9ho@5zNsfdK}3TghYu0by9d)Po7$CGL_0tf0PtmD%Dk)x z0rw&XWZH{lpd^&0!)TDY%`wx38-ccza%4jdH6qgTuPuU8e?FBbfN|zRWRPGG;)4X5 zS((>7GV0D83j6_otV`u5=+fDi&E9~e+s3whfc3p-i4&q|slQy%4v zbdT|(GFC|3^D6oh!9b&+KnG9qE-lD62*&38{9lr(Yf z+Xo8dp>`qrg|2`PzLb(uSdA6`3L=Wbavx0x3qY z4TEflPOV4;PLQR&EaF^(P9(A;qrr&jxCLH-C(|k82@cM& z#%8SlE|x7}X9_a#F2LhGVrnBkkbjK7h{ATKvR|Etopd74z5|Mxo zEJERmfk`xIt%hW%73CR$C*|dGC9sVgQVI>o1g{kJcI}+O)oCXpwD3 z39-R!MqOj;&1{Gyq=nlOfc+$bAagmNB^-pa{Q5a(nv9gDL_9)dZn2)0u9SEfA+F(1 zArt6JmP~Kc*fK)*7ix^e1LlS-w2*XQI>>ay$V3o+^OFUH71Iu{%4BlLPE=71{B(}A zckUI7%w~cEa1=SsMG^h9U2785+FOAqnJFZNAH+gNlIKyaEZdk-xt*$}Y~zUgzxCVy z_dg!00faEnQ4k;nL!$LFRcBx{5-~{t*-6c`fP@IaJzg_bD20TqAR9n|Q1C2rf$_j_ zF!xD?#KCDZjdII%6rs`J^AR_=PTNf2gf*q95TP@KWe01Z5&0~FAol8d7LW~QGhk39s3 zy3^v`>;LJu!QrsrKtM7Ijg18wsBFl$u3G~L2ApV10D&=s`Ch3>O1Z=aP@#SWMht~e zoR&{hDxazuSYft9!olMGCg#%Ab%({l+brQO{3D=T@CASKoT z!!$TJV*wB{71j1CQek6ZQco9tIJuAg3m4djP?MskDkQ;qlxsz~Ju+c` z#vjh?4YR=xkx0)!{`pU}o4XDuflM?uvTzBjvB6JENA{W}os@sTrpaP}3&YQcRPYHU zvSh4@g8XE4VFWrA;OZGD;n8E?h>_LagpmM}C)yGL7Exf$XPgOgWUKVpLAL z5?bMa4i;X$`U>Vko&!Mzd|)U=D=8)|uSsr^yb~zEhcnKg)mV&Cqb^2}40I&o(EyF8 zD5Atnv!VSb;sa%sdxK&b?QW5N5kB2>I5tnx3Do0q2=J)N32+SNa zZKw>W8;45R!Ur4)R0WbDf|$x|sYlpx zc$l$}Nn;8JtqBA~AduFGo7}UjK78k0BXnJ+{=e6s5@( z4d7`e)7UUgcnl7{d;%@8nrKrX97B@%(h5J31bGyo1t*{edXkbBY^XWdp`5MT7cKnP zBLD#%sGSXX{9QgArhVqd633`X!~=T)DR3ph09Bd9Qv5NpVM3w!%J@*MMvK@?c|e^1 zy^~LC2aARMT%qtXsYE@e_MoGr!w<3D{` zc&DJ2=TZ;!lR_>;3K|l&Zs1H^&uPJd2A!gIEaqeyM$2$0{z_&gAvjg|L`l}tWV^De zazbeW3KF7dl%80*Tz5qNHJe_PO3aUTVINSGF&t@RLwPxUHjiW`uoVy@Bt}4oU*k<` zrlN?JWZGYJK*-Sth67iWNvR416>*7kG)#3N8`;W4LI$%Q*a}<+45m0B7_5lsKD+iI zOejtwvd`Z7pYNb33xz}VCp9|g5gWW)&$+_-)-?!0jI8mJT86)n0q-(};c!Y58YtR; z4&*Np59Mn`2Vl_Docb4(@GY+$U^Iry!`;_CU2R>*z7(|5$W>X8bEf@r zonh}$L@5)al60~(dwAK(+N_=2S;nJ8Ae?M8E^i8Y(WI zrhQXX@W{PXM5I7miAzgfN^wrlCqY6JJSv=*0WC2H)3GBQPQAFE1B8`kI3*8c>>&iG zpf+Q84}2sr{J-hYA7e8EumL)V57G8wdwaWLs-pN{IG`fX4+y(p;HeoVFt8S9BkU$c z)eHf+910@xvxXv?6Mx}S2nYy%p$`kXSO-c@rgNdEa03){pdB08=)QnhNJFS2-||A_ zI+ISy9Wg)!7u=#M(2a*w(%KDmIj=1T`FMW`%))w`|WAme~?Pt@j8$ z3mY4aNJpWtA*Yh#&Z9Wql+W}aexu+}-Iy*E7D_?b0XX?k8aEJc!lmnQB@}w#T1ZU* z#I$F+sd>296Kd z^sj#n48&N`OtkaoKmW9|lO-r5pX5bbVYP}T#dBjiv?mKeI8mHY?5Vg*c@}nNWX&eo zi2Lkc>E!1=NQe$a&3*#f(csymWm$^?Y7!g@jT?71=x;qvcVh_$$M`}t5Mp%%ZW6Ii z%}y%nA~Mp2Z=ICN#DK)82k<9DV8Eg~s3TWXNgApmWIGAOHcx|jf8XfR==td6Bz(YF z%3f;LUs))WL^34|;KQqEN%R9+^4C-GXy)bi=pK5K`08v1EN0q^)RzkiDLhWFOu-%{ z=vv~covqnDM@B6T5kI1aY=!TMKN10Sp3TgX_i( zNrkf_+8d*F@H)z0OAT0I>0|?KsA%BgMG-==vnD?kBjO1WF9U|yfbUJn%B&=&6HUo) z>4AqeE(4<R2gg#xs;U4r&8Gz?qp~MKD@fP_(xOm-)QoN%p`h}6(}rN zB)k}zi55|ePBRz|3NiYXrjuB}2XuqBf!{-2u-cJzE40KwIZ#1&AMFB=T(k!|Fu(^| zX8dIVuR&x$MIa6`732Jh3H(Bi!;RS}%8ty!HFtth5qa`Oij<8KVgx@4R0c1R!?aoJ zd8ZvwmL95Iyt&@zBGApF%Wx*bO;4p3Dg9$7O6DJIP@e}#1@NGikZR4 zup+4)=Rwhh#u`1lKZ~HBoL~o4B{_pzL|+g>Oq@;ep@?`~UN&PmG`XcnduFB?oq$F_ z9-sqt5;#yqX62cq%vN+^cA;lkzJu+lHVz5`V!Ux#7zhgJ(n8pzMd;Fcgb;{6PIXG! zftg@}L{XaCgf9&s_*jb5O`Vt=X|4xV>3|6Bw~c;0y0oGTm*B(s(&(h9 zpkr0EATO(AJr_k-kb>x9>eWR`U#NWnhnHMgN*3>LU=~EH-k?N z&(RX-1Uby|6+xs(Q8pg+UKu$N6*}$hGME(BjgZtoT03ohN6w^VLWF313l2y)9^L^I(`g(DoUgrk?hz?h2~pd4hz zsJShxJJyYI^GJm8VR(-KYnUzJB_bpxS<^~EJ`aYq0B)oy9@%SMW?yG^RO3Q?0S_Dz zxJ6|&-XZ>C!{?su9VvXJ7Llo@9J(qG=djEY%ModMTs^o?fhy{vLfhJy*#KKb5%1@ePI2bmC zLn)EJ3I&=1Pb(d@>(W8sc`C`kmW5>#lNp`;olRxegB;6&mg zv4X$7YdJ@e0ABc@4pZYi!aD~-CbA|vVowZ*rBQfcs&e2$thz|-^Kq%rN{UR>?}Eec zrvGSh>etNh#&IGbLp&Y~1~;b!M7Y{p9XVpsS0aEpxQ|doPmh@GjYg#rxL7VynK*?~ z>WfkwR(M&QDJxY==)p>kku$cvjYPI*mlsZOsX>BkCNd-x%ZSE?UEy3JAB_t#AVwyV4Nm zYFiyL(Wj^HrKN$TcR#*(ALB6^8$j7U!~(O-BZen6pC&PhGnsyM8Y0AhEsv6;lBrAu zN+s_UVf| ze}`x^lxLUOvDGeI-6$NIUVs#$1EvDWFjVMuU8sxD=ZxAo)a5l2FUr>YS(-zHq$En) z#lR%8@em8Bwc!cuD)ON?g#0c=KO`v>owEp-nXak8&DWfq+Oq z@Y7RR-dnR;PNpTKCPj1DZYB~d0UuCzeX(OD*i_=?lfRu;`3OctHFmfWDNEz#yunI! zA~pKtd=xBRlKos-x_}az#4$SHRZB}Ub%8&LM;SNM2@s`4>(}ae+xND2!W#@Xg()@G zbSJ$rRBF6M8#-_xxWa?@av0sY?wn`o1x;?j0)TMzv5=gZ4f1xUdkgO@lYkh1N1KtN zAqr4{Q5ziuz*~Uf?8o?9t;6-x)YWUM#-F498rdh%mP2K;Qlw`FCV@jgyQVgI0TIEU zP>x2n7CxXVr@g^owHi!*JoblUhQayAV*&z4N*?8YdU|4U8XSnSbkv}rvN%3P3!#pQ zj=3S|?IcLnWkR}JZXBeE$s1!sQebI;; z`is4T!MJgUUjZQs@VkL(kVNQ_HfID3!tvQifR)(dgZ~;mx^?1a@=AI^a2DB9Yh3e z;R-9p8y6aGD$__#2JHaPv4@Z$ukc8G(C{ZeL|?u*Ik1W$#Rd?I!3kw+sELzYkhx@$ zO*egrE8)%XW@)IaZ*>6MasCqSTt!ouf1$!JR(AoIkHrg=hj38nj1z#9yonV>U8o;FrN~1_N9+13}jJZt^xRxDosne-0h0nO;iG zdo$t6rgvI9ki{9IPP6Q3gW@i`3nP#f(E%(_4O@7UDiqR=0eF_%dkd}aj1yqsSRWSd zn9&pq8ViO2PK2?;NWp@HmL2vf0SDz{O;=(LDG;HclHAg&4IfHOUc6vp0yxU^YZXhI znGPlZm9+&4aDWf$Ow9##!J|#!=~!eoJh6*5)l@mFS%HC649;|bKM@)T1iqC1xPl+m zRHemMCKK+hhIu1@;w=R#TMQfvA}P3n07i%khym9!G2u0^(#xtOVzpQE>B8(X8A|*I z3IJSo5`icf7Lp8b(6%~_kV2W;2L74ofE7eG)H8+~8PAkLE&`4h@Q`01pvGz-D)N;T zi~o}BLx*nlrM4E6#tDGnc5|xqi(FfmTu&ZOc!9thV9*LJba+{e17^e+ zO%<(it;E4HyjIt$<;Fc($Tr5dxcNs0iPD4Qa~AAQ|g- z7NjTHaqv)qg)^3BG$a)=n-UOiw37}K8sh6B3z)1zA5HtE@ILq+X-RWjr2DwQTSr@T{Q4>%ZW z>@Afboe24JwXa1wc7hd5It6;lg>GgDL{Sh88aKtm+z1xkN^u|&wB1o%Eds%o&w5kj zG_uyPz90|^hcKc50icB3NI4N30;6>U5IES>m`p_L;ldicR`4zVT0RwgPymriDssjp zOvF~nKz_)z`f0!g2%*A(E-KUKrQ+ zkoR3$*=&;8S`Zp7Q^O{Q8Wiv#j0*1jZxC_IR48|?kP{^VTNdylMh?(n%>AM) zxq=iVsrFe+Bu2JVi)Q!T%z)o2e3)_97X)06{oLXee?2omSF!T8qJ&ltDS)Yq+*EdsxjxWP0L~X+UY9T%yTLT2MO_BO(hDTq z(34g)s?ZxT-jpV+ggN)1AVJWej1pdAQJ$XLtjq=HHi4naTPqdhWGXlnB;|m9Fe(9= z*R)EdJI>P1jx^R=#sAE?<341<;z0%<4WC1cf#Cu(m}pH#KLQ^Vj|@gz{<~&ve=d^( zLGDsDcY=C=4y`>scXZ}K032#q;9@$07&Wjct!Rvvhd{d(Tn!5+ zfT%!{xo+mFVQWc8r=%h;aHprSF4$$Ba1&lf*x(k zPfK&oM7}(2h|+Ql5VWO6-IwdLNQ9*)Nk8B>NkN*`+&I*IQNtvqrx7(u;gpK&)_0~U z6*nxd86PQ<5F<2wVJm|aI_zA?<-zce9D8G$nKMuK}A3ZbOlKXO>0nen78bMqzS(miLjuP zVTlvnRW>Bn@X>-GAP}T0t4u|cpKl6>!$%`W2#X9W#1RypdLH6sw8QqXrM4dIi%EtQ;}RQq{zbFd;iFU!hWMf(2f$&(GiT7p0J| zjpiJd_F%22O`D;Ac+1U>lAs-d2Mmu0K zl$T>KYpAe+-(bhUbKsCw7YqtVIobR$4K5`?86>gB#p=Mt zOl|$!|~t)B9Nv`yuOO_kg2b*v5ed- zX7d`14gd#N;rgqV+be^WhpO3AzhtTs|?=6cB%LwF+dXuq5_fdB(5vo;hY0*(s6 zVTaMgG>1$^4`rsUb*B%q*iIQujZfFi@`OBev6v?z!Kx$R5GNF15P0@s*8FKY*vrn? z+;@k700hSda6n9C3*r78V}<>_(1D{@8ewq`r+iMM2cgYMZ@5C2e!O@Npj zm>fvtsv{&LC=FmD7;ABcZ5TO=^s+JE5jSQn2t1>ws0Py*K%pL=XZ@`zje-jh9wdZ- z6Acpz1sBYAo350C;B92*(2_D7JrTS^As`<@YC@@Og*$YhR;mGYnN$SI@?^>cAI7K> zU>b*+USa02VB=Y73F${i2lhvj#+2*S9h^JBavrfe5T;YfCR_)i&|HbIoXmf31y7%2~oqO!XSYMc1T@Pa7qDo;T04fXI3JCVgLl?3s}TR zc%9Cr${GX7IGwT zsL1w{oDef|bPj&FdqJty(zlaKW6YB-4bYZBt$X-B+De3$WKbhRgSu*c7(CZV<<^JS zqH7?)YIlf1k{fpXPG{?^go64}UFpzycU(X}*gc#qmBauLuW$nvTCW2idX@(tOsiZL zk5X_L3bwvGM8*|Q8?(`+Y@MpW5MPuT?8S1hmju&(yK3Ng4P}Xb5ED26!eM~<$ET9I z#B%W50kix#mc7hp!imkzFtfZ+!t>(A=*Qox6p2vaT}{Z8>4lq8*}wUF22ETIfbs8$Z>Z*RRk)SCF2f`WXGN zP}_r3j}@fa5q^9CnN$YctE6qBZ1B2Mk%Y!j(ICEdNTIL`T4-g#NvbkRvnto z2^`=<;YVpF5t?xU15GTU0943C)*@>prP!-)Z7tI>JC0V6-yoSV36XQ)P;fBFjSwDo zD>aERmE_=2E{wA`8xx)+Mm@<6;!SexEKjw~uQb`i@*0-~p1I-(B0nxQ_^2{i!p z#Ovb3#-XE&nGg`G8*kVoLrjOg5UYr2Y6BmbcysFw(3SjXeFiYdp_-heV$x0WsKIAn z>|q}bxkz6tMFkFU!452`5dtt!lQ@w<@7qk<;58W#3{)iNEfcxTYI<^V?8)P?rLoEM z$Ouy7^0sJ2j6)PXN&1C7JGonH)%UU@4#EvOCT$T{)JNO<6>Hxxspx4vk%CyD=PjX? zy{b%4$e5 z>`>fcB~|89_>#yJe@HQd1A^g7Fmzgjn_;vg+30SjG-Q=|lMY^~U@f>;$;1$h$CTDQ z0f%T+$vOx`P#IMjndX1VNKzWWM5Z=sgb>VW00U1RWOy>txjp;NJA@Q+r=dbC%viuj zJdv@Gu{23=G65@u1*k|xa$#D_kf2S%_8P3FH4O7Qp^$crL_ctlKu1}pSq-m)>T6|Y z6m|gzrd|(JY1c=yHVsflhO_Msop+sirKBobN4?C{Y=z0=mo&Yb*EN8Ya+`Cx36GC? z(Xpi`Z=8?aT1t|#RBo5~;|lI%RHhPZaKtXI5fappLaqZK;5_1O?qnkDG&6HDyG%I{ z=l>8DL5Ek4LQj9sw)2$?3>&@)$(=ixQO68Hp#yutjMw(|2)kbK#V{E%7j!0N;(>K( z&_aq5!I0)aQCO@&LP8(_gG}f#*}Jx5+Ir$izz7F~P!J^)QD8BuYJIiUs~iM*8*Js< zf8*>eSedm@PGWt?ejMtk3B|9-acPSrzZkT`6visf*f}P)lg|_B4gE5)sB^1 z@E6QhGyx7t+vpiHdC*}N5QsCyi4!fqu=U+$E*NEv5znMTHbbNUDS4kP@1z4+-9j&e zhS*4j=%9_J83uDIvY%-&&g{r`GVj3-b$bPx{9-I_2nL(Uq9g{Jfqr-<3K9+T9~e4^v?M>U zfnUJDnX=Jd>WiVjpxkyy~_4B*d|K!nY}v`mfNUI@D^1eIX?DwT-+t%7ouhP{Y% zpe)sqO_X2@R#OkA9F(Qx4(-nj3Wn7bmhZ`dkWe@`H#PL(ld;F=lVjgfSMy|YY2bx{ zhr7G}iH zJG6L{VaqNUBo=MSlX95csl6n=u;dp)jO;LPuattL_9j_FrX#&-Kds68dBlRsI&6k6 z;y@zxD~X2X?NmC$+=k6%Iv~UaeSMq*=|dR@LU42?DA4QXfE1?QfbrxFQ{ME_8)IXW zkAdNQY+z~hi-C{ZUVNDKJ*3}P9)5COh~=bnfq`w=R5k*|0Ag+PH#4({!t63)(E}Oa z#DYMOnxH$5jbDRh=ne@H0cVQCIKc~dFs&|i&1`3RP+JSL`U)J3+4wB#jVDG(U7{b7 zl;KkSpoPqo-NJ{|50k$_G&Jd@H3ypD5g+&z`-GAbDR|Xl18PFE9Xt`H?NQC;f)qH` zUh;B*3$()$L0eHdYRHu+KZV&CVSY}H%xT^yH-}zcaj9gK_FV5 zT|gX6Ln0EU9Js=2o?tglOhe)y=&)-O2R#xBc9Am)7l<~L!EZT*5J12v=+ay2M!t2h zkqM-b5v3TJ=7B8iq>_?4Ayy{*O8x}LlvwPq8pE* zK6*(5a0vvzH}D^*dazU!2DBBk0UsEqiG{-LXNQA;hvrGSNCQ1dFVF4a`s*rMGJ`4g zV8aNY+{u;7wcyOyx_4~oN-~iS{T=f0!({5eW^()mRfgoLtGdSE7l{B_U5 zcH|}rk!d=!Ugu<%yxK&SlMxpX(i0S)(g2E-1cjt5KwC+s{#7dW-=am<}La zI9nJ`6<@3DiTnZ*fvq6Wss!Kuv%mVYwp~9-n7N!+63^@8<2rIQ+E0xA;MTocx6qT{ zos(pU6OLd~v_3;Y8MYQcn((L`_x0{QIU`+EYw8~9ysp_B=jv6<^>eq1x-hwCJ+w5NQXi!Pz`~_zd~pJ zEjY-V+I9WW0fB^$nk{)rJj!FlYmkE6EWQ23U;W#^8ubyG`8slPqc{lLAAWc~xpeE3 zryt$Bb#Ltalm9#tC!!#KbAU%F|A0-m!YZ~2*CQHR#N14DR_PdYw3hko5^EQaWs_Z2mfVXS(4@cVu zz8L+Yuk9CdyL`Kep~Oo+xc$Z(pFI8K-s5|ZAAkG!JcQ2>FtO~`*5_7Ia&wb{89{<> zG*3!yWqoECzY*`*Ms5%|=fU{EjFwm;zgh!r;+5^l)&mh1 zQXm#q|HbSo(i}jyp)cWw84hjpG6fLX#qr|ZTVCip;2mX5WI-pqBV(iKP_=B-`KYH^!2=UR=TVuB;Q!JQN*ez8O zym=63W|ObM?pp_z$dJ>(2a>NnJrN3!;RFWUfDLHL!yE5NKWJi)7r^1!=l^~teK>|U^X(qXFB}q_Mrv7IBxUX+?pzp=M-tQV1NTp-9-}~j$ z+fVP^d-~p+AH9n=HFo=@FZ}f1P%_N^7q*)(L5ZDom3H@ z+~9}OYFUjNvZRR0bK~Bqd-k9Qnb3oASR&PFQ@=LLM`o(9T_0i55EOwcQDF&zkOs&+h`#(1Ps335~{0Jhj9pFd{Hje*^^0iQ?Hy;vNkwm66K zs;ig*?}UfVK*`?nGUK)wg-V}s`6RgUyih}tB$hF#FkQ!H6U()1u_BQ5}Uohf(euxlvIP}c8 zbc3#xzg`=zXH!{h25P{Amf(LvN}Qhn4CPb^2rCDrDt0PBAz&~7A}i1VlR>1hIi8{gkX8^1SW$kjLsuoxgeS@q6#xdiw5rU%mF)o44M- z4GteNW%A&fy2Om*M)}aJ+t|jtu<*%1~NT3ep&H;}BMumXLBl zUw%Jq-Mi8f=1Sbc<@kmSEkwRi6rT6vMnjck~Iq0jqaCE zX6w)nB%JV(WaQ~Zf~n<`CB3>|lQhDuX3 zoFI|w^UHbwg_VkMOHKlxil6<|lb`*;2Y>(cm-pWN@i(u%_IpnsKY7A}&=0jL%AZO+ zWXaravMaQb(^iQdmaYU3$kCB>7;e2`jsqabm6S6{Eiu)^(hmZm7I?aIuEFb`4nx5} z;3>F(2O&ZT10;hmeBtxf2S@ezQUn?5{Na6|{IDu^&{4=W+jy9q06;WQVNr={=MfZE zR!BH#9F_9qsF7p=S|vO&KR>iT;`O*VPN!* z4`>O;2Lwf~)wAIn1_pzk`u=I%lfDEED)SFp?`$lLzg54pg{O;-P@8*%9mzmFR1Pw1 ze}xT&7Xg$u1zezD%P0^KDT>8udY~}xmDtC3o+1r55}x|SP?vwgJ2h3B$jvj&vFp>` z0ZQhA1UQs(Z<7xlirsqeKmP2^r?=jG`tCPB`sHgM-FxGW$)(#*5-VM?hm%?sl}HXv z)9=mV78RuTM!VyY{snSPSc+B&1sAiFSP29{3)G|`P#S6sa)%*5KWOPiE}!#jhrvT> zr5R5-5TD~hj6b^Gv;z=kFmSHn14$GhP#Ody3KD?>L6D)02X6-~bc4>&x|^XavA2J5 zqBIq(hDWNwiC=g;JYZ?TL@u{amr5W0wosS=0JhThX&2Dgy$}BVA3Xl?dmlXg_B-+7 z@#MwQ*pu^%zxUM#Pj9_@5nDn-T%6xtO<#Pt zx|AR%$h294JeR!mFpl-eLZN4STY9h&E-;hHfMqKkDJU@K6^d!4C8!hooKtUOHz1@J z?!X4e1%Xt1QEmh(;ts^Xf)>8Mesr^&(lK0XH6c}+GT`lI4#gF9$aFja7JvW^Y7+RR zoDWg)I#(M;94C=|3?(y~G#tx`5P=d4Qc@rP>(SAFI3K6|8M`+$94jxiR2I8 z{1>l%^X3QNjQ!}py7$4;druyxes%j63!Io5h|x(Pk)}CIS2j0<`$jf{j8vu*A97n! zg+|Pc2!T9^1&rPO*6sn&6&Hj;jTLu(y5WG(GY$~^2o)Zix|BaPUZ}shwJG6+zA~K3 zN(EUdMdpLew;{t#P6{Zne_}90=m!e%Fr;923xM!YX?War?89!LCh#6LsqLKt%iQAp z%I!~XGi~?n==opV28?_My-9{vVjuj$k3M+%^y!;lJ-ztx<4>MW{_x_~6BNYKDSh?c0?QNVxD=p6#?rp5)Z5Htpb z*$i92#OfWYDp}vRJ$*po7@_4gya?P{oa;b$hWsdn&~PGv+PtY6c?5&qkF;q8ize6_ zOY8A0_)2MO1%C)nl2w_TmtZ{%1mCA#7d8lmwhu91780kH!J4KY&k)*2c2{sjsOk^B;#{|U=m_t zAt0#8$DP9YTHY88byIB2HX!8h#Ro5LB*Q-t6x_lGsm+^VSq&XbwK3^NwI|+$bVNGK zer2npD*VHOVkX55gsjWA^x^H>OG~%@;(Y15f4De*{K-;mKlT3kSAY5k|Ki7E_rCh- z=||t5|Hb2rbLM)#os2Dguym2mUaY*3N(`|10=z^uj4YrM>U61FSWxs}j1V0FK!Nzk7Q3yf7jXzUvdSvMPc0yI9q^HYOJ z+EFgGQWbJ3sj}twt?kmyZW2>&NsJ-ERJ&0D*{EdXT;9|Zs7OZ!I`eB9mdO^B1e8!l z;yCfwZTmUgs5!EduwqkNg~XD#{~5cKvEgf-%M`3(nt<2P+aLYxKYsK0U8ePZ{QvRwK0s}rcfRk+LNTfU8wgr5j?mVKyIDg> z+yHjQ>4B^x;3snb~wmX9nUWJ^L<{C_S`vhUZGd-`$}%}`##^_pXc{H z&+iHJ1yA(`5~cm$=uHt>KiZpo_{SL;bbU{gk$LT#zk&_>&e4wf_n6(Nd1Vg*k? z!HMw;I!p4XmyZ_zmca>tK=d4Fagb7tTO} zCq6X>!cr0u1AHtf(g6e+Iu<)-eSG<1gl+&MbY}V>3486o=zP)n;?OG!A^!R`2IOh` z0a*r(JDUM`ruLyIbU~HAJpIC{AD{nmLqp!z=tE#9K|(9R8m{K)x;x9&KDj3h3ECo>`PKk3$$4jAv*lEcH;(z1&jmBZ5fD1PZUm_pZ)R6l)iYm{dZq` zq2X)4!$7bkjWia4*$eDN_-@I&w`0NYj&+sZo=ycz6R|*N%-?s%KYH@FY|QFjsCwkL`@S@R8$b=D5kf*9LkAr#P>@l;NXS;0KM_L5Ws!kK z2LO=)%@8TB$z6U$uEH1!!C``GKrogPMo?HN>+(f3fdrxETf+(R5o~#&-RWO^kubsh zDWIkb6vb8HgqGy9;VcG2y{F{@iwr>RX1QLP1 zq@O-TEZ9rf&3wFFyLMfA-2J#B1-F|$N&!Mx*s%`+g2#p#puj;5R-G-K00dIC@~2=_ zEXQCPUDgnv@x+-=A2{;>Sg7$028IjIXgr5>j5---&b$f+nt^=z)qfjsf`FM=3L!Mg zivwk?y4LHn+c1GNN&yC-K-FFNAg9sx8igB3UlRKvJs;8t0RRxQjOH~oFz2*&cYo<~ zI8UOfo~{ji=og>siv>42yncVkB;=COSjeBs2(%AB{w4eHaIvCCw%x!$sDmW{HeXz% zuR%d>R6tnyC}TPW!~=*+M*<>z0asxNaqZJ59(cgwiCDoUR4}+)Q$of}D>G?sY~|6v z`zC5&Git${R_K7+;G_MOxPnNbVECXi(?WqR7caWtgqp;D=i8+ZN=X_bfCL#0Cf`o& zE_?y6T6!UNGT2Gf(ASahe&eHul6yjd065&`h#0jXd&q_(*JphG%*fD0h-1q{ZgCYF?qAcElhj23zF z2_sY>0JBNQQ^)1E|1Dl_n`Lb)s=-LUW>?BYkT+KVB_L3X$7LbefO&w7Ar&ls_``gH zZiv8PN;p_lFi9u|G)Yr3XwhCD*&Ul6n(p(%cvM4b1>i7RDTK1A-tNEq+b@ z!gMgsd`b}cfE0r>Ob||n3j#qC36+?7`&FP242=7}{g(rgRyKvgSYjgJgKXuwb_~St zEfhfF)_?YB2A|=>4_Rr6fnX(pV1NoZ%k$^yU~$McpkykjUik76rc@=zws&;+PbP2l z_4N7wCFI@yQ7VC(2*mo|C1oG<2e!1jC&0n%z9J|L4Ok)pB*fHWgyu6zUY=Mm;5*HT zj?oT+2*GglW8_5zjGr*x0u&4aU$Kb7%`^N7ttXzKve4V&1ExeKLfJ~64tQH&QM1pZ=xFq$P1!hnHiW_Avchaic`&=&?00LalB>6P?0 zu7Ws9Yse=X-aQ*tE!XLev5r!i2yY4ZbQ+-S7a%TM#x17 zkO$~{KVyIpFJ9$^N~i=GLAeI`7!SVu_S^rZovQd~wOPI^_en@eOi3T>6;0InAtZNP0JVHr4`}8y&a3-wmnL zm63Wg+#hXa)c8LZkX|?_dY0UZALJX0%>!d35T0iu#AWp)(iwZjQ1Tl3)Sp_PZk9UU zvJaB|Q=X~YCFQ_4aDWLXAi!=ao+2IfDi+dsP?pEPefclP^K6raHn1R|V)C`3>%1Y- zQOw_j0?gqYci<#m!(R@)GIZXl`L|{c+&N1{iB19ON2 z9hk|cK%gn$JsBeX6k~L-pA7ZG;TInl5eyCZkTxi&lqP@%WH25B_rVqRl7^>jH(b#A zc51q-mu2|CSxx~V>0_#A@xT|X+pk#40W1u8KV!gc_gUJ*KjArD7Tie5@tA}MD0RUeqB_Nhe>q0SR z6AH*)8a_xb=vk7QP-$NNG@1n=&4d1D z2!iGZ6>#|jALK-Yl57M#QD7|`uxTITGCuyBqenHZ6o@4Ar>MaL55R~|F%MtBP)d3L z(s$P$ct)o5nYVG9JP{T$5YRw|Qg>j(Dz<++b(l-1n0ZKj3C%lZ zDji|Q=?12KQbtI}lB1%9&ba_mahx4n(Wf;Y{ric=Yf$Lz3Wq0=z-IcaCY|Qq-Ynb{< zOa#MRl9oZJQng9hS?6&&~u))QFnqWiMofe~^UlAi#I zJ{H$+Yrgg0z=tp364dTGp&-|E3mwvr2&v^YWkduB7+7xwQgESIbu>68vi^@l&T`xL zY;TxV{wzz=?l~sTRyzCKxhbk3s2V;Cp*8Tt=o8;!B@{!U6a<$>Ey(-kqBFTKvbTKr z;Aku(#$XPHvZvF#ao^wf&_>^wKN*X(zRCYV#0Cy-+@_8+BGLls1?phJ2g_Je1q%R- zsQ?KwwXon%jbexlrVa)o%LEWIVHcjb_60c$a6mWs0D))p?GvvGi&vkx_9`EWqR@;d zu2Hj+>i9}vGu^m2t6-qgcHDU!Y0Z}Hlxf6DFxy(|F{o;cfMVQOf&dpM1O zRKtLQ$FSR>1W@pn#n|)}#yrS&!UW}{-Zl|6xE%ePKfV068agdHf*V%Q`c_m80CYE{ z8XTacvlUEX9c35@w5b5Df>YXtjLk-El};O-B+A~0rl>84oj`c5rs}EqOi3w0(MmlN zCfiO)c?j{l)(U)1b z86Ft68ytj%8yX<9VoTg)v99GUyNRgHl@?|*7KeSn8hjfN82Fch;7lRJw~tBz)bt=A zy9gO9arspE^b8Kf;J|luvy81c^QscpkN_wQ9mvTP+q<(04prKmmE|g2%!VOMd!Ynl zA(OXKEK<{ZcQ`c~WcB+b1i^?ft?6b-KMU7d2_Y3%>HrHWuQ1J)t*a)(H%D(CiA|T5 zj`j5=J2n#jpx^6V_EKmgM&Mo8&~_0HD3~;7aFDA22kfN62;(CxG^7{wJdJTE{!>%} zE__>_(?)@l#9!s`05Y58R^@5?x(xQQ_KAbV3G_N0NVmiLBn+Y zEZ0O9K;%2ImcY=TLv3eiI74^!(NU^Vs_GbqZ>nE)GgMk;cj4q!sYgl4B#S}KRBMrg zV3eAll-MYIv*FD`cAAiZ=;-TU=10Q2C%AF{LQh{XRdF--9DBds+Jpc*!6p82LQIg$ z01ZV_<|Sb4$O;lJ5v6h^M3p2->{FE>2FCrE+eM}0jAPu zg@CY((`TvFdpm{fQZ6exBKZKz;cs9n486tlA!h}>4T0uEm-yxCB}B;4d! z=lzZ~W`}k5-H&Z_`p5d73q|YCHRKJ=v-@u`0hI9-=?}1g3G$Fa15E)E`WBEOOManP zGhoapCt9IP2JrQ1^|RzJkoD6)VufM|X@yY`b>~-O zVp$I|bXn+vYF0}f^Z_5TP!`Kd8W<2*eJmLRXaE;<0~Pe>iDzEDW}+xdez^|fDa8+( zAH%{eT&KHxqQDie9Cwmu4M$VSP#7CQ8HkKjVI@b|WCX(HZS3%A z`c?83=!7}Z{JbEDUSOfOupqh4kY}-$P-F>%KRx>2gam3LUAb%pQKr`^xi?vnRu%b3 zdfnEYkv$zj$a~6bq7cFXQiu?2&YYh=j;SmRhl4=|VUwYXAigimMDWv88LJPcqUZs# zn`-9NhA<_kSO$J1wVQn7)z-+Hq;nc_OQPEXxfK7c&nX$@E)v#CMO9L$4^5vc^=EAF z4+nB=aW(+9q6Z+53q>XL)`tQ~q&K<%BE~+DM8sS&7gja`LZBoHtS}nn?GaNb@FwwM znFH_;3&aMC4@Ys8Xa~ZJ4j^#U(hiJedUqj{v-RM`T;ubVC!B0q*&7W+Lr5Ksv4k@+ zcj|N`71boaU`7l^zzGpWWY}Y1q4Y6Z2QaUgsN!nFTv(XnKB zdN<|kLV;;kt4)QcBb1m`7&)OnM!J`QX#@oW0w2Yqfzc585C*v9F%X}pG7^7EIB`^b z01YwU5|~e2pTRefhER{|%%8ogfh~ki|H5FP^b7S%r5f@X%H;#H4wpNtd)1}rx?wUJ z(M0f2MyNL@7@iD<+1;15i(8o2Mka+}IgEm8^D*6nx3-k358mumrNS2`r*i8nwjCUe zyih{ud7P^5^v%g%HiV~9q*yW-4Fs=li9|;Wi?9zuK{2HXq?C@sVh9R*F)#=TOEv7! zRTVasxz=0m0?Pm~E@yrGF;FO6Q~+TtrQyJ*0z;sf7gmu!x?JjW>o8#x@>^XDGXQ=D zAgCX6#^vs2lj?D&Ezeds8cwDH8KGeB=}<;}gzZeJv=t6+PqHz9h9_gHg@B1fB~mH> zNzP^|Uw!|(4WXQ?2S@9t>PK@+NO-C?9qTYm26yyA6lgJ(;ZsLSm}wgyA1Gi)XrmG` zmhzf{KxZ6gv2mE_0w7>8MFUG{&T;!(}|WQqkDSM za|i(rSc+imi#SHzl4rt))YoSm2~O6JQZ%D}R%KM^le4gywXEmQVke$8S4I@~RNxZ2?cu(s6zz<$niK7@wET=Xagb%_% zqRU38-35jTFmWV`o~#Ttnj)^CBN`7SXb>ON(GncG;^@Xsy0QvftIiTzrEMyl!464* z-pIj>P(>_PF*>&WHW_QS$n`B4o{;3373VK7G0@ZpTSg@8a` zsE`I2$c^{{;;4rEH0)n|6xmP-q?eRB2?&#s)CEadaFVp6=}rX*01vpZ1Vq^d2H8$)cHoy4H>m z?6gJHJ$mzCNoww8MmlpFm|#kMLgogX&&z$SJeeFTy`9Q95;+ns$qBa=c%+LQ6MRTR zFb{MwcpIgVdq`IXBkIR%$ZyD`!vc!)YC#E*2$f2zFBfH)h2CRfB+Ab_4 zwfG-mnH z{pXyL?@b=ZZJ-*tOt!uKZeXmpK6EZpVOw=!6R?izY$<|9C1fXYm3%-6ZZTczauHzK zLF5eInVPOFQ~!hS zl)Q27L~dTi*p~Lz?ftz}TnzV*x48;jE;kW9HqsbO#6olvPNAs^t&6jWF2O;rQyegK z0Dyh!EyD)P8y$~ygImHIK0pmK(_TixkVOx!!3dPXd>BHccL$Kgl;1D~1G4N6kG-JM zd1(Il6rpuLt}}xvJVcMGcBFiaMD_Ni{M%szvtf z&I{X0w;lOEZ+`##-#_@1@BC!+dsD|59dUkjOEeNK?M>DUEx*TgvLbSc(i*&%B#@E;ft=wR047}Fpm2pkYygIejsKydBa-w6_p z>7fu}gLH!fwkb6U#OCse;w*REmBoUDN@odq`od&15DG>K4HP#@*wh@;SrWJXu^v*5 zFe2&axyYc1f&;{ua7|o&bF{v&o}Sj(`kPmG-@JPD``>@_pZ=ec@348)xpP}8qR~L$ z)V4r*WX{P}=>ymZl2YneNIi5Q7qaU=tQa*hZLe!W3brX%s#4!~o9E_=e}KRUYl%&A znm=8C288K<8^a-gK?Y947HEaWc&!LZ5U9$Gz&LZp6Tn!%i@nmF{t#W35TqL#$3AoB0n0!LhD|68Mx*9<0=cwOQNSEv@@E)m^EY|BSGJabrY(l@6+&_Hv>tFrq-+uK6qu+budv8$IyRu@=RuSk;9bsU|Hn8f(bCQ-q ze2~Cz7*mPNfW=MEZf#5-5rQ#kFXG%FNCLpG8pv7e<)5a1g1cteL^~~Rq znoX+&dO`95D}!zr7RWmAKT6RMqB@tet#Um7d(P3R3@ScgERhg{NZ?3X5y$Tjc!U1w zF@nwM`*gEpD7A+aNCfLiRTSQw{QkK&CU54Poql2Wwy$nG`}J*qTmPN!eCG#0_`%!{ zzDF5PVzk22ig2txnH#mu7p!_*1tx|93wcfek#c|l7#Kd_Id!3HOKe>W2(dvnRX21~TE-Wc5WJU~?k#lliKKRc^ zeo}GvCsS`szVSV<;CO?oIp=KKN{_@2o^8!3w7J?m@L|(H%1RmxCh!$@2*I0A*-dE* z%|xFNg;0bcB+wy9Bq&U4OC}D9oxYHge0FKs55)|xY6Chz5N~uL%`kewr7;pBMBGU- zCjSlFWYl(bdKXeEcn+m-4%ke=AT{v^N;@edNmm0P&=B?&qw`69QTkRI8*Dg1ck?`J zF%FJiJ$L;0iQ{i@@Nrz_g9;hiVV|l~k(~axW3_-mP6bnDC`*9^Vqpjft!ZbOM@BP{ z8B7#ppfXC{8Y7uru|pU>!R#jqWDenA@k6&pR!cQxBg`-4BLzj84Y**g#0ZNLSSp+~ zC7JWb=WV2n+QZ2}%3sR(EX*hC{Rf_6w#pZ&kgEuFc z5Ochtu<)Gr{yaZLO@x2Sqjojrla3$901Jl76Jt?yDizJOO*vN!JgXYj0|4m*eq)08 z9+Rk$63X*XF*bK+q%?2oP?!&Mrzh#ICe3dE5Fi@+ z$5cQE4x%ZS2SZu8>a4K!+vrFI_xMZuwg-|BA{q-sS&0ZGyh(rP{+F5jl?Vh(2ZPWv zz^?E0B^vUSQk-Zwer~p5HgD?S%@Zu=qauO@fuP8*oSO@5bf#kG3JI+X+^zy9k_re8 zxG=%69=3qiH};@d7)Wfs1s&N=*dPO8A)vWLcDpG4zdNk2|EC`zJAiO-GFZt#8Wi|n zruV%{x4Uw@sG>hi!oiO^Fp~okyq^pNu?UK$Wg>d}sQr`dnC`?#$U?9dlX7u%G#U2S z25xNW$ApOU=MI*zLZ$pTxfm5N1qSe#KNk%>)Dwz@3;PRKiL4Rbz<|#{T+``9X2DWS zn?s2Sfnacw_W%N(%QlD!{E@LxBmeIYiwm*^YIXyH^$&DuVIn4Ah0s12;bIpV{%gmF zD%kOT+D{2ITm$mIOWr|bVAPrc{Ea;wJsTaepaE0_h|UJs^gTuOhRHV@POvx$PUPmX zrS06=k`l}$FbE0$jAB$oU+N;?H9Hw`5m{TK-I5c}NGO4^kR9YfmJ+u7haoV@2}XbU zmPu2hgAz6-IUzG?|6gDrclf_NB&L}ZWh{b43I3_V4@=x+}_j|=oAW6VP?U4@5tvmB8bi#loHt?8d#k>UqC&u^YD-}!GMr}D51$t8`0^0B> zYj71z)2~SOCGLOZZR%SSABZXmF<6{fA0&!W>AB;i9VmZ5b=LBOM{=mFC>m6b&&ygG zQp_LExxFzRi~i0=5brYCd&7GeK;s&3C>qG01At^Ukpxi|3IZz#q@)#i5g5VO_|tUj zOBzY_N4V%tQhxU64_AC;RhBW;X&ncFqGsW0T%&%Ay>tGxw z#nFPDeO_;8GTCYQPWo9jkXQ2O$H&J30T}YBaGdwG z*h|wH$=q4np#jgT%a}SP-=rD*F@S*V7)!zk!fO_K7wg~|;_Dlk2I0hiKmBwbrse$q zNo*i6s2Ft8SRm_Xn52>5-vJ2ENqNBqV8Cf*71-u!KU+>oe}FNIXJg)w#79F&zbLNe zD#3s)t16@^rTUVnlZcW$^_zuL$8*({m@0XBax#im)Klo>cNA-VT0bALk?0g1_mgvnfC?=k}`0?$S$?OKu(+~mRfYvt-x055kIGB78h7g zB~c6zIvWO9pVm{g^yX6ogY~8K&OA0Sq=684v`KfC$K4&5>#Us2i9~xdV!J*{fJw<)@CPc!Np zO)qp$7{PQh5=$;!=>!70Fl5o4xk-Pg7~1r!^g~m-(P9IM4k9T}cY)33JU(BZ!T8-Y z1CvA#WFiwAL=u?APGYCbMBu}e-%L~tq;w` zN+yK^!dv!1Hlp%;^tsZp-i+|MTephbE*D9A9SEe!57G|wgnkwQl_F|+PA&-}z{Ze4 z)IpEjfTST0;a~(#;~@DZwE2|i`ZG@q3_KSEilzBRc`eNWu?&OpnmF#P?s#{WQ?9de zE{e+xgea~n`xqcx*g-^`Q`>jn@L zE*kQZ!f^Ygw7?RJL+(RTZ;GG3Nk7pqq!A{1RNTNF?Y~I{1B6t=Gf}WQZ>yXfFG*7A zY70wfSdi;amO_YRB5*$$$V?@C1gE=}|GW z*G|spIri=R3?6pky_@y* z2gzKI&NWc8*XRXj>#y>6N1iJUm5zqbF_P$7RS2by7B6I$V#qq8DBN%*2kDl6AUTR+ z*-1A>L=X8#_Ai-6HL{uX!6qGySUO2=Be@{3fY>~nFU;2npQeTEq+7#U`IXM`24^&| zE7Gd|B>_aBr?2Bt0;vw1=EjEsfCwZy8NR?m`h%Jmu{%;9n`5tZaG1?IL0J7}VJy7+ zYU*IgTp>lRg+pcjyv$`jTX6mL%g=33O&8iq4h`ILr6ULgmSRvlmRJ${z_l?AP+|fr zX^;^p0L7>i3S+FLAY;~}^!p4+_cQ$Q3rlc4(yi6b28qvruy8N{2quYc{Dhp6-lAZZ z3k$)-n2HK-d(hj@1W=}lV;21#LH`aW$M$*qyggt;--DIO)0!HR5n>SZ6dlfOx$LPo zn_H55wWR*))m}<<&y~C~p2lH(Ty?%7#VfztUK$C6TDLieZVj)x3M?Tpg_>I~`=I|U ztS3sL(9V5^=C?cuCSFd0SVBxuHv|o_1SZfhXsE?40Sys8LqUu%U&($Df>}5ErBK*B z%(alP7j?Uwh0e<3wrDi^jqq5?e?Q?%_$coZ^J5+oUaxn@#^Tz>hb&U29?o`K4Y@^y6(#3qe>dAO$u`cx(-CHx?%rLJH~(}V!Yim8H#p4ay;3oT7nARPu)gd!+7IDMF{9(o^Fb_ z`Dq~}ph$n48|y423?U3C(m^|;ugnI)sEqD>BYBE;}+q&#=FaNF$5ujCa{Noe$3Il0OyR&^W)1o{=^`=k`Ine+3r zrLpN$!tC;=8A17s)?4#N^oWS=li z{F!}_JewF;OwdntC9U{_@vwyd>})P@oi5ivrGki@jEsy>Af&#;4sSB~XlF9B!%I1f z+9qG;N)KZh0V;j?ze`3tMmed2g$?bKxm%{#ai{QV!?}|3hN<#g_SHEtY2v8)amx5^ z@?rjWXQP3PQ>Eejxbx60Mtn)f;4|eCWE4Qd>QSj#jL85D83e(UrGSfH8)L~s1(yhi zi4+wiByZE8oQ1+B5?tsdGhzKmADa(1K@il0@cgVhiyF4fn>)@-$}oLuKW)F3Nl5(( zCAbrb%s}l%)5?d5+C3)|eRz;yg1%NTgZQD43LmLNG8|2wX2aFo*^!F<6Oa)=a2}vwCfCYT$d(E! zsSn}x#IKOKm|$44VHk`Blz`^=41>)Fe0FbIOM`uhLZY&GJ-_&$f1_K0DqeIKIg7^U z3vH2TYm`I_U2gTZ0}1HB3WCI1lW&c=>y^uK(bX>)nw$0sog=UEUx$yP+RbCa``=ks5gn+uJeo(s?CJKF||oDMS?0&j(h zfa+>)WnttvOqWWQzyy~V3={)i7)U5W=l&I6=)W31>px%7gBn^7HV>?yb;t~YfeeV* z3M2g#;TcadpqMlN()^FQoblCpXJNx!Budty?__dE;EQ<4%#J=U7NXX-vesA2s!VTF z&l(BKPSTh`a@xV#x|*7e{g1wsOkQ|s*Si_1{)QJ>fpqTI`8jNIJfFu%z%*0E0$V1X z<=_yVN;M=4i^ki>$<_izTnpA1zoW6$+=>%0oX|w<&r-l3jD!%8Fmu4_ zAsCv|;Ob%+F$9KbZ^Zqq-GL$f?2iPua7uq8r(u3$&l(t7jk6ph+}|HfhWyG{2mSlC zYeOR7-{|YA>)5eIK-Ia?(UT-A)fb~|VCpto;FO7~<0BVUV*7B-AO zomXCYzBOFB{kz+5Z@;~zBHZ6F`@6`t&=L61Ffd=#w(5|}@D!1?FIFr86eL~TmVE#N z0x4kuHpmVN;){OAqv8K9y(l&fE1L>cL)Nmg}e{ndt0WOV$!se3B^j2KOXGfe*IU zG$p^t^s?01Wbj|6Q@i?Kq~v)+{$J%y7#?PK0jZ$+RYk{6%c7T$eoG-LF9 zTY1~+KpQh5TpovuFcJ=+8Ez9d!VK}BwN6xvp)1NO@j0%!qdgGoyAn478y_Z9rBuvfn&Iug*xGgfBojgoPTjov?(OMlGNYYMZX5E)E2r{u$8KME z=v&`qbi8z|qU79bubdu>_D0@}Mq7XFbRKf)VE&wISj?x*@r}jEi|A^0a!>LT77}91 zFfa`30l$Gc@)tq@he-P?z_tvA`7kJ1LhDDHR|W!u#3ls#Ob1dpDO?wZ+tubEac!IH zXG$$aUC2cE_a`XPk9VM)X5CE9T1Qh~o!5Jxjwh8a*b1sMv|Mvx?PUFtBWHhd_2%xY z^uhu;?a`7P8@UGtG}up$j!25q@C`(sl|O7}1>?=uBcrWtMY&|>z`*6Pdp!J?Ddi*) z2@pg8#Y%KAw2F-f0!LmG@p;>iVj#f5G7uX6eV-UQx&CKqPZ10Id9n5eQj!#z3F20q26AqJM&GM3%I?^pKbSED$Uh3=(oxyxrZaHfK5Wq_Fx4+@e33xhpeqQu`edJ2chR ztt>ASUwPM*$qst`UdC=awohyDJ12G|96KF6yXE$C6}GvlspFGOu$~+pr3`Dh_v&s2 z{*JSwY2}MaN`v%9OETJ5+ZpK8fR4SJzKw|{O?E+Mk@i==B5Pk2f}$)RNTzV!p7TNn>GIgH3giUT~m2kWyx9g1K`{y^n-5GCtA- zL4qmy3V(8cvS)3jscErkdAX0uyDV5%dLmWY5&TG#Dfi%LcV#3V3f$hZWg0s$d7K@g zP8`photoRWZQI$=-4vQ^pv)BU1p6+gc4tr%qu`LOZMDtiTJ>ak;xHU8U?ow1Uib)O zE%veKm0LYS4-7Mm-{6Vc4Gd~iQNe`FZenapN5l!!_L5!AZ%AMWz?H=bV>EPGV18=Y zAS}d(3FZ(E*qoD7;fI+O#h9L^hGo+B{zP(RW2LsKj*SaeULtL&y`TG zbobo!wu+M6a&{ug|6z2DWeEMHk=A@ixvjv}M)$kG;j$0Ymw@bmFibkmO*&a{5JE^N zWDwlA4jEGS@B(P)w^#>-4aPJW2yicO!%#tDZlYj)aweu!O41^P!N#DGrUF242vnM+ zfNV^810l~RiXD`(P6RUPa3;N7J#{NSP^fEKscD+2=~!Fa(b?CrJ(%oiy3o|Oo!&+) zHpk+NW>qvra(3bGF5m z#K)q^ATC&ZAkRQV!2?7#fPe!a7(Vdm=)Ol3NJ&^Bp%J;yTHk7L3H;g1&;ltpzcQvk zjMzM~3?X=|JeVSg0-1!iwI(ZZWN=zm@Kj}>vgL`v@UONBPOhtn}12 ztt@BzZoJi0GdNhY;=SQbZ1=~!Jq!mkkLulwtEY4GPJn?8PodOoW&ZCfXQx19d^~>s zTwzW{MPYk8LCN$+tTfu+P6R(+H18ZLYGZzk8Qw!q=|7DwQpi%`K4~Du5PGgSN?1Gs zABGf6D-Yt6-$aZ7-l|OnF{7 z%4m)hgHAU+O-8c(`@Mb2)74#=S^kg?SIw20y0zLq3RC-orT!or7{nqe%13Amkjmqz z1v#kv{P9=DDc`32Bw5OM-egJ6++01j_kur~j85936;8#~tF8gc?$ND~@N%87!p)G& zFe90kC)H!LL(v1@4$C$ibq}+C1eq-RfV3nI`oCQRRSR94MGB zB~`~ziVV;J7_0#sdgeSe5Lo?8Z~&&P;fvA=7=Y~1fp`nYArK7N)!1B$5f&D@v#_xE zU}(X~h)(9bn}z4*&N{g!3W{v;-010D!G2s}fbf9;g0z&MuwkRtH{+Y}QnU$Y_7zx$@&DPB_H}LPs)_zaJkzUt-IDI=_wF{rEhC9F^^8#m4Ra z3tJ*=LeUm4DsmJJ5MIk+kzo)SFc5;m7y>S#g0#av;WAN!d-$SUseQOgGcD)b|0i@(KL<;MG377{11M;WC z$?om}yVI7Ro6#CgeU3RnnTgEW%s&5`x2M)uv)H$oIassURJL4GyHYbav)1IjaiOnc zEY-O!P#>u;OifW5;{-|}pMhGWv(@FJ=h%=LW8r`#%cN14YoGI2Lh>h z(SX~oPA4Ql35XDen{%?9c@JSjqSouJP4s2fCYpS{ z5#NV3GkuxM%QcA|O*3UZ%Y7X$tt5I*PBX^MvfUuHWXhQ=XtwtR2qp$O=JN;g3Jck$ z_2~hIwaDH($HV`(KXu{VSZRMn*y*@+=nzQ{*FZd8fF9WG!;hc_kO4gQxxi(@#V1kL zaFxBvU1g`pPSvoK0PJy27+r2mwmuC)KFn-Z;eq%^hRQ@_eR2dBl+PC-%Pg8cf;4b zSi2>=CNpy{w@qt(bq{^9lxd}`fhPe`-%GU^tlx?9w4D?S+OU-8e+@No7Xso?Zck5X zVB^QrRNgqZ8b7o;;2u~Va5*%kl93yQ2Uv(KbOQiPY>5xST4EnqgzbVTu3;$;S!;Gw!j}jY+ zri~q_My4+_dj`oDeZE?sug16khL0d(t*NP}#_u=#VjUy_6PltX2F3wCU<&f{9r(&N zrix9KV;|bE53(4yoZEYvN=qZ7ft*R_(``jt|FJGTZ*A%3$}8Y89~GJvvB0Z znrDW^3K4=3huoaYHH?v9PJXfFEFiyLVuST(xUxwL%WfcJS~1deu+%_j3jsX0#Rz;5 z51DIibJ!{>fB52b@)wyKnSCpX9htR@zFJ_I$zB8qU1s);)c6+rn%0^gs=Z&TWv!{y zHfqX5s4SI+VgC1w;Se$cw=Qm%GZ7<*I@a!T}YLw8mjzEY4_>5quEKb+!&Qy>YCc zA!S(!9;eL%KPGUnPiUxBIPmW@a>&W!aXM_#Arb}2UHdl{$-3)9P!dM6CKWqRD2~VTzY~<0sE-hnf2xG;Y;A1c|KM)^SNNM<>j<@->z1!m|^4O-& zwGU-P1DU?%8;ia*-^gIuVs`eRZxAN<9?Z-hTwENS@%c7ZK1{BBzE7!|Br9Gi@Q_=6 z4z)1mflX`Ur~?Y|`|%Rz)A>)g%@2UY(@)2P|B|?H!QYz`jkJ>vy%oO|ceNFfj*&f7 zAFFC#_i&ZlyfwQp!)}8q> ztvLEH-&tQtZ0nGX;Qt;wi7vt-)N>$ii#na{0e@mw-}2gG-3X2%d&D<5l0A|=GqU)v zi-Xyp_y)^-i_1F#`vY(Ft#z^uF}b$sP=uPT^Lcp8`U_*}(M z{CqNrx7@pYW2D)aojv1&5WbP@?2*M5n31`6(6_k7SDV=x=<8Y0UaQpD*%qVXnzpQ) zbjoX@6L^bndj4};n>;5d#Bmzq^RI+&ZxDf;ish6HjSmdma%9q$jEj}PriCj0v~X7(cg;$Snb0vrap$zJyjF8XFha2pK& z2K+TOHBBA21Jg&QqrI$4%B`H8%sbBzH~aRA3vGwm4mmRNeviArLTIW~sHf(onT=B! zXLEBMZMWj97uy{1Hcy-Tq6>>49xNE2V6P(MAPD3ss;YzpXMC#1Q+@Gb^~A@;YH(11 z2~uj&K(ZSUB%HaFec;9-%qAxKnGSx0@bZ}wUTSH9Ayw&iyNVu8pclK6-Y;%sj~F*0 z`F$fJBZGt4ya_BZ7BjwVOyq~jnhVQ5?*?-zr?;__Ci7xu3&DY@AMtU6!b00O50&JO z<3AnqMV0gCUkQHerJ0$B_S8ovUvn_#9iKnsENXKNI6ShIil8_lIlcj#K*vHrR7pKN z9?t|pg&?V_9+v4xN(%{jOj$%u78a7kJTVW!ir<+NUw|D?g#w3Rgh2otxaTc22wjJV zG6GJgt-rLx+b7%DypGt071@pJ%_HmUEhCGKMprVuA5v7XW~Hk`dclZI?`SS%A0m0L znRFDv2b`Q877mJ^h@Fvo!d?wM$kIz8 zbYE5Fk)<&A06`q347G$q@o8P*V4B%#Y0EtDP*y@PXy$++hQtR2eZg1sEaW!}h+Fi9 zL4j+iSd_8LITXoAd~zX^MlWj~L>VB$;(B)TdiF@m`myZA=8`cY)pEoY~pjLgo~|RvE8!SF4B&gmjx7;1A= z4h^)$2`OC;_pqk@xLvr3stJ0P*vAQD7`S&s1o;ZA#Knuld~alve4rp4tdlN~&)AF4 zU@@i=&nhkAguoVN(18nk0YM6sNFTZs4#V+>OWR+2KO?cnmuQ;VJD5GVo;}#yxW2eP zlD)p3o!!#X_?wZD=4=!sGxJ7Y$6yWV+rE>r#FtA$q0xqO4WsR|uMt5=IUK|fn21@X z0Ei6GA-Ayftq0%gs<|D^IQtqs?!R)xosNqGj)9Agiyo!cbP&~H8?7-=AyQop z8r9XV>WjnG6UCP3lF1zU++@3Habx$4;+Xb_Hj`yk;ak6Y~LrfeI2!fgKNthWbxP7 zKP(iYknJd|4$hxH->&&E#FNBQ&N-+0SmZ6s8w%In`g~bU&Gt|<;)oA99E>D7ZaLg2 zKgY#t0ipi3>|(WtX0LWlR8^x7Rc_c&ZJ(&F@_@&1HBp}qxIkhG((5)2MOs7&y7^R( zL>)s3XkoxJv=9n1k?FU{q8lvqux*#^o0n37wGQ7*&EQD$;^6v7V@q>mvw&D%Z(JYw z%?P|`USIe9X4yxoj-l`iO`Y49V{4_s*xcON@FZ0!DHOxDRIkj&$xD@w(&HdI!!Z@R z@K()o*WZtYq7Bs!k)hogAFxmW2Nguejr6o^w zb+zM>Vu_8M(tjj0sF+s%V^$!lv_O#PXF6mC3{`ZaN1_9-&wx<;Iw2Q5v}@PEYyS~s z6Y^!kCy;0vX=ypOj>A~TP-Y)nUuuC(I|13bZdpPOf#;`FxGCllMllTaKX*kf3oLQY`YZ-h3?kL3&*^k8K^fu~t^Y ztbmn{jxT$I_qQi0!#BmK4m(RuvSkR`Ff}_{Nu-%K+b|V-tE;K5W4ZK5q&@B^8j26? zEOJo%(SRTzs$Im>GLv$h9OyxHT#t3>s-_1%6t5>q1bFC$tX_*mmtI`kcR`0~}@=x3*+IxSoCNSW63JXkI_IzCP02 z+}v_(WWBLvaHOfJd2nXOhg-KU&#W!4(1T)YT5l;^986D-hH{QX4o29rHFuPnbMv$8 zp)who9&B2>aAPdlA8wB$f19Iy$PwpCHwKIH)1W<7Y}E*U>;_+&g|HKW$VZc!+p#gVgvV%>83zz z`!p4HSS%mQoo$`WIL%fO8`HEGPv!Y>Lq?Q1OgTx6iVU+tX4N{NQ-L_5frBJ)$#@diwyb)pD6|X z2{%&^a2xU!gmDD~8^i8_UEVGK;qSQdI$;!^VLki7mgc)H9P7=^V9HC8*6OX?d>RK@2vY2aHj4K<>BX8)~M}QdV2$9FD=(y=%5G< zd~g&w#)pcE;ze;sHIXG|6GRkK?yIWCL87kJ=qwQft`ZjtFXBsBi+Fs=;VH7@Hp0-} z2=~W8NMaoZ1bvy-05L*1aF~Ci=jO1q!Y!Lw03?dC>DxTKYs;3-jx`1>2&8AE70q{1 z3_^$X7L4XGKtVy8*9S*3n`iDcuk5IsS-*1cO7n7E?F~kIYL=UtygO3l{NJLyTu!V% z84QO?8X~**1iSveX1T7XGZ@Y3Zy$0NX%Z!}>uvNxgup)Rvy7quz*=G!LVNQUd$XBS-#RT_#|Vz(;8l= zuBrlnC1Pr{Vo7(dsv*=N4maRK^-g0KthPm3T36J-Jn$h&4FS@CSoiv^Q4Rxw=~&5E zDrVvX$H^!bX>(AZgCjg#c08w-IUn>ZiKyveH6r@4b$o`*1P(*db<287c4Ky?FZ+YC zksEa*dz*iBZ|gf{O<&xfsGE6cC9%JDZKbP@-5)wSyqc07JHkY4f8UkIYF602I1!*y zbo)~L(l0K>mx{2G#MnYX7J!@s83^MWagS)Nfdrc=RxEKE0sC(>#?3I<}3%s}*%49~=0;gw-AiUmbO~>+xut{=j39(dAFyNCeQ~0S z31UP9zL~P@8O2U5$FLFWkf23y2#=9|J+tBr)p{1drqWBP4 z48@n?Rifqs2{<}aD8@c}HOhhfpn-uHs=ioVC4W&Z@zVfUA3Cd%1rH*M4}UlalK9fX zLC^IIbizQxQw}4!LfP~|ALru5i$j^2nT%s**NphKuKPw>4#NqoB$}Z=-ZBu!n)kM3 zXJ&tJrL6AC$liPZ`17A-Z!N2xS+1>JS)Q3G+gjE*Q}a$&Q_}`D-g~+_Pj=PJ%*+h_ z=&`@=>IwK;r+2mPJZ-x)G&J<&5QN}UhZ?^6BDs4$s)?k*!d&qf6qc5jAj#4tkdX72 z&^QWnftdX1kr7cLfw|jka`avDa?%I1;6pzV6dV)e!-f&u8Xz%PT%<$i-i2n=l9^Ta z3gt&`5#sJ$Ft}^LAcAOFUmRJ#u}EnB`oA~UHGlAr$I9LrsT-_mVyb2Hm96&%x6Zu2 z+_cuiOmt>dH8pMBx)pvgSl-o?3_evFXtllnUi{LN;2=soIdsXqBrDT{u#^S>?4z(* za#z8LCC{bmg?-hwrKSHQd1Vc(KC@8-3j+zI!}{2S0fHE*87|~&I&KyY1_P*oLcoQK zB*n}@9OvfdBEuK}(O0&0u!b;d(3jnExaHVk*-66%nTNZ$j>bmvmN$GKe6aH12Lzt~ z`18h*nXOxA>Y84knb}(QL33Gi4TBtAHOnJ)uQ%1a13|U|?Z2$u|JJvXr%IEp5! zP%xB81F>|ShIj2dV>||}KOr=hu1h(v4PfH3S6|1%8d(8CCcqNhdIHxs38A*$1VsMO zVgprJaS}@DNPeqpsiYuKfPw}NIb0VRB;l#UgU{H%vUTssmF$@-*|G-50OA-x$VPC2 zAw&>+N1FH6KK8GBx85sjZoG2mv1}7X?5+7(V_EjGvXQcPu!_rNOiHfHe&@=M8fVs9 zKKP5lj$f|zboM4=??1cKxzi}brJ*O6gaeGYehD0^tM*|j(SRyN)bIgxcr1q4z~cH+ z^^+17#}Chq0Yo4PYT18d3HSkDLlojMUK4JQOeMp_!U3nKM-~)F?c!UI5FcC`B)P~s zt&3H7S3Y=frlWRG*SET+d;I

=&j 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 J%o8Bwe*wCz1epK; diff --git a/tools/Imakefile b/tools/Imakefile index c993ef4f38d..f3bac38c714 100644 --- a/tools/Imakefile +++ b/tools/Imakefile @@ -6,4 +6,4 @@ MODULE = tools SimpleProgramTarget(build) #else SimpleProgramTarget(newbuild) -#endif \ No newline at end of file +#endif diff --git a/tools/build.c b/tools/build.c index 9b0eadaff97..176dca07524 100644 --- a/tools/build.c +++ b/tools/build.c @@ -5,6 +5,7 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993"; #include #include #include +#include "wine.h" #ifdef linux #define UTEXTSEL 0x23 @@ -28,6 +29,46 @@ static char Copyright[] = "Copyright Robert J. Amstadt, 1993"; #define MAX_ORDINALS 1024 +#define PUSH_0 "\tpushl\t$0\n" +#define PUSH_SS "\tpushw\t$0\n\tpushw\t%%ss\n" +#define PUSH_ESP "\tpushl\t%%esp\n" +#define PUSH_EFL "\tpushfl\n" +#define PUSH_CS "\tpushw\t$0\n\tpushw\t%%cs\n" +#define PUSH_EIP "\tpushl\t$0\n" +#define PUSH_DS "\tpushw\t$0\n\tpushw\t%%ds\n" +#define PUSH_ES "\tpushw\t$0\n\tpushw\t%%es\n" +#define PUSH_FS "\tpushw\t$0\n\tpushw\t%%fs\n" +#define PUSH_GS "\tpushw\t$0\n\tpushw\t%%gs\n" +#define PUSH_EAX "\tpushl\t%%eax\n" +#define PUSH_ECX "\tpushl\t%%ecx\n" +#define PUSH_EDX "\tpushl\t%%edx\n" +#define PUSH_EBX "\tpushl\t%%ebx\n" +#define PUSH_EBP "\tpushl\t%%ebp\n" +#define PUSH_ESI "\tpushl\t%%esi\n" +#define PUSH_EDI "\tpushl\t%%edi\n" + +#define POP_0 "\tadd\t$4,%%esp\n" +#define POP_SS "\tpopw\t%%ss\n\tadd\t$2,%%esp\n" +#define POP_ESP "\tpopl\t%%esp\n" +#define POP_EFL "\tpopfl\n" +#define POP_CS "\tpopw\t%%cs\n\tadd\t$2,%%esp\n" +#define POP_EIP "\tpopl\t$0\n" +#define POP_DS "\tpopw\t%%ds\n\tadd\t$2,%%esp\n" +#define POP_ES "\tpopw\t%%es\n\tadd\t$2,%%esp\n" +#define POP_FS "\tpopw\t%%fs\n\tadd\t$2,%%esp\n" +#define POP_GS "\tpopw\t%%gs\n\tadd\t$2,%%esp\n" +#define POP_EAX "\tpopl\t%%eax\n" +#define POP_ECX "\tpopl\t%%ecx\n" +#define POP_EDX "\tpopl\t%%edx\n" +#define POP_EBX "\tpopl\t%%ebx\n" +#define POP_EBP "\tpopl\t%%ebp\n" +#define POP_ESI "\tpopl\t%%esi\n" +#define POP_EDI "\tpopl\t%%edi\n" + +char **context_strings; +char **pop_strings; +int n_context_strings; + typedef struct ordinal_definition_s { int valid; @@ -551,6 +592,74 @@ ParseTopLevel(void) return 0; } +InitContext() +{ + struct sigcontext_struct context; + int i; + int j; + + n_context_strings = sizeof(context) / 4; + context_strings = (char **) malloc(n_context_strings * sizeof(char **)); + pop_strings = (char **) malloc(n_context_strings * sizeof(char **)); + for (i = 0; i < n_context_strings; i++) + { + context_strings[i] = PUSH_0; + pop_strings[i] = POP_0; + } + + i = n_context_strings - 1 + ((int) &context - (int) &context.sc_esp) / 4; + context_strings[i] = PUSH_ESP; + + i = n_context_strings - 1 + ((int) &context - (int) &context.sc_ebp) / 4; + context_strings[i] = PUSH_EBP; + pop_strings[n_context_strings - 1 - i] = POP_EBP; + + i = n_context_strings - 1 + ((int) &context - (int) &context.sc_eip) / 4; + context_strings[i] = PUSH_EIP; + + i = n_context_strings - 1 + ((int) &context - (int) &context.sc_efl) / 4; + context_strings[i] = PUSH_EFL; + pop_strings[n_context_strings - 1 - i] = POP_EFL; + + i = n_context_strings - 1 + ((int) &context - (int) &context.sc_es) / 4; + context_strings[i] = PUSH_ES; + pop_strings[n_context_strings - 1 - i] = POP_ES; + + i = n_context_strings - 1 + ((int) &context - (int) &context.sc_ds) / 4; + context_strings[i] = PUSH_DS; + pop_strings[n_context_strings - 1 - i] = POP_DS; + + i = n_context_strings - 1 + ((int) &context - (int) &context.sc_cs) / 4; + context_strings[i] = PUSH_CS; + + i = n_context_strings - 1 + ((int) &context - (int) &context.sc_ss) / 4; + context_strings[i] = PUSH_SS; + + i = n_context_strings - 1 + ((int) &context - (int) &context.sc_edi) / 4; + context_strings[i] = PUSH_EDI; + pop_strings[n_context_strings - 1 - i] = POP_EDI; + + i = n_context_strings - 1 + ((int) &context - (int) &context.sc_esi) / 4; + context_strings[i] = PUSH_ESI; + pop_strings[n_context_strings - 1 - i] = POP_ESI; + + i = n_context_strings - 1 + ((int) &context - (int) &context.sc_ebx) / 4; + context_strings[i] = PUSH_EBX; + pop_strings[n_context_strings - 1 - i] = POP_EBX; + + i = n_context_strings - 1 + ((int) &context - (int) &context.sc_edx) / 4; + context_strings[i] = PUSH_EDX; + pop_strings[n_context_strings - 1 - i] = POP_EDX; + + i = n_context_strings - 1 + ((int) &context - (int) &context.sc_ecx) / 4; + context_strings[i] = PUSH_ECX; + pop_strings[n_context_strings - 1 - i] = POP_ECX; + + i = n_context_strings - 1 + ((int) &context - (int) &context.sc_eax) / 4; + context_strings[i] = PUSH_EAX; + pop_strings[n_context_strings - 1 - i] = POP_EAX; +} + void OutputVariableCode(FILE *fp, char *storage, ORDDEF *odp) { @@ -584,14 +693,46 @@ main(int argc, char **argv) char filename[80]; char buffer[80]; char *p; - int i; + int i, ci; + int add_count; if (argc < 2) { - fprintf(stderr, "usage: build SPECNAME\n"); + fprintf(stderr, "usage: build SPECNAME\n build -p\n"); exit(1); } + InitContext(); + + if (strcmp("-p", argv[1]) == 0) + { + fp = fopen("pop.h", "w"); + add_count = 0; + for (i = 0; i < n_context_strings; i++) + { + if (strncmp(pop_strings[i], "\tadd\t", 5) == 0) + { + add_count += atoi(pop_strings[i] + 6); + } + else + { + if (add_count > 0) + { + fprintf(fp, "\tadd\t$%d,%%esp\n", add_count); + add_count = 0; + } + + fprintf(fp, pop_strings[i]); + } + } + + if (add_count > 0) + fprintf(fp, "\tadd\t$%d,%%esp\n", add_count); + + fclose(fp); + exit(0); + } + SpecFp = fopen(argv[1], "r"); if (SpecFp == NULL) { @@ -619,10 +760,6 @@ main(int argc, char **argv) if (!odp->valid) { fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i); -#ifdef BOB_SAYS_NO - fprintf(fp, "\tandl\t$0x0000ffff,%%esp\n"); - fprintf(fp, "\tandl\t$0x0000ffff,%%ebp\n"); -#endif fprintf(fp, "\tmovl\t$%d,%%eax\n", i); fprintf(fp, "\tpushw\t$0\n"); fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName); @@ -667,61 +804,23 @@ main(int argc, char **argv) fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i); fprintf(fp, "\tandl\t$0x0000ffff,%%esp\n"); fprintf(fp, "\tandl\t$0x0000ffff,%%ebp\n"); - fprintf(fp, "\tpushl\t$0\n"); /* cr2 */ - fprintf(fp, "\tpushl\t$0\n"); /* oldmask */ - fprintf(fp, "\tpushl\t$0\n"); /* i387 */ - fprintf(fp, "\tpushw\t$0\n"); /* __ssh */ - fprintf(fp, "\tpushw\t%%ss\n"); /* ss */ - fprintf(fp, "\tpushl\t%%esp\n"); /* esp */ - fprintf(fp, "\tpushfl\n"); /* eflags */ - fprintf(fp, "\tpushw\t$0\n"); /* __csh */ - fprintf(fp, "\tpushw\t%%cs\n"); /* cs */ - fprintf(fp, "\tpushl\t$0\n"); /* eip */ - fprintf(fp, "\tpushl\t$0\n"); /* err */ - fprintf(fp, "\tpushl\t$0\n"); /* trapno */ - fprintf(fp, "\tpushal\n"); /* AX, ... */ - fprintf(fp, "\tpushw\t$0\n"); /* __dsh */ - fprintf(fp, "\tpushw\t%%ds\n"); /* ds */ - fprintf(fp, "\tpushw\t$0\n"); /* __esh */ - fprintf(fp, "\tpushw\t%%es\n"); /* es */ - fprintf(fp, "\tpushw\t$0\n"); /* __fsh */ - fprintf(fp, "\tpushw\t%%fs\n"); /* fs */ - fprintf(fp, "\tpushw\t$0\n"); /* __gsh */ - fprintf(fp, "\tpushw\t%%gs\n"); /* gs */ + + for (ci = 0; ci < n_context_strings; ci++) + fprintf(fp, context_strings[ci]); + fprintf(fp, "\tmovl\t%%ebp,%%eax\n"); fprintf(fp, "\tmovw\t%%esp,%%ebp\n"); - fprintf(fp, "\tpushl\t88(%%ebp)\n"); + fprintf(fp, "\tpushl\t%d(%%ebp)\n", + sizeof(struct sigcontext_struct)); fprintf(fp, "\tmovl\t%%eax,%%ebp\n"); fprintf(fp, "\tmovl\t$%d,%%eax\n", i); - fprintf(fp, "\tpushw\t$92\n"); + fprintf(fp, "\tpushw\t$%d\n", + sizeof(struct sigcontext_struct) + 4); fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName); -#if 0 - fprintf(fp, "\tpushw\t%%ax\n"); - fprintf(fp, "\tpushw\t%%cx\n"); - fprintf(fp, "\tpushw\t%%dx\n"); - fprintf(fp, "\tpushw\t%%bx\n"); - fprintf(fp, "\tpushw\t%%sp\n"); - fprintf(fp, "\tpushw\t%%bp\n"); - fprintf(fp, "\tpushw\t%%si\n"); - fprintf(fp, "\tpushw\t%%di\n"); - fprintf(fp, "\tpushw\t%%ds\n"); - fprintf(fp, "\tpushw\t%%es\n"); - fprintf(fp, "\tmovl\t%%ebp,%%eax\n"); - fprintf(fp, "\tmovw\t%%esp,%%ebp\n"); - fprintf(fp, "\tpushl\t20(%%ebp)\n"); - fprintf(fp, "\tmovl\t%%eax,%%ebp\n"); - fprintf(fp, "\tmovl\t$%d,%%eax\n", i); - fprintf(fp, "\tpushw\t$24\n"); - fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName); -#endif break; case FUNCTYPE_PASCAL: fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i); -#ifdef BOB_SAYS_NO - fprintf(fp, "\tandl\t$0x0000ffff,%%esp\n"); - fprintf(fp, "\tandl\t$0x0000ffff,%%ebp\n"); -#endif fprintf(fp, "\tmovl\t$%d,%%eax\n", i); fprintf(fp, "\tpushw\t$%d\n", fdp->arg_16_size); fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName); @@ -730,10 +829,6 @@ main(int argc, char **argv) case FUNCTYPE_C: default: fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i); -#ifdef BOB_SAYS_NO - fprintf(fp, "\tandl\t$0x0000ffff,%%esp\n"); - fprintf(fp, "\tandl\t$0x0000ffff,%%ebp\n"); -#endif fprintf(fp, "\tmovl\t$%d,%%eax\n", i); fprintf(fp, "\tpushw\t$0\n"); fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName); diff --git a/tools/build.c.save b/tools/build.c.save new file mode 100644 index 00000000000..9b0eadaff97 --- /dev/null +++ b/tools/build.c.save @@ -0,0 +1,847 @@ +static char RCSId[] = "$Id: build.c,v 1.3 1993/07/04 04:04:21 root Exp root $"; +static char Copyright[] = "Copyright Robert J. Amstadt, 1993"; + +#include +#include +#include +#include + +#ifdef linux +#define UTEXTSEL 0x23 +#endif +#if defined(__NetBSD__) || defined(__FreeBSD__) +#define UTEXTSEL 0x1f +#endif + +#define VARTYPE_BYTE 0 +#define VARTYPE_SIGNEDWORD 0 +#define VARTYPE_WORD 1 +#define VARTYPE_LONG 2 +#define VARTYPE_FARPTR 3 + +#define FUNCTYPE_PASCAL 16 +#define FUNCTYPE_C 17 +#define FUNCTYPE_REG 19 + +#define EQUATETYPE_ABS 18 +#define TYPE_RETURN 20 + +#define MAX_ORDINALS 1024 + +typedef struct ordinal_definition_s +{ + int valid; + int type; + char export_name[80]; + void *additional_data; +} ORDDEF; + +typedef struct ordinal_variable_definition_s +{ + int n_values; + int *values; +} ORDVARDEF; + +typedef struct ordinal_function_definition_s +{ + int n_args_16; + int arg_types_16[16]; + int arg_16_offsets[16]; + int arg_16_size; + char internal_name[80]; + int n_args_32; + int arg_indices_32[16]; +} ORDFUNCDEF; + +typedef struct ordinal_return_definition_s +{ + int arg_size; + int ret_value; +} ORDRETDEF; + +ORDDEF OrdinalDefinitions[MAX_ORDINALS]; + +char LowerDLLName[80]; +char UpperDLLName[80]; +int Limit; +int DLLId; +FILE *SpecFp; + +char *ParseBuffer = NULL; +char *ParseNext; +char ParseSaveChar; +int Line; + +int IsNumberString(char *s) +{ + while (*s != '\0') + if (!isdigit(*s++)) + return 0; + + return 1; +} + +char *strlower(char *s) +{ + char *p; + + for(p = s; *p != '\0'; p++) + *p = tolower(*p); + + return s; +} + +char *strupper(char *s) +{ + char *p; + + for(p = s; *p != '\0'; p++) + *p = toupper(*p); + + return s; +} + +int stricmp(char *s1, char *s2) +{ + if (strlen(s1) != strlen(s2)) + return -1; + + while (*s1 != '\0') + if (*s1++ != *s2++) + return -1; + + return 0; +} + +char * +GetTokenInLine(void) +{ + char *p; + char *token; + + if (ParseNext != ParseBuffer) + { + if (ParseSaveChar == '\0') + return NULL; + *ParseNext = ParseSaveChar; + } + + /* + * Remove initial white space. + */ + for (p = ParseNext; isspace(*p); p++) + ; + + if (*p == '\0') + return NULL; + + /* + * Find end of token. + */ + token = p++; + if (*token != '(' && *token != ')') + while (*p != '\0' && *p != '(' && *p != ')' && !isspace(*p)) + p++; + + ParseSaveChar = *p; + ParseNext = p; + *p = '\0'; + + return token; +} + +char * +GetToken(void) +{ + char *token; + + if (ParseBuffer == NULL) + { + ParseBuffer = malloc(512); + ParseNext = ParseBuffer; + Line++; + while (1) + { + if (fgets(ParseBuffer, 511, SpecFp) == NULL) + return NULL; + if (ParseBuffer[0] != '#') + break; + } + } + + while ((token = GetTokenInLine()) == NULL) + { + ParseNext = ParseBuffer; + Line++; + while (1) + { + if (fgets(ParseBuffer, 511, SpecFp) == NULL) + return NULL; + if (ParseBuffer[0] != '#') + break; + } + } + + return token; +} + +int +ParseVariable(int ordinal, int type) +{ + ORDDEF *odp; + ORDVARDEF *vdp; + char export_name[80]; + char *token; + char *endptr; + int *value_array; + int n_values; + int value_array_size; + + strcpy(export_name, GetToken()); + + token = GetToken(); + if (*token != '(') + { + fprintf(stderr, "%d: Expected '(' got '%s'\n", Line, token); + exit(1); + } + + n_values = 0; + value_array_size = 25; + value_array = malloc(sizeof(*value_array) * value_array_size); + + while ((token = GetToken()) != NULL) + { + if (*token == ')') + break; + + value_array[n_values++] = strtol(token, &endptr, 0); + if (n_values == value_array_size) + { + value_array_size += 25; + value_array = realloc(value_array, + sizeof(*value_array) * value_array_size); + } + + if (endptr == NULL || *endptr != '\0') + { + fprintf(stderr, "%d: Expected number value, got '%s'\n", Line, + token); + exit(1); + } + } + + if (token == NULL) + { + fprintf(stderr, "%d: End of file in variable declaration\n", Line); + exit(1); + } + + if (ordinal >= MAX_ORDINALS) + { + fprintf(stderr, "%d: Ordinal number too large\n", Line); + exit(1); + } + + odp = &OrdinalDefinitions[ordinal]; + odp->valid = 1; + odp->type = type; + strcpy(odp->export_name, export_name); + + vdp = malloc(sizeof(*vdp)); + odp->additional_data = vdp; + + vdp->n_values = n_values; + vdp->values = realloc(value_array, sizeof(*value_array) * n_values); + + return 0; +} + +int +ParseExportFunction(int ordinal, int type) +{ + char *token; + ORDDEF *odp; + ORDFUNCDEF *fdp; + int arg_types[16]; + int i; + int arg_num; + int current_offset; + int arg_size; + + + if (ordinal >= MAX_ORDINALS) + { + fprintf(stderr, "%d: Ordinal number too large\n", Line); + exit(1); + } + + odp = &OrdinalDefinitions[ordinal]; + strcpy(odp->export_name, GetToken()); + odp->valid = 1; + odp->type = type; + fdp = malloc(sizeof(*fdp)); + odp->additional_data = fdp; + + token = GetToken(); + if (*token != '(') + { + fprintf(stderr, "%d: Expected '(' got '%s'\n", Line, token); + exit(1); + } + + fdp->arg_16_size = 0; + for (i = 0; i < 16; i++) + { + token = GetToken(); + if (*token == ')') + break; + + if (stricmp(token, "byte") == 0 || stricmp(token, "word") == 0) + { + fdp->arg_types_16[i] = VARTYPE_WORD; + fdp->arg_16_size += 2; + fdp->arg_16_offsets[i] = 2; + } + else if (stricmp(token, "s_byte") == 0 || + stricmp(token, "s_word") == 0) + { + fdp->arg_types_16[i] = VARTYPE_SIGNEDWORD; + fdp->arg_16_size += 2; + fdp->arg_16_offsets[i] = 2; + } + else if (stricmp(token, "long") == 0 || stricmp(token, "s_long") == 0) + { + fdp->arg_types_16[i] = VARTYPE_LONG; + fdp->arg_16_size += 4; + fdp->arg_16_offsets[i] = 4; + } + else if (stricmp(token, "ptr") == 0) + { + fdp->arg_types_16[i] = VARTYPE_FARPTR; + fdp->arg_16_size += 4; + fdp->arg_16_offsets[i] = 4; + } + else + { + fprintf(stderr, "%d: Unknown variable type '%s'\n", Line, token); + exit(1); + } + } + fdp->n_args_16 = i; + + if (type == FUNCTYPE_PASCAL || type == FUNCTYPE_REG) + { + current_offset = 0; + for (i--; i >= 0; i--) + { + arg_size = fdp->arg_16_offsets[i]; + fdp->arg_16_offsets[i] = current_offset; + current_offset += arg_size; + } + } + else + { + current_offset = 0; + for (i = 0; i < fdp->n_args_16; i++) + { + arg_size = fdp->arg_16_offsets[i]; + fdp->arg_16_offsets[i] = current_offset; + current_offset += arg_size; + } + } + + strcpy(fdp->internal_name, GetToken()); + token = GetToken(); + if (*token != '(') + { + fprintf(stderr, "%d: Expected '(' got '%s'\n", Line, token); + exit(1); + } + for (i = 0; i < 16; i++) + { + token = GetToken(); + if (*token == ')') + break; + + fdp->arg_indices_32[i] = atoi(token); + if (fdp->arg_indices_32[i] < 1 || + fdp->arg_indices_32[i] > fdp->n_args_16) + { + fprintf(stderr, "%d: Bad argument index %d\n", Line, + fdp->arg_indices_32[i]); + exit(1); + } + } + fdp->n_args_32 = i; + + return 0; +} + +int +ParseEquate(int ordinal) +{ + ORDDEF *odp; + char *token; + char *endptr; + int value; + + if (ordinal >= MAX_ORDINALS) + { + fprintf(stderr, "%d: Ordinal number too large\n", Line); + exit(1); + } + + odp = &OrdinalDefinitions[ordinal]; + strcpy(odp->export_name, GetToken()); + + token = GetToken(); + value = strtol(token, &endptr, 0); + if (endptr == NULL || *endptr != '\0') + { + fprintf(stderr, "%d: Expected number value, got '%s'\n", Line, + token); + exit(1); + } + + odp->valid = 1; + odp->type = EQUATETYPE_ABS; + odp->additional_data = (void *) value; + + return 0; +} + +int +ParseReturn(int ordinal) +{ + ORDDEF *odp; + ORDRETDEF *rdp; + char *token; + char *endptr; + int value; + + if (ordinal >= MAX_ORDINALS) + { + fprintf(stderr, "%d: Ordinal number too large\n", Line); + exit(1); + } + + rdp = malloc(sizeof(*rdp)); + + odp = &OrdinalDefinitions[ordinal]; + strcpy(odp->export_name, GetToken()); + odp->valid = 1; + odp->type = TYPE_RETURN; + odp->additional_data = rdp; + + token = GetToken(); + rdp->arg_size = strtol(token, &endptr, 0); + if (endptr == NULL || *endptr != '\0') + { + fprintf(stderr, "%d: Expected number value, got '%s'\n", Line, + token); + exit(1); + } + + token = GetToken(); + rdp->ret_value = strtol(token, &endptr, 0); + if (endptr == NULL || *endptr != '\0') + { + fprintf(stderr, "%d: Expected number value, got '%s'\n", Line, + token); + exit(1); + } + + return 0; +} + +int +ParseOrdinal(int ordinal) +{ + char *token; + + token = GetToken(); + if (token == NULL) + { + fprintf(stderr, "%d: Expected type after ordinal\n", Line); + exit(1); + } + + if (stricmp(token, "byte") == 0) + return ParseVariable(ordinal, VARTYPE_BYTE); + else if (stricmp(token, "word") == 0) + return ParseVariable(ordinal, VARTYPE_WORD); + else if (stricmp(token, "long") == 0) + return ParseVariable(ordinal, VARTYPE_LONG); + else if (stricmp(token, "c") == 0) + return ParseExportFunction(ordinal, FUNCTYPE_C); + else if (stricmp(token, "p") == 0) + return ParseExportFunction(ordinal, FUNCTYPE_PASCAL); + else if (stricmp(token, "pascal") == 0) + return ParseExportFunction(ordinal, FUNCTYPE_PASCAL); + else if (stricmp(token, "register") == 0) + return ParseExportFunction(ordinal, FUNCTYPE_REG); + else if (stricmp(token, "equate") == 0) + return ParseEquate(ordinal); + else if (stricmp(token, "return") == 0) + return ParseReturn(ordinal); + else + { + fprintf(stderr, + "%d: Expected type after ordinal, found '%s' instead\n", + Line, token); + exit(1); + } +} + +int +ParseTopLevel(void) +{ + char *token; + + while ((token = GetToken()) != NULL) + { + if (stricmp(token, "name") == 0) + { + strcpy(LowerDLLName, GetToken()); + strlower(LowerDLLName); + + strcpy(UpperDLLName, LowerDLLName); + strupper(UpperDLLName); + } + else if (stricmp(token, "id") == 0) + { + token = GetToken(); + if (!IsNumberString(token)) + { + fprintf(stderr, "%d: Expected number after id\n", Line); + exit(1); + } + + DLLId = atoi(token); + } + else if (stricmp(token, "length") == 0) + { + token = GetToken(); + if (!IsNumberString(token)) + { + fprintf(stderr, "%d: Expected number after length\n", Line); + exit(1); + } + + Limit = atoi(token); + } + else if (IsNumberString(token)) + { + int ordinal; + int rv; + + ordinal = atoi(token); + if ((rv = ParseOrdinal(ordinal)) < 0) + return rv; + } + else + { + fprintf(stderr, + "%d: Expected name, id, length or ordinal\n", Line); + exit(1); + } + } + + return 0; +} + +void +OutputVariableCode(FILE *fp, char *storage, ORDDEF *odp) +{ + ORDVARDEF *vdp; + int i; + + fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i); + + vdp = odp->additional_data; + for (i = 0; i < vdp->n_values; i++) + { + if ((i & 7) == 0) + fprintf(fp, "\t%s\t", storage); + + fprintf(fp, "%d", vdp->values[i]); + + if ((i & 7) == 7 || i == vdp->n_values - 1) + fprintf(fp, "\n"); + else + fprintf(fp, ", "); + } + fprintf(fp, "\n"); +} + +main(int argc, char **argv) +{ + ORDDEF *odp; + ORDFUNCDEF *fdp; + ORDRETDEF *rdp; + FILE *fp; + char filename[80]; + char buffer[80]; + char *p; + int i; + + if (argc < 2) + { + fprintf(stderr, "usage: build SPECNAME\n"); + exit(1); + } + + SpecFp = fopen(argv[1], "r"); + if (SpecFp == NULL) + { + fprintf(stderr, "Could not open specification file, '%s'\n", argv[1]); + exit(1); + } + + ParseTopLevel(); + + sprintf(filename, "dll_%s.S", LowerDLLName); + fp = fopen(filename, "w"); + + fprintf(fp, "\t.globl _%s_Dispatch\n", UpperDLLName); + fprintf(fp, "_%s_Dispatch:\n", UpperDLLName); + fprintf(fp, "\tandl\t$0x0000ffff,%%esp\n"); + fprintf(fp, "\tandl\t$0x0000ffff,%%ebp\n"); + fprintf(fp, "\torl\t$0x%08x,%%eax\n", DLLId << 16); + fprintf(fp, "\tjmp\t_CallTo32\n\n"); + + odp = OrdinalDefinitions; + for (i = 0; i <= Limit; i++, odp++) + { + fprintf(fp, "\t.globl _%s_Ordinal_%d\n", UpperDLLName, i); + + if (!odp->valid) + { + fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i); +#ifdef BOB_SAYS_NO + fprintf(fp, "\tandl\t$0x0000ffff,%%esp\n"); + fprintf(fp, "\tandl\t$0x0000ffff,%%ebp\n"); +#endif + fprintf(fp, "\tmovl\t$%d,%%eax\n", i); + fprintf(fp, "\tpushw\t$0\n"); + fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName); + } + else + { + fdp = odp->additional_data; + rdp = odp->additional_data; + + switch (odp->type) + { + case EQUATETYPE_ABS: + fprintf(fp, "_%s_Ordinal_%d = %d\n\n", + UpperDLLName, i, (int) odp->additional_data); + break; + + case VARTYPE_BYTE: + OutputVariableCode(fp, ".byte", odp); + break; + + case VARTYPE_WORD: + OutputVariableCode(fp, ".word", odp); + break; + + case VARTYPE_LONG: + OutputVariableCode(fp, ".long", odp); + break; + + case TYPE_RETURN: + fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i); + fprintf(fp, "\tmovw\t$%d,%%ax\n", rdp->ret_value & 0xffff); + fprintf(fp, "\tmovw\t$%d,%%dx\n", + (rdp->ret_value >> 16) & 0xffff); + fprintf(fp, "\t.byte\t0x66\n"); + if (rdp->arg_size != 0) + fprintf(fp, "\tlret\t$%d\n", rdp->arg_size); + else + fprintf(fp, "\tlret\n"); + break; + + case FUNCTYPE_REG: + fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i); + fprintf(fp, "\tandl\t$0x0000ffff,%%esp\n"); + fprintf(fp, "\tandl\t$0x0000ffff,%%ebp\n"); + fprintf(fp, "\tpushl\t$0\n"); /* cr2 */ + fprintf(fp, "\tpushl\t$0\n"); /* oldmask */ + fprintf(fp, "\tpushl\t$0\n"); /* i387 */ + fprintf(fp, "\tpushw\t$0\n"); /* __ssh */ + fprintf(fp, "\tpushw\t%%ss\n"); /* ss */ + fprintf(fp, "\tpushl\t%%esp\n"); /* esp */ + fprintf(fp, "\tpushfl\n"); /* eflags */ + fprintf(fp, "\tpushw\t$0\n"); /* __csh */ + fprintf(fp, "\tpushw\t%%cs\n"); /* cs */ + fprintf(fp, "\tpushl\t$0\n"); /* eip */ + fprintf(fp, "\tpushl\t$0\n"); /* err */ + fprintf(fp, "\tpushl\t$0\n"); /* trapno */ + fprintf(fp, "\tpushal\n"); /* AX, ... */ + fprintf(fp, "\tpushw\t$0\n"); /* __dsh */ + fprintf(fp, "\tpushw\t%%ds\n"); /* ds */ + fprintf(fp, "\tpushw\t$0\n"); /* __esh */ + fprintf(fp, "\tpushw\t%%es\n"); /* es */ + fprintf(fp, "\tpushw\t$0\n"); /* __fsh */ + fprintf(fp, "\tpushw\t%%fs\n"); /* fs */ + fprintf(fp, "\tpushw\t$0\n"); /* __gsh */ + fprintf(fp, "\tpushw\t%%gs\n"); /* gs */ + fprintf(fp, "\tmovl\t%%ebp,%%eax\n"); + fprintf(fp, "\tmovw\t%%esp,%%ebp\n"); + fprintf(fp, "\tpushl\t88(%%ebp)\n"); + fprintf(fp, "\tmovl\t%%eax,%%ebp\n"); + fprintf(fp, "\tmovl\t$%d,%%eax\n", i); + fprintf(fp, "\tpushw\t$92\n"); + fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName); +#if 0 + fprintf(fp, "\tpushw\t%%ax\n"); + fprintf(fp, "\tpushw\t%%cx\n"); + fprintf(fp, "\tpushw\t%%dx\n"); + fprintf(fp, "\tpushw\t%%bx\n"); + fprintf(fp, "\tpushw\t%%sp\n"); + fprintf(fp, "\tpushw\t%%bp\n"); + fprintf(fp, "\tpushw\t%%si\n"); + fprintf(fp, "\tpushw\t%%di\n"); + fprintf(fp, "\tpushw\t%%ds\n"); + fprintf(fp, "\tpushw\t%%es\n"); + fprintf(fp, "\tmovl\t%%ebp,%%eax\n"); + fprintf(fp, "\tmovw\t%%esp,%%ebp\n"); + fprintf(fp, "\tpushl\t20(%%ebp)\n"); + fprintf(fp, "\tmovl\t%%eax,%%ebp\n"); + fprintf(fp, "\tmovl\t$%d,%%eax\n", i); + fprintf(fp, "\tpushw\t$24\n"); + fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName); +#endif + break; + + case FUNCTYPE_PASCAL: + fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i); +#ifdef BOB_SAYS_NO + fprintf(fp, "\tandl\t$0x0000ffff,%%esp\n"); + fprintf(fp, "\tandl\t$0x0000ffff,%%ebp\n"); +#endif + fprintf(fp, "\tmovl\t$%d,%%eax\n", i); + fprintf(fp, "\tpushw\t$%d\n", fdp->arg_16_size); + fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName); + break; + + case FUNCTYPE_C: + default: + fprintf(fp, "_%s_Ordinal_%d:\n", UpperDLLName, i); +#ifdef BOB_SAYS_NO + fprintf(fp, "\tandl\t$0x0000ffff,%%esp\n"); + fprintf(fp, "\tandl\t$0x0000ffff,%%ebp\n"); +#endif + fprintf(fp, "\tmovl\t$%d,%%eax\n", i); + fprintf(fp, "\tpushw\t$0\n"); + fprintf(fp, "\tjmp\t_%s_Dispatch\n\n", UpperDLLName); + break; + } + } + } + + fclose(fp); + +#ifndef SHORTNAMES + sprintf(filename, "dll_%s_tab.c", LowerDLLName); +#else + sprintf(filename, "dtb_%s.c", LowerDLLName); +#endif + fp = fopen(filename, "w"); + + fprintf(fp, "#include \n"); + fprintf(fp, "#include \n"); + fprintf(fp, "#include \042dlls.h\042\n\n"); + + for (i = 0; i <= Limit; i++) + { + fprintf(fp, "extern void %s_Ordinal_%d();\n", UpperDLLName, i); + } + + odp = OrdinalDefinitions; + for (i = 0; i <= Limit; i++, odp++) + { + if (odp->valid && + (odp->type == FUNCTYPE_PASCAL || odp->type == FUNCTYPE_C || + odp->type == FUNCTYPE_REG)) + { + fdp = odp->additional_data; + fprintf(fp, "extern int %s();\n", fdp->internal_name); + } + } + + fprintf(fp, "\nstruct dll_table_entry_s %s_table[%d] =\n", + UpperDLLName, Limit + 1); + fprintf(fp, "{\n"); + odp = OrdinalDefinitions; + for (i = 0; i <= Limit; i++, odp++) + { + fdp = odp->additional_data; + + if (!odp->valid) + odp->type = -1; + + switch (odp->type) + { + case FUNCTYPE_PASCAL: + case FUNCTYPE_REG: + fprintf(fp, " { 0x%x, %s_Ordinal_%d, ", UTEXTSEL, UpperDLLName, i); + fprintf(fp, "\042%s\042, ", odp->export_name); + fprintf(fp, "%s, DLL_HANDLERTYPE_PASCAL, ", fdp->internal_name); +#ifdef WINESTAT + fprintf(fp, "0, "); +#endif + fprintf(fp, "%d, ", fdp->n_args_32); + if (fdp->n_args_32 > 0) + { + int argnum; + + fprintf(fp, "\n {\n"); + for (argnum = 0; argnum < fdp->n_args_32; argnum++) + { + fprintf(fp, " { %d, %d },\n", + fdp->arg_16_offsets[fdp->arg_indices_32[argnum]-1], + fdp->arg_types_16[argnum]); + } + fprintf(fp, " }\n "); + } + fprintf(fp, "}, \n"); + break; + + case FUNCTYPE_C: + fprintf(fp, " { 0x%x, %s_Ordinal_%d, ", UTEXTSEL, UpperDLLName, i); + fprintf(fp, "\042%s\042, ", odp->export_name); + fprintf(fp, "%s, DLL_HANDLERTYPE_C, ", fdp->internal_name); +#ifdef WINESTAT + fprintf(fp, "0, "); +#endif + fprintf(fp, "%d, ", fdp->n_args_32); + if (fdp->n_args_32 > 0) + { + int argnum; + + fprintf(fp, "\n {\n"); + for (argnum = 0; argnum < fdp->n_args_32; argnum++) + { + fprintf(fp, " { %d, %d },\n", + fdp->arg_16_offsets[fdp->arg_indices_32[argnum]-1], + fdp->arg_types_16[argnum]); + } + fprintf(fp, " }\n "); + } + fprintf(fp, "}, \n"); + break; + + default: + fprintf(fp, " { 0x%x, %s_Ordinal_%d, \042\042, NULL },\n", + UTEXTSEL, UpperDLLName, i); + break; + } + } + fprintf(fp, "};\n"); + + fclose(fp); +} + diff --git a/windows/Imakefile b/windows/Imakefile index 9689eff7bbc..c5720cb5955 100644 --- a/windows/Imakefile +++ b/windows/Imakefile @@ -13,6 +13,7 @@ SRCS = \ event.c \ focus.c \ graphics.c \ + hook.c \ keyboard.c \ mapping.c \ mdi.c \ diff --git a/windows/caret.c b/windows/caret.c index 1d85120e86a..c3ed202a073 100644 --- a/windows/caret.c +++ b/windows/caret.c @@ -149,7 +149,7 @@ void DestroyCaret() /* if (!Caret.hwnd) return; */ #ifdef DEBUG_CARET - printf("DestroyCaret: timerid\n", Caret.timerid); + printf("DestroyCaret: timerid=%d\n", Caret.timerid); #endif KillSystemTimer(NULL, Caret.timerid); diff --git a/windows/defwnd.c b/windows/defwnd.c index 5163a2015bb..2434840e5ce 100644 --- a/windows/defwnd.c +++ b/windows/defwnd.c @@ -12,6 +12,7 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993"; #include "win.h" #include "class.h" #include "user.h" +#include "syscolor.h" extern LONG NC_HandleNCPaint( HWND hwnd, HRGN hrgn ); extern LONG NC_HandleNCActivate( HWND hwnd, WORD wParam ); @@ -22,7 +23,7 @@ extern LONG NC_HandleNCLButtonDblClk( HWND hwnd, WORD wParam, LONG lParam ); extern LONG NC_HandleSysCommand( HWND hwnd, WORD wParam, POINT pt ); extern LONG NC_HandleSetCursor( HWND hwnd, WORD wParam, LONG lParam ); extern void NC_TrackSysMenu( HWND hwnd ); /* menu.c */ -extern BOOL ActivateMenuFocus(HWND hWnd); /* menu.c */ +extern BOOL ActivateMenuBarFocus(HWND hWnd); /* menu.c */ @@ -155,16 +156,14 @@ LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam ) { SetBkColor( (HDC)wParam, RGB(255, 255, 255) ); SetTextColor( (HDC)wParam, RGB(0, 0, 0) ); -/* hbr = sysClrObjects.hbrScrollbar; - UnrealizeObject(hbr); */ - return GetStockObject(LTGRAY_BRUSH); + UnrealizeObject( sysColorObjects.hbrushScrollbar ); + return sysColorObjects.hbrushScrollbar; } else { SetBkColor( (HDC)wParam, GetSysColor(COLOR_WINDOW) ); SetTextColor( (HDC)wParam, GetSysColor(COLOR_WINDOWTEXT) ); -/* hbr = sysClrObjects.hbrWindow; */ - return GetStockObject(WHITE_BRUSH); + return sysColorObjects.hbrushWindow; } } @@ -211,7 +210,7 @@ LONG DefWindowProc( HWND hwnd, WORD msg, WORD wParam, LONG lParam ) return NC_HandleSysCommand( hwnd, wParam, MAKEPOINT(lParam) ); case WM_SYSKEYDOWN: - if (wParam == VK_MENU) ActivateMenuFocus(hwnd); + if (wParam == VK_MENU) ActivateMenuBarFocus(hwnd); break; case WM_SYSKEYUP: break; diff --git a/windows/dialog.c b/windows/dialog.c index 35dc9f0db8b..379b0b082c0 100644 --- a/windows/dialog.c +++ b/windows/dialog.c @@ -315,11 +315,10 @@ HWND CreateDialogIndirectParam( HINSTANCE hInst, LPCSTR dlgTemplate, /* Send initialisation messages and set focus */ - if (dlgInfo->hUserFont) - SendMessage( hwnd, WM_SETFONT, dlgInfo->hUserFont, 0); - SendMessage( hwnd, WM_INITDIALOG, dlgInfo->hwndFocus, param ); -/* if (SendMessage( hwnd, WM_INITDIALOG, dlgInfo->hwndFocus, param )) - SetFocus( dlgInfo->hwndFocus ); */ + if (dlgInfo->hUserFont) + SendMessage( hwnd, WM_SETFONT, dlgInfo->hUserFont, 0 ); + if (SendMessage( hwnd, WM_INITDIALOG, dlgInfo->hwndFocus, param )) + SetFocus( dlgInfo->hwndFocus ); return hwnd; } @@ -332,24 +331,28 @@ static int DIALOG_DoDialogBox( HWND hwnd ) { WND * wndPtr; DIALOGINFO * dlgInfo; - MSG msg; + HANDLE msgHandle; + MSG* lpmsg; int retval; if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return -1; + if (!(msgHandle = USER_HEAP_ALLOC( GMEM_MOVEABLE, sizeof(MSG)))) return -1; + lpmsg = (MSG *) USER_HEAP_ADDR( msgHandle ); dlgInfo = (DIALOGINFO *)wndPtr->wExtra; ShowWindow( hwnd, SW_SHOW ); - while (GetMessage (&msg, 0, 0, 0)) + while (MSG_InternalGetMessage( lpmsg, hwnd, MSGF_DIALOGBOX, TRUE )) { - if (!IsDialogMessage( hwnd, &msg)) + if (!IsDialogMessage( hwnd, lpmsg)) { - TranslateMessage(&msg); - DispatchMessage(&msg); + TranslateMessage( lpmsg ); + DispatchMessage( lpmsg ); } if (dlgInfo->fEnd) break; } retval = dlgInfo->msgResult; DestroyWindow( hwnd ); + USER_HEAP_FREE( msgHandle ); return retval; } diff --git a/windows/event.c b/windows/event.c index 887d0253315..b69223e3d33 100644 --- a/windows/event.c +++ b/windows/event.c @@ -332,7 +332,7 @@ static void EVENT_key( HWND hwnd, XKeyEvent *event ) #ifdef DEBUG_KEY printf("WM_CHAR : wParam=%X\n", (WORD)Str[0] ); #endif - PostMessage( hwnd, WM_CHAR, (WORD)Str[0], keylp.lp2 ); + PostMessage( GetFocus(), WM_CHAR, (WORD)Str[0], keylp.lp2 ); } } else diff --git a/windows/graphics.c b/windows/graphics.c index fb3e580d23a..2594c917b76 100644 --- a/windows/graphics.c +++ b/windows/graphics.c @@ -16,6 +16,7 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993"; #endif #include "gdi.h" +#include "syscolor.h" extern int COLOR_ToPhysical( DC *dc, COLORREF color ); @@ -458,7 +459,7 @@ BOOL FillRgn( HDC hdc, HRGN hrgn, HBRUSH hbrush ) */ void DrawFocusRect( HDC hdc, LPRECT rc ) { - HPEN hPen, hOldPen; + HPEN hOldPen; int oldDrawMode, oldBkMode; int left, top, right, bottom; DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC ); @@ -469,8 +470,7 @@ void DrawFocusRect( HDC hdc, LPRECT rc ) right = XLPTODP( dc, rc->right ); bottom = YLPTODP( dc, rc->bottom ); - hPen = CreatePen(PS_DOT, 1, GetSysColor(COLOR_WINDOWTEXT)); - hOldPen = (HPEN)SelectObject(hdc, (HANDLE)hPen); + hOldPen = (HPEN)SelectObject(hdc, sysColorObjects.hpenWindowText ); oldDrawMode = SetROP2(hdc, R2_XORPEN); oldBkMode = SetBkMode(hdc, TRANSPARENT); @@ -482,7 +482,6 @@ void DrawFocusRect( HDC hdc, LPRECT rc ) SetBkMode(hdc, oldBkMode); SetROP2(hdc, oldDrawMode); SelectObject(hdc, (HANDLE)hOldPen); - DeleteObject((HANDLE)hPen); } @@ -491,15 +490,11 @@ void DrawFocusRect( HDC hdc, LPRECT rc ) */ void DrawReliefRect( HDC hdc, RECT rect, int thickness, BOOL pressed ) { - HBRUSH hbrushOld, hbrushShadow, hbrushHighlight; + HBRUSH hbrushOld; int i; - hbrushShadow = CreateSolidBrush( GetSysColor(COLOR_BTNSHADOW) ); - hbrushHighlight = CreateSolidBrush( GetSysColor(COLOR_BTNHIGHLIGHT) ); - - if (pressed) hbrushOld = SelectObject( hdc, hbrushShadow ); - else hbrushOld = SelectObject( hdc, hbrushHighlight ); - + hbrushOld = SelectObject( hdc, pressed ? sysColorObjects.hbrushBtnShadow : + sysColorObjects.hbrushBtnHighlight ); for (i = 0; i < thickness; i++) { PatBlt( hdc, rect.left + i, rect.top, @@ -508,9 +503,8 @@ void DrawReliefRect( HDC hdc, RECT rect, int thickness, BOOL pressed ) rect.right - rect.left - i, 1, PATCOPY ); } - if (pressed) hbrushOld = SelectObject( hdc, hbrushHighlight ); - else hbrushOld = SelectObject( hdc, hbrushShadow ); - + SelectObject( hdc, pressed ? sysColorObjects.hbrushBtnHighlight : + sysColorObjects.hbrushBtnShadow ); for (i = 0; i < thickness; i++) { PatBlt( hdc, rect.right - i - 1, rect.top + i, @@ -520,8 +514,6 @@ void DrawReliefRect( HDC hdc, RECT rect, int thickness, BOOL pressed ) } SelectObject( hdc, hbrushOld ); - DeleteObject( hbrushShadow ); - DeleteObject( hbrushHighlight ); } diff --git a/windows/hook.c b/windows/hook.c new file mode 100644 index 00000000000..20184bc84ef --- /dev/null +++ b/windows/hook.c @@ -0,0 +1,122 @@ +/* + * Windows hook functions + * + * Copyright 1994 Alexandre Julliard + */ + +static char Copyright[] = "Copyright Alexandre Julliard, 1994"; + +/* Warning! + * HHOOK is not a real handle, but a 32-bit pointer to a HOOKDATA structure. + * This is for compatibility with Windows 3.0 where HHOOK was a HOOKPROC. + */ + +#include "hook.h" + + +HHOOK systemHooks[LAST_HOOK-FIRST_HOOK+1] = { 0, }; + + /* Task-specific hooks should probably be in the task structure */ +HHOOK taskHooks[LAST_HOOK-FIRST_HOOK+1] = { 0, }; + + + +/*********************************************************************** + * SetWindowsHook (USER.121) + */ +HHOOK SetWindowsHook( short id, HOOKPROC proc ) +{ + return SetWindowsHookEx( id, proc, 0, 0 ); +} + + +/*********************************************************************** + * UnhookWindowsHook (USER.234) + */ +BOOL UnhookWindowsHook( short id, HHOOK hhook ) +{ + return UnhookWindowsHookEx( hhook ); +} + + +/*********************************************************************** + * DefHookProc (USER.235) + */ +DWORD DefHookProc( short code, WORD wParam, DWORD lParam, HHOOK *hhook ) +{ + return CallNextHookEx( *hhook, code, wParam, lParam ); +} + + +/*********************************************************************** + * CallMsgFilter (USER.123) + */ +BOOL CallMsgFilter( LPMSG msg, short code ) +{ + if (CALL_SYSTEM_HOOK( WH_SYSMSGFILTER, code, 0, (LPARAM)msg )) return TRUE; + else return CALL_TASK_HOOK( WH_MSGFILTER, code, 0, (LPARAM)msg ); +} + + +/*********************************************************************** + * SetWindowsHookEx (USER.291) + */ +HHOOK SetWindowsHookEx( short id, HOOKPROC proc, HINSTANCE hinst, HTASK htask ) +{ + HOOKDATA *data; + HANDLE handle; + HHOOK *prevHook; + + if ((id < FIRST_HOOK) || (id > LAST_HOOK)) return 0; + if (htask) /* Task-specific hook */ + { + if ((id == WH_JOURNALRECORD) || (id == WH_JOURNALPLAYBACK) || + (id == WH_SYSMSGFILTER)) return 0; + prevHook = &TASK_HOOK( id ); + } + else /* System-wide hook */ + { + prevHook = &SYSTEM_HOOK( id ); + } + + handle = (HANDLE) USER_HEAP_ALLOC( GMEM_MOVEABLE, sizeof(*data) ); + if (!handle) return 0; + data = (HOOKDATA *) USER_HEAP_ADDR( handle ); + + data->next = *prevHook; + data->proc = proc; + data->id = id; + data->htask = htask; + *prevHook = (HHOOK)data; + return (HHOOK)data; +} + + +/*********************************************************************** + * UnhookWindowHookEx (USER.292) + */ +BOOL UnhookWindowsHookEx( HHOOK hhook ) +{ + HOOKDATA *data = (HOOKDATA *)hhook; + HHOOK *prevHook; + + if (!data) return FALSE; + prevHook = data->htask ? &TASK_HOOK(data->id) : &SYSTEM_HOOK(data->id); + while (*prevHook && (*prevHook != hhook)) + prevHook = &((HOOKDATA *)*prevHook)->next; + if (!*prevHook) return FALSE; + *prevHook = data->next; + USER_HEAP_FREE( hhook & 0xffff ); + return TRUE; +} + + +/*********************************************************************** + * CallNextHookEx (USER.293) + */ +DWORD CallNextHookEx( HHOOK hhook, short code, WPARAM wParam, LPARAM lParam ) +{ + HOOKDATA *data = (HOOKDATA *)hhook; + if (!data->next) return 0; + else return INTERNAL_CALL_HOOK( data->next, code, wParam, lParam ); +} diff --git a/windows/mdi.c b/windows/mdi.c index 19122951763..ae04cd46816 100644 --- a/windows/mdi.c +++ b/windows/mdi.c @@ -10,6 +10,8 @@ #include "win.h" #include "mdi.h" #include "user.h" +#include "sysmetrics.h" +#include "menu.h" /* #define DEBUG_MDI /* */ @@ -60,10 +62,10 @@ MDIRecreateMenuList(MDICLIENTINFO *ci) } /********************************************************************** - * MDICreateClient + * MDICreateChild */ HWND -MDICreateClient(WND *w, MDICLIENTINFO *ci, HWND parent, LPMDICREATESTRUCT cs) +MDICreateChild(WND *w, MDICLIENTINFO *ci, HWND parent, LPMDICREATESTRUCT cs) { HWND hwnd; @@ -77,7 +79,7 @@ MDICreateClient(WND *w, MDICLIENTINFO *ci, HWND parent, LPMDICREATESTRUCT cs) WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_THICKFRAME | WS_VISIBLE | cs->style, cs->x, cs->y, cs->cx, cs->cy, parent, (HMENU) 0, - w->hInstance, cs->lParam); + w->hInstance, (LPSTR) cs->lParam); if (hwnd) { @@ -107,10 +109,10 @@ MDICreateClient(WND *w, MDICLIENTINFO *ci, HWND parent, LPMDICREATESTRUCT cs) } /********************************************************************** - * MDIDestroyClient + * MDIDestroyChild */ HWND -MDIDestroyClient(WND *w_parent, MDICLIENTINFO *ci, HWND parent, HWND child, +MDIDestroyChild(WND *w_parent, MDICLIENTINFO *ci, HWND parent, HWND child, BOOL flagDestroy) { MDICHILDINFO *chi; @@ -133,7 +135,7 @@ MDIDestroyClient(WND *w_parent, MDICLIENTINFO *ci, HWND parent, HWND child, if (chi->hwnd == ci->hwndActiveChild) SendMessage(parent, WM_CHILDACTIVATE, 0, 0); - USER_HEAP_FREE((HANDLE) chi); + USER_HEAP_FREE((HANDLE) (LONG) chi); if (flagDestroy) DestroyWindow(child); @@ -145,7 +147,7 @@ MDIDestroyClient(WND *w_parent, MDICLIENTINFO *ci, HWND parent, HWND child, /********************************************************************** * MDIBringChildToTop */ -void MDIBringChildToTop(HWND parent, WORD id, WORD by_id) +void MDIBringChildToTop(HWND parent, WORD id, WORD by_id, BOOL send_to_bottom) { MDICHILDINFO *chi; MDICLIENTINFO *ci; @@ -184,9 +186,51 @@ void MDIBringChildToTop(HWND parent, WORD id, WORD by_id) #endif if (chi != ci->infoActiveChildren) { - SetWindowPos(chi->hwnd, HWND_TOP, 0, 0, 0, 0, - SWP_NOMOVE | SWP_NOSIZE ); + if (ci->flagChildMaximized) + { + RECT rectOldRestore, rect; + w = WIN_FindWndPtr(chi->hwnd); + + rectOldRestore = ci->rectRestore; + GetWindowRect(chi->hwnd, &ci->rectRestore); + + rect.top = (ci->rectMaximize.top - + (w->rectClient.top - w->rectWindow.top)); + rect.bottom = (ci->rectMaximize.bottom + + (w->rectWindow.bottom - w->rectClient.bottom)); + rect.left = (ci->rectMaximize.left - + (w->rectClient.left - w->rectWindow.left)); + rect.right = (ci->rectMaximize.right + + (w->rectWindow.right - w->rectClient.right)); + w->dwStyle |= WS_MAXIMIZE; + SetWindowPos(chi->hwnd, HWND_TOP, rect.left, rect.top, + rect.right - rect.left + 1, + rect.bottom - rect.top + 1, 0); + SendMessage(chi->hwnd, WM_SIZE, SIZE_MAXIMIZED, + MAKELONG(w->rectClient.right-w->rectClient.left, + w->rectClient.bottom-w->rectClient.top)); + + w = WIN_FindWndPtr(ci->hwndActiveChild); + w->dwStyle &= ~WS_MAXIMIZE; + SetWindowPos(ci->hwndActiveChild, HWND_BOTTOM, + rectOldRestore.left, rectOldRestore.top, + rectOldRestore.right - rectOldRestore.left + 1, + rectOldRestore.bottom - rectOldRestore.top + 1, + SWP_NOACTIVATE | + (send_to_bottom ? 0 : SWP_NOZORDER)); + } + else + { + SetWindowPos(chi->hwnd, HWND_TOP, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE ); + if (send_to_bottom) + { + SetWindowPos(ci->hwndActiveChild, HWND_BOTTOM, 0, 0, 0, 0, + SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE); + } + } + if (chi->next) chi->next->prev = chi->prev; @@ -208,6 +252,65 @@ void MDIBringChildToTop(HWND parent, WORD id, WORD by_id) } } +/********************************************************************** + * MDIMaximizeChild + */ +LONG MDIMaximizeChild(HWND parent, HWND child, MDICLIENTINFO *ci) +{ + WND *w = WIN_FindWndPtr(child); + RECT rect; + + MDIBringChildToTop(parent, child, FALSE, FALSE); + ci->rectRestore = w->rectWindow; + + rect.top = (ci->rectMaximize.top - + (w->rectClient.top - w->rectWindow.top)); + rect.bottom = (ci->rectMaximize.bottom + + (w->rectWindow.bottom - w->rectClient.bottom)); + rect.left = (ci->rectMaximize.left - + (w->rectClient.left - w->rectWindow.left)); + rect.right = (ci->rectMaximize.right + + (w->rectWindow.right - w->rectClient.right)); + w->dwStyle |= WS_MAXIMIZE; + SetWindowPos(child, 0, rect.left, rect.top, + rect.right - rect.left + 1, rect.bottom - rect.top + 1, + SWP_NOACTIVATE | SWP_NOZORDER); + + ci->flagChildMaximized = TRUE; + + SendMessage(child, WM_SIZE, SIZE_MAXIMIZED, + MAKELONG(w->rectClient.right-w->rectClient.left, + w->rectClient.bottom-w->rectClient.top)); + SendMessage(GetParent(parent), WM_NCPAINT, 1, 0); + + return 0; +} + +/********************************************************************** + * MDIRestoreChild + */ +LONG MDIRestoreChild(HWND parent, MDICLIENTINFO *ci) +{ + HWND child; + WND *w = WIN_FindWndPtr(child); + LPRECT lprect = &ci->rectRestore; + + child = ci->hwndActiveChild; + + w->dwStyle &= ~WS_MAXIMIZE; + SetWindowPos(child, 0, lprect->left, lprect->top, + lprect->right - lprect->left + 1, + lprect->bottom - lprect->top + 1, + SWP_NOACTIVATE | SWP_NOZORDER); + + ci->flagChildMaximized = FALSE; + + SendMessage(GetParent(parent), WM_NCPAINT, 1, 0); + MDIBringChildToTop(parent, child, FALSE, FALSE); + + return 0; +} + /********************************************************************** * MDIChildActivated */ @@ -250,7 +353,7 @@ LONG MDIChildActivated(WND *w, MDICLIENTINFO *ci, HWND parent) if (chi || ci->nActiveChildren == 0) { MDIRecreateMenuList(ci); - DrawMenuBar(GetParent(parent)); + SendMessage(GetParent(parent), WM_NCPAINT, 0, 0); } return 0; @@ -266,10 +369,13 @@ LONG MDICascade(HWND parent, MDICLIENTINFO *ci) int spacing, xsize, ysize; int x, y; + if (ci->flagChildMaximized) + MDIRestoreChild(parent, ci); + GetClientRect(parent, &rect); spacing = GetSystemMetrics(SM_CYCAPTION) + GetSystemMetrics(SM_CYFRAME); - ysize = abs(rect.bottom - rect.top) - 8 * spacing; - xsize = abs(rect.right - rect.left) - 8 * spacing; + ysize = rect.bottom - 8 * spacing; + xsize = rect.right - 8 * spacing; #ifdef DEBUG_MDI fprintf(stderr, @@ -301,6 +407,178 @@ LONG MDICascade(HWND parent, MDICLIENTINFO *ci) return 0; } +/********************************************************************** + * MDITile + */ +LONG MDITile(HWND parent, MDICLIENTINFO *ci) +{ + MDICHILDINFO *chi; + RECT rect; + int xsize, ysize; + int x, y; + int rows, columns; + int r, c; + int i; + + if (ci->flagChildMaximized) + MDIRestoreChild(parent, ci); + + GetClientRect(parent, &rect); + rows = (int) sqrt((double) ci->nActiveChildren); + columns = ci->nActiveChildren / rows; + ysize = rect.bottom / rows; + xsize = rect.right / columns; + + chi = ci->infoActiveChildren; + x = 0; + i = 0; + for (c = 1; c <= columns; c++) + { + if (c == columns) + { + rows = ci->nActiveChildren - i; + ysize = rect.bottom / rows; + } + + y = 0; + for (r = 1; r <= rows; r++, i++, chi = chi->next) + { + SetWindowPos(chi->hwnd, 0, x, y, xsize, ysize, + SWP_DRAWFRAME | SWP_NOACTIVATE | SWP_NOZORDER); + + y += ysize; + } + + x += xsize; + } + + + return 0; +} + +/********************************************************************** + * MDIHandleLButton + */ +BOOL MDIHandleLButton(HWND hwndFrame, HWND hwndClient, + WORD wParam, LONG lParam) +{ + MDICLIENTINFO *ci; + WND *w; + RECT rect; + WORD x; + + w = WIN_FindWndPtr(hwndClient); + ci = (MDICLIENTINFO *) w->wExtra; + + if (wParam == HTMENU && ci->flagChildMaximized) + { + x = LOWORD(lParam); + + NC_GetInsideRect(hwndFrame, &rect); + if (x < rect.left + SYSMETRICS_CXSIZE) + { + SendMessage(ci->hwndActiveChild, WM_SYSCOMMAND, + SC_CLOSE, lParam); + return TRUE; + } + else if (x >= rect.right - SYSMETRICS_CXSIZE) + { + SendMessage(ci->hwndActiveChild, WM_SYSCOMMAND, + SC_RESTORE, lParam); + return TRUE; + } + } + + return FALSE; +} + +/********************************************************************** + * MDIPaintMaximized + */ +LONG MDIPaintMaximized(HWND hwndFrame, HWND hwndClient, WORD message, + WORD wParam, LONG lParam) +{ + static HBITMAP hbitmapClose = 0; + static HBITMAP hbitmapMaximized = 0; + + MDICLIENTINFO *ci; + WND *w; + LONG rv; + HDC hdc, hdcMem; + RECT rect; + WND *wndPtr = WIN_FindWndPtr(hwndFrame); + + w = WIN_FindWndPtr(hwndClient); + ci = (MDICLIENTINFO *) w->wExtra; + +#ifdef DEBUG_MDI + fprintf(stderr, + "MDIPaintMaximized: frame %04x, client %04x" + ", max flag %d, menu %04x\n", + hwndFrame, hwndClient, + ci->flagChildMaximized, wndPtr ? wndPtr->wIDmenu : 0); +#endif + + if (ci->flagChildMaximized && wndPtr && wndPtr->wIDmenu != 0) + { + rv = NC_DoNCPaint( hwndFrame, (HRGN) 1, wParam, TRUE); + + hdc = GetDCEx(hwndFrame, 0, DCX_CACHE | DCX_WINDOW); + if (!hdc) + return rv; + + hdcMem = CreateCompatibleDC(hdc); + + if (hbitmapClose == 0) + { + hbitmapClose = LoadBitmap(0, MAKEINTRESOURCE(OBM_CLOSE)); + hbitmapMaximized = LoadBitmap(0, MAKEINTRESOURCE(OBM_RESTORE)); + } + +#ifdef DEBUG_MDI + fprintf(stderr, + "MDIPaintMaximized: hdcMem %04x, close bitmap %04x, " + "maximized bitmap %04x\n", + hdcMem, hbitmapClose, hbitmapMaximized); +#endif + + NC_GetInsideRect(hwndFrame, &rect); + rect.top += ((wndPtr->dwStyle & WS_CAPTION) ? + SYSMETRICS_CYSIZE + 1 : 0); + SelectObject(hdcMem, hbitmapClose); + BitBlt(hdc, rect.left, rect.top + 1, + SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE, + hdcMem, 1, 1, SRCCOPY); + + NC_GetInsideRect(hwndFrame, &rect); + rect.top += ((wndPtr->dwStyle & WS_CAPTION) ? + SYSMETRICS_CYSIZE + 1 : 0); + rect.left = rect.right - SYSMETRICS_CXSIZE; + SelectObject(hdcMem, hbitmapMaximized); + BitBlt(hdc, rect.left, rect.top + 1, + SYSMETRICS_CXSIZE, SYSMETRICS_CYSIZE, + hdcMem, 1, 1, SRCCOPY); + + NC_GetInsideRect(hwndFrame, &rect); + rect.top += ((wndPtr->dwStyle & WS_CAPTION) ? + SYSMETRICS_CYSIZE + 1 : 0); + rect.left += SYSMETRICS_CXSIZE; + rect.right -= SYSMETRICS_CXSIZE; + rect.bottom = rect.top + SYSMETRICS_CYMENU; + + StdDrawMenuBar(hdc, &rect, (LPPOPUPMENU) GlobalLock(wndPtr->wIDmenu), + FALSE); + GlobalUnlock(wndPtr->wIDmenu); + + DeleteDC(hdcMem); + ReleaseDC(hwndFrame, hdc); + } + else + DefWindowProc(hwndFrame, message, wParam, lParam); + + return rv; +} + /********************************************************************** * MDIClientWndProc * @@ -313,7 +591,6 @@ MDIClientWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam) LPCLIENTCREATESTRUCT ccs; MDICLIENTINFO *ci; WND *w; - RECT rect; w = WIN_FindWndPtr(hwnd); ci = (MDICLIENTINFO *) w->wExtra; @@ -333,23 +610,24 @@ MDIClientWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam) ci->flagChildMaximized = FALSE; w->dwStyle |= WS_CLIPCHILDREN; - GetClientRect(w->hwndParent, &rect); - MoveWindow(hwnd, 0, 0, rect.right, rect.bottom, 1); + GetClientRect(w->hwndParent, &ci->rectMaximize); + MoveWindow(hwnd, 0, 0, + ci->rectMaximize.right, ci->rectMaximize.bottom, 1); return 0; case WM_MDIACTIVATE: - MDIBringChildToTop(hwnd, wParam, FALSE); + MDIBringChildToTop(hwnd, wParam, FALSE, FALSE); return 0; case WM_MDICASCADE: return MDICascade(hwnd, ci); case WM_MDICREATE: - return MDICreateClient(w, ci, hwnd, (LPMDICREATESTRUCT) lParam); + return MDICreateChild(w, ci, hwnd, (LPMDICREATESTRUCT) lParam); case WM_MDIDESTROY: - return MDIDestroyClient(w, ci, hwnd, wParam, TRUE); + return MDIDestroyChild(w, ci, hwnd, wParam, TRUE); case WM_MDIGETACTIVE: return ((LONG) ci->hwndActiveChild | @@ -360,19 +638,35 @@ MDIClientWndProc(HWND hwnd, WORD message, WORD wParam, LONG lParam) break; case WM_MDIMAXIMIZE: - ci->flagChildMaximized = TRUE; - MDIBringChildToTop(hwnd, wParam, FALSE); - return 0; + return MDIMaximizeChild(hwnd, wParam, ci); + case WM_MDINEXT: + MDIBringChildToTop(hwnd, wParam, FALSE, TRUE); + break; + + case WM_MDIRESTORE: + return MDIRestoreChild(hwnd, ci); + + case WM_MDISETMENU: + /* return MDISetMenu(...) */ + break; + + case WM_MDITILE: + return MDITile(hwnd, ci); + case WM_NCACTIVATE: SendMessage(ci->hwndActiveChild, message, wParam, lParam); break; case WM_PARENTNOTIFY: if (wParam == WM_DESTROY) - return MDIDestroyClient(w, ci, hwnd, LOWORD(lParam), FALSE); + return MDIDestroyChild(w, ci, hwnd, LOWORD(lParam), FALSE); else if (wParam == WM_LBUTTONDOWN) - MDIBringChildToTop(hwnd, ci->hwndHitTest, FALSE); + MDIBringChildToTop(hwnd, ci->hwndHitTest, FALSE, FALSE); + break; + + case WM_SIZE: + GetClientRect(w->hwndParent, &ci->rectMaximize); break; } @@ -391,12 +685,20 @@ DefFrameProc(HWND hwnd, HWND hwndMDIClient, WORD message, switch (message) { case WM_COMMAND: - MDIBringChildToTop(hwndMDIClient, wParam, TRUE); + MDIBringChildToTop(hwndMDIClient, wParam, TRUE, FALSE); + break; + + case WM_NCLBUTTONDOWN: + if (MDIHandleLButton(hwnd, hwndMDIClient, wParam, lParam)) + return 0; break; case WM_NCACTIVATE: SendMessage(hwndMDIClient, message, wParam, lParam); - break; + return MDIPaintMaximized(hwnd, hwndMDIClient, message, wParam, lParam); + + case WM_NCPAINT: + return MDIPaintMaximized(hwnd, hwndMDIClient, message, wParam, lParam); case WM_SETFOCUS: SendMessage(hwndMDIClient, WM_SETFOCUS, wParam, lParam); @@ -433,6 +735,18 @@ DefMDIChildProc(HWND hwnd, WORD message, WORD wParam, LONG lParam) case WM_NCPAINT: return NC_DoNCPaint(hwnd, (HRGN)1, hwnd == ci->hwndActiveChild); + + case WM_SYSCOMMAND: + switch (wParam) + { + case SC_MAXIMIZE: + return SendMessage(GetParent(hwnd), WM_MDIMAXIMIZE, hwnd, 0); + + case SC_RESTORE: + return SendMessage(GetParent(hwnd), WM_MDIRESTORE, hwnd, 0); + } + break; + } return DefWindowProc(hwnd, message, wParam, lParam); diff --git a/windows/message.c b/windows/message.c index 62fd98178b9..a356f519c01 100644 --- a/windows/message.c +++ b/windows/message.c @@ -19,9 +19,11 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1993"; #include "win.h" #include "wineopts.h" #include "sysmetrics.h" +#include "hook.h" #define MAX_QUEUE_SIZE 120 /* Max. size of a message queue */ + extern BOOL TIMER_CheckTimer( LONG *next, MSG *msg, HWND hwnd, BOOL remove ); /* timer.c */ extern void EVENT_ProcessEvent( XEvent *event ); /* event.c */ @@ -109,8 +111,6 @@ static int MSG_AddMsg( MESSAGEQUEUE * msgQueue, MSG * msg, DWORD extraInfo ) { int pos; - SpyMessage(msg->hwnd, msg->message, msg->wParam, msg->lParam); - if (!msgQueue) return FALSE; pos = msgQueue->nextFreeMessage; @@ -293,6 +293,7 @@ static BOOL MSG_TranslateMouseMsg( MSG *msg ) msg->wParam = hittest_result; msg->message += WM_NCLBUTTONDOWN - WM_LBUTTONDOWN; } + return TRUE; } @@ -552,9 +553,9 @@ static BOOL MSG_PeekMessage( MESSAGEQUEUE * msgQueue, LPMSG msg, HWND hwnd, mask = QS_POSTMESSAGE; /* Always selectioned */ if ((first <= WM_KEYLAST) && (last >= WM_KEYFIRST)) mask |= QS_KEY; if ((first <= WM_MOUSELAST) && (last >= WM_MOUSEFIRST)) mask |= QS_MOUSE; - if ((first <= WM_TIMER) && (last >= WM_TIMER)) mask |= WM_TIMER; - if ((first <= WM_SYSTIMER) && (last >= WM_SYSTIMER)) mask |= WM_TIMER; - if ((first <= WM_PAINT) && (last >= WM_PAINT)) mask |= WM_PAINT; + if ((first <= WM_TIMER) && (last >= WM_TIMER)) mask |= QS_TIMER; + if ((first <= WM_SYSTIMER) && (last >= WM_SYSTIMER)) mask |= QS_TIMER; + if ((first <= WM_PAINT) && (last >= WM_PAINT)) mask |= QS_PAINT; } else mask = QS_MOUSE | QS_KEY | QS_POSTMESSAGE | QS_TIMER | QS_PAINT; @@ -671,6 +672,31 @@ static BOOL MSG_PeekMessage( MESSAGEQUEUE * msgQueue, LPMSG msg, HWND hwnd, } +/*********************************************************************** + * MSG_InternalGetMessage + * + * GetMessage() function for internal use. Behave like GetMessage(), + * but also call message filters and optionally send WM_ENTERIDLE messages. + * 'hwnd' must be the handle of the dialog or menu window. + * 'code' is the message filter value (MSGF_??? codes). + */ +BOOL MSG_InternalGetMessage( LPMSG msg, HWND hwnd, short code, BOOL sendIdle ) +{ + do + { + if (sendIdle) + { + if (MSG_PeekMessage(appMsgQueue, msg, 0, 0, 0, PM_REMOVE, TRUE)) + continue; + /* FIXME: to which window should we send this? */ + /* SendMessage( hwnd, WM_ENTERIDLE, code, (LPARAM)hwnd ); */ + } + MSG_PeekMessage( appMsgQueue, msg, 0, 0, 0, PM_REMOVE, FALSE ); + } while (CallMsgFilter( msg, code ) != 0); + return (msg->message != WM_QUIT); +} + + /*********************************************************************** * PeekMessage (USER.109) */ @@ -685,7 +711,10 @@ BOOL PeekMessage( LPMSG msg, HWND hwnd, WORD first, WORD last, WORD flags ) */ BOOL GetMessage( LPMSG msg, HWND hwnd, WORD first, WORD last ) { - return MSG_PeekMessage( appMsgQueue, msg, hwnd, first, last, PM_REMOVE, FALSE ); + MSG_PeekMessage( appMsgQueue, msg, hwnd, first, last, PM_REMOVE, FALSE ); + CALL_SYSTEM_HOOK( WH_GETMESSAGE, 0, 0, (LPARAM)msg ); + CALL_TASK_HOOK( WH_GETMESSAGE, 0, 0, (LPARAM)msg ); + return (msg->message != WM_QUIT); } @@ -718,8 +747,6 @@ LONG SendMessage( HWND hwnd, WORD msg, WORD wParam, LONG lParam ) { WND * wndPtr; - SpyMessage(hwnd, msg, wParam, lParam); - wndPtr = WIN_FindWndPtr( hwnd ); if (!wndPtr) return 0; return CallWindowProc( wndPtr->lpfnWndProc, hwnd, msg, wParam, lParam ); diff --git a/windows/nonclient.c b/windows/nonclient.c index 9a7f85fffa5..078bd001ddc 100644 --- a/windows/nonclient.c +++ b/windows/nonclient.c @@ -13,6 +13,7 @@ static char Copyright[] = "Copyright Alexandre Julliard, 1994"; #include "user.h" #include "scroll.h" #include "menu.h" +#include "syscolor.h" static HBITMAP hbitmapClose = 0; static HBITMAP hbitmapMinimize = 0; @@ -134,7 +135,7 @@ LONG NC_HandleNCCalcSize( HWND hwnd, NCCALCSIZE_PARAMS *params ) * but without the borders (if any). * The rectangle is in window coordinates (for drawing with GetWindowDC()). */ -static void NC_GetInsideRect( HWND hwnd, RECT *rect ) +void NC_GetInsideRect( HWND hwnd, RECT *rect ) { WND * wndPtr = WIN_FindWndPtr( hwnd ); @@ -449,7 +450,6 @@ static void NC_DrawCaption( HDC hdc, RECT *rect, HWND hwnd, DWORD style, BOOL active ) { RECT r = *rect; - HBRUSH hbrushCaption; WND * wndPtr = WIN_FindWndPtr( hwnd ); char buffer[256]; @@ -467,21 +467,15 @@ static void NC_DrawCaption( HDC hdc, RECT *rect, HWND hwnd, if (wndPtr->dwExStyle & WS_EX_DLGMODALFRAME) { - HBRUSH hbrushWindow = CreateSolidBrush(GetSysColor(COLOR_WINDOW)); - HBRUSH hbrushOld = SelectObject( hdc, hbrushWindow ); + HBRUSH hbrushOld = SelectObject( hdc, sysColorObjects.hbrushWindow ); PatBlt( hdc, r.left, r.top, 1, r.bottom-r.top+1,PATCOPY ); PatBlt( hdc, r.right-1, r.top, 1, r.bottom-r.top+1, PATCOPY ); PatBlt( hdc, r.left, r.top-1, r.right-r.left, 1, PATCOPY ); r.left++; r.right--; SelectObject( hdc, hbrushOld ); - DeleteObject( hbrushWindow ); } - if (active) - hbrushCaption = CreateSolidBrush( GetSysColor(COLOR_ACTIVECAPTION) ); - else hbrushCaption = CreateSolidBrush( GetSysColor(COLOR_INACTIVECAPTION)); - MoveTo( hdc, r.left, r.bottom ); LineTo( hdc, r.right-1, r.bottom ); @@ -503,8 +497,8 @@ static void NC_DrawCaption( HDC hdc, RECT *rect, HWND hwnd, r.right -= SYSMETRICS_CXSIZE + 1; } - FillRect( hdc, &r, hbrushCaption ); - DeleteObject( hbrushCaption ); + FillRect( hdc, &r, active ? sysColorObjects.hbrushActiveCaption : + sysColorObjects.hbrushInactiveCaption ); if (GetWindowText( hwnd, buffer, 256 )) { @@ -522,12 +516,10 @@ static void NC_DrawCaption( HDC hdc, RECT *rect, HWND hwnd, * Paint the non-client area. * 'hrgn' is the update rgn to use (in client coords) or 1 if no update rgn. */ -void NC_DoNCPaint( HWND hwnd, HRGN hrgn, BOOL active ) +void NC_DoNCPaint( HWND hwnd, HRGN hrgn, BOOL active, BOOL suppress_menupaint ) { HDC hdc; RECT rect, rect2; - HBRUSH hbrushBorder = 0; - HPEN hpenFrame = 0; WND *wndPtr = WIN_FindWndPtr( hwnd ); @@ -564,12 +556,9 @@ void NC_DoNCPaint( HWND hwnd, HRGN hrgn, BOOL active ) rect.right = wndPtr->rectWindow.right - wndPtr->rectWindow.left; rect.bottom = wndPtr->rectWindow.bottom - wndPtr->rectWindow.top; - hpenFrame = CreatePen( PS_SOLID, 1, GetSysColor(COLOR_WINDOWFRAME) ); - SelectObject( hdc, hpenFrame ); - if (active) - hbrushBorder = CreateSolidBrush( GetSysColor(COLOR_ACTIVEBORDER) ); - else hbrushBorder = CreateSolidBrush( GetSysColor(COLOR_INACTIVEBORDER) ); - SelectObject( hdc, hbrushBorder ); + SelectObject( hdc, sysColorObjects.hpenWindowFrame ); + SelectObject( hdc, active ? sysColorObjects.hbrushActiveBorder : + sysColorObjects.hbrushInactiveBorder ); if ((wndPtr->dwStyle & WS_BORDER) || (wndPtr->dwStyle & WS_DLGFRAME)) { @@ -600,7 +589,8 @@ void NC_DoNCPaint( HWND hwnd, HRGN hrgn, BOOL active ) CopyRect(&rect2, &rect); /* Default MenuBar height */ oldbottom = rect2.bottom = rect2.top + SYSMETRICS_CYMENU; - StdDrawMenuBar(hdc, &rect2, (LPPOPUPMENU)GlobalLock(wndPtr->wIDmenu)); + StdDrawMenuBar(hdc, &rect2, (LPPOPUPMENU)GlobalLock(wndPtr->wIDmenu), + suppress_menupaint); GlobalUnlock(wndPtr->wIDmenu); /* Reduce ClientRect according to MenuBar height */ rect.top += rect2.bottom - oldbottom; @@ -627,17 +617,14 @@ void NC_DoNCPaint( HWND hwnd, HRGN hrgn, BOOL active ) if ((wndPtr->dwStyle & WS_VSCROLL) && (wndPtr->dwStyle & WS_HSCROLL)) { - HBRUSH hbrushScroll = CreateSolidBrush( GetSysColor(COLOR_SCROLLBAR) ); RECT r = rect; r.left = r.right - SYSMETRICS_CXVSCROLL; r.top = r.bottom - SYSMETRICS_CYHSCROLL; - FillRect( hdc, &r, hbrushScroll ); + FillRect( hdc, &r, sysColorObjects.hbrushScrollbar ); } } ReleaseDC( hwnd, hdc ); - if (hbrushBorder) DeleteObject( hbrushBorder ); - if (hpenFrame) DeleteObject( hpenFrame ); } @@ -648,7 +635,7 @@ void NC_DoNCPaint( HWND hwnd, HRGN hrgn, BOOL active ) */ LONG NC_HandleNCPaint( HWND hwnd, HRGN hrgn ) { - NC_DoNCPaint( hwnd, hrgn, hwnd == GetActiveWindow() ); + NC_DoNCPaint( hwnd, hrgn, hwnd == GetActiveWindow(), FALSE ); return 0; } @@ -660,7 +647,7 @@ LONG NC_HandleNCPaint( HWND hwnd, HRGN hrgn ) */ LONG NC_HandleNCActivate( HWND hwnd, WORD wParam ) { - NC_DoNCPaint( hwnd, (HRGN)1, wParam ); + NC_DoNCPaint( hwnd, (HRGN)1, wParam, FALSE ); return TRUE; } diff --git a/windows/syscolor.c b/windows/syscolor.c index 80b69d5f0c4..c92d5497ced 100644 --- a/windows/syscolor.c +++ b/windows/syscolor.c @@ -12,7 +12,9 @@ static char Copyright2[] = "Copyright Alexandre Julliard, 1994"; #include #include "windows.h" +#include "syscolor.h" +struct SysColorObjects sysColorObjects = { 0, }; static char * DefSysColors[] = { @@ -44,6 +46,78 @@ static char * DefSysColors[] = static COLORREF SysColors[NUM_SYS_COLORS]; +/************************************************************************* + * SYSCOLOR_SetColor + */ +static void SYSCOLOR_SetColor( int index, COLORREF color ) +{ + SysColors[index] = color; + switch(index) + { + case COLOR_SCROLLBAR: + DeleteObject( sysColorObjects.hbrushScrollbar ); + sysColorObjects.hbrushScrollbar = CreateSolidBrush( color ); + break; + case COLOR_BACKGROUND: + break; + case COLOR_ACTIVECAPTION: + DeleteObject( sysColorObjects.hbrushActiveCaption ); + sysColorObjects.hbrushActiveCaption = CreateSolidBrush( color ); + break; + case COLOR_INACTIVECAPTION: + DeleteObject( sysColorObjects.hbrushInactiveCaption ); + sysColorObjects.hbrushInactiveCaption = CreateSolidBrush( color ); + break; + case COLOR_MENU: + break; + case COLOR_WINDOW: + DeleteObject( sysColorObjects.hbrushWindow ); + sysColorObjects.hbrushWindow = CreateSolidBrush( color ); + break; + case COLOR_WINDOWFRAME: + DeleteObject( sysColorObjects.hpenWindowFrame ); + sysColorObjects.hpenWindowFrame = CreatePen( PS_SOLID, 1, color ); + break; + case COLOR_MENUTEXT: + break; + case COLOR_WINDOWTEXT: + DeleteObject( sysColorObjects.hpenWindowText ); + sysColorObjects.hpenWindowText = CreatePen( PS_SOLID, 1, color ); + break; + case COLOR_CAPTIONTEXT: + break; + case COLOR_ACTIVEBORDER: + DeleteObject( sysColorObjects.hbrushActiveBorder ); + sysColorObjects.hbrushActiveBorder = CreateSolidBrush( color ); + break; + case COLOR_INACTIVEBORDER: + DeleteObject( sysColorObjects.hbrushInactiveBorder ); + sysColorObjects.hbrushInactiveBorder = CreateSolidBrush( color ); + break; + case COLOR_APPWORKSPACE: + case COLOR_HIGHLIGHT: + case COLOR_HIGHLIGHTTEXT: + break; + case COLOR_BTNFACE: + DeleteObject( sysColorObjects.hbrushBtnFace ); + sysColorObjects.hbrushBtnFace = CreateSolidBrush( color ); + break; + case COLOR_BTNSHADOW: + DeleteObject( sysColorObjects.hbrushBtnShadow ); + sysColorObjects.hbrushBtnShadow = CreateSolidBrush( color ); + break; + case COLOR_GRAYTEXT: + case COLOR_BTNTEXT: + case COLOR_INACTIVECAPTIONTEXT: + break; + case COLOR_BTNHIGHLIGHT: + DeleteObject( sysColorObjects.hbrushBtnHighlight ); + sysColorObjects.hbrushBtnHighlight = CreateSolidBrush( color ); + break; + } +} + + /************************************************************************* * SYSCOLOR_Init */ @@ -57,7 +131,7 @@ void SYSCOLOR_Init() { GetProfileString( "colors", p[0], p[1], buffer, 100 ); if (!sscanf( buffer, " %d %d %d", &r, &g, &b )) r = g = b = 0; - SysColors[i] = RGB( r, g, b ); + SYSCOLOR_SetColor( i, RGB(r,g,b) ); } } @@ -85,7 +159,7 @@ void SetSysColors(int nChanges, LPINT lpSysColor, COLORREF *lpColorValues) for (i = 0; i < nChanges; i++) { - SysColors[lpSysColor[i]] = lpColorValues[i]; + SYSCOLOR_SetColor( lpSysColor[i], lpColorValues[i] ); } /* Send WM_SYSCOLORCHANGE message to all windows */ diff --git a/windows/win.c b/windows/win.c index cfc8e852e6f..6889fe64ebd 100644 --- a/windows/win.c +++ b/windows/win.c @@ -28,6 +28,7 @@ extern LONG MDIClientWndProc(HWND hwnd, WORD message, static HWND hwndDesktop = 0; +static HWND hWndSysModal = 0; /*********************************************************************** * WIN_FindWndPtr @@ -197,7 +198,6 @@ BOOL WIN_CreateDesktopWindow() wndPtr->dwStyle = WS_VISIBLE | WS_CLIPCHILDREN | WS_CLIPSIBLINGS; wndPtr->dwExStyle = 0; wndPtr->hdce = 0; - wndPtr->hmenuSystem = 0; wndPtr->VScroll = NULL; wndPtr->HScroll = NULL; wndPtr->wIDmenu = 0; @@ -205,6 +205,8 @@ BOOL WIN_CreateDesktopWindow() wndPtr->flags = 0; wndPtr->window = rootWindow; wndPtr->hSysMenu = 0; + wndPtr->hProp = 0; + wndPtr->hTask = 0; /* Send dummy WM_NCCREATE message */ SendMessage( hwndDesktop, WM_NCCREATE, 0, 0 ); @@ -303,28 +305,34 @@ HWND CreateWindowEx( DWORD exStyle, LPSTR className, LPSTR windowName, wndPtr->ptMaxPos.y = -1; wndPtr->hmemTaskQ = GetTaskQueue(0); wndPtr->hrgnUpdate = 0; + wndPtr->hwndPrevActive = 0; wndPtr->hwndLastActive = 0; wndPtr->lpfnWndProc = classPtr->wc.lpfnWndProc; wndPtr->dwStyle = style; wndPtr->dwExStyle = exStyle; - wndPtr->hmenuSystem = 0; #ifdef DEBUG_MENU printf("CreateWindowEx // menu=%04X instance=%04X classmenu=%08X !\n", menu, instance, classPtr->wc.lpszMenuName); #endif - if (menu != 0) - wndPtr->wIDmenu = menu; - else { - if (classPtr->wc.lpszMenuName != NULL) - wndPtr->wIDmenu = LoadMenu(instance, classPtr->wc.lpszMenuName); + if ((style & WS_CAPTION) && (style & WS_CHILD) == 0) { + if (menu != 0) + SetMenu(hwnd, menu); + else { + if (classPtr->wc.lpszMenuName != NULL) + SetMenu(hwnd, LoadMenu(instance, classPtr->wc.lpszMenuName)); + else + wndPtr->wIDmenu = 0; + } + } else - wndPtr->wIDmenu = 0; - } + wndPtr->wIDmenu = menu; wndPtr->hText = 0; wndPtr->flags = 0; wndPtr->VScroll = NULL; wndPtr->HScroll = NULL; wndPtr->hSysMenu = 0; + wndPtr->hProp = 0; + wndPtr->hTask = 0; if (classPtr->wc.cbWndExtra) memset( wndPtr->wExtra, 0, classPtr->wc.cbWndExtra ); @@ -449,8 +457,14 @@ BOOL DestroyWindow( HWND hwnd ) if (hwnd == hwndDesktop) return FALSE; /* Can't destroy desktop */ if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return FALSE; if (!(classPtr = CLASS_FindClassPtr( wndPtr->hClass ))) return FALSE; - if (hwnd == GetActiveWindow()) WINPOS_ChangeActiveWindow( 0, FALSE ); - if (hwnd == GetFocus()) SetFocus( 0 ); + + /* Hide the window */ + + if (wndPtr->dwStyle & WS_VISIBLE) + SetWindowPos( hwnd, 0, 0, 0, 0, 0, SWP_HIDEWINDOW | SWP_NOACTIVATE | + SWP_NOZORDER | SWP_NOMOVE | SWP_NOSIZE ); + if ((hwnd == GetCapture()) || IsChild( hwnd, GetCapture() )) + ReleaseCapture(); WIN_SendParentNotify( hwnd, WM_DESTROY, MAKELONG(hwnd, wndPtr->wIDmenu) ); /* Send destroy messages and destroy children */ @@ -471,9 +485,6 @@ BOOL DestroyWindow( HWND hwnd ) if (wndPtr->flags & WIN_OWN_DC) DCE_FreeDCE( wndPtr->hdce ); classPtr->cWindows--; USER_HEAP_FREE( hwnd ); -/* - printf("End of DestroyWindow // hwnd=%04X !\n", hwnd); -*/ return TRUE; } @@ -944,3 +955,15 @@ BOOL EnumChildWindows(HWND hwnd, FARPROC wndenumprc, LPARAM lParam) return WIN_EnumChildWin(hwnd, wndenumprc, lParam); } +/******************************************************************* + * SetSysModalWindow [USER.188] + */ +HWND SetSysModalWindow(HWND hWnd) +{ + HWND hWndOldModal = hWndSysModal; + hWndSysModal = hWnd; + printf("EMPTY STUB !! SetSysModalWindow(%04X) !\n", hWnd); + return hWndOldModal; +} + + diff --git a/windows/winpos.c b/windows/winpos.c index 0534bc846e6..f236d4973e3 100644 --- a/windows/winpos.c +++ b/windows/winpos.c @@ -425,6 +425,9 @@ HWND WINPOS_ChangeActiveWindow( HWND hwnd, BOOL mouseMsg ) hwndActive = hwnd; if (hwndActive) { + WND *wndPtr = WIN_FindWndPtr( hwndActive ); + wndPtr->hwndPrevActive = prevActive; + /* Send WM_ACTIVATEAPP here */ SendMessage( hwnd, WM_NCACTIVATE, TRUE, 0 ); SendMessage( hwnd, WM_ACTIVATE, mouseMsg ? WA_CLICKACTIVE : WA_ACTIVE, @@ -437,8 +440,6 @@ HWND WINPOS_ChangeActiveWindow( HWND hwnd, BOOL mouseMsg ) /*********************************************************************** * SetWindowPos (USER.232) */ -/* Unimplemented flags: SWP_NOREDRAW - */ /* Note: all this code should be in the DeferWindowPos() routines, * and SetWindowPos() should simply call them. This will be implemented * some day... @@ -599,16 +600,26 @@ BOOL SetWindowPos( HWND hwnd, HWND hwndInsertAfter, short x, short y, wndPtr->dwStyle |= WS_VISIBLE; XMapWindow( display, wndPtr->window ); MSG_Synchronize(); - if (!(winPos->flags & SWP_NOREDRAW)) - RedrawWindow( hwnd, NULL, 0, RDW_INVALIDATE | RDW_ERASE | - RDW_ERASENOW | RDW_FRAME ); - else RedrawWindow( hwnd, NULL, 0, RDW_VALIDATE ); - + if (winPos->flags & SWP_NOREDRAW) + RedrawWindow( hwnd, NULL, 0, RDW_VALIDATE ); } else if (winPos->flags & SWP_HIDEWINDOW) { wndPtr->dwStyle &= ~WS_VISIBLE; XUnmapWindow( display, wndPtr->window ); + if ((hwnd == GetFocus()) || IsChild( hwnd, GetFocus() )) + SetFocus( GetParent(hwnd) ); /* Revert focus to parent (if any) */ + if (hwnd == hwndActive) + { + /* Activate previously active window if possible */ + HWND newActive = wndPtr->hwndPrevActive; + if (!IsWindow(newActive) || (newActive == hwnd)) + { + newActive = GetTopWindow(GetDesktopWindow()); + if (newActive == hwnd) newActive = wndPtr->hwndNext; + } + WINPOS_ChangeActiveWindow( newActive, FALSE ); + } } if (!(winPos->flags & SWP_NOACTIVATE)) diff --git a/wine.ini b/wine.ini index b2c79af09a7..b1d797ff4d6 100644 --- a/wine.ini +++ b/wine.ini @@ -1,33 +1,24 @@ -[drives] -A=/mnt/fd0 -C=/dos -D=/usr/windows -E=/home/bob/wine/work -F=/home/bob/test - -[wine] -Windows=c:\windows -System=c:\windows\system -Temp=c:\temp -Path=c:\windows;c:\windows\system;e:\;e:\test;f:\ -SystemResources=sysres.dll - -[serialports] -Com1=/dev/cua0 -Com2=/dev/cua1 - -[parallelports] -Lpt1=/dev/lp0 - -[spy] -;;;;; Uncomment the following line to activate spying to the console ;;;;; -;File=CON - -;;;;; Uncomment the following line to activate spying to the spy.log ;;;;; -;File=spy.log - -;;;;; List of ; separated (and terminated) msg names to exclude from log ;;;;; -Exclude=WM_TIMER;WM_SETCURSOR;WM_MOUSEMOVE; - -;;;;; List of ; separated (and terminated) msg names to include in log ;;;;; -;Include=WM_COMMAND; + +[drives] +A=/mnt/fd0 +C=/dos +D=/usr/windows +E=/home/bob/wine/work +F=/home/bob/test + +[wine] +Windows=c:\windows +System=c:\windows\system +Temp=c:\temp +Path=c:\windows;c:\windows\system;e:\;e:\test;f:\ +SystemResources=sysres.dll + +[serialports] +Com1=/dev/cua0 +Com2=/dev/cua1 + +[parallelports] +Lpt1=/dev/lp0 + +[spy] +Exclude=WM_SIZE;WM_TIMER;