Improve internal pre-defined constant handling

Improved the way that internal pre-defined constants are managed.
Removed unused internal pre-defined constants.  Added code to
prevent an internal pre-defined constant (that was never
allocated) from being freed.
This commit is contained in:
Landon Curt Noll
2021-11-28 20:47:52 -08:00
parent 8f449ba6d2
commit 3d300acca1
6 changed files with 181 additions and 61 deletions

View File

@@ -26,6 +26,11 @@ The following are the changes from calc version 2.14.0.9 to date:
Fixed a few cases where v_subtype was not properly initialuzed. Fixed a few cases where v_subtype was not properly initialuzed.
Improved the way that internal pre-defined constants are managed.
Removed unused internal pre-defined constants. Added code to
prevent an internal pre-defined constant (that was never allocated)
from being freed.
The following are the changes from calc version 2.14.0.7 to 2.14.0.8: The following are the changes from calc version 2.14.0.7 to 2.14.0.8:

View File

@@ -103,7 +103,7 @@ main(int argc, char **argv)
/* /*
* seed the generator * seed the generator
*/ */
prev_state = zsrandom2(seed, zconst[1]); prev_state = zsrandom2(seed, _one_);
if (prev_state == NULL) { if (prev_state == NULL) {
math_error("previous random state is NULL"); math_error("previous random state is NULL");
/*NOTREACHED*/ /*NOTREACHED*/

View File

@@ -93,7 +93,7 @@ main(int argc, char **argv)
/* /*
* seed the generator * seed the generator
*/ */
prev_state = zsrandom2(seed, zconst[10]); prev_state = zsrandom2(seed, _ten_);
if (prev_state == NULL) { if (prev_state == NULL) {
math_error("previous random state is NULL"); math_error("previous random state is NULL");
/*NOTREACHED*/ /*NOTREACHED*/

128
zmath.c
View File

@@ -35,54 +35,45 @@
HALF _zeroval_[] = { 0 }; HALF _zeroval_[] = { 0 };
HALF _oneval_[] = { 1 };
HALF _twoval_[] = { 2 };
HALF _threeval_[] = { 3 };
HALF _fourval_[] = { 4 };
HALF _fiveval_[] = { 5 };
HALF _sixval_[] = { 6 };
HALF _sevenval_[] = { 7 };
HALF _eightval_[] = { 8 };
HALF _nineval_[] = { 9 };
HALF _tenval_[] = { 10 };
HALF _elevenval_[] = { 11 };
HALF _twelveval_[] = { 12 };
HALF _thirteenval_[] = { 13 };
HALF _fourteenval_[] = { 14 };
HALF _fifteenval_[] = { 15 };
HALF _sixteenval_[] = { 16 };
HALF _seventeenval_[] = { 17 };
HALF _eightteenval_[] = { 18 };
HALF _nineteenval_[] = { 19 };
HALF _twentyval_[] = { 20 };
HALF _sqbaseval_[] = { 0, 1 };
HALF _pow4baseval_[] = { 0, 0, 1 };
HALF _pow8baseval_[] = { 0, 0, 0, 0, 1 };
HALF _threesixtyval_[] = { 360 };
HALF _fourhundredval_[] = { 400 };
HALF _twentyfourval_[] = { 24 };
ZVALUE zconst[] = {
{ _zeroval_, 1, 0}, { _oneval_, 1, 0}, { _twoval_, 1, 0},
{ _threeval_, 1, 0}, { _fourval_, 1, 0}, { _fiveval_, 1, 0},
{ _sixval_, 1, 0}, { _sevenval_, 1, 0}, { _eightval_, 1, 0},
{ _nineval_, 1, 0}, { _tenval_, 1, 0}, { _elevenval_, 1, 0},
{ _twelveval_, 1, 0}, { _thirteenval_, 1, 0}, { _fourteenval_, 1, 0},
{ _fifteenval_, 1, 0}, { _sixteenval_, 1, 0}, { _seventeenval_, 1, 0},
{ _eightteenval_, 1, 0}, { _nineteenval_, 1, 0}, { _twentyval_, 1, 0},
{ _threesixtyval_, 1, 0}, { _fourhundredval_, 1, 0},
{ _twentyfourval_, 1, 0}
};
ZVALUE _zero_ = { _zeroval_, 1, 0}; ZVALUE _zero_ = { _zeroval_, 1, 0};
HALF _oneval_[] = { 1 };
ZVALUE _one_ = { _oneval_, 1, 0 }; ZVALUE _one_ = { _oneval_, 1, 0 };
ZVALUE _two_ = { _twoval_, 1, 0 };
ZVALUE _ten_ = { _tenval_, 1, 0 };
ZVALUE _sqbase_ = { _sqbaseval_, 2, 0 };
ZVALUE _pow4base_ = { _pow4baseval_, 4, 0 };
ZVALUE _pow8base_ = { _pow8baseval_, 4, 0 };
ZVALUE _neg_one_ = { _oneval_, 1, 1 }; ZVALUE _neg_one_ = { _oneval_, 1, 1 };
HALF _twoval_[] = { 2 };
ZVALUE _two_ = { _twoval_, 1, 0 };
HALF _threeval_[] = { 3 };
ZVALUE _three_ = { _threeval_, 1, 0 };
HALF _fourval_[] = { 4 };
ZVALUE _four_ = { _fourval_, 1, 0 };
HALF _nineval_[] = { 9 };
ZVALUE _nine_ = { _nineval_, 1, 0 };
HALF _tenval_[] = { 10 };
ZVALUE _ten_ = { _tenval_, 1, 0 };
HALF _sqbaseval_[] = { 0, 1 };
ZVALUE _sqbase_ = { _sqbaseval_, 2, 0 };
HALF _pow4baseval_[] = { 0, 0, 1 };
ZVALUE _pow4base_ = { _pow4baseval_, 4, 0 };
HALF _pow8baseval_[] = { 0, 0, 0, 0, 1 };
ZVALUE _pow8base_ = { _pow8baseval_, 4, 0 };
HALF _threesixtyval_[] = { 360 };
ZVALUE _threesixty_ = { _threesixtyval_, 4, 0 };
HALF _fourhundredval_[] = { 400 };
ZVALUE _fourhundred_ = { _fourhundredval_, 4, 0 };
HALF _twentyfourval_[] = { 24 };
ZVALUE _twentyfour_ = { _twentyfourval_, 4, 0 };
/* /*
* 2^64 as a ZVALUE * 2^64 as a ZVALUE
*/ */
@@ -96,6 +87,26 @@ ZVALUE _b64_ = { _pow8baseval_, 5, 0 };
-=@=- BASEB not 16 or 32 -=@=- -=@=- BASEB not 16 or 32 -=@=-
#endif #endif
/*
* ZVALUE - values that should not be freed
*/
HALF *half_tbl[] = {
_zeroval_,
_oneval_,
_twoval_,
_threeval_,
_fourval_,
_nineval_,
_tenval_,
_sqbaseval_,
_pow4baseval_,
_pow8baseval_,
_threesixtyval_,
_fourhundredval_,
_twentyfourval_,
NULL /* must be last */
};
/* /*
* highhalf[i] - masks off the upper i bits of a HALF * highhalf[i] - masks off the upper i bits of a HALF
@@ -260,11 +271,38 @@ alloc(LEN len)
} }
/*
* is_const - determine if a HALF array is an pre-allocated array
*
* given:
* h pointer to the beginning of the HALF array
*
* returns:
* TRUE - h is found in the half_tbl array
* FALSE - is is not found in the half_tbl array
*/
int
is_const(HALF* h)
{
HALF **h_p; /* half_tbl array pointer */
/* search the half_tbl for h */
for (h_p = &half_tbl[0]; *h_p != NULL; ++h_p) {
if (h == *h_p) {
return TRUE; /* found in the half_tbl array */
}
}
/* not found in the half_tbl array */
return FALSE;
}
#ifdef ALLOCTEST #ifdef ALLOCTEST
void void
freeh(HALF *h) freeh(HALF *h)
{ {
if ((h != _zeroval_) && (h != _oneval_)) { if (!is_const(h)) {
free(h); free(h);
++nfree; ++nfree;
} }

101
zmath.h
View File

@@ -55,8 +55,7 @@
#ifndef ALLOCTEST #ifndef ALLOCTEST
# define freeh(p) { if (((void *)p != (void *)_zeroval_) && \ # define freeh(p) { if (!is_const(p)) { free((void *)(p)); } }
((void *)p != (void *)_oneval_)) free((void *)p); }
#endif #endif
@@ -289,6 +288,7 @@ typedef struct {
* Function prototypes for integer math routines. * Function prototypes for integer math routines.
*/ */
E_FUNC HALF * alloc(LEN len); E_FUNC HALF * alloc(LEN len);
E_FUNC int is_const(HALF* h);
#ifdef ALLOCTEST #ifdef ALLOCTEST
E_FUNC void freeh(HALF *); E_FUNC void freeh(HALF *);
#endif #endif
@@ -642,20 +642,97 @@ E_FUNC ZVALUE *swap_HALF_in_ZVALUE(ZVALUE *dest, ZVALUE *src, BOOL all);
/* /*
* constants used often by the arithmetic routines * constants used often by the arithmetic routines
*/ */
EXTERN HALF _zeroval_[], _oneval_[], _twoval_[], _threeval_[], _fourval_[]; EXTERN HALF _zeroval_[];
EXTERN HALF _fiveval_[], _sixval_[], _sevenval_[], _eightval_[], _nineval_[]; EXTERN ZVALUE _zero_;
EXTERN HALF _tenval_[], _elevenval_[], _twelveval_[], _thirteenval_[];
EXTERN HALF _fourteenval_[], _fifteenval_[]; EXTERN HALF _oneval_[];
EXTERN ZVALUE _one_;
EXTERN ZVALUE _neg_one_;
EXTERN HALF _twoval_[];
EXTERN ZVALUE _two_;
EXTERN HALF _threeval_[];
EXTERN ZVALUE _three_;
EXTERN HALF _fourval_[];
EXTERN ZVALUE _four_;
#if 0
EXTERN HALF _fiveval_[];
EXTERN ZVALUE _five_;
EXTERN HALF _sixval_[];
EXTERN ZVALUE _six_;
EXTERN HALF _sevenval_[];
EXTERN ZVALUE _seven_;
EXTERN HALF _eightval_[];
EXTERN ZVALUE _eight_;
#endif
EXTERN HALF _nineval_[];
EXTERN ZVALUE _nine_;
EXTERN HALF _tenval_[];
EXTERN ZVALUE _ten_;
EXTERN HALF _elevenval_[];
EXTERN ZVALUE _eleven_;
EXTERN HALF _twelveval_[];
EXTERN ZVALUE _twelve_;
EXTERN HALF _thirteenval_[];
EXTERN ZVALUE _thirteen_;
EXTERN HALF _fourteenval_[];
EXTERN ZVALUE _fourteen_;
EXTERN HALF _fifteenval_[];
EXTERN ZVALUE _fifteen_;
EXTERN HALF _sixteenval_[];
EXTERN ZVALUE _sixteen_;
EXTERN HALF _seventeenval_[];
EXTERN ZVALUE _seventeen_;
EXTERN HALF _eightteenval_[];
EXTERN ZVALUE _eightteen_;
EXTERN HALF _nineteenval_[];
EXTERN ZVALUE _nineteen_;
EXTERN HALF _twentyval_[];
EXTERN ZVALUE _twenty_;
EXTERN HALF _sqbaseval_[]; EXTERN HALF _sqbaseval_[];
EXTERN HALF _fourthbaseval_[]; EXTERN ZVALUE _sqbase_;
EXTERN HALF _threesixtyval_[], _fourhundredval_[], _twentyfourval_[];
EXTERN ZVALUE zconst[]; /* ZVALUE integers from 0 thru 15 */ EXTERN HALF _pow4baseval_[];
EXTERN ZVALUE _pow4base_;
EXTERN ZVALUE _zero_, _one_, _two_, _ten_, _neg_one_; EXTERN HALF _pow8baseval_[];
EXTERN ZVALUE _sqbase_, _pow4base_, _pow8base_; EXTERN ZVALUE _pow8base_;
EXTERN ZVALUE _b32_, _b64_; EXTERN HALF _threesixtyval_[];
EXTERN ZVALUE _threesixty_;
EXTERN HALF _fourhundredval_[];
EXTERN ZVALUE _fourhundred_;
EXTERN HALF _twentyfourval_[];
EXTERN ZVALUE _fourhundred_;
/* _b32_ is _sqbaseval_ or _pow4baseval_ depending on BASEB */
EXTERN ZVALUE _b32_;
/* _b64_ is _pow4baseval_ or _pow8baseval_ depending on BASEB */
EXTERN ZVALUE _b64_;
EXTERN HALF *half_tbl[]; /* preset HALF constants, NULL termated list */
EXTERN BOOL _math_abort_; /* nonzero to abort calculations */ EXTERN BOOL _math_abort_; /* nonzero to abort calculations */
EXTERN ZVALUE _tenpowers_[]; /* table of 10^2^n */ EXTERN ZVALUE _tenpowers_[]; /* table of 10^2^n */

View File

@@ -2532,11 +2532,11 @@ zsrandom4(CONST ZVALUE seed, CONST ZVALUE ip, CONST ZVALUE iq, long trials)
/* /*
* search the 'p' and 'q' Blum prime (3 mod 4) candidates * search the 'p' and 'q' Blum prime (3 mod 4) candidates
*/ */
if (!znextcand(ip, trials, _zero_, zconst[3], zconst[4], &p)) { if (!znextcand(ip, trials, _zero_, _three_, _four_, &p)) {
math_error("failed to find 1st Blum prime"); math_error("failed to find 1st Blum prime");
/*NOTREACHED*/ /*NOTREACHED*/
} }
if (!znextcand(iq, trials, _zero_, zconst[3], zconst[4], &q)) { if (!znextcand(iq, trials, _zero_, _three_, _four_, &q)) {
math_error("failed to find 2nd Blum prime"); math_error("failed to find 2nd Blum prime");
/*NOTREACHED*/ /*NOTREACHED*/
} }