source: git/Singular/iparith.cc @ b11128

fieker-DuValspielwiese
Last change on this file since b11128 was b11128, checked in by Hans Schönemann <hannes@…>, 16 years ago
*hannes: gen(<=0) message git-svn-id: file:///usr/local/Singular/svn/trunk@10511 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 246.1 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: iparith.cc,v 1.464 2008-01-21 11:19:52 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 "omalloc.h"
22#include "polys.h"
23#include "febase.h"
24#include "sdb.h"
25#include "longalg.h"
26#include "ideals.h"
27#include "matpol.h"
28#include "kstd1.h"
29#include "timer.h"
30#include "ring.h"
31#include "subexpr.h"
32#include "lists.h"
33#include "longalg.h"
34#include "modulop.h"
35#include "numbers.h"
36#include "stairc.h"
37#include "maps.h"
38#include "maps_ip.h"
39#include "syz.h"
40#include "weight.h"
41#include "ipconv.h"
42#include "ipprint.h"
43#include "sing_dld.h"
44#include "attrib.h"
45#include "silink.h"
46#include "sparsmat.h"
47#include "units.h"
48#include "janet.h"
49#include "GMPrat.h"
50#include "tgb.h"
51#include "walkProc.h"
52#include "mod_raw.h"
53#ifdef HAVE_FACTORY
54#include "clapsing.h"
55#include "kstdfac.h"
56#endif /* HAVE_FACTORY */
57#ifdef HAVE_FGLM
58#include "fglm.h"
59#endif /* HAVE_FGLM */
60#define HAVE_INTERPOLATION
61#ifdef HAVE_INTERPOLATION
62#include "interpolation.h"
63#endif
64
65#include "ipshell.h"
66#include "mpr_inout.h"
67
68#ifdef HAVE_PLURAL
69#include "gring.h"
70#include "sca.h"
71#define ALLOW_PLURAL    ,1
72#define ALLOW_PLURAL_N   1
73#define NO_PLURAL       ,0
74#define NO_PLURAL_N      0
75#define COMM_PLURAL     ,2
76#define COMM_PLURAL_N    2
77#else /* HAVE_PLURAL */
78#define ALLOW_PLURAL
79#define NO_PLURAL
80#define COMM_PLURAL
81#endif /* HAVE_PLURAL */
82
83/*=============== types =====================*/
84struct sValCmdTab
85{
86  short cmd;
87  short start;
88};
89
90typedef sValCmdTab jjValCmdTab[];
91
92/* ifdef GENTABLE: definitions are in ipshell.h */
93#ifndef GENTABLE
94typedef char * (*Proc1)(char *);
95struct sValCmd1
96{
97  proc1 p;
98  short cmd;
99  short res;
100  short arg;
101#ifdef HAVE_PLURAL
102  short valid_for_plural;
103# endif /* HAVE_PLURAL */
104};
105
106typedef BOOLEAN (*proc2)(leftv,leftv,leftv);
107struct sValCmd2
108{
109  proc2 p;
110  short cmd;
111  short res;
112  short arg1;
113  short arg2;
114#ifdef HAVE_PLURAL
115  short valid_for_plural;
116# endif /* HAVE_PLURAL */
117};
118
119typedef BOOLEAN (*proc3)(leftv,leftv,leftv,leftv);
120struct sValCmd3
121{
122  proc3 p;
123  short cmd;
124  short res;
125  short arg1;
126  short arg2;
127  short arg3;
128#ifdef HAVE_PLURAL
129  short valid_for_plural;
130# endif /* HAVE_PLURAL */
131};
132struct sValCmdM
133{
134  proc1 p;
135  short cmd;
136  short res;
137  short number_of_args; /* -1: any, -2: any >0, .. */
138#ifdef HAVE_PLURAL
139  short valid_for_plural;
140# endif /* HAVE_PLURAL */
141};
142#endif /* GENTABLE */
143
144typedef struct
145{
146  cmdnames *sCmds;             /**< array of existing commands */
147#ifndef GENTABLE
148  struct sValCmd1 *psValCmd1;
149  struct sValCmd2 *psValCmd2;
150  struct sValCmd3 *psValCmd3;
151  struct sValCmdM *psValCmdM;
152#endif /* GENTABLE */
153  int nCmdUsed;      /**< number of commands used */
154  int nCmdAllocated; /**< number of commands-slots allocated */
155  int nLastIdentifier; /**< valid indentifieres are slot 1..nLastIdentifier */
156} SArithBase;
157
158/*---------------------------------------------------------------------*
159 * File scope Variables (Variables share by several functions in
160 *                       the same file )
161 *
162 *---------------------------------------------------------------------*/
163static SArithBase sArithBase;  /**< Base entry for arithmetic */
164
165/*---------------------------------------------------------------------*
166 * Extern Functions declarations
167 *
168 *---------------------------------------------------------------------*/
169static int _gentable_sort_cmds(const void *a, const void *b);
170extern int iiArithRemoveCmd(char *szName);
171extern int iiArithAddCmd(char *szName, short nAlias, short nTokval,
172                         short nToktype, short nPos=-1);
173
174/*============= proc =======================*/
175static BOOLEAN jjLOAD(leftv res, leftv v, BOOLEAN autoexport = FALSE);
176static int iiTabIndex(const jjValCmdTab dArithTab, const int len, const int op);
177#ifdef MDEBUG
178#define jjMakeSub(A) jjDBMakeSub(A,__FILE__,__LINE__)
179static Subexpr jjDBMakeSub(leftv e,char *f, int l);
180#else
181static Subexpr jjMakeSub(leftv e);
182#endif
183
184/*============= vars ======================*/
185extern int cmdtok;
186extern BOOLEAN expected_parms;
187
188#define ii_div_by_0 "div. by 0"
189#define ii_not_for_plural "not implemented for non-commutative rings"
190
191int iiOp; /* the current operation*/
192
193#ifdef GENTABLE
194cmdnames cmds[] =
195{  // name-string alias tokval          toktype
196  { "$INVALID$",   0, -1,                 0},
197  { "and",         0, '&' ,               LOGIC_OP},
198  { "attrib",      0, ATTRIB_CMD ,        CMD_123},
199  { "bareiss",     0, BAREISS_CMD ,       CMD_123},
200  { "betti",       0, BETTI_CMD ,         CMD_12},
201  { "bigint",      0, BIGINT_CMD ,        ROOT_DECL},
202  #ifdef HAVE_PLURAL
203  { "bracket",     0, BRACKET_CMD ,       CMD_2},
204  #endif
205  { "break",       0, BREAK_CMD ,         BREAK_CMD},
206  { "breakpoint",  0, BREAKPOINT_CMD ,    CMD_M},
207  { "char",        0, CHARACTERISTIC_CMD ,CMD_1},
208  { "char_series", 0, CHAR_SERIES_CMD ,   CMD_1},
209  { "charstr",     0, CHARSTR_CMD ,       CMD_1},
210  { "chinrem",     0, CHINREM_CMD ,       CMD_2},
211  { "cleardenom",  0, CONTENT_CMD ,       CMD_1},
212  { "close",       0, CLOSE_CMD ,         CMD_1},
213  { "coef",        0, COEF_CMD ,          CMD_M},
214  { "coeffs",      0, COEFFS_CMD ,        CMD_23},
215  { "continue",    0, CONTINUE_CMD ,      CONTINUE_CMD},
216  { "contract",    0, CONTRACT_CMD ,      CMD_2},
217  { "convhull",    0, NEWTONPOLY_CMD,     CMD_1},
218  { "dbprint",     0, DBPRINT_CMD ,       CMD_M},
219  { "def",         0, DEF_CMD ,           ROOT_DECL},
220  { "defined",     0, DEFINED_CMD ,       CMD_1},
221  { "deg",         0, DEG_CMD ,           CMD_12},
222  { "degree",      0, DEGREE_CMD ,        CMD_1},
223  { "delete",      0, DELETE_CMD ,        CMD_2},
224  { "det",         0, DET_CMD ,           CMD_1},
225  { "diff",        0, DIFF_CMD ,          CMD_2},
226  { "dim",         0, DIM_CMD ,           CMD_1},
227  { "div",         0, INTDIV_CMD ,        MULDIV_OP},
228  { "division",    0, DIVISION_CMD ,      CMD_M},
229  { "dump",        0, DUMP_CMD,           CMD_1},
230  { "extgcd",      0, EXTGCD_CMD ,        CMD_2},
231  { "EXTGCD",      2, EXTGCD_CMD ,        CMD_2},
232  { "ERROR",       0, ERROR_CMD ,         CMD_1},
233  { "eliminate",   0, ELIMINATION_CMD,    CMD_23},
234  { "else",        0, ELSE_CMD ,          ELSE_CMD},
235  #ifdef HAVE_PLURAL
236  { "envelope",    0, ENVELOPE_CMD ,       CMD_1},
237  #endif
238  { "eval",        0, EVAL ,              EVAL},
239  { "example",     0, EXAMPLE_CMD ,       EXAMPLE_CMD},
240  { "execute",     0, EXECUTE_CMD ,       CMD_1},
241  { "export",      0, EXPORT_CMD ,        EXPORT_CMD},
242  { "exportto",    0, EXPORTTO_CMD ,      CMD_2},
243  { "factorize",   0, FAC_CMD ,           CMD_12},
244  { "fetch",       0, FETCH_CMD ,         CMD_2},
245  { "fglm",        0, FGLM_CMD ,          CMD_2},
246  { "fglmquot",    0, FGLMQUOT_CMD,       CMD_2},
247  { "find",        0, FIND_CMD ,          CMD_23},
248  { "finduni",     0, FINDUNI_CMD,        CMD_1},
249  { "forif",       0, IF_CMD ,            IF_CMD},
250  { "freemodule",  0, FREEMODULE_CMD ,    CMD_1},
251  { "facstd",      0, FACSTD_CMD ,        CMD_12},
252  { "frwalk",      0, FWALK_CMD ,         CMD_23},
253  { "gen",         0, E_CMD ,             CMD_1},
254  { "getdump",     0, GETDUMP_CMD,        CMD_1},
255  { "gcd",         0, GCD_CMD ,           CMD_2},
256  { "GCD",         2, GCD_CMD ,           CMD_2},
257  { "hilb",        0, HILBERT_CMD ,       CMD_123},
258  { "highcorner",  0, HIGHCORNER_CMD,     CMD_1},
259  { "homog",       0, HOMOG_CMD ,         CMD_12},
260  { "hres",        0, HRES_CMD ,          CMD_2},
261  { "ideal",       0, IDEAL_CMD ,         IDEAL_CMD},
262  { "if",          0, IF_CMD ,            IF_CMD},
263  { "imap",        0, IMAP_CMD ,          CMD_2},
264  { "impart",      0, IMPART_CMD ,        CMD_1},
265  { "importfrom",  0, IMPORTFROM_CMD ,    CMD_2},
266  { "indepSet",    0, INDEPSET_CMD ,      CMD_12},
267  { "insert",      0, INSERT_CMD ,        CMD_23},
268  { "int",         0, INT_CMD ,           ROOT_DECL},
269#ifdef HAVE_INTERPOLATION
270  { "interpolation",0,INTERPOLATE_CMD ,   CMD_2},
271#endif
272  { "interred",    0, INTERRED_CMD ,      CMD_1},
273  { "intersect",   0, INTERSECT_CMD ,     CMD_M},
274  { "intmat",      0, INTMAT_CMD ,        INTMAT_CMD},
275  { "intvec",      0, INTVEC_CMD ,        ROOT_DECL_LIST},
276  { "jacob",       0, JACOB_CMD ,         CMD_1},
277  { "janet",       0, JANET_CMD ,         CMD_12},
278  { "jet",         0, JET_CMD ,           CMD_M},
279  { "kbase",       0, KBASE_CMD ,         CMD_12},
280  { "keepring",    0, KEEPRING_CMD ,      KEEPRING_CMD},
281  { "kill",        0, KILL_CMD ,          KILL_CMD},
282  { "killattrib",  0, KILLATTR_CMD ,      CMD_12},
283  { "koszul",      0, KOSZUL_CMD ,        CMD_23},
284  { "kres",        0, KRES_CMD ,          CMD_2},
285  { "laguerre",    0, LAGSOLVE_CMD,       CMD_3},
286  { "lead",        0, LEAD_CMD ,          CMD_1},
287  { "leadcoef",    0, LEADCOEF_CMD ,      CMD_1},
288  { "leadexp",     0, LEADEXP_CMD ,       CMD_1},
289  { "leadmonom",   0, LEADMONOM_CMD ,     CMD_1},
290  { "LIB",         0, LIB_CMD ,           SYSVAR},
291  { "lift",        0, LIFT_CMD ,          CMD_23},
292  { "liftstd",     0, LIFTSTD_CMD ,       CMD_2},
293  { "link",        0, LINK_CMD ,          ROOT_DECL},
294  { "listvar",     0, LISTVAR_CMD ,       LISTVAR_CMD},
295  { "list",        0, LIST_CMD ,          ROOT_DECL_LIST},
296  { "load",        0, LOAD_CMD ,          CMD_12},
297  { "lres",        0, LRES_CMD ,          CMD_2},
298  { "map",         0, MAP_CMD ,           RING_DECL},
299  { "matrix",      0, MATRIX_CMD ,        MATRIX_CMD},
300  { "maxideal",    0, MAXID_CMD ,         CMD_1},
301  { "memory",      0, MEMORY_CMD ,        CMD_1},
302  { "minbase",     0, MINBASE_CMD ,       CMD_1},
303  { "minor",       0, MINOR_CMD ,         CMD_23},
304  { "minres",      0, MINRES_CMD ,        CMD_1},
305  { "mod",         0, INTMOD_CMD ,        MULDIV_OP},
306  { "module",      0, MODUL_CMD ,         MODUL_CMD},
307  { "modulo",      0, MODULO_CMD ,        CMD_2},
308  { "monitor",     0, MONITOR_CMD ,       CMD_12},
309  { "mpresmat",    0, MPRES_CMD,          CMD_2},
310  { "mult",        0, MULTIPLICITY_CMD ,  CMD_1},
311  #ifdef OLD_RES
312  { "mres",        0, MRES_CMD ,          CMD_23},
313  #else
314  { "mres",        0, MRES_CMD ,          CMD_2},
315  #endif
316  { "mstd",        0, MSTD_CMD ,          CMD_1},
317  { "nameof",      0, NAMEOF_CMD ,        CMD_1},
318  { "names",       0, NAMES_CMD ,         CMD_M},
319  #ifdef HAVE_PLURAL
320  { "ncalgebra",   2, NCALGEBRA_CMD ,     CMD_2},
321  { "nc_algebra",  0, NC_ALGEBRA_CMD ,    CMD_2},
322  #endif
323  { "ncols",       0, COLS_CMD ,          CMD_1},
324  { "not",         0, NOT ,               NOT},
325  { "npars",       0, NPARS_CMD ,         CMD_1},
326  #ifdef OLD_RES
327  { "nres",        0, RES_CMD ,           CMD_23},
328  #else
329  { "nres",        0, RES_CMD ,           CMD_2},
330  #endif
331  { "nrows",       0, ROWS_CMD ,          CMD_1},
332  { "number",      0, NUMBER_CMD ,        RING_DECL},
333  { "nvars",       0, NVARS_CMD ,         CMD_1},
334  { "open",        0, OPEN_CMD ,          CMD_1},
335  #ifdef HAVE_PLURAL
336  { "oppose",      0, OPPOSE_CMD ,        CMD_2},
337  { "opposite",    0, OPPOSITE_CMD ,      CMD_1},
338  #endif
339  { "option",      0, OPTION_CMD ,        CMD_M},
340  { "or",          0, '|' ,               LOGIC_OP},
341  { "ord",         0, ORD_CMD ,           CMD_1},
342  { "ordstr",      0, ORDSTR_CMD ,        CMD_1},
343  { "package",     0, PACKAGE_CMD ,       ROOT_DECL},
344  { "par",         0, PAR_CMD ,           CMD_1},
345  { "parameter",   0, PARAMETER ,         PARAMETER},
346  { "pardeg",      0, PARDEG_CMD ,        CMD_1},
347  { "parstr",      0, PARSTR_CMD ,        CMD_12},
348  { "poly",        0, POLY_CMD ,          RING_DECL},
349  { "preimage",    0, PREIMAGE_CMD ,      CMD_13},
350  { "prime",       0, PRIME_CMD ,         CMD_1},
351  { "print",       0, PRINT_CMD ,         CMD_12},
352  { "prune",       0, PRUNE_CMD ,         CMD_1},
353  { "proc",        0, PROC_CMD ,          PROC_CMD},
354  { "qhweight",    0, QHWEIGHT_CMD ,      CMD_1},
355  { "qring",       0, QRING_CMD ,         ROOT_DECL},
356  { "quote",       0, QUOTE ,             QUOTE},
357  { "quotient",    0, QUOTIENT_CMD ,      CMD_2},
358  { "random",      0, RANDOM_CMD ,        CMD_23},
359  { "read",        0, READ_CMD ,          CMD_12},
360  { "reduce",      0, REDUCE_CMD ,        CMD_M},
361  { "regularity",  0, REGULARITY_CMD ,    CMD_1},
362  { "repart",      0, REPART_CMD ,        CMD_1},
363  { "reservedName",0, RESERVEDNAME_CMD ,  CMD_M},
364  { "resolution",  0, RESOLUTION_CMD ,    RING_DECL},
365  { "resultant",   0, RESULTANT_CMD,      CMD_3},
366  { "return",      0, RETURN ,            RETURN},
367  { "RETURN",      0, END_GRAMMAR ,       RETURN},
368  { "ring",        0, RING_CMD ,          RING_CMD},
369  { "ringlist",    0, RINGLIST_CMD ,      CMD_1},
370  { "rvar",        0, IS_RINGVAR ,        CMD_1},
371  { "setring",     0, SETRING_CMD ,       SETRING_CMD},
372  { "simplex",     0, SIMPLEX_CMD,        CMD_M},
373  { "simplify",    0, SIMPLIFY_CMD ,      CMD_2},
374  { "size",        0, COUNT_CMD ,         CMD_1},
375  { "slimgb",      0, SLIM_GB_CMD ,       CMD_1},
376  { "sortvec",     0, SORTVEC_CMD ,       CMD_1},
377#ifdef OLD_RES
378  { "sres",        0, SRES_CMD ,          CMD_23},
379#else /* OLD_RES */
380  { "sres",        0, SRES_CMD ,          CMD_2},
381#endif /* OLD_RES */
382  { "status",      0, STATUS_CMD,         CMD_M},
383  { "std",         0, STD_CMD ,           CMD_123},
384  { "string",      0, STRING_CMD ,        ROOT_DECL_LIST},
385  { "subst",       0, SUBST_CMD ,         CMD_M},
386  { "system",      0, SYSTEM_CMD,         CMD_M},
387  { "syz",         0, SYZYGY_CMD ,        CMD_1},
388  { "test",        0, TEST_CMD ,          CMD_M},
389  { "trace",       0, TRACE_CMD ,         CMD_1},
390  { "transpose",   0, TRANSPOSE_CMD ,     CMD_1},
391#ifdef HAVE_PLURAL
392  { "twostd",      0, TWOSTD_CMD ,        CMD_1},
393#endif /* HAVE_PLURAL */
394  { "type",        0, TYPE_CMD ,          TYPE_CMD},
395  { "typeof",      0, TYPEOF_CMD ,        CMD_1},
396  { "univariate",  0, UNIVARIATE_CMD,     CMD_1},
397  { "uressolve",   0, URSOLVE_CMD,        CMD_M},
398  { "vandermonde", 0, VANDER_CMD,         CMD_3},
399  { "var",         0, VAR_CMD ,           CMD_1},
400  { "variables",   0, VARIABLES_CMD,      CMD_1},
401  { "varstr",      0, VARSTR_CMD ,        CMD_12},
402  { "vdim",        0, VDIM_CMD ,          CMD_1},
403  { "vector",      0, VECTOR_CMD ,        RING_DECL},
404  { "wedge",       0, WEDGE_CMD ,         CMD_2},
405  { "weight",      0, WEIGHT_CMD ,        CMD_1},
406  { "whileif",     0, IF_CMD ,            IF_CMD},
407  { "write",       0, WRITE_CMD ,         CMD_M},
408/* delete for next version:*/
409  { "IN",          1, LEAD_CMD ,          CMD_1},
410  { "NF",          1, REDUCE_CMD ,        CMD_M},
411  { "multiplicity",1, MULTIPLICITY_CMD ,  CMD_1},
412  { "verbose",     2, OPTION_CMD ,        CMD_M},
413//  { "rank",        1, ROWS_CMD ,          CMD_1},
414//  { "Current",     0, -1 ,                SYSVAR},
415//  { "Top",         0, -1 ,                SYSVAR},
416//  { "Up",          0, -1 ,                SYSVAR},
417
418/* set sys vars*/
419  { "degBound",    0, VMAXDEG ,           SYSVAR},
420  { "echo",        0, VECHO ,             SYSVAR},
421  { "minpoly",     0, VMINPOLY ,          SYSVAR},
422  { "multBound",   0, VMAXMULT ,          SYSVAR},
423  { "noether",     0, VNOETHER ,          SYSVAR},
424  { "pagelength",  0, VPAGELENGTH ,       SYSVAR},
425  { "pagewidth",   0, VCOLMAX ,           SYSVAR},
426  { "printlevel",  0, VPRINTLEVEL ,       SYSVAR},
427  { "short",       0, VSHORTOUT ,         SYSVAR},
428  { "timer",       0, VTIMER ,            SYSVAR},
429  { "rtimer",      0, VRTIMER,            SYSVAR},
430  { "TRACE",       0, TRACE ,             SYSVAR},
431  { "voice",       0, VOICE ,             SYSVAR},
432
433/* other reserved words:scanner.l */
434  { "pause",       2, -1 ,             0},
435  { "while",       0, -1 ,             0},
436  { "for",         0, -1 ,             0},
437  { "help",        0, -1 ,             0},
438  { "newline",     0, -1 ,             0},
439  { "exit",        0, -1 ,             0},
440  { "quit",        0, -1 ,             0},
441/* end of list marker */
442  { NULL, 0, 0, 0}
443};
444#endif /* GENTABLE */
445
446/*=================== operations with 2 args.: static proc =================*/
447static BOOLEAN jjOP_IV_I(leftv res, leftv u, leftv v)
448{
449  intvec* aa= (intvec *)u->CopyD(INTVEC_CMD);
450  int bb = (int)(long)(v->Data());
451  if (errorreported) return TRUE;
452  switch (iiOp)
453  {
454    case '+': (*aa) += bb; break;
455    case '-': (*aa) -= bb; break;
456    case '*': (*aa) *= bb; break;
457    case '/':
458    case INTDIV_CMD: (*aa) /= bb; break;
459    case '%':
460    case INTMOD_CMD: (*aa) %= bb; break;
461  }
462  res->data=(char *)aa;
463  return FALSE;
464}
465static BOOLEAN jjOP_I_IV(leftv res, leftv u, leftv v)
466{
467  return jjOP_IV_I(res,v,u);
468}
469static BOOLEAN jjOP_IM_I(leftv res, leftv u, leftv v)
470{
471  intvec* aa= (intvec *)u->CopyD(INTVEC_CMD);
472  int bb = (int)(long)(v->Data());
473  int i=si_min(aa->rows(),aa->cols());
474  switch (iiOp)
475  {
476    case '+': for (;i>0;i--) IMATELEM(*aa,i,i) += bb;
477              break;
478    case '-': for (;i>0;i--) IMATELEM(*aa,i,i) -= bb;
479              break;
480  }
481  res->data=(char *)aa;
482  return FALSE;
483}
484static BOOLEAN jjOP_I_IM(leftv res, leftv u, leftv v)
485{
486  return jjOP_IM_I(res,v,u);
487}
488static BOOLEAN jjCOLON(leftv res, leftv u, leftv v)
489{
490  int l=(int)(long)v->Data();
491  if (l>0)
492  {
493    int d=(int)(long)u->Data();
494    intvec *vv=new intvec(l);
495    int i;
496    for(i=0;i<l;i++) { (*vv)[i]=d; }
497    res->data=(char *)vv;
498  }
499  return (l<=0);
500}
501static BOOLEAN jjDOTDOT(leftv res, leftv u, leftv v)
502{
503  res->data=(char *)new intvec((int)(long)u->Data(),(int)(long)v->Data());
504  return FALSE;
505}
506static void jjEQUAL_REST(leftv res,leftv u,leftv v);
507static BOOLEAN jjCOMPARE_IV(leftv res, leftv u, leftv v)
508{
509  intvec*    a = (intvec * )(u->Data());
510  intvec*    b = (intvec * )(v->Data());
511  int r=a->compare(b);
512  switch  (iiOp)
513  {
514    case '<':
515      res->data  = (char *) (r<0);
516      break;
517    case '>':
518      res->data  = (char *) (r>0);
519      break;
520    case LE:
521      res->data  = (char *) (r<=0);
522      break;
523    case GE:
524      res->data  = (char *) (r>=0);
525      break;
526    case EQUAL_EQUAL:
527    case NOTEQUAL: /* negation handled by jjEQUAL_REST */
528      res->data  = (char *) (r==0);
529      break;
530  }
531  jjEQUAL_REST(res,u,v);
532  if(r==-2) { WerrorS("size incompatible"); return TRUE; }
533  return FALSE;
534}
535static BOOLEAN jjCOMPARE_IV_I(leftv res, leftv u, leftv v)
536{
537  intvec* a = (intvec * )(u->Data());
538  int     b = (int)(long)(v->Data());
539  int r=a->compare(b);
540  switch  (iiOp)
541  {
542    case '<':
543      res->data  = (char *) (r<0);
544      break;
545    case '>':
546      res->data  = (char *) (r>0);
547      break;
548    case LE:
549      res->data  = (char *) (r<=0);
550      break;
551    case GE:
552      res->data  = (char *) (r>=0);
553      break;
554    case EQUAL_EQUAL:
555    case NOTEQUAL: /* negation handled by jjEQUAL_REST */
556      res->data  = (char *) (r==0);
557      break;
558  }
559  jjEQUAL_REST(res,u,v);
560  return FALSE;
561}
562static BOOLEAN jjCOMPARE_P(leftv res, leftv u, leftv v)
563{
564  poly p=(poly)u->Data();
565  poly q=(poly)v->Data();
566  int r=pCmp(p,q);
567  if (r==0)
568  {
569    number h=nSub(pGetCoeff(p),pGetCoeff(q));
570    /* compare lead coeffs */
571    r = -1+nIsZero(h)+2*nGreaterZero(h); /* -1: <, 0:==, 1: > */
572    nDelete(&h);
573  }
574  else if (p==NULL)
575  {
576    if (q==NULL)
577    {
578      /* compare 0, 0 */
579      r=0;
580    }
581    else if(pIsConstant(q))
582    {
583      /* compare 0, const */
584      r = 1-2*nGreaterZero(pGetCoeff(q)); /* -1: <, 1: > */
585    }
586  }
587  else if (q==NULL)
588  {
589    if (pIsConstant(p))
590    {
591      /* compare const, 0 */
592      r = -1+2*nGreaterZero(pGetCoeff(p)); /* -1: <, 1: > */
593    }
594  }
595  switch  (iiOp)
596  {
597    case '<':
598      res->data  = (char *) (r < 0);
599      break;
600    case '>':
601      res->data  = (char *) (r > 0);
602      break;
603    case LE:
604      res->data  = (char *) (r <= 0);
605      break;
606    case GE:
607      res->data  = (char *) (r >= 0);
608      break;
609    //case EQUAL_EQUAL:
610    //case NOTEQUAL: /* negation handled by jjEQUAL_REST */
611    //  res->data  = (char *) (r == 0);
612    //  break;
613  }
614  jjEQUAL_REST(res,u,v);
615  return FALSE;
616}
617static BOOLEAN jjCOMPARE_S(leftv res, leftv u, leftv v)
618{
619  char*    a = (char * )(u->Data());
620  char*    b = (char * )(v->Data());
621  int result = strcmp(a,b);
622  switch  (iiOp)
623  {
624    case '<':
625      res->data  = (char *) (result  < 0);
626      break;
627    case '>':
628      res->data  = (char *) (result  > 0);
629      break;
630    case LE:
631      res->data  = (char *) (result  <= 0);
632      break;
633    case GE:
634      res->data  = (char *) (result  >= 0);
635      break;
636    case EQUAL_EQUAL:
637    case NOTEQUAL: /* negation handled by jjEQUAL_REST */
638      res->data  = (char *) (result  == 0);
639      break;
640  }
641  jjEQUAL_REST(res,u,v);
642  return FALSE;
643}
644static BOOLEAN jjOP_REST(leftv res, leftv u, leftv v)
645{
646  if (u->Next()!=NULL)
647  {
648    u=u->next;
649    res->next = (leftv)omAllocBin(sleftv_bin);
650    return iiExprArith2(res->next,u,iiOp,v);
651  }
652  else if (v->Next()!=NULL)
653  {
654    v=v->next;
655    res->next = (leftv)omAllocBin(sleftv_bin);
656    return iiExprArith2(res->next,u,iiOp,v);
657  }
658  return FALSE;
659}
660static BOOLEAN jjPOWER_I(leftv res, leftv u, leftv v)
661{
662  int b=(int)(long)u->Data();
663  int e=(int)(long)v->Data();
664  int rc = 1;
665  BOOLEAN overflow=FALSE;
666  if (e >= 0)
667  {
668    if (b==0)
669    {
670      rc=0;
671    }
672    else
673    {
674      int oldrc;
675      while ((e--)!=0)
676      {
677        oldrc=rc;
678        rc *= b;
679        if (!overflow)
680        {
681          if(rc/b!=oldrc) overflow=TRUE;
682        }
683      }
684      if (overflow)
685        WarnS("int overflow(^), result may be wrong");
686    }
687    res->data = (char *)((long)rc);
688    if (u!=NULL) return jjOP_REST(res,u,v);
689    return FALSE;
690  }
691  else
692  {
693    WerrorS("exponent must be non-negative");
694    return TRUE;
695  }
696}
697static BOOLEAN jjPOWER_BI(leftv res, leftv u, leftv v)
698{
699  int e=(int)(long)v->Data();
700  number n=(number)u->Data();
701  if (e>=0)
702  {
703    nlPower(n,e,(number*)&res->data);
704  }
705  else
706  {
707    WerrorS("exponent must be non-negative");
708    return TRUE;
709  }
710  if (u!=NULL) return jjOP_REST(res,u,v);
711  return FALSE;
712}
713static BOOLEAN jjPOWER_N(leftv res, leftv u, leftv v)
714{
715  int e=(int)(long)v->Data();
716  number n=(number)u->Data();
717  int d=0;
718  if (e<0)
719  {
720    n=nInvers(n);
721    e=-e;
722    d=1;
723  }
724  nPower(n,e,(number*)&res->data);
725  if (d) nDelete(&n);
726  if (u!=NULL) return jjOP_REST(res,u,v);
727  return FALSE;
728}
729static BOOLEAN jjPOWER_P(leftv res, leftv u, leftv v)
730{
731  res->data = (char *)pPower((poly)u->CopyD(POLY_CMD),(int)(long)v->Data());
732  if (u!=NULL) return jjOP_REST(res,u,v);
733  return errorreported; /* pPower may set errorreported via Werror */
734}
735static BOOLEAN jjPOWER_ID(leftv res, leftv u, leftv v)
736{
737  res->data = (char *)idPower((ideal)(u->Data()),(int)(long)(v->Data()));
738  if (u!=NULL) return jjOP_REST(res,u,v);
739  return FALSE;
740}
741static BOOLEAN jjPLUSMINUS_Gen(leftv res, leftv u, leftv v)
742{
743  u=u->next;
744  v=v->next;
745  if (u==NULL)
746  {
747    if (v==NULL) return FALSE;      /* u==NULL, v==NULL */
748    if (iiOp=='-')                  /* u==NULL, v<>NULL, iiOp=='-'*/
749    {
750      do
751      {
752        if (res->next==NULL)
753          res->next = (leftv)omAlloc0Bin(sleftv_bin);
754        leftv tmp_v=v->next;
755        v->next=NULL;
756        BOOLEAN b=iiExprArith1(res->next,v,'-');
757        v->next=tmp_v;
758        if (b)
759          return TRUE;
760        v=tmp_v;
761        res=res->next;
762      } while (v!=NULL);
763      return FALSE;
764    }
765    loop                            /* u==NULL, v<>NULL, iiOp=='+' */
766    {
767      res->next = (leftv)omAlloc0Bin(sleftv_bin);
768      res=res->next;
769      res->data = v->CopyD();
770      res->rtyp = v->Typ();
771      v=v->next;
772      if (v==NULL) return FALSE;
773    }
774  }
775  if (v!=NULL)                     /* u<>NULL, v<>NULL */
776  {
777    do
778    {
779      res->next = (leftv)omAlloc0Bin(sleftv_bin);
780      leftv tmp_u=u->next; u->next=NULL;
781      leftv tmp_v=v->next; v->next=NULL;
782      BOOLEAN b=iiExprArith2(res->next,u,iiOp,v);
783      u->next=tmp_u;
784      v->next=tmp_v;
785      if (b)
786        return TRUE;
787      u=tmp_u;
788      v=tmp_v;
789      res=res->next;
790    } while ((u!=NULL) && (v!=NULL));
791    return FALSE;
792  }
793  loop                             /* u<>NULL, v==NULL */
794  {
795    res->next = (leftv)omAlloc0Bin(sleftv_bin);
796    res=res->next;
797    res->data = u->CopyD();
798    res->rtyp = u->Typ();
799    u=u->next;
800    if (u==NULL) return FALSE;
801  }
802}
803static BOOLEAN jjCOLCOL(leftv res, leftv u, leftv v)
804{
805#ifdef HAVE_NS
806  idhdl packhdl;
807  switch(u->Typ())
808  {
809      case 0:
810        Print("%s of type 'ANY'. Trying load.\n", v->name);
811        if(iiTryLoadLib(u, u->name))
812        {
813          Werror("'%s' no such package", u->name);
814          return TRUE;
815        }
816        syMake(u,u->name,NULL);
817        // else: use next case !!! no break !!!
818      case PACKAGE_CMD:
819        packhdl = (idhdl)u->data;
820        if((!IDPACKAGE(packhdl)->loaded)
821        && (IDPACKAGE(packhdl)->language > LANG_TOP))
822        {
823          //if(iiReLoadLib(packhdl))
824          //  Werror("unable to reload package '%s'", IDID(packhdl));
825          Werror("'%s' not loaded", u->name);
826          return TRUE;
827        }
828        if(v->rtyp == IDHDL)
829        {
830          v->name = omStrDup(v->name);
831        }
832        v->req_packhdl=IDPACKAGE(packhdl);
833        v->packhdl=IDPACKAGE(packhdl);
834        syMake(v, v->name, packhdl);
835        memcpy(res, v, sizeof(sleftv));
836        memset(v, 0, sizeof(sleftv));
837        break;
838      case DEF_CMD:
839        break;
840      default:
841        WerrorS("<package>::<id> expected");
842        return TRUE;
843  }
844#else /* HAVE_NS */
845  WerrorS("package is not supported in this version");
846#endif /* HAVE_NS */
847  return FALSE;
848}
849static BOOLEAN jjPLUS_I(leftv res, leftv u, leftv v)
850{
851  unsigned int a=(unsigned int)(unsigned long)u->Data();
852  unsigned int b=(unsigned int)(unsigned long)v->Data();
853  unsigned int c=a+b;
854  res->data = (char *)((long)c);
855  if (((Sy_bit(31)&a)==(Sy_bit(31)&b))&&((Sy_bit(31)&a)!=(Sy_bit(31)&c)))
856  {
857    WarnS("int overflow(+), result may be wrong");
858  }
859  return jjPLUSMINUS_Gen(res,u,v);
860}
861static BOOLEAN jjPLUS_BI(leftv res, leftv u, leftv v)
862{
863  res->data = (char *)(nlAdd((number)u->Data(), (number)v->Data()));
864  return jjPLUSMINUS_Gen(res,u,v);
865}
866static BOOLEAN jjPLUS_N(leftv res, leftv u, leftv v)
867{
868  res->data = (char *)(nAdd((number)u->Data(), (number)v->Data()));
869  return jjPLUSMINUS_Gen(res,u,v);
870}
871static BOOLEAN jjPLUS_P(leftv res, leftv u, leftv v)
872{
873  res->data = (char *)(pAdd((poly)u->CopyD(POLY_CMD) , (poly)v->CopyD(POLY_CMD)));
874  return jjPLUSMINUS_Gen(res,u,v);
875}
876static BOOLEAN jjPLUS_IV(leftv res, leftv u, leftv v)
877{
878  res->data = (char *)ivAdd((intvec*)(u->Data()), (intvec*)(v->Data()));
879  if (res->data==NULL)
880  {
881     WerrorS("intmat size not compatible");
882     return TRUE;
883  }
884  return jjPLUSMINUS_Gen(res,u,v);
885  return FALSE;
886}
887static BOOLEAN jjPLUS_MA(leftv res, leftv u, leftv v)
888{
889  res->data = (char *)(mpAdd((matrix)u->Data() , (matrix)v->Data()));
890  if (res->data==NULL)
891  {
892     WerrorS("matrix size not compatible");
893     return TRUE;
894  }
895  return jjPLUSMINUS_Gen(res,u,v);
896}
897static BOOLEAN jjPLUS_MA_P(leftv res, leftv u, leftv v)
898{
899  matrix m=(matrix)u->Data();
900  matrix p= mpInitP(m->nrows,m->ncols,(poly)(v->CopyD(POLY_CMD)));
901  if (iiOp=='+')
902    res->data = (char *)mpAdd(m , p);
903  else
904    res->data = (char *)mpSub(m , p);
905  idDelete((ideal *)&p);
906  return jjPLUSMINUS_Gen(res,u,v);
907}
908static BOOLEAN jjPLUS_P_MA(leftv res, leftv u, leftv v)
909{
910  return jjPLUS_MA_P(res,v,u);
911}
912static BOOLEAN jjPLUS_S(leftv res, leftv u, leftv v)
913{
914  char*    a = (char * )(u->Data());
915  char*    b = (char * )(v->Data());
916  char*    r = (char * )omAlloc(strlen(a) + strlen(b) + 1);
917  strcpy(r,a);
918  strcat(r,b);
919  res->data=r;
920  return jjPLUSMINUS_Gen(res,u,v);
921}
922static BOOLEAN jjPLUS_ID(leftv res, leftv u, leftv v)
923{
924  res->data = (char *)idAdd((ideal)u->Data(),(ideal)v->Data());
925  return jjPLUSMINUS_Gen(res,u,v);
926}
927static BOOLEAN jjMINUS_I(leftv res, leftv u, leftv v)
928{
929  unsigned int a=(unsigned int)(unsigned long)u->Data();
930  unsigned int b=(unsigned int)(unsigned long)v->Data();
931  unsigned int c=a-b;
932  if (((Sy_bit(31)&a)!=(Sy_bit(31)&b))&&((Sy_bit(31)&a)!=(Sy_bit(31)&c)))
933  {
934    WarnS("int overflow(-), result may be wrong");
935  }
936  res->data = (char *)((long)c);
937  return jjPLUSMINUS_Gen(res,u,v);
938}
939static BOOLEAN jjMINUS_BI(leftv res, leftv u, leftv v)
940{
941  res->data = (char *)(nlSub((number)u->Data(), (number)v->Data()));
942  return jjPLUSMINUS_Gen(res,u,v);
943}
944static BOOLEAN jjMINUS_N(leftv res, leftv u, leftv v)
945{
946  res->data = (char *)(nSub((number)u->Data(), (number)v->Data()));
947  return jjPLUSMINUS_Gen(res,u,v);
948}
949static BOOLEAN jjMINUS_P(leftv res, leftv u, leftv v)
950{
951  res->data = (char *)(pSub((poly)u->CopyD(POLY_CMD) , (poly)v->CopyD(POLY_CMD)));
952  return jjPLUSMINUS_Gen(res,u,v);
953}
954static BOOLEAN jjMINUS_IV(leftv res, leftv u, leftv v)
955{
956  res->data = (char *)ivSub((intvec*)(u->Data()), (intvec*)(v->Data()));
957  if (res->data==NULL)
958  {
959     WerrorS("intmat size not compatible");
960     return TRUE;
961  }
962  return jjPLUSMINUS_Gen(res,u,v);
963}
964static BOOLEAN jjMINUS_MA(leftv res, leftv u, leftv v)
965{
966  res->data = (char *)(mpSub((matrix)u->Data() , (matrix)v->Data()));
967  if (res->data==NULL)
968  {
969     WerrorS("matrix size not compatible");
970     return TRUE;
971  }
972  return jjPLUSMINUS_Gen(res,u,v);
973  return FALSE;
974}
975static BOOLEAN jjTIMES_I(leftv res, leftv u, leftv v)
976{
977  int a=(int)(long)u->Data();
978  int b=(int)(long)v->Data();
979  int c=a * b;
980  if ((b!=0) && (c/b !=a))
981    WarnS("int overflow(*), result may be wrong");
982  res->data = (char *)((long)c);
983  if ((u->Next()!=NULL) || (v->Next()!=NULL))
984    return jjOP_REST(res,u,v);
985  return FALSE;
986}
987static BOOLEAN jjTIMES_BI(leftv res, leftv u, leftv v)
988{
989  res->data = (char *)(nlMult( (number)u->Data(), (number)v->Data()));
990  if ((v->next!=NULL) || (u->next!=NULL))
991    return jjOP_REST(res,u,v);
992  return FALSE;
993}
994static BOOLEAN jjTIMES_N(leftv res, leftv u, leftv v)
995{
996  res->data = (char *)(nMult( (number)u->Data(), (number)v->Data()));
997  number n=(number)res->data;
998  nNormalize(n);
999  res->data=(char *)n;
1000  if ((v->next!=NULL) || (u->next!=NULL))
1001    return jjOP_REST(res,u,v);
1002  return FALSE;
1003}
1004static BOOLEAN jjTIMES_P(leftv res, leftv u, leftv v)
1005{
1006  poly a;
1007  poly b;
1008  if (v->next==NULL)
1009  {
1010    a=(poly)u->CopyD(POLY_CMD); // works also for VECTOR_CMD
1011    if (u->next==NULL)
1012    {
1013      b=(poly)v->CopyD(POLY_CMD); // works also for VECTOR_CMD
1014      res->data = (char *)(pMult( a, b));
1015      pNormalize((poly)res->data);
1016      return FALSE;
1017    }
1018    // u->next exists: copy v
1019    b=pCopy((poly)v->Data());
1020    res->data = (char *)(pMult( a, b));
1021    pNormalize((poly)res->data);
1022    return jjOP_REST(res,u,v);
1023  }
1024  // v->next exists: copy u
1025  a=pCopy((poly)u->Data());
1026  b=(poly)v->CopyD(POLY_CMD); // works also for VECTOR_CMD
1027  res->data = (char *)(pMult( a, b));
1028  pNormalize((poly)res->data);
1029  return jjOP_REST(res,u,v);
1030}
1031static BOOLEAN jjTIMES_ID(leftv res, leftv u, leftv v)
1032{
1033  res->data = (char *)idMult((ideal)u->Data(),(ideal)v->Data());
1034  idNormalize((ideal)res->data);
1035  if ((v->next!=NULL) || (u->next!=NULL))
1036    return jjOP_REST(res,u,v);
1037  return FALSE;
1038}
1039static BOOLEAN jjTIMES_IV(leftv res, leftv u, leftv v)
1040{
1041  res->data = (char *)ivMult((intvec*)(u->Data()), (intvec*)(v->Data()));
1042  if (res->data==NULL)
1043  {
1044     WerrorS("intmat size not compatible");
1045     return TRUE;
1046  }
1047  if ((v->next!=NULL) || (u->next!=NULL))
1048    return jjOP_REST(res,u,v);
1049  return FALSE;
1050}
1051static BOOLEAN jjTIMES_MA_P1(leftv res, leftv u, leftv v)
1052{
1053  poly p=(poly)v->CopyD(POLY_CMD);
1054  int r=pMaxComp(p);/* recompute the rank for the case ideal*vector*/
1055  ideal I= (ideal)mpMultP((matrix)u->CopyD(MATRIX_CMD),p);
1056  if (r>0) I->rank=r;
1057  idNormalize(I);
1058  res->data = (char *)I;
1059  return FALSE;
1060}
1061static BOOLEAN jjTIMES_MA_P2(leftv res, leftv u, leftv v)
1062{
1063  return jjTIMES_MA_P1(res,v,u);
1064}
1065static BOOLEAN jjTIMES_MA_N1(leftv res, leftv u, leftv v)
1066{
1067  number n=(number)v->CopyD(NUMBER_CMD);
1068  poly p=pOne();
1069  pSetCoeff(p,n);
1070  res->data = (char *)mpMultP((matrix)u->CopyD(MATRIX_CMD),p);
1071  idNormalize((ideal)res->data);
1072  return FALSE;
1073}
1074static BOOLEAN jjTIMES_MA_N2(leftv res, leftv u, leftv v)
1075{
1076  return jjTIMES_MA_N1(res,v,u);
1077}
1078static BOOLEAN jjTIMES_MA_I1(leftv res, leftv u, leftv v)
1079{
1080  res->data = (char *)mpMultI((matrix)u->CopyD(MATRIX_CMD),(int)(long)v->Data());
1081  idNormalize((ideal)res->data);
1082  return FALSE;
1083}
1084static BOOLEAN jjTIMES_MA_I2(leftv res, leftv u, leftv v)
1085{
1086  return jjTIMES_MA_I1(res,v,u);
1087}
1088static BOOLEAN jjTIMES_MA(leftv res, leftv u, leftv v)
1089{
1090  res->data = (char *)mpMult((matrix)u->Data(),(matrix)v->Data());
1091  if (res->data==NULL)
1092  {
1093     WerrorS("matrix size not compatible");
1094     return TRUE;
1095  }
1096  idNormalize((ideal)res->data);
1097  if ((v->next!=NULL) || (u->next!=NULL))
1098    return jjOP_REST(res,u,v);
1099  return FALSE;
1100}
1101static BOOLEAN jjGE_BI(leftv res, leftv u, leftv v)
1102{
1103  number h=nlSub((number)u->Data(),(number)v->Data());
1104  res->data = (char *) (nlGreaterZero(h)||(nlIsZero(h)));
1105  nlDelete(&h,NULL);
1106  return FALSE;
1107}
1108static BOOLEAN jjGE_I(leftv res, leftv u, leftv v)
1109{
1110  res->data = (char *)((int)((long)u->Data()) >= (int)((long)v->Data()));
1111  return FALSE;
1112}
1113static BOOLEAN jjGE_N(leftv res, leftv u, leftv v)
1114{
1115  number h=nSub((number)u->Data(),(number)v->Data());
1116  res->data = (char *) (nGreaterZero(h)||(nIsZero(h)));
1117  nDelete(&h);
1118  return FALSE;
1119}
1120static BOOLEAN jjGT_BI(leftv res, leftv u, leftv v)
1121{
1122  number h=nlSub((number)u->Data(),(number)v->Data());
1123  res->data = (char *) (nlGreaterZero(h)&&(!nlIsZero(h)));
1124  nlDelete(&h,NULL);
1125  return FALSE;
1126}
1127static BOOLEAN jjGT_I(leftv res, leftv u, leftv v)
1128{
1129  res->data = (char *)((int)((long)u->Data()) > (int)((long)v->Data()));
1130  return FALSE;
1131}
1132static BOOLEAN jjGT_N(leftv res, leftv u, leftv v)
1133{
1134  number h=nSub((number)u->Data(),(number)v->Data());
1135  res->data = (char *) (nGreaterZero(h)&&(!nIsZero(h)));
1136  nDelete(&h);
1137  return FALSE;
1138}
1139static BOOLEAN jjLE_BI(leftv res, leftv u, leftv v)
1140{
1141  return jjGE_BI(res,v,u);
1142}
1143static BOOLEAN jjLE_I(leftv res, leftv u, leftv v)
1144{
1145  res->data = (char *)((int)((long)u->Data()) <= (int)((long)v->Data()));
1146  return FALSE;
1147}
1148static BOOLEAN jjLE_N(leftv res, leftv u, leftv v)
1149{
1150  return jjGE_N(res,v,u);
1151}
1152static BOOLEAN jjLT_BI(leftv res, leftv u, leftv v)
1153{
1154  return jjGT_BI(res,v,u);
1155}
1156static BOOLEAN jjLT_I(leftv res, leftv u, leftv v)
1157{
1158  res->data = (char *)((int)((long)u->Data()) < (int)((long)v->Data()));
1159  return FALSE;
1160}
1161static BOOLEAN jjLT_N(leftv res, leftv u, leftv v)
1162{
1163  return jjGT_N(res,v,u);
1164}
1165static BOOLEAN jjDIVMOD_I(leftv res, leftv u, leftv v)
1166{
1167  int a= (int)(long)u->Data();
1168  int b= (int)(long)v->Data();
1169  if (b==0)
1170  {
1171    WerrorS(ii_div_by_0);
1172    return TRUE;
1173  }
1174  int bb=ABS(b);
1175  int c=a%bb;
1176  if(c<0) c+=bb;
1177  int r=0;
1178  switch (iiOp)
1179  {
1180    case INTMOD_CMD:
1181        r=c;            break;
1182    case '%':
1183        r= (a % b);     break;
1184    case INTDIV_CMD:
1185        r=((a-c) /b);   break;
1186    case '/':
1187        r= (a / b);     break;
1188  }
1189  res->data=(void *)((long)r);
1190  return FALSE;
1191}
1192static BOOLEAN jjDIV_BI(leftv res, leftv u, leftv v)
1193{
1194  number q=(number)v->Data();
1195  if (nlIsZero(q))
1196  {
1197    WerrorS(ii_div_by_0);
1198    return TRUE;
1199  }
1200  q = nlIntDiv((number)u->Data(),q);
1201  nlNormalize(q);
1202  res->data = (char *)q;
1203  return FALSE;
1204}
1205static BOOLEAN jjDIV_N(leftv res, leftv u, leftv v)
1206{
1207  number q=(number)v->Data();
1208  if (nIsZero(q))
1209  {
1210    WerrorS(ii_div_by_0);
1211    return TRUE;
1212  }
1213  q = nDiv((number)u->Data(),q);
1214  nNormalize(q);
1215  res->data = (char *)q;
1216  return FALSE;
1217}
1218static BOOLEAN jjDIV_P(leftv res, leftv u, leftv v)
1219{
1220  poly q=(poly)v->Data();
1221  if (q==NULL)
1222  {
1223    WerrorS(ii_div_by_0);
1224    return TRUE;
1225  }
1226  poly p=(poly)(u->Data());
1227  if (p==NULL)
1228  {
1229    res->data=NULL;
1230    return FALSE;
1231  }
1232  if (pNext(q)!=NULL)
1233  {
1234#ifdef HAVE_FACTORY
1235    if(pGetComp(p)==0)
1236    {
1237      res->data=(void*)(singclap_pdivide(p /*(poly)(u->Data())*/ ,
1238                                         q /*(poly)(v->Data())*/ ));
1239    }
1240    else
1241    {
1242      int comps=pMaxComp(p);
1243      ideal I=idInit(comps,1);
1244      p=pCopy(p);
1245      poly h;
1246      int i;
1247      // conversion to a list of polys:
1248      while (p!=NULL)
1249      {
1250        i=pGetComp(p)-1;
1251        h=pNext(p);
1252        pNext(p)=NULL;
1253        pSetComp(p,0);
1254        I->m[i]=pAdd(I->m[i],p);
1255        p=h;
1256      }
1257      // division and conversion to vector:
1258      h=NULL;
1259      p=NULL;
1260      for(i=comps-1;i>=0;i--)
1261      {
1262        if (I->m[i]!=NULL)
1263        {
1264          h=singclap_pdivide(I->m[i],q);
1265          pSetCompP(h,i+1);
1266          p=pAdd(p,h);
1267        }
1268      }
1269      idDelete(&I);
1270      res->data=(void *)p;
1271    }
1272#else /* HAVE_FACTORY */
1273    WerrorS("division only by a monomial");
1274    return TRUE;
1275#endif /* HAVE_FACTORY */
1276  }
1277  else
1278  {
1279    res->data = (char *)pDivideM(pCopy(p),pHead(q));
1280  }
1281  pNormalize((poly)res->data);
1282  return FALSE;
1283}
1284static BOOLEAN jjDIV_Ma(leftv res, leftv u, leftv v)
1285{
1286  poly q=(poly)v->Data();
1287  if (q==NULL)
1288  {
1289    WerrorS(ii_div_by_0);
1290    return TRUE;
1291  }
1292  matrix m=(matrix)(u->Data());
1293  int r=m->rows();
1294  int c=m->cols();
1295  matrix mm=mpNew(r,c);
1296  int i,j;
1297  for(i=r;i>0;i--)
1298  {
1299    for(j=c;j>0;j--)
1300    {
1301      if (pNext(q)!=NULL)
1302      {
1303      #ifdef HAVE_FACTORY
1304        MATELEM(mm,i,j) = singclap_pdivide( MATELEM(m,i,j) ,
1305                                           q /*(poly)(v->Data())*/ );
1306#else /* HAVE_FACTORY */
1307        WerrorS("division only by a monomial");
1308        return TRUE;
1309#endif /* HAVE_FACTORY */
1310      }
1311      else
1312        MATELEM(mm,i,j) = pDivideM(pCopy(MATELEM(m,i,j)),pHead(q));
1313    }
1314  }
1315  idNormalize((ideal)mm);
1316  res->data=(char *)mm;
1317  return FALSE;
1318}
1319static BOOLEAN jjEQUAL_BI(leftv res, leftv u, leftv v)
1320{
1321  res->data = (char *)((long)nlEqual((number)u->Data(),(number)v->Data()));
1322  jjEQUAL_REST(res,u,v);
1323  return FALSE;
1324}
1325static BOOLEAN jjEQUAL_I(leftv res, leftv u, leftv v)
1326{
1327  res->data = (char *)((int)((long)u->Data()) == (int)((long)v->Data()));
1328  jjEQUAL_REST(res,u,v);
1329  return FALSE;
1330}
1331static BOOLEAN jjEQUAL_Ma(leftv res, leftv u, leftv v)
1332{
1333  res->data = (char *)((long)mpEqual((matrix)u->Data(),(matrix)v->Data()));
1334  jjEQUAL_REST(res,u,v);
1335  return FALSE;
1336}
1337static BOOLEAN jjEQUAL_N(leftv res, leftv u, leftv v)
1338{
1339  res->data = (char *)((long)nEqual((number)u->Data(),(number)v->Data()));
1340  jjEQUAL_REST(res,u,v);
1341  return FALSE;
1342}
1343static BOOLEAN jjEQUAL_P(leftv res, leftv u, leftv v)
1344{
1345  poly p=(poly)u->Data();
1346  poly q=(poly)v->Data();
1347  res->data = (char *) ((long)pEqualPolys(p,q));
1348  jjEQUAL_REST(res,u,v);
1349  return FALSE;
1350}
1351static void jjEQUAL_REST(leftv res,leftv u,leftv v)
1352{
1353  if ((res->data) && (u->next!=NULL) && (v->next!=NULL))
1354  {
1355    int save_iiOp=iiOp;
1356    if (iiOp==NOTEQUAL)
1357      iiExprArith2(res,u->next,EQUAL_EQUAL,v->next);
1358    else
1359      iiExprArith2(res,u->next,iiOp,v->next);
1360    iiOp=save_iiOp;
1361  }
1362  if (iiOp==NOTEQUAL) res->data=(char *)(!(long)res->data);
1363}
1364static BOOLEAN jjAND_I(leftv res, leftv u, leftv v)
1365{
1366  res->data = (char *)((long)u->Data() && (long)v->Data());
1367  return FALSE;
1368}
1369static BOOLEAN jjOR_I(leftv res, leftv u, leftv v)
1370{
1371  res->data = (char *)((long)u->Data() || (long)v->Data());
1372  return FALSE;
1373}
1374static BOOLEAN jjINDEX_I(leftv res, leftv u, leftv v)
1375{
1376  res->rtyp=u->rtyp; u->rtyp=0;
1377  res->data=u->data; u->data=NULL;
1378  res->name=u->name; u->name=NULL;
1379  res->attribute=u->attribute; u->attribute=NULL;
1380  res->e=u->e;       u->e=NULL;
1381  if (res->e==NULL) res->e=jjMakeSub(v);
1382  else
1383  {
1384    Subexpr sh=res->e;
1385    while (sh->next != NULL) sh=sh->next;
1386    sh->next=jjMakeSub(v);
1387  }
1388  return FALSE;
1389}
1390static BOOLEAN jjINDEX_IV(leftv res, leftv u, leftv v)
1391{
1392  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
1393  {
1394    WerrorS("indexed object must have a name");
1395    return TRUE;
1396  }
1397  intvec * iv=(intvec *)v->Data();
1398  leftv p=NULL;
1399  int i;
1400  sleftv t;
1401  memset(&t,0,sizeof(t));
1402  t.rtyp=INT_CMD;
1403  for (i=0;i<iv->length(); i++)
1404  {
1405    t.data=(char *)((long)(*iv)[i]);
1406    if (p==NULL)
1407    {
1408      p=res;
1409    }
1410    else
1411    {
1412      p->next=(leftv)omAlloc0Bin(sleftv_bin);
1413      p=p->next;
1414    }
1415    p->rtyp=IDHDL;
1416    p->data=u->data;
1417    p->name=u->name;
1418    p->flag=u->flag;
1419    p->attribute=u->attribute;
1420    p->e=jjMakeSub(&t);
1421  }
1422  u->rtyp=0;
1423  u->data=NULL;
1424  u->name=NULL;
1425  return FALSE;
1426}
1427static BOOLEAN jjINDEX_P(leftv res, leftv u, leftv v)
1428{
1429  poly p=(poly)u->Data();
1430  int i=(int)(long)v->Data();
1431  int j=0;
1432  while (p!=NULL)
1433  {
1434    j++;
1435    if (j==i)
1436    {
1437      res->data=(char *)pHead(p);
1438      return FALSE;
1439    }
1440    pIter(p);
1441  }
1442  return FALSE;
1443}
1444static BOOLEAN jjINDEX_P_IV(leftv res, leftv u, leftv v)
1445{
1446  poly p=(poly)u->Data();
1447  poly r=NULL;
1448  intvec *iv=(intvec *)v->CopyD(INTVEC_CMD);
1449  int i;
1450  int sum=0;
1451  for(i=iv->length()-1;i>=0;i--)
1452    sum+=(*iv)[i];
1453  int j=0;
1454  while ((p!=NULL) && (sum>0))
1455  {
1456    j++;
1457    for(i=iv->length()-1;i>=0;i--)
1458    {
1459      if (j==(*iv)[i])
1460      {
1461        r=pAdd(r,pHead(p));
1462        sum-=j;
1463        (*iv)[i]=0;
1464        break;
1465      }
1466    }
1467    pIter(p);
1468  }
1469  delete iv;
1470  res->data=(char *)r;
1471  return FALSE;
1472}
1473static BOOLEAN jjINDEX_V(leftv res, leftv u, leftv v)
1474{
1475  poly p=(poly)u->CopyD(VECTOR_CMD);
1476  poly r=p; // pointer to the beginning of component i
1477  poly o=NULL;
1478  int i=(int)(long)v->Data();
1479  while (p!=NULL)
1480  {
1481    if (pGetComp(p)!=i)
1482    {
1483      if (r==p) r=pNext(p);
1484      if (o!=NULL)
1485      {
1486        pDeleteLm(&pNext(o));
1487        p=pNext(o);
1488      }
1489      else
1490        pDeleteLm(&p);
1491    }
1492    else
1493    {
1494      pSetComp(p, 0);
1495      o=p;
1496      p=pNext(o);
1497    }
1498  }
1499  res->data=(char *)r;
1500  return FALSE;
1501}
1502static BOOLEAN jjINDEX_V_IV(leftv res, leftv u, leftv v)
1503{
1504  poly p=(poly)u->CopyD(VECTOR_CMD);
1505  if (p!=NULL)
1506  {
1507    poly r=pOne();
1508    poly hp=r;
1509    intvec *iv=(intvec *)v->Data();
1510    int i;
1511    loop
1512    {
1513      for(i=0;i<iv->length();i++)
1514      {
1515        if (pGetComp(p)==(*iv)[i])
1516        {
1517          poly h;
1518          pSplit(p,&h);
1519          pNext(hp)=p;
1520          p=h;
1521          pIter(hp);
1522          break;
1523        }
1524      }
1525      if (p==NULL) break;
1526      if (i==iv->length())
1527      {
1528        pDeleteLm(&p);
1529        if (p==NULL) break;
1530      }
1531    }
1532    pDeleteLm(&r);
1533    res->data=(char *)r;
1534  }
1535  return FALSE;
1536}
1537static BOOLEAN jjKLAMMER_rest(leftv res, leftv u, leftv v);
1538static BOOLEAN jjKLAMMER(leftv res, leftv u, leftv v)
1539{
1540  if(u->name==NULL) return TRUE;
1541  char * nn = (char *)omAlloc(strlen(u->name) + 14);
1542  sprintf(nn,"%s(%d)",u->name,(int)(long)v->Data());
1543  omFree((ADDRESS)u->name);
1544  u->name=NULL;
1545  char *n=omStrDup(nn);
1546  omFree((ADDRESS)nn);
1547  syMake(res,n);
1548  if (u->next!=NULL) return jjKLAMMER_rest(res,u->next,v);
1549  return FALSE;
1550}
1551static BOOLEAN jjKLAMMER_IV(leftv res, leftv u, leftv v)
1552{
1553  intvec * iv=(intvec *)v->Data();
1554  leftv p=NULL;
1555  int i;
1556  long slen = strlen(u->name) + 14;
1557  char *n = (char*) omAlloc(slen);
1558
1559  for (i=0;i<iv->length(); i++)
1560  {
1561    if (p==NULL)
1562    {
1563      p=res;
1564    }
1565    else
1566    {
1567      p->next=(leftv)omAlloc0Bin(sleftv_bin);
1568      p=p->next;
1569    }
1570    sprintf(n,"%s(%d)",u->name,(*iv)[i]);
1571    syMake(p,omStrDup(n));
1572  }
1573  omFree((ADDRESS)u->name);
1574  u->name = NULL;
1575  omFreeSize(n, slen);
1576  if (u->next!=NULL) return jjKLAMMER_rest(res,u->next,v);
1577  return FALSE;
1578}
1579static BOOLEAN jjKLAMMER_rest(leftv res, leftv u, leftv v)
1580{
1581  leftv tmp=(leftv)omAllocBin(sleftv_bin);
1582  memset(tmp,0,sizeof(sleftv));
1583  BOOLEAN b;
1584  if (v->Typ()==INTVEC_CMD)
1585    b=jjKLAMMER_IV(tmp,u,v);
1586  else
1587    b=jjKLAMMER(tmp,u,v);
1588  if (b)
1589  {
1590    omFreeBin(tmp,sleftv_bin);
1591    return TRUE;
1592  }
1593  leftv h=res;
1594  while (h->next!=NULL) h=h->next;
1595  h->next=tmp;
1596  return FALSE;
1597}
1598BOOLEAN jjPROC(leftv res, leftv u, leftv v)
1599{
1600  void *d;
1601  Subexpr e;
1602  int typ;
1603  BOOLEAN t=FALSE;
1604  if (u->rtyp!=IDHDL)
1605  {
1606    idrec tmp_proc;
1607    tmp_proc.id="_auto";
1608    tmp_proc.typ=PROC_CMD;
1609    tmp_proc.data.pinf=(procinfo *)u->Data();
1610    tmp_proc.ref=1;
1611    d=u->data; u->data=(void *)&tmp_proc;
1612    e=u->e; u->e=NULL;
1613    t=TRUE;
1614    typ=u->rtyp; u->rtyp=IDHDL;
1615  }
1616#ifdef HAVE_NS
1617  leftv sl;
1618  if (u->req_packhdl==currPack)
1619    sl = iiMake_proc((idhdl)u->data,NULL,v);
1620  else
1621    sl = iiMake_proc((idhdl)u->data,u->req_packhdl,v);
1622#else /* HAVE_NS */
1623  leftv sl = iiMake_proc((idhdl)u->data,v);
1624#endif /* HAVE_NS */
1625  if (t)
1626  {
1627    u->rtyp=typ;
1628    u->data=d;
1629    u->e=e;
1630  }
1631  if (sl==NULL)
1632  {
1633    return TRUE;
1634  }
1635  else
1636  {
1637    memcpy(res,sl,sizeof(sleftv));
1638  }
1639  return FALSE;
1640}
1641static BOOLEAN jjMAP(leftv res, leftv u, leftv v)
1642{
1643  //Print("try to map %s with %s\n",$3.Name(),$1.Name());
1644  leftv sl=NULL;
1645  if ((v->e==NULL)&&(v->name!=NULL))
1646  {
1647    map m=(map)u->Data();
1648    sl=iiMap(m,v->name);
1649  }
1650  else
1651  {
1652    Werror("%s(<name>) expected",u->Name());
1653  }
1654  if (sl==NULL) return TRUE;
1655  memcpy(res,sl,sizeof(sleftv));
1656  omFreeBin((ADDRESS)sl, sleftv_bin);
1657  return FALSE;
1658}
1659static BOOLEAN jjCALL2MANY(leftv res, leftv u, leftv v)
1660{
1661  u->next=(leftv)omAllocBin(sleftv_bin);
1662  memcpy(u->next,v,sizeof(sleftv));
1663  BOOLEAN r=iiExprArithM(res,u,iiOp);
1664  v->Init();
1665  // iiExprArithM did the CleanUp
1666  return r;
1667}
1668static BOOLEAN jjCHINREM_BI(leftv res, leftv u, leftv v)
1669{
1670  intvec *c=(intvec*)u->Data();
1671  intvec* p=(intvec*)v->Data();
1672  int rl=p->length();
1673  number *x=(number *)omAlloc(rl*sizeof(number));
1674  number *q=(number *)omAlloc(rl*sizeof(number));
1675  int i;
1676  for(i=rl-1;i>=0;i--)
1677  {
1678    q[i]=nlInit((*p)[i]);
1679    x[i]=nlInit((*c)[i]);
1680  }
1681  number n=nlChineseRemainder(x,q,rl);
1682  for(i=rl-1;i>=0;i--)
1683  {
1684    nlDelete(&(q[i]),currRing);
1685    nlDelete(&(x[i]),currRing);
1686  }
1687  omFree(x); omFree(q);
1688  res->data=(char *)n;
1689  return FALSE;
1690}
1691#if 0
1692static BOOLEAN jjCHINREM_P(leftv res, leftv u, leftv v)
1693{
1694  lists c=(lists)u->CopyD(); // list of poly
1695  intvec* p=(intvec*)v->Data();
1696  int rl=p->length();
1697  poly r=NULL,h, result=NULL;
1698  number *x=(number *)omAlloc(rl*sizeof(number));
1699  number *q=(number *)omAlloc(rl*sizeof(number));
1700  int i;
1701  for(i=rl-1;i>=0;i--)
1702  {
1703    q[i]=nlInit((*p)[i]);
1704  }
1705  loop
1706  {
1707    for(i=rl-1;i>=0;i--)
1708    {
1709      if (c->m[i].Typ()!=POLY_CMD)
1710      {
1711        Werror("poly expected at pos %d",i+1);
1712        for(i=rl-1;i>=0;i--)
1713        {
1714          nlDelete(&(q[i]),currRing);
1715        }
1716        omFree(x); omFree(q); // delete c
1717        return TRUE;
1718      }
1719      h=((poly)c->m[i].Data());
1720      if (r==NULL) r=h;
1721      else if (pLmCmp(r,h)==-1) r=h;
1722    }
1723    if (r==NULL) break;
1724    for(i=rl-1;i>=0;i--)
1725    {
1726      h=((poly)c->m[i].Data());
1727      if (pLmCmp(r,h)==0)
1728      {
1729        x[i]=pGetCoeff(h);
1730        h=pLmFreeAndNext(h);
1731        c->m[i].data=(char*)h;
1732      }
1733      else
1734        x[i]=nlInit(0);
1735    }
1736    number n=nlChineseRemainder(x,q,rl);
1737    for(i=rl-1;i>=0;i--)
1738    {
1739      nlDelete(&(x[i]),currRing);
1740    }
1741    h=pHead(r);
1742    pSetCoeff(h,n);
1743    result=pAdd(result,h);
1744  }
1745  for(i=rl-1;i>=0;i--)
1746  {
1747    nlDelete(&(q[i]),currRing);
1748  }
1749  omFree(x); omFree(q);
1750  res->data=(char *)result;
1751  return FALSE;
1752}
1753#endif
1754static BOOLEAN jjCHINREM_ID(leftv res, leftv u, leftv v)
1755{
1756  lists c=(lists)u->CopyD(); // list of ideal
1757  intvec* p=(intvec*)v->Data();
1758  int rl=p->length();
1759  poly r=NULL,h;
1760  ideal result;
1761  ideal *x=(ideal *)omAlloc(rl*sizeof(ideal));
1762  int i;
1763  for(i=rl-1;i>=0;i--)
1764  {
1765    if (c->m[i].Typ()!=IDEAL_CMD)
1766    {
1767      Werror("ideal expected at pos %d",i+1);
1768      omFree(x); // delete c
1769      return TRUE;
1770    }
1771    x[i]=((ideal)c->m[i].Data());
1772  }
1773  number *q=(number *)omAlloc(rl*sizeof(number));
1774  for(i=rl-1;i>=0;i--)
1775  {
1776    q[i]=nlInit((*p)[i]);
1777  }
1778  result=idChineseRemainder(x,q,rl);
1779  for(i=rl-1;i>=0;i--)
1780  {
1781    nlDelete(&(q[i]),currRing);
1782  }
1783  omFree(q);
1784  res->data=(char *)result;
1785  return FALSE;
1786}
1787static BOOLEAN jjCOEF(leftv res, leftv u, leftv v)
1788{
1789  poly p=(poly)v->Data();
1790  if ((p==NULL)||(pNext(p)!=NULL)) return TRUE;
1791  res->data=(char *)mpCoeffProc((poly)u->Data(),p /*(poly)v->Data()*/);
1792  return FALSE;
1793}
1794static BOOLEAN jjCOEFFS_Id(leftv res, leftv u, leftv v)
1795{
1796  int i=pVar((poly)v->Data());
1797  if (i==0)
1798  {
1799    WerrorS("ringvar expected");
1800    return TRUE;
1801  }
1802  res->data=(char *)mpCoeffs((ideal)u->CopyD(),i);
1803  return FALSE;
1804}
1805static BOOLEAN jjCOEFFS2_KB(leftv res, leftv u, leftv v)
1806{
1807  poly p = pInit();
1808  int i;
1809  for (i=1; i<=pVariables; i++)
1810  {
1811    pSetExp(p, i, 1);
1812  }
1813  pSetm(p);
1814  res->data = (void*)idCoeffOfKBase((ideal)(u->Data()),
1815                                    (ideal)(v->Data()), p);
1816  pDelete(&p);
1817  return FALSE;
1818}
1819static BOOLEAN jjCONTRACT(leftv res, leftv u, leftv v)
1820{
1821  res->data=(char *)idDiffOp((ideal)u->Data(),(ideal)v->Data(),FALSE);
1822  return FALSE;
1823}
1824static BOOLEAN jjDEG_M_IV(leftv res, leftv u, leftv v)
1825{
1826  short *iv=iv2array((intvec *)v->Data());
1827  ideal I=(ideal)u->Data();
1828  int d=-1;
1829  int i;
1830  for(i=IDELEMS(I);i>=0;i--) d=si_max(d,(int)pDegW(I->m[i],iv));
1831  omFreeSize((ADDRESS)iv,(pVariables+1)*sizeof(short));
1832  res->data = (char *)((long)d);
1833  return FALSE;
1834}
1835static BOOLEAN jjDEG_IV(leftv res, leftv u, leftv v)
1836{
1837  short *iv=iv2array((intvec *)v->Data());
1838  res->data = (char *)pDegW((poly)u->Data(),iv);
1839  omFreeSize((ADDRESS)iv,(pVariables+1)*sizeof(short));
1840  return FALSE;
1841}
1842static BOOLEAN jjDIFF_P(leftv res, leftv u, leftv v)
1843{
1844  int i=pVar((poly)v->Data());
1845  if (i==0)
1846  {
1847    WerrorS("ringvar expected");
1848    return TRUE;
1849  }
1850  res->data=(char *)pDiff((poly)(u->Data()),i);
1851  return FALSE;
1852}
1853static BOOLEAN jjDIFF_ID(leftv res, leftv u, leftv v)
1854{
1855  int i=pVar((poly)v->Data());
1856  if (i==0)
1857  {
1858    WerrorS("ringvar expected");
1859    return TRUE;
1860  }
1861  res->data=(char *)idDiff((matrix)(u->Data()),i);
1862  return FALSE;
1863}
1864static BOOLEAN jjDIFF_ID_ID(leftv res, leftv u, leftv v)
1865{
1866  res->data=(char *)idDiffOp((ideal)u->Data(),(ideal)v->Data());
1867  return FALSE;
1868}
1869static BOOLEAN jjDIM2(leftv res, leftv v, leftv w)
1870{
1871  assumeStdFlag(v);
1872  if(currQuotient==NULL)
1873    res->data = (char *)((long)scDimInt((ideal)(v->Data()),(ideal)w->Data()));
1874  else
1875  {
1876    ideal q=idSimpleAdd(currQuotient,(ideal)w->Data());
1877    res->data = (char *)((long)scDimInt((ideal)(v->Data()),q));
1878    idDelete(&q);
1879  }
1880  return FALSE;
1881}
1882static BOOLEAN jjDIVISION(leftv res, leftv u, leftv v)
1883{
1884  ideal vi=(ideal)v->Data();
1885  int vl= IDELEMS(vi);
1886  ideal ui=(ideal)u->Data();
1887  int ul= IDELEMS(ui);
1888  ideal R; matrix U;
1889  ideal m = idLift(vi,ui,&R, FALSE,hasFlag(v,FLAG_STD),TRUE,&U);
1890  // now make sure that all matices have the corect size:
1891  matrix T = idModule2formatedMatrix(m,vl,ul);
1892  if (MATCOLS(U) != ul)
1893  {
1894    int mul=si_min(ul,MATCOLS(U));
1895    matrix UU=mpNew(ul,ul);
1896    int i,j;
1897    for(i=mul;i>0;i--)
1898    {
1899      for(j=mul;j>0;j--)
1900      {
1901        MATELEM(UU,i,j)=MATELEM(U,i,j);
1902        MATELEM(U,i,j)=NULL;
1903      }
1904    }
1905    idDelete((ideal *)&U);
1906    U=UU;
1907  }
1908  lists L=(lists)omAllocBin(slists_bin);
1909  L->Init(3);
1910  L->m[0].rtyp=MATRIX_CMD;   L->m[0].data=(void *)T;
1911  L->m[1].rtyp=u->Typ();     L->m[1].data=(void *)R;
1912  L->m[2].rtyp=MATRIX_CMD;   L->m[2].data=(void *)U;
1913  res->data=(char *)L;
1914  return FALSE;
1915}
1916static BOOLEAN jjELIMIN(leftv res, leftv u, leftv v)
1917{
1918  res->data=(char *)idElimination((ideal)u->Data(),(poly)v->Data());
1919  setFlag(res,FLAG_STD);
1920  return FALSE;
1921}
1922static BOOLEAN jjEXPORTTO(leftv res, leftv u, leftv v)
1923{
1924#ifdef HAVE_NS
1925  //Print("exportto %s -> %s\n",v->Name(),u->Name() );
1926  return iiExport(v,0,(idhdl)u->data);
1927#else /* HAVE_NS */
1928  return TRUE;
1929#endif /* HAVE_NS */
1930}
1931static BOOLEAN jjERROR(leftv res, leftv u)
1932{
1933  WerrorS((char *)u->Data());
1934  return TRUE;
1935}
1936static BOOLEAN jjEXTGCD_I(leftv res, leftv u, leftv v)
1937{
1938  int uu=(int)(long)u->Data();int vv=(int)(long)v->Data();
1939  int p0=ABS(uu),p1=ABS(vv);
1940  int f0 = 1, f1 = 0, g0 = 0, g1 = 1, q, r;
1941
1942  while ( p1!=0 )
1943  {
1944    q=p0 / p1;
1945    r=p0 % p1;
1946    p0 = p1; p1 = r;
1947    r = g0 - g1 * q;
1948    g0 = g1; g1 = r;
1949    r = f0 - f1 * q;
1950    f0 = f1; f1 = r;
1951  }
1952  int a = f0;
1953  int b = g0;
1954  if ( uu /*(int)(long)u->Data()*/ < 0 ) a=-a;
1955  if ( vv /*(int)(long)v->Data()*/ < 0 ) b=-b;
1956  lists L=(lists)omAllocBin(slists_bin);
1957  L->Init(3);
1958  L->m[0].rtyp=INT_CMD;   L->m[0].data=(void *)(long)p0;
1959  L->m[1].rtyp=INT_CMD;   L->m[1].data=(void *)(long)a;
1960  L->m[2].rtyp=INT_CMD;   L->m[2].data=(void *)(long)b;
1961  res->rtyp=LIST_CMD;
1962  res->data=(char *)L;
1963  return FALSE;
1964}
1965#ifdef HAVE_FACTORY
1966static BOOLEAN jjEXTGCD_P(leftv res, leftv u, leftv v)
1967{
1968  poly r,pa,pb;
1969  BOOLEAN ret=singclap_extgcd((poly)u->Data(),(poly)v->Data(),r,pa,pb);
1970  if (ret) return TRUE;
1971  lists L=(lists)omAllocBin(slists_bin);
1972  L->Init(3);
1973  res->data=(char *)L;
1974  L->m[0].data=(void *)r;
1975  L->m[0].rtyp=POLY_CMD;
1976  L->m[1].data=(void *)pa;
1977  L->m[1].rtyp=POLY_CMD;
1978  L->m[2].data=(void *)pb;
1979  L->m[2].rtyp=POLY_CMD;
1980  return FALSE;
1981}
1982static BOOLEAN jjFACSTD2(leftv res, leftv v, leftv w)
1983{
1984  ideal_list p,h;
1985  h=kStdfac((ideal)v->Data(),NULL,testHomog,NULL,(ideal)w->Data());
1986  p=h;
1987  int l=0;
1988  while (p!=NULL) { p=p->next;l++; }
1989  lists L=(lists)omAllocBin(slists_bin);
1990  L->Init(l);
1991  l=0;
1992  while(h!=NULL)
1993  {
1994    L->m[l].data=(char *)h->d;
1995    L->m[l].rtyp=IDEAL_CMD;
1996    p=h->next;
1997    omFreeSize(h,sizeof(*h));
1998    h=p;
1999    l++;
2000  }
2001  res->data=(void *)L;
2002  return FALSE;
2003}
2004#endif /* HAVE_FACTORY */
2005static BOOLEAN jjFETCH(leftv res, leftv u, leftv v)
2006{
2007  ring r=(ring)u->Data();
2008  idhdl w;
2009  int op=iiOp;
2010  nMapFunc nMap;
2011
2012  if ((w=r->idroot->get(v->Name(),myynest))!=NULL)
2013  {
2014    int *perm=NULL;
2015    int *par_perm=NULL;
2016    int par_perm_size=0;
2017    BOOLEAN bo;
2018    //if (!nSetMap(rInternalChar(r),r->parameter,rPar(r),r->minpoly))
2019    if ((nMap=nSetMap(r))==NULL)
2020    {
2021      if (rEqual(r,currRing))
2022      {
2023        nMap=nCopy;
2024      }
2025      else
2026      // Allow imap/fetch to be make an exception only for:
2027      if ( (rField_is_Q_a(r) &&  // Q(a..) -> Q(a..) || Q || Zp || Zp(a)
2028            (rField_is_Q() || rField_is_Q_a() ||
2029             (rField_is_Zp() || rField_is_Zp_a())))
2030           ||
2031           (rField_is_Zp_a(r) &&  // Zp(a..) -> Zp(a..) || Zp
2032            (rField_is_Zp(currRing, rInternalChar(r)) ||
2033             rField_is_Zp_a(currRing, rInternalChar(r)))) )
2034      {
2035        par_perm_size=rPar(r);
2036        BITSET save_test=test;
2037        naSetChar(rInternalChar(r),r);
2038        nSetChar(currRing);
2039        test=save_test;
2040      }
2041      else
2042      {
2043        goto err_fetch;
2044      }
2045    }
2046    if ((iiOp!=FETCH_CMD) || (r->N!=pVariables) || (rPar(r)!=rPar(currRing)))
2047    {
2048      perm=(int *)omAlloc0((r->N+1)*sizeof(int));
2049      if (par_perm_size!=0)
2050        par_perm=(int *)omAlloc0(par_perm_size*sizeof(int));
2051      op=IMAP_CMD;
2052      if (iiOp==IMAP_CMD)
2053      {
2054        maFindPerm(r->names,       r->N,       r->parameter,        r->P,
2055                   currRing->names,currRing->N,currRing->parameter, currRing->P,
2056                   perm,par_perm, currRing->ch);
2057      }
2058      else
2059      {
2060        int i;
2061        if (par_perm_size!=0)
2062          for(i=si_min(rPar(r),rPar(currRing))-1;i>=0;i--) par_perm[i]=-(i+1);
2063        for(i=si_min(r->N,pVariables);i>0;i--) perm[i]=i;
2064      }
2065    }
2066    if ((iiOp==FETCH_CMD) &&(BVERBOSE(V_IMAP)))
2067    {
2068      int i;
2069      for(i=0;i<si_min(r->N,pVariables);i++)
2070      {
2071        Print("// var nr %d: %s -> %s\n",i,r->names[i],currRing->names[i]);
2072      }
2073      for(i=0;i<si_min(rPar(r),rPar(currRing));i++) // possibly empty loop
2074      {
2075        Print("// par nr %d: %s -> %s\n",
2076              i,r->parameter[i],currRing->parameter[i]);
2077      }
2078    }
2079    sleftv tmpW;
2080    memset(&tmpW,0,sizeof(sleftv));
2081    tmpW.rtyp=IDTYP(w);
2082    tmpW.data=IDDATA(w);
2083    if ((bo=maApplyFetch(op,NULL,res,&tmpW, r,
2084                         perm,par_perm,par_perm_size,nMap)))
2085    {
2086      Werror("cannot map %s of type %s(%d)",v->name, Tok2Cmdname(w->typ),w->typ);
2087    }
2088    if (perm!=NULL)
2089      omFreeSize((ADDRESS)perm,(r->N+1)*sizeof(int));
2090    if (par_perm!=NULL)
2091      omFreeSize((ADDRESS)par_perm,par_perm_size*sizeof(int));
2092    return bo;
2093  }
2094  else
2095  {
2096    Werror("identifier %s not found in %s",v->Fullname(),u->Fullname());
2097  }
2098  return TRUE;
2099err_fetch:
2100  Werror("no identity map from %s",u->Fullname());
2101  return TRUE;
2102}
2103static BOOLEAN jjFIND2(leftv res, leftv u, leftv v)
2104{
2105  /*4
2106  * look for the substring what in the string where
2107  * return the position of the first char of what in where
2108  * or 0
2109  */
2110  char *where=(char *)u->Data();
2111  char *what=(char *)v->Data();
2112  char *found = strstr(where,what);
2113  if (found != NULL)
2114  {
2115    res->data=(char *)((found-where)+1);
2116  }
2117  /*else res->data=NULL;*/
2118  return FALSE;
2119}
2120static BOOLEAN jjFWALK(leftv res, leftv u, leftv v)
2121{
2122  res->data=(char *)fractalWalkProc(u,v);
2123  setFlag( res, FLAG_STD );
2124  return FALSE;
2125}
2126static BOOLEAN jjGCD_I(leftv res, leftv u, leftv v)
2127{
2128  int uu=(int)(long)u->Data();int vv=(int)(long)v->Data();
2129  int p0=ABS(uu),p1=ABS(vv);
2130  int r;
2131  while ( p1!=0 )
2132  {
2133    r=p0 % p1;
2134    p0 = p1; p1 = r;
2135  }
2136  res->rtyp=INT_CMD;
2137  res->data=(char *)(long)p0;
2138  return FALSE;
2139}
2140static BOOLEAN jjGCD_BI(leftv res, leftv u, leftv v)
2141{
2142  number a=(number) u->Data();
2143  number b=(number) v->Data();
2144  if (nlIsZero(a))
2145  {
2146    if (nlIsZero(b)) res->data=(char *)nlInit(1);
2147    else             res->data=(char *)nlCopy(b);
2148  }
2149  else
2150  {
2151    if (nlIsZero(b))  res->data=(char *)nlCopy(a);
2152    else res->data=(char *)nlGcd(a, b, NULL);
2153  }
2154  return FALSE;
2155}
2156static BOOLEAN jjGCD_N(leftv res, leftv u, leftv v)
2157{
2158  number a=(number) u->Data();
2159  number b=(number) v->Data();
2160  if (nIsZero(a))
2161  {
2162    if (nIsZero(b)) res->data=(char *)nInit(1);
2163    else            res->data=(char *)nCopy(b);
2164  }
2165  else
2166  {
2167    if (nIsZero(b))  res->data=(char *)nCopy(a);
2168    else res->data=(char *)nGcd(a, b, currRing);
2169  }
2170  return FALSE;
2171}
2172#ifdef HAVE_FACTORY
2173static BOOLEAN jjGCD_P(leftv res, leftv u, leftv v)
2174{
2175  res->data=(void *)singclap_gcd((poly)(u->CopyD(POLY_CMD)),
2176                                 (poly)(v->CopyD(POLY_CMD)));
2177  return FALSE;
2178}
2179#endif /* HAVE_FACTORY */
2180static BOOLEAN jjHILBERT2(leftv res, leftv u, leftv v)
2181{
2182  assumeStdFlag(u);
2183  intvec *module_w=(intvec*)atGet(u,"isHomog",INTVEC_CMD);
2184  intvec *iv=hFirstSeries((ideal)u->Data(),module_w,currQuotient);
2185  switch((int)(long)v->Data())
2186  {
2187    case 1:
2188      res->data=(void *)iv;
2189      return FALSE;
2190    case 2:
2191      res->data=(void *)hSecondSeries(iv);
2192      delete iv;
2193      return FALSE;
2194  }
2195  WerrorS(feNotImplemented);
2196  delete iv;
2197  return TRUE;
2198}
2199static BOOLEAN jjHOMOG_P(leftv res, leftv u, leftv v)
2200{
2201  int i=pVar((poly)v->Data());
2202  if (i==0)
2203  {
2204    WerrorS("ringvar expected");
2205    return TRUE;
2206  }
2207  poly p=pOne(); pSetExp(p,i,1); pSetm(p);
2208  int d=pWTotaldegree(p);
2209  pLmDelete(p);
2210  if (d==1)
2211    res->data = (char *)pHomogen((poly)u->Data(),i);
2212  else
2213    WerrorS("variable must have weight 1");
2214  return (d!=1);
2215}
2216static BOOLEAN jjHOMOG_ID(leftv res, leftv u, leftv v)
2217{
2218  int i=pVar((poly)v->Data());
2219  if (i==0)
2220  {
2221    WerrorS("ringvar expected");
2222    return TRUE;
2223  }
2224  poly p=pOne(); pSetExp(p,i,1); pSetm(p);
2225  int d=pWTotaldegree(p);
2226  pLmDelete(p);
2227  if (d==1)
2228    res->data = (char *)idHomogen((ideal)u->Data(),i);
2229  else
2230    WerrorS("variable must have weight 1");
2231  return (d!=1);
2232}
2233static BOOLEAN jjINDEPSET2(leftv res, leftv u, leftv v)
2234{
2235  assumeStdFlag(u);
2236  res->data=(void *)scIndIndset((ideal)(u->Data()),(int)(long)(v->Data()),
2237                    currQuotient);
2238  return FALSE;
2239}
2240static BOOLEAN jjINTERSECT(leftv res, leftv u, leftv v)
2241{
2242  res->data=(char *)idSect((ideal)u->Data(),(ideal)v->Data());
2243  setFlag(res,FLAG_STD);
2244  return FALSE;
2245}
2246static BOOLEAN jjJanetBasis2(leftv res, leftv u, leftv v)
2247{
2248  return jjStdJanetBasis(res,u,(int)(long)v->Data());
2249}
2250static BOOLEAN jjJET_P(leftv res, leftv u, leftv v)
2251{
2252  res->data = (char *)pJet((poly)u->CopyD(), (int)(long)v->Data());
2253  return FALSE;
2254}
2255static BOOLEAN jjJET_ID(leftv res, leftv u, leftv v)
2256{
2257  res->data = (char *)idJet((ideal)u->Data(),(int)(long)v->Data());
2258  return FALSE;
2259}
2260static BOOLEAN jjKBASE2(leftv res, leftv u, leftv v)
2261{
2262  assumeStdFlag(u);
2263  res->data = (char *)scKBase((int)(long)v->Data(),
2264                              (ideal)(u->Data()),currQuotient);
2265  return FALSE;
2266}
2267static BOOLEAN jjKoszul(leftv res, leftv u, leftv v)
2268{
2269  return mpKoszul(res, u,v);
2270}
2271static BOOLEAN jjKoszul_Id(leftv res, leftv u, leftv v)
2272{
2273  sleftv h;
2274  memset(&h,0,sizeof(sleftv));
2275  h.rtyp=INT_CMD;
2276  h.data=(void *)(long)IDELEMS((ideal)v->Data());
2277  return mpKoszul(res, u, &h, v);
2278}
2279static BOOLEAN jjLIFT(leftv res, leftv u, leftv v)
2280{
2281  ideal m;
2282  BITSET save_test=test;
2283  int ul= IDELEMS((ideal)u->Data());
2284  int vl= IDELEMS((ideal)v->Data());
2285  m = idLift((ideal)u->Data(),(ideal)v->Data(),NULL,FALSE,hasFlag(u,FLAG_STD));
2286  res->data = (char *)idModule2formatedMatrix(m,ul,vl);
2287  test=save_test;
2288  return FALSE;
2289}
2290static BOOLEAN jjLIFTSTD(leftv res, leftv u, leftv v)
2291{
2292  if ((v->rtyp!=IDHDL)||(v->e!=NULL)) return TRUE;
2293  idhdl h=(idhdl)v->data;
2294  // CopyD for IDEAL_CMD and MODUL_CMD are identical:
2295  res->data = (char *)idLiftStd((ideal)u->Data(),
2296                                &(h->data.umatrix),testHomog);
2297  setFlag(res,FLAG_STD);
2298  return FALSE;
2299}
2300static BOOLEAN jjLOAD_E(leftv res, leftv v, leftv u)
2301{
2302  char * s=(char *)u->Data();
2303  if(strcmp(s, "with")==0)
2304    return jjLOAD(res, v, TRUE);
2305  WerrorS("invalid second argument");
2306  WerrorS("load(\"libname\" [,\"with\"]);");
2307  return TRUE;
2308}
2309static BOOLEAN jjMINOR(leftv res, leftv u, leftv v)
2310{
2311  res->data = (char *)idMinors((matrix)u->Data(),(int)(long)v->Data());
2312  return (res->data==NULL);
2313}
2314static BOOLEAN jjMODULO(leftv res, leftv u, leftv v)
2315{
2316  intvec *w_u=(intvec *)atGet(u,"isHomog",INTVEC_CMD);
2317  tHomog hom=testHomog;
2318  if (w_u!=NULL)
2319  {
2320    w_u=ivCopy(w_u);
2321    hom=isHomog;
2322  }
2323  intvec *w_v=(intvec *)atGet(v,"isHomog",INTVEC_CMD);
2324  if (w_v!=NULL)
2325  {
2326    w_v=ivCopy(w_v);
2327    hom=isHomog;
2328  }
2329  if ((w_u!=NULL) && (w_v==NULL))
2330    w_v=ivCopy(w_u);
2331  if ((w_v!=NULL) && (w_u==NULL))
2332    w_u=ivCopy(w_v);
2333  ideal u_id=(ideal)u->Data();
2334  ideal v_id=(ideal)v->Data();
2335  if (w_u!=NULL)
2336  {
2337     if ((*w_u).compare((w_v))!=0)
2338     {
2339       WarnS("incompatible weights");
2340       delete w_u; w_u=NULL;
2341       hom=testHomog;
2342     }
2343     else
2344     {
2345       if ((!idTestHomModule(u_id,currQuotient,w_v))
2346       || (!idTestHomModule(v_id,currQuotient,w_v)))
2347       {
2348         WarnS("wrong weights");
2349         delete w_u; w_u=NULL;
2350         hom=testHomog;
2351       }
2352     }
2353  }
2354  res->data = (char *)idModulo(u_id,v_id ,hom,&w_u);
2355  if (w_u!=NULL)
2356  {
2357    atSet(res,omStrDup("isHomog"),w_u,INTVEC_CMD);
2358  }
2359  delete w_v;
2360  return FALSE;
2361}
2362static BOOLEAN jjMOD_BI(leftv res, leftv u, leftv v)
2363{
2364  number q=(number)v->Data();
2365  if (nlIsZero(q))
2366  {
2367    WerrorS(ii_div_by_0);
2368    return TRUE;
2369  }
2370  res->data =(char *) nlIntMod((number)u->Data(),q);
2371  return FALSE;
2372}
2373static BOOLEAN jjMOD_N(leftv res, leftv u, leftv v)
2374{
2375  number q=(number)v->Data();
2376  if (nIsZero(q))
2377  {
2378    WerrorS(ii_div_by_0);
2379    return TRUE;
2380  }
2381  res->data =(char *) nIntMod((number)u->Data(),q);
2382  return FALSE;
2383}
2384static BOOLEAN jjMONITOR2(leftv res, leftv u,leftv v)
2385{
2386  char *opt=(char *)v->Data();
2387  int mode=0;
2388  while(*opt!='\0')
2389  {
2390    if (*opt=='i') mode |= PROT_I;
2391    else if (*opt=='o') mode |= PROT_O;
2392    opt++;
2393  }
2394  monitor((char *)(u->Data()),mode);
2395  return FALSE;
2396}
2397static BOOLEAN jjPARSTR2(leftv res, leftv u, leftv v)
2398{
2399  idhdl h=(idhdl)u->data;
2400  int i=(int)(long)v->Data();
2401  int p=0;
2402  if ((0<i)
2403  && (IDRING(h)->parameter!=NULL)
2404  && (i<=(p=rPar(IDRING(h)))))
2405    res->data=omStrDup(IDRING(h)->parameter[i-1]);
2406  else
2407  {
2408    Werror("par number %d out of range 1..%d",i,p);
2409    return TRUE;
2410  }
2411  return FALSE;
2412}
2413#ifdef HAVE_PLURAL
2414static BOOLEAN jjPlural_num_poly(leftv res, leftv a, leftv b)
2415{
2416  if (iiOp==NCALGEBRA_CMD)
2417  {
2418    return nc_CallPlural(NULL,NULL,(poly)a->Data(),(poly)b->Data(),currRing);
2419  }
2420  else
2421  {
2422    ring r=rCopy(currRing);
2423    BOOLEAN result=nc_CallPlural(NULL,NULL,(poly)a->Data(),(poly)b->Data(),r);
2424    res->data=r;
2425    if (r->qideal!=NULL) res->rtyp=QRING_CMD;
2426    return result;
2427  }
2428}
2429static BOOLEAN jjPlural_num_mat(leftv res, leftv a, leftv b)
2430{
2431  if (iiOp==NCALGEBRA_CMD)
2432  {
2433    return nc_CallPlural(NULL,(matrix)b->Data(),(poly)a->Data(),NULL,currRing);
2434  }
2435  else
2436  {
2437    ring r=rCopy(currRing);
2438    BOOLEAN result=nc_CallPlural(NULL,(matrix)b->Data(),(poly)a->Data(),NULL,r);
2439    res->data=r;
2440    if (r->qideal!=NULL) res->rtyp=QRING_CMD;
2441    return result;
2442  }
2443}
2444static BOOLEAN jjPlural_mat_poly(leftv res, leftv a, leftv b)
2445{
2446  if (iiOp==NCALGEBRA_CMD)
2447  {
2448    return nc_CallPlural((matrix)a->Data(),NULL,NULL,(poly)b->Data(),currRing);
2449  }
2450  else
2451  {
2452    ring r=rCopy(currRing);
2453    BOOLEAN result=nc_CallPlural((matrix)a->Data(),NULL,NULL,(poly)b->Data(),r);
2454    res->data=r;
2455    if (r->qideal!=NULL) res->rtyp=QRING_CMD;
2456    return result;
2457  }
2458}
2459static BOOLEAN jjPlural_mat_mat(leftv res, leftv a, leftv b)
2460{
2461  if (iiOp==NCALGEBRA_CMD)
2462  {
2463    return nc_CallPlural((matrix)a->Data(),(matrix)b->Data(),NULL,NULL,currRing);
2464  }
2465  else
2466  {
2467    ring r=rCopy(currRing);
2468    BOOLEAN result=nc_CallPlural((matrix)a->Data(),(matrix)b->Data(),NULL,NULL,r);
2469    res->data=r;
2470    if (r->qideal!=NULL) res->rtyp=QRING_CMD;
2471    return result;
2472  }
2473}
2474static BOOLEAN jjBRACKET(leftv res, leftv a, leftv b)
2475{
2476  if (rIsPluralRing(currRing))
2477  {
2478    poly p = (poly)a->CopyD(POLY_CMD);
2479    poly q = (poly)b->Data();
2480    res->data = nc_p_Bracket_qq(p,q);
2481  }
2482  else res->data=NULL;
2483  return FALSE;
2484}
2485static BOOLEAN jjOPPOSE(leftv res, leftv a, leftv b)
2486{
2487  /* number, poly, vector, ideal, module, matrix */
2488  ring  r = (ring)a->Data();
2489  if (r == currRing)
2490  {
2491    res->data = b->Data();
2492    res->rtyp = b->rtyp;
2493    return FALSE;
2494  }
2495  if (!rIsLikeOpposite(currRing, r))
2496  {
2497    Werror("%s is not an opposite ring to current ring",a->Fullname());
2498    return TRUE;
2499  }
2500  idhdl w;
2501  if( ((w=r->idroot->get(b->Name(),myynest))!=NULL) && (b->e==NULL))
2502  {
2503    int argtype = IDTYP(w);
2504    switch (argtype)
2505    {
2506    case NUMBER_CMD:
2507      {
2508        /* since basefields are equal, we can apply nCopy */
2509        res->data = nCopy((number)IDDATA(w));
2510        res->rtyp = argtype;
2511        break;
2512      }
2513    case POLY_CMD:
2514    case VECTOR_CMD:
2515      {
2516        poly    q = (poly)IDDATA(w);
2517        res->data = pOppose(r,q);
2518        res->rtyp = argtype;
2519        break;
2520      }
2521    case IDEAL_CMD:
2522    case MODUL_CMD:
2523      {
2524        ideal   Q = (ideal)IDDATA(w);
2525        res->data = idOppose(r,Q);
2526        res->rtyp = argtype;
2527        break;
2528      }
2529    case MATRIX_CMD:
2530      {
2531        ring save = currRing;
2532        rChangeCurrRing(r);
2533        matrix  m = (matrix)IDDATA(w);
2534        ideal   Q = idMatrix2Module(mpCopy(m));
2535        rChangeCurrRing(save);
2536        ideal   S = idOppose(r,Q);
2537        id_Delete(&Q, r);
2538        res->data = idModule2Matrix(S);
2539        res->rtyp = argtype;
2540        break;
2541      }
2542    default:
2543      {
2544        WerrorS("unsupported type in oppose");
2545        return TRUE;
2546      }
2547    }
2548  }
2549  else
2550  {
2551    Werror("identifier %s not found in %s",b->Fullname(),a->Fullname());
2552    return TRUE;
2553  }
2554  return FALSE;
2555}
2556#endif /* HAVE_PLURAL */
2557
2558static BOOLEAN jjQUOT(leftv res, leftv u, leftv v)
2559{
2560  res->data = (char *)idQuot((ideal)u->Data(),(ideal)v->Data(),
2561    hasFlag(u,FLAG_STD),u->Typ()==v->Typ());
2562  idDelMultiples((ideal)(res->data));
2563  return FALSE;
2564}
2565static BOOLEAN jjRANDOM(leftv res, leftv u, leftv v)
2566{
2567  int i=(int)(long)u->Data();
2568  int j=(int)(long)v->Data();
2569#ifdef buildin_rand
2570  res->data =(char *)(long)((i > j) ? i : (siRand() % (j-i+1)) + i);
2571#else /* buildin_rand */
2572  res->data =(char *)(long)((i > j) ? i : (rand() % (j-i+1)) + i);
2573#endif /* buildin_rand */
2574  return FALSE;
2575}
2576static BOOLEAN jjREAD2(leftv res, leftv u, leftv v)
2577{
2578  si_link l=(si_link)u->Data();
2579  leftv r=slRead(l,v);
2580  if (r==NULL)
2581  {
2582    const char *s;
2583    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
2584    else                            s=sNoName;
2585    Werror("cannot read from `%s`",s);
2586    return TRUE;
2587  }
2588  memcpy(res,r,sizeof(sleftv));
2589  omFreeBin((ADDRESS)r, sleftv_bin);
2590  return FALSE;
2591}
2592static BOOLEAN jjREDUCE_P(leftv res, leftv u, leftv v)
2593{
2594  assumeStdFlag(v);
2595  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(poly)u->Data());
2596  return FALSE;
2597}
2598static BOOLEAN jjREDUCE_ID(leftv res, leftv u, leftv v)
2599{
2600  assumeStdFlag(v);
2601  ideal ui=(ideal)u->Data();
2602  idTest(ui);
2603  ideal vi=(ideal)v->Data();
2604  idTest(vi);
2605  res->data = (char *)kNF(vi,currQuotient,ui);
2606  return FALSE;
2607}
2608#if 0
2609static BOOLEAN jjRES(leftv res, leftv u, leftv v)
2610{
2611  int maxl=(int)(long)v->Data();
2612  if (maxl<0)
2613  {
2614    WerrorS("length for res must not be negative");
2615    return TRUE;
2616  }
2617  int l=0;
2618  //resolvente r;
2619  syStrategy r;
2620  intvec *weights=NULL;
2621  int wmaxl=maxl;
2622  ideal u_id=(ideal)u->Data();
2623
2624  maxl--;
2625  if ((maxl==-1) /*&& (iiOp!=MRES_CMD)*/)
2626  {
2627    maxl = pVariables-1+2*(iiOp==MRES_CMD);
2628    if (currQuotient!=NULL)
2629    {
2630      Warn(
2631      "full resolution in a qring may be infinite, setting max length to %d",
2632      maxl+1);
2633    }
2634  }
2635  weights=(intvec*)atGet(u,"isHomog",INTVEC_CMD);
2636  if (weights!=NULL)
2637  {
2638    if (!idTestHomModule(u_id,currQuotient,weights))
2639    {
2640      WarnS("wrong weights given:");weights->show();PrintLn();
2641      weights=NULL;
2642    }
2643  }
2644  intvec *ww=NULL;
2645  int add_row_shift=0;
2646  if (weights!=NULL)
2647  {
2648     ww=ivCopy(weights);
2649     add_row_shift = ww->min_in();
2650     (*ww) -= add_row_shift;
2651  }
2652  else
2653    idHomModule(u_id,currQuotient,&ww);
2654  weights=ww;
2655
2656  if ((iiOp == RES_CMD) || (iiOp == MRES_CMD))
2657  {
2658    r=syResolution(u_id,maxl, ww, iiOp==MRES_CMD);
2659  }
2660  else if (iiOp==SRES_CMD)
2661  //  r=sySchreyerResolvente(u_id,maxl+1,&l);
2662    r=sySchreyer(u_id,maxl+1);
2663  else if (iiOp == LRES_CMD)
2664  {
2665    int dummy;
2666    if((currQuotient!=NULL)||
2667    (!idHomIdeal (u_id,NULL)))
2668    {
2669       WerrorS
2670       ("`lres` not implemented for inhomogeneous input or qring");
2671       return TRUE;
2672    }
2673    r=syLaScala3(u_id,&dummy);
2674  }
2675  else if (iiOp == KRES_CMD)
2676  {
2677    int dummy;
2678    if((currQuotient!=NULL)||
2679    (!idHomIdeal (u_id,NULL)))
2680    {
2681       WerrorS
2682       ("`kres` not implemented for inhomogeneous input or qring");
2683       return TRUE;
2684    }
2685    r=syKosz(u_id,&dummy);
2686  }
2687  else
2688  {
2689    int dummy;
2690    if((currQuotient!=NULL)||
2691    (!idHomIdeal (u_id,NULL)))
2692    {
2693       WerrorS
2694       ("`hres` not implemented for inhomogeneous input or qring");
2695       return TRUE;
2696    }
2697    r=syHilb(u_id,&dummy);
2698  }
2699  if (r==NULL) return TRUE;
2700  //res->data=(void *)liMakeResolv(r,l,wmaxl,u->Typ(),weights);
2701  r->list_length=wmaxl;
2702  res->data=(void *)r;
2703  if ((r->weights!=NULL) && (r->weights[0]!=NULL))
2704  {
2705    intvec *w=ivCopy(r->weights[0]);
2706    if (weights!=NULL) (*w) += add_row_shift;
2707    atSet(res,omStrDup("isHomog"),w,INTVEC_CMD);
2708    delete w;
2709  }
2710  else
2711  {
2712//#if 0
2713// need to set weights for ALL components (sres)
2714    if (weights!=NULL)
2715    {
2716      atSet(res,omStrDup("isHomog"),ivCopy(weights),INTVEC_CMD);
2717      r->weights = (intvec**)omAlloc0Bin(void_ptr_bin);
2718      (r->weights)[0] = ivCopy(weights);
2719    }
2720//#endif
2721  }
2722  if (ww!=NULL) { delete ww; ww=NULL; }
2723  return FALSE;
2724}
2725#else
2726static BOOLEAN jjRES(leftv res, leftv u, leftv v)
2727{
2728  int maxl=(int)(long)v->Data();
2729  if (maxl<0)
2730  {
2731    WerrorS("length for res must not be negative");
2732    return TRUE;
2733  }
2734  int l=0;
2735  //resolvente r;
2736  syStrategy r;
2737  intvec *weights=NULL;
2738  int wmaxl=maxl;
2739  ideal u_id=(ideal)u->Data();
2740
2741  maxl--;
2742  if ((maxl==-1) /*&& (iiOp!=MRES_CMD)*/)
2743  {
2744    maxl = pVariables-1+2*(iiOp==MRES_CMD);
2745    if (currQuotient!=NULL)
2746    {
2747      Warn(
2748      "full resolution in a qring may be infinite, setting max length to %d",
2749      maxl+1);
2750    }
2751  }
2752  weights=(intvec*)atGet(u,"isHomog",INTVEC_CMD);
2753  if (weights!=NULL)
2754  {
2755    if (!idTestHomModule(u_id,currQuotient,weights))
2756    {
2757      WarnS("wrong weights given:");weights->show();PrintLn();
2758      weights=NULL;
2759    }
2760  }
2761  intvec *ww=NULL;
2762  int add_row_shift=0;
2763  if (weights!=NULL)
2764  {
2765     ww=ivCopy(weights);
2766     add_row_shift = ww->min_in();
2767     (*ww) -= add_row_shift;
2768  }
2769  if ((iiOp == RES_CMD) || (iiOp == MRES_CMD))
2770  {
2771    r=syResolution(u_id,maxl, ww, iiOp==MRES_CMD);
2772  }
2773  else if (iiOp==SRES_CMD)
2774  //  r=sySchreyerResolvente(u_id,maxl+1,&l);
2775    r=sySchreyer(u_id,maxl+1);
2776  else if (iiOp == LRES_CMD)
2777  {
2778    int dummy;
2779    if((currQuotient!=NULL)||
2780    (!idHomIdeal (u_id,NULL)))
2781    {
2782       WerrorS
2783       ("`lres` not implemented for inhomogeneous input or qring");
2784       return TRUE;
2785    }
2786    r=syLaScala3(u_id,&dummy);
2787  }
2788  else if (iiOp == KRES_CMD)
2789  {
2790    int dummy;
2791    if((currQuotient!=NULL)||
2792    (!idHomIdeal (u_id,NULL)))
2793    {
2794       WerrorS
2795       ("`kres` not implemented for inhomogeneous input or qring");
2796       return TRUE;
2797    }
2798    r=syKosz(u_id,&dummy);
2799  }
2800  else
2801  {
2802    int dummy;
2803    if((currQuotient!=NULL)||
2804    (!idHomIdeal (u_id,NULL)))
2805    {
2806       WerrorS
2807       ("`hres` not implemented for inhomogeneous input or qring");
2808       return TRUE;
2809    }
2810    r=syHilb(u_id,&dummy);
2811  }
2812  if (r==NULL) return TRUE;
2813  //res->data=(void *)liMakeResolv(r,l,wmaxl,u->Typ(),weights);
2814  r->list_length=wmaxl;
2815  res->data=(void *)r;
2816  if ((weights!=NULL) && (ww!=NULL)) { delete ww; ww=NULL; }
2817  if ((r->weights!=NULL) && (r->weights[0]!=NULL))
2818  {
2819    ww=ivCopy(r->weights[0]);
2820    if (weights!=NULL) (*ww) += add_row_shift;
2821    atSet(res,omStrDup("isHomog"),ww,INTVEC_CMD);
2822  }
2823  else
2824  {
2825    if (weights!=NULL)
2826    {
2827      atSet(res,omStrDup("isHomog"),ivCopy(weights),INTVEC_CMD);
2828    }
2829  }
2830  return FALSE;
2831}
2832#endif
2833static BOOLEAN jjRSUM(leftv res, leftv u, leftv v)
2834{
2835  ring r;
2836  int i=rSum((ring)u->Data(),(ring)v->Data(),r);
2837  res->data = (char *)r;
2838  return (i==-1);
2839}
2840#define SIMPL_LMDIV 32
2841#define SIMPL_LMEQ  16
2842#define SIMPL_MULT 8
2843#define SIMPL_EQU  4
2844#define SIMPL_NULL 2
2845#define SIMPL_NORM 1
2846static BOOLEAN jjSIMPL_ID(leftv res, leftv u, leftv v)
2847{
2848  int sw = (int)(long)v->Data();
2849  // CopyD for IDEAL_CMD and MODUL_CMD are identical:
2850  ideal id = (ideal)u->CopyD(IDEAL_CMD);
2851  if (sw & SIMPL_LMDIV)
2852  {
2853    idDelDiv(id);
2854  }
2855  if (sw & SIMPL_LMEQ)
2856  {
2857    idDelLmEquals(id);
2858  }
2859  if (sw & SIMPL_MULT)
2860  {
2861    idDelMultiples(id);
2862  }
2863  else if(sw & SIMPL_EQU)
2864  {
2865    idDelEquals(id);
2866  }
2867  if (sw & SIMPL_NULL)
2868  {
2869    idSkipZeroes(id);
2870  }
2871  if (sw & SIMPL_NORM)
2872  {
2873    idNorm(id);
2874  }
2875  res->data = (char * )id;
2876  return FALSE;
2877}
2878#ifdef HAVE_FACTORY
2879extern int singclap_factorize_retry;
2880static BOOLEAN jjSQR_FREE_DEC(leftv res, leftv u,leftv dummy)
2881{
2882  intvec *v=NULL;
2883  int sw=(int)(long)dummy->Data();
2884  int fac_sw=sw;
2885  if ((sw<0)||(sw>2)) fac_sw=1;
2886  singclap_factorize_retry=0;
2887  ideal f=singclap_factorize((poly)(u->CopyD()), &v, fac_sw);
2888  if (f==NULL)
2889    return TRUE;
2890  switch(sw)
2891  {
2892    case 0:
2893    case 2:
2894    {
2895      lists l=(lists)omAllocBin(slists_bin);
2896      l->Init(2);
2897      l->m[0].rtyp=IDEAL_CMD;
2898      l->m[0].data=(void *)f;
2899      l->m[1].rtyp=INTVEC_CMD;
2900      l->m[1].data=(void *)v;
2901      res->data=(void *)l;
2902      res->rtyp=LIST_CMD;
2903      return FALSE;
2904    }
2905    case 1:
2906      res->data=(void *)f;
2907      return FALSE;
2908    case 3:
2909      {
2910        poly p=f->m[0];
2911        int i=IDELEMS(f);
2912        f->m[0]=NULL;
2913        while(i>1)
2914        {
2915          i--;
2916          p=pMult(p,f->m[i]);
2917          f->m[i]=NULL;
2918        }
2919        res->data=(void *)p;
2920        res->rtyp=POLY_CMD;
2921      }
2922      return FALSE;
2923  }
2924  WerrorS("invalid switch");
2925  return TRUE;
2926}
2927#endif
2928static BOOLEAN jjSTATUS2(leftv res, leftv u, leftv v)
2929{
2930  res->data = omStrDup(slStatus((si_link) u->Data(), (char *) v->Data()));
2931  return FALSE;
2932}
2933static BOOLEAN jjSIMPL_P(leftv res, leftv u, leftv v)
2934{
2935  int sw = (int)(long)v->Data();
2936  // CopyD for POLY_CMD and VECTOR_CMD are identical:
2937  poly p = (poly)u->CopyD(POLY_CMD);
2938  if (sw & SIMPL_NORM)
2939  {
2940    pNorm(p);
2941  }
2942  res->data = (char * )p;
2943  return FALSE;
2944}
2945static BOOLEAN jjSTD_HILB(leftv res, leftv u, leftv v)
2946{
2947  ideal result;
2948  intvec *w=(intvec *)atGet(u,"isHomog",INTVEC_CMD);
2949  tHomog hom=testHomog;
2950  ideal u_id=(ideal)(u->Data());
2951  if (w!=NULL)
2952  {
2953    if (!idTestHomModule(u_id,currQuotient,w))
2954    {
2955      WarnS("wrong weights");
2956      w=NULL;
2957    }
2958    else
2959    {
2960      w=ivCopy(w);
2961      hom=isHomog;
2962    }
2963  }
2964  result=kStd(u_id,currQuotient,hom,&w,(intvec *)v->Data());
2965  idSkipZeroes(result);
2966  res->data = (char *)result;
2967  setFlag(res,FLAG_STD);
2968  if (w!=NULL) atSet(res,omStrDup("isHomog"),w,INTVEC_CMD);
2969  return FALSE;
2970}
2971static BOOLEAN jjSTD_1(leftv res, leftv u, leftv v)
2972{
2973  ideal result;
2974  assumeStdFlag(u);
2975  ideal i1=(ideal)(u->Data());
2976  ideal i0;
2977  int r=v->Typ();
2978  if ((/*v->Typ()*/r==POLY_CMD) ||(r==VECTOR_CMD))
2979  {
2980    i0=idInit(1,i1->rank);
2981    i0->m[0]=(poly)v->Data();
2982  }
2983  else /*IDEAL*/
2984  {
2985    i0=(ideal)v->Data();
2986  }
2987  int ii0=idElem(i0);
2988  i1=idSimpleAdd(i1,i0);
2989  memset(i0->m,0,sizeof(poly)*IDELEMS(i0));
2990  idDelete(&i0);
2991  intvec *w=(intvec *)atGet(u,"isHomog",INTVEC_CMD);
2992  tHomog hom=testHomog;
2993
2994  if (w!=NULL)
2995  {
2996    if (!idTestHomModule(i1,currQuotient,w))
2997    {
2998      // no warnung: this is legal, if i in std(i,p)
2999      // is homogeneous, but p not
3000      w=NULL;
3001    }
3002    else
3003    {
3004      w=ivCopy(w);
3005      hom=isHomog;
3006    }
3007  }
3008  BITSET save_test=test;
3009  test|=Sy_bit(OPT_SB_1);
3010  result=kStd(i1,currQuotient,hom,&w,NULL,0,IDELEMS(i1)-ii0);
3011  test=save_test;
3012  idDelete(&i1);
3013  idSkipZeroes(result);
3014  res->data = (char *)result;
3015  if(!TEST_OPT_DEGBOUND) setFlag(res,FLAG_STD);
3016  if (w!=NULL) atSet(res,omStrDup("isHomog"),w,INTVEC_CMD);
3017  return FALSE;
3018}
3019static BOOLEAN jjVARSTR2(leftv res, leftv u, leftv v)
3020{
3021  idhdl h=(idhdl)u->data;
3022  int i=(int)(long)v->Data();
3023  if ((0<i) && (i<=IDRING(h)->N))
3024    res->data=omStrDup(IDRING(h)->names[i-1]);
3025  else
3026  {
3027    Werror("var number %d out of range 1..%d",i,IDRING(h)->N);
3028    return TRUE;
3029  }
3030  return FALSE;
3031}
3032static BOOLEAN jjWEDGE(leftv res, leftv u, leftv v)
3033{
3034  res->data = (char *)mpWedge((matrix)u->Data(),(int)(long)v->Data());
3035  return FALSE;
3036}
3037#define jjWRONG2 (proc2)jjWRONG
3038#define jjWRONG3 (proc3)jjWRONG
3039static BOOLEAN jjWRONG(leftv res, leftv u)
3040{
3041  return TRUE;
3042}
3043
3044/*=================== operations with 2 args.: table =================*/
3045
3046struct sValCmd2 dArith2[]=
3047{
3048// operations:
3049// proc        cmd              res             arg1        arg2   plural
3050 {jjCOLCOL,    COLONCOLON,     ANY_TYPE,       DEF_CMD,    DEF_CMD ALLOW_PLURAL}
3051,{jjPLUS_I,    '+',            INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3052,{jjPLUS_BI,   '+',            BIGINT_CMD,     BIGINT_CMD, BIGINT_CMD ALLOW_PLURAL}
3053,{jjPLUS_N,    '+',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD ALLOW_PLURAL}
3054,{jjPLUS_P,    '+',            POLY_CMD,       POLY_CMD,   POLY_CMD ALLOW_PLURAL}
3055,{jjPLUS_P,    '+',            VECTOR_CMD,     VECTOR_CMD, VECTOR_CMD ALLOW_PLURAL}
3056,{jjPLUS_ID,   '+',            IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3057,{jjPLUS_ID,   '+',            MODUL_CMD,      MODUL_CMD,  MODUL_CMD ALLOW_PLURAL}
3058,{jjPLUS_P_MA, '+',            MATRIX_CMD,     POLY_CMD,   MATRIX_CMD ALLOW_PLURAL}
3059,{jjPLUS_MA_P, '+',            MATRIX_CMD,     MATRIX_CMD, POLY_CMD ALLOW_PLURAL}
3060,{jjPLUS_MA,   '+',            MATRIX_CMD,     MATRIX_CMD, MATRIX_CMD ALLOW_PLURAL}
3061,{jjPLUS_S,    '+',            STRING_CMD,     STRING_CMD, STRING_CMD ALLOW_PLURAL}
3062,{jjOP_IV_I,   '+',            INTVEC_CMD,     INTVEC_CMD, INT_CMD ALLOW_PLURAL}
3063,{jjOP_I_IV,   '+',            INTVEC_CMD,     INT_CMD,    INTVEC_CMD ALLOW_PLURAL}
3064,{jjOP_IM_I,   '+',            INTMAT_CMD,     INTMAT_CMD, INT_CMD ALLOW_PLURAL}
3065,{jjOP_I_IM,   '+',            INTMAT_CMD,     INT_CMD,    INTMAT_CMD ALLOW_PLURAL}
3066,{jjPLUS_IV,   '+',            INTVEC_CMD,     INTVEC_CMD, INTVEC_CMD ALLOW_PLURAL}
3067,{jjPLUS_IV,   '+',            INTMAT_CMD,     INTMAT_CMD, INTMAT_CMD ALLOW_PLURAL}
3068,{lAdd,        '+',            LIST_CMD,       LIST_CMD,   LIST_CMD ALLOW_PLURAL}
3069,{jjRSUM,      '+',            RING_CMD,       RING_CMD,   RING_CMD ALLOW_PLURAL}
3070,{jjRSUM,      '+',            QRING_CMD,      QRING_CMD,  RING_CMD ALLOW_PLURAL}
3071,{jjRSUM,      '+',            QRING_CMD,      RING_CMD,   QRING_CMD ALLOW_PLURAL}
3072,{jjRSUM,      '+',            QRING_CMD,      QRING_CMD,  QRING_CMD ALLOW_PLURAL}
3073,{jjMINUS_I,   '-',            INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3074,{jjMINUS_BI,  '-',            BIGINT_CMD,     BIGINT_CMD, BIGINT_CMD ALLOW_PLURAL}
3075,{jjMINUS_N,   '-',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD ALLOW_PLURAL}
3076,{jjMINUS_P,   '-',            POLY_CMD,       POLY_CMD,   POLY_CMD ALLOW_PLURAL}
3077,{jjMINUS_P,   '-',            VECTOR_CMD,     VECTOR_CMD, VECTOR_CMD ALLOW_PLURAL}
3078,{jjPLUS_MA_P, '-',            MATRIX_CMD,     MATRIX_CMD, POLY_CMD ALLOW_PLURAL}
3079,{jjMINUS_MA,  '-',            MATRIX_CMD,     MATRIX_CMD, MATRIX_CMD ALLOW_PLURAL}
3080,{jjOP_IV_I,   '-',            INTVEC_CMD,     INTVEC_CMD, INT_CMD ALLOW_PLURAL}
3081,{jjOP_IM_I,   '-',            INTMAT_CMD,     INTMAT_CMD, INT_CMD ALLOW_PLURAL}
3082,{jjMINUS_IV,  '-',            INTVEC_CMD,     INTVEC_CMD, INTVEC_CMD ALLOW_PLURAL}
3083,{jjMINUS_IV,  '-',            INTMAT_CMD,     INTMAT_CMD, INTMAT_CMD ALLOW_PLURAL}
3084,{jjTIMES_I,   '*',            INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3085,{jjTIMES_BI,  '*',            BIGINT_CMD,     BIGINT_CMD, BIGINT_CMD ALLOW_PLURAL}
3086,{jjTIMES_N,   '*',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD ALLOW_PLURAL}
3087,{jjTIMES_P,   '*',            POLY_CMD,       POLY_CMD,   POLY_CMD ALLOW_PLURAL}
3088,{jjTIMES_P,   '*',            VECTOR_CMD,     POLY_CMD,   VECTOR_CMD ALLOW_PLURAL}
3089,{jjTIMES_P,   '*',            VECTOR_CMD,     VECTOR_CMD, POLY_CMD ALLOW_PLURAL}
3090,{jjTIMES_MA_P1,'*',           IDEAL_CMD,      IDEAL_CMD,  POLY_CMD ALLOW_PLURAL}
3091,{jjTIMES_MA_P2,'*',           IDEAL_CMD,      POLY_CMD,   IDEAL_CMD NO_PLURAL}
3092,{jjTIMES_ID,  '*',            IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3093,{jjTIMES_MA_P1,'*',           MODUL_CMD,      IDEAL_CMD,  VECTOR_CMD ALLOW_PLURAL}
3094,{jjTIMES_MA_P2,'*',           MODUL_CMD,      VECTOR_CMD, IDEAL_CMD NO_PLURAL}
3095,{jjTIMES_ID,  '*',            MODUL_CMD,      IDEAL_CMD,  MODUL_CMD ALLOW_PLURAL}
3096,{jjTIMES_ID,  '*',            MODUL_CMD,      MODUL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3097,{jjTIMES_MA_P1,'*',           MATRIX_CMD,     MATRIX_CMD, POLY_CMD ALLOW_PLURAL}
3098,{jjTIMES_MA_P2,'*',           MATRIX_CMD,     POLY_CMD,   MATRIX_CMD NO_PLURAL}
3099,{jjTIMES_MA_N1,'*',           MATRIX_CMD,     MATRIX_CMD, NUMBER_CMD ALLOW_PLURAL}
3100,{jjTIMES_MA_N2,'*',           MATRIX_CMD,     NUMBER_CMD, MATRIX_CMD ALLOW_PLURAL}
3101,{jjTIMES_MA_I1,'*',           MATRIX_CMD,     MATRIX_CMD, INT_CMD ALLOW_PLURAL}
3102,{jjTIMES_MA_I2,'*',           MATRIX_CMD,     INT_CMD,    MATRIX_CMD ALLOW_PLURAL}
3103,{jjTIMES_MA,  '*',            MATRIX_CMD,     MATRIX_CMD, MATRIX_CMD ALLOW_PLURAL}
3104,{jjOP_IV_I,   '*',            INTVEC_CMD,     INTVEC_CMD, INT_CMD ALLOW_PLURAL}
3105,{jjOP_I_IV,   '*',            INTVEC_CMD,     INT_CMD,    INTVEC_CMD ALLOW_PLURAL}
3106,{jjOP_IV_I,   '*',            INTMAT_CMD,     INTMAT_CMD, INT_CMD ALLOW_PLURAL}
3107,{jjOP_I_IV,   '*',            INTMAT_CMD,     INT_CMD,    INTMAT_CMD ALLOW_PLURAL}
3108,{jjTIMES_IV,  '*',            INTVEC_CMD,     INTMAT_CMD, INTVEC_CMD ALLOW_PLURAL}
3109,{jjTIMES_IV,  '*',            INTMAT_CMD,     INTMAT_CMD, INTMAT_CMD ALLOW_PLURAL}
3110,{jjTIMES_IV,  '*',            INTMAT_CMD,     INTVEC_CMD, INTMAT_CMD ALLOW_PLURAL}
3111,{jjDIV_N,     '/',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD ALLOW_PLURAL}
3112,{jjDIV_P,     '/',            POLY_CMD,       POLY_CMD,   POLY_CMD ALLOW_PLURAL}
3113,{jjDIV_P,     '/',            VECTOR_CMD,     VECTOR_CMD, POLY_CMD ALLOW_PLURAL}
3114,{jjDIV_Ma,    '/',            MATRIX_CMD,     MATRIX_CMD, POLY_CMD ALLOW_PLURAL}
3115,{jjDIVMOD_I,  '/',            INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3116,{jjDIV_BI,    '/',            BIGINT_CMD,     BIGINT_CMD, BIGINT_CMD ALLOW_PLURAL}
3117,{jjOP_IV_I,   '/',            INTVEC_CMD,     INTVEC_CMD, INT_CMD ALLOW_PLURAL}
3118,{jjOP_IV_I,   '/',            INTMAT_CMD,     INTMAT_CMD, INT_CMD ALLOW_PLURAL}
3119,{jjDIVMOD_I,  INTDIV_CMD,     INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3120,{jjDIV_BI,    INTDIV_CMD,     BIGINT_CMD,     BIGINT_CMD, BIGINT_CMD ALLOW_PLURAL}
3121,{jjOP_IV_I,   INTDIV_CMD,     INTVEC_CMD,     INTVEC_CMD, INT_CMD ALLOW_PLURAL}
3122,{jjOP_IV_I,   INTDIV_CMD,     INTMAT_CMD,     INTMAT_CMD, INT_CMD ALLOW_PLURAL}
3123,{jjDIVMOD_I,  '%',            INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3124,{jjMOD_BI,    '%',            BIGINT_CMD,     BIGINT_CMD, BIGINT_CMD ALLOW_PLURAL}
3125,{jjOP_IV_I,   '%',            INTVEC_CMD,     INTVEC_CMD, INT_CMD ALLOW_PLURAL}
3126,{jjOP_IV_I,   '%',            INTMAT_CMD,     INTMAT_CMD, INT_CMD ALLOW_PLURAL}
3127,{jjMOD_N,     '%',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD ALLOW_PLURAL}
3128,{jjDIVMOD_I,  INTMOD_CMD,     INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3129,{jjMOD_BI,    INTMOD_CMD,     BIGINT_CMD,     BIGINT_CMD, BIGINT_CMD ALLOW_PLURAL}
3130,{jjOP_IV_I,   INTMOD_CMD,     INTVEC_CMD,     INTVEC_CMD, INT_CMD ALLOW_PLURAL}
3131,{jjOP_IV_I,   INTMOD_CMD,     INTMAT_CMD,     INTMAT_CMD, INT_CMD ALLOW_PLURAL}
3132,{jjMOD_N,     INTMOD_CMD,     NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD ALLOW_PLURAL}
3133,{jjPOWER_I,   '^',            INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3134,{jjPOWER_BI,   '^',           BIGINT_CMD,     BIGINT_CMD, INT_CMD ALLOW_PLURAL}
3135,{jjPOWER_N,   '^',            NUMBER_CMD,     NUMBER_CMD, INT_CMD ALLOW_PLURAL}
3136,{jjPOWER_P,   '^',            POLY_CMD,       POLY_CMD,   INT_CMD ALLOW_PLURAL}
3137,{jjPOWER_ID,  '^',            IDEAL_CMD,      IDEAL_CMD,  INT_CMD ALLOW_PLURAL}
3138,{jjLE_I,      LE,             INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3139,{jjLE_N,      LE,             INT_CMD,        NUMBER_CMD, NUMBER_CMD ALLOW_PLURAL}
3140,{jjCOMPARE_S, LE,             INT_CMD,        STRING_CMD, STRING_CMD ALLOW_PLURAL}
3141,{jjCOMPARE_IV_I,LE,           INT_CMD,        INTVEC_CMD, INT_CMD ALLOW_PLURAL}
3142,{jjCOMPARE_IV,LE,             INT_CMD,        INTVEC_CMD, INTVEC_CMD ALLOW_PLURAL}
3143,{jjCOMPARE_P, LE,             INT_CMD,        POLY_CMD,   POLY_CMD ALLOW_PLURAL}
3144,{jjCOMPARE_P, LE,             INT_CMD,        VECTOR_CMD, VECTOR_CMD ALLOW_PLURAL}
3145,{jjLE_BI,     LE,             INT_CMD,        BIGINT_CMD, BIGINT_CMD ALLOW_PLURAL}
3146,{jjLT_I,      '<',            INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3147,{jjLT_N,      '<',            INT_CMD,        NUMBER_CMD, NUMBER_CMD ALLOW_PLURAL}
3148,{jjCOMPARE_IV_I,'<',           INT_CMD,        INTVEC_CMD, INT_CMD ALLOW_PLURAL}
3149,{jjCOMPARE_IV,'<',            INT_CMD,        INTVEC_CMD, INTVEC_CMD ALLOW_PLURAL}
3150,{jjCOMPARE_S, '<',            INT_CMD,        STRING_CMD, STRING_CMD ALLOW_PLURAL}
3151,{jjCOMPARE_P, '<',            INT_CMD,        POLY_CMD,   POLY_CMD ALLOW_PLURAL}
3152,{jjCOMPARE_P, '<',            INT_CMD,        VECTOR_CMD, VECTOR_CMD ALLOW_PLURAL}
3153,{jjLT_BI,     '<',            INT_CMD,        BIGINT_CMD, BIGINT_CMD ALLOW_PLURAL}
3154,{jjGE_I,      GE,             INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3155,{jjGE_N,      GE,             INT_CMD,        NUMBER_CMD, NUMBER_CMD ALLOW_PLURAL}
3156,{jjCOMPARE_S, GE,             INT_CMD,        STRING_CMD, STRING_CMD ALLOW_PLURAL}
3157,{jjCOMPARE_IV_I,GE,           INT_CMD,        INTVEC_CMD, INT_CMD ALLOW_PLURAL}
3158,{jjCOMPARE_IV,GE,             INT_CMD,        INTVEC_CMD, INTVEC_CMD ALLOW_PLURAL}
3159,{jjCOMPARE_P, GE,             INT_CMD,        POLY_CMD,   POLY_CMD ALLOW_PLURAL}
3160,{jjCOMPARE_P, GE,             INT_CMD,        VECTOR_CMD, VECTOR_CMD ALLOW_PLURAL}
3161,{jjGE_BI,     GE,             INT_CMD,        BIGINT_CMD, BIGINT_CMD ALLOW_PLURAL}
3162,{jjGT_I,      '>',            INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3163,{jjGT_N,      '>',            INT_CMD,        NUMBER_CMD, NUMBER_CMD ALLOW_PLURAL}
3164,{jjCOMPARE_S, '>',            INT_CMD,        STRING_CMD, STRING_CMD ALLOW_PLURAL}
3165,{jjCOMPARE_IV_I,'>',          INT_CMD,        INTVEC_CMD, INT_CMD ALLOW_PLURAL}
3166,{jjCOMPARE_IV,'>',            INT_CMD,        INTVEC_CMD, INTVEC_CMD ALLOW_PLURAL}
3167,{jjCOMPARE_P, '>',            INT_CMD,        POLY_CMD,   POLY_CMD ALLOW_PLURAL}
3168,{jjCOMPARE_P, '>',            INT_CMD,        VECTOR_CMD, VECTOR_CMD ALLOW_PLURAL}
3169,{jjGT_BI,     '>',            INT_CMD,        BIGINT_CMD, BIGINT_CMD ALLOW_PLURAL}
3170,{jjAND_I,     '&',            INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3171,{jjOR_I,      '|',            INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3172,{jjEQUAL_I,   EQUAL_EQUAL,    INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3173,{jjEQUAL_N,   EQUAL_EQUAL,    INT_CMD,        NUMBER_CMD, NUMBER_CMD ALLOW_PLURAL}
3174,{jjCOMPARE_S, EQUAL_EQUAL,    INT_CMD,        STRING_CMD, STRING_CMD ALLOW_PLURAL}
3175,{jjEQUAL_P,   EQUAL_EQUAL,    INT_CMD,        POLY_CMD,   POLY_CMD ALLOW_PLURAL}
3176,{jjEQUAL_P,   EQUAL_EQUAL,    INT_CMD,        VECTOR_CMD, VECTOR_CMD ALLOW_PLURAL}
3177,{jjCOMPARE_IV_I,EQUAL_EQUAL,  INT_CMD,        INTVEC_CMD, INT_CMD ALLOW_PLURAL}
3178,{jjCOMPARE_IV,EQUAL_EQUAL,    INT_CMD,        INTVEC_CMD, INTVEC_CMD ALLOW_PLURAL}
3179,{jjCOMPARE_IV,EQUAL_EQUAL,    INT_CMD,        INTMAT_CMD, INTMAT_CMD ALLOW_PLURAL}
3180,{jjEQUAL_BI,  EQUAL_EQUAL,    INT_CMD,        BIGINT_CMD, BIGINT_CMD ALLOW_PLURAL}
3181,{jjEQUAL_Ma,  EQUAL_EQUAL,    INT_CMD,        MATRIX_CMD, MATRIX_CMD ALLOW_PLURAL}
3182,{jjWRONG2,    EQUAL_EQUAL,    0,              IDEAL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3183,{jjWRONG2,    EQUAL_EQUAL,    0,              MODUL_CMD,  MODUL_CMD ALLOW_PLURAL}
3184,{jjWRONG2,    EQUAL_EQUAL,    0,              IDEAL_CMD,  MODUL_CMD ALLOW_PLURAL}
3185,{jjWRONG2,    EQUAL_EQUAL,    0,              MODUL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3186,{jjEQUAL_I,   NOTEQUAL,       INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3187,{jjEQUAL_N,   NOTEQUAL,       INT_CMD,        NUMBER_CMD, NUMBER_CMD ALLOW_PLURAL}
3188,{jjCOMPARE_S, NOTEQUAL,       INT_CMD,        STRING_CMD, STRING_CMD ALLOW_PLURAL}
3189,{jjEQUAL_P,   NOTEQUAL,       INT_CMD,        POLY_CMD,   POLY_CMD ALLOW_PLURAL}
3190,{jjEQUAL_P,   NOTEQUAL,       INT_CMD,        VECTOR_CMD, VECTOR_CMD ALLOW_PLURAL}
3191,{jjCOMPARE_IV,NOTEQUAL,       INT_CMD,        INTVEC_CMD, INTVEC_CMD ALLOW_PLURAL}
3192,{jjCOMPARE_IV,NOTEQUAL,       INT_CMD,        INTMAT_CMD, INTMAT_CMD ALLOW_PLURAL}
3193,{jjEQUAL_Ma,  NOTEQUAL,       INT_CMD,        MATRIX_CMD, MATRIX_CMD ALLOW_PLURAL}
3194,{jjWRONG2,    NOTEQUAL,       0,              IDEAL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3195,{jjWRONG2,    NOTEQUAL,       0,              MODUL_CMD,  MODUL_CMD ALLOW_PLURAL}
3196,{jjWRONG2,    NOTEQUAL,       0,              IDEAL_CMD,  MODUL_CMD ALLOW_PLURAL}
3197,{jjWRONG2,    NOTEQUAL,       0,              MODUL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3198,{jjDOTDOT,    DOTDOT,         INTVEC_CMD,     INT_CMD,    INT_CMD ALLOW_PLURAL}
3199,{jjINDEX_I,   '[',            INT_CMD,        INTVEC_CMD, INT_CMD ALLOW_PLURAL}
3200,{jjINDEX_IV,  '[',            INT_CMD,        INTVEC_CMD, INTVEC_CMD ALLOW_PLURAL}
3201,{jjINDEX_I,   '[',            POLY_CMD,       IDEAL_CMD,  INT_CMD ALLOW_PLURAL}
3202,{jjINDEX_I,   '[',            POLY_CMD,       MAP_CMD,    INT_CMD ALLOW_PLURAL}
3203,{jjINDEX_IV,  '[',            POLY_CMD,       IDEAL_CMD,  INTVEC_CMD ALLOW_PLURAL}
3204,{jjINDEX_I,   '[',            VECTOR_CMD,     MODUL_CMD,  INT_CMD ALLOW_PLURAL}
3205,{jjINDEX_IV,  '[',            VECTOR_CMD,     MODUL_CMD,  INTVEC_CMD ALLOW_PLURAL}
3206,{jjINDEX_I,   '[',            STRING_CMD,     STRING_CMD, INT_CMD ALLOW_PLURAL}
3207,{jjINDEX_IV,  '[',            STRING_CMD,     STRING_CMD, INTVEC_CMD ALLOW_PLURAL}
3208,{jjINDEX_I,   '[',            ANY_TYPE/*set by p*/,LIST_CMD, INT_CMD ALLOW_PLURAL}
3209,{jjINDEX_IV,  '[',            ANY_TYPE/*set by p*/,LIST_CMD, INTVEC_CMD ALLOW_PLURAL}
3210,{jjINDEX_P,   '[',            POLY_CMD,       POLY_CMD,   INT_CMD ALLOW_PLURAL}
3211,{jjINDEX_P_IV,'[',            POLY_CMD,       POLY_CMD,   INTVEC_CMD ALLOW_PLURAL}
3212,{jjINDEX_V,   '[',            POLY_CMD,       VECTOR_CMD, INT_CMD ALLOW_PLURAL}
3213,{jjINDEX_V_IV,'[',            VECTOR_CMD,     VECTOR_CMD, INTVEC_CMD ALLOW_PLURAL}
3214,{jjPROC,      '(',            ANY_TYPE/*set by p*/,PROC_CMD, DEF_CMD ALLOW_PLURAL}
3215,{jjMAP,       '(',            ANY_TYPE/*set by p*/,MAP_CMD, DEF_CMD ALLOW_PLURAL}
3216,{jjKLAMMER,   '(',            ANY_TYPE/*set by p*/,ANY_TYPE, INT_CMD ALLOW_PLURAL}
3217,{jjKLAMMER_IV,'(',            ANY_TYPE/*set by p*/,ANY_TYPE, INTVEC_CMD ALLOW_PLURAL}
3218,{jjCOLON,     ':',            INTVEC_CMD,     INT_CMD,    INT_CMD ALLOW_PLURAL}
3219// and the procedures with 2 arguments:
3220,{atATTRIB2,   ATTRIB_CMD,     NONE/*set by p*/,DEF_CMD,   STRING_CMD ALLOW_PLURAL}
3221,{jjWRONG2,    BAREISS_CMD,    0,              DEF_CMD,    DEF_CMD ALLOW_PLURAL}
3222,{jjBETTI2,    BETTI_CMD,      INTMAT_CMD,     LIST_CMD,   INT_CMD ALLOW_PLURAL}
3223,{syBetti2,    BETTI_CMD,      INTMAT_CMD,     RESOLUTION_CMD, INT_CMD ALLOW_PLURAL}
3224,{jjBETTI2_ID, BETTI_CMD,      INTMAT_CMD,     IDEAL_CMD,  INT_CMD ALLOW_PLURAL}
3225,{jjBETTI2_ID, BETTI_CMD,      INTMAT_CMD,     MODUL_CMD,  INT_CMD ALLOW_PLURAL}
3226#ifdef HAVE_PLURAL
3227,{jjBRACKET,   BRACKET_CMD,    POLY_CMD,       POLY_CMD,   POLY_CMD ALLOW_PLURAL}
3228#endif
3229,{jjCHINREM_BI,CHINREM_CMD,    BIGINT_CMD,     INTVEC_CMD, INTVEC_CMD ALLOW_PLURAL}
3230//,{jjCHINREM_P, CHINREM_CMD,    POLY_CMD,       LIST_CMD,   INTVEC_CMD ALLOW_PLURAL}
3231,{jjCHINREM_ID,CHINREM_CMD,    IDEAL_CMD,      LIST_CMD,   INTVEC_CMD ALLOW_PLURAL}
3232,{jjCOEF,      COEF_CMD,       MATRIX_CMD,     POLY_CMD,   POLY_CMD ALLOW_PLURAL}
3233,{jjCOEFFS_Id, COEFFS_CMD,     MATRIX_CMD,     IDEAL_CMD,  POLY_CMD ALLOW_PLURAL}
3234,{jjCOEFFS_Id, COEFFS_CMD,     MATRIX_CMD,     MODUL_CMD,  POLY_CMD ALLOW_PLURAL}
3235,{jjCOEFFS2_KB,COEFFS_CMD,     MATRIX_CMD,     IDEAL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3236,{jjCOEFFS2_KB,COEFFS_CMD,     MATRIX_CMD,     MODUL_CMD,  MODUL_CMD ALLOW_PLURAL}
3237,{jjCONTRACT,  CONTRACT_CMD,   MATRIX_CMD,     IDEAL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3238,{jjDEG_IV,    DEG_CMD,        INT_CMD,        POLY_CMD,   INTVEC_CMD ALLOW_PLURAL}
3239,{jjDEG_IV,    DEG_CMD,        INT_CMD,        VECTOR_CMD, INTVEC_CMD ALLOW_PLURAL}
3240,{jjDEG_M_IV,  DEG_CMD,        INT_CMD,        MATRIX_CMD, INTVEC_CMD ALLOW_PLURAL}
3241,{lDelete,     DELETE_CMD,     LIST_CMD,       LIST_CMD,   INT_CMD ALLOW_PLURAL}
3242,{jjDIFF_P,    DIFF_CMD,       POLY_CMD,       POLY_CMD,   POLY_CMD ALLOW_PLURAL}
3243,{jjDIFF_P,    DIFF_CMD,       VECTOR_CMD,     VECTOR_CMD, POLY_CMD ALLOW_PLURAL}
3244,{jjDIFF_ID,   DIFF_CMD,       IDEAL_CMD,      IDEAL_CMD,  POLY_CMD ALLOW_PLURAL}
3245,{jjDIFF_ID_ID,DIFF_CMD,       MATRIX_CMD,     IDEAL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3246,{jjDIFF_ID,   DIFF_CMD,       MODUL_CMD,      MODUL_CMD,  POLY_CMD ALLOW_PLURAL}
3247,{jjDIFF_ID,   DIFF_CMD,       MATRIX_CMD,     MATRIX_CMD, POLY_CMD ALLOW_PLURAL}
3248,{jjDIM2,      DIM_CMD,        INT_CMD,        IDEAL_CMD,  IDEAL_CMD NO_PLURAL}
3249,{jjDIM2,      DIM_CMD,        INT_CMD,        MODUL_CMD,  IDEAL_CMD NO_PLURAL}
3250,{jjDIVISION,  DIVISION_CMD,   LIST_CMD,       IDEAL_CMD,  IDEAL_CMD NO_PLURAL}
3251,{jjDIVISION,  DIVISION_CMD,   LIST_CMD,       MODUL_CMD,  MODUL_CMD NO_PLURAL}
3252,{jjELIMIN,    ELIMINATION_CMD,IDEAL_CMD,      IDEAL_CMD,  POLY_CMD ALLOW_PLURAL}
3253,{jjELIMIN,    ELIMINATION_CMD,MODUL_CMD,      MODUL_CMD,  POLY_CMD ALLOW_PLURAL}
3254,{jjEXPORTTO,  EXPORTTO_CMD,   NONE,           PACKAGE_CMD, IDHDL ALLOW_PLURAL}
3255,{jjEXTGCD_I,  EXTGCD_CMD,     LIST_CMD,       INT_CMD,    INT_CMD ALLOW_PLURAL}
3256#ifdef HAVE_FACTORY
3257,{jjEXTGCD_P,  EXTGCD_CMD,     LIST_CMD,       POLY_CMD,   POLY_CMD NO_PLURAL}
3258,{jjSQR_FREE_DEC,FAC_CMD,      IDEAL_CMD,      POLY_CMD,   INT_CMD NO_PLURAL}
3259,{jjFACSTD2,    FACSTD_CMD,    LIST_CMD,       IDEAL_CMD,  IDEAL_CMD NO_PLURAL}
3260#else
3261,{jjWRONG2,    EXTGCD_CMD,     LIST_CMD,       POLY_CMD,   POLY_CMD NO_PLURAL}
3262,{jjWRONG2,    FAC_CMD,        IDEAL_CMD,      POLY_CMD,   INT_CMD NO_PLURAL}
3263,{jjWRONG2,    FACSTD_CMD,     LIST_CMD,       IDEAL_CMD,  IDEAL_CMD NO_PLURAL}
3264#endif
3265,{jjFETCH,     FETCH_CMD,      ANY_TYPE/*set by p*/,RING_CMD,  ANY_TYPE ALLOW_PLURAL}
3266,{jjFETCH,     FETCH_CMD,      ANY_TYPE/*set by p*/,QRING_CMD, ANY_TYPE ALLOW_PLURAL}
3267#ifdef HAVE_FGLM
3268,{fglmProc,    FGLM_CMD,       IDEAL_CMD,      RING_CMD,   DEF_CMD NO_PLURAL}
3269,{fglmProc,    FGLM_CMD,       IDEAL_CMD,      QRING_CMD,  DEF_CMD NO_PLURAL}
3270,{fglmQuotProc,FGLMQUOT_CMD,   IDEAL_CMD,      IDEAL_CMD,  POLY_CMD NO_PLURAL}
3271#else
3272,{jjWRONG2,    FGLM_CMD,       IDEAL_CMD,      RING_CMD,   DEF_CMD NO_PLURAL}
3273,{jjWRONG2,    FGLM_CMD,       IDEAL_CMD,      QRING_CMD,  DEF_CMD NO_PLURAL}
3274,{jjWRONG2,    FGLMQUOT_CMD,   IDEAL_CMD,      POLY_CMD,   IDEAL_CMD NO_PLURAL}
3275#endif
3276,{jjFIND2,     FIND_CMD,       INT_CMD,        STRING_CMD, STRING_CMD ALLOW_PLURAL}
3277,{jjFWALK,     FWALK_CMD,      IDEAL_CMD,      RING_CMD,   DEF_CMD NO_PLURAL}
3278,{jjGCD_I,     GCD_CMD,        INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3279,{jjGCD_N,     GCD_CMD,        NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD ALLOW_PLURAL}
3280,{jjGCD_BI,    GCD_CMD,        BIGINT_CMD,     BIGINT_CMD, BIGINT_CMD ALLOW_PLURAL}
3281#if defined(HAVE_FACTORY) && defined(HAVE_LIBFAC_P)
3282,{jjGCD_P,     GCD_CMD,        POLY_CMD,       POLY_CMD,   POLY_CMD NO_PLURAL}
3283#else
3284,{jjWRONG2,    GCD_CMD,        POLY_CMD,       POLY_CMD,   POLY_CMD NO_PLURAL}
3285#endif
3286,{jjHILBERT2,  HILBERT_CMD,    INTVEC_CMD,     IDEAL_CMD,  INT_CMD NO_PLURAL}
3287,{jjHILBERT2,  HILBERT_CMD,    INTVEC_CMD,     MODUL_CMD,  INT_CMD NO_PLURAL}
3288,{jjHOMOG_P,   HOMOG_CMD,      POLY_CMD,       POLY_CMD,   POLY_CMD ALLOW_PLURAL}
3289,{jjHOMOG_P,   HOMOG_CMD,      VECTOR_CMD,     VECTOR_CMD, POLY_CMD ALLOW_PLURAL}
3290,{jjHOMOG_ID,  HOMOG_CMD,      IDEAL_CMD,      IDEAL_CMD,  POLY_CMD ALLOW_PLURAL}
3291,{jjHOMOG_ID,  HOMOG_CMD,      MODUL_CMD,      MODUL_CMD,  POLY_CMD ALLOW_PLURAL}
3292,{jjRES,       HRES_CMD,       RESOLUTION_CMD, IDEAL_CMD,  INT_CMD NO_PLURAL}
3293,{jjCALL2MANY, IDEAL_CMD,      IDEAL_CMD,      DEF_CMD,    DEF_CMD ALLOW_PLURAL}
3294,{jjFETCH,     IMAP_CMD,       ANY_TYPE/*set by p*/,RING_CMD,  ANY_TYPE ALLOW_PLURAL}
3295,{jjFETCH,     IMAP_CMD,       ANY_TYPE/*set by p*/,QRING_CMD, ANY_TYPE ALLOW_PLURAL}
3296,{jjIMPORTFROM,IMPORTFROM_CMD, NONE,           PACKAGE_CMD, ANY_TYPE ALLOW_PLURAL}
3297,{jjINDEPSET2, INDEPSET_CMD,   LIST_CMD,       IDEAL_CMD,  INT_CMD NO_PLURAL}
3298,{lInsert,     INSERT_CMD,     LIST_CMD,       LIST_CMD,   DEF_CMD ALLOW_PLURAL}
3299#ifdef HAVE_INTERPOLATION
3300,{jjINTERPOLATION,INTERPOLATE_CMD,IDEAL_CMD,   LIST_CMD,   INTVEC_CMD NO_PLURAL}
3301#endif
3302,{jjINTERSECT, INTERSECT_CMD,  IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3303,{jjINTERSECT, INTERSECT_CMD,  MODUL_CMD,      MODUL_CMD,  MODUL_CMD ALLOW_PLURAL}
3304,{jjJanetBasis2, JANET_CMD,    IDEAL_CMD,      IDEAL_CMD,  INT_CMD ALLOW_PLURAL}
3305,{jjJET_P,     JET_CMD,        POLY_CMD,       POLY_CMD,   INT_CMD ALLOW_PLURAL}
3306,{jjJET_ID,    JET_CMD,        IDEAL_CMD,      IDEAL_CMD,  INT_CMD ALLOW_PLURAL}
3307,{jjJET_P,     JET_CMD,        VECTOR_CMD,     VECTOR_CMD, INT_CMD ALLOW_PLURAL}
3308,{jjJET_ID,    JET_CMD,        MODUL_CMD,      MODUL_CMD,  INT_CMD ALLOW_PLURAL}
3309,{jjJET_ID,    JET_CMD,        MATRIX_CMD,     MATRIX_CMD,  INT_CMD ALLOW_PLURAL}
3310,{jjKBASE2,    KBASE_CMD,      IDEAL_CMD,      IDEAL_CMD,  INT_CMD ALLOW_PLURAL}
3311,{jjKBASE2,    KBASE_CMD,      MODUL_CMD,      MODUL_CMD,  INT_CMD ALLOW_PLURAL}
3312,{atKILLATTR2, KILLATTR_CMD,   NONE,           IDHDL,      STRING_CMD ALLOW_PLURAL}
3313,{jjKoszul,    KOSZUL_CMD,     MATRIX_CMD,     INT_CMD,    INT_CMD NO_PLURAL}
3314,{jjKoszul_Id, KOSZUL_CMD,     MATRIX_CMD,     INT_CMD,    IDEAL_CMD NO_PLURAL}
3315,{jjRES,       KRES_CMD,       RESOLUTION_CMD, IDEAL_CMD,  INT_CMD NO_PLURAL}
3316,{jjLIFT,      LIFT_CMD,       MATRIX_CMD,     IDEAL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3317,{jjLIFT,      LIFT_CMD,       MATRIX_CMD,     MODUL_CMD,  MODUL_CMD ALLOW_PLURAL}
3318,{jjLIFTSTD,   LIFTSTD_CMD,    IDEAL_CMD,      IDEAL_CMD,  MATRIX_CMD ALLOW_PLURAL}
3319,{jjLIFTSTD,   LIFTSTD_CMD,    MODUL_CMD,      MODUL_CMD,  MATRIX_CMD ALLOW_PLURAL}
3320,{jjCALL2MANY, LIST_CMD,       LIST_CMD,       DEF_CMD,    DEF_CMD ALLOW_PLURAL}
3321,{jjLOAD_E,    LOAD_CMD,       NONE,           STRING_CMD, STRING_CMD ALLOW_PLURAL}
3322,{jjRES,       LRES_CMD,       RESOLUTION_CMD, IDEAL_CMD,  INT_CMD NO_PLURAL}
3323,{jjMINOR,     MINOR_CMD,      IDEAL_CMD,      MATRIX_CMD, INT_CMD NO_PLURAL}
3324,{jjCALL2MANY, MODUL_CMD,      MODUL_CMD,      DEF_CMD,    DEF_CMD ALLOW_PLURAL}
3325,{jjMODULO,    MODULO_CMD,     MODUL_CMD,      IDEAL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3326,{jjMODULO,    MODULO_CMD,     MODUL_CMD,      MODUL_CMD,  MODUL_CMD ALLOW_PLURAL}
3327,{jjMONITOR2,  MONITOR_CMD,    NONE,           STRING_CMD, STRING_CMD ALLOW_PLURAL}
3328//,{jjRES,       MRES_CMD,       LIST_CMD,       IDEAL_CMD,  INT_CMD NO_PLURAL}
3329//,{jjRES,       MRES_CMD,       LIST_CMD,       MODUL_CMD,  INT_CMD NO_PLURAL}
3330,{nuMPResMat,  MPRES_CMD,      MODUL_CMD,      IDEAL_CMD,  INT_CMD NO_PLURAL}
3331,{jjRES,       MRES_CMD,       RESOLUTION_CMD, IDEAL_CMD,  INT_CMD ALLOW_PLURAL}
3332,{jjRES,       MRES_CMD,       RESOLUTION_CMD, MODUL_CMD,  INT_CMD ALLOW_PLURAL}
3333//,{nuMPResMat,  MPRES_CMD,      MODUL_CMD,      IDEAL_CMD,  INT_CMD NO_PLURAL}
3334#ifdef HAVE_PLURAL
3335,{jjPlural_num_poly, NCALGEBRA_CMD,NONE,       POLY_CMD,   POLY_CMD   NO_PLURAL}
3336,{jjPlural_num_mat,  NCALGEBRA_CMD,NONE,       POLY_CMD,   MATRIX_CMD NO_PLURAL}
3337,{jjPlural_mat_poly, NCALGEBRA_CMD,NONE,       MATRIX_CMD, POLY_CMD   NO_PLURAL}
3338,{jjPlural_mat_mat,  NCALGEBRA_CMD,NONE,       MATRIX_CMD, MATRIX_CMD NO_PLURAL}
3339,{jjPlural_num_poly, NC_ALGEBRA_CMD,RING_CMD,  POLY_CMD,   POLY_CMD   NO_PLURAL}
3340,{jjPlural_num_mat,  NC_ALGEBRA_CMD,RING_CMD,  POLY_CMD,   MATRIX_CMD NO_PLURAL}
3341,{jjPlural_mat_poly, NC_ALGEBRA_CMD,RING_CMD,  MATRIX_CMD, POLY_CMD   NO_PLURAL}
3342,{jjPlural_mat_mat,  NC_ALGEBRA_CMD,RING_CMD,  MATRIX_CMD, MATRIX_CMD NO_PLURAL}
3343#endif
3344#ifdef HAVE_PLURAL
3345,{jjOPPOSE,    OPPOSE_CMD,     ANY_TYPE/*set by p*/, RING_CMD,   DEF_CMD ALLOW_PLURAL}
3346,{jjOPPOSE,    OPPOSE_CMD,     ANY_TYPE/*set by p*/, QRING_CMD,   DEF_CMD ALLOW_PLURAL}
3347#endif
3348,{jjPARSTR2,   PARSTR_CMD,     STRING_CMD,     RING_CMD,   INT_CMD ALLOW_PLURAL}
3349,{jjPARSTR2,   PARSTR_CMD,     STRING_CMD,     QRING_CMD,  INT_CMD ALLOW_PLURAL}
3350,{jjPRINT_FORMAT, PRINT_CMD,   ANY_TYPE,       DEF_CMD,    STRING_CMD ALLOW_PLURAL}
3351,{jjQUOT,      QUOTIENT_CMD,   IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3352,{jjQUOT,      QUOTIENT_CMD,   MODUL_CMD,      MODUL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3353,{jjQUOT,      QUOTIENT_CMD,   IDEAL_CMD,      MODUL_CMD,  MODUL_CMD ALLOW_PLURAL}
3354,{jjRANDOM,    RANDOM_CMD,     INT_CMD,        INT_CMD,    INT_CMD ALLOW_PLURAL}
3355,{jjREAD2,     READ_CMD,       STRING_CMD,     LINK_CMD,   STRING_CMD ALLOW_PLURAL}
3356,{jjREDUCE_P,  REDUCE_CMD,     POLY_CMD,       POLY_CMD,   IDEAL_CMD ALLOW_PLURAL}
3357,{jjREDUCE_P,  REDUCE_CMD,     VECTOR_CMD,     VECTOR_CMD, IDEAL_CMD ALLOW_PLURAL}
3358,{jjREDUCE_P,  REDUCE_CMD,     VECTOR_CMD,     VECTOR_CMD, MODUL_CMD ALLOW_PLURAL}
3359,{jjREDUCE_ID, REDUCE_CMD,     IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3360,{jjREDUCE_ID, REDUCE_CMD,     MODUL_CMD,      MODUL_CMD,  MODUL_CMD ALLOW_PLURAL}
3361,{jjREDUCE_ID, REDUCE_CMD,     MODUL_CMD,      MODUL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3362//,{jjRES,       RES_CMD,        LIST_CMD,       IDEAL_CMD,  INT_CMD NO_PLURAL}
3363//,{jjRES,       RES_CMD,        LIST_CMD,       MODUL_CMD,  INT_CMD NO_PLURAL}
3364,{jjRES,       RES_CMD,        RESOLUTION_CMD, IDEAL_CMD,  INT_CMD ALLOW_PLURAL}
3365,{jjRES,       RES_CMD,        RESOLUTION_CMD, MODUL_CMD,  INT_CMD ALLOW_PLURAL}
3366,{jjSTATUS2,   STATUS_CMD,     STRING_CMD,     LINK_CMD,   STRING_CMD ALLOW_PLURAL}
3367,{jjSIMPL_P,   SIMPLIFY_CMD,   POLY_CMD,       POLY_CMD,   INT_CMD ALLOW_PLURAL}
3368,{jjSIMPL_P,   SIMPLIFY_CMD,   VECTOR_CMD,     VECTOR_CMD, INT_CMD ALLOW_PLURAL}
3369,{jjSIMPL_ID,  SIMPLIFY_CMD,   IDEAL_CMD,      IDEAL_CMD,  INT_CMD ALLOW_PLURAL}
3370,{jjSIMPL_ID,  SIMPLIFY_CMD,   MODUL_CMD,      MODUL_CMD,  INT_CMD ALLOW_PLURAL}
3371//,{jjRES,       SRES_CMD,       LIST_CMD,       IDEAL_CMD,  INT_CMD NO_PLURAL}
3372//,{jjRES,       SRES_CMD,       LIST_CMD,       MODUL_CMD,  INT_CMD NO_PLURAL}
3373,{jjRES,       SRES_CMD,       RESOLUTION_CMD, IDEAL_CMD,  INT_CMD NO_PLURAL}
3374,{jjRES,       SRES_CMD,       RESOLUTION_CMD, MODUL_CMD,  INT_CMD NO_PLURAL}
3375,{jjCALL2MANY, SYSTEM_CMD,     ANY_TYPE/*set by p*/,STRING_CMD, DEF_CMD ALLOW_PLURAL}
3376,{jjSTD_1,     STD_CMD,        IDEAL_CMD,      IDEAL_CMD,  POLY_CMD ALLOW_PLURAL}
3377,{jjSTD_1,     STD_CMD,        MODUL_CMD,      MODUL_CMD,  VECTOR_CMD ALLOW_PLURAL}
3378,{jjSTD_1,     STD_CMD,        IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD ALLOW_PLURAL}
3379,{jjSTD_1,     STD_CMD,        MODUL_CMD,      MODUL_CMD,  MODUL_CMD ALLOW_PLURAL}
3380,{jjSTD_HILB,  STD_CMD,        IDEAL_CMD,      IDEAL_CMD,  INTVEC_CMD NO_PLURAL}
3381,{jjSTD_HILB,  STD_CMD,        MODUL_CMD,      MODUL_CMD,  INTVEC_CMD NO_PLURAL}
3382,{jjVARSTR2,   VARSTR_CMD,     STRING_CMD,     RING_CMD,   INT_CMD ALLOW_PLURAL}
3383,{jjVARSTR2,   VARSTR_CMD,     STRING_CMD,     QRING_CMD,  INT_CMD ALLOW_PLURAL}
3384,{jjWEDGE,     WEDGE_CMD,      MATRIX_CMD,     MATRIX_CMD, INT_CMD NO_PLURAL}
3385,{NULL,        0,              0,              0,          0 NO_PLURAL}
3386};
3387/*=================== operations with 1 arg.: static proc =================*/
3388static BOOLEAN jjDUMMY(leftv res, leftv u)
3389{
3390  res->data = (char *)u->CopyD();
3391  return FALSE;
3392}
3393static BOOLEAN jjNULL(leftv res, leftv u)
3394{
3395  return FALSE;
3396}
3397//static BOOLEAN jjPLUSPLUS(leftv res, leftv u)
3398//{
3399//  res->data = (char *)((int)(long)u->Data()+1);
3400//  return FALSE;
3401//}
3402//static BOOLEAN jjMINUSMINUS(leftv res, leftv u)
3403//{
3404//  res->data = (char *)((int)(long)u->Data()-1);
3405//  return FALSE;
3406//}
3407static BOOLEAN jjPLUSPLUS(leftv res, leftv u)
3408{
3409  if (IDTYP((idhdl)u->data)==INT_CMD)
3410  {
3411    int i=IDINT((idhdl)u->data);
3412    if (iiOp==PLUSPLUS) i++;
3413    else                i--;
3414    IDDATA((idhdl)u->data)=(char *)(long)i;
3415    return FALSE;
3416  }
3417  return TRUE;
3418}
3419static BOOLEAN jjUMINUS_BI(leftv res, leftv u)
3420{
3421  number n=(number)u->CopyD(BIGINT_CMD);
3422  n=nlNeg(n);
3423  res->data = (char *)n;
3424  return FALSE;
3425}
3426static BOOLEAN jjUMINUS_I(leftv res, leftv u)
3427{
3428  res->data = (char *)(-(long)u->Data());
3429  return FALSE;
3430}
3431static BOOLEAN jjUMINUS_N(leftv res, leftv u)
3432{
3433  number n=(number)u->CopyD(NUMBER_CMD);
3434  n=nNeg(n);
3435  res->data = (char *)n;
3436  return FALSE;
3437}
3438static BOOLEAN jjUMINUS_P(leftv res, leftv u)
3439{
3440  res->data = (char *)pNeg((poly)u->CopyD(POLY_CMD));
3441  return FALSE;
3442}
3443static BOOLEAN jjUMINUS_MA(leftv res, leftv u)
3444{
3445  poly m1=pISet(-1);
3446  res->data = (char *)mpMultP((matrix)u->CopyD(MATRIX_CMD),m1);
3447  return FALSE;
3448}
3449static BOOLEAN jjUMINUS_IV(leftv res, leftv u)
3450{
3451  intvec *iv=(intvec *)u->CopyD(INTVEC_CMD);
3452  (*iv)*=(-1);
3453  res->data = (char *)iv;
3454  return FALSE;
3455}
3456static BOOLEAN jjPROC1(leftv res, leftv u)
3457{
3458  return jjPROC(res,u,NULL);
3459}
3460static BOOLEAN jjBAREISS(leftv res, leftv v)
3461{
3462  //matrix m=(matrix)v->Data();
3463  //lists l=mpBareiss(m,FALSE);
3464  intvec *iv;
3465  ideal m;
3466  smCallNewBareiss((ideal)v->Data(),0,0,m,&iv);
3467  lists l=(lists)omAllocBin(slists_bin);
3468  l->Init(2);
3469  l->m[0].rtyp=MODUL_CMD;
3470  l->m[1].rtyp=INTVEC_CMD;
3471  l->m[0].data=(void *)m;
3472  l->m[1].data=(void *)iv;
3473  res->data = (char *)l;
3474  return FALSE;
3475}
3476//static BOOLEAN jjBAREISS_IM(leftv res, leftv v)
3477//{
3478//  intvec *m=(intvec *)v->CopyD(INTMAT_CMD);
3479//  ivTriangMat(m);
3480//  res->data = (char *)m;
3481//  return FALSE;
3482//}
3483static BOOLEAN jjBI2N(leftv res, leftv u)
3484{
3485  if (rField_is_Q())
3486  {
3487    res->data=u->CopyD();
3488    return FALSE;
3489  }
3490  else
3491  {
3492    BOOLEAN bo=FALSE;
3493    number n=(number)u->CopyD();
3494    if (rField_is_Zp())
3495    {
3496      res->data=(void *)npMap0(n);
3497    }
3498    else if (rField_is_Q_a())
3499    {
3500      res->data=(void *)naMap00(n);
3501    }
3502    else if (rField_is_Zp_a())
3503    {
3504      res->data=(void *)naMap0P(n);
3505    }
3506    else
3507    {
3508      WerrorS("cannot convert bigint to this field");
3509      bo=TRUE;
3510    }
3511    nlDelete(&n,NULL);
3512    return bo;
3513  }
3514}
3515static BOOLEAN jjBI2P(leftv res, leftv u)
3516{
3517  sleftv tmp;
3518  BOOLEAN bo=jjBI2N(&tmp,u);
3519  if (!bo)
3520  {
3521    number n=(number) tmp.data;
3522    if (nIsZero(n)) { res->data=NULL;nDelete(&n); }
3523    else
3524    {
3525      poly p=pOne();
3526      pSetCoeff(p,n);
3527      res->data=(void *)p;
3528    }
3529  }
3530  return bo;
3531}
3532static BOOLEAN jjCALL1MANY(leftv res, leftv u)
3533{
3534  return iiExprArithM(res,u,iiOp);
3535}
3536static BOOLEAN jjCHAR(leftv res, leftv v)
3537{
3538  res->data = (char *)(long)rChar((ring)v->Data());
3539  return FALSE;
3540}
3541static BOOLEAN jjCOLS(leftv res, leftv v)
3542{
3543  res->data = (char *)(long)MATCOLS((matrix)(v->Data()));
3544  return FALSE;
3545}
3546static BOOLEAN jjCOLS_IV(leftv res, leftv v)
3547{
3548  res->data = (char *)(long)((intvec*)(v->Data()))->cols();
3549  return FALSE;
3550}
3551static BOOLEAN jjCONTENT(leftv res, leftv v)
3552{
3553  // CopyD for POLY_CMD and VECTOR_CMD are identical:
3554  poly p=(poly)v->CopyD(POLY_CMD);
3555  if (p!=NULL) pCleardenom(p);
3556  res->data = (char *)p;
3557  return FALSE;
3558}
3559static BOOLEAN jjCOUNT_N(leftv res, leftv v)
3560{
3561  res->data = (char *)(long)nSize((number)v->Data());
3562  return FALSE;
3563}
3564static BOOLEAN jjCOUNT_L(leftv res, leftv v)
3565{
3566  lists l=(lists)v->Data();
3567  res->data = (char *)(long)(l->nr+1);
3568  return FALSE;
3569}
3570static BOOLEAN jjCOUNT_M(leftv res, leftv v)
3571{
3572  matrix m=(matrix)v->Data();
3573  res->data = (char *)(long)(MATROWS(m)*MATCOLS(m));
3574  return FALSE;
3575}
3576static BOOLEAN jjCOUNT_IV(leftv res, leftv v)
3577{
3578  res->data = (char *)(long)((intvec*)(v->Data()))->length();
3579  return FALSE;
3580}
3581static BOOLEAN jjCOUNT_RG(leftv res, leftv v)
3582{
3583  ring r=(ring)v->Data();
3584  int elems=-1;
3585  if (rField_is_Zp(r)||rField_is_GF(r)) elems=rInternalChar(r);
3586  else if (rField_is_Zp_a(r) && (r->minpoly!=NULL))
3587  {
3588#ifdef HAVE_FACTORY
3589    extern int ipower ( int b, int n ); /* factory/cf_util */
3590    elems=ipower(ABS(rInternalChar(r)),naParDeg(r->minpoly));
3591#else
3592    elems=(int)pow(ABS((double) rInternalChar(r)),(double)naParDeg(r->minpoly));
3593#endif
3594  }
3595  res->data = (char *)(long)elems;
3596  return FALSE;
3597}
3598static BOOLEAN jjDEG(leftv res, leftv v)
3599{
3600  int dummy;
3601  poly p=(poly)v->Data();
3602  if (p!=NULL) res->data = (char *)pLDeg(p,&dummy,currRing);
3603  else res->data=(char *)-1;
3604  return FALSE;
3605}
3606static BOOLEAN jjDEG_M(leftv res, leftv u)
3607{
3608  ideal I=(ideal)u->Data();
3609  int d=-1;
3610  int dummy;
3611  int i;
3612  for(i=IDELEMS(I)-1;i>=0;i--)
3613    if (I->m[i]!=NULL) d=si_max(d,(int)pLDeg(I->m[i],&dummy,currRing));
3614  res->data = (char *)(long)d;
3615  return FALSE;
3616}
3617static BOOLEAN jjDEGREE(leftv res, leftv v)
3618{
3619  assumeStdFlag(v);
3620  intvec *module_w=(intvec*)atGet(v,"isHomog",INTVEC_CMD);
3621  scDegree((ideal)v->Data(),module_w,currQuotient);
3622  return FALSE;
3623}
3624static BOOLEAN jjDEFINED(leftv res, leftv v)
3625{
3626  if ((v->rtyp==IDHDL)
3627  && ((myynest==IDLEV((idhdl)v->data))||(0==IDLEV((idhdl)v->data))))
3628  {
3629    res->data=(void *)(long)(IDLEV((idhdl)v->data)+1);
3630  }
3631  else if (v->rtyp!=0) res->data=(void *)(-1);
3632  return FALSE;
3633}
3634#ifdef HAVE_FACTORY
3635static BOOLEAN jjDET(leftv res, leftv v)
3636{
3637  matrix m=(matrix)v->Data();
3638  poly p;
3639  if (smCheckDet((ideal)m,m->cols(),TRUE))
3640  {
3641    ideal I=idMatrix2Module(mpCopy(m));
3642    p=smCallDet(I);
3643    idDelete(&I);
3644  }
3645  else
3646    p=singclap_det(m);
3647  res ->data = (char *)p;
3648  return FALSE;
3649}
3650static BOOLEAN jjDET_I(leftv res, leftv v)
3651{
3652  intvec * m=(intvec*)v->Data();
3653  int i,j;
3654  i=m->rows();j=m->cols();
3655  if(i==j)
3656    res->data = (char *)(long)singclap_det_i(m);
3657  else
3658  {
3659    Werror("det of %d x %d intmat",i,j);
3660    return TRUE;
3661  }
3662  return FALSE;
3663}
3664static BOOLEAN jjDET_S(leftv res, leftv v)
3665{
3666  ideal I=(ideal)v->Data();
3667  poly p;
3668  if (IDELEMS(I)<1) return TRUE;
3669  if (smCheckDet(I,IDELEMS(I),FALSE))
3670  {
3671    matrix m=idModule2Matrix(idCopy(I));
3672    p=singclap_det(m);
3673    idDelete((ideal *)&m);
3674  }
3675  else
3676    p=smCallDet(I);
3677  res->data = (char *)p;
3678  return FALSE;
3679}
3680#endif
3681static BOOLEAN jjDIM(leftv res, leftv v)
3682{
3683  assumeStdFlag(v);
3684  res->data = (char *)(long)scDimInt((ideal)(v->Data()),currQuotient);
3685  return FALSE;
3686}
3687static BOOLEAN jjDUMP(leftv res, leftv v)
3688{
3689  si_link l = (si_link)v->Data();
3690  if (slDump(l))
3691  {
3692    const char *s;
3693    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
3694    else                            s=sNoName;
3695    Werror("cannot dump to `%s`",s);
3696    return TRUE;
3697  }
3698  else
3699    return FALSE;
3700}
3701static BOOLEAN jjE(leftv res, leftv v)
3702{
3703  res->data = (char *)pOne();
3704  int co=(int)(long)v->Data();
3705  if (co>0)
3706  {
3707    pSetComp((poly)res->data,co);
3708    pSetm((poly)res->data);
3709  }
3710  else WerrorS("argument of gen must be positive");
3711  return (co<=0);
3712}
3713static BOOLEAN jjEXECUTE(leftv res, leftv v)
3714{
3715  char * d = (char *)v->Data();
3716  char * s = (char *)omAlloc(strlen(d) + 13);
3717  strcpy( s, (char *)d);
3718  strcat( s, "\n;RETURN();\n");
3719  newBuffer(s,BT_execute);
3720  return yyparse();
3721}
3722#ifdef HAVE_FACTORY
3723static BOOLEAN jjFACSTD(leftv res, leftv v)
3724{
3725  ideal_list p,h;
3726  h=kStdfac((ideal)v->Data(),NULL,testHomog,NULL);
3727  p=h;
3728  int l=0;
3729  while (p!=NULL) { p=p->next;l++; }
3730  lists L=(lists)omAllocBin(slists_bin);
3731  L->Init(l);
3732  l=0;
3733  while(h!=NULL)
3734  {
3735    L->m[l].data=(char *)h->d;
3736    L->m[l].rtyp=IDEAL_CMD;
3737    p=h->next;
3738    omFreeSize(h,sizeof(*h));
3739    h=p;
3740    l++;
3741  }
3742  res->data=(void *)L;
3743  return FALSE;
3744}
3745static BOOLEAN jjFAC_P(leftv res, leftv u)
3746{
3747  intvec *v=NULL;
3748  singclap_factorize_retry=0;
3749  ideal f=singclap_factorize((poly)(u->CopyD()), &v, 0);
3750  if (f==NULL) return TRUE;
3751  ivTest(v);
3752  lists l=(lists)omAllocBin(slists_bin);
3753  l->Init(2);
3754  l->m[0].rtyp=IDEAL_CMD;
3755  l->m[0].data=(void *)f;
3756  l->m[1].rtyp=INTVEC_CMD;
3757  l->m[1].data=(void *)v;
3758  res->data=(void *)l;
3759  return FALSE;
3760}
3761#endif
3762static BOOLEAN jjGETDUMP(leftv res, leftv v)
3763{
3764  si_link l = (si_link)v->Data();
3765  if (slGetDump(l))
3766  {
3767    const char *s;
3768    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
3769    else                            s=sNoName;
3770    Werror("cannot get dump from `%s`",s);
3771    return TRUE;
3772  }
3773  else
3774    return FALSE;
3775}
3776static BOOLEAN jjHIGHCORNER(leftv res, leftv v)
3777{
3778  assumeStdFlag(v);
3779  ideal I=(ideal)v->Data();
3780  res->data=(void *)iiHighCorner(I,0);
3781  return FALSE;
3782}
3783static BOOLEAN jjHIGHCORNER_M(leftv res, leftv v)
3784{
3785  assumeStdFlag(v);
3786  intvec *w=(intvec*)atGet(v,"isHomog",INTVEC_CMD);
3787  BOOLEAN delete_w=FALSE;
3788  ideal I=(ideal)v->Data();
3789  int i;
3790  poly p=NULL,po=NULL;
3791  int rk=idRankFreeModule(I);
3792  if (w==NULL)
3793  {
3794    w = new intvec(rk);
3795    delete_w=TRUE;
3796  }
3797  for(i=rk;i>0;i--)
3798  {
3799    p=iiHighCorner(I,i);
3800    if (p==NULL)
3801    {
3802      WerrorS("module must be zero-dimensional");
3803      if (delete_w) delete w;
3804      return TRUE;
3805    }
3806    if (po==NULL)
3807    {
3808      po=p;
3809    }
3810    else
3811    {
3812      // now po!=NULL, p!=NULL
3813      int d=(pFDeg(po,currRing)-(*w)[pGetComp(po)-1] - pFDeg(p,currRing)+(*w)[i-1]);
3814      if (d==0)
3815        d=pLmCmp(po,p);
3816      if (d > 0)
3817      {
3818        pDelete(&p);
3819      }
3820      else // (d < 0)
3821      {
3822        pDelete(&po); po=p;
3823      }
3824    }
3825  }
3826  if (delete_w) delete w;
3827  res->data=(void *)po;
3828  return FALSE;
3829}
3830static BOOLEAN jjHILBERT(leftv res, leftv v)
3831{
3832  assumeStdFlag(v);
3833  intvec *module_w=(intvec*)atGet(v,"isHomog",INTVEC_CMD);
3834  //scHilbertPoly((ideal)v->Data(),currQuotient);
3835  hLookSeries((ideal)v->Data(),module_w,currQuotient);
3836  return FALSE;
3837}
3838static BOOLEAN jjHILBERT_IV(leftv res, leftv v)
3839{
3840  res->data=(void *)hSecondSeries((intvec *)v->Data());
3841  return FALSE;
3842}
3843static BOOLEAN jjHOMOG1(leftv res, leftv v)
3844{
3845  intvec *w=(intvec*)atGet(v,"isHomog",INTVEC_CMD);
3846  ideal v_id=(ideal)v->Data();
3847  if (w==NULL)
3848  {
3849    res->data=(void *)(long)idHomModule(v_id,currQuotient,&w);
3850    if ((res->data!=NULL) && (v->rtyp==IDHDL))
3851    {
3852      char *isHomog=omStrDup("isHomog");
3853      if (v->e==NULL)
3854        atSet((idhdl)(v->data),isHomog,w,INTVEC_CMD);
3855      else
3856        atSet((idhdl)(v->LData()),isHomog,w,INTVEC_CMD);
3857    }
3858    else if (w!=NULL) delete w;
3859  }
3860  else
3861    res->data=(void *)(long)idTestHomModule(v_id,currQuotient,w);
3862  return FALSE;
3863}
3864static BOOLEAN jjIDEAL_Ma(leftv res, leftv v)
3865{
3866  matrix mat=(matrix)v->CopyD(MATRIX_CMD);
3867  IDELEMS((ideal)mat)=MATCOLS(mat)*MATROWS(mat);
3868  if (IDELEMS((ideal)mat)==0)
3869  {
3870    idDelete((ideal *)&mat);
3871    mat=(matrix)idInit(1,1);
3872  }
3873  else
3874  {
3875    MATROWS(mat)=1;
3876    mat->rank=1;
3877    idTest((ideal)mat);
3878  }
3879  res->data=(char *)mat;
3880  return FALSE;
3881}
3882static BOOLEAN jjIDEAL_Map(leftv res, leftv v)
3883{
3884  map m=(map)v->CopyD(MAP_CMD);
3885  omFree((ADDRESS)m->preimage);
3886  m->preimage=NULL;
3887  ideal I=(ideal)m;
3888  I->rank=1;
3889  res->data=(char *)I;
3890  return FALSE;
3891}
3892static BOOLEAN jjIDEAL_R(leftv res, leftv v)
3893{
3894  if (currRing!=NULL)
3895  {
3896    ring q=(ring)v->Data();
3897    if (rSamePolyRep(currRing, q))
3898    {
3899      if (q->qideal==NULL)
3900        res->data=(char *)idInit(1,1);
3901      else
3902        res->data=(char *)idCopy(q->qideal);
3903      return FALSE;
3904    }
3905  }
3906  WerrorS("can only get ideal from identical qring");
3907  return TRUE;
3908}
3909static BOOLEAN jjIm2Iv(leftv res, leftv v)
3910{
3911  intvec *iv = (intvec *)v->CopyD(INTMAT_CMD);
3912  iv->makeVector();
3913  res->data = iv;
3914  return FALSE;
3915}
3916static BOOLEAN jjIMPART(leftv res, leftv v)
3917{
3918  res->data = (char *)nImPart((number)v->Data());
3919  return FALSE;
3920}
3921static BOOLEAN jjINDEPSET(leftv res, leftv v)
3922{
3923  assumeStdFlag(v);
3924  res->data=(void *)scIndIntvec((ideal)(v->Data()),currQuotient);
3925  return FALSE;
3926}
3927static BOOLEAN jjINTERRED(leftv res, leftv v)
3928{
3929  ideal result=kInterRed((ideal)(v->Data()), currQuotient);
3930  if (TEST_OPT_PROT) { PrintLn(); mflush(); }
3931  res->data = result;
3932  return FALSE;
3933}
3934static BOOLEAN jjIS_RINGVAR_P(leftv res, leftv v)
3935{
3936  res->data = (char *)(long)pVar((poly)v->Data());
3937  return FALSE;
3938}
3939static BOOLEAN jjIS_RINGVAR_S(leftv res, leftv v)
3940{
3941  res->data = (char *)(long)(r_IsRingVar((char *)v->Data(), currRing)+1);
3942  return FALSE;
3943}
3944static BOOLEAN jjIS_RINGVAR0(leftv res, leftv v)
3945{
3946  res->data = (char *)0;
3947  return FALSE;
3948}
3949static BOOLEAN jjJACOB_P(leftv res, leftv v)
3950{
3951  ideal i=idInit(pVariables,1);
3952  int k;
3953  poly p=(poly)(v->Data());
3954  for (k=pVariables;k>0;k--)
3955  {
3956    i->m[k-1]=pDiff(p,k);
3957  }
3958  res->data = (char *)i;
3959  return FALSE;
3960}
3961static BOOLEAN jjKBASE(leftv res, leftv v)
3962{
3963  assumeStdFlag(v);
3964  res->data = (char *)scKBase(-1,(ideal)(v->Data()),currQuotient);
3965  return FALSE;
3966}
3967#ifdef MDEBUG
3968static BOOLEAN jjpHead(leftv res, leftv v)
3969{
3970  res->data=(char *)pHead((poly)v->Data());
3971  return FALSE;
3972}
3973#endif
3974static BOOLEAN jjL2R(leftv res, leftv v)
3975{
3976  res->data=(char *)syConvList((lists)v->Data());
3977  if (res->data != NULL)
3978    return FALSE;
3979  else
3980    return TRUE;
3981}
3982static BOOLEAN jjLEADCOEF(leftv res, leftv v)
3983{
3984  poly p=(poly)v->Data();
3985  if (p==NULL)
3986  {
3987    res->data=(char *)nInit(0);
3988  }
3989  else
3990  {
3991    res->data=(char *)nCopy(pGetCoeff(p));
3992  }
3993  return FALSE;
3994}
3995static BOOLEAN jjLEADEXP(leftv res, leftv v)
3996{
3997  poly p=(poly)v->Data();
3998  int s=pVariables;
3999  if (v->Typ()==VECTOR_CMD) s++;
4000  intvec *iv=new intvec(s);
4001  if (p!=NULL)
4002  {
4003    for(int i = pVariables;i;i--)
4004    {
4005      (*iv)[i-1]=pGetExp(p,i);
4006    }
4007    if (s!=pVariables)
4008      (*iv)[pVariables]=pGetComp(p);
4009  }
4010  res->data=(char *)iv;
4011  return FALSE;
4012}
4013static BOOLEAN jjLEADMONOM(leftv res, leftv v)
4014{
4015  poly p=(poly)v->Data();
4016  if (p == NULL)
4017  {
4018    res->data = (char*) NULL;
4019  }
4020  else
4021  {
4022    poly lm = pLmInit(p);
4023    pSetCoeff(lm, nInit(1));
4024    res->data = (char*) lm;
4025  }
4026  return FALSE;
4027}
4028static BOOLEAN jjLISTRING(leftv res, leftv v)
4029{
4030  ring r=rCompose((lists)v->Data());
4031  if (r==NULL) return TRUE;
4032  if (r->qideal!=NULL) res->rtyp=QRING_CMD;
4033  res->data=(char *)r;
4034  return FALSE;
4035}
4036#if SIZEOF_LONG == 8
4037static number jjLONG2N(long d)
4038{
4039  int i=(int)d;
4040  if ((long)i == d)
4041  {
4042    return nlInit(i);
4043  }
4044  else
4045  {
4046    number z=(number)omAllocBin(rnumber_bin);
4047    #if defined(LDEBUG)
4048    z->debug=123456;
4049    #endif
4050    mpz_init_set_si(&z->z,d);
4051    return z;
4052  }
4053}
4054#else
4055#define jjLONG2N(D) nlInit((int)D)
4056#endif
4057static BOOLEAN jjMEMORY(leftv res, leftv v)
4058{
4059  omUpdateInfo();
4060  long d;
4061  switch(((int)(long)v->Data()))
4062  {
4063  case 0:
4064    res->data=(char *)jjLONG2N(om_Info.UsedBytes);
4065    break;
4066  case 1:
4067    res->data = (char *)jjLONG2N(om_Info.CurrentBytesSystem);
4068    break;
4069  case 2:
4070    res->data = (char *)jjLONG2N(om_Info.MaxBytesSystem);
4071    break;
4072  default:
4073    omPrintStats(stdout);
4074    omPrintInfo(stdout);
4075    omPrintBinStats(stdout);
4076    res->data = (char *)0;
4077    res->rtyp = NONE;
4078  }
4079  return FALSE;
4080  res->data = (char *)0;
4081  return FALSE;
4082}
4083#if SIZEOF_LONG == 8
4084static number jjBI2N(long d)
4085{
4086  if (d<((long)INT_MAX)) return nlInit((int)d);
4087  else
4088  {
4089    number n=nlRInit(0);
4090    mpz_set_si(&n->z,d);
4091    return n;
4092  }
4093}
4094#endif
4095static BOOLEAN jjMONITOR1(leftv res, leftv v)
4096{
4097  monitor((char *)(v->Data()),PROT_I);
4098  return FALSE;
4099}
4100static BOOLEAN jjMSTD(leftv res, leftv v)
4101{
4102  int t=v->Typ();
4103  ideal r,m;
4104  r=kMin_std((ideal)v->Data(),currQuotient,testHomog,NULL,m);
4105  lists l=(lists)omAllocBin(slists_bin);
4106  l->Init(2);
4107  l->m[0].rtyp=t;
4108  l->m[0].data=(char *)r;
4109  setFlag(&(l->m[0]),FLAG_STD);
4110  l->m[1].rtyp=t;
4111  l->m[1].data=(char *)m;
4112  res->data=(char *)l;
4113  return FALSE;
4114}
4115static BOOLEAN jjMULT(leftv res, leftv v)
4116{
4117  assumeStdFlag(v);
4118  res->data = (char *)(long)scMultInt((ideal)(v->Data()),currQuotient);
4119  return FALSE;
4120}
4121static BOOLEAN jjMINRES_R(leftv res, leftv v)
4122{
4123  intvec *weights=(intvec*)atGet(v,"isHomog",INTVEC_CMD);
4124  res->data=(char *)syMinimize((syStrategy)v->Data());
4125  if (weights!=NULL)
4126    atSet(res, omStrDup("isHomog"),ivCopy(weights),INTVEC_CMD);
4127  return FALSE;
4128}
4129static BOOLEAN jjN2BI(leftv res, leftv v)
4130{
4131  number n,i; i=(number)v->Data();
4132  if (rField_is_Zp())     n=nlInit((int)(long)i);
4133  else if (rField_is_Q())
4134  {
4135    if ((SR_HDL(i)&SR_INT)==SR_INT) n=nlInit((int)SR_TO_INT(i));
4136    else if (i->s==3)               n=nlCopy(i);
4137    else goto err;
4138  }
4139  else goto err;
4140  res->data=(void *)n;
4141  return FALSE;
4142err:
4143  WerrorS("cannot convert to bigint"); return TRUE;
4144}
4145static BOOLEAN jjNAMEOF(leftv res, leftv v)
4146{
4147  res->data = (char *)v->name;
4148  if (res->data==NULL) res->data=omStrDup("");
4149  v->name=NULL;
4150  return FALSE;
4151}
4152static BOOLEAN jjNAMES(leftv res, leftv v)
4153{
4154  res->data=ipNameList(((ring)v->Data())->idroot);
4155  return FALSE;
4156}
4157static BOOLEAN jjNVARS(leftv res, leftv v)
4158{
4159  res->data = (char *)(long)(((ring)(v->Data()))->N);
4160  return FALSE;
4161}
4162static BOOLEAN jjOpenClose(leftv res, leftv v)
4163{
4164  si_link l=(si_link)v->Data();
4165  if (iiOp==OPEN_CMD) return slOpen(l, SI_LINK_OPEN);
4166  else                return slClose(l);
4167}
4168static BOOLEAN jjORD(leftv res, leftv v)
4169{
4170  poly p=(poly)v->Data();
4171  res->data=(char *)( p==NULL ? -1 : pFDeg(p,currRing) );
4172  return FALSE;
4173}
4174static BOOLEAN jjPAR1(leftv res, leftv v)
4175{
4176  int i=(int)(long)v->Data();
4177  int p=0;
4178  p=rPar(currRing);
4179  if ((0<i) && (i<=p))
4180  {
4181    res->data=(char *)nPar(i);
4182  }
4183  else
4184  {
4185    Werror("par number %d out of range 1..%d",i,p);
4186    return TRUE;
4187  }
4188  return FALSE;
4189}
4190static BOOLEAN jjPARDEG(leftv res, leftv v)
4191{
4192  res->data = (char *)(long)nParDeg((number)v->Data());
4193  return FALSE;
4194}
4195static BOOLEAN jjPARSTR1(leftv res, leftv v)
4196{
4197  if (currRing==NULL)
4198  {
4199    WerrorS("no ring active");
4200    return TRUE;
4201  }
4202  int i=(int)(long)v->Data();
4203  int p=0;
4204  if ((0<i) && (currRing->parameter!=NULL) && (i<=(p=rPar(currRing))))
4205    res->data=omStrDup(currRing->parameter[i-1]);
4206  else
4207  {
4208    Werror("par number %d out of range 1..%d",i,p);
4209    return TRUE;
4210  }
4211  return FALSE;
4212}
4213static BOOLEAN jjP2I(leftv res, leftv v)
4214{
4215  poly p=(poly)v->Data();
4216  if (p==NULL) { /*res->data=(char *)0;*/ return FALSE; }
4217  if ((pNext(p)!=NULL)|| (!pIsConstant(p)))
4218  {
4219    WerrorS("poly must be constant");
4220    return TRUE;
4221  }
4222  res->data = (char *)(long)nInt(pGetCoeff(p));
4223  return FALSE;
4224}
4225static BOOLEAN jjPREIMAGE_R(leftv res, leftv v)
4226{
4227  map mapping=(map)v->Data();
4228  syMake(res,omStrDup(mapping->preimage));
4229  return FALSE;
4230}
4231static BOOLEAN jjPRIME(leftv res, leftv v)
4232{
4233  int i = IsPrime((int)(long)(v->Data()));
4234  res->data = (char *)(long)(i > 1 ? i : 2);
4235  return FALSE;
4236}
4237static BOOLEAN jjPRUNE(leftv res, leftv v)
4238{
4239  intvec *w=(intvec *)atGet(v,"isHomog",INTVEC_CMD);
4240  ideal v_id=(ideal)v->Data();
4241  if (w!=NULL)
4242  {
4243    if (!idTestHomModule(v_id,currQuotient,w))
4244    {
4245      WarnS("wrong weights");
4246      w=NULL;
4247      // and continue at the non-homog case below
4248    }
4249    else
4250    {
4251      w=ivCopy(w);
4252      intvec **ww=&w;
4253      res->data = (char *)idMinEmbedding(v_id,FALSE,ww);
4254      atSet(res,omStrDup("isHomog"),*ww,INTVEC_CMD);
4255      return FALSE;
4256    }
4257  }
4258  res->data = (char *)idMinEmbedding(v_id);
4259  return FALSE;
4260}
4261static BOOLEAN jjP2N(leftv res, leftv v)
4262{
4263  number n;
4264  poly p;
4265  if (((p=(poly)v->Data())!=NULL)
4266  && (pIsConstant(p)))
4267  {
4268    n=nCopy(pGetCoeff(p));
4269  }
4270  else
4271  {
4272    n=nInit(0);
4273  }
4274  res->data = (char *)n;
4275  return FALSE;
4276}
4277static BOOLEAN jjRESERVEDNAME(leftv res, leftv v)
4278{
4279  char *s= (char *)v->Data();
4280  int i = 1;
4281  int l = strlen(s);
4282  for(i=0; i<sArithBase.nCmdUsed; i++)
4283  {
4284    //Print("test %d, >>%s<<, tab:>>%s<<\n",i,s,sArithBase.sCmds[i].name);
4285    if (strcmp(s, sArithBase.sCmds[i].name) == 0)
4286    {
4287      res->data = (char *)1;
4288      return FALSE;
4289    }
4290  }
4291  //res->data = (char *)0;
4292  return FALSE;
4293}
4294static BOOLEAN jjREAD(leftv res, leftv v)
4295{
4296  return jjREAD2(res,v,NULL);
4297}
4298static BOOLEAN jjREGULARITY(leftv res, leftv v)
4299{
4300  res->data = (char *)(long)iiRegularity((lists)v->Data());
4301  return FALSE;
4302}
4303static BOOLEAN jjREPART(leftv res, leftv v)
4304{
4305  res->data = (char *)nRePart((number)v->Data());
4306  return FALSE;
4307}
4308static BOOLEAN jjRINGLIST(leftv res, leftv v)
4309{
4310  ring r=(ring)v->Data();
4311  if (r!=NULL)
4312    res->data = (char *)rDecompose((ring)v->Data());
4313  return (r==NULL)||(res->data==NULL);
4314}
4315static BOOLEAN jjROWS(leftv res, leftv v)
4316{
4317  ideal i = (ideal)v->Data();
4318  res->data = (char *)i->rank;
4319  return FALSE;
4320}
4321static BOOLEAN jjROWS_IV(leftv res, leftv v)
4322{
4323  res->data = (char *)(long)((intvec*)(v->Data()))->rows();
4324  return FALSE;
4325}
4326static BOOLEAN jjRPAR(leftv res, leftv v)
4327{
4328  res->data = (char *)(long)rPar(((ring)v->Data()));
4329  return FALSE;
4330}
4331static BOOLEAN jjSLIM_GB(leftv res, leftv u)
4332{
4333#ifdef HAVE_PLURAL
4334  const bool bIsSCA = rIsSCA(currRing);
4335#else
4336  const bool bIsSCA = false;
4337#endif
4338
4339  if ((currQuotient!=NULL) && !bIsSCA)
4340  {
4341    WerrorS("qring not supported by slimgb at the moment");
4342    return TRUE;
4343  }
4344  if (pOrdSgn!=1)
4345  {
4346    WerrorS("ordering must be global for slimgb");
4347    return TRUE;
4348  }
4349  intvec *w=(intvec *)atGet(u,"isHomog",INTVEC_CMD);
4350  tHomog hom=testHomog;
4351  ideal u_id=(ideal)u->Data();
4352  if (w!=NULL)
4353  {
4354    if (!idTestHomModule(u_id,currQuotient,w))
4355    {
4356      WarnS("wrong weights");
4357      w=NULL;
4358    }
4359    else
4360    {
4361      w=ivCopy(w);
4362      hom=isHomog;
4363    }
4364  }
4365
4366  assume(u_id->rank>=idRankFreeModule(u_id));
4367  res->data=(char *)t_rep_gb(currRing,
4368    u_id,u_id->rank);
4369  //res->data=(char *)t_rep_gb(currRing, u_id);
4370
4371  if(!TEST_OPT_DEGBOUND) setFlag(res,FLAG_STD);
4372  if (w!=NULL) atSet(res,omStrDup("isHomog"),w,INTVEC_CMD);
4373  return FALSE;
4374}
4375static BOOLEAN jjSTD(leftv res, leftv v)
4376{
4377  ideal result;
4378  ideal v_id=(ideal)v->Data();
4379  intvec *w=(intvec *)atGet(v,"isHomog",INTVEC_CMD);
4380  tHomog hom=testHomog;
4381  if (w!=NULL)
4382  {
4383    if (!idTestHomModule(v_id,currQuotient,w))
4384    {
4385      WarnS("wrong weights");
4386      w=NULL;
4387    }
4388    else
4389    {
4390      hom=isHomog;
4391      w=ivCopy(w);
4392    }
4393  }
4394  result=kStd(v_id,currQuotient,hom,&w);
4395  idSkipZeroes(result);
4396  res->data = (char *)result;
4397  if(!TEST_OPT_DEGBOUND) setFlag(res,FLAG_STD);
4398  if (w!=NULL) atSet(res,omStrDup("isHomog"),w,INTVEC_CMD);
4399  return FALSE;
4400}
4401static BOOLEAN jjSort_Id(leftv res, leftv v)
4402{
4403  res->data = (char *)idSort((ideal)v->Data());
4404  return FALSE;
4405}
4406#if 1
4407static BOOLEAN jjSYZYGY(leftv res, leftv v)
4408{
4409  intvec *w=NULL;
4410  res->data = (char *)idSyzygies((ideal)v->Data(),testHomog,&w);
4411  if (w!=NULL) delete w;
4412  return FALSE;
4413}
4414#else
4415// activate, if idSyz hadle moduke weights correctly !
4416static BOOLEAN jjSYZYGY(leftv res, leftv v)
4417{
4418  intvec *w=(intvec *)atGet(v,"isHomog",INTVEC_CMD);
4419  ideal v_id=(ideal)v->Data();
4420  tHomog hom=testHomog;
4421  int add_row_shift=0;
4422  if (w!=NULL)
4423  {
4424    w=ivCopy(w);
4425    add_row_shift=w->min_in();
4426    (*w)-=add_row_shift;
4427    if (idTestHomModule(v_id,currQuotient,w))
4428      hom=isHomog;
4429    else
4430    {
4431      //WarnS("wrong weights");
4432      delete w; w=NULL;
4433      hom=testHomog;
4434    }
4435  }
4436  res->data = (char *)idSyzygies(v_id,hom,&w);
4437  if (w!=NULL)
4438  {
4439    atSet(res,omStrDup("isHomog"),w,INTVEC_CMD);
4440  }
4441  return FALSE;
4442}
4443#endif
4444static BOOLEAN jjTRACE_IV(leftv res, leftv v)
4445{
4446  res->data = (char *)(long)ivTrace((intvec*)(v->Data()));
4447  return FALSE;
4448}
4449static BOOLEAN jjTRANSP_IV(leftv res, leftv v)
4450{
4451  res->data = (char *)ivTranp((intvec*)(v->Data()));
4452  return FALSE;
4453}
4454#ifdef HAVE_PLURAL
4455static BOOLEAN jjOPPOSITE(leftv res, leftv a)
4456{
4457  ring    r = (ring)a->Data();
4458  if (rIsPluralRing(r))
4459  {
4460    res->data = rOpposite(r);
4461  }
4462  else res->data = rCopy(r);
4463  return FALSE;
4464}
4465static BOOLEAN jjENVELOPE(leftv res, leftv a)
4466{
4467  ring    r = (ring)a->Data();
4468  if (rIsPluralRing(r))
4469  {
4470    //    ideal   i;
4471//     if (a->rtyp == QRING_CMD)
4472//     {
4473//       i = r->qideal;
4474//       r->qideal = NULL;
4475//     }
4476    ring s = rEnvelope(r);
4477//     if (a->rtyp == QRING_CMD)
4478//     {
4479//       ideal is  = idOppose(r,i); /* twostd? */
4480//       is        = idAdd(is,i);
4481//       s->qideal = i;
4482//     }
4483    res->data = s;
4484  }
4485  else  res->data = rCopy(r);
4486  return FALSE;
4487}
4488static BOOLEAN jjTWOSTD(leftv res, leftv a)
4489{
4490  if (rIsPluralRing(currRing))  res->data=(ideal)twostd((ideal)a->Data());
4491  else  res->data=(ideal)a->CopyD();
4492  setFlag(res,FLAG_STD);
4493  setFlag(res,FLAG_TWOSTD);
4494  return FALSE;
4495}
4496#endif
4497
4498static BOOLEAN jjTYPEOF(leftv res, leftv v)
4499{
4500  switch ((int)(long)v->data)
4501  {
4502    case INT_CMD:     res->data=omStrDup("int"); break;
4503    case POLY_CMD:   res->data=omStrDup("poly"); break;
4504    case VECTOR_CMD:  res->data=omStrDup("vector"); break;
4505    case STRING_CMD:  res->data=omStrDup("string"); break;
4506    case INTVEC_CMD:  res->data=omStrDup("intvec"); break;
4507    case IDEAL_CMD:   res->data=omStrDup("ideal"); break;
4508    case MATRIX_CMD: res->data=omStrDup("matrix"); break;
4509    case MODUL_CMD:   res->data=omStrDup("module"); break;
4510    case MAP_CMD:     res->data=omStrDup("map"); break;
4511    case PROC_CMD:    res->data=omStrDup("proc"); break;
4512    case RING_CMD:    res->data=omStrDup("ring"); break;
4513    case QRING_CMD:   res->data=omStrDup("qring"); break;
4514    case INTMAT_CMD:  res->data=omStrDup("intmat"); break;
4515    case NUMBER_CMD:  res->data=omStrDup("number"); break;
4516    case BIGINT_CMD:  res->data=omStrDup("bigint"); break;
4517    case LIST_CMD:   res->data=omStrDup("list"); break;
4518    case PACKAGE_CMD: res->data=omStrDup("package"); break;
4519    case LINK_CMD:   res->data=omStrDup("link"); break;
4520    case RESOLUTION_CMD:res->data=omStrDup("resolution");break;
4521    case DEF_CMD:
4522    case NONE:    res->data=omStrDup("none"); break;
4523    default:       res->data=omStrDup("?unknown type?");
4524  }
4525  return FALSE;
4526}
4527static BOOLEAN jjUNIVARIATE(leftv res, leftv v)
4528{
4529  res->data=(char *)pIsUnivariate((poly)v->Data());
4530  return FALSE;
4531}
4532static BOOLEAN jjVAR1(leftv res, leftv v)
4533{
4534  int i=(int)(long)v->Data();
4535  if ((0<i) && (i<=currRing->N))
4536  {
4537    poly p=pOne();
4538    pSetExp(p,i,1);
4539    pSetm(p);
4540    res->data=(char *)p;
4541  }
4542  else
4543  {
4544    Werror("var number %d out of range 1..%d",i,currRing->N);
4545    return TRUE;
4546  }
4547  return FALSE;
4548}
4549static BOOLEAN jjVARSTR1(leftv res, leftv v)
4550{
4551  if (currRing==NULL)
4552  {
4553    WerrorS("no ring active");
4554    return TRUE;
4555  }
4556  int i=(int)(long)v->Data();
4557  if ((0<i) && (i<=currRing->N))
4558    res->data=omStrDup(currRing->names[i-1]);
4559  else
4560  {
4561    Werror("var number %d out of range 1..%d",i,currRing->N);
4562    return TRUE;
4563  }
4564  return FALSE;
4565}
4566static BOOLEAN jjVDIM(leftv res, leftv v)
4567{
4568  assumeStdFlag(v);
4569  res->data = (char *)(long)scMult0Int((ideal)v->Data(),currQuotient);
4570  return FALSE;
4571}
4572
4573static BOOLEAN jjLOAD1(leftv res, leftv v)
4574{
4575  return jjLOAD(res, v,iiOp==LIB_CMD);
4576}
4577static BOOLEAN jjLOAD(leftv res, leftv v, BOOLEAN autoexport)
4578{
4579#ifdef HAVE_NS
4580  char * s=(char *)v->CopyD();
4581  char libnamebuf[256];
4582  lib_types LT = type_of_LIB(s, libnamebuf);
4583#ifdef HAVE_DYNAMIC_LOADING
4584  extern BOOLEAN load_modules(char *newlib, char *fullpath, BOOLEAN autoexport);
4585#endif /* HAVE_DYNAMIC_LOADING */
4586  switch(LT)
4587  {
4588      default:
4589      case LT_NONE:
4590        Werror("%s: unknown type", s);
4591        break;
4592      case LT_NOTFOUND:
4593        Werror("cannot open %s", s);
4594        break;
4595
4596      case LT_SINGULAR:
4597      {
4598        char *plib = iiConvName(s);
4599        idhdl pl = IDROOT->get(plib,0);
4600        if (pl==NULL)
4601        {
4602          pl = enterid( plib,0, PACKAGE_CMD, &(basePack->idroot), TRUE );
4603          IDPACKAGE(pl)->language = LANG_SINGULAR;
4604          IDPACKAGE(pl)->libname=omStrDup(plib);
4605        }
4606        else if (IDTYP(pl)!=PACKAGE_CMD)
4607        {
4608          Werror("can not create package `%s`",plib);
4609          omFree(plib);
4610          return TRUE;
4611        }
4612        package savepack=currPack;
4613        currPack=IDPACKAGE(pl);
4614        IDPACKAGE(pl)->loaded=TRUE;
4615        char libnamebuf[256];
4616        FILE * fp = feFopen( s, "r", libnamebuf, TRUE );
4617        BOOLEAN bo=iiLoadLIB(fp, libnamebuf, s, pl, autoexport, TRUE);
4618        currPack=savepack;
4619        IDPACKAGE(pl)->loaded=(!bo);
4620        return bo;
4621      }
4622      case LT_MACH_O:
4623      case LT_ELF:
4624      case LT_HPUX:
4625#ifdef HAVE_DYNAMIC_LOADING
4626        return load_modules(s, libnamebuf, autoexport);
4627#else /* HAVE_DYNAMIC_LOADING */
4628        WerrorS("Dynamic modules are not supported by this version of Singular");
4629        break;
4630#endif /* HAVE_DYNAMIC_LOADING */
4631  }
4632#endif
4633  return TRUE;
4634}
4635
4636/*=================== operations with 1 arg.: table =================*/
4637
4638#ifdef INIT_BUG
4639#define XS(A) -((short)A)
4640#define jjstrlen       (proc1)1
4641#define jjpLength      (proc1)2
4642#define jjidElem       (proc1)3
4643#define jjmpDetBareiss (proc1)4
4644#define jjidFreeModule (proc1)5
4645#define jjidVec2Ideal  (proc1)6
4646#define jjrCharStr     (proc1)7
4647#ifndef MDEBUG
4648#define jjpHead        (proc1)8
4649#endif
4650#define jjidHead       (proc1)9
4651#define jjidMaxIdeal   (proc1)10
4652#define jjidMinBase    (proc1)11
4653#define jjsyMinBase    (proc1)12
4654#define jjpMaxComp     (proc1)13
4655#define jjmpTrace      (proc1)14
4656#define jjmpTransp     (proc1)15
4657#define jjrOrdStr      (proc1)16
4658#define jjrVarStr      (proc1)18
4659#define jjrParStr      (proc1)19
4660#define jjCOUNT_RES    (proc1)22
4661#define jjDIM_R        (proc1)23
4662#define jjidTransp     (proc1)24
4663
4664extern struct sValCmd1 dArith1[];
4665void jjInitTab1()
4666{
4667  int i=0;
4668  for (;dArith1[i].cmd!=0;i++)
4669  {
4670    if (dArith1[i].res<0)
4671    {
4672      switch ((int)dArith1[i].p)
4673      {
4674        case (int)jjstrlen:       dArith1[i].p=(proc1)strlen; break;
4675        case (int)jjpLength:      dArith1[i].p=(proc1)pLength; break;
4676        case (int)jjidElem:       dArith1[i].p=(proc1)idElem; break;
4677        case (int)jjidVec2Ideal:  dArith1[i].p=(proc1)idVec2Ideal; break;
4678#ifndef HAVE_FACTORY
4679        case (int)jjmpDetBareiss: dArith1[i].p=(proc1)mpDetBareiss; break;
4680#endif
4681        case (int)jjidFreeModule: dArith1[i].p=(proc1)idFreeModule; break;
4682        case (int)jjrCharStr:     dArith1[i].p=(proc1)rCharStr; break;
4683#ifndef MDEBUG
4684        case (int)jjpHead:        dArith1[i].p=(proc1)pHeadProc; break;
4685#endif
4686        case (int)jjidHead:       dArith1[i].p=(proc1)idHead; break;
4687        case (int)jjidMaxIdeal:   dArith1[i].p=(proc1)idMaxIdeal; break;
4688        case (int)jjidMinBase:    dArith1[i].p=(proc1)idMinBase; break;
4689        case (int)jjsyMinBase:    dArith1[i].p=(proc1)syMinBase; break;
4690        case (int)jjpMaxComp:     dArith1[i].p=(proc1)pMaxCompProc; break;
4691        case (int)jjmpTrace:      dArith1[i].p=(proc1)mpTrace; break;
4692        case (int)jjmpTransp:     dArith1[i].p=(proc1)mpTransp; break;
4693        case (int)jjrOrdStr:      dArith1[i].p=(proc1)rOrdStr; break;
4694        case (int)jjrVarStr:      dArith1[i].p=(proc1)rVarStr; break;
4695        case (int)jjrParStr:      dArith1[i].p=(proc1)rParStr; break;
4696        case (int)jjCOUNT_RES:    dArith1[i].p=(proc1)syLength; break;
4697        case (int)jjDIM_R:        dArith1[i].p=(proc1)syDim; break;
4698        case (int)jjidTransp:     dArith1[i].p=(proc1)idTransp; break;
4699#ifdef GENTABLE
4700        default: Werror("missing proc1-definition for %d",(int)(long)dArith1[i].p);
4701#endif
4702      }
4703    }
4704  }
4705}
4706#else
4707#if defined(PROC_BUG)
4708#define XS(A) A
4709static BOOLEAN jjstrlen(leftv res, leftv v)
4710{
4711  res->data = (char *)strlen((char *)v->Data());
4712  return FALSE;
4713}
4714static BOOLEAN jjpLength(leftv res, leftv v)
4715{
4716  res->data = (char *)pLength((poly)v->Data());
4717  return FALSE;
4718}
4719static BOOLEAN jjidElem(leftv res, leftv v)
4720{
4721  res->data = (char *)idElem((ideal)v->Data());
4722  return FALSE;
4723}
4724static BOOLEAN jjmpDetBareiss(leftv res, leftv v)
4725{
4726  res->data = (char *)mpDetBareiss((matrix)v->Data());
4727  return FALSE;
4728}
4729static BOOLEAN jjidFreeModule(leftv res, leftv v)
4730{
4731  res->data = (char *)idFreeModule((int)(long)v->Data());
4732  return FALSE;
4733}
4734static BOOLEAN jjidVec2Ideal(leftv res, leftv v)
4735{
4736  res->data = (char *)idVec2Ideal((poly)v->Data());
4737  return FALSE;
4738}
4739static BOOLEAN jjrCharStr(leftv res, leftv v)
4740{
4741  res->data = rCharStr((ring)v->Data());
4742  return FALSE;
4743}
4744#ifndef MDEBUG
4745static BOOLEAN jjpHead(leftv res, leftv v)
4746{
4747  res->data = (char *)pHead((poly)v->Data());
4748  return FALSE;
4749}
4750#endif
4751static BOOLEAN jjidHead(leftv res, leftv v)
4752{
4753  res->data = (char *)idHead((ideal)v->Data());
4754  return FALSE;
4755}
4756static BOOLEAN jjidMaxIdeal(leftv res, leftv v)
4757{
4758  res->data = (char *)idMaxIdeal((int)(long)v->Data());
4759  return FALSE;
4760}
4761static BOOLEAN jjidMinBase(leftv res, leftv v)
4762{
4763  res->data = (char *)idMinBase((ideal)v->Data());
4764  return FALSE;
4765}
4766static BOOLEAN jjsyMinBase(leftv res, leftv v)
4767{
4768  res->data = (char *)syMinBase((ideal)v->Data());
4769  return FALSE;
4770}
4771static BOOLEAN jjpMaxComp(leftv res, leftv v)
4772{
4773  res->data = (char *)pMaxComp((poly)v->Data());
4774  return FALSE;
4775}
4776static BOOLEAN jjmpTrace(leftv res, leftv v)
4777{
4778  res->data = (char *)mpTrace((matrix)v->Data());
4779  return FALSE;
4780}
4781static BOOLEAN jjmpTransp(leftv res, leftv v)
4782{
4783  res->data = (char *)mpTransp((matrix)v->Data());
4784  return FALSE;
4785}
4786static BOOLEAN jjrOrdStr(leftv res, leftv v)
4787{
4788  res->data = rOrdStr((ring)v->Data());
4789  return FALSE;
4790}
4791static BOOLEAN jjrVarStr(leftv res, leftv v)
4792{
4793  res->data = rVarStr((ring)v->Data());
4794  return FALSE;
4795}
4796static BOOLEAN jjrParStr(leftv res, leftv v)
4797{
4798  res->data = rParStr((ring)v->Data());
4799  return FALSE;
4800}
4801static BOOLEAN jjCOUNT_RES(leftv res, leftv v)
4802{
4803  res->data=(char *)syLength((syStrategy)v->Data());
4804  return FALSE;
4805}
4806static BOOLEAN jjDIM_R(leftv res, leftv v)
4807{
4808  res->data = (char *)syDim((syStrategy)v->Data());
4809  return FALSE;
4810}
4811static BOOLEAN jjidTransp(leftv res, leftv v)
4812{
4813  res->data = (char *)idTransp((ideal)v->Data());
4814  return FALSE;
4815}
4816#else
4817#define XS(A)          -((short)A)
4818#define jjstrlen       (proc1)strlen
4819#define jjpLength      (proc1)pLength
4820#define jjidElem       (proc1)idElem
4821#define jjmpDetBareiss (proc1)mpDetBareiss
4822#define jjidFreeModule (proc1)idFreeModule
4823#define jjidVec2Ideal  (proc1)idVec2Ideal
4824#define jjrCharStr     (proc1)rCharStr
4825#ifndef MDEBUG
4826#define jjpHead        (proc1)pHeadProc
4827#endif
4828#define jjidHead       (proc1)idHead
4829#define jjidMaxIdeal   (proc1)idMaxIdeal
4830#define jjidMinBase    (proc1)idMinBase
4831#define jjsyMinBase    (proc1)syMinBase
4832#define jjpMaxComp     (proc1)pMaxCompProc
4833#define jjmpTrace      (proc1)mpTrace
4834#define jjmpTransp     (proc1)mpTransp
4835#define jjrOrdStr      (proc1)rOrdStr
4836#define jjrVarStr      (proc1)rVarStr
4837#define jjrParStr      (proc1)rParStr
4838#define jjCOUNT_RES    (proc1)syLength
4839#define jjDIM_R        (proc1)syDim
4840#define jjidTransp     (proc1)idTransp
4841#endif
4842#endif
4843static BOOLEAN jjnInt(leftv res, leftv u)
4844{
4845  number n=(number)u->Data();
4846  res->data=(char *)(long)nInt(n);
4847  return FALSE;
4848}
4849static BOOLEAN jjnlInt(leftv res, leftv u)
4850{
4851  number n=(number)u->Data();
4852  res->data=(char *)(long)nlInt(n);
4853  return FALSE;
4854}
4855#define s short
4856struct sValCmd1 dArith1[]=
4857{
4858// operations:
4859// proc         cmd               res             arg           plural
4860// {jjPLUSPLUS,   PLUSPLUS,        INT_CMD,        INT_CMD      ALLOW_PLURAL}
4861//,{jjMINUSMINUS, MINUSMINUS,      INT_CMD,        INT_CMD      ALLOW_PLURAL}
4862 {jjPLUSPLUS,   PLUSPLUS,        NONE,           IDHDL          ALLOW_PLURAL}
4863,{jjPLUSPLUS,   MINUSMINUS,      NONE,           IDHDL          ALLOW_PLURAL}
4864,{jjUMINUS_I,   '-',             INT_CMD,        INT_CMD        ALLOW_PLURAL}
4865,{jjUMINUS_BI,   '-',            BIGINT_CMD,     BIGINT_CMD     ALLOW_PLURAL}
4866,{jjUMINUS_N,   '-',             NUMBER_CMD,     NUMBER_CMD     ALLOW_PLURAL}
4867,{jjUMINUS_P,   '-',             POLY_CMD,       POLY_CMD       ALLOW_PLURAL}
4868,{jjUMINUS_P,   '-',             VECTOR_CMD,     VECTOR_CMD     ALLOW_PLURAL}
4869,{jjUMINUS_MA,  '-',             MATRIX_CMD,     MATRIX_CMD     ALLOW_PLURAL}
4870,{jjUMINUS_IV,  '-',             INTVEC_CMD,     INTVEC_CMD     ALLOW_PLURAL}
4871,{jjUMINUS_IV,  '-',             INTMAT_CMD,     INTMAT_CMD     ALLOW_PLURAL}
4872,{jjPROC1,      '(',             ANY_TYPE/*set by p*/,PROC_CMD  ALLOW_PLURAL}
4873,{jjLOAD1,      '(',             NONE,           STRING_CMD     ALLOW_PLURAL}
4874// and the procedures with 1 argument:
4875,{atATTRIB1,    ATTRIB_CMD,      NONE,           DEF_CMD        ALLOW_PLURAL}
4876//,{jjBAREISS_IM, BAREISS_CMD,     INTMAT_CMD,     INTMAT_CMD   NO_PLURAL}
4877,{jjBAREISS,    BAREISS_CMD,     LIST_CMD,       MODUL_CMD      NO_PLURAL}
4878,{jjBETTI,      BETTI_CMD,       INTMAT_CMD,     LIST_CMD       ALLOW_PLURAL}
4879,{syBetti1,     BETTI_CMD,       INTMAT_CMD,     RESOLUTION_CMD ALLOW_PLURAL}
4880,{jjBETTI,      BETTI_CMD,       INTMAT_CMD,     IDEAL_CMD      ALLOW_PLURAL}
4881,{jjBETTI,      BETTI_CMD,       INTMAT_CMD,     MODUL_CMD      ALLOW_PLURAL}
4882,{jjDUMMY,      BIGINT_CMD,      BIGINT_CMD,     BIGINT_CMD     ALLOW_PLURAL}
4883,{jjN2BI,       BIGINT_CMD,      BIGINT_CMD,     NUMBER_CMD     ALLOW_PLURAL}
4884,{jjCHAR,       CHARACTERISTIC_CMD, INT_CMD,     RING_CMD       ALLOW_PLURAL}
4885,{jjCHAR,       CHARACTERISTIC_CMD, INT_CMD,     QRING_CMD      ALLOW_PLURAL}
4886#ifdef HAVE_FACTORY
4887,{jjCHARSERIES, CHAR_SERIES_CMD, MATRIX_CMD,     IDEAL_CMD      NO_PLURAL}
4888#else
4889,{jjWRONG,      CHAR_SERIES_CMD, MATRIX_CMD,     IDEAL_CMD      NO_PLURAL}
4890#endif
4891,{jjrCharStr,   CHARSTR_CMD,     XS(STRING_CMD), RING_CMD       ALLOW_PLURAL}
4892,{jjrCharStr,   CHARSTR_CMD,     XS(STRING_CMD), QRING_CMD      ALLOW_PLURAL}
4893,{jjOpenClose,  CLOSE_CMD,       NONE,           LINK_CMD       ALLOW_PLURAL}
4894//,{jjWRONG,      COLS_CMD,        0,              VECTOR_CMD   ALLOW_PLURAL}
4895,{jjCOLS,       COLS_CMD,        INT_CMD,        MATRIX_CMD     ALLOW_PLURAL}
4896,{jjCOLS,       COLS_CMD,        INT_CMD,        IDEAL_CMD      ALLOW_PLURAL}
4897,{jjCOLS,       COLS_CMD,        INT_CMD,        MODUL_CMD      ALLOW_PLURAL}
4898,{jjCOLS_IV,    COLS_CMD,        INT_CMD,        INTMAT_CMD     ALLOW_PLURAL}
4899,{jjWRONG,      COLS_CMD,        0,              INTVEC_CMD     ALLOW_PLURAL}
4900,{jjCONTENT,    CONTENT_CMD,     POLY_CMD,       POLY_CMD       ALLOW_PLURAL}
4901,{jjCONTENT,    CONTENT_CMD,     VECTOR_CMD,     VECTOR_CMD     ALLOW_PLURAL}
4902,{jjCOUNT_N,    COUNT_CMD,       INT_CMD,        NUMBER_CMD     ALLOW_PLURAL}
4903,{jjCOUNT_RES,  COUNT_CMD,       XS(INT_CMD),    RESOLUTION_CMD NO_PLURAL}
4904,{jjstrlen,     COUNT_CMD,       XS(INT_CMD),    STRING_CMD     ALLOW_PLURAL}
4905,{jjpLength,    COUNT_CMD,       XS(INT_CMD),    POLY_CMD       ALLOW_PLURAL}
4906,{jjpLength,    COUNT_CMD,       XS(INT_CMD),    VECTOR_CMD     ALLOW_PLURAL}
4907,{jjidElem,     COUNT_CMD,       XS(INT_CMD),    IDEAL_CMD      ALLOW_PLURAL}
4908,{jjidElem,     COUNT_CMD,       XS(INT_CMD),    MODUL_CMD      ALLOW_PLURAL}
4909,{jjCOUNT_M,    COUNT_CMD,       INT_CMD,        MATRIX_CMD     ALLOW_PLURAL}
4910,{jjCOUNT_IV,   COUNT_CMD,       INT_CMD,        INTVEC_CMD     ALLOW_PLURAL}
4911,{jjCOUNT_IV,   COUNT_CMD,       INT_CMD,        INTMAT_CMD     ALLOW_PLURAL}
4912,{jjCOUNT_L,    COUNT_CMD,       INT_CMD,        LIST_CMD       ALLOW_PLURAL}
4913,{jjCOUNT_RG,   COUNT_CMD,       INT_CMD,        RING_CMD       ALLOW_PLURAL}
4914,{jjNULL,       DEF_CMD,         DEF_CMD,        INT_CMD        ALLOW_PLURAL}
4915,{jjWRONG,      DEF_CMD,         0,              ANY_TYPE       ALLOW_PLURAL}
4916,{jjDEG,        DEG_CMD,         INT_CMD,        POLY_CMD       ALLOW_PLURAL}
4917,{jjDEG,        DEG_CMD,         INT_CMD,        VECTOR_CMD     ALLOW_PLURAL}
4918,{jjDEG_M,      DEG_CMD,         INT_CMD,        MATRIX_CMD     ALLOW_PLURAL}
4919,{jjDEGREE,     DEGREE_CMD,      NONE,           IDEAL_CMD      NO_PLURAL}
4920,{jjDEGREE,     DEGREE_CMD,      NONE,           MODUL_CMD      NO_PLURAL}
4921,{jjDEFINED,    DEFINED_CMD,     INT_CMD,        DEF_CMD        ALLOW_PLURAL}
4922#ifdef HAVE_FACTORY
4923,{jjDET_I,      DET_CMD,         INT_CMD,        INTMAT_CMD     ALLOW_PLURAL}
4924,{jjDET,        DET_CMD,         POLY_CMD,       MATRIX_CMD     NO_PLURAL}
4925,{jjDET_S,      DET_CMD,         POLY_CMD,       MODUL_CMD      NO_PLURAL}
4926#else
4927,{jjWRONG,      DET_CMD,         INT_CMD,        INTMAT_CMD     ALLOW_PLURAL}
4928,{jjmpDetBareiss,DET_CMD,        XS(POLY_CMD),   MATRIX_CMD     NO_PLURAL}
4929#endif
4930,{jjDIM,        DIM_CMD,         INT_CMD,        IDEAL_CMD      NO_PLURAL}
4931,{jjDIM,        DIM_CMD,         INT_CMD,        MODUL_CMD      NO_PLURAL}
4932,{jjDIM_R,      DIM_CMD,         XS(INT_CMD),    RESOLUTION_CMD NO_PLURAL}
4933,{jjDUMP,       DUMP_CMD,        NONE,           LINK_CMD       ALLOW_PLURAL}
4934,{jjE,          E_CMD,           VECTOR_CMD,     INT_CMD        ALLOW_PLURAL}
4935,{jjEXECUTE,    EXECUTE_CMD,     NONE,           STRING_CMD     ALLOW_PLURAL}
4936,{jjERROR,      ERROR_CMD,       NONE,           STRING_CMD     ALLOW_PLURAL}
4937#ifdef HAVE_FACTORY
4938,{jjFAC_P,      FAC_CMD,         LIST_CMD,       POLY_CMD       NO_PLURAL}
4939#else
4940,{jjWRONG,      FAC_CMD,         LIST_CMD,       POLY_CMD       NO_PLURAL}
4941#endif
4942#ifdef HAVE_FGLM
4943,{findUniProc,  FINDUNI_CMD,     IDEAL_CMD,      IDEAL_CMD      NO_PLURAL}
4944#else
4945,{jjWRONG,      FINDUNI_CMD,     IDEAL_CMD,      IDEAL_CMD      NO_PLURAL}
4946#endif
4947,{jjidFreeModule,FREEMODULE_CMD, XS(MODUL_CMD),  INT_CMD        ALLOW_PLURAL}
4948#ifdef HAVE_FACTORY
4949,{jjFACSTD,     FACSTD_CMD,      LIST_CMD,       IDEAL_CMD      NO_PLURAL}
4950#else
4951,{jjWRONG,      FACSTD_CMD,      LIST_CMD,       IDEAL_CMD      NO_PLURAL}
4952#endif
4953,{jjGETDUMP,    GETDUMP_CMD,     NONE,           LINK_CMD       ALLOW_PLURAL}
4954,{jjHIGHCORNER, HIGHCORNER_CMD,  POLY_CMD,       IDEAL_CMD      NO_PLURAL}
4955,{jjHIGHCORNER_M, HIGHCORNER_CMD,VECTOR_CMD,     MODUL_CMD      NO_PLURAL}
4956,{jjHILBERT,    HILBERT_CMD,     NONE,           IDEAL_CMD      NO_PLURAL}
4957,{jjHILBERT,    HILBERT_CMD,     NONE,           MODUL_CMD      NO_PLURAL}
4958,{jjHILBERT_IV, HILBERT_CMD,     INTVEC_CMD,     INTVEC_CMD     NO_PLURAL}
4959,{jjHOMOG1,     HOMOG_CMD,       INT_CMD,        IDEAL_CMD      ALLOW_PLURAL}
4960,{jjHOMOG1,     HOMOG_CMD,       INT_CMD,        MODUL_CMD      ALLOW_PLURAL}
4961,{jjidVec2Ideal,IDEAL_CMD,       XS(IDEAL_CMD),  VECTOR_CMD     ALLOW_PLURAL}
4962,{jjIDEAL_Ma,   IDEAL_CMD,       IDEAL_CMD,      MATRIX_CMD     ALLOW_PLURAL}
4963,{jjIDEAL_R,    IDEAL_CMD,       IDEAL_CMD,      QRING_CMD      ALLOW_PLURAL}
4964,{jjIDEAL_R,    IDEAL_CMD,       IDEAL_CMD,      RING_CMD       ALLOW_PLURAL}
4965,{jjIDEAL_Map,  IDEAL_CMD,       IDEAL_CMD,      MAP_CMD        ALLOW_PLURAL}
4966,{jjDUMMY,      IDEAL_CMD,       IDEAL_CMD,      IDEAL_CMD      ALLOW_PLURAL}
4967,{jjIMPART,     IMPART_CMD,      NUMBER_CMD,     NUMBER_CMD     ALLOW_PLURAL}
4968,{jjINDEPSET,   INDEPSET_CMD,    INTVEC_CMD,     IDEAL_CMD      NO_PLURAL}
4969,{jjDUMMY,      INT_CMD,         INT_CMD,        INT_CMD        ALLOW_PLURAL}
4970,{jjnlInt,      INT_CMD,         INT_CMD,        BIGINT_CMD     ALLOW_PLURAL}
4971,{jjnInt,       INT_CMD,         INT_CMD,        NUMBER_CMD     ALLOW_PLURAL}
4972,{jjP2I,        INT_CMD,         INT_CMD,        POLY_CMD       ALLOW_PLURAL}
4973,{jjINTERRED,   INTERRED_CMD,    IDEAL_CMD,      IDEAL_CMD      ALLOW_PLURAL}
4974,{jjINTERRED,   INTERRED_CMD,    MODUL_CMD,      MODUL_CMD      ALLOW_PLURAL}
4975,{jjDUMMY,      INTMAT_CMD,      INTMAT_CMD,     INTMAT_CMD     ALLOW_PLURAL}
4976,{jjIm2Iv,      INTVEC_CMD,      INTVEC_CMD,     INTMAT_CMD     ALLOW_PLURAL}
4977,{jjDUMMY,      INTVEC_CMD,      INTVEC_CMD,     INTVEC_CMD     ALLOW_PLURAL}
4978,{jjIS_RINGVAR_P, IS_RINGVAR,    INT_CMD,        POLY_CMD       ALLOW_PLURAL}
4979,{jjIS_RINGVAR_S, IS_RINGVAR,    INT_CMD,        STRING_CMD     ALLOW_PLURAL}
4980,{jjIS_RINGVAR0,IS_RINGVAR,      INT_CMD,        ANY_TYPE       ALLOW_PLURAL}
4981,{jjJACOB_P,    JACOB_CMD,       IDEAL_CMD,      POLY_CMD       ALLOW_PLURAL}
4982,{mpJacobi,     JACOB_CMD,       MATRIX_CMD,     IDEAL_CMD      ALLOW_PLURAL}
4983,{jjJanetBasis, JANET_CMD,       IDEAL_CMD,      IDEAL_CMD      ALLOW_PLURAL}
4984,{jjKBASE,      KBASE_CMD,       IDEAL_CMD,      IDEAL_CMD      ALLOW_PLURAL}
4985,{jjKBASE,      KBASE_CMD,       MODUL_CMD,      MODUL_CMD      ALLOW_PLURAL}
4986,{atKILLATTR1,  KILLATTR_CMD,    NONE,           IDHDL          ALLOW_PLURAL}
4987#ifdef MDEBUG
4988,{jjpHead,      LEAD_CMD,        POLY_CMD,       POLY_CMD       ALLOW_PLURAL}
4989#else
4990,{jjpHead,      LEAD_CMD,        XS(POLY_CMD),   POLY_CMD       ALLOW_PLURAL}
4991#endif
4992,{jjidHead,     LEAD_CMD,        XS(IDEAL_CMD),  IDEAL_CMD      ALLOW_PLURAL}
4993#ifdef MDEBUG
4994,{jjpHead,      LEAD_CMD,        VECTOR_CMD,     VECTOR_CMD     ALLOW_PLURAL}
4995#else
4996,{jjpHead,      LEAD_CMD,        XS(VECTOR_CMD), VECTOR_CMD     ALLOW_PLURAL}
4997#endif
4998,{jjidHead,     LEAD_CMD,        XS(MODUL_CMD),  MODUL_CMD      ALLOW_PLURAL}
4999,{jjLEADCOEF,   LEADCOEF_CMD,    NUMBER_CMD,     POLY_CMD       ALLOW_PLURAL}
5000,{jjLEADCOEF,   LEADCOEF_CMD,    NUMBER_CMD,     VECTOR_CMD     ALLOW_PLURAL}
5001,{jjLEADEXP,    LEADEXP_CMD,     INTVEC_CMD,     POLY_CMD       ALLOW_PLURAL}
5002,{jjLEADEXP,    LEADEXP_CMD,     INTVEC_CMD,     VECTOR_CMD     ALLOW_PLURAL}
5003,{jjLEADMONOM,  LEADMONOM_CMD,   POLY_CMD,       POLY_CMD       ALLOW_PLURAL}
5004,{jjLEADMONOM,  LEADMONOM_CMD,   VECTOR_CMD,     VECTOR_CMD     ALLOW_PLURAL}
5005,{jjLOAD1,      LIB_CMD,         NONE,           STRING_CMD     ALLOW_PLURAL}
5006,{jjDUMMY,      LINK_CMD,        LINK_CMD,       LINK_CMD       ALLOW_PLURAL}
5007,{jjCALL1MANY,  LIST_CMD,        LIST_CMD,       DEF_CMD        ALLOW_PLURAL}
5008,{jjWRONG,      MAP_CMD,         0,              ANY_TYPE       ALLOW_PLURAL}
5009,{jjDUMMY,      MATRIX_CMD,      MATRIX_CMD,     MATRIX_CMD     ALLOW_PLURAL}
5010,{jjidMaxIdeal, MAXID_CMD,       XS(IDEAL_CMD),  INT_CMD        ALLOW_PLURAL}
5011,{jjMEMORY,     MEMORY_CMD,      BIGINT_CMD,     INT_CMD        ALLOW_PLURAL}
5012,{jjidMinBase,  MINBASE_CMD,     XS(IDEAL_CMD),  IDEAL_CMD      NO_PLURAL}
5013,{jjidMinBase,  MINBASE_CMD,     XS(MODUL_CMD),  MODUL_CMD      NO_PLURAL}
5014,{jjMINRES,     MINRES_CMD,      LIST_CMD,       LIST_CMD       ALLOW_PLURAL}
5015,{jjMINRES_R,   MINRES_CMD,      RESOLUTION_CMD, RESOLUTION_CMD ALLOW_PLURAL}
5016,{jjDUMMY,      MODUL_CMD,       MODUL_CMD,      MODUL_CMD      ALLOW_PLURAL}
5017,{jjMONITOR1,   MONITOR_CMD,     NONE,           STRING_CMD     ALLOW_PLURAL}
5018,{jjMULT,       MULTIPLICITY_CMD,  INT_CMD,      IDEAL_CMD      NO_PLURAL}
5019,{jjMULT,       MULTIPLICITY_CMD,  INT_CMD,      MODUL_CMD      NO_PLURAL}
5020,{jjMSTD,       MSTD_CMD,        LIST_CMD,       IDEAL_CMD      NO_PLURAL}
5021,{jjMSTD,       MSTD_CMD,        LIST_CMD,       MODUL_CMD      NO_PLURAL}
5022,{jjNAMEOF,     NAMEOF_CMD,      STRING_CMD,     ANY_TYPE       ALLOW_PLURAL}
5023,{jjNAMES,      NAMES_CMD,       LIST_CMD,       PACKAGE_CMD    ALLOW_PLURAL}
5024,{jjNAMES,      NAMES_CMD,       LIST_CMD,       RING_CMD       ALLOW_PLURAL}
5025,{jjNAMES,      NAMES_CMD,       LIST_CMD,       QRING_CMD      ALLOW_PLURAL}
5026,{jjDUMMY,      NUMBER_CMD,      NUMBER_CMD,     NUMBER_CMD     ALLOW_PLURAL}
5027,{jjP2N,        NUMBER_CMD,      NUMBER_CMD,     POLY_CMD       ALLOW_PLURAL}
5028,{jjBI2N,       NUMBER_CMD,      NUMBER_CMD,     BIGINT_CMD     ALLOW_PLURAL}
5029,{jjRPAR,       NPARS_CMD,       INT_CMD,        RING_CMD       ALLOW_PLURAL}
5030,{jjRPAR,       NPARS_CMD,       INT_CMD,        QRING_CMD      ALLOW_PLURAL}
5031,{jjNVARS,      NVARS_CMD,       INT_CMD,        RING_CMD       ALLOW_PLURAL}
5032,{jjNVARS,      NVARS_CMD,       INT_CMD,        QRING_CMD      ALLOW_PLURAL}
5033,{jjOpenClose,  OPEN_CMD,        NONE,           LINK_CMD       ALLOW_PLURAL}
5034,{jjORD,        ORD_CMD,         INT_CMD,        POLY_CMD       ALLOW_PLURAL}
5035,{jjORD,        ORD_CMD,         INT_CMD,        VECTOR_CMD     ALLOW_PLURAL}
5036,{jjrOrdStr,    ORDSTR_CMD,      XS(STRING_CMD), RING_CMD       ALLOW_PLURAL}
5037,{jjrOrdStr,    ORDSTR_CMD,      XS(STRING_CMD), QRING_CMD      ALLOW_PLURAL}
5038,{jjPAR1,       PAR_CMD,         NUMBER_CMD,     INT_CMD        ALLOW_PLURAL}
5039,{jjPARDEG,     PARDEG_CMD,      INT_CMD,        NUMBER_CMD     ALLOW_PLURAL}
5040,{jjPARSTR1,    PARSTR_CMD,      STRING_CMD,     INT_CMD        ALLOW_PLURAL}
5041,{jjrParStr,    PARSTR_CMD,      XS(STRING_CMD), RING_CMD       ALLOW_PLURAL}
5042,{jjrParStr,    PARSTR_CMD,      XS(STRING_CMD), QRING_CMD      ALLOW_PLURAL}
5043,{jjDUMMY,      POLY_CMD,        POLY_CMD,       POLY_CMD       ALLOW_PLURAL}
5044,{jjBI2P,       POLY_CMD,        POLY_CMD,       BIGINT_CMD     ALLOW_PLURAL}
5045,{jjPREIMAGE_R, PREIMAGE_CMD,    RING_CMD,       MAP_CMD        NO_PLURAL}
5046,{jjPRIME,      PRIME_CMD,       INT_CMD,        INT_CMD        ALLOW_PLURAL}
5047,{jjPRINT,      PRINT_CMD,       NONE,           LIST_CMD       ALLOW_PLURAL}
5048,{jjPRINT,      PRINT_CMD,       NONE,           DEF_CMD        ALLOW_PLURAL}
5049,{jjPRUNE,      PRUNE_CMD,       MODUL_CMD,      MODUL_CMD      ALLOW_PLURAL}
5050,{kQHWeight,    QHWEIGHT_CMD,    INTVEC_CMD,     IDEAL_CMD      ALLOW_PLURAL}
5051,{kQHWeight,    QHWEIGHT_CMD,    INTVEC_CMD,     MODUL_CMD      ALLOW_PLURAL}
5052,{jjWRONG,      QRING_CMD,       0,              ANY_TYPE       ALLOW_PLURAL}
5053,{jjREAD,       READ_CMD,        STRING_CMD,     LINK_CMD       ALLOW_PLURAL}
5054,{jjREGULARITY, REGULARITY_CMD,  INT_CMD,        LIST_CMD       NO_PLURAL}
5055,{jjREPART,     REPART_CMD,      NUMBER_CMD,     NUMBER_CMD     ALLOW_PLURAL}
5056,{jjRESERVEDNAME,RESERVEDNAME_CMD, INT_CMD,      STRING_CMD     ALLOW_PLURAL}
5057,{jjL2R,        RESOLUTION_CMD,  RESOLUTION_CMD, LIST_CMD       ALLOW_PLURAL}
5058,{jjDUMMY,      RESOLUTION_CMD,  RESOLUTION_CMD, RESOLUTION_CMD ALLOW_PLURAL}
5059,{jjRINGLIST,   RINGLIST_CMD,    LIST_CMD,       RING_CMD       ALLOW_PLURAL}
5060,{jjRINGLIST,   RINGLIST_CMD,    LIST_CMD,       QRING_CMD      ALLOW_PLURAL}
5061,{jjDUMMY,      RING_CMD,        RING_CMD,       RING_CMD       ALLOW_PLURAL}
5062,{jjLISTRING,   RING_CMD,        RING_CMD,       LIST_CMD       ALLOW_PLURAL}
5063//,{jjWRONG,      ROWS_CMD,        0,              POLY_CMD     ALLOW_PLURAL}
5064,{jjpMaxComp,   ROWS_CMD,        XS(INT_CMD),    VECTOR_CMD     ALLOW_PLURAL}
5065,{jjROWS,       ROWS_CMD,        INT_CMD,        MODUL_CMD      ALLOW_PLURAL}
5066,{jjROWS,       ROWS_CMD,        INT_CMD,        MATRIX_CMD     ALLOW_PLURAL}
5067,{jjROWS_IV,    ROWS_CMD,        INT_CMD,        INTMAT_CMD     ALLOW_PLURAL}
5068,{jjCOUNT_IV,   ROWS_CMD,        INT_CMD,        INTVEC_CMD     ALLOW_PLURAL}
5069,{jjSLIM_GB,    SLIM_GB_CMD,     IDEAL_CMD,      IDEAL_CMD      ALLOW_PLURAL}
5070,{jjSLIM_GB,    SLIM_GB_CMD,     MODUL_CMD,      MODUL_CMD      ALLOW_PLURAL}
5071,{jjSort_Id,    SORTVEC_CMD,     INTVEC_CMD,     IDEAL_CMD      ALLOW_PLURAL}
5072,{jjSort_Id,    SORTVEC_CMD,     INTVEC_CMD,     MODUL_CMD      ALLOW_PLURAL}
5073,{jjSTD,        STD_CMD,         IDEAL_CMD,      IDEAL_CMD      ALLOW_PLURAL}
5074,{jjSTD,        STD_CMD,         MODUL_CMD,      MODUL_CMD      ALLOW_PLURAL}
5075,{jjDUMMY,      STRING_CMD,      STRING_CMD,     STRING_CMD     ALLOW_PLURAL}
5076,{jjSYSTEM,     SYSTEM_CMD,      NONE,           STRING_CMD     ALLOW_PLURAL}
5077,{jjSYZYGY,     SYZYGY_CMD,      MODUL_CMD,      IDEAL_CMD      ALLOW_PLURAL}
5078,{jjSYZYGY,     SYZYGY_CMD,      MODUL_CMD,      MODUL_CMD      ALLOW_PLURAL}
5079#ifdef HAVE_PLURAL
5080,{jjENVELOPE,   ENVELOPE_CMD,    RING_CMD,       RING_CMD       ALLOW_PLURAL}
5081,{jjENVELOPE,   ENVELOPE_CMD,    QRING_CMD,      QRING_CMD      ALLOW_PLURAL}
5082,{jjOPPOSITE,   OPPOSITE_CMD,    RING_CMD,       RING_CMD       ALLOW_PLURAL}
5083,{jjOPPOSITE,   OPPOSITE_CMD,    QRING_CMD,      QRING_CMD      ALLOW_PLURAL}
5084,{jjTWOSTD,     TWOSTD_CMD,      IDEAL_CMD,      IDEAL_CMD      ALLOW_PLURAL}
5085#endif
5086,{jjWRONG,      TRACE_CMD,       0,              INTVEC_CMD     ALLOW_PLURAL}
5087,{jjWRONG,      TRACE_CMD,       0,              IDEAL_CMD      ALLOW_PLURAL}
5088,{jjTRACE_IV,   TRACE_CMD,       INT_CMD,        INTMAT_CMD     ALLOW_PLURAL}
5089,{jjmpTrace,    TRACE_CMD,       XS(POLY_CMD),   MATRIX_CMD     ALLOW_PLURAL}
5090,{jjTRANSP_IV,  TRANSPOSE_CMD,   INTMAT_CMD,     INTVEC_CMD     ALLOW_PLURAL}
5091,{jjTRANSP_IV,  TRANSPOSE_CMD,   INTMAT_CMD,     INTMAT_CMD     ALLOW_PLURAL}
5092,{jjmpTransp,   TRANSPOSE_CMD,   XS(MATRIX_CMD), MATRIX_CMD     ALLOW_PLURAL}
5093,{jjidTransp,   TRANSPOSE_CMD,   XS(MODUL_CMD),  MODUL_CMD      ALLOW_PLURAL}
5094,{jjTYPEOF,     TYPEOF_CMD,      STRING_CMD,     ANY_TYPE       ALLOW_PLURAL}
5095,{jjUNIVARIATE, UNIVARIATE_CMD,  INT_CMD,        POLY_CMD       ALLOW_PLURAL}
5096,{jjVARIABLES_P,VARIABLES_CMD,   LIST_CMD,       POLY_CMD       ALLOW_PLURAL}
5097,{jjVARIABLES_ID,VARIABLES_CMD,  LIST_CMD,       IDEAL_CMD       ALLOW_PLURAL}
5098,{jjVARIABLES_ID,VARIABLES_CMD,  LIST_CMD,       MATRIX_CMD       ALLOW_PLURAL}
5099,{jjDUMMY,      VECTOR_CMD,      VECTOR_CMD,     VECTOR_CMD     ALLOW_PLURAL}
5100,{jjVDIM,       VDIM_CMD,        INT_CMD,        IDEAL_CMD      ALLOW_PLURAL}
5101,{jjVDIM,       VDIM_CMD,        INT_CMD,        MODUL_CMD      ALLOW_PLURAL}
5102,{jjVAR1,       VAR_CMD,         POLY_CMD,       INT_CMD        ALLOW_PLURAL}
5103,{jjVARSTR1,    VARSTR_CMD,      STRING_CMD,     INT_CMD        ALLOW_PLURAL}
5104,{jjrVarStr,    VARSTR_CMD,      XS(STRING_CMD), RING_CMD       ALLOW_PLURAL}
5105,{jjrVarStr,    VARSTR_CMD,      XS(STRING_CMD), QRING_CMD      ALLOW_PLURAL}
5106,{kWeight,      WEIGHT_CMD,      INTVEC_CMD,     IDEAL_CMD      ALLOW_PLURAL}
5107,{kWeight,      WEIGHT_CMD,      INTVEC_CMD,     MODUL_CMD      ALLOW_PLURAL}
5108,{jjLOAD1,      LOAD_CMD,        NONE,           STRING_CMD     ALLOW_PLURAL}
5109,{loNewtonP,    NEWTONPOLY_CMD,  IDEAL_CMD,      IDEAL_CMD      ALLOW_PLURAL}
5110,{NULL,         0,               0,              0              NO_PLURAL}
5111};
5112#undef s
5113/*=================== operations with 3 args.: static proc =================*/
5114static BOOLEAN jjBRACK_S(leftv res, leftv u, leftv v,leftv w)
5115{
5116  char *s= (char *)u->Data();
5117  int   r = (int)(long)v->Data();
5118  int   c = (int)(long)w->Data();
5119  int l = strlen(s);
5120
5121  if ( (r<1) || (r>l) || (c<0) )
5122  {
5123    Werror("wrong range[%d,%d] in string %s",r,c,u->Fullname());
5124    return TRUE;
5125  }
5126  res->data = (char *)omAlloc((long)(c+1));
5127  sprintf((char *)res->data,"%-*.*s",c,c,s+r-1);
5128  return FALSE;
5129}
5130static BOOLEAN jjBRACK_Im(leftv res, leftv u, leftv v,leftv w)
5131{
5132  intvec *iv = (intvec *)u->Data();
5133  int   r = (int)(long)v->Data();
5134  int   c = (int)(long)w->Data();
5135  if ((r<1)||(r>iv->rows())||(c<1)||(c>iv->cols()))
5136  {
5137    Werror("wrong range[%d,%d] in intmat %s(%d x %d)",
5138           r,c,u->Fullname(),iv->rows(),iv->cols());
5139    return TRUE;
5140  }
5141  res->data=u->data; u->data=NULL;
5142  res->rtyp=u->rtyp; u->rtyp=0;
5143  res->name=u->name; u->name=NULL;
5144  res->attribute=u->attribute; u->attribute=NULL;
5145  Subexpr e=jjMakeSub(v);
5146          e->next=jjMakeSub(w);
5147  if (u->e==NULL) res->e=e;
5148  else
5149  {
5150    Subexpr h=u->e;
5151    while (h->next!=NULL) h=h->next;
5152    h->next=e;
5153    res->e=u->e;
5154    u->e=NULL;
5155  }
5156  return FALSE;
5157}
5158static BOOLEAN jjBRACK_Ma(leftv res, leftv u, leftv v,leftv w)
5159{
5160  matrix m= (matrix)u->Data();
5161  int   r = (int)(long)v->Data();
5162  int   c = (int)(long)w->Data();
5163  //Print("gen. elem %d, %d\n",r,c);
5164  if ((r<1)||(r>MATROWS(m))||(c<1)||(c>MATCOLS(m)))
5165  {
5166    Werror("wrong range[%d,%d] in matrix %s(%d x %d)",r,c,u->Fullname(),
5167      MATROWS(m),MATCOLS(m));
5168    return TRUE;
5169  }
5170  res->data=u->data; u->data=NULL;
5171  res->rtyp=u->rtyp; u->rtyp=0;
5172  res->name=u->name; u->name=NULL;
5173  res->attribute=u->attribute; u->attribute=NULL;
5174  Subexpr e=jjMakeSub(v);
5175          e->next=jjMakeSub(w);
5176  if (u->e==NULL)
5177    res->e=e;
5178  else
5179  {
5180    Subexpr h=u->e;
5181    while (h->next!=NULL) h=h->next;
5182    h->next=e;
5183    res->e=u->e;
5184    u->e=NULL;
5185  }
5186  return FALSE;
5187}
5188static BOOLEAN jjBRACK_Ma_I_IV(leftv res, leftv u, leftv v,leftv w)
5189{
5190  sleftv t;
5191  sleftv ut;
5192  leftv p=NULL;
5193  intvec *iv=(intvec *)w->Data();
5194  int l;
5195  BOOLEAN nok;
5196
5197  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
5198  {
5199    WerrorS("cannot build expression lists from unnamed objects");
5200    return TRUE;
5201  }
5202  memcpy(&ut,u,sizeof(ut));
5203  memset(&t,0,sizeof(t));
5204  t.rtyp=INT_CMD;
5205  for (l=0;l< iv->length(); l++)
5206  {
5207    t.data=(char *)(long)((*iv)[l]);
5208    if (p==NULL)
5209    {
5210      p=res;
5211    }
5212    else
5213    {
5214      p->next=(leftv)omAlloc0Bin(sleftv_bin);
5215      p=p->next;
5216    }
5217    memcpy(u,&ut,sizeof(ut));
5218    if (u->Typ() == MATRIX_CMD)
5219      nok=jjBRACK_Ma(p,u,v,&t);
5220    else /* INTMAT_CMD */
5221      nok=jjBRACK_Im(p,u,v,&t);
5222    if (nok)
5223    {
5224      while (res->next!=NULL)
5225      {
5226        p=res->next->next;
5227        omFreeBin((ADDRESS)res->next, sleftv_bin);
5228        // res->e aufraeumen !!!!
5229        res->next=p;
5230      }
5231      return TRUE;
5232    }
5233  }
5234  return FALSE;
5235}
5236static BOOLEAN jjBRACK_Ma_IV_I(leftv res, leftv u, leftv v,leftv w)
5237{
5238  sleftv t;
5239  sleftv ut;
5240  leftv p=NULL;
5241  intvec *iv=(intvec *)v->Data();
5242  int l;
5243  BOOLEAN nok;
5244
5245  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
5246  {
5247    WerrorS("cannot build expression lists from unnamed objects");
5248    return TRUE;
5249  }
5250  memcpy(&ut,u,sizeof(ut));
5251  memset(&t,0,sizeof(t));
5252  t.rtyp=INT_CMD;
5253  for (l=0;l< iv->length(); l++)
5254  {
5255    t.data=(char *)(long)((*iv)[l]);
5256    if (p==NULL)
5257    {
5258      p=res;
5259    }
5260    else
5261    {
5262      p->next=(leftv)omAlloc0Bin(sleftv_bin);
5263      p=p->next;
5264    }
5265    memcpy(u,&ut,sizeof(ut));
5266    if (u->Typ() == MATRIX_CMD)
5267      nok=jjBRACK_Ma(p,u,&t,w);
5268    else /* INTMAT_CMD */
5269      nok=jjBRACK_Im(p,u,&t,w);
5270    if (nok)
5271    {
5272      while (res->next!=NULL)
5273      {
5274        p=res->next->next;
5275        omFreeBin((ADDRESS)res->next, sleftv_bin);
5276        // res->e aufraeumen !!
5277        res->next=p;
5278      }
5279      return TRUE;
5280    }
5281  }
5282  return FALSE;
5283}
5284static BOOLEAN jjBRACK_Ma_IV_IV(leftv res, leftv u, leftv v,leftv w)
5285{
5286  sleftv t1,t2,ut;
5287  leftv p=NULL;
5288  intvec *vv=(intvec *)v->Data();
5289  intvec *wv=(intvec *)w->Data();
5290  int vl;
5291  int wl;
5292  BOOLEAN nok;
5293
5294  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
5295  {
5296    WerrorS("cannot build expression lists from unnamed objects");
5297    return TRUE;
5298  }
5299  memcpy(&ut,u,sizeof(ut));
5300  memset(&t1,0,sizeof(sleftv));
5301  memset(&t2,0,sizeof(sleftv));
5302  t1.rtyp=INT_CMD;
5303  t2.rtyp=INT_CMD;
5304  for (vl=0;vl< vv->length(); vl++)
5305  {
5306    t1.data=(char *)(long)((*vv)[vl]);
5307    for (wl=0;wl< wv->length(); wl++)
5308    {
5309      t2.data=(char *)(long)((*wv)[wl]);
5310      if (p==NULL)
5311      {
5312        p=res;
5313      }
5314      else
5315      {
5316        p->next=(leftv)omAlloc0Bin(sleftv_bin);
5317        p=p->next;
5318      }
5319      memcpy(u,&ut,sizeof(ut));
5320      if (u->Typ() == MATRIX_CMD)
5321        nok=jjBRACK_Ma(p,u,&t1,&t2);
5322      else /* INTMAT_CMD */
5323        nok=jjBRACK_Im(p,u,&t1,&t2);
5324      if (nok)
5325      {
5326        res->CleanUp();
5327        return TRUE;
5328      }
5329    }
5330  }
5331  return FALSE;
5332}
5333static BOOLEAN jjPROC3(leftv res, leftv u, leftv v, leftv w)
5334{
5335  v->next=(leftv)omAllocBin(sleftv_bin);
5336  memcpy(v->next,w,sizeof(sleftv));
5337  memset(w,0,sizeof(sleftv));
5338  return jjPROC(res,u,v);
5339}
5340static BOOLEAN jjCALL3MANY(leftv res, leftv u, leftv v, leftv w)
5341{
5342  u->next=(leftv)omAllocBin(sleftv_bin);
5343  memcpy(u->next,v,sizeof(sleftv));
5344  u->next->next=(leftv)omAllocBin(sleftv_bin);
5345  memcpy(u->next->next,w,sizeof(sleftv));
5346  BOOLEAN r=iiExprArithM(res,u,iiOp);
5347  v->Init();
5348  w->Init();
5349  //w->rtyp=0; w->data=NULL;
5350  // iiExprArithM did the CleanUp
5351  return r;
5352}
5353static BOOLEAN jjBAREISS3(leftv res, leftv u, leftv v, leftv w)
5354{
5355  intvec *iv;
5356  ideal m;
5357  lists l=(lists)omAllocBin(slists_bin);
5358  int k=(int)(long)w->Data();
5359  if (k>=0)
5360  {
5361    smCallNewBareiss((ideal)u->Data(),(int)(long)v->Data(),(int)(long)w->Data(),m,&iv);
5362    l->Init(2);
5363    l->m[0].rtyp=MODUL_CMD;
5364    l->m[1].rtyp=INTVEC_CMD;
5365    l->m[0].data=(void *)m;
5366    l->m[1].data=(void *)iv;
5367  }
5368  else
5369  {
5370    m=smCallSolv((ideal)u->Data());
5371    l->Init(1);
5372    l->m[0].rtyp=IDEAL_CMD;
5373    l->m[0].data=(void *)m;
5374  }
5375  res->data = (char *)l;
5376  return FALSE;
5377}
5378static BOOLEAN jjCOEFFS3_Id(leftv res, leftv u, leftv v, leftv w)
5379{
5380  if ((w->rtyp!=IDHDL)||(w->e!=NULL))
5381  {
5382    WerrorS("3rd argument must be a name of a matrix");
5383    return TRUE;
5384  }
5385  ideal i=(ideal)u->Data();
5386  int rank=(int)i->rank;
5387  BOOLEAN r=jjCOEFFS_Id(res,u,v);
5388  if (r) return TRUE;
5389  mpMonomials((matrix)res->data, rank, pVar((poly)v->Data()),(matrix)w->Data());
5390  return FALSE;
5391}
5392static BOOLEAN jjCOEFFS3_KB(leftv res, leftv u, leftv v, leftv w)
5393{
5394  res->data=(void*)idCoeffOfKBase((ideal)(u->Data()),
5395           (ideal)(v->Data()),(poly)(w->Data()));
5396  return FALSE;
5397}
5398static BOOLEAN jjCOEFFS3_P(leftv res, leftv u, leftv v, leftv w)
5399{
5400  if ((w->rtyp!=IDHDL)||(w->e!=NULL))
5401  {
5402    WerrorS("3rd argument must be a name of a matrix");
5403    return TRUE;
5404  }
5405  // CopyD for POLY_CMD and VECTOR_CMD are identical:
5406  poly p=(poly)u->CopyD(POLY_CMD);
5407  ideal i=idInit(1,1);
5408  i->m[0]=p;
5409  sleftv t;
5410  memset(&t,0,sizeof(t));
5411  t.data=(char *)i;
5412  t.rtyp=IDEAL_CMD;
5413  int rank=1;
5414  if (u->Typ()==VECTOR_CMD)
5415  {
5416    i->rank=rank=pMaxComp(p);
5417    t.rtyp=MODUL_CMD;
5418  }
5419  BOOLEAN r=jjCOEFFS_Id(res,&t,v);
5420  t.CleanUp();
5421  if (r) return TRUE;
5422  mpMonomials((matrix)res->data, rank, pVar((poly)v->Data()),(matrix)w->Data());
5423  return FALSE;
5424}
5425static BOOLEAN jjELIMIN_HILB(leftv res, leftv u, leftv v, leftv w)
5426{
5427  res->data=(char *)idElimination((ideal)u->Data(),(poly)v->Data(),
5428    (intvec *)w->Data());
5429  setFlag(res,FLAG_STD);
5430  return FALSE;
5431}
5432static BOOLEAN jjFIND3(leftv res, leftv u, leftv v, leftv w)
5433{
5434  /*4
5435  * look for the substring what in the string where
5436  * starting at position n
5437  * return the position of the first char of what in where
5438  * or 0
5439  */
5440  int n=(int)(long)w->Data();
5441  char *where=(char *)u->Data();
5442  char *what=(char *)v->Data();
5443  char *found;
5444  if ((1>n)||(n>(int)strlen(where)))
5445  {
5446    Werror("start position %d out of range",n);
5447    return TRUE;
5448  }
5449  found = strchr(where+n-1,*what);
5450  if (*(what+1)!='\0')
5451  {
5452    while((found !=NULL) && (strncmp(found+1,what+1,strlen(what+1))!=0))
5453    {
5454      found=strchr(found+1,*what);
5455    }
5456  }
5457  if (found != NULL)
5458  {
5459    res->data=(char *)((found-where)+1);
5460  }
5461  return FALSE;
5462}
5463static BOOLEAN jjFWALK3(leftv res, leftv u, leftv v, leftv w)
5464{
5465  if ((int)(long)w->Data()==0)
5466    res->data=(char *)walkProc(u,v);
5467  else
5468    res->data=(char *)fractalWalkProc(u,v);
5469  setFlag( res, FLAG_STD );
5470  return FALSE;
5471}
5472static BOOLEAN jjHILBERT3(leftv res, leftv u, leftv v, leftv w)
5473{
5474  assumeStdFlag(u);
5475  intvec *module_w=(intvec *)atGet(u,"isHomog",INTVEC_CMD);
5476  intvec *wdegree=(intvec*)w->Data();
5477  if (wdegree->length()!=pVariables)
5478  {
5479    Werror("weight vector must have size %d, not %d",
5480           pVariables,wdegree->length());
5481    return TRUE;
5482  }
5483  intvec *iv=hFirstSeries((ideal)u->Data(),module_w,currQuotient,wdegree);
5484  switch((int)(long)v->Data())
5485  {
5486    case 1:
5487      res->data=(void *)iv;
5488      return FALSE;
5489    case 2:
5490      res->data=(void *)hSecondSeries(iv);
5491      delete iv;
5492      return FALSE;
5493  }
5494  WerrorS(feNotImplemented);
5495  delete iv;
5496  return TRUE;
5497}
5498static BOOLEAN jjINTMAT3(leftv res, leftv u, leftv v,leftv w)
5499{
5500  intvec* im= new intvec((int)(long)v->Data(),(int)(long)w->Data(), 0);
5501  intvec* arg = (intvec*) u->Data();
5502  int i, n = si_min(im->cols()*im->rows(), arg->cols()*arg->rows());
5503
5504  for (i=0; i<n; i++)
5505  {
5506    (*im)[i] = (*arg)[i];
5507  }
5508
5509  res->data = (char *)im;
5510  return FALSE;
5511}
5512static BOOLEAN jjJET_P_IV(leftv res, leftv u, leftv v, leftv w)
5513{
5514  short *iw=iv2array((intvec *)w->Data());
5515  res->data = (char *)ppJetW((poly)u->Data(),(int)(long)v->Data(),iw);
5516  omFreeSize((ADDRESS)iw,(pVariables+1)*sizeof(short));
5517  return FALSE;
5518}
5519static BOOLEAN jjJET_P_P(leftv res, leftv u, leftv v, leftv w)
5520{
5521  if (!pIsUnit((poly)v->Data()))
5522  {
5523    WerrorS("2nd argument must be a unit");
5524    return TRUE;
5525  }
5526  res->data = (char *)pSeries((int)(long)w->Data(),(poly)u->CopyD(),(poly)v->CopyD());
5527  return FALSE;
5528}
5529static BOOLEAN jjJET_ID_IV(leftv res, leftv u, leftv v, leftv w)
5530{
5531  res->data = (char *)idJetW((ideal)u->Data(),(int)(long)v->Data(),
5532                             (intvec *)w->Data());
5533  return FALSE;
5534}
5535static BOOLEAN jjJET_ID_M(leftv res, leftv u, leftv v, leftv w)
5536{
5537  if (!mpIsDiagUnit((matrix)v->Data()))
5538  {
5539    WerrorS("2nd argument must be a diagonal matrix of units");
5540    return TRUE;
5541  }
5542  res->data = (char *)idSeries((int)(long)w->Data(),(ideal)u->CopyD(),
5543                               (matrix)v->CopyD());
5544  return FALSE;
5545}
5546static BOOLEAN jjMINOR3(leftv res, leftv u, leftv v, leftv w)
5547{
5548  assumeStdFlag(w);
5549  res->data = (char *)idMinors(
5550                        (matrix)u->Data(),(int)(long)v->Data(),(ideal)w->Data());
5551  return FALSE;
5552}
5553static BOOLEAN jjPREIMAGE(leftv res, leftv u, leftv v, leftv w)
5554{
5555  idhdl h;
5556  ring rr;
5557  map mapping;
5558
5559  if ((v->name==NULL) || (w->name==NULL))
5560  {
5561    WerrorS("2nd/3rd arguments must have names");
5562    return TRUE;
5563  }
5564  rr=(ring)u->Data();
5565  const char *ring_name=u->Name();
5566  if ((h=rr->idroot->get(v->name,myynest))!=NULL)
5567  {
5568    if (h->typ==MAP_CMD)
5569    {
5570      mapping=IDMAP(h);
5571      idhdl preim_ring=IDROOT->get(mapping->preimage,myynest);
5572      if ((preim_ring==NULL)
5573      || (IDRING(preim_ring)!=currRing))
5574      {
5575        Werror("preimage ring `%s` is not the basering",mapping->preimage);
5576        return TRUE;
5577      }
5578    }
5579    else if (h->typ==IDEAL_CMD)
5580    {
5581      mapping=IDMAP(h);
5582    }
5583    else
5584    {
5585      Werror("`%s` is no map nor ideal",IDID(h));
5586      return TRUE;
5587    }
5588  }
5589  else
5590  {
5591    Werror("`%s` is not defined in `%s`",v->name,ring_name);
5592    return TRUE;
5593  }
5594  if ((h=rr->idroot->get(w->name,myynest))!=NULL)
5595  {
5596    if (h->typ==IDEAL_CMD)
5597    {
5598      if (((currRing->qideal!=NULL) && (pOrdSgn==-1))
5599      || ((rr->qideal!=NULL) && (rr->OrdSgn==-1)))
5600      {
5601        WarnS("preimage in local qring may be wrong: use Ring::preimageLoc instead");
5602      }
5603      res->data=(char *)maGetPreimage(rr,mapping,IDIDEAL(h));
5604      if (res->data==NULL/* is of type ideal, should not be NULL*/) return TRUE;
5605    }
5606    else
5607    {
5608      Werror("`%s` is no ideal",IDID(h));
5609      return TRUE;
5610    }
5611  }
5612  else
5613  {
5614    Werror("`%s` is not defined in `%s`",w->name,ring_name);
5615    return TRUE;
5616  }
5617  return FALSE;
5618}
5619static BOOLEAN jjRANDOM_Im(leftv res, leftv u, leftv v, leftv w)
5620{
5621  int di, k;
5622  int i=(int)(long)u->Data();
5623  int r=(int)(long)v->Data();
5624  int c=(int)(long)w->Data();
5625  if ((r<=0) || (c<=0)) return TRUE;
5626  intvec *iv = new intvec(r, c, 0);
5627  if (iv->rows()==0)
5628  {
5629    delete iv;
5630    return TRUE;
5631  }
5632  if (i!=0)
5633  {
5634    if (i<0) i = -i;
5635    di = 2 * i + 1;
5636    for (k=0; k<iv->length(); k++)
5637    {
5638#ifdef buildin_rand
5639      (*iv)[k] = ((siRand() % di) - i);
5640#else
5641      (*iv)[k] = ((rand() % di) - i);
5642#endif
5643    }
5644  }
5645  res->data = (char *)iv;
5646  return FALSE;
5647}
5648static BOOLEAN jjSUBST_Test(leftv v,leftv w,
5649  int &ringvar, poly &monomexpr)
5650{
5651  monomexpr=(poly)w->Data();
5652  poly p=(poly)v->Data();
5653  #if 0
5654  if (pLength(monomexpr)>1)
5655  {
5656    Werror("`%s` substitutes a ringvar only by a term",
5657      Tok2Cmdname(SUBST_CMD));
5658    return TRUE;
5659  }
5660  #endif
5661  if (!(ringvar=pVar(p)))
5662  {
5663    if (rField_is_Extension(currRing))
5664    {
5665      assume(currRing->algring!=NULL);
5666      lnumber n=(lnumber)pGetCoeff(p);
5667      ringvar=-p_Var(n->z,currRing->algring);
5668    }
5669    if(ringvar==0)
5670    {
5671      WerrorS("ringvar/par expected");
5672      return TRUE;
5673    }
5674  }
5675  return FALSE;
5676}
5677static BOOLEAN jjSUBST_P(leftv res, leftv u, leftv v,leftv w)
5678{
5679  int ringvar;
5680  poly monomexpr;
5681  BOOLEAN nok=jjSUBST_Test(v,w,ringvar,monomexpr);
5682  if (nok) return TRUE;
5683  if (ringvar>0)
5684  {
5685    if ((monomexpr==NULL)||(pNext(monomexpr)==NULL))
5686      res->data = pSubst((poly)u->CopyD(res->rtyp),ringvar,monomexpr);
5687    else
5688      res->data= pSubstPoly((poly)u->Data(),ringvar,monomexpr);
5689  }
5690  else
5691  {
5692    res->data=pSubstPar((poly)u->Data(),-ringvar,monomexpr);
5693  }
5694  return FALSE;
5695}
5696static BOOLEAN jjSUBST_Id(leftv res, leftv u, leftv v,leftv w)
5697{
5698  int ringvar;
5699  poly monomexpr;
5700  BOOLEAN nok=jjSUBST_Test(v,w,ringvar,monomexpr);
5701  if (nok) return TRUE;
5702  if (ringvar>0)
5703  {
5704    if ((monomexpr==NULL)||(pNext(monomexpr)==NULL))
5705      res->data = idSubst((ideal)u->CopyD(res->rtyp),ringvar,monomexpr);
5706    else
5707      res->data = idSubstPoly((ideal)u->Data(),ringvar,monomexpr);
5708  }
5709  else
5710  {
5711    res->data = idSubstPar((ideal)u->Data(),-ringvar,monomexpr);
5712  }
5713  return FALSE;
5714}
5715// we do not want to have jjSUBST_Id_X inlined:
5716static BOOLEAN jjSUBST_Id_X(leftv res, leftv u, leftv v,leftv w,
5717                            int input_type);
5718static BOOLEAN jjSUBST_Id_I(leftv res, leftv u, leftv v,leftv w)
5719{
5720  return jjSUBST_Id_X(res,u,v,w,INT_CMD);
5721}
5722static BOOLEAN jjSUBST_Id_N(leftv res, leftv u, leftv v,leftv w)
5723{
5724  return jjSUBST_Id_X(res,u,v,w,NUMBER_CMD);
5725}
5726static BOOLEAN jjSUBST_Id_X(leftv res, leftv u, leftv v,leftv w, int input_type)
5727{
5728  sleftv tmp;
5729  memset(&tmp,0,sizeof(tmp));
5730  // do not check the result, conversion from int/number to poly works always
5731  iiConvert(input_type,POLY_CMD,iiTestConvert(input_type,POLY_CMD),w,&tmp);
5732  BOOLEAN b=jjSUBST_Id(res,u,v,&tmp);
5733  tmp.CleanUp();
5734  return b;
5735}
5736static BOOLEAN jjMATRIX_Id(leftv res, leftv u, leftv v,leftv w)
5737{
5738  matrix m=mpNew((int)(long)v->Data(),(int)(long)w->Data());
5739  ideal I=(ideal)u->CopyD(IDEAL_CMD);
5740  int i=si_min(IDELEMS(I),(int)(long)v->Data()*(int)(long)w->Data());
5741  //for(i=i-1;i>=0;i--)
5742  //{
5743  //  m->m[i]=I->m[i];
5744  //  I->m[i]=NULL;
5745  //}
5746  memcpy4(m->m,I->m,i*sizeof(poly));
5747  memset(I->m,0,i*sizeof(poly));
5748  idDelete(&I);
5749  res->data = (char *)m;
5750  return FALSE;
5751}
5752static BOOLEAN jjMATRIX_Mo(leftv res, leftv u, leftv v,leftv w)
5753{
5754  res->data = (char *)idModule2formatedMatrix((ideal)u->CopyD(MODUL_CMD),
5755           (int)(long)v->Data(),(int)(long)w->Data());
5756  return FALSE;
5757}
5758static BOOLEAN jjMATRIX_Ma(leftv res, leftv u, leftv v,leftv w)
5759{
5760  matrix m=mpNew((int)(long)v->Data(),(int)(long)w->Data());
5761  matrix I=(matrix)u->CopyD(MATRIX_CMD);
5762  int r=si_min(MATROWS(I),(int)(long)v->Data());
5763  int c=si_min(MATCOLS(I),(int)(long)w->Data());
5764  int i,j;
5765  for(i=r;i>0;i--)
5766  {
5767    for(j=c;j>0;j--)
5768    {
5769      MATELEM(m,i,j)=MATELEM(I,i,j);
5770      MATELEM(I,i,j)=NULL;
5771    }
5772  }
5773  idDelete((ideal *)&I);
5774  res->data = (char *)m;
5775  return FALSE;
5776}
5777static BOOLEAN jjLIFT3(leftv res, leftv u, leftv v, leftv w)
5778{
5779  if (w->rtyp!=IDHDL) return TRUE;
5780  BITSET save_test=test;
5781  int ul= IDELEMS((ideal)u->Data());
5782  int vl= IDELEMS((ideal)v->Data());
5783  ideal m
5784    = idLift((ideal)u->Data(),(ideal)v->Data(),NULL,FALSE,hasFlag(u,FLAG_STD),
5785             FALSE, (matrix *)(&(IDMATRIX((idhdl)(w->data)))));
5786  res->data = (char *)idModule2formatedMatrix(m,ul,vl);
5787  test=save_test;
5788  return FALSE;
5789}
5790static BOOLEAN jjREDUCE3_CP(leftv res, leftv u, leftv v, leftv w)
5791{
5792  assumeStdFlag(v);
5793  if (!idIsZeroDim((ideal)v->Data()))
5794  {
5795    Werror("`%s` must be 0-dimensional",v->Name());
5796    return TRUE;
5797  }
5798  res->data = (char *)redNF((ideal)v->CopyD(),(poly)u->CopyD(),
5799    (poly)w->CopyD());
5800  return FALSE;
5801}
5802static BOOLEAN jjREDUCE3_CID(leftv res, leftv u, leftv v, leftv w)
5803{
5804  assumeStdFlag(v);
5805  if (!idIsZeroDim((ideal)v->Data()))
5806  {
5807    Werror("`%s` must be 0-dimensional",v->Name());
5808    return TRUE;
5809  }
5810  res->data = (char *)redNF((ideal)v->CopyD(),(ideal)u->CopyD(),
5811    (matrix)w->CopyD());
5812  return FALSE;
5813}
5814static BOOLEAN jjREDUCE3_P(leftv res, leftv u, leftv v, leftv w)
5815{
5816  assumeStdFlag(v);
5817  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(poly)u->Data(),
5818    0,(int)(long)w->Data());
5819  return FALSE;
5820}
5821static BOOLEAN jjREDUCE3_ID(leftv res, leftv u, leftv v, leftv w)
5822{
5823  assumeStdFlag(v);
5824  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(ideal)u->Data(),
5825    0,(int)(long)w->Data());
5826  return FALSE;
5827}
5828#ifdef OLD_RES
5829static BOOLEAN jjRES3(leftv res, leftv u, leftv v, leftv w)
5830{
5831  int maxl=(int)v->Data();
5832  ideal u_id=(ideal)u->Data();
5833  int l=0;
5834  resolvente r;
5835  intvec **weights=NULL;
5836  int wmaxl=maxl;
5837  maxl--;
5838  if ((maxl==-1) && (iiOp!=MRES_CMD))
5839    maxl = pVariables-1;
5840  if ((iiOp == RES_CMD) || (iiOp == MRES_CMD))
5841  {
5842    intvec * iv=(intvec*)atGet(u,"isHomog",INTVEC_CMD);
5843    if (iv!=NULL)
5844    {
5845      l=1;
5846      if (!idTestHomModule(u_id,currQuotient,iv))
5847      {
5848        WarnS("wrong weights");
5849        iv=NULL;
5850      }
5851      else
5852      {
5853        weights = (intvec**)omAlloc0Bin(void_ptr_bin);
5854        weights[0] = ivCopy(iv);
5855      }
5856    }
5857    r=syResolvente(u_id,maxl,&l, &weights, iiOp==MRES_CMD);
5858  }
5859  else
5860    r=sySchreyerResolvente((ideal)u->Data(),maxl+1,&l);
5861  if (r==NULL) return TRUE;
5862  int t3=u->Typ();
5863  iiMakeResolv(r,l,wmaxl,w->name,t3,weights);
5864  return FALSE;
5865}
5866#endif
5867static BOOLEAN jjRING3(leftv res, leftv u, leftv v, leftv w)
5868{
5869  res->data=(void *)rInit(u,v,w);
5870  return (res->data==NULL);
5871}
5872static BOOLEAN jjSTATUS3(leftv res, leftv u, leftv v, leftv w)
5873{
5874  int yes;
5875  jjSTATUS2(res, u, v);
5876  yes = (strcmp((char *) res->data, (char *) w->Data()) == 0);
5877  omFree((ADDRESS) res->data);
5878  res->data = (void *)(long)yes;
5879  return FALSE;
5880}
5881static BOOLEAN jjSTD_HILB_W(leftv res, leftv u, leftv v, leftv w)
5882{
5883  intvec *vw=(intvec *)w->Data(); // weights of vars
5884  if (vw->length()!=currRing->N)
5885  {
5886    Werror("%d weights for %d variables",vw->length(),currRing->N);
5887    return TRUE;
5888  }
5889  ideal result;
5890  intvec *ww=(intvec *)atGet(u,"isHomog",INTVEC_CMD);
5891  tHomog hom=testHomog;
5892  ideal u_id=(ideal)(u->Data());
5893  if (ww!=NULL)
5894  {
5895    if (!idTestHomModule(u_id,currQuotient,ww))
5896    {
5897      WarnS("wrong weights");
5898      ww=NULL;
5899    }
5900    else
5901    {
5902      ww=ivCopy(ww);
5903      hom=isHomog;
5904    }
5905  }
5906  result=kStd(u_id,
5907              currQuotient,
5908              hom,
5909              &ww,                  // module weights
5910              (intvec *)v->Data(),  // hilbert series
5911              0,0,                  // syzComp, newIdeal
5912              vw);                  // weights of vars
5913  idSkipZeroes(result);
5914  res->data = (char *)result;
5915  setFlag(res,FLAG_STD);
5916  if (ww!=NULL) atSet(res,omStrDup("isHomog"),ww,INTVEC_CMD);
5917  return FALSE;
5918}
5919
5920/*=================== operations with 3 args.: table =================*/
5921struct sValCmd3 dArith3[]=
5922{
5923// operations:
5924// proc             cmd          res         arg1        arg2        arg3   plural
5925 {jjBRACK_S,        '[',        STRING_CMD, STRING_CMD, INT_CMD,    INT_CMD ALLOW_PLURAL}
5926,{jjBRACK_Im,       '[',        INT_CMD,    INTMAT_CMD, INT_CMD,    INT_CMD ALLOW_PLURAL}
5927,{jjBRACK_Ma_I_IV,  '[',        INT_CMD,    INTMAT_CMD, INT_CMD,    INTVEC_CMD ALLOW_PLURAL}
5928,{jjBRACK_Ma_IV_I,  '[',        INT_CMD,    INTMAT_CMD, INTVEC_CMD, INT_CMD ALLOW_PLURAL}
5929,{jjBRACK_Ma_IV_IV, '[',        INT_CMD,    INTMAT_CMD, INTVEC_CMD, INTVEC_CMD ALLOW_PLURAL}
5930,{jjBRACK_Ma,       '[',        POLY_CMD,   MATRIX_CMD, INT_CMD,    INT_CMD ALLOW_PLURAL}
5931,{jjBRACK_Ma_I_IV,  '[',        POLY_CMD,   MATRIX_CMD, INT_CMD,    INTVEC_CMD ALLOW_PLURAL}
5932,{jjBRACK_Ma_IV_I,  '[',        POLY_CMD,   MATRIX_CMD, INTVEC_CMD, INT_CMD ALLOW_PLURAL}
5933,{jjBRACK_Ma_IV_IV, '[',        POLY_CMD,   MATRIX_CMD, INTVEC_CMD, INTVEC_CMD ALLOW_PLURAL}
5934,{jjPROC3,          '(',        ANY_TYPE,   PROC_CMD,   DEF_CMD,    DEF_CMD ALLOW_PLURAL}
5935,{atATTRIB3,        ATTRIB_CMD, NONE,       IDHDL,      STRING_CMD, DEF_CMD ALLOW_PLURAL}
5936,{jjBAREISS3,       BAREISS_CMD,LIST_CMD,   MODUL_CMD,  INT_CMD,    INT_CMD NO_PLURAL}
5937,{jjCOEFFS3_P,      COEFFS_CMD, MATRIX_CMD, POLY_CMD,   POLY_CMD,   MATRIX_CMD ALLOW_PLURAL}
5938,{jjCOEFFS3_P,      COEFFS_CMD, MATRIX_CMD, VECTOR_CMD, POLY_CMD,   MATRIX_CMD ALLOW_PLURAL}
5939,{jjCOEFFS3_Id,     COEFFS_CMD, MATRIX_CMD, IDEAL_CMD,  POLY_CMD,   MATRIX_CMD ALLOW_PLURAL}
5940,{jjCOEFFS3_Id,     COEFFS_CMD, MATRIX_CMD, MODUL_CMD,  POLY_CMD,   MATRIX_CMD ALLOW_PLURAL}
5941,{jjCOEFFS3_KB,     COEFFS_CMD, MATRIX_CMD, IDEAL_CMD,  IDEAL_CMD,  POLY_CMD ALLOW_PLURAL}
5942,{jjCOEFFS3_KB,     COEFFS_CMD, MATRIX_CMD, MODUL_CMD,  MODUL_CMD,  POLY_CMD ALLOW_PLURAL}
5943,{jjELIMIN_HILB,    ELIMINATION_CMD,IDEAL_CMD, IDEAL_CMD, POLY_CMD, INTVEC_CMD NO_PLURAL}
5944,{jjELIMIN_HILB,    ELIMINATION_CMD,MODUL_CMD, MODUL_CMD, POLY_CMD, INTVEC_CMD NO_PLURAL}
5945,{jjFIND3,          FIND_CMD,   INT_CMD,    STRING_CMD, STRING_CMD, INT_CMD ALLOW_PLURAL}
5946,{jjFWALK3,         FWALK_CMD,  IDEAL_CMD,  RING_CMD,   DEF_CMD,    INT_CMD NO_PLURAL}
5947,{jjHILBERT3,       HILBERT_CMD,INTVEC_CMD, IDEAL_CMD,  INT_CMD,    INTVEC_CMD NO_PLURAL}
5948,{jjHILBERT3,       HILBERT_CMD,INTVEC_CMD, MODUL_CMD,  INT_CMD,    INTVEC_CMD NO_PLURAL}
5949,{jjCALL3MANY,      IDEAL_CMD,  IDEAL_CMD,  DEF_CMD,    DEF_CMD,    DEF_CMD ALLOW_PLURAL}
5950,{lInsert3,         INSERT_CMD, LIST_CMD,   LIST_CMD,   DEF_CMD,    INT_CMD ALLOW_PLURAL}
5951//,{jjCALL3MANY,      INTERSECT_CMD,  NONE,   DEF_CMD,    DEF_CMD,    DEF_CMD ALLOW_PLURAL}
5952,{jjINTMAT3,        INTMAT_CMD, INTMAT_CMD, INTMAT_CMD, INT_CMD,    INT_CMD ALLOW_PLURAL}
5953,{jjCALL3MANY,      INTVEC_CMD, INTVEC_CMD, DEF_CMD,    DEF_CMD,    DEF_CMD ALLOW_PLURAL}
5954,{jjJET_P_IV,       JET_CMD,    POLY_CMD,   POLY_CMD,   INT_CMD,    INTVEC_CMD ALLOW_PLURAL}
5955,{jjJET_ID_IV,      JET_CMD,    IDEAL_CMD,  IDEAL_CMD,  INT_CMD,    INTVEC_CMD ALLOW_PLURAL}
5956,{jjJET_P_IV,       JET_CMD,    VECTOR_CMD, VECTOR_CMD, INT_CMD,    INTVEC_CMD ALLOW_PLURAL}
5957,{jjJET_ID_IV,      JET_CMD,    MODUL_CMD,  MODUL_CMD,  INT_CMD,    INTVEC_CMD ALLOW_PLURAL}
5958,{jjJET_P_P,        JET_CMD,    POLY_CMD,   POLY_CMD,   POLY_CMD,   INT_CMD ALLOW_PLURAL}
5959,{jjJET_P_P,        JET_CMD,    VECTOR_CMD, VECTOR_CMD, POLY_CMD,   INT_CMD ALLOW_PLURAL}
5960,{jjJET_ID_M,       JET_CMD,    IDEAL_CMD,  IDEAL_CMD,  MATRIX_CMD, INT_CMD ALLOW_PLURAL}
5961,{jjJET_ID_M,       JET_CMD,    MODUL_CMD,  MODUL_CMD,  MATRIX_CMD, INT_CMD ALLOW_PLURAL}
5962,{jjWRONG3,         JET_CMD,    POLY_CMD,   POLY_CMD,   INT_CMD,    INT_CMD ALLOW_PLURAL}
5963,{mpKoszul,         KOSZUL_CMD, MATRIX_CMD, INT_CMD,    INT_CMD,    IDEAL_CMD NO_PLURAL}
5964,{jjCALL3MANY,      LIST_CMD,   LIST_CMD,   DEF_CMD,    DEF_CMD,    DEF_CMD ALLOW_PLURAL}
5965,{jjMATRIX_Id,      MATRIX_CMD, MATRIX_CMD, IDEAL_CMD,  INT_CMD,    INT_CMD ALLOW_PLURAL}
5966,{jjMATRIX_Mo,      MATRIX_CMD, MATRIX_CMD, MODUL_CMD,  INT_CMD,    INT_CMD ALLOW_PLURAL}
5967,{jjMATRIX_Ma,      MATRIX_CMD, MATRIX_CMD, MATRIX_CMD, INT_CMD,    INT_CMD ALLOW_PLURAL}
5968,{jjMINOR3,         MINOR_CMD,  IDEAL_CMD,  MATRIX_CMD, INT_CMD,    IDEAL_CMD NO_PLURAL}
5969,{jjCALL3MANY,      MODUL_CMD,  MODUL_CMD,  DEF_CMD,    DEF_CMD,    DEF_CMD ALLOW_PLURAL}
5970#ifdef OLD_RES
5971,{jjRES3,           MRES_CMD,   NONE,       IDEAL_CMD,  INT_CMD,    ANY_TYPE ALLOW_PLURAL}
5972,{jjRES3,           MRES_CMD,   NONE,       MODUL_CMD,  INT_CMD,    ANY_TYPE ALLOW_PLURAL}
5973#endif
5974,{jjLIFT3,          LIFT_CMD,   MATRIX_CMD, IDEAL_CMD,  IDEAL_CMD,  MATRIX_CMD ALLOW_PLURAL}
5975,{jjLIFT3,          LIFT_CMD,   MATRIX_CMD, MODUL_CMD,  MODUL_CMD,  MATRIX_CMD ALLOW_PLURAL}
5976,{jjPREIMAGE,       PREIMAGE_CMD, IDEAL_CMD, RING_CMD,  ANY_TYPE,   ANY_TYPE ALLOW_PLURAL}
5977,{jjPREIMAGE,       PREIMAGE_CMD, IDEAL_CMD, QRING_CMD, ANY_TYPE,   ANY_TYPE ALLOW_PLURAL}
5978,{jjRANDOM_Im,      RANDOM_CMD, INTMAT_CMD, INT_CMD,    INT_CMD,    INT_CMD ALLOW_PLURAL}
5979,{jjREDUCE3_P,      REDUCE_CMD, POLY_CMD,   POLY_CMD,   IDEAL_CMD,  INT_CMD ALLOW_PLURAL}
5980,{jjREDUCE3_P,      REDUCE_CMD, VECTOR_CMD, VECTOR_CMD, IDEAL_CMD,  INT_CMD ALLOW_PLURAL}
5981,{jjREDUCE3_P,      REDUCE_CMD, VECTOR_CMD, VECTOR_CMD, MODUL_CMD,  INT_CMD ALLOW_PLURAL}
5982,{jjREDUCE3_ID,     REDUCE_CMD, IDEAL_CMD,  IDEAL_CMD,  IDEAL_CMD,  INT_CMD ALLOW_PLURAL}
5983,{jjREDUCE3_ID,     REDUCE_CMD, MODUL_CMD,  MODUL_CMD,  MODUL_CMD,  INT_CMD ALLOW_PLURAL}
5984,{jjREDUCE3_ID,     REDUCE_CMD, MODUL_CMD,  MODUL_CMD,  IDEAL_CMD,  INT_CMD ALLOW_PLURAL}
5985,{jjREDUCE3_CP,     REDUCE_CMD, POLY_CMD,   POLY_CMD,   POLY_CMD,   IDEAL_CMD ALLOW_PLURAL}
5986,{jjREDUCE3_CP,     REDUCE_CMD, VECTOR_CMD, VECTOR_CMD, POLY_CMD,   MODUL_CMD ALLOW_PLURAL}
5987,{jjREDUCE3_CID,    REDUCE_CMD, IDEAL_CMD,  IDEAL_CMD,  IDEAL_CMD,  MATRIX_CMD ALLOW_PLURAL}
5988,{jjREDUCE3_CID,    REDUCE_CMD, MODUL_CMD,  MODUL_CMD,  MODUL_CMD,  MATRIX_CMD ALLOW_PLURAL}
5989#ifdef OLD_RES
5990,{jjRES3,           RES_CMD,    NONE,       IDEAL_CMD,  INT_CMD,    ANY_TYPE ALLOW_PLURAL}
5991,{jjRES3,           RES_CMD,    NONE,       MODUL_CMD,  INT_CMD,    ANY_TYPE ALLOW_PLURAL}
5992#endif
5993#ifdef HAVE_FACTORY
5994,{jjRESULTANT,      RESULTANT_CMD, POLY_CMD,POLY_CMD,   POLY_CMD,   POLY_CMD NO_PLURAL}
5995#else
5996,{jjWRONG3,         RESULTANT_CMD, POLY_CMD,POLY_CMD,   POLY_CMD,   POLY_CMD NO_PLURAL}
5997#endif
5998,{jjRING3,          RING_CMD,   RING_CMD,   DEF_CMD,    DEF_CMD,    DEF_CMD ALLOW_PLURAL}
5999#ifdef OLD_RES
6000,{jjRES3,           SRES_CMD,   NONE,       IDEAL_CMD,  INT_CMD,    ANY_TYPE NO_PLURAL}
6001,{jjRES3,           SRES_CMD,   NONE,       MODUL_CMD,  INT_CMD,    ANY_TYPE NO_PLURAL}
6002#endif
6003,{jjSTATUS3,        STATUS_CMD, INT_CMD,    LINK_CMD,   STRING_CMD, STRING_CMD ALLOW_PLURAL}
6004,{jjSTD_HILB_W,     STD_CMD,    IDEAL_CMD,  IDEAL_CMD,  INTVEC_CMD, INTVEC_CMD NO_PLURAL}
6005,{jjSTD_HILB_W,     STD_CMD,    MODUL_CMD,  MODUL_CMD,  INTVEC_CMD, INTVEC_CMD NO_PLURAL}
6006,{jjSUBST_P,        SUBST_CMD,  POLY_CMD,   POLY_CMD,   POLY_CMD,   POLY_CMD  ALLOW_PLURAL}
6007,{jjSUBST_P,        SUBST_CMD,  POLY_CMD,   POLY_CMD,   POLY_CMD,   POLY_CMD  ALLOW_PLURAL}
6008,{jjSUBST_P,        SUBST_CMD,  VECTOR_CMD, VECTOR_CMD, POLY_CMD,   POLY_CMD  ALLOW_PLURAL}
6009,{jjSUBST_Id,       SUBST_CMD,  IDEAL_CMD,  IDEAL_CMD,  POLY_CMD,   POLY_CMD  ALLOW_PLURAL}
6010,{jjSUBST_Id,       SUBST_CMD,  MODUL_CMD,  MODUL_CMD,  POLY_CMD,   POLY_CMD  ALLOW_PLURAL}
6011,{jjSUBST_Id,       SUBST_CMD,  MATRIX_CMD, MATRIX_CMD, POLY_CMD,   POLY_CMD  ALLOW_PLURAL}
6012,{jjSUBST_Id_I,     SUBST_CMD,  MATRIX_CMD, MATRIX_CMD, POLY_CMD,   INT_CMD  ALLOW_PLURAL}
6013,{jjSUBST_Id_N,     SUBST_CMD,  MATRIX_CMD, MATRIX_CMD, POLY_CMD,   NUMBER_CMD  ALLOW_PLURAL}
6014,{jjCALL3MANY,      SYSTEM_CMD, NONE,       STRING_CMD, DEF_CMD,    DEF_CMD   ALLOW_PLURAL}
6015,{nuLagSolve,       LAGSOLVE_CMD,LIST_CMD,  POLY_CMD,   INT_CMD,    INT_CMD   NO_PLURAL}
6016,{nuVanderSys,      VANDER_CMD, POLY_CMD,   IDEAL_CMD,  IDEAL_CMD,  INT_CMD   NO_PLURAL}
6017,{NULL,             0,          0,          0,          0,          0         NO_PLURAL}
6018};
6019/*=================== operations with many arg.: static proc =================*/
6020static BOOLEAN jjBREAK0(leftv res, leftv v)
6021{
6022#ifdef HAVE_SDB
6023  sdb_show_bp();
6024#endif
6025  return FALSE;
6026}
6027static BOOLEAN jjBREAK1(leftv res, leftv v)
6028{
6029#ifdef HAVE_SDB
6030  if(v->Typ()==PROC_CMD)
6031  {
6032    int lineno=0;
6033    if((v->next!=NULL) && (v->next->Typ()==INT_CMD))
6034    {
6035      lineno=(int)(long)v->next->Data();
6036    }
6037    return sdb_set_breakpoint(v->Name(),lineno);
6038  }
6039  return TRUE;
6040#else
6041 return FALSE;
6042#endif
6043}
6044static BOOLEAN jjCALL1ARG(leftv res, leftv v)
6045{
6046  return iiExprArith1(res,v,iiOp);
6047}
6048static BOOLEAN jjCALL2ARG(leftv res, leftv u)
6049{
6050  leftv v=u->next;
6051  u->next=NULL;
6052  BOOLEAN b=iiExprArith2(res,u,iiOp,v, (iiOp > 255));
6053  u->next=v;
6054  return b;
6055}
6056static BOOLEAN jjCALL3ARG(leftv res, leftv u)
6057{
6058  leftv v = u->next;
6059  leftv w = v->next;
6060  u->next = NULL;
6061  v->next = NULL;
6062  BOOLEAN b = iiExprArith3(res, iiOp, u, v, w);
6063  u->next = v;
6064  v->next = w;
6065  return b;
6066}
6067
6068static BOOLEAN jjCOEF_M(leftv res, leftv v)
6069{
6070  if((v->Typ() != VECTOR_CMD)
6071  || (v->next->Typ() != POLY_CMD)
6072  || (v->next->next->Typ() != MATRIX_CMD)
6073  || (v->next->next->next->Typ() != MATRIX_CMD))
6074     return TRUE;
6075  if (v->next->next->rtyp!=IDHDL) return TRUE;
6076  idhdl c=(idhdl)v->next->next->data;
6077  if (v->next->next->next->rtyp!=IDHDL) return TRUE;
6078  idhdl m=(idhdl)v->next->next->next->data;
6079  idDelete((ideal *)&(c->data.uideal));
6080  idDelete((ideal *)&(m->data.uideal));
6081  mpCoef2((poly)v->Data(),(poly)v->next->Data(),
6082    (matrix *)&(c->data.umatrix),(matrix *)&(m->data.umatrix));
6083  return FALSE;
6084}
6085
6086static BOOLEAN jjDIVISION4(leftv res, leftv v)
6087{ // may have 3 or 4 arguments
6088  leftv v1=v;
6089  leftv v2=v1->next;
6090  leftv v3=v2->next;
6091  leftv v4=v3->next;
6092  assumeStdFlag(v2);
6093
6094  int i1=iiTestConvert(v1->Typ(),MODUL_CMD);
6095  int i2=iiTestConvert(v2->Typ(),MODUL_CMD);
6096
6097  if(i1==0||i2==0||v3->Typ()!=INT_CMD||(v4!=NULL&&v4->Typ()!=INTVEC_CMD))
6098  {
6099    WarnS("<module>,<module>,<int>[,<intvec>] expected!");
6100    return TRUE;
6101  }
6102
6103  sleftv w1,w2;
6104  iiConvert(v1->Typ(),MODUL_CMD,i1,v1,&w1);
6105  iiConvert(v2->Typ(),MODUL_CMD,i2,v2,&w2);
6106  ideal P=(ideal)w1.Data();
6107  ideal Q=(ideal)w2.Data();
6108
6109  int n=(int)(long)v3->Data();
6110  short *w=NULL;
6111  if(v4!=NULL)
6112  {
6113    w=iv2array((intvec *)v4->Data());
6114    short *w0=w+1;
6115    int i=pVariables;
6116    while(i>0&&*w0>0)
6117    {
6118      w0++;
6119      i--;
6120    }
6121    if(i>0)
6122      WarnS("not all weights are positive!");
6123  }
6124
6125  matrix T;
6126  ideal R;
6127  idLiftW(P,Q,n,T,R,w);
6128
6129  if(w!=NULL)
6130    omFree(w);
6131  lists L=(lists) omAllocBin(slists_bin);
6132  L->Init(2);
6133  L->m[1].rtyp=v1->Typ();
6134  if(v1->Typ()==POLY_CMD||v1->Typ()==VECTOR_CMD)
6135  {
6136    if(v1->Typ()==POLY_CMD)
6137      pShift(&R->m[0],-1);
6138    L->m[1].data=(void *)R->m[0];
6139    R->m[0]=NULL;
6140    idDelete(&R);
6141  }
6142  else
6143  if(v1->Typ()==IDEAL_CMD||v1->Typ()==MATRIX_CMD)
6144    L->m[1].data=(void *)idModule2Matrix(R);
6145  else
6146    L->m[1].rtyp=MODUL_CMD;
6147  L->m[0].rtyp=MATRIX_CMD;
6148  L->m[0].data=(char *)T;
6149
6150  res->data=L;
6151  res->rtyp=LIST_CMD;
6152
6153  return FALSE;
6154}
6155
6156//static BOOLEAN jjEXPORTTO_M(leftv res, leftv u)
6157//{
6158//  int l=u->listLength();
6159//  if (l<2) return TRUE;
6160//  BOOLEAN b;
6161//  leftv v=u->next;
6162//  leftv zz=v;
6163//  leftv z=zz;
6164//  u->next=NULL;
6165//  do
6166//  {
6167//    leftv z=z->next;
6168//    b=iiExprArith2(res,u,iiOp,z, (iiOp > 255));
6169//    if (b) break;
6170//  } while (z!=NULL);
6171//  u->next=zz;
6172//  return b;
6173//}
6174static BOOLEAN jjIDEAL_PL(leftv res, leftv v)
6175{
6176  int s=1;
6177  leftv h=v;
6178  if (h!=NULL) s=exprlist_length(h);
6179  ideal id=idInit(s,1);
6180  int rank=1;
6181  int i=0;
6182  poly p;
6183  while (h!=NULL)
6184  {
6185    switch(h->Typ())
6186    {
6187      case POLY_CMD:
6188      {
6189        p=(poly)h->CopyD(POLY_CMD);
6190        break;
6191      }
6192      case INT_CMD:
6193      {
6194        number n=nInit((int)(long)h->Data());
6195        if (!nIsZero(n))
6196        {
6197          p=pOne();
6198          pSetCoeff(p,n);
6199        }
6200        else
6201        {
6202          p=NULL;
6203          nDelete(&n);
6204        }
6205        break;
6206      }
6207      case NUMBER_CMD:
6208      {
6209        number n=(number)h->CopyD(NUMBER_CMD);
6210        if (!nIsZero(n))
6211        {
6212          p=pOne();
6213          pSetCoeff(p,n);
6214        }
6215        else
6216        {
6217          p=NULL;
6218          nDelete(&n);
6219        }
6220        break;
6221      }
6222      case VECTOR_CMD:
6223      {
6224        p=(poly)h->CopyD(VECTOR_CMD);
6225        if (iiOp!=MODUL_CMD)
6226        {
6227          idDelete(&id);
6228          pDelete(&p);
6229          return TRUE;
6230        }
6231        rank=si_max(rank,(int)pMaxComp(p));
6232        break;
6233      }
6234      default:
6235      {
6236        idDelete(&id);
6237        return TRUE;
6238      }
6239    }
6240    if ((iiOp==MODUL_CMD)&&(p!=NULL)&&(pGetComp(p)==0))
6241    {
6242      pSetCompP(p,1);
6243    }
6244    id->m[i]=p;
6245    i++;
6246    h=h->next;
6247  }
6248  id->rank=rank;
6249  res->data=(char *)id;
6250  return FALSE;
6251}
6252static BOOLEAN jjINTERSECT_PL(leftv res, leftv v)
6253{
6254  leftv h=v;
6255  int l=v->listLength();
6256  resolvente r=(resolvente)omAlloc0(l*sizeof(ideal));
6257  BOOLEAN *copied=(BOOLEAN *)omAlloc0(l*sizeof(BOOLEAN));
6258  int t=0;
6259  // try to convert to IDEAL_CMD
6260  while (h!=NULL)
6261  {
6262    if (iiTestConvert(h->Typ(),IDEAL_CMD)!=0)
6263    {
6264      t=IDEAL_CMD;
6265    }
6266    else break;
6267    h=h->next;
6268  }
6269  // if failure, try MODUL_CMD
6270  if (t==0)
6271  {
6272    h=v;
6273    while (h!=NULL)
6274    {
6275      if (iiTestConvert(h->Typ(),MODUL_CMD)!=0)
6276      {
6277        t=MODUL_CMD;
6278      }
6279      else break;
6280      h=h->next;
6281    }
6282  }
6283  // check for success  in converting
6284  if (t==0)
6285  {
6286    WerrorS("cannot convert to ideal or module");
6287    return TRUE;
6288  }
6289  // call idMultSect
6290  h=v;
6291  int i=0;
6292  sleftv tmp;
6293  while (h!=NULL)
6294  {
6295    if (h->Typ()==t)
6296    {
6297      r[i]=(ideal)h->Data(); /*no copy*/
6298      h=h->next;
6299    }
6300    else if(iiConvert(h->Typ(),t,iiTestConvert(h->Typ(),t),h,&tmp))
6301    {
6302      omFreeSize((ADDRESS)copied,l*sizeof(BOOLEAN));
6303      omFreeSize((ADDRESS)r,l*sizeof(ideal));
6304      Werror("cannot convert arg. %d to %s",i+1,Tok2Cmdname(t));
6305      return TRUE;
6306    }
6307    else
6308    {
6309      r[i]=(ideal)tmp.Data(); /*now it's a copy*/
6310      copied[i]=TRUE;
6311      h=tmp.next;
6312    }
6313    i++;
6314  }
6315  res->rtyp=t;
6316  res->data=(char *)idMultSect(r,i);
6317  while(i>0)
6318  {
6319    i--;
6320    if (copied[i]) idDelete(&(r[i]));
6321  }
6322  omFreeSize((ADDRESS)copied,l*sizeof(BOOLEAN));
6323  omFreeSize((ADDRESS)r,l*sizeof(ideal));
6324  return FALSE;
6325}
6326static BOOLEAN jjINTVEC_PL(leftv res, leftv v)
6327{
6328  int i=0;
6329  leftv h=v;
6330  if (h!=NULL) i=exprlist_length(h);
6331  intvec *iv=new intvec(i);
6332  i=0;
6333  while (h!=NULL)
6334  {
6335    if(h->Typ()==INT_CMD)
6336    {
6337      (*iv)[i]=(int)(long)h->Data();
6338    }
6339    else
6340    {
6341      delete iv;
6342      return TRUE;
6343    }
6344    i++;
6345    h=h->next;
6346  }
6347  res->data=(char *)iv;
6348  return FALSE;
6349}
6350static BOOLEAN jjJET4(leftv res, leftv u)
6351{
6352  leftv u1=u;
6353  leftv u2=u1->next;
6354  leftv u3=u2->next;
6355  leftv u4=u3->next;
6356  if((u1->Typ()==POLY_CMD)&&(u2->Typ()==POLY_CMD)&&(u3->Typ()==INT_CMD)&&
6357     (u4->Typ()==INTVEC_CMD)||
6358     (u1->Typ()==VECTOR_CMD)&&(u2->Typ()==POLY_CMD)&&(u3->Typ()==INT_CMD)&&
6359     (u4->Typ()==INTVEC_CMD))
6360  {
6361    if(!pIsUnit((poly)u2->Data()))
6362    {
6363      WerrorS("2nd argument must be a unit");
6364      return TRUE;
6365    }
6366    res->rtyp=u1->Typ();
6367    res->data=(char*)pSeries((int)(long)u3->Data(),pCopy((poly)u1->Data()),
6368                             pCopy((poly)u2->Data()),(intvec*)u4->Data());
6369    return FALSE;
6370  }
6371  else
6372  if((u1->Typ()==IDEAL_CMD)&&(u2->Typ()==MATRIX_CMD)&&(u3->Typ()==INT_CMD)&&
6373     (u4->Typ()==INTVEC_CMD)||
6374     (u1->Typ()==MODUL_CMD)&&(u2->Typ()==MATRIX_CMD)&&(u3->Typ()==INT_CMD)&&
6375     (u4->Typ()==INTVEC_CMD))
6376  {
6377    if(!mpIsDiagUnit((matrix)u2->Data()))
6378    {
6379      WerrorS("2nd argument must be a diagonal matrix of units");
6380      return TRUE;
6381    }
6382    res->rtyp=u1->Typ();
6383    res->data=(char*)idSeries((int)(long)u3->Data(),idCopy((ideal)u1->Data()),
6384                              mpCopy((matrix)u2->Data()),(intvec*)u4->Data());
6385    return FALSE;
6386  }
6387  else
6388  {
6389    Werror("%s(`poly`,`poly`,`int`,`intvec`) exppected",
6390           Tok2Cmdname(iiOp));
6391    return TRUE;
6392  }
6393}
6394static BOOLEAN jjKLAMMER_PL(leftv res, leftv u)
6395{
6396  if ((yyInRingConstruction)
6397  && ((strcmp(u->Name(),"real")==0) || (strcmp(u->Name(),"complex")==0)))
6398  {
6399    memcpy(res,u,sizeof(sleftv));
6400    memset(u,0,sizeof(sleftv));
6401    return FALSE;
6402  }
6403  leftv v=u->next;
6404  BOOLEAN b;
6405  if(v==NULL)
6406    b=iiExprArith1(res,u,iiOp);
6407  else
6408  {
6409    u->next=NULL;
6410    b=iiExprArith2(res,u,iiOp,v);
6411    u->next=v;
6412  }
6413  return b;
6414}
6415static BOOLEAN jjLIST_PL(leftv res, leftv v)
6416{
6417  int sl=0;
6418  if (v!=NULL) sl = v->listLength();
6419  lists L;
6420  if((sl==1)&&(v->Typ()==RESOLUTION_CMD))
6421  {
6422    int add_row_shift = 0;
6423    intvec *weights=(intvec*)atGet(v,"isHomog",INTVEC_CMD);
6424    if (weights!=NULL)  add_row_shift=weights->min_in();
6425    L=syConvRes((syStrategy)v->Data(),FALSE,add_row_shift);
6426  }
6427  else
6428  {
6429    L=(lists)omAllocBin(slists_bin);
6430    leftv h=NULL;
6431    int i;
6432    int rt;
6433
6434    L->Init(sl);
6435    for (i=0;i<sl;i++)
6436    {
6437      if (h!=NULL)
6438      { /* e.g. not in the first step:
6439         * h is the pointer to the old sleftv,
6440         * v is the pointer to the next sleftv
6441         * (in this moment) */
6442         h->next=v;
6443      }
6444      h=v;
6445      v=v->next;
6446      h->next=NULL;
6447      rt=h->Typ();
6448      if (rt==0)
6449      {
6450        L->Clean();
6451        Werror("`%s` is undefined",h->Fullname());
6452        return TRUE;
6453      }
6454      if ((rt==RING_CMD)||(rt==QRING_CMD))
6455      {
6456        L->m[i].rtyp=rt;  L->m[i].data=h->Data();
6457        ((ring)L->m[i].data)->ref++;
6458      }
6459      else
6460        L->m[i].Copy(h);
6461    }
6462  }
6463  res->data=(char *)L;
6464  return FALSE;
6465}
6466static BOOLEAN jjNAMES0(leftv res, leftv v)
6467{
6468  res->data=(void *)ipNameList(IDROOT);
6469  return FALSE;
6470}
6471static BOOLEAN jjOPTION_PL(leftv res, leftv v)
6472{
6473  if(v==NULL)
6474  {
6475    res->data=(char *)showOption();
6476    return FALSE;
6477  }
6478  res->rtyp=NONE;
6479  return setOption(res,v);
6480}
6481static BOOLEAN jjREDUCE4(leftv res, leftv u)
6482{
6483  leftv u1=u;
6484  leftv u2=u1->next;
6485  leftv u3=u2->next;
6486  leftv u4=u3->next;
6487  if((u3->Typ()==INT_CMD)&&(u4->Typ()==INTVEC_CMD))
6488  {
6489    int save_d=Kstd1_deg;
6490    Kstd1_deg=(int)(long)u3->Data();
6491    kModW=(intvec *)u4->Data();
6492    BITSET save=verbose;
6493    verbose|=Sy_bit(V_DEG_STOP);
6494    u2->next=NULL;
6495    BOOLEAN r=jjCALL2ARG(res,u);
6496    kModW=NULL;
6497    Kstd1_deg=save_d;
6498    verbose=save;
6499    u->next->next=u3;
6500    return r;
6501  }
6502  else
6503  if((u1->Typ()==IDEAL_CMD)&&(u2->Typ()==MATRIX_CMD)&&(u3->Typ()==IDEAL_CMD)&&
6504     (u4->Typ()==INT_CMD))
6505  {
6506    assumeStdFlag(u3);
6507    if(!mpIsDiagUnit((matrix)u2->Data()))
6508    {
6509      WerrorS("2nd argument must be a diagonal matrix of units");
6510      return TRUE;
6511    }
6512    res->rtyp=IDEAL_CMD;
6513    res->data=(char*)redNF(idCopy((ideal)u3->Data()),idCopy((ideal)u1->Data()),
6514                           mpCopy((matrix)u2->Data()),(int)(long)u4->Data());
6515    return FALSE;
6516  }
6517  else
6518  if((u1->Typ()==POLY_CMD)&&(u2->Typ()==POLY_CMD)&&(u3->Typ()==IDEAL_CMD)&&
6519     (u4->Typ()==INT_CMD))
6520  {
6521    assumeStdFlag(u3);
6522    if(!pIsUnit((poly)u2->Data()))
6523    {
6524      WerrorS("2nd argument must be a unit");
6525      return TRUE;
6526    }
6527    res->rtyp=POLY_CMD;
6528    res->data=(char*)redNF(idCopy((ideal)u3->Data()),pCopy((poly)u1->Data()),
6529                           pCopy((poly)u2->Data()),(int)(long)u4->Data());
6530    return FALSE;
6531  }
6532  else
6533  {
6534    Werror("%s(`poly`,`ideal`,`int`,`intvec`) expected",Tok2Cmdname(iiOp));
6535    return TRUE;
6536  }
6537}
6538static BOOLEAN jjREDUCE5(leftv res, leftv u)
6539{
6540  leftv u1=u;
6541  leftv u2=u1->next;
6542  leftv u3=u2->next;
6543  leftv u4=u3->next;
6544  leftv u5=u4->next;
6545  if((u1->Typ()==IDEAL_CMD)&&(u2->Typ()==MATRIX_CMD)&&(u3->Typ()==IDEAL_CMD)&&
6546     (u4->Typ()==INT_CMD)&&(u5->Typ()==INTVEC_CMD))
6547  {
6548    assumeStdFlag(u3);
6549    if(!mpIsDiagUnit((matrix)u2->Data()))
6550    {
6551      WerrorS("2nd argument must be a diagonal matrix of units");
6552      return TRUE;
6553    }
6554    res->rtyp=IDEAL_CMD;
6555    res->data=(char*)redNF(idCopy((ideal)u3->Data()),idCopy((ideal)u1->Data()),
6556                           mpCopy((matrix)u2->Data()),
6557                           (int)(long)u4->Data(),(intvec*)u5->Data());
6558    return FALSE;
6559  }
6560  else
6561  if((u1->Typ()==POLY_CMD)&&(u2->Typ()==POLY_CMD)&&(u3->Typ()==IDEAL_CMD)&&
6562     (u4->Typ()==INT_CMD)&&(u5->Typ()==INTVEC_CMD))
6563  {
6564    assumeStdFlag(u3);
6565    if(!pIsUnit((poly)u2->Data()))
6566    {
6567      WerrorS("2nd argument must be a unit");
6568      return TRUE;
6569    }
6570    res->rtyp=POLY_CMD;
6571    res->data=(char*)redNF(idCopy((ideal)u3->Data()),pCopy((poly)u1->Data()),
6572                           pCopy((poly)u2->Data()),
6573                           (int)(long)u4->Data(),(intvec*)u5->Data());
6574    return FALSE;
6575  }
6576  else
6577  {
6578    Werror("%s(`ideal`,`ideal`,`matrix`,`int`,`intvec`) exppected",
6579           Tok2Cmdname(iiOp));
6580    return TRUE;
6581  }
6582}
6583static BOOLEAN jjRESERVED0(leftv res, leftv v)
6584{
6585  int i=1;
6586  int nCount = (sArithBase.nCmdUsed-1)/3;
6587  if((3*nCount)<sArithBase.nCmdUsed) nCount++;
6588  //Print("CMDS: %d/%d\n", sArithBase.nCmdUsed,
6589  //      sArithBase.nCmdAllocated);
6590  for(i=0; i<nCount; i++)
6591  {
6592    Print("%-20s",sArithBase.sCmds[i+1].name);
6593    if(i+1+nCount<sArithBase.nCmdUsed)
6594      Print("%-20s",sArithBase.sCmds[i+1+nCount].name);
6595    if(i+1+2*nCount<sArithBase.nCmdUsed)
6596      Print("%-20s",sArithBase.sCmds[i+1+2*nCount].name);
6597    //if ((i%3)==1) PrintLn();
6598    PrintLn();
6599  }
6600  PrintLn();
6601  return FALSE;
6602}
6603static BOOLEAN jjSTRING_PL(leftv res, leftv v)
6604{
6605  if (v == NULL)
6606  {
6607    res->data = omStrDup("");
6608    return FALSE;
6609  }
6610  int n = v->listLength();
6611  if (n == 1)
6612  {
6613    res->data = v->String();
6614    return FALSE;
6615  }
6616
6617  char** slist = (char**) omAlloc(n*sizeof(char*));
6618  int i, j;
6619
6620  for (i=0, j=0; i<n; i++, v = v ->next)
6621  {
6622    slist[i] = v->String();
6623    assume(slist[i] != NULL);
6624    j+=strlen(slist[i]);
6625  }
6626  char* s = (char*) omAlloc((j+1)*sizeof(char));
6627  *s='\0';
6628  for (i=0;i<n;i++)
6629  {
6630    strcat(s, slist[i]);
6631    omFree(slist[i]);
6632  }
6633  omFreeSize(slist, n*sizeof(char*));
6634  res->data = s;
6635  return FALSE;
6636}
6637static BOOLEAN jjTEST(leftv res, leftv v)
6638{
6639  do
6640  {
6641    if (v->Typ()!=INT_CMD)
6642      return TRUE;
6643    test_cmd((int)(long)v->Data());
6644    v=v->next;
6645  }
6646  while (v!=NULL);
6647  return FALSE;
6648}
6649
6650#if defined(__alpha) && !defined(linux)
6651extern "C"
6652{
6653  void usleep(unsigned long usec);
6654};
6655#endif
6656
6657static BOOLEAN jjSTATUS_M(leftv res, leftv v)
6658{
6659  if ((v->Typ() != LINK_CMD) ||
6660      (v->next->Typ() != STRING_CMD) ||
6661      (v->next->next->Typ() != STRING_CMD) ||
6662      (v->next->next->next->Typ() != INT_CMD))
6663    return TRUE;
6664  jjSTATUS3(res, v, v->next, v->next->next);
6665#if defined(HAVE_USLEEP)
6666  if (((long) res->data) == 0L)
6667  {
6668    int i_s = (int)(long) v->next->next->next->Data();
6669    if (i_s > 0)
6670    {
6671      usleep((int)(long) v->next->next->next->Data());
6672      jjSTATUS3(res, v, v->next, v->next->next);
6673    }
6674  }
6675#elif defined(HAVE_SLEEP)
6676  if (((int) res->data) == 0)
6677  {
6678    int i_s = (int) v->next->next->next->Data();
6679    if (i_s > 0)
6680    {
6681      sleep((is - 1)/1000000 + 1);
6682      jjSTATUS3(res, v, v->next, v->next->next);
6683    }
6684  }
6685#endif
6686  return FALSE;
6687}
6688static BOOLEAN jjSUBST_M(leftv res, leftv u)
6689{
6690  leftv v = u->next; // number of args > 0
6691  if (v==NULL) return TRUE;
6692  leftv w = v->next;
6693  if (w==NULL) return TRUE;
6694  leftv rest = w->next;;
6695
6696  u->next = NULL;
6697  v->next = NULL;
6698  w->next = NULL;
6699  BOOLEAN b = iiExprArith3(res, iiOp, u, v, w);
6700  if ((rest!=NULL) && (!b))
6701  {
6702    sleftv tmp_res;
6703    leftv tmp_next=res->next;
6704    res->next=rest;
6705    memset(&tmp_res,0,sizeof(tmp_res));
6706    b = iiExprArithM(&tmp_res,res,iiOp);
6707    memcpy(res,&tmp_res,sizeof(tmp_res));
6708    res->next=tmp_next;
6709  }
6710  u->next = v;
6711  v->next = w;
6712  // rest was w->next, but is already cleaned
6713  return b;
6714}
6715
6716/*=================== operations with many arg.: table =================*/
6717/* number_of_args:  -1: any, -2: any >0, .. */
6718struct sValCmdM dArithM[]=
6719{
6720// operations:
6721// proc         cmd               res            number_of_args plural
6722 {jjKLAMMER_PL,  '(',           ANY_TYPE,           -2       ALLOW_PLURAL}
6723,{jjBREAK0,    BREAKPOINT_CMD,  NONE,               0        ALLOW_PLURAL}
6724,{jjBREAK1,    BREAKPOINT_CMD,  NONE,               -2       ALLOW_PLURAL}
6725,{jjCALL2ARG,  COEF_CMD,        MATRIX_CMD,         2        ALLOW_PLURAL}
6726,{jjCOEF_M,    COEF_CMD,        NONE,               4        ALLOW_PLURAL}
6727,{jjCALL2ARG,  DIVISION_CMD,    ANY_TYPE/*or set by p*/,2    ALLOW_PLURAL}
6728,{jjDIVISION4, DIVISION_CMD,    ANY_TYPE/*or set by p*/,3    NO_PLURAL}
6729,{jjDIVISION4, DIVISION_CMD,    ANY_TYPE/*or set by p*/,4    NO_PLURAL}
6730,{jjDBPRINT,   DBPRINT_CMD,     NONE,               -2       ALLOW_PLURAL}
6731//,{jjEXPORTTO_M,  EXPORTTO_CMD,    NONE,             -2       ALLOW_PLURAL}
6732,{jjCALL1ARG,  IDEAL_CMD,       IDEAL_CMD,          1        ALLOW_PLURAL}
6733,{jjIDEAL_PL,  IDEAL_CMD,       IDEAL_CMD,          -1       ALLOW_PLURAL}
6734,{jjCALL2ARG,  INTERSECT_CMD,   IDEAL_CMD,          2        ALLOW_PLURAL}
6735,{jjINTERSECT_PL,INTERSECT_CMD, IDEAL_CMD,          -2       ALLOW_PLURAL}
6736,{jjCALL1ARG,  INTVEC_CMD,      INTVEC_CMD,         1        ALLOW_PLURAL}
6737,{jjINTVEC_PL, INTVEC_CMD,      INTVEC_CMD,         -2       ALLOW_PLURAL}
6738,{jjCALL2ARG,  JET_CMD,         POLY_CMD,/*or set by p*/ 2   ALLOW_PLURAL}
6739,{jjCALL3ARG,  JET_CMD,         POLY_CMD,/*or set by p*/ 3   ALLOW_PLURAL}
6740,{jjJET4,      JET_CMD,         POLY_CMD,/*or set by p*/ 4   ALLOW_PLURAL}
6741,{jjLIST_PL,   LIST_CMD,        LIST_CMD,           -1       ALLOW_PLURAL}
6742,{jjCALL1ARG,  MODUL_CMD,       MODUL_CMD,          1        ALLOW_PLURAL}
6743,{jjIDEAL_PL,  MODUL_CMD,       MODUL_CMD,          -1       ALLOW_PLURAL}
6744,{jjCALL1ARG,  NAMES_CMD,       LIST_CMD,            1       ALLOW_PLURAL}
6745,{jjNAMES0,    NAMES_CMD,       LIST_CMD,            0       ALLOW_PLURAL}
6746,{jjOPTION_PL, OPTION_CMD,      STRING_CMD/*or set by p*/,-1 ALLOW_PLURAL}
6747,{jjCALL2ARG,  REDUCE_CMD,      IDEAL_CMD/*or set by p*/,  2 ALLOW_PLURAL}
6748,{jjCALL3ARG,  REDUCE_CMD,      IDEAL_CMD/*or set by p*/,  3 ALLOW_PLURAL}
6749,{jjREDUCE4,   REDUCE_CMD,      IDEAL_CMD/*or set by p*/,  4 ALLOW_PLURAL}
6750,{jjREDUCE5,   REDUCE_CMD,      IDEAL_CMD/*or set by p*/,  5 ALLOW_PLURAL}
6751,{jjCALL1ARG,  RESERVEDNAME_CMD, INT_CMD,            1       ALLOW_PLURAL}
6752,{jjRESERVED0, RESERVEDNAME_CMD, NONE,               0       ALLOW_PLURAL}
6753,{jjSTRING_PL, STRING_CMD,      STRING_CMD,         -1       ALLOW_PLURAL}
6754,{jjCALL3ARG,  SUBST_CMD,       NONE/*set by p*/,   3        ALLOW_PLURAL}
6755,{jjSUBST_M,   SUBST_CMD,       NONE/*set by p*/,   -2       ALLOW_PLURAL}
6756,{jjSYSTEM,    SYSTEM_CMD,      NONE/*or set by p*/,-2       ALLOW_PLURAL}
6757,{jjTEST,      TEST_CMD,        NONE,               -2       ALLOW_PLURAL}
6758,{iiWRITE,     WRITE_CMD,       NONE,               -2       ALLOW_PLURAL}
6759,{jjCALL2ARG,  STATUS_CMD,      STRING_CMD,          2       ALLOW_PLURAL}
6760,{jjCALL3ARG,  STATUS_CMD,      INT_CMD,             3       ALLOW_PLURAL}
6761,{jjSTATUS_M,  STATUS_CMD,      INT_CMD,             4       ALLOW_PLURAL}
6762,{loSimplex,   SIMPLEX_CMD,     LIST_CMD,            6       NO_PLURAL}
6763,{nuUResSolve, URSOLVE_CMD,     LIST_CMD,            4       NO_PLURAL}
6764,{NULL,        0,               0,                   0       NO_PLURAL}
6765};
6766#ifdef MDEBUG
6767static Subexpr jjDBMakeSub(leftv e,char *f, int l)
6768#else
6769static Subexpr jjMakeSub(leftv e)
6770#endif
6771{
6772  assume( e->Typ()==INT_CMD );
6773  Subexpr r=(Subexpr)omAlloc0Bin(sSubexpr_bin);
6774  r->start =(int)(long)e->Data();
6775  return r;
6776}
6777
6778/*================ generating tables ============================*/
6779#ifdef GENTABLE
6780extern struct sValAssign dAssign[];
6781struct sValCmdTab dArithTab1[]={ {0,0}};
6782#define JJTAB1LEN 0
6783struct sValCmdTab dArithTab2[]={ {0,0}};
6784#define JJTAB2LEN 0
6785void ttGen1()
6786{
6787  FILE *outfile = myfopen("iparith.inc","w");
6788  int i,j,l1=0,l2=0;
6789  currRing=(ring)omAllocBin(sip_sring_bin);
6790  fprintf(outfile,
6791  "/****************************************\n"
6792  "*  Computer Algebra System SINGULAR     *\n"
6793  "****************************************/\n\n");
6794/*-------------------------------------------------------------------*/
6795  fprintf(outfile,"// syntax table for Singular\n//\n");
6796  fprintf(outfile,"// - search for an exact match of the argument types\n");
6797  fprintf(outfile,"// - otherwise search for the first possibility\n");
6798  fprintf(outfile,"//   with converted types of the arguments\n");
6799  fprintf(outfile,"// - otherwise report an error\n//\n");
6800
6801  int op;
6802  i=0;
6803  while ((op=dArith1[i].cmd)!=0)
6804  {
6805    if (dArith1[i].p==jjWRONG)
6806      fprintf(outfile,"// DUMMY ");
6807    char *s = iiTwoOps(op);
6808    fprintf(outfile,"// operation: %s (%s)  ->  %s\n",
6809          s,
6810          Tok2Cmdname(dArith1[i].arg),
6811          Tok2Cmdname(ABS(dArith1[i].res)));
6812    i++;
6813  }
6814  fprintf(outfile,"/*---------------------------------------------*/\n");
6815  i=0;
6816  while ((op=dArith2[i].cmd)!=0)
6817  {
6818    if (dArith2[i].p==jjWRONG2)
6819      fprintf(outfile,"// DUMMY ");
6820    char *s = iiTwoOps(op);
6821    fprintf(outfile,"// operation: %s (%s, %s)  ->  %s\n",
6822          s,
6823          Tok2Cmdname(dArith2[i].arg1),
6824          Tok2Cmdname(dArith2[i].arg2),
6825          Tok2Cmdname(dArith2[i].res));
6826    i++;
6827  }
6828  fprintf(outfile,"/*---------------------------------------------*/\n");
6829  i=0;
6830  while ((op=dArith3[i].cmd)!=0)
6831  {
6832    char *s = iiTwoOps(op);
6833    if (dArith3[i].p==jjWRONG3)
6834      fprintf(outfile,"// DUMMY ");
6835    fprintf(outfile,"// operation: %s (%s, %s, %s)  ->  %s\n",
6836          s,
6837          Tok2Cmdname(dArith3[i].arg1),
6838          Tok2Cmdname(dArith3[i].arg2),
6839          Tok2Cmdname(dArith3[i].arg3),
6840          Tok2Cmdname(dArith3[i].res));
6841    i++;
6842  }
6843  fprintf(outfile,"/*---------------------------------------------*/\n");
6844  i=0;
6845  while ((op=dArithM[i].cmd)!=0)
6846  {
6847    char *s = iiTwoOps(op);
6848    fprintf(outfile,"// operation: %s (...)  ->  %s",
6849          s,
6850          Tok2Cmdname(dArithM[i].res));
6851    switch(dArithM[i].number_of_args)
6852    {
6853      case -2:
6854         fprintf(outfile," ( number of arguments >0 )\n");
6855         break;
6856      case -1:
6857         fprintf(outfile," ( any number of arguments )\n");
6858         break;
6859      default:
6860         fprintf(outfile," ( %d arguments )\n",dArithM[i].number_of_args);
6861         break;
6862    }
6863    i++;
6864  }
6865  fprintf(outfile,"/*---------------------------------------------*/\n");
6866  i=0;
6867  while ((op=dAssign[i].res)!=0)
6868  {
6869    fprintf(outfile,"// assign: %s =  %s\n",
6870          Tok2Cmdname(op/*dAssign[i].res*/),
6871          Tok2Cmdname(dAssign[i].arg));
6872    i++;
6873  }
6874/*-------------------------------------------------------------------*/
6875  fprintf(outfile,"/*---------------------------------------------*/\n");
6876  for (j=257;j<=MAX_TOK+1;j++)
6877  {
6878    for(i=257;i<=MAX_TOK+1;i++)
6879    {
6880      if ((i!=j) && (j!=IDHDL) && (j!=DEF_CMD) && (j!=ANY_TYPE)
6881      && iiTestConvert(i,j))
6882      {
6883        fprintf(outfile,"// convert %s -> %s\n",
6884          Tok2Cmdname(i), Tok2Cmdname(j));
6885        if (j==ANY_TYPE) break;
6886      }
6887    }
6888  }
6889  fprintf(outfile,"/*---------------------------------------------*/\n");
6890  char ops[]="=><+*/[.^,%(;";
6891  for(i=0;ops[i]!='\0';i++)
6892    fprintf(outfile,"// token %d : %c\n", (int)ops[i], ops[i]);
6893  for (i=257;i<=MAX_TOK;i++)
6894  {
6895    char *s=iiTwoOps(i);
6896    if (s[0]!='$')
6897    {
6898      fprintf(outfile,"// token %d : %s\n", i, s);
6899    }
6900  }
6901/*-------------------------------------------------------------------*/
6902  fprintf(outfile,"/*--max. token: %d, gr: %d --*/\n",MAX_TOK,UMINUS);
6903/*-------------------------------------------------------------------*/
6904  fprintf(outfile,"/*---------------------------------------------*/\n");
6905  fprintf(outfile,
6906  "struct sValCmdTab dArithTab1[]=\n"
6907  "{\n");
6908  for (j=1;j<=MAX_TOK+1;j++)
6909  {
6910    for(i=0;dArith1[i].cmd!=0;i++)
6911    {
6912      if (dArith1[i].cmd==j)
6913      {
6914        fprintf(outfile," { %d,%d },\n",j,i);
6915        l1++;
6916        break;
6917      }
6918    }
6919  }
6920  fprintf(outfile," { 10000,0 }\n};\n");
6921  fprintf(outfile,"#define JJTAB1LEN %d\n",l1);
6922/*-------------------------------------------------------------------*/
6923  fprintf(outfile,
6924  "struct sValCmdTab dArithTab2[]=\n"
6925  "{\n");
6926  for (j=1;j<=MAX_TOK+1;j++)
6927  {
6928    for(i=0;dArith2[i].cmd!=0;i++)
6929    {
6930      if (dArith2[i].cmd==j)
6931      {
6932        fprintf(outfile," { %d,%d },\n",j,i);
6933        l2++;
6934        break;
6935      }
6936    }
6937  }
6938  fprintf(outfile," { 10000,0 }\n};\n");
6939  fprintf(outfile,"#define JJTAB2LEN %d\n",l2);
6940  fclose(outfile);
6941}
6942/*-------------------------------------------------------------------*/
6943#if 0
6944void ttGen2()
6945{
6946  FILE *outfile = myfopen("iparith.inc","a");
6947  fprintf(outfile,
6948  "/****************************************\n"
6949  "*  Computer Algebra System SINGULAR     *\n"
6950  "****************************************/\n\n");
6951/*-------------------------------------------------------------------*/
6952  fprintf(outfile,"// identifier table for Singular\n//\n");
6953
6954  fprintf(outfile,
6955  "cmdnames OLDcmds[] =\n"
6956  "{  // name-string     alias  tokval toktype\n"
6957  "{ \"$INVALID$\",            0,  -1, 0},\n");
6958  int i=1;
6959  int m=-1;
6960  int id_nr=0;
6961  BOOLEAN f=FALSE;
6962  loop
6963  {
6964    while (cmds[i].tokval!=0)
6965    {
6966      if ((cmds[i].tokval!=-1)&&(cmds[i].name!=NULL))
6967      {
6968        if(m==-1)
6969        {
6970          m=i;
6971          f=TRUE;
6972        }
6973        else if(strcmp(cmds[m].name,cmds[i].name)>0)
6974        {
6975          m=i;
6976          f=TRUE;
6977        }
6978      }
6979      i++;
6980    }
6981    if(f)
6982    {
6983      id_nr++;
6984      if(cmds[m].tokval==VRTIMER) fprintf(outfile,"#ifdef HAVE_RTIMER\n");
6985      fprintf(outfile,"  {\"%s\", %*d, %3d, ",cmds[m].name,
6986                                             20-strlen(cmds[m].name),
6987                                             cmds[m].alias,
6988                                             cmds[m].tokval);
6989      switch(cmds[m].toktype)
6990      {
6991        case CMD_1:            fprintf(outfile,"CMD_1 },\n"); break;
6992        case CMD_2:            fprintf(outfile,"CMD_2 },\n"); break;
6993        case CMD_3:            fprintf(outfile,"CMD_3 },\n"); break;
6994        case CMD_12:           fprintf(outfile,"CMD_12 },\n"); break;
6995        case CMD_123 :         fprintf(outfile,"CMD_123 },\n"); break;
6996        case CMD_23:           fprintf(outfile,"CMD_23 },\n"); break;
6997        case CMD_M:            fprintf(outfile,"CMD_M },\n"); break;
6998        case SYSVAR:           fprintf(outfile,"SYSVAR },\n"); break;
6999        case ROOT_DECL:        fprintf(outfile,"ROOT_DECL },\n"); break;
7000        case ROOT_DECL_LIST:   fprintf(outfile,"ROOT_DECL_LIST },\n"); break;
7001        case RING_DECL:        fprintf(outfile,"RING_DECL },\n"); break;
7002        case NONE:             fprintf(outfile,"NONE },\n"); break;
7003        default:               if((cmds[m].toktype>' ')
7004                               &&(cmds[m].toktype<127))
7005                               {
7006                                 fprintf(outfile,"'%c' },\n",cmds[m].toktype);
7007                               }
7008                               else
7009                               {
7010                                 fprintf(outfile,"%d },\n",cmds[m].toktype);
7011                               }
7012                               break;
7013      }
7014      if(cmds[m].tokval==VRTIMER) fprintf(outfile,"#endif\n");
7015      cmds[m].name=NULL;
7016      m=-1;
7017      i=1;
7018      f=FALSE;
7019    }
7020    else break;
7021  }
7022  fprintf(outfile,
7023"/* list of scanner identifiers/only for feread/reservedName */\n");
7024  f=FALSE;
7025  i=1;m=-1;
7026  loop
7027  {
7028    while (cmds[i].tokval!=0)
7029    {
7030      if (cmds[i].name!=NULL)
7031      {
7032        if(m==-1)
7033        {
7034          m=i;
7035          f=TRUE;
7036        }
7037        else if(strcmp(cmds[m].name,cmds[i].name)>0)
7038        {
7039          m=i;
7040          f=TRUE;
7041        }
7042      }
7043      i++;
7044    }
7045    if(f)
7046    {
7047      fprintf(outfile,"  {\"%s\", %*d,  -1, 0 },\n",cmds[m].name,
7048                                             20-strlen(cmds[m].name),
7049                                             0/*cmds[m].alias*/
7050                                             /*-1 cmds[m].tokval*/
7051                                             /*0 cmds[m].toktype*/);
7052      cmds[m].name=NULL;
7053      m=-1;
7054      i=1;
7055      f=FALSE;
7056    }
7057    else break;
7058  }
7059  fprintf(outfile,
7060"/* end of list marker */\n"
7061"  { NULL, 0, 0, 0}\n"
7062"};\n"
7063"#ifdef HAVE_RTIMER\n"
7064"#define LAST_IDENTIFIER %d\n"
7065"#else\n"
7066"#define LAST_IDENTIFIER %d\n"
7067"#endif\n",id_nr,id_nr-1);
7068  fclose(outfile);
7069}
7070#endif
7071/*---------------------------------------------------------------------*/
7072/**
7073 * @brief generate cmds initialisation
7074**/
7075/*---------------------------------------------------------------------*/
7076
7077void ttGen2b()
7078{
7079  int cmd_size = (sizeof(cmds)/sizeof(cmdnames))-1;
7080
7081  FILE *outfile = myfopen("iparith.inc","a");
7082  fprintf(outfile,
7083  "/****************************************\n"
7084  "*  Computer Algebra System SINGULAR     *\n"
7085  "****************************************/\n\n");
7086/*-------------------------------------------------------------------*/
7087  fprintf(outfile,"// identifier table for Singular\n//\n");
7088
7089  fprintf(
7090    outfile,
7091    "#ifdef MODULE_GENERATOR\n"
7092    "#define omAlloc0(A) malloc(A)\n"
7093    "#endif\n"
7094    "void iiInitCmdName()\n{\n"
7095    "  sArithBase.nCmdUsed      = 0;\n"
7096    "  sArithBase.nCmdAllocated = %d;\n"
7097    "  sArithBase.sCmds = (cmdnames*)omAlloc0(sArithBase.nCmdAllocated*sizeof(cmdnames));\n"
7098    "\n"
7099    "  // name-string                   alias  tokval toktype index\n",
7100    cmd_size);
7101  int m=0;
7102  int id_nr=0;
7103
7104  qsort(&cmds, cmd_size, sizeof(cmdnames), (&_gentable_sort_cmds));
7105
7106  for(m=0; m<cmd_size; m++)
7107  {
7108    if(cmds[m].tokval>0) id_nr++;
7109    if(cmds[m].tokval==VRTIMER) fprintf(outfile,"#ifdef HAVE_RTIMER\n");
7110    fprintf(outfile,"  iiArithAddCmd(\"%s\", %*d, %3d, ",cmds[m].name,
7111            20-strlen(cmds[m].name),
7112            cmds[m].alias,
7113            cmds[m].tokval);
7114    switch(cmds[m].toktype)
7115    {
7116        case CMD_1:            fprintf(outfile,"CMD_1"); break;
7117        case CMD_2:            fprintf(outfile,"CMD_2"); break;
7118        case CMD_3:            fprintf(outfile,"CMD_3"); break;
7119        case CMD_12:           fprintf(outfile,"CMD_12"); break;
7120        case CMD_123 :         fprintf(outfile,"CMD_123"); break;
7121        case CMD_23:           fprintf(outfile,"CMD_23"); break;
7122        case CMD_M:            fprintf(outfile,"CMD_M"); break;
7123        case SYSVAR:           fprintf(outfile,"SYSVAR"); break;
7124        case ROOT_DECL:        fprintf(outfile,"ROOT_DECL"); break;
7125        case ROOT_DECL_LIST:   fprintf(outfile,"ROOT_DECL_LIST"); break;
7126        case RING_DECL:        fprintf(outfile,"RING_DECL"); break;
7127        case NONE:             fprintf(outfile,"NONE"); break;
7128        default:
7129          if((cmds[m].toktype>' ') &&(cmds[m].toktype<127))
7130          {
7131            fprintf(outfile,"'%c'",cmds[m].toktype);
7132          }
7133          else
7134          {
7135            fprintf(outfile,"%d",cmds[m].toktype);
7136          }
7137          break;
7138#if 0
7139          fprintf(outfile,"  iiArithAddCmd(\"%s\", %*d,  -1, 0 );\n",
7140              cmds[m].name, 20-strlen(cmds[m].name),
7141              0/*cmds[m].alias*/
7142              /*-1 cmds[m].tokval*/
7143              /*0 cmds[m].toktype*/);
7144#endif
7145    }
7146    fprintf(outfile,", %d);\n", m);
7147    if(cmds[m].tokval==VRTIMER) fprintf(outfile,"#endif\n");
7148  }
7149  fprintf(outfile, "/* end of list marker */\n");
7150  fprintf(outfile,
7151          "#ifdef HAVE_RTIMER\n"
7152          "  sArithBase.nLastIdentifier = %d;\n"
7153          "#else /* HAVE_RTIMER */\n"
7154          "  sArithBase.nLastIdentifier = %d;\n"
7155          "#endif /* HAVE_RTIMER */\n",
7156          id_nr,id_nr-1);
7157
7158
7159  fprintf(outfile,
7160"}\n"
7161"#ifdef HAVE_RTIMER\n"
7162"#define LAST_IDENTIFIER %d\n"
7163"#else\n"
7164"#define LAST_IDENTIFIER %d\n"
7165"#endif\n",id_nr,id_nr-1);
7166  fclose(outfile);
7167}
7168/*-------------------------------------------------------------------*/
7169#if 0
7170void ttGen3()
7171{
7172  FILE *outfile = myfopen("mpsr_tok.inc","w");
7173  fprintf(outfile,
7174  "/****************************************\n"
7175  "*  Computer Algebra System SINGULAR     *\n"
7176  "****************************************/\n\n");
7177/*-------------------------------------------------------------------*/
7178  fprintf(outfile,"// token table for Singular\n//\n");
7179
7180  fprintf(outfile,
7181  "short vtok[] =\n"
7182  "{\n");
7183  // operations with 1 arg: ===========================================
7184  int i=0;
7185  while (dArith1[i].cmd!=0)
7186  {
7187    if ((dArith1[i].p!=jjWRONG)
7188    &&((i==0)||(dArith1[i].cmd!=dArith1[i-1].cmd)))
7189    {
7190      fprintf(outfile,"  %d,\n",dArith1[i].cmd);
7191    }
7192    i++;
7193  }
7194  // operations with 2 args: ===========================================
7195  i=0;
7196  while (dArith2[i].cmd!=0)
7197  {
7198    if ((dArith2[i].p!=jjWRONG2)
7199    &&((i==0)||(dArith2[i].cmd!=dArith2[i-1].cmd)))
7200    {
7201      fprintf(outfile,"  %d,\n",dArith2[i].cmd);
7202    }
7203    i++;
7204  }
7205  // operations with 3 args: ===========================================
7206  i=0;
7207  while (dArith3[i].cmd!=0)
7208  {
7209    if (
7210    ((i==0)||(dArith3[i].cmd!=dArith3[i-1].cmd)))
7211    {
7212      fprintf(outfile,"  %d,\n",dArith3[i].cmd);
7213    }
7214    i++;
7215  }
7216  // operations with many args: ===========================================
7217  i=0;
7218  while (dArithM[i].cmd!=0)
7219  {
7220    if (
7221    ((i==0)||(dArithM[i].cmd!=dArithM[i-1].cmd)))
7222    {
7223      fprintf(outfile,"  %d,\n",dArithM[i].cmd);
7224    }
7225    i++;
7226  }
7227  // ====================================================================
7228  fprintf(outfile,
7229  "/* end of list marker */\n"
7230  " %d };\n",MAX_TOK);
7231  fclose(outfile);
7232}
7233#endif
7234void ttGen4()
7235{
7236  FILE *outfile = myfopen("plural_cmd.inc","w");
7237  int i;
7238  char *old_s="";
7239  fprintf(outfile,
7240  "@c *****************************************\n"
7241  "@c *  Computer Algebra System SINGULAR     *\n"
7242  "@c *****************************************\n\n");
7243/*-------------------------------------------------------------------*/
7244  fprintf(outfile,"@multicolumn .45 .45\n");
7245  int op;
7246  i=0;
7247  while ((op=dArith1[i].cmd)!=0)
7248  {
7249    if (dArith1[i].p!=jjWRONG)
7250    {
7251      char *s = iiTwoOps(op);
7252      if ((s!=NULL) && (isalpha(s[0])) && (strcmp(s,old_s)!=0))
7253      {
7254        old_s=s;
7255        #ifdef HAVE_PLURAL
7256        switch (dArith1[i].valid_for_plural)
7257        {
7258          case NO_PLURAL_N:
7259            fprintf(outfile,"@item @ref{%s} @tab @code{---}\n",s);
7260            break;
7261          case ALLOW_PLURAL_N:
7262            fprintf(outfile,"@item @ref{%s} @tab @ref{%s (plural)}\n",s,s);
7263            break;
7264          case COMM_PLURAL_N:
7265            fprintf(outfile,"@item @ref{%s} @tab %s\n",s,s);
7266            break;
7267        }
7268        #endif
7269      }
7270    }
7271    i++;
7272  }
7273  fprintf(outfile,"@c ---------------------------------------------\n");
7274  i=0;
7275  while ((op=dArith2[i].cmd)!=0)
7276  {
7277    if (dArith2[i].p!=jjWRONG2)
7278    {
7279      char *s = iiTwoOps(op);
7280      if ((s!=NULL) && (isalpha(s[0])) && (strcmp(s,old_s)!=0))
7281      {
7282        old_s=s;
7283        #ifdef HAVE_PLURAL
7284        switch (dArith2[i].valid_for_plural)
7285        {
7286          case NO_PLURAL_N:
7287            fprintf(outfile,"@item @ref{%s} @tab @code{---}\n",s);
7288            break;
7289          case ALLOW_PLURAL_N:
7290            fprintf(outfile,"@item @ref{%s} @tab @ref{%s (plural)}\n",s,s);
7291            break;
7292          case COMM_PLURAL_N:
7293            fprintf(outfile,"@item @ref{%s} @tab %s\n",s,s);
7294            break;
7295        }
7296        #endif
7297      }
7298    }
7299    i++;
7300  }
7301  fprintf(outfile,"@c ---------------------------------------------\n");
7302  i=0;
7303  while ((op=dArith3[i].cmd)!=0)
7304  {
7305    char *s = iiTwoOps(op);
7306    if (dArith3[i].p!=jjWRONG3)
7307    {
7308      if ((s!=NULL) && (isalpha(s[0])) && (strcmp(s,old_s)!=0))
7309      {
7310        old_s=s;
7311        #ifdef HAVE_PLURAL
7312        switch (dArith3[i].valid_for_plural)
7313        {
7314          case NO_PLURAL_N:
7315            fprintf(outfile,"@item @ref{%s} @tab @code{---}\n",s);
7316            break;
7317          case ALLOW_PLURAL_N:
7318            fprintf(outfile,"@item @ref{%s} @tab @ref{%s (plural)}\n",s,s);
7319            break;
7320          case COMM_PLURAL_N:
7321            fprintf(outfile,"@item @ref{%s} @tab %s\n",s,s);
7322            break;
7323        }
7324        #endif
7325      }
7326    }
7327    i++;
7328  }
7329  fprintf(outfile,"@c ---------------------------------------------\n");
7330  i=0;
7331  while ((op=dArithM[i].cmd)!=0)
7332  {
7333    char *s = iiTwoOps(op);
7334    if ((s!=NULL) && (isalpha(s[0])) && (strcmp(s,old_s)!=0))
7335    {
7336        old_s=s;
7337        #ifdef HAVE_PLURAL
7338        switch (dArithM[i].valid_for_plural)
7339        {
7340          case NO_PLURAL_N:
7341            fprintf(outfile,"@item @ref{%s} @tab @code{---}\n",s);
7342            break;
7343          case ALLOW_PLURAL_N:
7344            fprintf(outfile,"@item @ref{%s} @tab @ref{%s (plural)}\n",s,s);
7345            break;
7346          case COMM_PLURAL_N:
7347            fprintf(outfile,"@item @ref{%s} @tab %s\n",s,s);
7348            break;
7349        }
7350        #endif
7351    }
7352    i++;
7353  }
7354  fprintf(outfile,"@c ---------------------------------------------\n");
7355  fprintf(outfile,"@end table\n");
7356  fclose(outfile);
7357}
7358/*-------------------------------------------------------------------*/
7359#else
7360#include "iparith.inc"
7361#endif
7362
7363/*=================== operations with 2 args. ============================*/
7364
7365BOOLEAN iiExprArith2(leftv res, leftv a, int op, leftv b, BOOLEAN proccall)
7366{
7367#ifndef GENTABLE
7368  memset(res,0,sizeof(sleftv));
7369
7370  if (!errorreported)
7371  {
7372#ifdef SIQ
7373    if (siq>0)
7374    {
7375      //Print("siq:%d\n",siq);
7376      command d=(command)omAlloc0Bin(ip_command_bin);
7377      memcpy(&d->arg1,a,sizeof(sleftv));
7378      //a->Init();
7379      memcpy(&d->arg2,b,sizeof(sleftv));
7380      //b->Init();
7381      d->argc=2;
7382      d->op=op;
7383      res->data=(char *)d;
7384      res->rtyp=COMMAND;
7385      return FALSE;
7386    }
7387#endif
7388    int at=a->Typ();
7389    int bt=b->Typ();
7390    int i=iiTabIndex(dArithTab2,JJTAB2LEN,op);
7391    int index=i;
7392
7393    iiOp=op;
7394    while (dArith2[i].cmd==op)
7395    {
7396      if ((at==dArith2[i].arg1)
7397      && (bt==dArith2[i].arg2))
7398      {
7399        res->rtyp=dArith2[i].res;
7400        #ifdef HAVE_PLURAL
7401        if ((currRing!=NULL) && (rIsPluralRing(currRing)))
7402        {
7403          if (dArith2[i].valid_for_plural==0 /*NO_PLURAL*/)
7404          {
7405            WerrorS(ii_not_for_plural);
7406            break;
7407          }
7408          else if (dArith2[i].valid_for_plural==2 /* COMM_PLURAL */)
7409          {
7410            Warn("assume commutative subalgebra for cmd `%s`",Tok2Cmdname(i));
7411          }
7412          /* else ALLOW_PLURAL */
7413        }
7414        #endif
7415        if (dArith2[i].p(res,a,b))
7416        {
7417          break;// leave loop, goto error handling
7418        }
7419        a->CleanUp();
7420        b->CleanUp();
7421        //Print("op: %d,result typ:%d\n",op,res->rtyp);
7422        return FALSE;
7423      }
7424      i++;
7425    }
7426    // implicite type conversion ----------------------------------------------
7427    if (dArith2[i].cmd!=op)
7428    {
7429      int ai,bi;
7430      leftv an = (leftv)omAlloc0Bin(sleftv_bin);
7431      leftv bn = (leftv)omAlloc0Bin(sleftv_bin);
7432      BOOLEAN failed=FALSE;
7433      i=index; /*iiTabIndex(dArithTab2,JJTAB2LEN,op);*/
7434      //Print("op: %c, type: %s %s\n",op,Tok2Cmdname(at),Tok2Cmdname(bt));
7435      while (dArith2[i].cmd==op)
7436      {
7437        //Print("test %s %s\n",Tok2Cmdname(dArith2[i].arg1),Tok2Cmdname(dArith2[i].arg2));
7438        if ((ai=iiTestConvert(at,dArith2[i].arg1))!=0)
7439        {
7440          if ((bi=iiTestConvert(bt,dArith2[i].arg2))!=0)
7441          {
7442            res->rtyp=dArith2[i].res;
7443            #ifdef HAVE_PLURAL
7444            if ((currRing!=NULL) && (rIsPluralRing(currRing)))
7445            {
7446              if (dArith2[i].valid_for_plural==0 /*NO_PLURAL*/)
7447              {
7448                WerrorS(ii_not_for_plural);
7449                break;
7450              }
7451              else if (dArith2[i].valid_for_plural==2 /* COMM_PLURAL */)
7452              {
7453                Warn("assume commutative subalgebra for cmd `%s`",
7454                      Tok2Cmdname(i));
7455              }
7456              /* else ALLOW_PLURAL */
7457            }
7458            #endif
7459            failed= ((iiConvert(at,dArith2[i].arg1,ai,a,an))
7460            || (iiConvert(bt,dArith2[i].arg2,bi,b,bn))
7461            || (dArith2[i].p(res,an,bn)));
7462            // everything done, clean up temp. variables
7463            if (failed)
7464            {
7465              // leave loop, goto error handling
7466              break;
7467            }
7468            else
7469            {
7470              // everything ok, clean up and return
7471              an->CleanUp();
7472              bn->CleanUp();
7473              omFreeBin((ADDRESS)an, sleftv_bin);
7474              omFreeBin((ADDRESS)bn, sleftv_bin);
7475              a->CleanUp();
7476              b->CleanUp();
7477              return FALSE;
7478            }
7479          }
7480        }
7481        i++;
7482      }
7483      an->CleanUp();
7484      bn->CleanUp();
7485      omFreeBin((ADDRESS)an, sleftv_bin);
7486      omFreeBin((ADDRESS)bn, sleftv_bin);
7487    }
7488    // error handling ---------------------------------------------------
7489    const char *s=NULL;
7490    if (!errorreported)
7491    {
7492      if ((at==0) && (a->Fullname()!=sNoName))
7493      {
7494        s=a->Fullname();
7495      }
7496      else if ((bt==0) && (b->Fullname()!=sNoName))
7497      {
7498        s=b->Fullname();
7499      }
7500      if (s!=NULL)
7501        Werror("`%s` is not defined",s);
7502      else
7503      {
7504        i=index; /*iiTabIndex(dArithTab2,JJTAB2LEN,op);*/
7505        s = iiTwoOps(op);
7506        if (proccall)
7507        {
7508          Werror("%s(`%s`,`%s`) is not supported"
7509                ,s,Tok2Cmdname(at),Tok2Cmdname(bt));
7510        }
7511        else
7512        {
7513          Werror("`%s` %s `%s` is not supported"
7514                ,Tok2Cmdname(at),s,Tok2Cmdname(bt));
7515        }
7516        if (BVERBOSE(V_SHOW_USE))
7517        {
7518          while (dArith2[i].cmd==op)
7519          {
7520            if(((at==dArith2[i].arg1)||(bt==dArith2[i].arg2))
7521            && (dArith2[i].res!=0)
7522            && (dArith2[i].p!=jjWRONG2))
7523            {
7524              if (proccall)
7525                Werror("expected %s(`%s`,`%s`)"
7526                  ,s,Tok2Cmdname(dArith2[i].arg1),Tok2Cmdname(dArith2[i].arg2));
7527              else
7528                Werror("expected `%s` %s `%s`"
7529                  ,Tok2Cmdname(dArith2[i].arg1),s,Tok2Cmdname(dArith2[i].arg2));
7530            }
7531            i++;
7532          }
7533        }
7534      }
7535    }
7536    res->rtyp = UNKNOWN;
7537  }
7538  a->CleanUp();
7539  b->CleanUp();
7540#endif
7541  return TRUE;
7542}
7543
7544/*==================== operations with 1 arg. ===============================*/
7545
7546BOOLEAN iiExprArith1(leftv res, leftv a, int op)
7547{
7548#ifndef GENTABLE
7549  memset(res,0,sizeof(sleftv));
7550
7551  if (!errorreported)
7552  {
7553#ifdef SIQ
7554    if (siq>0)
7555    {
7556      //Print("siq:%d\n",siq);
7557      command d=(command)omAlloc0Bin(ip_command_bin);
7558      memcpy(&d->arg1,a,sizeof(sleftv));
7559      //a->Init();
7560      d->op=op;
7561      d->argc=1;
7562      res->data=(char *)d;
7563      res->rtyp=COMMAND;
7564      return FALSE;
7565    }
7566#endif
7567    int at=a->Typ();
7568    BOOLEAN failed=FALSE;
7569
7570    iiOp=op;
7571    int i=iiTabIndex(dArithTab1,JJTAB1LEN,op);
7572    int ti = i;
7573    while (dArith1[i].cmd==op)
7574    {
7575      if (at==dArith1[i].arg)
7576      {
7577        int r=res->rtyp=dArith1[i].res;
7578        #ifdef HAVE_PLURAL
7579        if ((currRing!=NULL) && (rIsPluralRing(currRing)))
7580        {
7581          if (dArith1[i].valid_for_plural==0 /*NO_PLURAL*/)
7582          {
7583            WerrorS(ii_not_for_plural);
7584            break;
7585          }
7586          else if (dArith1[i].valid_for_plural==2 /* COMM_PLURAL */)
7587          {
7588            Warn("assume commutative subalgebra for cmd `%s`",Tok2Cmdname(i));
7589          }
7590          /* else ALLOW_PLURAL */
7591        }
7592        #endif
7593        if (r<0)
7594        {
7595          res->rtyp=-r;
7596          #ifdef PROC_BUG
7597          dArith1[i].p(res,a);
7598          #else
7599          res->data=(char *)((Proc1)dArith1[i].p)((char *)a->Data());
7600          #endif
7601        }
7602        else if (dArith1[i].p(res,a))
7603        {
7604          break;// leave loop, goto error handling
7605        }
7606        if (a->Next()!=NULL)
7607        {
7608          res->next=(leftv)omAllocBin(sleftv_bin);
7609          failed=iiExprArith1(res->next,a->next,op);
7610        }
7611        a->CleanUp();
7612        return failed;
7613      }
7614      i++;
7615    }
7616    // implicite type conversion --------------------------------------------
7617    if (dArith1[i].cmd!=op)
7618    {
7619      leftv an = (leftv)omAlloc0Bin(sleftv_bin);
7620      i=ti;
7621      //Print("fuer %c , typ: %s\n",op,Tok2Cmdname(at));
7622      while (dArith1[i].cmd==op)
7623      {
7624        int ai;
7625        //Print("test %s\n",Tok2Cmdname(dArith1[i].arg));
7626        if ((ai=iiTestConvert(at,dArith1[i].arg))!=0)
7627        {
7628          int r=res->rtyp=dArith1[i].res;
7629          #ifdef HAVE_PLURAL
7630          if ((currRing!=NULL) && (rIsPluralRing(currRing)))
7631          {
7632            if (dArith1[i].valid_for_plural==0 /*NO_PLURAL*/)
7633            {
7634              WerrorS(ii_not_for_plural);
7635              break;
7636            }
7637            else if (dArith1[i].valid_for_plural==2 /* COMM_PLURAL */)
7638            {
7639              Warn("assume commutative subalgebra for cmd `%s`",Tok2Cmdname(i));
7640            }
7641            /* else ALLOW_PLURAL */
7642          }
7643          #endif
7644          if (r<0)
7645          {
7646            res->rtyp=-r;
7647            failed= iiConvert(at,dArith1[i].arg,ai,a,an);
7648            if (!failed)
7649            {
7650              #ifdef PROC_BUG
7651              dArith1[i].p(res,a);
7652              #else
7653              res->data=(char *)((Proc1)dArith1[i].p)((char *)an->Data());
7654              #endif
7655            }
7656          }
7657          else
7658          {
7659            failed= ((iiConvert(at,dArith1[i].arg,ai,a,an))
7660            || (dArith1[i].p(res,an)));
7661          }
7662          // everything done, clean up temp. variables
7663          if (failed)
7664          {
7665            // leave loop, goto error handling
7666            break;
7667          }
7668          else
7669          {
7670            if (an->Next() != NULL)
7671            {
7672              res->next = (leftv)omAllocBin(sleftv_bin);
7673              failed=iiExprArith1(res->next,an->next,op);
7674            }
7675            // everything ok, clean up and return
7676            an->CleanUp();
7677            omFreeBin((ADDRESS)an, sleftv_bin);
7678            a->CleanUp();
7679            return failed;
7680          }
7681        }
7682        i++;
7683      }
7684      an->CleanUp();
7685      omFreeBin((ADDRESS)an, sleftv_bin);
7686    }
7687    // error handling
7688    if (!errorreported)
7689    {
7690      if ((at==0) && (a->Fullname()!=sNoName))
7691      {
7692        Werror("`%s` is not defined",a->Fullname());
7693      }
7694      else
7695      {
7696        i=ti;
7697        char *s = iiTwoOps(op);
7698        Werror("%s(`%s`) is not supported"
7699                ,s,Tok2Cmdname(at));
7700        if (BVERBOSE(V_SHOW_USE))
7701        {
7702          while (dArith1[i].cmd==op)
7703          {
7704            if ((dArith1[i].res!=0)
7705            && (dArith1[i].p!=jjWRONG))
7706              Werror("expected %s(`%s`)"
7707                ,s,Tok2Cmdname(dArith1[i].arg));
7708            i++;
7709          }
7710        }
7711      }
7712    }
7713    res->rtyp = UNKNOWN;
7714  }
7715  a->CleanUp();
7716#endif
7717  return TRUE;
7718}
7719
7720/*=================== operations with 3 args. ============================*/
7721
7722BOOLEAN iiExprArith3(leftv res, int op, leftv a, leftv b, leftv c)
7723{
7724#ifndef GENTABLE
7725  memset(res,0,sizeof(sleftv));
7726
7727  if (!errorreported)
7728  {
7729#ifdef SIQ
7730    if (siq>0)
7731    {
7732      //Print("siq:%d\n",siq);
7733      command d=(command)omAlloc0Bin(ip_command_bin);
7734      memcpy(&d->arg1,a,sizeof(sleftv));
7735      //a->Init();
7736      memcpy(&d->arg2,b,sizeof(sleftv));
7737      //b->Init();
7738      memcpy(&d->arg3,c,sizeof(sleftv));
7739      //c->Init();
7740      d->op=op;
7741      d->argc=3;
7742      res->data=(char *)d;
7743      res->rtyp=COMMAND;
7744      return FALSE;
7745    }
7746#endif
7747    int at=a->Typ();
7748    int bt=b->Typ();
7749    int ct=c->Typ();
7750
7751    iiOp=op;
7752    int i=0;
7753    while ((dArith3[i].cmd!=op)&&(dArith3[i].cmd!=0)) i++;
7754    while (dArith3[i].cmd==op)
7755    {
7756      if ((at==dArith3[i].arg1)
7757      && (bt==dArith3[i].arg2)
7758      && (ct==dArith3[i].arg3))
7759      {
7760        res->rtyp=dArith3[i].res;
7761        #ifdef HAVE_PLURAL
7762        if ((currRing!=NULL) && (rIsPluralRing(currRing)))
7763        {
7764            if (dArith3[i].valid_for_plural==0 /*NO_PLURAL*/)
7765            {
7766              WerrorS(ii_not_for_plural);
7767              break;
7768            }
7769            else if (dArith3[i].valid_for_plural==2 /* COMM_PLURAL */)
7770            {
7771              Warn("assume commutative subalgebra for cmd `%s`",Tok2Cmdname(i));
7772            }
7773            /* else ALLOW_PLURAL */
7774        }
7775        #endif
7776        if (dArith3[i].p(res,a,b,c))
7777        {
7778          break;// leave loop, goto error handling
7779        }
7780        a->CleanUp();
7781        b->CleanUp();
7782        c->CleanUp();
7783        return FALSE;
7784      }
7785      i++;
7786    }
7787    // implicite type conversion ----------------------------------------------
7788    if (dArith3[i].cmd!=op)
7789    {
7790      int ai,bi,ci;
7791      leftv an = (leftv)omAlloc0Bin(sleftv_bin);
7792      leftv bn = (leftv)omAlloc0Bin(sleftv_bin);
7793      leftv cn = (leftv)omAlloc0Bin(sleftv_bin);
7794      BOOLEAN failed=FALSE;
7795      i=0;
7796      while ((dArith3[i].cmd!=op)&&(dArith3[i].cmd!=0)) i++;
7797      while (dArith3[i].cmd==op)
7798      {
7799        if ((ai=iiTestConvert(at,dArith3[i].arg1))!=0)
7800        {
7801          if ((bi=iiTestConvert(bt,dArith3[i].arg2))!=0)
7802          {
7803            if ((ci=iiTestConvert(ct,dArith3[i].arg3))!=0)
7804            {
7805              res->rtyp=dArith3[i].res;
7806              #ifdef HAVE_PLURAL
7807              if ((currRing!=NULL)
7808              && (rIsPluralRing(currRing)))
7809              {
7810                if (dArith3[i].valid_for_plural==0 /*NO_PLURAL*/)
7811                {
7812                   WerrorS(ii_not_for_plural);
7813                   break;
7814                 }
7815                 else if (dArith3[i].valid_for_plural==2 /* COMM_PLURAL */)
7816                 {
7817                   Warn("assume commutative subalgebra for cmd `%s`",Tok2Cmdname(i));
7818                 }
7819                 /* else ALLOW_PLURAL */
7820              }
7821              #endif
7822              failed= ((iiConvert(at,dArith3[i].arg1,ai,a,an))
7823                || (iiConvert(bt,dArith3[i].arg2,bi,b,bn))
7824                || (iiConvert(ct,dArith3[i].arg3,ci,c,cn))
7825                || (dArith3[i].p(res,an,bn,cn)));
7826              // everything done, clean up temp. variables
7827              if (failed)
7828              {
7829                // leave loop, goto error handling
7830                break;
7831              }
7832              else
7833              {
7834                // everything ok, clean up and return
7835                an->CleanUp();
7836                bn->CleanUp();
7837                cn->CleanUp();
7838                omFreeBin((ADDRESS)an, sleftv_bin);
7839                omFreeBin((ADDRESS)bn, sleftv_bin);
7840                omFreeBin((ADDRESS)cn, sleftv_bin);
7841                a->CleanUp();
7842                b->CleanUp();
7843                c->CleanUp();
7844        //Print("op: %d,result typ:%d\n",op,res->rtyp);
7845                return FALSE;
7846              }
7847            }
7848          }
7849        }
7850        i++;
7851      }
7852      an->CleanUp();
7853      bn->CleanUp();
7854      cn->CleanUp();
7855      omFreeBin((ADDRESS)an, sleftv_bin);
7856      omFreeBin((ADDRESS)bn, sleftv_bin);
7857      omFreeBin((ADDRESS)cn, sleftv_bin);
7858    }
7859    // error handling ---------------------------------------------------
7860    if (!errorreported)
7861    {
7862      const char *s=NULL;
7863      if ((at==0) && (a->Fullname()!=sNoName))
7864      {
7865        s=a->Fullname();
7866      }
7867      else if ((bt==0) && (b->Fullname()!=sNoName))
7868      {
7869        s=b->Fullname();
7870      }
7871      else if ((ct==0) && (c->Fullname()!=sNoName))
7872      {
7873        s=c->Fullname();
7874      }
7875      if (s!=NULL)
7876        Werror("`%s` is not defined",s);
7877      else
7878      {
7879        i=0;
7880        while ((dArith3[i].cmd!=op)&&(dArith3[i].cmd!=0)) i++;
7881        char *s = iiTwoOps(op);
7882        Werror("%s(`%s`,`%s`,`%s`) is not supported"
7883                ,s,Tok2Cmdname(at),Tok2Cmdname(bt),Tok2Cmdname(ct));
7884        if (BVERBOSE(V_SHOW_USE))
7885        {
7886          while (dArith3[i].cmd==op)
7887          {
7888            if(((at==dArith3[i].arg1)
7889            ||(bt==dArith3[i].arg2)
7890            ||(ct==dArith3[i].arg3))
7891            && (dArith3[i].res!=0))
7892            {
7893              Werror("expected %s(`%s`,`%s`,`%s`)"
7894                  ,s,Tok2Cmdname(dArith3[i].arg1)
7895                  ,Tok2Cmdname(dArith3[i].arg2)
7896                  ,Tok2Cmdname(dArith3[i].arg3));
7897            }
7898            i++;
7899          }
7900        }
7901      }
7902    }
7903    res->rtyp = UNKNOWN;
7904  }
7905  a->CleanUp();
7906  b->CleanUp();
7907  c->CleanUp();
7908        //Print("op: %d,result typ:%d\n",op,res->rtyp);
7909#endif
7910  return TRUE;
7911}
7912/*==================== operations with many arg. ===============================*/
7913
7914BOOLEAN jjANY2LIST(leftv res, leftv v, int cnt)
7915{
7916  // cnt = 0: all
7917  // cnt = 1: only first one
7918  leftv next;
7919  BOOLEAN failed = TRUE;
7920  if(v==NULL) return failed;
7921  res->rtyp = LIST_CMD;
7922  if(cnt) v->next = NULL;
7923  next = v->next;             // saving next-pointer
7924  failed = jjLIST_PL(res, v);
7925  v->next = next;             // writeback next-pointer
7926  return failed;
7927}
7928
7929BOOLEAN iiExprArithM(leftv res, leftv a, int op)
7930{
7931#ifndef GENTABLE
7932  memset(res,0,sizeof(sleftv));
7933
7934  if (!errorreported)
7935  {
7936#ifdef SIQ
7937    if (siq>0)
7938    {
7939      //Print("siq:%d\n",siq);
7940      command d=(command)omAlloc0Bin(ip_command_bin);
7941      d->op=op;
7942      res->data=(char *)d;
7943      if (a!=NULL)
7944      {
7945        d->argc=a->listLength();
7946        // else : d->argc=0;
7947        memcpy(&d->arg1,a,sizeof(sleftv));
7948        switch(d->argc)
7949        {
7950          case 3:
7951            memcpy(&d->arg3,a->next->next,sizeof(sleftv));
7952            a->next->next->Init();
7953            /* no break */
7954          case 2:
7955            memcpy(&d->arg2,a->next,sizeof(sleftv));
7956            a->next->Init();
7957            a->next->next=d->arg2.next;
7958            d->arg2.next=NULL;
7959            /* no break */
7960          case 1:
7961            a->Init();
7962            a->next=d->arg1.next;
7963            d->arg1.next=NULL;
7964        }
7965        if (d->argc>3) a->next=NULL;
7966        a->name=NULL;
7967        a->rtyp=0;
7968        a->data=NULL;
7969        a->e=NULL;
7970        a->attribute=NULL;
7971        a->CleanUp();
7972      }
7973      res->rtyp=COMMAND;
7974      return FALSE;
7975    }
7976#endif
7977    BOOLEAN failed=FALSE;
7978    int args=0;
7979    if (a!=NULL) args=a->listLength();
7980
7981    iiOp=op;
7982    int i=0;
7983    while ((dArithM[i].cmd!=op)&&(dArithM[i].cmd!=0)) i++;
7984    while (dArithM[i].cmd==op)
7985    {
7986      if ((args==dArithM[i].number_of_args)
7987      || (dArithM[i].number_of_args==-1)
7988      || ((dArithM[i].number_of_args==-2)&&(args>0)))
7989      {
7990        res->rtyp=dArithM[i].res;
7991        #ifdef HAVE_PLURAL
7992        if ((currRing!=NULL)
7993        && (rIsPluralRing(currRing)))
7994        {
7995          if (dArithM[i].valid_for_plural==0 /*NO_PLURAL*/)
7996          {
7997            WerrorS(ii_not_for_plural);
7998            break;
7999          }
8000          else if (dArithM[i].valid_for_plural==2 /* COMM_PLURAL */)
8001          {
8002            Warn("assume commutative subalgebra for cmd `%s`",Tok2Cmdname(i));
8003          }
8004          /* else ALLOW_PLURAL */
8005        }
8006        #endif
8007        if (dArithM[i].p(res,a))
8008        {
8009          break;// leave loop, goto error handling
8010        }
8011        if (a!=NULL) a->CleanUp();
8012        //Print("op: %d,result typ:%d\n",op,res->rtyp);
8013        return failed;
8014      }
8015      i++;
8016    }
8017    // error handling
8018    if (!errorreported)
8019    {
8020      if ((args>0) && (a->rtyp==0) && (a->Name()!=sNoName))
8021      {
8022        Werror("`%s` is not defined",a->Fullname());
8023      }
8024      else
8025      {
8026        char *s = iiTwoOps(op);
8027        Werror("%s(...) is not supported",s);
8028      }
8029    }
8030    res->rtyp = UNKNOWN;
8031  }
8032  if (a!=NULL) a->CleanUp();
8033        //Print("op: %d,result typ:%d\n",op,res->rtyp);
8034#endif
8035  return TRUE;
8036}
8037
8038/*=================== general utilities ============================*/
8039int IsCmd(const char *n, int & tok)
8040{
8041#ifndef GENTABLE
8042  int i;
8043  int an=1;
8044  int en=sArithBase.nLastIdentifier;
8045
8046  loop
8047  //for(an=0; an<sArithBase.nCmdUsed; )
8048  {
8049    if(an>=en-1)
8050    {
8051      if (strcmp(n, sArithBase.sCmds[an].name) == 0)
8052      {
8053        i=an;
8054        break;
8055      }
8056      else if ((an!=en) && (strcmp(n, sArithBase.sCmds[en].name) == 0))
8057      {
8058        i=en;
8059        break;
8060      }
8061      else
8062      {
8063        return 0;
8064      }
8065    }
8066    i=(an+en)/2;
8067    if (*n < *(sArithBase.sCmds[i].name))
8068    {
8069      en=i-1;
8070    }
8071    else if (*n > *(sArithBase.sCmds[i].name))
8072    {
8073      an=i+1;
8074    }
8075    else
8076    {
8077      int v=strcmp(n,sArithBase.sCmds[i].name);
8078      if(v<0)
8079      {
8080        en=i-1;
8081      }
8082      else if(v>0)
8083      {
8084        an=i+1;
8085      }
8086      else /*v==0*/
8087      {
8088        break;
8089      }
8090    }
8091  }
8092  lastreserved=sArithBase.sCmds[i].name;
8093  tok=sArithBase.sCmds[i].tokval;
8094  if(sArithBase.sCmds[i].alias==2)
8095  {
8096    Warn("outdated identifier `%s` used - please change your code",
8097    sArithBase.sCmds[i].name);
8098    sArithBase.sCmds[i].alias=1;
8099  }
8100  if (currRingHdl==NULL)
8101  {
8102    #ifdef SIQ
8103    if (siq<=0)
8104    {
8105    #endif
8106      if ((tok>=BEGIN_RING) && (tok<=END_RING))
8107      {
8108        WerrorS("no ring active");
8109        return 0;
8110      }
8111    #ifdef SIQ
8112    }
8113    #endif
8114  }
8115  if (!expected_parms)
8116  {
8117    switch (tok)
8118    {
8119      case IDEAL_CMD:
8120      case INT_CMD:
8121      case INTVEC_CMD:
8122      case MAP_CMD:
8123      case MATRIX_CMD:
8124      case MODUL_CMD:
8125      case POLY_CMD:
8126      case PROC_CMD:
8127      case RING_CMD:
8128      case STRING_CMD:
8129        cmdtok = tok;
8130        break;
8131    }
8132  }
8133  return sArithBase.sCmds[i].toktype;
8134#else
8135  return 0;
8136#endif
8137}
8138static int iiTabIndex(const jjValCmdTab dArithTab, const int len, const int op)
8139{
8140#ifndef GENTABLE
8141  int a=0;
8142  int e=len;
8143  int p=len/2;
8144  do
8145  {
8146     if (op==dArithTab[p].cmd) return dArithTab[p].start;
8147     if (op<dArithTab[p].cmd) e=p-1;
8148     else   a = p+1;
8149     p=a+(e-a)/2;
8150  }
8151  while ( a <= e);
8152
8153#endif
8154  assume(0);
8155  return 0;
8156}
8157
8158#ifdef GENTABLE
8159char * Tok2Cmdname(int tok)
8160{
8161  int i = 0;
8162  if (tok < 0)
8163  {
8164    return cmds[0].name;
8165  }
8166  if (tok==ANY_TYPE) return "any_type";
8167  if (tok==NONE) return "nothing";
8168  //if (tok==IFBREAK) return "if_break";
8169  //if (tok==VECTOR_FROM_POLYS) return "vector_from_polys";
8170  //if (tok==ORDER_VECTOR) return "ordering";
8171  //if (tok==REF_VAR) return "ref";
8172  //if (tok==OBJECT) return "object";
8173  //if (tok==PRINT_EXPR) return "print_expr";
8174  if (tok==IDHDL) return "identifier";
8175  while (cmds[i].tokval!=0)
8176  {
8177    if ((cmds[i].tokval == tok)&&(cmds[i].alias==0))
8178    {
8179      return cmds[i].name;
8180    }
8181    i++;
8182  }
8183  return cmds[0].name;
8184}
8185#else /* GENTABLE */
8186char * Tok2Cmdname(int tok)
8187{
8188  int i = 0;
8189  if (tok <= 0)
8190  {
8191    return sArithBase.sCmds[0].name;
8192  }
8193  if (tok==ANY_TYPE) return "any_type";
8194  if (tok==NONE) return "nothing";
8195  //if (tok==IFBREAK) return "if_break";
8196  //if (tok==VECTOR_FROM_POLYS) return "vector_from_polys";
8197  //if (tok==ORDER_VECTOR) return "ordering";
8198  //if (tok==REF_VAR) return "ref";
8199  //if (tok==OBJECT) return "object";
8200  //if (tok==PRINT_EXPR) return "print_expr";
8201  if (tok==IDHDL) return "identifier";
8202  for(i=0; i<sArithBase.nCmdUsed; i++)
8203    //while (sArithBase.sCmds[i].tokval!=0)
8204  {
8205    if ((sArithBase.sCmds[i].tokval == tok)&&
8206        (sArithBase.sCmds[i].alias==0))
8207    {
8208      return sArithBase.sCmds[i].name;
8209    }
8210  }
8211  return sArithBase.sCmds[0].name;
8212}
8213#endif /* GENTABLE */
8214
8215
8216/*---------------------------------------------------------------------*/
8217/**
8218 * @brief compares to entry of cmdsname-list
8219
8220 @param[in] a
8221 @param[in] b
8222
8223 @return <ReturnValue>
8224**/
8225/*---------------------------------------------------------------------*/
8226static int _gentable_sort_cmds( const void *a, const void *b )
8227{
8228  cmdnames *pCmdL = (cmdnames*)a;
8229  cmdnames *pCmdR = (cmdnames*)b;
8230
8231  if(a==NULL || b==NULL)             return 0;
8232
8233  /* empty entries goes to the end of the list for later reuse */
8234  if(pCmdL->name==NULL) return 1;
8235  if(pCmdR->name==NULL) return -1;
8236
8237  /* $INVALID$ must come first */
8238  if(strcmp(pCmdL->name, "$INVALID$")==0) return -1;
8239  if(strcmp(pCmdR->name, "$INVALID$")==0) return  1;
8240
8241  /* tokval=-1 are reserved names at the end */
8242  if (pCmdL->tokval==-1)
8243  {
8244    if (pCmdR->tokval==-1)
8245       return strcmp(pCmdL->name, pCmdR->name);
8246    /* pCmdL->tokval==-1, pCmdL goes at the end */
8247    return 1;
8248  }
8249  /* pCmdR->tokval==-1, pCmdR goes at the end */
8250  if(pCmdR->tokval==-1) return -1;
8251
8252  return strcmp(pCmdL->name, pCmdR->name);
8253}
8254
8255/*---------------------------------------------------------------------*/
8256/**
8257 * @brief initialisation of arithmetic structured data
8258
8259 @retval 0 on success
8260
8261**/
8262/*---------------------------------------------------------------------*/
8263int iiInitArithmetic()
8264{
8265  int i;
8266  //printf("iiInitArithmetic()\n");
8267#ifndef GENTABLE
8268  memset(&sArithBase, 0, sizeof(sArithBase));
8269  iiInitCmdName();
8270  /* fix last-identifier */
8271#if 0
8272  /* we expect that gentable allready did every thing */
8273  for(sArithBase.nLastIdentifier=sArithBase.nCmdUsed-1;
8274      sArithBase.nLastIdentifier>0; sArithBase.nLastIdentifier--) {
8275    if(sArithBase.sCmds[sArithBase.nLastIdentifier].tokval>=0) break;
8276  }
8277#endif
8278  //Print("L=%d\n", sArithBase.nLastIdentifier);
8279
8280  //iiArithAddCmd(szName, nAlias, nTokval, nToktype);
8281  //iiArithAddCmd("mygcd", 1, GCD_CMD, CMD_2);
8282
8283  //iiArithAddCmd("Top", 0,-1,0);
8284
8285
8286  //for(i=0; i<sArithBase.nCmdUsed; i++) {
8287  //  printf("CMD[%03d] %s, %d, %d, %d\n", i,
8288  //         sArithBase.sCmds[i].name,
8289  //         sArithBase.sCmds[i].alias,
8290  //         sArithBase.sCmds[i].tokval,
8291  //         sArithBase.sCmds[i].toktype);
8292  //}
8293  //iiArithRemoveCmd("Top");
8294  //iiArithAddCmd("mygcd", 2, GCD_CMD, CMD_2);
8295  //iiArithRemoveCmd("mygcd");
8296  //iiArithAddCmd("kkk", 1, 1234, CMD_1);
8297#endif   /* !GENTABLE */
8298  return 0;
8299}
8300
8301/*---------------------------------------------------------------------*/
8302/**
8303 * @brief append newitem of size sizeofitem to the list named list.
8304
8305 @param[in,out] list
8306 @param[in,out] item_count
8307 @param[in] sizeofitem
8308 @param[in] newitem
8309
8310 @retval  0 success
8311 @retval -1 failure
8312**/
8313/*---------------------------------------------------------------------*/
8314int iiArithAddItem2list(
8315  void **list,
8316  long  *item_count,
8317  long sizeofitem,
8318  void *newitem
8319  )
8320{
8321  int count = *item_count;
8322
8323  //TRACE(0, "add_item_to_list(%p, %p, %ld, %p)\n", list, item_count,
8324  //       sizeofitem, newitem);
8325
8326  if(count==0)
8327  {
8328    *list = (void *)omAlloc(sizeofitem);
8329  }
8330  else
8331  {
8332    *list = (void *)omRealloc(*list, (count+1) * sizeofitem);
8333  }
8334  if((*list)==NULL) return -1;
8335
8336  //memset((*list)+count*sizeofitem, 0, sizeofitem);
8337  //memcpy((*list)+count*sizeofitem, newitem, sizeofitem);
8338
8339  /* erhoehe counter um 1 */
8340  (count)++;
8341  *item_count = count;
8342  return 0;
8343}
8344
8345int iiArithFindCmd(const char *szName)
8346{
8347#ifndef GENTABLE
8348  int an=0;
8349  int i = 0,v = 0;
8350  int en=sArithBase.nLastIdentifier;
8351
8352  loop
8353  //for(an=0; an<sArithBase.nCmdUsed; )
8354  {
8355    if(an>=en-1)
8356    {
8357      if (strcmp(szName, sArithBase.sCmds[an].name) == 0)
8358      {
8359        //Print("RET-an=%d %s\n", an, sArithBase.sCmds[an].name);
8360        return an;
8361      }
8362      else if (strcmp(szName, sArithBase.sCmds[en].name) == 0)
8363      {
8364        //Print("RET-en=%d %s\n", en, sArithBase.sCmds[en].name);
8365        return en;
8366      }
8367      else
8368      {
8369        //Print("RET- 1\n");
8370        return -1;
8371      }
8372    }
8373    i=(an+en)/2;
8374    if (*szName < *(sArithBase.sCmds[i].name))
8375    {
8376      en=i-1;
8377    }
8378    else if (*szName > *(sArithBase.sCmds[i].name))
8379    {
8380      an=i+1;
8381    }
8382    else
8383    {
8384      v=strcmp(szName,sArithBase.sCmds[i].name);
8385      if(v<0)
8386      {
8387        en=i-1;
8388      }
8389      else if(v>0)
8390      {
8391        an=i+1;
8392      }
8393      else /*v==0*/
8394      {
8395        //Print("RET-i=%d %s\n", i, sArithBase.sCmds[i].name);
8396        return i;
8397      }
8398    }
8399  }
8400  //if(i>=0 && i<sArithBase.nCmdUsed)
8401  //  return i;
8402  //Print("RET-2\n");
8403  return -2;
8404#else
8405  return 0;
8406#endif
8407}
8408
8409char *iiArithGetCmd( int nPos )
8410{
8411  if(nPos<0) return NULL;
8412  if(nPos<sArithBase.nCmdUsed)
8413    return sArithBase.sCmds[nPos].name;
8414  return NULL;
8415}
8416
8417int iiArithRemoveCmd( char *szName)
8418{
8419  int nIndex;
8420  if(szName==NULL) return -1;
8421
8422  nIndex = iiArithFindCmd(szName);
8423  if(nIndex<0 || nIndex>=sArithBase.nCmdUsed)
8424  {
8425    Print("'%s' not found (%d)\n", szName, nIndex);
8426    return -1;
8427  }
8428  omFree(sArithBase.sCmds[nIndex].name);
8429  sArithBase.sCmds[nIndex].name=0;
8430  qsort(sArithBase.sCmds, sArithBase.nCmdUsed, sizeof(cmdnames),
8431        (&_gentable_sort_cmds));
8432  sArithBase.nCmdUsed--;
8433
8434  /* fix last-identifier */
8435  for(sArithBase.nLastIdentifier=sArithBase.nCmdUsed-1;
8436      sArithBase.nLastIdentifier>0; sArithBase.nLastIdentifier--)
8437  {
8438    if(sArithBase.sCmds[sArithBase.nLastIdentifier].tokval>=0) break;
8439  }
8440  //Print("L=%d\n", sArithBase.nLastIdentifier);
8441  return 0;
8442}
8443
8444int iiArithAddCmd(
8445  char *szName,
8446  short nAlias,
8447  short nTokval,
8448  short nToktype,
8449  short nPos
8450  )
8451{
8452  //printf("AddCmd(%s, %d, %d, %d, %d)\n", szName, nAlias,
8453  //       nTokval, nToktype, nPos);
8454  if(nPos>=0)
8455  {
8456    // no checks: we rely on a correct generated code in iparith.inc
8457    assume(nPos < sArithBase.nCmdAllocated);
8458    assume(szName!=NULL);
8459    sArithBase.sCmds[nPos].name    = omStrDup(szName);
8460    sArithBase.sCmds[nPos].alias   = nAlias;
8461    sArithBase.sCmds[nPos].tokval  = nTokval;
8462    sArithBase.sCmds[nPos].toktype = nToktype;
8463    sArithBase.nCmdUsed++;
8464    //if(nTokval>0) sArithBase.nLastIdentifier++;
8465  }
8466  else
8467  {
8468    if(szName==NULL) return -1;
8469    int nIndex = iiArithFindCmd(szName);
8470    if(nIndex>=0)
8471    {
8472      Print("'%s' already exists at %d\n", szName, nIndex);
8473      return -1;
8474    }
8475
8476    if(sArithBase.nCmdUsed>=sArithBase.nCmdAllocated)
8477    {
8478      /* needs to create new slots */
8479      unsigned long nSize = (sArithBase.nCmdAllocated+1)*sizeof(cmdnames);
8480      sArithBase.sCmds = (cmdnames *)omRealloc(sArithBase.sCmds, nSize);
8481      if(sArithBase.sCmds==NULL) return -1;
8482      sArithBase.nCmdAllocated++;
8483    }
8484    /* still free slots available */
8485    sArithBase.sCmds[sArithBase.nCmdUsed].name    = omStrDup(szName);
8486    sArithBase.sCmds[sArithBase.nCmdUsed].alias   = nAlias;
8487    sArithBase.sCmds[sArithBase.nCmdUsed].tokval  = nTokval;
8488    sArithBase.sCmds[sArithBase.nCmdUsed].toktype = nToktype;
8489    sArithBase.nCmdUsed++;
8490
8491    qsort(sArithBase.sCmds, sArithBase.nCmdUsed, sizeof(cmdnames),
8492          (&_gentable_sort_cmds));
8493    for(sArithBase.nLastIdentifier=sArithBase.nCmdUsed-1;
8494        sArithBase.nLastIdentifier>0; sArithBase.nLastIdentifier--)
8495    {
8496      if(sArithBase.sCmds[sArithBase.nLastIdentifier].tokval>=0) break;
8497    }
8498    //Print("L=%d\n", sArithBase.nLastIdentifier);
8499  }
8500  return 0;
8501}
8502
8503#ifdef GENTABLE
8504  // some special cmds which do not fit in with the others, and
8505  // nevertheless need to be transmitted
8506short ExtraCmds[] =
8507{
8508  OPTION_CMD,
8509  NAMES_CMD,
8510//  RESERVEDNAME_CMD,
8511  PROC_CMD,
8512  MAP_CMD,
8513  PACKAGE_CMD,
8514  '=',
8515  0
8516};
8517
8518// This returns 1 if tok is a token which can appear in a Singular
8519// (quoted) command, and 0 otherwise
8520short IsCmdToken(short tok)
8521{
8522  int i = 0;
8523  // cmds with one arg
8524  while (dArith1[i].cmd != 0)
8525    if (dArith1[i].cmd == tok) return 1;
8526    else i++;
8527
8528  // cmds with two args
8529  i=0;
8530  while (dArith2[i].cmd != 0)
8531    if (dArith2[i].cmd == tok) return 1;
8532    else i++;
8533
8534  // cmds with three args
8535  i=0;
8536  while (dArith3[i].cmd != 0)
8537    if (dArith3[i].cmd == tok) return 1;
8538    else i++;
8539
8540  // cmds with many args
8541  i=0;
8542  while (dArithM[i].cmd != 0)
8543    if (dArithM[i].cmd == tok) return 1;
8544    else i++;
8545
8546  // cmds which are somewhat special (like those having 0 args)
8547  i=0;
8548  while (ExtraCmds[i] != 0)
8549    if (ExtraCmds[i] == tok) return 1;
8550    else i++;
8551
8552  return 0;
8553}
8554#endif
Note: See TracBrowser for help on using the repository browser.