source: git/Singular/iparith.cc @ 3ebd198

spielwiese
Last change on this file since 3ebd198 was 3ebd198, checked in by Hans Schönemann <hannes@…>, 26 years ago
* hannes: iparith.cc ipconv.cc: added conversion list <-> resolution git-svn-id: file:///usr/local/Singular/svn/trunk@1306 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 150.2 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/*
5* ABSTRACT: table driven kernel interface, used by interpreter
6*/
7
8#include <stdlib.h>
9#include <string.h>
10#include <ctype.h>
11
12#include <stdio.h>
13#include <time.h>
14
15#ifndef macintosh
16#include <unistd.h>
17#endif
18
19#include "mod2.h"
20#include "tok.h"
21#include "ipid.h"
22#include "intvec.h"
23#include "mmemory.h"
24#include "febase.h"
25#include "longalg.h"
26#include "polys.h"
27#include "ideals.h"
28#include "matpol.h"
29#include "kstd1.h"
30#include "timer.h"
31#include "ring.h"
32#include "subexpr.h"
33#include "lists.h"
34#include "numbers.h"
35#include "stairc.h"
36#include "maps.h"
37#include "syz.h"
38#include "weight.h"
39#include "ipconv.h"
40#include "ipprint.h"
41#include "sing_dld.h"
42#include "attrib.h"
43#include "silink.h"
44#ifdef HAVE_FACTORY
45#include "clapsing.h"
46#include "kstdfac.h"
47#endif
48#ifdef HAVE_FGLM
49#include "fglm.h"
50#endif
51#include "ipshell.h"
52
53/*=============== types =====================*/
54struct sValCmdTab
55{
56  short cmd;
57  short start;
58};
59
60typedef sValCmdTab jjValCmdTab[];
61
62/* ifdef GENTABLE: definitions are in ipshell.h */
63#ifndef GENTABLE
64typedef char * (*Proc1)(char *);
65struct sValCmd1
66{
67  proc1 p;
68  short cmd;
69  short res;
70  short arg;
71};
72
73typedef BOOLEAN (*proc2)(leftv,leftv,leftv);
74struct sValCmd2
75{
76  proc2 p;
77  short cmd;
78  short res;
79  short arg1;
80  short arg2;
81};
82
83typedef BOOLEAN (*proc3)(leftv,leftv,leftv,leftv);
84struct sValCmd3
85{
86  proc3 p;
87  short cmd;
88  short res;
89  short arg1;
90  short arg2;
91  short arg3;
92};
93struct sValCmdM
94{
95  proc1 p;
96  short cmd;
97  short res;
98  short number_of_args; /* -1: any, -2: any >0, .. */
99};
100#endif
101
102
103/*============= proc =======================*/
104static int iiTabIndex(const jjValCmdTab dArithTab, const int len, const int op);
105#ifdef MDEBUG
106#define jjMakeSub(A) jjDBMakeSub(A,__FILE__,__LINE__)
107static Subexpr jjDBMakeSub(leftv e,char *f, int l);
108#else
109static Subexpr jjMakeSub(leftv e);
110#endif
111
112
113/*============= vars ======================*/
114extern int cmdtok;
115extern BOOLEAN expected_parms;
116
117int iiOp; /* the current operation*/
118
119#ifdef GENTABLE
120cmdnames cmds[] =
121{  // name-string alias tokval          toktype
122  { "$INVALID$",   0, -1,                 0},
123  { "and",         0, '&' ,               '&'},
124  { "attrib",      0, ATTRIB_CMD ,        CMD_123},
125  { "bareiss",     0, BAREISS_CMD ,       CMD_1},
126  { "betti",       0, BETTI_CMD ,         CMD_1},
127  { "break",       0, BREAK_CMD ,         BREAK_CMD},
128  { "char",        0, CHARACTERISTIC_CMD ,CMD_1},
129  { "char_series", 0, CHAR_SERIES_CMD ,   CMD_1},
130  { "charstr",     0, CHARSTR_CMD ,       CMD_1},
131  { "cleardenom",  0, CONTENT_CMD ,       CMD_1},
132  { "close",       0, CLOSE_CMD ,         CMD_1},
133  { "coef",        0, COEF_CMD ,          CMD_M},
134  { "coeffs",      0, COEFFS_CMD ,        CMD_23},
135  { "continue",    0, CONTINUE_CMD ,      CONTINUE_CMD},
136  { "contract",    0, CONTRACT_CMD ,      CMD_2},
137  { "dbprint",     0, DBPRINT_CMD ,       CMD_M},
138  { "def",         0, DEF_CMD ,           ROOT_DECL},
139  { "defined",     0, DEFINED_CMD ,       CMD_1},
140  { "deg",         0, DEG_CMD ,           CMD_12},
141  { "degree",      0, DEGREE_CMD ,        CMD_1},
142  { "delete",      0, DELETE_CMD ,        CMD_2},
143  { "det",         0, DET_CMD ,           CMD_1},
144  { "diff",        0, DIFF_CMD ,          CMD_2},
145  { "dim",         0, DIM_CMD ,           CMD_1},
146  { "div",         0, INTDIV ,            INTDIV},
147//#ifdef DRING
148  { "dring",       0, DRING_CMD ,         DRING_CMD},
149//#endif
150  { "dump",        0, DUMP_CMD,           CMD_1},
151  { "extgcd",      0, EXTGCD_CMD ,        CMD_2},
152  { "EXTGCD",      2, EXTGCD_CMD ,        CMD_2},
153  { "eliminate",   0, ELIMINATION_CMD,    CMD_23},
154  { "else",        0, ELSE_CMD ,          ELSE_CMD},
155  { "eval",        0, EVAL ,              EVAL},
156  { "example",     0, EXAMPLE_CMD ,       EXAMPLE_CMD},
157  { "execute",     0, EXECUTE_CMD ,       EXECUTE_CMD},
158  { "export",      0, EXPORT_CMD ,        EXPORT_CMD},
159  { "factorize",   0, FAC_CMD ,           CMD_12},
160  { "fetch",       0, FETCH_CMD ,         CMD_2},
161  { "fglm",        0, FGLM_CMD ,          CMD_2},
162  { "find",        0, FIND_CMD ,          CMD_23},
163  { "finduni",     0, FINDUNI_CMD,        CMD_1},
164  { "forif",       0, IF_CMD ,            IF_CMD},
165  { "freemodule",  0, FREEMODULE_CMD ,    CMD_1},
166  { "facstd",      0, FACSTD_CMD ,        CMD_12},
167  { "gen",         0, E_CMD ,             CMD_1},
168  { "getdump",     0, GETDUMP_CMD,        CMD_1},
169  { "gcd",         0, GCD_CMD ,           CMD_2},
170  { "GCD",         2, GCD_CMD ,           CMD_2},
171  { "hilb",        0, HILBERT_CMD ,       CMD_12},
172  { "homog",       0, HOMOG_CMD ,         CMD_12},
173  { "ideal",       0, IDEAL_CMD ,         IDEAL_CMD},
174  { "if",          0, IF_CMD ,            IF_CMD},
175  { "imap",        0, IMAP_CMD ,          CMD_2},
176  { "indepSet",    0, INDEPSET_CMD ,      CMD_1},
177  { "insert",      0, INSERT_CMD ,        CMD_23},
178  { "int",         0, INT_CMD ,           ROOT_DECL},
179  { "interred",    0, INTERRED_CMD ,      CMD_1},
180  { "intersect",   0, INTERSECT_CMD ,     CMD_M},
181  { "intmat",      0, INTMAT_CMD ,        INTMAT_CMD},
182  { "intvec",      0, INTVEC_CMD ,        ROOT_DECL_LIST},
183  { "jacob",       0, JACOB_CMD ,         CMD_1},
184  { "jet",         0, JET_CMD ,           CMD_23},
185  { "kbase",       0, KBASE_CMD ,         CMD_12},
186  { "keepring",    0, KEEPRING_CMD ,      KEEPRING_CMD},
187  { "kill",        0, KILL_CMD ,          KILL_CMD},
188  { "killattrib",  0, KILLATTR_CMD ,      CMD_12},
189  { "koszul",      0, KOSZUL_CMD ,        CMD_23},
190  { "lead",        0, LEAD_CMD ,          CMD_1},
191  { "leadcoef",    0, LEADCOEF_CMD ,      CMD_1},
192  { "leadexp",     0, LEADEXP_CMD ,       CMD_1},
193  { "LIB",         0, LIB_CMD ,           SYSVAR},
194  { "lift",        0, LIFT_CMD ,          CMD_2},
195  { "liftstd",     0, LIFTSTD_CMD ,       CMD_2},
196  { "link",        0, LINK_CMD ,          ROOT_DECL},
197  { "listvar",     0, LISTVAR_CMD ,       LISTVAR_CMD},
198  { "list",        0, LIST_CMD ,          ROOT_DECL_LIST},
199  { "map",         0, MAP_CMD ,           RING_DECL},
200  { "matrix",      0, MATRIX_CMD ,        MATRIX_CMD},
201  { "maxideal",    0, MAXID_CMD ,         CMD_1},
202  { "memory",      0, MEMORY_CMD ,        CMD_1},
203  { "minbase",     0, MINBASE_CMD ,       CMD_1},
204  { "minor",       0, MINOR_CMD ,         CMD_2},
205  { "minres",      0, MINRES_CMD ,        CMD_1},
206  { "mod",         0, '%',                '%'},
207  { "module",      0, MODUL_CMD ,         MODUL_CMD},
208  { "modulo",      0, MODULO_CMD ,        CMD_2},
209  { "monitor",     0, MONITOR_CMD ,       CMD_12},
210  { "mult",        0, MULTIPLICITY_CMD ,  CMD_1},
211  { "mres",        0, MRES_CMD ,          CMD_23},
212  { "mstd",        0, MSTD_CMD ,          CMD_1},
213  { "nameof",      0, NAMEOF_CMD ,        CMD_1},
214  { "names",       0, NAMES_CMD ,         CMD_M},
215  { "ncols",       0, COLS_CMD ,          CMD_1},
216  { "not",         0, NOT ,               NOT},
217  { "npars",       0, NPARS_CMD ,         CMD_1},
218  { "nrows",       0, ROWS_CMD ,          CMD_1},
219  { "number",      0, NUMBER_CMD ,        RING_DECL},
220  { "nvars",       0, NVARS_CMD ,         CMD_1},
221  { "open",        0, OPEN_CMD ,          CMD_1},
222  { "option",      0, OPTION_CMD ,        CMD_M},
223  { "or",          0, '|' ,               '|'},
224  { "ord",         0, ORD_CMD ,           CMD_1},
225  { "ordstr",      0, ORDSTR_CMD ,        CMD_1},
226  { "package",     0, PACKAGE_CMD ,       ROOT_DECL},
227  { "par",         0, PAR_CMD ,           CMD_1},
228  { "parameter",   0, PARAMETER ,         PARAMETER},
229  { "pardeg",      0, PARDEG_CMD ,        CMD_1},
230  { "parstr",      0, PARSTR_CMD ,        CMD_12},
231  { "poly",        0, POLY_CMD ,          RING_DECL},
232  { "preimage",    0, PREIMAGE_CMD ,      CMD_3},
233  { "prime",       0, PRIME_CMD ,         CMD_1},
234  { "print",       0, PRINT_CMD ,         CMD_12},
235  { "prune",       0, PRUNE_CMD ,         CMD_1},
236  { "proc",        0, PROC_CMD ,          PROC_CMD},
237  { "qring",       0, QRING_CMD ,         ROOT_DECL},
238  { "quotient",    0, QUOTIENT_CMD ,      CMD_2},
239  { "quote",       0, QUOTE ,             QUOTE},
240  { "qhweight",    0, QHWEIGHT_CMD ,      CMD_1},
241  { "random",      0, RANDOM_CMD ,        CMD_23},
242  { "read",        0, READ_CMD ,          CMD_12},
243  { "reduce",      0, REDUCE_CMD ,        CMD_23},
244  { "regularity",  0, REGULARITY_CMD ,    CMD_1},
245  { "res",         0, RES_CMD ,           CMD_23},
246  { "reservedName",0, RESERVEDNAME_CMD ,  CMD_M},
247  { "resolution",  0, RESOLUTION_CMD ,    RING_DECL},
248  { "resultant",   0, RESULTANT_CMD,      CMD_3},
249  { "return",      0, RETURN ,            RETURN},
250  { "RETURN",      0, END_GRAMMAR ,       RETURN},
251  { "ring",        0, RING_CMD ,          RING_CMD},
252  { "rvar",        0, IS_RINGVAR ,        CMD_1},
253  { "setring",     0, SETRING_CMD ,       SETRING_CMD},
254  { "simplify",    0, SIMPLIFY_CMD ,      CMD_2},
255  { "size",        0, COUNT_CMD ,         CMD_1},
256  { "sortvec",     0, SORTVEC_CMD ,       CMD_1},
257  { "sres",        0, SRES_CMD ,          CMD_23},
258  { "status",      0, STATUS_CMD,         CMD_23},
259  { "std",         0, STD_CMD ,           CMD_12},
260  { "string",      0, STRING_CMD ,        ROOT_DECL_LIST},
261  { "subst",       0, SUBST_CMD ,         CMD_3},
262  { "system",      0, SYSTEM_CMD,         CMD_M},
263  { "syz",         0, SYZYGY_CMD ,        CMD_1},
264  { "test",        0, TEST_CMD ,          CMD_M},
265  { "trace",       0, TRACE_CMD ,         CMD_1},
266  { "transpose",   0, TRANSPOSE_CMD ,     CMD_1},
267  { "type",        0, TYPE_CMD ,          TYPE_CMD},
268  { "typeof",      0, TYPEOF_CMD ,        CMD_1},
269  { "var",         0, VAR_CMD ,           CMD_1},
270  { "varstr",      0, VARSTR_CMD ,        CMD_12},
271  { "vdim",        0, VDIM_CMD ,          CMD_1},
272  { "vector",      0, VECTOR_CMD ,        RING_DECL},
273  { "wedge",       0, WEDGE_CMD ,         CMD_2},
274  { "weight",      0, WEIGHT_CMD ,        CMD_1},
275  { "whileif",     0, IF_CMD ,            IF_CMD},
276  { "write",       0, WRITE_CMD ,         CMD_M},
277/* delete for next version:*/
278  { "IN",          1, LEAD_CMD ,          CMD_1},
279  { "NF",          1, REDUCE_CMD ,        CMD_23},
280  { "multiplicity",1, MULTIPLICITY_CMD ,  CMD_1},
281  { "verbose",     2, OPTION_CMD ,        CMD_M},
282//  { "rank",        1, ROWS_CMD ,          CMD_1},
283
284/* set sys vars*/
285//#ifdef SRING
286  { "alternating", 0, VALTVARS ,          SYSVAR},
287//#endif
288  { "degBound",    0, VMAXDEG ,           SYSVAR},
289  { "echo",        0, VECHO ,             SYSVAR},
290  { "minpoly",     0, VMINPOLY ,          SYSVAR},
291  { "multBound",   0, VMAXMULT ,          SYSVAR},
292  { "noether",     0, VNOETHER ,          SYSVAR},
293  { "pagelength",  0, VPAGELENGTH ,       SYSVAR},
294  { "pagewidth",   0, VCOLMAX ,           SYSVAR},
295  { "printlevel",  0, VPRINTLEVEL ,       SYSVAR},
296  { "short",       0, VSHORTOUT ,         SYSVAR},
297  { "timer",       0, VTIMER ,            SYSVAR},
298  { "rtimer",      0, VRTIMER,            SYSVAR},
299  { "TRACE",       0, TRACE ,             SYSVAR},
300  { "voice",       0, VOICE ,             SYSVAR},
301
302
303/* other reserved words:scanner.l */
304  { "pause",       2, -1 ,             0},
305  { "while",       0, -1 ,             0},
306  { "for",         0, -1 ,             0},
307  { "help",        0, -1 ,             0},
308  { "newline",     0, -1 ,             0},
309  { "exit",        0, -1 ,             0},
310  { "quit",        0, -1 ,             0},
311/* end of list marker */
312  { NULL, 0, 0, 0}
313};
314#endif
315
316/*=================== operations with 2 args.: static proc =================*/
317static BOOLEAN jjOP_IV_I(leftv res, leftv u, leftv v)
318{
319  intvec* aa= (intvec *)u->CopyD(INTVEC_CMD);
320  int bb = (int)(v->Data());
321  if (errorreported) return TRUE;
322  switch (iiOp)
323  {
324    case '+': (*aa) += bb; break;
325    case '-': (*aa) -= bb; break;
326    case '*': (*aa) *= bb; break;
327    case '/':
328    case INTDIV: (*aa) /= bb; break;
329    case '%': (*aa) %= bb; break;
330  }
331  res->data=(char *)aa;
332  return FALSE;
333}
334static BOOLEAN jjOP_I_IV(leftv res, leftv u, leftv v)
335{
336  return jjOP_IV_I(res,v,u);
337}
338static BOOLEAN jjOP_IM_I(leftv res, leftv u, leftv v)
339{
340  intvec* aa= (intvec *)u->CopyD(INTVEC_CMD);
341  int bb = (int)(v->Data());
342  int i=min(aa->rows(),aa->cols());
343  switch (iiOp)
344  {
345    case '+': for (;i>0;i--) IMATELEM(*aa,i,i) += bb;
346              break;
347    case '-': for (;i>0;i--) IMATELEM(*aa,i,i) -= bb;
348              break;
349  }
350  res->data=(char *)aa;
351  return FALSE;
352}
353static BOOLEAN jjOP_I_IM(leftv res, leftv u, leftv v)
354{
355  return jjOP_IM_I(res,v,u);
356}
357static BOOLEAN jjDOTDOT(leftv res, leftv u, leftv v)
358{
359  res->data=(char *)new intvec((int)u->Data(),(int)v->Data());
360  return FALSE;
361}
362static void jjEQUAL_REST(leftv res,leftv u,leftv v)
363{
364  if ((res->data) && (u->next!=NULL) && (v->next!=NULL))
365  {
366    int save_iiOp=iiOp;
367    if (iiOp==NOTEQUAL)
368      iiExprArith2(res,u->next,EQUAL_EQUAL,v->next);
369    else
370      iiExprArith2(res,u->next,iiOp,v->next);
371    iiOp=save_iiOp;
372  }
373  if (iiOp==NOTEQUAL) res->data=(char *)(!(int)res->data);
374}
375static BOOLEAN jjCOMPARE_IV(leftv res, leftv u, leftv v)
376{
377  intvec*    a = (intvec * )(u->Data());
378  intvec*    b = (intvec * )(v->Data());
379  int r=a->compare(b);
380  switch  (iiOp)
381  {
382    case '<':
383      res->data  = (char *) (r<0);
384      break;
385    case '>':
386      res->data  = (char *) (r>0);
387      break;
388    case LE:
389      res->data  = (char *) (r<=0);
390      break;
391    case GE:
392      res->data  = (char *) (r>=0);
393      break;
394    case EQUAL_EQUAL:
395    case NOTEQUAL: /* negation handled by jjEQUAL_REST */
396      res->data  = (char *) (r==0);
397      break;
398  }
399  jjEQUAL_REST(res,u,v);
400  return r==-2;
401}
402static BOOLEAN jjCOMPARE_IV_I(leftv res, leftv u, leftv v)
403{
404  intvec* a = (intvec * )(u->Data());
405  int     b = (int )     (v->Data());
406  int r=a->compare(b);
407  switch  (iiOp)
408  {
409    case '<':
410      res->data  = (char *) (r<0);
411      break;
412    case '>':
413      res->data  = (char *) (r>0);
414      break;
415    case LE:
416      res->data  = (char *) (r<=0);
417      break;
418    case GE:
419      res->data  = (char *) (r>=0);
420      break;
421    case EQUAL_EQUAL:
422    case NOTEQUAL: /* negation handled by jjEQUAL_REST */
423      res->data  = (char *) (r==0);
424      break;
425  }
426  jjEQUAL_REST(res,u,v);
427  return FALSE;
428}
429static BOOLEAN jjCOMPARE_P(leftv res, leftv u, leftv v)
430{
431  poly p=(poly)u->Data();
432  poly q=(poly)v->Data();
433  int r=pComp(p,q);
434  if (r==0)
435  {
436    /* compare lead coeffs */
437    number h=nSub(pGetCoeff(p),pGetCoeff(q));
438    r = -1+nIsZero(h)+2*nGreaterZero(h); /* -1: <, 0:==, 1: > */
439    nDelete(&h);
440  }
441  else if (p==NULL)
442  {
443    if (q==NULL)
444    {
445      /* compare 0, 0 */
446      r=0;
447    }
448    else if(pIsConstant(q))
449    {
450      /* compare 0, const */
451      r = 1-2*nGreaterZero(pGetCoeff(q)); /* -1: <, 1: > */
452    }
453  }
454  else if (q==NULL)
455  {
456    if (pIsConstant(p))
457    {
458      /* compare const, 0 */
459      r = -1+2*nGreaterZero(pGetCoeff(p)); /* -1: <, 1: > */
460    }
461  }
462  switch  (iiOp)
463  {
464    case '<':
465      res->data  = (char *) (r < 0);
466      break;
467    case '>':
468      res->data  = (char *) (r > 0);
469      break;
470    case LE:
471      res->data  = (char *) (r <= 0);
472      break;
473    case GE:
474      res->data  = (char *) (r >= 0);
475      break;
476    //case EQUAL_EQUAL:
477    //case NOTEQUAL: /* negation handled by jjEQUAL_REST */
478    //  res->data  = (char *) (r == 0);
479    //  break;
480  }
481  jjEQUAL_REST(res,u,v);
482  return FALSE;
483}
484static BOOLEAN jjCOMPARE_S(leftv res, leftv u, leftv v)
485{
486  char*    a = (char * )(u->Data());
487  char*    b = (char * )(v->Data());
488  int result = strcmp(a,b);
489  switch  (iiOp)
490  {
491    case '<':
492      res->data  = (char *) (result  < 0);
493      break;
494    case '>':
495      res->data  = (char *) (result  > 0);
496      break;
497    case LE:
498      res->data  = (char *) (result  <= 0);
499      break;
500    case GE:
501      res->data  = (char *) (result  >= 0);
502      break;
503    case EQUAL_EQUAL:
504    case NOTEQUAL: /* negation handled by jjEQUAL_REST */
505      res->data  = (char *) (result  == 0);
506      break;
507  }
508  jjEQUAL_REST(res,u,v);
509  return FALSE;
510}
511static BOOLEAN jjPOWER_I(leftv res, leftv u, leftv v)
512{
513  int b=(int)u->Data();
514  int e=(int)v->Data();
515  int rc = 1;
516  BOOLEAN overflow=FALSE;
517  if ((e >= 0)&&(b!=0))
518  {
519    int oldrc;
520    while ((e--)!=0)
521    {
522      oldrc=rc;
523      rc *= b;
524      if (!overflow)
525      {
526        if(rc/b!=oldrc) overflow=TRUE;
527      }
528    }
529  }
530  if (overflow)
531    Warn("int overflow(^), result may be wrong");
532  res->data = (char *)rc;
533  return FALSE;
534}
535static BOOLEAN jjPOWER_N(leftv res, leftv u, leftv v)
536{
537  int e=(int)v->Data();
538  number n=(number)u->CopyD();
539  if (e<0)
540  {
541    number m=nInvers(n);
542    nDelete(&n);
543    n=m;
544    e=-e;
545  }
546  nPower(n,e,(number*)&res->data);
547  nDelete(&n);
548  return FALSE;
549}
550static BOOLEAN jjPOWER_P(leftv res, leftv u, leftv v)
551{
552  res->data = (char *)pPower((poly)u->CopyD(POLY_CMD),(int)v->Data());
553  return FALSE;
554}
555static BOOLEAN jjPOWER_ID(leftv res, leftv u, leftv v)
556{
557  res->data = (char *)idPower((ideal)(u->Data()),(int)(v->Data()));
558  return FALSE;
559}
560static BOOLEAN jjPLUSMINUS_Gen(leftv res, leftv u, leftv v)
561{
562  u=u->next;
563  v=v->next;
564  if (u==NULL)
565  {
566    if (v==NULL) return FALSE;      /* u==NULL, v==NULL */
567    if (iiOp=='-')                  /* u==NULL, v<>NULL, iiOp=='-'*/
568      return iiExprArith1(res->next,v,'-');
569    loop                            /* u==NULL, v<>NULL, iiOp=='+' */
570    {
571      res->next = (leftv)Alloc0(sizeof(sleftv));
572      res=res->next;
573      res->data = v->CopyD();
574      res->rtyp = v->Typ();
575      v=v->next;
576      if (v==NULL) return FALSE;
577    }
578  }
579  if (v!=NULL)                     /* u<>NULL, v<>NULL */
580  {
581    res->next = (leftv)Alloc(sizeof(sleftv));
582    return iiExprArith2(res->next,u,iiOp,v);
583  }
584  loop                             /* u<>NULL, v==NULL */
585  {
586    res->next = (leftv)Alloc0(sizeof(sleftv));
587    res=res->next;
588    res->data = u->CopyD();
589    res->rtyp = u->Typ();
590    u=u->next;
591    if (u==NULL) return FALSE;
592  }
593}
594static BOOLEAN jjPLUS_I(leftv res, leftv u, leftv v)
595{
596  unsigned int a=(unsigned int)u->Data();
597  unsigned int b=(unsigned int)v->Data();
598  unsigned int c=a+b;
599  res->data = (char *)c;
600  if (((Sy_bit(31)&a)==(Sy_bit(31)&b))&&((Sy_bit(31)&a)!=(Sy_bit(31)&c)))
601  {
602    Warn("int overflow(+), result may be wrong");
603  }
604  return jjPLUSMINUS_Gen(res,u,v);
605}
606static BOOLEAN jjPLUS_N(leftv res, leftv u, leftv v)
607{
608  res->data = (char *)(nAdd((number)u->Data(), (number)v->Data()));
609  return jjPLUSMINUS_Gen(res,u,v);
610}
611static BOOLEAN jjPLUS_P(leftv res, leftv u, leftv v)
612{
613  res->data = (char *)(pAdd((poly)u->CopyD(POLY_CMD) , (poly)v->CopyD(POLY_CMD)));
614  return jjPLUSMINUS_Gen(res,u,v);
615}
616static BOOLEAN jjPLUS_IV(leftv res, leftv u, leftv v)
617{
618  res->data = (char *)ivAdd((intvec*)(u->Data()), (intvec*)(v->Data()));
619  if (res->data==NULL)
620  {
621     WerrorS("intmat size not compatible");
622     return TRUE;
623  }
624  return jjPLUSMINUS_Gen(res,u,v);
625}
626static BOOLEAN jjPLUS_MA(leftv res, leftv u, leftv v)
627{
628  res->data = (char *)(mpAdd((matrix)u->Data() , (matrix)v->Data()));
629  if (res->data==NULL)
630  {
631     WerrorS("matrix size not compatible");
632     return TRUE;
633  }
634  return jjPLUSMINUS_Gen(res,u,v);
635}
636static BOOLEAN jjPLUS_MA_P(leftv res, leftv u, leftv v)
637{
638  matrix m=(matrix)u->Data();
639  matrix p= mpInitP(m->nrows,m->ncols,(poly)(v->CopyD()));
640  if (iiOp=='+')
641    res->data = (char *)mpAdd(m , p);
642  else
643    res->data = (char *)mpSub(m , p);
644  idDelete((ideal *)&p);
645  return jjPLUSMINUS_Gen(res,u,v);
646}
647static BOOLEAN jjPLUS_P_MA(leftv res, leftv u, leftv v)
648{
649  return jjPLUS_MA_P(res,v,u);
650}
651static BOOLEAN jjPLUS_S(leftv res, leftv u, leftv v)
652{
653  char*    a = (char * )(u->Data());
654  char*    b = (char * )(v->Data());
655  char*    r = (char * )AllocL(strlen(a) + strlen(b) + 1);
656  strcpy(r,a);
657  strcat(r,b);
658  res->data=r;
659  return jjPLUSMINUS_Gen(res,u,v);
660}
661static BOOLEAN jjPLUS_ID(leftv res, leftv u, leftv v)
662{
663  res->data = (char *)idAdd((ideal)u->Data(),(ideal)v->Data());
664  return jjPLUSMINUS_Gen(res,u,v);
665}
666static BOOLEAN jjMINUS_I(leftv res, leftv u, leftv v)
667{
668  unsigned int a=(unsigned int)u->Data();
669  unsigned int b=(unsigned int)v->Data();
670  unsigned int c=a-b;
671  if (((Sy_bit(31)&a)!=(Sy_bit(31)&b))&&((Sy_bit(31)&a)!=(Sy_bit(31)&c)))
672  {
673    Warn("int overflow(-), result may be wrong");
674  }
675  res->data = (char *)c;
676  return jjPLUSMINUS_Gen(res,u,v);
677}
678static BOOLEAN jjMINUS_N(leftv res, leftv u, leftv v)
679{
680  res->data = (char *)(nSub((number)u->Data(), (number)v->Data()));
681  return jjPLUSMINUS_Gen(res,u,v);
682}
683static BOOLEAN jjMINUS_P(leftv res, leftv u, leftv v)
684{
685  res->data = (char *)(pSub((poly)u->CopyD(POLY_CMD) , (poly)v->CopyD(POLY_CMD)));
686  return jjPLUSMINUS_Gen(res,u,v);
687}
688static BOOLEAN jjMINUS_IV(leftv res, leftv u, leftv v)
689{
690  res->data = (char *)ivSub((intvec*)(u->Data()), (intvec*)(v->Data()));
691  if (res->data==NULL)
692  {
693     WerrorS("intmat size not compatible");
694     return TRUE;
695  }
696  return jjPLUSMINUS_Gen(res,u,v);
697}
698static BOOLEAN jjMINUS_MA(leftv res, leftv u, leftv v)
699{
700  res->data = (char *)(mpSub((matrix)u->Data() , (matrix)v->Data()));
701  if (res->data==NULL)
702  {
703     WerrorS("matrix size not compatible");
704     return TRUE;
705  }
706  return jjPLUSMINUS_Gen(res,u,v);
707}
708static BOOLEAN jjTIMES_I(leftv res, leftv u, leftv v)
709{
710  int a=(int)u->Data();
711  int b=(int)v->Data();
712  int c=a * b;
713  if ((b!=0) && (c/b !=a))
714    Warn("int overflow(*), result may be wrong");
715  res->data = (char *)c;
716  if (u->Next()!=NULL)
717  {
718    u=u->next;
719    res->next = (leftv)Alloc(sizeof(sleftv));
720    return iiExprArith2(res->next,u,iiOp,v);
721  }
722  else if (v->Next()!=NULL)
723  {
724    v=v->next;
725    res->next = (leftv)Alloc(sizeof(sleftv));
726    return iiExprArith2(res->next,u,iiOp,v);
727  }
728  return FALSE;
729}
730static BOOLEAN jjTIMES_N(leftv res, leftv u, leftv v)
731{
732  number a;
733  number b;
734
735  if (v->next==NULL)
736  {
737    a=(number)u->Data();
738    if (u->next==NULL)
739    {
740      res->data = (char *)(nMult( a, (number)v->Data()));
741      return FALSE;
742    }
743    // u->next exists: copy v
744    b=(number)v->Data();
745    res->data = (char *)(nMult( a, b));
746    res->next = (leftv)Alloc(sizeof(sleftv));
747    res=res->next;
748    return iiExprArith2(res,u->next,iiOp,v);
749  }
750  // v->next exists: copy u
751  a=nCopy((number)u->Data());
752  b=(number)v->CopyD();
753  res->data = (char *)(nMult( a, b));
754  res->next = (leftv)Alloc(sizeof(sleftv));
755  return iiExprArith2(res->next,u,iiOp,v->next);
756}
757static BOOLEAN jjTIMES_P(leftv res, leftv u, leftv v)
758{
759  poly a;
760  poly b;
761
762  if (v->next==NULL)
763  {
764    a=(poly)u->CopyD();
765    if (u->next==NULL)
766    {
767      b=(poly)v->CopyD();
768      res->data = (char *)(pMult( a, b));
769      return FALSE;
770    }
771    // u->next exists: copy v
772    b=pCopy((poly)v->Data());
773    res->data = (char *)(pMult( a, b));
774    res->next = (leftv)Alloc(sizeof(sleftv));
775    res=res->next;
776    return iiExprArith2(res,u->next,iiOp,v);
777  }
778  // v->next exists: copy u
779  a=pCopy((poly)u->Data());
780  b=(poly)v->CopyD();
781  res->data = (char *)(pMult( a, b));
782  res->next = (leftv)Alloc(sizeof(sleftv));
783  return iiExprArith2(res->next,u,iiOp,v->next);
784}
785static BOOLEAN jjTIMES_ID(leftv res, leftv u, leftv v)
786{
787  res->data = (char *)idMult((ideal)u->Data(),(ideal)v->Data());
788  return FALSE;
789}
790static BOOLEAN jjTIMES_IV(leftv res, leftv u, leftv v)
791{
792  res->data = (char *)ivMult((intvec*)(u->Data()), (intvec*)(v->Data()));
793  if (res->data==NULL)
794  {
795     WerrorS("intmat size not compatible");
796     return TRUE;
797  }
798  return FALSE;
799}
800static BOOLEAN jjTIMES_MA_P1(leftv res, leftv u, leftv v)
801{
802  poly p=(poly)v->CopyD(POLY_CMD);
803  int r=pMaxComp(p);/* recompute the rank for the case ideal*vector*/
804  ideal I= (ideal)mpMultP((matrix)u->CopyD(MATRIX_CMD),p);
805  if (r>0) I->rank=r;
806  res->data = (char *)I;
807  return FALSE;
808}
809static BOOLEAN jjTIMES_MA_P2(leftv res, leftv u, leftv v)
810{
811  return jjTIMES_MA_P1(res,v,u);
812}
813static BOOLEAN jjTIMES_MA_N1(leftv res, leftv u, leftv v)
814{
815  number n=(number)v->CopyD(NUMBER_CMD);
816  poly p=pOne();
817  pSetCoeff(p,n);
818  res->data = (char *)mpMultP((matrix)u->CopyD(MATRIX_CMD),p);
819  return FALSE;
820}
821static BOOLEAN jjTIMES_MA_N2(leftv res, leftv u, leftv v)
822{
823  return jjTIMES_MA_N1(res,v,u);
824}
825static BOOLEAN jjTIMES_MA_I1(leftv res, leftv u, leftv v)
826{
827  res->data = (char *)mpMultI((matrix)u->CopyD(MATRIX_CMD),(int)v->Data());
828  return FALSE;
829}
830static BOOLEAN jjTIMES_MA_I2(leftv res, leftv u, leftv v)
831{
832  return jjTIMES_MA_I1(res,v,u);
833}
834static BOOLEAN jjTIMES_MA(leftv res, leftv u, leftv v)
835{
836  res->data = (char *)mpMult((matrix)u->Data(),(matrix)v->Data());
837  if (res->data==NULL)
838  {
839     WerrorS("matrix size not compatible");
840     return TRUE;
841  }
842  return FALSE;
843}
844static BOOLEAN jjGE_I(leftv res, leftv u, leftv v)
845{
846  res->data = (char *)((int)u->Data() >= (int)v->Data());
847  return FALSE;
848}
849static BOOLEAN jjGE_N(leftv res, leftv u, leftv v)
850{
851  number h=nSub((number)u->Data(),(number)v->Data());
852  res->data = (char *) (nGreaterZero(h)||(nIsZero(h)));
853  nDelete(&h);
854  return FALSE;
855}
856static BOOLEAN jjGT_I(leftv res, leftv u, leftv v)
857{
858  res->data = (char *)((int)u->Data()>(int)v->Data());
859  return FALSE;
860}
861static BOOLEAN jjGT_N(leftv res, leftv u, leftv v)
862{
863  number h=nSub((number)u->Data(),(number)v->Data());
864  res->data = (char *) (nGreaterZero(h)&&(!nIsZero(h)));
865  nDelete(&h);
866  return FALSE;
867}
868static BOOLEAN jjLE_I(leftv res, leftv u, leftv v)
869{
870  res->data = (char *)((int)u->Data() <= (int)v->Data());
871  return FALSE;
872}
873static BOOLEAN jjLE_N(leftv res, leftv u, leftv v)
874{
875  number h=nSub((number)v->Data(),(number)u->Data());
876  res->data = (char *) (nGreaterZero(h)||nIsZero(h));
877  nDelete(&h);
878  return FALSE;
879}
880static BOOLEAN jjLT_I(leftv res, leftv u, leftv v)
881{
882  res->data = (char *)((int)u->Data() < (int)v->Data());
883  return FALSE;
884}
885static BOOLEAN jjLT_N(leftv res, leftv u, leftv v)
886{
887  number h=nSub((number)v->Data(),(number)u->Data());
888  res->data = (char *) (nGreaterZero(h)&&(!nIsZero(h)));
889  nDelete(&h);
890  return FALSE;
891}
892static BOOLEAN jjDIV_I(leftv res, leftv u, leftv v)
893{
894  int a= (int) u->Data();
895  int b= (int) v->Data();
896  if (b==0)
897  {
898    WerrorS("div. by 0");
899    return TRUE;
900  }
901  //int c=a%ABS(b);
902  //if(c<0) c+=ABS(b);
903  //res->data = (char *)((a-c) / b);
904  res->data = (char *)(a / b);
905  return FALSE;
906}
907static BOOLEAN jjDIV_N(leftv res, leftv u, leftv v)
908{
909  number q=(number)v->Data();
910  if (nIsZero(q))
911  {
912    WerrorS("div. by 0");
913    return TRUE;
914  }
915  q = nDiv((number)u->Data(),q);
916  nNormalize(q);
917  res->data = (char *)q;
918  return FALSE;
919}
920static BOOLEAN jjDIV_P(leftv res, leftv u, leftv v)
921{
922  poly q=(poly)v->Data();
923  if (q==NULL)
924  {
925    WerrorS("div. by 0");
926    return TRUE;
927  }
928  if (pNext(q)!=NULL)
929  {
930#ifdef HAVE_FACTORY
931    res->data=(void*)(singclap_pdivide((poly)(u->Data()),
932                                       (poly)(v->Data())));
933#else
934    WerrorS("division only by a monomial");
935    return TRUE;
936#endif
937  }
938  else
939  {
940    res->data = (char *)pDivideM((poly)u->CopyD(POLY_CMD),pHead(q));
941  }
942  return FALSE;
943}
944static BOOLEAN jjMOD_I(leftv res, leftv u, leftv v)
945{
946  int a=(int)u->Data();
947  int b=ABS((int)v->Data());
948  if (errorreported) return TRUE;
949  if (b==0)
950  {
951    WerrorS("div. by 0");
952    return TRUE;
953  }
954  int c=a%b;
955  if(c<0) c+=b;
956  res->data = (char *)c;
957  return FALSE;
958}
959static BOOLEAN jjEQUAL_I(leftv res, leftv u, leftv v)
960{
961  res->data = (char *)((int)u->Data() == (int)v->Data());
962  jjEQUAL_REST(res,u,v);
963  return FALSE;
964}
965static BOOLEAN jjEQUAL_Ma(leftv res, leftv u, leftv v)
966{
967  res->data = (char *)mpEqual((matrix)u->Data(),(matrix)v->Data());
968  jjEQUAL_REST(res,u,v);
969  return FALSE;
970}
971static BOOLEAN jjEQUAL_N(leftv res, leftv u, leftv v)
972{
973  res->data = (char *)nEqual((number)u->Data(),(number)v->Data());
974  jjEQUAL_REST(res,u,v);
975  return FALSE;
976}
977static BOOLEAN jjEQUAL_P(leftv res, leftv u, leftv v)
978{
979  poly p=(poly)u->Data();
980  poly q=(poly)v->Data();
981  if (p==NULL)
982  {
983    res->data=(char *)(q==NULL);
984  }
985  else
986  {
987    if (q==NULL) res->data=(char *)FALSE;
988    else
989    {
990      int r=pComp(p,q);
991      if (r==0)
992      {
993        p=pSub(pCopy(p),pCopy(q));
994        res->data = (char *) (p==NULL);
995        pDelete(&p);
996      }
997      else
998        res->data = (char *) FALSE;
999    }
1000  }
1001  jjEQUAL_REST(res,u,v);
1002  return FALSE;
1003}
1004static BOOLEAN jjAND_I(leftv res, leftv u, leftv v)
1005{
1006  res->data = (char *)((int)u->Data() && (int)v->Data());
1007  return FALSE;
1008}
1009static BOOLEAN jjOR_I(leftv res, leftv u, leftv v)
1010{
1011  res->data = (char *)((int)u->Data() || (int)v->Data());
1012  return FALSE;
1013}
1014static BOOLEAN jjINDEX_I(leftv res, leftv u, leftv v)
1015{
1016  res->rtyp=u->rtyp; u->rtyp=0;
1017  res->data=u->data; u->data=NULL;
1018  res->name=u->name; u->name=NULL;
1019  res->e=u->e;       u->e=NULL;
1020  if (res->e==NULL) res->e=jjMakeSub(v);
1021  else
1022  {
1023    Subexpr sh=res->e;
1024    while (sh->next != NULL) sh=sh->next;
1025    sh->next=jjMakeSub(v);
1026  }
1027  return FALSE;
1028}
1029static BOOLEAN jjINDEX_IV(leftv res, leftv u, leftv v)
1030{
1031  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
1032  {
1033    WerrorS("indexed object must have a name");
1034    return TRUE;
1035  }
1036  intvec * iv=(intvec *)v->Data();
1037  leftv p=NULL;
1038  int i;
1039  sleftv t;
1040
1041  memset(&t,0,sizeof(t));
1042  t.rtyp=INT_CMD;
1043  for (i=0;i<iv->length(); i++)
1044  {
1045    t.data=(char *)(*iv)[i];
1046    if (p==NULL)
1047    {
1048      p=res;
1049    }
1050    else
1051    {
1052      p->next=(leftv)Alloc0(sizeof(sleftv));
1053      p=p->next;
1054    }
1055    p->rtyp=IDHDL;
1056    p->data=u->data;
1057    p->name=u->name;
1058    p->flag|=u->flag;
1059    p->e=jjMakeSub(&t);
1060  }
1061  u->rtyp=0;
1062  u->data=NULL;
1063  u->name=NULL;
1064  return FALSE;
1065}
1066static BOOLEAN jjINDEX_P(leftv res, leftv u, leftv v)
1067{
1068  poly p=(poly)u->Data();
1069  int i=(int)v->Data();
1070  int j=0;
1071  while (p!=NULL)
1072  {
1073    j++;
1074    if (j==i)
1075    {
1076      res->data=(char *)pHead(p);
1077      return FALSE;
1078    }
1079    pIter(p);
1080  }
1081  return FALSE;
1082}
1083static BOOLEAN jjINDEX_P_IV(leftv res, leftv u, leftv v)
1084{
1085  poly p=(poly)u->Data();
1086  poly r=NULL;
1087  intvec *iv=(intvec *)v->CopyD();
1088  int i;
1089  int sum=0;
1090  for(i=iv->length()-1;i>=0;i--)
1091    sum+=(*iv)[i];
1092  int j=0;
1093  while ((p!=NULL) && (sum>0))
1094  {
1095    j++;
1096    for(i=iv->length()-1;i>=0;i--)
1097    {
1098      if (j==(*iv)[i])
1099      {
1100        r=pAdd(r,pHead(p));
1101        sum-=j;
1102        (*iv)[i]=0;
1103        break;
1104      }
1105    }
1106    pIter(p);
1107  }
1108  delete iv;
1109  res->data=(char *)r;
1110  return FALSE;
1111}
1112static BOOLEAN jjINDEX_V(leftv res, leftv u, leftv v)
1113{
1114  poly p=(poly)u->CopyD();
1115  poly r=p; // pointer to the beginning of component i
1116  poly o=NULL;
1117  int i=(int)v->Data();
1118  while (p!=NULL)
1119  {
1120    if (pGetComp(p)!=i)
1121    {
1122      if (r==p) r=pNext(p);
1123      if (o!=NULL)
1124      {
1125        pDelete1(&pNext(o));
1126        p=pNext(o);
1127      }
1128      else
1129        pDelete1(&p);
1130    }
1131    else
1132    {
1133      pSetComp(p, 0);
1134      o=p;
1135      p=pNext(o);
1136    }
1137  }
1138  res->data=(char *)r;
1139  return FALSE;
1140}
1141static BOOLEAN jjINDEX_V_IV(leftv res, leftv u, leftv v)
1142{
1143  poly p=(poly)u->CopyD();
1144  if (p!=NULL)
1145  {
1146    poly r=pOne();
1147    poly hp=r;
1148    intvec *iv=(intvec *)v->Data();
1149    int i;
1150    loop
1151    {
1152      for(i=0;i<iv->length();i++)
1153      {
1154        if (pGetComp(p)==(*iv)[i])
1155        {
1156          poly h;
1157          pSplit(p,&h);
1158          pNext(hp)=p;
1159          p=h;
1160          pIter(hp);
1161          break;
1162        }
1163      }
1164      if (p==NULL) break;
1165      if (i==iv->length())
1166      {
1167        pDelete1(&p);
1168        if (p==NULL) break;
1169      }
1170    }
1171    pDelete1(&r);
1172    res->data=(char *)r;
1173  }
1174  return FALSE;
1175}
1176static BOOLEAN jjKLAMMER(leftv res, leftv u, leftv v)
1177{
1178  if(u->name==NULL) return TRUE;
1179  char * n = (char *)AllocL(strlen(u->name) + 6);
1180  sprintf(n,"%s(%d)",u->name,(int)v->Data());
1181  FreeL((ADDRESS)u->name);
1182  u->name=NULL;
1183  syMake(res,n);
1184  return FALSE;
1185}
1186static BOOLEAN jjKLAMMER_IV(leftv res, leftv u, leftv v)
1187{
1188  intvec * iv=(intvec *)v->Data();
1189  leftv p=NULL;
1190  int i;
1191  char *n;
1192
1193  for (i=0;i<iv->length(); i++)
1194  {
1195    if (p==NULL)
1196    {
1197      p=res;
1198    }
1199    else
1200    {
1201      p->next=(leftv)Alloc0(sizeof(sleftv));
1202      p=p->next;
1203    }
1204    n = (char *)AllocL(strlen(u->name) + 6);
1205    sprintf(n,"%s(%d)",u->name,(*iv)[i]);
1206    syMake(p,n);
1207  }
1208  FreeL((ADDRESS)u->name);
1209  u->name=NULL;
1210  return FALSE;
1211}
1212static BOOLEAN jjPROC(leftv res, leftv u, leftv v)
1213{
1214  leftv sl = iiMake_proc((idhdl)u->data,v);
1215  if (sl==NULL)
1216  {
1217    return TRUE;
1218  }
1219  else
1220  {
1221    memcpy(res,sl,sizeof(sleftv));
1222  }
1223  return FALSE;
1224}
1225static BOOLEAN jjMAP(leftv res, leftv u, leftv v)
1226{
1227  //Print("try to map %s with %s\n",$3.Name(),$1.Name());
1228  leftv sl=NULL;
1229  if (v->e==NULL)
1230  {
1231    idhdl h=(idhdl)u->data;
1232    sl=iiMap(IDMAP(h),v->name);
1233  }
1234  //else
1235  //{
1236  //  WerrorS("map_id(<name>) expected");
1237  //}
1238  if (sl==NULL) return TRUE;
1239  memcpy(res,sl,sizeof(sleftv));
1240  Free((ADDRESS)sl,sizeof(*sl));
1241  return FALSE;
1242}
1243static BOOLEAN jjCALL2MANY(leftv res, leftv u, leftv v)
1244{
1245  u->next=(leftv)Alloc(sizeof(sleftv));
1246  memcpy(u->next,v,sizeof(sleftv));
1247  BOOLEAN r=iiExprArithM(res,u,iiOp);
1248  v->rtyp=0; v->data=NULL; // iiExprArithM did the CleanUp
1249  return r;
1250}
1251static BOOLEAN jjCOEF(leftv res, leftv u, leftv v)
1252{
1253  res->data=(char *)mpCoeffProc((poly)u->Data(),(poly)v->Data());
1254  return FALSE;
1255}
1256static BOOLEAN jjCOEFFS_Id(leftv res, leftv u, leftv v)
1257{
1258  int i=pVar((poly)v->Data());
1259  if (i==0)
1260  {
1261    WerrorS("ringvar expected");
1262    return TRUE;
1263  }
1264  res->data=(char *)mpCoeffs((ideal)u->CopyD(),i);
1265  return FALSE;
1266}
1267static BOOLEAN jjCONTRACT(leftv res, leftv u, leftv v)
1268{
1269  res->data=(char *)idDiffOp((ideal)u->Data(),(ideal)v->Data(),FALSE);
1270  return FALSE;
1271}
1272static BOOLEAN jjDEG_IV(leftv res, leftv u, leftv v)
1273{
1274  short *iv=iv2array((intvec *)v->Data());
1275  res->data = (char *)pDegW((poly)u->Data(),iv);
1276  Free((ADDRESS)iv,(pVariables+1)*sizeof(short));
1277  return FALSE;
1278}
1279static BOOLEAN jjDIFF_P(leftv res, leftv u, leftv v)
1280{
1281  int i=pVar((poly)v->Data());
1282  if (i==0)
1283  {
1284    WerrorS("ringvar expected");
1285    return TRUE;
1286  }
1287  res->data=(char *)pDiff((poly)(u->Data()),i);
1288  return FALSE;
1289}
1290static BOOLEAN jjDIFF_ID(leftv res, leftv u, leftv v)
1291{
1292  int i=pVar((poly)v->Data());
1293  if (i==0)
1294  {
1295    WerrorS("ringvar expected");
1296    return TRUE;
1297  }
1298  res->data=(char *)idDiff((matrix)(u->Data()),i);
1299  return FALSE;
1300}
1301static BOOLEAN jjDIFF_ID_ID(leftv res, leftv u, leftv v)
1302{
1303  res->data=(char *)idDiffOp((ideal)u->Data(),(ideal)v->Data());
1304  return FALSE;
1305}
1306
1307static BOOLEAN jjELIMIN(leftv res, leftv u, leftv v)
1308{
1309  res->data=(char *)idElimination((ideal)u->Data(),(poly)v->Data());
1310  setFlag(res,FLAG_STD);
1311  return FALSE;
1312}
1313static BOOLEAN jjDIM2(leftv res, leftv v, leftv w)
1314{
1315  assumeStdFlag(v);
1316  if(currQuotient==NULL)
1317    res->data = (char *)scDimInt((ideal)(v->Data()),(ideal)w->Data());
1318  else
1319  {
1320    ideal q=idSimpleAdd(currQuotient,(ideal)w->Data());
1321    res->data = (char *)scDimInt((ideal)(v->Data()),q);
1322    idDelete(&q);
1323  }
1324  return FALSE;
1325}
1326static BOOLEAN jjEXTGCD_I(leftv res, leftv u, leftv v)
1327{
1328  int p0=ABS((int)u->Data()),p1=ABS((int)v->Data());
1329  int f0 = 1, f1 = 0, g0 = 0, g1 = 1, q, r;
1330
1331  while ( p1!=0 )
1332  {
1333    q=p0 / p1;
1334    r=p0 % p1;
1335    p0 = p1; p1 = r;
1336    r = g0 - g1 * q;
1337    g0 = g1; g1 = r;
1338    r = f0 - f1 * q;
1339    f0 = f1; f1 = r;
1340  }
1341  int a = f0;
1342  int b = g0;
1343  if ( (int)u->Data() < 0 ) a=-a;
1344  if ( (int)v->Data() < 0 ) b=-b;
1345  lists L=(lists)Alloc(sizeof(slists));
1346  L->Init(3);
1347  L->m[0].rtyp=INT_CMD;
1348  L->m[0].data=(void *)p0;
1349  L->m[1].rtyp=INT_CMD;
1350  L->m[1].data=(void *)a;
1351  L->m[2].rtyp=INT_CMD;
1352  L->m[2].data=(void *)b;
1353  res->rtyp=LIST_CMD;
1354  res->data=(char *)L;
1355  return FALSE;
1356}
1357#ifdef HAVE_FACTORY
1358static BOOLEAN jjFACSTD2(leftv res, leftv v, leftv w)
1359{
1360  res->data=(void *)stdfac((ideal)v->Data(),NULL,testHomog,NULL,
1361           (ideal)w->Data());
1362  setFlag(res,FLAG_STD);
1363  return FALSE;
1364}
1365#endif
1366static BOOLEAN jjFETCH(leftv res, leftv u, leftv v)
1367{
1368  ring r=(ring)u->Data();
1369  idhdl w;
1370
1371  if ((iiOp!=IMAP_CMD)
1372  && ((currRing->ch != r->ch)
1373    || ((currRing->N != r->N)&& (iiOp==FETCH_CMD)))
1374  )
1375    goto err_fetch;
1376  if ((w=r->idroot->get(v->Name(),myynest))!=NULL)
1377  {
1378    int *perm=NULL;
1379    int *par_perm=NULL;
1380    int par_perm_size=0;
1381    BOOLEAN bo;
1382    if (iiOp==IMAP_CMD)
1383    {
1384      if (!nSetMap(r->ch,r->parameter,r->P,r->minpoly))
1385      {
1386        if (iiOp!=IMAP_CMD)
1387          goto err_fetch;
1388        par_perm_size=rPar(r);
1389        if (r->ch==1)
1390        {
1391          if ((currRing->ch!=0)
1392          && (currRing->ch!=1))
1393            goto err_fetch;
1394        }
1395        else if(r->ch<(-1))
1396        {
1397          if ((currRing->ch==(-currRing->ch))
1398          && (currRing->ch!=currRing->ch))
1399            goto err_fetch;
1400        }
1401        BITSET save_test=test;
1402        naSetChar(r->ch,TRUE,r->parameter,r->P);
1403        nSetChar(currRing->ch,TRUE,currRing->parameter,currRing->P);
1404        test=save_test;
1405      }
1406      perm=(int *)Alloc0((r->N+1)*sizeof(int));
1407      if (par_perm_size!=0)
1408        par_perm=(int *)Alloc0(par_perm_size*sizeof(int));
1409      maFindPerm(r->names,       r->N,       r->parameter,        r->P,
1410                 currRing->names,currRing->N,currRing->parameter, currRing->P,
1411                 perm,par_perm);
1412    }
1413    sleftv tmpW;
1414    memset(&tmpW,0,sizeof(sleftv));
1415    tmpW.rtyp=IDTYP(w);
1416    tmpW.data=IDDATA(w);
1417    if ((bo=maApplyFetch(iiOp,NULL,res,&tmpW, r, perm,par_perm,par_perm_size)))
1418    {
1419      Werror("cannot map %s of type %s(%d)",v->name, Tok2Cmdname(w->typ),w->typ);
1420    }
1421    if (perm!=NULL)
1422      Free((ADDRESS)perm,(r->N+1)*sizeof(int));
1423    if (par_perm!=NULL)
1424      Free((ADDRESS)par_perm,par_perm_size*sizeof(int));
1425    return bo;
1426  }
1427  else
1428  {
1429    Werror("%s undefined in %s",v->Name(),u->Name());
1430  }
1431  return TRUE;
1432err_fetch:
1433  Werror("no identity map from %s",u->Name());
1434  return TRUE;
1435}
1436static BOOLEAN jjFIND2(leftv res, leftv u, leftv v)
1437{
1438  /*4
1439  * look for the substring what in the string where
1440  * return the position of the first char of what in where
1441  * or 0
1442  */
1443  char *where=(char *)u->Data();
1444  char *what=(char *)v->Data();
1445  char *found = strstr(where,what);
1446  if (found != NULL)
1447  {
1448    res->data=(char *)((found-where)+1);
1449  }
1450  /*else res->data=NULL;*/
1451  return FALSE;
1452}
1453static BOOLEAN jjGCD_I(leftv res, leftv u, leftv v)
1454{
1455  int p0=ABS((int)u->Data()),p1=ABS((int)v->Data());
1456  int q, r;
1457
1458  while ( p1!=0 )
1459  {
1460    q=p0 / p1;
1461    r=p0 % p1;
1462    p0 = p1; p1 = r;
1463  }
1464  res->rtyp=INT_CMD;
1465  res->data=(char *)p0;
1466  return FALSE;
1467}
1468static BOOLEAN jjHILBERT2(leftv res, leftv u, leftv v)
1469{
1470  assumeStdFlag(u);
1471  intvec *module_w=(intvec*)atGet(u,"isHomog");
1472  intvec *iv=hFirstSeries((ideal)u->Data(),module_w,currQuotient);
1473  switch((int)v->Data())
1474  {
1475    case 1:
1476      res->data=(void *)iv;
1477      return FALSE;
1478    case 2:
1479      res->data=(void *)hSecondSeries(iv);
1480      delete iv;
1481      return FALSE;
1482  }
1483  WerrorS("not implemented yet");
1484  delete iv;
1485  return TRUE;
1486}
1487static BOOLEAN jjHOMOG_P(leftv res, leftv u, leftv v)
1488{
1489  int i=pVar((poly)v->Data());
1490  if (i==0)
1491  {
1492    WerrorS("ringvar expected");
1493    return TRUE;
1494  }
1495  res->data = (char *)pHomogen((poly)u->Data(),i);
1496  return FALSE;
1497}
1498static BOOLEAN jjHOMOG_ID(leftv res, leftv u, leftv v)
1499{
1500  int i=pVar((poly)v->Data());
1501  if (i==0)
1502  {
1503    WerrorS("ringvar expected");
1504    return TRUE;
1505  }
1506  res->data = (char *)idHomogen((ideal)u->Data(),i);
1507  return FALSE;
1508}
1509static BOOLEAN jjINTERSECT(leftv res, leftv u, leftv v)
1510{
1511  res->data=(char *)idSect((ideal)u->Data(),(ideal)v->Data());
1512  setFlag(res,FLAG_STD);
1513  return FALSE;
1514}
1515static BOOLEAN jjJET_P(leftv res, leftv u, leftv v)
1516{
1517  res->data = (char *)pJet((poly)u->Data(),(int)v->Data());
1518  return FALSE;
1519}
1520static BOOLEAN jjJET_ID(leftv res, leftv u, leftv v)
1521{
1522  res->data = (char *)idJet((ideal)u->Data(),(int)v->Data());
1523  return FALSE;
1524}
1525static BOOLEAN jjKBASE2(leftv res, leftv u, leftv v)
1526{
1527  assumeStdFlag(u);
1528  res->data = (char *)scKBase((int)v->Data(),
1529                              (ideal)(u->Data()),currQuotient);
1530  return FALSE;
1531}
1532static BOOLEAN jjKoszul(leftv res, leftv u, leftv v)
1533{
1534  return mpKoszul(res, u,v);
1535}
1536static BOOLEAN jjKoszul_Id(leftv res, leftv u, leftv v)
1537{
1538  sleftv h;
1539  memset(&h,0,sizeof(sleftv));
1540  h.rtyp=INT_CMD;
1541  h.data=(void *)IDELEMS((ideal)v->Data());
1542  return mpKoszul(res, &h, u, v);
1543}
1544static BOOLEAN jjLIFT(leftv res, leftv u, leftv v)
1545{
1546  ideal m;
1547  int ul= IDELEMS((ideal)u->Data());
1548  int vl= IDELEMS((ideal)v->Data());
1549  if (hasFlag(u,FLAG_STD))
1550  {
1551    m = idLift((ideal)u->Data(),(ideal)v->Data());
1552    res->data = (char *)idModule2formatedMatrix(m,ul,vl);
1553  }
1554  else
1555  {
1556    // matrix ma=mpNew(1,1);
1557    // ideal mo=idLiftStd((ideal)u->CopyD(),currQuotient,&ma,testHomog);
1558    // m = idLift(mo,(ideal)v->Data());
1559    // matrix r=idModule2formatedMatrix(m, IDELEMS(mo),vl);
1560    // idDelete(&mo);
1561    // // idDelete(&m); already done by idModule2formatedMatrix
1562    // res->data=(char *)mpMult(ma,r);
1563    // idDelete((ideal *)&ma);
1564    // idDelete((ideal *)&r);
1565    m = idLiftNonStB((ideal)u->Data(),(ideal)v->Data());
1566    res->data = (char *)idModule2formatedMatrix(m,ul,vl);
1567  }
1568  return FALSE;
1569}
1570static BOOLEAN jjLIFTSTD(leftv res, leftv u, leftv v)
1571{
1572  if ((v->rtyp!=IDHDL)||(v->e!=NULL)) return TRUE;
1573  idhdl h=(idhdl)v->data;
1574  res->data = (char *)idLiftStd((ideal)u->CopyD(), currQuotient,
1575              &(h->data.umatrix),testHomog);
1576  setFlag(res,FLAG_STD);
1577  return FALSE;
1578}
1579static BOOLEAN jjMINOR(leftv res, leftv u, leftv v)
1580{
1581  res->data = (char *)idMinors((matrix)u->Data(),(int)v->Data());
1582  return FALSE;
1583}
1584static BOOLEAN jjMODULO(leftv res, leftv u, leftv v)
1585{
1586  res->data = (char *)idModulo((ideal)u->Data(),(ideal)v->Data());
1587  return FALSE;
1588}
1589static BOOLEAN jjMONITOR2(leftv res, leftv u,leftv v)
1590{
1591  char *opt=(char *)v->Data();
1592  int mode=0;
1593  while(*opt!='\0')
1594  {
1595    if (*opt=='i') mode |= PROT_I;
1596    else if (*opt=='o') mode |= PROT_O;
1597    opt++;
1598  }
1599  monitor((char *)(u->Data()),mode);
1600  return FALSE;
1601}
1602static BOOLEAN jjPARSTR2(leftv res, leftv u, leftv v)
1603{
1604  idhdl h=(idhdl)u->data;
1605  int i=(int)v->Data();
1606  int p=0;
1607  if ((0<i)
1608  && (IDRING(h)->parameter!=NULL)
1609  && (i<=(p=rPar(IDRING(h)))))
1610    res->data=mstrdup(IDRING(h)->parameter[i-1]);
1611  else
1612  {
1613    Werror("par number %d out of range 1..%d",i,p);
1614    return TRUE;
1615  }
1616  return FALSE;
1617}
1618static BOOLEAN jjQUOT(leftv res, leftv u, leftv v)
1619{
1620  res->data = (char *)idQuot((ideal)u->Data(),(ideal)v->Data(),
1621    hasFlag(u,FLAG_STD));
1622  idDelMultiples((ideal)(res->data));
1623  return FALSE;
1624}
1625static BOOLEAN jjRANDOM(leftv res, leftv u, leftv v)
1626{
1627  int i=(int)u->Data();
1628  int j=(int)v->Data();
1629#ifdef buildin_rand
1630  res->data =(char *)((i > j) ? i : (siRand() % (j-i+1)) + i);
1631#else
1632  res->data =(char *)((i > j) ? i : (rand() % (j-i+1)) + i);
1633#endif
1634  return FALSE;
1635}
1636static BOOLEAN jjREAD2(leftv res, leftv u, leftv v)
1637{
1638  si_link l=(si_link)u->Data();
1639  leftv r=slRead(l,v);
1640  if (r==NULL)
1641  {
1642    const char *s;
1643    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
1644    else                            s=sNoName;
1645    Werror("cannot read from `%s`",s);
1646    return TRUE;
1647  }
1648  memcpy(res,r,sizeof(sleftv));
1649  Free((ADDRESS)r,sizeof(sleftv));
1650  return FALSE;
1651}
1652static BOOLEAN jjREDUCE_P(leftv res, leftv u, leftv v)
1653{
1654  assumeStdFlag(v);
1655  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(poly)u->Data());
1656  return FALSE;
1657}
1658static BOOLEAN jjREDUCE_ID(leftv res, leftv u, leftv v)
1659{
1660  assumeStdFlag(v);
1661  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(ideal)u->Data());
1662  return FALSE;
1663}
1664static BOOLEAN jjRES(leftv res, leftv u, leftv v)
1665{
1666  int maxl=(int)v->Data();
1667  if (maxl<0)
1668  {
1669    WerrorS("length for res must not be negative");
1670    return TRUE;
1671  }
1672  int l=0;
1673  resolvente r;
1674  intvec **weights=NULL;
1675  int wmaxl=maxl;
1676  maxl--;
1677  if ((maxl==-1) && (iiOp!=MRES_CMD))
1678    maxl = pVariables-1;
1679  if ((iiOp == RES_CMD) || (iiOp == MRES_CMD))
1680  {
1681    if (BTEST1(28))
1682    {
1683      r=syMinRes((ideal)u->Data(),maxl,&l, iiOp==MRES_CMD);
1684    }
1685    else
1686    {
1687      intvec * iv=(intvec*)atGet(u,"isHomog");
1688      if (iv!=NULL)
1689      {
1690        weights = (intvec**)Alloc0(sizeof(intvec*));
1691        weights[0] = ivCopy(iv);
1692        l=1;
1693      }
1694      r=syResolvente((ideal)u->Data(),maxl,&l, &weights, iiOp==MRES_CMD);
1695    }
1696  }
1697  else
1698    r=sySchreyerResolvente((ideal)u->Data(),maxl+1,&l);
1699  if (r==NULL) return TRUE;
1700  res->data=(void *)liMakeResolv(r,l,wmaxl,u->Typ(),weights);
1701  return FALSE;
1702}
1703static BOOLEAN jjRSUM(leftv res, leftv u, leftv v)
1704{
1705  ring r;
1706  int i=rSum((ring)u->Data(),(ring)v->Data(),r);
1707  res->data = (char *)r;
1708  return (i==-1);
1709}
1710#define SIMPL_MULT 8
1711#define SIMPL_EQU  4
1712#define SIMPL_NULL 2
1713#define SIMPL_NORM 1
1714static BOOLEAN jjSIMPL_ID(leftv res, leftv u, leftv v)
1715{
1716  int sw = (int)v->Data();
1717  ideal id = (ideal)u->CopyD();
1718  if (sw & SIMPL_NULL)
1719  {
1720    idSkipZeroes(id);
1721  }
1722  if (sw & SIMPL_NORM)
1723  {
1724    idNorm(id);
1725  }
1726  if (sw & SIMPL_MULT)
1727  {
1728    idDelMultiples(id);
1729  }
1730  else if(sw & SIMPL_EQU)
1731  {
1732    idDelEquals(id);
1733  }
1734  res->data = (char * )id;
1735  return FALSE;
1736}
1737static BOOLEAN jjSTATUS2(leftv res, leftv u, leftv v)
1738{
1739  res->data = mstrdup(slStatus((si_link) u->Data(), (char *) v->Data()));
1740  return FALSE;
1741}
1742static BOOLEAN jjSIMPL_P(leftv res, leftv u, leftv v)
1743{
1744  int sw = (int)v->Data();
1745  poly p = (poly)u->CopyD();
1746  if (sw & SIMPL_NORM)
1747  {
1748    pNorm(p);
1749  }
1750  res->data = (char * )p;
1751  return FALSE;
1752}
1753static BOOLEAN jjSTD_HILB(leftv res, leftv u, leftv v)
1754{
1755  ideal result;
1756  intvec *w=(intvec *)atGet(u,"isHomog");
1757  tHomog hom=testHomog;
1758  if (w!=NULL)
1759  {
1760    w=ivCopy(w);
1761    hom=isHomog;
1762  }
1763  result=std((ideal)(u->Data()),currQuotient,hom,&w,(intvec *)v->Data());
1764  idSkipZeroes(result);
1765  res->data = (char *)result;
1766  setFlag(res,FLAG_STD);
1767  if (w!=NULL) atSet(res,mstrdup("isHomog"),w,INTVEC_CMD);
1768  return FALSE;
1769}
1770static BOOLEAN jjSTD_1(leftv res, leftv u, leftv v)
1771{
1772  ideal result;
1773  intvec *w=(intvec *)atGet(u,"isHomog");
1774  tHomog hom=testHomog;
1775  if (w!=NULL)
1776  {
1777    w=ivCopy(w);
1778    hom=isHomog;
1779  }
1780  ideal i1=(ideal)u->Data();
1781  ideal i0=idInit(1,i1->rank);
1782  i0->m[0]=(poly)v->Data();
1783  i1=idSimpleAdd(i1,i0);
1784  i0->m[0]=NULL;
1785  idDelete(&i0);
1786  BITSET save_test=test;
1787  test|=Sy_bit(OPT_SB_1);
1788  result=std(i1,currQuotient,hom,&w);
1789  test=save_test;
1790  idDelete(&i1);
1791  idSkipZeroes(result);
1792  res->data = (char *)result;
1793  setFlag(res,FLAG_STD);
1794  if (w!=NULL) atSet(res,mstrdup("isHomog"),w,INTVEC_CMD);
1795  return FALSE;
1796}
1797static BOOLEAN jjVARSTR2(leftv res, leftv u, leftv v)
1798{
1799  idhdl h=(idhdl)u->data;
1800  int i=(int)v->Data();
1801  if ((0<i) && (i<=IDRING(h)->N))
1802    res->data=mstrdup(IDRING(h)->names[i-1]);
1803  else
1804  {
1805    Werror("var number %d out of range 1..%d",i,IDRING(h)->N);
1806    return TRUE;
1807  }
1808  return FALSE;
1809}
1810static BOOLEAN jjWEDGE(leftv res, leftv u, leftv v)
1811{
1812  res->data = (char *)mpWedge((matrix)u->Data(),(int)v->Data());
1813  return FALSE;
1814}
1815#define jjWRONG2 (proc2)jjWRONG
1816#define jjWRONG3 (proc3)jjWRONG
1817static BOOLEAN jjWRONG(leftv res, leftv u)
1818{
1819  return TRUE;
1820}
1821/*=================== operations with 2 args.: table =================*/
1822struct sValCmd2 dArith2[]=
1823{
1824// operations:
1825// proc        cmd              res             arg1        arg2
1826 {jjPLUS_I,    '+',            INT_CMD,        INT_CMD,    INT_CMD        PROFILER}
1827,{jjPLUS_N,    '+',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD     PROFILER}
1828,{jjPLUS_P,    '+',            POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
1829,{jjPLUS_P,    '+',            VECTOR_CMD,     VECTOR_CMD, VECTOR_CMD PROFILER}
1830,{jjPLUS_ID,   '+',            IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
1831,{jjPLUS_ID,   '+',            MODUL_CMD,      MODUL_CMD,  MODUL_CMD PROFILER}
1832,{jjPLUS_P_MA, '+',            MATRIX_CMD,     POLY_CMD,   MATRIX_CMD PROFILER}
1833,{jjPLUS_MA_P, '+',            MATRIX_CMD,     MATRIX_CMD, POLY_CMD PROFILER}
1834,{jjPLUS_MA,   '+',            MATRIX_CMD,     MATRIX_CMD, MATRIX_CMD PROFILER}
1835,{jjPLUS_S,    '+',            STRING_CMD,     STRING_CMD, STRING_CMD PROFILER}
1836,{jjOP_IV_I,   '+',            INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
1837,{jjOP_I_IV,   '+',            INTVEC_CMD,     INT_CMD,    INTVEC_CMD PROFILER}
1838,{jjOP_IM_I,   '+',            INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
1839,{jjOP_I_IM,   '+',            INTMAT_CMD,     INT_CMD,    INTMAT_CMD PROFILER}
1840,{jjPLUS_IV,   '+',            INTVEC_CMD,     INTVEC_CMD, INTVEC_CMD PROFILER}
1841,{jjPLUS_IV,   '+',            INTMAT_CMD,     INTMAT_CMD, INTMAT_CMD PROFILER}
1842,{lAdd,        '+',            LIST_CMD,       LIST_CMD,   LIST_CMD PROFILER}
1843,{jjRSUM,      '+',            RING_CMD,       RING_CMD,   RING_CMD PROFILER}
1844,{jjMINUS_I,   '-',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
1845,{jjMINUS_N,   '-',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD PROFILER}
1846,{jjMINUS_P,   '-',            POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
1847,{jjMINUS_P,   '-',            VECTOR_CMD,     VECTOR_CMD, VECTOR_CMD PROFILER}
1848,{jjPLUS_MA_P, '-',            MATRIX_CMD,     MATRIX_CMD, POLY_CMD PROFILER}
1849,{jjMINUS_MA,  '-',            MATRIX_CMD,     MATRIX_CMD, MATRIX_CMD PROFILER}
1850,{jjOP_IV_I,   '-',            INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
1851,{jjOP_IM_I,   '-',            INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
1852,{jjMINUS_IV,  '-',            INTVEC_CMD,     INTVEC_CMD, INTVEC_CMD PROFILER}
1853,{jjMINUS_IV,  '-',            INTMAT_CMD,     INTMAT_CMD, INTMAT_CMD PROFILER}
1854,{jjTIMES_I,   '*',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
1855,{jjTIMES_N,   '*',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD PROFILER}
1856,{jjTIMES_P,   '*',            POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
1857,{jjTIMES_P,   '*',            VECTOR_CMD,     POLY_CMD,   VECTOR_CMD PROFILER}
1858,{jjTIMES_P,   '*',            VECTOR_CMD,     VECTOR_CMD, POLY_CMD PROFILER}
1859,{jjTIMES_MA_P1,'*',           IDEAL_CMD,      IDEAL_CMD,  POLY_CMD PROFILER}
1860,{jjTIMES_MA_P2,'*',           IDEAL_CMD,      POLY_CMD,   IDEAL_CMD PROFILER}
1861,{jjTIMES_ID,  '*',            IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
1862,{jjTIMES_MA_P1,'*',           MODUL_CMD,      IDEAL_CMD,  VECTOR_CMD PROFILER}
1863,{jjTIMES_MA_P2,'*',           MODUL_CMD,      VECTOR_CMD, IDEAL_CMD PROFILER}
1864,{jjTIMES_ID,  '*',            MODUL_CMD,      IDEAL_CMD,  MODUL_CMD PROFILER}
1865,{jjTIMES_ID,  '*',            MODUL_CMD,      MODUL_CMD,  IDEAL_CMD PROFILER}
1866,{jjTIMES_MA_P1,'*',           MATRIX_CMD,     MATRIX_CMD, POLY_CMD PROFILER}
1867,{jjTIMES_MA_P2,'*',           MATRIX_CMD,     POLY_CMD,   MATRIX_CMD PROFILER}
1868,{jjTIMES_MA_N1,'*',           MATRIX_CMD,     MATRIX_CMD, NUMBER_CMD PROFILER}
1869,{jjTIMES_MA_N2,'*',           MATRIX_CMD,     NUMBER_CMD, MATRIX_CMD PROFILER}
1870,{jjTIMES_MA_I1,'*',           MATRIX_CMD,     MATRIX_CMD, INT_CMD PROFILER}
1871,{jjTIMES_MA_I2,'*',           MATRIX_CMD,     INT_CMD,    MATRIX_CMD PROFILER}
1872,{jjTIMES_MA,  '*',            MATRIX_CMD,     MATRIX_CMD, MATRIX_CMD PROFILER}
1873,{jjOP_IV_I,   '*',            INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
1874,{jjOP_I_IV,   '*',            INTVEC_CMD,     INT_CMD,    INTVEC_CMD PROFILER}
1875,{jjOP_IV_I,   '*',            INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
1876,{jjOP_I_IV,   '*',            INTMAT_CMD,     INT_CMD,    INTMAT_CMD PROFILER}
1877,{jjTIMES_IV,  '*',            INTVEC_CMD,     INTMAT_CMD, INTVEC_CMD PROFILER}
1878,{jjTIMES_IV,  '*',            INTMAT_CMD,     INTMAT_CMD, INTMAT_CMD PROFILER}
1879,{jjDIV_N,     '/',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD PROFILER}
1880,{jjDIV_P,     '/',            POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
1881,{jjDIV_P,     '/',            VECTOR_CMD,     VECTOR_CMD, POLY_CMD PROFILER}
1882,{jjDIV_I,     '/',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
1883,{jjOP_IV_I,   '/',            INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
1884,{jjOP_IV_I,   '/',            INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
1885,{jjDIV_I,     INTDIV,         INT_CMD,        INT_CMD,    INT_CMD PROFILER}
1886,{jjOP_IV_I,   INTDIV,         INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
1887,{jjOP_IV_I,   INTDIV,         INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
1888,{jjMOD_I,     '%',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
1889,{jjOP_IV_I,   '%',            INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
1890,{jjOP_IV_I,   '%',            INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
1891,{jjPOWER_I,   '^',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
1892,{jjPOWER_N,   '^',            NUMBER_CMD,     NUMBER_CMD, INT_CMD PROFILER}
1893,{jjPOWER_P,   '^',            POLY_CMD,       POLY_CMD,   INT_CMD PROFILER}
1894,{jjPOWER_ID,  '^',            IDEAL_CMD,      IDEAL_CMD,  INT_CMD PROFILER}
1895,{jjLE_I,      LE,             INT_CMD,        INT_CMD,    INT_CMD PROFILER}
1896,{jjLE_N,      LE,             INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
1897,{jjCOMPARE_S, LE,             INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
1898,{jjCOMPARE_IV_I,LE,           INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
1899,{jjCOMPARE_IV,LE,             INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
1900,{jjCOMPARE_P, LE,             INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
1901,{jjCOMPARE_P, LE,             INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
1902,{jjLT_I,      '<',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
1903,{jjLT_N,      '<',            INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
1904,{jjCOMPARE_IV_I,'<',           INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
1905,{jjCOMPARE_IV,'<',            INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
1906,{jjCOMPARE_S, '<',            INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
1907,{jjCOMPARE_P, '<',            INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
1908,{jjCOMPARE_P, '<',            INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
1909,{jjGE_I,      GE,             INT_CMD,        INT_CMD,    INT_CMD PROFILER}
1910,{jjGE_N,      GE,             INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
1911,{jjCOMPARE_S, GE,             INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
1912,{jjCOMPARE_IV_I,GE,           INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
1913,{jjCOMPARE_IV,GE,             INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
1914,{jjCOMPARE_P, GE,             INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
1915,{jjCOMPARE_P, GE,             INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
1916,{jjGT_I,      '>',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
1917,{jjGT_N,      '>',            INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
1918,{jjCOMPARE_S, '>',            INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
1919,{jjCOMPARE_IV_I,'>',          INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
1920,{jjCOMPARE_IV,'>',            INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
1921,{jjCOMPARE_P, '>',            INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
1922,{jjCOMPARE_P, '>',            INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
1923,{jjAND_I,     '&',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
1924,{jjOR_I,      '|',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
1925,{jjEQUAL_I,   EQUAL_EQUAL,    INT_CMD,        INT_CMD,    INT_CMD PROFILER}
1926,{jjEQUAL_N,   EQUAL_EQUAL,    INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
1927,{jjCOMPARE_S, EQUAL_EQUAL,    INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
1928,{jjEQUAL_P,   EQUAL_EQUAL,    INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
1929,{jjEQUAL_P,   EQUAL_EQUAL,    INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
1930,{jjCOMPARE_IV_I,EQUAL_EQUAL,  INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
1931,{jjCOMPARE_IV,EQUAL_EQUAL,    INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
1932,{jjCOMPARE_IV,EQUAL_EQUAL,    INT_CMD,        INTMAT_CMD, INTMAT_CMD PROFILER}
1933,{jjEQUAL_Ma,  EQUAL_EQUAL,    INT_CMD,        MATRIX_CMD, MATRIX_CMD PROFILER}
1934,{jjWRONG2,    EQUAL_EQUAL,    0,              IDEAL_CMD,  IDEAL_CMD PROFILER}
1935,{jjWRONG2,    EQUAL_EQUAL,    0,              MODUL_CMD,  MODUL_CMD PROFILER}
1936,{jjEQUAL_I,   NOTEQUAL,       INT_CMD,        INT_CMD,    INT_CMD PROFILER}
1937,{jjEQUAL_N,   NOTEQUAL,       INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
1938,{jjCOMPARE_S, NOTEQUAL,       INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
1939,{jjEQUAL_P,   NOTEQUAL,       INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
1940,{jjEQUAL_P,   NOTEQUAL,       INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
1941,{jjCOMPARE_IV,NOTEQUAL,       INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
1942,{jjCOMPARE_IV,NOTEQUAL,       INT_CMD,        INTMAT_CMD, INTMAT_CMD PROFILER}
1943,{jjEQUAL_Ma,  NOTEQUAL,       INT_CMD,        MATRIX_CMD, MATRIX_CMD PROFILER}
1944,{jjWRONG2,    NOTEQUAL,       0,              IDEAL_CMD,  IDEAL_CMD PROFILER}
1945,{jjWRONG2,    NOTEQUAL,       0,              MODUL_CMD,  MODUL_CMD PROFILER}
1946,{jjDOTDOT,    DOTDOT,         INTVEC_CMD,     INT_CMD,    INT_CMD PROFILER}
1947,{jjINDEX_I,   '[',            INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
1948,{jjINDEX_IV,  '[',            INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
1949,{jjINDEX_I,   '[',            POLY_CMD,       IDEAL_CMD,  INT_CMD PROFILER}
1950,{jjINDEX_I,   '[',            POLY_CMD,       MAP_CMD,    INT_CMD PROFILER}
1951,{jjINDEX_IV,  '[',            POLY_CMD,       IDEAL_CMD,  INTVEC_CMD PROFILER}
1952,{jjINDEX_I,   '[',            VECTOR_CMD,     MODUL_CMD,  INT_CMD PROFILER}
1953,{jjINDEX_IV,  '[',            VECTOR_CMD,     MODUL_CMD,  INTVEC_CMD PROFILER}
1954,{jjINDEX_I,   '[',            STRING_CMD,     STRING_CMD, INT_CMD PROFILER}
1955,{jjINDEX_IV,  '[',            STRING_CMD,     STRING_CMD, INTVEC_CMD PROFILER}
1956,{jjINDEX_I,   '[',            ANY_TYPE/*set by p*/,LIST_CMD, INT_CMD PROFILER}
1957,{jjINDEX_IV,  '[',            ANY_TYPE/*set by p*/,LIST_CMD, INTVEC_CMD PROFILER}
1958,{jjINDEX_P,   '[',            POLY_CMD,       POLY_CMD,   INT_CMD PROFILER}
1959,{jjINDEX_P_IV,'[',            POLY_CMD,       POLY_CMD,   INTVEC_CMD PROFILER}
1960,{jjINDEX_V,   '[',            POLY_CMD,       VECTOR_CMD, INT_CMD PROFILER}
1961,{jjINDEX_V_IV,'[',            VECTOR_CMD,     VECTOR_CMD, INTVEC_CMD PROFILER}
1962,{jjPROC,      '(',            ANY_TYPE/*set by p*/,PROC_CMD, DEF_CMD PROFILER}
1963,{jjMAP,       '(',            ANY_TYPE/*set by p*/,MAP_CMD, DEF_CMD PROFILER}
1964,{jjKLAMMER,   '(',            ANY_TYPE/*set by p*/,ANY_TYPE, INT_CMD PROFILER}
1965,{jjKLAMMER_IV,'(',            ANY_TYPE/*set by p*/,ANY_TYPE, INTVEC_CMD PROFILER}
1966// and the procedures with 2 arguments:
1967,{atATTRIB2,   ATTRIB_CMD,     NONE/*set by p*/,DEF_CMD,   STRING_CMD PROFILER}
1968,{jjCOEF,      COEF_CMD,       MATRIX_CMD,     POLY_CMD,   POLY_CMD PROFILER}
1969,{jjCOEFFS_Id, COEFFS_CMD,     MATRIX_CMD,     IDEAL_CMD,  POLY_CMD PROFILER}
1970,{jjCOEFFS_Id, COEFFS_CMD,     MATRIX_CMD,     MODUL_CMD,  POLY_CMD PROFILER}
1971,{jjCONTRACT,  CONTRACT_CMD,   MATRIX_CMD,     IDEAL_CMD,  IDEAL_CMD PROFILER}
1972,{jjDEG_IV,    DEG_CMD,        INT_CMD,        POLY_CMD,   INTVEC_CMD PROFILER}
1973,{lDelete,     DELETE_CMD,     LIST_CMD,       LIST_CMD,   INT_CMD PROFILER}
1974,{jjDIFF_P,    DIFF_CMD,       POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
1975,{jjDIFF_P,    DIFF_CMD,       VECTOR_CMD,     VECTOR_CMD, POLY_CMD PROFILER}
1976,{jjDIFF_ID,   DIFF_CMD,       IDEAL_CMD,      IDEAL_CMD,  POLY_CMD PROFILER}
1977,{jjDIFF_ID_ID,DIFF_CMD,       MATRIX_CMD,     IDEAL_CMD,  IDEAL_CMD PROFILER}
1978,{jjDIFF_ID,   DIFF_CMD,       MODUL_CMD,      MODUL_CMD,  POLY_CMD PROFILER}
1979,{jjDIFF_ID,   DIFF_CMD,       MATRIX_CMD,     MATRIX_CMD, POLY_CMD PROFILER}
1980,{jjDIM2,      DIM_CMD,        INT_CMD,        IDEAL_CMD,  IDEAL_CMD PROFILER}
1981,{jjDIM2,      DIM_CMD,        INT_CMD,        MODUL_CMD,  IDEAL_CMD PROFILER}
1982,{jjELIMIN,    ELIMINATION_CMD,IDEAL_CMD,      IDEAL_CMD,  POLY_CMD PROFILER}
1983,{jjELIMIN,    ELIMINATION_CMD,MODUL_CMD,      MODUL_CMD,  POLY_CMD PROFILER}
1984,{jjEXTGCD_I,  EXTGCD_CMD,     LIST_CMD,       INT_CMD,    INT_CMD PROFILER}
1985#ifdef HAVE_FACTORY
1986,{jjEXTGCD_P,  EXTGCD_CMD,     LIST_CMD,       POLY_CMD,   POLY_CMD PROFILER}
1987,{jjSQR_FREE_DEC,FAC_CMD,      IDEAL_CMD,      POLY_CMD,   INT_CMD PROFILER}
1988,{jjFACSTD2,    FACSTD_CMD,    LIST_CMD,       IDEAL_CMD,  IDEAL_CMD PROFILER}
1989#else
1990,{jjWRONG2,    EXTGCD_CMD,     LIST_CMD,       POLY_CMD,   POLY_CMD PROFILER}
1991,{jjWRONG2,    FAC_CMD,        IDEAL_CMD,      POLY_CMD,   INT_CMD PROFILER}
1992,{jjWRONG2,    FACSTD_CMD,     LIST_CMD,       IDEAL_CMD,  IDEAL_CMD PROFILER}
1993#endif
1994,{jjFETCH,     FETCH_CMD,      ANY_TYPE/*set by p*/,RING_CMD,  ANY_TYPE PROFILER}
1995,{jjFETCH,     FETCH_CMD,      ANY_TYPE/*set by p*/,QRING_CMD, ANY_TYPE PROFILER}
1996#ifdef HAVE_FGLM
1997,{fglmProc,    FGLM_CMD,       IDEAL_CMD,      RING_CMD,   DEF_CMD PROFILER}
1998,{fglmProc,    FGLM_CMD,       IDEAL_CMD,      QRING_CMD,  DEF_CMD PROFILER}
1999#else
2000,{jjWRONG2,    FGLM_CMD,       IDEAL_CMD,      RING_CMD,   DEF_CMD PROFILER}
2001,{jjWRONG2,    FGLM_CMD,       IDEAL_CMD,      QRING_CMD,  DEF_CMD PROFILER}
2002#endif
2003,{jjFIND2,     FIND_CMD,       INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
2004,{jjGCD_I,     GCD_CMD,        INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2005#ifdef HAVE_FACTORY
2006,{jjGCD_P,     GCD_CMD,        POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2007#else
2008,{jjWRONG2,    GCD_CMD,        POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2009#endif
2010,{jjHILBERT2,  HILBERT_CMD,    INTVEC_CMD,     IDEAL_CMD,  INT_CMD PROFILER}
2011,{jjHILBERT2,  HILBERT_CMD,    INTVEC_CMD,     MODUL_CMD,  INT_CMD PROFILER}
2012,{jjHOMOG_P,   HOMOG_CMD,      POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2013,{jjHOMOG_P,   HOMOG_CMD,      VECTOR_CMD,     VECTOR_CMD, POLY_CMD PROFILER}
2014,{jjHOMOG_ID,  HOMOG_CMD,      IDEAL_CMD,      IDEAL_CMD,  POLY_CMD PROFILER}
2015,{jjHOMOG_ID,  HOMOG_CMD,      MODUL_CMD,      MODUL_CMD,  POLY_CMD PROFILER}
2016,{jjCALL2MANY, IDEAL_CMD,      IDEAL_CMD,      DEF_CMD,    DEF_CMD PROFILER}
2017,{jjFETCH,     IMAP_CMD,       ANY_TYPE/*set by p*/,RING_CMD,  ANY_TYPE PROFILER}
2018,{jjFETCH,     IMAP_CMD,       ANY_TYPE/*set by p*/,QRING_CMD, ANY_TYPE PROFILER}
2019,{lInsert,     INSERT_CMD,     LIST_CMD,       LIST_CMD,   DEF_CMD PROFILER}
2020,{jjINTERSECT, INTERSECT_CMD,  IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
2021,{jjINTERSECT, INTERSECT_CMD,  MODUL_CMD,      MODUL_CMD,  MODUL_CMD PROFILER}
2022,{jjJET_P,     JET_CMD,        POLY_CMD,       POLY_CMD,   INT_CMD PROFILER}
2023,{jjJET_ID,    JET_CMD,        IDEAL_CMD,      IDEAL_CMD,  INT_CMD PROFILER}
2024,{jjJET_P,     JET_CMD,        VECTOR_CMD,     VECTOR_CMD, INT_CMD PROFILER}
2025,{jjJET_ID,    JET_CMD,        MODUL_CMD,      MODUL_CMD,  INT_CMD PROFILER}
2026,{jjKBASE2,    KBASE_CMD,      IDEAL_CMD,      IDEAL_CMD,  INT_CMD PROFILER}
2027,{jjKBASE2,    KBASE_CMD,      MODUL_CMD,      MODUL_CMD,  INT_CMD PROFILER}
2028,{atKILLATTR2, KILLATTR_CMD,   NONE,           IDHDL,      STRING_CMD PROFILER}
2029,{jjKoszul,    KOSZUL_CMD,     MATRIX_CMD,     INT_CMD,    INT_CMD PROFILER}
2030,{jjKoszul_Id, KOSZUL_CMD,     MATRIX_CMD,     INT_CMD,    IDEAL_CMD PROFILER}
2031,{jjLIFT,      LIFT_CMD,       MATRIX_CMD,     IDEAL_CMD,  IDEAL_CMD PROFILER}
2032,{jjLIFT,      LIFT_CMD,       MATRIX_CMD,     MODUL_CMD,  MODUL_CMD PROFILER}
2033,{jjLIFTSTD,   LIFTSTD_CMD,    IDEAL_CMD,      IDEAL_CMD,  MATRIX_CMD PROFILER}
2034,{jjLIFTSTD,   LIFTSTD_CMD,    MODUL_CMD,      MODUL_CMD,  MATRIX_CMD PROFILER}
2035,{jjCALL2MANY, LIST_CMD,       LIST_CMD,       DEF_CMD,    DEF_CMD PROFILER}
2036,{jjMINOR,     MINOR_CMD,      IDEAL_CMD,      MATRIX_CMD, INT_CMD PROFILER}
2037,{jjCALL2MANY, MODUL_CMD,      MODUL_CMD,      DEF_CMD,    DEF_CMD PROFILER}
2038,{jjMODULO,    MODULO_CMD,     MODUL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
2039,{jjMODULO,    MODULO_CMD,     MODUL_CMD,      MODUL_CMD,  MODUL_CMD PROFILER}
2040,{jjMONITOR2,  MONITOR_CMD,    NONE,           STRING_CMD, STRING_CMD PROFILER}
2041,{jjRES,       MRES_CMD,       LIST_CMD,       IDEAL_CMD,  INT_CMD PROFILER}
2042,{jjRES,       MRES_CMD,       LIST_CMD,       MODUL_CMD,  INT_CMD PROFILER}
2043,{jjPARSTR2,   PARSTR_CMD,     STRING_CMD,     RING_CMD,   INT_CMD PROFILER}
2044,{jjPARSTR2,   PARSTR_CMD,     STRING_CMD,     QRING_CMD,  INT_CMD PROFILER}
2045,{jjPRINT_FORMAT, PRINT_CMD,   NONE,           DEF_CMD,    STRING_CMD PROFILER}
2046,{jjQUOT,      QUOTIENT_CMD,   IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
2047,{jjQUOT,      QUOTIENT_CMD,   MODUL_CMD,      MODUL_CMD,  IDEAL_CMD PROFILER}
2048,{jjQUOT,      QUOTIENT_CMD,   IDEAL_CMD,      MODUL_CMD,  MODUL_CMD PROFILER}
2049,{jjRANDOM,    RANDOM_CMD,     INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2050,{jjREAD2,     READ_CMD,       STRING_CMD,     LINK_CMD,   STRING_CMD PROFILER}
2051,{jjREDUCE_P,  REDUCE_CMD,     POLY_CMD,       POLY_CMD,   IDEAL_CMD PROFILER}
2052,{jjREDUCE_P,  REDUCE_CMD,     VECTOR_CMD,     VECTOR_CMD, IDEAL_CMD PROFILER}
2053,{jjREDUCE_P,  REDUCE_CMD,     VECTOR_CMD,     VECTOR_CMD, MODUL_CMD PROFILER}
2054,{jjREDUCE_ID, REDUCE_CMD,     IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
2055,{jjREDUCE_ID, REDUCE_CMD,     MODUL_CMD,      MODUL_CMD,  MODUL_CMD PROFILER}
2056,{jjREDUCE_ID, REDUCE_CMD,     MODUL_CMD,      MODUL_CMD,  IDEAL_CMD PROFILER}
2057,{jjRES,       RES_CMD,        LIST_CMD,       IDEAL_CMD,  INT_CMD PROFILER}
2058,{jjRES,       RES_CMD,        LIST_CMD,       MODUL_CMD,  INT_CMD PROFILER}
2059,{jjSTATUS2,   STATUS_CMD,     STRING_CMD,     LINK_CMD,   STRING_CMD PROFILER}
2060,{jjSIMPL_P,   SIMPLIFY_CMD,   POLY_CMD,       POLY_CMD,   INT_CMD PROFILER}
2061,{jjSIMPL_P,   SIMPLIFY_CMD,   VECTOR_CMD,     VECTOR_CMD, INT_CMD PROFILER}
2062,{jjSIMPL_ID,  SIMPLIFY_CMD,   IDEAL_CMD,      IDEAL_CMD,  INT_CMD PROFILER}
2063,{jjSIMPL_ID,  SIMPLIFY_CMD,   MODUL_CMD,      MODUL_CMD,  INT_CMD PROFILER}
2064,{jjRES,       SRES_CMD,       LIST_CMD,       IDEAL_CMD,  INT_CMD PROFILER}
2065,{jjRES,       SRES_CMD,       LIST_CMD,       MODUL_CMD,  INT_CMD PROFILER}
2066,{jjCALL2MANY, SYSTEM_CMD,     ANY_TYPE/*set by p*/,STRING_CMD, DEF_CMD PROFILER}
2067,{jjSTD_1,     STD_CMD,        IDEAL_CMD,      IDEAL_CMD,  POLY_CMD PROFILER}
2068,{jjSTD_1,     STD_CMD,        MODUL_CMD,      MODUL_CMD,  VECTOR_CMD PROFILER}
2069,{jjSTD_HILB,  STD_CMD,        IDEAL_CMD,      IDEAL_CMD,  INTVEC_CMD PROFILER}
2070,{jjSTD_HILB,  STD_CMD,        MODUL_CMD,      MODUL_CMD,  INTVEC_CMD PROFILER}
2071,{jjVARSTR2,   VARSTR_CMD,     STRING_CMD,     RING_CMD,   INT_CMD PROFILER}
2072,{jjVARSTR2,   VARSTR_CMD,     STRING_CMD,     QRING_CMD,  INT_CMD PROFILER}
2073,{jjWEDGE,     WEDGE_CMD,      MATRIX_CMD,     MATRIX_CMD, INT_CMD PROFILER}
2074,{NULL,        0,              0,              0,          0 PROFILER}
2075};
2076/*=================== operations with 1 arg.: static proc =================*/
2077static BOOLEAN jjDUMMY(leftv res, leftv u)
2078{
2079  res->data = (char *)u->CopyD();
2080  return FALSE;
2081}
2082static BOOLEAN jjNULL(leftv res, leftv u)
2083{
2084  return FALSE;
2085}
2086//static BOOLEAN jjPLUSPLUS(leftv res, leftv u)
2087//{
2088//  res->data = (char *)((int)u->Data()+1);
2089//  return FALSE;
2090//}
2091//static BOOLEAN jjMINUSMINUS(leftv res, leftv u)
2092//{
2093//  res->data = (char *)((int)u->Data()-1);
2094//  return FALSE;
2095//}
2096static BOOLEAN jjPLUSPLUS(leftv res, leftv u)
2097{
2098  if (IDTYP((idhdl)u->data)==INT_CMD)
2099  {
2100    if (iiOp==PLUSPLUS) IDINT((idhdl)u->data)++;
2101    else                IDINT((idhdl)u->data)--;
2102    return FALSE;
2103  }
2104  return TRUE;
2105}
2106static BOOLEAN jjUMINUS_I(leftv res, leftv u)
2107{
2108  res->data = (char *)(-(int)u->Data());
2109  return FALSE;
2110}
2111static BOOLEAN jjUMINUS_N(leftv res, leftv u)
2112{
2113  number n=nNeg((number)u->CopyD());
2114  res->data = (char *)n;
2115  return FALSE;
2116}
2117static BOOLEAN jjUMINUS_P(leftv res, leftv u)
2118{
2119  res->data = (char *)pNeg((poly)u->CopyD(POLY_CMD));
2120  return FALSE;
2121}
2122static BOOLEAN jjUMINUS_MA(leftv res, leftv u)
2123{
2124  poly m1=pISet(-1);
2125  res->data = (char *)mpMultP((matrix)u->CopyD(MATRIX_CMD),m1);
2126  return FALSE;
2127}
2128static BOOLEAN jjUMINUS_IV(leftv res, leftv u)
2129{
2130  intvec *iv=(intvec *)u->CopyD(INTVEC_CMD);
2131  (*iv)*=(-1);
2132  res->data = (char *)iv;
2133  return FALSE;
2134}
2135static BOOLEAN jjPROC1(leftv res, leftv u)
2136{
2137  if ((u->rtyp!=IDHDL) || (u->e!=NULL))
2138    return TRUE;
2139  leftv sl = iiMake_proc((idhdl) u->data,NULL);
2140  if (sl==NULL)
2141  {
2142    return TRUE;
2143  }
2144  else
2145  {
2146    memcpy(res,sl,sizeof(sleftv));
2147  }
2148  return FALSE;
2149}
2150static BOOLEAN jjBAREISS(leftv res, leftv v)
2151{
2152  matrix m=(matrix)v->Data();
2153  m=mpBareiss(m,FALSE);
2154  res->data = (char *)m;
2155  return FALSE;
2156}
2157static BOOLEAN jjBAREISS_IM(leftv res, leftv v)
2158{
2159  intvec *m=(intvec *)v->CopyD();
2160  ivTriangMat(m,1,1);
2161  res->data = (char *)m;
2162  return FALSE;
2163}
2164static BOOLEAN jjCALL1MANY(leftv res, leftv u)
2165{
2166  return iiExprArithM(res,u,iiOp);
2167}
2168static BOOLEAN jjCHAR(leftv res, leftv v)
2169{
2170  res->data = (char *)rChar((ring)v->Data());
2171  return FALSE;
2172}
2173static BOOLEAN jjCOLS(leftv res, leftv v)
2174{
2175  res->data = (char *)MATCOLS((matrix)(v->Data()));
2176  return FALSE;
2177}
2178static BOOLEAN jjCOLS_IV(leftv res, leftv v)
2179{
2180  res->data = (char *)((intvec*)(v->Data()))->cols();
2181  return FALSE;
2182}
2183static BOOLEAN jjCONTENT(leftv res, leftv v)
2184{
2185  poly p=(poly)v->CopyD();
2186  if (p!=NULL) pCleardenom(p);
2187  res->data = (char *)p;
2188  return FALSE;
2189}
2190static BOOLEAN jjCOUNT_N(leftv res, leftv v)
2191{
2192  res->data = (char *)nSize((number)v->Data());
2193  return FALSE;
2194}
2195static BOOLEAN jjCOUNT_L(leftv res, leftv v)
2196{
2197  lists l=(lists)v->Data();
2198  res->data = (char *)(l->nr+1);
2199  return FALSE;
2200}
2201static BOOLEAN jjCOUNT_M(leftv res, leftv v)
2202{
2203  matrix m=(matrix)v->Data();
2204  res->data = (char *)(MATROWS(m)*MATCOLS(m));
2205  return FALSE;
2206}
2207static BOOLEAN jjCOUNT_IV(leftv res, leftv v)
2208{
2209  res->data = (char *)((intvec*)(v->Data()))->length();
2210  return FALSE;
2211}
2212static BOOLEAN jjDEG(leftv res, leftv v)
2213{
2214  int dummy;
2215  poly p=(poly)v->Data();
2216  if (p!=NULL) res->data = (char *)pLDeg(p,&dummy);
2217  else res->data=(char *)-1;
2218  return FALSE;
2219}
2220static BOOLEAN jjDEGREE(leftv res, leftv v)
2221{
2222  assumeStdFlag(v);
2223  scDegree((ideal)v->Data(),currQuotient);
2224  return FALSE;
2225}
2226static BOOLEAN jjDEFINED(leftv res, leftv v)
2227{
2228  if ((v->rtyp==IDHDL)
2229  && ((myynest==IDLEV((idhdl)v->data))||(0==IDLEV((idhdl)v->data))))
2230  {
2231    res->data=(void *)(IDLEV((idhdl)v->data)+1);
2232  }
2233  else if (v->rtyp!=0) res->data=(void *)(-1);
2234  return FALSE;
2235}
2236#ifdef HAVE_FACTORY
2237static BOOLEAN jjDET(leftv res, leftv v)
2238{
2239  int i,j;
2240  matrix m=(matrix)v->Data();
2241  if (currRing->parameter==NULL)
2242  {
2243    for(i=1;i<=m->rows();i++)
2244    {
2245      for(j=1;j<=m->cols();j++)
2246      {
2247        if((MATELEM(m,i,j)!=NULL)
2248        && (!pIsConstant(MATELEM(m,i,j))))
2249        {
2250          goto nonconst;
2251        }
2252      }
2253    }
2254
2255    res->data = (char *)singclap_det(m);
2256    return FALSE;
2257  }
2258nonconst:
2259  res->data = (char *)mpDet(m);
2260  return FALSE;
2261}
2262static BOOLEAN jjDET_I(leftv res, leftv v)
2263{
2264  intvec * m=(intvec*)v->Data();
2265  int i,j;
2266  i=m->rows();j=m->cols();
2267  if(i==j)
2268    res->data = (char *)singclap_det_i(m);
2269  else
2270  {
2271    Werror("det of %d x %d intmat",i,j);
2272    return TRUE;
2273  }
2274  return FALSE;
2275}
2276#endif
2277static BOOLEAN jjDIM(leftv res, leftv v)
2278{
2279  assumeStdFlag(v);
2280  res->data = (char *)scDimInt((ideal)(v->Data()),currQuotient);
2281  return FALSE;
2282}
2283static BOOLEAN jjDUMP(leftv res, leftv v)
2284{
2285  si_link l = (si_link)v->Data();
2286  if (slDump(l))
2287  {
2288    const char *s;
2289    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
2290    else                            s=sNoName;
2291    Werror("cannot dump to `%s`",s);
2292    return TRUE;
2293  }
2294  else
2295    return FALSE;
2296}
2297static BOOLEAN jjE(leftv res, leftv v)
2298{
2299  res->data = (char *)pOne();
2300  pSetComp((poly)res->data,(int)v->Data());
2301  return FALSE;
2302}
2303static BOOLEAN jjGETDUMP(leftv res, leftv v)
2304{
2305  si_link l = (si_link)v->Data();
2306  if (slGetDump(l))
2307  {
2308    const char *s;
2309    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
2310    else                            s=sNoName;
2311    Werror("cannot get dump from `%s`",s);
2312    return TRUE;
2313  }
2314  else
2315    return FALSE;
2316}
2317#ifdef HAVE_FACTORY
2318static BOOLEAN jjFACSTD(leftv res, leftv v)
2319{
2320  res->data=(void *)stdfac((ideal)v->Data(),NULL,testHomog,NULL);
2321  setFlag(res,FLAG_STD);
2322  return FALSE;
2323}
2324#endif
2325static BOOLEAN jjHILBERT(leftv res, leftv v)
2326{
2327  assumeStdFlag(v);
2328  intvec *module_w=(intvec*)atGet(v,"isHomog");
2329  //scHilbertPoly((ideal)v->Data(),currQuotient);
2330  hLookSeries((ideal)v->Data(),module_w,currQuotient);
2331  return FALSE;
2332}
2333static BOOLEAN jjHILBERT_IV(leftv res, leftv v)
2334{
2335  res->data=(void *)hSecondSeries((intvec *)v->Data());
2336  return FALSE;
2337}
2338static BOOLEAN jjHOMOG1(leftv res, leftv v)
2339{
2340  intvec *w;
2341  res->data=(void *)idHomModule((ideal)v->Data(),currQuotient,&w);
2342  if ((v->rtyp==IDHDL)&&(w!=NULL))
2343    atSet((idhdl)v->data,mstrdup("isHomog"),w,INTVEC_CMD);
2344  return FALSE;
2345}
2346static BOOLEAN jjIDEAL_Ma(leftv res, leftv v)
2347{
2348  matrix mat=(matrix)v->CopyD();
2349  IDELEMS((ideal)mat)=MATCOLS(mat)*MATROWS(mat);
2350  MATROWS(mat)=1;
2351  mat->rank=1;
2352  res->data=(char *)mat;
2353  return FALSE;
2354}
2355static BOOLEAN jjIDEAL_R(leftv res, leftv v)
2356{
2357  if (currRing!=NULL)
2358  {
2359    ring q=(ring)v->Data();
2360    if ((q->ch==currRing->ch)
2361    && (q->N==currRing->N)) /* && varnames equ. */
2362    {
2363      if (q->qideal==NULL)
2364        res->data=(char *)idInit(1,1);
2365      else
2366        res->data=(char *)idCopy(q->qideal);
2367      return FALSE;
2368    }
2369  }
2370  return TRUE;
2371}
2372static BOOLEAN jjIm2Iv(leftv res, leftv v)
2373{
2374  intvec *iv = (intvec *)v->CopyD();
2375  iv->makeVector();
2376  res->data = iv;
2377  return FALSE;
2378}
2379static BOOLEAN jjINDEPSET(leftv res, leftv v)
2380{
2381  assumeStdFlag(v);
2382  res->data=(void *)scIndIntvec((ideal)(v->Data()),currQuotient);
2383  return FALSE;
2384}
2385static BOOLEAN jjINTERRED(leftv res, leftv v)
2386{
2387  ideal result=kInterRed((ideal)(v->Data()),currQuotient);
2388  //if (result==NULL) return TRUE;
2389  idSkipZeroes(result);
2390  res->data = result;
2391  return FALSE;
2392}
2393static BOOLEAN jjIS_RINGVAR_P(leftv res, leftv v)
2394{
2395  res->data = (char *)pVar((poly)v->Data());
2396  return FALSE;
2397}
2398static BOOLEAN jjIS_RINGVAR_S(leftv res, leftv v)
2399{
2400  res->data = (char *)(rIsRingVar((char *)v->Data())+1);
2401  return FALSE;
2402}
2403static BOOLEAN jjIS_RINGVAR0(leftv res, leftv v)
2404{
2405  res->data = (char *)0;
2406  return FALSE;
2407}
2408static BOOLEAN jjJACOB_P(leftv res, leftv v)
2409{
2410  ideal i=idInit(pVariables,1);
2411  int k;
2412  for (k=0;k<pVariables;k++)
2413  {
2414    i->m[k]=pDiff(pCopy((poly)(v->Data())),k+1);
2415  }
2416  res->data = (char *)i;
2417  return FALSE;
2418}
2419static BOOLEAN jjKBASE(leftv res, leftv v)
2420{
2421  assumeStdFlag(v);
2422  res->data = (char *)scKBase(-1,(ideal)(v->Data()),currQuotient);
2423  return FALSE;
2424}
2425static BOOLEAN jjKLAMMER_LIB(leftv res, leftv u)
2426{
2427  char * s=(char *)u->Data();
2428  return iiLibCmd(s);
2429}
2430#ifdef MDEBUG
2431static BOOLEAN jjpHead(leftv res, leftv v)
2432{
2433  res->data=(char *)pHead((poly)v->Data());
2434  return FALSE;
2435}
2436#endif
2437static BOOLEAN jjL2R(leftv res, leftv v)
2438{
2439  res->data=(char *)syConvList((lists)v->Data());
2440  return FALSE;
2441}
2442static BOOLEAN jjLEADCOEF(leftv res, leftv v)
2443{
2444  poly p=(poly)v->Data();
2445  if (p==NULL)
2446  {
2447    res->data=(char *)nInit(0);
2448  }
2449  else
2450  {
2451    res->data=(char *)nCopy(pGetCoeff(p));
2452  }
2453  return FALSE;
2454}
2455static BOOLEAN jjLEADEXP(leftv res, leftv v)
2456{
2457  poly p=(poly)v->Data();
2458  intvec *iv=new intvec(pVariables);
2459  if (p!=NULL)
2460  {
2461    for(int i=0;i<pVariables;i++)
2462    {
2463      (*iv)[i]=pGetExp(p,i+1);
2464    }
2465  }
2466  res->data=(char *)iv;
2467  return FALSE;
2468}
2469static BOOLEAN jjMEMORY(leftv res, leftv v)
2470{
2471#ifdef MM_COUNT
2472  switch(((int)v->Data()))
2473  {
2474  case 0:
2475    res->data = (char *)mmMemUsed();
2476    break;
2477  case 1:
2478    res->data = (char *)mmMemReal();
2479    break;
2480  default:
2481#ifdef MM_STAT
2482    mmStat((int)v->Data());
2483#endif
2484    res->data = (char *)0;
2485  }
2486  return FALSE;
2487#else
2488  res->data = (char *)0;
2489  return FALSE;
2490#endif
2491}
2492static BOOLEAN jjMONITOR1(leftv res, leftv v)
2493{
2494  monitor((char *)(v->Data()),PROT_I);
2495  return FALSE;
2496}
2497static BOOLEAN jjMSTD(leftv res, leftv v)
2498{
2499  res->data=(void *)min_std((ideal)v->Data(),currQuotient,testHomog,NULL);
2500  return FALSE;
2501}
2502static BOOLEAN jjMULT(leftv res, leftv v)
2503{
2504  assumeStdFlag(v);
2505  res->data = (char *)scMultInt((ideal)(v->Data()),currQuotient);
2506  return FALSE;
2507}
2508static BOOLEAN jjNAMEOF(leftv res, leftv v)
2509{
2510  res->data = (char *)v->name;
2511  if (res->data==NULL) res->data=mstrdup("");
2512  v->name=NULL;
2513  return FALSE;
2514}
2515static BOOLEAN jjNAMES(leftv res, leftv v)
2516{
2517  res->data=ipNameList(((ring)v->Data())->idroot);
2518  return FALSE;
2519}
2520static BOOLEAN jjNVARS(leftv res, leftv v)
2521{
2522  res->data = (char *)(((ring)(v->Data()))->N);
2523  return FALSE;
2524}
2525static BOOLEAN jjOpenClose(leftv res, leftv v)
2526{
2527  si_link l=(si_link)v->Data();
2528  if (iiOp==OPEN_CMD) return slOpen(l, SI_LINK_OPEN);
2529  else                return slClose(l);
2530}
2531static BOOLEAN jjORD(leftv res, leftv v)
2532{
2533  poly p=(poly)v->Data();
2534  res->data=(char *)( p==NULL ? -1 : pFDeg(p) );
2535  return FALSE;
2536}
2537static BOOLEAN jjPAR1(leftv res, leftv v)
2538{
2539  int i=(int)v->Data();
2540  int p=0;
2541  p=rPar(currRing);
2542  if ((0<i) && (i<=p))
2543  {
2544    res->data=(char *)nPar(i);
2545  }
2546  else
2547  {
2548    Werror("par number %d out of range 1..%d",i,p);
2549    return TRUE;
2550  }
2551  return FALSE;
2552}
2553static BOOLEAN jjPARDEG(leftv res, leftv v)
2554{
2555  res->data = (char *)nParDeg((number)v->Data());
2556  return FALSE;
2557}
2558static BOOLEAN jjPARSTR1(leftv res, leftv v)
2559{
2560  if (currRing==NULL)
2561  {
2562    WerrorS("no ring active");
2563    return TRUE;
2564  }
2565  int i=(int)v->Data();
2566  int p=0;
2567  if ((0<i) && (currRing->parameter!=NULL) && (i<=(p=rPar(currRing))))
2568    res->data=mstrdup(currRing->parameter[i-1]);
2569  else
2570  {
2571    Werror("par number %d out of range 1..%d",i,p);
2572    return TRUE;
2573  }
2574  return FALSE;
2575}
2576static BOOLEAN jjP2I(leftv res, leftv v)
2577{
2578  poly p=(poly)v->Data();
2579  if (p==NULL) { /*res->data=(char *)0;*/ return FALSE; }
2580  if ((pNext(p)!=NULL)|| (!pIsConstant(p)))
2581  {
2582    WerrorS("poly must be constant");
2583    return TRUE;
2584  }
2585  res->data = (char *)nInt(pGetCoeff(p));
2586  return FALSE;
2587}
2588static BOOLEAN jjPRIME(leftv res, leftv v)
2589{
2590  int i = IsPrime((int)(v->Data()));
2591  res->data = (char *)(i > 1 ? i : 2);
2592  return FALSE;
2593}
2594static BOOLEAN jjP2N(leftv res, leftv v)
2595{
2596  number n;
2597  poly p;
2598  if (((p=(poly)v->Data())!=NULL)
2599  && (pIsConstant(p)))
2600  {
2601    n=nCopy(pGetCoeff(p));
2602  }
2603  else
2604  {
2605    n=nInit(0);
2606  }
2607  res->data = (char *)n;
2608  return FALSE;
2609}
2610static BOOLEAN jjRESERVEDNAME(leftv res, leftv v)
2611{
2612  char *s= (char *)v->Data();
2613  int i = 1;
2614  int l = strlen(s);
2615  while (cmds[i].tokval!=0)
2616  {
2617    if (strcmp(s, cmds[i].name) == 0)
2618    {
2619      res->data = (char *)1;
2620      return FALSE;
2621    }
2622    i++;
2623  }
2624  //res->data = (char *)0;
2625  return FALSE;
2626}
2627static BOOLEAN jjREAD(leftv res, leftv v)
2628{
2629  return jjREAD2(res,v,NULL);
2630}
2631static BOOLEAN jjREGULARITY(leftv res, leftv v)
2632{
2633  res->data = (char *)iiRegularity((lists)v->Data());
2634  return FALSE;
2635}
2636static BOOLEAN jjROWS(leftv res, leftv v)
2637{
2638  ideal i = (ideal)v->Data();
2639  res->data = (char *)i->rank;
2640  return FALSE;
2641}
2642static BOOLEAN jjROWS_IV(leftv res, leftv v)
2643{
2644  res->data = (char *)((intvec*)(v->Data()))->rows();
2645  return FALSE;
2646}
2647static BOOLEAN jjRPAR(leftv res, leftv v)
2648{
2649  res->data = (char *)((ring)v->Data())->P;
2650  return FALSE;
2651}
2652static BOOLEAN jjSTD(leftv res, leftv v)
2653{
2654  ideal result;
2655  intvec *w=(intvec *)atGet(v,"isHomog");
2656  tHomog hom=testHomog;
2657  if (w!=NULL)
2658  {
2659    w=ivCopy(w);
2660    hom=isHomog;
2661  }
2662  //if (hasFlag(v,FLAG_STD))
2663  //  result=stdred((ideal)v->Data(),currQuotient,hom,&w);
2664  //else
2665    result=std((ideal)(v->Data()),currQuotient,hom,&w);
2666  idSkipZeroes(result);
2667  res->data = (char *)result;
2668  setFlag(res,FLAG_STD);
2669  if (w!=NULL) atSet(res,mstrdup("isHomog"),w,INTVEC_CMD);
2670  return FALSE;
2671}
2672static BOOLEAN jjSTRING(leftv res, leftv v)
2673{
2674  res->data = (char *)v->String();
2675  if (res->data==NULL)
2676  {
2677    Werror("cannot convert %s to string",Tok2Cmdname(v->Typ()));
2678    return TRUE;
2679  }
2680  return FALSE;
2681}
2682static BOOLEAN jjSort_Id(leftv res, leftv v)
2683{
2684  res->data = (char *)idSort((ideal)v->Data());
2685  return FALSE;
2686}
2687static BOOLEAN jjSTRING_PROC(leftv res, leftv v)
2688{
2689  procinfov pi = IDPROC((idhdl)v->data);
2690  if(pi->language == LANG_SINGULAR)
2691    res->data=mstrdup(pi->data.s.body);
2692  else res->data=mstrdup("");
2693  return FALSE;
2694}
2695static BOOLEAN jjSYZYGY(leftv res, leftv v)
2696{
2697  intvec *w=NULL;
2698  res->data = (char *)idSyzygies((ideal)v->Data(),currQuotient,testHomog,&w);
2699  if (w!=NULL) delete w;
2700  return FALSE;
2701}
2702static BOOLEAN jjTRACE_IV(leftv res, leftv v)
2703{
2704  res->data = (char *)ivTrace((intvec*)(v->Data()));
2705  return FALSE;
2706}
2707static BOOLEAN jjTRANSP_IV(leftv res, leftv v)
2708{
2709  res->data = (char *)ivTranp((intvec*)(v->Data()));
2710  return FALSE;
2711}
2712static BOOLEAN jjTYPEOF(leftv res, leftv v)
2713{
2714  switch ((int)v->data)
2715  {
2716    case INT_CMD:     res->data=mstrdup("int"); break;
2717    case POLY_CMD:   res->data=mstrdup("poly"); break;
2718    case VECTOR_CMD:  res->data=mstrdup("vector"); break;
2719    case STRING_CMD:  res->data=mstrdup("string"); break;
2720    case INTVEC_CMD:  res->data=mstrdup("intvec"); break;
2721    case IDEAL_CMD:   res->data=mstrdup("ideal"); break;
2722    case MATRIX_CMD: res->data=mstrdup("matrix"); break;
2723    case MODUL_CMD:   res->data=mstrdup("module"); break;
2724    case MAP_CMD:     res->data=mstrdup("map"); break;
2725    case PROC_CMD:    res->data=mstrdup("proc"); break;
2726    case RING_CMD:    res->data=mstrdup("ring"); break;
2727    case QRING_CMD:   res->data=mstrdup("qring"); break;
2728    case INTMAT_CMD:  res->data=mstrdup("intmat"); break;
2729    case NUMBER_CMD:  res->data=mstrdup("number"); break;
2730    case LIST_CMD:   res->data=mstrdup("list"); break;
2731    case PACKAGE_CMD: res->data=mstrdup("package"); break;
2732    case LINK_CMD:   res->data=mstrdup("link"); break;
2733    case RESOLUTION_CMD:res->data=mstrdup("resolution");break;
2734    case DEF_CMD:
2735    case NONE:    res->data=mstrdup("none"); break;
2736    default:       res->data=mstrdup("?unknown type?");
2737  }
2738  return FALSE;
2739}
2740static BOOLEAN jjVAR1(leftv res, leftv v)
2741{
2742  int i=(int)v->Data();
2743  if ((0<i) && (i<=currRing->N))
2744  {
2745    poly p=pOne();
2746    pSetExp(p,i,1);
2747    pSetm(p);
2748    res->data=(char *)p;
2749  }
2750  else
2751  {
2752    Werror("var number %d out of range 1..%d",i,currRing->N);
2753    return TRUE;
2754  }
2755  return FALSE;
2756}
2757static BOOLEAN jjVARSTR1(leftv res, leftv v)
2758{
2759  if (currRing==NULL)
2760  {
2761    WerrorS("no ring active");
2762    return TRUE;
2763  }
2764  int i=(int)v->Data();
2765  if ((0<i) && (i<=currRing->N))
2766    res->data=mstrdup(currRing->names[i-1]);
2767  else
2768  {
2769    Werror("var number %d out of range 1..%d",i,currRing->N);
2770    return TRUE;
2771  }
2772  return FALSE;
2773}
2774static BOOLEAN jjVDIM(leftv res, leftv v)
2775{
2776  assumeStdFlag(v);
2777  res->data = (char *)scMult0Int((ideal)v->Data(),currQuotient);
2778  return FALSE;
2779}
2780/*=================== operations with 1 arg.: table =================*/
2781
2782#ifdef INIT_BUG
2783#define XS(A) -((short)A)
2784#define jjstrlen       (proc1)1
2785#define jjpLength      (proc1)2
2786#define jjidElem       (proc1)3
2787#define jjmpDet        (proc1)4
2788#define jjidFreeModule (proc1)5
2789#define jjidVec2Ideal  (proc1)6
2790#define jjrCharStr     (proc1)7
2791#ifndef MDEBUG
2792#define jjpHead        (proc1)8
2793#endif
2794#define jjidHead       (proc1)9
2795#define jjidMaxIdeal   (proc1)10
2796#define jjidMinBase    (proc1)11
2797#define jjsyMinBase    (proc1)12
2798#define jjpMaxComp     (proc1)13
2799#define jjmpTrace      (proc1)14
2800#define jjmpTransp     (proc1)15
2801#define jjrOrdStr      (proc1)16
2802#define jjrVarStr      (proc1)18
2803#define jjrParStr      (proc1)19
2804#define jjidMinEmbedding (proc1)20
2805#define jjBETTI_R        (proc1)21
2806#define jjCOUNT_R        (proc1)22
2807#define jjDIM_R          (proc1)23
2808#define jjMINRES_R       (proc1)24
2809
2810extern struct sValCmd1 dArith1[];
2811void jjInitTab1()
2812{
2813  int i=0;
2814  for (;dArith1[i].cmd!=0;i++)
2815  {
2816    if (dArith1[i].res<0)
2817    {
2818      switch ((int)dArith1[i].p)
2819      {
2820        case (int)jjstrlen:       dArith1[i].p=(proc1)strlen; break;
2821        case (int)jjpLength:      dArith1[i].p=(proc1)pLength; break;
2822        case (int)jjidElem:       dArith1[i].p=(proc1)idElem; break;
2823        case (int)jjidVec2Ideal:  dArith1[i].p=(proc1)idVec2Ideal; break;
2824#ifndef HAVE_FACTORY
2825        case (int)jjmpDet:        dArith1[i].p=(proc1)mpDet; break;
2826#endif
2827        case (int)jjidFreeModule: dArith1[i].p=(proc1)idFreeModule; break;
2828        case (int)jjrCharStr:     dArith1[i].p=(proc1)rCharStr; break;
2829#ifndef MDEBUG
2830        case (int)jjpHead:        dArith1[i].p=(proc1)pHeadProc; break;
2831#endif
2832        case (int)jjidHead:       dArith1[i].p=(proc1)idHead; break;
2833        case (int)jjidMaxIdeal:   dArith1[i].p=(proc1)idMaxIdeal; break;
2834        case (int)jjidMinBase:    dArith1[i].p=(proc1)idMinBase; break;
2835        case (int)jjsyMinBase:    dArith1[i].p=(proc1)syMinBase; break;
2836        case (int)jjpMaxComp:     dArith1[i].p=(proc1)pMaxComp; break;
2837        case (int)jjmpTrace:      dArith1[i].p=(proc1)mpTrace; break;
2838        case (int)jjmpTransp:     dArith1[i].p=(proc1)mpTransp; break;
2839        case (int)jjrOrdStr:      dArith1[i].p=(proc1)rOrdStr; break;
2840        case (int)jjrVarStr:      dArith1[i].p=(proc1)rVarStr; break;
2841        case (int)jjrParStr:      dArith1[i].p=(proc1)rParStr; break;
2842        case (int)jjidMinEmbedding: dArith1[i].p=(proc1)idMinEmbedding; break;
2843        case (int)jjBETTI_R:      dArith1[i].p=(proc1)syBettiOfComputation; break;
2844        case (int)jjCOUNT_R:      dArith1[i].p=(proc1)syLength; break;
2845        case (int)jjDIM_R:        dArith1[i].p=(proc1)syDim; break;
2846        case (int)jjMINRES_R:     dArith1[i].p=(proc1)syMinimize; break;
2847#ifdef GENTABLE
2848        default: Werror("missing proc1-definition for %d",(int)dArith1[i].p);
2849#endif
2850      }
2851    }
2852  }
2853}
2854#else
2855#if defined(PROC_BUG)
2856#define XS(A) A
2857static BOOLEAN jjstrlen(leftv res, leftv v)
2858{
2859  res->data = (char *)strlen((char *)v->Data());
2860  return FALSE;
2861}
2862static BOOLEAN jjpLength(leftv res, leftv v)
2863{
2864  res->data = (char *)pLength((poly)v->Data());
2865  return FALSE;
2866}
2867static BOOLEAN jjidElem(leftv res, leftv v)
2868{
2869  res->data = (char *)idElem((ideal)v->Data());
2870  return FALSE;
2871}
2872static BOOLEAN jjmpDet(leftv res, leftv v)
2873{
2874  res->data = (char *)mpDet((matrix)v->Data());
2875  return FALSE;
2876}
2877static BOOLEAN jjidFreeModule(leftv res, leftv v)
2878{
2879  res->data = (char *)idFreeModule((int)v->Data());
2880  return FALSE;
2881}
2882static BOOLEAN jjidVec2Ideal(leftv res, leftv v)
2883{
2884  res->data = (char *)idVec2Ideal((poly)v->Data());
2885  return FALSE;
2886}
2887static BOOLEAN jjrCharStr(leftv res, leftv v)
2888{
2889  res->data = rCharStr((ring)v->Data());
2890  return FALSE;
2891}
2892#ifndef MDEBUG
2893static BOOLEAN jjpHead(leftv res, leftv v)
2894{
2895  res->data = (char *)pHead((poly)v->Data());
2896  return FALSE;
2897}
2898#endif
2899static BOOLEAN jjidHead(leftv res, leftv v)
2900{
2901  res->data = (char *)idHead((ideal)v->Data());
2902  return FALSE;
2903}
2904static BOOLEAN jjidMaxIdeal(leftv res, leftv v)
2905{
2906  res->data = (char *)idMaxIdeal((int)v->Data());
2907  return FALSE;
2908}
2909static BOOLEAN jjidMinBase(leftv res, leftv v)
2910{
2911  res->data = (char *)idMinBase((ideal)v->Data());
2912  return FALSE;
2913}
2914static BOOLEAN jjsyMinBase(leftv res, leftv v)
2915{
2916  res->data = (char *)syMinBase((ideal)v->Data());
2917  return FALSE;
2918}
2919static BOOLEAN jjpMaxComp(leftv res, leftv v)
2920{
2921  res->data = (char *)pMaxComp((poly)v->Data());
2922  return FALSE;
2923}
2924static BOOLEAN jjmpTrace(leftv res, leftv v)
2925{
2926  res->data = (char *)mpTrace((matrix)v->Data());
2927  return FALSE;
2928}
2929static BOOLEAN jjmpTransp(leftv res, leftv v)
2930{
2931  res->data = (char *)mpTransp((matrix)v->Data());
2932  return FALSE;
2933}
2934static BOOLEAN jjrOrdStr(leftv res, leftv v)
2935{
2936  res->data = rOrdStr((ring)v->Data());
2937  return FALSE;
2938}
2939static BOOLEAN jjrVarStr(leftv res, leftv v)
2940{
2941  res->data = rVarStr((ring)v->Data());
2942  return FALSE;
2943}
2944static BOOLEAN jjrParStr(leftv res, leftv v)
2945{
2946  res->data = rParStr((ring)v->Data());
2947  return FALSE;
2948}
2949static BOOLEAN jjidMinEmbedding(leftv res, leftv v)
2950{
2951  res->data = (char *)idMinEmbedding((ideal)v->Data());
2952  return FALSE;
2953}
2954static BOOLEAN jjBETTI_R(leftv res, leftv v)
2955{
2956  res->data=(char *)syBettiOfComputation((syStrategy)v->Data());
2957  return FALSE;
2958}
2959static BOOLEAN jjCOUNT_R(leftv res, leftv v)
2960{
2961  res->data=(char *)syLength((syStrategy)v->Data());
2962  return FALSE;
2963}
2964static BOOLEAN jjDIM_R(leftv res, leftv v)
2965{
2966  res->data = (char *)syDim((syStrategy)v->Data());
2967  return FALSE;
2968}
2969static BOOLEAN jjMINRES_R(leftv res, leftv v)
2970{
2971  res->data=(char *)syMinimize((syStrategy)v->Data());
2972  return FALSE;
2973}
2974#else
2975#define XS(A)          -((short)A)
2976#define jjstrlen       (proc1)strlen
2977#define jjpLength      (proc1)pLength
2978#define jjidElem       (proc1)idElem
2979#define jjmpDet        (proc1)mpDet
2980#define jjidFreeModule (proc1)idFreeModule
2981#define jjidVec2Ideal  (proc1)idVec2Ideal
2982#define jjrCharStr     (proc1)rCharStr
2983#ifndef MDEBUG
2984#define jjpHead        (proc1)pHead
2985#endif
2986#define jjidHead       (proc1)idHead
2987#define jjidMaxIdeal   (proc1)idMaxIdeal
2988#define jjidMinBase    (proc1)idMinBase
2989#define jjsyMinBase    (proc1)syMinBase
2990#define jjpMaxComp     (proc1)pMaxComp
2991#define jjmpTrace      (proc1)mpTrace
2992#define jjmpTransp     (proc1)mpTransp
2993#define jjrOrdStr      (proc1)rOrdStr
2994#define jjrVarStr      (proc1)rVarStr
2995#define jjrParStr      (proc1)rParStr
2996#define jjidMinEmbedding (proc1)idMinEmbedding
2997#define jjBETTI_R        (proc1)syBettiOfComputation
2998#define jjCOUNT_R        (proc1)syLength
2999#define jjDIM_R        (proc1)syDim
3000#define jjMINRES_R     (proc1)syMinimize
3001#endif
3002#endif
3003BOOLEAN jjnInt(leftv res, leftv u)
3004{
3005  number n=(number)u->CopyD();
3006  res->data=(char *)nInt(n);
3007  nDelete(&n);
3008  return FALSE;
3009}
3010#define s short
3011struct sValCmd1 dArith1[]=
3012{
3013// operations:
3014// proc         cmd               res             arg
3015// {jjPLUSPLUS,   PLUSPLUS,        INT_CMD,        INT_CMD }
3016//,{jjMINUSMINUS, MINUSMINUS,      INT_CMD,        INT_CMD }
3017 {jjPLUSPLUS,   PLUSPLUS,        NONE,           IDHDL }
3018,{jjPLUSPLUS,   MINUSMINUS,      NONE,           IDHDL }
3019,{jjUMINUS_I,   '-',             INT_CMD,        INT_CMD }
3020,{jjUMINUS_N,   '-',             NUMBER_CMD,     NUMBER_CMD }
3021,{jjUMINUS_P,   '-',             POLY_CMD,       POLY_CMD }
3022,{jjUMINUS_P,   '-',             VECTOR_CMD,     VECTOR_CMD }
3023,{jjUMINUS_MA,  '-',             MATRIX_CMD,     MATRIX_CMD }
3024,{jjUMINUS_IV,  '-',             INTVEC_CMD,     INTVEC_CMD }
3025,{jjUMINUS_IV,  '-',             INTMAT_CMD,     INTMAT_CMD }
3026,{jjPROC1,      '(',             ANY_TYPE/*set by p*/,PROC_CMD }
3027,{jjKLAMMER_LIB,'(',             NONE,           STRING_CMD }
3028// and the procedures with 1 argument:
3029,{atATTRIB1,    ATTRIB_CMD,      NONE,           DEF_CMD }
3030,{jjBAREISS_IM, BAREISS_CMD,     INTMAT_CMD,     INTMAT_CMD }
3031,{jjBAREISS,    BAREISS_CMD,     MATRIX_CMD,     MATRIX_CMD }
3032,{jjBETTI,      BETTI_CMD,       INTMAT_CMD,     LIST_CMD }
3033,{jjBETTI_R,    BETTI_CMD,       XS(INTMAT_CMD), RESOLUTION_CMD }
3034,{jjCHAR,       CHARACTERISTIC_CMD, INT_CMD,     RING_CMD }
3035,{jjCHAR,       CHARACTERISTIC_CMD, INT_CMD,     QRING_CMD }
3036#ifdef HAVE_FACTORY
3037,{jjCHARSERIES, CHAR_SERIES_CMD, MATRIX_CMD,     IDEAL_CMD }
3038#else
3039,{jjWRONG,      CHAR_SERIES_CMD, MATRIX_CMD,     IDEAL_CMD }
3040#endif
3041,{jjrCharStr,   CHARSTR_CMD,     XS(STRING_CMD), RING_CMD }
3042,{jjrCharStr,   CHARSTR_CMD,     XS(STRING_CMD), QRING_CMD }
3043,{jjOpenClose,  CLOSE_CMD,       NONE,           LINK_CMD }
3044,{jjWRONG,      COLS_CMD,        0,              VECTOR_CMD }
3045,{jjCOLS,       COLS_CMD,        INT_CMD,        MATRIX_CMD }
3046,{jjCOLS,       COLS_CMD,        INT_CMD,        IDEAL_CMD }
3047,{jjCOLS,       COLS_CMD,        INT_CMD,        MODUL_CMD }
3048,{jjCOLS_IV,    COLS_CMD,        INT_CMD,        INTMAT_CMD }
3049,{jjWRONG,      COLS_CMD,        0,              INTVEC_CMD }
3050,{jjCONTENT,    CONTENT_CMD,     POLY_CMD,       POLY_CMD }
3051,{jjCONTENT,    CONTENT_CMD,     VECTOR_CMD,     VECTOR_CMD }
3052,{jjCOUNT_N,    COUNT_CMD,       INT_CMD,        NUMBER_CMD }
3053,{jjCOUNT_R,    COUNT_CMD,       XS(INT_CMD),    RESOLUTION_CMD }
3054,{jjstrlen,     COUNT_CMD,       XS(INT_CMD),    STRING_CMD }
3055,{jjpLength,    COUNT_CMD,       XS(INT_CMD),    POLY_CMD }
3056,{jjpLength,    COUNT_CMD,       XS(INT_CMD),    VECTOR_CMD }
3057,{jjidElem,     COUNT_CMD,       XS(INT_CMD),    IDEAL_CMD }
3058,{jjidElem,     COUNT_CMD,       XS(INT_CMD),    MODUL_CMD }
3059,{jjCOUNT_M,    COUNT_CMD,       INT_CMD,        MATRIX_CMD }
3060,{jjCOUNT_IV,   COUNT_CMD,       INT_CMD,        INTVEC_CMD }
3061,{jjCOUNT_IV,   COUNT_CMD,       INT_CMD,        INTMAT_CMD }
3062,{jjCOUNT_L,    COUNT_CMD,       INT_CMD,        LIST_CMD }
3063,{jjNULL,       DEF_CMD,         DEF_CMD,        INT_CMD }
3064,{jjWRONG,      DEF_CMD,         0,              ANY_TYPE }
3065,{jjDEG,        DEG_CMD,         INT_CMD,        POLY_CMD }
3066,{jjDEG,        DEG_CMD,         INT_CMD,        VECTOR_CMD }
3067,{jjDEGREE,     DEGREE_CMD,      NONE,           IDEAL_CMD }
3068,{jjDEGREE,     DEGREE_CMD,      NONE,           MODUL_CMD }
3069,{jjDEFINED,    DEFINED_CMD,     INT_CMD,        DEF_CMD }
3070#ifdef HAVE_FACTORY
3071,{jjDET_I,      DET_CMD,         INT_CMD,        INTMAT_CMD }
3072,{jjDET,        DET_CMD,         POLY_CMD,       MATRIX_CMD }
3073#else
3074,{jjWRONG,      DET_CMD,         INT_CMD,        INTMAT_CMD }
3075,{jjmpDet,      DET_CMD,         XS(POLY_CMD),   MATRIX_CMD }
3076#endif
3077,{jjDIM,        DIM_CMD,         INT_CMD,        IDEAL_CMD }
3078,{jjDIM,        DIM_CMD,         INT_CMD,        MODUL_CMD }
3079,{jjDIM_R,      DIM_CMD,         XS(INT_CMD),    RESOLUTION_CMD }
3080,{jjDUMP,       DUMP_CMD,        NONE,           LINK_CMD }
3081,{jjE,          E_CMD,           VECTOR_CMD,     INT_CMD }
3082#ifdef HAVE_FACTORY
3083,{jjFAC_P,      FAC_CMD,         LIST_CMD,       POLY_CMD }
3084#else
3085,{jjWRONG,      FAC_CMD,         LIST_CMD,       POLY_CMD }
3086#endif
3087#ifdef HAVE_FGLM
3088,{findUniProc,  FINDUNI_CMD,     IDEAL_CMD,      IDEAL_CMD}
3089#else
3090,{jjWRONG,      FINDUNI_CMD,     IDEAL_CMD,      IDEAL_CMD}
3091#endif
3092,{jjidFreeModule,FREEMODULE_CMD, XS(MODUL_CMD),  INT_CMD }
3093#ifdef HAVE_FACTORY
3094,{jjFACSTD,     FACSTD_CMD,      LIST_CMD,       IDEAL_CMD }
3095#else
3096,{jjWRONG,      FACSTD_CMD,      LIST_CMD,       IDEAL_CMD }
3097#endif
3098,{jjGETDUMP,    GETDUMP_CMD,     NONE,           LINK_CMD }
3099,{jjHILBERT,    HILBERT_CMD,     NONE,           IDEAL_CMD }
3100,{jjHILBERT,    HILBERT_CMD,     NONE,           MODUL_CMD }
3101,{jjHILBERT_IV, HILBERT_CMD,     INTVEC_CMD,     INTVEC_CMD }
3102,{jjHOMOG1,     HOMOG_CMD,       INT_CMD,        IDEAL_CMD }
3103,{jjHOMOG1,     HOMOG_CMD,       INT_CMD,        MODUL_CMD }
3104,{jjidVec2Ideal,IDEAL_CMD,       XS(IDEAL_CMD),  VECTOR_CMD }
3105,{jjIDEAL_Ma,   IDEAL_CMD,       IDEAL_CMD,      MATRIX_CMD }
3106,{jjIDEAL_R,    IDEAL_CMD,       IDEAL_CMD,      QRING_CMD }
3107,{jjIDEAL_R,    IDEAL_CMD,       IDEAL_CMD,      RING_CMD }
3108,{jjDUMMY,      IDEAL_CMD,       IDEAL_CMD,      IDEAL_CMD }
3109,{jjINDEPSET,   INDEPSET_CMD,    INTVEC_CMD,     IDEAL_CMD }
3110,{jjDUMMY,      INT_CMD,         INT_CMD,        INT_CMD }
3111,{jjnInt,       INT_CMD,         INT_CMD,        NUMBER_CMD }
3112,{jjP2I,        INT_CMD,         INT_CMD,        POLY_CMD }
3113,{jjINTERRED,   INTERRED_CMD,    IDEAL_CMD,      IDEAL_CMD }
3114,{jjINTERRED,   INTERRED_CMD,    MODUL_CMD,      MODUL_CMD }
3115,{jjDUMMY,      INTMAT_CMD,      INTMAT_CMD,     INTMAT_CMD }
3116,{jjIm2Iv,      INTVEC_CMD,      INTVEC_CMD,     INTMAT_CMD }
3117,{jjDUMMY,      INTVEC_CMD,      INTVEC_CMD,     INTVEC_CMD }
3118,{jjIS_RINGVAR_P, IS_RINGVAR,    INT_CMD,        POLY_CMD }
3119,{jjIS_RINGVAR_S, IS_RINGVAR,    INT_CMD,        STRING_CMD }
3120,{jjIS_RINGVAR0,IS_RINGVAR,      INT_CMD,        ANY_TYPE }
3121,{jjJACOB_P,    JACOB_CMD,       IDEAL_CMD,      POLY_CMD }
3122,{mpJacobi,     JACOB_CMD,       MATRIX_CMD,     IDEAL_CMD }
3123,{jjKBASE,      KBASE_CMD,       IDEAL_CMD,      IDEAL_CMD }
3124,{jjKBASE,      KBASE_CMD,       MODUL_CMD,      MODUL_CMD }
3125,{atKILLATTR1,  KILLATTR_CMD,    NONE,           IDHDL }
3126,{jjCALL1MANY,  LIST_CMD,        LIST_CMD,       DEF_CMD }
3127#ifdef MDEBUG
3128,{jjpHead,      LEAD_CMD,        POLY_CMD,       POLY_CMD }
3129#else
3130,{jjpHead,      LEAD_CMD,        XS(POLY_CMD),   POLY_CMD }
3131#endif
3132,{jjidHead,     LEAD_CMD,        XS(IDEAL_CMD),  IDEAL_CMD }
3133#ifdef MDEBUG
3134,{jjpHead,      LEAD_CMD,        VECTOR_CMD,     VECTOR_CMD }
3135#else
3136,{jjpHead,      LEAD_CMD,        XS(VECTOR_CMD), VECTOR_CMD }
3137#endif
3138,{jjidHead,     LEAD_CMD,        XS(MODUL_CMD),  MODUL_CMD }
3139,{jjLEADCOEF,   LEADCOEF_CMD,    NUMBER_CMD,     POLY_CMD }
3140,{jjLEADCOEF,   LEADCOEF_CMD,    NUMBER_CMD,     VECTOR_CMD }
3141,{jjLEADEXP,    LEADEXP_CMD,     INTVEC_CMD,     POLY_CMD }
3142,{jjLEADEXP,    LEADEXP_CMD,     INTVEC_CMD,     VECTOR_CMD }
3143,{jjWRONG,      MAP_CMD,         0,              ANY_TYPE}
3144,{jjDUMMY,      MATRIX_CMD,      MATRIX_CMD,     MATRIX_CMD }
3145,{jjidMaxIdeal, MAXID_CMD,       XS(IDEAL_CMD),  INT_CMD }
3146,{jjMEMORY,     MEMORY_CMD,      INT_CMD,        INT_CMD }
3147,{jjidMinBase,  MINBASE_CMD,     XS(IDEAL_CMD),  IDEAL_CMD }
3148,{jjidMinBase,  MINBASE_CMD,     XS(MODUL_CMD),  MODUL_CMD }
3149,{jjMINRES,     MINRES_CMD,      LIST_CMD,       LIST_CMD }
3150,{jjMINRES_R,   MINRES_CMD,      XS(RESOLUTION_CMD), RESOLUTION_CMD }
3151,{jjDUMMY,      MODUL_CMD,       MODUL_CMD,      MODUL_CMD }
3152,{jjMONITOR1,   MONITOR_CMD,     NONE,           STRING_CMD }
3153,{jjMULT,       MULTIPLICITY_CMD,  INT_CMD,      IDEAL_CMD }
3154,{jjMULT,       MULTIPLICITY_CMD,  INT_CMD,      MODUL_CMD }
3155,{jjMSTD,       MSTD_CMD,        LIST_CMD,       IDEAL_CMD }
3156,{jjNAMEOF,     NAMEOF_CMD,      STRING_CMD,     ANY_TYPE }
3157,{jjNAMES,      NAMES_CMD,       LIST_CMD,       RING_CMD }
3158,{jjNAMES,      NAMES_CMD,       LIST_CMD,       QRING_CMD }
3159,{jjDUMMY,      NUMBER_CMD,      NUMBER_CMD,     NUMBER_CMD }
3160,{jjP2N,        NUMBER_CMD,      NUMBER_CMD,     POLY_CMD }
3161,{jjRPAR,       NPARS_CMD,       INT_CMD,        RING_CMD }
3162,{jjRPAR,       NPARS_CMD,       INT_CMD,        QRING_CMD }
3163,{jjNVARS,      NVARS_CMD,       INT_CMD,        RING_CMD }
3164,{jjNVARS,      NVARS_CMD,       INT_CMD,        QRING_CMD }
3165,{jjOpenClose,  OPEN_CMD,        NONE,           LINK_CMD }
3166,{jjORD,        ORD_CMD,         INT_CMD,        POLY_CMD }
3167,{jjORD,        ORD_CMD,         INT_CMD,        VECTOR_CMD }
3168,{jjrOrdStr,    ORDSTR_CMD,      XS(STRING_CMD), RING_CMD }
3169,{jjrOrdStr,    ORDSTR_CMD,      XS(STRING_CMD), QRING_CMD }
3170,{jjPAR1,       PAR_CMD,         NUMBER_CMD,     INT_CMD }
3171,{jjPARDEG,     PARDEG_CMD,      INT_CMD,        NUMBER_CMD }
3172,{jjPARSTR1,    PARSTR_CMD,      STRING_CMD,     INT_CMD }
3173,{jjrParStr,    PARSTR_CMD,      XS(STRING_CMD), RING_CMD }
3174,{jjrParStr,    PARSTR_CMD,      XS(STRING_CMD), QRING_CMD }
3175,{jjDUMMY,      POLY_CMD,        POLY_CMD,       POLY_CMD }
3176,{jjPRIME,      PRIME_CMD,       INT_CMD,        INT_CMD }
3177,{jjPRINT_GEN,  PRINT_CMD,       NONE,           INT_CMD }
3178,{jjPRINT_INTVEC,PRINT_CMD,      NONE,           INTVEC_CMD }
3179,{jjPRINT_INTMAT,PRINT_CMD,      NONE,           INTMAT_CMD }
3180,{jjPRINT_GEN,  PRINT_CMD,       NONE,           STRING_CMD }
3181,{jjPRINT_GEN,  PRINT_CMD,       NONE,           POLY_CMD }
3182,{jjPRINT_V,    PRINT_CMD,       NONE,           VECTOR_CMD }
3183,{jjPRINT_GEN,  PRINT_CMD,       NONE,           IDEAL_CMD }
3184,{jjPRINT_MA,   PRINT_CMD,       NONE,           MATRIX_CMD }
3185,{jjPRINT_LIST, PRINT_CMD,       NONE,           LIST_CMD }
3186,{jjidMinEmbedding, PRUNE_CMD,   XS(MODUL_CMD),  MODUL_CMD }
3187,{kQHWeight,    QHWEIGHT_CMD,    INTVEC_CMD,     IDEAL_CMD }
3188,{kQHWeight,    QHWEIGHT_CMD,    INTVEC_CMD,     MODUL_CMD }
3189,{jjWRONG,      QRING_CMD,       0,              ANY_TYPE}
3190,{jjREAD,       READ_CMD,        STRING_CMD,     LINK_CMD }
3191,{jjREGULARITY, REGULARITY_CMD,  INT_CMD,        LIST_CMD }
3192,{jjRESERVEDNAME,RESERVEDNAME_CMD, INT_CMD,      STRING_CMD }
3193//,{jjL2R,        RESOLUTION_CMD,  RESOLUTION_CMD, LIST_CMD }
3194,{jjDUMMY,      RESOLUTION_CMD,  RESOLUTION_CMD, RESOLUTION_CMD }
3195,{jjWRONG,      ROWS_CMD,        0,              POLY_CMD }
3196,{jjpMaxComp,   ROWS_CMD,        XS(INT_CMD),    VECTOR_CMD }
3197,{jjROWS,       ROWS_CMD,        INT_CMD,        MODUL_CMD }
3198,{jjROWS,       ROWS_CMD,        INT_CMD,        MATRIX_CMD }
3199,{jjROWS_IV,    ROWS_CMD,        INT_CMD,        INTMAT_CMD }
3200,{jjCOUNT_IV,   ROWS_CMD,        INT_CMD,        INTVEC_CMD }
3201,{jjSort_Id,    SORTVEC_CMD,     INTVEC_CMD,     IDEAL_CMD }
3202,{jjSort_Id,    SORTVEC_CMD,     INTVEC_CMD,     MODUL_CMD }
3203,{jjSTD,        STD_CMD,         IDEAL_CMD,      IDEAL_CMD }
3204,{jjSTD,        STD_CMD,         MODUL_CMD,      MODUL_CMD }
3205,{jjDUMMY,      STRING_CMD,      STRING_CMD,     STRING_CMD }
3206,{jjSTRING,     STRING_CMD,      STRING_CMD,     INT_CMD }
3207,{jjSTRING,     STRING_CMD,      STRING_CMD,     POLY_CMD }
3208,{jjSTRING,     STRING_CMD,      STRING_CMD,     VECTOR_CMD }
3209,{jjSTRING,     STRING_CMD,      STRING_CMD,     NUMBER_CMD }
3210,{jjSTRING,     STRING_CMD,      STRING_CMD,     MATRIX_CMD }
3211,{jjSTRING,     STRING_CMD,      STRING_CMD,     MODUL_CMD }
3212,{jjSTRING,     STRING_CMD,      STRING_CMD,     IDEAL_CMD }
3213,{jjSTRING,     STRING_CMD,      STRING_CMD,     MAP_CMD }
3214,{jjSTRING,     STRING_CMD,      STRING_CMD,     INTVEC_CMD }
3215,{jjSTRING,     STRING_CMD,      STRING_CMD,     INTMAT_CMD }
3216,{jjSTRING_PROC,STRING_CMD,      STRING_CMD,     PROC_CMD }
3217,{jjSTRING,     STRING_CMD,      STRING_CMD,     RING_CMD }
3218,{jjSTRING,     STRING_CMD,      STRING_CMD,     QRING_CMD }
3219,{jjSYSTEM,     SYSTEM_CMD,      NONE,           STRING_CMD }
3220,{jjSYZYGY,     SYZYGY_CMD,      MODUL_CMD,      IDEAL_CMD }
3221,{jjSYZYGY,     SYZYGY_CMD,      MODUL_CMD,      MODUL_CMD }
3222,{jjWRONG,      TRACE_CMD,       0,              INTVEC_CMD }
3223,{jjWRONG,      TRACE_CMD,       0,              IDEAL_CMD }
3224,{jjTRACE_IV,   TRACE_CMD,       INT_CMD,        INTMAT_CMD }
3225,{jjmpTrace,    TRACE_CMD,       XS(POLY_CMD),   MATRIX_CMD }
3226,{jjTRANSP_IV,  TRANSPOSE_CMD,   INTMAT_CMD,     INTVEC_CMD }
3227,{jjTRANSP_IV,  TRANSPOSE_CMD,   INTMAT_CMD,     INTMAT_CMD }
3228,{jjmpTransp,   TRANSPOSE_CMD,   XS(MATRIX_CMD), MATRIX_CMD }
3229,{jjTYPEOF,     TYPEOF_CMD,      STRING_CMD,     ANY_TYPE }
3230,{jjDUMMY,      VECTOR_CMD,      VECTOR_CMD,     VECTOR_CMD }
3231,{jjVDIM,       VDIM_CMD,        INT_CMD,        IDEAL_CMD }
3232,{jjVDIM,       VDIM_CMD,        INT_CMD,        MODUL_CMD }
3233,{jjVAR1,       VAR_CMD,         POLY_CMD,       INT_CMD }
3234,{jjVARSTR1,    VARSTR_CMD,      STRING_CMD,     INT_CMD }
3235,{jjrVarStr,    VARSTR_CMD,      XS(STRING_CMD), RING_CMD }
3236,{jjrVarStr,    VARSTR_CMD,      XS(STRING_CMD), QRING_CMD }
3237,{kWeight,      WEIGHT_CMD,      INTVEC_CMD,     IDEAL_CMD }
3238,{kWeight,      WEIGHT_CMD,      INTVEC_CMD,     MODUL_CMD }
3239,{NULL,         0,               0,              0}
3240};
3241#undef s
3242/*=================== operations with 3 args.: static proc =================*/
3243static BOOLEAN jjBRACK_S(leftv res, leftv u, leftv v,leftv w)
3244{
3245  char *s= (char *)u->Data();
3246  int   r = (int)v->Data();
3247  int   c = (int)w->Data();
3248  int l = strlen(s);
3249
3250  if ( (r<1) || (r>l) || (c<0) )
3251  {
3252    Werror("wrong range[%d,%d] in string %s",r,c,u->Name());
3253    return TRUE;
3254  }
3255  res->data = (char *)AllocL(c+1);
3256  sprintf((char *)res->data,"%-*.*s",c,c,s+r-1);
3257  return FALSE;
3258}
3259static BOOLEAN jjBRACK_Im(leftv res, leftv u, leftv v,leftv w)
3260{
3261  intvec *iv = (intvec *)u->Data();
3262  int   r = (int)v->Data();
3263  int   c = (int)w->Data();
3264  if ((r<1)||(r>iv->rows())||(c<1)||(c>iv->cols()))
3265  {
3266    Werror("wrong range[%d,%d] in intmat %s(%d x %d)",
3267           r,c,u->Name(),iv->rows(),iv->cols());
3268    return TRUE;
3269  }
3270  res->data=u->data;
3271  u->data=NULL;
3272  res->rtyp=u->rtyp;
3273  u->rtyp=0;
3274  res->name=u->name;
3275  u->name=NULL;
3276  Subexpr e=jjMakeSub(v);
3277          e->next=jjMakeSub(w);
3278  if (u->e==NULL) res->e=e;
3279  else
3280  {
3281    Subexpr h=u->e;
3282    while (h->next!=NULL) h=h->next;
3283    h->next=e;
3284    res->e=u->e;
3285    u->e=NULL;
3286  }
3287  return FALSE;
3288}
3289static BOOLEAN jjBRACK_Ma(leftv res, leftv u, leftv v,leftv w)
3290{
3291  matrix m= (matrix)u->Data();
3292  int   r = (int)v->Data();
3293  int   c = (int)w->Data();
3294  //Print("gen. elem %d, %d\n",r,c);
3295  if ((r<1)||(r>MATROWS(m))||(c<1)||(c>MATCOLS(m)))
3296  {
3297    Werror("wrong range[%d,%d] in matrix %s(%d x %d)",r,c,u->Name(),
3298      MATROWS(m),MATCOLS(m));
3299    return TRUE;
3300  }
3301  res->data=u->data;
3302  u->data=NULL;
3303  res->rtyp=u->rtyp;
3304  u->rtyp=0;
3305  res->name=u->name;
3306  u->name=NULL;
3307  Subexpr e=jjMakeSub(v);
3308          e->next=jjMakeSub(w);
3309  if (u->e==NULL)
3310    res->e=e;
3311  else
3312  {
3313    Subexpr h=u->e;
3314    while (h->next!=NULL) h=h->next;
3315    h->next=e;
3316    res->e=u->e;
3317    u->e=NULL;
3318  }
3319  return FALSE;
3320}
3321static BOOLEAN jjBRACK_Ma_I_IV(leftv res, leftv u, leftv v,leftv w)
3322{
3323  sleftv t;
3324  sleftv ut;
3325  leftv p=NULL;
3326  intvec *iv=(intvec *)w->Data();
3327  int l;
3328  BOOLEAN nok;
3329
3330  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
3331  {
3332    WerrorS("cannot build expression lists from unnamed objects");
3333    return TRUE;
3334  }
3335  memcpy(&ut,u,sizeof(ut));
3336  memset(&t,0,sizeof(t));
3337  t.rtyp=INT_CMD;
3338  for (l=0;l< iv->length(); l++)
3339  {
3340    t.data=(char *)(*iv)[l];
3341    if (p==NULL)
3342    {
3343      p=res;
3344    }
3345    else
3346    {
3347      p->next=(leftv)Alloc0(sizeof(sleftv));
3348      p=p->next;
3349    }
3350    memcpy(u,&ut,sizeof(ut));
3351    if (u->Typ() == MATRIX_CMD)
3352      nok=jjBRACK_Ma(p,u,v,&t);
3353    else /* INTMAT_CMD */
3354      nok=jjBRACK_Im(p,u,v,&t);
3355    if (nok)
3356    {
3357      while (res->next!=NULL)
3358      {
3359        p=res->next->next;
3360        Free((ADDRESS)res->next,sizeof(sleftv));
3361        // res->e aufraeumen !!!!
3362        res->next=p;
3363      }
3364      return TRUE;
3365    }
3366  }
3367  return FALSE;
3368}
3369static BOOLEAN jjBRACK_Ma_IV_I(leftv res, leftv u, leftv v,leftv w)
3370{
3371  sleftv t;
3372  sleftv ut;
3373  leftv p=NULL;
3374  intvec *iv=(intvec *)v->Data();
3375  int l;
3376  BOOLEAN nok;
3377
3378  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
3379  {
3380    WerrorS("cannot build expression lists from unnamed objects");
3381    return TRUE;
3382  }
3383  memcpy(&ut,u,sizeof(ut));
3384  memset(&t,0,sizeof(t));
3385  t.rtyp=INT_CMD;
3386  for (l=0;l< iv->length(); l++)
3387  {
3388    t.data=(char *)((*iv)[l]);
3389    if (p==NULL)
3390    {
3391      p=res;
3392    }
3393    else
3394    {
3395      p->next=(leftv)Alloc0(sizeof(sleftv));
3396      p=p->next;
3397    }
3398    memcpy(u,&ut,sizeof(ut));
3399    if (u->Typ() == MATRIX_CMD)
3400      nok=jjBRACK_Ma(p,u,&t,w);
3401    else /* INTMAT_CMD */
3402      nok=jjBRACK_Im(p,u,&t,w);
3403    if (nok)
3404    {
3405      while (res->next!=NULL)
3406      {
3407        p=res->next->next;
3408        Free((ADDRESS)res->next,sizeof(sleftv));
3409        // res->e aufraeumen !!
3410        res->next=p;
3411      }
3412      return TRUE;
3413    }
3414  }
3415  return FALSE;
3416}
3417static BOOLEAN jjBRACK_Ma_IV_IV(leftv res, leftv u, leftv v,leftv w)
3418{
3419  sleftv t1,t2,ut;
3420  leftv p=NULL;
3421  intvec *vv=(intvec *)v->Data();
3422  intvec *wv=(intvec *)w->Data();
3423  int vl;
3424  int wl;
3425  BOOLEAN nok;
3426
3427  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
3428  {
3429    WerrorS("cannot build expression lists from unnamed objects");
3430    return TRUE;
3431  }
3432  memcpy(&ut,u,sizeof(ut));
3433  memset(&t1,0,sizeof(sleftv));
3434  memset(&t2,0,sizeof(sleftv));
3435  t1.rtyp=INT_CMD;
3436  t2.rtyp=INT_CMD;
3437  for (vl=0;vl< vv->length(); vl++)
3438  {
3439    t1.data=(char *)((*vv)[vl]);
3440    for (wl=0;wl< wv->length(); wl++)
3441    {
3442      t2.data=(char *)((*wv)[wl]);
3443      if (p==NULL)
3444      {
3445        p=res;
3446      }
3447      else
3448      {
3449        p->next=(leftv)Alloc0(sizeof(sleftv));
3450        p=p->next;
3451      }
3452      memcpy(u,&ut,sizeof(ut));
3453      if (u->Typ() == MATRIX_CMD)
3454        nok=jjBRACK_Ma(p,u,&t1,&t2);
3455      else /* INTMAT_CMD */
3456        nok=jjBRACK_Im(p,u,&t1,&t2);
3457      if (nok)
3458      {
3459        res->CleanUp();
3460        return TRUE;
3461      }
3462    }
3463  }
3464  return FALSE;
3465}
3466static BOOLEAN jjPROC3(leftv res, leftv u, leftv v, leftv w)
3467{
3468  v->next=(leftv)Alloc(sizeof(sleftv));
3469  memcpy(v->next,w,sizeof(sleftv));
3470  BOOLEAN r=iiExprArith2(res,u,'(',v);
3471  v->rtyp=0; v->data=NULL;
3472  w->rtyp=0; w->data=NULL;
3473  return r;
3474}
3475static BOOLEAN jjCALL3MANY(leftv res, leftv u, leftv v, leftv w)
3476{
3477  u->next=(leftv)Alloc(sizeof(sleftv));
3478  memcpy(u->next,v,sizeof(sleftv));
3479  u->next->next=(leftv)Alloc(sizeof(sleftv));
3480  memcpy(u->next->next,w,sizeof(sleftv));
3481  BOOLEAN r=iiExprArithM(res,u,iiOp);
3482  v->rtyp=0; v->data=NULL; // iiExprArithM did the CleanUp
3483  w->rtyp=0; w->data=NULL;
3484  return r;
3485}
3486static BOOLEAN jjCOEFFS3_Id(leftv res, leftv u, leftv v, leftv w)
3487{
3488  if ((w->rtyp!=IDHDL)||(w->e!=NULL))
3489  {
3490    WerrorS("3rd argument must be a name of a matrix");
3491    return TRUE;
3492  }
3493  ideal i=(ideal)u->Data();
3494  int rank=(int)i->rank;
3495  BOOLEAN r=jjCOEFFS_Id(res,u,v);
3496  if (r) return TRUE;
3497  mpMonomials((matrix)res->data, rank, pVar((poly)v->Data()),(matrix)w->Data());
3498  return FALSE;
3499}
3500static BOOLEAN jjCOEFFS3_KB(leftv res, leftv u, leftv v, leftv w)
3501{
3502  res->data=(void*)idCoeffOfKBase((ideal)(u->Data()),
3503           (ideal)(v->Data()),(poly)(w->Data()));
3504  return FALSE;
3505}
3506static BOOLEAN jjCOEFFS3_P(leftv res, leftv u, leftv v, leftv w)
3507{
3508  if ((w->rtyp!=IDHDL)||(w->e!=NULL))
3509  {
3510    WerrorS("3rd argument must be a name of a matrix");
3511    return TRUE;
3512  }
3513  poly p=(poly)u->CopyD();
3514  ideal i=idInit(1,1);
3515  i->m[0]=p;
3516  sleftv t;
3517  memset(&t,0,sizeof(t));
3518  t.data=(char *)i;
3519  t.rtyp=IDEAL_CMD;
3520  int rank=1;
3521  if (u->Typ()==VECTOR_CMD)
3522  {
3523    i->rank=rank=pMaxComp(p);
3524    t.rtyp=MODUL_CMD;
3525  }
3526  BOOLEAN r=jjCOEFFS_Id(res,&t,v);
3527  t.CleanUp();
3528  if (r) return TRUE;
3529  mpMonomials((matrix)res->data, rank, pVar((poly)v->Data()),(matrix)w->Data());
3530  return FALSE;
3531}
3532static BOOLEAN jjELIMIN_HILB(leftv res, leftv u, leftv v, leftv w)
3533{
3534  res->data=(char *)idElimination((ideal)u->Data(),(poly)v->Data(),
3535    (intvec *)w->Data());
3536  setFlag(res,FLAG_STD);
3537  return FALSE;
3538}
3539static BOOLEAN jjFIND3(leftv res, leftv u, leftv v, leftv w)
3540{
3541  /*4
3542  * look for the substring what in the string where
3543  * starting at position n
3544  * return the position of the first char of what in where
3545  * or 0
3546  */
3547  int n=(int)w->Data();
3548  char *where=(char *)u->Data();
3549  char *what=(char *)v->Data();
3550  char *found;
3551  if ((1>n)||(n>(int)strlen(where)))
3552  {
3553    Werror("start position %d out of range",n);
3554    return TRUE;
3555  }
3556  found = strchr(where+n-1,*what);
3557  if (*(what+1)!='\0')
3558  {
3559    while((found !=NULL) && (strncmp(found+1,what+1,strlen(what+1))!=0))
3560    {
3561      found=strchr(found+1,*what);
3562    }
3563  }
3564  if (found != NULL)
3565  {
3566    res->data=(char *)((found-where)+1);
3567  }
3568  return FALSE;
3569}
3570static BOOLEAN jjJET_P_IV(leftv res, leftv u, leftv v, leftv w)
3571{
3572  short *iw=iv2array((intvec *)w->Data());
3573  res->data = (char *)pJetW((poly)u->Data(),(int)v->Data(),iw);
3574  Free((ADDRESS)iw,(pVariables+1)*sizeof(short));
3575  return FALSE;
3576}
3577static BOOLEAN jjJET_ID_IV(leftv res, leftv u, leftv v, leftv w)
3578{
3579  res->data = (char *)idJetW((ideal)u->Data(),(int)v->Data(),
3580                             (intvec *)w->Data());
3581  return FALSE;
3582}
3583static BOOLEAN jjPREIMAGE(leftv res, leftv u, leftv v, leftv w)
3584{
3585  idhdl h,rr;
3586  map mapping;
3587
3588  rr=(idhdl)u->data;
3589  if ((h=IDRING(rr)->idroot->get(v->name,myynest))!=NULL)
3590  {
3591    if (h->typ==MAP_CMD)
3592    {
3593      mapping=IDMAP(h);
3594    }
3595    else if (h->typ==IDEAL_CMD)
3596    {
3597      mapping=IDMAP(h);
3598    }
3599    else
3600    {
3601      Werror("`%s` is no map nor ideal",IDID(h));
3602      return TRUE;
3603    }
3604  }
3605  else
3606  {
3607    Werror("`%s` is not defined in `%s`",v->name,u->name);
3608    return TRUE;
3609  }
3610  if ((h=IDRING(rr)->idroot->get(w->name,myynest))!=NULL)
3611  {
3612    if (h->typ==IDEAL_CMD)
3613    {
3614      res->data=(char *)maGetPreimage(IDRING(rr),mapping,IDIDEAL(h));
3615    }
3616    else
3617    {
3618      Werror("`%s` is no ideal",IDID(h));
3619      return TRUE;
3620    }
3621  }
3622  else
3623  {
3624    Werror("`%s` is not defined in `%s`",w->name,u->name);
3625    return TRUE;
3626  }
3627  return FALSE;
3628}
3629static BOOLEAN jjRANDOM_Im(leftv res, leftv u, leftv v, leftv w)
3630{
3631  int di, k;
3632  int i=(int)u->Data();
3633  int r=(int)v->Data();
3634  int c=(int)w->Data();
3635  intvec *iv = new intvec(r, c, 0);
3636  if (iv->rows()==0)
3637  {
3638    delete iv;
3639    return TRUE;
3640  }
3641  if (i!=0)
3642  {
3643    if (i<0) i = -i;
3644    di = 2 * i + 1;
3645    for (k=0; k<iv->length(); k++)
3646    {
3647#ifdef buildin_rand
3648      (*iv)[k] = ((siRand() % di) - i);
3649#else
3650      (*iv)[k] = ((rand() % di) - i);
3651#endif
3652    }
3653  }
3654  res->data = (char *)iv;
3655  return FALSE;
3656}
3657static BOOLEAN jjSUBST_Test(leftv v,leftv w,
3658  int &ringvar, poly &monomexpr)
3659{
3660  monomexpr=(poly)w->Data();
3661  if (pLength(monomexpr)>1)
3662  {
3663    Werror("`%s` substitutes a ringvar only by a term",
3664      Tok2Cmdname(SUBST_CMD));
3665    return TRUE;
3666  }
3667  if (!(ringvar=pVar((poly)v->Data())))
3668  {
3669    WerrorS("ringvar expected");
3670    return TRUE;
3671  }
3672  return FALSE;
3673}
3674static BOOLEAN jjSUBST_P(leftv res, leftv u, leftv v,leftv w)
3675{
3676  int ringvar;
3677  poly monomexpr;
3678  BOOLEAN nok=jjSUBST_Test(v,w,ringvar,monomexpr);
3679  if (nok) return TRUE;
3680  res->data = pSubst((poly)u->CopyD(POLY_CMD),ringvar,monomexpr);
3681  return FALSE;
3682}
3683static BOOLEAN jjSUBST_Id(leftv res, leftv u, leftv v,leftv w)
3684{
3685  int ringvar;
3686  poly monomexpr;
3687  BOOLEAN nok=jjSUBST_Test(v,w,ringvar,monomexpr);
3688  if (nok) return TRUE;
3689  res->data = idSubst((ideal)u->CopyD(IDEAL_CMD),ringvar,monomexpr);
3690  return FALSE;
3691}
3692static BOOLEAN jjMATRIX_Id(leftv res, leftv u, leftv v,leftv w)
3693{
3694  matrix m=mpNew((int)v->Data(),(int)w->Data());
3695  ideal I=(ideal)u->CopyD(IDEAL_CMD);
3696  int i=min(IDELEMS(I),(int)v->Data()*(int)w->Data());
3697  for(i=i-1;i>=0;i--)
3698  {
3699    m->m[i]=I->m[i];
3700    I->m[i]=NULL;
3701  }
3702  idDelete(&I);
3703  res->data = (char *)m;
3704  return FALSE;
3705}
3706static BOOLEAN jjMATRIX_Mo(leftv res, leftv u, leftv v,leftv w)
3707{
3708  res->data = (char *)idModule2formatedMatrix((ideal)u->CopyD(MODUL_CMD),
3709           (int)v->Data(),(int)w->Data());
3710  return FALSE;
3711}
3712static BOOLEAN jjMATRIX_Ma(leftv res, leftv u, leftv v,leftv w)
3713{
3714  matrix m=mpNew((int)v->Data(),(int)w->Data());
3715  matrix I=(matrix)u->CopyD(MATRIX_CMD);
3716  int r=min(MATROWS(I),(int)v->Data());
3717  int c=min(MATCOLS(I),(int)w->Data());
3718  int i,j;
3719  for(i=r;i>0;i--)
3720  {
3721    for(j=c;j>0;j--)
3722    {
3723      MATELEM(m,i,j)=MATELEM(I,i,j);
3724      MATELEM(I,i,j)=NULL;
3725    }
3726  }
3727  idDelete((ideal *)&I);
3728  res->data = (char *)m;
3729  return FALSE;
3730}
3731static BOOLEAN jjREDUCE3_P(leftv res, leftv u, leftv v, leftv w)
3732{
3733  assumeStdFlag(v);
3734  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(poly)u->Data(),
3735    0,(int)w->Data());
3736  return FALSE;
3737}
3738static BOOLEAN jjREDUCE3_ID(leftv res, leftv u, leftv v, leftv w)
3739{
3740  assumeStdFlag(v);
3741  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(ideal)u->Data(),
3742    0,(int)w->Data());
3743  return FALSE;
3744}
3745static BOOLEAN jjRES3(leftv res, leftv u, leftv v, leftv w)
3746{
3747#ifdef OLD_RES
3748  int maxl=(int)v->Data();
3749  int l=0;
3750  resolvente r;
3751  intvec **weights=NULL;
3752  int wmaxl=maxl;
3753  maxl--;
3754  if ((maxl==-1) && (iiOp!=MRES_CMD))
3755    maxl = pVariables-1;
3756  if ((iiOp == RES_CMD) || (iiOp == MRES_CMD))
3757  {
3758    if (BTEST1(28))
3759    {
3760      r=syMinRes((ideal)u->Data(),maxl,&l,iiOp==MRES_CMD);
3761    }
3762    else
3763    {
3764      intvec * iv=(intvec*)atGet(u,"isHomog");
3765      if (iv!=NULL)
3766      {
3767        weights = (intvec**)Alloc0(sizeof(intvec*));
3768        weights[0] = ivCopy(iv);
3769        l=1;
3770      }
3771      r=syResolvente((ideal)u->Data(),maxl,&l, &weights, iiOp==MRES_CMD);
3772    }
3773  }
3774  else
3775    r=sySchreyerResolvente((ideal)u->Data(),maxl+1,&l);
3776  if (r==NULL) return TRUE;
3777  int t3=u->Typ();
3778  iiMakeResolv(r,l,wmaxl,w->name,t3,weights);
3779  return FALSE;
3780#else
3781  return TRUE;
3782#endif
3783}
3784static BOOLEAN jjSTATUS3(leftv res, leftv u, leftv v, leftv w)
3785{
3786  int yes;
3787  jjSTATUS2(res, u, v);
3788  yes = (strcmp((char *) res->data, (char *) w->Data()) == 0);
3789  FreeL((ADDRESS) res->data);
3790  res->data = (void *) yes;
3791  return FALSE;
3792}
3793
3794/*=================== operations with 3 args.: table =================*/
3795struct sValCmd3 dArith3[]=
3796{
3797// operations:
3798// proc             cmd          res         arg1        arg2        arg3
3799 {jjBRACK_S,        '[',        STRING_CMD, STRING_CMD, INT_CMD,    INT_CMD }
3800,{jjBRACK_Im,       '[',        INT_CMD,    INTMAT_CMD, INT_CMD,    INT_CMD }
3801,{jjBRACK_Ma_I_IV,  '[',        INT_CMD,    INTMAT_CMD, INT_CMD,    INTVEC_CMD }
3802,{jjBRACK_Ma_IV_I,  '[',        INT_CMD,    INTMAT_CMD, INTVEC_CMD, INT_CMD }
3803,{jjBRACK_Ma_IV_IV, '[',        INT_CMD,    INTMAT_CMD, INTVEC_CMD, INTVEC_CMD }
3804,{jjBRACK_Ma,       '[',        POLY_CMD,   MATRIX_CMD, INT_CMD,    INT_CMD }
3805,{jjBRACK_Ma_I_IV,  '[',        POLY_CMD,   MATRIX_CMD, INT_CMD,    INTVEC_CMD }
3806,{jjBRACK_Ma_IV_I,  '[',        POLY_CMD,   MATRIX_CMD, INTVEC_CMD, INT_CMD }
3807,{jjBRACK_Ma_IV_IV, '[',        POLY_CMD,   MATRIX_CMD, INTVEC_CMD, INTVEC_CMD }
3808,{jjPROC3,          '(',        ANY_TYPE,   PROC_CMD,   DEF_CMD,    DEF_CMD }
3809,{atATTRIB3,        ATTRIB_CMD, NONE,       IDHDL,      STRING_CMD, DEF_CMD }
3810,{jjCOEFFS3_P,      COEFFS_CMD, MATRIX_CMD, POLY_CMD,   POLY_CMD,   MATRIX_CMD }
3811,{jjCOEFFS3_P,      COEFFS_CMD, MATRIX_CMD, VECTOR_CMD, POLY_CMD,   MATRIX_CMD }
3812,{jjCOEFFS3_Id,     COEFFS_CMD, MATRIX_CMD, IDEAL_CMD,  POLY_CMD,   MATRIX_CMD }
3813,{jjCOEFFS3_Id,     COEFFS_CMD, MATRIX_CMD, MODUL_CMD,  POLY_CMD,   MATRIX_CMD }
3814,{jjCOEFFS3_KB,     COEFFS_CMD, MATRIX_CMD, IDEAL_CMD,  IDEAL_CMD,  POLY_CMD }
3815,{jjCOEFFS3_KB,     COEFFS_CMD, MATRIX_CMD, MODUL_CMD,  MODUL_CMD,  POLY_CMD }
3816,{jjELIMIN_HILB,    ELIMINATION_CMD,IDEAL_CMD, IDEAL_CMD, POLY_CMD, INTVEC_CMD }
3817,{jjFIND3,          FIND_CMD,   INT_CMD,    STRING_CMD, STRING_CMD, INT_CMD }
3818,{jjCALL3MANY,      IDEAL_CMD,  IDEAL_CMD,  DEF_CMD,    DEF_CMD,    DEF_CMD }
3819//,{jjCALL3MANY,      INTERSECT_CMD,  NONE,   DEF_CMD,    DEF_CMD,    DEF_CMD }
3820,{lInsert3,         INSERT_CMD, LIST_CMD,   LIST_CMD,   DEF_CMD,    INT_CMD }
3821,{jjCALL3MANY,      INTVEC_CMD, INTVEC_CMD, DEF_CMD,    DEF_CMD,    DEF_CMD }
3822,{jjJET_P_IV,       JET_CMD,    POLY_CMD,   POLY_CMD,   INT_CMD,    INTVEC_CMD }
3823,{jjJET_ID_IV,      JET_CMD,    IDEAL_CMD,  IDEAL_CMD,  INT_CMD,    INTVEC_CMD }
3824,{jjJET_P_IV,       JET_CMD,    VECTOR_CMD, VECTOR_CMD, INT_CMD,    INTVEC_CMD }
3825,{jjJET_ID_IV,      JET_CMD,    MODUL_CMD,  MODUL_CMD,  INT_CMD,    INTVEC_CMD }
3826,{mpKoszul,         KOSZUL_CMD, MATRIX_CMD, INT_CMD,    INT_CMD,    IDEAL_CMD }
3827,{jjCALL3MANY,      LIST_CMD,   LIST_CMD,   DEF_CMD,    DEF_CMD,    DEF_CMD }
3828,{jjMATRIX_Id,      MATRIX_CMD, MATRIX_CMD, IDEAL_CMD,  INT_CMD,    INT_CMD }
3829,{jjMATRIX_Mo,      MATRIX_CMD, MATRIX_CMD, MODUL_CMD,  INT_CMD,    INT_CMD }
3830,{jjMATRIX_Ma,      MATRIX_CMD, MATRIX_CMD, MATRIX_CMD, INT_CMD,    INT_CMD }
3831,{jjCALL3MANY,      MODUL_CMD,  MODUL_CMD,  DEF_CMD,    DEF_CMD,    DEF_CMD }
3832,{jjRES3,           MRES_CMD,   NONE,       IDEAL_CMD,  INT_CMD,    ANY_TYPE }
3833,{jjRES3,           MRES_CMD,   NONE,       MODUL_CMD,  INT_CMD,    ANY_TYPE }
3834,{jjPREIMAGE,       PREIMAGE_CMD, IDEAL_CMD, RING_CMD,  ANY_TYPE,   ANY_TYPE }
3835,{jjPREIMAGE,       PREIMAGE_CMD, IDEAL_CMD, QRING_CMD, ANY_TYPE,   ANY_TYPE }
3836,{jjRANDOM_Im,      RANDOM_CMD, INTMAT_CMD, INT_CMD,    INT_CMD,    INT_CMD }
3837,{jjREDUCE3_P,      REDUCE_CMD, POLY_CMD,   POLY_CMD,   IDEAL_CMD,  INT_CMD }
3838,{jjREDUCE3_P,      REDUCE_CMD, VECTOR_CMD, VECTOR_CMD, IDEAL_CMD,  INT_CMD }
3839,{jjREDUCE3_P,      REDUCE_CMD, VECTOR_CMD, VECTOR_CMD, MODUL_CMD,  INT_CMD }
3840,{jjREDUCE3_ID,     REDUCE_CMD, IDEAL_CMD,  IDEAL_CMD,  IDEAL_CMD,  INT_CMD }
3841,{jjREDUCE3_ID,     REDUCE_CMD, MODUL_CMD,  MODUL_CMD,  MODUL_CMD,  INT_CMD }
3842,{jjREDUCE3_ID,     REDUCE_CMD, MODUL_CMD,  MODUL_CMD,  IDEAL_CMD,  INT_CMD }
3843,{jjRES3,           RES_CMD,    NONE,       IDEAL_CMD,  INT_CMD,    ANY_TYPE }
3844,{jjRES3,           RES_CMD,    NONE,       MODUL_CMD,  INT_CMD,    ANY_TYPE }
3845#ifdef HAVE_FACTORY
3846,{jjRESULTANT,      RESULTANT_CMD, POLY_CMD,POLY_CMD,   POLY_CMD,   POLY_CMD }
3847#else
3848,{jjWRONG3,         RESULTANT_CMD, POLY_CMD,POLY_CMD,   POLY_CMD,   POLY_CMD }
3849#endif
3850,{jjRES3,           SRES_CMD,   NONE,       IDEAL_CMD,  INT_CMD,    ANY_TYPE }
3851,{jjRES3,           SRES_CMD,   NONE,       MODUL_CMD,  INT_CMD,    ANY_TYPE }
3852,{jjSTATUS3,        STATUS_CMD, INT_CMD,    LINK_CMD,   STRING_CMD, STRING_CMD}
3853,{jjSUBST_P,        SUBST_CMD,  POLY_CMD,   POLY_CMD,   POLY_CMD,   POLY_CMD }
3854,{jjSUBST_P,        SUBST_CMD,  VECTOR_CMD, VECTOR_CMD, POLY_CMD,   POLY_CMD }
3855,{jjSUBST_Id,       SUBST_CMD,  IDEAL_CMD,  IDEAL_CMD,  POLY_CMD,   POLY_CMD }
3856,{jjSUBST_Id,       SUBST_CMD,  MODUL_CMD,  MODUL_CMD,  POLY_CMD,   POLY_CMD }
3857,{jjSUBST_Id,       SUBST_CMD,  MATRIX_CMD, MATRIX_CMD, POLY_CMD,   POLY_CMD }
3858,{jjCALL3MANY,      SYSTEM_CMD, NONE,       STRING_CMD, DEF_CMD,    DEF_CMD }
3859,{NULL,             0,          0,          0,          0,          0 }
3860};
3861/*=================== operations with many arg.: static proc =================*/
3862static BOOLEAN jjCALL1ARG(leftv res, leftv v)
3863{
3864  return iiExprArith1(res,v,iiOp);
3865}
3866static BOOLEAN jjCALL2ARG(leftv res, leftv u)
3867{
3868  leftv v=u->next;
3869  u->next=NULL;
3870  BOOLEAN b=iiExprArith2(res,u,iiOp,v);
3871  u->next=v;
3872  return b;
3873}
3874static BOOLEAN jjCOEF_M(leftv res, leftv v)
3875{
3876  if((v->Typ() != VECTOR_CMD)
3877  || (v->next->Typ() != POLY_CMD)
3878  || (v->next->next->Typ() != MATRIX_CMD)
3879  || (v->next->next->next->Typ() != MATRIX_CMD))
3880     return TRUE;
3881  if (v->next->next->rtyp!=IDHDL) return TRUE;
3882  idhdl c=(idhdl)v->next->next->data;
3883  if (v->next->next->next->rtyp!=IDHDL) return TRUE;
3884  idhdl m=(idhdl)v->next->next->next->data;
3885  idDelete((ideal *)&(c->data.uideal));
3886  idDelete((ideal *)&(m->data.uideal));
3887  mpCoef2((poly)v->Data(),(poly)v->next->Data(),
3888    (matrix *)&(c->data.umatrix),(matrix *)&(m->data.umatrix));
3889  return FALSE;
3890}
3891static BOOLEAN jjIDEAL_PL(leftv res, leftv v)
3892{
3893  int s=1;
3894  leftv h=v;
3895  if (h!=NULL) s=exprlist_length(h);
3896  ideal id=idInit(s,1);
3897  int rank=1;
3898  int i=0;
3899  poly p=NULL;
3900  while (h!=NULL)
3901  {
3902    switch(h->Typ())
3903    {
3904      case POLY_CMD:
3905      {
3906        p=(poly)h->CopyD();
3907        break;
3908      }
3909      case INT_CMD:
3910      {
3911        number n=nInit((int)h->Data());
3912        if (!nIsZero(n))
3913        {
3914          p=pOne();
3915          pSetCoeff(p,n);
3916        }
3917        else
3918        {
3919          //p=NULL;
3920          nDelete(&n);
3921        }
3922        break;
3923      }
3924      case NUMBER_CMD:
3925      {
3926        number n=(number)h->CopyD();
3927        if (!nIsZero(n))
3928        {
3929          p=pOne();
3930          pSetCoeff(p,n);
3931        }
3932        else
3933        {
3934          //p=NULL;
3935          nDelete(&n);
3936        }
3937        break;
3938      }
3939      case VECTOR_CMD:
3940      {
3941        p=(poly)h->CopyD();
3942        if (iiOp!=MODUL_CMD)
3943        {
3944          idDelete(&id);
3945          pDelete(&p);
3946          return TRUE;
3947        }
3948        rank=max(rank,pMaxComp(p));
3949        break;
3950      }
3951      default:
3952      {
3953        idDelete(&id);
3954        return TRUE;
3955      }
3956    }
3957    if ((iiOp==MODUL_CMD)&&(p!=NULL)&&(pGetComp(p)==0))
3958    {
3959      pSetCompP(p,1);
3960    }
3961    id->m[i]=p;
3962    i++;
3963    h=h->next;
3964  }
3965  id->rank=rank;
3966  res->data=(char *)id;
3967  return FALSE;
3968}
3969static BOOLEAN jjINTERSECT_PL(leftv res, leftv v)
3970{
3971  leftv h=v;
3972  int l=v->listLength();
3973  resolvente r=(resolvente)Alloc0(l*sizeof(ideal));
3974  BOOLEAN *copied=(BOOLEAN *)Alloc0(l*sizeof(BOOLEAN));
3975  int t=0;
3976  // try to convert to IDEAL_CMD
3977  while (h!=NULL)
3978  {
3979    if (iiTestConvert(h->Typ(),IDEAL_CMD)!=0)
3980    {
3981      t=IDEAL_CMD;
3982    }
3983    else break;
3984    h=h->next;
3985  }
3986  // if failure, try MODUL_CMD
3987  if (t==0)
3988  {
3989    h=v;
3990    while (h!=NULL)
3991    {
3992      if (iiTestConvert(h->Typ(),MODUL_CMD)!=0)
3993      {
3994        t=MODUL_CMD;
3995      }
3996      else break;
3997      h=h->next;
3998    }
3999  }
4000  // check for success  in converting
4001  if (t==0)
4002  {
4003    WerrorS("cannot convert to ideal or module");
4004    return TRUE;
4005  }
4006  // call idMultSect
4007  h=v;
4008  int i=0;
4009  sleftv tmp;
4010  while (h!=NULL)
4011  {
4012    if (h->Typ()==t)
4013    {
4014      r[i]=(ideal)h->Data(); /*no copy*/
4015      h=h->next;
4016    }
4017    else if(iiConvert(h->Typ(),t,iiTestConvert(h->Typ(),t),h,&tmp))
4018    {
4019      Free((ADDRESS)copied,l*sizeof(BOOLEAN));
4020      Free((ADDRESS)r,l*sizeof(ideal));
4021      Werror("cannot convert arg. %d to %s",i+1,Tok2Cmdname(t));
4022      return TRUE;
4023    }
4024    else
4025    {
4026      r[i]=(ideal)tmp.Data(); /*now it's a copy*/
4027      copied[i]=TRUE;
4028      h=tmp.next;
4029    }
4030    i++;
4031  }
4032  res->rtyp=t;
4033  res->data=(char *)idMultSect(r,i);
4034  while(i>0)
4035  {
4036    i--;
4037    if (copied[i]) idDelete(&(r[i]));
4038  }
4039  Free((ADDRESS)copied,l*sizeof(BOOLEAN));
4040  Free((ADDRESS)r,l*sizeof(ideal));
4041  return FALSE;
4042}
4043static BOOLEAN jjINTVEC_PL(leftv res, leftv v)
4044{
4045  int i=0;
4046  leftv h=v;
4047  if (h!=NULL) i=exprlist_length(h);
4048  intvec *iv=new intvec(i);
4049  i=0;
4050  while (h!=NULL)
4051  {
4052    if(h->Typ()==INT_CMD)
4053    {
4054      (*iv)[i]=(int)h->Data();
4055    }
4056    else
4057    {
4058      delete iv;
4059      return TRUE;
4060    }
4061    i++;
4062    h=h->next;
4063  }
4064  res->data=(char *)iv;
4065  return FALSE;
4066}
4067static BOOLEAN jjKLAMMER_PL(leftv res, leftv u)
4068{
4069  leftv v=u->next;
4070  BOOLEAN b;
4071  if(v==NULL)
4072    b=iiExprArith1(res,u,iiOp);
4073  else
4074  {
4075    u->next=NULL;
4076    b=iiExprArith2(res,u,iiOp,v);
4077    u->next=v;
4078  }
4079  return b;
4080}
4081static BOOLEAN jjLIST_PL(leftv res, leftv v)
4082{
4083  int sl=0;
4084  if (v!=NULL) sl = v->listLength();
4085  lists L;
4086  if((sl==1)&&(v->Typ()==RESOLUTION_CMD))
4087  {
4088    L=syConvRes((syStrategy)v->Data());
4089  }
4090  else
4091  {
4092    L=(lists)Alloc(sizeof(slists));
4093    leftv h=NULL;
4094    int i;
4095    int rt;
4096
4097    L->Init(sl);
4098    for (i=0;i<sl;i++)
4099    {
4100      if (h!=NULL) { /* e.g. not in the first step:
4101                     * h is the pointer to the old sleftv,
4102                     * v is the pointer to the next sleftv
4103                     * (in this moment) */
4104                     h->next=v;
4105                   }
4106      h=v;
4107      v=v->next;
4108      h->next=NULL;
4109      rt=h->Typ();
4110      if (rt==0)
4111      {
4112        L->Clean();
4113        Werror("`%s` is undefined",h->Name());
4114        return TRUE;
4115      }
4116      if ((rt==RING_CMD)||(rt==QRING_CMD))
4117      {
4118        L->m[i].rtyp=rt;
4119        L->m[i].data=h->Data();
4120        ((ring)L->m[i].data)->ref++;
4121      }
4122      else
4123        L->m[i].Copy(h);
4124    }
4125  }
4126  res->data=(char *)L;
4127  return FALSE;
4128}
4129static BOOLEAN jjNAMES0(leftv res, leftv v)
4130{
4131  res->data=(void *)ipNameList(idroot);
4132  return FALSE;
4133}
4134static BOOLEAN jjOPTION_PL(leftv res, leftv v)
4135{
4136  if(v==NULL)
4137  {
4138    showOption();
4139    return FALSE;
4140  }
4141  return setOption(res,v);
4142}
4143static BOOLEAN jjRESERVED0(leftv res, leftv v)
4144{
4145  int i=1;
4146  loop
4147  {
4148    Print("%-20s",cmds[i].name);
4149    i++;
4150    if(cmds[i].name==NULL)
4151      break;
4152    if ((i%3)==1) PrintLn();
4153  }
4154  PrintLn();
4155  return FALSE;
4156}
4157static BOOLEAN jjSTRING_PL(leftv res, leftv v)
4158{
4159  if ((v!=NULL)&&(v->next==NULL))
4160    return iiExprArith1(res,v,iiOp);
4161  int sl=0;
4162  leftv h=v,nachher;
4163  sleftv tmpR;
4164  BOOLEAN bo;
4165  char *sum=NULL;
4166  while(h!=NULL)
4167  {
4168    /* convert to string =================================*/
4169    nachher=h->next;
4170    h->next=NULL;
4171    bo=iiExprArith1(&tmpR,h,iiOp);
4172    if(bo)
4173    {
4174      h->next=nachher;
4175      FreeL(sum);
4176      return TRUE;
4177    }
4178    /* append to 'sum' =================================*/
4179    if(sum==NULL)
4180    {
4181      sum=(char *)tmpR.data;
4182      sl=strlen(sum);
4183    }
4184    else
4185    {
4186      int nl=strlen((char *)tmpR.data);
4187      char *s=(char *)AllocL(sl+nl+1);
4188      memcpy(s,sum,sl);
4189      memcpy(s+sl,(char *)tmpR.data,nl);
4190      s[sl+nl]='\0';
4191      sl+=nl;
4192      FreeL(sum);
4193      sum=s;
4194    }
4195    /* next sleftv =================================*/
4196    h->next=nachher;
4197    h=nachher;
4198  }
4199  if (sum==NULL) sum=mstrdup("");
4200  res->data=(char *)sum;
4201  return FALSE;
4202}
4203static BOOLEAN jjTEST(leftv res, leftv v)
4204{
4205  do
4206  {
4207    if (v->Typ()!=INT_CMD)
4208      return TRUE;
4209    test_cmd((int)v->Data());
4210    v=v->next;
4211  }
4212  while (v!=NULL);
4213  return FALSE;
4214}
4215/*=================== operations with many arg.: table =================*/
4216/* number_of_args:  -1: any, -2: any >0, .. */
4217struct sValCmdM dArithM[]=
4218{
4219// operations:
4220// proc         cmd               res            number_of_args
4221 {jjKLAMMER_PL,  '(',           ANY_TYPE,           -2  }
4222,{jjCALL2ARG,  COEF_CMD,        MATRIX_CMD,         2  }
4223,{jjCOEF_M,    COEF_CMD,        NONE,               4  }
4224,{jjDBPRINT,   DBPRINT_CMD,     NONE,               -2 }
4225,{jjCALL1ARG,  IDEAL_CMD,       IDEAL_CMD,          1  }
4226,{jjIDEAL_PL,  IDEAL_CMD,       IDEAL_CMD,          -1 }
4227,{jjCALL2ARG,  INTERSECT_CMD,   IDEAL_CMD,          2  }
4228,{jjINTERSECT_PL,INTERSECT_CMD, IDEAL_CMD,          -2 }
4229,{jjCALL1ARG,  INTVEC_CMD,      INTVEC_CMD,         1  }
4230,{jjINTVEC_PL, INTVEC_CMD,      INTVEC_CMD,         -1 }
4231,{jjLIST_PL,   LIST_CMD,        LIST_CMD,           -1 }
4232,{jjCALL1ARG,  MODUL_CMD,       MODUL_CMD,          1  }
4233,{jjIDEAL_PL,  MODUL_CMD,       MODUL_CMD,          -1 }
4234,{jjCALL1ARG,  NAMES_CMD,       LIST_CMD,            1 }
4235,{jjNAMES0,    NAMES_CMD,       LIST_CMD,            0 }
4236,{jjOPTION_PL, OPTION_CMD,      NONE/*or set by p*/,-1 }
4237,{jjCALL1ARG,  RESERVEDNAME_CMD, INT_CMD,            1 }
4238,{jjRESERVED0, RESERVEDNAME_CMD, NONE,               0 }
4239,{jjSTRING_PL, STRING_CMD,      STRING_CMD,         -1 }
4240,{jjSYSTEM,    SYSTEM_CMD,      NONE/*or set by p*/,-2 }
4241,{jjTEST,      TEST_CMD,        NONE,               -2 }
4242,{iiWRITE,     WRITE_CMD,       NONE,               -2 }
4243,{NULL,        0,               0,                  0  }
4244};
4245#ifdef MDEBUG
4246static Subexpr jjDBMakeSub(leftv e,char *f, int l)
4247#else
4248static Subexpr jjMakeSub(leftv e)
4249#endif
4250{
4251  // assume: e->Typ()==INT_CMD
4252#ifdef MDEBUG
4253  Subexpr r=(Subexpr)mmDBAllocBlock0(sizeof(*r),f,l);
4254#else
4255  Subexpr r=(Subexpr)Alloc0(sizeof(*r));
4256#endif
4257  r->start =(int)e->Data();
4258  return r;
4259}
4260
4261/*================ generating tables ============================*/
4262#ifdef GENTABLE
4263extern struct sValAssign dAssign[];
4264struct sValCmdTab dArithTab1[]={ {0,0}};
4265#define JJTAB1LEN 0
4266struct sValCmdTab dArithTab2[]={ {0,0}};
4267#define JJTAB2LEN 0
4268void ttGen1()
4269{
4270  FILE *outfile = fopen("iparith.inc","w");
4271  int i,j,l1=0,l2=0;
4272  currRing=(ring)Alloc(sizeof(*currRing));
4273  fprintf(outfile,
4274  "/****************************************\n"
4275  "*  Computer Algebra System SINGULAR     *\n"
4276  "****************************************/\n\n");
4277/*-------------------------------------------------------------------*/
4278  fprintf(outfile,"// syntax table for Singular\n//\n");
4279  fprintf(outfile,"// - search for an exact match of the argument types\n");
4280  fprintf(outfile,"// - otherwise search for the first possibility\n");
4281  fprintf(outfile,"//   with converted types of the arguments\n");
4282  fprintf(outfile,"// - otherwise report an error\n//\n");
4283
4284  int op;
4285  i=0;
4286  while ((op=dArith1[i].cmd)!=0)
4287  {
4288    if (dArith1[i].p==jjWRONG)
4289      fprintf(outfile,"// DUMMY ");
4290    char *s = iiTwoOps(op);
4291    fprintf(outfile,"// operation: %s (%s)  ->  %s\n",
4292          s,
4293          Tok2Cmdname(dArith1[i].arg),
4294          Tok2Cmdname(ABS(dArith1[i].res)));
4295    i++;
4296  }
4297  fprintf(outfile,"/*---------------------------------------------*/\n");
4298  i=0;
4299  while ((op=dArith2[i].cmd)!=0)
4300  {
4301    if (dArith2[i].p==jjWRONG2)
4302      fprintf(outfile,"// DUMMY ");
4303    char *s = iiTwoOps(op);
4304    fprintf(outfile,"// operation: %s (%s, %s)  ->  %s\n",
4305          s,
4306          Tok2Cmdname(dArith2[i].arg1),
4307          Tok2Cmdname(dArith2[i].arg2),
4308          Tok2Cmdname(dArith2[i].res));
4309    i++;
4310  }
4311  fprintf(outfile,"/*---------------------------------------------*/\n");
4312  i=0;
4313  while ((op=dArith3[i].cmd)!=0)
4314  {
4315    char *s = iiTwoOps(op);
4316    if (dArith3[i].p==jjWRONG3)
4317      fprintf(outfile,"// DUMMY ");
4318    fprintf(outfile,"// operation: %s (%s, %s, %s)  ->  %s\n",
4319          s,
4320          Tok2Cmdname(dArith3[i].arg1),
4321          Tok2Cmdname(dArith3[i].arg2),
4322          Tok2Cmdname(dArith3[i].arg3),
4323          Tok2Cmdname(dArith3[i].res));
4324    i++;
4325  }
4326  fprintf(outfile,"/*---------------------------------------------*/\n");
4327  i=0;
4328  while ((op=dArithM[i].cmd)!=0)
4329  {
4330    char *s = iiTwoOps(op);
4331    fprintf(outfile,"// operation: %s (...)  ->  %s",
4332          s,
4333          Tok2Cmdname(dArithM[i].res));
4334    switch(dArithM[i].number_of_args)
4335    {
4336      case -2:
4337         fprintf(outfile," ( number of arguments >0 )\n");
4338         break;
4339      case -1:
4340         fprintf(outfile," ( any number of arguments )\n");
4341         break;
4342      default:
4343         fprintf(outfile," ( %d arguments )\n",dArithM[i].number_of_args);
4344         break;
4345    }
4346    i++;
4347  }
4348  fprintf(outfile,"/*---------------------------------------------*/\n");
4349  i=0;
4350  while ((op=dAssign[i].res)!=0)
4351  {
4352    fprintf(outfile,"// assign: %s =  %s\n",
4353          Tok2Cmdname(op/*dAssign[i].res*/),
4354          Tok2Cmdname(dAssign[i].arg));
4355    i++;
4356  }
4357/*-------------------------------------------------------------------*/
4358  fprintf(outfile,"/*---------------------------------------------*/\n");
4359  for (j=257;j<=MAX_TOK+1;j++)
4360  {
4361    for(i=257;i<=MAX_TOK+1;i++)
4362    {
4363      if ((i!=j) && (j!=IDHDL) && (j!=DEF_CMD) && (j!=ANY_TYPE)
4364      && iiTestConvert(i,j))
4365      {
4366        fprintf(outfile,"// convert %s -> %s\n",
4367          Tok2Cmdname(i), Tok2Cmdname(j));
4368        if (j==ANY_TYPE) break;
4369      }
4370    }
4371  }
4372  fprintf(outfile,"/*---------------------------------------------*/\n");
4373  char ops[]="=><+*/[.^,%(;";
4374  for(i=0;ops[i]!='\0';i++)
4375    fprintf(outfile,"// token %d : %c\n", (int)ops[i], ops[i]);
4376  for (i=257;i<=MAX_TOK;i++)
4377  {
4378    char *s=iiTwoOps(i);
4379    if (s[0]!='$')
4380    {
4381      fprintf(outfile,"// token %d : %s\n", i, s);
4382    }
4383  }
4384/*-------------------------------------------------------------------*/
4385  fprintf(outfile,"/*--max. token: %d, gr: %d --*/\n",MAX_TOK,UMINUS);
4386/*-------------------------------------------------------------------*/
4387  fprintf(outfile,"/*---------------------------------------------*/\n");
4388  fprintf(outfile,
4389  "struct sValCmdTab dArithTab1[]=\n"
4390  "{\n");
4391  for (j=1;j<=MAX_TOK+1;j++)
4392  {
4393    for(i=0;dArith1[i].cmd!=0;i++)
4394    {
4395      if (dArith1[i].cmd==j)
4396      {
4397        fprintf(outfile," { %d,%d },\n",j,i);
4398        l1++;
4399        break;
4400      }
4401    }
4402  }
4403  fprintf(outfile," { 10000,0 }\n};\n");
4404  fprintf(outfile,"#define JJTAB1LEN %d\n",l1);
4405/*-------------------------------------------------------------------*/
4406  fprintf(outfile,
4407  "struct sValCmdTab dArithTab2[]=\n"
4408  "{\n");
4409  for (j=1;j<=MAX_TOK+1;j++)
4410  {
4411    for(i=0;dArith2[i].cmd!=0;i++)
4412    {
4413      if (dArith2[i].cmd==j)
4414      {
4415        fprintf(outfile," { %d,%d },\n",j,i);
4416        l2++;
4417        break;
4418      }
4419    }
4420  }
4421  fprintf(outfile," { 10000,0 }\n};\n");
4422  fprintf(outfile,"#define JJTAB2LEN %d\n",l2);
4423  fclose(outfile);
4424}
4425/*-------------------------------------------------------------------*/
4426void ttGen2()
4427{
4428  FILE *outfile = fopen("iparith.inc","a");
4429  fprintf(outfile,
4430  "/****************************************\n"
4431  "*  Computer Algebra System SINGULAR     *\n"
4432  "****************************************/\n\n");
4433/*-------------------------------------------------------------------*/
4434  fprintf(outfile,"// identifier table for Singular\n//\n");
4435
4436  fprintf(outfile,
4437  "cmdnames cmds[] =\n"
4438  "{  // name-string     alias  tokval toktype\n"
4439  "{ \"$INVALID$\",            0,  -1, 0},\n");
4440  int i=1;
4441  int m=-1;
4442  int id_nr=0;
4443  BOOLEAN f=FALSE;
4444  loop
4445  {
4446    while (cmds[i].tokval!=0)
4447    {
4448      if ((cmds[i].tokval!=-1)&&(cmds[i].name!=NULL))
4449      {
4450        if(m==-1)
4451        {
4452          m=i;
4453          f=TRUE;
4454        }
4455        else if(strcmp(cmds[m].name,cmds[i].name)>0)
4456        {
4457          m=i;
4458          f=TRUE;
4459        }
4460      }
4461      i++;
4462    }
4463    if(f)
4464    {
4465      id_nr++;
4466      if(cmds[m].tokval==VRTIMER) fprintf(outfile,"#ifdef HAVE_RTIMER\n");
4467      fprintf(outfile,"  {\"%s\", %*d, %3d, ",cmds[m].name,
4468                                             20-strlen(cmds[m].name),
4469                                             cmds[m].alias,
4470                                             cmds[m].tokval);
4471      switch(cmds[m].toktype)
4472      {
4473        case CMD_1:            fprintf(outfile,"CMD_1 },\n"); break;
4474        case CMD_2:            fprintf(outfile,"CMD_2 },\n"); break;
4475        case CMD_3:            fprintf(outfile,"CMD_3 },\n"); break;
4476        case CMD_12:           fprintf(outfile,"CMD_12 },\n"); break;
4477        case CMD_123 :         fprintf(outfile,"CMD_123 },\n"); break;
4478        case CMD_23:           fprintf(outfile,"CMD_23 },\n"); break;
4479        case CMD_M:            fprintf(outfile,"CMD_M },\n"); break;
4480        case SYSVAR:           fprintf(outfile,"SYSVAR },\n"); break;
4481        case ROOT_DECL:        fprintf(outfile,"ROOT_DECL },\n"); break;
4482        case ROOT_DECL_LIST:   fprintf(outfile,"ROOT_DECL_LIST },\n"); break;
4483        case RING_DECL:        fprintf(outfile,"RING_DECL },\n"); break;
4484        case NONE:             fprintf(outfile,"NONE },\n"); break;
4485        default:               if((cmds[m].toktype>' ')
4486                               &&(cmds[m].toktype<127))
4487                               {
4488                                 fprintf(outfile,"'%c' },\n",cmds[m].toktype);
4489                               }
4490                               else
4491                               {
4492                                 fprintf(outfile,"%d },\n",cmds[m].toktype);
4493                               }
4494                               break;
4495      }
4496      if(cmds[m].tokval==VRTIMER) fprintf(outfile,"#endif\n");
4497      cmds[m].name=NULL;
4498      m=-1;
4499      i=1;
4500      f=FALSE;
4501    }
4502    else break;
4503  }
4504  fprintf(outfile,
4505"/* list of scanner identifiers/only for feread/reservedName */\n");
4506  f=FALSE;
4507  i=1;m=-1;
4508  loop
4509  {
4510    while (cmds[i].tokval!=0)
4511    {
4512      if (cmds[i].name!=NULL)
4513      {
4514        if(m==-1)
4515        {
4516          m=i;
4517          f=TRUE;
4518        }
4519        else if(strcmp(cmds[m].name,cmds[i].name)>0)
4520        {
4521          m=i;
4522          f=TRUE;
4523        }
4524      }
4525      i++;
4526    }
4527    if(f)
4528    {
4529      fprintf(outfile,"  {\"%s\", %*d,  -1, 0 },\n",cmds[m].name,
4530                                             20-strlen(cmds[m].name),
4531                                             0/*cmds[m].alias*/
4532                                             /*-1 cmds[m].tokval*/
4533                                             /*0 cmds[m].toktype*/);
4534      cmds[m].name=NULL;
4535      m=-1;
4536      i=1;
4537      f=FALSE;
4538    }
4539    else break;
4540  }
4541  fprintf(outfile,
4542"/* end of list marker */\n"
4543"  { NULL, 0, 0, 0}\n"
4544"};\n"
4545"#ifdef HAVE_RTIMER\n"
4546"#define LAST_IDENTIFIER %d\n"
4547"#else\n"
4548"#define LAST_IDENTIFIER %d\n"
4549"#endif\n",id_nr,id_nr-1);
4550  fclose(outfile);
4551}
4552/*-------------------------------------------------------------------*/
4553#if 0
4554void ttGen3()
4555{
4556  FILE *outfile = fopen("mpsr_tok.inc","w");
4557  fprintf(outfile,
4558  "/****************************************\n"
4559  "*  Computer Algebra System SINGULAR     *\n"
4560  "****************************************/\n\n");
4561/*-------------------------------------------------------------------*/
4562  fprintf(outfile,"// token table for Singular\n//\n");
4563
4564  fprintf(outfile,
4565  "short vtok[] =\n"
4566  "{\n");
4567  // operations with 1 arg: ===========================================
4568  int i=0;
4569  while (dArith1[i].cmd!=0)
4570  {
4571    if ((dArith1[i].p!=jjWRONG)
4572    &&((i==0)||(dArith1[i].cmd!=dArith1[i-1].cmd)))
4573    {
4574      fprintf(outfile,"  %d,\n",dArith1[i].cmd);
4575    }
4576    i++;
4577  }
4578  // operations with 2 args: ===========================================
4579  i=0;
4580  while (dArith2[i].cmd!=0)
4581  {
4582    if ((dArith2[i].p!=jjWRONG2)
4583    &&((i==0)||(dArith2[i].cmd!=dArith2[i-1].cmd)))
4584    {
4585      fprintf(outfile,"  %d,\n",dArith2[i].cmd);
4586    }
4587    i++;
4588  }
4589  // operations with 3 args: ===========================================
4590  i=0;
4591  while (dArith3[i].cmd!=0)
4592  {
4593    if (
4594    ((i==0)||(dArith3[i].cmd!=dArith3[i-1].cmd)))
4595    {
4596      fprintf(outfile,"  %d,\n",dArith3[i].cmd);
4597    }
4598    i++;
4599  }
4600  // operations with many args: ===========================================
4601  i=0;
4602  while (dArithM[i].cmd!=0)
4603  {
4604    if (
4605    ((i==0)||(dArithM[i].cmd!=dArithM[i-1].cmd)))
4606    {
4607      fprintf(outfile,"  %d,\n",dArithM[i].cmd);
4608    }
4609    i++;
4610  }
4611  // ====================================================================
4612  fprintf(outfile,
4613  "/* end of list marker */\n"
4614  " %d };\n",MAX_TOK);
4615  fclose(outfile);
4616}
4617#endif
4618/*-------------------------------------------------------------------*/
4619#else
4620#include "iparith.inc"
4621#endif
4622
4623/*=================== operations with 2 args. ============================*/
4624
4625BOOLEAN iiExprArith2(leftv res, leftv a, int op, leftv b, BOOLEAN proccall)
4626{
4627#ifndef GENTABLE
4628
4629  memset(res,0,sizeof(sleftv));
4630
4631  if (!errorreported)
4632  {
4633#ifdef SIQ
4634    if (siq>0)
4635    {
4636      //Print("siq:%d\n",siq);
4637      command d=(command)Alloc0(sizeof(ip_command));
4638      memcpy(&d->arg1,a,sizeof(sleftv));
4639      memcpy(&d->arg2,b,sizeof(sleftv));
4640      d->argc=2;
4641      d->op=op;
4642      res->data=(char *)d;
4643      res->rtyp=COMMAND;
4644      return FALSE;
4645    }
4646#endif
4647    int at=a->Typ();
4648    int bt=b->Typ();
4649    int i=iiTabIndex(dArithTab2,JJTAB2LEN,op);
4650
4651    iiOp=op;
4652    while (dArith2[i].cmd==op)
4653    {
4654      if ((at==dArith2[i].arg1)
4655      && (bt==dArith2[i].arg2))
4656      {
4657        res->rtyp=dArith2[i].res;
4658        if (dArith2[i].p(res,a,b))
4659        {
4660          break;// leave loop, goto error handling
4661        }
4662        a->CleanUp();
4663        b->CleanUp();
4664        //Print("op: %d,result typ:%d\n",op,res->rtyp);
4665        return FALSE;
4666      }
4667      i++;
4668    }
4669    // implicite type conversion ----------------------------------------------
4670    if (dArith2[i].cmd!=op)
4671    {
4672      int ai,bi;
4673      leftv an = (leftv)Alloc0(sizeof(sleftv));
4674      leftv bn = (leftv)Alloc0(sizeof(sleftv));
4675      BOOLEAN failed=FALSE;
4676      i=iiTabIndex(dArithTab2,JJTAB2LEN,op);
4677      //Print("op: %c, type: %s %s\n",op,Tok2Cmdname(at),Tok2Cmdname(bt));
4678      while (dArith2[i].cmd==op)
4679      {
4680        //Print("test %s %s\n",Tok2Cmdname(dArith2[i].arg1),Tok2Cmdname(dArith2[i].arg2));
4681        if ((ai=iiTestConvert(at,dArith2[i].arg1))!=0)
4682        {
4683          if ((bi=iiTestConvert(bt,dArith2[i].arg2))!=0)
4684          {
4685            res->rtyp=dArith2[i].res;
4686            failed= ((iiConvert(at,dArith2[i].arg1,ai,a,an))
4687            || (iiConvert(bt,dArith2[i].arg2,bi,b,bn))
4688            || (dArith2[i].p(res,an,bn)));
4689            // everything done, clean up temp. variables
4690            if (failed)
4691            {
4692              // leave loop, goto error handling
4693              break;
4694            }
4695            else
4696            {
4697              // everything ok, clean up and return
4698              an->CleanUp();
4699              bn->CleanUp();
4700              Free((ADDRESS)an,sizeof(sleftv));
4701              Free((ADDRESS)bn,sizeof(sleftv));
4702              a->CleanUp();
4703              b->CleanUp();
4704              return FALSE;
4705            }
4706          }
4707        }
4708        i++;
4709      }
4710      an->CleanUp();
4711      bn->CleanUp();
4712      Free((ADDRESS)an,sizeof(sleftv));
4713      Free((ADDRESS)bn,sizeof(sleftv));
4714    }
4715    // error handling ---------------------------------------------------
4716    const char *s=NULL;
4717    if (!errorreported)
4718    {
4719      if ((at==0) && (a->Name()!=sNoName))
4720      {
4721        s=a->Name();
4722      }
4723      else if ((bt==0) && (b->Name()!=sNoName))
4724      {
4725        s=b->Name();
4726      }
4727      if (s!=NULL)
4728        Werror("`%s` is not defined",s);
4729      else
4730      {
4731        i=iiTabIndex(dArithTab2,JJTAB2LEN,op);
4732        s = iiTwoOps(op);
4733        if (proccall)
4734        {
4735          Werror("%s(`%s`,`%s`) is not supported"
4736                ,s,Tok2Cmdname(at),Tok2Cmdname(bt));
4737        }
4738        else
4739        {
4740          Werror("`%s` %s `%s` is not supported"
4741                ,Tok2Cmdname(at),s,Tok2Cmdname(bt));
4742        }
4743        if (BVERBOSE(V_SHOW_USE))
4744        {
4745          while (dArith2[i].cmd==op)
4746          {
4747            if(((at==dArith2[i].arg1)||(bt==dArith2[i].arg2))
4748            && (dArith2[i].res!=0)
4749            && (dArith2[i].p!=jjWRONG2))
4750            {
4751              if (proccall)
4752                Werror("expected %s(`%s`,`%s`)"
4753                  ,s,Tok2Cmdname(dArith2[i].arg1),Tok2Cmdname(dArith2[i].arg2));
4754              else
4755                Werror("expected `%s` %s `%s`"
4756                  ,Tok2Cmdname(dArith2[i].arg1),s,Tok2Cmdname(dArith2[i].arg2));
4757            }
4758            i++;
4759          }
4760        }
4761      }
4762    }
4763    res->rtyp = UNKNOWN;
4764  }
4765  a->CleanUp();
4766  b->CleanUp();
4767#endif
4768  return TRUE;
4769}
4770
4771/*==================== operations with 1 arg. ===============================*/
4772
4773BOOLEAN iiExprArith1(leftv res, leftv a, int op)
4774{
4775#ifndef GENTABLE
4776  memset(res,0,sizeof(sleftv));
4777
4778  if (!errorreported)
4779  {
4780#ifdef SIQ
4781    if (siq>0)
4782    {
4783      //Print("siq:%d\n",siq);
4784      command d=(command)Alloc0(sizeof(ip_command));
4785      memcpy(&d->arg1,a,sizeof(sleftv));
4786      d->op=op;
4787      d->argc=1;
4788      res->data=(char *)d;
4789      res->rtyp=COMMAND;
4790      return FALSE;
4791    }
4792#endif
4793    int at=a->Typ();
4794    BOOLEAN failed=FALSE;
4795
4796    iiOp=op;
4797    int i=iiTabIndex(dArithTab1,JJTAB1LEN,op);
4798    while (dArith1[i].cmd==op)
4799    {
4800      if (at==dArith1[i].arg)
4801      {
4802        res->rtyp=dArith1[i].res;
4803        if (dArith1[i].res<0)
4804        {
4805          res->rtyp=-res->rtyp;
4806          #ifdef PROC_BUG
4807          dArith1[i].p(res,a);
4808          #else
4809          res->data=(char *)((Proc1)dArith1[i].p)((char *)a->Data());
4810          #endif
4811        }
4812        else if (dArith1[i].p(res,a))
4813        {
4814          break;// leave loop, goto error handling
4815        }
4816        if (a->Next()!=NULL)
4817        {
4818          res->next=(leftv)Alloc(sizeof(sleftv));
4819          failed=iiExprArith1(res->next,a->next,op);
4820        }
4821        a->CleanUp();
4822        return failed;
4823      }
4824      i++;
4825    }
4826    // implicite type conversion --------------------------------------------
4827    if (dArith1[i].cmd!=op)
4828    {
4829      int ai;
4830      leftv an = (leftv)Alloc0(sizeof(sleftv));
4831      i=iiTabIndex(dArithTab1,JJTAB1LEN,op);
4832      //Print("fuer %c , typ: %s\n",op,Tok2Cmdname(at));
4833      while (dArith1[i].cmd==op)
4834      {
4835        //Print("test %s\n",Tok2Cmdname(dArith1[i].arg));
4836        if ((ai=iiTestConvert(at,dArith1[i].arg))!=0)
4837        {
4838          res->rtyp=dArith1[i].res;
4839          if (dArith1[i].res<0)
4840          {
4841            res->rtyp=-res->rtyp;
4842            failed= iiConvert(at,dArith1[i].arg,ai,a,an);
4843            if (!failed)
4844            {
4845              #ifdef PROC_BUG
4846              dArith1[i].p(res,a);
4847              #else
4848              res->data=(char *)((Proc1)dArith1[i].p)((char *)an->Data());
4849              #endif
4850            }
4851          }
4852          else
4853          {
4854            failed= ((iiConvert(at,dArith1[i].arg,ai,a,an))
4855            || (dArith1[i].p(res,an)));
4856          }
4857          // everything done, clean up temp. variables
4858          if (failed)
4859          {
4860            // leave loop, goto error handling
4861            break;
4862          }
4863          else
4864          {
4865            // everything ok, clean up and return
4866            an->CleanUp();
4867            Free((ADDRESS)an,sizeof(sleftv));
4868            a->CleanUp();
4869            return FALSE;
4870          }
4871        }
4872        i++;
4873      }
4874      an->CleanUp();
4875      Free((ADDRESS)an,sizeof(sleftv));
4876    }
4877    // error handling
4878    if (!errorreported)
4879    {
4880      if ((at==0) && (a->Name()!=sNoName))
4881      {
4882        Werror("`%s` is not defined",a->Name());
4883      }
4884      else
4885      {
4886        i=iiTabIndex(dArithTab1,JJTAB1LEN,op);
4887        char *s = iiTwoOps(op);
4888        Werror("%s(`%s`) is not supported"
4889                ,s,Tok2Cmdname(at));
4890        if (BVERBOSE(V_SHOW_USE))
4891        {
4892          while (dArith1[i].cmd==op)
4893          {
4894            if ((dArith1[i].res!=0)
4895            && (dArith1[i].p!=jjWRONG))
4896              Werror("expected %s(`%s`)"
4897                ,s,Tok2Cmdname(dArith1[i].arg));
4898            i++;
4899          }
4900        }
4901      }
4902    }
4903    res->rtyp = UNKNOWN;
4904  }
4905  a->CleanUp();
4906#endif
4907  return TRUE;
4908}
4909
4910/*=================== operations with 3 args. ============================*/
4911
4912BOOLEAN iiExprArith3(leftv res, int op, leftv a, leftv b, leftv c)
4913{
4914#ifndef GENTABLE
4915  memset(res,0,sizeof(sleftv));
4916
4917  if (!errorreported)
4918  {
4919#ifdef SIQ
4920    if (siq>0)
4921    {
4922      //Print("siq:%d\n",siq);
4923      command d=(command)Alloc0(sizeof(ip_command));
4924      memcpy(&d->arg1,a,sizeof(sleftv));
4925      memcpy(&d->arg2,b,sizeof(sleftv));
4926      memcpy(&d->arg3,c,sizeof(sleftv));
4927      d->op=op;
4928      d->argc=3;
4929      res->data=(char *)d;
4930      res->rtyp=COMMAND;
4931      return FALSE;
4932    }
4933#endif
4934    int at=a->Typ();
4935    int bt=b->Typ();
4936    int ct=c->Typ();
4937
4938    iiOp=op;
4939    int i=0;
4940    while ((dArith3[i].cmd!=op)&&(dArith3[i].cmd!=0)) i++;
4941    while (dArith3[i].cmd==op)
4942    {
4943      if ((at==dArith3[i].arg1)
4944      && (bt==dArith3[i].arg2)
4945      && (ct==dArith3[i].arg3))
4946      {
4947        res->rtyp=dArith3[i].res;
4948        if (dArith3[i].p(res,a,b,c))
4949        {
4950          break;// leave loop, goto error handling
4951        }
4952        a->CleanUp();
4953        b->CleanUp();
4954        c->CleanUp();
4955        return FALSE;
4956      }
4957      i++;
4958    }
4959    // implicite type conversion ----------------------------------------------
4960    if (dArith3[i].cmd!=op)
4961    {
4962      int ai,bi,ci;
4963      leftv an = (leftv)Alloc0(sizeof(sleftv));
4964      leftv bn = (leftv)Alloc0(sizeof(sleftv));
4965      leftv cn = (leftv)Alloc0(sizeof(sleftv));
4966      BOOLEAN failed=FALSE;
4967      i=0;
4968      while ((dArith3[i].cmd!=op)&&(dArith3[i].cmd!=0)) i++;
4969      while (dArith3[i].cmd==op)
4970      {
4971        if ((ai=iiTestConvert(at,dArith3[i].arg1))!=0)
4972        {
4973          if ((bi=iiTestConvert(bt,dArith3[i].arg2))!=0)
4974          {
4975            if ((ci=iiTestConvert(ct,dArith3[i].arg3))!=0)
4976            {
4977              res->rtyp=dArith3[i].res;
4978              failed= ((iiConvert(at,dArith3[i].arg1,ai,a,an))
4979                || (iiConvert(bt,dArith3[i].arg2,bi,b,bn))
4980                || (iiConvert(ct,dArith3[i].arg3,ci,c,cn))
4981                || (dArith3[i].p(res,an,bn,cn)));
4982              // everything done, clean up temp. variables
4983              if (failed)
4984              {
4985                // leave loop, goto error handling
4986                break;
4987              }
4988              else
4989              {
4990                // everything ok, clean up and return
4991                an->CleanUp();
4992                bn->CleanUp();
4993                cn->CleanUp();
4994                Free((ADDRESS)an,sizeof(sleftv));
4995                Free((ADDRESS)bn,sizeof(sleftv));
4996                Free((ADDRESS)cn,sizeof(sleftv));
4997                a->CleanUp();
4998                b->CleanUp();
4999                c->CleanUp();
5000        //Print("op: %d,result typ:%d\n",op,res->rtyp);
5001                return FALSE;
5002              }
5003            }
5004          }
5005        }
5006        i++;
5007      }
5008      an->CleanUp();
5009      bn->CleanUp();
5010      cn->CleanUp();
5011      Free((ADDRESS)an,sizeof(sleftv));
5012      Free((ADDRESS)bn,sizeof(sleftv));
5013      Free((ADDRESS)cn,sizeof(sleftv));
5014    }
5015    // error handling ---------------------------------------------------
5016    if (!errorreported)
5017    {
5018      const char *s=NULL;
5019      if ((at==0) && (a->Name()!=sNoName))
5020      {
5021        s=a->Name();
5022      }
5023      else if ((bt==0) && (b->Name()!=sNoName))
5024      {
5025        s=b->Name();
5026      }
5027      else if ((ct==0) && (c->Name()!=sNoName))
5028      {
5029        s=c->Name();
5030      }
5031      if (s!=NULL)
5032        Werror("`%s` is not defined",s);
5033      else
5034      {
5035        i=0;
5036        while ((dArith3[i].cmd!=op)&&(dArith3[i].cmd!=0)) i++;
5037        char *s = iiTwoOps(op);
5038        Werror("%s(`%s`,`%s`,`%s`) is not supported"
5039                ,s,Tok2Cmdname(at),Tok2Cmdname(bt),Tok2Cmdname(ct));
5040        if (BVERBOSE(V_SHOW_USE))
5041        {
5042          while (dArith3[i].cmd==op)
5043          {
5044            if(((at==dArith3[i].arg1)
5045            ||(bt==dArith3[i].arg2)
5046            ||(ct==dArith3[i].arg3))
5047            && (dArith3[i].res!=0))
5048            {
5049              Werror("expected %s(`%s`,`%s`,`%s`)"
5050                  ,s,Tok2Cmdname(dArith3[i].arg1)
5051                  ,Tok2Cmdname(dArith3[i].arg2)
5052                  ,Tok2Cmdname(dArith3[i].arg3));
5053            }
5054            i++;
5055          }
5056        }
5057      }
5058    }
5059    res->rtyp = UNKNOWN;
5060  }
5061  a->CleanUp();
5062  b->CleanUp();
5063  c->CleanUp();
5064        //Print("op: %d,result typ:%d\n",op,res->rtyp);
5065#endif
5066  return TRUE;
5067}
5068/*==================== operations with many arg. ===============================*/
5069
5070BOOLEAN iiExprArithM(leftv res, leftv a, int op)
5071{
5072#ifndef GENTABLE
5073  memset(res,0,sizeof(sleftv));
5074
5075  if (!errorreported)
5076  {
5077#ifdef SIQ
5078    if (siq>0)
5079    {
5080      //Print("siq:%d\n",siq);
5081      command d=(command)Alloc0(sizeof(ip_command));
5082      d->op=op;
5083      res->data=(char *)d;
5084      if (a!=NULL)
5085      {
5086        d->argc=a->listLength();
5087        // else : d->argc=0;
5088        memcpy(&d->arg1,a,sizeof(sleftv));
5089        switch(d->argc)
5090        {
5091          case 3:
5092            memcpy(&d->arg3,a->next->next,sizeof(sleftv));
5093            a->next->next->rtyp=0;
5094            a->next->next->data=NULL;
5095            a->next->next->name=NULL;
5096            a->next->next->attribute=NULL;
5097          case 2:
5098            memcpy(&d->arg2,a->next,sizeof(sleftv));
5099            a->next->rtyp=0;
5100            a->next->name=NULL;
5101            a->next->data=NULL;
5102            a->next->attribute=NULL;
5103            d->arg2.next=NULL;
5104          case 1:
5105            d->arg1.next=NULL;
5106        }
5107        if (d->argc>3) a->next=NULL;
5108        a->rtyp=0;
5109        a->data=NULL;
5110        a->name=NULL;
5111        a->CleanUp();
5112      }
5113      res->rtyp=COMMAND;
5114      return FALSE;
5115    }
5116#endif
5117    BOOLEAN failed=FALSE;
5118    int args=0;
5119    if (a!=NULL) args=a->listLength();
5120
5121    iiOp=op;
5122    int i=0;
5123    while ((dArithM[i].cmd!=op)&&(dArithM[i].cmd!=0)) i++;
5124    int ii=i;
5125    while (dArithM[i].cmd==op)
5126    {
5127      if ((args==dArithM[i].number_of_args)
5128      || (dArithM[i].number_of_args==-1)
5129      || ((dArithM[i].number_of_args==-2)&&(args>0)))
5130      {
5131        res->rtyp=dArithM[i].res;
5132        if (dArithM[i].p(res,a))
5133        {
5134          break;// leave loop, goto error handling
5135        }
5136        if (a!=NULL) a->CleanUp();
5137        //Print("op: %d,result typ:%d\n",op,res->rtyp);
5138        return failed;
5139      }
5140      i++;
5141    }
5142    // error handling
5143    if (!errorreported)
5144    {
5145      if ((a->rtyp==0) && (a->Name()!=sNoName))
5146      {
5147        Werror("`%s` is not defined",a->Name());
5148      }
5149      else
5150      {
5151        char *s = iiTwoOps(op);
5152        Werror("%s(...) is not supported",s);
5153      }
5154    }
5155    res->rtyp = UNKNOWN;
5156  }
5157  if (a!=NULL) a->CleanUp();
5158        //Print("op: %d,result typ:%d\n",op,res->rtyp);
5159#endif
5160  return TRUE;
5161}
5162
5163/*=================== general utilities ============================*/
5164int IsCmd(char *n, int & tok)
5165{
5166  int an=1;
5167  int i,v;
5168#ifndef GENTABLE
5169  int en=LAST_IDENTIFIER;
5170
5171  loop
5172  {
5173    if(an>=en-1)
5174    {
5175      if (strcmp(n, cmds[an].name) == 0)
5176      {
5177        i=an;
5178        break;
5179      }
5180      else if (strcmp(n, cmds[en].name) == 0)
5181      {
5182        i=en;
5183        break;
5184      }
5185      else
5186      {
5187        return 0;
5188      }
5189    }
5190    i=(an+en)/2;
5191    v=strcmp(n,cmds[i].name);
5192    if(v<0)
5193    {
5194      en=i;
5195    }
5196    else if(v>0)
5197    {
5198      an=i;
5199    }
5200    else /*v==0*/
5201    {
5202      break;
5203    }
5204  }
5205  lastreserved=cmds[i].name;
5206  tok=cmds[i].tokval;
5207  if(cmds[i].alias==2)
5208  {
5209    Warn("outdated identifier `%s` used - please change your code",
5210    cmds[i].name);
5211    cmds[i].alias=1;
5212  }
5213  if (currRingHdl==NULL)
5214  {
5215    #ifdef SIQ
5216    if (siq<=0)
5217    {
5218    #endif
5219      if ((tok>=BEGIN_RING) && (tok<=END_RING))
5220      {
5221         Werror("no ring active");
5222         return 0;
5223      }
5224    #ifdef SIQ
5225    }
5226    #endif
5227  }
5228  if (!expected_parms)
5229  {
5230    switch (tok)
5231    {
5232      case IDEAL_CMD:
5233      case INT_CMD:
5234      case INTVEC_CMD:
5235      case MAP_CMD:
5236      case MATRIX_CMD:
5237      case MODUL_CMD:
5238      case POLY_CMD:
5239      case PROC_CMD:
5240      case RING_CMD:
5241      case STRING_CMD:
5242        cmdtok = tok;
5243        break;
5244    }
5245  }
5246#endif
5247  return cmds[i].toktype;
5248}
5249static int iiTabIndex(const jjValCmdTab dArithTab, const int len, const int op)
5250{
5251#ifndef GENTABLE
5252  int a=0;
5253  int e=len;
5254  int p=len/2;
5255  while ( a!=e)
5256  {
5257     if (op==dArithTab[p].cmd) return dArithTab[p].start;
5258     else if (op<dArithTab[p].cmd)
5259     { e=p; p=a+(e-a)/2;}
5260     else
5261     { a=p; p=p+(e-p)/2; }
5262  }
5263#endif
5264  return -1;
5265}
5266
Note: See TracBrowser for help on using the repository browser.