Commit 7349aab0 authored by Jon Griffiths's avatar Jon Griffiths Committed by Alexandre Julliard

- Add math calls: scalb, fpclass, nextafter, logb, _CI*

- Add futime, utime, purecall, getpid
parent d5c40bbe
......@@ -71,6 +71,18 @@
#define _FREEENTRY 0
#define _USEDENTRY 1
/* fpclass constants */
#define _FPCLASS_SNAN 1
#define _FPCLASS_QNAN 2
#define _FPCLASS_NINF 4
#define _FPCLASS_NN 8
#define _FPCLASS_ND 16
#define _FPCLASS_NZ 32
#define _FPCLASS_PZ 64
#define _FPCLASS_PD 128
#define _FPCLASS_PN 256
#define _FPCLASS_PINF 512
/* CRTDLL Globals */
extern INT CRTDLL_doserrno;
extern INT CRTDLL_errno;
......@@ -170,6 +182,12 @@ typedef struct _heapinfo
int _useflag;
} _HEAPINFO;
struct _utimbuf
{
time_t actime;
time_t modtime;
};
typedef VOID (*sig_handler_type)(VOID);
typedef VOID (*new_handler_type)(VOID);
......@@ -251,6 +269,7 @@ INT __cdecl CTRDLL__creat( LPCSTR path, INT flags );
INT __cdecl CRTDLL__eof( INT fd );
LONG __cdecl CRTDLL__tell(INT fd);
INT __cdecl CRTDLL__umask(INT umask);
INT __cdecl CRTDLL__utime(LPCSTR path, struct _utimbuf *t);
INT __cdecl CRTDLL__unlink( LPCSTR pathname );
INT __cdecl CRTDLL_rename( LPCSTR oldpath,LPCSTR newpath );
int __cdecl CRTDLL__stat( LPCSTR filename, struct _stat * buf );
......@@ -261,6 +280,7 @@ INT __cdecl CRTDLL__setmode( INT fh,INT mode );
INT __cdecl CRTDLL_remove( LPCSTR path );
INT __cdecl CRTDLL__commit( INT fd );
INT __cdecl CRTDLL__fstat( int file, struct _stat* buf );
INT __cdecl CRTDLL__futime( INT fd, struct _utimbuf *t );
HANDLE __cdecl CRTDLL__get_osfhandle( INT fd );
/* CRTDLL_main.c */
......@@ -276,6 +296,7 @@ UINT __cdecl CRTDLL__rotl( UINT x,INT shift );
DWORD __cdecl CRTDLL__lrotl( DWORD x,INT shift );
DWORD __cdecl CRTDLL__lrotr( DWORD x,INT shift );
DWORD __cdecl CRTDLL__rotr( UINT x,INT shift );
double __cdecl CRTDLL__scalb( double x, LONG y );
INT __cdecl CRTDLL__mbsicmp( unsigned char *x,unsigned char *y );
INT __cdecl CRTDLL_vswprintf( LPWSTR buffer, LPCWSTR spec, va_list args );
VOID __cdecl CRTDLL_longjmp( jmp_buf env, int val );
......@@ -316,10 +337,12 @@ UINT __cdecl CRTDLL__control87( UINT, UINT );
UINT __cdecl CRTDLL__controlfp( UINT, UINT );
double __cdecl CRTDLL__copysign(double x, double sign);
INT __cdecl CRTDLL__finite( double d );
INT __cdecl CRTDLL__fpclass( double d );
VOID __cdecl CRTDLL__fpreset( void );
INT __cdecl CRTDLL__isnan( double d );
LPVOID __cdecl CRTDLL__lsearch( LPVOID match, LPVOID start, LPUINT array_size,
UINT elem_size, comp_func cf );
VOID __cdecl CRTDLL__purecall( VOID );
/* CRTDLL_mem.c */
LPVOID __cdecl CRTDLL_new( DWORD size );
......
......@@ -11,22 +11,22 @@ debug_channels (crtdll)
@ cdecl ??2@YAPAXI@Z(long) CRTDLL_new
@ cdecl ??3@YAXPAX@Z(long) CRTDLL_delete
@ cdecl ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z(ptr) CRTDLL_set_new_handler
@ stub _CIacos
@ stub _CIasin
@ stub _CIatan
@ stub _CIatan2
@ stub _CIcos
@ stub _CIcosh
@ stub _CIexp
@ stub _CIfmod
@ stub _CIlog
@ stub _CIlog10
@ cdecl _CIacos() CRTDLL__CIacos
@ cdecl _CIasin() CRTDLL__CIasin
@ cdecl _CIatan() CRTDLL__CIatan
@ cdecl _CIatan2() CRTDLL__CIatan2
@ cdecl _CIcos() CRTDLL__CIcos
@ cdecl _CIcosh() CRTDLL__CIcosh
@ cdecl _CIexp() CRTDLL__CIexp
@ cdecl _CIfmod() CRTDLL__CIfmod
@ cdecl _CIlog() CRTDLL__CIlog
@ cdecl _CIlog10() CRTDLL__CIlog10
@ forward _CIpow ntdll._CIpow
@ stub _CIsin
@ stub _CIsinh
@ stub _CIsqrt
@ stub _CItan
@ stub _CItanh
@ cdecl _CIsin() CRTDLL__CIsin
@ cdecl _CIsinh() CRTDLL__CIsinh
@ cdecl _CIsqrt() CRTDLL__CIsqrt
@ cdecl _CItan() CRTDLL__CItan
@ cdecl _CItanh() CRTDLL__CItanh
@ stub _HUGE_dll
@ stub _XcptFilter
@ cdecl __GetMainArgs(ptr ptr ptr long) CRTDLL__GetMainArgs
......@@ -112,7 +112,7 @@ debug_channels (crtdll)
@ cdecl _flsbuf(long ptr) CRTDLL__flsbuf
@ cdecl _flushall() CRTDLL__flushall
@ extern _fmode_dll CRTDLL_fmode_dll
@ stub _fpclass
@ cdecl _fpclass(double) CRTDLL__fpclass
@ stub _fpieee_flt
@ cdecl _fpreset() CRTDLL__fpreset
@ cdecl _fputchar(long) CRTDLL__fputchar
......@@ -122,7 +122,7 @@ debug_channels (crtdll)
@ cdecl _ftime(ptr) CRTDLL__ftime
@ forward _ftol ntdll._ftol
@ cdecl _fullpath(ptr str long) CRTDLL__fullpath
@ stub _futime
@ cdecl _futime(long ptr) CRTDLL__futime
@ stub _gcvt
@ cdecl _get_osfhandle(long) CRTDLL__get_osfhandle
@ stub _getch
......@@ -133,7 +133,7 @@ debug_channels (crtdll)
@ forward _getdllprocaddr kernel32.GetProcAddress
@ cdecl _getdrive() CRTDLL__getdrive
@ forward _getdrives kernel32.GetLogicalDrives
@ stub _getpid
@ forward _getpid kernel32.GetCurrentProcessId
@ stub _getsystime
@ stub _getw
@ cdecl _global_unwind2(ptr) CRTDLL__global_unwind2
......@@ -182,7 +182,7 @@ debug_channels (crtdll)
@ cdecl _loaddll(str) CRTDLL__loaddll
@ cdecl _local_unwind2(ptr long) CRTDLL__local_unwind2
@ stub _locking
@ stub _logb
@ cdecl _logb(double) logb
@ cdecl _lrotl (long long) CRTDLL__lrotl
@ cdecl _lrotr (long long) CRTDLL__lrotr
@ cdecl _lsearch(ptr ptr long long ptr) CRTDLL__lsearch
......@@ -244,7 +244,7 @@ debug_channels (crtdll)
@ cdecl _mkdir(str) CRTDLL__mkdir
@ stub _mktemp
@ cdecl _msize(ptr) CRTDLL__msize
@ stub _nextafter
@ cdecl _nextafter(double double) nextafter
@ cdecl _onexit(ptr) CRTDLL__onexit
@ cdecl _open(str long) CRTDLL__open
@ cdecl _open_osfhandle(long long) CRTDLL__open_osfhandle
......@@ -258,7 +258,7 @@ debug_channels (crtdll)
@ stub _pgmptr_dll
@ stub _pipe
@ stub _popen
@ stub _purecall
@ cdecl _purecall() CRTDLL__purecall
@ stub _putch
@ stub _putenv
@ stub _putw
......@@ -268,7 +268,7 @@ debug_channels (crtdll)
@ stub _rmtmp
@ cdecl _rotl (long long) CRTDLL__rotl
@ cdecl _rotr (long long) CRTDLL__rotr
@ stub _scalb
@ cdecl _scalb (double long) CRTDLL__scalb
@ stub _searchenv
@ stub _seterrormode
@ cdecl _setjmp (ptr) CRTDLL__setjmp
......@@ -324,7 +324,7 @@ debug_channels (crtdll)
@ stub _ungetch
@ cdecl _unlink(str) CRTDLL__unlink
@ cdecl _unloaddll(long) CRTDLL__unloaddll
@ stub _utime
@ cdecl _utime(str ptr) CRTDLL__utime
@ cdecl _vsnprintf(ptr long ptr ptr) vsnprintf
@ stub _vsnwprintf
@ cdecl _wcsdup(wstr) CRTDLL__wcsdup
......
......@@ -130,6 +130,156 @@ void __CRTDLL__set_errno(ULONG err)
}
}
#if defined(__GNUC__) && defined(__i386__)
#define FPU_DOUBLE(var) double var; \
__asm__ __volatile__( "fstpl %0;fwait" : "=m" (var) : )
#define FPU_DOUBLES(var1,var2) double var1,var2; \
__asm__ __volatile__( "fstpl %0;fwait" : "=m" (var2) : ); \
__asm__ __volatile__( "fstpl %0;fwait" : "=m" (var1) : )
#else
#define FPU_DOUBLE(var) double var = quiet_nan(); \
FIXME(":not implemented\n");
#define FPU_DOUBLES(var1,var2) double var1,var2; \
var1=var2=quiet_nan(); FIXME(":not implemented\n")
#endif
/*********************************************************************
* _CIacos (CRTDLL.004)
*/
double __cdecl CRTDLL__CIacos(void)
{
FPU_DOUBLE(x);
return acos(x);
}
/*********************************************************************
* _CIasin (CRTDLL.005)
*/
double __cdecl CRTDLL__CIasin(void)
{
FPU_DOUBLE(x);
return asin(x);
}
/*********************************************************************
* _CIatan (CRTDLL.006)
*/
double __cdecl CRTDLL__CIatan(void)
{
FPU_DOUBLE(x);
return atan(x);
}
/*********************************************************************
* _CIatan2 (CRTDLL.007)
*/
double __cdecl CRTDLL__CIatan2(void)
{
FPU_DOUBLES(x,y);
return atan2(x,y);
}
/*********************************************************************
* _CIcos (CRTDLL.008)
*/
double __cdecl CRTDLL__CIcos(void)
{
FPU_DOUBLE(x);
return cos(x);
}
/*********************************************************************
* _CIcosh (CRTDLL.009)
*/
double __cdecl CRTDLL__CIcosh(void)
{
FPU_DOUBLE(x);
return cosh(x);
}
/*********************************************************************
* _CIexp (CRTDLL.010)
*/
double __cdecl CRTDLL__CIexp(void)
{
FPU_DOUBLE(x);
return exp(x);
}
/*********************************************************************
* _CIfmod (CRTDLL.011)
*/
double __cdecl CRTDLL__CIfmod(void)
{
FPU_DOUBLES(x,y);
return fmod(x,y);
}
/*********************************************************************
* _CIlog (CRTDLL.012)
*/
double __cdecl CRTDLL__CIlog(void)
{
FPU_DOUBLE(x);
return log(x);
}
/*********************************************************************
* _CIlog10 (CRTDLL.013)
*/
double __cdecl CRTDLL__CIlog10(void)
{
FPU_DOUBLE(x);
return log10(x);
}
/*********************************************************************
* _CIsin (CRTDLL.015)
*/
double __cdecl CRTDLL__CIsin(void)
{
FPU_DOUBLE(x);
return sin(x);
}
/*********************************************************************
* _CIsinh (CRTDLL.016)
*/
double __cdecl CRTDLL__CIsinh(void)
{
FPU_DOUBLE(x);
return sinh(x);
}
/*********************************************************************
* _CIsqrt (CRTDLL.017)
*/
double __cdecl CRTDLL__CIsqrt(void)
{
FPU_DOUBLE(x);
return sqrt(x);
}
/*********************************************************************
* _CItan (CRTDLL.018)
*/
double __cdecl CRTDLL__CItan(void)
{
FPU_DOUBLE(x);
return tan(x);
}
/*********************************************************************
* _CItanh (CRTDLL.019)
*/
double __cdecl CRTDLL__CItanh(void)
{
FPU_DOUBLE(x);
return tanh(x);
}
/*********************************************************************
* _GetMainArgs (CRTDLL.022)
......@@ -212,6 +362,37 @@ LPSTR * __cdecl CRTDLL__GetMainArgs(LPDWORD argc,LPSTR **argv,
/*********************************************************************
* _fpclass (CRTDLL.105)
*
* Return the FP classification of d.
*/
INT __cdecl CRTDLL__fpclass(double d)
{
switch (fpclassify( d ))
{
case FP_NAN: return _FPCLASS_QNAN;
case FP_INFINITE:
if (signbit(d))
return _FPCLASS_NINF;
return _FPCLASS_PINF;
case FP_SUBNORMAL:
if (signbit(d))
return _FPCLASS_ND;
return _FPCLASS_PD;
case FP_ZERO:
if (signbit(d))
return _FPCLASS_NZ;
return _FPCLASS_PZ;
case FP_NORMAL:
default:
if (signbit(d))
return _FPCLASS_NN;
return _FPCLASS_PN;
}
}
/*********************************************************************
* _initterm (CRTDLL.135)
*/
DWORD __cdecl CRTDLL__initterm(_INITTERMFUN *start,_INITTERMFUN *end)
......@@ -326,6 +507,19 @@ DWORD __cdecl CRTDLL__rotr(UINT x,INT shift)
/*********************************************************************
* _scalb (CRTDLL.259)
*
* Return x*2^y.
*/
double __cdecl CRTDLL__scalb(double x, LONG y)
{
/* Note - Can't forward directly as libc expects y as double */
double y2 = (double)y;
return scalb( x, y2 );
}
/*********************************************************************
* vswprintf (CRTDLL.501)
*/
INT __cdecl CRTDLL_vswprintf( LPWSTR buffer, LPCWSTR spec, va_list args )
......@@ -1000,3 +1194,15 @@ INT __cdecl CRTDLL__isnan(double d)
*/
return isnan(d)?1:0;
}
/*********************************************************************
* _purecall (CRTDLL.249)
*
* Abort program after pure virtual function call.
*/
VOID __cdecl CRTDLL__purecall(VOID)
{
CRTDLL__amsg_exit( 6025 );
}
......@@ -193,7 +193,7 @@ INT __cdecl CRTDLL__access(LPCSTR filename, INT mode)
{
DWORD attr = GetFileAttributesA(filename);
if (attr == -1)
if (attr == 0xffffffff)
{
if (!filename)
{
......@@ -503,6 +503,41 @@ int __cdecl CRTDLL__fstat(int fd, struct _stat* buf)
/*********************************************************************
* _futime (CRTDLL.115)
*
* Set the file access/modification times on an open file.
*/
INT __cdecl CRTDLL__futime(INT fd, struct _utimbuf *t)
{
HANDLE hand = __CRTDLL__fdtoh(fd);
FILETIME at, wt;
if (!t)
{
time_t currTime;
CRTDLL_time(&currTime);
RtlSecondsSince1970ToTime( currTime, &at );
memcpy( &wt, &at, sizeof(wt) );
}
else
{
RtlSecondsSince1970ToTime( t->actime, &at );
if (t->actime == t->modtime)
memcpy( &wt, &at, sizeof(wt) );
else
RtlSecondsSince1970ToTime( t->modtime, &wt );
}
if (!SetFileTime( hand, NULL, &at, &wt ))
{
__CRTDLL__set_errno(GetLastError());
return -1 ;
}
return 0;
}
/*********************************************************************
* _get_osfhandle (CRTDLL.117)
*
* Return a Win32 HANDLE from a file descriptor.
......@@ -564,7 +599,7 @@ INT __cdecl CRTDLL__isatty(INT fd)
*/
LONG __cdecl CRTDLL__lseek( INT fd, LONG offset, INT whence)
{
LONG ret;
DWORD ret;
HANDLE hand = __CRTDLL__fdtoh(fd);
TRACE(":fd (%d) handle (%d)\n",fd,hand);
......@@ -864,6 +899,25 @@ INT __cdecl CRTDLL__umask(INT umask)
/*********************************************************************
* _utime (CRTDLL.314)
*
* Set the file access/modification times on a file.
*/
INT __cdecl CRTDLL__utime(LPCSTR path, struct _utimbuf *t)
{
INT fd = CRTDLL__open( path, _O_WRONLY | _O_BINARY );
if (fd > 0)
{
INT retVal = CRTDLL__futime(fd, t);
CRTDLL__close(fd);
return retVal;
}
return -1;
}
/*********************************************************************
* _unlink (CRTDLL.315)
*
* Delete a file.
......
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