www.pudn.com > calc.rar > init.c
/* init.c */ #include#include "stack.h" #include "integer.h" #include "calc.h" #ifdef _WIN32 #include "ytab.h" #else #include "y.tab.h" #endif #include "fun.h" #include "wrappers.h" void QSORTMPIX(); static struct { /* Built-ins which return POLYI */ char *name; POLYI (*func)(); int argTypes[3]; } builtinsp[]={ { "primitive", PRIMITIVEPI_W , {1, POLY,0 } } , { "deriv", DERIVPI_W , {1, POLY,0 } } , { "gcdpi", GCDPI_W , {2, POLY , POLY } } , { "cyclotomic", CYCLOTOMIC_W , {1, NUM,0} } , {0, 0} }; static struct { /* Built-ins which return *MPI */ char *name; MPI *(*func)(); int argTypes[10]; /* Type of function is well defined in builtins.txt */ } builtins[] = { { "gcd", GCD_W, {2, NUM, NUM } }, { "lcm", LCM_W, {2, NUM, NUM } }, { "lcma", LCM_ARRAY_W, {1, ARR} }, { "gcdv", EUCLIDI_W, {4, NUM, NUM, VARADR, VARADR} }, { "jacobi", JACOB_W, {2, NUM, NUM} }, { "peralta", SQRTMX_W, {2, NUM, NUM} }, { "gcda", GCD_ARRAY_W, {1, ARR} }, { "gcdav", GCD_ARRAYVX_W, {2, ARR, ARRADR} }, { "congr", CONGRX_W, {4, NUM, NUM, NUM, VARADR} }, { "chinese", CHINESEX_W, {5, NUM, NUM, NUM, NUM, VARADR} }, { "chinesea", CHINESE_ARRAYX_W, {3, ARR, ARR, VARADR} }, { "mthroot", BIG_MTHROOTX_W, {2, NUM, NUM} }, { "fund", FUND_UNITX_W, {3, NUM, VARADR, VARADR} }, { "pell", PELX_W, {4, NUM, NUM, VARADR, VARADR} }, { "surd", SURDX_W, {9, NUM, NUM, NUM, NUM, ARRADR, ARRADR, ARRADR, ARRADR, ARRADR} }, { "mpower", MPOWERX_W, {3, NUM, NUM, NUM} }, { "nprime", Nextprime_W, {1, NUM} }, { "inv", INVERSEMX_W, {2, NUM, NUM} }, { "factor", FACTORX_W, {1, NUM} }, { "tau", DIVISORX_W, {1, NUM} }, { "mobius", MOBIUSX_W, {1, NUM} }, { "euler", EULERX_W, {1, NUM} }, { "sigma", SIGMAX_W, {1, NUM} }, { "lprimroot", LPRIMROOTX_W, {1, NUM} }, /*{ "orderp", ORDERPX_W, {2, NUM, NUM} }, */ /* { "orderq", ORDERQX_W, {} }, */ { "orderm", ORDERMX_W, {2, NUM, NUM} }, /* { "lucasu", LUCASUX_W, {} }, { "lucasb", LUCASBX_W, {} }, */ { "lucas", LUCASX_W, {1, NUM} }, { "length", LENGTHX_W, {1, NUM} }, /* { "mult32", MULT32X_W, {} }, */ { "rsae", RSAE_W, {2, NUM, NUM} }, { "nprimeap", NEXTPRIMEAPX_W, {3, NUM, NUM, NUM} }, { "pollard", POLLARD_W, {1, NUM} }, { "elliptic", EFACTORX_W, {3, NUM, NUM, NUM} }, { "perfectpower", PERFECT_POWER_W, {1, NUM} }, /* { "random", RANDOMI_W, {} }, */ { "leastqnr", LEASTQNRX_W, {1, NUM} }, { "content", CONTENTPI2_W, {1, POLY} }, { "sqroot", SQROOT_W, {5, NUM, NUM, ARRADR, VARADR, VARADR} }, { "congq", QUADRATIC_W, {5, NUM, NUM, NUM, NUM, ARRADR} }, { "absmod", HALFMOD_W, {2, NUM, NUM} }, { "ceil", CEILINGI_W, {2, NUM, NUM} }, { "resultant", SUBRESULTANT_W, {2, POLY, POLY} }, { "discriminant", DISCRIMINANTPI_W, {1, POLY} }, { "primes", PRIME_GENERATOR_W, {2, NUM, NUM} }, { "sturmsequence", STURM_SEQUENCE_W, {3, POLY, NUM, NUM} }, { "classnop", POS_W, {1, NUM } }, { "classnon", NEG_W, {2, NUM, NUM } }, { "nearint", NEARINT_W, {2, NUM, NUM} }, { "reduceneg", REDUCE_NEG_W, {3, NUM, NUM, NUM} }, { "reducepos", REDUCE_POS_W, {3, NUM, NUM, NUM} }, { "classnop0", POS0_W, {1, NUM } }, { "tableneg", TABLENEG_W, {2, NUM, NUM} }, { "tablepos", TABLEPOS_W, {2, NUM, NUM} }, { "davison", DAVISON_W, {3, NUM, NUM, NUM} }, { "raney", RANEY1_W, {4, NUM, NUM, NUM, NUM} }, { "unimodular", UNIMODULAR_W, {4, NUM, NUM, NUM, NUM} }, { "sigmak", SIGMAK_W, {2, NUM, NUM} }, { "tauprimepower", TAU_PRIMEPOWER_W, {2, NUM, NUM} }, { "ramanujan", TAU_COMPOSITE_W, {1, NUM} }, { "repdefinite", REP_DEFINITE_W, {5, NUM, NUM, NUM, NUM, NUM} }, { "euclid1", EUCLIDI1_W, {2, NUM, NUM} }, { "cfracperiod", CFRAC_PERIOD_W, {1, NUM} }, { "cfracn", CFRACN_W, {1, NUM} }, { 0, 0 } }; static struct { /* Built-ins which return void */ char *name; void (*func)(); int argTypes[10]; } builtinsv[] = { { "serret", SERRET_W, {3, NUM, VARADR, VARADR} }, { "collatz", COLLATZ_W, {2, NUM, NUM} }, { "mthrootr", MTHROOTX_W, {4, NUM, NUM, NUM, NUM} }, { "miller", MILLERX_W, {2, NUM, NUM} }, { "juggler", JUGGLER_W, {2, NUM, NUM} }, { "hermite", HERMITE, {0} }, { "mlll", MLLL, {0} }, { "smith", SMITH, {0} }, { "encode", ENCODE_W, {2, NUM, NUM} }, { "decode", DECODEX_W, {3, NUM, NUM, NUM} }, { "egcd", EXTGCDX, {0} }, { "fp", FINCKE_POHSTX, {0} }, { "improvep", IMPROVEPX, {0} }, /*{ "qsort", QSORTMPIX_W, {} }, { "qsortmat", QSORTMATIX_W, {} }, */ { "sgcd", SCHNORRGCD_W, {1, NUM} }, { "inhomfp", SHORTESTTTX, {0} }, /*{ "fibmin", FIB_MIN_W, {} }, { "printww", PRINTWW_W, {} }, { "printdefect", PRINT_DEFECT_W, {} }, */ { "addcubicr", ADD_CUBICRX, {0} }, { "powercubicr", POWER_CUBICRX, {0} }, { "shallit", SHALLIT, {0} }, { "lucasmin", LUCAS_MIN, {0} }, { "lllgcd", LLLGCDX, {0} }, { "jacobigcd", JACOBIGCDX, {0} }, { "shermite", SCHNORRHERMITE_W, {1, NUM} }, { "lllhermite", LLLHERMITE1X, {0} }, /*{ "gcd33", GCD33_W, {} }, { "gcd4", GCD4_W, {} }, { "gcd5", GCD5_W, {} }, { "gcd6", GCD6_W, {} }, { "gcd10", GCD10_W, {} }, { "gcd11", GCD11_W, {} }, */ { "euclid", EUCLID_W, {7, NUM, NUM, ARRADR, ARRADR, ARRADR, ARRADR, VARADR} }, { "convergents", CONVERGENTS_W, {3, ARR, ARRADR, ARRADR } }, { "lagrange", LAGRANGE_W, {3, POLY, ARRADR, NUM} }, { "axb", AXB1, {0} }, /*{ "axb1", AXB_W, {} }, { "testaxb", TESTAXB_W, {} }, */ /*{ "changel",CHANGELX_W, {} }, { "fermatq",FERMAT_QUOTIENT_W, {} }, */ { "lllgcd0", LLLGCD0X, {0} }, { "slv", SLVECTORX, {0} }, /*{ "gcdconj", GCD_CONJ_W, {} }, { "gcd3", GCD3_W, {} }, { "conj4", GCDCONJECTURE4_W, {} }, { "conj5", GCDCONJECTURE5_W, {} }, { "conj6", GCDCONJECTURE6_W, {} }, { "conj7", GCDCONJECTURE7_W, {} }, { "conjm", GCDCONJECTUREM_W, {} }, */ { "absnearint", ABS_NEAREST_INTRX, {0} }, { "cycle", CYCLEX, {0} }, { "addcubicm", ADD_CUBICMX, {0} }, { "powercubicm", POWER_CUBICMX, {0} }, { "ordercubicm", ORDER_CUBICMX, {0} }, { "powercubicr", POWER_CUBICRX, {0} }, { "ordercubicr", ORDER_CUBICRX, {0} }, { "sturm", STURM_W, {1, POLY} }, { "rootexp", ROOTEXPANSION, {2, POLY, NUM} }, { "intlog", INTLOG, {4, NUM, NUM, NUM, NUM} }, { "intlog1", INTLOG1, {4, NUM, NUM, NUM, NUM} }, { "log1", LOG1, {5, NUM, NUM, NUM, NUM, NUM} }, { "intlog2", INTLOG2, {4, NUM, NUM, NUM, NUM} }, { "logg", LOGG, {5, NUM, NUM, NUM, NUM, NUM} }, { "log2", LOGGG, {6, NUM, NUM, NUM, NUM, NUM, NUM} }, { "sqroot1", SQROOT1_W, {3, NUM, NUM, NUM} }, { "sqroot2", SQROOT2_W, {2, NUM, NUM} }, { "sqroot3", SQROOT3_W, {3, NUM, NUM, NUM} }, { "cornacchia", CORNACCHIA_W, {3, NUM, NUM, NUM} }, { "patz", PATZ_W, {2, NUM, NUM} }, { "shankslog", SHANKSLOG, {4, NUM, NUM, NUM, NUM} }, /*{ "binaryform", BINARYFORM_W, {4, NUM, NUM, NUM, NUM} },*/ { "gauss", GAUSS_W, {7, NUM, NUM, NUM, NUM, VARADR, VARADR, VARADR} }, { "binform", BINFORM_W, {5, NUM, NUM, NUM, NUM, NUM} }, { "log", LOG_W, {6, NUM, NUM, NUM, NUM, ARRADR, VARADR} }, { "testlog1", TESTLOG1_W, {4, NUM, NUM, NUM, NUM} }, { "testlog", TESTLOG_W, {5, NUM, NUM, NUM, NUM, NUM} }, { "twoadicsqrt", TWOADICSQRT_W, {3, NUM, NUM, ARRADR} }, { "padicsqrt", PADICSQRT_W, {4, NUM, NUM, NUM, ARRADR} }, { "powerd", POWERD_W, {6, NUM, NUM, NUM, NUM, VARADR, VARADR} }, { 0, 0} }; void init() /* install built-ins in table */ { int i; Symbol *s; for (i = 0; builtins[i].name; i++) { s = installFunc(builtins[i].name, BLTIN, builtins[i].argTypes); s->u.ptr = builtins[i].func; } for (i = 0; builtinsp[i].name; i++) { s = installFunc(builtinsp[i].name, BLTINP, builtinsp[i].argTypes); s->u.ptrp = builtinsp[i].func; } for (i = 0; builtinsv[i].name; i++) { s = installFunc(builtinsv[i].name, BLTINV, builtinsv[i].argTypes); s->u.ptrv = builtinsv[i].func; } }