source: git/Singular/iparith.cc @ 7b315e6

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