Files
TeslaRel410/BORLAND/BC45/SOURCE/RTL/SOURCE/MATHLIB/_MATHERR.C
T
CydandClaude Fable 5 63312e07f9 source410: literal 4.10 source reconstruction + BC++ 4.52 fleet toolchain archived
- BORLAND/: Borland C++ 4.52 (chosen over 4.5 by byte-match: CODE/RP/CW32.LIB
  is identical to 4.52's install lib). BCC32/TLINK32/TLIB/MAKE run natively on
  Win11; CODE/BT/OPT.MAK is the shipped BTL4OPT.EXE's exact flag recipe
  (extender = Borland PowerPack DPMI32, not Phar Lap TNT).
- restoration/source410/: the literal 1995-form reconstruction of the missing
  BT game source (never mixed into CODE/). Round 1-3 state:
  * 6 of 10 surviving original TUs COMPILE CLEAN under the period toolchain
    (BTMSSN, BTCNSL, BTSCNRL, BTTEAM, BTL4MODE, BTL4ARND) - first builds
    since 1996.
  * BT_L4/BTL4APP.CPP pilot reconstruction: 12/12 functions, Fail() lands on
    its binary-recorded line 400 exactly.
  * BT/BTCNSL.HPP: console wire IDs recovered from the binary's ctors
    (Killed=9, Damaged=10, ScoreUpdate=13, DeathWithoutHonor=15 [T1];
    TeamScore=12 flagged [T4]).
  * MUNGA/: 8 engine-header backfills back-dated from the BT412 WinTesla tree
    (VDATA numbering decomp-verified; AUDREND's OpenAL-era virtual removed -
    the period compiler is the drift detector).
  * Tooling: backdate.py (WinTesla->1995 header transform), compile410.sh
    (per-TU verification sweep under authentic OPT.MAK flags).
  * README: corrected roadmap - MECH.HPP is the capstone grown with the mech
    TU reconstructions; BTREG.CPP green = the header-family milestone.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 07:33:26 -05:00

124 lines
4.3 KiB
C++

/*------------------------------------------------------------------------
* filename - _matherr.c
*
* function(s)
* __matherr - floating-point error handling routine
*-----------------------------------------------------------------------*/
/*
* C/C++ Run Time Library - Version 6.5
*
* Copyright (c) 1987, 1994 by Borland International
* All Rights Reserved.
*
*/
#include <_math.h>
#include <math.h>
#include <stdio.h>
#include <errno.h>
#ifdef _Windows
#include <_win.h>
#endif
/*-------------------------------------------------------------------------*
Name __matherr - floating-point error handling routine
Usage #include<math.h>
double __matherr (_mexcep why,
char *fun,
double *arg1p,
double *arg2p,
double retval);
Prototype in math.h
Description __matherr serves as a focal point for error handling in all
math library functions; it calls _matherr and processes the
return value from _matherr. __matherr should never be called
directly by user programs.
Whenever an error occurs in one of the math library
routines __matherr is called with several arguments.
__matherr does four things :
. It uses its arguments to fill out an exception
structure.
. It calls _matherr with e, a pointer to the
exception structure, to see if _matherr can
resolve the error.
. It examines the return value from _matherr as
follows:
If _matherr returns 0, (indicating that it
was not able to resolve the error) __matherr
sets errno and prints an error message
If _matherr returns non-zero, (indicating
that it was able to resolve the error)
__matherr is silent; it does not set errno
or print any messages.
. It returns e->retval to the original caller. Note
that _matherr might modify e->retval to specify
the value it wants propagated back to the
original caller.
When __matherr sets errno (based on a 0 return from
_matherr), it maps the kind of error that occurred (from the
type field in the exception structure) onto an errno value
of either EDOM or ERANGE.
Return value __matherr returns the value, e->retval.
*-------------------------------------------------------------------------*/
double _Cdecl _FARFUNC __matherr(_mexcep why,
char *fun,
double *arg1p,
double *arg2p,
double retval)
{
struct exception e;
e.type = why;
e.name = fun;
e.arg1 = (NULL == arg1p) ? 0 : *arg1p;
e.arg2 = (NULL == arg2p) ? 0 : *arg2p;
e.retval = retval;
if (_matherr (& e) == 0)
{
#ifdef _Windows
char errMsg[ 80 ];
#endif
#ifdef UNIX_matherr
# ifdef _Windows
sprintf (errMsg, "%s (%8g,%8g): %s\n",
fun, *arg1p, *arg2p, _mathwhy [why - 1]);
# else
fprintf (stderr, "%s (%8g,%8g): %s\n",
fun, *arg1p, *arg2p, _mathwhy [why - 1]);
# endif
#else
# ifdef _Windows
sprintf (errMsg, "%s: %s error\n", fun, _mathwhy [why - 1]);
# else
fprintf (stderr, "%s: %s error\n", fun, _mathwhy [why - 1]);
# endif
#endif
errno = ((OVERFLOW == why) || (UNDERFLOW == why) ||
(SING == why)) ? ERANGE : EDOM;
#ifdef _Windows
_errorBox( errMsg );
#endif
}
return e.retval;
}