/* * Helper functions for ntdll * * Copyright 2000 Juergen Schmied * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA */ #include "config.h" #include <time.h> #include <math.h> #ifdef HAVE_SYS_UTSNAME_H #include <sys/utsname.h> #endif #include "wine/library.h" #include "wine/debug.h" #include "ntdll_misc.h" WINE_DEFAULT_DEBUG_CHANNEL(ntdll); #if defined(__GNUC__) && defined(__i386__) #define DO_FPU(x,y) __asm__ __volatile__( x " %0;fwait" : "=m" (y) : ) #define POP_FPU(x) DO_FPU("fstpl",x) #endif void dump_ObjectAttributes (const OBJECT_ATTRIBUTES *oa) { if (oa) TRACE("%p:(name=%s, attr=0x%08x, hRoot=%p, sd=%p)\n", oa, debugstr_us(oa->ObjectName), oa->Attributes, oa->RootDirectory, oa->SecurityDescriptor); } LPCSTR debugstr_us( const UNICODE_STRING *us ) { if (!us) return "<null>"; return debugstr_wn(us->Buffer, us->Length / sizeof(WCHAR)); } /********************************************************************* * _ftol (NTDLL.@) * * VERSION * [GNUC && i386] */ #if defined(__GNUC__) && defined(__i386__) LONGLONG CDECL NTDLL__ftol(void) { /* don't just do DO_FPU("fistp",retval), because the rounding * mode must also be set to "round towards zero"... */ double fl; POP_FPU(fl); return (LONGLONG)fl; } #endif /* defined(__GNUC__) && defined(__i386__) */ /********************************************************************* * _ftol (NTDLL.@) * * FIXME * Should be register function * VERSION * [!GNUC && i386] */ #if !defined(__GNUC__) && defined(__i386__) LONGLONG CDECL NTDLL__ftol(double fl) { FIXME("should be register function\n"); return (LONGLONG)fl; } #endif /* !defined(__GNUC__) && defined(__i386__) */ /********************************************************************* * _ftol (NTDLL.@) * VERSION * [!i386] */ #ifndef __i386__ LONG CDECL NTDLL__ftol(double fl) { return (LONG) fl; } #endif /* !defined(__i386__) */ /********************************************************************* * _CIpow (NTDLL.@) * VERSION * [GNUC && i386] */ #if defined(__GNUC__) && defined(__i386__) double CDECL NTDLL__CIpow(void) { double x,y; POP_FPU(y); POP_FPU(x); return pow(x,y); } #endif /* defined(__GNUC__) && defined(__i386__) */ /********************************************************************* * _CIpow (NTDLL.@) * * FIXME * Should be register function * * VERSION * [!GNUC && i386] */ #if !defined(__GNUC__) && defined(__i386__) double CDECL NTDLL__CIpow(double x,double y) { FIXME("should be register function\n"); return pow(x,y); } #endif /* !defined(__GNUC__) && defined(__i386__) */ /********************************************************************* * _CIpow (NTDLL.@) * VERSION * [!i386] */ #ifndef __i386__ double CDECL NTDLL__CIpow(double x,double y) { return pow(x,y); } #endif /* !defined(__i386__) */ /********************************************************************* * wine_get_version (NTDLL.@) */ const char * CDECL NTDLL_wine_get_version(void) { return wine_get_version(); } /********************************************************************* * wine_get_build_id (NTDLL.@) */ const char * CDECL NTDLL_wine_get_build_id(void) { return wine_get_build_id(); } /********************************************************************* * wine_get_host_version (NTDLL.@) */ void CDECL NTDLL_wine_get_host_version( const char **sysname, const char **release ) { #ifdef HAVE_SYS_UTSNAME_H static struct utsname buf; static int init_done; if (!init_done) { uname( &buf ); init_done = 1; } if (sysname) *sysname = buf.sysname; if (release) *release = buf.release; #else if (sysname) *sysname = ""; if (release) *release = ""; #endif } /********************************************************************* * abs (NTDLL.@) */ int CDECL NTDLL_abs( int i ) { return abs( i ); } /********************************************************************* * labs (NTDLL.@) */ LONG CDECL NTDLL_labs( LONG i ) { return labs( i ); } /********************************************************************* * atan (NTDLL.@) */ double CDECL NTDLL_atan( double d ) { return atan( d ); } /********************************************************************* * ceil (NTDLL.@) */ double CDECL NTDLL_ceil( double d ) { return ceil( d ); } /********************************************************************* * cos (NTDLL.@) */ double CDECL NTDLL_cos( double d ) { return cos( d ); } /********************************************************************* * fabs (NTDLL.@) */ double CDECL NTDLL_fabs( double d ) { return fabs( d ); } /********************************************************************* * floor (NTDLL.@) */ double CDECL NTDLL_floor( double d ) { return floor( d ); } /********************************************************************* * log (NTDLL.@) */ double CDECL NTDLL_log( double d ) { return log( d ); } /********************************************************************* * pow (NTDLL.@) */ double CDECL NTDLL_pow( double x, double y ) { return pow( x, y ); } /********************************************************************* * sin (NTDLL.@) */ double CDECL NTDLL_sin( double d ) { return sin( d ); } /********************************************************************* * sqrt (NTDLL.@) */ double CDECL NTDLL_sqrt( double d ) { return sqrt( d ); } /********************************************************************* * tan (NTDLL.@) */ double CDECL NTDLL_tan( double d ) { return tan( d ); }