source: git/Singular/iparith.cc @ 8427c4

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