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