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 = \
dir.c \
exit.c \
file.c \
locale.c \
mbstring.c \
memory.c \
spawn.c \
......
......@@ -19,20 +19,20 @@
#define CRTDLL_LC_MONETARY 3
#define CRTDLL_LC_NUMERIC 4
#define CRTDLL_LC_TIME 5
#define CRTDLL_LC_MIN LC_ALL
#define CRTDLL_LC_MAX LC_TIME
#define CRTDLL_LC_MIN CRTDLL_LC_ALL
#define CRTDLL_LC_MAX CRTDLL_LC_TIME
/* ctype defines */
#define CRTDLL_UPPER 0x1
#define CRTDLL_LOWER 0x2
#define CRTDLL_DIGIT 0x4
#define CRTDLL_SPACE 0x8
#define CRTDLL_PUNCT 0x10
#define CRTDLL_CONTROL 0x20
#define CRTDLL_BLANK 0x40
#define CRTDLL_HEX 0x80
#define CRTDLL_UPPER C1_UPPER
#define CRTDLL_LOWER C1_LOWER
#define CRTDLL_DIGIT C1_DIGIT
#define CRTDLL_SPACE C1_SPACE
#define CRTDLL_PUNCT C1_PUNCT
#define CRTDLL_CONTROL C1_CNTRL
#define CRTDLL_BLANK C1_BLANK
#define CRTDLL_HEX C1_XDIGIT
#define CRTDLL_LEADBYTE 0x8000
#define CRTDLL_ALPHA (0x0100|CRTDLL_UPPER|CRTDLL_LOWER)
#define CRTDLL_ALPHA (C1_ALPHA|CRTDLL_UPPER|CRTDLL_LOWER)
/* stat() mode bits */
#define _S_IFMT 0170000
......@@ -416,6 +416,7 @@ VOID __cdecl CRTDLL__purecall( VOID );
double __cdecl CRTDLL__y0( double x );
double __cdecl CRTDLL__y1( double x );
double __cdecl CRTDLL__yn( INT x, double y );
double __cdecl CRTDLL__nextafter( double x, double y );
/* CRTDLL_mem.c */
LPVOID __cdecl CRTDLL_new( DWORD size );
......@@ -487,4 +488,10 @@ void __CRTDLL__set_errno(ULONG err);
LPSTR __CRTDLL__strndup(LPSTR buf, INT size);
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 */
......@@ -38,7 +38,7 @@ debug_channels (crtdll)
@ cdecl __isascii(long) CRTDLL___isascii
@ cdecl __iscsym(long) CRTDLL___iscsym
@ cdecl __iscsymf(long) CRTDLL___iscsymf
@ stub __mb_cur_max_dll
@ extern __mb_cur_max_dll CRTDLL__mb_cur_max_dll
@ stub __pxcptinfoptrs
@ forward __threadhandle kernel32.GetCurrentThread
@ forward __threadid kernel32.GetCurrentThreadId
......@@ -244,7 +244,7 @@ debug_channels (crtdll)
@ cdecl _mkdir(str) CRTDLL__mkdir
@ cdecl _mktemp(str) CRTDLL__mktemp
@ cdecl _msize(ptr) CRTDLL__msize
@ cdecl _nextafter(double double) nextafter
@ cdecl _nextafter(double double) CRTDLL__nextafter
@ cdecl _onexit(ptr) CRTDLL__onexit
@ cdecl _open(str long) CRTDLL__open
@ cdecl _open_osfhandle(long long) CRTDLL__open_osfhandle
......@@ -254,7 +254,7 @@ debug_channels (crtdll)
@ extern _osver_dll CRTDLL_osver_dll
@ extern _osversion_dll CRTDLL_osversion_dll
@ stub _pclose
@ stub _pctype_dll
@ extern _pctype_dll CRTDLL_pctype_dll
@ stub _pgmptr_dll
@ stub _pipe
@ stub _popen
......@@ -275,7 +275,7 @@ debug_channels (crtdll)
@ cdecl _setmode(long long) CRTDLL__setmode
@ stub _setsystime
@ cdecl _sleep(long) CRTDLL__sleep
@ stub _snprintf
@ varargs _snprintf(ptr long ptr) snprintf
@ stub _snwprintf
@ stub _sopen
@ stub _spawnl
......@@ -406,7 +406,7 @@ debug_channels (crtdll)
@ cdecl iscntrl(long) CRTDLL_iscntrl
@ cdecl isdigit(long) CRTDLL_isdigit
@ cdecl isgraph(long) CRTDLL_isgraph
@ stub isleadbyte
@ cdecl isleadbyte(long) CRTDLL_isleadbyte
@ cdecl islower(long) CRTDLL_islower
@ cdecl isprint(long) CRTDLL_isprint
@ cdecl ispunct(long) CRTDLL_ispunct
......
......@@ -72,6 +72,7 @@ UINT CRTDLL_winminor_dll; /* CRTDLL.330 */
UINT CRTDLL_winver_dll; /* CRTDLL.331 */
INT CRTDLL_doserrno = 0;
INT CRTDLL_errno = 0;
INT CRTDLL__mb_cur_max_dll = 1;
const INT CRTDLL__sys_nerr = 43;
/* ASCII char classification flags - binary compatible */
......@@ -103,6 +104,17 @@ WORD CRTDLL_ctype [257] = {
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)
*/
......@@ -112,6 +124,7 @@ BOOL WINAPI CRTDLL_Init(HINSTANCE hinstDLL,DWORD fdwReason,LPVOID lpvReserved)
if (fdwReason == DLL_PROCESS_ATTACH) {
__CRTDLL__init_io();
CRTDLL_setlocale( CRTDLL_LC_ALL, "C" );
CRTDLL_HUGE_dll = HUGE_VAL;
}
return TRUE;
......@@ -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)
*/
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)
/*********************************************************************
* isleadbyte (CRTDLL.447)
*/
INT __cdecl CRTDLL_isleadbyte(unsigned char c)
{
return CRTDLL__isctype( c, CRTDLL_LEADBYTE );
}
/*********************************************************************
* islower (CRTDLL.447)
*/
INT __cdecl CRTDLL_islower(INT c)
......@@ -1639,3 +1658,17 @@ double __cdecl CRTDLL__yn(INT x, double y)
}
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)
times(&alltimes);
res = alltimes.tms_utime + alltimes.tms_stime+
alltimes.tms_cutime + alltimes.tms_cstime;
/* Fixme: We need some symbolic representation
/* FIXME: We need some symbolic representation
for (Hostsystem_)CLOCKS_PER_SEC
and (Emulated_system_)CLOCKS_PER_SEC
10 holds only for Windows/Linux_i86)
......
......@@ -344,6 +344,7 @@ BOOL WINAPI EnumCalendarInfoW(CALINFO_ENUMPROCW lpCalInfoEnumProc,LCID Locale,CA
LCID WINAPI ConvertDefaultLocale(LCID Locale);
BOOL WINAPI IsValidCodePage(UINT);
BOOL WINAPI GetCPInfo(UINT,LPCPINFO);
BOOL WINAPI GetCPInfoExA(UINT,DWORD,LPCPINFOEXA);
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