source: git/Singular/iparith.cc @ 2a2c07

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