home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Power-Programmierung
/
CD1.mdf
/
icon
/
dos
/
src
/
common
/
dlrgint.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-02-10
|
4KB
|
252 lines
/*
* dlrgint.c - versions of "large integer" routines for compiled programs
* that do not support large integers.
*/
#include "../h/rt.h"
/*
*****************************************************************
*
* Routines in the first set are only called when large integers
* exist and thus these versions will never be called. They need
* only have the correct signature and compile without error.
*/
/*
* bignum -> file
*/
novalue bigprint(f, da)
FILE *f;
dptr da;
{
}
/*
* bignum -> real
*/
double bigtoreal(da)
dptr da;
{
return 0.0;
}
/*
* bignum -> string
*/
int bigtos(da, dx)
dptr da, dx;
{
return 0;
}
/*
* da -> dx
*/
int cpbignum(da, dx)
dptr da, dx;
{
return 0;
}
/*
* da / db -> dx
*/
int bigdiv(da, db, dx)
dptr da, db, dx;
{
return 0;
}
/*
* da % db -> dx
*/
int bigmod(da, db, dx)
dptr da, db, dx;
{
return 0;
}
/*
* iand(da, db) -> dx
*/
int bigand(da, db, dx)
dptr da, db, dx;
{
return 0;
}
/*
* ior(da, db) -> dx
*/
int bigor(da, db, dx)
dptr da, db, dx;
{
return 0;
}
/*
* xor(da, db) -> dx
*/
int bigxor(da, db, dx)
dptr da, db, dx;
{
return 0;
}
/*
* negative if da < db
* zero if da == db
* positive if da > db
*/
word bigcmp(da, db)
dptr da, db;
{
return (word)0;
}
/*
* ?da -> dx
*/
int bigrand(da, dx)
dptr da, dx;
{
return 0;
}
/*
*************************************************************
*
* The following routines are called when overflow has occurred
* during ordinary arithmentic.
*/
/*
* da + db -> dx
*/
int bigadd(da, db, dx)
dptr da, db;
dptr dx;
{
t_errornumber = 203;
t_errorvalue = nulldesc;
t_have_val = 0;
return Error;
}
/*
* da * db -> dx
*/
int bigmul(da, db, dx)
dptr da, db, dx;
{
t_errornumber = 203;
t_errorvalue = nulldesc;
t_have_val = 0;
return Error;
}
/*
* -i -> dx
*/
int bigneg(da, dx)
dptr da, dx;
{
t_errornumber = 203;
t_errorvalue = nulldesc;
t_have_val = 0;
return Error;
}
/*
* da - db -> dx
*/
int bigsub(da, db, dx)
dptr da, db, dx;
{
t_errornumber = 203;
t_errorvalue = nulldesc;
t_have_val = 0;
return Error;
}
/*
* ********************************************************
*
* The remaining routines each requires different handling.
*/
/*
* real -> bignum
*/
int realtobig(da, dx)
dptr da, dx;
{
return Failed; /* conversion cannot be done */
}
/*
* da ^ db -> dx
*/
int bigpow(da, db, dx)
dptr da, db, dx;
{
C_integer r;
extern int over_flow;
/*
* Just do ordinary interger exponentiation and check for overflow.
*/
r = iipow(IntVal(*da), IntVal(*db));
if (over_flow) {
k_errornumber = 203;
k_errortext = "";
k_errorvalue = nulldesc;
have_errval = 0;
return Error;
}
MakeInt(r, dx)
return Succeeded;
}
/*
* string -> bignum
*/
word bigradix(sign, r, s, end_s, result)
int sign; /* '-' or not */
int r; /* radix 2 .. 36 */
char *s, *end_s; /* input string */
union numeric *result; /* output T_Integer or T_Lrgint */
{
/*
* Just do string to ordinary integer.
*/
return radix(sign, r, s, end_s, result);
}
/*
* bigshift(da, db) -> dx
*/
int bigshift(da, db, dx)
dptr da, db, dx;
{
uword ci; /* shift in 0s, even if negative */
C_integer cj;
/*
* Do an ordinary shift - note that db is always positive when this
* routine is called.
*/
ci = (uword)IntVal(*da);
cj = IntVal(*db);
/*
* Check for a shift of WordSize or greater; return an explicit 0 because
* this is beyond C's defined behavior. Otherwise shift as requested.
*/
if (cj >= WordBits)
ci = 0;
else
ci <<= cj;
MakeInt(ci, dx)
return Succeeded;
}