1
0
Fork 0
mirror of synced 2025-03-07 03:53:26 +01:00
wine/windows/utility.c
Alexandre Julliard 0e60778484 Release 0.4.7
Mon Nov  1 14:40:21 1993  julliard@di.epfl.ch (Alexandre Julliard)

	* [if1632/user.spec]
	Removed some duplicate entries.

	* [include/dialog.h] [windows/dialog.c]
	Implemented dialog units and fonts.
	Added preliminary loading of dialog resources.
	Preliminary implementation of DialogBox().
	Implemented Get/SetDlgItem* functions.

	* [windows/win.c]
	Implemented WM_PARENTNOTIFY message.
	Implemented CreateWindowEx() and GetWindow().
	Completed DestroyWindow().

Mon Nov  1 18:19:34 1993  Erik Bos

	* [loader/signal.c]
	Added support for int 0x11 & 0x12.

        * [loader/int21.c]
	Improved function handling.

Sun Oct 31 12:38:09 1993  David Metcalfe <david@prism.demon.co.uk>

	* [objects/font.c]
	Implemented GetCharWidth().

Wed Oct 27 09:56:06 1993  John Brezak <brezak@ch.hp.com>

	* [Makefile]
        Use GNU malloc.

	* [include/int21.h include/wine.h]
        Change sc_eflags to sc_efl .

	* [include/wine.h]
        Fix misplaced #endif
        Include <signal.h> for NetBSD

	* [loader/int21.c]
        Don't include <sys/vfs.h> in NetBSD
        Do include <sys/mount.h> in NetBSD
        Cleanup some lint.

Mon Oct 26 17:59:01 1993  Erik Bos

        * [include/int21.h]
        Added.

        * [loader/int21.c]
        Added support for many dos ints.

        * [misc/file.c] [include/files.h]
        Moved OPEN_MAX and DosDriveStruct to files.h.

Sun Oct 24 13:36:50 1993  David Metcalfe <david@prism.demon.co.uk>

	* [controls/button.c]
	Implemented CHECKBOX, AUTOCHECKBOX, 3STATE, AUTO3STATE,
	RADIOBUTTON, AUTORADIOBUTTON, GROUPBOX controls, together with
	a preliminary USERBUTTON control.

	* [objects/text.c]
	Corrected bugs in TEXT_NextLine() and added handling of prefix
	character.

	* [controls/button.c]
	Disabled focus handling by commenting out SetFocus() calls until
	serious bug can be found.

Oct  20, 93 martin2@trgcorp.solucorp.qc.ca (Martin Ayotte)

	* [controls/listbox.c]
	Listbox control window
		Painting cleanup, new messages processed.

	* [controls/scroll.c]
	Scroll bar control window
		Painting cleanup.

	* [controls/combo.c]
	Combo box control window
		Painting cleanup.

Tue Oct 12 17:50:11 1993  julliard@di.epfl.ch (Alexandre Julliard)

	* [objects/color.c] [objects/palette.c] [windows/syscolor.c]
	Better support for the private color map.
	Using a private map is now the default.

	* [windows/win.c]
	Bug fix.

	* [include/dialog.h] [windows/dialog.c]
	Implemented CreateDialog*() and IsDialogMessage().

	* [misc/xt.c] [windows/defwnd.c]
	Moved DefWindowProc() to defwnd.c.
	Added WM_NCCREATE, WM_NCDESTROY and WM_CTLCOLOR handling.

	* [windows/defdlg.c]
	Started the implementation of DefDlgProc().

	* [windows/win.c]
	Added WM_NCCREATE and WM_NCDESTROY messages.
	Implemented IsChild().

Tue Oct 12 17:50:20 1993  David Metcalfe <david@prism.demon.co.uk>

	* [windows/focus.c]
	Implemented GetFocus() and SetFocus().

	* [windows/event.c]
	Added processing of FocusIn and FocusOut events.

	* [windows/graphics.c]
	Added DrawFocusRect().

Sat Oct  9 14:36:57 1993  Erik Bos

	* [loader/int1a.c]
	Added more function handling.

Wed Oct  6 12:21:22 1993  Erik Bos

	* [loader/signal.c]
	Split signal.c into int1a.c, int21.c and signal.c.

Tue Oct  5 22:12:40 1993  David Metcalfe

	* [controls/static.c] [control/widgets.c]
	Static control class.

	* [objects/text.c]
	Added processing of additional DT_ flags to DrawText().

	* [windows/win.c] [misc/xt.c]
	Added SetWindowText() and WM_SETTEXT processing.

Tue Oct  5 22:12:40 1993  Martin Ayotte

	* [controls/listbox.c]
	Listbox control window

	* [controls/scroll.c]
	Scroll bar control window

	* [controls/combo.c]
	Combo box control window

	* [include/combo.h]
	Combo box definitions

	* [include/listbox.h]
	Listbox definitions

	* [include/scroll.h]
	Scroll bar definitions

Sat Oct  2 09:35:54 1993  Bob Amstadt  (bob at pooh)

	* [if1632/callback.c]
	Fixed bug in MakeProcInstance().

	* [debugger/info.c]
	Changed x/w and x/b to display in hex.

	* [debugger/i386-pinsn.c]
	Added code to properly unassemble 16-bit indexing.

Fri Oct  1 08:29:05 1993  Bob Amstadt  (bob at pooh)

	* [loader/files.c] [misc/profile.c]
	System initialization file is now called "wine.ini" and can
	be located in the current directory, the user's home directory,
	or any directories specified in the WINEPATH environment variable.

	* [tools/build.c] [if1632/call.S] [include/regfunc.h]
	Changed register function stack to match sigcontext structure.

Thu Sep 30 22:30:21 1993  Bob Amstadt  (bob at pooh)

	* [loader/files.c]
	Created function to search a path for files to load.

	* [loader/wine.c]
	Modified exe and dll file loading to search through path
	specified by the environment variable WINEPATH.

Thu Sep 30 22:30:21 1993  Eric Youngdale

	* [loader/signal.c]
	Bug fix.

Thu Sep 30 22:30:21 1993  John Brezak

	* [debugger/dbg.y] [debugger/debug.l] [debugger/dtest.c] 
	  [debugger/obstack.h]
	Updates to allow debugger to function under NetBSD.
1993-11-03 19:23:37 +00:00

320 lines
8.1 KiB
C

/* utility.c Utility functions for Wine
* Author: acb
* Commenced: 10-9-1993
*
* This unit contains the implementations of
* various Windows API functions that perform
* utility tasks; i.e., that do not fit into
* any major category but perform useful tasks.
*/
#include <stdio.h>
#include <stdarg.h>
#include <ctype.h>
#include "windows.h"
static char Copyright[] = "Copyright Andrew C. Bulhak, 1993";
/*#define debug_utility*/
/* MulDiv is a simple function that may as well have been
* implemented as a macro; however Microsoft, in their infinite
* wisdom, have implemented it as a DLL function and therefore
* so should we.
* Basically, it takes two 16-bit integers, multiplies them
* and divides by a third integer.
*/
int MulDiv(int foo, int bar, int baz)
{
return (long)(((int)foo*bar)/baz);
};
/* UTILITY_strip015() removes \015 (^M, CR) from a string;
* this is done to convert a MS-DOS-style string to a more
* UNIX-friendly format. Replacement is done in-place.
*/
void UTILITY_strip015(char *dest) {
char *src = dest;
while(*src) {
while(*src == '\015') src++; /* Skip \015s */
while((*src) && (*src != '\015')) *(dest++) = *(src++);
};
*dest = '\0'; /* Add null terminator */
};
/*
* OutputDebugString strips CRs from its (string) parameter and
* calls DebugPrintString(), which was written by someone else.
* Since this is part of the standard Windows API, it needs no
* references to nonstandard DLLs.
*/
void OutputDebugString(LPSTR foo)
{
UTILITY_strip015(foo);
DebugPrintString(foo);
};
/* UTILITY_qualify(source, dest) takes the format string source and
* changes all the parameters to correspond to Linux integer sizes
* rather than Windows sizes. For example, it converts %i to %hi
* and %lx to %x. No array size checking is done at present.
*/
static void UTILITY_qualify(const char *source, char *dest)
{
#ifdef debug_utility
printf("UTILITY_qualify(\"%s\", \"%s\");\n", source, dest);
#endif
if(!source) return; /* Dumbass attack! */
while(*source) {
/* Find next format code. */
while((*source != '%') && (*source)) {
*(dest++) = *(source++);
}
/* Yeah, I know I shouldn't use gotos.... */
if (!(*source)) goto loop_end;
/* skip the '%' */
*(dest++) = *(source++);
/* Now insert a size qualifier, if needed. */
switch(*source) {
case 'i':
case 'd':
case 'x':
case 'X':
case 'u':
case 'o':
/* We have a 16-bit value here. */
*(dest++) = 'h';
break;
};
/* Here we go 'round the mulberry bush... */
loop_end:
};
*dest = '\0';
};
/* UTILITY_argsize() evaluates the size of the argument list that
* accompanies a vsprintf() or wvsprintf() call.
* Arguments:
* char *format; printf-style format string.
* BOOL windows; if this is TRUE, we assume that ints are
* 16 bits in size; otherwise we deal with
* 32-bit variables.
* Returns:
* size (in bytes) of the arguments that follow the call.
*/
size_t UTILITY_argsize(const char *format, BOOL windows)
{
size_t size = 0;
#define INT_SIZE (windows ? 2 : 4)
while(*format) {
while((*format) && (*format != '%')) format++; /* skip ahead */
if(*format) {
char modifier = ' ';
#ifdef debug_utility
printf("found:\t\"%%");
#endif
format++; /* skip past '%' */
/* First skip the flags, field width, etc. */
/* First the flags */
if ((*format == '#') || (*format == '-') || (*format == '+')
|| (*format == ' ')) {
#ifdef debug_utility
printf("%c", *format);
#endif
format++;
}
/* Now the field width, etc. */
while(isdigit(*format)) {
#ifdef debug_utility
printf("%c", *format);
#endif
format++;
}
if(*format == '.') {
#ifdef debug_utility
printf("%c", *format);
#endif
format++;
}
while(isdigit(*format)) {
#ifdef debug_utility
printf("%c", *format);
#endif
format++;
}
/* Now we handle the rest */
if((*format == 'h') || (*format == 'l') || (*format == 'L')) {
#ifdef debug_utility
printf("%c", modifier);
#endif
modifier = *(format++);
}
/* Handle the actual type. */
#ifdef debug_utility
printf("%c\"\n", *format);
#endif
switch(*format) {
case 'd':
case 'i':
case 'o':
case 'x':
case 'X':
case 'u':
case 'c':
size += ((modifier == 'l') ? 4 : INT_SIZE);
break;
case 's': size += sizeof(char *); break;
case 'e':
case 'E':
case 'f':
case 'g':
case 'G':
/* It doesn't look as if Windows' wvsprintf()
supports floating-point arguments. However,
I'll leave this code here just in case. */
size += (modifier == 'L') ? sizeof(long double) : sizeof(double);
break;
case 'p': size += sizeof(void *); break;
case 'n': size += sizeof(int *); break;
};
};
};
#undef INT_SIZE
#ifdef debug_utility
printf("UTILITY_argsize: returning %i\n", size);
#endif
return size;
};
/* UTILITY_convertArgs() creates a 32-bit argument list from a 16-bit list.
* This is used to allow wvsprintf() arguments to be fed through
* vsprintf().
*
* Arguments:
* char *fmt; format string
* char *winarg; Windows-style arguments
*
* Returns:
* malloc()ed pointer to new argument list. This should
* be free()d as soon as it is finished with.
*/
char *UTILITY_convertArgs(char *format, char *winarg)
{
char *result = (char *)malloc(UTILITY_argsize(format, 0));
char *rptr = result;
while(*format) {
while((*format) && (*format != '%')) format++; /* skip ahead */
if(*format) {
char modifier = ' ';
#ifdef debug_utility
printf("found:\t\"%%");
#endif
format++; /* skip past '%' */
/* First skip the flags, field width, etc. */
/* First the flags */
if ((*format == '#') || (*format == '-') || (*format == '+')
|| (*format == ' ')) format++;
/* Now the field width, etc. */
while(isdigit(*format)) format++;
if(*format == '.') format++;
while(isdigit(*format)) format++;
/* Now we handle the rest */
if((*format == 'h') || (*format == 'l') || (*format == 'L'))
modifier = *(format++);
/* Handle the actual type. */
#ifdef debug_utility
printf("%c\"\n", *format);
#endif
switch(*format) {
case 'd':
case 'i':
*(((int *)rptr)++) = (modifier=='l') ? *(((int *)winarg)++) : *(((short *)winarg)++);
break;
case 'o':
case 'x':
case 'X':
case 'u':
case 'c':
*(((unsigned int *)rptr)++) = (modifier=='l') ? *(((unsigned int *)winarg)++)
: *(((unsigned short *)winarg)++);
break;
case 's':
case 'p':
case 'n': /* A pointer, is a pointer, is a pointer... */
*(((char **)rptr)++) = *(((char **)winarg)++);
break;
case 'e':
case 'E':
case 'f':
case 'g':
case 'G':
/* It doesn't look as if Windows' wvsprintf()
supports floating-point arguments. However,
I'll leave this code here just in case. */
if(modifier=='L')
*(((long double *)rptr)++) = *(((long double *)winarg)++);
else *(((double *)rptr)++) = *(((double *)winarg)++);
break;
}
}
}
return result;
};
/**************************************************************************
* wsprintf [USER.420]
*/
int wsprintf(LPSTR lpOutput, LPSTR lpFormat, ...)
{
va_list valist;
int ArgCnt;
va_start(valist, lpFormat);
ArgCnt = vsprintf(lpOutput, lpFormat, valist);
va_end(valist);
return (ArgCnt);
}
/* wvsprintf() is an implementation of vsprintf(). This
* implementation converts the arguments to 32-bit integers and
* calls the standard library function vsprintf().
*
* Known shortcomings:
* wvsprintf() doesn't yet convert the arguments back after
* calling vsprintf(), so if Windows implements %n and a
* program depends on it, we're in trouble.
*/
int wvsprintf(LPSTR buf, LPSTR format, LPSTR args)
{
char qualified_fmt[1536];
char *newargs;
int result;
/* 1.5K is a safe value as wvsprintf can only handle buffers up to
1K and in a worst case such a buffer would look like "%i%i%i..." */
if(!buf || !format) return 0;
/* Change the format string so that ints are handled as short by
default */
UTILITY_qualify(format, qualified_fmt);
/* Convert agruments to 32-bit values */
newargs = UTILITY_convertArgs(format, args);
result = vsprintf(buf, qualified_fmt, newargs);
free(newargs);
return result;
};