diff --git a/elks/tools/objtools/ewcc b/elks/tools/objtools/ewcc index 3cfe8b87f..b129ed550 100755 --- a/elks/tools/objtools/ewcc +++ b/elks/tools/objtools/ewcc @@ -23,9 +23,8 @@ if [ -z "$WATCOM" ] fi ELKSLIBCINCLUDE=$TOPDIR/libc/include -ELKSINCLUDE1=$TOPDIR/include -ELKSINCLUDE2=$TOPDIR/elks/include -WATCINCLUDE=$WATCOM/h +ELKSINCLUDE1=$TOPDIR/elks/include +ELKSINCLUDE2=$TOPDIR/libc/include/watcom # owcc options: # -bnone # no target specific setup @@ -68,7 +67,6 @@ CCFLAGS="\ -I$ELKSLIBCINCLUDE \ -I$ELKSINCLUDE1 \ -I$ELKSINCLUDE2 \ - -I$WATCINCLUDE \ " while true; do diff --git a/libc/include/watcom/float.h b/libc/include/watcom/float.h new file mode 100644 index 000000000..bbfb333f9 --- /dev/null +++ b/libc/include/watcom/float.h @@ -0,0 +1,263 @@ +/* + * float.h/cfloat Floating point functions + * + * ========================================================================= + * + * Open Watcom Project + * + * Copyright (c) 2004-2024 The Open Watcom Contributors. All Rights Reserved. + * Portions Copyright (c) 1983-2002 Sybase, Inc. All Rights Reserved. + * + * This file is automatically generated. Do not edit directly. + * + * ========================================================================= + */ +#ifndef _FLOAT_H_INCLUDED +#define _FLOAT_H_INCLUDED + +#ifndef _ENABLE_AUTODEPEND + #pragma read_only_file +#endif + +#ifndef __COMDEF_H_INCLUDED + #include <_comdef.h> +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +#define FLT_NORMALIZE 0 +#define FLT_RADIX 2 +#define FLT_ROUNDS 1 /* round to nearest */ +#define _DBL_RADIX 2 +#define _DBL_ROUNDS 1 +#define _LDBL_RADIX _DBL_RADIX +#define _LDBL_ROUNDS _DBL_ROUNDS + +#if !defined( _NO_EXT_KEYS ) /* extensions enabled */ +#define DBL_RADIX _DBL_RADIX +#define DBL_ROUNDS _DBL_ROUNDS +#define LDBL_RADIX _DBL_RADIX +#define LDBL_ROUNDS _DBL_ROUNDS +#endif /* extensions enabled */ + +/* number of base-FLT_RADIX digits in the floating-point mantissa */ +#define FLT_MANT_DIG 24 +#define DBL_MANT_DIG 53 +#define LDBL_MANT_DIG 53 + +/* number of decimal digits of precision */ +#define FLT_DIG 6 +#define DBL_DIG 15 +#define LDBL_DIG 15 + +/* decimal digits needed to accurately represent any floating-point value */ +#define DECIMAL_DIG 17 + +/* minimum negative integer such that FLT_RADIX raised to that power minus 1 + is a normalized floating-point number */ +#define FLT_MIN_EXP (-125) +#define DBL_MIN_EXP (-1021) +#define LDBL_MIN_EXP (-1021) + +/* minimum negative integer such that 10 raised to that power is in the + range of normalized floating-point numbers */ +#define FLT_MIN_10_EXP (-37) +#define DBL_MIN_10_EXP (-307) +#define LDBL_MIN_10_EXP (-307) + +/* maximum integer such that FLT_RADIX raised to that power minus 1 is a + representable floating-point number */ +#define FLT_MAX_EXP 128 +#define DBL_MAX_EXP 1024 +#define LDBL_MAX_EXP 1024 + +/* maximum integer such that 10 raised to that power is in the range of + representable floating-point numbers */ +#define FLT_MAX_10_EXP 38 +#define DBL_MAX_10_EXP 308 +#define LDBL_MAX_10_EXP 308 + +/* maximum representable floating-point number */ +#define FLT_MAX 3.402823466e+38f +#define DBL_MAX 1.7976931348623157e+308 +#define LDBL_MAX DBL_MAX + +/* minimum positive floating-point number x such that 1.0 + x != 1.0 */ +#define FLT_EPSILON 1.192092896e-7f +#define DBL_EPSILON 2.2204460492503131e-16 +#define LDBL_EPSILON DBL_EPSILON + +/* minimum representable positive floating-point number */ +#define FLT_MIN 1.175494351e-38f +#define DBL_MIN 2.2250738585072014e-308 +#define LDBL_MIN DBL_MIN + +/* + * 8087/80287/80387 math co-processor control information + */ + +/* 80(x)87 Control Word Mask and bit definitions. */ + +#define _MCW_EM 0x003f /* Interrupt Exception Masks */ +#define _EM_INVALID 0x0001 /* invalid */ +#define _EM_DENORMAL 0x0002 /* denormal */ +#define _EM_ZERODIVIDE 0x0004 /* zero divide */ +#define _EM_OVERFLOW 0x0008 /* overflow */ +#define _EM_UNDERFLOW 0x0010 /* underflow */ +#define _EM_INEXACT 0x0020 /* inexact result - precision */ + +#define _MCW_IC 0x1000 /* Infinity Control */ +#define _IC_AFFINE 0x1000 /* affine */ +#define _IC_PROJECTIVE 0x0000 /* projective */ + +#define _MCW_RC 0x0c00 /* Rounding Control */ +#define _RC_NEAR 0x0000 /* near */ +#define _RC_DOWN 0x0400 /* down */ +#define _RC_UP 0x0800 /* up */ +#define _RC_CHOP 0x0c00 /* chop */ + +#define _MCW_PC 0x0300 /* Precision Control */ +#define _PC_24 0x0000 /* 24 bits */ +#define _PC_53 0x0200 /* 53 bits */ +#define _PC_64 0x0300 /* 64 bits */ + +/* initial Control Word value */ + +#define _CW_DEFAULT (_IC_AFFINE | _RC_NEAR | _PC_53 \ + | _EM_INVALID | _EM_DENORMAL | _EM_ZERODIVIDE \ + | _EM_OVERFLOW | _EM_UNDERFLOW | _EM_INEXACT) + +/* 80(x)87 Status Word bit definitions */ + +#define _SW_INVALID 0x0001 /* invalid */ +#define _SW_DENORMAL 0x0002 /* denormal */ +#define _SW_ZERODIVIDE 0x0004 /* zero divide */ +#define _SW_OVERFLOW 0x0008 /* overflow */ +#define _SW_UNDERFLOW 0x0010 /* underflow */ +#define _SW_INEXACT 0x0020 /* inexact (precision) */ + +/* the following are generated by software */ + +#define _SW_UNEMULATED 0x0040 /* unemulated instruction */ +/* invalid subconditions (_SW_INVALID also set) */ +#define _SW_SQRTNEG 0x0080 /* square root of a neg number */ +#define _SW_STACKOVERFLOW 0x0200 /* FP stack overflow */ +#define _SW_STACKUNDERFLOW 0x0400 /* FP stack underflow */ + +/* Floating-point error codes */ + +#define _FPE_INVALID 0x81 +#define _FPE_DENORMAL 0x82 +#define _FPE_ZERODIVIDE 0x83 +#define _FPE_OVERFLOW 0x84 +#define _FPE_UNDERFLOW 0x85 +#define _FPE_INEXACT 0x86 + +#define _FPE_UNEMULATED 0x87 +#define _FPE_SQRTNEG 0x88 +#define _FPE_STACKOVERFLOW 0x8a +#define _FPE_STACKUNDERFLOW 0x8b +#define _FPE_EXPLICITGEN 0x8c +#define _FPE_IOVERFLOW 0x8d /* issued on fist(p) when value is too + large to be represented as integer */ +#define _FPE_LOGERR 0x8e +#define _FPE_MODERR 0x8f + +#if !defined( _NO_EXT_KEYS ) /* extensions enabled */ + +/* + * 8087/80287/80387 math co-processor control information + */ + +/* 80(x)87 Control Word Mask and bit definitions. */ + +#define MCW_EM _MCW_EM +#define EM_INVALID _EM_INVALID +#define EM_DENORMAL _EM_DENORMAL +#define EM_ZERODIVIDE _EM_ZERODIVIDE +#define EM_OVERFLOW _EM_OVERFLOW +#define EM_UNDERFLOW _EM_UNDERFLOW +#define EM_INEXACT _EM_INEXACT +#define EM_PRECISION _EM_INEXACT /* WATCOM's name */ + +#define MCW_IC _MCW_IC +#define IC_AFFINE _IC_AFFINE +#define IC_PROJECTIVE _IC_PROJECTIVE + +#define MCW_RC _MCW_RC +#define RC_NEAR _RC_NEAR +#define RC_DOWN _RC_DOWN +#define RC_UP _RC_UP +#define RC_CHOP _RC_CHOP + +#define MCW_PC _MCW_PC +#define PC_24 _PC_24 +#define PC_53 _PC_53 +#define PC_64 _PC_64 + +/* 80(x)87 Status Word bit definitions */ + +#define SW_INVALID _SW_INVALID +#define SW_DENORMAL _SW_DENORMAL +#define SW_ZERODIVIDE _SW_ZERODIVIDE +#define SW_OVERFLOW _SW_OVERFLOW +#define SW_UNDERFLOW _SW_UNDERFLOW +#define SW_INEXACT _SW_INEXACT +/* the following are generated by software */ +#define SW_UNEMULATED _SW_UNEMULATED +#define SW_SQRTNEG _SW_SQRTNEG +#define SW_STACKOVERFLOW _SW_STACKOVERFLOW +#define SW_STACKUNDERFLOW _SW_STACKUNDERFLOW + +/* Floating-point error codes */ + +#define FPE_INVALID _FPE_INVALID +#define FPE_DENORMAL _FPE_DENORMAL +#define FPE_ZERODIVIDE _FPE_ZERODIVIDE +#define FPE_OVERFLOW _FPE_OVERFLOW +#define FPE_UNDERFLOW _FPE_UNDERFLOW +#define FPE_INEXACT _FPE_INEXACT +#define FPE_UNEMULATED _FPE_UNEMULATED +#define FPE_SQRTNEG _FPE_SQRTNEG +#define FPE_STACKOVERFLOW _FPE_STACKOVERFLOW +#define FPE_STACKUNDERFLOW _FPE_STACKUNDERFLOW +#define FPE_EXPLICITGEN _FPE_EXPLICITGEN +#define FPE_IOVERFLOW _FPE_IOVERFLOW +#define FPE_LOGERR _FPE_LOGERR +#define FPE_MODERR _FPE_MODERR + +_WMRTLINK extern unsigned _clear87(void); +_WCRTLINK extern unsigned _control87(unsigned,unsigned); +_WCRTLINK extern unsigned _controlfp(unsigned,unsigned); +_WCRTLINK extern void _fpreset(void); +_WMRTLINK extern unsigned _status87(void); +_WMRTLINK extern int _finite(double); + +/* Floating-point Infinity and NaN constants */ + +_WMRTDATA extern const float __f_infinity; +_WMRTDATA extern const float __f_posqnan; +_WMRTDATA extern const double __d_infinity; +_WMRTDATA extern const double __d_posqnan; +_WMRTDATA extern const long double __ld_infinity; +_WMRTDATA extern const long double __ld_posqnan; + +#define _INFF __f_infinity +#define _INFINITYF __f_infinity +#define _INF __d_infinity +#define _INFINITY __d_infinity +#define _INFL __ld_infinity +#define _INFINITYL __ld_infinity +#define _NANF __f_posqnan +#define _NAN __d_posqnan +#define _NANL __ld_posqnan + +#endif /* extensions enabled */ + +#ifdef __cplusplus +} /* extern "C" */ +#endif + +#endif diff --git a/libc/malloc/amalloc.c b/libc/malloc/amalloc.c index 24ac19f41..029534ef5 100644 --- a/libc/malloc/amalloc.c +++ b/libc/malloc/amalloc.c @@ -135,8 +135,9 @@ __amalloc(size_t nbytes) ASSERT(allocp>=(NPTR)allocs && allocp<=alloct); ASSERT(malloc_check_heap()); /* combine free areas at heap start before allocating from free area past allocp */ - allocp = (NPTR)allocs; + //allocp = (NPTR)allocs; /* NOTE: start at last allocation for speed */ for(p=allocp; ; ) { + //f = nb = n = 0; for(temp=0; ; ) { if(!testbusy(next(p))) { while(!testbusy(next(q = next(p)))) { @@ -147,12 +148,15 @@ __amalloc(size_t nbytes) (next(p) - p) * sizeof(union store), (next(q) - q) * sizeof(union store)); next(p) = next(q); + //f++; } /*debug2("q %04x p %04x nw %d p+nw %04x ", (unsigned)q, (unsigned)p, nw, (unsigned)(p+nw));*/ + //nb++; if(q>=p+nw && p+nw>=p) goto found; } + //n++; q = p; p = clearbusy(next(p)); if(p>q) { @@ -211,6 +215,7 @@ __amalloc(size_t nbytes) #endif } found: + //__dprintf("n %d, nb %d, f %d\n", n, nb, f); allocp = p + nw; ASSERT(allocp<=alloct); if(q>allocp) { diff --git a/libc/system/execvpe.c b/libc/system/execvpe.c index f76a4d8d0..252a43fa4 100644 --- a/libc/system/execvpe.c +++ b/libc/system/execvpe.c @@ -52,12 +52,13 @@ execvpe(const char *fname, char **argv, char **envp) strcpy(pname, path); strcat(pname, "/"); strcat(pname, fname); + if(p) *p++ = ':'; tryrun(pname, argv, envp); if( errno == EACCES ) besterr = EACCES; if( errno == ENOMEM || errno == E2BIG || errno == ENOEXEC ) goto out; - brk((char *)pname); + brk(pname); pname = (char *)fname; if(p) *p++ = ':'; path=p;