[BACK]Return to init.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / pari / src / language

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>