source: git/Singular/iparith.cc @ c56606

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