/********************************************
; File: SANE.h
;
;
; Copyright Apple Computer, Inc.1986-90
; All Rights Reserved
;
********************************************/
#ifndef __TYPES__
#include <TYPES.h>
#endif

#ifndef __SANE__
#define __SANE__


/* Decimal Representation Constants */
#define SIGDIGLEN 0x001C
#define DECSTROUTLEN 0x0050

/* IEEE defualt environment constant */
#define IEEEDEFAULTENV 0x0000

/* Decimal formatting styles */
#define FLOATDECIMAL 0x0000
#define FIXEDDECIMAL 0x0001

/* Exceptions */
#define INVALID 0x0001
#define UNDERFLOW 0x0002
#define OVERFLOW 0x0004
#define DIVBYZERO 0x0008
#define INEXACT 0x0010

/* Ordering relations */
#define GREATERTHAN 0
#define LESSTHAN 1
#define EQUALTO 2
#define UNORDERED 3
typedef short relop ;


/* Inquiry classes */
#define SNAN 0
#define QNAN 1
#define INFINITE 2
#define ZERONUM 3
#define NORMALNUM 4
#define DENORMALNUM 5
typedef short numclass ;


/* Environmental control */

/* Rounding directions */
#define TONEAREST 0
#define UPWARD 1
#define DOWNWARD 2
#define TOWARDZERO 3
typedef short rounddir ;


/* Rounding precisions */
#define EXTPRECISION 0
#define DBLPRECISION 1
#define FLOATPRECISION 2
typedef short roundpre ;

typedef short exception;
typedef short environment;
typedef struct decimal {
   short sgn;             /* sign 0 for +, 1 for - */
   short exp;             /* decimal exponent */
   struct {
           unsigned char length, text[SIGDIGLEN], unused;
        } sig;                 /* significant digits */
} decimal, Decimal;

struct decform {
   short style; /* FLOATDECIMAL or FIXEDDECIMAL  */
   short digits;
} ;
typedef struct decform decform;
typedef struct decform DecForm;
typedef void (*haltvector)(void);

Extended  fabs (Extended  x) ;



/* Conversions between binary and decimal */
void  num2dec (DecForm  *f,extended  x,Decimal  *d) ;
/* d <-- x according to format f */

Extended  dec2num (Decimal  *d) ;
/* Dec2Num <-- d as Extended */


/* Conversions between decimal formats */
void str2dec (char *s,short *index,Decimal *d,short *validPrefix) ;
/* On input Index is starting index into s.
On output Index is one greater than index of last character of longest numeric substring.
d <-- Decimal rep of longest numeric substring;
validPrefix <-- s, beginning at Index, contains valid numeric string or valid prefix of some numeric string */
void  dec2str (DecForm  *f,Decimal  *d,char  *s) ;
/* s <-- d according to format f */


/* Arithmetic, auxiliary and elementary functions */
Extended  remainder (Extended  x,Extended  y,short  *quo) ;
/* Remainder <-- x rem y; */
/* quo <-- 7 low-order bits of integer quotient x/y */
/* where -127 < quo < 127 */

Extended  sqrt (Extended  x) ;
/* square root */

Extended  rint (Extended  x) ;
/* round to integral value */

Extended  scalb (short  n,Extended x) ;
/* scale binary; scalb <-- x * 2^n */

Extended  logb (Extended  x) ;
/* binary log: binary exponent of normalized x */

Extended  copysign (Extended  x,Extended  y) ;
/* CopySign <-- y with sign of x */

Extended  nextfloat (Extended  x,Extended  y) ;
/* next float rep after (float) x in direction of (float) y */

Extended  nextdouble (Extended  x,Extended  y) ;
/* next Double rep after (Double) x in direction of (Double) y */

Extended  nextextended (Extended  x,Extended  y) ;
/* next extended representation after x in direction of y */

Extended  log2 (Extended  x) ;
/* base-2 logarithm */

Extended  log (Extended  x) ;
/* base-e logarithm */

Extended  log1 (Extended  x) ;
/* log(1 + x) */

Extended  exp2 (Extended  x) ;
/* base-2 exponential */

Extended  exp (Extended  x) ;
/* base-e exponential */

Extended  exp1 (Extended  x) ;
/* exp(x) - 1 */

Extended  power (Extended  x,Extended  y) ;
/* general exponential: x ^ y */

Extended  ipower (Extended  x,short  i) ;
/* integer exponential: x ^ i */

Extended  compound (Extended  r,Extended  n) ;
/* compound: (1 + r) ^ n */

Extended  annuity (Extended  r,Extended  n) ;
/* Annuity <-- (1 - (1+r)^(-n)) / r */

Extended  tan (Extended  x) ;
/* tangent */

Extended  sin (Extended  x) ;
/* Sine */

Extended  cos (Extended  x) ;
/* Cosine */

Extended  atan (Extended  x) ;
/* Arctangent */

Extended  randomx (Extended  *x) ;
/* returns next random number; updates x; */
/* x must be integral, 1 <= x <= 2^31 - 2 */


/* Inquiry Routines */
numclass  classfloat (Extended  x) ;
/* class of (float) x */

numclass  classdouble (Extended  x) ;
/* class of (Double) x */

numclass  classcomp (Extended  x) ;
/* class of (Comp) x */

numclass  classextended (Extended  x) ;
/* class of x */

LongWord  signnum (Extended  x) ;
/* 0 if sign bit clear, 1 if sign bit set */


/* Environment access routines */
void  setexception (exception  e,long  b) ;
/* clears e flags if b is 0, sets e flags otherwise; may cause halt */

long  testexception (exception  e) ;
/* return true if any e flag is set, return false otherwise */

void  sethalt (exception  e,long  b) ;
/* set e halt enables if b is true, clear e halt enables otherwise */

long  testhalt (exception  e) ;
/* return true if any e halt is enabled, return false otherwise */

void  setround (rounddir  r) ;
/* set rounding direction to r */

rounddir  getround (void) ;
/* return rounding direction */

void  setprecision (roundpre  p) ;
/* sets rnd'n precision to p */

roundpre  getprecision (void) ;


void  setenvironment (environment  e) ;
/* sets SANE environment to e */

void  getenvironment (environment  *e) ;
/* e <-- SANE environment */

void  procentry (environment  *e) ;
/* e <-- environment;  environment <-- IEEE default env */

void  procexit (environment  e) ;
/* temp <-- current exceptions; */
/* SANE environment <-- e; */
/* signals exceptions in temp */

haltvector  gethaltvector (void) ;
/* return SANE halt vector */

void  sethaltvector (haltvector  v) ;
/* halt vector <-- v */


/* Comparison routine */
relop  relation (Extended  x,Extended  y) ;
/* return Relation such that "x Relation y" is true */


/* NaNs and Special Constants */
extended nan( unsigned char c );   /* returns NaN with code c */

Extended  inf (void) ;
/* returns infinity */

Extended  pi (void) ;
/* returns pi */

extern pascal void SANEBootInit(void) inline(0x010A,dispatcher);
extern pascal void SANEStartUp(Word) inline(0x020A,dispatcher);
extern pascal void SANEShutDown(void) inline(0x030A,dispatcher);
extern pascal Word SANEVersion(void) inline(0x040A,dispatcher);
extern pascal void SANEReset(void) inline(0x050A,dispatcher);
extern pascal Word SANEStatus(void) inline(0x060A,dispatcher);
extern pascal void SANEFP816() inline(0x090A,dispatcher);
extern pascal void SANEDecStr816() inline(0x0A0A,dispatcher);
extern pascal void SANEElems816() inline(0x0B0A,dispatcher);
#endif
