source: git/Singular/iparith.cc @ f13dc47

fieker-DuValspielwiese
Last change on this file since f13dc47 was f13dc47, checked in by Hans Schönemann <hannes@…>, 25 years ago
*hannes: added ring maps between rEqual-rings (iparith.cc, ipshell.cc) git-svn-id: file:///usr/local/Singular/svn/trunk@3610 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 167.4 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: iparith.cc,v 1.174 1999-09-15 12:22:59 Singular 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_12},
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      if (rEqual(r,currRing))
1535      {
1536        nMap=nCopy;
1537      }
1538      else
1539      // Allow imap/fetch to be make an exception only for:
1540      if ( (rField_is_Q_a(r) &&  // Q(a..) -> Q(a..) || Q || Zp || Zp(a)
1541            (rField_is_Q() || rField_is_Q_a() ||
1542             (rField_is_Zp() || rField_is_Zp_a())))
1543           ||
1544           (rField_is_Zp_a(r) &&  // Zp(a..) -> Zp(a..) || Zp
1545            (rField_is_Zp(currRing, rInternalChar(r)) ||
1546             rField_is_Zp_a(currRing, rInternalChar(r)))) )
1547      {
1548        par_perm_size=rPar(r);
1549        BITSET save_test=test;
1550        naSetChar(rInternalChar(r),TRUE,r->parameter,rPar(r));
1551        nSetChar(currRing,TRUE);
1552        test=save_test;
1553      }
1554      else
1555      {
1556        goto err_fetch;
1557      }
1558    }
1559    if ((iiOp!=FETCH_CMD) || (r->N!=pVariables) || (rPar(r)!=rPar(currRing)))
1560    {
1561      perm=(int *)Alloc0((r->N+1)*sizeof(int));
1562      if (par_perm_size!=0)
1563        par_perm=(int *)Alloc0(par_perm_size*sizeof(int));
1564      op=IMAP_CMD;
1565      if (iiOp==IMAP_CMD)
1566      {
1567        maFindPerm(r->names,       r->N,       r->parameter,        r->P,
1568                   currRing->names,currRing->N,currRing->parameter, currRing->P,
1569                   perm,par_perm, currRing->ch);
1570      }
1571      else
1572      {
1573        int i;
1574        if (par_perm_size!=0)
1575          for(i=0;i<min(rPar(r),rPar(currRing));i++) par_perm[i]=-(i+1);
1576        for(i=1;i<=min(r->N,pVariables);i++) perm[i]=i;
1577      }
1578    }
1579    sleftv tmpW;
1580    memset(&tmpW,0,sizeof(sleftv));
1581    tmpW.rtyp=IDTYP(w);
1582    tmpW.data=IDDATA(w);
1583    if ((bo=maApplyFetch(op,NULL,res,&tmpW, r,
1584                         perm,par_perm,par_perm_size)))
1585    {
1586      Werror("cannot map %s of type %s(%d)",v->name, Tok2Cmdname(w->typ),w->typ);
1587    }
1588    if (perm!=NULL)
1589      Free((ADDRESS)perm,(r->N+1)*sizeof(int));
1590    if (par_perm!=NULL)
1591      Free((ADDRESS)par_perm,par_perm_size*sizeof(int));
1592    return bo;
1593  }
1594  else
1595  {
1596    Werror("identifier %s not found in %s",v->Fullname(),u->Fullname());
1597  }
1598  return TRUE;
1599err_fetch:
1600  Werror("no identity map from %s",u->Fullname());
1601  return TRUE;
1602}
1603static BOOLEAN jjFIND2(leftv res, leftv u, leftv v)
1604{
1605  /*4
1606  * look for the substring what in the string where
1607  * return the position of the first char of what in where
1608  * or 0
1609  */
1610  char *where=(char *)u->Data();
1611  char *what=(char *)v->Data();
1612  char *found = strstr(where,what);
1613  if (found != NULL)
1614  {
1615    res->data=(char *)((found-where)+1);
1616  }
1617  /*else res->data=NULL;*/
1618  return FALSE;
1619}
1620static BOOLEAN jjGCD_I(leftv res, leftv u, leftv v)
1621{
1622  int p0=ABS((int)u->Data()),p1=ABS((int)v->Data());
1623  int r;
1624
1625  while ( p1!=0 )
1626  {
1627    r=p0 % p1;
1628    p0 = p1; p1 = r;
1629  }
1630  res->rtyp=INT_CMD;
1631  res->data=(char *)p0;
1632  return FALSE;
1633}
1634static BOOLEAN jjHILBERT2(leftv res, leftv u, leftv v)
1635{
1636  assumeStdFlag(u);
1637  intvec *module_w=(intvec*)atGet(u,"isHomog");
1638  intvec *iv=hFirstSeries((ideal)u->Data(),module_w,currQuotient);
1639  switch((int)v->Data())
1640  {
1641    case 1:
1642      res->data=(void *)iv;
1643      return FALSE;
1644    case 2:
1645      res->data=(void *)hSecondSeries(iv);
1646      delete iv;
1647      return FALSE;
1648  }
1649  WerrorS(feNotImplemented);
1650  delete iv;
1651  return TRUE;
1652}
1653static BOOLEAN jjHOMOG_P(leftv res, leftv u, leftv v)
1654{
1655  int i=pVar((poly)v->Data());
1656  if (i==0)
1657  {
1658    WerrorS("ringvar expected");
1659    return TRUE;
1660  }
1661  res->data = (char *)pHomogen((poly)u->Data(),i);
1662  return FALSE;
1663}
1664static BOOLEAN jjHOMOG_ID(leftv res, leftv u, leftv v)
1665{
1666  int i=pVar((poly)v->Data());
1667  if (i==0)
1668  {
1669    WerrorS("ringvar expected");
1670    return TRUE;
1671  }
1672  res->data = (char *)idHomogen((ideal)u->Data(),i);
1673  return FALSE;
1674}
1675static BOOLEAN jjINDEPSET2(leftv res, leftv u, leftv v)
1676{
1677  assumeStdFlag(u);
1678  res->data=(void *)scIndIndset((ideal)(u->Data()),(int)(v->Data()),
1679                    currQuotient);
1680  return FALSE;
1681}
1682static BOOLEAN jjINTERSECT(leftv res, leftv u, leftv v)
1683{
1684  res->data=(char *)idSect((ideal)u->Data(),(ideal)v->Data());
1685  setFlag(res,FLAG_STD);
1686  return FALSE;
1687}
1688static BOOLEAN jjJET_P(leftv res, leftv u, leftv v)
1689{
1690  res->data = (char *)pJet((poly)u->Data(),(int)v->Data());
1691  return FALSE;
1692}
1693static BOOLEAN jjJET_ID(leftv res, leftv u, leftv v)
1694{
1695  res->data = (char *)idJet((ideal)u->Data(),(int)v->Data());
1696  return FALSE;
1697}
1698static BOOLEAN jjKBASE2(leftv res, leftv u, leftv v)
1699{
1700  assumeStdFlag(u);
1701  res->data = (char *)scKBase((int)v->Data(),
1702                              (ideal)(u->Data()),currQuotient);
1703  return FALSE;
1704}
1705static BOOLEAN jjKoszul(leftv res, leftv u, leftv v)
1706{
1707  return mpKoszul(res, u,v);
1708}
1709static BOOLEAN jjKoszul_Id(leftv res, leftv u, leftv v)
1710{
1711  sleftv h;
1712  memset(&h,0,sizeof(sleftv));
1713  h.rtyp=INT_CMD;
1714  h.data=(void *)IDELEMS((ideal)v->Data());
1715  return mpKoszul(res, &h, u, v);
1716}
1717static BOOLEAN jjLIFT(leftv res, leftv u, leftv v)
1718{
1719  ideal m;
1720  int ul= IDELEMS((ideal)u->Data());
1721  int vl= IDELEMS((ideal)v->Data());
1722  if (hasFlag(u,FLAG_STD))
1723  {
1724    m = idLift((ideal)u->Data(),(ideal)v->Data());
1725    res->data = (char *)idModule2formatedMatrix(m,ul,vl);
1726  }
1727  else
1728  {
1729    // matrix ma=mpNew(1,1);
1730    // ideal mo=idLiftStd((ideal)u->CopyD(),currQuotient,&ma,testHomog);
1731    // m = idLift(mo,(ideal)v->Data());
1732    // matrix r=idModule2formatedMatrix(m, IDELEMS(mo),vl);
1733    // idDelete(&mo);
1734    // // idDelete(&m); already done by idModule2formatedMatrix
1735    // res->data=(char *)mpMult(ma,r);
1736    // idDelete((ideal *)&ma);
1737    // idDelete((ideal *)&r);
1738    m = idLiftNonStB((ideal)u->Data(),(ideal)v->Data());
1739    res->data = (char *)idModule2formatedMatrix(m,ul,vl);
1740  }
1741  return FALSE;
1742}
1743static BOOLEAN jjLIFTSTD(leftv res, leftv u, leftv v)
1744{
1745  if ((v->rtyp!=IDHDL)||(v->e!=NULL)) return TRUE;
1746  idhdl h=(idhdl)v->data;
1747  res->data = (char *)idLiftStd((ideal)u->CopyD(), currQuotient,
1748              &(h->data.umatrix),testHomog);
1749  setFlag(res,FLAG_STD);
1750  return FALSE;
1751}
1752static BOOLEAN jjMINOR(leftv res, leftv u, leftv v)
1753{
1754  res->data = (char *)idMinors((matrix)u->Data(),(int)v->Data());
1755  return FALSE;
1756}
1757static BOOLEAN jjMODULO(leftv res, leftv u, leftv v)
1758{
1759  res->data = (char *)idModulo((ideal)u->Data(),(ideal)v->Data());
1760  return FALSE;
1761}
1762static BOOLEAN jjMONITOR2(leftv res, leftv u,leftv v)
1763{
1764  char *opt=(char *)v->Data();
1765  int mode=0;
1766  while(*opt!='\0')
1767  {
1768    if (*opt=='i') mode |= PROT_I;
1769    else if (*opt=='o') mode |= PROT_O;
1770    opt++;
1771  }
1772  monitor((char *)(u->Data()),mode);
1773  return FALSE;
1774}
1775static BOOLEAN jjPARSTR2(leftv res, leftv u, leftv v)
1776{
1777  idhdl h=(idhdl)u->data;
1778  int i=(int)v->Data();
1779  int p=0;
1780  if ((0<i)
1781  && (IDRING(h)->parameter!=NULL)
1782  && (i<=(p=rPar(IDRING(h)))))
1783    res->data=mstrdup(IDRING(h)->parameter[i-1]);
1784  else
1785  {
1786    Werror("par number %d out of range 1..%d",i,p);
1787    return TRUE;
1788  }
1789  return FALSE;
1790}
1791static BOOLEAN jjQUOT(leftv res, leftv u, leftv v)
1792{
1793  res->data = (char *)idQuot((ideal)u->Data(),(ideal)v->Data(),
1794    hasFlag(u,FLAG_STD),u->Typ()==v->Typ());
1795  idDelMultiples((ideal)(res->data));
1796  return FALSE;
1797}
1798static BOOLEAN jjRANDOM(leftv res, leftv u, leftv v)
1799{
1800  int i=(int)u->Data();
1801  int j=(int)v->Data();
1802#ifdef buildin_rand
1803  res->data =(char *)((i > j) ? i : (siRand() % (j-i+1)) + i);
1804#else
1805  res->data =(char *)((i > j) ? i : (rand() % (j-i+1)) + i);
1806#endif
1807  return FALSE;
1808}
1809static BOOLEAN jjREAD2(leftv res, leftv u, leftv v)
1810{
1811  si_link l=(si_link)u->Data();
1812  leftv r=slRead(l,v);
1813  if (r==NULL)
1814  {
1815    const char *s;
1816    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
1817    else                            s=sNoName;
1818    Werror("cannot read from `%s`",s);
1819    return TRUE;
1820  }
1821  memcpy(res,r,sizeof(sleftv));
1822  Free((ADDRESS)r,sizeof(sleftv));
1823  return FALSE;
1824}
1825static BOOLEAN jjREDUCE_P(leftv res, leftv u, leftv v)
1826{
1827  assumeStdFlag(v);
1828  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(poly)u->Data());
1829  return FALSE;
1830}
1831static BOOLEAN jjREDUCE_ID(leftv res, leftv u, leftv v)
1832{
1833  assumeStdFlag(v);
1834  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(ideal)u->Data());
1835  return FALSE;
1836}
1837static BOOLEAN jjRES(leftv res, leftv u, leftv v)
1838{
1839  int maxl=(int)v->Data();
1840  if (maxl<0)
1841  {
1842    WerrorS("length for res must not be negative");
1843    return TRUE;
1844  }
1845  int l=0;
1846  //resolvente r;
1847  syStrategy r;
1848  intvec **weights=NULL;
1849  int wmaxl=maxl;
1850  ideal u_id=(ideal)u->Data();
1851  maxl--;
1852  if ((maxl==-1) && (iiOp!=MRES_CMD))
1853    maxl = pVariables-1;
1854  if ((iiOp == RES_CMD) || (iiOp == MRES_CMD))
1855  {
1856    //if (BTEST1(28))
1857    //{
1858    //  r=syMinRes(u_id,maxl,&l, iiOp==MRES_CMD);
1859    //}
1860    //else
1861    {
1862      intvec * iv=(intvec*)atGet(u,"isHomog");
1863      //if (iv!=NULL)
1864      //{
1865      //  weights = (intvec**)Alloc0(sizeof(intvec*));
1866      //  weights[0] = ivCopy(iv);
1867      //  l=1;
1868      //}
1869      //r=syResolvente(u_id,maxl,&l, &weights, iiOp==MRES_CMD);
1870      r=syResolution(u_id,maxl, iv, iiOp==MRES_CMD);
1871    }
1872  }
1873  else if (iiOp==SRES_CMD)
1874  //  r=sySchreyerResolvente(u_id,maxl+1,&l);
1875    r=sySchreyer(u_id,maxl+1);
1876  else /* LRES */
1877  {
1878    int dummy;
1879    if((currQuotient!=NULL)||
1880    (!idHomIdeal (u_id,NULL)))
1881    {
1882       WerrorS
1883       ("`lres` not implemented for inhomogeneous input or qring");
1884       return TRUE;
1885    }
1886    r=syLaScala3(u_id,&dummy);
1887  }
1888  if (r==NULL) return TRUE;
1889  //res->data=(void *)liMakeResolv(r,l,wmaxl,u->Typ(),weights);
1890  r->list_length=wmaxl;
1891  res->data=(void *)r;
1892  return FALSE;
1893}
1894static BOOLEAN jjRSUM(leftv res, leftv u, leftv v)
1895{
1896  ring r;
1897  int i=rSum((ring)u->Data(),(ring)v->Data(),r);
1898  res->data = (char *)r;
1899  return (i==-1);
1900}
1901#define SIMPL_LMDIV 32
1902#define SIMPL_LMEQ  16
1903#define SIMPL_MULT 8
1904#define SIMPL_EQU  4
1905#define SIMPL_NULL 2
1906#define SIMPL_NORM 1
1907static BOOLEAN jjSIMPL_ID(leftv res, leftv u, leftv v)
1908{
1909  int sw = (int)v->Data();
1910  ideal id = (ideal)u->CopyD();
1911  if (sw & SIMPL_LMDIV)
1912  {
1913    idDelDiv(id);
1914  }
1915  if (sw & SIMPL_LMEQ)
1916  {
1917    idDelLmEquals(id);
1918  }
1919  if (sw & SIMPL_NULL)
1920  {
1921    idSkipZeroes(id);
1922  }
1923  if (sw & SIMPL_NORM)
1924  {
1925    idNorm(id);
1926  }
1927  if (sw & SIMPL_MULT)
1928  {
1929    idDelMultiples(id);
1930  }
1931  else if(sw & SIMPL_EQU)
1932  {
1933    idDelEquals(id);
1934  }
1935  res->data = (char * )id;
1936  return FALSE;
1937}
1938static BOOLEAN jjSTATUS2(leftv res, leftv u, leftv v)
1939{
1940  res->data = mstrdup(slStatus((si_link) u->Data(), (char *) v->Data()));
1941  return FALSE;
1942}
1943static BOOLEAN jjSIMPL_P(leftv res, leftv u, leftv v)
1944{
1945  int sw = (int)v->Data();
1946  poly p = (poly)u->CopyD();
1947  if (sw & SIMPL_NORM)
1948  {
1949    pNorm(p);
1950  }
1951  res->data = (char * )p;
1952  return FALSE;
1953}
1954static BOOLEAN jjSTD_HILB(leftv res, leftv u, leftv v)
1955{
1956  ideal result;
1957  intvec *w=(intvec *)atGet(u,"isHomog");
1958  tHomog hom=testHomog;
1959  if (w!=NULL)
1960  {
1961    w=ivCopy(w);
1962    hom=isHomog;
1963  }
1964  result=kStd((ideal)(u->Data()),currQuotient,hom,&w,(intvec *)v->Data());
1965  idSkipZeroes(result);
1966  res->data = (char *)result;
1967  setFlag(res,FLAG_STD);
1968  if (w!=NULL) atSet(res,mstrdup("isHomog"),w,INTVEC_CMD);
1969  return FALSE;
1970}
1971static BOOLEAN jjSTD_1(leftv res, leftv u, leftv v)
1972{
1973  ideal result;
1974  intvec *w=(intvec *)atGet(u,"isHomog");
1975  tHomog hom=testHomog;
1976  if (w!=NULL)
1977  {
1978    w=ivCopy(w);
1979    hom=isHomog;
1980  }
1981  ideal i1=(ideal)u->Data();
1982  ideal i0=idInit(1,i1->rank);
1983  i0->m[0]=(poly)v->Data();
1984  i1=idSimpleAdd(i1,i0);
1985  i0->m[0]=NULL;
1986  idDelete(&i0);
1987  BITSET save_test=test;
1988  test|=Sy_bit(OPT_SB_1);
1989  result=kStd(i1,currQuotient,hom,&w);
1990  test=save_test;
1991  idDelete(&i1);
1992  idSkipZeroes(result);
1993  res->data = (char *)result;
1994  setFlag(res,FLAG_STD);
1995  if (w!=NULL) atSet(res,mstrdup("isHomog"),w,INTVEC_CMD);
1996  return FALSE;
1997}
1998static BOOLEAN jjVARSTR2(leftv res, leftv u, leftv v)
1999{
2000  idhdl h=(idhdl)u->data;
2001  int i=(int)v->Data();
2002  if ((0<i) && (i<=IDRING(h)->N))
2003    res->data=mstrdup(IDRING(h)->names[i-1]);
2004  else
2005  {
2006    Werror("var number %d out of range 1..%d",i,IDRING(h)->N);
2007    return TRUE;
2008  }
2009  return FALSE;
2010}
2011static BOOLEAN jjWEDGE(leftv res, leftv u, leftv v)
2012{
2013  res->data = (char *)mpWedge((matrix)u->Data(),(int)v->Data());
2014  return FALSE;
2015}
2016#define jjWRONG2 (proc2)jjWRONG
2017#define jjWRONG3 (proc3)jjWRONG
2018static BOOLEAN jjWRONG(leftv res, leftv u)
2019{
2020  return TRUE;
2021}
2022
2023static BOOLEAN jjLOAD_E(leftv res, leftv v, leftv u)
2024{
2025  char * s=(char *)u->Data();
2026  if(strcmp(s, "with")==0)
2027    return jjLOAD(res, v, TRUE);
2028  WerrorS("invalid second argument");
2029  WerrorS("load(\"libname\" [,\"with\"]);");
2030  return TRUE;
2031}
2032
2033/*=================== operations with 2 args.: table =================*/
2034
2035struct sValCmd2 dArith2[]=
2036{
2037// operations:
2038// proc        cmd              res             arg1        arg2
2039 {jjCOLCOL,    COLONCOLON,     ANY_TYPE,       DEF_CMD,    DEF_CMD      PROFILER}
2040,{jjPLUS_I,    '+',            INT_CMD,        INT_CMD,    INT_CMD        PROFILER}
2041,{jjPLUS_N,    '+',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD     PROFILER}
2042,{jjPLUS_P,    '+',            POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2043,{jjPLUS_P,    '+',            VECTOR_CMD,     VECTOR_CMD, VECTOR_CMD PROFILER}
2044,{jjPLUS_ID,   '+',            IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
2045,{jjPLUS_ID,   '+',            MODUL_CMD,      MODUL_CMD,  MODUL_CMD PROFILER}
2046,{jjPLUS_P_MA, '+',            MATRIX_CMD,     POLY_CMD,   MATRIX_CMD PROFILER}
2047,{jjPLUS_MA_P, '+',            MATRIX_CMD,     MATRIX_CMD, POLY_CMD PROFILER}
2048,{jjPLUS_MA,   '+',            MATRIX_CMD,     MATRIX_CMD, MATRIX_CMD PROFILER}
2049,{jjPLUS_S,    '+',            STRING_CMD,     STRING_CMD, STRING_CMD PROFILER}
2050,{jjOP_IV_I,   '+',            INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
2051,{jjOP_I_IV,   '+',            INTVEC_CMD,     INT_CMD,    INTVEC_CMD PROFILER}
2052,{jjOP_IM_I,   '+',            INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
2053,{jjOP_I_IM,   '+',            INTMAT_CMD,     INT_CMD,    INTMAT_CMD PROFILER}
2054,{jjPLUS_IV,   '+',            INTVEC_CMD,     INTVEC_CMD, INTVEC_CMD PROFILER}
2055,{jjPLUS_IV,   '+',            INTMAT_CMD,     INTMAT_CMD, INTMAT_CMD PROFILER}
2056,{lAdd,        '+',            LIST_CMD,       LIST_CMD,   LIST_CMD PROFILER}
2057,{jjRSUM,      '+',            RING_CMD,       RING_CMD,   RING_CMD PROFILER}
2058,{jjMINUS_I,   '-',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2059,{jjMINUS_N,   '-',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD PROFILER}
2060,{jjMINUS_P,   '-',            POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2061,{jjMINUS_P,   '-',            VECTOR_CMD,     VECTOR_CMD, VECTOR_CMD PROFILER}
2062,{jjPLUS_MA_P, '-',            MATRIX_CMD,     MATRIX_CMD, POLY_CMD PROFILER}
2063,{jjMINUS_MA,  '-',            MATRIX_CMD,     MATRIX_CMD, MATRIX_CMD PROFILER}
2064,{jjOP_IV_I,   '-',            INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
2065,{jjOP_IM_I,   '-',            INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
2066,{jjMINUS_IV,  '-',            INTVEC_CMD,     INTVEC_CMD, INTVEC_CMD PROFILER}
2067,{jjMINUS_IV,  '-',            INTMAT_CMD,     INTMAT_CMD, INTMAT_CMD PROFILER}
2068,{jjTIMES_I,   '*',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2069,{jjTIMES_N,   '*',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD PROFILER}
2070,{jjTIMES_P,   '*',            POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2071,{jjTIMES_P,   '*',            VECTOR_CMD,     POLY_CMD,   VECTOR_CMD PROFILER}
2072,{jjTIMES_P,   '*',            VECTOR_CMD,     VECTOR_CMD, POLY_CMD PROFILER}
2073,{jjTIMES_MA_P1,'*',           IDEAL_CMD,      IDEAL_CMD,  POLY_CMD PROFILER}
2074,{jjTIMES_MA_P2,'*',           IDEAL_CMD,      POLY_CMD,   IDEAL_CMD PROFILER}
2075,{jjTIMES_ID,  '*',            IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
2076,{jjTIMES_MA_P1,'*',           MODUL_CMD,      IDEAL_CMD,  VECTOR_CMD PROFILER}
2077,{jjTIMES_MA_P2,'*',           MODUL_CMD,      VECTOR_CMD, IDEAL_CMD PROFILER}
2078,{jjTIMES_ID,  '*',            MODUL_CMD,      IDEAL_CMD,  MODUL_CMD PROFILER}
2079,{jjTIMES_ID,  '*',            MODUL_CMD,      MODUL_CMD,  IDEAL_CMD PROFILER}
2080,{jjTIMES_MA_P1,'*',           MATRIX_CMD,     MATRIX_CMD, POLY_CMD PROFILER}
2081,{jjTIMES_MA_P2,'*',           MATRIX_CMD,     POLY_CMD,   MATRIX_CMD PROFILER}
2082,{jjTIMES_MA_N1,'*',           MATRIX_CMD,     MATRIX_CMD, NUMBER_CMD PROFILER}
2083,{jjTIMES_MA_N2,'*',           MATRIX_CMD,     NUMBER_CMD, MATRIX_CMD PROFILER}
2084,{jjTIMES_MA_I1,'*',           MATRIX_CMD,     MATRIX_CMD, INT_CMD PROFILER}
2085,{jjTIMES_MA_I2,'*',           MATRIX_CMD,     INT_CMD,    MATRIX_CMD PROFILER}
2086,{jjTIMES_MA,  '*',            MATRIX_CMD,     MATRIX_CMD, MATRIX_CMD PROFILER}
2087,{jjOP_IV_I,   '*',            INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
2088,{jjOP_I_IV,   '*',            INTVEC_CMD,     INT_CMD,    INTVEC_CMD PROFILER}
2089,{jjOP_IV_I,   '*',            INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
2090,{jjOP_I_IV,   '*',            INTMAT_CMD,     INT_CMD,    INTMAT_CMD PROFILER}
2091,{jjTIMES_IV,  '*',            INTVEC_CMD,     INTMAT_CMD, INTVEC_CMD PROFILER}
2092,{jjTIMES_IV,  '*',            INTMAT_CMD,     INTMAT_CMD, INTMAT_CMD PROFILER}
2093,{jjTIMES_IV,  '*',            INTMAT_CMD,     INTVEC_CMD, INTMAT_CMD PROFILER}
2094,{jjDIV_N,     '/',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD PROFILER}
2095,{jjDIV_P,     '/',            POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2096,{jjDIV_P,     '/',            VECTOR_CMD,     VECTOR_CMD, POLY_CMD PROFILER}
2097,{jjDIV_I,     '/',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2098,{jjOP_IV_I,   '/',            INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
2099,{jjOP_IV_I,   '/',            INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
2100,{jjDIV_I,     INTDIV,         INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2101,{jjOP_IV_I,   INTDIV,         INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
2102,{jjOP_IV_I,   INTDIV,         INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
2103,{jjMOD_I,     '%',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2104,{jjOP_IV_I,   '%',            INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
2105,{jjOP_IV_I,   '%',            INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
2106,{jjPOWER_I,   '^',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2107,{jjPOWER_N,   '^',            NUMBER_CMD,     NUMBER_CMD, INT_CMD PROFILER}
2108,{jjPOWER_P,   '^',            POLY_CMD,       POLY_CMD,   INT_CMD PROFILER}
2109,{jjPOWER_ID,  '^',            IDEAL_CMD,      IDEAL_CMD,  INT_CMD PROFILER}
2110,{jjLE_I,      LE,             INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2111,{jjLE_N,      LE,             INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
2112,{jjCOMPARE_S, LE,             INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
2113,{jjCOMPARE_IV_I,LE,           INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
2114,{jjCOMPARE_IV,LE,             INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
2115,{jjCOMPARE_P, LE,             INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
2116,{jjCOMPARE_P, LE,             INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
2117,{jjLT_I,      '<',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2118,{jjLT_N,      '<',            INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
2119,{jjCOMPARE_IV_I,'<',           INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
2120,{jjCOMPARE_IV,'<',            INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
2121,{jjCOMPARE_S, '<',            INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
2122,{jjCOMPARE_P, '<',            INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
2123,{jjCOMPARE_P, '<',            INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
2124,{jjGE_I,      GE,             INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2125,{jjGE_N,      GE,             INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
2126,{jjCOMPARE_S, GE,             INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
2127,{jjCOMPARE_IV_I,GE,           INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
2128,{jjCOMPARE_IV,GE,             INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
2129,{jjCOMPARE_P, GE,             INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
2130,{jjCOMPARE_P, GE,             INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
2131,{jjGT_I,      '>',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2132,{jjGT_N,      '>',            INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
2133,{jjCOMPARE_S, '>',            INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
2134,{jjCOMPARE_IV_I,'>',          INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
2135,{jjCOMPARE_IV,'>',            INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
2136,{jjCOMPARE_P, '>',            INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
2137,{jjCOMPARE_P, '>',            INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
2138,{jjAND_I,     '&',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2139,{jjOR_I,      '|',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2140,{jjEQUAL_I,   EQUAL_EQUAL,    INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2141,{jjEQUAL_N,   EQUAL_EQUAL,    INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
2142,{jjCOMPARE_S, EQUAL_EQUAL,    INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
2143,{jjEQUAL_P,   EQUAL_EQUAL,    INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
2144,{jjEQUAL_P,   EQUAL_EQUAL,    INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
2145,{jjCOMPARE_IV_I,EQUAL_EQUAL,  INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
2146,{jjCOMPARE_IV,EQUAL_EQUAL,    INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
2147,{jjCOMPARE_IV,EQUAL_EQUAL,    INT_CMD,        INTMAT_CMD, INTMAT_CMD PROFILER}
2148,{jjEQUAL_Ma,  EQUAL_EQUAL,    INT_CMD,        MATRIX_CMD, MATRIX_CMD PROFILER}
2149,{jjWRONG2,    EQUAL_EQUAL,    0,              IDEAL_CMD,  IDEAL_CMD PROFILER}
2150,{jjWRONG2,    EQUAL_EQUAL,    0,              MODUL_CMD,  MODUL_CMD PROFILER}
2151,{jjEQUAL_I,   NOTEQUAL,       INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2152,{jjEQUAL_N,   NOTEQUAL,       INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
2153,{jjCOMPARE_S, NOTEQUAL,       INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
2154,{jjEQUAL_P,   NOTEQUAL,       INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
2155,{jjEQUAL_P,   NOTEQUAL,       INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
2156,{jjCOMPARE_IV,NOTEQUAL,       INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
2157,{jjCOMPARE_IV,NOTEQUAL,       INT_CMD,        INTMAT_CMD, INTMAT_CMD PROFILER}
2158,{jjEQUAL_Ma,  NOTEQUAL,       INT_CMD,        MATRIX_CMD, MATRIX_CMD PROFILER}
2159,{jjWRONG2,    NOTEQUAL,       0,              IDEAL_CMD,  IDEAL_CMD PROFILER}
2160,{jjWRONG2,    NOTEQUAL,       0,              MODUL_CMD,  MODUL_CMD PROFILER}
2161,{jjDOTDOT,    DOTDOT,         INTVEC_CMD,     INT_CMD,    INT_CMD PROFILER}
2162,{jjINDEX_I,   '[',            INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
2163,{jjINDEX_IV,  '[',            INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
2164,{jjINDEX_I,   '[',            POLY_CMD,       IDEAL_CMD,  INT_CMD PROFILER}
2165,{jjINDEX_I,   '[',            POLY_CMD,       MAP_CMD,    INT_CMD PROFILER}
2166,{jjINDEX_IV,  '[',            POLY_CMD,       IDEAL_CMD,  INTVEC_CMD PROFILER}
2167,{jjINDEX_I,   '[',            VECTOR_CMD,     MODUL_CMD,  INT_CMD PROFILER}
2168,{jjINDEX_IV,  '[',            VECTOR_CMD,     MODUL_CMD,  INTVEC_CMD PROFILER}
2169,{jjINDEX_I,   '[',            STRING_CMD,     STRING_CMD, INT_CMD PROFILER}
2170,{jjINDEX_IV,  '[',            STRING_CMD,     STRING_CMD, INTVEC_CMD PROFILER}
2171,{jjINDEX_I,   '[',            ANY_TYPE/*set by p*/,LIST_CMD, INT_CMD PROFILER}
2172,{jjINDEX_IV,  '[',            ANY_TYPE/*set by p*/,LIST_CMD, INTVEC_CMD PROFILER}
2173,{jjINDEX_P,   '[',            POLY_CMD,       POLY_CMD,   INT_CMD PROFILER}
2174,{jjINDEX_P_IV,'[',            POLY_CMD,       POLY_CMD,   INTVEC_CMD PROFILER}
2175,{jjINDEX_V,   '[',            POLY_CMD,       VECTOR_CMD, INT_CMD PROFILER}
2176,{jjINDEX_V_IV,'[',            VECTOR_CMD,     VECTOR_CMD, INTVEC_CMD PROFILER}
2177,{jjPROC,      '(',            ANY_TYPE/*set by p*/,PROC_CMD, DEF_CMD PROFILER}
2178,{jjMAP,       '(',            ANY_TYPE/*set by p*/,MAP_CMD, DEF_CMD PROFILER}
2179,{jjKLAMMER,   '(',            ANY_TYPE/*set by p*/,ANY_TYPE, INT_CMD PROFILER}
2180,{jjKLAMMER_IV,'(',            ANY_TYPE/*set by p*/,ANY_TYPE, INTVEC_CMD PROFILER}
2181// and the procedures with 2 arguments:
2182,{atATTRIB2,   ATTRIB_CMD,     NONE/*set by p*/,DEF_CMD,   STRING_CMD PROFILER}
2183,{jjWRONG2,    BAREISS_CMD,    0,              DEF_CMD,    DEF_CMD PROFILER}
2184,{syBetti2,    BETTI_CMD,      INTMAT_CMD,     RESOLUTION_CMD, INT_CMD PROFILER}
2185,{jjCOEF,      COEF_CMD,       MATRIX_CMD,     POLY_CMD,   POLY_CMD PROFILER}
2186,{jjCOEFFS_Id, COEFFS_CMD,     MATRIX_CMD,     IDEAL_CMD,  POLY_CMD PROFILER}
2187,{jjCOEFFS_Id, COEFFS_CMD,     MATRIX_CMD,     MODUL_CMD,  POLY_CMD PROFILER}
2188,{jjCONTRACT,  CONTRACT_CMD,   MATRIX_CMD,     IDEAL_CMD,  IDEAL_CMD PROFILER}
2189,{jjDEG_IV,    DEG_CMD,        INT_CMD,        POLY_CMD,   INTVEC_CMD PROFILER}
2190,{lDelete,     DELETE_CMD,     LIST_CMD,       LIST_CMD,   INT_CMD PROFILER}
2191,{jjDIFF_P,    DIFF_CMD,       POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2192,{jjDIFF_P,    DIFF_CMD,       VECTOR_CMD,     VECTOR_CMD, POLY_CMD PROFILER}
2193,{jjDIFF_ID,   DIFF_CMD,       IDEAL_CMD,      IDEAL_CMD,  POLY_CMD PROFILER}
2194,{jjDIFF_ID_ID,DIFF_CMD,       MATRIX_CMD,     IDEAL_CMD,  IDEAL_CMD PROFILER}
2195,{jjDIFF_ID,   DIFF_CMD,       MODUL_CMD,      MODUL_CMD,  POLY_CMD PROFILER}
2196,{jjDIFF_ID,   DIFF_CMD,       MATRIX_CMD,     MATRIX_CMD, POLY_CMD PROFILER}
2197,{jjDIM2,      DIM_CMD,        INT_CMD,        IDEAL_CMD,  IDEAL_CMD PROFILER}
2198,{jjDIM2,      DIM_CMD,        INT_CMD,        MODUL_CMD,  IDEAL_CMD PROFILER}
2199,{jjELIMIN,    ELIMINATION_CMD,IDEAL_CMD,      IDEAL_CMD,  POLY_CMD PROFILER}
2200,{jjELIMIN,    ELIMINATION_CMD,MODUL_CMD,      MODUL_CMD,  POLY_CMD PROFILER}
2201,{jjEXTGCD_I,  EXTGCD_CMD,     LIST_CMD,       INT_CMD,    INT_CMD PROFILER}
2202#ifdef HAVE_FACTORY
2203,{jjEXTGCD_P,  EXTGCD_CMD,     LIST_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2204,{jjSQR_FREE_DEC,FAC_CMD,      IDEAL_CMD,      POLY_CMD,   INT_CMD PROFILER}
2205,{jjFACSTD2,    FACSTD_CMD,    LIST_CMD,       IDEAL_CMD,  IDEAL_CMD PROFILER}
2206#else
2207,{jjWRONG2,    EXTGCD_CMD,     LIST_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2208,{jjWRONG2,    FAC_CMD,        IDEAL_CMD,      POLY_CMD,   INT_CMD PROFILER}
2209,{jjWRONG2,    FACSTD_CMD,     LIST_CMD,       IDEAL_CMD,  IDEAL_CMD PROFILER}
2210#endif
2211,{jjFETCH,     FETCH_CMD,      ANY_TYPE/*set by p*/,RING_CMD,  ANY_TYPE PROFILER}
2212,{jjFETCH,     FETCH_CMD,      ANY_TYPE/*set by p*/,QRING_CMD, ANY_TYPE PROFILER}
2213#ifdef HAVE_FGLM
2214,{fglmProc,    FGLM_CMD,       IDEAL_CMD,      RING_CMD,   DEF_CMD PROFILER}
2215,{fglmProc,    FGLM_CMD,       IDEAL_CMD,      QRING_CMD,  DEF_CMD PROFILER}
2216#else
2217,{jjWRONG2,    FGLM_CMD,       IDEAL_CMD,      RING_CMD,   DEF_CMD PROFILER}
2218,{jjWRONG2,    FGLM_CMD,       IDEAL_CMD,      QRING_CMD,  DEF_CMD PROFILER}
2219#endif
2220,{jjFIND2,     FIND_CMD,       INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
2221,{jjGCD_I,     GCD_CMD,        INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2222#ifdef HAVE_FACTORY
2223,{jjGCD_P,     GCD_CMD,        POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2224#else
2225,{jjWRONG2,    GCD_CMD,        POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2226#endif
2227,{jjHILBERT2,  HILBERT_CMD,    INTVEC_CMD,     IDEAL_CMD,  INT_CMD PROFILER}
2228,{jjHILBERT2,  HILBERT_CMD,    INTVEC_CMD,     MODUL_CMD,  INT_CMD PROFILER}
2229,{jjHOMOG_P,   HOMOG_CMD,      POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2230,{jjHOMOG_P,   HOMOG_CMD,      VECTOR_CMD,     VECTOR_CMD, POLY_CMD PROFILER}
2231,{jjHOMOG_ID,  HOMOG_CMD,      IDEAL_CMD,      IDEAL_CMD,  POLY_CMD PROFILER}
2232,{jjHOMOG_ID,  HOMOG_CMD,      MODUL_CMD,      MODUL_CMD,  POLY_CMD PROFILER}
2233,{jjCALL2MANY, IDEAL_CMD,      IDEAL_CMD,      DEF_CMD,    DEF_CMD PROFILER}
2234,{jjFETCH,     IMAP_CMD,       ANY_TYPE/*set by p*/,RING_CMD,  ANY_TYPE PROFILER}
2235,{jjFETCH,     IMAP_CMD,       ANY_TYPE/*set by p*/,QRING_CMD, ANY_TYPE PROFILER}
2236,{jjINDEPSET2, INDEPSET_CMD,   LIST_CMD,       IDEAL_CMD,  INT_CMD PROFILER}
2237,{lInsert,     INSERT_CMD,     LIST_CMD,       LIST_CMD,   DEF_CMD PROFILER}
2238,{jjINTERSECT, INTERSECT_CMD,  IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
2239,{jjINTERSECT, INTERSECT_CMD,  MODUL_CMD,      MODUL_CMD,  MODUL_CMD PROFILER}
2240,{jjJET_P,     JET_CMD,        POLY_CMD,       POLY_CMD,   INT_CMD PROFILER}
2241,{jjJET_ID,    JET_CMD,        IDEAL_CMD,      IDEAL_CMD,  INT_CMD PROFILER}
2242,{jjJET_P,     JET_CMD,        VECTOR_CMD,     VECTOR_CMD, INT_CMD PROFILER}
2243,{jjJET_ID,    JET_CMD,        MODUL_CMD,      MODUL_CMD,  INT_CMD PROFILER}
2244,{jjJET_ID,    JET_CMD,        MATRIX_CMD,     MATRIX_CMD,  INT_CMD PROFILER}
2245,{jjKBASE2,    KBASE_CMD,      IDEAL_CMD,      IDEAL_CMD,  INT_CMD PROFILER}
2246,{jjKBASE2,    KBASE_CMD,      MODUL_CMD,      MODUL_CMD,  INT_CMD PROFILER}
2247,{atKILLATTR2, KILLATTR_CMD,   NONE,           IDHDL,      STRING_CMD PROFILER}
2248,{jjKoszul,    KOSZUL_CMD,     MATRIX_CMD,     INT_CMD,    INT_CMD PROFILER}
2249,{jjKoszul_Id, KOSZUL_CMD,     MATRIX_CMD,     INT_CMD,    IDEAL_CMD PROFILER}
2250,{jjLIFT,      LIFT_CMD,       MATRIX_CMD,     IDEAL_CMD,  IDEAL_CMD PROFILER}
2251,{jjLIFT,      LIFT_CMD,       MATRIX_CMD,     MODUL_CMD,  MODUL_CMD PROFILER}
2252,{jjLIFTSTD,   LIFTSTD_CMD,    IDEAL_CMD,      IDEAL_CMD,  MATRIX_CMD PROFILER}
2253,{jjLIFTSTD,   LIFTSTD_CMD,    MODUL_CMD,      MODUL_CMD,  MATRIX_CMD PROFILER}
2254,{jjCALL2MANY, LIST_CMD,       LIST_CMD,       DEF_CMD,    DEF_CMD PROFILER}
2255,{jjRES,       LRES_CMD,       RESOLUTION_CMD, IDEAL_CMD,  INT_CMD PROFILER}
2256,{jjMINOR,     MINOR_CMD,      IDEAL_CMD,      MATRIX_CMD, INT_CMD PROFILER}
2257,{jjCALL2MANY, MODUL_CMD,      MODUL_CMD,      DEF_CMD,    DEF_CMD PROFILER}
2258,{jjMODULO,    MODULO_CMD,     MODUL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
2259,{jjMODULO,    MODULO_CMD,     MODUL_CMD,      MODUL_CMD,  MODUL_CMD PROFILER}
2260,{jjMONITOR2,  MONITOR_CMD,    NONE,           STRING_CMD, STRING_CMD PROFILER}
2261//,{jjRES,       MRES_CMD,       LIST_CMD,       IDEAL_CMD,  INT_CMD PROFILER}
2262//,{jjRES,       MRES_CMD,       LIST_CMD,       MODUL_CMD,  INT_CMD PROFILER}
2263,{jjRES,       MRES_CMD,       RESOLUTION_CMD, IDEAL_CMD,  INT_CMD PROFILER}
2264,{jjRES,       MRES_CMD,       RESOLUTION_CMD, MODUL_CMD,  INT_CMD PROFILER}
2265,{jjPARSTR2,   PARSTR_CMD,     STRING_CMD,     RING_CMD,   INT_CMD PROFILER}
2266,{jjPARSTR2,   PARSTR_CMD,     STRING_CMD,     QRING_CMD,  INT_CMD PROFILER}
2267,{jjPRINT_FORMAT, PRINT_CMD,   ANY_TYPE,       DEF_CMD,    STRING_CMD PROFILER}
2268,{jjQUOT,      QUOTIENT_CMD,   IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
2269,{jjQUOT,      QUOTIENT_CMD,   MODUL_CMD,      MODUL_CMD,  IDEAL_CMD PROFILER}
2270,{jjQUOT,      QUOTIENT_CMD,   IDEAL_CMD,      MODUL_CMD,  MODUL_CMD PROFILER}
2271,{jjRANDOM,    RANDOM_CMD,     INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2272,{jjREAD2,     READ_CMD,       STRING_CMD,     LINK_CMD,   STRING_CMD PROFILER}
2273,{jjREDUCE_P,  REDUCE_CMD,     POLY_CMD,       POLY_CMD,   IDEAL_CMD PROFILER}
2274,{jjREDUCE_P,  REDUCE_CMD,     VECTOR_CMD,     VECTOR_CMD, IDEAL_CMD PROFILER}
2275,{jjREDUCE_P,  REDUCE_CMD,     VECTOR_CMD,     VECTOR_CMD, MODUL_CMD PROFILER}
2276,{jjREDUCE_ID, REDUCE_CMD,     IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
2277,{jjREDUCE_ID, REDUCE_CMD,     MODUL_CMD,      MODUL_CMD,  MODUL_CMD PROFILER}
2278,{jjREDUCE_ID, REDUCE_CMD,     MODUL_CMD,      MODUL_CMD,  IDEAL_CMD PROFILER}
2279//,{jjRES,       RES_CMD,        LIST_CMD,       IDEAL_CMD,  INT_CMD PROFILER}
2280//,{jjRES,       RES_CMD,        LIST_CMD,       MODUL_CMD,  INT_CMD PROFILER}
2281,{jjRES,       RES_CMD,        RESOLUTION_CMD, IDEAL_CMD,  INT_CMD PROFILER}
2282,{jjRES,       RES_CMD,        RESOLUTION_CMD, MODUL_CMD,  INT_CMD PROFILER}
2283,{jjSTATUS2,   STATUS_CMD,     STRING_CMD,     LINK_CMD,   STRING_CMD PROFILER}
2284,{jjSIMPL_P,   SIMPLIFY_CMD,   POLY_CMD,       POLY_CMD,   INT_CMD PROFILER}
2285,{jjSIMPL_P,   SIMPLIFY_CMD,   VECTOR_CMD,     VECTOR_CMD, INT_CMD PROFILER}
2286,{jjSIMPL_ID,  SIMPLIFY_CMD,   IDEAL_CMD,      IDEAL_CMD,  INT_CMD PROFILER}
2287,{jjSIMPL_ID,  SIMPLIFY_CMD,   MODUL_CMD,      MODUL_CMD,  INT_CMD PROFILER}
2288#ifdef HAVE_SPECTRUM
2289,{spectrumProc2,SPECTRUM_CMD,  LIST_CMD,       POLY_CMD,   INT_CMD PROFILER}
2290,{semicProc,   SEMIC_CMD,      INT_CMD,        LIST_CMD,   LIST_CMD PROFILER}
2291#endif
2292//,{jjRES,       SRES_CMD,       LIST_CMD,       IDEAL_CMD,  INT_CMD PROFILER}
2293//,{jjRES,       SRES_CMD,       LIST_CMD,       MODUL_CMD,  INT_CMD PROFILER}
2294,{jjRES,       SRES_CMD,       RESOLUTION_CMD, IDEAL_CMD,  INT_CMD PROFILER}
2295,{jjRES,       SRES_CMD,       RESOLUTION_CMD, MODUL_CMD,  INT_CMD PROFILER}
2296,{jjCALL2MANY, SYSTEM_CMD,     ANY_TYPE/*set by p*/,STRING_CMD, DEF_CMD PROFILER}
2297,{jjSTD_1,     STD_CMD,        IDEAL_CMD,      IDEAL_CMD,  POLY_CMD PROFILER}
2298,{jjSTD_1,     STD_CMD,        MODUL_CMD,      MODUL_CMD,  VECTOR_CMD PROFILER}
2299,{jjSTD_HILB,  STD_CMD,        IDEAL_CMD,      IDEAL_CMD,  INTVEC_CMD PROFILER}
2300,{jjSTD_HILB,  STD_CMD,        MODUL_CMD,      MODUL_CMD,  INTVEC_CMD PROFILER}
2301,{jjVARSTR2,   VARSTR_CMD,     STRING_CMD,     RING_CMD,   INT_CMD PROFILER}
2302,{jjVARSTR2,   VARSTR_CMD,     STRING_CMD,     QRING_CMD,  INT_CMD PROFILER}
2303,{jjWEDGE,     WEDGE_CMD,      MATRIX_CMD,     MATRIX_CMD, INT_CMD PROFILER}
2304,{jjLOAD_E,    LOAD_CMD,       NONE,           STRING_CMD, STRING_CMD PROFILER}
2305,{nuMPResMat,  MPRES_CMD,      MODUL_CMD,      IDEAL_CMD,  INT_CMD PROFILER}
2306,{NULL,        0,              0,              0,          0 PROFILER}
2307};
2308/*=================== operations with 1 arg.: static proc =================*/
2309static BOOLEAN jjDUMMY(leftv res, leftv u)
2310{
2311  res->data = (char *)u->CopyD();
2312  return FALSE;
2313}
2314static BOOLEAN jjNULL(leftv res, leftv u)
2315{
2316  return FALSE;
2317}
2318//static BOOLEAN jjPLUSPLUS(leftv res, leftv u)
2319//{
2320//  res->data = (char *)((int)u->Data()+1);
2321//  return FALSE;
2322//}
2323//static BOOLEAN jjMINUSMINUS(leftv res, leftv u)
2324//{
2325//  res->data = (char *)((int)u->Data()-1);
2326//  return FALSE;
2327//}
2328static BOOLEAN jjPLUSPLUS(leftv res, leftv u)
2329{
2330  if (IDTYP((idhdl)u->data)==INT_CMD)
2331  {
2332    if (iiOp==PLUSPLUS) IDINT((idhdl)u->data)++;
2333    else                IDINT((idhdl)u->data)--;
2334    return FALSE;
2335  }
2336  return TRUE;
2337}
2338static BOOLEAN jjUMINUS_I(leftv res, leftv u)
2339{
2340  res->data = (char *)(-(int)u->Data());
2341  return FALSE;
2342}
2343static BOOLEAN jjUMINUS_N(leftv res, leftv u)
2344{
2345  number n=(number)u->CopyD();
2346  n=nNeg(n);
2347  res->data = (char *)n;
2348  return FALSE;
2349}
2350static BOOLEAN jjUMINUS_P(leftv res, leftv u)
2351{
2352  res->data = (char *)pNeg((poly)u->CopyD(POLY_CMD));
2353  return FALSE;
2354}
2355static BOOLEAN jjUMINUS_MA(leftv res, leftv u)
2356{
2357  poly m1=pISet(-1);
2358  res->data = (char *)mpMultP((matrix)u->CopyD(MATRIX_CMD),m1);
2359  return FALSE;
2360}
2361static BOOLEAN jjUMINUS_IV(leftv res, leftv u)
2362{
2363  intvec *iv=(intvec *)u->CopyD(INTVEC_CMD);
2364  (*iv)*=(-1);
2365  res->data = (char *)iv;
2366  return FALSE;
2367}
2368static BOOLEAN jjPROC1(leftv res, leftv u)
2369{
2370  if ((u->rtyp!=IDHDL) || (u->e!=NULL))
2371    return TRUE;
2372#ifdef HAVE_NAMESPACES
2373  leftv sl = iiMake_proc((idhdl) u->data,u,NULL);
2374#else /* HAVE_NAMESPACES */
2375  leftv sl = iiMake_proc((idhdl) u->data,NULL);
2376#endif /* HAVE_NAMESPACES */
2377  if (sl==NULL)
2378  {
2379    return TRUE;
2380  }
2381  else
2382  {
2383    memcpy(res,sl,sizeof(sleftv));
2384  }
2385  return FALSE;
2386}
2387static BOOLEAN jjBAREISS(leftv res, leftv v)
2388{
2389  //matrix m=(matrix)v->Data();
2390  //lists l=mpBareiss(m,FALSE);
2391  lists l=smCallNewBareiss((ideal)v->Data(),0,0);
2392  res->data = (char *)l;
2393  return FALSE;
2394}
2395static BOOLEAN jjBAREISS_IM(leftv res, leftv v)
2396{
2397  intvec *m=(intvec *)v->CopyD();
2398  ivTriangMat(m,1,1);
2399  res->data = (char *)m;
2400  return FALSE;
2401}
2402static BOOLEAN jjCALL1MANY(leftv res, leftv u)
2403{
2404  return iiExprArithM(res,u,iiOp);
2405}
2406static BOOLEAN jjCHAR(leftv res, leftv v)
2407{
2408  res->data = (char *)rChar((ring)v->Data());
2409  return FALSE;
2410}
2411static BOOLEAN jjCOLS(leftv res, leftv v)
2412{
2413  res->data = (char *)MATCOLS((matrix)(v->Data()));
2414  return FALSE;
2415}
2416static BOOLEAN jjCOLS_IV(leftv res, leftv v)
2417{
2418  res->data = (char *)((intvec*)(v->Data()))->cols();
2419  return FALSE;
2420}
2421static BOOLEAN jjCONTENT(leftv res, leftv v)
2422{
2423  poly p=(poly)v->CopyD();
2424  if (p!=NULL) pCleardenom(p);
2425  res->data = (char *)p;
2426  return FALSE;
2427}
2428static BOOLEAN jjCOUNT_N(leftv res, leftv v)
2429{
2430  res->data = (char *)nSize((number)v->Data());
2431  return FALSE;
2432}
2433static BOOLEAN jjCOUNT_L(leftv res, leftv v)
2434{
2435  lists l=(lists)v->Data();
2436  res->data = (char *)(l->nr+1);
2437  return FALSE;
2438}
2439static BOOLEAN jjCOUNT_M(leftv res, leftv v)
2440{
2441  matrix m=(matrix)v->Data();
2442  res->data = (char *)(MATROWS(m)*MATCOLS(m));
2443  return FALSE;
2444}
2445static BOOLEAN jjCOUNT_IV(leftv res, leftv v)
2446{
2447  res->data = (char *)((intvec*)(v->Data()))->length();
2448  return FALSE;
2449}
2450static BOOLEAN jjDEG(leftv res, leftv v)
2451{
2452  int dummy;
2453  poly p=(poly)v->Data();
2454  if (p!=NULL) res->data = (char *)pLDeg(p,&dummy);
2455  else res->data=(char *)-1;
2456  return FALSE;
2457}
2458static BOOLEAN jjDEGREE(leftv res, leftv v)
2459{
2460  assumeStdFlag(v);
2461  scDegree((ideal)v->Data(),currQuotient);
2462  return FALSE;
2463}
2464static BOOLEAN jjDEFINED(leftv res, leftv v)
2465{
2466  if ((v->rtyp==IDHDL)
2467  && ((myynest==IDLEV((idhdl)v->data))||(0==IDLEV((idhdl)v->data))))
2468  {
2469    res->data=(void *)(IDLEV((idhdl)v->data)+1);
2470  }
2471  else if (v->rtyp!=0) res->data=(void *)(-1);
2472  return FALSE;
2473}
2474#ifdef HAVE_FACTORY
2475static BOOLEAN jjDET(leftv res, leftv v)
2476{
2477  int i,j;
2478  matrix m=(matrix)v->Data();
2479  if (currRing->parameter==NULL)
2480  {
2481    for(i=m->rows();i>0;i--)
2482    {
2483      for(j=m->cols();j>0;j--)
2484      {
2485        if((MATELEM(m,i,j)!=NULL)
2486        && (!pIsConstant(MATELEM(m,i,j))))
2487        {
2488          goto nonconst;
2489        }
2490      }
2491    }
2492    res->data = (char *)singclap_det(m);
2493    return FALSE;
2494  }
2495nonconst:
2496//  res->data = (char *)mpDet(m);
2497//  poly p = mpDetBareiss(m);
2498    ideal I=idMatrix2Module(m);
2499    poly p=smCallDet(I);
2500    idDelete(&I);
2501#ifdef PDEBUG
2502  poly old = mpDet(m);
2503  if (!pEqual(p,old))
2504  {
2505    WerrorS("error in mpDetBareiss");
2506  }
2507#endif
2508  res ->data = (char *)p;
2509  return FALSE;
2510}
2511static BOOLEAN jjDET_I(leftv res, leftv v)
2512{
2513  intvec * m=(intvec*)v->Data();
2514  int i,j;
2515  i=m->rows();j=m->cols();
2516  if(i==j)
2517    res->data = (char *)singclap_det_i(m);
2518  else
2519  {
2520    Werror("det of %d x %d intmat",i,j);
2521    return TRUE;
2522  }
2523  return FALSE;
2524}
2525static BOOLEAN jjDET_S(leftv res, leftv v)
2526{
2527  ideal I=(ideal)v->Data();
2528  poly p=smCallDet(I);
2529  res->data = (char *)p;
2530  return FALSE;
2531}
2532#endif
2533static BOOLEAN jjDIM(leftv res, leftv v)
2534{
2535  assumeStdFlag(v);
2536  res->data = (char *)scDimInt((ideal)(v->Data()),currQuotient);
2537  return FALSE;
2538}
2539static BOOLEAN jjDUMP(leftv res, leftv v)
2540{
2541  si_link l = (si_link)v->Data();
2542  if (slDump(l))
2543  {
2544    const char *s;
2545    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
2546    else                            s=sNoName;
2547    Werror("cannot dump to `%s`",s);
2548    return TRUE;
2549  }
2550  else
2551    return FALSE;
2552}
2553static BOOLEAN jjE(leftv res, leftv v)
2554{
2555  res->data = (char *)pOne();
2556  pSetComp((poly)res->data,(int)v->Data());
2557  return FALSE;
2558}
2559#ifdef HAVE_FACTORY
2560static BOOLEAN jjFACSTD(leftv res, leftv v)
2561{
2562  res->data=(void *)kStdfac((ideal)v->Data(),NULL,testHomog,NULL);
2563  setFlag(res,FLAG_STD);
2564  return FALSE;
2565}
2566#endif
2567static BOOLEAN jjGETDUMP(leftv res, leftv v)
2568{
2569  si_link l = (si_link)v->Data();
2570  if (slGetDump(l))
2571  {
2572    const char *s;
2573    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
2574    else                            s=sNoName;
2575    Werror("cannot get dump from `%s`",s);
2576    return TRUE;
2577  }
2578  else
2579    return FALSE;
2580}
2581static BOOLEAN jjHIGHCORNER(leftv res, leftv v)
2582{
2583  assumeStdFlag(v);
2584  ideal I=(ideal)v->Data();
2585  res->data=(void *)iiHighCorner(I,0);
2586  return FALSE;
2587}
2588static BOOLEAN jjHIGHCORNER_M(leftv res, leftv v)
2589{
2590  assumeStdFlag(v);
2591  intvec *w=(intvec*)atGet(v,"isHomog");
2592  BOOLEAN delete_w=FALSE;
2593  ideal I=(ideal)v->Data();
2594  int i;
2595  poly p=NULL,po=NULL;
2596  int rk=idRankFreeModule(I);
2597  if (w==NULL)
2598  {
2599    w = new intvec(rk);
2600    delete_w=TRUE;
2601  }
2602  for(i=rk;i>0;i--)
2603  {
2604    p=iiHighCorner(I,i);
2605    if (p==NULL)
2606    {
2607      Werror("module must be zero-dimensional");
2608      if (delete_w) delete w;
2609      return TRUE;
2610    }
2611    if (po==NULL)
2612    {
2613      po=p;
2614    }
2615    else
2616    {
2617      // now po!=NULL, p!=NULL
2618      int d=(pFDeg(po)-(*w)[pGetComp(po)-1] - pFDeg(p)+(*w)[i-1]);
2619      if (d==0)
2620        d=pComp0(po,p);
2621      if (d > 0)
2622      {
2623        pDelete(&p);
2624      }
2625      else // (d < 0)
2626      {
2627        pDelete(&po); po=p;
2628      }
2629    }
2630  }
2631  if (delete_w) delete w;
2632  res->data=(void *)po;
2633  return FALSE;
2634}
2635static BOOLEAN jjHILBERT(leftv res, leftv v)
2636{
2637  assumeStdFlag(v);
2638  intvec *module_w=(intvec*)atGet(v,"isHomog");
2639  //scHilbertPoly((ideal)v->Data(),currQuotient);
2640  hLookSeries((ideal)v->Data(),module_w,currQuotient);
2641  return FALSE;
2642}
2643static BOOLEAN jjHILBERT_IV(leftv res, leftv v)
2644{
2645  res->data=(void *)hSecondSeries((intvec *)v->Data());
2646  return FALSE;
2647}
2648static BOOLEAN jjHOMOG1(leftv res, leftv v)
2649{
2650  intvec *w;
2651  res->data=(void *)idHomModule((ideal)v->Data(),currQuotient,&w);
2652  if ((v->rtyp==IDHDL)&&(w!=NULL))
2653    atSet((idhdl)v->data,mstrdup("isHomog"),w,INTVEC_CMD);
2654  return FALSE;
2655}
2656static BOOLEAN jjIDEAL_Ma(leftv res, leftv v)
2657{
2658  matrix mat=(matrix)v->CopyD();
2659  IDELEMS((ideal)mat)=MATCOLS(mat)*MATROWS(mat);
2660  MATROWS(mat)=1;
2661  mat->rank=1;
2662  res->data=(char *)mat;
2663  return FALSE;
2664}
2665static BOOLEAN jjIDEAL_Map(leftv res, leftv v)
2666{
2667  map m=(map)v->CopyD();
2668  FreeL((ADDRESS)m->preimage);
2669  m->preimage=NULL;
2670  ideal I=(ideal)m;
2671  I->rank=1;
2672  res->data=(char *)I;
2673  return FALSE;
2674}
2675static BOOLEAN jjIDEAL_R(leftv res, leftv v)
2676{
2677  if (currRing!=NULL)
2678  {
2679    ring q=(ring)v->Data();
2680    if (rEqual(currRing, q, 0))
2681    {
2682      if (q->qideal==NULL)
2683        res->data=(char *)idInit(1,1);
2684      else
2685        res->data=(char *)idCopy(q->qideal);
2686      return FALSE;
2687    }
2688  }
2689  WerrorS("can only get ideal from identical qring");
2690  return TRUE;
2691}
2692static BOOLEAN jjIm2Iv(leftv res, leftv v)
2693{
2694  intvec *iv = (intvec *)v->CopyD();
2695  iv->makeVector();
2696  res->data = iv;
2697  return FALSE;
2698}
2699static BOOLEAN jjINDEPSET(leftv res, leftv v)
2700{
2701  assumeStdFlag(v);
2702  res->data=(void *)scIndIntvec((ideal)(v->Data()),currQuotient);
2703  return FALSE;
2704}
2705static BOOLEAN jjINTERRED(leftv res, leftv v)
2706{
2707  ideal result=kInterRed((ideal)(v->Data()),currQuotient);
2708  //if (result==NULL) return TRUE;
2709  idSkipZeroes(result);
2710  res->data = result;
2711  return FALSE;
2712}
2713static BOOLEAN jjIS_RINGVAR_P(leftv res, leftv v)
2714{
2715  res->data = (char *)pVar((poly)v->Data());
2716  return FALSE;
2717}
2718static BOOLEAN jjIS_RINGVAR_S(leftv res, leftv v)
2719{
2720  res->data = (char *)(rIsRingVar((char *)v->Data())+1);
2721  return FALSE;
2722}
2723static BOOLEAN jjIS_RINGVAR0(leftv res, leftv v)
2724{
2725  res->data = (char *)0;
2726  return FALSE;
2727}
2728static BOOLEAN jjJACOB_P(leftv res, leftv v)
2729{
2730  ideal i=idInit(pVariables,1);
2731  int k;
2732  poly p=(poly)(v->Data());
2733  for (k=pVariables;k>0;k--)
2734  {
2735    i->m[k-1]=pDiff(p,k);
2736  }
2737  res->data = (char *)i;
2738  return FALSE;
2739}
2740static BOOLEAN jjKBASE(leftv res, leftv v)
2741{
2742  assumeStdFlag(v);
2743  res->data = (char *)scKBase(-1,(ideal)(v->Data()),currQuotient);
2744  return FALSE;
2745}
2746static BOOLEAN jjKLAMMER_LIB(leftv res, leftv u)
2747{
2748  char * s=(char *)u->Data();
2749  return iiLibCmd(s);
2750}
2751#ifdef MDEBUG
2752static BOOLEAN jjpHead(leftv res, leftv v)
2753{
2754  res->data=(char *)pHead((poly)v->Data());
2755  return FALSE;
2756}
2757#endif
2758static BOOLEAN jjL2R(leftv res, leftv v)
2759{
2760  res->data=(char *)syConvList((lists)v->Data());
2761  if (res->data != NULL)
2762    return FALSE;
2763  else
2764    return TRUE;
2765}
2766static BOOLEAN jjLEADCOEF(leftv res, leftv v)
2767{
2768  poly p=(poly)v->Data();
2769  if (p==NULL)
2770  {
2771    res->data=(char *)nInit(0);
2772  }
2773  else
2774  {
2775    res->data=(char *)nCopy(pGetCoeff(p));
2776  }
2777  return FALSE;
2778}
2779static BOOLEAN jjLEADEXP(leftv res, leftv v)
2780{
2781  poly p=(poly)v->Data();
2782  int s=pVariables;
2783  if (v->Typ()==VECTOR_CMD) s++;
2784  intvec *iv=new intvec(s);
2785  if (p!=NULL)
2786  {
2787    for(int i = pVariables;i;i--)
2788    {
2789      (*iv)[i-1]=pGetExp(p,i);
2790    }
2791    if (s!=pVariables)
2792      (*iv)[pVariables]=pGetComp(p);
2793  }
2794  res->data=(char *)iv;
2795  return FALSE;
2796}
2797static BOOLEAN jjLEADMONOM(leftv res, leftv v)
2798{
2799  poly p=(poly)v->Data();
2800  if (p == NULL)
2801  {
2802    res->data = (char*) NULL;
2803  }
2804  else
2805  {
2806    poly lm = pCopy1(p);
2807    pSetCoeff(lm, nInit(1));
2808    res->data = (char*) lm;
2809  }
2810  return FALSE;
2811}
2812static BOOLEAN jjLIB(leftv res, leftv v)
2813{
2814  return iiLibCmd((char *)v->CopyD());
2815}
2816static BOOLEAN jjMEMORY(leftv res, leftv v)
2817{
2818#ifdef MM_COUNT
2819  switch(((int)v->Data()))
2820  {
2821  case 0:
2822    res->data = (char *)mmMemUsed();
2823    break;
2824  case 1:
2825    res->data = (char *)mmMemAlloc();
2826    break;
2827#ifdef HAVE_SBRK
2828  case 2:
2829    res->data = (char *)mmMemPhysical();
2830    break;
2831#endif
2832  default:
2833    mmPrintStat();
2834    res->data = (char *)0;
2835  }
2836  return FALSE;
2837#else
2838  res->data = (char *)0;
2839  return FALSE;
2840#endif
2841}
2842static BOOLEAN jjMONITOR1(leftv res, leftv v)
2843{
2844  monitor((char *)(v->Data()),PROT_I);
2845  return FALSE;
2846}
2847static BOOLEAN jjMSTD(leftv res, leftv v)
2848{
2849  res->data=(void *)min_std((ideal)v->Data(),currQuotient,testHomog,NULL);
2850  return FALSE;
2851}
2852static BOOLEAN jjMULT(leftv res, leftv v)
2853{
2854  assumeStdFlag(v);
2855  res->data = (char *)scMultInt((ideal)(v->Data()),currQuotient);
2856  return FALSE;
2857}
2858static BOOLEAN jjNAMEOF(leftv res, leftv v)
2859{
2860  res->data = (char *)v->name;
2861  if (res->data==NULL) res->data=mstrdup("");
2862  v->name=NULL;
2863  return FALSE;
2864}
2865static BOOLEAN jjNAMES(leftv res, leftv v)
2866{
2867  res->data=ipNameList(((ring)v->Data())->idroot);
2868  return FALSE;
2869}
2870static BOOLEAN jjNVARS(leftv res, leftv v)
2871{
2872  res->data = (char *)(((ring)(v->Data()))->N);
2873  return FALSE;
2874}
2875static BOOLEAN jjOpenClose(leftv res, leftv v)
2876{
2877  si_link l=(si_link)v->Data();
2878  if (iiOp==OPEN_CMD) return slOpen(l, SI_LINK_OPEN);
2879  else                return slClose(l);
2880}
2881static BOOLEAN jjORD(leftv res, leftv v)
2882{
2883  poly p=(poly)v->Data();
2884  res->data=(char *)( p==NULL ? -1 : pFDeg(p) );
2885  return FALSE;
2886}
2887static BOOLEAN jjPAR1(leftv res, leftv v)
2888{
2889  int i=(int)v->Data();
2890  int p=0;
2891  p=rPar(currRing);
2892  if ((0<i) && (i<=p))
2893  {
2894    res->data=(char *)nPar(i);
2895  }
2896  else
2897  {
2898    Werror("par number %d out of range 1..%d",i,p);
2899    return TRUE;
2900  }
2901  return FALSE;
2902}
2903static BOOLEAN jjPARDEG(leftv res, leftv v)
2904{
2905  res->data = (char *)nParDeg((number)v->Data());
2906  return FALSE;
2907}
2908static BOOLEAN jjPARSTR1(leftv res, leftv v)
2909{
2910  if (currRing==NULL)
2911  {
2912    WerrorS("no ring active");
2913    return TRUE;
2914  }
2915  int i=(int)v->Data();
2916  int p=0;
2917  if ((0<i) && (currRing->parameter!=NULL) && (i<=(p=rPar(currRing))))
2918    res->data=mstrdup(currRing->parameter[i-1]);
2919  else
2920  {
2921    Werror("par number %d out of range 1..%d",i,p);
2922    return TRUE;
2923  }
2924  return FALSE;
2925}
2926static BOOLEAN jjP2I(leftv res, leftv v)
2927{
2928  poly p=(poly)v->Data();
2929  if (p==NULL) { /*res->data=(char *)0;*/ return FALSE; }
2930  if ((pNext(p)!=NULL)|| (!pIsConstant(p)))
2931  {
2932    WerrorS("poly must be constant");
2933    return TRUE;
2934  }
2935  res->data = (char *)nInt(pGetCoeff(p));
2936  return FALSE;
2937}
2938static BOOLEAN jjPREIMAGE_R(leftv res, leftv v)
2939{
2940  map mapping=(map)v->Data();
2941  syMake(res,mstrdup(mapping->preimage));
2942  return FALSE;
2943}
2944static BOOLEAN jjPRIME(leftv res, leftv v)
2945{
2946  int i = IsPrime((int)(v->Data()));
2947  res->data = (char *)(i > 1 ? i : 2);
2948  return FALSE;
2949}
2950static BOOLEAN jjP2N(leftv res, leftv v)
2951{
2952  number n;
2953  poly p;
2954  if (((p=(poly)v->Data())!=NULL)
2955  && (pIsConstant(p)))
2956  {
2957    n=nCopy(pGetCoeff(p));
2958  }
2959  else
2960  {
2961    n=nInit(0);
2962  }
2963  res->data = (char *)n;
2964  return FALSE;
2965}
2966static BOOLEAN jjRESERVEDNAME(leftv res, leftv v)
2967{
2968  char *s= (char *)v->Data();
2969  int i = 1;
2970  int l = strlen(s);
2971  while (cmds[i].tokval!=0)
2972  {
2973    if (strcmp(s, cmds[i].name) == 0)
2974    {
2975      res->data = (char *)1;
2976      return FALSE;
2977    }
2978    i++;
2979  }
2980  //res->data = (char *)0;
2981  return FALSE;
2982}
2983static BOOLEAN jjREAD(leftv res, leftv v)
2984{
2985  return jjREAD2(res,v,NULL);
2986}
2987static BOOLEAN jjREGULARITY(leftv res, leftv v)
2988{
2989  res->data = (char *)iiRegularity((lists)v->Data());
2990  return FALSE;
2991}
2992static BOOLEAN jjROWS(leftv res, leftv v)
2993{
2994  ideal i = (ideal)v->Data();
2995  res->data = (char *)i->rank;
2996  return FALSE;
2997}
2998static BOOLEAN jjROWS_IV(leftv res, leftv v)
2999{
3000  res->data = (char *)((intvec*)(v->Data()))->rows();
3001  return FALSE;
3002}
3003static BOOLEAN jjRPAR(leftv res, leftv v)
3004{
3005  res->data = (char *)rPar(((ring)v->Data()));
3006  return FALSE;
3007}
3008static BOOLEAN jjSTD(leftv res, leftv v)
3009{
3010  ideal result;
3011  intvec *w=(intvec *)atGet(v,"isHomog");
3012  tHomog hom=testHomog;
3013  if (w!=NULL)
3014  {
3015    w=ivCopy(w);
3016    hom=isHomog;
3017  }
3018  //if (hasFlag(v,FLAG_STD))
3019  //  result=stdred((ideal)v->Data(),currQuotient,hom,&w);
3020  //else
3021    result=kStd((ideal)(v->Data()),currQuotient,hom,&w);
3022  idSkipZeroes(result);
3023  res->data = (char *)result;
3024  setFlag(res,FLAG_STD);
3025  if (w!=NULL) atSet(res,mstrdup("isHomog"),w,INTVEC_CMD);
3026  return FALSE;
3027}
3028static BOOLEAN jjSort_Id(leftv res, leftv v)
3029{
3030  res->data = (char *)idSort((ideal)v->Data());
3031  return FALSE;
3032}
3033static BOOLEAN jjSYZYGY(leftv res, leftv v)
3034{
3035  intvec *w=NULL;
3036  res->data = (char *)idSyzygies((ideal)v->Data(),currQuotient,testHomog,&w);
3037  if (w!=NULL) delete w;
3038  return FALSE;
3039}
3040static BOOLEAN jjTRACE_IV(leftv res, leftv v)
3041{
3042  res->data = (char *)ivTrace((intvec*)(v->Data()));
3043  return FALSE;
3044}
3045static BOOLEAN jjTRANSP_IV(leftv res, leftv v)
3046{
3047  res->data = (char *)ivTranp((intvec*)(v->Data()));
3048  return FALSE;
3049}
3050static BOOLEAN jjTYPEOF(leftv res, leftv v)
3051{
3052  switch ((int)v->data)
3053  {
3054    case INT_CMD:     res->data=mstrdup("int"); break;
3055    case POLY_CMD:   res->data=mstrdup("poly"); break;
3056    case VECTOR_CMD:  res->data=mstrdup("vector"); break;
3057    case STRING_CMD:  res->data=mstrdup("string"); break;
3058    case INTVEC_CMD:  res->data=mstrdup("intvec"); break;
3059    case IDEAL_CMD:   res->data=mstrdup("ideal"); break;
3060    case MATRIX_CMD: res->data=mstrdup("matrix"); break;
3061    case MODUL_CMD:   res->data=mstrdup("module"); break;
3062    case MAP_CMD:     res->data=mstrdup("map"); break;
3063    case PROC_CMD:    res->data=mstrdup("proc"); break;
3064    case RING_CMD:    res->data=mstrdup("ring"); break;
3065    case QRING_CMD:   res->data=mstrdup("qring"); break;
3066    case INTMAT_CMD:  res->data=mstrdup("intmat"); break;
3067    case NUMBER_CMD:  res->data=mstrdup("number"); break;
3068    case LIST_CMD:   res->data=mstrdup("list"); break;
3069    case PACKAGE_CMD: res->data=mstrdup("package"); break;
3070    case LINK_CMD:   res->data=mstrdup("link"); break;
3071    case RESOLUTION_CMD:res->data=mstrdup("resolution");break;
3072    case DEF_CMD:
3073    case NONE:    res->data=mstrdup("none"); break;
3074    default:       res->data=mstrdup("?unknown type?");
3075  }
3076  return FALSE;
3077}
3078static BOOLEAN jjVAR1(leftv res, leftv v)
3079{
3080  int i=(int)v->Data();
3081  if ((0<i) && (i<=currRing->N))
3082  {
3083    poly p=pOne();
3084    pSetExp(p,i,1);
3085    pSetm(p);
3086    res->data=(char *)p;
3087  }
3088  else
3089  {
3090    Werror("var number %d out of range 1..%d",i,currRing->N);
3091    return TRUE;
3092  }
3093  return FALSE;
3094}
3095static BOOLEAN jjVARSTR1(leftv res, leftv v)
3096{
3097  if (currRing==NULL)
3098  {
3099    WerrorS("no ring active");
3100    return TRUE;
3101  }
3102  int i=(int)v->Data();
3103  if ((0<i) && (i<=currRing->N))
3104    res->data=mstrdup(currRing->names[i-1]);
3105  else
3106  {
3107    Werror("var number %d out of range 1..%d",i,currRing->N);
3108    return TRUE;
3109  }
3110  return FALSE;
3111}
3112static BOOLEAN jjVDIM(leftv res, leftv v)
3113{
3114  assumeStdFlag(v);
3115  res->data = (char *)scMult0Int((ideal)v->Data(),currQuotient);
3116  return FALSE;
3117}
3118
3119static BOOLEAN jjLOAD1(leftv res, leftv v)
3120{
3121  return jjLOAD(res, v);
3122}
3123
3124static BOOLEAN jjLOAD(leftv res, leftv v, BOOLEAN autoexport)
3125{
3126  char * s=mstrdup((char *)v->Data());
3127  char libnamebuf[256];
3128  lib_types LT = type_of_LIB(s, libnamebuf);
3129  BOOLEAN result = TRUE;
3130#ifdef HAVE_DYNAMIC_LOADING
3131  extern BOOLEAN load_modules(char *newlib, char *fullpath, BOOLEAN tellerror);
3132#endif /* HAVE_DYNAMIC_LOADING */
3133
3134  switch(LT)
3135  {
3136      default:
3137      case LT_NONE:
3138        Werror("%s: unknown type", s);
3139        break;
3140
3141      case LT_SINGULAR:
3142#ifdef HAVE_NAMESPACES
3143        result = iiLibCmd(s, autoexport);
3144#else
3145        result = iiLibCmd(s);
3146#endif
3147        break;
3148
3149      case LT_ELF:
3150#ifdef HAVE_DYNAMIC_LOADING
3151        result = load_modules(s, libnamebuf, autoexport);
3152#else /* HAVE_DYNAMIC_LOADING */
3153        WerrorS("Dynamic modules are not supported by this version of Singular");
3154#endif /* HAVE_DYNAMIC_LOADING */
3155        break;
3156
3157      case LT_HPUX:
3158#ifdef HAVE_DYNAMIC_LOADING
3159        result = load_modules(s, libnamebuf, autoexport);
3160#else /* HAVE_DYNAMIC_LOADING */
3161        WerrorS("Dynamic modules are not supported by this version of Singular");
3162#endif /* HAVE_DYNAMIC_LOADING */
3163        break;
3164  }
3165  return result;
3166}
3167
3168/*=================== operations with 1 arg.: table =================*/
3169
3170#ifdef INIT_BUG
3171#define XS(A) -((short)A)
3172#define jjstrlen       (proc1)1
3173#define jjpLength      (proc1)2
3174#define jjidElem       (proc1)3
3175#define jjmpDetBareiss (proc1)4
3176#define jjidFreeModule (proc1)5
3177#define jjidVec2Ideal  (proc1)6
3178#define jjrCharStr     (proc1)7
3179#ifndef MDEBUG
3180#define jjpHead        (proc1)8
3181#endif
3182#define jjidHead       (proc1)9
3183#define jjidMaxIdeal   (proc1)10
3184#define jjidMinBase    (proc1)11
3185#define jjsyMinBase    (proc1)12
3186#define jjpMaxComp     (proc1)13
3187#define jjmpTrace      (proc1)14
3188#define jjmpTransp     (proc1)15
3189#define jjrOrdStr      (proc1)16
3190#define jjrVarStr      (proc1)18
3191#define jjrParStr      (proc1)19
3192#define jjidMinEmbedding (proc1)20
3193#define jjCOUNT_R        (proc1)22
3194#define jjDIM_R          (proc1)23
3195#define jjMINRES_R       (proc1)24
3196#define jjidTransp       (proc1)25
3197
3198extern struct sValCmd1 dArith1[];
3199void jjInitTab1()
3200{
3201  int i=0;
3202  for (;dArith1[i].cmd!=0;i++)
3203  {
3204    if (dArith1[i].res<0)
3205    {
3206      switch ((int)dArith1[i].p)
3207      {
3208        case (int)jjstrlen:       dArith1[i].p=(proc1)strlen; break;
3209        case (int)jjpLength:      dArith1[i].p=(proc1)pLength; break;
3210        case (int)jjidElem:       dArith1[i].p=(proc1)idElem; break;
3211        case (int)jjidVec2Ideal:  dArith1[i].p=(proc1)idVec2Ideal; break;
3212#ifndef HAVE_FACTORY
3213        case (int)jjmpDetBareiss: dArith1[i].p=(proc1)mpDetBareiss; break;
3214#endif
3215        case (int)jjidFreeModule: dArith1[i].p=(proc1)idFreeModule; break;
3216        case (int)jjrCharStr:     dArith1[i].p=(proc1)rCharStr; break;
3217#ifndef MDEBUG
3218        case (int)jjpHead:        dArith1[i].p=(proc1)pHeadProc; break;
3219#endif
3220        case (int)jjidHead:       dArith1[i].p=(proc1)idHead; break;
3221        case (int)jjidMaxIdeal:   dArith1[i].p=(proc1)idMaxIdeal; break;
3222        case (int)jjidMinBase:    dArith1[i].p=(proc1)idMinBase; break;
3223        case (int)jjsyMinBase:    dArith1[i].p=(proc1)syMinBase; break;
3224        case (int)jjpMaxComp:     dArith1[i].p=(proc1)pMaxComp; break;
3225        case (int)jjmpTrace:      dArith1[i].p=(proc1)mpTrace; break;
3226        case (int)jjmpTransp:     dArith1[i].p=(proc1)mpTransp; break;
3227        case (int)jjrOrdStr:      dArith1[i].p=(proc1)rOrdStr; break;
3228        case (int)jjrVarStr:      dArith1[i].p=(proc1)rVarStr; break;
3229        case (int)jjrParStr:      dArith1[i].p=(proc1)rParStr; break;
3230        case (int)jjidMinEmbedding: dArith1[i].p=(proc1)idMinEmbedding; break;
3231        case (int)jjCOUNT_R:      dArith1[i].p=(proc1)syLength; break;
3232        case (int)jjDIM_R:        dArith1[i].p=(proc1)syDim; break;
3233        case (int)jjMINRES_R:     dArith1[i].p=(proc1)syMinimize; break;
3234        case (int)jjidTransp:     dArith1[i].p=(proc1)idTransp; break;
3235#ifdef GENTABLE
3236        default: Werror("missing proc1-definition for %d",(int)dArith1[i].p);
3237#endif
3238      }
3239    }
3240  }
3241}
3242#else
3243#if defined(PROC_BUG)
3244#define XS(A) A
3245static BOOLEAN jjstrlen(leftv res, leftv v)
3246{
3247  res->data = (char *)strlen((char *)v->Data());
3248  return FALSE;
3249}
3250static BOOLEAN jjpLength(leftv res, leftv v)
3251{
3252  res->data = (char *)pLength((poly)v->Data());
3253  return FALSE;
3254}
3255static BOOLEAN jjidElem(leftv res, leftv v)
3256{
3257  res->data = (char *)idElem((ideal)v->Data());
3258  return FALSE;
3259}
3260static BOOLEAN jjmpDetBareiss(leftv res, leftv v)
3261{
3262  res->data = (char *)mpDetBareiss((matrix)v->Data());
3263  return FALSE;
3264}
3265static BOOLEAN jjidFreeModule(leftv res, leftv v)
3266{
3267  res->data = (char *)idFreeModule((int)v->Data());
3268  return FALSE;
3269}
3270static BOOLEAN jjidVec2Ideal(leftv res, leftv v)
3271{
3272  res->data = (char *)idVec2Ideal((poly)v->Data());
3273  return FALSE;
3274}
3275static BOOLEAN jjrCharStr(leftv res, leftv v)
3276{
3277  res->data = rCharStr((ring)v->Data());
3278  return FALSE;
3279}
3280#ifndef MDEBUG
3281static BOOLEAN jjpHead(leftv res, leftv v)
3282{
3283  res->data = (char *)pHead((poly)v->Data());
3284  return FALSE;
3285}
3286#endif
3287static BOOLEAN jjidHead(leftv res, leftv v)
3288{
3289  res->data = (char *)idHead((ideal)v->Data());
3290  return FALSE;
3291}
3292static BOOLEAN jjidMaxIdeal(leftv res, leftv v)
3293{
3294  res->data = (char *)idMaxIdeal((int)v->Data());
3295  return FALSE;
3296}
3297static BOOLEAN jjidMinBase(leftv res, leftv v)
3298{
3299  res->data = (char *)idMinBase((ideal)v->Data());
3300  return FALSE;
3301}
3302static BOOLEAN jjsyMinBase(leftv res, leftv v)
3303{
3304  res->data = (char *)syMinBase((ideal)v->Data());
3305  return FALSE;
3306}
3307static BOOLEAN jjpMaxComp(leftv res, leftv v)
3308{
3309  res->data = (char *)pMaxComp((poly)v->Data());
3310  return FALSE;
3311}
3312static BOOLEAN jjmpTrace(leftv res, leftv v)
3313{
3314  res->data = (char *)mpTrace((matrix)v->Data());
3315  return FALSE;
3316}
3317static BOOLEAN jjmpTransp(leftv res, leftv v)
3318{
3319  res->data = (char *)mpTransp((matrix)v->Data());
3320  return FALSE;
3321}
3322static BOOLEAN jjrOrdStr(leftv res, leftv v)
3323{
3324  res->data = rOrdStr((ring)v->Data());
3325  return FALSE;
3326}
3327static BOOLEAN jjrVarStr(leftv res, leftv v)
3328{
3329  res->data = rVarStr((ring)v->Data());
3330  return FALSE;
3331}
3332static BOOLEAN jjrParStr(leftv res, leftv v)
3333{
3334  res->data = rParStr((ring)v->Data());
3335  return FALSE;
3336}
3337static BOOLEAN jjidMinEmbedding(leftv res, leftv v)
3338{
3339  res->data = (char *)idMinEmbedding((ideal)v->Data());
3340  return FALSE;
3341}
3342static BOOLEAN jjCOUNT_R(leftv res, leftv v)
3343{
3344  res->data=(char *)syLength((syStrategy)v->Data());
3345  return FALSE;
3346}
3347static BOOLEAN jjDIM_R(leftv res, leftv v)
3348{
3349  res->data = (char *)syDim((syStrategy)v->Data());
3350  return FALSE;
3351}
3352static BOOLEAN jjMINRES_R(leftv res, leftv v)
3353{
3354  res->data=(char *)syMinimize((syStrategy)v->Data());
3355  return FALSE;
3356}
3357static BOOLEAN jjidTransp(leftv res, leftv v)
3358{
3359  res->data = (char *)idTransp((ideal)v->Data());
3360  return FALSE;
3361}
3362#else
3363#define XS(A)          -((short)A)
3364#define jjstrlen       (proc1)strlen
3365#define jjpLength      (proc1)pLength
3366#define jjidElem       (proc1)idElem
3367#define jjmpDetBareiss (proc1)mpDetBareiss
3368#define jjidFreeModule (proc1)idFreeModule
3369#define jjidVec2Ideal  (proc1)idVec2Ideal
3370#define jjrCharStr     (proc1)rCharStr
3371#ifndef MDEBUG
3372#define jjpHead        (proc1)pHead
3373#endif
3374#define jjidHead       (proc1)idHead
3375#define jjidMaxIdeal   (proc1)idMaxIdeal
3376#define jjidMinBase    (proc1)idMinBase
3377#define jjsyMinBase    (proc1)syMinBase
3378#define jjpMaxComp     (proc1)pMaxComp
3379#define jjmpTrace      (proc1)mpTrace
3380#define jjmpTransp     (proc1)mpTransp
3381#define jjrOrdStr      (proc1)rOrdStr
3382#define jjrVarStr      (proc1)rVarStr
3383#define jjrParStr      (proc1)rParStr
3384#define jjidMinEmbedding (proc1)idMinEmbedding
3385#define jjCOUNT_R        (proc1)syLength
3386#define jjDIM_R        (proc1)syDim
3387#define jjMINRES_R     (proc1)syMinimize
3388#define jjidTransp     (proc1)idTransp
3389#endif
3390#endif
3391BOOLEAN jjnInt(leftv res, leftv u)
3392{
3393  number n=(number)u->CopyD();
3394  res->data=(char *)nInt(n);
3395  nDelete(&n);
3396  return FALSE;
3397}
3398#define s short
3399struct sValCmd1 dArith1[]=
3400{
3401// operations:
3402// proc         cmd               res             arg
3403// {jjPLUSPLUS,   PLUSPLUS,        INT_CMD,        INT_CMD }
3404//,{jjMINUSMINUS, MINUSMINUS,      INT_CMD,        INT_CMD }
3405 {jjPLUSPLUS,   PLUSPLUS,        NONE,           IDHDL }
3406,{jjPLUSPLUS,   MINUSMINUS,      NONE,           IDHDL }
3407,{jjUMINUS_I,   '-',             INT_CMD,        INT_CMD }
3408,{jjUMINUS_N,   '-',             NUMBER_CMD,     NUMBER_CMD }
3409,{jjUMINUS_P,   '-',             POLY_CMD,       POLY_CMD }
3410,{jjUMINUS_P,   '-',             VECTOR_CMD,     VECTOR_CMD }
3411,{jjUMINUS_MA,  '-',             MATRIX_CMD,     MATRIX_CMD }
3412,{jjUMINUS_IV,  '-',             INTVEC_CMD,     INTVEC_CMD }
3413,{jjUMINUS_IV,  '-',             INTMAT_CMD,     INTMAT_CMD }
3414,{jjPROC1,      '(',             ANY_TYPE/*set by p*/,PROC_CMD }
3415,{jjKLAMMER_LIB,'(',             NONE,           STRING_CMD }
3416// and the procedures with 1 argument:
3417,{atATTRIB1,    ATTRIB_CMD,      NONE,           DEF_CMD }
3418,{jjBAREISS_IM, BAREISS_CMD,     INTMAT_CMD,     INTMAT_CMD }
3419,{jjBAREISS,    BAREISS_CMD,     LIST_CMD,       MODUL_CMD }
3420,{jjBETTI,      BETTI_CMD,       INTMAT_CMD,     LIST_CMD }
3421,{syBetti1,     BETTI_CMD,       INTMAT_CMD,     RESOLUTION_CMD }
3422,{jjCHAR,       CHARACTERISTIC_CMD, INT_CMD,     RING_CMD }
3423,{jjCHAR,       CHARACTERISTIC_CMD, INT_CMD,     QRING_CMD }
3424#ifdef HAVE_FACTORY
3425,{jjCHARSERIES, CHAR_SERIES_CMD, MATRIX_CMD,     IDEAL_CMD }
3426#else
3427,{jjWRONG,      CHAR_SERIES_CMD, MATRIX_CMD,     IDEAL_CMD }
3428#endif
3429,{jjrCharStr,   CHARSTR_CMD,     XS(STRING_CMD), RING_CMD }
3430,{jjrCharStr,   CHARSTR_CMD,     XS(STRING_CMD), QRING_CMD }
3431,{jjOpenClose,  CLOSE_CMD,       NONE,           LINK_CMD }
3432,{jjWRONG,      COLS_CMD,        0,              VECTOR_CMD }
3433,{jjCOLS,       COLS_CMD,        INT_CMD,        MATRIX_CMD }
3434,{jjCOLS,       COLS_CMD,        INT_CMD,        IDEAL_CMD }
3435,{jjCOLS,       COLS_CMD,        INT_CMD,        MODUL_CMD }
3436,{jjCOLS_IV,    COLS_CMD,        INT_CMD,        INTMAT_CMD }
3437,{jjWRONG,      COLS_CMD,        0,              INTVEC_CMD }
3438,{jjCONTENT,    CONTENT_CMD,     POLY_CMD,       POLY_CMD }
3439,{jjCONTENT,    CONTENT_CMD,     VECTOR_CMD,     VECTOR_CMD }
3440,{jjCOUNT_N,    COUNT_CMD,       INT_CMD,        NUMBER_CMD }
3441,{jjCOUNT_R,    COUNT_CMD,       XS(INT_CMD),    RESOLUTION_CMD }
3442,{jjstrlen,     COUNT_CMD,       XS(INT_CMD),    STRING_CMD }
3443,{jjpLength,    COUNT_CMD,       XS(INT_CMD),    POLY_CMD }
3444,{jjpLength,    COUNT_CMD,       XS(INT_CMD),    VECTOR_CMD }
3445,{jjidElem,     COUNT_CMD,       XS(INT_CMD),    IDEAL_CMD }
3446,{jjidElem,     COUNT_CMD,       XS(INT_CMD),    MODUL_CMD }
3447,{jjCOUNT_M,    COUNT_CMD,       INT_CMD,        MATRIX_CMD }
3448,{jjCOUNT_IV,   COUNT_CMD,       INT_CMD,        INTVEC_CMD }
3449,{jjCOUNT_IV,   COUNT_CMD,       INT_CMD,        INTMAT_CMD }
3450,{jjCOUNT_L,    COUNT_CMD,       INT_CMD,        LIST_CMD }
3451,{jjNULL,       DEF_CMD,         DEF_CMD,        INT_CMD }
3452,{jjWRONG,      DEF_CMD,         0,              ANY_TYPE }
3453,{jjDEG,        DEG_CMD,         INT_CMD,        POLY_CMD }
3454,{jjDEG,        DEG_CMD,         INT_CMD,        VECTOR_CMD }
3455,{jjDEGREE,     DEGREE_CMD,      NONE,           IDEAL_CMD }
3456,{jjDEGREE,     DEGREE_CMD,      NONE,           MODUL_CMD }
3457,{jjDEFINED,    DEFINED_CMD,     INT_CMD,        DEF_CMD }
3458#ifdef HAVE_FACTORY
3459,{jjDET_I,      DET_CMD,         INT_CMD,        INTMAT_CMD }
3460,{jjDET,        DET_CMD,         POLY_CMD,       MATRIX_CMD }
3461,{jjDET_S,      DET_CMD,         POLY_CMD,       MODUL_CMD }
3462#else
3463,{jjWRONG,      DET_CMD,         INT_CMD,        INTMAT_CMD }
3464,{jjmpDetBareiss,DET_CMD,        XS(POLY_CMD),   MATRIX_CMD }
3465#endif
3466,{jjDIM,        DIM_CMD,         INT_CMD,        IDEAL_CMD }
3467,{jjDIM,        DIM_CMD,         INT_CMD,        MODUL_CMD }
3468,{jjDIM_R,      DIM_CMD,         XS(INT_CMD),    RESOLUTION_CMD }
3469,{jjDUMP,       DUMP_CMD,        NONE,           LINK_CMD }
3470,{jjE,          E_CMD,           VECTOR_CMD,     INT_CMD }
3471,{jjERROR,      ERROR_CMD,       NONE,           STRING_CMD }
3472#ifdef HAVE_FACTORY
3473,{jjFAC_P,      FAC_CMD,         LIST_CMD,       POLY_CMD }
3474#else
3475,{jjWRONG,      FAC_CMD,         LIST_CMD,       POLY_CMD }
3476#endif
3477#ifdef HAVE_FGLM
3478,{findUniProc,  FINDUNI_CMD,     IDEAL_CMD,      IDEAL_CMD}
3479#else
3480,{jjWRONG,      FINDUNI_CMD,     IDEAL_CMD,      IDEAL_CMD}
3481#endif
3482,{jjidFreeModule,FREEMODULE_CMD, XS(MODUL_CMD),  INT_CMD }
3483#ifdef HAVE_FACTORY
3484,{jjFACSTD,     FACSTD_CMD,      LIST_CMD,       IDEAL_CMD }
3485#else
3486,{jjWRONG,      FACSTD_CMD,      LIST_CMD,       IDEAL_CMD }
3487#endif
3488,{jjGETDUMP,    GETDUMP_CMD,     NONE,           LINK_CMD }
3489,{jjHIGHCORNER, HIGHCORNER_CMD,  POLY_CMD,       IDEAL_CMD }
3490,{jjHIGHCORNER_M, HIGHCORNER_CMD,VECTOR_CMD,     MODUL_CMD }
3491,{jjHILBERT,    HILBERT_CMD,     NONE,           IDEAL_CMD }
3492,{jjHILBERT,    HILBERT_CMD,     NONE,           MODUL_CMD }
3493,{jjHILBERT_IV, HILBERT_CMD,     INTVEC_CMD,     INTVEC_CMD }
3494,{jjHOMOG1,     HOMOG_CMD,       INT_CMD,        IDEAL_CMD }
3495,{jjHOMOG1,     HOMOG_CMD,       INT_CMD,        MODUL_CMD }
3496,{jjidVec2Ideal,IDEAL_CMD,       XS(IDEAL_CMD),  VECTOR_CMD }
3497,{jjIDEAL_Ma,   IDEAL_CMD,       IDEAL_CMD,      MATRIX_CMD }
3498,{jjIDEAL_R,    IDEAL_CMD,       IDEAL_CMD,      QRING_CMD }
3499,{jjIDEAL_R,    IDEAL_CMD,       IDEAL_CMD,      RING_CMD }
3500,{jjIDEAL_Map,  IDEAL_CMD,       IDEAL_CMD,      MAP_CMD }
3501,{jjDUMMY,      IDEAL_CMD,       IDEAL_CMD,      IDEAL_CMD }
3502,{jjINDEPSET,   INDEPSET_CMD,    INTVEC_CMD,     IDEAL_CMD }
3503,{jjDUMMY,      INT_CMD,         INT_CMD,        INT_CMD }
3504,{jjnInt,       INT_CMD,         INT_CMD,        NUMBER_CMD }
3505,{jjP2I,        INT_CMD,         INT_CMD,        POLY_CMD }
3506,{jjINTERRED,   INTERRED_CMD,    IDEAL_CMD,      IDEAL_CMD }
3507,{jjINTERRED,   INTERRED_CMD,    MODUL_CMD,      MODUL_CMD }
3508,{jjDUMMY,      INTMAT_CMD,      INTMAT_CMD,     INTMAT_CMD }
3509,{jjIm2Iv,      INTVEC_CMD,      INTVEC_CMD,     INTMAT_CMD }
3510,{jjDUMMY,      INTVEC_CMD,      INTVEC_CMD,     INTVEC_CMD }
3511,{jjIS_RINGVAR_P, IS_RINGVAR,    INT_CMD,        POLY_CMD }
3512,{jjIS_RINGVAR_S, IS_RINGVAR,    INT_CMD,        STRING_CMD }
3513,{jjIS_RINGVAR0,IS_RINGVAR,      INT_CMD,        ANY_TYPE }
3514,{jjJACOB_P,    JACOB_CMD,       IDEAL_CMD,      POLY_CMD }
3515,{mpJacobi,     JACOB_CMD,       MATRIX_CMD,     IDEAL_CMD }
3516,{jjKBASE,      KBASE_CMD,       IDEAL_CMD,      IDEAL_CMD }
3517,{jjKBASE,      KBASE_CMD,       MODUL_CMD,      MODUL_CMD }
3518,{atKILLATTR1,  KILLATTR_CMD,    NONE,           IDHDL }
3519#ifdef MDEBUG
3520,{jjpHead,      LEAD_CMD,        POLY_CMD,       POLY_CMD }
3521#else
3522,{jjpHead,      LEAD_CMD,        XS(POLY_CMD),   POLY_CMD }
3523#endif
3524,{jjidHead,     LEAD_CMD,        XS(IDEAL_CMD),  IDEAL_CMD }
3525#ifdef MDEBUG
3526,{jjpHead,      LEAD_CMD,        VECTOR_CMD,     VECTOR_CMD }
3527#else
3528,{jjpHead,      LEAD_CMD,        XS(VECTOR_CMD), VECTOR_CMD }
3529#endif
3530,{jjidHead,     LEAD_CMD,        XS(MODUL_CMD),  MODUL_CMD }
3531,{jjLEADCOEF,   LEADCOEF_CMD,    NUMBER_CMD,     POLY_CMD }
3532,{jjLEADCOEF,   LEADCOEF_CMD,    NUMBER_CMD,     VECTOR_CMD }
3533,{jjLEADEXP,    LEADEXP_CMD,     INTVEC_CMD,     POLY_CMD }
3534,{jjLEADEXP,    LEADEXP_CMD,     INTVEC_CMD,     VECTOR_CMD }
3535,{jjLEADMONOM,  LEADMONOM_CMD,   POLY_CMD,       POLY_CMD }
3536,{jjLEADMONOM,  LEADMONOM_CMD,   VECTOR_CMD,     VECTOR_CMD }
3537,{jjLIB,        LIB_CMD,         NONE,           STRING_CMD }
3538,{jjDUMMY,      LINK_CMD,        LINK_CMD,       LINK_CMD}
3539,{jjCALL1MANY,  LIST_CMD,        LIST_CMD,       DEF_CMD }
3540,{jjWRONG,      MAP_CMD,         0,              ANY_TYPE}
3541,{jjDUMMY,      MATRIX_CMD,      MATRIX_CMD,     MATRIX_CMD }
3542,{jjidMaxIdeal, MAXID_CMD,       XS(IDEAL_CMD),  INT_CMD }
3543,{jjMEMORY,     MEMORY_CMD,      INT_CMD,        INT_CMD }
3544,{jjidMinBase,  MINBASE_CMD,     XS(IDEAL_CMD),  IDEAL_CMD }
3545,{jjidMinBase,  MINBASE_CMD,     XS(MODUL_CMD),  MODUL_CMD }
3546,{jjMINRES,     MINRES_CMD,      LIST_CMD,       LIST_CMD }
3547,{jjMINRES_R,   MINRES_CMD,      XS(RESOLUTION_CMD), RESOLUTION_CMD }
3548,{jjDUMMY,      MODUL_CMD,       MODUL_CMD,      MODUL_CMD }
3549,{jjMONITOR1,   MONITOR_CMD,     NONE,           STRING_CMD }
3550,{jjMULT,       MULTIPLICITY_CMD,  INT_CMD,      IDEAL_CMD }
3551,{jjMULT,       MULTIPLICITY_CMD,  INT_CMD,      MODUL_CMD }
3552,{jjMSTD,       MSTD_CMD,        LIST_CMD,       IDEAL_CMD }
3553,{jjNAMEOF,     NAMEOF_CMD,      STRING_CMD,     ANY_TYPE }
3554,{jjNAMES,      NAMES_CMD,       LIST_CMD,       PACKAGE_CMD }
3555,{jjNAMES,      NAMES_CMD,       LIST_CMD,       RING_CMD }
3556,{jjNAMES,      NAMES_CMD,       LIST_CMD,       QRING_CMD }
3557,{jjDUMMY,      NUMBER_CMD,      NUMBER_CMD,     NUMBER_CMD }
3558,{jjP2N,        NUMBER_CMD,      NUMBER_CMD,     POLY_CMD }
3559,{jjRPAR,       NPARS_CMD,       INT_CMD,        RING_CMD }
3560,{jjRPAR,       NPARS_CMD,       INT_CMD,        QRING_CMD }
3561,{jjNVARS,      NVARS_CMD,       INT_CMD,        RING_CMD }
3562,{jjNVARS,      NVARS_CMD,       INT_CMD,        QRING_CMD }
3563,{jjOpenClose,  OPEN_CMD,        NONE,           LINK_CMD }
3564,{jjORD,        ORD_CMD,         INT_CMD,        POLY_CMD }
3565,{jjORD,        ORD_CMD,         INT_CMD,        VECTOR_CMD }
3566,{jjrOrdStr,    ORDSTR_CMD,      XS(STRING_CMD), RING_CMD }
3567,{jjrOrdStr,    ORDSTR_CMD,      XS(STRING_CMD), QRING_CMD }
3568,{jjPAR1,       PAR_CMD,         NUMBER_CMD,     INT_CMD }
3569,{jjPARDEG,     PARDEG_CMD,      INT_CMD,        NUMBER_CMD }
3570,{jjPARSTR1,    PARSTR_CMD,      STRING_CMD,     INT_CMD }
3571,{jjrParStr,    PARSTR_CMD,      XS(STRING_CMD), RING_CMD }
3572,{jjrParStr,    PARSTR_CMD,      XS(STRING_CMD), QRING_CMD }
3573,{jjDUMMY,      POLY_CMD,        POLY_CMD,       POLY_CMD }
3574,{jjPREIMAGE_R, PREIMAGE_CMD,    RING_CMD,       MAP_CMD }
3575,{jjPRIME,      PRIME_CMD,       INT_CMD,        INT_CMD }
3576,{jjPRINT,      PRINT_CMD,       NONE,           LIST_CMD}
3577,{jjPRINT,      PRINT_CMD,       NONE,           DEF_CMD}
3578,{jjidMinEmbedding, PRUNE_CMD,   XS(MODUL_CMD),  MODUL_CMD }
3579,{kQHWeight,    QHWEIGHT_CMD,    INTVEC_CMD,     IDEAL_CMD }
3580,{kQHWeight,    QHWEIGHT_CMD,    INTVEC_CMD,     MODUL_CMD }
3581,{jjWRONG,      QRING_CMD,       0,              ANY_TYPE}
3582,{jjREAD,       READ_CMD,        STRING_CMD,     LINK_CMD }
3583,{jjREGULARITY, REGULARITY_CMD,  INT_CMD,        LIST_CMD }
3584,{jjRESERVEDNAME,RESERVEDNAME_CMD, INT_CMD,      STRING_CMD }
3585,{jjL2R,        RESOLUTION_CMD,  RESOLUTION_CMD, LIST_CMD }
3586,{jjDUMMY,      RESOLUTION_CMD,  RESOLUTION_CMD, RESOLUTION_CMD }
3587,{jjDUMMY,      RING_CMD,        RING_CMD,       RING_CMD}
3588,{jjWRONG,      ROWS_CMD,        0,              POLY_CMD }
3589,{jjpMaxComp,   ROWS_CMD,        XS(INT_CMD),    VECTOR_CMD }
3590,{jjROWS,       ROWS_CMD,        INT_CMD,        MODUL_CMD }
3591,{jjROWS,       ROWS_CMD,        INT_CMD,        MATRIX_CMD }
3592,{jjROWS_IV,    ROWS_CMD,        INT_CMD,        INTMAT_CMD }
3593,{jjCOUNT_IV,   ROWS_CMD,        INT_CMD,        INTVEC_CMD }
3594,{jjSort_Id,    SORTVEC_CMD,     INTVEC_CMD,     IDEAL_CMD }
3595,{jjSort_Id,    SORTVEC_CMD,     INTVEC_CMD,     MODUL_CMD }
3596#ifdef HAVE_SPECTRUM
3597,{spectrumProc, SPECTRUM_CMD,    LIST_CMD,       POLY_CMD }
3598#endif
3599,{jjSTD,        STD_CMD,         IDEAL_CMD,      IDEAL_CMD }
3600,{jjSTD,        STD_CMD,         MODUL_CMD,      MODUL_CMD }
3601,{jjDUMMY,      STRING_CMD,      STRING_CMD,     STRING_CMD }
3602,{jjSYSTEM,     SYSTEM_CMD,      NONE,           STRING_CMD }
3603,{jjSYZYGY,     SYZYGY_CMD,      MODUL_CMD,      IDEAL_CMD }
3604,{jjSYZYGY,     SYZYGY_CMD,      MODUL_CMD,      MODUL_CMD }
3605,{jjWRONG,      TRACE_CMD,       0,              INTVEC_CMD }
3606,{jjWRONG,      TRACE_CMD,       0,              IDEAL_CMD }
3607,{jjTRACE_IV,   TRACE_CMD,       INT_CMD,        INTMAT_CMD }
3608,{jjmpTrace,    TRACE_CMD,       XS(POLY_CMD),   MATRIX_CMD }
3609,{jjTRANSP_IV,  TRANSPOSE_CMD,   INTMAT_CMD,     INTVEC_CMD }
3610,{jjTRANSP_IV,  TRANSPOSE_CMD,   INTMAT_CMD,     INTMAT_CMD }
3611,{jjmpTransp,   TRANSPOSE_CMD,   XS(MATRIX_CMD), MATRIX_CMD }
3612,{jjidTransp,   TRANSPOSE_CMD,   XS(MODUL_CMD),  MODUL_CMD }
3613,{jjTYPEOF,     TYPEOF_CMD,      STRING_CMD,     ANY_TYPE }
3614,{jjDUMMY,      VECTOR_CMD,      VECTOR_CMD,     VECTOR_CMD }
3615,{jjVDIM,       VDIM_CMD,        INT_CMD,        IDEAL_CMD }
3616,{jjVDIM,       VDIM_CMD,        INT_CMD,        MODUL_CMD }
3617,{jjVAR1,       VAR_CMD,         POLY_CMD,       INT_CMD }
3618,{jjVARSTR1,    VARSTR_CMD,      STRING_CMD,     INT_CMD }
3619,{jjrVarStr,    VARSTR_CMD,      XS(STRING_CMD), RING_CMD }
3620,{jjrVarStr,    VARSTR_CMD,      XS(STRING_CMD), QRING_CMD }
3621,{kWeight,      WEIGHT_CMD,      INTVEC_CMD,     IDEAL_CMD }
3622,{kWeight,      WEIGHT_CMD,      INTVEC_CMD,     MODUL_CMD }
3623,{jjLOAD1,      LOAD_CMD,        NONE,           STRING_CMD }
3624,{NULL,         0,               0,              0}
3625};
3626#undef s
3627/*=================== operations with 3 args.: static proc =================*/
3628static BOOLEAN jjBRACK_S(leftv res, leftv u, leftv v,leftv w)
3629{
3630  char *s= (char *)u->Data();
3631  int   r = (int)v->Data();
3632  int   c = (int)w->Data();
3633  int l = strlen(s);
3634
3635  if ( (r<1) || (r>l) || (c<0) )
3636  {
3637    Werror("wrong range[%d,%d] in string %s",r,c,u->Fullname());
3638    return TRUE;
3639  }
3640  res->data = (char *)AllocL(c+1);
3641  sprintf((char *)res->data,"%-*.*s",c,c,s+r-1);
3642  return FALSE;
3643}
3644static BOOLEAN jjBRACK_Im(leftv res, leftv u, leftv v,leftv w)
3645{
3646  intvec *iv = (intvec *)u->Data();
3647  int   r = (int)v->Data();
3648  int   c = (int)w->Data();
3649  if ((r<1)||(r>iv->rows())||(c<1)||(c>iv->cols()))
3650  {
3651    Werror("wrong range[%d,%d] in intmat %s(%d x %d)",
3652           r,c,u->Fullname(),iv->rows(),iv->cols());
3653    return TRUE;
3654  }
3655  res->data=u->data;
3656  u->data=NULL;
3657  res->rtyp=u->rtyp;
3658  u->rtyp=0;
3659  res->name=u->name;
3660  u->name=NULL;
3661  Subexpr e=jjMakeSub(v);
3662          e->next=jjMakeSub(w);
3663  if (u->e==NULL) res->e=e;
3664  else
3665  {
3666    Subexpr h=u->e;
3667    while (h->next!=NULL) h=h->next;
3668    h->next=e;
3669    res->e=u->e;
3670    u->e=NULL;
3671  }
3672  return FALSE;
3673}
3674static BOOLEAN jjBRACK_Ma(leftv res, leftv u, leftv v,leftv w)
3675{
3676  matrix m= (matrix)u->Data();
3677  int   r = (int)v->Data();
3678  int   c = (int)w->Data();
3679  //Print("gen. elem %d, %d\n",r,c);
3680  if ((r<1)||(r>MATROWS(m))||(c<1)||(c>MATCOLS(m)))
3681  {
3682    Werror("wrong range[%d,%d] in matrix %s(%d x %d)",r,c,u->Fullname(),
3683      MATROWS(m),MATCOLS(m));
3684    return TRUE;
3685  }
3686  res->data=u->data;
3687  u->data=NULL;
3688  res->rtyp=u->rtyp;
3689  u->rtyp=0;
3690  res->name=u->name;
3691  u->name=NULL;
3692  Subexpr e=jjMakeSub(v);
3693          e->next=jjMakeSub(w);
3694  if (u->e==NULL)
3695    res->e=e;
3696  else
3697  {
3698    Subexpr h=u->e;
3699    while (h->next!=NULL) h=h->next;
3700    h->next=e;
3701    res->e=u->e;
3702    u->e=NULL;
3703  }
3704  return FALSE;
3705}
3706static BOOLEAN jjBRACK_Ma_I_IV(leftv res, leftv u, leftv v,leftv w)
3707{
3708  sleftv t;
3709  sleftv ut;
3710  leftv p=NULL;
3711  intvec *iv=(intvec *)w->Data();
3712  int l;
3713  BOOLEAN nok;
3714
3715  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
3716  {
3717    WerrorS("cannot build expression lists from unnamed objects");
3718    return TRUE;
3719  }
3720  memcpy(&ut,u,sizeof(ut));
3721  memset(&t,0,sizeof(t));
3722  t.rtyp=INT_CMD;
3723  for (l=0;l< iv->length(); l++)
3724  {
3725    t.data=(char *)(*iv)[l];
3726    if (p==NULL)
3727    {
3728      p=res;
3729    }
3730    else
3731    {
3732      p->next=(leftv)Alloc0(sizeof(sleftv));
3733      p=p->next;
3734    }
3735    memcpy(u,&ut,sizeof(ut));
3736    if (u->Typ() == MATRIX_CMD)
3737      nok=jjBRACK_Ma(p,u,v,&t);
3738    else /* INTMAT_CMD */
3739      nok=jjBRACK_Im(p,u,v,&t);
3740    if (nok)
3741    {
3742      while (res->next!=NULL)
3743      {
3744        p=res->next->next;
3745        Free((ADDRESS)res->next,sizeof(sleftv));
3746        // res->e aufraeumen !!!!
3747        res->next=p;
3748      }
3749      return TRUE;
3750    }
3751  }
3752  return FALSE;
3753}
3754static BOOLEAN jjBRACK_Ma_IV_I(leftv res, leftv u, leftv v,leftv w)
3755{
3756  sleftv t;
3757  sleftv ut;
3758  leftv p=NULL;
3759  intvec *iv=(intvec *)v->Data();
3760  int l;
3761  BOOLEAN nok;
3762
3763  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
3764  {
3765    WerrorS("cannot build expression lists from unnamed objects");
3766    return TRUE;
3767  }
3768  memcpy(&ut,u,sizeof(ut));
3769  memset(&t,0,sizeof(t));
3770  t.rtyp=INT_CMD;
3771  for (l=0;l< iv->length(); l++)
3772  {
3773    t.data=(char *)((*iv)[l]);
3774    if (p==NULL)
3775    {
3776      p=res;
3777    }
3778    else
3779    {
3780      p->next=(leftv)Alloc0(sizeof(sleftv));
3781      p=p->next;
3782    }
3783    memcpy(u,&ut,sizeof(ut));
3784    if (u->Typ() == MATRIX_CMD)
3785      nok=jjBRACK_Ma(p,u,&t,w);
3786    else /* INTMAT_CMD */
3787      nok=jjBRACK_Im(p,u,&t,w);
3788    if (nok)
3789    {
3790      while (res->next!=NULL)
3791      {
3792        p=res->next->next;
3793        Free((ADDRESS)res->next,sizeof(sleftv));
3794        // res->e aufraeumen !!
3795        res->next=p;
3796      }
3797      return TRUE;
3798    }
3799  }
3800  return FALSE;
3801}
3802static BOOLEAN jjBRACK_Ma_IV_IV(leftv res, leftv u, leftv v,leftv w)
3803{
3804  sleftv t1,t2,ut;
3805  leftv p=NULL;
3806  intvec *vv=(intvec *)v->Data();
3807  intvec *wv=(intvec *)w->Data();
3808  int vl;
3809  int wl;
3810  BOOLEAN nok;
3811
3812  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
3813  {
3814    WerrorS("cannot build expression lists from unnamed objects");
3815    return TRUE;
3816  }
3817  memcpy(&ut,u,sizeof(ut));
3818  memset(&t1,0,sizeof(sleftv));
3819  memset(&t2,0,sizeof(sleftv));
3820  t1.rtyp=INT_CMD;
3821  t2.rtyp=INT_CMD;
3822  for (vl=0;vl< vv->length(); vl++)
3823  {
3824    t1.data=(char *)((*vv)[vl]);
3825    for (wl=0;wl< wv->length(); wl++)
3826    {
3827      t2.data=(char *)((*wv)[wl]);
3828      if (p==NULL)
3829      {
3830        p=res;
3831      }
3832      else
3833      {
3834        p->next=(leftv)Alloc0(sizeof(sleftv));
3835        p=p->next;
3836      }
3837      memcpy(u,&ut,sizeof(ut));
3838      if (u->Typ() == MATRIX_CMD)
3839        nok=jjBRACK_Ma(p,u,&t1,&t2);
3840      else /* INTMAT_CMD */
3841        nok=jjBRACK_Im(p,u,&t1,&t2);
3842      if (nok)
3843      {
3844        res->CleanUp();
3845        return TRUE;
3846      }
3847    }
3848  }
3849  return FALSE;
3850}
3851static BOOLEAN jjPROC3(leftv res, leftv u, leftv v, leftv w)
3852{
3853  v->next=(leftv)Alloc(sizeof(sleftv));
3854  memcpy(v->next,w,sizeof(sleftv));
3855  BOOLEAN r=iiExprArith2(res,u,'(',v);
3856  v->rtyp=0; v->data=NULL;
3857  w->rtyp=0; w->data=NULL;
3858  return r;
3859}
3860static BOOLEAN jjCALL3MANY(leftv res, leftv u, leftv v, leftv w)
3861{
3862  u->next=(leftv)Alloc(sizeof(sleftv));
3863  memcpy(u->next,v,sizeof(sleftv));
3864  u->next->next=(leftv)Alloc(sizeof(sleftv));
3865  memcpy(u->next->next,w,sizeof(sleftv));
3866  BOOLEAN r=iiExprArithM(res,u,iiOp);
3867  v->rtyp=0; v->data=NULL; // iiExprArithM did the CleanUp
3868  w->rtyp=0; w->data=NULL;
3869  return r;
3870}
3871static BOOLEAN jjBAREISS3(leftv res, leftv u, leftv v, leftv w)
3872{
3873  lists l=smCallNewBareiss((ideal)u->Data(),(int)v->Data(),(int)w->Data());
3874  res->data = (char *)l;
3875  return FALSE;
3876}
3877static BOOLEAN jjCOEFFS3_Id(leftv res, leftv u, leftv v, leftv w)
3878{
3879  if ((w->rtyp!=IDHDL)||(w->e!=NULL))
3880  {
3881    WerrorS("3rd argument must be a name of a matrix");
3882    return TRUE;
3883  }
3884  ideal i=(ideal)u->Data();
3885  int rank=(int)i->rank;
3886  BOOLEAN r=jjCOEFFS_Id(res,u,v);
3887  if (r) return TRUE;
3888  mpMonomials((matrix)res->data, rank, pVar((poly)v->Data()),(matrix)w->Data());
3889  return FALSE;
3890}
3891static BOOLEAN jjCOEFFS3_KB(leftv res, leftv u, leftv v, leftv w)
3892{
3893  res->data=(void*)idCoeffOfKBase((ideal)(u->Data()),
3894           (ideal)(v->Data()),(poly)(w->Data()));
3895  return FALSE;
3896}
3897static BOOLEAN jjCOEFFS3_P(leftv res, leftv u, leftv v, leftv w)
3898{
3899  if ((w->rtyp!=IDHDL)||(w->e!=NULL))
3900  {
3901    WerrorS("3rd argument must be a name of a matrix");
3902    return TRUE;
3903  }
3904  poly p=(poly)u->CopyD();
3905  ideal i=idInit(1,1);
3906  i->m[0]=p;
3907  sleftv t;
3908  memset(&t,0,sizeof(t));
3909  t.data=(char *)i;
3910  t.rtyp=IDEAL_CMD;
3911  int rank=1;
3912  if (u->Typ()==VECTOR_CMD)
3913  {
3914    i->rank=rank=pMaxComp(p);
3915    t.rtyp=MODUL_CMD;
3916  }
3917  BOOLEAN r=jjCOEFFS_Id(res,&t,v);
3918  t.CleanUp();
3919  if (r) return TRUE;
3920  mpMonomials((matrix)res->data, rank, pVar((poly)v->Data()),(matrix)w->Data());
3921  return FALSE;
3922}
3923static BOOLEAN jjELIMIN_HILB(leftv res, leftv u, leftv v, leftv w)
3924{
3925  res->data=(char *)idElimination((ideal)u->Data(),(poly)v->Data(),
3926    (intvec *)w->Data());
3927  setFlag(res,FLAG_STD);
3928  return FALSE;
3929}
3930static BOOLEAN jjFIND3(leftv res, leftv u, leftv v, leftv w)
3931{
3932  /*4
3933  * look for the substring what in the string where
3934  * starting at position n
3935  * return the position of the first char of what in where
3936  * or 0
3937  */
3938  int n=(int)w->Data();
3939  char *where=(char *)u->Data();
3940  char *what=(char *)v->Data();
3941  char *found;
3942  if ((1>n)||(n>(int)strlen(where)))
3943  {
3944    Werror("start position %d out of range",n);
3945    return TRUE;
3946  }
3947  found = strchr(where+n-1,*what);
3948  if (*(what+1)!='\0')
3949  {
3950    while((found !=NULL) && (strncmp(found+1,what+1,strlen(what+1))!=0))
3951    {
3952      found=strchr(found+1,*what);
3953    }
3954  }
3955  if (found != NULL)
3956  {
3957    res->data=(char *)((found-where)+1);
3958  }
3959  return FALSE;
3960}
3961static BOOLEAN jjINTMAT3(leftv res, leftv u, leftv v,leftv w)
3962{
3963  intvec* im= new intvec((int)v->Data(),(int)w->Data(), 0);
3964  intvec* arg = (intvec*) u->Data();
3965  int i, n = min(im->cols()*im->rows(), arg->cols()*arg->rows());
3966
3967  for (i=0; i<n; i++)
3968  {
3969    (*im)[i] = (*arg)[i];
3970  }
3971
3972  res->data = (char *)im;
3973  return FALSE;
3974}
3975static BOOLEAN jjJET_P_IV(leftv res, leftv u, leftv v, leftv w)
3976{
3977  short *iw=iv2array((intvec *)w->Data());
3978  res->data = (char *)pJetW((poly)u->Data(),(int)v->Data(),iw);
3979  Free((ADDRESS)iw,(pVariables+1)*sizeof(short));
3980  return FALSE;
3981}
3982static BOOLEAN jjJET_ID_IV(leftv res, leftv u, leftv v, leftv w)
3983{
3984  res->data = (char *)idJetW((ideal)u->Data(),(int)v->Data(),
3985                             (intvec *)w->Data());
3986  return FALSE;
3987}
3988static BOOLEAN jjPREIMAGE(leftv res, leftv u, leftv v, leftv w)
3989{
3990  idhdl h;
3991  ring rr;
3992  map mapping;
3993
3994  if ((v->name==NULL) || (w->name==NULL))
3995  {
3996    WerrorS("2nd/3rd arguments must have names");
3997    return TRUE;
3998  }
3999  rr=(ring)u->Data();
4000  const char *ring_name=u->Name();
4001  if ((h=rr->idroot->get(v->name,myynest))!=NULL)
4002  {
4003    if (h->typ==MAP_CMD)
4004    {
4005      mapping=IDMAP(h);
4006      idhdl preim_ring=idroot->get(mapping->preimage,myynest);
4007      if ((preim_ring==NULL)
4008      || (IDRING(preim_ring)!=currRing))
4009      {
4010        Werror("preimage ring `%s` is not the basering",mapping->preimage);
4011        return TRUE;
4012      }
4013    }
4014    else if (h->typ==IDEAL_CMD)
4015    {
4016      mapping=IDMAP(h);
4017    }
4018    else
4019    {
4020      Werror("`%s` is no map nor ideal",IDID(h));
4021      return TRUE;
4022    }
4023  }
4024  else
4025  {
4026    Werror("`%s` is not defined in `%s`",v->name,ring_name);
4027    return TRUE;
4028  }
4029  if ((h=rr->idroot->get(w->name,myynest))!=NULL)
4030  {
4031    if (h->typ==IDEAL_CMD)
4032    {
4033      res->data=(char *)maGetPreimage(rr,mapping,IDIDEAL(h));
4034    }
4035    else
4036    {
4037      Werror("`%s` is no ideal",IDID(h));
4038      return TRUE;
4039    }
4040  }
4041  else
4042  {
4043    Werror("`%s` is not defined in `%s`",w->name,ring_name);
4044    return TRUE;
4045  }
4046  return FALSE;
4047}
4048static BOOLEAN jjRANDOM_Im(leftv res, leftv u, leftv v, leftv w)
4049{
4050  int di, k;
4051  int i=(int)u->Data();
4052  int r=(int)v->Data();
4053  int c=(int)w->Data();
4054  intvec *iv = new intvec(r, c, 0);
4055  if (iv->rows()==0)
4056  {
4057    delete iv;
4058    return TRUE;
4059  }
4060  if (i!=0)
4061  {
4062    if (i<0) i = -i;
4063    di = 2 * i + 1;
4064    for (k=0; k<iv->length(); k++)
4065    {
4066#ifdef buildin_rand
4067      (*iv)[k] = ((siRand() % di) - i);
4068#else
4069      (*iv)[k] = ((rand() % di) - i);
4070#endif
4071    }
4072  }
4073  res->data = (char *)iv;
4074  return FALSE;
4075}
4076static BOOLEAN jjSUBST_Test(leftv v,leftv w,
4077  int &ringvar, poly &monomexpr)
4078{
4079  monomexpr=(poly)w->Data();
4080  if (pLength(monomexpr)>1)
4081  {
4082    Werror("`%s` substitutes a ringvar only by a term",
4083      Tok2Cmdname(SUBST_CMD));
4084    return TRUE;
4085  }
4086  if (!(ringvar=pVar((poly)v->Data())))
4087  {
4088    WerrorS("ringvar expected");
4089    return TRUE;
4090  }
4091  return FALSE;
4092}
4093static BOOLEAN jjSUBST_P(leftv res, leftv u, leftv v,leftv w)
4094{
4095  int ringvar;
4096  poly monomexpr;
4097  BOOLEAN nok=jjSUBST_Test(v,w,ringvar,monomexpr);
4098  if (nok) return TRUE;
4099  res->data = pSubst((poly)u->CopyD(POLY_CMD),ringvar,monomexpr);
4100  return FALSE;
4101}
4102static BOOLEAN jjSUBST_Id(leftv res, leftv u, leftv v,leftv w)
4103{
4104  int ringvar;
4105  poly monomexpr;
4106  BOOLEAN nok=jjSUBST_Test(v,w,ringvar,monomexpr);
4107  if (nok) return TRUE;
4108  res->data = idSubst((ideal)u->CopyD(IDEAL_CMD),ringvar,monomexpr);
4109  return FALSE;
4110}
4111static BOOLEAN jjMATRIX_Id(leftv res, leftv u, leftv v,leftv w)
4112{
4113  matrix m=mpNew((int)v->Data(),(int)w->Data());
4114  ideal I=(ideal)u->CopyD(IDEAL_CMD);
4115  int i=min(IDELEMS(I),(int)v->Data()*(int)w->Data());
4116  //for(i=i-1;i>=0;i--)
4117  //{
4118  //  m->m[i]=I->m[i];
4119  //  I->m[i]=NULL;
4120  //}
4121  memcpy4(m->m,I->m,i*sizeof(poly));
4122  memset(I->m,0,i*sizeof(poly));
4123  idDelete(&I);
4124  res->data = (char *)m;
4125  return FALSE;
4126}
4127static BOOLEAN jjMATRIX_Mo(leftv res, leftv u, leftv v,leftv w)
4128{
4129  res->data = (char *)idModule2formatedMatrix((ideal)u->CopyD(MODUL_CMD),
4130           (int)v->Data(),(int)w->Data());
4131  return FALSE;
4132}
4133static BOOLEAN jjMATRIX_Ma(leftv res, leftv u, leftv v,leftv w)
4134{
4135  matrix m=mpNew((int)v->Data(),(int)w->Data());
4136  matrix I=(matrix)u->CopyD(MATRIX_CMD);
4137  int r=min(MATROWS(I),(int)v->Data());
4138  int c=min(MATCOLS(I),(int)w->Data());
4139  int i,j;
4140  for(i=r;i>0;i--)
4141  {
4142    for(j=c;j>0;j--)
4143    {
4144      MATELEM(m,i,j)=MATELEM(I,i,j);
4145      MATELEM(I,i,j)=NULL;
4146    }
4147  }
4148  idDelete((ideal *)&I);
4149  res->data = (char *)m;
4150  return FALSE;
4151}
4152static BOOLEAN jjLIFT3(leftv res, leftv u, leftv v, leftv w)
4153{
4154  int sw=(int)w->Data();
4155  if (sw==0)
4156  {
4157    return jjLIFT(res,u,v);
4158  }
4159  else
4160  {
4161    ideal m;
4162    ideal ui=(ideal)u->Data();
4163    ideal vi=(ideal)v->Data();
4164    int ul= IDELEMS(ui);
4165    int vl= IDELEMS(vi);
4166    m = idLiftNonStB(ui,vi, sw);
4167    res->data = (char *)idModule2formatedMatrix(m,ul,vl);
4168  }
4169  return FALSE;
4170}
4171static BOOLEAN jjREDUCE3_P(leftv res, leftv u, leftv v, leftv w)
4172{
4173  assumeStdFlag(v);
4174  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(poly)u->Data(),
4175    0,(int)w->Data());
4176  return FALSE;
4177}
4178static BOOLEAN jjREDUCE3_ID(leftv res, leftv u, leftv v, leftv w)
4179{
4180  assumeStdFlag(v);
4181  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(ideal)u->Data(),
4182    0,(int)w->Data());
4183  return FALSE;
4184}
4185#ifdef OLD_RES
4186static BOOLEAN jjRES3(leftv res, leftv u, leftv v, leftv w)
4187{
4188  int maxl=(int)v->Data();
4189  int l=0;
4190  resolvente r;
4191  intvec **weights=NULL;
4192  int wmaxl=maxl;
4193  maxl--;
4194  if ((maxl==-1) && (iiOp!=MRES_CMD))
4195    maxl = pVariables-1;
4196  if ((iiOp == RES_CMD) || (iiOp == MRES_CMD))
4197  {
4198    if (BTEST1(28))
4199    {
4200      r=syMinRes((ideal)u->Data(),maxl,&l,iiOp==MRES_CMD);
4201    }
4202    else
4203    {
4204      intvec * iv=(intvec*)atGet(u,"isHomog");
4205      if (iv!=NULL)
4206      {
4207        weights = (intvec**)Alloc0(sizeof(intvec*));
4208        weights[0] = ivCopy(iv);
4209        l=1;
4210      }
4211      r=syResolvente((ideal)u->Data(),maxl,&l, &weights, iiOp==MRES_CMD);
4212    }
4213  }
4214  else
4215    r=sySchreyerResolvente((ideal)u->Data(),maxl+1,&l);
4216  if (r==NULL) return TRUE;
4217  int t3=u->Typ();
4218  iiMakeResolv(r,l,wmaxl,w->name,t3,weights);
4219  return FALSE;
4220  return TRUE;
4221}
4222#endif
4223static BOOLEAN jjSTATUS3(leftv res, leftv u, leftv v, leftv w)
4224{
4225  int yes;
4226  jjSTATUS2(res, u, v);
4227  yes = (strcmp((char *) res->data, (char *) w->Data()) == 0);
4228  FreeL((ADDRESS) res->data);
4229  res->data = (void *) yes;
4230  return FALSE;
4231}
4232static BOOLEAN jjSTD_HILB_W(leftv res, leftv u, leftv v, leftv w)
4233{
4234  ideal result;
4235  intvec *ww=(intvec *)atGet(u,"isHomog");
4236  tHomog hom=testHomog;
4237  if (ww!=NULL)
4238  {
4239    ww=ivCopy(ww);
4240    hom=isHomog;
4241  }
4242  result=kStd((ideal)(u->Data()),
4243              currQuotient,
4244              hom,
4245              &ww,                  // module weights
4246              (intvec *)v->Data(),  // hilbert series
4247              0,0,                  // syzComp, newIdeal
4248              (intvec *)w->Data()); // weights of vars
4249  idSkipZeroes(result);
4250  res->data = (char *)result;
4251  setFlag(res,FLAG_STD);
4252  if (ww!=NULL) atSet(res,mstrdup("isHomog"),ww,INTVEC_CMD);
4253  return FALSE;
4254}
4255
4256/*=================== operations with 3 args.: table =================*/
4257struct sValCmd3 dArith3[]=
4258{
4259// operations:
4260// proc             cmd          res         arg1        arg2        arg3
4261 {jjBRACK_S,        '[',        STRING_CMD, STRING_CMD, INT_CMD,    INT_CMD }
4262,{jjBRACK_Im,       '[',        INT_CMD,    INTMAT_CMD, INT_CMD,    INT_CMD }
4263,{jjBRACK_Ma_I_IV,  '[',        INT_CMD,    INTMAT_CMD, INT_CMD,    INTVEC_CMD }
4264,{jjBRACK_Ma_IV_I,  '[',        INT_CMD,    INTMAT_CMD, INTVEC_CMD, INT_CMD }
4265,{jjBRACK_Ma_IV_IV, '[',        INT_CMD,    INTMAT_CMD, INTVEC_CMD, INTVEC_CMD }
4266,{jjBRACK_Ma,       '[',        POLY_CMD,   MATRIX_CMD, INT_CMD,    INT_CMD }
4267,{jjBRACK_Ma_I_IV,  '[',        POLY_CMD,   MATRIX_CMD, INT_CMD,    INTVEC_CMD }
4268,{jjBRACK_Ma_IV_I,  '[',        POLY_CMD,   MATRIX_CMD, INTVEC_CMD, INT_CMD }
4269,{jjBRACK_Ma_IV_IV, '[',        POLY_CMD,   MATRIX_CMD, INTVEC_CMD, INTVEC_CMD }
4270,{jjPROC3,          '(',        ANY_TYPE,   PROC_CMD,   DEF_CMD,    DEF_CMD }
4271,{atATTRIB3,        ATTRIB_CMD, NONE,       IDHDL,      STRING_CMD, DEF_CMD }
4272,{jjBAREISS3,       BAREISS_CMD,LIST_CMD,   MODUL_CMD,  INT_CMD,    INT_CMD }
4273,{jjCOEFFS3_P,      COEFFS_CMD, MATRIX_CMD, POLY_CMD,   POLY_CMD,   MATRIX_CMD }
4274,{jjCOEFFS3_P,      COEFFS_CMD, MATRIX_CMD, VECTOR_CMD, POLY_CMD,   MATRIX_CMD }
4275,{jjCOEFFS3_Id,     COEFFS_CMD, MATRIX_CMD, IDEAL_CMD,  POLY_CMD,   MATRIX_CMD }
4276,{jjCOEFFS3_Id,     COEFFS_CMD, MATRIX_CMD, MODUL_CMD,  POLY_CMD,   MATRIX_CMD }
4277,{jjCOEFFS3_KB,     COEFFS_CMD, MATRIX_CMD, IDEAL_CMD,  IDEAL_CMD,  POLY_CMD }
4278,{jjCOEFFS3_KB,     COEFFS_CMD, MATRIX_CMD, MODUL_CMD,  MODUL_CMD,  POLY_CMD }
4279,{jjELIMIN_HILB,    ELIMINATION_CMD,IDEAL_CMD, IDEAL_CMD, POLY_CMD, INTVEC_CMD }
4280,{jjFIND3,          FIND_CMD,   INT_CMD,    STRING_CMD, STRING_CMD, INT_CMD }
4281,{jjCALL3MANY,      IDEAL_CMD,  IDEAL_CMD,  DEF_CMD,    DEF_CMD,    DEF_CMD }
4282//,{jjCALL3MANY,      INTERSECT_CMD,  NONE,   DEF_CMD,    DEF_CMD,    DEF_CMD }
4283,{lInsert3,         INSERT_CMD, LIST_CMD,   LIST_CMD,   DEF_CMD,    INT_CMD }
4284,{jjINTMAT3,        INTMAT_CMD, INTMAT_CMD, INTMAT_CMD, INT_CMD,    INT_CMD }
4285,{jjCALL3MANY,      INTVEC_CMD, INTVEC_CMD, DEF_CMD,    DEF_CMD,    DEF_CMD }
4286,{jjJET_P_IV,       JET_CMD,    POLY_CMD,   POLY_CMD,   INT_CMD,    INTVEC_CMD }
4287,{jjJET_ID_IV,      JET_CMD,    IDEAL_CMD,  IDEAL_CMD,  INT_CMD,    INTVEC_CMD }
4288,{jjJET_P_IV,       JET_CMD,    VECTOR_CMD, VECTOR_CMD, INT_CMD,    INTVEC_CMD }
4289,{jjJET_ID_IV,      JET_CMD,    MODUL_CMD,  MODUL_CMD,  INT_CMD,    INTVEC_CMD }
4290,{mpKoszul,         KOSZUL_CMD, MATRIX_CMD, INT_CMD,    INT_CMD,    IDEAL_CMD }
4291,{jjCALL3MANY,      LIST_CMD,   LIST_CMD,   DEF_CMD,    DEF_CMD,    DEF_CMD }
4292,{jjMATRIX_Id,      MATRIX_CMD, MATRIX_CMD, IDEAL_CMD,  INT_CMD,    INT_CMD }
4293,{jjMATRIX_Mo,      MATRIX_CMD, MATRIX_CMD, MODUL_CMD,  INT_CMD,    INT_CMD }
4294,{jjMATRIX_Ma,      MATRIX_CMD, MATRIX_CMD, MATRIX_CMD, INT_CMD,    INT_CMD }
4295,{jjCALL3MANY,      MODUL_CMD,  MODUL_CMD,  DEF_CMD,    DEF_CMD,    DEF_CMD }
4296#ifdef OLD_RES
4297,{jjRES3,           MRES_CMD,   NONE,       IDEAL_CMD,  INT_CMD,    ANY_TYPE }
4298,{jjRES3,           MRES_CMD,   NONE,       MODUL_CMD,  INT_CMD,    ANY_TYPE }
4299#endif
4300,{jjLIFT3,          LIFT_CMD,   MATRIX_CMD, IDEAL_CMD,  IDEAL_CMD,  INT_CMD }
4301,{jjPREIMAGE,       PREIMAGE_CMD, IDEAL_CMD, RING_CMD,  ANY_TYPE,   ANY_TYPE }
4302,{jjPREIMAGE,       PREIMAGE_CMD, IDEAL_CMD, QRING_CMD, ANY_TYPE,   ANY_TYPE }
4303,{jjRANDOM_Im,      RANDOM_CMD, INTMAT_CMD, INT_CMD,    INT_CMD,    INT_CMD }
4304,{jjREDUCE3_P,      REDUCE_CMD, POLY_CMD,   POLY_CMD,   IDEAL_CMD,  INT_CMD }
4305,{jjREDUCE3_P,      REDUCE_CMD, VECTOR_CMD, VECTOR_CMD, IDEAL_CMD,  INT_CMD }
4306,{jjREDUCE3_P,      REDUCE_CMD, VECTOR_CMD, VECTOR_CMD, MODUL_CMD,  INT_CMD }
4307,{jjREDUCE3_ID,     REDUCE_CMD, IDEAL_CMD,  IDEAL_CMD,  IDEAL_CMD,  INT_CMD }
4308,{jjREDUCE3_ID,     REDUCE_CMD, MODUL_CMD,  MODUL_CMD,  MODUL_CMD,  INT_CMD }
4309,{jjREDUCE3_ID,     REDUCE_CMD, MODUL_CMD,  MODUL_CMD,  IDEAL_CMD,  INT_CMD }
4310#ifdef OLD_RES
4311,{jjRES3,           RES_CMD,    NONE,       IDEAL_CMD,  INT_CMD,    ANY_TYPE }
4312,{jjRES3,           RES_CMD,    NONE,       MODUL_CMD,  INT_CMD,    ANY_TYPE }
4313#endif
4314#ifdef HAVE_FACTORY
4315,{jjRESULTANT,      RESULTANT_CMD, POLY_CMD,POLY_CMD,   POLY_CMD,   POLY_CMD }
4316#else
4317,{jjWRONG3,         RESULTANT_CMD, POLY_CMD,POLY_CMD,   POLY_CMD,   POLY_CMD }
4318#endif
4319#ifdef HAVE_SPECTRUM
4320,{semicProc3,       SEMIC_CMD,  INT_CMD,    LIST_CMD,   LIST_CMD,   INT_CMD }
4321,{spectrumOp3,      SPECTRUM_CMD, LIST_CMD, LIST_CMD,   STRING_CMD, INT_CMD }
4322,{spectrumOp3,      SPECTRUM_CMD, LIST_CMD, LIST_CMD,   STRING_CMD, LIST_CMD }
4323#endif
4324#ifdef OLD_RES
4325,{jjRES3,           SRES_CMD,   NONE,       IDEAL_CMD,  INT_CMD,    ANY_TYPE }
4326,{jjRES3,           SRES_CMD,   NONE,       MODUL_CMD,  INT_CMD,    ANY_TYPE }
4327#endif
4328,{jjSTATUS3,        STATUS_CMD, INT_CMD,    LINK_CMD,   STRING_CMD, STRING_CMD}
4329,{jjSTD_HILB_W,     STD_CMD,    IDEAL_CMD,  IDEAL_CMD,  INTVEC_CMD, INTVEC_CMD}
4330,{jjSTD_HILB_W,     STD_CMD,    MODUL_CMD,  MODUL_CMD,  INTVEC_CMD, INTVEC_CMD}
4331,{jjSUBST_P,        SUBST_CMD,  POLY_CMD,   POLY_CMD,   POLY_CMD,   POLY_CMD }
4332,{jjSUBST_P,        SUBST_CMD,  VECTOR_CMD, VECTOR_CMD, POLY_CMD,   POLY_CMD }
4333,{jjSUBST_Id,       SUBST_CMD,  IDEAL_CMD,  IDEAL_CMD,  POLY_CMD,   POLY_CMD }
4334,{jjSUBST_Id,       SUBST_CMD,  MODUL_CMD,  MODUL_CMD,  POLY_CMD,   POLY_CMD }
4335,{jjSUBST_Id,       SUBST_CMD,  MATRIX_CMD, MATRIX_CMD, POLY_CMD,   POLY_CMD }
4336,{jjCALL3MANY,      SYSTEM_CMD, NONE,       STRING_CMD, DEF_CMD,    DEF_CMD  }
4337,{nuLagSolve,       LAGSOLVE_CMD,LIST_CMD,  POLY_CMD,   INT_CMD,    INT_CMD  }
4338,{nuVanderSys,      VANDER_CMD, POLY_CMD,   IDEAL_CMD,  IDEAL_CMD,  INT_CMD  }
4339,{NULL,             0,          0,          0,          0,          0 }
4340};
4341/*=================== operations with many arg.: static proc =================*/
4342static BOOLEAN jjCALL1ARG(leftv res, leftv v)
4343{
4344  return iiExprArith1(res,v,iiOp);
4345}
4346static BOOLEAN jjCALL2ARG(leftv res, leftv u)
4347{
4348  leftv v=u->next;
4349  u->next=NULL;
4350  BOOLEAN b=iiExprArith2(res,u,iiOp,v, (iiOp > 255));
4351  u->next=v;
4352  return b;
4353}
4354static BOOLEAN jjCALL3ARG(leftv res, leftv u)
4355{
4356  leftv v = u->next;
4357  leftv w = v->next;
4358  u->next = NULL;
4359  v->next = NULL;
4360  BOOLEAN b = iiExprArith3(res, iiOp, u, v, w);
4361  u->next = v;
4362  v->next = w;
4363  return b;
4364}
4365
4366static BOOLEAN jjCOEF_M(leftv res, leftv v)
4367{
4368  if((v->Typ() != VECTOR_CMD)
4369  || (v->next->Typ() != POLY_CMD)
4370  || (v->next->next->Typ() != MATRIX_CMD)
4371  || (v->next->next->next->Typ() != MATRIX_CMD))
4372     return TRUE;
4373  if (v->next->next->rtyp!=IDHDL) return TRUE;
4374  idhdl c=(idhdl)v->next->next->data;
4375  if (v->next->next->next->rtyp!=IDHDL) return TRUE;
4376  idhdl m=(idhdl)v->next->next->next->data;
4377  idDelete((ideal *)&(c->data.uideal));
4378  idDelete((ideal *)&(m->data.uideal));
4379  mpCoef2((poly)v->Data(),(poly)v->next->Data(),
4380    (matrix *)&(c->data.umatrix),(matrix *)&(m->data.umatrix));
4381  return FALSE;
4382}
4383static BOOLEAN jjIDEAL_PL(leftv res, leftv v)
4384{
4385  int s=1;
4386  leftv h=v;
4387  if (h!=NULL) s=exprlist_length(h);
4388  ideal id=idInit(s,1);
4389  int rank=1;
4390  int i=0;
4391  poly p;
4392  while (h!=NULL)
4393  {
4394    switch(h->Typ())
4395    {
4396      case POLY_CMD:
4397      {
4398        p=(poly)h->CopyD();
4399        break;
4400      }
4401      case INT_CMD:
4402      {
4403        number n=nInit((int)h->Data());
4404        if (!nIsZero(n))
4405        {
4406          p=pOne();
4407          pSetCoeff(p,n);
4408        }
4409        else
4410        {
4411          p=NULL;
4412          nDelete(&n);
4413        }
4414        break;
4415      }
4416      case NUMBER_CMD:
4417      {
4418        number n=(number)h->CopyD();
4419        if (!nIsZero(n))
4420        {
4421          p=pOne();
4422          pSetCoeff(p,n);
4423        }
4424        else
4425        {
4426          p=NULL;
4427          nDelete(&n);
4428        }
4429        break;
4430      }
4431      case VECTOR_CMD:
4432      {
4433        p=(poly)h->CopyD();
4434        if (iiOp!=MODUL_CMD)
4435        {
4436          idDelete(&id);
4437          pDelete(&p);
4438          return TRUE;
4439        }
4440        rank=max(rank,pMaxComp(p));
4441        break;
4442      }
4443      default:
4444      {
4445        idDelete(&id);
4446        return TRUE;
4447      }
4448    }
4449    if ((iiOp==MODUL_CMD)&&(p!=NULL)&&(pGetComp(p)==0))
4450    {
4451      pSetCompP(p,1);
4452    }
4453    id->m[i]=p;
4454    i++;
4455    h=h->next;
4456  }
4457  id->rank=rank;
4458  res->data=(char *)id;
4459  return FALSE;
4460}
4461static BOOLEAN jjINTERSECT_PL(leftv res, leftv v)
4462{
4463  leftv h=v;
4464  int l=v->listLength();
4465  resolvente r=(resolvente)Alloc0(l*sizeof(ideal));
4466  BOOLEAN *copied=(BOOLEAN *)Alloc0(l*sizeof(BOOLEAN));
4467  int t=0;
4468  // try to convert to IDEAL_CMD
4469  while (h!=NULL)
4470  {
4471    if (iiTestConvert(h->Typ(),IDEAL_CMD)!=0)
4472    {
4473      t=IDEAL_CMD;
4474    }
4475    else break;
4476    h=h->next;
4477  }
4478  // if failure, try MODUL_CMD
4479  if (t==0)
4480  {
4481    h=v;
4482    while (h!=NULL)
4483    {
4484      if (iiTestConvert(h->Typ(),MODUL_CMD)!=0)
4485      {
4486        t=MODUL_CMD;
4487      }
4488      else break;
4489      h=h->next;
4490    }
4491  }
4492  // check for success  in converting
4493  if (t==0)
4494  {
4495    WerrorS("cannot convert to ideal or module");
4496    return TRUE;
4497  }
4498  // call idMultSect
4499  h=v;
4500  int i=0;
4501  sleftv tmp;
4502  while (h!=NULL)
4503  {
4504    if (h->Typ()==t)
4505    {
4506      r[i]=(ideal)h->Data(); /*no copy*/
4507      h=h->next;
4508    }
4509    else if(iiConvert(h->Typ(),t,iiTestConvert(h->Typ(),t),h,&tmp))
4510    {
4511      Free((ADDRESS)copied,l*sizeof(BOOLEAN));
4512      Free((ADDRESS)r,l*sizeof(ideal));
4513      Werror("cannot convert arg. %d to %s",i+1,Tok2Cmdname(t));
4514      return TRUE;
4515    }
4516    else
4517    {
4518      r[i]=(ideal)tmp.Data(); /*now it's a copy*/
4519      copied[i]=TRUE;
4520      h=tmp.next;
4521    }
4522    i++;
4523  }
4524  res->rtyp=t;
4525  res->data=(char *)idMultSect(r,i);
4526  while(i>0)
4527  {
4528    i--;
4529    if (copied[i]) idDelete(&(r[i]));
4530  }
4531  Free((ADDRESS)copied,l*sizeof(BOOLEAN));
4532  Free((ADDRESS)r,l*sizeof(ideal));
4533  return FALSE;
4534}
4535static BOOLEAN jjINTVEC_PL(leftv res, leftv v)
4536{
4537  int i=0;
4538  leftv h=v;
4539  if (h!=NULL) i=exprlist_length(h);
4540  intvec *iv=new intvec(i);
4541  i=0;
4542  while (h!=NULL)
4543  {
4544    if(h->Typ()==INT_CMD)
4545    {
4546      (*iv)[i]=(int)h->Data();
4547    }
4548    else
4549    {
4550      delete iv;
4551      return TRUE;
4552    }
4553    i++;
4554    h=h->next;
4555  }
4556  res->data=(char *)iv;
4557  return FALSE;
4558}
4559static BOOLEAN jjKLAMMER_PL(leftv res, leftv u)
4560{
4561  if ((yyInRingConstruction)
4562  && ((strcmp(u->Name(),"real")==0) || (strcmp(u->Name(),"complex")==0)))
4563  {
4564    memcpy(res,u,sizeof(sleftv));
4565    memset(u,0,sizeof(sleftv));
4566    return FALSE;
4567  }
4568  leftv v=u->next;
4569  BOOLEAN b;
4570  if(v==NULL)
4571    b=iiExprArith1(res,u,iiOp);
4572  else
4573  {
4574    u->next=NULL;
4575    b=iiExprArith2(res,u,iiOp,v);
4576    u->next=v;
4577  }
4578  return b;
4579}
4580static BOOLEAN jjLIST_PL(leftv res, leftv v)
4581{
4582  int sl=0;
4583  if (v!=NULL) sl = v->listLength();
4584  lists L;
4585  if((sl==1)&&(v->Typ()==RESOLUTION_CMD))
4586  {
4587    L=syConvRes((syStrategy)v->Data());
4588  }
4589  else
4590  {
4591    L=(lists)Alloc(sizeof(slists));
4592    leftv h=NULL;
4593    int i;
4594    int rt;
4595
4596    L->Init(sl);
4597    for (i=0;i<sl;i++)
4598    {
4599      if (h!=NULL) { /* e.g. not in the first step:
4600                     * h is the pointer to the old sleftv,
4601                     * v is the pointer to the next sleftv
4602                     * (in this moment) */
4603                     h->next=v;
4604                   }
4605      h=v;
4606      v=v->next;
4607      h->next=NULL;
4608      rt=h->Typ();
4609      if (rt==0)
4610      {
4611        L->Clean();
4612        Werror("`%s` is undefined",h->Fullname());
4613        return TRUE;
4614      }
4615      if ((rt==RING_CMD)||(rt==QRING_CMD))
4616      {
4617        L->m[i].rtyp=rt;
4618        L->m[i].data=h->Data();
4619        ((ring)L->m[i].data)->ref++;
4620      }
4621      else
4622        L->m[i].Copy(h);
4623    }
4624  }
4625  res->data=(char *)L;
4626  return FALSE;
4627}
4628static BOOLEAN jjNAMES0(leftv res, leftv v)
4629{
4630  res->data=(void *)ipNameList(IDROOT);
4631  return FALSE;
4632}
4633static BOOLEAN jjOPTION_PL(leftv res, leftv v)
4634{
4635  if(v==NULL)
4636  {
4637    res->data=(char *)showOption();
4638    return FALSE;
4639  }
4640  res->rtyp=NONE;
4641  return setOption(res,v);
4642}
4643static BOOLEAN jjRESERVED0(leftv res, leftv v)
4644{
4645  int i=1;
4646  loop
4647  {
4648    Print("%-20s",cmds[i].name);
4649    i++;
4650    if(cmds[i].name==NULL)
4651      break;
4652    if ((i%3)==1) PrintLn();
4653  }
4654  PrintLn();
4655  return FALSE;
4656}
4657static BOOLEAN jjSTRING_PL(leftv res, leftv v)
4658{
4659  if (v == NULL)
4660  {
4661    res->data = mstrdup("");
4662    return FALSE;
4663  }
4664  int n = v->listLength();
4665  if (n == 1)
4666  {
4667    res->data = v->String();
4668    return FALSE;
4669  }
4670
4671  char** slist = (char**) Alloc(n*sizeof(char*));
4672  int i, j;
4673
4674  for (i=0, j=0; i<n; i++, v = v ->next)
4675  {
4676    slist[i] = v->String();
4677    assume(slist[i] != NULL);
4678    j+=strlen(slist[i]);
4679  }
4680  char* s = (char*) AllocL((j+1)*sizeof(char));
4681  *s='\0';
4682  for (i=0;i<n;i++)
4683  {
4684    strcat(s, slist[i]);
4685    FreeL(slist[i]);
4686  }
4687  Free(slist, n*sizeof(char*));
4688  res->data = s;
4689  return FALSE;
4690}
4691static BOOLEAN jjTEST(leftv res, leftv v)
4692{
4693  do
4694  {
4695    if (v->Typ()!=INT_CMD)
4696      return TRUE;
4697    test_cmd((int)v->Data());
4698    v=v->next;
4699  }
4700  while (v!=NULL);
4701  return FALSE;
4702}
4703
4704#ifndef __MWERKS__
4705static BOOLEAN jjSTATUS_M(leftv res, leftv v)
4706{
4707  if ((v->Typ() != LINK_CMD) ||
4708      (v->next->Typ() != STRING_CMD) ||
4709      (v->next->next->Typ() != STRING_CMD) ||
4710      (v->next->next->next->Typ() != INT_CMD))
4711    return TRUE;
4712  jjSTATUS3(res, v, v->next, v->next->next);
4713#if defined(HAVE_USLEEP)
4714  if (((int) res->data) == 0)
4715  {
4716    int i_s = (int) v->next->next->next->Data();
4717    if (i_s > 0)
4718    {
4719      usleep((int) v->next->next->next->Data());
4720      jjSTATUS3(res, v, v->next, v->next->next);
4721    }
4722  }
4723#elif defined(HAVE_SLEEP)
4724  if (((int) res->data) == 0)
4725  {
4726    int i_s = (int) v->next->next->next->Data();
4727    if (i_s > 0)
4728    {
4729      sleep((is - 1)/1000000 + 1);
4730      jjSTATUS3(res, v, v->next, v->next->next);
4731    }
4732  }
4733#endif
4734  return FALSE;
4735}
4736#endif
4737static BOOLEAN jjSUBST_M(leftv res, leftv u)
4738{
4739  leftv v = u->next;
4740  leftv w = v->next;
4741  leftv rest = w->next;
4742
4743  u->next = NULL;
4744  v->next = NULL;
4745  w->next = NULL;
4746  BOOLEAN b = iiExprArith3(res, iiOp, u, v, w);
4747  if ((rest!=NULL) && (!b))
4748  {
4749    sleftv tmp_res;
4750    leftv tmp_next=res->next;
4751    res->next=rest;
4752    memset(&tmp_res,0,sizeof(tmp_res));
4753    b = iiExprArithM(&tmp_res,res,iiOp);
4754    memcpy(res,&tmp_res,sizeof(tmp_res));
4755    res->next=tmp_next;
4756  }
4757  u->next = v;
4758  v->next = w;
4759  w->next = rest;
4760  return b;
4761}
4762
4763#ifdef HAVE_NAMESPACES
4764static BOOLEAN jjIMPORTFROM(leftv res, leftv v);
4765
4766static BOOLEAN jjEXPORTTO(leftv res, leftv v)
4767{
4768  BOOLEAN nok=TRUE;
4769  leftv u=v;
4770  if(u->rtyp==NSHDL)
4771  {
4772    namehdl ns = (namehdl)(u->data);
4773    idhdl h = namespaceroot->root->get(ns->name, 0, TRUE);
4774    //Print("Export to '%s', lev %d\n", ns->name, ns->myynest);
4775    while(v->next!=NULL)
4776    {
4777      nok = iiInternalExport(v->next, ns->myynest, h);
4778      if(nok) { return nok; }
4779
4780      v = v->next;
4781    }
4782    return FALSE;
4783  }
4784  if(u->Typ()==PACKAGE_CMD)
4785  {
4786    //PrintS("export to package\n");
4787    while(v->next!=NULL)
4788    {
4789      nok = iiInternalExport(v->next, 0, u->data);
4790      if(nok) return nok;
4791      v = v->next;
4792    }
4793    return FALSE;
4794  }
4795  return TRUE;
4796}
4797#endif /* HAVE_NAMESPACES */
4798#ifdef HAVE_NAMESPACES
4799static BOOLEAN jjIMPORTFROM(leftv res, leftv v)
4800{
4801  BOOLEAN nok=FALSE;
4802  PrintS("jjIMPORT_FROM()\n");
4803  if(v->rtyp==NSHDL)
4804  {
4805    PrintS("Import from toplevel\n");
4806//While-schleife!!!
4807    return FALSE;
4808  }
4809  if(v->Typ()==PACKAGE_CMD)
4810  {
4811    Print("Import from package %s\n", v->name);
4812    while(v->next!=NULL)
4813    {
4814      //nok = iiInternalImport(v->next, 0, v->data);
4815      if(nok) return nok;
4816      v = v->next;
4817    }
4818    return FALSE;
4819  }
4820  return TRUE;
4821}
4822#endif
4823#ifdef HAVE_NAMESPACES
4824static BOOLEAN jjUNLOAD(leftv res, leftv v)
4825{
4826  if(v->Typ()==PACKAGE_CMD)
4827  {
4828    char *typ;
4829    idhdl h = (idhdl)v->data;
4830    package d=(package)v->Data();
4831    switch (d->language)
4832    {
4833      case LANG_C:
4834        typ="object";
4835        break;
4836      case LANG_SINGULAR:
4837      case LANG_NONE:
4838      default:
4839        killhdl(h);
4840    }
4841    return FALSE;
4842  }
4843  return TRUE;
4844}
4845#endif
4846/*=================== operations with many arg.: table =================*/
4847/* number_of_args:  -1: any, -2: any >0, .. */
4848struct sValCmdM dArithM[]=
4849{
4850// operations:
4851// proc         cmd               res            number_of_args
4852 {jjKLAMMER_PL,  '(',           ANY_TYPE,           -2  }
4853,{jjCALL2ARG,  COEF_CMD,        MATRIX_CMD,         2  }
4854,{jjCOEF_M,    COEF_CMD,        NONE,               4  }
4855,{jjDBPRINT,   DBPRINT_CMD,     NONE,               -2 }
4856,{jjCALL1ARG,  IDEAL_CMD,       IDEAL_CMD,          1  }
4857,{jjIDEAL_PL,  IDEAL_CMD,       IDEAL_CMD,          -1 }
4858,{jjCALL2ARG,  INTERSECT_CMD,   IDEAL_CMD,          2  }
4859,{jjINTERSECT_PL,INTERSECT_CMD, IDEAL_CMD,          -2 }
4860,{jjCALL1ARG,  INTVEC_CMD,      INTVEC_CMD,         1  }
4861,{jjINTVEC_PL, INTVEC_CMD,      INTVEC_CMD,         -1 }
4862,{jjLIST_PL,   LIST_CMD,        LIST_CMD,           -1 }
4863,{jjCALL1ARG,  MODUL_CMD,       MODUL_CMD,          1  }
4864,{jjIDEAL_PL,  MODUL_CMD,       MODUL_CMD,          -1 }
4865,{jjCALL1ARG,  NAMES_CMD,       LIST_CMD,            1 }
4866,{jjNAMES0,    NAMES_CMD,       LIST_CMD,            0 }
4867,{jjOPTION_PL, OPTION_CMD,      STRING_CMD/*or set by p*/,-1 }
4868,{jjCALL1ARG,  RESERVEDNAME_CMD, INT_CMD,            1 }
4869,{jjRESERVED0, RESERVEDNAME_CMD, NONE,               0 }
4870,{jjSTRING_PL, STRING_CMD,      STRING_CMD,         -1 }
4871,{jjCALL3ARG,  SUBST_CMD,       NONE/*set by p*/,   3 }
4872,{jjSUBST_M,   SUBST_CMD,       NONE/*set by p*/,   -2 }
4873,{jjSYSTEM,    SYSTEM_CMD,      NONE/*or set by p*/,-2 }
4874,{jjTEST,      TEST_CMD,        NONE,               -2 }
4875,{iiWRITE,     WRITE_CMD,       NONE,               -2 }
4876,{jjCALL2ARG,  STATUS_CMD,      STRING_CMD,          2 }
4877,{jjCALL3ARG,  STATUS_CMD,      INT_CMD,             3 }
4878#ifndef __MWERKS__
4879,{jjSTATUS_M,  STATUS_CMD,      INT_CMD,             4 }
4880#endif
4881#ifdef HAVE_NAMESPACES
4882,{jjIMPORTFROM,IMPORTFROM_CMD,  ANY_TYPE,           -2 }
4883,{jjEXPORTTO,  EXPORTTO_CMD,    NONE,               -2 }
4884,{jjUNLOAD,    UNLOAD_CMD,      NONE,               -2 }
4885#endif /* HAVE_NAMESPACES */
4886,{nuUResSolve, URSOLVE_CMD,     LIST_CMD,            4 }
4887,{NULL,        0,               0,                   0 }
4888};
4889#ifdef MDEBUG
4890static Subexpr jjDBMakeSub(leftv e,char *f, int l)
4891#else
4892static Subexpr jjMakeSub(leftv e)
4893#endif
4894{
4895  // assume: e->Typ()==INT_CMD
4896#ifdef MDEBUG
4897  Subexpr r=(Subexpr)mmDBAllocBlock0(sizeof(*r),f,l);
4898#else
4899  Subexpr r=(Subexpr)Alloc0(sizeof(*r));
4900#endif
4901  r->start =(int)e->Data();
4902  return r;
4903}
4904
4905/*================ generating tables ============================*/
4906#ifdef GENTABLE
4907extern struct sValAssign dAssign[];
4908struct sValCmdTab dArithTab1[]={ {0,0}};
4909#define JJTAB1LEN 0
4910struct sValCmdTab dArithTab2[]={ {0,0}};
4911#define JJTAB2LEN 0
4912void ttGen1()
4913{
4914  FILE *outfile = myfopen("iparith.inc","w");
4915  int i,j,l1=0,l2=0;
4916  currRing=(ring)Alloc(sizeof(*currRing));
4917  fprintf(outfile,
4918  "/****************************************\n"
4919  "*  Computer Algebra System SINGULAR     *\n"
4920  "****************************************/\n\n");
4921/*-------------------------------------------------------------------*/
4922  fprintf(outfile,"// syntax table for Singular\n//\n");
4923  fprintf(outfile,"// - search for an exact match of the argument types\n");
4924  fprintf(outfile,"// - otherwise search for the first possibility\n");
4925  fprintf(outfile,"//   with converted types of the arguments\n");
4926  fprintf(outfile,"// - otherwise report an error\n//\n");
4927
4928  int op;
4929  i=0;
4930  while ((op=dArith1[i].cmd)!=0)
4931  {
4932    if (dArith1[i].p==jjWRONG)
4933      fprintf(outfile,"// DUMMY ");
4934    char *s = iiTwoOps(op);
4935    fprintf(outfile,"// operation: %s (%s)  ->  %s\n",
4936          s,
4937          Tok2Cmdname(dArith1[i].arg),
4938          Tok2Cmdname(ABS(dArith1[i].res)));
4939    i++;
4940  }
4941  fprintf(outfile,"/*---------------------------------------------*/\n");
4942  i=0;
4943  while ((op=dArith2[i].cmd)!=0)
4944  {
4945    if (dArith2[i].p==jjWRONG2)
4946      fprintf(outfile,"// DUMMY ");
4947    char *s = iiTwoOps(op);
4948    fprintf(outfile,"// operation: %s (%s, %s)  ->  %s\n",
4949          s,
4950          Tok2Cmdname(dArith2[i].arg1),
4951          Tok2Cmdname(dArith2[i].arg2),
4952          Tok2Cmdname(dArith2[i].res));
4953    i++;
4954  }
4955  fprintf(outfile,"/*---------------------------------------------*/\n");
4956  i=0;
4957  while ((op=dArith3[i].cmd)!=0)
4958  {
4959    char *s = iiTwoOps(op);
4960    if (dArith3[i].p==jjWRONG3)
4961      fprintf(outfile,"// DUMMY ");
4962    fprintf(outfile,"// operation: %s (%s, %s, %s)  ->  %s\n",
4963          s,
4964          Tok2Cmdname(dArith3[i].arg1),
4965          Tok2Cmdname(dArith3[i].arg2),
4966          Tok2Cmdname(dArith3[i].arg3),
4967          Tok2Cmdname(dArith3[i].res));
4968    i++;
4969  }
4970  fprintf(outfile,"/*---------------------------------------------*/\n");
4971  i=0;
4972  while ((op=dArithM[i].cmd)!=0)
4973  {
4974    char *s = iiTwoOps(op);
4975    fprintf(outfile,"// operation: %s (...)  ->  %s",
4976          s,
4977          Tok2Cmdname(dArithM[i].res));
4978    switch(dArithM[i].number_of_args)
4979    {
4980      case -2:
4981         fprintf(outfile," ( number of arguments >0 )\n");
4982         break;
4983      case -1:
4984         fprintf(outfile," ( any number of arguments )\n");
4985         break;
4986      default:
4987         fprintf(outfile," ( %d arguments )\n",dArithM[i].number_of_args);
4988         break;
4989    }
4990    i++;
4991  }
4992  fprintf(outfile,"/*---------------------------------------------*/\n");
4993  i=0;
4994  while ((op=dAssign[i].res)!=0)
4995  {
4996    fprintf(outfile,"// assign: %s =  %s\n",
4997          Tok2Cmdname(op/*dAssign[i].res*/),
4998          Tok2Cmdname(dAssign[i].arg));
4999    i++;
5000  }
5001/*-------------------------------------------------------------------*/
5002  fprintf(outfile,"/*---------------------------------------------*/\n");
5003  for (j=257;j<=MAX_TOK+1;j++)
5004  {
5005    for(i=257;i<=MAX_TOK+1;i++)
5006    {
5007      if ((i!=j) && (j!=IDHDL) && (j!=DEF_CMD) && (j!=ANY_TYPE)
5008      && iiTestConvert(i,j))
5009      {
5010        fprintf(outfile,"// convert %s -> %s\n",
5011          Tok2Cmdname(i), Tok2Cmdname(j));
5012        if (j==ANY_TYPE) break;
5013      }
5014    }
5015  }
5016  fprintf(outfile,"/*---------------------------------------------*/\n");
5017  char ops[]="=><+*/[.^,%(;";
5018  for(i=0;ops[i]!='\0';i++)
5019    fprintf(outfile,"// token %d : %c\n", (int)ops[i], ops[i]);
5020  for (i=257;i<=MAX_TOK;i++)
5021  {
5022    char *s=iiTwoOps(i);
5023    if (s[0]!='$')
5024    {
5025      fprintf(outfile,"// token %d : %s\n", i, s);
5026    }
5027  }
5028/*-------------------------------------------------------------------*/
5029  fprintf(outfile,"/*--max. token: %d, gr: %d --*/\n",MAX_TOK,UMINUS);
5030/*-------------------------------------------------------------------*/
5031  fprintf(outfile,"/*---------------------------------------------*/\n");
5032  fprintf(outfile,
5033  "struct sValCmdTab dArithTab1[]=\n"
5034  "{\n");
5035  for (j=1;j<=MAX_TOK+1;j++)
5036  {
5037    for(i=0;dArith1[i].cmd!=0;i++)
5038    {
5039      if (dArith1[i].cmd==j)
5040      {
5041        fprintf(outfile," { %d,%d },\n",j,i);
5042        l1++;
5043        break;
5044      }
5045    }
5046  }
5047  fprintf(outfile," { 10000,0 }\n};\n");
5048  fprintf(outfile,"#define JJTAB1LEN %d\n",l1);
5049/*-------------------------------------------------------------------*/
5050  fprintf(outfile,
5051  "struct sValCmdTab dArithTab2[]=\n"
5052  "{\n");
5053  for (j=1;j<=MAX_TOK+1;j++)
5054  {
5055    for(i=0;dArith2[i].cmd!=0;i++)
5056    {
5057      if (dArith2[i].cmd==j)
5058      {
5059        fprintf(outfile," { %d,%d },\n",j,i);
5060        l2++;
5061        break;
5062      }
5063    }
5064  }
5065  fprintf(outfile," { 10000,0 }\n};\n");
5066  fprintf(outfile,"#define JJTAB2LEN %d\n",l2);
5067  fclose(outfile);
5068}
5069/*-------------------------------------------------------------------*/
5070void ttGen2()
5071{
5072  FILE *outfile = myfopen("iparith.inc","a");
5073  fprintf(outfile,
5074  "/****************************************\n"
5075  "*  Computer Algebra System SINGULAR     *\n"
5076  "****************************************/\n\n");
5077/*-------------------------------------------------------------------*/
5078  fprintf(outfile,"// identifier table for Singular\n//\n");
5079
5080  fprintf(outfile,
5081  "cmdnames cmds[] =\n"
5082  "{  // name-string     alias  tokval toktype\n"
5083  "{ \"$INVALID$\",            0,  -1, 0},\n");
5084  int i=1;
5085  int m=-1;
5086  int id_nr=0;
5087  BOOLEAN f=FALSE;
5088  loop
5089  {
5090    while (cmds[i].tokval!=0)
5091    {
5092      if ((cmds[i].tokval!=-1)&&(cmds[i].name!=NULL))
5093      {
5094        if(m==-1)
5095        {
5096          m=i;
5097          f=TRUE;
5098        }
5099        else if(strcmp(cmds[m].name,cmds[i].name)>0)
5100        {
5101          m=i;
5102          f=TRUE;
5103        }
5104      }
5105      i++;
5106    }
5107    if(f)
5108    {
5109      id_nr++;
5110      if(cmds[m].tokval==VRTIMER) fprintf(outfile,"#ifdef HAVE_RTIMER\n");
5111      fprintf(outfile,"  {\"%s\", %*d, %3d, ",cmds[m].name,
5112                                             20-strlen(cmds[m].name),
5113                                             cmds[m].alias,
5114                                             cmds[m].tokval);
5115      switch(cmds[m].toktype)
5116      {
5117        case CMD_1:            fprintf(outfile,"CMD_1 },\n"); break;
5118        case CMD_2:            fprintf(outfile,"CMD_2 },\n"); break;
5119        case CMD_3:            fprintf(outfile,"CMD_3 },\n"); break;
5120        case CMD_12:           fprintf(outfile,"CMD_12 },\n"); break;
5121        case CMD_123 :         fprintf(outfile,"CMD_123 },\n"); break;
5122        case CMD_23:           fprintf(outfile,"CMD_23 },\n"); break;
5123        case CMD_M:            fprintf(outfile,"CMD_M },\n"); break;
5124        case SYSVAR:           fprintf(outfile,"SYSVAR },\n"); break;
5125        case ROOT_DECL:        fprintf(outfile,"ROOT_DECL },\n"); break;
5126        case ROOT_DECL_LIST:   fprintf(outfile,"ROOT_DECL_LIST },\n"); break;
5127        case RING_DECL:        fprintf(outfile,"RING_DECL },\n"); break;
5128        case NONE:             fprintf(outfile,"NONE },\n"); break;
5129        default:               if((cmds[m].toktype>' ')
5130                               &&(cmds[m].toktype<127))
5131                               {
5132                                 fprintf(outfile,"'%c' },\n",cmds[m].toktype);
5133                               }
5134                               else
5135                               {
5136                                 fprintf(outfile,"%d },\n",cmds[m].toktype);
5137                               }
5138                               break;
5139      }
5140      if(cmds[m].tokval==VRTIMER) fprintf(outfile,"#endif\n");
5141      cmds[m].name=NULL;
5142      m=-1;
5143      i=1;
5144      f=FALSE;
5145    }
5146    else break;
5147  }
5148  fprintf(outfile,
5149"/* list of scanner identifiers/only for feread/reservedName */\n");
5150  f=FALSE;
5151  i=1;m=-1;
5152  loop
5153  {
5154    while (cmds[i].tokval!=0)
5155    {
5156      if (cmds[i].name!=NULL)
5157      {
5158        if(m==-1)
5159        {
5160          m=i;
5161          f=TRUE;
5162        }
5163        else if(strcmp(cmds[m].name,cmds[i].name)>0)
5164        {
5165          m=i;
5166          f=TRUE;
5167        }
5168      }
5169      i++;
5170    }
5171    if(f)
5172    {
5173      fprintf(outfile,"  {\"%s\", %*d,  -1, 0 },\n",cmds[m].name,
5174                                             20-strlen(cmds[m].name),
5175                                             0/*cmds[m].alias*/
5176                                             /*-1 cmds[m].tokval*/
5177                                             /*0 cmds[m].toktype*/);
5178      cmds[m].name=NULL;
5179      m=-1;
5180      i=1;
5181      f=FALSE;
5182    }
5183    else break;
5184  }
5185  fprintf(outfile,
5186"/* end of list marker */\n"
5187"  { NULL, 0, 0, 0}\n"
5188"};\n"
5189"#ifdef HAVE_RTIMER\n"
5190"#define LAST_IDENTIFIER %d\n"
5191"#else\n"
5192"#define LAST_IDENTIFIER %d\n"
5193"#endif\n",id_nr,id_nr-1);
5194  fclose(outfile);
5195}
5196/*-------------------------------------------------------------------*/
5197#if 0
5198void ttGen3()
5199{
5200  FILE *outfile = myfopen("mpsr_tok.inc","w");
5201  fprintf(outfile,
5202  "/****************************************\n"
5203  "*  Computer Algebra System SINGULAR     *\n"
5204  "****************************************/\n\n");
5205/*-------------------------------------------------------------------*/
5206  fprintf(outfile,"// token table for Singular\n//\n");
5207
5208  fprintf(outfile,
5209  "short vtok[] =\n"
5210  "{\n");
5211  // operations with 1 arg: ===========================================
5212  int i=0;
5213  while (dArith1[i].cmd!=0)
5214  {
5215    if ((dArith1[i].p!=jjWRONG)
5216    &&((i==0)||(dArith1[i].cmd!=dArith1[i-1].cmd)))
5217    {
5218      fprintf(outfile,"  %d,\n",dArith1[i].cmd);
5219    }
5220    i++;
5221  }
5222  // operations with 2 args: ===========================================
5223  i=0;
5224  while (dArith2[i].cmd!=0)
5225  {
5226    if ((dArith2[i].p!=jjWRONG2)
5227    &&((i==0)||(dArith2[i].cmd!=dArith2[i-1].cmd)))
5228    {
5229      fprintf(outfile,"  %d,\n",dArith2[i].cmd);
5230    }
5231    i++;
5232  }
5233  // operations with 3 args: ===========================================
5234  i=0;
5235  while (dArith3[i].cmd!=0)
5236  {
5237    if (
5238    ((i==0)||(dArith3[i].cmd!=dArith3[i-1].cmd)))
5239    {
5240      fprintf(outfile,"  %d,\n",dArith3[i].cmd);
5241    }
5242    i++;
5243  }
5244  // operations with many args: ===========================================
5245  i=0;
5246  while (dArithM[i].cmd!=0)
5247  {
5248    if (
5249    ((i==0)||(dArithM[i].cmd!=dArithM[i-1].cmd)))
5250    {
5251      fprintf(outfile,"  %d,\n",dArithM[i].cmd);
5252    }
5253    i++;
5254  }
5255  // ====================================================================
5256  fprintf(outfile,
5257  "/* end of list marker */\n"
5258  " %d };\n",MAX_TOK);
5259  fclose(outfile);
5260}
5261#endif
5262/*-------------------------------------------------------------------*/
5263#else
5264#include "iparith.inc"
5265#endif
5266
5267/*=================== operations with 2 args. ============================*/
5268
5269BOOLEAN iiExprArith2(leftv res, leftv a, int op, leftv b, BOOLEAN proccall)
5270{
5271#ifndef GENTABLE
5272  memset(res,0,sizeof(sleftv));
5273
5274  if (!errorreported)
5275  {
5276#ifdef SIQ
5277    if (siq>0)
5278    {
5279      //Print("siq:%d\n",siq);
5280      command d=(command)Alloc0(sizeof(ip_command));
5281      memcpy(&d->arg1,a,sizeof(sleftv));
5282      memcpy(&d->arg2,b,sizeof(sleftv));
5283      d->argc=2;
5284      d->op=op;
5285      res->data=(char *)d;
5286      res->rtyp=COMMAND;
5287      return FALSE;
5288    }
5289#endif
5290    int at=a->Typ();
5291    int bt=b->Typ();
5292    int i=iiTabIndex(dArithTab2,JJTAB2LEN,op);
5293    int index=i;
5294
5295    iiOp=op;
5296    while (dArith2[i].cmd==op)
5297    {
5298      if ((at==dArith2[i].arg1)
5299      && (bt==dArith2[i].arg2))
5300      {
5301        res->rtyp=dArith2[i].res;
5302        if (dArith2[i].p(res,a,b))
5303        {
5304          break;// leave loop, goto error handling
5305        }
5306        a->CleanUp();
5307        b->CleanUp();
5308        //Print("op: %d,result typ:%d\n",op,res->rtyp);
5309        return FALSE;
5310      }
5311      i++;
5312    }
5313    // implicite type conversion ----------------------------------------------
5314    if (dArith2[i].cmd!=op)
5315    {
5316      int ai,bi;
5317      leftv an = (leftv)Alloc0(sizeof(sleftv));
5318      leftv bn = (leftv)Alloc0(sizeof(sleftv));
5319      BOOLEAN failed=FALSE;
5320      i=index; /*iiTabIndex(dArithTab2,JJTAB2LEN,op);*/
5321      //Print("op: %c, type: %s %s\n",op,Tok2Cmdname(at),Tok2Cmdname(bt));
5322      while (dArith2[i].cmd==op)
5323      {
5324        //Print("test %s %s\n",Tok2Cmdname(dArith2[i].arg1),Tok2Cmdname(dArith2[i].arg2));
5325        if ((ai=iiTestConvert(at,dArith2[i].arg1))!=0)
5326        {
5327          if ((bi=iiTestConvert(bt,dArith2[i].arg2))!=0)
5328          {
5329            res->rtyp=dArith2[i].res;
5330            failed= ((iiConvert(at,dArith2[i].arg1,ai,a,an))
5331            || (iiConvert(bt,dArith2[i].arg2,bi,b,bn))
5332            || (dArith2[i].p(res,an,bn)));
5333            // everything done, clean up temp. variables
5334            if (failed)
5335            {
5336              // leave loop, goto error handling
5337              break;
5338            }
5339            else
5340            {
5341              // everything ok, clean up and return
5342              an->CleanUp();
5343              bn->CleanUp();
5344              Free((ADDRESS)an,sizeof(sleftv));
5345              Free((ADDRESS)bn,sizeof(sleftv));
5346              a->CleanUp();
5347              b->CleanUp();
5348              return FALSE;
5349            }
5350          }
5351        }
5352        i++;
5353      }
5354      an->CleanUp();
5355      bn->CleanUp();
5356      Free((ADDRESS)an,sizeof(sleftv));
5357      Free((ADDRESS)bn,sizeof(sleftv));
5358    }
5359    // error handling ---------------------------------------------------
5360    const char *s=NULL;
5361    if (!errorreported)
5362    {
5363      if ((at==0) && (a->Fullname()!=sNoName))
5364      {
5365        s=a->Fullname();
5366      }
5367      else if ((bt==0) && (b->Fullname()!=sNoName))
5368      {
5369        s=b->Fullname();
5370      }
5371      if (s!=NULL)
5372        Werror("`%s` is not defined",s);
5373      else
5374      {
5375        i=index; /*iiTabIndex(dArithTab2,JJTAB2LEN,op);*/
5376        s = iiTwoOps(op);
5377        if (proccall)
5378        {
5379          Werror("%s(`%s`,`%s`) is not supported"
5380                ,s,Tok2Cmdname(at),Tok2Cmdname(bt));
5381        }
5382        else
5383        {
5384          Werror("`%s` %s `%s` is not supported"
5385                ,Tok2Cmdname(at),s,Tok2Cmdname(bt));
5386        }
5387        if (BVERBOSE(V_SHOW_USE))
5388        {
5389          while (dArith2[i].cmd==op)
5390          {
5391            if(((at==dArith2[i].arg1)||(bt==dArith2[i].arg2))
5392            && (dArith2[i].res!=0)
5393            && (dArith2[i].p!=jjWRONG2))
5394            {
5395              if (proccall)
5396                Werror("expected %s(`%s`,`%s`)"
5397                  ,s,Tok2Cmdname(dArith2[i].arg1),Tok2Cmdname(dArith2[i].arg2));
5398              else
5399                Werror("expected `%s` %s `%s`"
5400                  ,Tok2Cmdname(dArith2[i].arg1),s,Tok2Cmdname(dArith2[i].arg2));
5401            }
5402            i++;
5403          }
5404        }
5405      }
5406    }
5407    res->rtyp = UNKNOWN;
5408  }
5409  a->CleanUp();
5410  b->CleanUp();
5411#endif
5412  return TRUE;
5413}
5414
5415/*==================== operations with 1 arg. ===============================*/
5416
5417BOOLEAN iiExprArith1(leftv res, leftv a, int op)
5418{
5419#ifndef GENTABLE
5420  memset(res,0,sizeof(sleftv));
5421
5422  if (!errorreported)
5423  {
5424#ifdef SIQ
5425    if (siq>0)
5426    {
5427      //Print("siq:%d\n",siq);
5428      command d=(command)Alloc0(sizeof(ip_command));
5429      memcpy(&d->arg1,a,sizeof(sleftv));
5430      d->op=op;
5431      d->argc=1;
5432      res->data=(char *)d;
5433      res->rtyp=COMMAND;
5434      return FALSE;
5435    }
5436#endif
5437    int at=a->Typ();
5438    BOOLEAN failed=FALSE;
5439
5440    iiOp=op;
5441    int i=iiTabIndex(dArithTab1,JJTAB1LEN,op);
5442    int ti = i;
5443    while (dArith1[i].cmd==op)
5444    {
5445      if (at==dArith1[i].arg)
5446      {
5447        res->rtyp=dArith1[i].res;
5448        if (dArith1[i].res<0)
5449        {
5450          res->rtyp=-res->rtyp;
5451          #ifdef PROC_BUG
5452          dArith1[i].p(res,a);
5453          #else
5454          res->data=(char *)((Proc1)dArith1[i].p)((char *)a->Data());
5455          #endif
5456        }
5457        else if (dArith1[i].p(res,a))
5458        {
5459          break;// leave loop, goto error handling
5460        }
5461        if (a->Next()!=NULL)
5462        {
5463          res->next=(leftv)Alloc(sizeof(sleftv));
5464          failed=iiExprArith1(res->next,a->next,op);
5465        }
5466        a->CleanUp();
5467        return failed;
5468      }
5469      i++;
5470    }
5471    // implicite type conversion --------------------------------------------
5472    if (dArith1[i].cmd!=op)
5473    {
5474      int ai;
5475      leftv an = (leftv)Alloc0(sizeof(sleftv));
5476      i=ti;
5477      //Print("fuer %c , typ: %s\n",op,Tok2Cmdname(at));
5478      while (dArith1[i].cmd==op)
5479      {
5480        //Print("test %s\n",Tok2Cmdname(dArith1[i].arg));
5481        if ((ai=iiTestConvert(at,dArith1[i].arg))!=0)
5482        {
5483          res->rtyp=dArith1[i].res;
5484          if (dArith1[i].res<0)
5485          {
5486            res->rtyp=-res->rtyp;
5487            failed= iiConvert(at,dArith1[i].arg,ai,a,an);
5488            if (!failed)
5489            {
5490              #ifdef PROC_BUG
5491              dArith1[i].p(res,a);
5492              #else
5493              res->data=(char *)((Proc1)dArith1[i].p)((char *)an->Data());
5494              #endif
5495            }
5496          }
5497          else
5498          {
5499            failed= ((iiConvert(at,dArith1[i].arg,ai,a,an))
5500            || (dArith1[i].p(res,an)));
5501          }
5502          // everything done, clean up temp. variables
5503          if (failed)
5504          {
5505            // leave loop, goto error handling
5506            break;
5507          }
5508          else
5509          {
5510            if (an->Next() != NULL)
5511            {
5512              res->next = (leftv)Alloc(sizeof(sleftv));
5513              failed=iiExprArith1(res->next,an->next,op);
5514            }
5515            // everything ok, clean up and return
5516            an->CleanUp();
5517            Free((ADDRESS)an,sizeof(sleftv));
5518            a->CleanUp();
5519            return failed;
5520          }
5521        }
5522        i++;
5523      }
5524      an->CleanUp();
5525      Free((ADDRESS)an,sizeof(sleftv));
5526    }
5527    // error handling
5528    if (!errorreported)
5529    {
5530      if ((at==0) && (a->Fullname()!=sNoName))
5531      {
5532        Werror("`%s` is not defined",a->Fullname());
5533      }
5534      else
5535      {
5536        i=ti;
5537        char *s = iiTwoOps(op);
5538        Werror("%s(`%s`) is not supported"
5539                ,s,Tok2Cmdname(at));
5540        if (BVERBOSE(V_SHOW_USE))
5541        {
5542          while (dArith1[i].cmd==op)
5543          {
5544            if ((dArith1[i].res!=0)
5545            && (dArith1[i].p!=jjWRONG))
5546              Werror("expected %s(`%s`)"
5547                ,s,Tok2Cmdname(dArith1[i].arg));
5548            i++;
5549          }
5550        }
5551      }
5552    }
5553    res->rtyp = UNKNOWN;
5554  }
5555  a->CleanUp();
5556#endif
5557  return TRUE;
5558}
5559
5560/*=================== operations with 3 args. ============================*/
5561
5562BOOLEAN iiExprArith3(leftv res, int op, leftv a, leftv b, leftv c)
5563{
5564#ifndef GENTABLE
5565  memset(res,0,sizeof(sleftv));
5566
5567  if (!errorreported)
5568  {
5569#ifdef SIQ
5570    if (siq>0)
5571    {
5572      //Print("siq:%d\n",siq);
5573      command d=(command)Alloc0(sizeof(ip_command));
5574      memcpy(&d->arg1,a,sizeof(sleftv));
5575      memcpy(&d->arg2,b,sizeof(sleftv));
5576      memcpy(&d->arg3,c,sizeof(sleftv));
5577      d->op=op;
5578      d->argc=3;
5579      res->data=(char *)d;
5580      res->rtyp=COMMAND;
5581      return FALSE;
5582    }
5583#endif
5584    int at=a->Typ();
5585    int bt=b->Typ();
5586    int ct=c->Typ();
5587
5588    iiOp=op;
5589    int i=0;
5590    while ((dArith3[i].cmd!=op)&&(dArith3[i].cmd!=0)) i++;
5591    while (dArith3[i].cmd==op)
5592    {
5593      if ((at==dArith3[i].arg1)
5594      && (bt==dArith3[i].arg2)
5595      && (ct==dArith3[i].arg3))
5596      {
5597        res->rtyp=dArith3[i].res;
5598        if (dArith3[i].p(res,a,b,c))
5599        {
5600          break;// leave loop, goto error handling
5601        }
5602        a->CleanUp();
5603        b->CleanUp();
5604        c->CleanUp();
5605        return FALSE;
5606      }
5607      i++;
5608    }
5609    // implicite type conversion ----------------------------------------------
5610    if (dArith3[i].cmd!=op)
5611    {
5612      int ai,bi,ci;
5613      leftv an = (leftv)Alloc0(sizeof(sleftv));
5614      leftv bn = (leftv)Alloc0(sizeof(sleftv));
5615      leftv cn = (leftv)Alloc0(sizeof(sleftv));
5616      BOOLEAN failed=FALSE;
5617      i=0;
5618      while ((dArith3[i].cmd!=op)&&(dArith3[i].cmd!=0)) i++;
5619      while (dArith3[i].cmd==op)
5620      {
5621        if ((ai=iiTestConvert(at,dArith3[i].arg1))!=0)
5622        {
5623          if ((bi=iiTestConvert(bt,dArith3[i].arg2))!=0)
5624          {
5625            if ((ci=iiTestConvert(ct,dArith3[i].arg3))!=0)
5626            {
5627              res->rtyp=dArith3[i].res;
5628              failed= ((iiConvert(at,dArith3[i].arg1,ai,a,an))
5629                || (iiConvert(bt,dArith3[i].arg2,bi,b,bn))
5630                || (iiConvert(ct,dArith3[i].arg3,ci,c,cn))
5631                || (dArith3[i].p(res,an,bn,cn)));
5632              // everything done, clean up temp. variables
5633              if (failed)
5634              {
5635                // leave loop, goto error handling
5636                break;
5637              }
5638              else
5639              {
5640                // everything ok, clean up and return
5641                an->CleanUp();
5642                bn->CleanUp();
5643                cn->CleanUp();
5644                Free((ADDRESS)an,sizeof(sleftv));
5645                Free((ADDRESS)bn,sizeof(sleftv));
5646                Free((ADDRESS)cn,sizeof(sleftv));
5647                a->CleanUp();
5648                b->CleanUp();
5649                c->CleanUp();
5650        //Print("op: %d,result typ:%d\n",op,res->rtyp);
5651                return FALSE;
5652              }
5653            }
5654          }
5655        }
5656        i++;
5657      }
5658      an->CleanUp();
5659      bn->CleanUp();
5660      cn->CleanUp();
5661      Free((ADDRESS)an,sizeof(sleftv));
5662      Free((ADDRESS)bn,sizeof(sleftv));
5663      Free((ADDRESS)cn,sizeof(sleftv));
5664    }
5665    // error handling ---------------------------------------------------
5666    if (!errorreported)
5667    {
5668      const char *s=NULL;
5669      if ((at==0) && (a->Fullname()!=sNoName))
5670      {
5671        s=a->Fullname();
5672      }
5673      else if ((bt==0) && (b->Fullname()!=sNoName))
5674      {
5675        s=b->Fullname();
5676      }
5677      else if ((ct==0) && (c->Fullname()!=sNoName))
5678      {
5679        s=c->Fullname();
5680      }
5681      if (s!=NULL)
5682        Werror("`%s` is not defined",s);
5683      else
5684      {
5685        i=0;
5686        while ((dArith3[i].cmd!=op)&&(dArith3[i].cmd!=0)) i++;
5687        char *s = iiTwoOps(op);
5688        Werror("%s(`%s`,`%s`,`%s`) is not supported"
5689                ,s,Tok2Cmdname(at),Tok2Cmdname(bt),Tok2Cmdname(ct));
5690        if (BVERBOSE(V_SHOW_USE))
5691        {
5692          while (dArith3[i].cmd==op)
5693          {
5694            if(((at==dArith3[i].arg1)
5695            ||(bt==dArith3[i].arg2)
5696            ||(ct==dArith3[i].arg3))
5697            && (dArith3[i].res!=0))
5698            {
5699              Werror("expected %s(`%s`,`%s`,`%s`)"
5700                  ,s,Tok2Cmdname(dArith3[i].arg1)
5701                  ,Tok2Cmdname(dArith3[i].arg2)
5702                  ,Tok2Cmdname(dArith3[i].arg3));
5703            }
5704            i++;
5705          }
5706        }
5707      }
5708    }
5709    res->rtyp = UNKNOWN;
5710  }
5711  a->CleanUp();
5712  b->CleanUp();
5713  c->CleanUp();
5714        //Print("op: %d,result typ:%d\n",op,res->rtyp);
5715#endif
5716  return TRUE;
5717}
5718/*==================== operations with many arg. ===============================*/
5719
5720BOOLEAN jjANY2LIST(leftv res, leftv v, int cnt)
5721{
5722  // cnt = 0: all
5723  // cnt = 1: only first one
5724  leftv next;
5725  BOOLEAN failed = TRUE;
5726  if(v==NULL) return failed;
5727  res->rtyp = LIST_CMD;
5728  if(cnt) v->next = NULL;
5729  next = v->next;             // saving next-pointer
5730  failed = jjLIST_PL(res, v);
5731  v->next = next;             // writeback next-pointer
5732  return failed;
5733}
5734
5735BOOLEAN iiExprArithM(leftv res, leftv a, int op)
5736{
5737#ifndef GENTABLE
5738  memset(res,0,sizeof(sleftv));
5739
5740  if (!errorreported)
5741  {
5742#ifdef SIQ
5743    if (siq>0)
5744    {
5745      //Print("siq:%d\n",siq);
5746      command d=(command)Alloc0(sizeof(ip_command));
5747      d->op=op;
5748      res->data=(char *)d;
5749      if (a!=NULL)
5750      {
5751        d->argc=a->listLength();
5752        // else : d->argc=0;
5753        memcpy(&d->arg1,a,sizeof(sleftv));
5754        switch(d->argc)
5755        {
5756          case 3:
5757            memcpy(&d->arg3,a->next->next,sizeof(sleftv));
5758            a->next->next->rtyp=0;
5759            a->next->next->data=NULL;
5760            a->next->next->name=NULL;
5761            a->next->next->attribute=NULL;
5762          case 2:
5763            memcpy(&d->arg2,a->next,sizeof(sleftv));
5764            a->next->rtyp=0;
5765            a->next->name=NULL;
5766            a->next->data=NULL;
5767            a->next->attribute=NULL;
5768            d->arg2.next=NULL;
5769          case 1:
5770            d->arg1.next=NULL;
5771        }
5772        if (d->argc>3) a->next=NULL;
5773        a->rtyp=0;
5774        a->data=NULL;
5775        a->name=NULL;
5776        a->CleanUp();
5777      }
5778      res->rtyp=COMMAND;
5779      return FALSE;
5780    }
5781#endif
5782    BOOLEAN failed=FALSE;
5783    int args=0;
5784    if (a!=NULL) args=a->listLength();
5785
5786    iiOp=op;
5787    int i=0;
5788    while ((dArithM[i].cmd!=op)&&(dArithM[i].cmd!=0)) i++;
5789    int ii=i;
5790    while (dArithM[i].cmd==op)
5791    {
5792      if ((args==dArithM[i].number_of_args)
5793      || (dArithM[i].number_of_args==-1)
5794      || ((dArithM[i].number_of_args==-2)&&(args>0)))
5795      {
5796        res->rtyp=dArithM[i].res;
5797        if (dArithM[i].p(res,a))
5798        {
5799          break;// leave loop, goto error handling
5800        }
5801        if (a!=NULL) a->CleanUp();
5802        //Print("op: %d,result typ:%d\n",op,res->rtyp);
5803        return failed;
5804      }
5805      i++;
5806    }
5807    // error handling
5808    if (!errorreported)
5809    {
5810      if ((args>0) && (a->rtyp==0) && (a->Name()!=sNoName))
5811      {
5812        Werror("`%s` is not defined",a->Fullname());
5813      }
5814      else
5815      {
5816        char *s = iiTwoOps(op);
5817        Werror("%s(...) is not supported",s);
5818      }
5819    }
5820    res->rtyp = UNKNOWN;
5821  }
5822  if (a!=NULL) a->CleanUp();
5823        //Print("op: %d,result typ:%d\n",op,res->rtyp);
5824#endif
5825  return TRUE;
5826}
5827
5828/*=================== general utilities ============================*/
5829int IsCmd(char *n, int & tok)
5830{
5831  int an=1;
5832  int i,v;
5833#ifndef GENTABLE
5834  int en=LAST_IDENTIFIER;
5835
5836  loop
5837  {
5838    if(an>=en-1)
5839    {
5840      if (strcmp(n, cmds[an].name) == 0)
5841      {
5842        i=an;
5843        break;
5844      }
5845      else if ((an!=en) && (strcmp(n, cmds[en].name) == 0))
5846      {
5847        i=en;
5848        break;
5849      }
5850      else
5851      {
5852        return 0;
5853      }
5854    }
5855    i=(an+en)/2;
5856    if (*n < *(cmds[i].name))
5857    {
5858      en=i-1;
5859    }
5860    else if (*n > *(cmds[i].name))
5861    {
5862      an=i+1;
5863    }
5864    else
5865    {
5866      v=strcmp(n,cmds[i].name);
5867      if(v<0)
5868      {
5869        en=i-1;
5870      }
5871      else if(v>0)
5872      {
5873        an=i+1;
5874      }
5875      else /*v==0*/
5876      {
5877        break;
5878      }
5879    }
5880  }
5881  lastreserved=cmds[i].name;
5882  tok=cmds[i].tokval;
5883  if(cmds[i].alias==2)
5884  {
5885    Warn("outdated identifier `%s` used - please change your code",
5886    cmds[i].name);
5887    cmds[i].alias=1;
5888  }
5889  if (currRingHdl==NULL)
5890  {
5891    #ifdef SIQ
5892    if (siq<=0)
5893    {
5894    #endif
5895      if ((tok>=BEGIN_RING) && (tok<=END_RING))
5896      {
5897        WerrorS("no ring active");
5898        return 0;
5899      }
5900    #ifdef SIQ
5901    }
5902    #endif
5903  }
5904  if (!expected_parms)
5905  {
5906    switch (tok)
5907    {
5908      case IDEAL_CMD:
5909      case INT_CMD:
5910      case INTVEC_CMD:
5911      case MAP_CMD:
5912      case MATRIX_CMD:
5913      case MODUL_CMD:
5914      case POLY_CMD:
5915      case PROC_CMD:
5916      case RING_CMD:
5917      case STRING_CMD:
5918        cmdtok = tok;
5919        break;
5920    }
5921  }
5922#endif
5923  return cmds[i].toktype;
5924}
5925static int iiTabIndex(const jjValCmdTab dArithTab, const int len, const int op)
5926{
5927#ifndef GENTABLE
5928  int a=0;
5929  int e=len;
5930  int p=len/2;
5931  do
5932  {
5933     if (op==dArithTab[p].cmd) return dArithTab[p].start;
5934     if (op<dArithTab[p].cmd) e=p-1;
5935     else   a = p+1;
5936     p=a+(e-a)/2;
5937  }
5938  while ( a <= e);
5939
5940#endif
5941  assume(0);
5942  return 0;
5943}
5944
Note: See TracBrowser for help on using the repository browser.