source: git/Singular/iparith.cc @ d754b7

spielwiese
Last change on this file since d754b7 was d754b7, checked in by Olaf Bachmann <obachman@…>, 26 years ago
Reimplemented link structures. Cleaned it up. Introduced assignment link = link. Fixed some bugs in asciidump. Made proc's work for MP links. git-svn-id: file:///usr/local/Singular/svn/trunk@137 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 142.6 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: iparith.cc,v 1.16 1997-04-08 08:43:16 obachman Exp $ */
5/*
6* ABSTRACT: table driven kernel interface, used by interpreter
7*/
8
9#include <stdlib.h>
10#include <string.h>
11#include <ctype.h>
12
13#include <stdio.h>
14#include <time.h>
15
16#ifndef macintosh
17#include <sys/time.h>
18#include <unistd.h>
19#endif
20
21#include "mod2.h"
22#include "tok.h"
23#include "ipid.h"
24#include "intvec.h"
25#include "mmemory.h"
26#include "febase.h"
27#include "longalg.h"
28#include "polys.h"
29#include "ideals.h"
30#include "matpol.h"
31#include "kstd1.h"
32#include "timer.h"
33#include "ring.h"
34#include "subexpr.h"
35#include "lists.h"
36#include "numbers.h"
37#include "stairc.h"
38#include "maps.h"
39#include "syz.h"
40#include "weight.h"
41#include "ipconv.h"
42#include "ipprint.h"
43#include "attrib.h"
44#include "silink.h"
45#ifdef HAVE_LIBFACTORY
46#include "clapsing.h"
47#include "kstdfac.h"
48#endif
49#ifdef HAVE_FGLM
50#include "fglm.h"
51#endif
52#include "ipshell.h"
53
54/*=============== types =====================*/
55struct sValCmdTab
56{
57  short cmd;
58  short start;
59};
60
61typedef sValCmdTab jjValCmdTab[];
62
63/* ifdef GENTABLE: definitions are in ipshell.h */
64#ifndef GENTABLE
65typedef char * (*Proc1)(char *);
66struct sValCmd1
67{
68  proc1 p;
69  short cmd;
70  short res;
71  short arg;
72};
73
74typedef BOOLEAN (*proc2)(leftv,leftv,leftv);
75struct sValCmd2
76{
77  proc2 p;
78  short cmd;
79  short res;
80  short arg1;
81  short arg2;
82};
83
84typedef BOOLEAN (*proc3)(leftv,leftv,leftv,leftv);
85struct sValCmd3
86{
87  proc3 p;
88  short cmd;
89  short res;
90  short arg1;
91  short arg2;
92  short arg3;
93};
94struct sValCmdM
95{
96  proc1 p;
97  short cmd;
98  short res;
99  short number_of_args; /* -1: any, -2: any >0, .. */
100};
101#endif
102
103
104/*============= proc =======================*/
105static int iiTabIndex(const jjValCmdTab dArithTab, const int len, const int op);
106#ifdef MDEBUG
107#define jjMakeSub(A) jjDBMakeSub(A,__FILE__,__LINE__)
108static Subexpr jjDBMakeSub(leftv e,char *f, int l);
109#else
110static Subexpr jjMakeSub(leftv e);
111#endif
112
113
114/*============= vars ======================*/
115extern int cmdtok;
116extern BOOLEAN expected_parms;
117
118int iiOp; /* the current operation*/
119
120#ifdef GENTABLE
121cmdnames cmds[] =
122{  // name-string alias tokval          toktype
123  { "$INVALID$",   0, -1,                 0},
124  { "and",         0, '&' ,               '&'},
125  { "attrib",      0, ATTRIB_CMD ,        CMD_123},
126  { "bareiss",     0, BAREISS_CMD ,       CMD_1},
127  { "betti",       0, BETTI_CMD ,         CMD_1},
128  #ifdef HAVE_DLD
129  { "binary",      0, BINARY_CMD ,        ROOT_DECL},
130  #endif
131  { "break",       0, BREAK_CMD ,         BREAK_CMD},
132  { "char",        0, CHARACTERISTIC_CMD ,CMD_1},
133  { "char_series", 0, CHAR_SERIES_CMD ,   CMD_1},
134  { "charstr",     0, CHARSTR_CMD ,       CMD_1},
135  { "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_IV_I,   '*',            INTMAT_CMD,     INTMAT_CMD, INT_CMD }
1870,{jjTIMES_IV,  '*',            INTVEC_CMD,     INTMAT_CMD, INTVEC_CMD }
1871,{jjTIMES_IV,  '*',            INTMAT_CMD,     INTMAT_CMD, INTMAT_CMD }
1872,{jjDIV_I,     '/',            INT_CMD,        INT_CMD,    INT_CMD }
1873,{jjDIV_N,     '/',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD }
1874,{jjDIV_P,     '/',            POLY_CMD,       POLY_CMD,   POLY_CMD }
1875,{jjDIV_P,     '/',            VECTOR_CMD,     VECTOR_CMD, POLY_CMD }
1876,{jjOP_IV_I,   '/',            INTVEC_CMD,     INTVEC_CMD, INT_CMD }
1877,{jjOP_IV_I,   '/',            INTMAT_CMD,     INTMAT_CMD, INT_CMD }
1878,{jjMOD_I,     '%',            INT_CMD,        INT_CMD,    INT_CMD }
1879,{jjOP_IV_I,   '%',            INTVEC_CMD,     INTVEC_CMD, INT_CMD }
1880,{jjOP_IV_I,   '%',            INTMAT_CMD,     INTMAT_CMD, INT_CMD }
1881,{jjPOWER_I,   '^',            INT_CMD,        INT_CMD,    INT_CMD }
1882,{jjPOWER_N,   '^',            NUMBER_CMD,     NUMBER_CMD, INT_CMD }
1883,{jjPOWER_P,   '^',            POLY_CMD,       POLY_CMD,   INT_CMD }
1884,{jjPOWER_ID,  '^',            IDEAL_CMD,      IDEAL_CMD,  INT_CMD }
1885,{jjLE_I,      LE,             INT_CMD,        INT_CMD,    INT_CMD }
1886,{jjLE_N,      LE,             INT_CMD,        NUMBER_CMD, NUMBER_CMD }
1887,{jjCOMPARE_S, LE,             INT_CMD,        STRING_CMD, STRING_CMD }
1888,{jjCOMPARE_IV_I,LE,           INT_CMD,        INTVEC_CMD, INT_CMD }
1889,{jjCOMPARE_IV,LE,             INT_CMD,        INTVEC_CMD, INTVEC_CMD }
1890,{jjCOMPARE_P, LE,             INT_CMD,        POLY_CMD,   POLY_CMD }
1891,{jjCOMPARE_P, LE,             INT_CMD,        VECTOR_CMD, VECTOR_CMD }
1892,{jjLT_I,      '<',            INT_CMD,        INT_CMD,    INT_CMD }
1893,{jjLT_N,      '<',            INT_CMD,        NUMBER_CMD, NUMBER_CMD }
1894,{jjCOMPARE_IV_I,'<',           INT_CMD,        INTVEC_CMD, INT_CMD }
1895,{jjCOMPARE_IV,'<',            INT_CMD,        INTVEC_CMD, INTVEC_CMD }
1896,{jjCOMPARE_S, '<',            INT_CMD,        STRING_CMD, STRING_CMD }
1897,{jjCOMPARE_P, '<',            INT_CMD,        POLY_CMD,   POLY_CMD }
1898,{jjCOMPARE_P, '<',            INT_CMD,        VECTOR_CMD, VECTOR_CMD }
1899,{jjGE_I,      GE,             INT_CMD,        INT_CMD,    INT_CMD }
1900,{jjGE_N,      GE,             INT_CMD,        NUMBER_CMD, NUMBER_CMD }
1901,{jjCOMPARE_S, GE,             INT_CMD,        STRING_CMD, STRING_CMD }
1902,{jjCOMPARE_IV_I,GE,           INT_CMD,        INTVEC_CMD, INT_CMD }
1903,{jjCOMPARE_IV,GE,             INT_CMD,        INTVEC_CMD, INTVEC_CMD }
1904,{jjCOMPARE_P, GE,             INT_CMD,        POLY_CMD,   POLY_CMD }
1905,{jjCOMPARE_P, GE,             INT_CMD,        VECTOR_CMD, VECTOR_CMD }
1906,{jjGT_I,      '>',            INT_CMD,        INT_CMD,    INT_CMD }
1907,{jjGT_N,      '>',            INT_CMD,        NUMBER_CMD, NUMBER_CMD }
1908,{jjCOMPARE_S, '>',            INT_CMD,        STRING_CMD, STRING_CMD }
1909,{jjCOMPARE_IV_I,'>',          INT_CMD,        INTVEC_CMD, INT_CMD }
1910,{jjCOMPARE_IV,'>',            INT_CMD,        INTVEC_CMD, INTVEC_CMD }
1911,{jjCOMPARE_P, '>',            INT_CMD,        POLY_CMD,   POLY_CMD }
1912,{jjCOMPARE_P, '>',            INT_CMD,        VECTOR_CMD, VECTOR_CMD }
1913,{jjAND_I,     '&',            INT_CMD,        INT_CMD,    INT_CMD }
1914,{jjOR_I,      '|',            INT_CMD,        INT_CMD,    INT_CMD }
1915,{jjEQUAL_I,   EQUAL_EQUAL,    INT_CMD,        INT_CMD,    INT_CMD }
1916,{jjEQUAL_N,   EQUAL_EQUAL,    INT_CMD,        NUMBER_CMD, NUMBER_CMD }
1917,{jjCOMPARE_S, EQUAL_EQUAL,    INT_CMD,        STRING_CMD, STRING_CMD }
1918,{jjEQUAL_P,   EQUAL_EQUAL,    INT_CMD,        POLY_CMD,   POLY_CMD }
1919,{jjEQUAL_P,   EQUAL_EQUAL,    INT_CMD,        VECTOR_CMD, VECTOR_CMD }
1920,{jjCOMPARE_IV_I,EQUAL_EQUAL,  INT_CMD,        INTVEC_CMD, INT_CMD }
1921,{jjCOMPARE_IV,EQUAL_EQUAL,    INT_CMD,        INTVEC_CMD, INTVEC_CMD }
1922,{jjCOMPARE_IV,EQUAL_EQUAL,    INT_CMD,        INTMAT_CMD, INTMAT_CMD }
1923,{jjEQUAL_Ma,  EQUAL_EQUAL,    INT_CMD,        MATRIX_CMD, MATRIX_CMD }
1924,{jjWRONG2,    EQUAL_EQUAL,    0,              IDEAL_CMD,  IDEAL_CMD }
1925,{jjWRONG2,    EQUAL_EQUAL,    0,              MODUL_CMD,  MODUL_CMD }
1926,{jjEQUAL_I,   NOTEQUAL,       INT_CMD,        INT_CMD,    INT_CMD }
1927,{jjEQUAL_N,   NOTEQUAL,       INT_CMD,        NUMBER_CMD, NUMBER_CMD }
1928,{jjCOMPARE_S, NOTEQUAL,       INT_CMD,        STRING_CMD, STRING_CMD }
1929,{jjEQUAL_P,   NOTEQUAL,       INT_CMD,        POLY_CMD,   POLY_CMD }
1930,{jjEQUAL_P,   NOTEQUAL,       INT_CMD,        VECTOR_CMD, VECTOR_CMD }
1931,{jjCOMPARE_IV,NOTEQUAL,       INT_CMD,        INTVEC_CMD, INTVEC_CMD }
1932,{jjCOMPARE_IV,NOTEQUAL,       INT_CMD,        INTMAT_CMD, INTMAT_CMD }
1933,{jjEQUAL_Ma,  NOTEQUAL,       INT_CMD,        MATRIX_CMD, MATRIX_CMD }
1934,{jjWRONG2,    NOTEQUAL,       0,              IDEAL_CMD,  IDEAL_CMD }
1935,{jjWRONG2,    NOTEQUAL,       0,              MODUL_CMD,  MODUL_CMD }
1936,{jjDOTDOT,    DOTDOT,         INTVEC_CMD,     INT_CMD,    INT_CMD }
1937,{jjINDEX_I,   '[',            INT_CMD,        INTVEC_CMD, INT_CMD }
1938,{jjINDEX_IV,  '[',            INT_CMD,        INTVEC_CMD, INTVEC_CMD }
1939,{jjINDEX_I,   '[',            POLY_CMD,       IDEAL_CMD,  INT_CMD }
1940,{jjINDEX_I,   '[',            POLY_CMD,       MAP_CMD,    INT_CMD }
1941,{jjINDEX_IV,  '[',            POLY_CMD,       IDEAL_CMD,  INTVEC_CMD }
1942,{jjINDEX_I,   '[',            VECTOR_CMD,     MODUL_CMD,  INT_CMD }
1943,{jjINDEX_IV,  '[',            VECTOR_CMD,     MODUL_CMD,  INTVEC_CMD }
1944,{jjINDEX_I,   '[',            STRING_CMD,     STRING_CMD, INT_CMD }
1945,{jjINDEX_IV,  '[',            STRING_CMD,     STRING_CMD, INTVEC_CMD }
1946,{jjINDEX_I,   '[',            ANY_TYPE/*set by p*/,LIST_CMD, INT_CMD }
1947,{jjINDEX_IV,  '[',            ANY_TYPE/*set by p*/,LIST_CMD, INTVEC_CMD }
1948,{jjINDEX_P,   '[',            POLY_CMD,       POLY_CMD,   INT_CMD }
1949,{jjINDEX_P_IV,'[',            POLY_CMD,       POLY_CMD,   INTVEC_CMD }
1950,{jjINDEX_V,   '[',            POLY_CMD,       VECTOR_CMD, INT_CMD }
1951,{jjINDEX_V_IV,'[',            VECTOR_CMD,     VECTOR_CMD, INTVEC_CMD }
1952,{jjPROC,      '(',            ANY_TYPE/*set by p*/,PROC_CMD, DEF_CMD }
1953#ifdef HAVE_DLD
1954,{jjBIN,       '(',            ANY_TYPE/*set by p*/,BIN_CMD, DEF_CMD }
1955#endif
1956,{jjMAP,       '(',            ANY_TYPE/*set by p*/,MAP_CMD, DEF_CMD }
1957,{jjKLAMMER,   '(',            ANY_TYPE/*set by p*/,ANY_TYPE, INT_CMD }
1958,{jjKLAMMER_IV,'(',            ANY_TYPE/*set by p*/,ANY_TYPE, INTVEC_CMD }
1959// and the procedures with 2 arguments:
1960,{atATTRIB2,   ATTRIB_CMD,     NONE/*set by p*/,DEF_CMD,   STRING_CMD }
1961,{jjCOEF,      COEF_CMD,       MATRIX_CMD,     POLY_CMD,   POLY_CMD }
1962,{jjCOEFFS_Id, COEFFS_CMD,     MATRIX_CMD,     IDEAL_CMD,  POLY_CMD }
1963,{jjCOEFFS_Id, COEFFS_CMD,     MATRIX_CMD,     MODUL_CMD,  POLY_CMD }
1964,{jjCONTRACT,  CONTRACT_CMD,   MATRIX_CMD,     IDEAL_CMD,  IDEAL_CMD }
1965,{jjDEG_IV,    DEG_CMD,        INT_CMD,        POLY_CMD,   INTVEC_CMD }
1966,{lDelete,     DELETE_CMD,     LIST_CMD,       LIST_CMD,   INT_CMD }
1967,{jjDIFF_P,    DIFF_CMD,       POLY_CMD,       POLY_CMD,   POLY_CMD }
1968,{jjDIFF_P,    DIFF_CMD,       VECTOR_CMD,     VECTOR_CMD, POLY_CMD }
1969,{jjDIFF_ID,   DIFF_CMD,       IDEAL_CMD,      IDEAL_CMD,  POLY_CMD }
1970,{jjDIFF_ID_ID,DIFF_CMD,       MATRIX_CMD,     IDEAL_CMD,  IDEAL_CMD }
1971,{jjDIFF_ID,   DIFF_CMD,       MODUL_CMD,      MODUL_CMD,  POLY_CMD }
1972,{jjDIFF_ID,   DIFF_CMD,       MATRIX_CMD,     MATRIX_CMD, POLY_CMD }
1973,{jjDIM2,      DIM_CMD,        INT_CMD,        IDEAL_CMD,  IDEAL_CMD }
1974,{jjDIM2,      DIM_CMD,        INT_CMD,        MODUL_CMD,  IDEAL_CMD }
1975,{jjELIMIN,    ELIMINATION_CMD,IDEAL_CMD,      IDEAL_CMD,  POLY_CMD }
1976,{jjELIMIN,    ELIMINATION_CMD,MODUL_CMD,      MODUL_CMD,  POLY_CMD }
1977,{jjEXTGCD_I,  EXTGCD_CMD,     LIST_CMD,       INT_CMD,    INT_CMD }
1978#ifdef HAVE_LIBFACTORY
1979,{jjEXTGCD_P,  EXTGCD_CMD,     LIST_CMD,       POLY_CMD,   POLY_CMD }
1980,{jjSQR_FREE_DEC,FAC_CMD,      IDEAL_CMD,      POLY_CMD,   INT_CMD }
1981,{jjFACSTD2,    FACSTD_CMD,    LIST_CMD,       IDEAL_CMD,  IDEAL_CMD }
1982#else
1983,{jjWRONG2,    EXTGCD_CMD,     LIST_CMD,       POLY_CMD,   POLY_CMD }
1984,{jjWRONG2,    FAC_CMD,        IDEAL_CMD,      POLY_CMD,   INT_CMD }
1985,{jjWRONG2,    FACSTD_CMD,     LIST_CMD,       IDEAL_CMD,  IDEAL_CMD }
1986#endif
1987,{jjFETCH,     FETCH_CMD,      ANY_TYPE/*set by p*/,RING_CMD,  ANY_TYPE }
1988,{jjFETCH,     FETCH_CMD,      ANY_TYPE/*set by p*/,QRING_CMD, ANY_TYPE }
1989#ifdef HAVE_FGLM
1990,{fglmProc,    FGLM_CMD,       IDEAL_CMD,      RING_CMD,   DEF_CMD }
1991,{fglmProc,    FGLM_CMD,       IDEAL_CMD,      QRING_CMD,  DEF_CMD }
1992#endif
1993,{jjFIND2,     FIND_CMD,       INT_CMD,        STRING_CMD, STRING_CMD }
1994,{jjGCD_I,     GCD_CMD,        INT_CMD,        INT_CMD,    INT_CMD }
1995#ifdef HAVE_LIBFACTORY
1996,{jjGCD_P,     GCD_CMD,        POLY_CMD,       POLY_CMD,   POLY_CMD }
1997#else
1998,{jjWRONG2,    GCD_CMD,        POLY_CMD,       POLY_CMD,   POLY_CMD }
1999#endif
2000,{jjHILBERT2,  HILBERT_CMD,    INTVEC_CMD,     IDEAL_CMD,  INT_CMD }
2001,{jjHILBERT2,  HILBERT_CMD,    INTVEC_CMD,     MODUL_CMD,  INT_CMD }
2002,{jjHOMOG_P,   HOMOG_CMD,      POLY_CMD,       POLY_CMD,   POLY_CMD }
2003,{jjHOMOG_P,   HOMOG_CMD,      VECTOR_CMD,     VECTOR_CMD, POLY_CMD }
2004,{jjHOMOG_ID,  HOMOG_CMD,      IDEAL_CMD,      IDEAL_CMD,  POLY_CMD }
2005,{jjHOMOG_ID,  HOMOG_CMD,      MODUL_CMD,      MODUL_CMD,  POLY_CMD }
2006,{jjCALL2MANY, IDEAL_CMD,      IDEAL_CMD,      DEF_CMD,    DEF_CMD }
2007,{jjFETCH,     IMAP_CMD,       ANY_TYPE/*set by p*/,RING_CMD,  ANY_TYPE }
2008,{jjFETCH,     IMAP_CMD,       ANY_TYPE/*set by p*/,QRING_CMD, ANY_TYPE }
2009,{lInsert,     INSERT_CMD,     LIST_CMD,       LIST_CMD,   DEF_CMD }
2010,{jjINTERSECT, INTERSECT_CMD,  IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD }
2011,{jjINTERSECT, INTERSECT_CMD,  MODUL_CMD,      MODUL_CMD,  MODUL_CMD }
2012,{jjJET_P,     JET_CMD,        POLY_CMD,       POLY_CMD,   INT_CMD }
2013,{jjJET_ID,    JET_CMD,        IDEAL_CMD,      IDEAL_CMD,  INT_CMD }
2014,{jjJET_P,     JET_CMD,        VECTOR_CMD,     VECTOR_CMD, INT_CMD }
2015,{jjJET_ID,    JET_CMD,        MODUL_CMD,      MODUL_CMD,  INT_CMD }
2016,{atKILLATTR2, KILLATTR_CMD,   NONE,           IDHDL,      STRING_CMD }
2017,{jjKoszul,    KOSZUL_CMD,     MATRIX_CMD,     INT_CMD,    INT_CMD }
2018,{jjKoszul_Id, KOSZUL_CMD,     MATRIX_CMD,     INT_CMD,    IDEAL_CMD }
2019,{jjLIFT,      LIFT_CMD,       MATRIX_CMD,     IDEAL_CMD,  IDEAL_CMD }
2020,{jjLIFT,      LIFT_CMD,       MATRIX_CMD,     MODUL_CMD,  MODUL_CMD }
2021,{jjLIFTSTD,   LIFTSTD_CMD,    IDEAL_CMD,      IDEAL_CMD,  MATRIX_CMD }
2022,{jjLIFTSTD,   LIFTSTD_CMD,    MODUL_CMD,      MODUL_CMD,  MATRIX_CMD }
2023,{jjCALL2MANY, LIST_CMD,       LIST_CMD,       DEF_CMD,    DEF_CMD }
2024,{jjMINOR,     MINOR_CMD,      IDEAL_CMD,      MATRIX_CMD, INT_CMD }
2025,{jjCALL2MANY, MODUL_CMD,      MODUL_CMD,      DEF_CMD,    DEF_CMD }
2026,{jjMODULO,    MODULO_CMD,     MODUL_CMD,      IDEAL_CMD,  IDEAL_CMD }
2027,{jjMODULO,    MODULO_CMD,     MODUL_CMD,      MODUL_CMD,  MODUL_CMD }
2028,{jjMONITOR2,  MONITOR_CMD,    NONE,           STRING_CMD, STRING_CMD }
2029,{jjRES,       MRES_CMD,       LIST_CMD,       IDEAL_CMD,  INT_CMD }
2030,{jjRES,       MRES_CMD,       LIST_CMD,       MODUL_CMD,  INT_CMD }
2031,{jjPARSTR2,   PARSTR_CMD,     STRING_CMD,     RING_CMD,   INT_CMD }
2032,{jjPARSTR2,   PARSTR_CMD,     STRING_CMD,     QRING_CMD,  INT_CMD }
2033,{jjPRINT_FORMAT, PRINT_CMD,   NONE,           DEF_CMD,    STRING_CMD }
2034,{jjQUOT,      QUOTIENT_CMD,   IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD }
2035,{jjQUOT,      QUOTIENT_CMD,   MODUL_CMD,      MODUL_CMD,  IDEAL_CMD }
2036,{jjQUOT,      QUOTIENT_CMD,   IDEAL_CMD,      MODUL_CMD,  MODUL_CMD }
2037,{jjRANDOM,    RANDOM_CMD,     INT_CMD,        INT_CMD,    INT_CMD }
2038,{jjREAD2,     READ_CMD,       STRING_CMD,     LINK_CMD,   STRING_CMD }
2039,{jjREDUCE_P,  REDUCE_CMD,     POLY_CMD,       POLY_CMD,   IDEAL_CMD }
2040,{jjREDUCE_P,  REDUCE_CMD,     VECTOR_CMD,     VECTOR_CMD, IDEAL_CMD }
2041,{jjREDUCE_P,  REDUCE_CMD,     VECTOR_CMD,     VECTOR_CMD, MODUL_CMD }
2042,{jjREDUCE_ID, REDUCE_CMD,     IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD }
2043,{jjREDUCE_ID, REDUCE_CMD,     MODUL_CMD,      MODUL_CMD,  MODUL_CMD }
2044,{jjREDUCE_ID, REDUCE_CMD,     MODUL_CMD,      MODUL_CMD,  IDEAL_CMD }
2045,{jjRES,       RES_CMD,        LIST_CMD,       IDEAL_CMD,  INT_CMD }
2046,{jjRES,       RES_CMD,        LIST_CMD,       MODUL_CMD,  INT_CMD }
2047,{jjSTATUS2,   STATUS_CMD,     STRING_CMD,     LINK_CMD,   STRING_CMD}
2048,{jjSIMPL_P,   SIMPLIFY_CMD,   POLY_CMD,       POLY_CMD,   INT_CMD }
2049,{jjSIMPL_P,   SIMPLIFY_CMD,   VECTOR_CMD,     VECTOR_CMD, INT_CMD }
2050,{jjSIMPL_ID,  SIMPLIFY_CMD,   IDEAL_CMD,      IDEAL_CMD,  INT_CMD }
2051,{jjSIMPL_ID,  SIMPLIFY_CMD,   MODUL_CMD,      MODUL_CMD,  INT_CMD }
2052,{jjRES,       SRES_CMD,       LIST_CMD,       IDEAL_CMD,  INT_CMD }
2053,{jjRES,       SRES_CMD,       LIST_CMD,       MODUL_CMD,  INT_CMD }
2054,{jjCALL2MANY, SYSTEM_CMD,     ANY_TYPE/*set by p*/,STRING_CMD, DEF_CMD }
2055,{jjSTD_1,     STD_CMD,        IDEAL_CMD,      IDEAL_CMD,  POLY_CMD }
2056,{jjSTD_1,     STD_CMD,        MODUL_CMD,      MODUL_CMD,  VECTOR_CMD }
2057,{jjSTD_HILB,  STD_CMD,        IDEAL_CMD,      IDEAL_CMD,  INTVEC_CMD }
2058,{jjSTD_HILB,  STD_CMD,        MODUL_CMD,      MODUL_CMD,  INTVEC_CMD }
2059,{jjVARSTR2,   VARSTR_CMD,     STRING_CMD,     RING_CMD,   INT_CMD }
2060,{jjVARSTR2,   VARSTR_CMD,     STRING_CMD,     QRING_CMD,  INT_CMD }
2061,{jjWEDGE,     WEDGE_CMD,      MATRIX_CMD,     MATRIX_CMD, INT_CMD }
2062,{NULL,        0,              0,              0,          0 }
2063};
2064/*=================== operations with 1 arg.: static proc =================*/
2065static BOOLEAN jjDUMMY(leftv res, leftv u)
2066{
2067  res->data = (char *)u->CopyD();
2068  return FALSE;
2069}
2070//static BOOLEAN jjPLUSPLUS(leftv res, leftv u)
2071//{
2072//  res->data = (char *)((int)u->Data()+1);
2073//  return FALSE;
2074//}
2075//static BOOLEAN jjMINUSMINUS(leftv res, leftv u)
2076//{
2077//  res->data = (char *)((int)u->Data()-1);
2078//  return FALSE;
2079//}
2080static BOOLEAN jjPLUSPLUS(leftv res, leftv u)
2081{
2082  if (IDTYP((idhdl)u->data)==INT_CMD)
2083  {
2084    if (iiOp==PLUSPLUS) IDINT((idhdl)u->data)++;
2085    else                IDINT((idhdl)u->data)--;
2086    return FALSE;
2087  }
2088  return TRUE;
2089}
2090static BOOLEAN jjUMINUS_I(leftv res, leftv u)
2091{
2092  res->data = (char *)(-(int)u->Data());
2093  return FALSE;
2094}
2095static BOOLEAN jjUMINUS_N(leftv res, leftv u)
2096{
2097  number n=nNeg((number)u->CopyD());
2098  res->data = (char *)n;
2099  return FALSE;
2100}
2101static BOOLEAN jjUMINUS_P(leftv res, leftv u)
2102{
2103  res->data = (char *)pNeg((poly)u->CopyD(POLY_CMD));
2104  return FALSE;
2105}
2106static BOOLEAN jjUMINUS_MA(leftv res, leftv u)
2107{
2108  poly m1=pISet(-1);
2109  res->data = (char *)mpMultP((matrix)u->CopyD(MATRIX_CMD),m1);
2110  return FALSE;
2111}
2112static BOOLEAN jjUMINUS_IV(leftv res, leftv u)
2113{
2114  intvec *iv=(intvec *)u->CopyD(INTVEC_CMD);
2115  (*iv)*=(-1);
2116  res->data = (char *)iv;
2117  return FALSE;
2118}
2119static BOOLEAN jjPROC1(leftv res, leftv u)
2120{
2121  leftv sl = iiMake_proc((idhdl)u->data,NULL);
2122  if (sl==NULL)
2123  {
2124    return TRUE;
2125  }
2126  else
2127  {
2128    memcpy(res,sl,sizeof(sleftv));
2129  }   
2130  return FALSE;
2131}
2132#ifdef HAVE_DLD
2133static BOOLEAN jjBIN1(leftv res, leftv u)
2134{
2135  leftv sl = iiMake_binary((idhdl)u->data,NULL);
2136  if (sl==NULL)
2137  {
2138    res->rtyp=NONE;
2139  }
2140  else
2141  {
2142    memcpy(res,sl,sizeof(sleftv));
2143    Free((ADDRESS)sl,sizeof(sleftv));
2144  }   
2145  return FALSE;
2146}
2147#endif
2148static BOOLEAN jjBAREISS(leftv res, leftv v)
2149{
2150  matrix m=(matrix)v->Data();
2151  m=mpBareiss(m,FALSE);
2152  res->data = (char *)m;
2153  return FALSE;
2154}
2155static BOOLEAN jjBAREISS_IM(leftv res, leftv v)
2156{
2157  intvec *m=(intvec *)v->CopyD();
2158  ivTriangMat(m,1,1);
2159  res->data = (char *)m;
2160  return FALSE;
2161}
2162static BOOLEAN jjCALL1MANY(leftv res, leftv u)
2163{
2164  return iiExprArithM(res,u,iiOp);
2165}
2166static BOOLEAN jjCHAR(leftv res, leftv v)
2167{
2168  res->data = (char *)rChar((ring)v->Data());
2169  return FALSE;
2170}
2171static BOOLEAN jjCOLS(leftv res, leftv v)
2172{
2173  res->data = (char *)MATCOLS((matrix)(v->Data()));
2174  return FALSE;
2175}
2176static BOOLEAN jjCOLS_IV(leftv res, leftv v)
2177{
2178  res->data = (char *)((intvec*)(v->Data()))->cols();
2179  return FALSE;
2180}
2181static BOOLEAN jjCONTENT(leftv res, leftv v)
2182{
2183  poly p=(poly)v->CopyD();
2184  pCleardenom(p);
2185  res->data = (char *)p;
2186  return FALSE;
2187}
2188static BOOLEAN jjCOUNT_N(leftv res, leftv v)
2189{
2190  res->data = (char *)nSize((number)v->Data());
2191  return FALSE;
2192}
2193static BOOLEAN jjCOUNT_L(leftv res, leftv v)
2194{
2195  lists l=(lists)v->Data();
2196  res->data = (char *)(l->nr+1);
2197  return FALSE;
2198}
2199static BOOLEAN jjCOUNT_M(leftv res, leftv v)
2200{
2201  matrix m=(matrix)v->Data();
2202  res->data = (char *)(MATROWS(m)*MATCOLS(m));
2203  return FALSE;
2204}
2205static BOOLEAN jjCOUNT_IV(leftv res, leftv v)
2206{
2207  res->data = (char *)((intvec*)(v->Data()))->length();
2208  return FALSE;
2209}
2210static BOOLEAN jjDEG(leftv res, leftv v)
2211{
2212  int dummy;
2213  poly p=(poly)v->Data();
2214  if (p!=NULL) res->data = (char *)pLDeg(p,&dummy);
2215  else res->data=(char *)-1;
2216  return FALSE;
2217}
2218static BOOLEAN jjDEGREE(leftv res, leftv v)
2219{
2220  assumeStdFlag(v);
2221  scDegree((ideal)v->Data(),currQuotient);
2222  return FALSE;
2223}
2224static BOOLEAN jjDEFINED(leftv res, leftv v)
2225{
2226  if ((v->rtyp==IDHDL)
2227  && ((myynest==IDLEV((idhdl)v->data))||(0==IDLEV((idhdl)v->data))))
2228  {
2229    res->data=(void *)(IDLEV((idhdl)v->data)+1);
2230  }
2231  else if (v->rtyp!=0) res->data=(void *)(-1);
2232  return FALSE;
2233}
2234#ifdef HAVE_LIBFACTORY
2235static BOOLEAN jjDET(leftv res, leftv v)
2236{
2237  int i,j;
2238  matrix m=(matrix)v->Data();
2239  if (currRing->parameter==NULL)
2240  {
2241    for(i=1;i<=m->rows();i++)
2242    {
2243      for(j=1;j<=m->cols();j++)
2244      {
2245        if((MATELEM(m,i,j)!=NULL)
2246        && (!pIsConstant(MATELEM(m,i,j))))
2247        {
2248          goto nonconst;
2249        }
2250      }
2251    }
2252
2253    res->data = (char *)singclap_det((matrix)(v->Data()));
2254    return FALSE;
2255  }
2256nonconst:
2257  res->data = (char *)mpDet((matrix)(v->Data()));
2258  return FALSE;
2259}
2260#endif
2261static BOOLEAN jjDIM(leftv res, leftv v)
2262{
2263  assumeStdFlag(v);
2264  res->data = (char *)scDimInt((ideal)(v->Data()),currQuotient);
2265  return FALSE;
2266}
2267static BOOLEAN jjDUMP(leftv res, leftv v)
2268{
2269  si_link l = (si_link)v->Data();
2270  if (slDump(l))
2271  {
2272    const char *s;
2273    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
2274    else                            s=sNoName;
2275    Werror("cannot dump to `%s`",s);
2276    return TRUE;
2277  }
2278  else
2279    return FALSE;
2280}
2281static BOOLEAN jjE(leftv res, leftv v)
2282{
2283  res->data = (char *)pOne();
2284  pSetComp((poly)res->data,(int)v->Data());
2285  return FALSE;
2286}
2287static BOOLEAN jjGETDUMP(leftv res, leftv v)
2288{
2289  si_link l = (si_link)v->Data();
2290  if (slGetDump(l))
2291  {
2292    const char *s;
2293    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
2294    else                            s=sNoName;
2295    Werror("cannot get dump from `%s`",s);
2296    return TRUE;
2297  }
2298  else
2299    return FALSE;
2300}
2301#ifdef HAVE_LIBFACTORY
2302static BOOLEAN jjFACSTD(leftv res, leftv v)
2303{
2304  res->data=(void *)stdfac((ideal)v->Data(),NULL,testHomog,NULL);
2305  setFlag(res,FLAG_STD);
2306  return FALSE;
2307}
2308#endif
2309static BOOLEAN jjHILBERT(leftv res, leftv v)
2310{
2311  assumeStdFlag(v);
2312  intvec *module_w=(intvec*)atGet(v,"isHomog");
2313  //scHilbertPoly((ideal)v->Data(),currQuotient);
2314  hLookSeries((ideal)v->Data(),module_w,currQuotient);
2315  return FALSE;
2316}
2317static BOOLEAN jjHILBERT_IV(leftv res, leftv v)
2318{
2319  res->data=(void *)hSecondSeries((intvec *)v->Data());
2320  return FALSE;
2321}
2322static BOOLEAN jjHOMOG1(leftv res, leftv v)
2323{
2324  intvec *w;
2325  res->data=(void *)idHomModule((ideal)v->Data(),currQuotient,&w);
2326  if ((v->rtyp==IDHDL)&&(w!=NULL))
2327    atSet((idhdl)v->data,mstrdup("isHomog"),w,INTVEC_CMD);
2328  return FALSE;
2329}
2330static BOOLEAN jjIDEAL_Ma(leftv res, leftv v)
2331{
2332  matrix mat=(matrix)v->CopyD();
2333  IDELEMS((ideal)mat)=MATCOLS(mat)*MATROWS(mat);
2334  MATROWS(mat)=1;
2335  mat->rank=1;
2336  res->data=(char *)mat;
2337  return FALSE;
2338}
2339static BOOLEAN jjIDEAL_R(leftv res, leftv v)
2340{
2341  if (currRing!=NULL)
2342  {
2343    ring q=(ring)v->Data();
2344    if ((q->ch==currRing->ch)
2345    && (q->N==currRing->N)) /* && varnames equ. */
2346    {
2347      if (q->qideal==NULL)
2348        res->data=(char *)idInit(1,1);
2349      else
2350        res->data=(char *)idCopy(q->qideal);
2351      return FALSE;
2352    }
2353  }
2354  return TRUE;
2355}
2356static BOOLEAN jjIm2Iv(leftv res, leftv v)
2357{
2358  intvec *iv = (intvec *)v->CopyD();
2359  iv->makeVector();
2360  res->data = iv;
2361  return FALSE;
2362}
2363static BOOLEAN jjINDEPSET(leftv res, leftv v)
2364{
2365  res->data=(void *)scIndIntvec((ideal)(v->Data()),currQuotient);
2366  return FALSE;
2367}
2368static BOOLEAN jjINTERRED(leftv res, leftv v)
2369{
2370  ideal result=kInterRed((ideal)(v->Data()),currQuotient);
2371  //if (result==NULL) return TRUE;
2372  idSkipZeroes(result);
2373  res->data = result;
2374  return FALSE;
2375}
2376static BOOLEAN jjIS_RINGVAR_P(leftv res, leftv v)
2377{
2378  res->data = (char *)pVar((poly)v->Data());
2379  return FALSE;
2380}
2381static BOOLEAN jjIS_RINGVAR_S(leftv res, leftv v)
2382{
2383  res->data = (char *)(rIsRingVar((char *)v->Data())+1);
2384  return FALSE;
2385}
2386static BOOLEAN jjIS_RINGVAR0(leftv res, leftv v)
2387{
2388  res->data = (char *)0;
2389  return FALSE;
2390}
2391static BOOLEAN jjJACOB_P(leftv res, leftv v)
2392{
2393  ideal i=idInit(pVariables,1);
2394  int k;
2395  for (k=0;k<pVariables;k++)
2396  {
2397    i->m[k]=pDiff(pCopy((poly)(v->Data())),k+1);
2398  }
2399  res->data = (char *)i;
2400  return FALSE;
2401}
2402static BOOLEAN jjKBASE(leftv res, leftv v)
2403{
2404  assumeStdFlag(v);
2405  res->data = (char *)scKBase((ideal)(v->Data()),currQuotient);
2406  return FALSE;
2407}
2408#ifdef MDEBUG
2409static BOOLEAN jjpHead(leftv res, leftv v)
2410{
2411  res->data=(char *)pHead((poly)v->Data());
2412  return FALSE;
2413}
2414#endif
2415static BOOLEAN jjLEADCOEF(leftv res, leftv v)
2416{
2417  poly p=(poly)v->Data();
2418  if (p==NULL)
2419  {
2420    res->data=(char *)nInit(0);
2421  }
2422  else
2423  {
2424    res->data=(char *)nCopy(pGetCoeff(p));
2425  }
2426  return FALSE;
2427}
2428static BOOLEAN jjLEADEXP(leftv res, leftv v)
2429{
2430  poly p=(poly)v->Data();
2431  intvec *iv=new intvec(pVariables);
2432  if (p!=NULL)
2433  {
2434    for(int i=0;i<pVariables;i++)
2435    {
2436      (*iv)[i]=pGetExp(p,i+1);
2437    }
2438  }
2439  res->data=(char *)iv;
2440  return FALSE;
2441}
2442static BOOLEAN jjMEMORY(leftv res, leftv v)
2443{
2444#ifdef MM_COUNT
2445  switch(((int)v->Data()))
2446  {
2447  case 0:
2448    res->data = (char *)mmMemUsed();
2449    break;
2450  case 1:
2451    res->data = (char *)mmMemReal();
2452    break;
2453  default:
2454#ifdef MM_STAT
2455    mmStat((int)v->Data());
2456#endif
2457    res->data = (char *)0;
2458  }
2459  return FALSE;
2460#else
2461  res->data = (char *)0;
2462  return FALSE;
2463#endif
2464}
2465static BOOLEAN jjMONITOR1(leftv res, leftv v)
2466{
2467  monitor((char *)(v->Data()),PROT_I);
2468  return FALSE;
2469}
2470static BOOLEAN jjMSTD(leftv res, leftv v)
2471{
2472  res->data=(void *)min_std((ideal)v->Data(),currQuotient,testHomog,NULL);
2473  return FALSE;
2474}
2475static BOOLEAN jjMULT(leftv res, leftv v)
2476{
2477  assumeStdFlag(v);
2478  res->data = (char *)scMultInt((ideal)(v->Data()),currQuotient);
2479  return FALSE;
2480}
2481static BOOLEAN jjNAMEOF(leftv res, leftv v)
2482{
2483  res->data = (char *)v->name;
2484  if (res->data==NULL) res->data=mstrdup("");
2485  v->name=NULL;
2486  return FALSE;
2487}
2488static BOOLEAN jjNAMES(leftv res, leftv v)
2489{
2490  res->data=ipNameList(((ring)v->Data())->idroot);
2491  return FALSE;
2492}
2493static BOOLEAN jjNVARS(leftv res, leftv v)
2494{
2495  res->data = (char *)(((ring)(v->Data()))->N);
2496  return FALSE;
2497}
2498static BOOLEAN jjOpenClose(leftv res, leftv v)
2499{
2500  si_link l=(si_link)v->Data();
2501  if (iiOp==OPEN_CMD) return slOpen(l, SI_LINK_OPEN);
2502  else                return slClose(l);
2503}
2504static BOOLEAN jjORD(leftv res, leftv v)
2505{
2506  poly p=(poly)v->Data();
2507  res->data=(char *)( p==NULL ? -1 : pFDeg(p) );
2508  return FALSE;
2509}
2510static BOOLEAN jjPAR1(leftv res, leftv v)
2511{
2512  int i=(int)v->Data();
2513  int p=0;
2514  p=rPar(currRing);
2515  if ((0<i) && (i<=p))
2516  {
2517    res->data=(char *)nPar(i);
2518  }
2519  else
2520  {
2521    Werror("par number %d out of range 1..%d",i,p);
2522    return TRUE;
2523  }
2524  return FALSE;
2525}
2526static BOOLEAN jjPARDEG(leftv res, leftv v)
2527{
2528  res->data = (char *)nParDeg((number)v->Data());
2529  return FALSE;
2530}
2531static BOOLEAN jjPARSTR1(leftv res, leftv v)
2532{
2533  if (currRing==NULL)
2534  {
2535    WerrorS("no ring active");
2536    return TRUE;
2537  }
2538  int i=(int)v->Data();
2539  int p=0;
2540  if ((0<i) && (currRing->parameter!=NULL) && (i<=(p=rPar(currRing))))
2541    res->data=mstrdup(currRing->parameter[i-1]);
2542  else
2543  {
2544    Werror("par number %d out of range 1..%d",i,p);
2545    return TRUE;
2546  }
2547  return FALSE;
2548}
2549static BOOLEAN jjP2I(leftv res, leftv v)
2550{
2551  poly p=(poly)v->Data();
2552  if (p==NULL) { /*res->data=(char *)0;*/ return FALSE; }
2553  if ((pNext(p)!=NULL)|| (!pIsConstant(p)))
2554  {
2555    WerrorS("poly must be constant");
2556    return TRUE;
2557  }
2558  res->data = (char *)nInt(pGetCoeff(p));
2559  return FALSE;
2560}
2561static BOOLEAN jjPRIME(leftv res, leftv v)
2562{
2563  int i = IsPrime((int)(v->Data()));
2564  res->data = (char *)(i > 1 ? i : 2);
2565  return FALSE;
2566}
2567static BOOLEAN jjP2N(leftv res, leftv v)
2568{
2569  number n;
2570  poly p;
2571  if (((p=(poly)v->Data())!=NULL)
2572  && (pIsConstant(p)))
2573  {
2574    n=nCopy(pGetCoeff(p));
2575  }
2576  else
2577  {
2578    n=nInit(0);
2579  }
2580  res->data = (char *)n;
2581  return FALSE;
2582}
2583static BOOLEAN jjRESERVEDNAME(leftv res, leftv v)
2584{
2585  char *s= (char *)v->Data();
2586  int i = 1;
2587  int l = strlen(s);
2588  while (cmds[i].tokval!=0)
2589  {
2590    if (strcmp(s, cmds[i].name) == 0)
2591    {
2592      res->data = (char *)1;
2593      return FALSE;
2594    }
2595    i++;
2596  }
2597  //res->data = (char *)0;
2598  return FALSE;
2599}
2600static BOOLEAN jjREAD(leftv res, leftv v)
2601{
2602  return jjREAD2(res,v,NULL);
2603}
2604static BOOLEAN jjREGULARITY(leftv res, leftv v)
2605{
2606  res->data = (char *)iiRegularity((lists)v->Data());
2607  return FALSE;
2608}
2609static BOOLEAN jjROWS(leftv res, leftv v)
2610{
2611  ideal i = (ideal)v->Data();
2612  res->data = (char *)i->rank;
2613  return FALSE;
2614}
2615static BOOLEAN jjROWS_IV(leftv res, leftv v)
2616{
2617  res->data = (char *)((intvec*)(v->Data()))->rows();
2618  return FALSE;
2619}
2620static BOOLEAN jjRPAR(leftv res, leftv v)
2621{
2622  res->data = (char *)((ring)v->Data())->P;
2623  return FALSE;
2624}
2625static BOOLEAN jjSTD(leftv res, leftv v)
2626{
2627  ideal result;
2628  intvec *w=(intvec *)atGet(v,"isHomog");
2629  tHomog hom=testHomog;
2630  if (w!=NULL)
2631  {
2632    w=ivCopy(w);
2633    hom=isHomog;
2634  }
2635  //if (hasFlag(v,FLAG_STD))
2636  //  result=stdred((ideal)v->Data(),currQuotient,hom,&w);
2637  //else
2638    result=std((ideal)(v->Data()),currQuotient,hom,&w);
2639  idSkipZeroes(result);
2640  res->data = (char *)result;
2641  setFlag(res,FLAG_STD);
2642  if (w!=NULL) atSet(res,mstrdup("isHomog"),w,INTVEC_CMD);
2643  return FALSE;
2644}
2645static BOOLEAN jjSTRING(leftv res, leftv v)
2646{
2647  res->data = (char *)v->String();
2648  if (res->data==NULL)
2649  {
2650    Werror("cannot convert %s to string",Tok2Cmdname(v->Typ()));
2651    return TRUE;
2652  }
2653  return FALSE;
2654}
2655static BOOLEAN jjSort_Id(leftv res, leftv v)
2656{
2657  res->data = (char *)idSort((ideal)v->Data());
2658  return FALSE;
2659}
2660static BOOLEAN jjSTRING_PROC(leftv res, leftv v)
2661{
2662#ifdef SIC
2663  if (sic) { MYYERROR("not implemented"); return TRUE;}
2664#endif
2665  res->data=mstrdup(IDSTRING((idhdl)v->data));
2666  return FALSE;
2667}
2668static BOOLEAN jjSYZYGY(leftv res, leftv v)
2669{
2670  intvec *w=NULL;
2671  res->data = (char *)idSyzygies((ideal)v->Data(),currQuotient,testHomog,&w);
2672  if (w!=NULL) delete w;
2673  return FALSE;
2674}
2675static BOOLEAN jjTRACE_IV(leftv res, leftv v)
2676{
2677  res->data = (char *)ivTrace((intvec*)(v->Data()));
2678  return FALSE;
2679}
2680static BOOLEAN jjTRANSP_IV(leftv res, leftv v)
2681{
2682  res->data = (char *)ivTranp((intvec*)(v->Data()));
2683  return FALSE;
2684}
2685static BOOLEAN jjTYPEOF(leftv res, leftv v)
2686{
2687  switch ((int)v->data)
2688  {
2689    case INT_CMD:     res->data=mstrdup("int"); break;
2690    case POLY_CMD:   res->data=mstrdup("poly"); break;
2691    case VECTOR_CMD:  res->data=mstrdup("vector"); break;
2692    case STRING_CMD:  res->data=mstrdup("string"); break;
2693    case INTVEC_CMD:  res->data=mstrdup("intvec"); break;
2694    case IDEAL_CMD:   res->data=mstrdup("ideal"); break;
2695    case MATRIX_CMD: res->data=mstrdup("matrix"); break;
2696    case MODUL_CMD:   res->data=mstrdup("module"); break;
2697    case MAP_CMD:     res->data=mstrdup("map"); break;
2698    case PROC_CMD:    res->data=mstrdup("proc"); break;
2699    case RING_CMD:    res->data=mstrdup("ring"); break;
2700    case QRING_CMD:   res->data=mstrdup("qring"); break;
2701    case INTMAT_CMD:  res->data=mstrdup("intmat"); break;
2702    case NUMBER_CMD:  res->data=mstrdup("number"); break;
2703    case LIST_CMD:   res->data=mstrdup("list"); break;
2704    case PACKAGE_CMD: res->data=mstrdup("package"); break;
2705    case LINK_CMD:   res->data=mstrdup("link"); break; 
2706    case DEF_CMD:
2707    case NONE:    res->data=mstrdup("none"); break;
2708    default:       res->data=mstrdup("?unknown type?");
2709  }
2710  return FALSE;
2711}
2712static BOOLEAN jjVAR1(leftv res, leftv v)
2713{
2714  int i=(int)v->Data();
2715  if ((0<i) && (i<=currRing->N))
2716  {
2717    poly p=pOne();
2718    pSetExp(p,i,1);
2719    pSetm(p);
2720    res->data=(char *)p;
2721  }
2722  else
2723  {
2724    Werror("var number %d out of range 1..%d",i,currRing->N);
2725    return TRUE;
2726  }
2727  return FALSE;
2728}
2729static BOOLEAN jjVARSTR1(leftv res, leftv v)
2730{
2731  if (currRing==NULL)
2732  {
2733    WerrorS("no ring active");
2734    return TRUE;
2735  }
2736  int i=(int)v->Data();
2737  if ((0<i) && (i<=currRing->N))
2738    res->data=mstrdup(currRing->names[i-1]);
2739  else
2740  {
2741    Werror("var number %d out of range 1..%d",i,currRing->N);
2742    return TRUE;
2743  }
2744  return FALSE;
2745}
2746static BOOLEAN jjVDIM(leftv res, leftv v)
2747{
2748  assumeStdFlag(v);
2749  res->data = (char *)scMult0Int((ideal)v->Data(),currQuotient);
2750  return FALSE;
2751}
2752/*=================== operations with 1 arg.: table =================*/
2753
2754#ifdef INIT_BUG
2755#define jjstrlen       (proc1)1
2756#define jjpLength      (proc1)2
2757#define jjidElem       (proc1)3
2758#define jjmpDet        (proc1)4
2759#define jjidFreeModule (proc1)5
2760#define jjidVec2Ideal  (proc1)6
2761#define jjrCharStr     (proc1)7
2762#ifndef MDEBUG
2763#define jjpHead        (proc1)8
2764#endif
2765#define jjidHead       (proc1)9
2766#define jjidMaxIdeal   (proc1)10
2767#define jjidMinBase    (proc1)11
2768#define jjsyMinBase    (proc1)12
2769#define jjpMaxComp     (proc1)13
2770#define jjmpTrace      (proc1)14
2771#define jjmpTransp     (proc1)15
2772#define jjrOrdStr      (proc1)16
2773#define jjrVarStr      (proc1)18
2774#define jjrParStr      (proc1)19
2775#define jjidMinEmbedding (proc1)20
2776
2777extern struct sValCmd1 dArith1[];
2778void jjInitTab1()
2779{
2780  int i=0;
2781  for (;dArith1[i].cmd!=0;i++)
2782  {
2783    if (dArith1[i].res<0)
2784    {
2785      switch ((int)dArith1[i].p)
2786      {
2787        case (int)jjstrlen:       dArith1[i].p=(proc1)strlen; break;
2788        case (int)jjpLength:      dArith1[i].p=(proc1)pLength; break;
2789        case (int)jjidElem:       dArith1[i].p=(proc1)idElem; break;
2790        case (int)jjidVec2Ideal:  dArith1[i].p=(proc1)idVec2Ideal; break;
2791#ifndef HAVE_LIBFACTORY
2792        case (int)jjmpDet:        dArith1[i].p=(proc1)mpDet; break;
2793#endif
2794        case (int)jjidFreeModule: dArith1[i].p=(proc1)idFreeModule; break;
2795        case (int)jjrCharStr:     dArith1[i].p=(proc1)rCharStr; break;
2796#ifndef MDEBUG
2797        case (int)jjpHead:        dArith1[i].p=(proc1)pHead; break;
2798#endif
2799        case (int)jjidHead:       dArith1[i].p=(proc1)idHead; break;
2800        case (int)jjidMaxIdeal:   dArith1[i].p=(proc1)idMaxIdeal; break;
2801        case (int)jjidMinBase:    dArith1[i].p=(proc1)idMinBase; break;
2802        case (int)jjsyMinBase:    dArith1[i].p=(proc1)syMinBase; break;
2803        case (int)jjpMaxComp:     dArith1[i].p=(proc1)pMaxComp; break;
2804        case (int)jjmpTrace:      dArith1[i].p=(proc1)mpTrace; break;
2805        case (int)jjmpTransp:     dArith1[i].p=(proc1)mpTransp; break;
2806        case (int)jjrOrdStr:      dArith1[i].p=(proc1)rOrdStr; break;
2807        case (int)jjrVarStr:      dArith1[i].p=(proc1)rVarStr; break;
2808        case (int)jjrParStr:      dArith1[i].p=(proc1)rParStr; break;
2809        case (int)jjidMinEmbedding: dArith1[i].p=(proc1)idMinEmbedding; break;
2810#ifdef GENTABLE
2811        default: Werror("missing proc1-definition for %d",(int)dArith1[i].p);
2812#endif
2813      }
2814    }
2815  }
2816}
2817#else
2818#define jjstrlen       (proc1)strlen
2819#define jjpLength      (proc1)pLength
2820#define jjidElem       (proc1)idElem
2821#define jjmpDet        (proc1)mpDet
2822#define jjidFreeModule (proc1)idFreeModule
2823#define jjidVec2Ideal  (proc1)idVec2Ideal
2824#define jjrCharStr     (proc1)rCharStr
2825#ifndef MDEBUG
2826#define jjpHead        (proc1)pHead
2827#endif
2828#define jjidHead       (proc1)idHead
2829#define jjidMaxIdeal   (proc1)idMaxIdeal
2830#define jjidMinBase    (proc1)idMinBase
2831#define jjsyMinBase    (proc1)syMinBase
2832#define jjpMaxComp     (proc1)pMaxComp
2833#define jjmpTrace      (proc1)mpTrace
2834#define jjmpTransp     (proc1)mpTransp
2835#define jjrOrdStr      (proc1)rOrdStr
2836#define jjrVarStr      (proc1)rVarStr
2837#define jjrParStr      (proc1)rParStr
2838#define jjidMinEmbedding (proc1)idMinEmbedding
2839#endif
2840BOOLEAN jjnInt(leftv res, leftv u)
2841{
2842  number n=(number)u->CopyD();
2843  res->data=(char *)nInt(n);
2844  nDelete(&n);
2845  return FALSE;
2846}
2847#define s short
2848struct sValCmd1 dArith1[]=
2849{
2850// operations:
2851// proc         cmd               res             arg
2852// {jjPLUSPLUS,   PLUSPLUS,        INT_CMD,        INT_CMD }
2853//,{jjMINUSMINUS, MINUSMINUS,      INT_CMD,        INT_CMD }
2854 {jjPLUSPLUS,   PLUSPLUS,        NONE,           IDHDL }
2855,{jjPLUSPLUS,   MINUSMINUS,      NONE,           IDHDL }
2856,{jjUMINUS_I,   '-',             INT_CMD,        INT_CMD }
2857,{jjUMINUS_N,   '-',             NUMBER_CMD,     NUMBER_CMD }
2858,{jjUMINUS_P,   '-',             POLY_CMD,       POLY_CMD }
2859,{jjUMINUS_P,   '-',             VECTOR_CMD,     VECTOR_CMD }
2860,{jjUMINUS_MA,  '-',             MATRIX_CMD,     MATRIX_CMD }
2861,{jjUMINUS_IV,  '-',             INTVEC_CMD,     INTVEC_CMD }
2862,{jjUMINUS_IV,  '-',             INTMAT_CMD,     INTMAT_CMD }
2863,{jjPROC1,      '(',             ANY_TYPE/*set by p*/,PROC_CMD }
2864#ifdef HAVE_DLD
2865,{jjBIN1,       '(',             ANY_TYPE/*set by p*/,BINARY_CMD }
2866#endif
2867// and the procedures with 1 argument:
2868,{atATTRIB1,    ATTRIB_CMD,      NONE,           DEF_CMD }
2869,{jjBAREISS_IM, BAREISS_CMD,     INTMAT_CMD,     INTMAT_CMD }
2870,{jjBAREISS,    BAREISS_CMD,     MATRIX_CMD,     MATRIX_CMD }
2871,{jjBETTI,      BETTI_CMD,       INTMAT_CMD,     LIST_CMD }
2872,{jjCHAR,       CHARACTERISTIC_CMD, INT_CMD,     RING_CMD }
2873,{jjCHAR,       CHARACTERISTIC_CMD, INT_CMD,     QRING_CMD }
2874#ifdef HAVE_LIBFACTORY
2875,{jjCHARSERIES, CHAR_SERIES_CMD, MATRIX_CMD,     IDEAL_CMD }
2876#else
2877,{jjWRONG,      CHAR_SERIES_CMD, MATRIX_CMD,     IDEAL_CMD }
2878#endif
2879,{jjrCharStr,   CHARSTR_CMD,    -((s)STRING_CMD),RING_CMD }
2880,{jjrCharStr,   CHARSTR_CMD,    -((s)STRING_CMD),QRING_CMD }
2881,{jjOpenClose,  CLOSE_CMD,       NONE,           LINK_CMD }
2882,{jjWRONG,      COLS_CMD,        0,              VECTOR_CMD }
2883,{jjCOLS,       COLS_CMD,        INT_CMD,        MATRIX_CMD }
2884,{jjCOLS,       COLS_CMD,        INT_CMD,        IDEAL_CMD }
2885,{jjCOLS,       COLS_CMD,        INT_CMD,        MODUL_CMD }
2886,{jjCOLS_IV,    COLS_CMD,        INT_CMD,        INTMAT_CMD }
2887,{jjWRONG,      COLS_CMD,        0,              INTVEC_CMD }
2888,{jjCONTENT,    CONTENT_CMD,     POLY_CMD,       POLY_CMD }
2889,{jjCONTENT,    CONTENT_CMD,     VECTOR_CMD,     VECTOR_CMD }
2890,{jjCOUNT_N,    COUNT_CMD,       INT_CMD,        NUMBER_CMD }
2891,{jjstrlen,     COUNT_CMD,      -((s)INT_CMD),   STRING_CMD }
2892,{jjpLength,    COUNT_CMD,      -((s)INT_CMD),   POLY_CMD }
2893,{jjpLength,    COUNT_CMD,      -((s)INT_CMD),   VECTOR_CMD }
2894,{jjidElem,     COUNT_CMD,      -((s)INT_CMD),   IDEAL_CMD }
2895,{jjidElem,     COUNT_CMD,      -((s)INT_CMD),   MODUL_CMD }
2896,{jjCOUNT_M,    COUNT_CMD,       INT_CMD,        MATRIX_CMD }
2897,{jjCOUNT_IV,   COUNT_CMD,       INT_CMD,        INTVEC_CMD }
2898,{jjCOUNT_IV,   COUNT_CMD,       INT_CMD,        INTMAT_CMD }
2899,{jjCOUNT_L,    COUNT_CMD,       INT_CMD,        LIST_CMD }
2900,{jjWRONG,      DEF_CMD,         0,              ANY_TYPE }
2901,{jjDEG,        DEG_CMD,         INT_CMD,        POLY_CMD }
2902,{jjDEG,        DEG_CMD,         INT_CMD,        VECTOR_CMD }
2903,{jjDEGREE,     DEGREE_CMD,      NONE,           IDEAL_CMD }
2904,{jjDEGREE,     DEGREE_CMD,      NONE,           MODUL_CMD }
2905,{jjDEFINED,    DEFINED_CMD,     INT_CMD,        DEF_CMD }
2906#ifdef HAVE_LIBFACTORY
2907,{jjDET,        DET_CMD,         POLY_CMD,       MATRIX_CMD }
2908#else
2909,{jjmpDet,      DET_CMD,        -((s)POLY_CMD),  MATRIX_CMD }
2910#endif
2911,{jjDIM,        DIM_CMD,         INT_CMD,        IDEAL_CMD }
2912,{jjDIM,        DIM_CMD,         INT_CMD,        MODUL_CMD }
2913,{jjDUMP,       DUMP_CMD,        NONE,           LINK_CMD }
2914,{jjE,          E_CMD,           VECTOR_CMD,     INT_CMD }
2915#ifdef HAVE_LIBFACTORY
2916,{jjFAC_P,      FAC_CMD,         LIST_CMD,       POLY_CMD }
2917#else
2918,{jjWRONG,      FAC_CMD,         LIST_CMD,       POLY_CMD }
2919#endif
2920,{jjidFreeModule,FREEMODULE_CMD,-((s)MODUL_CMD), INT_CMD }
2921#ifdef HAVE_LIBFACTORY
2922,{jjFACSTD,     FACSTD_CMD,      LIST_CMD,       IDEAL_CMD }
2923#else
2924,{jjWRONG,      FACSTD_CMD,      LIST_CMD,       IDEAL_CMD }
2925#endif
2926,{jjGETDUMP,    GETDUMP_CMD,     NONE,           LINK_CMD } 
2927,{jjHILBERT,    HILBERT_CMD,     NONE,           IDEAL_CMD }
2928,{jjHILBERT,    HILBERT_CMD,     NONE,           MODUL_CMD }
2929,{jjHILBERT_IV, HILBERT_CMD,     INTVEC_CMD,     INTVEC_CMD }
2930,{jjHOMOG1,     HOMOG_CMD,       INT_CMD,        IDEAL_CMD }
2931,{jjHOMOG1,     HOMOG_CMD,       INT_CMD,        MODUL_CMD }
2932,{jjidVec2Ideal,IDEAL_CMD,      -((s)IDEAL_CMD), VECTOR_CMD }
2933,{jjIDEAL_Ma,   IDEAL_CMD,       IDEAL_CMD,      MATRIX_CMD }
2934,{jjIDEAL_R,    IDEAL_CMD,       IDEAL_CMD,      QRING_CMD }
2935,{jjIDEAL_R,    IDEAL_CMD,       IDEAL_CMD,      RING_CMD }
2936,{jjDUMMY,      IDEAL_CMD,       IDEAL_CMD,      IDEAL_CMD }
2937,{jjINDEPSET,   INDEPSET_CMD,    INTVEC_CMD,     IDEAL_CMD }
2938,{jjDUMMY,      INT_CMD,         INT_CMD,        INT_CMD }
2939,{jjnInt,       INT_CMD,         INT_CMD,        NUMBER_CMD }
2940,{jjP2I,        INT_CMD,         INT_CMD,        POLY_CMD }
2941,{jjINTERRED,   INTERRED_CMD,    IDEAL_CMD,      IDEAL_CMD }
2942,{jjINTERRED,   INTERRED_CMD,    MODUL_CMD,      MODUL_CMD }
2943,{jjDUMMY,      INTMAT_CMD,      INTMAT_CMD,     INTMAT_CMD }
2944,{jjIm2Iv,      INTVEC_CMD,      INTVEC_CMD,     INTMAT_CMD }
2945,{jjDUMMY,      INTVEC_CMD,      INTVEC_CMD,     INTVEC_CMD }
2946,{jjIS_RINGVAR_P, IS_RINGVAR,    INT_CMD,        POLY_CMD }
2947,{jjIS_RINGVAR_S, IS_RINGVAR,    INT_CMD,        STRING_CMD }
2948,{jjIS_RINGVAR0,IS_RINGVAR,      INT_CMD,        ANY_TYPE }
2949,{jjJACOB_P,    JACOB_CMD,       IDEAL_CMD,      POLY_CMD }
2950,{mpJacobi,     JACOB_CMD,       MATRIX_CMD,     IDEAL_CMD }
2951,{jjKBASE,      KBASE_CMD,       IDEAL_CMD,      IDEAL_CMD }
2952,{jjKBASE,      KBASE_CMD,       MODUL_CMD,      MODUL_CMD }
2953,{atKILLATTR1,  KILLATTR_CMD,    NONE,           IDHDL }
2954,{jjCALL1MANY,  LIST_CMD,        LIST_CMD,       DEF_CMD }
2955#ifdef MDEBUG
2956,{jjpHead,      LEAD_CMD,        POLY_CMD,       POLY_CMD }
2957#else
2958,{jjpHead,      LEAD_CMD,       -((s)POLY_CMD),  POLY_CMD }
2959#endif
2960,{jjidHead,     LEAD_CMD,       -((s)IDEAL_CMD), IDEAL_CMD }
2961#ifdef MDEBUG
2962,{jjpHead,      LEAD_CMD,        VECTOR_CMD,     VECTOR_CMD }
2963#else
2964,{jjpHead,      LEAD_CMD,       -((s)VECTOR_CMD),VECTOR_CMD }
2965#endif
2966,{jjidHead,     LEAD_CMD,       -((s)MODUL_CMD), MODUL_CMD }
2967,{jjLEADCOEF,   LEADCOEF_CMD,    NUMBER_CMD,     POLY_CMD }
2968,{jjLEADCOEF,   LEADCOEF_CMD,    NUMBER_CMD,     VECTOR_CMD }
2969,{jjLEADEXP,    LEADEXP_CMD,     INTVEC_CMD,     POLY_CMD }
2970,{jjLEADEXP,    LEADEXP_CMD,     INTVEC_CMD,     VECTOR_CMD }
2971,{jjWRONG,      MAP_CMD,         0,              ANY_TYPE}
2972,{jjDUMMY,      MATRIX_CMD,      MATRIX_CMD,     MATRIX_CMD }
2973,{jjidMaxIdeal, MAXID_CMD,      -((s)IDEAL_CMD), INT_CMD }
2974,{jjMEMORY,     MEMORY_CMD,      INT_CMD,        INT_CMD }
2975,{jjidMinBase,  MINBASE_CMD,    -((s)IDEAL_CMD), IDEAL_CMD }
2976,{jjidMinBase,  MINBASE_CMD,    -((s)MODUL_CMD), MODUL_CMD }
2977,{jjMINRES,     MINRES_CMD,      LIST_CMD,       LIST_CMD }
2978,{jjDUMMY,      MODUL_CMD,       MODUL_CMD,      MODUL_CMD }
2979,{jjMONITOR1,   MONITOR_CMD,     NONE,           STRING_CMD }
2980,{jjMULT,       MULTIPLICITY_CMD,  INT_CMD,      IDEAL_CMD }
2981,{jjMULT,       MULTIPLICITY_CMD,  INT_CMD,      MODUL_CMD }
2982,{jjMSTD,       MSTD_CMD,        LIST_CMD,       IDEAL_CMD }
2983,{jjNAMEOF,     NAMEOF_CMD,      STRING_CMD,     ANY_TYPE }
2984,{jjNAMES,      NAMES_CMD,       LIST_CMD,       RING_CMD }
2985,{jjNAMES,      NAMES_CMD,       LIST_CMD,       QRING_CMD }
2986,{jjDUMMY,      NUMBER_CMD,      NUMBER_CMD,     NUMBER_CMD }
2987,{jjP2N,        NUMBER_CMD,      NUMBER_CMD,     POLY_CMD }
2988,{jjRPAR,       NPARS_CMD,       INT_CMD,        RING_CMD }
2989,{jjRPAR,       NPARS_CMD,       INT_CMD,        QRING_CMD }
2990,{jjNVARS,      NVARS_CMD,       INT_CMD,        RING_CMD }
2991,{jjNVARS,      NVARS_CMD,       INT_CMD,        QRING_CMD }
2992,{jjOpenClose,  OPEN_CMD,        NONE,           LINK_CMD }
2993,{jjORD,        ORD_CMD,         INT_CMD,        POLY_CMD }
2994,{jjORD,        ORD_CMD,         INT_CMD,        VECTOR_CMD }
2995,{jjrOrdStr,    ORDSTR_CMD,     -((s)STRING_CMD),RING_CMD }
2996,{jjrOrdStr,    ORDSTR_CMD,     -((s)STRING_CMD),QRING_CMD }
2997,{jjPAR1,       PAR_CMD,         NUMBER_CMD,     INT_CMD }
2998,{jjPARDEG,     PARDEG_CMD,      INT_CMD,        NUMBER_CMD }
2999,{jjPARSTR1,    PARSTR_CMD,      STRING_CMD,     INT_CMD }
3000,{jjrParStr,    PARSTR_CMD,     -((s)STRING_CMD),RING_CMD }
3001,{jjrParStr,    PARSTR_CMD,     -((s)STRING_CMD),QRING_CMD }
3002,{jjDUMMY,      POLY_CMD,        POLY_CMD,       POLY_CMD }
3003,{jjPRIME,      PRIME_CMD,       INT_CMD,        INT_CMD }
3004,{jjPRINT_GEN,  PRINT_CMD,       NONE,           INT_CMD }
3005,{jjPRINT_INTVEC,PRINT_CMD,      NONE,           INTVEC_CMD }
3006,{jjPRINT_INTMAT,PRINT_CMD,      NONE,           INTMAT_CMD }
3007,{jjPRINT_GEN,  PRINT_CMD,       NONE,           STRING_CMD }
3008,{jjPRINT_GEN,  PRINT_CMD,       NONE,           POLY_CMD }
3009,{jjPRINT_V,    PRINT_CMD,       NONE,           VECTOR_CMD }
3010,{jjPRINT_GEN,  PRINT_CMD,       NONE,           IDEAL_CMD }
3011,{jjPRINT_MA,   PRINT_CMD,       NONE,           MATRIX_CMD }
3012,{jjPRINT_LIST, PRINT_CMD,       NONE,           LIST_CMD }
3013,{jjidMinEmbedding, PRUNE_CMD,  -((s)MODUL_CMD), MODUL_CMD }
3014,{kQHWeight,    QHWEIGHT_CMD,    INTVEC_CMD,     IDEAL_CMD }
3015,{kQHWeight,    QHWEIGHT_CMD,    INTVEC_CMD,     MODUL_CMD }
3016,{jjWRONG,      QRING_CMD,       0,              ANY_TYPE}
3017,{jjREAD,       READ_CMD,        STRING_CMD,     LINK_CMD }
3018,{jjREGULARITY, REGULARITY_CMD,  INT_CMD,        LIST_CMD }
3019,{jjRESERVEDNAME,RESERVEDNAME_CMD, INT_CMD,      STRING_CMD }
3020,{jjWRONG,      ROWS_CMD,        0,              POLY_CMD }
3021,{jjpMaxComp,   ROWS_CMD,       -((s)INT_CMD),   VECTOR_CMD }
3022,{jjROWS,       ROWS_CMD,        INT_CMD,        MODUL_CMD }
3023,{jjROWS,       ROWS_CMD,        INT_CMD,        MATRIX_CMD }
3024,{jjROWS_IV,    ROWS_CMD,        INT_CMD,        INTMAT_CMD }
3025,{jjCOUNT_IV,   ROWS_CMD,        INT_CMD,        INTVEC_CMD }
3026,{jjSort_Id,    SORTVEC_CMD,     INTVEC_CMD,     IDEAL_CMD }
3027,{jjSort_Id,    SORTVEC_CMD,     INTVEC_CMD,     MODUL_CMD }
3028,{jjSTD,        STD_CMD,         IDEAL_CMD,      IDEAL_CMD }
3029,{jjSTD,        STD_CMD,         MODUL_CMD,      MODUL_CMD }
3030,{jjSTRING,     STRING_CMD,      STRING_CMD,     STRING_CMD }
3031,{jjSTRING,     STRING_CMD,      STRING_CMD,     INT_CMD }
3032,{jjSTRING,     STRING_CMD,      STRING_CMD,     POLY_CMD }
3033,{jjSTRING,     STRING_CMD,      STRING_CMD,     VECTOR_CMD }
3034,{jjSTRING,     STRING_CMD,      STRING_CMD,     NUMBER_CMD }
3035,{jjSTRING,     STRING_CMD,      STRING_CMD,     MATRIX_CMD }
3036,{jjSTRING,     STRING_CMD,      STRING_CMD,     MODUL_CMD }
3037,{jjSTRING,     STRING_CMD,      STRING_CMD,     IDEAL_CMD }
3038,{jjSTRING,     STRING_CMD,      STRING_CMD,     MAP_CMD }
3039,{jjSTRING,     STRING_CMD,      STRING_CMD,     INTVEC_CMD }
3040,{jjSTRING,     STRING_CMD,      STRING_CMD,     INTMAT_CMD }
3041,{jjSTRING_PROC,STRING_CMD,      STRING_CMD,     PROC_CMD }
3042,{jjSTRING,     STRING_CMD,      STRING_CMD,     RING_CMD }
3043,{jjSTRING,     STRING_CMD,      STRING_CMD,     QRING_CMD }
3044,{jjSYSTEM,     SYSTEM_CMD,      NONE,           STRING_CMD }
3045,{jjSYZYGY,     SYZYGY_CMD,      MODUL_CMD,      IDEAL_CMD }
3046,{jjSYZYGY,     SYZYGY_CMD,      MODUL_CMD,      MODUL_CMD }
3047,{jjWRONG,      TRACE_CMD,       0,              INTVEC_CMD }
3048,{jjWRONG,      TRACE_CMD,       0,              IDEAL_CMD }
3049,{jjTRACE_IV,   TRACE_CMD,       INT_CMD,        INTMAT_CMD }
3050,{jjmpTrace,    TRACE_CMD,      -((s)POLY_CMD),  MATRIX_CMD }
3051,{jjTRANSP_IV,  TRANSPOSE_CMD,   INTMAT_CMD,     INTVEC_CMD }
3052,{jjTRANSP_IV,  TRANSPOSE_CMD,   INTMAT_CMD,     INTMAT_CMD }
3053,{jjmpTransp,   TRANSPOSE_CMD,  -((s)MATRIX_CMD),MATRIX_CMD }
3054,{jjTYPEOF,     TYPEOF_CMD,      STRING_CMD,     ANY_TYPE }
3055,{jjDUMMY,      VECTOR_CMD,      VECTOR_CMD,     VECTOR_CMD }
3056,{jjVDIM,       VDIM_CMD,        INT_CMD,        IDEAL_CMD }
3057,{jjVDIM,       VDIM_CMD,        INT_CMD,        MODUL_CMD }
3058,{jjVAR1,       VAR_CMD,         POLY_CMD,       INT_CMD }
3059,{jjVARSTR1,    VARSTR_CMD,      STRING_CMD,     INT_CMD }
3060,{jjrVarStr,    VARSTR_CMD,     -((s)STRING_CMD),RING_CMD }
3061,{jjrVarStr,    VARSTR_CMD,     -((s)STRING_CMD),QRING_CMD }
3062,{kWeight,      WEIGHT_CMD,      INTVEC_CMD,     IDEAL_CMD }
3063,{kWeight,      WEIGHT_CMD,      INTVEC_CMD,     MODUL_CMD }
3064,{NULL,         0,               0,              0}
3065};
3066#undef s
3067/*=================== operations with 3 args.: static proc =================*/
3068static BOOLEAN jjBRACK_S(leftv res, leftv u, leftv v,leftv w)
3069{
3070  char *s= (char *)u->Data();
3071  int   r = (int)v->Data();
3072  int   c = (int)w->Data();
3073  int l = strlen(s);
3074
3075  if ( (r<1) || (r>l) || (c<0) )
3076  {
3077    Werror("wrong range[%d,%d] in string %s",r,c,u->Name());
3078    return TRUE;
3079  }
3080  res->data = (char *)AllocL(c+1);
3081  sprintf((char *)res->data,"%-*.*s",c,c,s+r-1);
3082  return FALSE;
3083}
3084static BOOLEAN jjBRACK_Im(leftv res, leftv u, leftv v,leftv w)
3085{
3086  intvec *iv = (intvec *)u->Data();
3087  int   r = (int)v->Data();
3088  int   c = (int)w->Data();
3089  if ((r<1)||(r>iv->rows())||(c<1)||(c>iv->cols()))
3090  {
3091    Werror("wrong range[%d,%d] in intmat %s(%d x %d)",
3092           r,c,u->Name(),iv->rows(),iv->cols());
3093    return TRUE;
3094  }
3095  res->data=u->data;
3096  u->data=NULL;
3097  res->rtyp=u->rtyp;
3098  u->rtyp=0;
3099  res->name=u->name;
3100  u->name=NULL;
3101  Subexpr e=jjMakeSub(v);
3102          e->next=jjMakeSub(w);
3103  if (u->e==NULL) res->e=e;
3104  else
3105  {
3106    Subexpr h=u->e;
3107    while (h->next!=NULL) h=h->next;
3108    h->next=e;
3109    res->e=u->e;
3110    u->e=NULL;
3111  }
3112  return FALSE;
3113}
3114static BOOLEAN jjBRACK_Ma(leftv res, leftv u, leftv v,leftv w)
3115{
3116  matrix m= (matrix)u->Data();
3117  int   r = (int)v->Data();
3118  int   c = (int)w->Data();
3119  //Print("gen. elem %d, %d\n",r,c);
3120  if ((r<1)||(r>MATROWS(m))||(c<1)||(c>MATCOLS(m)))
3121  {
3122    Werror("wrong range[%d,%d] in matrix %s(%d x %d)",r,c,u->Name(),
3123      MATROWS(m),MATCOLS(m));
3124    return TRUE;
3125  }
3126  res->data=u->data;
3127  u->data=NULL;
3128  res->rtyp=u->rtyp;
3129  u->rtyp=0;
3130  res->name=u->name;
3131  u->name=NULL;
3132  Subexpr e=jjMakeSub(v);
3133          e->next=jjMakeSub(w);
3134  if (u->e==NULL)
3135    res->e=e;
3136  else
3137  {
3138    Subexpr h=u->e;
3139    while (h->next!=NULL) h=h->next;
3140    h->next=e;
3141    res->e=u->e;
3142    u->e=NULL;
3143  }
3144  return FALSE;
3145}
3146static BOOLEAN jjBRACK_Ma_I_IV(leftv res, leftv u, leftv v,leftv w)
3147{
3148  sleftv t;
3149  sleftv ut;
3150  leftv p=NULL;
3151  intvec *iv=(intvec *)w->Data();
3152  int l;
3153  BOOLEAN nok;
3154
3155  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
3156  {
3157    WerrorS("cannot build expression lists from unnamed objects");
3158    return TRUE;
3159  }
3160  memcpy(&ut,u,sizeof(ut));
3161  memset(&t,0,sizeof(t));
3162  t.rtyp=INT_CMD;
3163  for (l=0;l< iv->length(); l++)
3164  {
3165    t.data=(char *)(*iv)[l];
3166    if (p==NULL)
3167    {
3168      p=res;
3169    }
3170    else
3171    {
3172      p->next=(leftv)Alloc0(sizeof(sleftv));
3173      p=p->next;
3174    }
3175    memcpy(u,&ut,sizeof(ut));
3176    if (u->Typ() == MATRIX_CMD)
3177      nok=jjBRACK_Ma(p,u,v,&t);
3178    else /* INTMAT_CMD */
3179      nok=jjBRACK_Im(p,u,v,&t);
3180    if (nok)
3181    {
3182      while (res->next!=NULL)
3183      {
3184        p=res->next->next;
3185        Free((ADDRESS)res->next,sizeof(sleftv));
3186        // res->e aufraeumen !!!!
3187        res->next=p;
3188      }
3189      return TRUE;
3190    }
3191  }
3192  return FALSE;
3193}
3194static BOOLEAN jjBRACK_Ma_IV_I(leftv res, leftv u, leftv v,leftv w)
3195{
3196  sleftv t;
3197  sleftv ut;
3198  leftv p=NULL;
3199  intvec *iv=(intvec *)v->Data();
3200  int l;
3201  BOOLEAN nok;
3202
3203  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
3204  {
3205    WerrorS("cannot build expression lists from unnamed objects");
3206    return TRUE;
3207  }
3208  memcpy(&ut,u,sizeof(ut));
3209  memset(&t,0,sizeof(t));
3210  t.rtyp=INT_CMD;
3211  for (l=0;l< iv->length(); l++)
3212  {
3213    t.data=(char *)((*iv)[l]);
3214    if (p==NULL)
3215    {
3216      p=res;
3217    }
3218    else
3219    {
3220      p->next=(leftv)Alloc0(sizeof(sleftv));
3221      p=p->next;
3222    }
3223    memcpy(u,&ut,sizeof(ut));
3224    if (u->Typ() == MATRIX_CMD)
3225      nok=jjBRACK_Ma(p,u,&t,w);
3226    else /* INTMAT_CMD */
3227      nok=jjBRACK_Im(p,u,&t,w);
3228    if (nok)
3229    {
3230      while (res->next!=NULL)
3231      {
3232        p=res->next->next;
3233        Free((ADDRESS)res->next,sizeof(sleftv));
3234        // res->e aufraeumen !!
3235        res->next=p;
3236      }
3237      return TRUE;
3238    }
3239  }
3240  return FALSE;
3241}
3242static BOOLEAN jjBRACK_Ma_IV_IV(leftv res, leftv u, leftv v,leftv w)
3243{
3244  sleftv t1,t2,ut;
3245  leftv p=NULL;
3246  intvec *vv=(intvec *)v->Data();
3247  intvec *wv=(intvec *)w->Data();
3248  int vl;
3249  int wl;
3250  BOOLEAN nok;
3251
3252  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
3253  {
3254    WerrorS("cannot build expression lists from unnamed objects");
3255    return TRUE;
3256  }
3257  memcpy(&ut,u,sizeof(ut));
3258  memset(&t1,0,sizeof(sleftv));
3259  memset(&t2,0,sizeof(sleftv));
3260  t1.rtyp=INT_CMD;
3261  t2.rtyp=INT_CMD;
3262  for (vl=0;vl< vv->length(); vl++)
3263  {
3264    t1.data=(char *)((*vv)[vl]);
3265    for (wl=0;wl< wv->length(); wl++)
3266    {
3267      t2.data=(char *)((*wv)[wl]);
3268      if (p==NULL)
3269      {
3270        p=res;
3271      }
3272      else
3273      {
3274        p->next=(leftv)Alloc0(sizeof(sleftv));
3275        p=p->next;
3276      }
3277      memcpy(u,&ut,sizeof(ut));
3278      if (u->Typ() == MATRIX_CMD)
3279        nok=jjBRACK_Ma(p,u,&t1,&t2);
3280      else /* INTMAT_CMD */
3281        nok=jjBRACK_Im(p,u,&t1,&t2);
3282      if (nok)
3283      {
3284        res->CleanUp();
3285        return TRUE;
3286      }
3287    }
3288  }
3289  return FALSE;
3290}
3291static BOOLEAN jjCALL3MANY(leftv res, leftv u, leftv v, leftv w)
3292{
3293  u->next=(leftv)Alloc(sizeof(sleftv));
3294  memcpy(u->next,v,sizeof(sleftv));
3295  u->next->next=(leftv)Alloc(sizeof(sleftv));
3296  memcpy(u->next->next,w,sizeof(sleftv));
3297  BOOLEAN r=iiExprArithM(res,u,iiOp);
3298  v->rtyp=0; v->data=NULL; // iiExprArithM did the CleanUp
3299  w->rtyp=0; w->data=NULL;
3300  return r;
3301}
3302static BOOLEAN jjCOEFFS3_Id(leftv res, leftv u, leftv v, leftv w)
3303{
3304  if ((w->rtyp!=IDHDL)||(w->e!=NULL))
3305  {
3306    WerrorS("3rd argument must be a name of a matrix");
3307    return TRUE;
3308  }
3309  ideal i=(ideal)u->Data();
3310  int rank=(int)i->rank;
3311  BOOLEAN r=jjCOEFFS_Id(res,u,v);
3312  if (r) return TRUE;
3313  mpMonomials((matrix)res->data, rank, pVar((poly)v->Data()),(matrix)w->Data());
3314  return FALSE;
3315}
3316static BOOLEAN jjCOEFFS3_KB(leftv res, leftv u, leftv v, leftv w)
3317{
3318  res->data=(void*)idCoeffOfKBase((ideal)(u->Data()),
3319           (ideal)(v->Data()),(poly)(w->Data()));
3320  return FALSE;
3321}
3322static BOOLEAN jjCOEFFS3_P(leftv res, leftv u, leftv v, leftv w)
3323{
3324  if ((w->rtyp!=IDHDL)||(w->e!=NULL))
3325  {
3326    WerrorS("3rd argument must be a name of a matrix");
3327    return TRUE;
3328  }
3329  poly p=(poly)u->CopyD();
3330  ideal i=idInit(1,1);
3331  i->m[0]=p;
3332  sleftv t;
3333  memset(&t,0,sizeof(t));
3334  t.data=(char *)i;
3335  t.rtyp=IDEAL_CMD;
3336  int rank=1;
3337  if (u->Typ()==VECTOR_CMD)
3338  {
3339    i->rank=rank=pMaxComp(p);
3340    t.rtyp=MODUL_CMD;
3341  }
3342  BOOLEAN r=jjCOEFFS_Id(res,&t,v);
3343  t.CleanUp();
3344  if (r) return TRUE;
3345  mpMonomials((matrix)res->data, rank, pVar((poly)v->Data()),(matrix)w->Data());
3346  return FALSE;
3347}
3348static BOOLEAN jjELIMIN_HILB(leftv res, leftv u, leftv v, leftv w)
3349{
3350  res->data=(char *)idElimination((ideal)u->Data(),(poly)v->Data(),
3351    (intvec *)w->Data());
3352  setFlag(res,FLAG_STD);
3353  return FALSE;
3354}
3355static BOOLEAN jjFIND3(leftv res, leftv u, leftv v, leftv w)
3356{
3357  /*4
3358  * look for the substring what in the string where
3359  * starting at position n
3360  * return the position of the first char of what in where
3361  * or 0
3362  */
3363  int n=(int)w->Data();
3364  char *where=(char *)u->Data();
3365  char *what=(char *)v->Data();
3366  char *found;
3367  if ((1>n)||(n>(int)strlen(where)))
3368  {
3369    Werror("start position %d out of range",n);
3370    return TRUE;
3371  }
3372  found = strchr(where+n-1,*what);
3373  if (*(what+1)!='\0')
3374  {
3375    while((found !=NULL) && (strncmp(found+1,what+1,strlen(what+1))!=0))
3376    {
3377      found=strchr(found+1,*what);
3378    }
3379  }
3380  if (found != NULL)
3381  {
3382    res->data=(char *)((found-where)+1);
3383  }
3384  return FALSE;
3385}
3386static BOOLEAN jjJET_P_IV(leftv res, leftv u, leftv v, leftv w)
3387{
3388  short *iw=iv2array((intvec *)w->Data());
3389  res->data = (char *)pJetW((poly)u->Data(),(int)v->Data(),iw);
3390  Free((ADDRESS)iw,(pVariables+1)*sizeof(short));
3391  return FALSE;
3392}
3393static BOOLEAN jjJET_ID_IV(leftv res, leftv u, leftv v, leftv w)
3394{
3395  res->data = (char *)idJetW((ideal)u->Data(),(int)v->Data(),
3396                             (intvec *)w->Data());
3397  return FALSE;
3398}
3399static BOOLEAN jjPREIMAGE(leftv res, leftv u, leftv v, leftv w)
3400{
3401  idhdl h,rr;
3402  map mapping;
3403
3404  rr=(idhdl)u->data;
3405  if ((h=IDRING(rr)->idroot->get(v->name,myynest))!=NULL)
3406  {
3407    if (h->typ==MAP_CMD)
3408    {
3409      mapping=IDMAP(h);
3410    }
3411    else if (h->typ==IDEAL_CMD)
3412    {
3413      mapping=IDMAP(h);
3414    }
3415    else
3416    {
3417      Werror("`%s` is no map nor ideal",IDID(h));
3418      return TRUE;
3419    }
3420  }
3421  else
3422  {
3423    Werror("`%s` is not defined in `%s`",v->name,u->name);
3424    return TRUE;
3425  }
3426  if ((h=IDRING(rr)->idroot->get(w->name,myynest))!=NULL)
3427  {
3428    if (h->typ==IDEAL_CMD)
3429    {
3430      res->data=(char *)maGetPreimage(IDRING(rr),mapping,IDIDEAL(h));
3431    }
3432    else
3433    {
3434      Werror("`%s` is no ideal",IDID(h));
3435      return TRUE;
3436    }
3437  }
3438  else
3439  {
3440    Werror("`%s` is not defined in `%s`",w->name,u->name);
3441    return TRUE;
3442  }
3443  return FALSE;
3444}
3445static BOOLEAN jjRANDOM_Im(leftv res, leftv u, leftv v, leftv w)
3446{
3447  int di, k;
3448  int i=(int)u->Data();
3449  int r=(int)v->Data();
3450  int c=(int)w->Data();
3451  intvec *iv = new intvec(r, c, 0);
3452  if (iv->rows()==0)
3453  {
3454    delete iv;
3455    return TRUE;
3456  }
3457  if (i!=0)
3458  {
3459    if (i<0) i = -i;
3460    di = 2 * i + 1;
3461    for (k=0; k<iv->length(); k++)
3462    {
3463#ifdef buildin_rand
3464      (*iv)[k] = ((siRand() % di) - i);
3465#else
3466      (*iv)[k] = ((rand() % di) - i);
3467#endif
3468    }
3469  }
3470  res->data = (char *)iv;
3471  return FALSE;
3472}
3473static BOOLEAN jjSUBST_Test(leftv v,leftv w,
3474  int &ringvar, poly &monomexpr)
3475{
3476  monomexpr=(poly)w->Data();
3477  if (pLength(monomexpr)>1)
3478  {
3479    Werror("`%s` substitutes a ringvar only by a term",
3480      Tok2Cmdname(SUBST_CMD));
3481    return TRUE;
3482  }
3483  if (!(ringvar=pVar((poly)v->Data())))
3484  {
3485    WerrorS("ringvar expected");
3486    return TRUE;
3487  }
3488  return FALSE;
3489}
3490static BOOLEAN jjSUBST_P(leftv res, leftv u, leftv v,leftv w)
3491{
3492  int ringvar;
3493  poly monomexpr;
3494  BOOLEAN nok=jjSUBST_Test(v,w,ringvar,monomexpr);
3495  if (nok) return TRUE;
3496  res->data = pSubst((poly)u->CopyD(POLY_CMD),ringvar,monomexpr);
3497  return FALSE;
3498}
3499static BOOLEAN jjSUBST_Id(leftv res, leftv u, leftv v,leftv w)
3500{
3501  int ringvar;
3502  poly monomexpr;
3503  BOOLEAN nok=jjSUBST_Test(v,w,ringvar,monomexpr);
3504  if (nok) return TRUE;
3505  res->data = idSubst((ideal)u->CopyD(IDEAL_CMD),ringvar,monomexpr);
3506  return FALSE;
3507}
3508static BOOLEAN jjMATRIX_Id(leftv res, leftv u, leftv v,leftv w)
3509{
3510  matrix m=mpNew((int)v->Data(),(int)w->Data());
3511  ideal I=(ideal)u->CopyD(IDEAL_CMD);
3512  int i=min(IDELEMS(I),(int)v->Data()*(int)w->Data());
3513  for(i=i-1;i>=0;i--)
3514  {
3515    m->m[i]=I->m[i];
3516    I->m[i]=NULL;
3517  }
3518  idDelete(&I);
3519  res->data = (char *)m;
3520  return FALSE;
3521}
3522static BOOLEAN jjMATRIX_Mo(leftv res, leftv u, leftv v,leftv w)
3523{
3524  res->data = (char *)idModule2formatedMatrix((ideal)u->CopyD(MODUL_CMD),
3525           (int)v->Data(),(int)w->Data());
3526  return FALSE;
3527}
3528static BOOLEAN jjMATRIX_Ma(leftv res, leftv u, leftv v,leftv w)
3529{
3530  matrix m=mpNew((int)v->Data(),(int)w->Data());
3531  matrix I=(matrix)u->CopyD(MATRIX_CMD);
3532  int r=min(MATROWS(I),(int)v->Data());
3533  int c=min(MATCOLS(I),(int)w->Data());
3534  int i,j;
3535  for(i=r;i>0;i--)
3536  {
3537    for(j=c;j>0;j--)
3538    {
3539      MATELEM(m,i,j)=MATELEM(I,i,j);
3540      MATELEM(I,i,j)=NULL;
3541    }
3542  }
3543  idDelete((ideal *)&I);
3544  res->data = (char *)m;
3545  return FALSE;
3546}
3547static BOOLEAN jjREDUCE3_P(leftv res, leftv u, leftv v, leftv w)
3548{
3549  assumeStdFlag(v);
3550  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(poly)u->Data(),
3551    0,(int)w->Data());
3552  return FALSE;
3553}
3554static BOOLEAN jjREDUCE3_ID(leftv res, leftv u, leftv v, leftv w)
3555{
3556  assumeStdFlag(v);
3557  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(ideal)u->Data(),
3558    0,(int)w->Data());
3559  return FALSE;
3560}
3561static BOOLEAN jjRES3(leftv res, leftv u, leftv v, leftv w)
3562{
3563#ifdef OLD_RES
3564  int maxl=(int)v->Data();
3565  int l=0;
3566  resolvente r;
3567  intvec **weights=NULL;
3568  int wmaxl=maxl;
3569  maxl--;
3570  if ((maxl==-1) && (iiOp!=MRES_CMD))
3571    maxl = pVariables-1;
3572  if ((iiOp == RES_CMD) || (iiOp == MRES_CMD))
3573  {
3574    if (BTEST1(28))
3575    {
3576      r=syMinRes((ideal)u->Data(),maxl,&l,iiOp==MRES_CMD);
3577    }
3578    else
3579    {
3580      intvec * iv=(intvec*)atGet(u,"isHomog");
3581      if (iv!=NULL)
3582      {
3583        weights = (intvec**)Alloc0(sizeof(intvec*));
3584        weights[0] = ivCopy(iv);
3585        l=1;
3586      }
3587      r=syResolvente((ideal)u->Data(),maxl,&l, &weights, iiOp==MRES_CMD);
3588    }
3589  }
3590  else
3591    r=sySchreyerResolvente((ideal)u->Data(),maxl,&l);
3592  if (r==NULL) return TRUE;
3593  int t3=u->Typ();
3594  iiMakeResolv(r,l,wmaxl,w->name,t3,weights);
3595  return FALSE;
3596#else
3597  return TRUE;
3598#endif
3599}
3600static BOOLEAN jjSTATUS3(leftv res, leftv u, leftv v, leftv w)
3601{
3602  int yes;
3603  jjSTATUS2(res, u, v);
3604  yes = (strcmp((char *) res->data, (char *) w->Data()) == 0);
3605  FreeL((ADDRESS) res->data);
3606  res->data = (void *) yes;
3607  return FALSE;
3608}
3609
3610/*=================== operations with 3 args.: table =================*/
3611struct sValCmd3 dArith3[]=
3612{
3613// operations:
3614// proc             cmd          res         arg1        arg2        arg3
3615 {jjBRACK_S,        '[',        STRING_CMD, STRING_CMD, INT_CMD,    INT_CMD }
3616,{jjBRACK_Im,       '[',        INT_CMD,    INTMAT_CMD, INT_CMD,    INT_CMD }
3617,{jjBRACK_Ma_I_IV,  '[',        INT_CMD,    INTMAT_CMD, INT_CMD,    INTVEC_CMD }
3618,{jjBRACK_Ma_IV_I,  '[',        INT_CMD,    INTMAT_CMD, INTVEC_CMD, INT_CMD }
3619,{jjBRACK_Ma_IV_IV, '[',        INT_CMD,    INTMAT_CMD, INTVEC_CMD, INTVEC_CMD }
3620,{jjBRACK_Ma,       '[',        POLY_CMD,   MATRIX_CMD, INT_CMD,    INT_CMD }
3621,{jjBRACK_Ma_I_IV,  '[',        POLY_CMD,   MATRIX_CMD, INT_CMD,    INTVEC_CMD }
3622,{jjBRACK_Ma_IV_I,  '[',        POLY_CMD,   MATRIX_CMD, INTVEC_CMD, INT_CMD }
3623,{jjBRACK_Ma_IV_IV, '[',        POLY_CMD,   MATRIX_CMD, INTVEC_CMD, INTVEC_CMD }
3624,{atATTRIB3,        ATTRIB_CMD, NONE,       IDHDL,      STRING_CMD, DEF_CMD }
3625,{jjCOEFFS3_P,      COEFFS_CMD, MATRIX_CMD, POLY_CMD,   POLY_CMD,   MATRIX_CMD }
3626,{jjCOEFFS3_P,      COEFFS_CMD, MATRIX_CMD, VECTOR_CMD, POLY_CMD,   MATRIX_CMD }
3627,{jjCOEFFS3_Id,     COEFFS_CMD, MATRIX_CMD, IDEAL_CMD,  POLY_CMD,   MATRIX_CMD }
3628,{jjCOEFFS3_Id,     COEFFS_CMD, MATRIX_CMD, MODUL_CMD,  POLY_CMD,   MATRIX_CMD }
3629,{jjCOEFFS3_KB,     COEFFS_CMD, MATRIX_CMD, IDEAL_CMD,  IDEAL_CMD,  POLY_CMD }
3630,{jjCOEFFS3_KB,     COEFFS_CMD, MATRIX_CMD, MODUL_CMD,  MODUL_CMD,  POLY_CMD }
3631,{jjELIMIN_HILB,    ELIMINATION_CMD,IDEAL_CMD, IDEAL_CMD, POLY_CMD, INTVEC_CMD }
3632,{jjFIND3,          FIND_CMD,   INT_CMD,    STRING_CMD, STRING_CMD, INT_CMD }
3633,{jjCALL3MANY,      IDEAL_CMD,  IDEAL_CMD,  DEF_CMD,    DEF_CMD,    DEF_CMD }
3634//,{jjCALL3MANY,      INTERSECT_CMD,  NONE,   DEF_CMD,    DEF_CMD,    DEF_CMD }
3635,{lInsert3,         INSERT_CMD, LIST_CMD,   LIST_CMD,   DEF_CMD,    INT_CMD }
3636,{jjCALL3MANY,      INTVEC_CMD, INTVEC_CMD, DEF_CMD,    DEF_CMD,    DEF_CMD }
3637,{jjJET_P_IV,       JET_CMD,    POLY_CMD,   POLY_CMD,   INT_CMD,    INTVEC_CMD }
3638,{jjJET_ID_IV,      JET_CMD,    IDEAL_CMD,  IDEAL_CMD,  INT_CMD,    INTVEC_CMD }
3639,{jjJET_P_IV,       JET_CMD,    VECTOR_CMD, VECTOR_CMD, INT_CMD,    INTVEC_CMD }
3640,{jjJET_ID_IV,      JET_CMD,    MODUL_CMD,  MODUL_CMD,  INT_CMD,    INTVEC_CMD }
3641,{mpKoszul,         KOSZUL_CMD, MATRIX_CMD, INT_CMD,    INT_CMD,    IDEAL_CMD }
3642,{jjCALL3MANY,      LIST_CMD,   LIST_CMD,   DEF_CMD,    DEF_CMD,    DEF_CMD }
3643,{jjMATRIX_Id,      MATRIX_CMD, MATRIX_CMD, IDEAL_CMD,  INT_CMD,    INT_CMD }
3644,{jjMATRIX_Mo,      MATRIX_CMD, MATRIX_CMD, MODUL_CMD,  INT_CMD,    INT_CMD }
3645,{jjMATRIX_Ma,      MATRIX_CMD, MATRIX_CMD, MATRIX_CMD, INT_CMD,    INT_CMD }
3646,{jjCALL3MANY,      MODUL_CMD,  MODUL_CMD,  DEF_CMD,    DEF_CMD,    DEF_CMD }
3647,{jjRES3,           MRES_CMD,   NONE,       IDEAL_CMD,  INT_CMD,    ANY_TYPE }
3648,{jjRES3,           MRES_CMD,   NONE,       MODUL_CMD,  INT_CMD,    ANY_TYPE }
3649,{jjPREIMAGE,       PREIMAGE_CMD, IDEAL_CMD, RING_CMD,  ANY_TYPE,   ANY_TYPE }
3650,{jjRANDOM_Im,      RANDOM_CMD, INTMAT_CMD, INT_CMD,    INT_CMD,    INT_CMD }
3651,{jjREDUCE3_P,      REDUCE_CMD, POLY_CMD,   POLY_CMD,   IDEAL_CMD,  INT_CMD }
3652,{jjREDUCE3_P,      REDUCE_CMD, VECTOR_CMD, VECTOR_CMD, IDEAL_CMD,  INT_CMD }
3653,{jjREDUCE3_P,      REDUCE_CMD, VECTOR_CMD, VECTOR_CMD, MODUL_CMD,  INT_CMD }
3654,{jjREDUCE3_ID,     REDUCE_CMD, IDEAL_CMD,  IDEAL_CMD,  IDEAL_CMD,  INT_CMD }
3655,{jjREDUCE3_ID,     REDUCE_CMD, MODUL_CMD,  MODUL_CMD,  MODUL_CMD,  INT_CMD }
3656,{jjREDUCE3_ID,     REDUCE_CMD, MODUL_CMD,  MODUL_CMD,  IDEAL_CMD,  INT_CMD }
3657,{jjRES3,           RES_CMD,    NONE,       IDEAL_CMD,  INT_CMD,    ANY_TYPE }
3658,{jjRES3,           RES_CMD,    NONE,       MODUL_CMD,  INT_CMD,    ANY_TYPE }
3659#ifdef HAVE_LIBFACTORY
3660,{jjRESULTANT,      RESULTANT_CMD, POLY_CMD,POLY_CMD,   POLY_CMD,   POLY_CMD }
3661#else
3662,{jjWRONG3,         RESULTANT_CMD, POLY_CMD,POLY_CMD,   POLY_CMD,   POLY_CMD }
3663#endif
3664,{jjRES3,           SRES_CMD,   NONE,       IDEAL_CMD,  INT_CMD,    ANY_TYPE }
3665,{jjRES3,           SRES_CMD,   NONE,       MODUL_CMD,  INT_CMD,    ANY_TYPE }
3666,{jjSTATUS3,        STATUS_CMD, INT_CMD,    LINK_CMD,   STRING_CMD, STRING_CMD}
3667,{jjSUBST_P,        SUBST_CMD,  POLY_CMD,   POLY_CMD,   POLY_CMD,   POLY_CMD }
3668,{jjSUBST_P,        SUBST_CMD,  VECTOR_CMD, VECTOR_CMD, POLY_CMD,   POLY_CMD }
3669,{jjSUBST_Id,       SUBST_CMD,  IDEAL_CMD,  IDEAL_CMD,  POLY_CMD,   POLY_CMD }
3670,{jjSUBST_Id,       SUBST_CMD,  MODUL_CMD,  MODUL_CMD,  POLY_CMD,   POLY_CMD }
3671,{jjSUBST_Id,       SUBST_CMD,  MATRIX_CMD, MATRIX_CMD, POLY_CMD,   POLY_CMD }
3672,{jjCALL3MANY,      SYSTEM_CMD, NONE,       STRING_CMD, DEF_CMD,    DEF_CMD }
3673,{NULL,             0,          0,          0,          0,          0 }
3674};
3675/*=================== operations with many arg.: static proc =================*/
3676static BOOLEAN jjCALL1ARG(leftv res, leftv v)
3677{
3678  return iiExprArith1(res,v,iiOp);
3679}
3680static BOOLEAN jjCALL2ARG(leftv res, leftv u)
3681{
3682  leftv v=u->next;
3683  u->next=NULL;
3684  BOOLEAN b=iiExprArith2(res,u,iiOp,v);
3685  u->next=v;
3686  return b;
3687}
3688static BOOLEAN jjCOEF_M(leftv res, leftv v)
3689{
3690  if((v->Typ() != VECTOR_CMD)
3691  || (v->next->Typ() != POLY_CMD)
3692  || (v->next->next->Typ() != MATRIX_CMD)
3693  || (v->next->next->next->Typ() != MATRIX_CMD))
3694     return TRUE;
3695  if (v->next->next->rtyp!=IDHDL) return TRUE;
3696  idhdl c=(idhdl)v->next->next->data;
3697  if (v->next->next->next->rtyp!=IDHDL) return TRUE;
3698  idhdl m=(idhdl)v->next->next->next->data;
3699  idDelete((ideal *)&(c->data.uideal));
3700  idDelete((ideal *)&(m->data.uideal));
3701  mpCoef2((poly)v->Data(),(poly)v->next->Data(),
3702    (matrix *)&(c->data.umatrix),(matrix *)&(m->data.umatrix));
3703  return FALSE;
3704}
3705static BOOLEAN jjIDEAL_PL(leftv res, leftv v)
3706{
3707  int s=1;
3708  leftv h=v;
3709  if (h!=NULL) s=exprlist_length(h);
3710  ideal id=idInit(s,1);
3711  int rank=1;
3712  int i=0;
3713  poly p=NULL;
3714  while (h!=NULL)
3715  {
3716    switch(h->Typ())
3717    {
3718      case POLY_CMD:
3719      {
3720        p=(poly)h->CopyD();
3721        break;
3722      }
3723      case INT_CMD:
3724      {
3725        number n=nInit((int)h->Data());
3726        if (!nIsZero(n))
3727        {
3728          p=pOne();
3729          pSetCoeff(p,n);
3730        }
3731        else
3732        {
3733          //p=NULL;
3734          nDelete(&n);
3735        }
3736        break;
3737      }
3738      case NUMBER_CMD:
3739      {
3740        number n=(number)h->CopyD();
3741        if (!nIsZero(n))
3742        {
3743          p=pOne();
3744          pSetCoeff(p,n);
3745        }
3746        else
3747        {
3748          //p=NULL;
3749          nDelete(&n);
3750        }
3751        break;
3752      }
3753      case VECTOR_CMD:
3754      {
3755        p=(poly)h->CopyD();
3756        if (iiOp!=MODUL_CMD)
3757        {
3758          idDelete(&id);
3759          pDelete(&p);
3760          return TRUE;
3761        }
3762        rank=max(rank,pMaxComp(p));
3763        break;
3764      }
3765      default:
3766      {
3767        idDelete(&id);
3768        return TRUE;
3769      }
3770    }
3771    if ((iiOp==MODUL_CMD)&&(p!=NULL)&&(pGetComp(p)==0))
3772    {
3773      pSetCompP(p,1);
3774    }
3775    id->m[i]=p;
3776    i++;
3777    h=h->next;
3778  }
3779  id->rank=rank;
3780  res->data=(char *)id;
3781  return FALSE;
3782}
3783static BOOLEAN jjINTERSECT_PL(leftv res, leftv v)
3784{
3785  leftv h=v;
3786  int l=v->listLength();
3787  resolvente r=(resolvente)Alloc0(l*sizeof(ideal));
3788  BOOLEAN *copied=(BOOLEAN *)Alloc0(l*sizeof(BOOLEAN));
3789  int t=0;
3790  // try to convert to IDEAL_CMD
3791  while (h!=NULL)
3792  {
3793    if (iiTestConvert(h->Typ(),IDEAL_CMD)!=0)
3794    {
3795      t=IDEAL_CMD;
3796    }
3797    else break;
3798    h=h->next;
3799  }
3800  // if failure, try MODUL_CMD
3801  if (t==0)
3802  {
3803    h=v;
3804    while (h!=NULL)
3805    {
3806      if (iiTestConvert(h->Typ(),MODUL_CMD)!=0)
3807      {
3808        t=MODUL_CMD;
3809      }
3810      else break;
3811      h=h->next;
3812    }
3813  }
3814  // check for success  in converting
3815  if (t==0)
3816  {
3817    WerrorS("cannot convert to ideal or module");
3818    return TRUE;
3819  }
3820  // call idMultSect
3821  h=v;
3822  int i=0;
3823  sleftv tmp;
3824  while (h!=NULL)
3825  {
3826    if (h->Typ()==t)
3827    {
3828      r[i]=(ideal)h->Data(); /*no copy*/
3829      h=h->next;
3830    }
3831    else if(iiConvert(h->Typ(),t,iiTestConvert(h->Typ(),t),h,&tmp))
3832    {
3833      Free((ADDRESS)copied,l*sizeof(BOOLEAN));
3834      Free((ADDRESS)r,l*sizeof(ideal));
3835      Werror("cannot convert arg. %d to %s",i+1,Tok2Cmdname(t));
3836      return TRUE;
3837    }
3838    else
3839    {
3840      r[i]=(ideal)tmp.Data(); /*now it's a copy*/
3841      copied[i]=TRUE;
3842      h=tmp.next;
3843    }
3844    i++;
3845  }
3846  res->rtyp=t;
3847  res->data=(char *)idMultSect(r,i);
3848  while(i>0)
3849  {
3850    i--;
3851    if (copied[i]) idDelete(&(r[i]));
3852  }
3853  Free((ADDRESS)copied,l*sizeof(BOOLEAN));
3854  Free((ADDRESS)r,l*sizeof(ideal));
3855  return FALSE;
3856}
3857static BOOLEAN jjINTVEC_PL(leftv res, leftv v)
3858{
3859  int i=0;
3860  leftv h=v;
3861  if (h!=NULL) i=exprlist_length(h);
3862  intvec *iv=new intvec(i);
3863  i=0;
3864  while (h!=NULL)
3865  {
3866    if(h->Typ()==INT_CMD)
3867    {
3868      (*iv)[i]=(int)h->Data();
3869    }
3870    else
3871    {
3872      delete iv;
3873      return TRUE;
3874    }
3875    i++;
3876    h=h->next;
3877  }
3878  res->data=(char *)iv;
3879  return FALSE;
3880}
3881static BOOLEAN jjKLAMMER_PL(leftv res, leftv u)
3882{
3883  leftv v=u->next;
3884  BOOLEAN b;
3885  if(v==NULL)
3886    b=iiExprArith1(res,u,iiOp);
3887  else
3888  {
3889    u->next=NULL;
3890    b=iiExprArith2(res,u,iiOp,v);
3891    u->next=v;
3892  } 
3893  return b;
3894}
3895static BOOLEAN jjLIST_PL(leftv res, leftv v)
3896{
3897  int sl=0;
3898  if (v!=NULL) sl = v->listLength();
3899  lists L=(lists)Alloc(sizeof(slists));
3900  leftv h=NULL;
3901  int i;
3902  int rt;
3903
3904  L->Init(sl);
3905  for (i=0;i<sl;i++)
3906  {
3907    if (h!=NULL) { /* e.g. not in the first step:
3908                   * h is the pointer to the old sleftv,
3909                   * v is the pointer to the next sleftv
3910                   * (in this moment) */
3911                   h->next=v;
3912                 }
3913    h=v;
3914    v=v->next;
3915    h->next=NULL;
3916    rt=h->Typ();
3917    if (rt==0)
3918    {
3919      L->Clean();
3920      Werror("`%s` is undefined",h->Name());
3921      return TRUE;
3922    }
3923    if ((rt==RING_CMD)||(rt==QRING_CMD))
3924    {
3925      L->m[i].rtyp=rt;
3926      L->m[i].data=h->Data();
3927      ((ring)L->m[i].data)->ref++;
3928    }
3929    else
3930      L->m[i].Copy(h);
3931  }
3932  res->data=(char *)L;
3933  return FALSE;
3934}
3935static BOOLEAN jjNAMES0(leftv res, leftv v)
3936{
3937  res->data=(void *)ipNameList(idroot);
3938  return FALSE;
3939}
3940static BOOLEAN jjOPTION_PL(leftv res, leftv v)
3941{
3942  if(v==NULL)
3943  {
3944    showOption(iiOp);
3945    return FALSE;
3946  }
3947  return setOption(res,v);
3948}
3949static BOOLEAN jjRESERVED0(leftv res, leftv v)
3950{
3951  int i=1;
3952  while(cmds[i].name!=NULL)
3953  {
3954    PrintS(cmds[i].name);PrintLn();
3955    i++;
3956  }
3957  return FALSE;
3958}
3959static BOOLEAN jjSTRING_PL(leftv res, leftv v)
3960{
3961  if ((v!=NULL)&&(v->next==NULL))
3962    return iiExprArith1(res,v,iiOp);
3963  int sl=0;
3964  leftv h=v,nachher;
3965  sleftv tmpR;
3966  BOOLEAN bo;
3967  char *sum=NULL;
3968  while(h!=NULL)
3969  {
3970    /* convert to string =================================*/
3971    nachher=h->next;
3972    h->next=NULL;
3973    bo=iiExprArith1(&tmpR,h,iiOp);
3974    if(bo)
3975    {
3976      h->next=nachher;
3977      FreeL(sum);
3978      return TRUE;
3979    }
3980    /* append to 'sum' =================================*/
3981    if(sum==NULL)
3982    {
3983      sum=(char *)tmpR.data;
3984      sl=strlen(sum);
3985    }
3986    else
3987    {
3988      int nl=strlen((char *)tmpR.data);
3989      char *s=(char *)AllocL(sl+nl+1);
3990      memcpy(s,sum,sl);
3991      memcpy(s+sl,(char *)tmpR.data,nl);
3992      s[sl+nl+1]='\0';
3993      sl+=nl;
3994      FreeL(sum);
3995      sum=s;
3996    }
3997    /* next sleftv =================================*/
3998    h->next=nachher;
3999    h=nachher;
4000  }
4001  if (sum==NULL) sum=mstrdup("");
4002  res->data=(char *)sum;
4003  return FALSE;
4004}
4005static BOOLEAN jjTEST(leftv res, leftv v)
4006{
4007  do
4008  {
4009    if (v->Typ()!=INT_CMD)
4010      return TRUE;
4011    test_cmd((int)v->Data());
4012    v=v->next;
4013  }
4014  while (v!=NULL);
4015  return FALSE;
4016}
4017/*=================== operations with many arg.: table =================*/
4018/* number_of_args:  -1: any, -2: any >0, .. */
4019struct sValCmdM dArithM[]=
4020{
4021// operations:
4022// proc         cmd               res            number_of_args
4023 {jjKLAMMER_PL,  '(',           ANY_TYPE,           -2  }
4024,{jjCALL2ARG,  COEF_CMD,        MATRIX_CMD,         2  }
4025,{jjCOEF_M,    COEF_CMD,        NONE,               4  }
4026,{jjDBPRINT,   DBPRINT_CMD,     NONE,               -2 }
4027,{jjCALL1ARG,  IDEAL_CMD,       IDEAL_CMD,          1  }
4028,{jjIDEAL_PL,  IDEAL_CMD,       IDEAL_CMD,          -1 }
4029,{jjCALL2ARG,  INTERSECT_CMD,   IDEAL_CMD,          2  }
4030,{jjINTERSECT_PL,INTERSECT_CMD, IDEAL_CMD,          -2 }
4031,{jjCALL1ARG,  INTVEC_CMD,      INTVEC_CMD,         1  }
4032,{jjINTVEC_PL, INTVEC_CMD,      INTVEC_CMD,         -1 }
4033,{jjLIST_PL,   LIST_CMD,        LIST_CMD,           -1 }
4034,{jjCALL1ARG,  MODUL_CMD,       MODUL_CMD,          1  }
4035,{jjIDEAL_PL,  MODUL_CMD,       MODUL_CMD,          -1 }
4036,{jjCALL1ARG,  NAMES_CMD,       LIST_CMD,            1 }
4037,{jjNAMES0,    NAMES_CMD,       LIST_CMD,            0 }
4038,{jjOPTION_PL, OPTION_CMD,      NONE/*or set by p*/,-1 }
4039,{jjCALL1ARG,  RESERVEDNAME_CMD, INT_CMD,            1 }
4040,{jjRESERVED0, RESERVEDNAME_CMD, NONE,               0 }
4041,{jjSTRING_PL, STRING_CMD,      STRING_CMD,         -1 }
4042,{jjSYSTEM,    SYSTEM_CMD,      NONE/*or set by p*/,-2 }
4043,{jjTEST,      TEST_CMD,        NONE,               -2 }
4044,{jjOPTION_PL, VERBOSE_CMD,     NONE/*or set by p*/,-1 }
4045,{iiWRITE,     WRITE_CMD,       NONE,               -2 }
4046,{NULL,        0,               0,                  0  }
4047};
4048#ifdef MDEBUG
4049static Subexpr jjDBMakeSub(leftv e,char *f, int l)
4050#else
4051static Subexpr jjMakeSub(leftv e)
4052#endif
4053{
4054  // assume: e->Typ()==INT_CMD
4055#ifdef MDEBUG
4056  Subexpr r=(Subexpr)mmDBAllocBlock0(sizeof(*r),f,l);
4057#else
4058  Subexpr r=(Subexpr)Alloc0(sizeof(*r));
4059#endif
4060  r->start =(int)e->Data();
4061  return r;
4062}
4063
4064/*================ generating tables ============================*/
4065#ifdef GENTABLE
4066extern struct sValAssign dAssign[];
4067struct sValCmdTab dArithTab1[]={ {0,0}};
4068#define JJTAB1LEN 0
4069struct sValCmdTab dArithTab2[]={ {0,0}};
4070#define JJTAB2LEN 0
4071void ttGen1()
4072{
4073  FILE *outfile = fopen("iparith.inc","w");
4074  int i,j,l1=0,l2=0;
4075  currRing=(ring)Alloc(sizeof(*currRing));
4076  fprintf(outfile,
4077  "/****************************************\n"
4078  "*  Computer Algebra System SINGULAR     *\n"
4079  "****************************************/\n\n");
4080/*-------------------------------------------------------------------*/
4081  fprintf(outfile,"// syntax table for Singular\n//\n");
4082  fprintf(outfile,"// - search for an exact match of the argument types\n");
4083  fprintf(outfile,"// - otherwise search for the first possibility\n");
4084  fprintf(outfile,"//   with converted types of the arguments\n");
4085  fprintf(outfile,"// - otherwise report an error\n//\n");
4086
4087  int op;
4088  i=0;
4089  while ((op=dArith1[i].cmd)!=0)
4090  {
4091    if (dArith1[i].p==jjWRONG)
4092      fprintf(outfile,"// DUMMY ");
4093    char *s = iiTwoOps(op);
4094    fprintf(outfile,"// operation: %s (%s)  ->  %s\n",
4095          s,
4096          Tok2Cmdname(dArith1[i].arg),
4097          Tok2Cmdname(ABS(dArith1[i].res)));
4098    i++;
4099  }
4100  fprintf(outfile,"/*---------------------------------------------*/\n");
4101  i=0;
4102  while ((op=dArith2[i].cmd)!=0)
4103  {
4104    if (dArith2[i].p==jjWRONG2)
4105      fprintf(outfile,"// DUMMY ");
4106    char *s = iiTwoOps(op);
4107    fprintf(outfile,"// operation: %s (%s, %s)  ->  %s\n",
4108          s,
4109          Tok2Cmdname(dArith2[i].arg1),
4110          Tok2Cmdname(dArith2[i].arg2),
4111          Tok2Cmdname(dArith2[i].res));
4112    i++;
4113  }
4114  fprintf(outfile,"/*---------------------------------------------*/\n");
4115  i=0;
4116  while ((op=dArith3[i].cmd)!=0)
4117  {
4118    char *s = iiTwoOps(op);
4119    if (dArith3[i].p==jjWRONG3)
4120      fprintf(outfile,"// DUMMY ");
4121    fprintf(outfile,"// operation: %s (%s, %s, %s)  ->  %s\n",
4122          s,
4123          Tok2Cmdname(dArith3[i].arg1),
4124          Tok2Cmdname(dArith3[i].arg2),
4125          Tok2Cmdname(dArith3[i].arg3),
4126          Tok2Cmdname(dArith3[i].res));
4127    i++;
4128  }
4129  fprintf(outfile,"/*---------------------------------------------*/\n");
4130  i=0;
4131  while ((op=dArithM[i].cmd)!=0)
4132  {
4133    char *s = iiTwoOps(op);
4134    fprintf(outfile,"// operation: %s (...)  ->  %s",
4135          s,
4136          Tok2Cmdname(dArithM[i].res));
4137    switch(dArithM[i].number_of_args)
4138    {
4139      case -2:
4140         fprintf(outfile," ( number of arguments >0 )\n");
4141         break;
4142      case -1:
4143         fprintf(outfile," ( any number of arguments )\n");
4144         break;
4145      default:
4146         fprintf(outfile," ( %d arguments )\n",dArithM[i].number_of_args);
4147         break;
4148    }
4149    i++;
4150  }
4151  fprintf(outfile,"/*---------------------------------------------*/\n");
4152  i=0;
4153  while ((op=dAssign[i].res)!=0)
4154  {
4155    fprintf(outfile,"// assign: %s =  %s\n",
4156          Tok2Cmdname(op/*dAssign[i].res*/),
4157          Tok2Cmdname(dAssign[i].arg));
4158    i++;
4159  }
4160/*-------------------------------------------------------------------*/
4161  fprintf(outfile,"/*---------------------------------------------*/\n");
4162  for (j=257;j<=MAX_TOK+1;j++)
4163  {
4164    for(i=257;i<=MAX_TOK+1;i++)
4165    {
4166      if ((i!=j) && (j!=IDHDL) && (j!=DEF_CMD) && (j!=ANY_TYPE)
4167      && iiTestConvert(i,j))
4168      {
4169        fprintf(outfile,"// convert %s -> %s\n",
4170          Tok2Cmdname(i), Tok2Cmdname(j));
4171        if (j==ANY_TYPE) break;
4172      }
4173    }
4174  }
4175  fprintf(outfile,"/*---------------------------------------------*/\n");
4176  char ops[]="=><+*/[.^,%(";
4177  for(i=0;ops[i]!='\0';i++)
4178    fprintf(outfile,"// token %d : %c\n", (int)ops[i], ops[i]);
4179  for (i=257;i<=MAX_TOK;i++)
4180  {
4181    char *s=iiTwoOps(i);
4182    if (s[0]!='$')
4183    {
4184      fprintf(outfile,"// token %d : %s\n", i, s);
4185    }
4186  }
4187/*-------------------------------------------------------------------*/
4188  fprintf(outfile,"/*--max. token: %d, gr: %d --*/\n",MAX_TOK,UMINUS);
4189/*-------------------------------------------------------------------*/
4190  fprintf(outfile,"/*---------------------------------------------*/\n");
4191  fprintf(outfile,
4192  "struct sValCmdTab dArithTab1[]=\n"
4193  "{\n");
4194  for (j=1;j<=MAX_TOK+1;j++)
4195  {
4196    for(i=0;dArith1[i].cmd!=0;i++)
4197    {
4198      if (dArith1[i].cmd==j)
4199      {
4200        fprintf(outfile," { %d,%d },\n",j,i);
4201        l1++;
4202        break;
4203      }
4204    }
4205  }
4206  fprintf(outfile," { 10000,0 }\n};\n");
4207  fprintf(outfile,"#define JJTAB1LEN %d\n",l1);
4208/*-------------------------------------------------------------------*/
4209  fprintf(outfile,
4210  "struct sValCmdTab dArithTab2[]=\n"
4211  "{\n");
4212  for (j=1;j<=MAX_TOK+1;j++)
4213  {
4214    for(i=0;dArith2[i].cmd!=0;i++)
4215    {
4216      if (dArith2[i].cmd==j)
4217      {
4218        fprintf(outfile," { %d,%d },\n",j,i);
4219        l2++;
4220        break;
4221      }
4222    }
4223  }
4224  fprintf(outfile," { 10000,0 }\n};\n");
4225  fprintf(outfile,"#define JJTAB2LEN %d\n",l2);
4226  fclose(outfile);
4227}
4228/*-------------------------------------------------------------------*/
4229void ttGen2()
4230{
4231  FILE *outfile = fopen("iparith.inc","a");
4232  fprintf(outfile,
4233  "/****************************************\n"
4234  "*  Computer Algebra System SINGULAR     *\n"
4235  "****************************************/\n\n");
4236/*-------------------------------------------------------------------*/
4237  fprintf(outfile,"// identifier table for Singular\n//\n");
4238
4239  fprintf(outfile,
4240  "cmdnames cmds[] =\n"
4241  "{  // name-string     alias  tokval toktype\n"
4242  "{ \"$INVALID$\",            0,  -1, 0},\n");
4243  int i=1;
4244  int m=-1;
4245  int id_nr=0;
4246  BOOLEAN f=FALSE;
4247  loop
4248  {
4249    while (cmds[i].tokval!=0)
4250    {
4251      if ((cmds[i].tokval!=-1)&&(cmds[i].name!=NULL))
4252      {
4253        if(m==-1)
4254        {
4255          m=i;
4256          f=TRUE;
4257        }
4258        else if(strcmp(cmds[m].name,cmds[i].name)>0)
4259        {
4260          m=i;
4261          f=TRUE;
4262        }
4263      }
4264      i++;
4265    }
4266    if(f)
4267    {
4268      id_nr++;
4269      fprintf(outfile,"  {\"%s\", %*d, %3d, ",cmds[m].name,
4270                                             20-strlen(cmds[m].name),
4271                                             cmds[m].alias,
4272                                             cmds[m].tokval);
4273      switch(cmds[m].toktype)
4274      {
4275        case CMD_1:    fprintf(outfile,"CMD_1 },\n"); break;
4276        case CMD_2:    fprintf(outfile,"CMD_2 },\n"); break;
4277        case CMD_3:    fprintf(outfile,"CMD_3 },\n"); break;
4278        case CMD_12:   fprintf(outfile,"CMD_12 },\n"); break;
4279        case CMD_123 : fprintf(outfile,"CMD_123 },\n"); break;
4280        case CMD_23:   fprintf(outfile,"CMD_23 },\n"); break;
4281        case CMD_M:    fprintf(outfile,"CMD_M },\n"); break;
4282        case SYSVAR:   fprintf(outfile,"SYSVAR },\n"); break;
4283        case ROOT_DECL:   fprintf(outfile,"ROOT_DECL },\n"); break;
4284        case ROOT_DECL_LIST:   fprintf(outfile,"ROOT_DECL_LIST },\n"); break;
4285        case RING_DECL:   fprintf(outfile,"RING_DECL },\n"); break;
4286        case NONE:   fprintf(outfile,"NONE },\n"); break;
4287        default:       fprintf(outfile,"%d },\n",cmds[m].toktype);
4288      }
4289      cmds[m].name=NULL;
4290      m=-1;
4291      i=1;
4292      f=FALSE;
4293    }
4294    else break;
4295  }
4296  fprintf(outfile,
4297"/* list of scanner identifiers/only for feread/reservedName */\n");
4298  f=FALSE;
4299  i=1;m=-1;
4300  loop
4301  {
4302    while (cmds[i].tokval!=0)
4303    {
4304      if (cmds[i].name!=NULL)
4305      {
4306        if(m==-1)
4307        {
4308          m=i;
4309          f=TRUE;
4310        }
4311        else if(strcmp(cmds[m].name,cmds[i].name)>0)
4312        {
4313          m=i;
4314          f=TRUE;
4315        }
4316      }
4317      i++;
4318    }
4319    if(f)
4320    {
4321      fprintf(outfile,"  {\"%s\", %*d,  -1, 0 },\n",cmds[m].name,
4322                                             20-strlen(cmds[m].name),
4323                                             0/*cmds[m].alias*/
4324                                             /*-1 cmds[m].tokval*/
4325                                             /*0 cmds[m].toktype*/);
4326      cmds[m].name=NULL;
4327      m=-1;
4328      i=1;
4329      f=FALSE;
4330    }
4331    else break;
4332  }
4333  fprintf(outfile,
4334"/* end of list marker */\n"
4335"  { NULL, 0, 0, 0}\n"
4336"};\n"
4337"#define LAST_IDENTIFIER %d\n",id_nr);
4338  fclose(outfile);
4339}
4340/*-------------------------------------------------------------------*/
4341#if 0
4342void ttGen3()
4343{
4344  FILE *outfile = fopen("mpsr_tok.inc","w");
4345  fprintf(outfile,
4346  "/****************************************\n"
4347  "*  Computer Algebra System SINGULAR     *\n"
4348  "****************************************/\n\n");
4349/*-------------------------------------------------------------------*/
4350  fprintf(outfile,"// token table for Singular\n//\n");
4351
4352  fprintf(outfile,
4353  "short vtok[] =\n"
4354  "{\n");
4355  // operations with 1 arg: ===========================================
4356  int i=0;
4357  while (dArith1[i].cmd!=0)
4358  {
4359    if ((dArith1[i].p!=jjWRONG)
4360    &&((i==0)||(dArith1[i].cmd!=dArith1[i-1].cmd)))
4361    {
4362      fprintf(outfile,"  %d,\n",dArith1[i].cmd);
4363    }
4364    i++;
4365  }
4366  // operations with 2 args: ===========================================
4367  i=0;
4368  while (dArith2[i].cmd!=0)
4369  {
4370    if ((dArith2[i].p!=jjWRONG2)
4371    &&((i==0)||(dArith2[i].cmd!=dArith2[i-1].cmd)))
4372    {
4373      fprintf(outfile,"  %d,\n",dArith2[i].cmd);
4374    }
4375    i++;
4376  }
4377  // operations with 3 args: ===========================================
4378  i=0;
4379  while (dArith3[i].cmd!=0)
4380  {
4381    if (
4382    ((i==0)||(dArith3[i].cmd!=dArith3[i-1].cmd)))
4383    {
4384      fprintf(outfile,"  %d,\n",dArith3[i].cmd);
4385    }
4386    i++;
4387  }
4388  // operations with many args: ===========================================
4389  i=0;
4390  while (dArithM[i].cmd!=0)
4391  {
4392    if (
4393    ((i==0)||(dArithM[i].cmd!=dArithM[i-1].cmd)))
4394    {
4395      fprintf(outfile,"  %d,\n",dArithM[i].cmd);
4396    }
4397    i++;
4398  }
4399  // ====================================================================
4400  fprintf(outfile,
4401  "/* end of list marker */\n"
4402  " %d };\n",MAX_TOK);
4403  fclose(outfile);
4404}
4405#endif
4406/*-------------------------------------------------------------------*/
4407#else
4408#include "iparith.inc"
4409#endif
4410
4411/*=================== operations with 2 args. ============================*/
4412
4413BOOLEAN iiExprArith2(leftv res, leftv a, int op, leftv b, BOOLEAN proccall)
4414{
4415#ifndef GENTABLE
4416
4417  memset(res,0,sizeof(sleftv));
4418
4419  if (!errorreported)
4420  {
4421#ifdef SIC
4422    if (sic)
4423    {
4424      emStoreExpr(a);
4425      emStoreExpr(b);
4426      emStoreOp(op,2);
4427      res->rtyp=SIC_MASK;
4428      return FALSE;
4429    }
4430#endif
4431#ifdef SIQ
4432    if (siq>0)
4433    {
4434      //Print("siq:%d\n",siq);
4435      command d=(command)Alloc0(sizeof(ip_command));
4436      memcpy(&d->arg1,a,sizeof(sleftv));
4437      memcpy(&d->arg2,b,sizeof(sleftv));
4438      d->argc=2;
4439      d->op=op;
4440      res->data=(char *)d;
4441      res->rtyp=COMMAND;
4442      return FALSE;
4443    }
4444#endif
4445    int at=a->Typ();
4446    int bt=b->Typ();
4447    int i=iiTabIndex(dArithTab2,JJTAB2LEN,op);
4448
4449    iiOp=op;
4450    while (dArith2[i].cmd==op)
4451    {
4452      if ((at==dArith2[i].arg1)
4453      && (bt==dArith2[i].arg2))
4454      {
4455        res->rtyp=dArith2[i].res;
4456        if (dArith2[i].p(res,a,b))
4457        {
4458          break;// leave loop, goto error handling
4459        }
4460        a->CleanUp();
4461        b->CleanUp();
4462        //Print("op: %d,result typ:%d\n",op,res->rtyp);
4463        return FALSE;
4464      }
4465      i++;
4466    }
4467    // implicite type conversion ----------------------------------------------
4468    if (dArith2[i].cmd!=op)
4469    {
4470      int ai,bi;
4471      leftv an = (leftv)Alloc0(sizeof(sleftv));
4472      leftv bn = (leftv)Alloc0(sizeof(sleftv));
4473      BOOLEAN failed=FALSE;
4474      i=iiTabIndex(dArithTab2,JJTAB2LEN,op);
4475      //Print("op: %c, type: %s %s\n",op,Tok2Cmdname(at),Tok2Cmdname(bt));
4476      while (dArith2[i].cmd==op)
4477      {
4478        //Print("test %s %s\n",Tok2Cmdname(dArith2[i].arg1),Tok2Cmdname(dArith2[i].arg2));
4479        if ((ai=iiTestConvert(at,dArith2[i].arg1))!=0)
4480        {
4481          if ((bi=iiTestConvert(bt,dArith2[i].arg2))!=0)
4482          {
4483            res->rtyp=dArith2[i].res;
4484            failed= ((iiConvert(at,dArith2[i].arg1,ai,a,an))
4485            || (iiConvert(bt,dArith2[i].arg2,bi,b,bn))
4486            || (dArith2[i].p(res,an,bn)));
4487            // everything done, clean up temp. variables
4488            if (failed)
4489            {
4490              // leave loop, goto error handling
4491              break;
4492            }
4493            else
4494            {
4495              // everything ok, clean up and return
4496              an->CleanUp();
4497              bn->CleanUp();
4498              Free((ADDRESS)an,sizeof(sleftv));
4499              Free((ADDRESS)bn,sizeof(sleftv));
4500              a->CleanUp();
4501              b->CleanUp();
4502              return FALSE;
4503            }
4504          }
4505        }
4506        i++;
4507      }
4508      an->CleanUp();
4509      bn->CleanUp();
4510      Free((ADDRESS)an,sizeof(sleftv));
4511      Free((ADDRESS)bn,sizeof(sleftv));
4512    }
4513    // error handling ---------------------------------------------------
4514    const char *s=NULL;
4515    if (!errorreported)
4516    {
4517      if ((at==0) && (a->Name()!=sNoName))
4518      {
4519        s=a->Name();
4520      }
4521      else if ((bt==0) && (b->Name()!=sNoName))
4522      {
4523        s=b->Name();
4524      }
4525      if (s!=NULL)
4526        Werror("`%s` is not defined",s);
4527      else
4528      {
4529        i=iiTabIndex(dArithTab2,JJTAB2LEN,op);
4530        s = iiTwoOps(op);
4531        if (proccall)
4532        {
4533          Werror("%s(`%s`,`%s`) is not supported"
4534                ,s,Tok2Cmdname(at),Tok2Cmdname(bt));
4535        }
4536        else
4537        {
4538          Werror("`%s` %s `%s` is not supported"
4539                ,Tok2Cmdname(at),s,Tok2Cmdname(bt));
4540        }
4541        if (BVERBOSE(V_SHOW_USE))
4542        {
4543          while (dArith2[i].cmd==op)
4544          {
4545            if(((at==dArith2[i].arg1)||(bt==dArith2[i].arg2))
4546            && (dArith2[i].res!=0)
4547            && (dArith2[i].p!=jjWRONG2))
4548            {
4549              if (proccall)
4550                Werror("expected %s(`%s`,`%s`)"
4551                  ,s,Tok2Cmdname(dArith2[i].arg1),Tok2Cmdname(dArith2[i].arg2));
4552              else
4553                Werror("expected `%s` %s `%s`"
4554                  ,Tok2Cmdname(dArith2[i].arg1),s,Tok2Cmdname(dArith2[i].arg2));
4555            }
4556            i++;
4557          }
4558        }
4559      }
4560    }
4561    res->rtyp = UNKNOWN;
4562  }
4563  a->CleanUp();
4564  b->CleanUp();
4565#endif
4566  return TRUE;
4567}
4568
4569/*==================== operations with 1 arg. ===============================*/
4570
4571BOOLEAN iiExprArith1(leftv res, leftv a, int op)
4572{
4573#ifndef GENTABLE
4574  memset(res,0,sizeof(sleftv));
4575
4576  if (!errorreported)
4577  {
4578#ifdef SIC
4579    if (sic && (a->rtyp==SIC_MASK))
4580    {
4581      emStoreOp(op,1);
4582      res->rtyp=SIC_MASK;
4583      return FALSE;
4584    }
4585#endif
4586#ifdef SIQ
4587    if (siq>0)
4588    {
4589      //Print("siq:%d\n",siq);
4590      command d=(command)Alloc0(sizeof(ip_command));
4591      memcpy(&d->arg1,a,sizeof(sleftv));
4592      d->op=op;
4593      d->argc=1;
4594      res->data=(char *)d;
4595      res->rtyp=COMMAND;
4596      return FALSE;
4597    }
4598#endif
4599    int at=a->Typ();
4600    BOOLEAN failed=FALSE;
4601
4602    iiOp=op;
4603    int i=iiTabIndex(dArithTab1,JJTAB1LEN,op);
4604    while (dArith1[i].cmd==op)
4605    {
4606      if (at==dArith1[i].arg)
4607      {
4608        res->rtyp=dArith1[i].res;
4609#ifdef SIC
4610        if (sic)
4611        {
4612          emStoreExpr(a);
4613          emStoreOp(op,1);
4614          res->rtyp=ABS(res->rtyp)|SIC_MASK;
4615          a->CleanUp();
4616          return FALSE;
4617        }
4618#endif
4619        if (dArith1[i].res<0)
4620        {
4621          res->rtyp=-res->rtyp;
4622          res->data=(char *)((Proc1)dArith1[i].p)((char *)a->Data());
4623        }
4624        else if (dArith1[i].p(res,a))
4625        {
4626          break;// leave loop, goto error handling
4627        }
4628        if (a->Next()!=NULL)
4629        {
4630          res->next=(leftv)Alloc(sizeof(sleftv));
4631          failed=iiExprArith1(res->next,a->next,op);
4632        }
4633        a->CleanUp();
4634        return failed;
4635      }
4636      i++;
4637    }
4638    // implicite type conversion --------------------------------------------
4639    if (dArith1[i].cmd!=op)
4640    {
4641      int ai;
4642      leftv an = (leftv)Alloc0(sizeof(sleftv));
4643      i=iiTabIndex(dArithTab1,JJTAB1LEN,op);
4644      //Print("fuer %c , typ: %s\n",op,Tok2Cmdname(at));
4645      while (dArith1[i].cmd==op)
4646      {
4647        //Print("test %s\n",Tok2Cmdname(dArith1[i].arg));
4648        if ((ai=iiTestConvert(at,dArith1[i].arg))!=0)
4649        {
4650          res->rtyp=dArith1[i].res;
4651#ifdef SIC
4652          if (sic)
4653          {
4654            emStoreExpr(a);
4655            emStoreOp(op,1);
4656            res->rtyp=ABS(res->rtyp)|SIC_MASK;
4657            a->CleanUp();
4658            return FALSE;
4659          }
4660#endif
4661          if (dArith1[i].res<0)
4662          {
4663            res->rtyp=-res->rtyp;
4664            failed= iiConvert(at,dArith1[i].arg,ai,a,an);
4665            if (!failed)
4666              res->data=(char *)((Proc1)dArith1[i].p)((char *)an->Data());
4667          }
4668          else
4669          {
4670            failed= ((iiConvert(at,dArith1[i].arg,ai,a,an))
4671            || (dArith1[i].p(res,an)));
4672          }
4673          // everything done, clean up temp. variables
4674          if (failed)
4675          {
4676            // leave loop, goto error handling
4677            break;
4678          }
4679          else
4680          {
4681            // everything ok, clean up and return
4682            an->CleanUp();
4683            Free((ADDRESS)an,sizeof(sleftv));
4684            a->CleanUp();
4685            return FALSE;
4686          }
4687        }
4688        i++;
4689      }
4690      an->CleanUp();
4691      Free((ADDRESS)an,sizeof(sleftv));
4692    }
4693    // error handling
4694    if (!errorreported)
4695    {
4696      if ((at==0) && (a->Name()!=sNoName))
4697      {
4698        Werror("`%s` is not defined",a->Name());
4699      }
4700      else
4701      {
4702        i=iiTabIndex(dArithTab1,JJTAB1LEN,op);
4703        char *s = iiTwoOps(op);
4704        Werror("%s(`%s`) is not supported"
4705                ,s,Tok2Cmdname(at));
4706        if (BVERBOSE(V_SHOW_USE))
4707        {
4708          while (dArith1[i].cmd==op)
4709          {
4710            if ((dArith1[i].res!=0)
4711            && (dArith1[i].p!=jjWRONG))
4712              Werror("expected %s(`%s`)"
4713                ,s,Tok2Cmdname(dArith1[i].arg));
4714            i++;
4715          }
4716        }
4717      }
4718    }
4719    res->rtyp = UNKNOWN;
4720  }
4721  a->CleanUp();
4722#endif
4723  return TRUE;
4724}
4725
4726/*=================== operations with 3 args. ============================*/
4727
4728BOOLEAN iiExprArith3(leftv res, int op, leftv a, leftv b, leftv c)
4729{
4730#ifndef GENTABLE
4731  memset(res,0,sizeof(sleftv));
4732
4733  if (!errorreported)
4734  {
4735#ifdef SIC
4736    if (sic)
4737    {
4738      emStoreExpr(a);
4739      emStoreExpr(b);
4740      emStoreExpr(c);
4741      emStoreOp(op,3);
4742      res->rtyp=SIC_MASK;
4743      return FALSE;
4744    }
4745#endif
4746#ifdef SIQ
4747    if (siq>0)
4748    {
4749      //Print("siq:%d\n",siq);
4750      command d=(command)Alloc0(sizeof(ip_command));
4751      memcpy(&d->arg1,a,sizeof(sleftv));
4752      memcpy(&d->arg2,b,sizeof(sleftv));
4753      memcpy(&d->arg3,c,sizeof(sleftv));
4754      d->op=op;
4755      d->argc=3;
4756      res->data=(char *)d;
4757      res->rtyp=COMMAND;
4758      return FALSE;
4759    }
4760#endif
4761    int at=a->Typ();
4762    int bt=b->Typ();
4763    int ct=c->Typ();
4764
4765    iiOp=op;
4766    int i=0;
4767    while ((dArith3[i].cmd!=op)&&(dArith3[i].cmd!=0)) i++;
4768    while (dArith3[i].cmd==op)
4769    {
4770      if ((at==dArith3[i].arg1)
4771      && (bt==dArith3[i].arg2)
4772      && (ct==dArith3[i].arg3))
4773      {
4774        res->rtyp=dArith3[i].res;
4775        if (dArith3[i].p(res,a,b,c))
4776        {
4777          break;// leave loop, goto error handling
4778        }
4779        a->CleanUp();
4780        b->CleanUp();
4781        c->CleanUp();
4782        return FALSE;
4783      }
4784      i++;
4785    }
4786    // implicite type conversion ----------------------------------------------
4787    if (dArith3[i].cmd!=op)
4788    {
4789      int ai,bi,ci;
4790      leftv an = (leftv)Alloc0(sizeof(sleftv));
4791      leftv bn = (leftv)Alloc0(sizeof(sleftv));
4792      leftv cn = (leftv)Alloc0(sizeof(sleftv));
4793      BOOLEAN failed=FALSE;
4794      i=0;
4795      while ((dArith3[i].cmd!=op)&&(dArith3[i].cmd!=0)) i++;
4796      while (dArith3[i].cmd==op)
4797      {
4798        if ((ai=iiTestConvert(at,dArith3[i].arg1))!=0)
4799        {
4800          if ((bi=iiTestConvert(bt,dArith3[i].arg2))!=0)
4801          {
4802            if ((ci=iiTestConvert(ct,dArith3[i].arg3))!=0)
4803            {
4804              res->rtyp=dArith3[i].res;
4805              failed= ((iiConvert(at,dArith3[i].arg1,ai,a,an))
4806                || (iiConvert(bt,dArith3[i].arg2,bi,b,bn))
4807                || (iiConvert(ct,dArith3[i].arg3,ci,c,cn))
4808                || (dArith3[i].p(res,an,bn,cn)));
4809              // everything done, clean up temp. variables
4810              if (failed)
4811              {
4812                // leave loop, goto error handling
4813                break;
4814              }
4815              else
4816              {
4817                // everything ok, clean up and return
4818                an->CleanUp();
4819                bn->CleanUp();
4820                cn->CleanUp();
4821                Free((ADDRESS)an,sizeof(sleftv));
4822                Free((ADDRESS)bn,sizeof(sleftv));
4823                Free((ADDRESS)cn,sizeof(sleftv));
4824                a->CleanUp();
4825                b->CleanUp();
4826                c->CleanUp();
4827        //Print("op: %d,result typ:%d\n",op,res->rtyp);
4828                return FALSE;
4829              }
4830            }
4831          }
4832        }
4833        i++;
4834      }
4835      an->CleanUp();
4836      bn->CleanUp();
4837      cn->CleanUp();
4838      Free((ADDRESS)an,sizeof(sleftv));
4839      Free((ADDRESS)bn,sizeof(sleftv));
4840      Free((ADDRESS)cn,sizeof(sleftv));
4841    }
4842    // error handling ---------------------------------------------------
4843    if (!errorreported)
4844    {
4845      const char *s=NULL;
4846      if ((at==0) && (a->Name()!=sNoName))
4847      {
4848        s=a->Name();
4849      }
4850      else if ((bt==0) && (b->Name()!=sNoName))
4851      {
4852        s=b->Name();
4853      }
4854      else if ((ct==0) && (c->Name()!=sNoName))
4855      {
4856        s=c->Name();
4857      }
4858      if (s!=NULL)
4859        Werror("`%s` is not defined",s);
4860      else
4861      {
4862        i=0;
4863        while ((dArith3[i].cmd!=op)&&(dArith3[i].cmd!=0)) i++;
4864        char *s = iiTwoOps(op);
4865        Werror("%s(`%s`,`%s`,`%s`) is not supported"
4866                ,s,Tok2Cmdname(at),Tok2Cmdname(bt),Tok2Cmdname(ct));
4867        if (BVERBOSE(V_SHOW_USE))
4868        {
4869          while (dArith3[i].cmd==op)
4870          {
4871            if(((at==dArith3[i].arg1)
4872            ||(bt==dArith3[i].arg2)
4873            ||(ct==dArith3[i].arg3))
4874            && (dArith3[i].res!=0))
4875            {
4876              Werror("expected %s(`%s`,`%s`,`%s`)"
4877                  ,s,Tok2Cmdname(dArith3[i].arg1)
4878                  ,Tok2Cmdname(dArith3[i].arg2)
4879                  ,Tok2Cmdname(dArith3[i].arg3));
4880            }
4881            i++;
4882          }
4883        }
4884      }
4885    }
4886    res->rtyp = UNKNOWN;
4887  }
4888  a->CleanUp();
4889  b->CleanUp();
4890  c->CleanUp();
4891        //Print("op: %d,result typ:%d\n",op,res->rtyp);
4892#endif
4893  return TRUE;
4894}
4895/*==================== operations with many arg. ===============================*/
4896
4897BOOLEAN iiExprArithM(leftv res, leftv a, int op)
4898{
4899#ifndef GENTABLE
4900  memset(res,0,sizeof(sleftv));
4901
4902  if (!errorreported)
4903  {
4904#ifdef SIC
4905    if (sic)
4906    {
4907      emStoreExpr(a);
4908      emStoreOp(op,a->listLength());
4909      res->rtyp=SIC_MASK;
4910      return FALSE;
4911    }
4912#endif
4913#ifdef SIQ
4914    if (siq>0)
4915    {
4916      //Print("siq:%d\n",siq);
4917      command d=(command)Alloc0(sizeof(ip_command));
4918      d->op=op;
4919      res->data=(char *)d;
4920      if (a!=NULL)
4921      {
4922        d->argc=a->listLength();
4923        // else : d->argc=0;
4924        memcpy(&d->arg1,a,sizeof(sleftv));
4925        switch(d->argc)
4926        {
4927          case 3:
4928            memcpy(&d->arg3,a->next->next,sizeof(sleftv));
4929            a->next->next->rtyp=0;
4930            a->next->next->data=NULL;
4931            a->next->next->name=NULL;
4932            a->next->next->attribute=NULL;
4933          case 2:
4934            memcpy(&d->arg2,a->next,sizeof(sleftv));
4935            a->next->rtyp=0;
4936            a->next->name=NULL;
4937            a->next->data=NULL;
4938            a->next->attribute=NULL;
4939            d->arg2.next=NULL;
4940          case 1:
4941            d->arg1.next=NULL;
4942        }
4943        if (d->argc>3) a->next=NULL;
4944        a->rtyp=0;
4945        a->data=NULL;
4946        a->name=NULL;
4947        a->CleanUp();
4948      }
4949      res->rtyp=COMMAND;
4950      return FALSE;
4951    }
4952#endif
4953    BOOLEAN failed=FALSE;
4954    int args=0;
4955    if (a!=NULL) args=a->listLength();
4956
4957    iiOp=op;
4958    int i=0;
4959    while ((dArithM[i].cmd!=op)&&(dArithM[i].cmd!=0)) i++;
4960    int ii=i;
4961    while (dArithM[i].cmd==op)
4962    {
4963      if ((args==dArithM[i].number_of_args)
4964      || (dArithM[i].number_of_args==-1)
4965      || ((dArithM[i].number_of_args==-2)&&(args>0)))
4966      {
4967        res->rtyp=dArithM[i].res;
4968        if (dArithM[i].p(res,a))
4969        {
4970          break;// leave loop, goto error handling
4971        }
4972        if (a!=NULL) a->CleanUp();
4973        //Print("op: %d,result typ:%d\n",op,res->rtyp);
4974        return failed;
4975      }
4976      i++;
4977    }
4978    // error handling
4979    if (!errorreported)
4980    {
4981      if ((a->rtyp==0) && (a->Name()!=sNoName))
4982      {
4983        Werror("`%s` is not defined",a->Name());
4984      }
4985      else
4986      {
4987        char *s = iiTwoOps(op);
4988        Werror("%s(...) is not supported",s);
4989      }
4990    }
4991    res->rtyp = UNKNOWN;
4992  }
4993  if (a!=NULL) a->CleanUp();
4994        //Print("op: %d,result typ:%d\n",op,res->rtyp);
4995#endif
4996  return TRUE;
4997}
4998
4999/*=================== general utilities ============================*/
5000int IsCmd(char *n, int & tok)
5001{
5002  int an=1;
5003  int i,v;
5004#ifndef GENTABLE
5005  int en=LAST_IDENTIFIER;
5006
5007  loop
5008  {
5009    if(an>=en-1)
5010    {
5011      if (strcmp(n, cmds[an].name) == 0)
5012      {
5013        i=an;
5014        break;
5015      }
5016      else if (strcmp(n, cmds[en].name) == 0)
5017      {
5018        i=en;
5019        break;
5020      }
5021      else
5022      {
5023        return 0;
5024      }
5025    }
5026    i=(an+en)/2;
5027    v=strcmp(n,cmds[i].name);
5028    if(v<0)
5029    {
5030      en=i;
5031    }
5032    else if(v>0)
5033    {
5034      an=i;
5035    }
5036    else /*v==0*/
5037    {
5038      break;
5039    }
5040  }
5041  lastreserved=cmds[i].name;
5042  tok=cmds[i].tokval;
5043  #ifndef SIC
5044  if (currRingHdl==NULL)
5045  {
5046    #ifdef SIQ
5047    if (siq<=0)
5048    {
5049    #endif
5050      if ((tok>=BEGIN_RING) && (tok<=END_RING))
5051      {
5052         Werror("no ring active");
5053         return 0;
5054      }
5055    #ifdef SIQ
5056    }
5057    #endif
5058  }
5059  #endif
5060  if (!expected_parms)
5061  {
5062    switch (tok)
5063    {
5064      #ifdef HAVE_DLD
5065      case BINARY_CMD:
5066      #endif
5067      case IDEAL_CMD:
5068      case INT_CMD:
5069      case INTVEC_CMD:
5070      case MAP_CMD:
5071      case MATRIX_CMD:
5072      case MODUL_CMD:
5073      case POLY_CMD:
5074      case PROC_CMD:
5075      case RING_CMD:
5076      case STRING_CMD:
5077        cmdtok = tok;
5078        break;
5079    }
5080  }
5081#endif
5082  return cmds[i].toktype;
5083}
5084static int iiTabIndex(const jjValCmdTab dArithTab, const int len, const int op)
5085{
5086#ifndef GENTABLE
5087  int a=0;
5088  int e=len;
5089  int p=len/2;
5090  while ( a!=e)
5091  {
5092     if (op==dArithTab[p].cmd) return dArithTab[p].start;
5093     else if (op<dArithTab[p].cmd)
5094     { e=p; p=a+(e-a)/2;}
5095     else
5096     { a=p; p=p+(e-p)/2; }
5097  }
5098#endif
5099  return -1;
5100}
5101
Note: See TracBrowser for help on using the repository browser.