source: git/Singular/iparith.cc @ 0f29e1

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