mirror of
https://github.com/reactos/reactos.git
synced 2024-12-28 01:55:19 +00:00
Added some float and stdlib functions
svn path=/trunk/; revision=2027
This commit is contained in:
parent
8dacbd3ab0
commit
49ad46d964
26 changed files with 898 additions and 99 deletions
199
reactos/include/msvcrt/float.h
Normal file
199
reactos/include/msvcrt/float.h
Normal file
|
@ -0,0 +1,199 @@
|
|||
/*
|
||||
* float.h
|
||||
*
|
||||
* Constants related to floating point arithmetic.
|
||||
*
|
||||
* Also included here are some non-ANSI bits for accessing the floating
|
||||
* point controller.
|
||||
*
|
||||
* NOTE: GCC provides float.h, and it is probably more accurate than this,
|
||||
* but it doesn't include the non-standard stuff for accessing the
|
||||
* fp controller. (TODO: Move those bits elsewhere?) Thus it is
|
||||
* probably not a good idea to use the GCC supplied version instead
|
||||
* of this header.
|
||||
*
|
||||
* This file is part of the Mingw32 package.
|
||||
*
|
||||
* Contributors:
|
||||
* Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
|
||||
*
|
||||
* THIS SOFTWARE IS NOT COPYRIGHTED
|
||||
*
|
||||
* This source code is offered for use in the public domain. You may
|
||||
* use, modify or distribute it freely.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful but
|
||||
* WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
|
||||
* DISCLAMED. This includes but is not limited to warranties of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Revision: 1.1 $
|
||||
* $Author: ekohl $
|
||||
* $Date: 2001/07/02 21:52:25 $
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _FLOAT_H_
|
||||
#define _FLOAT_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define FLT_ROUNDS 1
|
||||
#define FLT_GUARD 1
|
||||
#define FLT_NORMALIZE 1
|
||||
|
||||
/*
|
||||
* The characteristics of float.
|
||||
*/
|
||||
|
||||
/* The radix for floating point representation. */
|
||||
#define FLT_RADIX 2
|
||||
|
||||
/* Decimal digits of precision. */
|
||||
#define FLT_DIG 6
|
||||
|
||||
/* Smallest number such that 1+x != 1 */
|
||||
#define FLT_EPSILON 1.19209290e-07F
|
||||
|
||||
/* The number of base FLT_RADIX digits in the mantissa. */
|
||||
#define FLT_MANT_DIG 24
|
||||
|
||||
/* The maximum floating point number. */
|
||||
#define FLT_MAX 3.40282347e+38F
|
||||
|
||||
/* Maximum n such that FLT_RADIX^n - 1 is representable. */
|
||||
#define FLT_MAX_EXP 128
|
||||
|
||||
/* Maximum n such that 10^n is representable. */
|
||||
#define FLT_MAX_10_EXP 38
|
||||
|
||||
/* Minimum normalized floating-point number. */
|
||||
#define FLT_MIN 1.17549435e-38F
|
||||
|
||||
/* Minimum n such that FLT_RADIX^n is a normalized number. */
|
||||
#define FLT_MIN_EXP (-125)
|
||||
|
||||
/* Minimum n such that 10^n is a normalized number. */
|
||||
#define FLT_MIN_10_EXP (-37)
|
||||
|
||||
|
||||
/*
|
||||
* The characteristics of double.
|
||||
*/
|
||||
#define DBL_DIG 15
|
||||
#define DBL_EPSILON 1.1102230246251568e-16
|
||||
#define DBL_MANT_DIG 53
|
||||
#define DBL_MAX 1.7976931348623157e+308
|
||||
#define DBL_MAX_EXP 1024
|
||||
#define DBL_MAX_10_EXP 308
|
||||
#define DBL_MIN 2.2250738585072014e-308
|
||||
#define DBL_MIN_EXP (-1021)
|
||||
#define DBL_MIN_10_EXP (-307)
|
||||
|
||||
|
||||
/*
|
||||
* The characteristics of long double.
|
||||
* NOTE: long double is the same as double.
|
||||
*/
|
||||
#define LDBL_DIG 15
|
||||
#define LDBL_EPSILON 1.1102230246251568e-16L
|
||||
#define LDBL_MANT_DIG 53
|
||||
#define LDBL_MAX 1.7976931348623157e+308L
|
||||
#define LDBL_MAX_EXP 1024
|
||||
#define LDBL_MAX_10_EXP 308
|
||||
#define LDBL_MIN 2.2250738585072014e-308L
|
||||
#define LDBL_MIN_EXP (-1021)
|
||||
#define LDBL_MIN_10_EXP (-307)
|
||||
|
||||
|
||||
/*
|
||||
* Functions and definitions for controlling the FPU.
|
||||
*/
|
||||
#ifndef __STRICT_ANSI__
|
||||
|
||||
/* TODO: These constants are only valid for x86 machines */
|
||||
|
||||
/* Control word masks for unMask */
|
||||
#define _MCW_EM 0x0008001F /* Error masks */
|
||||
#define _MCW_IC 0x00040000 /* Infinity */
|
||||
#define _MCW_RC 0x00000300 /* Rounding */
|
||||
#define _MCW_PC 0x00030000 /* Precision */
|
||||
|
||||
/* Control word values for unNew (use with related unMask above) */
|
||||
#define _EM_INVALID 0x00000010
|
||||
#define _EM_DENORMAL 0x00080000
|
||||
#define _EM_ZERODIVIDE 0x00000008
|
||||
#define _EM_OVERFLOW 0x00000004
|
||||
#define _EM_UNDERFLOW 0x00000002
|
||||
#define _EM_INEXACT 0x00000001
|
||||
#define _IC_AFFINE 0x00040000
|
||||
#define _IC_PROJECTIVE 0x00000000
|
||||
#define _RC_CHOP 0x00000300
|
||||
#define _RC_UP 0x00000200
|
||||
#define _RC_DOWN 0x00000100
|
||||
#define _RC_NEAR 0x00000000
|
||||
#define _PC_24 0x00020000
|
||||
#define _PC_53 0x00010000
|
||||
#define _PC_64 0x00000000
|
||||
|
||||
|
||||
/* Set the FPU control word as cw = (cw & ~unMask) | (unNew & unMask),
|
||||
* i.e. change the bits in unMask to have the values they have in unNew,
|
||||
* leaving other bits unchanged. */
|
||||
unsigned int _controlfp (unsigned int unNew, unsigned int unMask);
|
||||
unsigned int _control87 (unsigned int unNew, unsigned int unMask);
|
||||
|
||||
|
||||
unsigned int _clearfp (void); /* Clear the FPU status word */
|
||||
unsigned int _statusfp (void); /* Report the FPU status word */
|
||||
#define _clear87 _clearfp
|
||||
#define _status87 _statusfp
|
||||
|
||||
void _fpreset (void); /* Reset the FPU */
|
||||
|
||||
/* Global 'variable' for the current floating point error code. */
|
||||
extern int * __fpecode(void);
|
||||
#define _fpecode (*(__fpecode()))
|
||||
|
||||
/*
|
||||
* IEEE recommended functions
|
||||
*/
|
||||
|
||||
double _chgsign (double x);
|
||||
double _copysign (double dTo, double dFrom);
|
||||
double _logb (double x);
|
||||
double _nextafter (double x, double y);
|
||||
double _scalb (double x, long n);
|
||||
|
||||
/* Return values for fpclass. */
|
||||
#define _FPCLASS_SNAN 0x0001 /* Signaling "Not a Number" */
|
||||
#define _FPCLASS_QNAN 0x0002 /* Quiet "Not a Number" */
|
||||
#define _FPCLASS_NINF 0x0004 /* Negative Infinity */
|
||||
#define _FPCLASS_NN 0x0008 /* Negative Normal */
|
||||
#define _FPCLASS_ND 0x0010 /* Negative Denormal */
|
||||
#define _FPCLASS_NZ 0x0020 /* Negative Zero */
|
||||
#define _FPCLASS_PZ 0x0040 /* Positive Zero */
|
||||
#define _FPCLASS_PD 0x0080 /* Positive Denormal */
|
||||
#define _FPCLASS_PN 0x0100 /* Positive Normal */
|
||||
#define _FPCLASS_PINF 0x0200 /* Positive Infinity */
|
||||
|
||||
int _finite (double x);
|
||||
int _fpclass (double x);
|
||||
int _isnan (double x);
|
||||
int _isinf (double x); // not exported
|
||||
|
||||
int _isnanl (long double x); // not exported
|
||||
int _isinfl (long double x); // not exported
|
||||
|
||||
#define isnan(x) _isnan(x)
|
||||
#define isinf(x) _isinf(x)
|
||||
|
||||
#endif /* Not __STRICT_ANSI__ */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* _FLOAT_H_ */
|
27
reactos/include/msvcrt/internal/ieee.h
Normal file
27
reactos/include/msvcrt/internal/ieee.h
Normal file
|
@ -0,0 +1,27 @@
|
|||
#ifndef _IEEE_H
|
||||
#define _IEEE_H
|
||||
|
||||
typedef struct {
|
||||
unsigned int mantissa:23;
|
||||
unsigned int exponent:8;
|
||||
unsigned int sign:1;
|
||||
} float_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned int mantissal:32;
|
||||
unsigned int mantissah:20;
|
||||
unsigned int exponent:11;
|
||||
unsigned int sign:1;
|
||||
} double_t;
|
||||
|
||||
typedef struct {
|
||||
unsigned int mantissal:32;
|
||||
unsigned int mantissah:32;
|
||||
unsigned int exponent:15;
|
||||
unsigned int sign:1;
|
||||
unsigned int empty:16;
|
||||
} long_double_t;
|
||||
|
||||
|
||||
|
||||
#endif
|
|
@ -7,12 +7,16 @@
|
|||
|
||||
typedef struct _ThreadData
|
||||
{
|
||||
int terrno;
|
||||
unsigned long tdoserrno;
|
||||
unsigned long long tnext; /* used by rand/srand */
|
||||
int terrno;
|
||||
unsigned long tdoserrno;
|
||||
unsigned long long tnext; /* used by rand/srand */
|
||||
|
||||
char *lasttoken; /* used by strtok */
|
||||
wchar_t *wlasttoken; /* used by wcstok */
|
||||
|
||||
|
||||
int fpecode; /* fp exception code */
|
||||
|
||||
char *lasttoken; /* used by strtok */
|
||||
wchar_t *wlasttoken; /* used by wcstok */
|
||||
|
||||
} THREADDATA, *PTHREADDATA;
|
||||
|
||||
|
|
161
reactos/include/msvcrt/math.h
Normal file
161
reactos/include/msvcrt/math.h
Normal file
|
@ -0,0 +1,161 @@
|
|||
/*
|
||||
* math.h
|
||||
*
|
||||
* Mathematical functions.
|
||||
*
|
||||
* This file is part of the Mingw32 package.
|
||||
*
|
||||
* Contributors:
|
||||
* Created by Colin Peters <colin@bird.fu.is.saga-u.ac.jp>
|
||||
*
|
||||
* THIS SOFTWARE IS NOT COPYRIGHTED
|
||||
*
|
||||
* This source code is offered for use in the public domain. You may
|
||||
* use, modify or distribute it freely.
|
||||
*
|
||||
* This code is distributed in the hope that it will be useful but
|
||||
* WITHOUT ANY WARRANTY. ALL WARRANTIES, EXPRESS OR IMPLIED ARE HEREBY
|
||||
* DISCLAMED. This includes but is not limited to warranties of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Revision: 1.1 $
|
||||
* $Author: ekohl $
|
||||
* $Date: 2001/07/02 21:52:25 $
|
||||
*
|
||||
*/
|
||||
// added modfl
|
||||
|
||||
#ifndef _MATH_H_
|
||||
#define _MATH_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/*
|
||||
* HUGE_VAL is returned by strtod when the value would overflow the
|
||||
* representation of 'double'. There are other uses as well.
|
||||
*
|
||||
* __imp__HUGE is a pointer to the actual variable _HUGE in
|
||||
* MSVCRT.DLL. If we used _HUGE directly we would get a pointer
|
||||
* to a thunk function.
|
||||
*
|
||||
* NOTE: The CRTDLL version uses _HUGE_dll instead.
|
||||
*/
|
||||
#if __MSVCRT__
|
||||
extern double* __imp__HUGE;
|
||||
#define HUGE_VAL (*__imp__HUGE)
|
||||
#else
|
||||
/* CRTDLL */
|
||||
extern double* _HUGE_dll;
|
||||
#define HUGE_VAL (*_HUGE_dll)
|
||||
#endif
|
||||
|
||||
|
||||
struct _exception
|
||||
{
|
||||
int type;
|
||||
char *name;
|
||||
double arg1;
|
||||
double arg2;
|
||||
double retval;
|
||||
};
|
||||
|
||||
/*
|
||||
* Types for the above _exception structure.
|
||||
*/
|
||||
|
||||
#define _DOMAIN 1 /* domain error in argument */
|
||||
#define _SING 2 /* singularity */
|
||||
#define _OVERFLOW 3 /* range overflow */
|
||||
#define _UNDERFLOW 4 /* range underflow */
|
||||
#define _TLOSS 5 /* total loss of precision */
|
||||
#define _PLOSS 6 /* partial loss of precision */
|
||||
|
||||
/*
|
||||
* Exception types with non-ANSI names for compatibility.
|
||||
*/
|
||||
|
||||
#ifndef __STRICT_ANSI__
|
||||
#ifndef _NO_OLDNAMES
|
||||
|
||||
#define DOMAIN _DOMAIN
|
||||
#define SING _SING
|
||||
#define OVERFLOW _OVERFLOW
|
||||
#define UNDERFLOW _UNDERFLOW
|
||||
#define TLOSS _TLOSS
|
||||
#define PLOSS _PLOSS
|
||||
|
||||
#endif /* Not _NO_OLDNAMES */
|
||||
#endif /* Not __STRICT_ANSI__ */
|
||||
|
||||
|
||||
double sin (double x);
|
||||
double cos (double x);
|
||||
double tan (double x);
|
||||
double sinh (double x);
|
||||
double cosh (double x);
|
||||
double tanh (double x);
|
||||
double asin (double x);
|
||||
double acos (double x);
|
||||
double atan (double x);
|
||||
double atan2 (double y, double x);
|
||||
double exp (double x);
|
||||
double log (double x);
|
||||
double log10 (double x);
|
||||
double pow (double x, double y);
|
||||
long double powl (long double x,long double y);
|
||||
double sqrt (double x);
|
||||
double ceil (double x);
|
||||
double floor (double x);
|
||||
double fabs (double x);
|
||||
double ldexp (double x, int n);
|
||||
double frexp (double x, int* exp);
|
||||
double modf (double x, double* ip);
|
||||
long double modfl (long double x,long double* ip);
|
||||
double fmod (double x, double y);
|
||||
|
||||
|
||||
#ifndef __STRICT_ANSI__
|
||||
|
||||
/* Complex number (for cabs) */
|
||||
struct _complex
|
||||
{
|
||||
double x; /* Real part */
|
||||
double y; /* Imaginary part */
|
||||
};
|
||||
|
||||
double _cabs (struct _complex x);
|
||||
double _hypot (double x, double y);
|
||||
double _j0 (double x);
|
||||
double _j1 (double x);
|
||||
double _jn (int n, double x);
|
||||
double _y0 (double x);
|
||||
double _y1 (double x);
|
||||
double _yn (int n, double x);
|
||||
|
||||
#ifndef _NO_OLDNAMES
|
||||
|
||||
/*
|
||||
* Non-underscored versions of non-ANSI functions. These reside in
|
||||
* liboldnames.a. Provided for extra portability.
|
||||
*/
|
||||
double cabs (struct _complex x);
|
||||
double hypot (double x, double y);
|
||||
double j0 (double x);
|
||||
double j1 (double x);
|
||||
double jn (int n, double x);
|
||||
double y0 (double x);
|
||||
double y1 (double x);
|
||||
double yn (int n, double x);
|
||||
|
||||
#endif /* Not _NO_OLDNAMES */
|
||||
|
||||
#endif /* Not __STRICT_ANSI__ */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* Not _MATH_H_ */
|
||||
|
|
@ -18,9 +18,9 @@
|
|||
* DISCLAMED. This includes but is not limited to warranties of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* $Revision: 1.1 $
|
||||
* $Revision: 1.2 $
|
||||
* $Author: ekohl $
|
||||
* $Date: 2000/12/03 17:49:21 $
|
||||
* $Date: 2001/07/02 21:52:25 $
|
||||
*
|
||||
*/
|
||||
/* Appropriated for Reactos Crtdll by Ariadne */
|
||||
|
@ -55,9 +55,12 @@ extern char*** _environ_dll;
|
|||
|
||||
#include <msvcrt/mbstring.h>
|
||||
|
||||
#ifndef __ATTRIB_NORETURN
|
||||
#ifndef __ATTRIB_NORETURN
|
||||
#ifdef __GNUC__
|
||||
#define _ATTRIB_NORETURN __attribute__ ((noreturn))
|
||||
#ifndef __int64
|
||||
#define __int64 long long
|
||||
#endif /* Not __int64 */
|
||||
#else /* Not __GNUC__ */
|
||||
#define _ATTRIB_NORETURN
|
||||
#endif /* __GNUC__ */
|
||||
|
@ -168,12 +171,16 @@ char* _fullpath( char* caBuf, const char* szPath, size_t sizeMax );
|
|||
wchar_t *_wfullpath( wchar_t *absPath, const wchar_t *relPath, size_t maxLength );
|
||||
|
||||
char* _itoa (int nValue, char* sz, int nRadix);
|
||||
char* _i64toa(__int64 value, char *string, int radix);
|
||||
char* _ltoa (long lnValue, char* sz, int nRadix);
|
||||
char* _ultoa(unsigned long value, char *string, int radix);
|
||||
char* _ui64toa(unsigned __int64 value, char *string, int radix);
|
||||
|
||||
wchar_t* _itow (int nValue, wchar_t* sz, int nRadix);
|
||||
wchar_t* _i64tow(__int64 value, wchar_t *string, int radix);
|
||||
wchar_t* _ltow (long lnValue, wchar_t* sz, int nRadix);
|
||||
wchar_t* _ultow(unsigned long value, wchar_t *string, int radix);
|
||||
wchar_t* _ui64tow(unsigned __int64 value, wchar_t *string, int radix);
|
||||
|
||||
char* _ecvt (double dValue, int nDig, int* pnDec, int* pnSign);
|
||||
char* _fcvt (double dValue, int nDig, int* pnDec, int* pnSign);
|
||||
|
@ -186,7 +193,10 @@ unsigned int _rotr( unsigned int value, int shift );
|
|||
unsigned long _lrotl( unsigned long value, int shift );
|
||||
unsigned long _lrotr( unsigned long value, int shift );
|
||||
|
||||
__int64 _atoi64(const char *szNumber);
|
||||
|
||||
int _wtoi( const wchar_t *str );
|
||||
__int64 _wtoi64(const wchar_t *str);
|
||||
long _wtol( const wchar_t *str );
|
||||
|
||||
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# $Id: Makefile,v 1.11 2001/04/10 19:20:37 ekohl Exp $
|
||||
# $Id: Makefile,v 1.12 2001/07/02 21:51:18 ekohl Exp $
|
||||
#
|
||||
# ReactOS Operating System
|
||||
#
|
||||
|
@ -50,9 +50,18 @@ OBJECTS_EXCEPT = \
|
|||
except/xcptfil.o
|
||||
|
||||
OBJECTS_FLOAT = \
|
||||
float/chgsign.o \
|
||||
float/clearfp.o \
|
||||
float/cntrlfp.o \
|
||||
float/copysign.o \
|
||||
float/fpclass.o \
|
||||
float/fpecode.o \
|
||||
float/fpreset.o \
|
||||
float/isnan.o
|
||||
float/isnan.o \
|
||||
float/logb.o \
|
||||
float/nafter.o \
|
||||
float/scalb.o \
|
||||
float/statfp.o
|
||||
|
||||
OBJECTS_IO = \
|
||||
io/access.o \
|
||||
|
@ -131,6 +140,7 @@ OBJECTS_STDLIB = \
|
|||
stdlib/atexit.o \
|
||||
stdlib/atof.o \
|
||||
stdlib/atoi.o \
|
||||
stdlib/atoi64.o \
|
||||
stdlib/atol.o \
|
||||
stdlib/bsearch.o \
|
||||
stdlib/div.o \
|
||||
|
@ -157,7 +167,8 @@ OBJECTS_STDLIB = \
|
|||
stdlib/wcstod.o \
|
||||
stdlib/wcstol.o \
|
||||
stdlib/wcstoul.o \
|
||||
stdlib/wtoi.o
|
||||
stdlib/wtoi.o \
|
||||
stdlib/wtoi64.o
|
||||
|
||||
OBJECTS_STRING = \
|
||||
string/memccpy.o \
|
||||
|
|
13
reactos/lib/msvcrt/float/chgsign.c
Normal file
13
reactos/lib/msvcrt/float/chgsign.c
Normal file
|
@ -0,0 +1,13 @@
|
|||
#include <msvcrt/float.h>
|
||||
#include <msvcrt/internal/ieee.h>
|
||||
|
||||
double _chgsign( double __x )
|
||||
{
|
||||
double_t *x = (double_t *)&x;
|
||||
if ( x->sign == 1 )
|
||||
x->sign = 0;
|
||||
else
|
||||
x->sign = 1;
|
||||
|
||||
return __x;
|
||||
}
|
13
reactos/lib/msvcrt/float/clearfp.c
Normal file
13
reactos/lib/msvcrt/float/clearfp.c
Normal file
|
@ -0,0 +1,13 @@
|
|||
#include <msvcrt/float.h>
|
||||
|
||||
unsigned int _clearfp (void)
|
||||
{
|
||||
unsigned short __res = _statusfp();
|
||||
|
||||
__asm__ __volatile__ (
|
||||
"fclex \n\t"
|
||||
);
|
||||
|
||||
return __res;
|
||||
}
|
||||
|
|
@ -1,16 +1,16 @@
|
|||
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
|
||||
|
||||
#include <crtdll/float.h>
|
||||
#include <msvcrt/float.h>
|
||||
|
||||
unsigned int _controlfp (unsigned int unNew, unsigned int unMask)
|
||||
{
|
||||
return _control87(unNew,unMask);
|
||||
unsigned int _controlfp(unsigned int unNew, unsigned int unMask)
|
||||
{
|
||||
return _control87(unNew,unMask);
|
||||
}
|
||||
|
||||
unsigned int _control87 (unsigned int unNew, unsigned int unMask)
|
||||
{
|
||||
|
||||
unsigned int _control87(unsigned int unNew, unsigned int unMask)
|
||||
{
|
||||
register unsigned int __res;
|
||||
|
||||
__asm__ __volatile__ (
|
||||
"pushl %%eax \n\t" /* make room on stack */
|
||||
"fstcw (%%esp) \n\t"
|
||||
|
@ -30,9 +30,7 @@ __asm__ __volatile__ (
|
|||
"fldcw (%%esp) \n\t"
|
||||
"popl %%edx \n\t"
|
||||
|
||||
|
||||
:"=r" (__res):"r" (unNew),"r" (unMask): "ax", "dx", "cx");
|
||||
/* :"=a" (__res):"c" (unNew),"d" (unMask):"ax", "dx", "cx"); */
|
||||
|
||||
return __res;
|
||||
}
|
||||
|
|
12
reactos/lib/msvcrt/float/copysign.c
Normal file
12
reactos/lib/msvcrt/float/copysign.c
Normal file
|
@ -0,0 +1,12 @@
|
|||
#include <msvcrt/float.h>
|
||||
#include <msvcrt/internal/ieee.h>
|
||||
|
||||
double _copysign (double __d, double __s)
|
||||
{
|
||||
double_t *d = (double_t *)&__d;
|
||||
double_t *s = (double_t *)&__s;
|
||||
|
||||
d->sign = s->sign;
|
||||
|
||||
return __d;
|
||||
}
|
65
reactos/lib/msvcrt/float/fpclass.c
Normal file
65
reactos/lib/msvcrt/float/fpclass.c
Normal file
|
@ -0,0 +1,65 @@
|
|||
#include <msvcrt/float.h>
|
||||
#include <msvcrt/math.h>
|
||||
#include <msvcrt/internal/ieee.h>
|
||||
|
||||
#define _FPCLASS_SNAN 0x0001 /* signaling NaN */
|
||||
#define _FPCLASS_QNAN 0x0002 /* quiet NaN */
|
||||
#define _FPCLASS_NINF 0x0004 /* negative infinity */
|
||||
#define _FPCLASS_NN 0x0008 /* negative normal */
|
||||
#define _FPCLASS_ND 0x0010 /* negative denormal */
|
||||
#define _FPCLASS_NZ 0x0020 /* -0 */
|
||||
#define _FPCLASS_PZ 0x0040 /* +0 */
|
||||
#define _FPCLASS_PD 0x0080 /* positive denormal */
|
||||
#define _FPCLASS_PN 0x0100 /* positive normal */
|
||||
#define _FPCLASS_PINF 0x0200 /* positive infinity */
|
||||
|
||||
#define FP_SNAN 0x0001 // signaling NaN
|
||||
#define FP_QNAN 0x0002 // quiet NaN
|
||||
#define FP_NINF 0x0004 // negative infinity
|
||||
#define FP_PINF 0x0200 // positive infinity
|
||||
#define FP_NDENORM 0x0008 // negative denormalized non-zero
|
||||
#define FP_PDENORM 0x0010 // positive denormalized non-zero
|
||||
#define FP_NZERO 0x0020 // negative zero
|
||||
#define FP_PZERO 0x0040 // positive zero
|
||||
#define FP_NNORM 0x0080 // negative normalized non-zero
|
||||
#define FP_PNORM 0x0100 // positive normalized non-zero
|
||||
|
||||
typedef int fpclass_t;
|
||||
|
||||
fpclass_t _fpclass(double __d)
|
||||
{
|
||||
double_t *d = (double_t *)&__d;
|
||||
|
||||
if ( d->exponent == 0 ) {
|
||||
if ( d->mantissah == 0 && d->mantissal == 0 ) {
|
||||
if ( d->sign ==0 )
|
||||
return FP_NZERO;
|
||||
else
|
||||
return FP_PZERO;
|
||||
} else {
|
||||
if ( d->sign ==0 )
|
||||
return FP_NDENORM;
|
||||
else
|
||||
return FP_PDENORM;
|
||||
}
|
||||
}
|
||||
if (d->exponent == 0x7ff ) {
|
||||
if ( d->mantissah == 0 && d->mantissal == 0 ) {
|
||||
if ( d->sign ==0 )
|
||||
return FP_NINF;
|
||||
else
|
||||
return FP_PINF;
|
||||
}
|
||||
else if ( d->mantissah == 0 && d->mantissal != 0 ) {
|
||||
return FP_QNAN;
|
||||
}
|
||||
else if ( d->mantissah == 0 && d->mantissal != 0 ) {
|
||||
return FP_SNAN;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
7
reactos/lib/msvcrt/float/fpecode.c
Normal file
7
reactos/lib/msvcrt/float/fpecode.c
Normal file
|
@ -0,0 +1,7 @@
|
|||
#include <msvcrt/float.h>
|
||||
#include <msvcrt/internal/tls.h>
|
||||
|
||||
int * __fpecode(void)
|
||||
{
|
||||
return(&(GetThreadData()->fpecode));
|
||||
}
|
|
@ -1,8 +1,8 @@
|
|||
#include <crtdll/float.h>
|
||||
#include <msvcrt/float.h>
|
||||
|
||||
void _fpreset (void)
|
||||
void _fpreset(void)
|
||||
{
|
||||
/* FIXME: This causes an exception */
|
||||
/* FIXME: This causes an exception */
|
||||
// __asm__ __volatile__("fninit\n\t");
|
||||
return;
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -16,9 +16,9 @@ License along with the GNU C Library; see the file COPYING.LIB. If
|
|||
not, write to the Free Software Foundation, Inc., 675 Mass Ave,
|
||||
Cambridge, MA 02139, USA. */
|
||||
|
||||
#include <crtdll/math.h>
|
||||
#include <crtdll/float.h>
|
||||
#include <crtdll/internal/ieee.h>
|
||||
#include <msvcrt/math.h>
|
||||
#include <msvcrt/float.h>
|
||||
#include <msvcrt/internal/ieee.h>
|
||||
|
||||
int _isnan(double __x)
|
||||
{
|
||||
|
|
31
reactos/lib/msvcrt/float/logb.c
Normal file
31
reactos/lib/msvcrt/float/logb.c
Normal file
|
@ -0,0 +1,31 @@
|
|||
/* Math functions for i387.
|
||||
Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
|
||||
This file is part of the GNU C Library.
|
||||
Contributed by John C. Bowman <bowman@ipp-garching.mpg.de>, 1995.
|
||||
|
||||
The GNU C Library is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU Library General Public License as
|
||||
published by the Free Software Foundation; either version 2 of the
|
||||
License, or (at your option) any later version.
|
||||
|
||||
The GNU C 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
|
||||
Library General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Library General Public
|
||||
License along with the GNU C Library; see the file COPYING.LIB. If not,
|
||||
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
#include <msvcrt/float.h>
|
||||
|
||||
double _logb (double __x)
|
||||
{
|
||||
register double __value, __junk;
|
||||
__asm __volatile__
|
||||
("fxtract\n\t"
|
||||
: "=t" (__junk), "=u" (__value) : "0" (__x));
|
||||
|
||||
return __value;
|
||||
}
|
12
reactos/lib/msvcrt/float/nafter.c
Normal file
12
reactos/lib/msvcrt/float/nafter.c
Normal file
|
@ -0,0 +1,12 @@
|
|||
#include <msvcrt/float.h>
|
||||
|
||||
double _nextafter( double x, double y )
|
||||
{
|
||||
if ( x == y)
|
||||
return x;
|
||||
|
||||
if ( isnan(x) || isnan(y) )
|
||||
return x;
|
||||
|
||||
return x;
|
||||
}
|
11
reactos/lib/msvcrt/float/scalb.c
Normal file
11
reactos/lib/msvcrt/float/scalb.c
Normal file
|
@ -0,0 +1,11 @@
|
|||
#include <msvcrt/float.h>
|
||||
#include <msvcrt/internal/ieee.h>
|
||||
|
||||
double _scalb( double __x, long e )
|
||||
{
|
||||
double_t *x = (double_t *)&__x;
|
||||
|
||||
x->exponent += e;
|
||||
|
||||
return __x;
|
||||
}
|
14
reactos/lib/msvcrt/float/statfp.c
Normal file
14
reactos/lib/msvcrt/float/statfp.c
Normal file
|
@ -0,0 +1,14 @@
|
|||
#include <msvcrt/float.h>
|
||||
|
||||
unsigned int _statusfp (void)
|
||||
{
|
||||
|
||||
register unsigned short __res;
|
||||
|
||||
__asm__ __volatile__ (
|
||||
"fstsw %0 \n\t"
|
||||
// "movzwl %ax, %eax"
|
||||
:"=a" (__res)
|
||||
);
|
||||
return __res;
|
||||
}
|
|
@ -10,9 +10,9 @@
|
|||
* ====================================================
|
||||
*/
|
||||
|
||||
#include <crtdll/float.h>
|
||||
#include <crtdll/math.h>
|
||||
#include <crtdll/internal/ieee.h>
|
||||
#include <msvcrt/float.h>
|
||||
#include <msvcrt/math.h>
|
||||
#include <msvcrt/internal/ieee.h>
|
||||
|
||||
|
||||
|
||||
|
@ -20,7 +20,6 @@
|
|||
|
||||
double modf(double __x, double *__i)
|
||||
{
|
||||
|
||||
double_t * x = (double_t *)&__x;
|
||||
double_t * iptr = ( double_t *)__i;
|
||||
|
||||
|
@ -39,7 +38,7 @@ double modf(double __x, double *__i)
|
|||
return 0.0;
|
||||
}
|
||||
|
||||
i = (0x000fffff)>>j0;
|
||||
i = (0x000fffff)>>j0;
|
||||
iptr->sign = x->sign;
|
||||
iptr->exponent = x->exponent;
|
||||
iptr->mantissah = x->mantissah&(~i);
|
||||
|
@ -48,48 +47,43 @@ double modf(double __x, double *__i)
|
|||
__x = 0.0;
|
||||
x->sign = iptr->sign;
|
||||
return __x;
|
||||
}
|
||||
return __x - *__i;
|
||||
}
|
||||
return __x - *__i;
|
||||
}
|
||||
} else if (j0>51) { /* no fraction part */
|
||||
*__i = __x;
|
||||
if ( _isnan(__x) || _isinf(__x) )
|
||||
return __x;
|
||||
|
||||
|
||||
*__i = __x;
|
||||
if ( _isnan(__x) || _isinf(__x) )
|
||||
return __x;
|
||||
|
||||
__x = 0.0;
|
||||
x->sign = iptr->sign;
|
||||
return __x;
|
||||
} else { /* fraction part in low x */
|
||||
|
||||
i = ((unsigned)(0xffffffff))>>(j0-20);
|
||||
iptr->sign = x->sign;
|
||||
iptr->exponent = x->exponent;
|
||||
iptr->mantissah = x->mantissah;
|
||||
iptr->mantissal = x->mantissal&(~i);
|
||||
if ( __x == *__i ) {
|
||||
__x = 0.0;
|
||||
x->sign = iptr->sign;
|
||||
return __x;
|
||||
} else { /* fraction part in low x */
|
||||
|
||||
|
||||
i = ((unsigned)(0xffffffff))>>(j0-20);
|
||||
iptr->sign = x->sign;
|
||||
iptr->exponent = x->exponent;
|
||||
iptr->mantissah = x->mantissah;
|
||||
iptr->mantissal = x->mantissal&(~i);
|
||||
if ( __x == *__i ) {
|
||||
__x = 0.0;
|
||||
x->sign = iptr->sign;
|
||||
return __x;
|
||||
}
|
||||
return __x - *__i;
|
||||
}
|
||||
return __x - *__i;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
long double modfl(long double __x, long double *__i)
|
||||
{
|
||||
|
||||
|
||||
long_double_t * x = (long_double_t *)&__x;
|
||||
long_double_t * iptr = (long_double_t *)__i;
|
||||
|
||||
int j0;
|
||||
unsigned int i;
|
||||
j0 = x->exponent - 0x3fff; /* exponent of x */
|
||||
|
||||
|
||||
|
||||
if(j0<32) { /* integer part in high x */
|
||||
if(j0<0) { /* |x|<1 */
|
||||
*__i = 0.0L;
|
||||
|
@ -97,7 +91,7 @@ long double modfl(long double __x, long double *__i)
|
|||
return __x;
|
||||
} else {
|
||||
|
||||
i = ((unsigned int)(0xffffffff))>>(j0+1);
|
||||
i = ((unsigned int)(0xffffffff))>>(j0+1);
|
||||
if ( x->mantissal == 0 && (x->mantissal & i) == 0 ) {
|
||||
*__i = __x;
|
||||
__x = 0.0L;
|
||||
|
@ -106,36 +100,33 @@ long double modfl(long double __x, long double *__i)
|
|||
}
|
||||
iptr->sign = x->sign;
|
||||
iptr->exponent = x->exponent;
|
||||
iptr->mantissah = x->mantissah&((~i));
|
||||
iptr->mantissah = x->mantissah&((~i));
|
||||
iptr->mantissal = 0;
|
||||
|
||||
|
||||
return __x - *__i;
|
||||
return __x - *__i;
|
||||
}
|
||||
} else if (j0>63) { /* no fraction part */
|
||||
*__i = __x;
|
||||
if ( _isnanl(__x) || _isinfl(__x) )
|
||||
return __x;
|
||||
|
||||
*__i = __x;
|
||||
if ( _isnanl(__x) || _isinfl(__x) )
|
||||
return __x;
|
||||
|
||||
__x = 0.0L;
|
||||
x->sign = iptr->sign;
|
||||
return __x;
|
||||
} else { /* fraction part in low x */
|
||||
|
||||
i = ((unsigned int)(0xffffffff))>>(j0-32);
|
||||
if ( x->mantissal == 0 ) {
|
||||
*__i = __x;
|
||||
__x = 0.0L;
|
||||
x->sign = iptr->sign;
|
||||
return __x;
|
||||
} else { /* fraction part in low x */
|
||||
|
||||
i = ((unsigned int)(0xffffffff))>>(j0-32);
|
||||
if ( x->mantissal == 0 ) {
|
||||
*__i = __x;
|
||||
__x = 0.0L;
|
||||
x->sign = iptr->sign;
|
||||
return __x;
|
||||
}
|
||||
iptr->sign = x->sign;
|
||||
iptr->exponent = x->exponent;
|
||||
iptr->mantissah = x->mantissah;
|
||||
iptr->mantissal = x->mantissal&(~i);
|
||||
}
|
||||
iptr->sign = x->sign;
|
||||
iptr->exponent = x->exponent;
|
||||
iptr->mantissah = x->mantissah;
|
||||
iptr->mantissal = x->mantissal&(~i);
|
||||
|
||||
return __x - *__i;
|
||||
|
||||
|
||||
return __x - *__i;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -78,6 +78,7 @@ double pow (double __x, double __y)
|
|||
return __value;
|
||||
}
|
||||
|
||||
|
||||
long double powl (long double __x,long double __y)
|
||||
{
|
||||
return pow(__x,__y/2)*pow(__x,__y/2);
|
||||
|
|
|
@ -13,6 +13,8 @@ static void InitThreadData(PTHREADDATA ThreadData)
|
|||
// ThreadData->terrno = 0;
|
||||
// ThreadData->tdoserrno = 0;
|
||||
|
||||
ThreadData->fpecode = 0;
|
||||
|
||||
/* FIXME: init more thread local data */
|
||||
|
||||
}
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
; $Id: msvcrt.def,v 1.6 2001/04/10 19:20:37 ekohl Exp $
|
||||
; $Id: msvcrt.def,v 1.7 2001/07/02 21:51:18 ekohl Exp $
|
||||
;
|
||||
; ReactOS MSVCRT Compatibility Library
|
||||
;
|
||||
|
@ -97,7 +97,7 @@ __argv
|
|||
; __crtLCMapStringA
|
||||
__dllonexit
|
||||
; __doserrno
|
||||
; __fpecode
|
||||
__fpecode
|
||||
__getmainargs
|
||||
; __initenv
|
||||
__isascii
|
||||
|
@ -172,7 +172,7 @@ _aexit_rtn
|
|||
_amsg_exit
|
||||
_assert
|
||||
; _atodbl
|
||||
; _atoi64
|
||||
_atoi64
|
||||
; _atoldbl
|
||||
_beep
|
||||
_beginthread
|
||||
|
@ -184,17 +184,17 @@ _cexit
|
|||
; _cgets
|
||||
_chdir
|
||||
_chdrive
|
||||
; _chgsign
|
||||
_chgsign
|
||||
; _chkesp
|
||||
; _chmod
|
||||
; _chsize
|
||||
; _clearfp
|
||||
_clearfp
|
||||
_close
|
||||
_commit
|
||||
_commode DATA
|
||||
_control87
|
||||
_controlfp
|
||||
; _copysign
|
||||
_copysign
|
||||
; _cprintf
|
||||
; _cputs
|
||||
; _creat
|
||||
|
@ -242,7 +242,7 @@ _finite
|
|||
_flsbuf
|
||||
_flushall
|
||||
_fmode DATA
|
||||
; _fpclass
|
||||
_fpclass
|
||||
_fpieee_flt
|
||||
_fpreset
|
||||
; _fputchar
|
||||
|
@ -279,8 +279,8 @@ _global_unwind2
|
|||
; _heapused
|
||||
; _heapwalk
|
||||
; _hypot
|
||||
; _i64toa
|
||||
; _i64tow
|
||||
_i64toa
|
||||
_i64tow
|
||||
_initterm
|
||||
; _inp
|
||||
; _inpd
|
||||
|
@ -329,7 +329,7 @@ _loaddll
|
|||
_local_unwind2
|
||||
; _lock
|
||||
; _locking
|
||||
; _logb
|
||||
_logb
|
||||
; _longjmpex
|
||||
_lrotl
|
||||
_lrotr
|
||||
|
@ -399,7 +399,7 @@ _memicmp
|
|||
_mkdir
|
||||
_mktemp
|
||||
; _msize
|
||||
; _nextafter
|
||||
_nextafter
|
||||
_onexit
|
||||
_open
|
||||
_open_osfhandle
|
||||
|
@ -427,7 +427,7 @@ _rotr
|
|||
; _safe_fdivr
|
||||
; _safe_fprem
|
||||
; _safe_fprem1
|
||||
; _scalb
|
||||
_scalb
|
||||
_searchenv
|
||||
; _seh_longjmp_unwind
|
||||
; _set_error_mode
|
||||
|
@ -454,7 +454,7 @@ _snwprintf
|
|||
_splitpath
|
||||
_stat
|
||||
; _stati64
|
||||
; _statusfp
|
||||
_statusfp
|
||||
_strcmpi
|
||||
; _strdate
|
||||
_strdup
|
||||
|
@ -481,8 +481,8 @@ _tolower
|
|||
_toupper
|
||||
; _tzname
|
||||
_tzset
|
||||
; _ui64toa
|
||||
; _ui64tow
|
||||
_ui64toa
|
||||
_ui64tow
|
||||
_ultoa
|
||||
_ultow
|
||||
; _umask
|
||||
|
@ -567,7 +567,7 @@ _wsplitpath
|
|||
; _wtempnam
|
||||
; _wtmpnam
|
||||
_wtoi
|
||||
; _wtoi64
|
||||
_wtoi64
|
||||
_wtol
|
||||
; _wunlink
|
||||
; _wutime
|
||||
|
|
31
reactos/lib/msvcrt/stdlib/atoi64.c
Normal file
31
reactos/lib/msvcrt/stdlib/atoi64.c
Normal file
|
@ -0,0 +1,31 @@
|
|||
|
||||
#include <msvcrt/ctype.h>
|
||||
#include <msvcrt/stdlib.h>
|
||||
|
||||
__int64
|
||||
_atoi64(const char *nptr)
|
||||
{
|
||||
char *s = (char *)nptr;
|
||||
__int64 acc = 0;
|
||||
int neg = 0;
|
||||
|
||||
while(isspace((int)*s))
|
||||
s++;
|
||||
if (*s == '-')
|
||||
{
|
||||
neg = 1;
|
||||
s++;
|
||||
}
|
||||
else if (*s == '+')
|
||||
s++;
|
||||
|
||||
while (isdigit((int)*s))
|
||||
{
|
||||
acc = 10 * acc + ((int)*s - '0');
|
||||
s++;
|
||||
}
|
||||
|
||||
if (neg)
|
||||
acc *= -1;
|
||||
return acc;
|
||||
}
|
|
@ -131,4 +131,82 @@ _ultoa(unsigned long value, char *string, int radix)
|
|||
*sp++ = *--tp;
|
||||
*sp = 0;
|
||||
return string;
|
||||
}
|
||||
}
|
||||
|
||||
char *
|
||||
_i64toa(__int64 value, char *string, int radix)
|
||||
{
|
||||
char tmp[65];
|
||||
char *tp = tmp;
|
||||
int i;
|
||||
unsigned v;
|
||||
int sign;
|
||||
char *sp;
|
||||
|
||||
if (radix > 36 || radix <= 1)
|
||||
{
|
||||
__set_errno(EDOM);
|
||||
return 0;
|
||||
}
|
||||
|
||||
sign = (radix == 10 && value < 0);
|
||||
if (sign)
|
||||
v = -value;
|
||||
else
|
||||
v = (unsigned)value;
|
||||
while (v || tp == tmp)
|
||||
{
|
||||
i = v % radix;
|
||||
v = v / radix;
|
||||
if (i < 10)
|
||||
*tp++ = i+'0';
|
||||
else
|
||||
*tp++ = i + 'a' - 10;
|
||||
}
|
||||
|
||||
if (string == 0)
|
||||
string = (char *)malloc((tp-tmp)+sign+1);
|
||||
sp = string;
|
||||
|
||||
if (sign)
|
||||
*sp++ = '-';
|
||||
while (tp > tmp)
|
||||
*sp++ = *--tp;
|
||||
*sp = 0;
|
||||
return string;
|
||||
}
|
||||
|
||||
char *
|
||||
_ui64toa(unsigned __int64 value, char *string, int radix)
|
||||
{
|
||||
char tmp[65];
|
||||
char *tp = tmp;
|
||||
long i;
|
||||
unsigned long v = value;
|
||||
char *sp;
|
||||
|
||||
if (radix > 36 || radix <= 1)
|
||||
{
|
||||
__set_errno(EDOM);
|
||||
return 0;
|
||||
}
|
||||
|
||||
while (v || tp == tmp)
|
||||
{
|
||||
i = v % radix;
|
||||
v = v / radix;
|
||||
if (i < 10)
|
||||
*tp++ = i+'0';
|
||||
else
|
||||
*tp++ = i + 'a' - 10;
|
||||
}
|
||||
|
||||
if (string == 0)
|
||||
string = (char *)malloc((tp-tmp)+1);
|
||||
sp = string;
|
||||
|
||||
while (tp > tmp)
|
||||
*sp++ = *--tp;
|
||||
*sp = 0;
|
||||
return string;
|
||||
}
|
||||
|
|
|
@ -55,7 +55,6 @@ _itow(int value, wchar_t *string, int radix)
|
|||
return string;
|
||||
}
|
||||
|
||||
|
||||
wchar_t *
|
||||
_ltow(long value, wchar_t *string, int radix)
|
||||
{
|
||||
|
@ -133,3 +132,81 @@ _ultow(unsigned long value, wchar_t *string, int radix)
|
|||
*sp = 0;
|
||||
return string;
|
||||
}
|
||||
|
||||
wchar_t *
|
||||
_i64tow(__int64 value, wchar_t *string, int radix)
|
||||
{
|
||||
wchar_t tmp[65];
|
||||
wchar_t *tp = tmp;
|
||||
int i;
|
||||
unsigned v;
|
||||
int sign;
|
||||
wchar_t *sp;
|
||||
|
||||
if (radix > 36 || radix <= 1)
|
||||
{
|
||||
__set_errno(EDOM);
|
||||
return 0;
|
||||
}
|
||||
|
||||
sign = (radix == 10 && value < 0);
|
||||
if (sign)
|
||||
v = -value;
|
||||
else
|
||||
v = (unsigned)value;
|
||||
while (v || tp == tmp)
|
||||
{
|
||||
i = v % radix;
|
||||
v = v / radix;
|
||||
if (i < 10)
|
||||
*tp++ = i+L'0';
|
||||
else
|
||||
*tp++ = i + L'a' - 10;
|
||||
}
|
||||
|
||||
if (string == 0)
|
||||
string = (wchar_t *)malloc(((tp-tmp)+sign+1)*sizeof(wchar_t));
|
||||
sp = string;
|
||||
|
||||
if (sign)
|
||||
*sp++ = L'-';
|
||||
while (tp > tmp)
|
||||
*sp++ = *--tp;
|
||||
*sp = 0;
|
||||
return string;
|
||||
}
|
||||
|
||||
wchar_t *
|
||||
_ui64tow(unsigned __int64 value, wchar_t *string, int radix)
|
||||
{
|
||||
wchar_t tmp[65];
|
||||
wchar_t *tp = tmp;
|
||||
long i;
|
||||
unsigned long v = value;
|
||||
wchar_t *sp;
|
||||
|
||||
if (radix > 36 || radix <= 1)
|
||||
{
|
||||
__set_errno(EDOM);
|
||||
return 0;
|
||||
}
|
||||
|
||||
while (v || tp == tmp)
|
||||
{
|
||||
i = v % radix;
|
||||
v = v / radix;
|
||||
if (i < 10)
|
||||
*tp++ = i+L'0';
|
||||
else
|
||||
*tp++ = i + L'a' - 10;
|
||||
}
|
||||
|
||||
if (string == 0)
|
||||
string = (wchar_t *)malloc(((tp-tmp)+1)*sizeof(wchar_t));
|
||||
sp = string;
|
||||
|
||||
while (tp > tmp)
|
||||
*sp++ = *--tp;
|
||||
*sp = 0;
|
||||
return string;
|
||||
}
|
||||
|
|
31
reactos/lib/msvcrt/stdlib/wtoi64.c
Normal file
31
reactos/lib/msvcrt/stdlib/wtoi64.c
Normal file
|
@ -0,0 +1,31 @@
|
|||
|
||||
#include <msvcrt/ctype.h>
|
||||
#include <msvcrt/stdlib.h>
|
||||
|
||||
__int64
|
||||
_wtoi64(const wchar_t *nptr)
|
||||
{
|
||||
wchar_t *s = (wchar_t *)nptr;
|
||||
__int64 acc = 0;
|
||||
int neg = 0;
|
||||
|
||||
while(iswspace((int)*s))
|
||||
s++;
|
||||
if (*s == '-')
|
||||
{
|
||||
neg = 1;
|
||||
s++;
|
||||
}
|
||||
else if (*s == '+')
|
||||
s++;
|
||||
|
||||
while (iswdigit((int)*s))
|
||||
{
|
||||
acc = 10 * acc + ((int)*s - '0');
|
||||
s++;
|
||||
}
|
||||
|
||||
if (neg)
|
||||
acc *= -1;
|
||||
return acc;
|
||||
}
|
Loading…
Reference in a new issue