Release 970720

Sat Jul 19 13:03:01 1997  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [tools/build.c] [include/stackframe.h]
	Save the complete %ebp register in CallFrom16; fixes a crash with
	LabView reported by Andreas Mohr.

	* [loader/main.c]
	Avoid executing a built-in DLL.

	* [controls/static.c]
	Converted static window procedure to Win32.

	* [windows/message.c] [windows/queue.c] [include/queue.h]
	Hacked SendMessage functions to support inter-task messages with
	SendMessage32A/W.

Sun Jul 13 16:55:35 1997  Bernhard Rosenkraenzer <bero@bero-online.ml.org>

	* [ipc/bit_array.c]
	Don't use bitops.h in Linux 2.1.x (these versions do not return
	the previous state for clear_bit and set_bit)

	* [ipc/shm_main_blk.c]
	Adapt to GLIBC's ipc_perm structure.

	* [memory/ldt.c]
	Include <asm/unistd.h> on Linux/GLIBC systems (required for
	_syscall3).

Wed Jul 9 23:53:19 1997  David A. Cuthbert  <dacut@henry.ece.cmu.edu>

	* [include/options.h] [files/profile.c]
	Added PROFILE_GetWineIniBool and PROFILE_EnumerateWineIniSection.

	* [include/sysmetrics.h] [include/windows.h] [windows/sysmetrics.c]
	All sysmetrics moved to array (no more constant macros).  Added
	MOUSEWHEELPRESENT metric.

	* [include/bitmap.h] [objects/oembitmap.c]
	Added OBM_Init() (see also loader/main.c) and more support for Win95
	bitmaps; added size info to OEM bitmaps.

	* [include/graphics.h] [windows/graphics.h]
	Added GRAPH_DrawGenericReliefRect.

	* [loader/main.c]
	Added TWEAK_Init() and TWEAK_CheckConfiguration() calls (the
	latter checks for invalid entries in wine.conf).

	* [include/debug.h] [include/stddebug.h] [include/nonclient.h]
	  [include/tweak.h] [controls/menu.c] [misc/tweak.c]
	  [objects/gdiobj.c] [windows/syscolor.c] [windows/nonclient.c]
	  [BUGS] [documentation/win95look]
	Added tweaks for Windows 95 interface support.  See
 	documentation/win95look for more information.

	* [controls/edit.c]
	Fixed EDIT_MoveHome bug.

	* [misc/ver.c]
	Changed name of dprintf_ver_string to ver_dstring to fix
	problem with tools/make_debug utility.

Wed Jul 9 21:31:54 1997  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [objects/dib.c]
	Don't use palettes with dibs with biBitCount > 8.

	* [misc/ole2nls.c][misc/ver.c]
	IsValidLocale, EnumSystemLocales fixed (winhlp32.exe works)
	Some VerLanguage coded moved to ole2nls.c, some cleanups.

	* [multimedia/mcistring.c]
	Fixed "capabilities <dev> device type" crash (cool.exe).

	* [misc/main.c]
	SystemParametersInfo*: added stub option 41
	(GETNONCLIENTMETRICS), duplicated some stuff away from SPI16
	that writes 32bit vars.(one COMCTL32.DLL crash, freecell.exe)

Tue Jul  8 22:40:53 1997  Morten Welinder  <terra@diku.dk>

	* [if1632/shell32.spec]
	Use Windows 95's ordinals. Help wanted, inquire within.

Mon Jul  7 11:20:36 1997  Philippe De Muyter  <phdm@info.ucl.ac.be>

	* [if1632/relay.c] [if1632/user.spec] [if1632/kernel.spec]
	  [tools/build-spec.txt] [tools/build.c]
	Added type 'segstr' (segmented pointer to null-terminated string)
	to .spec files.

	* [windows/user.c] [if1632/user.spec]
	ExitWindowsExec stub function added.

Mon Jul  7 01:18:25 1997  U. Bonnes <bon@elektron.ikp.physik.th-darmstadt.de>

	* [files/file.c] [include/winbase.h] [if1632/kernel32.spec]
	Implement MoveFileEx32, some enhancement for Movefile32.

Sat Jul  5 18:13:48 1997  Bruce Milner <Bruce.Milner@genetics.utah.edu.

	* [files/file.c] [if1632/kernel32.spec] [include/winerror.h]
          [msdos/int21.c] [win32/file.c]
	Add LockFile/UnlockFile implementation.
	Add back in int21 func(0x5c) Record locking functions.

	* [files/file.c]
	Fixed bug with OF_REOPEN in FILE_DoOpenFile.

Fri Jul 4 12:00:00 1997  Henrik Olsen <Henrik.Olsen@iaeste.dk>

	* [misc/ole2nls.c] [programs/progman/Da.rc] [programs/winhelp/Da.rc]
	  [resources/sysres_Da.rc]
	Added/updated Danish language support.

Thu Jul  3 13:04:20 1997  Claus Fischer  <fischer@iue.tuwien.ac.at>

	* [files/dos_fs.c]
	Properly implemented DOSFS_UnixTimeToFileTime and
	DOSFS_FileTimeToUnixTime.

	* [documentation/wine.texinfo]
	First version of texinfo documentation.
diff --git a/misc/Makefile.in b/misc/Makefile.in
index 08b87e1..8677044 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -32,6 +32,7 @@
 	stress.c \
 	system.c \
 	toolhelp.c \
+	tweak.c \
 	ver.c \
 	w32sys.c \
 	winsock.c \
@@ -44,3 +45,4 @@
 @MAKE_RULES@
 
 ### Dependencies:
+
diff --git a/misc/comm.c b/misc/comm.c
index df5b7c4..36d3f7e 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -21,7 +21,7 @@
 #include <errno.h>
 #include <ctype.h>
 #include <sys/stat.h>
-#if defined(__NetBSD__) || defined(__FreeBSD__)
+#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
 #include <sys/filio.h>
 #endif
 #include <sys/ioctl.h>
diff --git a/misc/main.c b/misc/main.c
index 84ab9cf..01cc321 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -932,7 +932,117 @@
 BOOL32 SystemParametersInfo32A( UINT32 uAction, UINT32 uParam,
                                 LPVOID lpvParam, UINT32 fuWinIni )
 {
-    return SystemParametersInfo16(uAction,uParam,lpvParam,fuWinIni);
+	int timeout, temp;
+	XKeyboardState		keyboard_state;
+
+	switch (uAction) {
+	case SPI_GETBEEP:
+		XGetKeyboardControl(display, &keyboard_state);
+		if (keyboard_state.bell_percent == 0)
+			*(BOOL32 *) lpvParam = FALSE;
+		else
+			*(BOOL32 *) lpvParam = TRUE;
+		break;
+
+	case SPI_GETBORDER:
+		*(INT32 *)lpvParam = GetSystemMetrics32( SM_CXFRAME );
+		break;
+
+	case SPI_GETFASTTASKSWITCH:
+		if ( GetProfileInt32A( "windows", "CoolSwitch", 1 ) == 1 )
+			*(BOOL32 *) lpvParam = TRUE;
+		else
+			*(BOOL32 *) lpvParam = FALSE;
+		break;
+
+	case SPI_GETGRIDGRANULARITY:
+		*(INT32*)lpvParam=GetProfileInt32A("desktop","GridGranularity",1);
+		break;
+
+	case SPI_GETICONTITLEWRAP:
+		*(BOOL32*)lpvParam=GetProfileInt32A("desktop","IconTitleWrap",TRUE);
+		break;
+
+	case SPI_GETKEYBOARDDELAY:
+		*(INT32*)lpvParam=GetProfileInt32A("keyboard","KeyboardDelay",1);
+		break;
+
+	case SPI_GETKEYBOARDSPEED:
+		*(DWORD*)lpvParam=GetProfileInt32A("keyboard","KeyboardSpeed",30);
+		break;
+
+	case SPI_GETMENUDROPALIGNMENT:
+		*(BOOL32*)lpvParam=GetSystemMetrics32(SM_MENUDROPALIGNMENT); /* XXX check this */
+		break;
+
+	case SPI_GETSCREENSAVEACTIVE:
+		if ( GetProfileInt32A( "windows", "ScreenSaveActive", 1 ) == 1 )
+			*(BOOL32*)lpvParam = TRUE;
+		else
+			*(BOOL32*)lpvParam = FALSE;
+		break;
+
+	case SPI_GETSCREENSAVETIMEOUT:
+	/* FIXME GetProfileInt( "windows", "ScreenSaveTimeout", 300 ); */
+		XGetScreenSaver(display, &timeout, &temp,&temp,&temp);
+		*(INT32 *) lpvParam = timeout * 1000;
+		break;
+
+	case SPI_ICONHORIZONTALSPACING:
+		/* FIXME Get/SetProfileInt */
+		if (lpvParam == NULL)
+			/*SetSystemMetrics( SM_CXICONSPACING, uParam )*/ ;
+		else
+			*(INT32*)lpvParam=GetSystemMetrics32(SM_CXICONSPACING);
+		break;
+
+	case SPI_ICONVERTICALSPACING:
+		/* FIXME Get/SetProfileInt */
+		if (lpvParam == NULL)
+			/*SetSystemMetrics( SM_CYICONSPACING, uParam )*/ ;
+		else
+			*(INT32*)lpvParam=GetSystemMetrics32(SM_CYICONSPACING);
+		break;
+
+	case SPI_GETICONTITLELOGFONT: {
+		LPLOGFONT32A lpLogFont = (LPLOGFONT32A)lpvParam;
+
+		GetProfileString32A("Desktop", "IconTitleFaceName", "Helvetica", 
+			lpLogFont->lfFaceName, LF_FACESIZE );
+		lpLogFont->lfHeight = -GetProfileInt32A("Desktop","IconTitleSize", 8);
+
+		lpLogFont->lfWidth = 0;
+		lpLogFont->lfEscapement = lpLogFont->lfOrientation = 0;
+		lpLogFont->lfWeight = FW_NORMAL;
+		lpLogFont->lfItalic = FALSE;
+		lpLogFont->lfStrikeOut = FALSE;
+		lpLogFont->lfUnderline = FALSE;
+		lpLogFont->lfCharSet = ANSI_CHARSET;
+		lpLogFont->lfOutPrecision = OUT_DEFAULT_PRECIS;
+		lpLogFont->lfClipPrecision = CLIP_DEFAULT_PRECIS;
+		lpLogFont->lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
+		break;
+	}
+	case SPI_GETWORKAREA:
+		SetRect32( (RECT32 *)lpvParam, 0, 0,
+			GetSystemMetrics32( SM_CXSCREEN ),
+			GetSystemMetrics32( SM_CYSCREEN )
+		);
+		break;
+	case SPI_GETNONCLIENTMETRICS: {
+		/* FIXME: implement correctly */
+		LPNONCLIENTMETRICS32A	lpnm=(LPNONCLIENTMETRICS32A)lpvParam;
+
+		SystemParametersInfo32A(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfCaptionFont),0);
+		SystemParametersInfo32A(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfMenuFont),0);
+		SystemParametersInfo32A(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfStatusFont),0);
+		SystemParametersInfo32A(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfMessageFont),0);
+		break;
+	}
+	default:
+		return SystemParametersInfo16(uAction,uParam,lpvParam,fuWinIni);
+	}
+	return TRUE;
 }
 
 
@@ -1080,6 +1190,16 @@
                     lpLogFont->lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
                     break;
                 }
+		case SPI_GETNONCLIENTMETRICS: {
+		/* FIXME: implement correctly */
+			LPNONCLIENTMETRICS16	lpnm=(LPNONCLIENTMETRICS16)lpvParam;
+
+			SystemParametersInfo16(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfCaptionFont),0);
+			SystemParametersInfo16(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfMenuFont),0);
+			SystemParametersInfo16(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfStatusFont),0);
+			SystemParametersInfo16(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfMessageFont),0);
+			break;
+		}
 
 		case SPI_LANGDRIVER:
 		case SPI_SETBORDER:
@@ -1153,6 +1273,16 @@
             lpLogFont->lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
         }
         break;
+    case SPI_GETNONCLIENTMETRICS: {
+	/* FIXME: implement correctly */
+	LPNONCLIENTMETRICS32W	lpnm=(LPNONCLIENTMETRICS32W)lpvParam;
+
+	SystemParametersInfo32W(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfCaptionFont),0);
+	SystemParametersInfo32W(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfMenuFont),0);
+	SystemParametersInfo32W(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfStatusFont),0);
+	SystemParametersInfo32W(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfMessageFont),0);
+	break;
+    }
 
     default:
         return SystemParametersInfo32A(uAction,uParam,lpvParam,fuWinIni);
diff --git a/misc/ole2nls.c b/misc/ole2nls.c
index ea6975d..53ad95ee 100644
--- a/misc/ole2nls.c
+++ b/misc/ole2nls.c
@@ -12,6 +12,8 @@
 #include "ole.h"
 #include "options.h"
 #include "winnls.h"
+#include "winreg.h"
+#include "winerror.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -126,6 +128,58 @@
 	{NULL,0},
 };
 
+const struct map_lcid2str {
+	LCID		langid;
+	const char	*langname;
+} languages[]={
+	{0x0401,"Arabisch"},
+	{0x0402,"Bulgarisch"},
+	{0x0403,"Katalanisch"},
+	{0x0404,"Traditionales Chinesisch"},
+	{0x0405,"Tschecisch"},
+	{0x0406,"Ddnisch"},
+	{0x0407,"Deutsch"},
+	{0x0408,"Griechisch"},
+	{0x0409,"Amerikanisches Englisch"},
+	{0x040A,"Kastilisches Spanisch"},
+	{0x040B,"Finnisch"},
+	{0x040C,"Franzvsisch"},
+	{0x040D,"Hebrdisch"},
+	{0x040E,"Ungarisch"},
+	{0x040F,"Isldndisch"},
+	{0x0410,"Italienisch"},
+	{0x0411,"Japanisch"},
+	{0x0412,"Koreanisch"},
+	{0x0413,"Niederldndisch"},
+	{0x0414,"Norwegisch-Bokmal"},
+	{0x0415,"Polnisch"},
+	{0x0416,"Brasilianisches Portugiesisch"},
+	{0x0417,"Rdtoromanisch"},
+	{0x0418,"Rumdnisch"},
+	{0x0419,"Russisch"},
+	{0x041A,"Kroatoserbisch (lateinisch)"},
+	{0x041B,"Slowenisch"},
+	{0x041C,"Albanisch"},
+	{0x041D,"Schwedisch"},
+	{0x041E,"Thai"},
+	{0x041F,"T|rkisch"},
+	{0x0420,"Urdu"},
+	{0x0421,"Bahasa"},
+	{0x0804,"Vereinfachtes Chinesisch"},
+	{0x0807,"Schweizerdeutsch"},
+	{0x0809,"Britisches Englisch"},
+	{0x080A,"Mexikanisches Spanisch"},
+	{0x080C,"Belgisches Franzvsisch"},
+	{0x0810,"Schweizerisches Italienisch"},
+	{0x0813,"Belgisches Niederldndisch"},
+	{0x0814,"Norgwegisch-Nynorsk"},
+	{0x0816,"Portugiesisch"},
+	{0x081A,"Serbokratisch (kyrillisch)"},
+	{0x0C1C,"Kanadisches Franzvsisch"},
+	{0x100C,"Schweizerisches Franzvsisch"},
+	{0x0000,"Unbekannt"},
+};
+
 /***********************************************************************
  *           GetUserDefaultLCID       (OLE2NLS.1)
  */
@@ -195,12 +249,17 @@
  *         GetLocaleInfoA             (OLE2NLS.5)
  * Is the last parameter really WORD for Win16?
  */
-int GetLocaleInfoA(DWORD lcid,DWORD LCType,LPSTR buf,WORD len)
+INT16 GetLocaleInfo16(LCID lcid,LCTYPE LCType,LPSTR buf,INT16 len)
+{
+	return GetLocaleInfo32A(lcid,LCType,buf,len);
+}
+
+INT32 GetLocaleInfo32A(LCID lcid,LCTYPE LCType,LPSTR buf,INT32 len)
 {
 	char	*retString;
 	int	found,i;
 
-	dprintf_ole(stddeb,"GetLocaleInfoA(%8lX,%8lX,%p,%4X)\n",
+	dprintf_ole(stddeb,"GetLocaleInfo32A(%8lX,%8lX,%p,%4X)\n",
 			lcid,LCType,buf,len);
 	/* As an option, we could obtain the value from win.ini.
 	   This would not match the Wine compile-time option.
@@ -358,7 +417,7 @@
 
     case LANG_Da:
     	switch (LCType) {
-/* LOCVAL(LOCALE_ILANGUAGE,"9") */
+LOCVAL(LOCALE_ILANGUAGE,"6")
 LOCVAL(LOCALE_SLANGUAGE,"Dansk")
 LOCVAL(LOCALE_SENGLANGUAGE,"Danish")
 LOCVAL(LOCALE_SABBREVLANGNAME,"dan")
@@ -366,9 +425,9 @@
 LOCVAL(LOCALE_ICOUNTRY,"45")
 LOCVAL(LOCALE_SCOUNTRY,"Danmark")
 LOCVAL(LOCALE_SENGCOUNTRY,"Denmark")
-LOCVAL(LOCALE_SABBREVCTRYNAME,"Da")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"DK")
 LOCVAL(LOCALE_SNATIVECTRYNAME,"Danmark")
-/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9") */
+LOCVAL(LOCALE_IDEFAULTLANGUAGE,"6")
 LOCVAL(LOCALE_IDEFAULTCOUNTRY,"45")
 /* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
 /* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
@@ -403,8 +462,8 @@
 LOCVAL(LOCALE_ITLZERO,"1")
 /* LOCVAL(LOCALE_IDAYLZERO) */
 /* LOCVAL(LOCALE_IMONLZERO) */
-/* LOCVAL(LOCALE_S1159) */
-/* LOCVAL(LOCALE_S2359) */
+LOCVAL(LOCALE_S1159, "")
+LOCVAL(LOCALE_S2359, "")
 /* LOCVAL(LOCALE_ICALENDARTYPE) */
 /* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
 /* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
@@ -449,14 +508,14 @@
 LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
 LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dec")
 LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
-/* LOCVAL(LOCALE_SPOSITIVESIGN) */
-/* LOCVAL(LOCALE_SNEGATIVESIGN) */
-/* LOCVAL(LOCALE_IPOSSIGNPOSN) */
-/* LOCVAL(LOCALE_INEGSIGNPOSN) */
-/* LOCVAL(LOCALE_IPOSSYMPRECEDES) */
-/* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
-/* LOCVAL(LOCALE_INEGSYMPRECEDES) */
-/* LOCVAL(LOCALE_INEGSEPBYSPACE) */
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "3")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
 	default: found=0;break;
 	}
     break; /* LANG(Da) */
@@ -1639,12 +1698,12 @@
  */
 INT32 GetLocaleInfo32W(LCID lcid,LCTYPE LCType,LPWSTR wbuf,INT32 len)
 {
-	int i;
-	LPSTR abuf = (LPSTR) wbuf;
-	INT32 n = GetLocaleInfoA(lcid, LCType, abuf, len);
+	LPSTR abuf = (LPSTR)HeapAlloc(GetProcessHeap(),0,len);
+
+	INT32 n = GetLocaleInfo32A(lcid, LCType, abuf, len);
 	if (wbuf)
-		for (i = n; i > 0; --i)
-			wbuf[i] = abuf[i];
+		lstrcpynAtoW(wbuf,abuf,len);
+	HeapFree(GetProcessHeap(),0,abuf);
 	return n;
 }
 
@@ -1728,14 +1787,9 @@
 /***********************************************************************
  *           IsValidLocale       (KERNEL32.361)
  */
-BOOL32 IsValidLocale(DWORD lcid,DWORD flags) {
-	int	i;
-
-	i=0;
-	while (locale_name2id[i].name!=NULL)
-		if (locale_name2id[i].id == lcid)
-			return TRUE;
-	return FALSE;
+BOOL32 IsValidLocale(LCID lcid,DWORD flags) {
+	/* we support ANY language. Well, at least say that...*/
+	return TRUE;
 }
 
 /***********************************************************************
@@ -1745,14 +1799,34 @@
 {
 	int	i;
 	BOOL32	ret;
+	WCHAR	buffer[200];
+	HKEY	xhkey;
 
 	dprintf_win32(stddeb,"EnumSystemLocales32W(%p,%08lx)\n",
                       lpfnLocaleEnum,flags );
+	/* see if we can reuse the Win95 registry entries.... */
+	if (ERROR_SUCCESS==RegOpenKey32A(HKEY_LOCAL_MACHINE,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\",&xhkey)) {
+		i=0;
+		while (1) {
+			if (ERROR_SUCCESS!=RegEnumKey32W(xhkey,i,buffer,sizeof(buffer)))
+				break;
+            		if (!lpfnLocaleEnum(buffer))
+				break;
+			i++;
+		}
+		RegCloseKey(xhkey);
+		return TRUE;
+	}
+
 	i=0;
-	while (locale_name2id[i].name!=NULL)
+	while (languages[i].langname!=NULL)
         {
-            LPWSTR cp = HEAP_strdupAtoW( GetProcessHeap(), 0,
-                                         locale_name2id[i].name );
+            LPWSTR cp;
+	    char   xbuffer[10];
+  	
+	    sprintf(xbuffer,"%08lx",(DWORD)languages[i].langid);
+
+	    cp = HEAP_strdupAtoW( GetProcessHeap(), 0, xbuffer );
             ret = lpfnLocaleEnum(cp);
             HeapFree( GetProcessHeap(), 0, cp );
             if (!ret) break;
@@ -1767,13 +1841,28 @@
 BOOL32
 EnumSystemLocales32A(LOCALE_ENUMPROC32A lpfnLocaleEnum,DWORD flags) {
 	int	i;
+	CHAR	buffer[200];
+	HKEY	xhkey;
 
 	dprintf_win32(stddeb,"EnumSystemLocales32A(%p,%08lx)\n",
 		lpfnLocaleEnum,flags
 	);
+	if (ERROR_SUCCESS==RegOpenKey32A(HKEY_LOCAL_MACHINE,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\",&xhkey)) {
+		i=0;
+		while (1) {
+			if (ERROR_SUCCESS!=RegEnumKey32A(xhkey,i,buffer,sizeof(buffer)))
+				break;
+            		if (!lpfnLocaleEnum(buffer))
+				break;
+			i++;
+		}
+		RegCloseKey(xhkey);
+		return TRUE;
+	}
 	i=0;
-	while (locale_name2id[i].name!=NULL) {
-		if (!lpfnLocaleEnum(locale_name2id[i].name))
+	while (languages[i].langname!=NULL) {
+		sprintf(buffer,"%08lx",(DWORD)languages[i].langid);
+		if (!lpfnLocaleEnum(buffer))
 			break;
 		i++;
 	}
@@ -1821,7 +1910,9 @@
 		if (isspace(src[i])) chartype[i]|=C1_SPACE;
 		if (ispunct(src[i])) chartype[i]|=C1_PUNCT;
 		if (iscntrl(src[i])) chartype[i]|=C1_CNTRL;
-		if (isblank(src[i])) chartype[i]|=C1_BLANK;
+/* FIXME: isblank() is a GNU extension */
+/*		if (isblank(src[i])) chartype[i]|=C1_BLANK; */
+                if ((src[i] == ' ') || (src[i] == '\t')) chartype[i]|=C1_BLANK;
 		/* C1_XDIGIT */
 	}
 	return TRUE;
@@ -1869,3 +1960,60 @@
 	}
 	return TRUE;
 }
+
+/* VerLanguageName				[VER.10] */
+DWORD
+VerLanguageName16(UINT16 langid,LPSTR langname,UINT16 langnamelen) {
+	int	i;
+	char	*buf;
+
+	dprintf_ver(stddeb,"VerLanguageName(%d,%p,%d)\n",langid,langname,langnamelen);
+	/* First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
+	 * from the registry. 
+	 */
+	buf=(char*)malloc(strlen("\\System\\CurrentControlSet\\control\\Nls\\Locale\\")+9);
+	sprintf(buf,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",langid);
+	if (ERROR_SUCCESS==RegQueryValue16(HKEY_LOCAL_MACHINE,buf,langname,(LPDWORD)&langnamelen)) {
+		langname[langnamelen-1]='\0';
+		return langnamelen;
+	}
+	/* if that fails, use the interal table */
+	for (i=0;languages[i].langid!=0;i++)
+		if (langid==languages[i].langid)
+			break;
+	strncpy(langname,languages[i].langname,langnamelen);
+	langname[langnamelen-1]='\0';
+	return strlen(languages[i].langname);
+}
+
+/* VerLanguageNameA				[VERSION.9] */
+DWORD
+VerLanguageName32A(UINT32 langid,LPSTR langname,UINT32 langnamelen) {
+	return VerLanguageName16(langid,langname,langnamelen);
+}
+
+/* VerLanguageNameW				[VERSION.10] */
+DWORD
+VerLanguageName32W(UINT32 langid,LPWSTR langname,UINT32 langnamelen) {
+	int	i;
+	char	buffer[80];
+	LPWSTR	keyname;
+
+	/* First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
+	 * from the registry. 
+	 */
+	sprintf(buffer,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",langid);
+	keyname = HEAP_strdupAtoW( GetProcessHeap(), 0, buffer );
+	if (ERROR_SUCCESS==RegQueryValue32W(HKEY_LOCAL_MACHINE,keyname,langname,(LPDWORD)&langnamelen)) {
+		HeapFree( GetProcessHeap(), 0, keyname );
+		return langnamelen;
+	}
+        HeapFree( GetProcessHeap(), 0, keyname );
+	/* if that fails, use the interal table */
+	for (i=0;languages[i].langid!=0;i++)
+		if (langid==languages[i].langid)
+			break;
+        lstrcpyAtoW( langname, languages[i].langname );
+	return strlen(languages[i].langname); /* same as strlenW(langname); */
+}
+
diff --git a/misc/tweak.c b/misc/tweak.c
new file mode 100644
index 0000000..a9118d5
--- /dev/null
+++ b/misc/tweak.c
@@ -0,0 +1,456 @@
+/******************************************************************************
+ *
+ *   tweak.c
+ *
+ *   Windows 95 style interface tweaks.
+ *   Copyright (c) 1997 Dave Cuthbert.
+ *
+ *   FIXME:  This file is, unfortunately, aptly named:  the method of
+ *   displaying Win95 style windows is a tweak.  Lots of stuff does not yet
+ *   work -- and probably never will unless some of this code is
+ *   incorporated into the mainstream Wine code.
+ *
+ *   DEVELOPERS, PLEASE NOTE:  Before delving into the mainstream code and
+ *   altering it, consider how your changes will affect the Win3.1 interface
+ *   (which has taken a major effort to create!).  After you make any sort of
+ *   non-trivial change, *test* the Wine code running in Win3.1 mode!  The
+ *   object here is to make it so that the person who tests the latest version
+ *   of Wine without adding the tweaks into wine.conf notices nothing out of
+ *   the ordinary.
+ *
+ *   Revision history
+ *        03-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ *             Original implementation.
+ *
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <malloc.h>
+#include <X11/Xlib.h>
+#include <string.h>
+#include "dc.h"
+#include "debug.h"
+#include "graphics.h"
+#include "options.h"
+#include "stackframe.h"
+#include "syscolor.h"
+#include "tweak.h"
+#include "windows.h"
+
+/* Parameters for windows/nonclient.c */
+extern int  NC_CaptionLeftNudge;
+extern int  NC_CaptionTopNudge;
+extern int  NC_SysControlNudge;
+extern int  NC_MaxControlNudge;
+extern int  NC_MinControlNudge;
+extern UINT32  NC_CaptionTextFlags;
+extern HBRUSH32  NC_WinHighlight95;
+extern HBRUSH32  NC_WinShadow95;
+
+/* Parameters for controls/menu.c */
+extern UINT32  MENU_BarItemTopNudge;
+extern UINT32  MENU_BarItemLeftNudge;
+extern UINT32  MENU_ItemTopNudge;
+extern UINT32  MENU_ItemLeftNudge;
+extern UINT32  MENU_HighlightTopNudge;
+extern UINT32  MENU_HighlightLeftNudge;
+extern UINT32  MENU_HighlightBottomNudge;
+extern UINT32  MENU_HighlightRightNudge;
+
+/* General options */
+HPEN32  TWEAK_PenFF95;
+HPEN32  TWEAK_PenE095;
+HPEN32  TWEAK_PenC095;
+HPEN32  TWEAK_Pen8095;
+HPEN32  TWEAK_Pen0095;
+
+#if defined(WIN_95_LOOK)
+int  TWEAK_Win95Look = 1;
+#else
+int  TWEAK_Win95Look = 0;
+#endif
+
+int  TWEAK_WineInitialized = 0;
+
+
+/******************************************************************************
+ *
+ *   int  TWEAK_MenuInit()
+ * 
+ *   Initializes the Win95 tweaks to the menu code.  See controls/menu.c.
+ *   Return value indicates success (non-zero) or failure.
+ *
+ *   Revision history
+ *        06-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ *             Original implementation.
+ *
+ *****************************************************************************/
+
+static int  TWEAK_MenuInit()
+{
+    MENU_BarItemTopNudge =
+	PROFILE_GetWineIniInt("Tweak.Layout", "MenuBarItemTopNudge", 0);
+    MENU_BarItemLeftNudge =
+	PROFILE_GetWineIniInt("Tweak.Layout", "MenuBarItemLeftNudge", 0);
+    MENU_ItemTopNudge =
+	PROFILE_GetWineIniInt("Tweak.Layout", "MenuItemTopNudge", 0);
+    MENU_ItemLeftNudge =
+	PROFILE_GetWineIniInt("Tweak.Layout", "MenuItemLeftNudge", 0);
+    MENU_HighlightTopNudge =
+	PROFILE_GetWineIniInt("Tweak.Layout", "MenuHighlightTopNudge", 0);
+    MENU_HighlightLeftNudge =
+	PROFILE_GetWineIniInt("Tweak.Layout", "MenuHighlightLeftNudge", 0);
+    MENU_HighlightBottomNudge =
+	PROFILE_GetWineIniInt("Tweak.Layout", "MenuHighlightBottomNudge", 0);
+    MENU_HighlightRightNudge =
+	PROFILE_GetWineIniInt("Tweak.Layout", "MenuHighlightRightNudge", 0);
+
+    return 1;
+}
+
+
+/******************************************************************************
+ *
+ *   int  TWEAK_NonClientInit()
+ *
+ *   Initializes the Win95 tweaks to the non-client drawing functions.  See
+ *   windows/nonclient.c.  Return value indicates success (non-zero) or
+ *   failure.
+ *
+ *   Revision history
+ *        05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ *             Original implementation.
+ *
+ *****************************************************************************/
+
+static int  TWEAK_NonClientInit()
+{
+    char  key_value[2];
+
+    NC_CaptionLeftNudge =
+	PROFILE_GetWineIniInt("Tweak.Layout", "CaptionLeftNudge", 0);
+    NC_CaptionTopNudge =
+	PROFILE_GetWineIniInt("Tweak.Layout", "CaptionTopNudge", 0);
+    NC_SysControlNudge =
+	PROFILE_GetWineIniInt("Tweak.Layout", "SysControlNudge", 0);
+    NC_MaxControlNudge =
+	PROFILE_GetWineIniInt("Tweak.Layout", "MaxControlNudge", 0);
+    NC_MinControlNudge =
+	PROFILE_GetWineIniInt("Tweak.Layout", "MinControlNudge", 0);
+
+    NC_WinHighlight95 = CreateSolidBrush32(RGB(0xc0, 0xc0, 0xc0));
+    NC_WinShadow95 = CreateSolidBrush32(RGB(0x00, 0x00, 0x00));
+
+    NC_CaptionTextFlags = DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX;
+
+    PROFILE_GetWineIniString("Tweak.Layout", "CaptionAlignment", 
+			     TWEAK_Win95Look ? "l" : "c", key_value, 2);
+
+    switch(key_value[0]) {
+    case 'l':
+    case 'L':
+	NC_CaptionTextFlags |= DT_LEFT;
+	break;
+
+    case 'r':
+    case 'R':
+	NC_CaptionTextFlags |= DT_RIGHT;
+	break;
+
+    default:
+	NC_CaptionTextFlags |= DT_CENTER;
+    }
+
+    return 1;
+}
+
+
+/******************************************************************************
+ *
+ *   int  TWEAK_VarInit()
+ *
+ *   Initializes the miscellaneous variables which are used in the tweak
+ *   routines.  Return value is non-zero on success.
+ *
+ *   Revision history
+ *        07-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ *             Original implementation.
+ *
+ *****************************************************************************/
+
+static int  TWEAK_VarInit()
+{
+    TWEAK_Win95Look = PROFILE_GetWineIniBool("Tweak.Layout", "Win95Look", 0);
+
+    /* FIXME: Each color should really occupy a single entry in the wine.conf
+       file, but I couldn't settle on a good (intuitive!) format. */
+
+    TWEAK_PenFF95 = CreatePen32(
+	PS_SOLID, 1,
+	RGB(PROFILE_GetWineIniInt("Tweak.Colors", "PenFF95.Red", 0xff),
+	    PROFILE_GetWineIniInt("Tweak.Colors", "PenFF95.Grn", 0xff),
+	    PROFILE_GetWineIniInt("Tweak.Colors", "PenFF95.Blu", 0xff)));
+    TWEAK_PenE095 = CreatePen32(
+	PS_SOLID, 1,
+	RGB(PROFILE_GetWineIniInt("Tweak.Colors", "PenE095.Red", 0xe0),
+	    PROFILE_GetWineIniInt("Tweak.Colors", "PenE095.Grn", 0xe0),
+	    PROFILE_GetWineIniInt("Tweak.Colors", "PenE095.Blu", 0xe0)));
+    TWEAK_PenC095 = CreatePen32(
+	PS_SOLID, 1,
+	RGB(PROFILE_GetWineIniInt("Tweak.Colors", "PenC095.Red", 0xc0),
+	    PROFILE_GetWineIniInt("Tweak.Colors", "PenC095.Grn", 0xc0),
+	    PROFILE_GetWineIniInt("Tweak.Colors", "PenC095.Blu", 0xc0)));
+    TWEAK_Pen8095 = CreatePen32(
+	PS_SOLID, 1,
+	RGB(PROFILE_GetWineIniInt("Tweak.Colors", "Pen8095.Red", 0x80),
+	    PROFILE_GetWineIniInt("Tweak.Colors", "Pen8095.Grn", 0x80),
+	    PROFILE_GetWineIniInt("Tweak.Colors", "Pen8095.Blu", 0x80)));
+    TWEAK_Pen0095 = CreatePen32(
+	PS_SOLID, 1,
+	RGB(PROFILE_GetWineIniInt("Tweak.Colors", "Pen0095.Red", 0x00),
+	    PROFILE_GetWineIniInt("Tweak.Colors", "Pen0095.Grn", 0x00),
+	    PROFILE_GetWineIniInt("Tweak.Colors", "Pen0095.Blu", 0x00)));
+
+    dprintf_tweak(stddeb, "TWEAK_VarInit: Using %s look and feel.\n",
+		  TWEAK_Win95Look ? "Win95" : "Win3.1");
+    return 1;
+}
+
+
+/******************************************************************************
+ *
+ *   int  TWEAK_Init()
+ *
+ *   Does the full initialization of the Win95 tweak subsystem.  Return value
+ *   indicates success.  Called by loader/main.c's MAIN_Init().
+ *
+ *   Revision history
+ *        05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ *             Original implementation.
+ *
+ *****************************************************************************/
+
+int  TWEAK_Init()
+{
+    TWEAK_VarInit();
+    TWEAK_NonClientInit();
+    TWEAK_MenuInit();
+    return 1;
+}
+
+
+/******************************************************************************
+ *
+ *   int  TWEAK_CheckOldFonts()
+ *
+ *   Examines wine.conf for old/invalid font entries and recommend changes to
+ *   the user.
+ *
+ *   Revision history
+ *        05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ *             Original implementation.
+ *
+ *****************************************************************************/
+
+static void  TWEAK_CheckOldFontsCallback(char const *, char const *, void *);
+
+static char const  *fontmsgprologue = 
+"Wine warning:\n"
+"   The following entries in the [fonts] section of the wine.conf file are\n"
+"   obsolete or invalid:\n";
+
+static char const  *fontmsgepilogue =
+"   These entries should be eliminated or updated.\n"
+"   See the documentation/fonts file for more information.\n";
+
+static int  TWEAK_CheckOldFonts()
+{
+    int  found = 0;
+
+    PROFILE_EnumerateWineIniSection("Fonts", &TWEAK_CheckOldFontsCallback,
+				    (void *)&found);
+    if(found)
+	fprintf(stderr, fontmsgepilogue);
+
+    return 1;
+}
+
+static void  TWEAK_CheckOldFontsCallback(
+    char const  *key,
+    char const  *value,
+    void  *found)
+{
+    /* Ignore any keys that start with potential comment characters "'", '#',
+       or ';'. */
+    if(key[0] == '\'' || key[0] == '#' || key[0] == ';' || key[0] == '\0')
+	return;
+
+    /* Make sure this is a valid key */
+    if(strncasecmp(key, "Alias", 5) == 0 ||
+       strcasecmp(key, "Default") == 0) {
+
+	/* Valid key; make sure the value doesn't contain a wildcard */
+	if(strchr(value, '*')) {
+	    if(*(int *)found == 0) {
+		fprintf(stderr, fontmsgprologue);
+		++*(int *)found;
+	    }
+	    
+	    fprintf(stderr, "     %s=%s [no wildcards allowed]\n", key, value);
+	}
+    }
+    else {
+	/* Not a valid key */
+	if(*(int *)found == 0) {
+	    fprintf(stderr, fontmsgprologue);
+	    ++*(int *)found;
+	}
+
+	fprintf(stderr, "     %s=%s [obsolete]\n", key, value);
+    }
+
+    return;
+}
+
+
+/******************************************************************************
+ *
+ *   int  TWEAK_CheckConfiguration()
+ *
+ *   Examines wine.conf for old/bad entries and recommends changes to the user.
+ *
+ *   Revision history
+ *        05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ *             Original implementation.
+ *
+ *****************************************************************************/
+
+int  TWEAK_CheckConfiguration()
+{
+    TWEAK_CheckOldFonts();
+    return 1;
+}
+
+
+
+/******************************************************************************
+ *
+ *     Tweak graphic subsystem.
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ *   void  TWEAK_DrawReliefRect95(
+ *      HDC32  hdc,               // Device context on which to draw
+ *      RECT32 const  *rect )     // Rectangle to use
+ *
+ *   Draws the double-bordered Win95-style relief rectangle.
+ *
+ *   Bugs
+ *        There are some checks missing from this function.  Perhaps the
+ *        SelectObject32 calls should be examined?  Hasn't failed on me (yet).
+ *
+ *        Should I really be calling X functions directly from here?  It is
+ *        an optimization, but should I be optimizing alpha code?  Probably
+ *        not.
+ *
+ *   Revision history
+ *        08-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ *             Original implementation.
+ *
+ *****************************************************************************/
+
+void  TWEAK_DrawReliefRect95(
+    HDC32  hdc,
+    RECT32 const  *rect )
+{
+    DC  *dc;
+    HPEN32  prevpen;
+
+    if((dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC))) {
+
+	/* Draw the top/left lines first */
+	prevpen = SelectObject32(hdc, TWEAK_PenE095);
+	DC_SetupGCForPen(dc);
+	XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left, rect->top,
+		  rect->right - 1, rect->top);
+	XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left, rect->top,
+		  rect->left, rect->bottom - 1);
+
+	SelectObject32(hdc, TWEAK_PenFF95);
+	DC_SetupGCForPen(dc);
+	XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left + 1,
+		  rect->top + 1, rect->right - 2, rect->top + 1);
+	XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left + 1,
+		  rect->top + 1, rect->left + 1, rect->bottom - 2);
+
+
+	/* Now the bottom/right lines */
+	SelectObject32(hdc, TWEAK_Pen0095);
+	DC_SetupGCForPen(dc);
+	XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left,
+		  rect->bottom - 1, rect->right - 1, rect->bottom - 1);
+	XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->right - 1,
+		  rect->top, rect->right - 1, rect->bottom - 1);
+
+	SelectObject32(hdc, TWEAK_Pen8095);
+	DC_SetupGCForPen(dc);
+	XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left + 1,
+		  rect->bottom - 2, rect->right - 2, rect->bottom - 2);
+	XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->right - 2,
+		  rect->top + 1, rect->right - 2, rect->bottom - 2);
+	
+	SelectObject32(hdc, prevpen);
+    }
+
+    return;
+}
+
+
+/******************************************************************************
+ *
+ *   void  TWEAK_DrawMenuSeparator95(
+ *      HDC32  hdc,               // Device context on which to draw
+ *      UINT32  xc1,              // Left x-coordinate
+ *      UINT32  yc,               // Y-coordinate of the LOWER line
+ *      UINT32  xc2 )             // Right x-coordinate
+ *
+ *   Draws the menu separator bar Win 95 style.
+ *
+ *   Bugs
+ *        Same as those for DrawReliefRect95.
+ *
+ *   Revision history
+ *        08-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ *             Original implementation.
+ *
+ *****************************************************************************/
+
+void  TWEAK_DrawMenuSeparator95(
+    HDC32  hdc,
+    UINT32  xc1,
+    UINT32  yc,
+    UINT32  xc2 )
+{
+    DC  *dc;
+    HPEN32  prevpen;
+
+    if((dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC))) {
+
+	/* Draw the top line */
+	prevpen = SelectObject32(hdc, TWEAK_Pen8095);
+	DC_SetupGCForPen(dc);
+	XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, xc1, yc - 1, xc2,
+		  yc - 1);
+
+	/* And the bottom line */
+	SelectObject32(hdc, TWEAK_PenFF95);
+	DC_SetupGCForPen(dc);
+	XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, xc1, yc, xc2, yc);
+
+	SelectObject32(hdc, prevpen);
+    }
+
+    return;
+}
diff --git a/misc/ver.c b/misc/ver.c
index 70690b8..51b9089 100644
--- a/misc/ver.c
+++ b/misc/ver.c
@@ -27,7 +27,7 @@
 
 /******************************************************************************
  *
- *   void  dprintf_ver_string(
+ *   void  ver_dstring(
  *      char const * prologue,
  *      char const * teststring,
  *      char const * epilogue )
@@ -39,11 +39,14 @@
  *
  *   Revision history
  *      30-May-1997 Dave Cuthbert (dacut@ece.cmu.edu)
- *         Original implementation
+ *         Original implementation as dprintf[_]ver_string
+ *      05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ *         Fixed problem that caused bug with tools/make_debug -- renaming
+ *         this function should fix the problem.
  *
  *****************************************************************************/
 
-static void  dprintf_ver_string(
+static void  ver_dstring(
     char const * prologue,
     char const * teststring,
     char const * epilogue )
@@ -557,9 +560,9 @@
     else
 	dprintf_ver(stddeb, "\n");
 
-    dprintf_ver_string("\tlpszFilename = ", lpszFilename, "\n");
-    dprintf_ver_string("\tlpszWinDir = ", lpszWinDir, "\n");
-    dprintf_ver_string("\tlpszAppDir = ", lpszAppDir, "\n");
+    ver_dstring("\tlpszFilename = ", lpszFilename, "\n");
+    ver_dstring("\tlpszWinDir = ", lpszWinDir, "\n");
+    ver_dstring("\tlpszAppDir = ", lpszAppDir, "\n");
 
     dprintf_ver(stddeb, "\tlpszCurDir = %p\n", lpszCurDir);
     if(lpuCurDirLen)
@@ -674,14 +677,14 @@
 	dprintf_ver(stddeb, ")");
     }
 
-    dprintf_ver_string("\n\t(Exit) lpszCurDir = ", lpszCurDir, "\n");
+    ver_dstring("\n\t(Exit) lpszCurDir = ", lpszCurDir, "\n");
     if(lpuCurDirLen)
 	dprintf_ver(stddeb, "\t(Exit) lpuCurDirLen = %p (%u)\n",
 		    lpuCurDirLen, *lpuCurDirLen);
     else
 	dprintf_ver(stddeb, "\t(Exit) lpuCurDirLen = (null)\n");
 
-    dprintf_ver_string("\t(Exit) lpszDestDir = ", lpszDestDir, "\n");
+    ver_dstring("\t(Exit) lpszDestDir = ", lpszDestDir, "\n");
     if(lpuDestDirLen)
 	dprintf_ver(stddeb, "\t(Exit) lpuDestDirLen = %p (%u)\n",
 		    lpuDestDirLen, *lpuDestDirLen);
@@ -972,114 +975,6 @@
     return ret;
 }
 
-/* FIXME: This table should, of course, be language dependend */
-static const struct map_id2str {
-	UINT16	langid;
-	const char *langname;
-} languages[]={
-	{0x0401,"Arabisch"},
-	{0x0402,"Bulgarisch"},
-	{0x0403,"Katalanisch"},
-	{0x0404,"Traditionales Chinesisch"},
-	{0x0405,"Tschecisch"},
-	{0x0406,"Dänisch"},
-	{0x0407,"Deutsch"},
-	{0x0408,"Griechisch"},
-	{0x0409,"Amerikanisches Englisch"},
-	{0x040A,"Kastilisches Spanisch"},
-	{0x040B,"Finnisch"},
-	{0x040C,"Französisch"},
-	{0x040D,"Hebräisch"},
-	{0x040E,"Ungarisch"},
-	{0x040F,"Isländisch"},
-	{0x0410,"Italienisch"},
-	{0x0411,"Japanisch"},
-	{0x0412,"Koreanisch"},
-	{0x0413,"Niederländisch"},
-	{0x0414,"Norwegisch-Bokmal"},
-	{0x0415,"Polnisch"},
-	{0x0416,"Brasilianisches Portugiesisch"},
-	{0x0417,"Rätoromanisch"},
-	{0x0418,"Rumänisch"},
-	{0x0419,"Russisch"},
-	{0x041A,"Kroatoserbisch (lateinisch)"},
-	{0x041B,"Slowenisch"},
-	{0x041C,"Albanisch"},
-	{0x041D,"Schwedisch"},
-	{0x041E,"Thai"},
-	{0x041F,"Türkisch"},
-	{0x0420,"Urdu"},
-	{0x0421,"Bahasa"},
-	{0x0804,"Vereinfachtes Chinesisch"},
-	{0x0807,"Schweizerdeutsch"},
-	{0x0809,"Britisches Englisch"},
-	{0x080A,"Mexikanisches Spanisch"},
-	{0x080C,"Belgisches Französisch"},
-	{0x0810,"Schweizerisches Italienisch"},
-	{0x0813,"Belgisches Niederländisch"},
-	{0x0814,"Norgwegisch-Nynorsk"},
-	{0x0816,"Portugiesisch"},
-	{0x081A,"Serbokratisch (kyrillisch)"},
-	{0x0C1C,"Kanadisches Französisch"},
-	{0x100C,"Schweizerisches Französisch"},
-	{0x0000,"Unbekannt"},
-};
-
-/* VerLanguageName				[VER.10] */
-DWORD
-VerLanguageName16(UINT16 langid,LPSTR langname,UINT16 langnamelen) {
-	int	i;
-	char	*buf;
-
-	dprintf_ver(stddeb,"VerLanguageName(%d,%p,%d)\n",langid,langname,langnamelen);
-	/* First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
-	 * from the registry. 
-	 */
-	buf=(char*)malloc(strlen("\\System\\CurrentControlSet\\control\\Nls\\Locale\\")+9);
-	sprintf(buf,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",langid);
-	if (ERROR_SUCCESS==RegQueryValue16(HKEY_LOCAL_MACHINE,buf,langname,(LPDWORD)&langnamelen)) {
-		langname[langnamelen-1]='\0';
-		return langnamelen;
-	}
-	/* if that fails, use the interal table */
-	for (i=0;languages[i].langid!=0;i++)
-		if (langid==languages[i].langid)
-			break;
-	strncpy(langname,languages[i].langname,langnamelen);
-	langname[langnamelen-1]='\0';
-	return strlen(languages[i].langname);
-}
-
-/* VerLanguageNameA				[VERSION.9] */
-DWORD
-VerLanguageName32A(UINT32 langid,LPSTR langname,UINT32 langnamelen) {
-	return VerLanguageName16(langid,langname,langnamelen);
-}
-
-/* VerLanguageNameW				[VERSION.10] */
-DWORD
-VerLanguageName32W(UINT32 langid,LPWSTR langname,UINT32 langnamelen) {
-	int	i;
-	char	buffer[80];
-	LPWSTR	keyname;
-
-	/* First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
-	 * from the registry. 
-	 */
-	sprintf(buffer,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",langid);
-	keyname = HEAP_strdupAtoW( GetProcessHeap(), 0, buffer );
-	if (ERROR_SUCCESS==RegQueryValue32W(HKEY_LOCAL_MACHINE,keyname,langname,(LPDWORD)&langnamelen)) {
-		HeapFree( GetProcessHeap(), 0, keyname );
-		return langnamelen;
-	}
-        HeapFree( GetProcessHeap(), 0, keyname );
-	/* if that fails, use the interal table */
-	for (i=0;languages[i].langid!=0;i++)
-		if (langid==languages[i].langid)
-			break;
-        lstrcpyAtoW( langname, languages[i].langname );
-	return strlen(languages[i].langname); /* same as strlenW(langname); */
-}
 
 /* FIXME: UNICODE? */
 struct db {
diff --git a/misc/winsock.c b/misc/winsock.c
index 7f4c314..e4ecd51 100644
--- a/misc/winsock.c
+++ b/misc/winsock.c
@@ -267,6 +267,8 @@
                                 "SunOS",
                         #elif defined(__FreeBSD__)
                                 "FreeBSD",
+                        #elif defined(__OpenBSD__)
+                                "OpenBSD/i386",
                         #else
                                 "Unknown",
                         #endif