source: git/Singular/iparith.cc @ 356dc3d

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