source: git/Singular/iparith.cc @ cad11a

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