source: git/Singular/iparith.cc @ fcb93e

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