source: git/Singular/iparith.cc @ cc94b0a

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