source: git/Singular/iparith.cc @ 6ae4f5

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