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

- Add futime, utime, purecall, getpid
This commit is contained in:
Jon Griffiths 2000-11-25 02:11:59 +00:00 committed by Alexandre Julliard
parent d5c40bbe5f
commit 7349aab051
4 changed files with 308 additions and 25 deletions

View File

@ -71,6 +71,18 @@
#define _FREEENTRY 0 #define _FREEENTRY 0
#define _USEDENTRY 1 #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 */ /* CRTDLL Globals */
extern INT CRTDLL_doserrno; extern INT CRTDLL_doserrno;
extern INT CRTDLL_errno; extern INT CRTDLL_errno;
@ -170,6 +182,12 @@ typedef struct _heapinfo
int _useflag; int _useflag;
} _HEAPINFO; } _HEAPINFO;
struct _utimbuf
{
time_t actime;
time_t modtime;
};
typedef VOID (*sig_handler_type)(VOID); typedef VOID (*sig_handler_type)(VOID);
typedef VOID (*new_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 ); INT __cdecl CRTDLL__eof( INT fd );
LONG __cdecl CRTDLL__tell(INT fd); LONG __cdecl CRTDLL__tell(INT fd);
INT __cdecl CRTDLL__umask(INT umask); INT __cdecl CRTDLL__umask(INT umask);
INT __cdecl CRTDLL__utime(LPCSTR path, struct _utimbuf *t);
INT __cdecl CRTDLL__unlink( LPCSTR pathname ); INT __cdecl CRTDLL__unlink( LPCSTR pathname );
INT __cdecl CRTDLL_rename( LPCSTR oldpath,LPCSTR newpath ); INT __cdecl CRTDLL_rename( LPCSTR oldpath,LPCSTR newpath );
int __cdecl CRTDLL__stat( LPCSTR filename, struct _stat * buf ); 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_remove( LPCSTR path );
INT __cdecl CRTDLL__commit( INT fd ); INT __cdecl CRTDLL__commit( INT fd );
INT __cdecl CRTDLL__fstat( int file, struct _stat* buf ); 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 ); HANDLE __cdecl CRTDLL__get_osfhandle( INT fd );
/* CRTDLL_main.c */ /* 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__lrotl( DWORD x,INT shift );
DWORD __cdecl CRTDLL__lrotr( DWORD x,INT shift ); DWORD __cdecl CRTDLL__lrotr( DWORD x,INT shift );
DWORD __cdecl CRTDLL__rotr( UINT 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__mbsicmp( unsigned char *x,unsigned char *y );
INT __cdecl CRTDLL_vswprintf( LPWSTR buffer, LPCWSTR spec, va_list args ); INT __cdecl CRTDLL_vswprintf( LPWSTR buffer, LPCWSTR spec, va_list args );
VOID __cdecl CRTDLL_longjmp( jmp_buf env, int val ); 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 ); UINT __cdecl CRTDLL__controlfp( UINT, UINT );
double __cdecl CRTDLL__copysign(double x, double sign); double __cdecl CRTDLL__copysign(double x, double sign);
INT __cdecl CRTDLL__finite( double d ); INT __cdecl CRTDLL__finite( double d );
INT __cdecl CRTDLL__fpclass( double d );
VOID __cdecl CRTDLL__fpreset( void ); VOID __cdecl CRTDLL__fpreset( void );
INT __cdecl CRTDLL__isnan( double d ); INT __cdecl CRTDLL__isnan( double d );
LPVOID __cdecl CRTDLL__lsearch( LPVOID match, LPVOID start, LPUINT array_size, LPVOID __cdecl CRTDLL__lsearch( LPVOID match, LPVOID start, LPUINT array_size,
UINT elem_size, comp_func cf ); UINT elem_size, comp_func cf );
VOID __cdecl CRTDLL__purecall( VOID );
/* CRTDLL_mem.c */ /* CRTDLL_mem.c */
LPVOID __cdecl CRTDLL_new( DWORD size ); LPVOID __cdecl CRTDLL_new( DWORD size );

View File

@ -11,22 +11,22 @@ debug_channels (crtdll)
@ cdecl ??2@YAPAXI@Z(long) CRTDLL_new @ cdecl ??2@YAPAXI@Z(long) CRTDLL_new
@ cdecl ??3@YAXPAX@Z(long) CRTDLL_delete @ cdecl ??3@YAXPAX@Z(long) CRTDLL_delete
@ cdecl ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z(ptr) CRTDLL_set_new_handler @ cdecl ?_set_new_handler@@YAP6AHI@ZP6AHI@Z@Z(ptr) CRTDLL_set_new_handler
@ stub _CIacos @ cdecl _CIacos() CRTDLL__CIacos
@ stub _CIasin @ cdecl _CIasin() CRTDLL__CIasin
@ stub _CIatan @ cdecl _CIatan() CRTDLL__CIatan
@ stub _CIatan2 @ cdecl _CIatan2() CRTDLL__CIatan2
@ stub _CIcos @ cdecl _CIcos() CRTDLL__CIcos
@ stub _CIcosh @ cdecl _CIcosh() CRTDLL__CIcosh
@ stub _CIexp @ cdecl _CIexp() CRTDLL__CIexp
@ stub _CIfmod @ cdecl _CIfmod() CRTDLL__CIfmod
@ stub _CIlog @ cdecl _CIlog() CRTDLL__CIlog
@ stub _CIlog10 @ cdecl _CIlog10() CRTDLL__CIlog10
@ forward _CIpow ntdll._CIpow @ forward _CIpow ntdll._CIpow
@ stub _CIsin @ cdecl _CIsin() CRTDLL__CIsin
@ stub _CIsinh @ cdecl _CIsinh() CRTDLL__CIsinh
@ stub _CIsqrt @ cdecl _CIsqrt() CRTDLL__CIsqrt
@ stub _CItan @ cdecl _CItan() CRTDLL__CItan
@ stub _CItanh @ cdecl _CItanh() CRTDLL__CItanh
@ stub _HUGE_dll @ stub _HUGE_dll
@ stub _XcptFilter @ stub _XcptFilter
@ cdecl __GetMainArgs(ptr ptr ptr long) CRTDLL__GetMainArgs @ cdecl __GetMainArgs(ptr ptr ptr long) CRTDLL__GetMainArgs
@ -112,7 +112,7 @@ debug_channels (crtdll)
@ cdecl _flsbuf(long ptr) CRTDLL__flsbuf @ cdecl _flsbuf(long ptr) CRTDLL__flsbuf
@ cdecl _flushall() CRTDLL__flushall @ cdecl _flushall() CRTDLL__flushall
@ extern _fmode_dll CRTDLL_fmode_dll @ extern _fmode_dll CRTDLL_fmode_dll
@ stub _fpclass @ cdecl _fpclass(double) CRTDLL__fpclass
@ stub _fpieee_flt @ stub _fpieee_flt
@ cdecl _fpreset() CRTDLL__fpreset @ cdecl _fpreset() CRTDLL__fpreset
@ cdecl _fputchar(long) CRTDLL__fputchar @ cdecl _fputchar(long) CRTDLL__fputchar
@ -122,7 +122,7 @@ debug_channels (crtdll)
@ cdecl _ftime(ptr) CRTDLL__ftime @ cdecl _ftime(ptr) CRTDLL__ftime
@ forward _ftol ntdll._ftol @ forward _ftol ntdll._ftol
@ cdecl _fullpath(ptr str long) CRTDLL__fullpath @ cdecl _fullpath(ptr str long) CRTDLL__fullpath
@ stub _futime @ cdecl _futime(long ptr) CRTDLL__futime
@ stub _gcvt @ stub _gcvt
@ cdecl _get_osfhandle(long) CRTDLL__get_osfhandle @ cdecl _get_osfhandle(long) CRTDLL__get_osfhandle
@ stub _getch @ stub _getch
@ -133,7 +133,7 @@ debug_channels (crtdll)
@ forward _getdllprocaddr kernel32.GetProcAddress @ forward _getdllprocaddr kernel32.GetProcAddress
@ cdecl _getdrive() CRTDLL__getdrive @ cdecl _getdrive() CRTDLL__getdrive
@ forward _getdrives kernel32.GetLogicalDrives @ forward _getdrives kernel32.GetLogicalDrives
@ stub _getpid @ forward _getpid kernel32.GetCurrentProcessId
@ stub _getsystime @ stub _getsystime
@ stub _getw @ stub _getw
@ cdecl _global_unwind2(ptr) CRTDLL__global_unwind2 @ cdecl _global_unwind2(ptr) CRTDLL__global_unwind2
@ -182,7 +182,7 @@ debug_channels (crtdll)
@ cdecl _loaddll(str) CRTDLL__loaddll @ cdecl _loaddll(str) CRTDLL__loaddll
@ cdecl _local_unwind2(ptr long) CRTDLL__local_unwind2 @ cdecl _local_unwind2(ptr long) CRTDLL__local_unwind2
@ stub _locking @ stub _locking
@ stub _logb @ cdecl _logb(double) logb
@ cdecl _lrotl (long long) CRTDLL__lrotl @ cdecl _lrotl (long long) CRTDLL__lrotl
@ cdecl _lrotr (long long) CRTDLL__lrotr @ cdecl _lrotr (long long) CRTDLL__lrotr
@ cdecl _lsearch(ptr ptr long long ptr) CRTDLL__lsearch @ cdecl _lsearch(ptr ptr long long ptr) CRTDLL__lsearch
@ -244,7 +244,7 @@ debug_channels (crtdll)
@ cdecl _mkdir(str) CRTDLL__mkdir @ cdecl _mkdir(str) CRTDLL__mkdir
@ stub _mktemp @ stub _mktemp
@ cdecl _msize(ptr) CRTDLL__msize @ cdecl _msize(ptr) CRTDLL__msize
@ stub _nextafter @ cdecl _nextafter(double double) 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
@ -258,7 +258,7 @@ debug_channels (crtdll)
@ stub _pgmptr_dll @ stub _pgmptr_dll
@ stub _pipe @ stub _pipe
@ stub _popen @ stub _popen
@ stub _purecall @ cdecl _purecall() CRTDLL__purecall
@ stub _putch @ stub _putch
@ stub _putenv @ stub _putenv
@ stub _putw @ stub _putw
@ -268,7 +268,7 @@ debug_channels (crtdll)
@ stub _rmtmp @ stub _rmtmp
@ cdecl _rotl (long long) CRTDLL__rotl @ cdecl _rotl (long long) CRTDLL__rotl
@ cdecl _rotr (long long) CRTDLL__rotr @ cdecl _rotr (long long) CRTDLL__rotr
@ stub _scalb @ cdecl _scalb (double long) CRTDLL__scalb
@ stub _searchenv @ stub _searchenv
@ stub _seterrormode @ stub _seterrormode
@ cdecl _setjmp (ptr) CRTDLL__setjmp @ cdecl _setjmp (ptr) CRTDLL__setjmp
@ -324,7 +324,7 @@ debug_channels (crtdll)
@ stub _ungetch @ stub _ungetch
@ cdecl _unlink(str) CRTDLL__unlink @ cdecl _unlink(str) CRTDLL__unlink
@ cdecl _unloaddll(long) CRTDLL__unloaddll @ cdecl _unloaddll(long) CRTDLL__unloaddll
@ stub _utime @ cdecl _utime(str ptr) CRTDLL__utime
@ cdecl _vsnprintf(ptr long ptr ptr) vsnprintf @ cdecl _vsnprintf(ptr long ptr ptr) vsnprintf
@ stub _vsnwprintf @ stub _vsnwprintf
@ cdecl _wcsdup(wstr) CRTDLL__wcsdup @ cdecl _wcsdup(wstr) CRTDLL__wcsdup

View File

@ -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) * _GetMainArgs (CRTDLL.022)
@ -211,6 +361,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) * _initterm (CRTDLL.135)
*/ */
@ -325,6 +506,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) * vswprintf (CRTDLL.501)
*/ */
@ -1000,3 +1194,15 @@ INT __cdecl CRTDLL__isnan(double d)
*/ */
return isnan(d)?1:0; return isnan(d)?1:0;
} }
/*********************************************************************
* _purecall (CRTDLL.249)
*
* Abort program after pure virtual function call.
*/
VOID __cdecl CRTDLL__purecall(VOID)
{
CRTDLL__amsg_exit( 6025 );
}

View File

@ -193,7 +193,7 @@ INT __cdecl CRTDLL__access(LPCSTR filename, INT mode)
{ {
DWORD attr = GetFileAttributesA(filename); DWORD attr = GetFileAttributesA(filename);
if (attr == -1) if (attr == 0xffffffff)
{ {
if (!filename) if (!filename)
{ {
@ -502,6 +502,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) * _get_osfhandle (CRTDLL.117)
* *
@ -564,7 +599,7 @@ INT __cdecl CRTDLL__isatty(INT fd)
*/ */
LONG __cdecl CRTDLL__lseek( INT fd, LONG offset, INT whence) LONG __cdecl CRTDLL__lseek( INT fd, LONG offset, INT whence)
{ {
LONG ret; DWORD ret;
HANDLE hand = __CRTDLL__fdtoh(fd); HANDLE hand = __CRTDLL__fdtoh(fd);
TRACE(":fd (%d) handle (%d)\n",fd,hand); TRACE(":fd (%d) handle (%d)\n",fd,hand);
@ -863,6 +898,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) * _unlink (CRTDLL.315)
* *