SANE Glue Code for ORCA/C 2.1 or later
Written in 1997 by Soenke Behrens

Legal Stuff
===========

This library and the accompanying source code are hereby placed
into the Public Domain. There is no warranty, express or implied,
on the performance of the library or source code. The author is not
liable for any damage that may occur as a direct or indirect result
of using the library or source code.

Installation
============

In GNO/ME, run "dmake install".
This will copy a changed sane.h to /lang/orca/include and the library
lsaneglue to 13.
If, on your system, includes are kept in a different directory (say
13/orcacdefs), either copy the files manually or edit the file
"makefile" to use a different path.

In ORCA/Shell, copy the changed include file and the library
manually.

Afterwards, use a directory ordering utility such as ProSel-16
to make sure lsaneglue comes _before_ ORCALIB.

Documentation, Use
==================

lsaneglue is a library that contains code to let you call
SANE functions directly from ORCA/C. To avoid namespace
conflicts with math.h, it was necessary to change sane.h.
Thus, all SANE functions are now prefixed with "s_" (e.g.
"annuity" became "s_annuity", and "sin" became "s_sin").
This lets you choose easily between the SANE and ISO/C
implementations of the same function.

Below you will find a brief overview over the functions in
lsaneglue. This overview does not replace, however, proper
documentation. To fully understand SANE, you will need the
"Apple Numerics Manual, 2nd Edition" by Apple Computer, Inc.,
ISBN 0-201-17738-2, published by Addison-Wesley Publishing
Company, Inc.
SANE is also introduced in the "Apple IIgs Toolbox Reference,
Volume 2", Chapter 18.

I find the functions to control the SANE environment (rounding
direction, halts &c.), the functions to spot NaNs (classification
functions) as well as the functions that give you a good pi, NaN
and INF particularly useful.

Brief SANE function overview
============================

There is one function in lsaneglue that has nothing to do with
SANE:

int findfpcp(void);

This function will find an FPE or NC card and return the slot number
(or -1 if card not found). You can use the output of this function
for the ORCA/C setfpeslot(), which is used when having ORCA/C
create code for the FPE/NC directly (#pragma float 1 1).

Now for the SANE interface functions.
I will give the prototype of the function, and a one-line description
on the following line. Page numbers refer to Apple Numerics Manual.

NB: Use the file "sane.h" itself as reference for constants used
  to set/test exceptions, rounding direction, rounding precision,
  number classes, ordering relations, formatting styles and NAN codes.
 
void		s_num2dec(DecForm *f, extended x, Decimal *d);
  Convert x to SANE decimal record. Pg 28

extended	s_dec2num(Decimal *d);
  Convert SANE decimal record to extended. Pg 28f

void		s_str2dec(char *s, short *ix, Decimal *d, short *vp);
  Convert string s to SANE decimal record. Pg 30f

void		s_dec2str(DecForm *f, Decimal *d, char *s);
  Convert SANE decimal record d to string. Pg 31ff

extended	s_fabs(extended x);
  Get the absolute of x (make sign positive). Pg 49

extended	s_fneg(extended x);
  Reverse sign of x. Pg 49

extended	s_remainder(extended x, extended y, short *quo);
  Get the remainder of x and y. Pg 46f

extended	s_sqrt(extended x);
  Compute square root of x. Pg 46

extended	s_rint(extended x);
  Round x to integer in current rounding direction. Pg 47

extended	s_scalb(short n, extended x);
  Return (x times 2^n). Pg 50

extended	s_logb(extended x);
  Compute binary exponent of normalized x. Pg 50

extended	s_copysign(extended x, extended y);
  Return y with sign of x. Pg 49

extended	s_nextfloat(extended x, extended y);
  Return next float number after x in direction of y. Pg 50

extended	s_nextdouble(extended x, extended y);
  Return next double number after x in direction of y. Pg 50

extended	s_nextextended(extended x, extended y);
  Return next extended number after x in direction of y. Pg 50

extended	s_log2(extended x);
  Return base-2 logarithm of x. Pg 62

extended	s_log(extended x);
  Return base-e (natural) logarithm of x. Pg 62

extended	s_log1(extended x);
  Return base-e (natural) logarithm of (x+1). Pg 62

extended	s_exp2(extended x);
  Return base-2 exponantial of x (2^x). Pg 63f

extended	s_exp(extended x);
  Return base-e (natural) exponantial of x (x^e). Pg 63f

extended	s_exp1(extended x);
  Return base-e (natural) exponantial of x, minus 1 (x^e - 1). Pg 63f

extended	s_power(extended x, extended y);
  Return x^y. Pg 63f

extended	s_ipower(extended x, short i);
  Return x^i. Pg 63f

extended	s_compound(extended r, extended n);
  Compute compound (1+r)^n. Pg 64f

extended	s_annuity(extended r, extended n);
  Compute annuity (1-(1+r)^n)/r. Pg 65

extended	s_tan(extended x);
  Return tangent of x. Pg 67f

extended	s_sin(extended x);
  Return sine of x. Pg 67

extended	s_cos(extended x);
  Return cosine of x. Pg 67

extended	s_atan(extended x);
  Return arctangent of x. Pg 67f

extended	s_randomx(extended *x);
  Return pseudorandom integer value with seed x. Pg 67

numclass	s_classfloat(extended x);
  Return classification of float x. Pg 44

numclass	s_classdouble(extended x);
  Return classification of double x. Pg 44

numclass	s_classcomp(extended x);
  Return classification of comp x. Pg 44

numclass	s_classextended(extended);
  Return classification of extended x. Pg 44

int		s_signnum(extended x);
  Return sign of x: 0 if positive, 1 if negative. Pg 44

void		s_setexception(exception e, long b);
  Clear or set SANE exceptions. Pg 54ff

long		s_testexception(exception e);
  Check whether SANE exception is currently set. Pg 54ff

void		s_sethalt(exception e, long b);
  Clear or set SANE exception halts. Pg 54ff

long		s_testhalt(exception e);
  Check whether SANE exception halt is currently set. Pg 54ff

void		s_setround(rounddir r);
  Set SANE rounding direction. Pg 52f

rounddir	s_getround(void);
  Get SANE rounding direction. Pg 52f

void		s_setprecision(roundpre p);
  Set SANE rounding precision. Pg 53

roundpre	s_getprecision(void);
  Get SANE rounding precision. Pg 53

void		s_setenvironment(environment e);
  Set SANE environment word. Pg 57

void		s_getenvironment(environment *e);
  Get SANE environment word. Pg 57

void		s_procentry(environment *e);
  Save SANE environment word, then default it. Pg 57

void		s_procexit(environment e);
  Restore SANE environment word, then signal exceptions. Pg 57

haltvector	s_gethaltvector(void);
  Get SANE halt vector. Pg 54

void		s_sethaltvector(haltvector v);
  Set SANE halt vector. Pg 54

relop		s_relation(extended x, extended y);
  Return relation of x to y. Pg 49

extended	s_nan(unsigned char c);
  Return NaN(c).

extended	s_inf(void);
  Return +INF (Infinity).

extended	s_pi(void);
  Return pi constant (3.141592653589793238512808959)


Errors in SANE toolkit
======================

The fclass functions should return the sign of the passed number
in n-bit and Y. They do not report the sign at all, though, which
has to be considered a bug. s_signnum() has been rewritten to not
rely on fclassx any more.

Soenke Behrens
September 1997
sbehrens@bigfoot.com
