Annotation of OpenXM_contrib/pari/src/language/init.c, Revision 1.1
1.1 ! maekawa 1: /*******************************************************************/
! 2: /* */
! 3: /* INITIALIZING THE SYSTEM, ERRORS */
! 4: /* */
! 5: /*******************************************************************/
! 6: /* $Id: init.c,v 1.3 1999/09/24 15:28:35 karim Exp $ */
! 7: #include <string.h>
! 8: #include "pari.h"
! 9: #include "anal.h"
! 10: #ifdef _WIN32
! 11: # ifndef WINCE
! 12: # include <process.h>
! 13: # endif
! 14: #endif
! 15:
! 16: /* Variables statiques communes : */
! 17: FILE *pari_outfile, *errfile, *logfile, *infile;
! 18: GEN *polun, *polx;
! 19: GEN gnil, gzero, gun, gdeux, ghalf, polvar, gi;
! 20: GEN gpi=NULL, geuler=NULL, bernzone=NULL;
! 21: GEN primetab; /* private primetable */
! 22: byteptr diffptr;
! 23: char *current_logfile, *current_psfile;
! 24: int gp_colors[c_LAST];
! 25: int disable_color = 1, added_newline = 1, under_emacs = 0;
! 26:
! 27: int functions_tblsz = 135; /* size of functions_hash */
! 28: entree **varentries;
! 29:
! 30: jmp_buf environnement;
! 31: long *ordvar;
! 32: long DEBUGFILES,DEBUGLEVEL,DEBUGMEM,compatible;
! 33: long prec,precdl;
! 34: ulong init_opts = INIT_JMPm | INIT_SIGm;
! 35: ulong top, bot, avma, memused;
! 36:
! 37: void *foreignHandler; /* Handler for foreign commands. */
! 38: char foreignExprSwitch = 3; /* Just some unprobable char. */
! 39: GEN (*foreignExprHandler)(char*); /* Handler for foreign expressions.*/
! 40: entree * (*foreignAutoload)(char*, long); /* Autoloader */
! 41: void (*foreignFuncFree)(entree *); /* How to free external entree. */
! 42:
! 43: GEN (*gp_history_fun)(long, long, char *, char *);
! 44: int (*whatnow_fun)(char *, int);
! 45:
! 46: void initout(void);
! 47: int term_width(void);
! 48:
! 49: /*********************************************************************/
! 50: /* */
! 51: /* INITIALISATION DU SYSTEME */
! 52: /* */
! 53: /*********************************************************************/
! 54: static int var_not_changed; /* altered in reorder() */
! 55: static int try_to_recover = 0;
! 56: static long next_bloc;
! 57: static GEN cur_bloc=NULL; /* current bloc in bloc list */
! 58: static long *universal_constants;
! 59:
! 60: #ifdef WINCE
! 61: #else
! 62: static void
! 63: pari_sighandler(int sig)
! 64: {
! 65: char *msg;
! 66: switch(sig)
! 67: {
! 68: case SIGINT:
! 69: #ifdef _WIN32
! 70: # ifdef SIGBREAK
! 71: case SIGBREAK:
! 72: # endif
! 73: if (++win32ctrlc >= 5) _exit(3);
! 74: signal(sig,pari_sighandler);
! 75: return;
! 76: #endif
! 77: msg="user interrupt";
! 78: break;
! 79:
! 80: case SIGSEGV:
! 81: msg="segmentation fault: bug in PARI or calling program";
! 82: break;
! 83:
! 84: #ifdef SIGBUS
! 85: case SIGBUS:
! 86: msg="bus error: bug in PARI or calling program";
! 87: break;
! 88: #endif
! 89: }
! 90: signal(sig,pari_sighandler);
! 91: err(talker,msg);
! 92: }
! 93: #endif
! 94:
! 95: #ifdef _WIN32
! 96: int win32ctrlc = 0;
! 97:
! 98: void
! 99: dowin32ctrlc()
! 100: {
! 101: win32ctrlc = 0;
! 102: err(talker,"user interrupt");
! 103: }
! 104: #endif
! 105:
! 106: /* Initialize hashtable */
! 107: static void
! 108: init_hashtable(entree **table, int tblsz)
! 109: {
! 110: entree *ep, *ep1, *last;
! 111: long i, v;
! 112:
! 113: for (i = 0; i < tblsz; i++)
! 114: {
! 115: last = NULL; ep = table[i]; table[i] = NULL;
! 116: for ( ; ep; ep = ep1)
! 117: {
! 118: ep1 = ep->next; v = EpVALENCE(ep);
! 119: if (v == EpVAR || v == EpINSTALL) /* keep this one */
! 120: {
! 121: if (last)
! 122: last->next = ep;
! 123: else
! 124: table[i] = ep;
! 125: last = ep; last->next = NULL;
! 126: }
! 127: else freeep(ep);
! 128: }
! 129: }
! 130: }
! 131:
! 132: static void
! 133: fill_hashtable(entree **table, entree *ep, char **helpmessage)
! 134: {
! 135: long n;
! 136:
! 137: for ( ; ep->name; ep++)
! 138: {
! 139: EpSETSTATIC(ep);
! 140: ep->help = helpmessage? *helpmessage++: NULL;
! 141: n = hashvalue(ep->name);
! 142: ep->next = table[n]; table[n] = ep;
! 143: ep->args = NULL;
! 144: }
! 145: }
! 146:
! 147: void
! 148: init_defaults(int force)
! 149: {
! 150: static int done=0;
! 151:
! 152: if (done && !force) return;
! 153: done = 1;
! 154:
! 155: #ifdef LONG_IS_64BIT
! 156: prec=4;
! 157: #else
! 158: prec=5;
! 159: #endif
! 160:
! 161: precdl = 16;
! 162: compatible = NONE;
! 163: DEBUGFILES = DEBUGLEVEL = DEBUGMEM = 0;
! 164:
! 165: current_psfile = pari_strdup("pari.ps");
! 166: current_logfile= pari_strdup("pari.log");
! 167: logfile = NULL;
! 168: infile = stdin; pari_outfile = stdout; errfile = stderr;
! 169: initout(); next_bloc=0;
! 170: }
! 171:
! 172: /* does elt belong to list, after position start (excluded) ? */
! 173: static int
! 174: list_isin(void **list, void *elt, int start)
! 175: {
! 176: long indelt=0;
! 177:
! 178: if (list)
! 179: {
! 180: while (*list)
! 181: {
! 182: if (indelt>start && *list==elt) return indelt;
! 183: list++; indelt++;
! 184: }
! 185: }
! 186: return -1;
! 187: }
! 188:
! 189: static void
! 190: list_prepend(void ***listptr, void *elt)
! 191: {
! 192: void **list=*listptr;
! 193: long nbelt=0;
! 194:
! 195: if (list)
! 196: while (list[nbelt]) nbelt++;
! 197: list = (void **) gpmalloc(sizeof(void *)*(nbelt+2));
! 198: list[0]=elt;
! 199: if (nbelt)
! 200: {
! 201: memcpy(list+1,*listptr,nbelt*sizeof(void *));
! 202: free(*listptr);
! 203: }
! 204: list[nbelt+1]=NULL; *listptr=list;
! 205: }
! 206:
! 207: /* Load modlist in hashtable hash. If force == 0, do not load twice the
! 208: * same list in the same hashtable, which would only destroy user variables.
! 209: * As it stands keep a complete history (instead of most recent changes).
! 210: */
! 211: int
! 212: gp_init_entrees(module *modlist, entree **hash, int force)
! 213: {
! 214: static void **oldmodlist=NULL, **oldhash=NULL;
! 215:
! 216: if (!force)
! 217: {
! 218: const long indhash = list_isin(oldhash,(void *)hash,-1);
! 219: if (indhash != -1 && oldmodlist[indhash]==modlist) return 0;
! 220: }
! 221: /* record the new pair (hash,modlist) */
! 222: list_prepend(&oldmodlist,(void *)modlist);
! 223: list_prepend(&oldhash,(void *)hash);
! 224:
! 225: init_hashtable(hash,functions_tblsz);
! 226: while (modlist && modlist->func)
! 227: {
! 228: fill_hashtable(hash, modlist->func, modlist->help);
! 229: modlist++;
! 230: }
! 231: return (hash == functions_hash);
! 232: }
! 233:
! 234: module *pari_modules = NULL;
! 235: module *pari_oldmodules = NULL;
! 236: module *pari_membermodules = NULL;
! 237: entree **functions_hash = NULL;
! 238: entree **funct_old_hash = NULL;
! 239: entree **members_hash = NULL;
! 240:
! 241: /* add to modlist the functions in func, with helpmsg help */
! 242: void
! 243: pari_addfunctions(module **modlist_p, entree *func, char **help)
! 244: {
! 245: module *modlist = *modlist_p;
! 246: int nbmodules = 0;
! 247:
! 248: while (modlist && modlist->func) { nbmodules++; modlist++; }
! 249: modlist = *modlist_p;
! 250: *modlist_p = (module*) gpmalloc(sizeof(module)*(nbmodules+2));
! 251: if (nbmodules)
! 252: {
! 253: memcpy(1+ *modlist_p, modlist, sizeof(module)*nbmodules);
! 254: free(modlist);
! 255: }
! 256: modlist = *modlist_p;
! 257: modlist->func = func;
! 258: modlist->help = help;
! 259:
! 260: modlist += nbmodules+1;
! 261: modlist->func = NULL;
! 262: modlist->help = NULL;
! 263: }
! 264:
! 265: static long
! 266: fix_size(long a)
! 267: {
! 268: /* BYTES_IN_LONG*ceil(a/BYTES_IN_LONG) */
! 269: ulong b = a+BYTES_IN_LONG - (((a-1) & (BYTES_IN_LONG-1)) + 1);
! 270: if (b > VERYBIGINT) err(talker,"stack too large");
! 271: return b;
! 272: }
! 273:
! 274: void
! 275: pari_sig_init(void (*f)(int))
! 276: {
! 277: #ifdef WINCE
! 278: #else
! 279: #ifdef SIGBUS
! 280: signal(SIGBUS,f);
! 281: #endif
! 282: signal(SIGINT,f);
! 283: #ifdef SIGBREAK
! 284: signal(SIGBREAK,f);
! 285: #endif
! 286: signal(SIGSEGV,f);
! 287: #endif
! 288: }
! 289:
! 290: /* initialise les donnees de la bibliotheque PARI. Peut être précédée d'un
! 291: * appel à pari_addfunctions si on ajoute d'autres fonctions au pool de base.
! 292: */
! 293: void
! 294: pari_init(long parisize, long maxprime)
! 295: {
! 296: long n;
! 297: GEN p;
! 298:
! 299: init_defaults(0);
! 300: if (INIT_JMP && setjmp(environnement))
! 301: {
! 302: fprintferr(" *** Error in the PARI system. End of program.\n");
! 303: exit(1);
! 304: }
! 305: #ifndef WINCE
! 306: if (INIT_SIG) pari_sig_init(pari_sighandler);
! 307: #endif
! 308: parisize = fix_size(parisize);
! 309: #if __MWERKS__
! 310: {
! 311: OSErr resultCode;
! 312: Handle newHand = TempNewHandle(parisize,&resultCode);
! 313:
! 314: if (!newHand) err(memer);
! 315: HLock(newHand);
! 316: bot = (long)*newHand;
! 317: }
! 318: #else
! 319: bot = (long) gpmalloc(parisize);
! 320: #endif
! 321: top = avma = memused = bot+parisize;
! 322: diffptr = initprimes(maxprime);
! 323:
! 324: varentries = (entree**) gpmalloc((MAXVARN+1)*sizeof(entree*));
! 325: polvar = (GEN) gpmalloc((MAXVARN+1)*sizeof(long));
! 326: ordvar = (GEN) gpmalloc((MAXVARN+1)*sizeof(long));
! 327: polx = (GEN*) gpmalloc((MAXVARN+1)*sizeof(GEN));
! 328: polun = (GEN*) gpmalloc((MAXVARN+1)*sizeof(GEN));
! 329: polvar[0] = evaltyp(t_VEC) | evallg(1);
! 330: for (n=0; n <= MAXVARN; n++) ordvar[n] = n;
! 331:
! 332: /* 2 (gnil) + 2 (gzero) + 3 (gun) + 3 (gdeux) + 3 (half) + 3 (gi) */
! 333: p = universal_constants = (long *) gpmalloc(16*sizeof(long));
! 334:
! 335: gzero = p; p+=2; gnil = p; p+=2;
! 336: gzero[0] = gnil[0] = evaltyp(t_INT) | evallg(2);
! 337: gzero[1] = gnil[1] = evallgefint(2);
! 338:
! 339: gun = p; p+=3; gdeux = p; p+=3;
! 340: gun[0] = gdeux[0] = evaltyp(t_INT) | evallg(3);
! 341: gun[1] = gdeux[1] = evalsigne(1) | evallgefint(3);
! 342: gun[2] = 1; gdeux[2]= 2;
! 343:
! 344: ghalf = p; p+=3; gi = p; p+=3;
! 345: ghalf[0] = evaltyp(t_FRAC) | evallg(3);
! 346: ghalf[1] = un;
! 347: ghalf[2] = deux;
! 348: gi[0] = evaltyp(t_COMPLEX) | evallg(3);
! 349: gi[1] = zero;
! 350: gi[2] = un;
! 351: fetch_var(); /* create polx/polun[MAXVARN] */
! 352: primetab = (GEN) gpmalloc((NUMPRTBELT+2)*sizeof(long));
! 353: primetab[0] = evaltyp(t_VEC) | evallg(1);
! 354:
! 355: pari_addfunctions(&pari_modules, functions_basic,helpmessages_basic);
! 356: functions_hash = (entree **) gpmalloc(sizeof(entree*)*functions_tblsz);
! 357: for (n = 0; n < functions_tblsz; n++) functions_hash[n] = NULL;
! 358:
! 359: pari_addfunctions(&pari_oldmodules, oldfonctions,oldhelpmessage);
! 360: funct_old_hash = (entree **) gpmalloc(sizeof(entree*)*functions_tblsz);
! 361: for (n = 0; n < functions_tblsz; n++) funct_old_hash[n] = NULL;
! 362: gp_init_entrees(pari_oldmodules, funct_old_hash, 1);
! 363:
! 364: if (new_fun_set)
! 365: gp_init_entrees(pari_modules, functions_hash, 1);
! 366: else
! 367: gp_init_entrees(pari_oldmodules, functions_hash, 1);
! 368:
! 369: pari_addfunctions(&pari_membermodules, gp_member_list, NULL);
! 370: members_hash = (entree **) gpmalloc(sizeof(entree*)*functions_tblsz);
! 371: for (n = 0; n < functions_tblsz; n++) members_hash[n] = NULL;
! 372: gp_init_entrees(pari_membermodules, members_hash, 1);
! 373:
! 374: gp_history_fun = NULL;
! 375: whatnow_fun = NULL;
! 376: manage_var(2,NULL); /* init nvar */
! 377: var_not_changed = 1; fetch_named_var("x", 0);
! 378: try_to_recover=1;
! 379: }
! 380:
! 381: void
! 382: freeall()
! 383: {
! 384: long i;
! 385: entree *ep,*ep1;
! 386:
! 387: while (delete_var()) /* empty */;
! 388: for (i = 0; i < functions_tblsz; i++)
! 389: {
! 390: for (ep = functions_hash[i]; ep; ep = ep1)
! 391: {
! 392: ep1 = ep->next; freeep(ep);
! 393: }
! 394: for (ep = members_hash[i]; ep; ep = ep1)
! 395: {
! 396: ep1 = ep->next; freeep(ep);
! 397: }
! 398: }
! 399: free((void*)varentries); free((void*)ordvar); free((void*)polvar);
! 400: free((void*)polx[MAXVARN]); free((void*)polx); free((void*)polun);
! 401: free((void*)primetab);
! 402: free((void*)universal_constants);
! 403:
! 404: /* set first cell to 0 to inhibit recursion in all cases */
! 405: while (cur_bloc) { *cur_bloc=0; killbloc(cur_bloc); }
! 406: killallfiles(1);
! 407: free((void *)functions_hash);
! 408: free((void *)bot); free((void *)diffptr);
! 409: free(current_logfile);
! 410: free(current_psfile);
! 411:
! 412: if (gp_history_fun)
! 413: gp_history_fun(0,-1,NULL,NULL);
! 414: }
! 415:
! 416: GEN
! 417: getheap()
! 418: {
! 419: long m=0,l=0;
! 420: GEN x;
! 421:
! 422: for (x = cur_bloc; x; x = (GEN)bl_prev(x))
! 423: {
! 424: m++; l+=4;
! 425: if (! x[0]) /* user function */
! 426: l += (strlen((char *)(x+sizeof(entree*)))) / sizeof(long);
! 427: else if (x==bernzone)
! 428: l += x[0];
! 429: else /* GEN */
! 430: l += taille(x);
! 431: }
! 432: x=cgetg(3,t_VEC); x[1]=lstoi(m); x[2]=lstoi(l);
! 433: return x;
! 434: }
! 435:
! 436: /* Return x, where:
! 437: * x[-3]: adress of next bloc
! 438: * x[-2]: adress of preceding bloc.
! 439: * x[-1]: number of allocated blocs.
! 440: * x[0..n-1]: malloc-ed memory.
! 441: */
! 442: GEN
! 443: newbloc(long n)
! 444: {
! 445: long *x = (long *) gpmalloc((n + BL_HEAD)*sizeof(long)) + BL_HEAD;
! 446:
! 447: bl_next(x) = 0; /* the NULL address */
! 448: bl_prev(x) = (long)cur_bloc;
! 449: bl_num(x) = next_bloc++;
! 450: if (n) *x = 0; /* initialize first cell to 0. See killbloc */
! 451: if (cur_bloc) bl_next(cur_bloc) = (long)x;
! 452: if (DEBUGMEM)
! 453: {
! 454: if (!n) err(warner,"mallocing NULL object in newbloc");
! 455: if (DEBUGMEM > 2)
! 456: fprintferr("new bloc, size %6ld (no %ld): %08lx\n", n, next_bloc-1, x);
! 457: }
! 458: return cur_bloc = x;
! 459: }
! 460:
! 461: void
! 462: killbloc0(GEN x, int inspect)
! 463: {
! 464: long tx,lx,l,i,j;
! 465: GEN p1;
! 466:
! 467: if (!x || isonstack(x)) return;
! 468: if (bl_next(x)) bl_prev(bl_next(x)) = bl_prev(x);
! 469: else
! 470: {
! 471: cur_bloc = (GEN)bl_prev(x);
! 472: next_bloc = bl_num(x);
! 473: }
! 474: if (bl_prev(x)) bl_next(bl_prev(x)) = bl_next(x);
! 475: if (DEBUGMEM > 2)
! 476: fprintferr("killing bloc (no %ld): %08lx\n", bl_num(x), x);
! 477: if (inspect)
! 478: {
! 479: /* FIXME: SIGINT should be blocked at this point */
! 480: tx=typ(x); /* if x is not a GEN, we will have tx=0 */
! 481: if (is_vec_t(tx))
! 482: {
! 483: lx = lg(x);
! 484: for (i=1;i<lx;i++)
! 485: {
! 486: p1=(GEN)x[i];
! 487: if (isclone(p1)) killbloc(p1);
! 488: }
! 489: }
! 490: else if (tx==t_MAT)
! 491: {
! 492: lx = lg(x);
! 493: if (lx>1)
! 494: {
! 495: l=lg(x[1]);
! 496: if (l>1)
! 497: for (i=1;i<lx;i++)
! 498: for (j=1;j<l;j++)
! 499: {
! 500: p1=gmael(x,i,j);
! 501: if (isclone(p1)) killbloc(p1);
! 502: }
! 503: }
! 504: }
! 505: else if (tx==t_LIST)
! 506: {
! 507: lx = lgef(x);
! 508: for (i=2;i<lx;i++)
! 509: {
! 510: p1=(GEN)x[i];
! 511: if (isclone(p1)) killbloc(p1);
! 512: }
! 513: }
! 514: unsetisclone(x);
! 515: /* FIXME: SIGINT should be released here */
! 516: }
! 517: free((void *)bl_base(x));
! 518: }
! 519: void
! 520: killbloc(GEN x) { killbloc0(x,1); }
! 521: void
! 522: gunclone(GEN x) { killbloc0(x,0); }
! 523:
! 524: /********************************************************************/
! 525: /** **/
! 526: /** VARIABLE ORDERING **/
! 527: /** **/
! 528: /********************************************************************/
! 529:
! 530: /* Substitution globale des composantes du vecteur y aux variables de x */
! 531: GEN
! 532: changevar(GEN x, GEN y)
! 533: {
! 534: long tx,ty,lx,vx,vy,i,av,tetpil;
! 535: GEN p1,p2,z;
! 536:
! 537: if (var_not_changed && y==polvar) return x;
! 538: tx=typ(x); if (!is_recursive_t(tx)) return gcopy(x);
! 539: ty=typ(y); if (! is_vec_t(ty)) err(changer1);
! 540: if (is_scalar_t(tx))
! 541: {
! 542: if (tx!=t_POLMOD) return gcopy(x);
! 543: av=avma;
! 544: p1=changevar((GEN)x[1],y);
! 545: p2=changevar((GEN)x[2],y); tetpil=avma;
! 546: return gerepile(av,tetpil, gmodulcp(p2,p1));
! 547: }
! 548: if (is_rfrac_t(tx))
! 549: {
! 550: av=avma;
! 551: p1=changevar((GEN)x[1],y);
! 552: p2=changevar((GEN)x[2],y); tetpil=avma;
! 553: return gerepile(av,tetpil, gdiv(p1,p2));
! 554: }
! 555:
! 556: lx = (tx==t_POL)? lgef(x): lg(x);
! 557: if (tx == t_POL || tx == t_SER)
! 558: {
! 559: vx=varn(x)+1; if (vx>=lg(y)) return gcopy(x);
! 560: p1=(GEN)y[vx];
! 561: if (!signe(x))
! 562: {
! 563: vy=gvar(p1); if (vy>MAXVARN) err(changer1);
! 564: z=gcopy(x); setvarn(z,vy); return z;
! 565: }
! 566: av=avma; p2=changevar((GEN)x[lx-1],y);
! 567: for (i=lx-2; i>=2; i--)
! 568: {
! 569: p2 = gmul(p2,p1);
! 570: p2 = gadd(p2, changevar((GEN)x[i],y));
! 571: }
! 572: if (tx==t_SER)
! 573: {
! 574: p2 = gadd(p2, ggrando(p1,lx-2));
! 575: if (valp(x))
! 576: p2 = gmul(gpuigs(p1,valp(x)), p2);
! 577: }
! 578: return gerepileupto(av,p2);
! 579: }
! 580: z=cgetg(lx,tx);
! 581: for (i=1; i<lx; i++) z[i]=lchangevar((GEN)x[i],y);
! 582: return z;
! 583: }
! 584:
! 585: GEN
! 586: reorder(GEN x)
! 587: {
! 588: long tx,lx,i,n, nvar = manage_var(3,NULL);
! 589: int *var,*varsort,*t1;
! 590:
! 591: if (!x) return polvar;
! 592: tx=typ(x); lx=lg(x)-1;
! 593: if (! is_vec_t(tx)) err(typeer,"reorder");
! 594: if (! lx) return polvar;
! 595:
! 596: varsort = (int *) gpmalloc(lx*sizeof(int));
! 597: var = (int *) gpmalloc(lx*sizeof(int));
! 598: t1 = (int *) gpmalloc(nvar*sizeof(int));
! 599:
! 600: for (n=0; n<nvar; n++) t1[n] = 0;
! 601: for (n=0; n<lx; n++)
! 602: {
! 603: var[n] = i = gvar((GEN)x[n+1]);
! 604: varsort[n] = ordvar[var[n]]; /* position in polvar */
! 605: if (i >= nvar) err(talker,"variable out of range in reorder");
! 606: /* check if x is a permutation */
! 607: if (t1[i]) err(talker,"duplicated indeterminates in reorder");
! 608: t1[i] = 1;
! 609: }
! 610: qsort(varsort,lx,sizeof(int),(QSCOMP)pari_compare_int);
! 611:
! 612: for (n=0; n<lx; n++)
! 613: {
! 614: /* variables are numbered 0,1 etc... while polvar starts at 1. */
! 615: polvar[varsort[n]+1] = lpolx[var[n]];
! 616: ordvar[var[n]] = varsort[n];
! 617: }
! 618:
! 619: var_not_changed=1;
! 620: for (i=0; i<nvar; i++)
! 621: if (ordvar[i]!=i) { var_not_changed=0; break; }
! 622:
! 623: free(t1); free(var); free(varsort);
! 624: return polvar;
! 625: }
! 626:
! 627: /*******************************************************************/
! 628: /* */
! 629: /* ERROR RECOVERY */
! 630: /* */
! 631: /*******************************************************************/
! 632: int pop_val_if_newer(entree *ep, long loc);
! 633: void kill_from_hashlist(entree *ep);
! 634:
! 635: /* if flag = 0: record address of next bloc allocated.
! 636: * if flag = 1: (after an error) recover all memory allocated since last call
! 637: */
! 638: void
! 639: recover(int flag)
! 640: {
! 641: static long listloc;
! 642: long n;
! 643: entree *ep, *epnext;
! 644: #ifndef WINCE
! 645: void (*sigfun)(int);
! 646: #endif
! 647:
! 648: if (!flag) { listloc = next_bloc; return; }
! 649:
! 650: /* disable recover() and SIGINT. Better: sigint_[block|release] as in
! 651: * readline/rltty.c ? */
! 652: try_to_recover=0;
! 653: #ifndef WINCE
! 654: sigfun = signal(SIGINT, SIG_IGN);
! 655: #endif
! 656:
! 657: for (n = 0; n < functions_tblsz; n++)
! 658: for (ep = functions_hash[n]; ep; ep = epnext)
! 659: {
! 660: epnext = ep->next;
! 661: switch(EpVALENCE(ep))
! 662: {
! 663: case EpVAR:
! 664: while (pop_val_if_newer(ep,listloc)) /* empty */;
! 665: break;
! 666: case EpNEW:
! 667: kill_from_hashlist(ep);
! 668: break;
! 669: case EpUSER:
! 670: case EpALIAS:
! 671: case EpMEMBER:
! 672: if (bl_num(ep->value) >= listloc)
! 673: {
! 674: gunclone((GEN)ep->value);
! 675: ep->value = (void*)initial_value(ep);
! 676: kill_from_hashlist(ep);
! 677: }
! 678: }
! 679: }
! 680: #if 0
! 681: /* This causes SEGV on lists and GP-2.0 vectors: internal component is
! 682: * destroyed while global object is not updated. Two solutions:
! 683: * - comment it out: should not be a big memory problem except for huge
! 684: * vec. components. Has the added advantadge that the results computed so
! 685: * far are not lost.
! 686: *
! 687: * - tag every variable whose component has been modified in the last
! 688: * cycle. Untag it at the begining of each cycle. Maybe this should be
! 689: * done. But do we really want to destroy a huge global vector if one of
! 690: * its components was modified before the error ? (we don't copy the whole
! 691: * thing anymore). K.B.
! 692: */
! 693: {
! 694: GEN y;
! 695: for (x = cur_bloc; x && bl_num(x) >= listloc; x = y)
! 696: {
! 697: y = (GEN)bl_prev(x);
! 698: if (x != gpi && x != geuler && x != bernzone) killbloc(x);
! 699: }
! 700: }
! 701: #endif
! 702: try_to_recover=1;
! 703: #ifndef WINCE
! 704: signal(SIGINT, sigfun);
! 705: #endif
! 706: }
! 707:
! 708: void
! 709: disable_dbg(long val)
! 710: {
! 711: static long oldval = -1;
! 712: if (val < 0)
! 713: {
! 714: if (oldval >= 0) { DEBUGLEVEL = oldval; oldval = -1; }
! 715: }
! 716: else if (DEBUGLEVEL)
! 717: { oldval = DEBUGLEVEL; DEBUGLEVEL = val; }
! 718: }
! 719:
! 720: void
! 721: err_recover(long numerr)
! 722: {
! 723: pari_outfile=stdout; errfile=stderr;
! 724: disable_dbg(-1);
! 725: if (pariErr->die) pariErr->die(); /* Caller wants to catch exceptions? */
! 726: fprintferr("\n"); flusherr();
! 727: if (!environnement) exit(1);
! 728:
! 729: /* reclaim memory stored in "blocs" */
! 730: if (try_to_recover) recover(1);
! 731: /* allocate _after_ recover (otherwise we may inspect freed memory) */
! 732: if (numerr==errpile) (void)allocatemoremem(0);
! 733: longjmp(environnement, numerr);
! 734: }
! 735:
! 736: #define MAX_PAST 25
! 737: #define STR_LEN 20
! 738: /* Outputs a beautiful error message
! 739: * msg is errmessage to print.
! 740: * s points to the offending chars.
! 741: * entry tells how much we can go back from s[0].
! 742: */
! 743: static void
! 744: errcontext(char *msg, char *s, char *entry)
! 745: {
! 746: char *prefix = " *** ";
! 747: int past = (s-entry);
! 748: char str[STR_LEN + 2];
! 749: char *buf = gpmalloc(strlen(msg) + MAX_PAST + 5), *t = buf;
! 750:
! 751: sprintf(t,"%s: ", msg);
! 752: if (past <= 0) past = 0;
! 753: else
! 754: {
! 755: t += strlen(t);
! 756: if (past > MAX_PAST) { past=MAX_PAST; strcpy(t, "..."); t += 3; }
! 757: strncpy(t, s - past, past); t[past] = 0;
! 758: }
! 759:
! 760: t = str; if (!past) *t++ = ' ';
! 761: strncpy(t, s, STR_LEN); t[STR_LEN] = 0;
! 762: print_prefixed_text(buf, prefix, str); free(buf);
! 763: }
! 764:
! 765: #define op_err(ap, op) {\
! 766: long _x = va_arg(ap, long);\
! 767: long _y = va_arg(ap, long);\
! 768: (pariputsf(" %s %s %s.",type_name(_x),(op),type_name(_y)));\
! 769: }
! 770:
! 771: VOLATILE void
! 772: err(long numerr, ...)
! 773: {
! 774: char s[128], *ch1, ret = 0;
! 775: PariOUT *out = pariOut;
! 776: va_list ap;
! 777:
! 778: va_start(ap,numerr);
! 779: if (!added_newline) { pariputc('\n'); added_newline=1; }
! 780: pariflush(); pariOut = pariErr;
! 781: pariflush(); term_color(c_ERR);
! 782:
! 783: if (numerr < talker)
! 784: {
! 785: strcpy(s, errmessage[numerr]);
! 786: switch (numerr)
! 787: {
! 788: case obsoler:
! 789: ch1 = va_arg(ap,char *);
! 790: errcontext(s,ch1,va_arg(ap,char *));
! 791: if (whatnow_fun)
! 792: {
! 793: print_text("For full compatibility with GP 1.39, type \"default(compatible,3)\" (you can also set \"compatible = 3\" in your GPRC file)");
! 794: pariputc('\n');
! 795: term_color(c_NONE); ch1 = va_arg(ap,char *);
! 796: whatnow_fun(ch1, - va_arg(ap,int));
! 797: }
! 798: break;
! 799:
! 800: case openfiler:
! 801: sprintf(s+strlen(s), "%s file", va_arg(ap,char*));
! 802: ch1 = va_arg(ap,char *);
! 803: errcontext(s,ch1,ch1); break;
! 804:
! 805: case talker2:
! 806: case member:
! 807: strcat(s,va_arg(ap, char*)); /* fall through */
! 808: default:
! 809: ch1 = va_arg(ap,char *);
! 810: errcontext(s,ch1,va_arg(ap,char *));
! 811: }
! 812: }
! 813: else
! 814: {
! 815: pariputsf(" *** %s", errmessage[numerr]);
! 816: switch (numerr)
! 817: {
! 818: case talker:
! 819: ch1=va_arg(ap, char*);
! 820: vpariputs(ch1,ap); pariputs(".\n"); break;
! 821:
! 822: case impl:
! 823: ch1=va_arg(ap, char*);
! 824: pariputsf(" %s is not yet implemented.",ch1); break;
! 825:
! 826: case breaker: case typeer: case mattype1: case overwriter:
! 827: case accurer: case infprecer: case negexper: case polrationer:
! 828: case funder2: case constpoler: case notpoler: case redpoler:
! 829: case zeropoler: case consister: case flagerr:
! 830: pariputsf(" %s.",va_arg(ap, char*)); break;
! 831:
! 832: case bugparier:
! 833: pariputsf(" %s, please report",va_arg(ap, char*)); break;
! 834:
! 835: case assigneri: case assignerf:
! 836: op_err(ap, "-->"); break;
! 837: case gadderi: case gadderf:
! 838: op_err(ap, "+"); break;
! 839: case gmuleri: case gmulerf:
! 840: op_err(ap, "*"); break;
! 841: case gdiveri: case gdiverf:
! 842: op_err(ap, "/"); break;
! 843:
! 844: /* the following 4 are only warnings (they return) */
! 845: case warnmem: case warner:
! 846: pariputc(' '); ch1=va_arg(ap, char*);
! 847: vpariputs(ch1,ap); pariputs(".\n");
! 848: ret = 1; break;
! 849:
! 850: case warnprec:
! 851: vpariputs(" %s; new prec = %ld\n",ap);
! 852: ret = 1; break;
! 853:
! 854: case warnfile:
! 855: ch1=va_arg(ap, char*);
! 856: pariputsf(" %s: %s", ch1, va_arg(ap, char*));
! 857: }
! 858: }
! 859: term_color(c_NONE); va_end(ap);
! 860: pariOut = out; if (ret) { flusherr(); return; }
! 861: err_recover(numerr); exit(1); /* not reached */
! 862: }
! 863: #undef op_err
! 864:
! 865: /*******************************************************************/
! 866: /* */
! 867: /* STACK MANAGEMENT */
! 868: /* */
! 869: /*******************************************************************/
! 870: /* Inhibit some area gerepile-wise: declare it to be a non recursive
! 871: * type, of length l. Thus gerepile won't inspect the zone, just copy it.
! 872: * For the following situation:
! 873: * z = cgetg(t,a); garbage of length l;
! 874: * for (i=1; i<HUGE; i++) z[i] = ...
! 875: * stackdummy(z,l); z += l; We lose l words but save a costly gerepile.
! 876: */
! 877: void
! 878: stackdummy(GEN z, long l)
! 879: {
! 880: z[0] = evaltyp(t_STR) | evallg(l);
! 881: }
! 882:
! 883: /* Takes an array of pointers to GENs, of length n. Copies all
! 884: * objects to contiguous locations and cleans up the stack between
! 885: * av and avma.
! 886: */
! 887: void
! 888: gerepilemany(long av, GEN* gptr[], long n)
! 889: {
! 890: GEN *l = (GEN*)gpmalloc(n*sizeof(GEN));
! 891: long i;
! 892:
! 893: /* copy objects */
! 894: for (i=0; i<n; i++) l[i] = gclone(*(gptr[i]));
! 895: avma = av;
! 896: /* copy them back, kill clones */
! 897: for (--i; i>=0; i--)
! 898: {
! 899: *(gptr[i]) = forcecopy(l[i]);
! 900: gunclone(l[i]);
! 901: }
! 902: free(l);
! 903: }
! 904:
! 905: void
! 906: gerepilemanycoeffs(long av, GEN x, long n)
! 907: {
! 908: long i;
! 909:
! 910: /* copy objects */
! 911: for (i=0; i<n; i++) x[i] = lclone((GEN)x[i]);
! 912: avma = av;
! 913: /* copy them back, kill clones */
! 914: for (--i; i>=0; i--)
! 915: {
! 916: GEN p1 = (GEN)x[i];
! 917: x[i] = (long)forcecopy(p1); gunclone(p1);
! 918: }
! 919: }
! 920:
! 921: /* Takes an array of pointers to GENs, of length n.
! 922: * Cleans up the stack between av and tetpil, updating those GENs.
! 923: */
! 924: void
! 925: gerepilemanysp(long av, long tetpil, GEN* gptr[], long n)
! 926: {
! 927: const long av2 = avma, dec = av-tetpil;
! 928: long i;
! 929:
! 930: (void)gerepile(av,tetpil,NULL);
! 931: for (i=0; i<n; i++)
! 932: {
! 933: ulong *g1 = (ulong*) gptr[i];
! 934: if (*g1 < (ulong)tetpil)
! 935: {
! 936: if (*g1 >= (ulong)av2) *g1 += dec; /* Update address if in stack */
! 937: else if (*g1 >=(ulong)av) err(gerper);
! 938: }
! 939: }
! 940: }
! 941:
! 942: /* Takes an array of GENs (casted to longs), of length n. Cleans up the
! 943: * stack between av and tetpil, and update those GENs.
! 944: */
! 945: void
! 946: gerepilemanyvec(long av, long tetpil, long *g, long n)
! 947: {
! 948: const long av2 = avma, dec = av-tetpil;
! 949: long i;
! 950:
! 951: (void)gerepile(av,tetpil,NULL);
! 952: for (i=0; i<n; i++,g++)
! 953: if ((ulong)*g < (ulong)tetpil)
! 954: {
! 955: if ((ulong)*g >= (ulong)av2) *g += dec;/* Update addresses if in stack */
! 956: else if ((ulong)*g >= (ulong)av) err(gerper);
! 957: }
! 958: }
! 959:
! 960: GEN
! 961: gerepileupto(long av, GEN q)
! 962: {
! 963: if (!isonstack(q)) { avma=av; return q; } /* universal object */
! 964: /* empty garbage */
! 965: if ((ulong)av <= (ulong)q) return q;
! 966: /* The garbage is only empty when av==q. It's probably a mistake if
! 967: * av < q. But "temporary variables" from sumiter are a problem since
! 968: * ep->values are returned as-is by identifier() and they can be in the
! 969: * stack: if we put a gerepileupto in lisseq(), we get an error. Maybe add,
! 970: * if (DEBUGMEM) err(warner,"av>q in gerepileupto") ???
! 971: */
! 972:
! 973: /* Beware: (long)(q+i) --> ((long)q)+i*sizeof(long) */
! 974: return gerepile(av, (long) (q+lg(q)), q);
! 975: }
! 976:
! 977: /* internal */
! 978: GEN
! 979: gerepileuptoleaf(long av, GEN q)
! 980: {
! 981: long i;
! 982: GEN q0;
! 983:
! 984: if (!isonstack(q) || av==(long)q) { avma=av; return q; }
! 985: i=lg(q); avma = (long)(((GEN)av) - i);
! 986: q0 = (GEN)avma; while (--i >= 0) q0[i]=q[i];
! 987: return q0;
! 988: }
! 989: /* internal */
! 990: GEN
! 991: gerepileuptoint(long av, GEN q)
! 992: {
! 993: if (!isonstack(q) || av==(long)q) { avma=av; return q; }
! 994: avma = (long)icopy_av(q, (GEN)av);
! 995: return (GEN)avma;
! 996: }
! 997:
! 998: /* check that x and all its components are out of stack, or have been
! 999: * created after av */
! 1000: int
! 1001: ok_for_gerepileupto(long r, GEN x)
! 1002: {
! 1003: long i,lx = lg(x),tx = typ(x);
! 1004: if (! is_recursive_t(tx))
! 1005: return !isonstack(x) || x <= (GEN)r;
! 1006: if (x > (GEN)r)
! 1007: {
! 1008: err(warner,"bad object %Z\n",x);
! 1009: return 0;
! 1010: }
! 1011:
! 1012: lx = lg(x);
! 1013: if (tx==t_POL || tx==t_LIST) lx = lgef(x);
! 1014: for (i=lontyp[tx]; i<lx; i++)
! 1015: if (!ok_for_gerepileupto(r, (GEN)x[i]))
! 1016: {
! 1017: err(warner,"bad component %ld in object %Z\n",i,x);
! 1018: return 0;
! 1019: }
! 1020: return 1;
! 1021: }
! 1022:
! 1023: GEN
! 1024: gerepile(long av, long tetpil, GEN q)
! 1025: {
! 1026: long avmb, dec = av - tetpil;
! 1027: GEN ll,a,b;
! 1028:
! 1029: if (dec==0) return q;
! 1030: if (dec<0) err(talker,"lbot>ltop in gerepile");
! 1031:
! 1032: if ((ulong)q>=(ulong)avma && (ulong)q<(ulong)tetpil)
! 1033: q = (GEN) (((long)q) + dec);
! 1034:
! 1035: #if 1
! 1036: for (ll=(GEN)av, a=(GEN)tetpil; a > (GEN)avma; ) *--ll= *--a;
! 1037: avmb = (long)ll;
! 1038: #else /* slower */
! 1039: ll = (GEN)(avmb=avma+dec); a = (GEN)avma;
! 1040: for (i=((tetpil-avma)>>TWOPOTBYTES_IN_LONG)-1; i>=0; i--) ll[i] = a[i];
! 1041: #endif
! 1042:
! 1043: while (ll < (GEN)av)
! 1044: {
! 1045: const long tl=typ(ll);
! 1046:
! 1047: if (! is_recursive_t(tl)) { ll+=lg(ll); continue; }
! 1048: a = ll+lontyp[tl];
! 1049: if (tl==t_POL) { b=ll+lgef(ll); ll+=lg(ll); } else { ll+=lg(ll); b=ll; }
! 1050: for ( ; a<b; a++)
! 1051: if ((ulong)*a < (ulong)av && (ulong)*a >= (ulong)avma)
! 1052: {
! 1053: if ((ulong)*a < (ulong)tetpil) *a += dec; else err(gerper);
! 1054: }
! 1055: }
! 1056: avma = avmb; return q;
! 1057: }
! 1058:
! 1059: long
! 1060: allocatemoremem(ulong newsize)
! 1061: {
! 1062: long sizeold = top - bot, newbot;
! 1063:
! 1064: if (!newsize)
! 1065: {
! 1066: newsize = sizeold << 1;
! 1067: err(warner,"doubling stack size; new stack = %lu",newsize);
! 1068: }
! 1069: else if ((long)newsize < 0)
! 1070: err(talker,"required stack memory too small");
! 1071: /* can't do bot = malloc directly, in case we lack memory */
! 1072: newsize = fix_size(newsize);
! 1073: newbot = (long) gpmalloc(newsize);
! 1074: free((void*)bot); bot = newbot;
! 1075: memused = avma = top = bot + newsize;
! 1076: return newsize;
! 1077: }
! 1078:
! 1079: /* alternate stack management routine */
! 1080: stackzone *
! 1081: switch_stack(stackzone *z, long n)
! 1082: {
! 1083: if (!z)
! 1084: { /* create parallel stack */
! 1085: long size = n*sizeof(long) + sizeof(stackzone);
! 1086: z = (stackzone*) gpmalloc(size);
! 1087: z->zonetop = ((long)z) + size;
! 1088: return z;
! 1089: }
! 1090:
! 1091: if (n)
! 1092: { /* switch to parallel stack */
! 1093: z->bot = bot;
! 1094: z->top = top;
! 1095: z->avma = avma;
! 1096: z->memused = memused;
! 1097: bot = (long) (z+1);
! 1098: top = z->zonetop;
! 1099: avma = top;
! 1100: memused = (ulong)-1;
! 1101: }
! 1102: else
! 1103: { /* back to normalcy */
! 1104: bot = z->bot;
! 1105: top = z->top;
! 1106: avma = z->avma;
! 1107: memused = z->memused;
! 1108: }
! 1109: return NULL;
! 1110: }
! 1111:
! 1112: #if 0 /* for a specific broken machine (readline not correctly installed) */
! 1113: char *xmalloc(long x) { return malloc(x); }
! 1114: char *xrealloc(char *c,long x) { return realloc(c,x); }
! 1115: #endif
! 1116:
! 1117: char*
! 1118: gpmalloc(size_t bytes)
! 1119: {
! 1120: char *tmp;
! 1121:
! 1122: if (bytes)
! 1123: {
! 1124: tmp = (char *) malloc(bytes);
! 1125: if (!tmp) err(memer);
! 1126: return tmp;
! 1127: }
! 1128: if (DEBUGMEM)
! 1129: err(warner,"mallocing NULL object");
! 1130: return NULL;
! 1131: }
! 1132:
! 1133: #if __MWERKS__
! 1134: static void *
! 1135: macrealloc(void *p, size_t newsize, size_t oldsize)
! 1136: {
! 1137: char *q = gpmalloc(newsize), *qq = q, *pp = p;
! 1138: int l = newsize > oldsize ? oldsize : newsize;
! 1139:
! 1140: while (l--) *qq++ = *pp++;
! 1141: free(p); return q;
! 1142: }
! 1143: #endif
! 1144:
! 1145: char*
! 1146: gprealloc(void *pointer, size_t newsize, size_t oldsize)
! 1147: {
! 1148: char *tmp;
! 1149:
! 1150: if (!pointer) tmp = (char *) malloc(newsize);
! 1151: #if __MWERKS__
! 1152: else tmp = (char *) macrealloc(pointer,newsize,oldsize);
! 1153: #else
! 1154: else tmp = (char *) realloc(pointer,newsize);
! 1155: #endif
! 1156: if (!tmp) err(memer,oldsize);
! 1157: return tmp;
! 1158: }
! 1159:
! 1160: #ifdef MEMSTEP
! 1161: void
! 1162: checkmemory(GEN z)
! 1163: {
! 1164: if (DEBUGMEM && memused != (ulong)-1 &&
! 1165: ((GEN)memused > z + MEMSTEP || z > (GEN)memused + MEMSTEP))
! 1166: {
! 1167: memused=(ulong)z;
! 1168: #if MEMSTEP >= 1048576
! 1169: fprintferr("...%4.0lf Mbytes used\n",(top-memused)/1048576.);
! 1170: #else
! 1171: fprintferr("...%5.1lf Mbytes used\n",(top-memused)/1048576.);
! 1172: #endif
! 1173: }
! 1174: }
! 1175: #endif
! 1176:
! 1177: /*******************************************************************/
! 1178: /* */
! 1179: /* TIMER */
! 1180: /* */
! 1181: /*******************************************************************/
! 1182: #define MAX_TIMER 3
! 1183:
! 1184: #ifdef WINCE
! 1185: static long
! 1186: timer_proto(int i)
! 1187: {
! 1188: static DWORD oldticks[MAX_TIMER];
! 1189: DWORD ticks = GetTickCount();
! 1190: DWORD delay = ticks - oldticks[i];
! 1191: oldticks[i] = ticks;
! 1192: return delay;
! 1193:
! 1194: }
! 1195: #elif defined(macintosh)
! 1196: # include <Events.h>
! 1197: static long
! 1198: timer_proto(int i)
! 1199: {
! 1200: static long oldticks[MAX_TIMER];
! 1201: long ticks = TickCount(), delay = ticks - oldticks[i];
! 1202:
! 1203: oldticks[i] = ticks;
! 1204: return 50 * delay / 3;
! 1205: }
! 1206: #elif USE_TIMES
! 1207:
! 1208: # include <sys/times.h>
! 1209: # include <sys/time.h>
! 1210: static long
! 1211: timer_proto(int i)
! 1212: {
! 1213: static clock_t oldticks[MAX_TIMER];
! 1214: struct tms t;
! 1215: long delay;
! 1216:
! 1217: times(&t);
! 1218: delay = (long)((t.tms_utime - oldticks[i]) * (1000. / CLK_TCK));
! 1219: oldticks[i] = t.tms_utime;
! 1220: return delay;
! 1221: }
! 1222: #elif USE_GETRUSAGE
! 1223:
! 1224: # include <sys/time.h>
! 1225: # include <sys/resource.h>
! 1226: static long
! 1227: timer_proto(int i)
! 1228: {
! 1229: static long oldmusec[MAX_TIMER],oldsec[MAX_TIMER];
! 1230: struct rusage r;
! 1231: struct timeval t;
! 1232: long delay;
! 1233:
! 1234: getrusage(0,&r); t=r.ru_utime;
! 1235: delay = 1000 * (t.tv_sec - oldsec[i]) + (t.tv_usec - oldmusec[i]) / 1000;
! 1236: oldmusec[i] = t.tv_usec; oldsec[i] = t.tv_sec;
! 1237: return delay;
! 1238: }
! 1239: #elif USE_FTIME
! 1240:
! 1241: # include <sys/timeb.h>
! 1242: static long
! 1243: timer_proto(int i)
! 1244: {
! 1245: static long oldmsec[MAX_TIMER],oldsec[MAX_TIMER];
! 1246: struct timeb t;
! 1247: long delay;
! 1248:
! 1249: ftime(&t);
! 1250: delay = 1000 * (t.time - oldsec[i]) + (t.millitm - oldmsec[i]);
! 1251: oldmsec[i] = t.millitm; oldsec[i] = t.time;
! 1252: return delay;
! 1253: }
! 1254: #else
! 1255:
! 1256: # include <time.h>
! 1257: # ifndef CLOCKS_PER_SEC
! 1258: # define CLOCKS_PER_SEC 1000000 /* may be false on YOUR system */
! 1259: # endif
! 1260: static long
! 1261: timer_proto(int i)
! 1262: {
! 1263: static clock_t oldclocks[MAX_TIMER];
! 1264: clock_t t = clock();
! 1265: long delay = (long)((t-oldclocks[i]) * 1000. / CLOCKS_PER_SEC);
! 1266:
! 1267: oldclocks[i] = t;
! 1268: return delay;
! 1269: }
! 1270: #endif
! 1271:
! 1272: long
! 1273: gptimer() { return timer_proto(0); }
! 1274: long
! 1275: timer() { return timer_proto(1); }
! 1276: long
! 1277: timer2() { return timer_proto(2); }
! 1278:
! 1279: void
! 1280: msgtimer(char *format, ...)
! 1281: {
! 1282: va_list args;
! 1283: PariOUT *out = pariOut; pariOut = pariErr;
! 1284:
! 1285: pariputs("Time "); va_start(args, format);
! 1286: vpariputs(format,args); va_end(args);
! 1287: pariputsf(": %ld\n",timer2()); pariflush();
! 1288: pariOut = out;
! 1289: }
! 1290:
! 1291: /*******************************************************************/
! 1292: /* */
! 1293: /* FUNCTIONS KNOWN TO THE ANALYZER */
! 1294: /* */
! 1295: /*******************************************************************/
! 1296: void alias0(char *s, char *old);
! 1297: GEN break0(long n);
! 1298: GEN next0(long n);
! 1299: GEN return0(GEN x);
! 1300:
! 1301: GEN
! 1302: geni(void) { return gi; }
! 1303:
! 1304: /* List of GP functions:
! 1305: * ---------------------
! 1306: * Format (struct entree) :
! 1307: * char *name : name (under GP).
! 1308: * ulong valence : used to form arg list, now often handled by code.
! 1309: * void *value : For PREDEFINED FUNCTIONS: C function to call.
! 1310: * For USER FUNCTIONS: pointer to defining data (bloc) =
! 1311: * entree*: NULL, list of entree (arguments), NULL
! 1312: * char* : function text
! 1313: * long menu : which help section do we belong (See below).
! 1314: * char *code : argument list (See below).
! 1315: * entree *next : next entree (init to NULL, used in hashing code).
! 1316: * char *help : short help text (init to NULL).
! 1317: * void *args : For USER FUNCTIONS: default arguments (NULL terminated).
! 1318: * For VARIABLES: (esp. loop indexes): push_val history.
! 1319: * (while processing a loop, ep->value may not be a bloc)
! 1320: * menu:
! 1321: * -----
! 1322: * 1: Standard monadic or dyadic OPERATORS
! 1323: * 2: CONVERSIONS and similar elementary functions
! 1324: * 3: TRANSCENDENTAL functions
! 1325: * 4: NUMBER THEORETICAL functions
! 1326: * 5: Functions related to ELLIPTIC CURVES
! 1327: * 6: Functions related to general NUMBER FIELDS
! 1328: * 7: POLYNOMIALS and power series
! 1329: * 8: Vectors, matrices, LINEAR ALGEBRA and sets
! 1330: * 9: SUMS, products, integrals and similar functions
! 1331: * 10: GRAPHIC functions
! 1332: * 11: PROGRAMMING under GP
! 1333: *
! 1334: * code: describe function prototype. NULL = use valence instead.
! 1335: * -----
! 1336: * Arguments:
! 1337: * I input position (to be processed with lisexpr or lisseq).
! 1338: * G GEN
! 1339: * L long
! 1340: * S symbol (i.e GP function name)
! 1341: * V variable (same as S, but valence must equal EpVAR/EpGVAR)
! 1342: * n variable number
! 1343: * & *GEN
! 1344: * F Fake *GEN (function requires a *GEN, but we don't use the resulting GEN)
! 1345: * f Fake *long
! 1346: * p real precision (prec for the C library)
! 1347: * P series precision (precdl dor the C library)
! 1348: * r raw input (treated as a string without quotes).
! 1349: * Quoted args are copied as strings. Stops at first unquoted ')' or ','.
! 1350: * Special chars can be quoted using '\'. Ex : aa"b\n)"c => "aab\n)c".
! 1351: * s expanded string. Example: pi"x"2 yields "3.142x2".
! 1352: * The unquoted components can be of any pari type (converted according to
! 1353: * the current output format)
! 1354: * s* any number of strings (see s)
! 1355: * s*p idem, setting prettyp=1
! 1356: * s*t idem, in TeX format.
! 1357: * D Has a default value. Format is "Dvalue,type," (the ending comma is
! 1358: * mandatory). Ex: D0,L, (arg is long, 0 by default).
! 1359: * Special syntax:
! 1360: * if type = G, &, I or V: D[G&IV] all send NULL.
! 1361: * if type = v: Dn sends -1.
! 1362: *
! 1363: * The user-given args are read first, then completed by the defaults
! 1364: *
! 1365: * Return type (first char or immediately after 'x'): GEN by default, otherwise
! 1366: * l Return long
! 1367: * v Return void
! 1368: *
! 1369: * Syntax requirements:
! 1370: * = Separator '=' required.
! 1371: *
! 1372: * Origin:
! 1373: * x Installed foreign function. Put the ep of the function as the
! 1374: * first argument, fill the rest with PARI arguments,
! 1375: * then call installedHandler with these arguments.
! 1376: * Should be the first char in the code.
! 1377: *
! 1378: ****************************************************************************
! 1379: * If new codes are added, change identifier and skipidentifier.
! 1380: *
! 1381: * Currently the following functions have no code word:
! 1382: * 'O' 50, 'if' 80, 'until' 82, 'while' 81, 'global' 88,
! 1383: *
! 1384: * Valence 0 reserved for functions without mandatory args.
! 1385: * Valence 99 reserved for codes which do not correspond 1-to-1 to valences.
! 1386: * Any other valence (what to do with 0?) should correspond to exactly
! 1387: * one code.
! 1388: */
! 1389:
! 1390: entree functions_basic[]={
! 1391: {"Euler",0,(void*)mpeuler,3,"p"},
! 1392: {"I",0,(void*)geni,2,""},
! 1393: {"List",0,(void*)gtolist,2,"DG"},
! 1394: {"Mat",0,(void*)gtomat,2,"DG"},
! 1395: {"Mod",25,(void*)Mod0,2,"GGD0,L,"},
! 1396: {"O",50,NULL,7,NULL},
! 1397: {"Pi",0,(void*)mppi,3,"p"},
! 1398: {"Pol",14,(void*)gtopoly,2,"GDn"},
! 1399: {"Polrev",14,(void*)gtopolyrev,2,"GDn"},
! 1400: {"Qfb",99,(void*)Qfb0,2,"GGGDGp"},
! 1401: {"Ser",14,(void*)gtoser,2,"GDn"},
! 1402: {"Set",0,(void*)gtoset,2,"DG"},
! 1403: {"Str",0,(void*)strtoGENstr,2,"D\"\",s,D0,L,"},
! 1404: {"Vec",0,(void*)gtovec,2,"DG"},
! 1405: {"abs",1,(void*)gabs,3,"Gp"},
! 1406: {"acos",1,(void*)gacos,3,"Gp"},
! 1407: {"acosh",1,(void*)gach,3,"Gp"},
! 1408: {"addprimes",0,(void*)addprimes,4,"DG"},
! 1409: {"agm",29,(void*)agm,3,"GGp"},
! 1410: {"algdep",99,(void*)algdep0,8,"GLD0,L,p"},
! 1411: {"alias",99,(void*)alias0,11,"vrr"},
! 1412: {"arg",1,(void*)garg,3,"Gp"},
! 1413: {"asin",1,(void*)gasin,3,"Gp"},
! 1414: {"asinh",1,(void*)gash,3,"Gp"},
! 1415: {"atan",1,(void*)gatan,3,"Gp"},
! 1416: {"atanh",1,(void*)gath,3,"Gp"},
! 1417: {"bernfrac",11,(void*)bernfrac,3,"L"},
! 1418: {"bernreal",99,(void*)bernreal,3,"Lp"},
! 1419: {"bernvec",11,(void*)bernvec,3,"L"},
! 1420: {"besseljh",29,(void*)jbesselh,3,"GGp"},
! 1421: {"besselk",99,(void*)kbessel0,3,"GGD0,L,p"},
! 1422: {"bestappr",2,(void*)bestappr,4,"GG"},
! 1423: {"bezout",2,(void*)vecbezout,4,"GG"},
! 1424: {"bezoutres",2,(void*)vecbezoutres,4,"GG"},
! 1425: {"bigomega",18,(void*)gbigomega,4,"G"},
! 1426: {"binary",18,(void*)binaire,2,"G"},
! 1427: {"binomial",21,(void*)binome,4,"GL"},
! 1428: {"bittest",2,(void*)gbittest,2,"GG"},
! 1429: {"bnfcertify",10,(void*)certifybuchall,6,"lG"},
! 1430: {"bnfclassunit",99,(void*)bnfclassunit0,6,"GD0,L,DGp"},
! 1431: {"bnfclgp",99,(void*)classgrouponly,6,"GDGp"},
! 1432: {"bnfdecodemodule",2,(void*)decodemodule,6,"GG"},
! 1433: {"bnfinit",91,(void*)bnfinit0,6,"GD0,L,DGp"},
! 1434: {"bnfisintnorm",99,(void*)bnfisintnorm,6,"GG"},
! 1435: {"bnfisnorm",99,(void*)bnfisnorm,6,"GGD1,L,p"},
! 1436: {"bnfisprincipal",99,(void*)isprincipalall,6,"GGD1,L,"},
! 1437: {"bnfissunit",99,(void*)bnfissunit,6,"GGG"},
! 1438: {"bnfisunit",2,(void*)isunit,6,"GG"},
! 1439: {"bnfmake",1,(void*)bnfmake,6,"Gp"},
! 1440: {"bnfnarrow",18,(void*)buchnarrow,6,"G"},
! 1441: {"bnfreg",99,(void*)regulator,6,"GDGp"},
! 1442: {"bnfsignunit",18,(void*)signunits,6,"G"},
! 1443: {"bnfsunit",99,(void*)bnfsunit,6,"GGp"},
! 1444: {"bnfunit",1,(void*)buchfu,6,"Gp"},
! 1445: {"bnrL1",99,(void*)bnrL1,6,"GD0,L,p"},
! 1446: {"bnrclass",99,(void*)bnrclass0,6,"GGD0,L,p"},
! 1447: {"bnrclassno",2,(void*)rayclassno,6,"GG"},
! 1448: {"bnrclassnolist",2,(void*)rayclassnolist,6,"GG"},
! 1449: {"bnrconductor",62,(void*)bnrconductor,6,"GDGDGD0,L,p"},
! 1450: {"bnrconductorofchar",29,(void*)bnrconductorofchar,6,"GGp"},
! 1451: {"bnrdisc",62,(void*)bnrdisc0,6,"GDGDGD0,L,p"},
! 1452: {"bnrdisclist",99,(void*)bnrdisclist0,6,"GGDGD0,L,"},
! 1453: {"bnrinit",99,(void*)bnrinit0,6,"GGD0,L,p"},
! 1454: {"bnrisconductor",99,(void*)bnrisconductor,6,"lGDGDGp"},
! 1455: {"bnrisprincipal",99,(void*)isprincipalrayall,6,"GGD1,L,"},
! 1456: {"bnrrootnumber",99,(void*)bnrrootnumber,6,"GGD0,L,p"},
! 1457: {"bnrstark",99,(void*)bnrstark,6,"GGD0,L,p"},
! 1458: {"break",0,(void*)break0,11,"D1,L,"},
! 1459: {"ceil",18,(void*)gceil,2,"G"},
! 1460: {"centerlift",99,(void*)centerlift0,2,"GDn"},
! 1461: {"changevar",2,(void*)changevar,2,"GG"},
! 1462: {"charpoly",99,(void*)charpoly0,8,"GDnD0,L,"},
! 1463: {"chinese",2,(void*)chinois,4,"GG"},
! 1464: {"component",21,(void*)compo,2,"GL"},
! 1465: {"concat",99,(void*)concat,8,"GDG"},
! 1466: {"conj",18,(void*)gconj,2,"G"},
! 1467: {"conjvec",1,(void*)conjvec,2,"Gp"},
! 1468: {"content",18,(void*)content,4,"G"},
! 1469: {"contfrac",99,(void*)sfcont0,4,"GDGD0,L,"},
! 1470: {"contfracpnqn",18,(void*)pnqn,4,"G"},
! 1471: {"core",99,(void*)core0,4,"GD0,L,"},
! 1472: {"coredisc",99,(void*)coredisc0,4,"GD0,L,"},
! 1473: {"cos",1,(void*)gcos,3,"Gp"},
! 1474: {"cosh",1,(void*)gch,3,"Gp"},
! 1475: {"cotan",1,(void*)gcotan,3,"Gp"},
! 1476: {"denominator",18,(void*)denom,2,"G"},
! 1477: {"deriv",14,(void*)deriv,7,"GDn"},
! 1478: {"dilog",1,(void*)dilog,3,"Gp"},
! 1479: {"dirdiv",2,(void*)dirdiv,7,"GG"},
! 1480: {"direuler",99,(void*)direuler,7,"V=GGI"},
! 1481: {"dirmul",2,(void*)dirmul,7,"GG"},
! 1482: {"dirzetak",2,(void*)dirzetak,6,"GG"},
! 1483: {"divisors",18,(void*)divisors,4,"G"},
! 1484: {"divrem",2,(void*)gdiventres,1,"GG"},
! 1485: {"eint1",99,(void*)veceint1,3,"GDGp"},
! 1486: {"elladd",3,(void*)addell,5,"GGG"},
! 1487: {"ellak",2,(void*)akell,5,"GG"},
! 1488: {"ellan",23,(void*)anell,5,"GL"},
! 1489: {"ellap",25,(void*)ellap0,5,"GGD0,L,"},
! 1490: {"ellbil",99,(void*)bilhell,5,"GGGp"},
! 1491: {"ellchangecurve",2,(void*)coordch,5,"GG"},
! 1492: {"ellchangepoint",2,(void*)pointch,5,"GG"},
! 1493: {"elleisnum",99,(void*)elleisnum,5,"GLD0,L,p"},
! 1494: {"elleta",1,(void*)elleta,5,"Gp"},
! 1495: {"ellglobalred",18,(void*)globalreduction,5,"G"},
! 1496: {"ellheight",99,(void*)ellheight0,5,"GGD0,L,p"},
! 1497: {"ellheightmatrix",29,(void*)mathell,5,"GGp"},
! 1498: {"ellinit",99,(void*)ellinit0,5,"GD0,L,p"},
! 1499: {"ellisoncurve",20,(void*)oncurve,5,"lGG"},
! 1500: {"ellj",1,(void*)jell,5,"Gp"},
! 1501: {"elllocalred",2,(void*)localreduction,5,"GG"},
! 1502: {"elllseries",99,(void*)lseriesell,5,"GGDGp"},
! 1503: {"ellorder",2,(void*)orderell,5,"GG"},
! 1504: {"ellordinate",29,(void*)ordell,5,"GGp"},
! 1505: {"ellpointtoz",29,(void*)zell,5,"GGp"},
! 1506: {"ellpow",99,(void*)powell,5,"GGGp"},
! 1507: {"ellrootno",99,(void*)ellrootno,5,"lGDG"},
! 1508: {"ellsigma",99,(void*)ellsigma,5,"GGD0,L,p"},
! 1509: {"ellsub",99,(void*)subell,5,"GGGp"},
! 1510: {"elltaniyama",1,(void*)taniyama,5,"Gp"},
! 1511: {"elltors",99,(void*)elltors0,5,"GD0,L,p"},
! 1512: {"ellwp",99,(void*)ellwp0,5,"GDGD0,L,pP"},
! 1513: {"ellzeta",99,(void*)ellzeta,5,"GGp"},
! 1514: {"ellztopoint",29,(void*)pointell,5,"GGp"},
! 1515: {"erfc",1,(void*)gerfc,3,"Gp"},
! 1516: {"eta",99,(void*)eta0,3,"GD0,L,p"},
! 1517: {"eulerphi",18,(void*)gphi,4,"G"},
! 1518: {"eval",18,(void*)geval,7,"G"},
! 1519: {"exp",1,(void*)gexp,3,"Gp"},
! 1520: {"factor",99,(void*)factor0,4,"GD-1,L,"},
! 1521: {"factorback",99,(void*)factorback,4,"GDG"},
! 1522: {"factorcantor",2,(void*)factcantor,4,"GG"},
! 1523: {"factorff",3,(void*)factmod9,4,"GGG"},
! 1524: {"factorial",99,(void*)mpfactr,4,"Lp"},
! 1525: {"factorint",99,(void*)factorint,4,"GD0,L,"},
! 1526: {"factormod",25,(void*)factormod0,4,"GGD0,L,"},
! 1527: {"factornf",2,(void*)polfnf,6,"GG"},
! 1528: {"factorpadic",99,(void*)factorpadic0,7,"GGLD0,L,"},
! 1529: {"ffinit",99,(void*)ffinit,4,"GLDn"},
! 1530: {"fibonacci",11,(void*)fibo,4,"L"},
! 1531: {"floor",18,(void*)gfloor,2,"G"},
! 1532: {"for",83,(void*)forpari,11,"vV=GGI"},
! 1533: {"fordiv",84,(void*)fordiv,11,"vGVI"},
! 1534: {"forprime",83,(void*)forprime,11,"vV=GGI"},
! 1535: {"forstep",86,(void*)forstep,11,"vV=GGGI"},
! 1536: {"forsubgroup",99,(void*)forsubgroup,11,"vV=GD0,L,I"},
! 1537: {"forvec",87,(void*)forvec,11,"vV=GID0,L,"},
! 1538: {"frac",18,(void*)gfrac,2,"G"},
! 1539: {"galoisfixedfield",99,(void*)galoisfixedfield,6,"GGDG"},
! 1540: {"galoisinit",99,(void*)galoisinit,6,"GDG,"},
! 1541: {"galoispermtopol",2,(void*)galoispermtopol,6,"GG"},
! 1542: {"gamma",1,(void*)ggamma,3,"Gp"},
! 1543: {"gammah",1,(void*)ggamd,3,"Gp"},
! 1544: {"gcd",25,(void*)gcd0,4,"GGD0,L,"},
! 1545: {"getheap",0,(void*)getheap,11,""},
! 1546: {"getrand",0,(void*)getrand,11,"l"},
! 1547: {"getstack",0,(void*)getstack,11,"l"},
! 1548: {"gettime",0,(void*)gettime,11,"l"},
! 1549: {"hilbert",99,(void*)hil0,4,"lGGDG"},
! 1550: {"hyperu",99,(void*)hyperu,3,"GGGp"},
! 1551: {"idealadd",3,(void*)idealadd,6,"GGG"},
! 1552: {"idealaddtoone",99,(void*)idealaddtoone0,6,"GGDG"},
! 1553: {"idealappr",25,(void*)idealappr0,6,"GGD0,L,"},
! 1554: {"idealchinese",3,(void*)idealchinese,6,"GGG"},
! 1555: {"idealcoprime",3,(void*)idealcoprime,6,"GGG"},
! 1556: {"idealdiv",99,(void*)idealdiv0,6,"GGGD0,L,"},
! 1557: {"idealfactor",2,(void*)idealfactor,6,"GG"},
! 1558: {"idealhnf",99,(void*)idealhnf0,6,"GGDG"},
! 1559: {"idealintersect",3,(void*)idealintersect,6,"GGG"},
! 1560: {"idealinv",25,(void*)idealinv0,6,"GGD0,L,"},
! 1561: {"ideallist",99,(void*)ideallist0,6,"GLD4,L,"},
! 1562: {"ideallistarch",99,(void*)ideallistarch0,6,"GGDGD0,L,"},
! 1563: {"ideallog",99,(void*)zideallog,6,"GGGp"},
! 1564: {"idealmin",99,(void*)minideal,6,"GGGp"},
! 1565: {"idealmul",99,(void*)idealmul0,6,"GGGD0,L,p"},
! 1566: {"idealnorm",2,(void*)idealnorm,6,"GG"},
! 1567: {"idealpow",99,(void*)idealpow0,6,"GGGD0,L,p"},
! 1568: {"idealprimedec",29,(void*)primedec,6,"GGp"},
! 1569: {"idealprincipal",2,(void*)principalideal,6,"GG"},
! 1570: {"idealred",99,(void*)ideallllred,6,"GGDGp"},
! 1571: {"idealstar",99,(void*)idealstar0,6,"GGD1,L,"},
! 1572: {"idealtwoelt",99,(void*)ideal_two_elt0,6,"GGDG"},
! 1573: {"idealval",30,(void*)idealval,6,"lGGG"},
! 1574: {"ideleprincipal",29,(void*)principalidele,6,"GGp"},
! 1575: {"if",80,NULL,11,NULL},
! 1576: {"imag",18,(void*)gimag,2,"G"},
! 1577: {"incgam",99,(void*)incgam0,3,"GGDGp"},
! 1578: {"incgamc",29,(void*)incgam3,3,"GGp"},
! 1579: {"intformal",14,(void*)integ,7,"GDn"},
! 1580: {"intnum",99,(void*)intnum0,9,"V=GGID0,L,p"},
! 1581: {"isfundamental",18,(void*)gisfundamental,4,"G"},
! 1582: {"isprime",18,(void*)gisprime,4,"G"},
! 1583: {"ispseudoprime",18,(void*)gispsp,4,"G"},
! 1584: {"issquare",99,(void*)gcarrecomplet,4,"GD&"},
! 1585: {"issquarefree",18,(void*)gissquarefree,4,"G"},
! 1586: {"kronecker",2,(void*)gkronecker,4,"GG"},
! 1587: {"lcm",2,(void*)glcm,4,"GG"},
! 1588: {"length",10,(void*)glength,2,"lG"},
! 1589: {"lex",20,(void*)lexcmp,2,"lGG"},
! 1590: {"lift",99,(void*)lift0,2,"GDn"},
! 1591: {"lindep",99,(void*)lindep0,8,"GD0,L,p"},
! 1592: {"listcreate",11,(void*)listcreate,8,"L"},
! 1593: {"listinsert",99,(void*)listinsert,8,"GGL"},
! 1594: {"listkill",99,(void*)listkill,8,"vG"},
! 1595: {"listput",25,(void*)listput,8,"GGD0,L,"},
! 1596: {"listsort",99,(void*)listsort,8,"GD0,L,"},
! 1597: {"lngamma",1,(void*)glngamma,3,"Gp"},
! 1598: {"log",99,(void*)log0,3,"GD0,L,p"},
! 1599: {"matadjoint",18,(void*)adj,8,"G"},
! 1600: {"matalgtobasis",2,(void*)matalgtobasis,6,"GG"},
! 1601: {"matbasistoalg",2,(void*)matbasistoalg,6,"GG"},
! 1602: {"matcompanion",18,(void*)assmat,8,"G"},
! 1603: {"matdet",99,(void*)det0,8,"GD0,L,"},
! 1604: {"matdetint",18,(void*)detint,8,"G"},
! 1605: {"matdiagonal",18,(void*)diagonal,8,"G"},
! 1606: {"mateigen",1,(void*)eigen,8,"Gp"},
! 1607: {"mathess",18,(void*)hess,8,"G"},
! 1608: {"mathilbert",11,(void*)mathilbert,8,"L"},
! 1609: {"mathnf",99,(void*)mathnf0,8,"GD0,L,"},
! 1610: {"mathnfmod",2,(void*)hnfmod,8,"GG"},
! 1611: {"mathnfmodid",2,(void*)hnfmodid,8,"GG"},
! 1612: {"matid",11,(void*)idmat,8,"L"},
! 1613: {"matimage",99,(void*)matimage0,8,"GD0,L,"},
! 1614: {"matimagecompl",18,(void*)imagecompl,8,"G"},
! 1615: {"matindexrank",18,(void*)indexrank,8,"G"},
! 1616: {"matintersect",2,(void*)intersect,8,"GG"},
! 1617: {"matinverseimage",2,(void*)inverseimage,8,"GG"},
! 1618: {"matisdiagonal",10,(void*)isdiagonal,8,"lG"},
! 1619: {"matker",99,(void*)matker0,8,"GD0,L,p"},
! 1620: {"matkerint",99,(void*)matkerint0,8,"GD0,L,"},
! 1621: {"matmuldiagonal",2,(void*)matmuldiagonal,8,"GG"},
! 1622: {"matmultodiagonal",2,(void*)matmultodiagonal,8,"GG"},
! 1623: {"matpascal",99,(void*)matqpascal,8,"LDG"},
! 1624: {"matrank",10,(void*)rank,8,"lG"},
! 1625: {"matrix",49,(void*)matrice,8,"GGDVDVDI"},
! 1626: {"matrixqz",2,(void*)matrixqz0,8,"GG"},
! 1627: {"matsize",18,(void*)matsize,8,"G"},
! 1628: {"matsnf",99,(void*)matsnf0,8,"GD0,L,"},
! 1629: {"matsolve",2,(void*)gauss,8,"GG"},
! 1630: {"matsolvemod",99,(void*)matsolvemod0,8,"GGGD0,L,"},
! 1631: {"matsupplement",1,(void*)suppl,8,"Gp"},
! 1632: {"mattranspose",18,(void*)gtrans,8,"G"},
! 1633: {"max",2,(void*)gmax,1,"GG"},
! 1634: {"min",2,(void*)gmin,1,"GG"},
! 1635: {"modreverse",18,(void*)polymodrecip,6,"G"},
! 1636: {"moebius",18,(void*)gmu,4,"G"},
! 1637: {"newtonpoly",2,(void*)newtonpoly,6,"GG"},
! 1638: {"next",0,(void*)next0,11,"D1,L,"},
! 1639: {"nextprime",18,(void*)gnextprime,4,"G"},
! 1640: {"nfalgtobasis",2,(void*)algtobasis,6,"GG"},
! 1641: {"nfbasis",99,(void*)nfbasis0,6,"GD0,L,DG"},
! 1642: {"nfbasistoalg",2,(void*)basistoalg,6,"GG"},
! 1643: {"nfdetint",2,(void*)nfdetint,6,"GG"},
! 1644: {"nfdisc",99,(void*)nfdiscf0,6,"GD0,L,DG"},
! 1645: {"nfeltdiv",3,(void*)element_div,6,"GGG"},
! 1646: {"nfeltdiveuc",3,(void*)nfdiveuc,6,"GGG"},
! 1647: {"nfeltdivmodpr",4,(void*)element_divmodpr,6,"GGGG"},
! 1648: {"nfeltdivrem",3,(void*)nfdivres,6,"GGG"},
! 1649: {"nfeltmod",3,(void*)nfmod,6,"GGG"},
! 1650: {"nfeltmul",3,(void*)element_mul,6,"GGG"},
! 1651: {"nfeltmulmodpr",4,(void*)element_mulmodpr2,6,"GGGG"},
! 1652: {"nfeltpow",3,(void*)element_pow,6,"GGG"},
! 1653: {"nfeltpowmodpr",4,(void*)element_powmodpr,6,"GGGG"},
! 1654: {"nfeltreduce",3,(void*)element_reduce,6,"GGG"},
! 1655: {"nfeltreducemodpr",3,(void*)nfreducemodpr2,6,"GGG"},
! 1656: {"nfeltval",30,(void*)element_val,6,"lGGG"},
! 1657: {"nffactor",99,(void*)nffactor,6,"GG"},
! 1658: {"nffactormod",99,(void*)nffactormod,6,"GGG"},
! 1659: {"nfgaloisapply",3,(void*)galoisapply,6,"GGG"},
! 1660: {"nfgaloisconj",99,(void*)galoisconj0,6,"GD0,L,DGp"},
! 1661: {"nfhilbert",99,(void*)nfhilbert0,6,"lGGGDG"},
! 1662: {"nfhnf",2,(void*)nfhermite,6,"GG"},
! 1663: {"nfhnfmod",3,(void*)nfhermitemod,6,"GGG"},
! 1664: {"nfinit",99,(void*)nfinit0,6,"GD0,L,p"},
! 1665: {"nfisideal",20,(void*)isideal,6,"lGG"},
! 1666: {"nfisincl",2,(void*)nfisincl,6,"GG"},
! 1667: {"nfisisom",2,(void*)nfisisom,6,"GG"},
! 1668: {"nfkermodpr",3,(void*)nfkermodpr,6,"GGG"},
! 1669: {"nfmodprinit",2,(void*)nfmodprinit,6,"GG"},
! 1670: {"nfnewprec",1,(void*)nfnewprec,6,"Gp"},
! 1671: {"nfroots",99,(void*)nfroots,6,"GG"},
! 1672: {"nfrootsof1",1,(void*)rootsof1,6,"Gp"},
! 1673: {"nfsnf",2,(void*)nfsmith,6,"GG"},
! 1674: {"nfsolvemodpr",4,(void*)nfsolvemodpr,6,"GGGG"},
! 1675: {"nfsubfields",99,(void*)subfields0,6,"GDG"},
! 1676: {"norm",18,(void*)gnorm,2,"G"},
! 1677: {"norml2",18,(void*)gnorml2,2,"G"},
! 1678: {"numdiv",18,(void*)gnumbdiv,4,"G"},
! 1679: {"numerator",18,(void*)numer,2,"G"},
! 1680: {"numtoperm",24,(void*)permute,2,"LG"},
! 1681: {"omega",18,(void*)gomega,4,"G"},
! 1682: {"padicappr",2,(void*)apprgen9,7,"GG"},
! 1683: {"padicprec",20,(void*)padicprec,2,"lGG"},
! 1684: {"permtonum",18,(void*)permuteInv,2,"G"},
! 1685: {"polcoeff",99,(void*)polcoeff0,2,"GLDn"},
! 1686: {"polcompositum",25,(void*)polcompositum0,6,"GGD0,L,"},
! 1687: {"polcyclo",99,(void*)cyclo,7,"LDn"},
! 1688: {"poldegree",99,(void*)poldegree,7,"lGDn"},
! 1689: {"poldisc",99,(void*)poldisc0,7,"GDn"},
! 1690: {"poldiscreduced",18,(void*)reduceddiscsmith,7,"G"},
! 1691: {"polgalois",99,(void*)galois,6,"Gp"},
! 1692: {"polinterpolate",31,(void*)polint,7,"GGDGD&"},
! 1693: {"polisirreducible",18,(void*)gisirreducible,7,"G"},
! 1694: {"pollead",99,(void*)pollead,7,"GDn"},
! 1695: {"pollegendre",99,(void*)legendre,7,"LDn"},
! 1696: {"polrecip",18,(void*)polrecip,7,"G"},
! 1697: {"polred",99,(void*)polred0,6,"GD0,L,DGp"},
! 1698: {"polredabs",99,(void*)polredabs0,6,"GD0,L,p"},
! 1699: {"polredord",1,(void*)ordred,6,"Gp"},
! 1700: {"polresultant",99,(void*)polresultant0,7,"GGDnD0,L,"},
! 1701: {"polroots",99,(void*)roots0,7,"GD0,L,p"},
! 1702: {"polrootsmod",25,(void*)rootmod0,7,"GGD0,L,"},
! 1703: {"polrootspadic",32,(void*)rootpadic,7,"GGL"},
! 1704: {"polsturm",99,(void*)sturmpart,7,"lGDGDG"},
! 1705: {"polsubcyclo",99,(void*)subcyclo,6,"GGDn"},
! 1706: {"polsylvestermatrix",29,(void*)sylvestermatrix,7,"GGp"},
! 1707: {"polsym",21,(void*)polsym,7,"GL"},
! 1708: {"poltchebi",99,(void*)tchebi,7,"LDn"},
! 1709: {"poltschirnhaus",18,(void*)tschirnhaus,6,"G"},
! 1710: {"polylog",99,(void*)polylog0,3,"LGD0,L,p"},
! 1711: {"polzagier",99,(void*)polzag,7,"LL"},
! 1712: {"precision",99,(void*)precision0,2,"GD0,L,"},
! 1713: {"precprime",18,(void*)gprecprime,4,"G"},
! 1714: {"prime",11,(void*)prime,4,"L"},
! 1715: {"primes",11,(void*)primes,4,"L"},
! 1716: {"prod",47,(void*)produit,9,"V=GGIDG"},
! 1717: {"prodeuler",37,(void*)prodeuler,9,"V=GGIp"},
! 1718: {"prodinf",99,(void*)prodinf0,9,"V=GID0,L,p"},
! 1719: {"psi",1,(void*)gpsi,3,"Gp"},
! 1720: {"qfbclassno",99,(void*)qfbclassno0,4,"GD0,L,"},
! 1721: {"qfbcompraw",2,(void*)compraw,4,"GG"},
! 1722: {"qfbhclassno",18,(void*)hclassno,4,"G"},
! 1723: {"qfbnucomp",3,(void*)nucomp,4,"GGG"},
! 1724: {"qfbnupow",2,(void*)nupow,4,"GG"},
! 1725: {"qfbpowraw",23,(void*)powraw,4,"GL"},
! 1726: {"qfbprimeform",29,(void*)primeform,4,"GGp"},
! 1727: {"qfbred",99,(void*)qfbred0,4,"GD0,L,DGDGDG"},
! 1728: {"qfgaussred",18,(void*)sqred,8,"G"},
! 1729: {"qfjacobi",1,(void*)jacobi,8,"Gp"},
! 1730: {"qflll",99,(void*)qflll0,8,"GD0,L,p"},
! 1731: {"qflllgram",99,(void*)qflllgram0,8,"GD0,L,p"},
! 1732: {"qfminim",33,(void*)minim0,8,"GGGD0,L,p"},
! 1733: {"qfperfection",18,(void*)perf,8,"G"},
! 1734: {"qfsign",18,(void*)signat,8,"G"},
! 1735: {"quadclassunit",96,(void*)quadclassunit0,4,"GD0,L,DGp"},
! 1736: {"quaddisc",18,(void*)quaddisc,4,"G"},
! 1737: {"quadgen",18,(void*)quadgen,4,"G"},
! 1738: {"quadhilbert",99,(void*)quadhilbert,4,"GDGp"},
! 1739: {"quadpoly",99,(void*)quadpoly0,4,"GDn"},
! 1740: {"quadray",99,(void*)quadray,4,"GGDGp"},
! 1741: {"quadregulator",1,(void*)gregula,4,"Gp"},
! 1742: {"quadunit",1,(void*)gfundunit,4,"Gp"},
! 1743: {"random",0,(void*)genrand,2,"DG"},
! 1744: {"real",18,(void*)greal,2,"G"},
! 1745: {"removeprimes",0,(void*)removeprimes,4,"DG"},
! 1746: {"reorder",0,(void*)reorder,11,"DG"},
! 1747: {"return",0,(void*)return0,11,"DG"},
! 1748: {"rnfalgtobasis",2,(void*)rnfalgtobasis,6,"GG"},
! 1749: {"rnfbasis",2,(void*)rnfbasis,6,"GG"},
! 1750: {"rnfbasistoalg",2,(void*)rnfbasistoalg,6,"GG"},
! 1751: {"rnfcharpoly",99,(void*)rnfcharpoly,6,"GGGDn"},
! 1752: {"rnfconductor",29,(void*)rnfconductor,6,"GGp"},
! 1753: {"rnfdedekind",99,(void*)rnfdedekind,6,"GGG"},
! 1754: {"rnfdet",99,(void*)rnfdet0,6,"GGDG"},
! 1755: {"rnfdisc",2,(void*)rnfdiscf,6,"GG"},
! 1756: {"rnfeltabstorel",2,(void*)rnfelementabstorel,6,"GG"},
! 1757: {"rnfeltdown",2,(void*)rnfelementdown,6,"GG"},
! 1758: {"rnfeltreltoabs",2,(void*)rnfelementreltoabs,6,"GG"},
! 1759: {"rnfeltup",2,(void*)rnfelementup,6,"GG"},
! 1760: {"rnfequation",25,(void*)rnfequation0,6,"GGD0,L,"},
! 1761: {"rnfhnfbasis",2,(void*)rnfhermitebasis,6,"GG"},
! 1762: {"rnfidealabstorel",2,(void*)rnfidealabstorel,6,"GG"},
! 1763: {"rnfidealdown",2,(void*)rnfidealdown,6,"GG"},
! 1764: {"rnfidealhnf",2,(void*)rnfidealhermite,6,"GG"},
! 1765: {"rnfidealmul",2,(void*)rnfidealmul,6,"GG"},
! 1766: {"rnfidealnormabs",2,(void*)rnfidealnormabs,6,"GG"},
! 1767: {"rnfidealnormrel",2,(void*)rnfidealnormrel,6,"GG"},
! 1768: {"rnfidealreltoabs",2,(void*)rnfidealreltoabs,6,"GG"},
! 1769: {"rnfidealtwoelt",2,(void*)rnfidealtwoelement,6,"GG"},
! 1770: {"rnfidealup",2,(void*)rnfidealup,6,"GG"},
! 1771: {"rnfinit",29,(void*)rnfinitalg,6,"GGp"},
! 1772: {"rnfisfree",20,(void*)rnfisfree,6,"lGG"},
! 1773: {"rnfisnorm",99,(void*)rnfisnorm,6,"GGGD1,L,p"},
! 1774: {"rnfkummer",99,(void*)rnfkummer,6,"GGD0,L,p"},
! 1775: {"rnflllgram",99,(void*)rnflllgram,6,"GGGp"},
! 1776: {"rnfnormgroup",2,(void*)rnfnormgroup,6,"GG"},
! 1777: {"rnfpolred",29,(void*)rnfpolred,6,"GGp"},
! 1778: {"rnfpolredabs",99,(void*)rnfpolredabs,6,"GGD0,L,p"},
! 1779: {"rnfpseudobasis",2,(void*)rnfpseudobasis,6,"GG"},
! 1780: {"rnfsteinitz",2,(void*)rnfsteinitz,6,"GG"},
! 1781: {"round",99,(void*)round0,2,"GD&"},
! 1782: {"serconvol",2,(void*)convol,7,"GG"},
! 1783: {"serlaplace",18,(void*)laplace,7,"G"},
! 1784: {"serreverse",18,(void*)recip,7,"G"},
! 1785: {"setintersect",2,(void*)setintersect,8,"GG"},
! 1786: {"setisset",10,(void*)setisset,8,"lG"},
! 1787: {"setminus",2,(void*)setminus,8,"GG"},
! 1788: {"setrand",99,(void*)setrand,11,"lL"},
! 1789: {"setsearch",99,(void*)setsearch,8,"lGGD0,L,"},
! 1790: {"setunion",2,(void*)setunion,8,"GG"},
! 1791: {"shift",99,(void*)gshift,1,"GL"},
! 1792: {"shiftmul",99,(void*)gmul2n,1,"GL"},
! 1793: {"sigma",99,(void*)gsumdivk,4,"GD1,L,"},
! 1794: {"sign",10,(void*)gsigne,1,"lG"},
! 1795: {"simplify",18,(void*)simplify,2,"G"},
! 1796: {"sin",1,(void*)gsin,3,"Gp"},
! 1797: {"sinh",1,(void*)gsh,3,"Gp"},
! 1798: {"sizebyte",10,(void*)taille2,2,"lG"},
! 1799: {"sizedigit",10,(void*)gsize,2,"lG"},
! 1800: {"solve",37,(void*)zbrent,9,"V=GGIp"},
! 1801: {"sqr",18,(void*)gsqr,3,"G"},
! 1802: {"sqrt",1,(void*)gsqrt,3,"Gp"},
! 1803: {"sqrtint",1,(void*)racine,4,"Gp"},
! 1804: {"subgrouplist",99,(void*)subgrouplist0,6,"GD0,L,D0,L,p"},
! 1805: {"subst",26,(void*)gsubst,7,"GnG"},
! 1806: {"sum",48,(void*)somme,9,"V=GGIDG"},
! 1807: {"sumalt",99,(void*)sumalt0,9,"V=GID0,L,p"},
! 1808: {"sumdiv",22,(void*)divsum,9,"GVI"},
! 1809: {"suminf",27,(void*)suminf,9,"V=GIp"},
! 1810: {"sumpos",99,(void*)sumpos0,9,"V=GID0,L,p"},
! 1811: {"tan",1,(void*)gtan,3,"Gp"},
! 1812: {"tanh",1,(void*)gth,3,"Gp"},
! 1813: {"taylor",12,(void*)tayl,7,"GnP"},
! 1814: {"teichmuller",1,(void*)teich,3,"Gp"},
! 1815: {"theta",29,(void*)theta,3,"GGp"},
! 1816: {"thetanullk",99,(void*)thetanullk,3,"GL"},
! 1817: {"thue",99,(void*)thue,7,"GGDG"},
! 1818: {"thueinit",99,(void*)thueinit,7,"GD0,L,p"},
! 1819: {"trace",1,(void*)gtrace,8,"Gp"},
! 1820: {"truncate",99,(void*)trunc0,2,"GD&"},
! 1821: {"until",82,NULL,11,NULL},
! 1822: {"valuation",20,(void*)ggval,2,"lGG"},
! 1823: {"variable",18,(void*)gpolvar,2,"G"},
! 1824: {"vecextract",99,(void*)extract0,8,"GGDG"},
! 1825: {"vecmax",1,(void*)vecmax,1,"Gp"},
! 1826: {"vecmin",1,(void*)vecmin,1,"Gp"},
! 1827: {"vecsort",99,(void*)vecsort0,8,"GDGD0,L,"},
! 1828: {"vector",28,(void*)vecteur,8,"GDVDI"},
! 1829: {"vectorv",28,(void*)vvecteur,8,"GDVDI"},
! 1830: {"weber",99,(void*)weber0,3,"GD0,L,p"},
! 1831: {"while",81,NULL,11,NULL},
! 1832: {"zeta",1,(void*)gzeta,3,"Gp"},
! 1833: {"zetak",99,(void*)gzetakall,6,"GGD0,L,p"},
! 1834: {"zetakinit",1,(void*)initzeta,6,"Gp"},
! 1835: {"znlog",2,(void*)znlog,4,"GG"},
! 1836: {"znorder",18,(void*)order,4,"G"},
! 1837: {"znprimroot",18,(void*)ggener,4,"G"},
! 1838: {"znstar",1,(void*)znstar,4,"Gp"},
! 1839:
! 1840: /* DO NOT REMOVE THIS BLANK LINE: chname & helpsynchro depend on it */
! 1841: {NULL,0,NULL,0,NULL} /* sentinel */
! 1842: };
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>