source: git/Singular/iparith.cc @ 65bed3

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