Commit e371e682 authored by Jon Griffiths's avatar Jon Griffiths Committed by Alexandre Julliard

- Implemented setlocale parsing and LC_TYPE behavior.

- Implemented isleadbyte, snprintf. - Added NLS IsValidCodePage prototype, misc CRTDLL fixes.
parent 8be11cae
...@@ -13,6 +13,7 @@ C_SRCS = \ ...@@ -13,6 +13,7 @@ C_SRCS = \
dir.c \ dir.c \
exit.c \ exit.c \
file.c \ file.c \
locale.c \
mbstring.c \ mbstring.c \
memory.c \ memory.c \
spawn.c \ spawn.c \
......
...@@ -19,20 +19,20 @@ ...@@ -19,20 +19,20 @@
#define CRTDLL_LC_MONETARY 3 #define CRTDLL_LC_MONETARY 3
#define CRTDLL_LC_NUMERIC 4 #define CRTDLL_LC_NUMERIC 4
#define CRTDLL_LC_TIME 5 #define CRTDLL_LC_TIME 5
#define CRTDLL_LC_MIN LC_ALL #define CRTDLL_LC_MIN CRTDLL_LC_ALL
#define CRTDLL_LC_MAX LC_TIME #define CRTDLL_LC_MAX CRTDLL_LC_TIME
/* ctype defines */ /* ctype defines */
#define CRTDLL_UPPER 0x1 #define CRTDLL_UPPER C1_UPPER
#define CRTDLL_LOWER 0x2 #define CRTDLL_LOWER C1_LOWER
#define CRTDLL_DIGIT 0x4 #define CRTDLL_DIGIT C1_DIGIT
#define CRTDLL_SPACE 0x8 #define CRTDLL_SPACE C1_SPACE
#define CRTDLL_PUNCT 0x10 #define CRTDLL_PUNCT C1_PUNCT
#define CRTDLL_CONTROL 0x20 #define CRTDLL_CONTROL C1_CNTRL
#define CRTDLL_BLANK 0x40 #define CRTDLL_BLANK C1_BLANK
#define CRTDLL_HEX 0x80 #define CRTDLL_HEX C1_XDIGIT
#define CRTDLL_LEADBYTE 0x8000 #define CRTDLL_LEADBYTE 0x8000
#define CRTDLL_ALPHA (0x0100|CRTDLL_UPPER|CRTDLL_LOWER) #define CRTDLL_ALPHA (C1_ALPHA|CRTDLL_UPPER|CRTDLL_LOWER)
/* stat() mode bits */ /* stat() mode bits */
#define _S_IFMT 0170000 #define _S_IFMT 0170000
...@@ -416,6 +416,7 @@ VOID __cdecl CRTDLL__purecall( VOID ); ...@@ -416,6 +416,7 @@ VOID __cdecl CRTDLL__purecall( VOID );
double __cdecl CRTDLL__y0( double x ); double __cdecl CRTDLL__y0( double x );
double __cdecl CRTDLL__y1( double x ); double __cdecl CRTDLL__y1( double x );
double __cdecl CRTDLL__yn( INT x, double y ); double __cdecl CRTDLL__yn( INT x, double y );
double __cdecl CRTDLL__nextafter( double x, double y );
/* CRTDLL_mem.c */ /* CRTDLL_mem.c */
LPVOID __cdecl CRTDLL_new( DWORD size ); LPVOID __cdecl CRTDLL_new( DWORD size );
...@@ -487,4 +488,10 @@ void __CRTDLL__set_errno(ULONG err); ...@@ -487,4 +488,10 @@ void __CRTDLL__set_errno(ULONG err);
LPSTR __CRTDLL__strndup(LPSTR buf, INT size); LPSTR __CRTDLL__strndup(LPSTR buf, INT size);
VOID __CRTDLL__init_io(VOID); VOID __CRTDLL__init_io(VOID);
extern WORD CRTDLL_ctype [257];
extern WORD __CRTDLL_current_ctype[257];
extern WORD* CRTDLL_pctype_dll;
extern INT CRTDLL__mb_cur_max_dll;
extern LCID __CRTDLL_current_lc_all_lcid;
#endif /* __WINE_CRTDLL_H */ #endif /* __WINE_CRTDLL_H */
...@@ -38,7 +38,7 @@ debug_channels (crtdll) ...@@ -38,7 +38,7 @@ debug_channels (crtdll)
@ cdecl __isascii(long) CRTDLL___isascii @ cdecl __isascii(long) CRTDLL___isascii
@ cdecl __iscsym(long) CRTDLL___iscsym @ cdecl __iscsym(long) CRTDLL___iscsym
@ cdecl __iscsymf(long) CRTDLL___iscsymf @ cdecl __iscsymf(long) CRTDLL___iscsymf
@ stub __mb_cur_max_dll @ extern __mb_cur_max_dll CRTDLL__mb_cur_max_dll
@ stub __pxcptinfoptrs @ stub __pxcptinfoptrs
@ forward __threadhandle kernel32.GetCurrentThread @ forward __threadhandle kernel32.GetCurrentThread
@ forward __threadid kernel32.GetCurrentThreadId @ forward __threadid kernel32.GetCurrentThreadId
...@@ -244,7 +244,7 @@ debug_channels (crtdll) ...@@ -244,7 +244,7 @@ debug_channels (crtdll)
@ cdecl _mkdir(str) CRTDLL__mkdir @ cdecl _mkdir(str) CRTDLL__mkdir
@ cdecl _mktemp(str) CRTDLL__mktemp @ cdecl _mktemp(str) CRTDLL__mktemp
@ cdecl _msize(ptr) CRTDLL__msize @ cdecl _msize(ptr) CRTDLL__msize
@ cdecl _nextafter(double double) nextafter @ cdecl _nextafter(double double) CRTDLL__nextafter
@ cdecl _onexit(ptr) CRTDLL__onexit @ cdecl _onexit(ptr) CRTDLL__onexit
@ cdecl _open(str long) CRTDLL__open @ cdecl _open(str long) CRTDLL__open
@ cdecl _open_osfhandle(long long) CRTDLL__open_osfhandle @ cdecl _open_osfhandle(long long) CRTDLL__open_osfhandle
...@@ -254,7 +254,7 @@ debug_channels (crtdll) ...@@ -254,7 +254,7 @@ debug_channels (crtdll)
@ extern _osver_dll CRTDLL_osver_dll @ extern _osver_dll CRTDLL_osver_dll
@ extern _osversion_dll CRTDLL_osversion_dll @ extern _osversion_dll CRTDLL_osversion_dll
@ stub _pclose @ stub _pclose
@ stub _pctype_dll @ extern _pctype_dll CRTDLL_pctype_dll
@ stub _pgmptr_dll @ stub _pgmptr_dll
@ stub _pipe @ stub _pipe
@ stub _popen @ stub _popen
...@@ -275,7 +275,7 @@ debug_channels (crtdll) ...@@ -275,7 +275,7 @@ debug_channels (crtdll)
@ cdecl _setmode(long long) CRTDLL__setmode @ cdecl _setmode(long long) CRTDLL__setmode
@ stub _setsystime @ stub _setsystime
@ cdecl _sleep(long) CRTDLL__sleep @ cdecl _sleep(long) CRTDLL__sleep
@ stub _snprintf @ varargs _snprintf(ptr long ptr) snprintf
@ stub _snwprintf @ stub _snwprintf
@ stub _sopen @ stub _sopen
@ stub _spawnl @ stub _spawnl
...@@ -406,7 +406,7 @@ debug_channels (crtdll) ...@@ -406,7 +406,7 @@ debug_channels (crtdll)
@ cdecl iscntrl(long) CRTDLL_iscntrl @ cdecl iscntrl(long) CRTDLL_iscntrl
@ cdecl isdigit(long) CRTDLL_isdigit @ cdecl isdigit(long) CRTDLL_isdigit
@ cdecl isgraph(long) CRTDLL_isgraph @ cdecl isgraph(long) CRTDLL_isgraph
@ stub isleadbyte @ cdecl isleadbyte(long) CRTDLL_isleadbyte
@ cdecl islower(long) CRTDLL_islower @ cdecl islower(long) CRTDLL_islower
@ cdecl isprint(long) CRTDLL_isprint @ cdecl isprint(long) CRTDLL_isprint
@ cdecl ispunct(long) CRTDLL_ispunct @ cdecl ispunct(long) CRTDLL_ispunct
......
...@@ -72,6 +72,7 @@ UINT CRTDLL_winminor_dll; /* CRTDLL.330 */ ...@@ -72,6 +72,7 @@ UINT CRTDLL_winminor_dll; /* CRTDLL.330 */
UINT CRTDLL_winver_dll; /* CRTDLL.331 */ UINT CRTDLL_winver_dll; /* CRTDLL.331 */
INT CRTDLL_doserrno = 0; INT CRTDLL_doserrno = 0;
INT CRTDLL_errno = 0; INT CRTDLL_errno = 0;
INT CRTDLL__mb_cur_max_dll = 1;
const INT CRTDLL__sys_nerr = 43; const INT CRTDLL__sys_nerr = 43;
/* ASCII char classification flags - binary compatible */ /* ASCII char classification flags - binary compatible */
...@@ -103,6 +104,17 @@ WORD CRTDLL_ctype [257] = { ...@@ -103,6 +104,17 @@ WORD CRTDLL_ctype [257] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
}; };
/* Internal: Current ctype table for locale */
WORD __CRTDLL_current_ctype[257];
/* pctype is used by macros in the Win32 headers. It must point
* To a table of flags exactly like ctype. To allow locale
* changes to affect ctypes (i.e. isleadbyte), we use a second table
* and update its flags whenever the current locale changes.
*/
WORD* CRTDLL_pctype_dll = __CRTDLL_current_ctype + 1;
/********************************************************************* /*********************************************************************
* CRTDLL_MainInit (CRTDLL.init) * CRTDLL_MainInit (CRTDLL.init)
*/ */
...@@ -112,6 +124,7 @@ BOOL WINAPI CRTDLL_Init(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved) ...@@ -112,6 +124,7 @@ BOOL WINAPI CRTDLL_Init(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
if (fdwReason == DLL_PROCESS_ATTACH) { if (fdwReason == DLL_PROCESS_ATTACH) {
__CRTDLL__init_io(); __CRTDLL__init_io();
CRTDLL_setlocale( CRTDLL_LC_ALL, "C" );
CRTDLL_HUGE_dll = HUGE_VAL; CRTDLL_HUGE_dll = HUGE_VAL;
} }
return TRUE; return TRUE;
...@@ -641,32 +654,29 @@ VOID __cdecl CRTDLL_longjmp(jmp_buf env, int val) ...@@ -641,32 +654,29 @@ VOID __cdecl CRTDLL_longjmp(jmp_buf env, int val)
/********************************************************************* /*********************************************************************
* setlocale (CRTDLL.453)
*/
LPSTR __cdecl CRTDLL_setlocale(INT category,LPCSTR locale)
{
LPSTR categorystr;
switch (category) {
case CRTDLL_LC_ALL: categorystr="LC_ALL";break;
case CRTDLL_LC_COLLATE: categorystr="LC_COLLATE";break;
case CRTDLL_LC_CTYPE: categorystr="LC_CTYPE";break;
case CRTDLL_LC_MONETARY: categorystr="LC_MONETARY";break;
case CRTDLL_LC_NUMERIC: categorystr="LC_NUMERIC";break;
case CRTDLL_LC_TIME: categorystr="LC_TIME";break;
default: categorystr = "UNKNOWN?";break;
}
FIXME("(%s,%s),stub!\n",categorystr,locale);
return "C";
}
/*********************************************************************
* _isctype (CRTDLL.138) * _isctype (CRTDLL.138)
*/ */
INT __cdecl CRTDLL__isctype(INT c,UINT type) INT __cdecl CRTDLL__isctype(INT c, UINT type)
{ {
return CRTDLL_ctype[(UINT)c+1] & type; if (c >= -1 && c <= 255)
return CRTDLL_pctype_dll[c] & type;
if (CRTDLL__mb_cur_max_dll != 1 && c > 0)
{
/* FIXME: Is there a faster way to do this? */
WORD typeInfo;
char convert[3], *pconv = convert;
if (CRTDLL_pctype_dll[(UINT)c >> 8] & CRTDLL_LEADBYTE)
*pconv++ = (UINT)c >> 8;
*pconv++ = c & 0xff;
*pconv = 0;
/* FIXME: Use ctype LCID */
if (GetStringTypeExA(__CRTDLL_current_lc_all_lcid, CT_CTYPE1,
convert, convert[1] ? 2 : 1, &typeInfo))
return typeInfo & type;
}
return 0;
} }
...@@ -997,6 +1007,15 @@ INT __cdecl CRTDLL_isgraph(INT c) ...@@ -997,6 +1007,15 @@ INT __cdecl CRTDLL_isgraph(INT c)
/********************************************************************* /*********************************************************************
* isleadbyte (CRTDLL.447)
*/
INT __cdecl CRTDLL_isleadbyte(unsigned char c)
{
return CRTDLL__isctype( c, CRTDLL_LEADBYTE );
}
/*********************************************************************
* islower (CRTDLL.447) * islower (CRTDLL.447)
*/ */
INT __cdecl CRTDLL_islower(INT c) INT __cdecl CRTDLL_islower(INT c)
...@@ -1639,3 +1658,17 @@ double __cdecl CRTDLL__yn(INT x, double y) ...@@ -1639,3 +1658,17 @@ double __cdecl CRTDLL__yn(INT x, double y)
} }
return retVal; return retVal;
} }
/*********************************************************************
* _nextafter (CRTDLL.235)
*
*/
double __cdecl CRTDLL__nextafter(double x, double y)
{
double retVal;
if (!finite(x) || !finite(y)) CRTDLL_errno = EDOM;
retVal = nextafter(x,y);
return retVal;
}
...@@ -84,7 +84,7 @@ clock_t __cdecl CRTDLL_clock(void) ...@@ -84,7 +84,7 @@ clock_t __cdecl CRTDLL_clock(void)
times(&alltimes); times(&alltimes);
res = alltimes.tms_utime + alltimes.tms_stime+ res = alltimes.tms_utime + alltimes.tms_stime+
alltimes.tms_cutime + alltimes.tms_cstime; alltimes.tms_cutime + alltimes.tms_cstime;
/* Fixme: We need some symbolic representation /* FIXME: We need some symbolic representation
for (Hostsystem_)CLOCKS_PER_SEC for (Hostsystem_)CLOCKS_PER_SEC
and (Emulated_system_)CLOCKS_PER_SEC and (Emulated_system_)CLOCKS_PER_SEC
10 holds only for Windows/Linux_i86) 10 holds only for Windows/Linux_i86)
......
...@@ -344,6 +344,7 @@ BOOL WINAPI EnumCalendarInfoW(CALINFO_ENUMPROCW lpCalInfoEnumProc,LCID Locale,CA ...@@ -344,6 +344,7 @@ BOOL WINAPI EnumCalendarInfoW(CALINFO_ENUMPROCW lpCalInfoEnumProc,LCID Locale,CA
LCID WINAPI ConvertDefaultLocale(LCID Locale); LCID WINAPI ConvertDefaultLocale(LCID Locale);
BOOL WINAPI IsValidCodePage(UINT);
BOOL WINAPI GetCPInfo(UINT,LPCPINFO); BOOL WINAPI GetCPInfo(UINT,LPCPINFO);
BOOL WINAPI GetCPInfoExA(UINT,DWORD,LPCPINFOEXA); BOOL WINAPI GetCPInfoExA(UINT,DWORD,LPCPINFOEXA);
BOOL WINAPI GetCPInfoExW(UINT,DWORD,LPCPINFOEXW); BOOL WINAPI GetCPInfoExW(UINT,DWORD,LPCPINFOEXW);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment