source: git/Singular/iparith.cc @ f82470

spielwiese
Last change on this file since f82470 was f82470, checked in by Olaf Bachmann <obachman@…>, 24 years ago
* string(LINK_CMD); git-svn-id: file:///usr/local/Singular/svn/trunk@2981 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 165.5 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: iparith.cc,v 1.141 1999-04-15 09:57:03 obachman Exp $ */
5
6/*
7* ABSTRACT: table driven kernel interface, used by interpreter
8*/
9
10#include <stdlib.h>
11#include <string.h>
12#include <ctype.h>
13#include <stdio.h>
14#include <time.h>
15#include <unistd.h>
16
17#include "mod2.h"
18#include "tok.h"
19#include "ipid.h"
20#include "intvec.h"
21#include "mmemory.h"
22#include "febase.h"
23#include "longalg.h"
24#include "polys.h"
25#include "ideals.h"
26#include "matpol.h"
27#include "kstd1.h"
28#include "timer.h"
29#include "ring.h"
30#include "subexpr.h"
31#include "lists.h"
32#include "numbers.h"
33#include "stairc.h"
34#include "maps.h"
35#include "syz.h"
36#include "weight.h"
37#include "ipconv.h"
38#include "ipprint.h"
39#include "sing_dld.h"
40#include "attrib.h"
41#include "silink.h"
42#include "sparsmat.h"
43#ifdef HAVE_FACTORY
44#include "clapsing.h"
45#include "kstdfac.h"
46#endif
47#ifdef HAVE_FGLM
48#include "fglm.h"
49#endif
50#include "ipshell.h"
51
52/*=============== types =====================*/
53struct sValCmdTab
54{
55  short cmd;
56  short start;
57};
58
59typedef sValCmdTab jjValCmdTab[];
60
61/* ifdef GENTABLE: definitions are in ipshell.h */
62#ifndef GENTABLE
63typedef char * (*Proc1)(char *);
64struct sValCmd1
65{
66  proc1 p;
67  short cmd;
68  short res;
69  short arg;
70};
71
72typedef BOOLEAN (*proc2)(leftv,leftv,leftv);
73struct sValCmd2
74{
75  proc2 p;
76  short cmd;
77  short res;
78  short arg1;
79  short arg2;
80};
81
82typedef BOOLEAN (*proc3)(leftv,leftv,leftv,leftv);
83struct sValCmd3
84{
85  proc3 p;
86  short cmd;
87  short res;
88  short arg1;
89  short arg2;
90  short arg3;
91};
92struct sValCmdM
93{
94  proc1 p;
95  short cmd;
96  short res;
97  short number_of_args; /* -1: any, -2: any >0, .. */
98};
99#endif
100
101/*============= proc =======================*/
102static BOOLEAN jjLOAD(leftv res, leftv v, BOOLEAN autoexport = FALSE);
103static int iiTabIndex(const jjValCmdTab dArithTab, const int len, const int op);
104#ifdef MDEBUG
105#define jjMakeSub(A) jjDBMakeSub(A,__FILE__,__LINE__)
106static Subexpr jjDBMakeSub(leftv e,char *f, int l);
107#else
108static Subexpr jjMakeSub(leftv e);
109#endif
110
111/*============= vars ======================*/
112extern int cmdtok;
113extern BOOLEAN expected_parms;
114
115int iiOp; /* the current operation*/
116
117#ifdef GENTABLE
118cmdnames cmds[] =
119{  // name-string alias tokval          toktype
120  { "$INVALID$",   0, -1,                 0},
121  { "and",         0, '&' ,               '&'},
122  { "attrib",      0, ATTRIB_CMD ,        CMD_123},
123  { "bareiss",     0, BAREISS_CMD ,       CMD_1},
124  { "betti",       0, BETTI_CMD ,         CMD_1},
125  { "break",       0, BREAK_CMD ,         BREAK_CMD},
126  { "char",        0, CHARACTERISTIC_CMD ,CMD_1},
127  { "char_series", 0, CHAR_SERIES_CMD ,   CMD_1},
128  { "charstr",     0, CHARSTR_CMD ,       CMD_1},
129  { "cleardenom",  0, CONTENT_CMD ,       CMD_1},
130  { "close",       0, CLOSE_CMD ,         CMD_1},
131  { "coef",        0, COEF_CMD ,          CMD_M},
132  { "coeffs",      0, COEFFS_CMD ,        CMD_23},
133  { "continue",    0, CONTINUE_CMD ,      CONTINUE_CMD},
134  { "contract",    0, CONTRACT_CMD ,      CMD_2},
135  { "dbprint",     0, DBPRINT_CMD ,       CMD_M},
136  { "def",         0, DEF_CMD ,           ROOT_DECL},
137  { "defined",     0, DEFINED_CMD ,       CMD_1},
138  { "deg",         0, DEG_CMD ,           CMD_12},
139  { "degree",      0, DEGREE_CMD ,        CMD_1},
140  { "delete",      0, DELETE_CMD ,        CMD_2},
141  { "det",         0, DET_CMD ,           CMD_1},
142  { "diff",        0, DIFF_CMD ,          CMD_2},
143  { "dim",         0, DIM_CMD ,           CMD_1},
144  { "div",         0, INTDIV ,            INTDIV},
145#ifdef DRING
146  { "dring",       0, DRING_CMD ,         DRING_CMD},
147#endif
148  { "dump",        0, DUMP_CMD,           CMD_1},
149  { "extgcd",      0, EXTGCD_CMD ,        CMD_2},
150  { "EXTGCD",      2, EXTGCD_CMD ,        CMD_2},
151  { "ERROR",       0, ERROR_CMD ,         CMD_1},
152  { "eliminate",   0, ELIMINATION_CMD,    CMD_23},
153  { "else",        0, ELSE_CMD ,          ELSE_CMD},
154  { "eval",        0, EVAL ,              EVAL},
155  { "example",     0, EXAMPLE_CMD ,       EXAMPLE_CMD},
156  { "execute",     0, EXECUTE_CMD ,       EXECUTE_CMD},
157  { "export",      0, EXPORT_CMD ,        EXPORT_CMD},
158#ifdef HAVE_NAMESPACES
159  { "exportto",    0, EXPORTTO_CMD ,      CMD_M},
160#endif
161  { "factorize",   0, FAC_CMD ,           CMD_12},
162  { "fetch",       0, FETCH_CMD ,         CMD_2},
163  { "fglm",        0, FGLM_CMD ,          CMD_2},
164  { "find",        0, FIND_CMD ,          CMD_23},
165  { "finduni",     0, FINDUNI_CMD,        CMD_1},
166  { "forif",       0, IF_CMD ,            IF_CMD},
167  { "freemodule",  0, FREEMODULE_CMD ,    CMD_1},
168  { "facstd",      0, FACSTD_CMD ,        CMD_12},
169  { "gen",         0, E_CMD ,             CMD_1},
170  { "getdump",     0, GETDUMP_CMD,        CMD_1},
171  { "gcd",         0, GCD_CMD ,           CMD_2},
172  { "GCD",         2, GCD_CMD ,           CMD_2},
173  { "hilb",        0, HILBERT_CMD ,       CMD_12},
174  { "highcorner",  0, HIGHCORNER_CMD,     CMD_1},
175  { "homog",       0, HOMOG_CMD ,         CMD_12},
176  { "ideal",       0, IDEAL_CMD ,         IDEAL_CMD},
177  { "if",          0, IF_CMD ,            IF_CMD},
178  { "imap",        0, IMAP_CMD ,          CMD_2},
179#ifdef HAVE_NAMESPACES
180  { "importfrom",  0, IMPORTFROM_CMD ,    CMD_M},
181#endif
182  { "indepSet",    0, INDEPSET_CMD ,      CMD_12},
183  { "insert",      0, INSERT_CMD ,        CMD_23},
184  { "int",         0, INT_CMD ,           ROOT_DECL},
185  { "interred",    0, INTERRED_CMD ,      CMD_1},
186  { "intersect",   0, INTERSECT_CMD ,     CMD_M},
187  { "intmat",      0, INTMAT_CMD ,        INTMAT_CMD},
188  { "intvec",      0, INTVEC_CMD ,        ROOT_DECL_LIST},
189  { "jacob",       0, JACOB_CMD ,         CMD_1},
190  { "jet",         0, JET_CMD ,           CMD_23},
191  { "kbase",       0, KBASE_CMD ,         CMD_12},
192  { "keepring",    0, KEEPRING_CMD ,      KEEPRING_CMD},
193  { "kill",        0, KILL_CMD ,          KILL_CMD},
194  { "killattrib",  0, KILLATTR_CMD ,      CMD_12},
195  { "koszul",      0, KOSZUL_CMD ,        CMD_23},
196  { "lead",        0, LEAD_CMD ,          CMD_1},
197  { "leadcoef",    0, LEADCOEF_CMD ,      CMD_1},
198  { "leadexp",     0, LEADEXP_CMD ,       CMD_1},
199  { "leadmonom",   0, LEADMONOM_CMD ,     CMD_1},
200  { "LIB",         0, LIB_CMD ,           SYSVAR},
201  { "lift",        0, LIFT_CMD ,          CMD_23},
202  { "liftstd",     0, LIFTSTD_CMD ,       CMD_2},
203  { "link",        0, LINK_CMD ,          ROOT_DECL},
204  { "listvar",     0, LISTVAR_CMD ,       LISTVAR_CMD},
205  { "list",        0, LIST_CMD ,          ROOT_DECL_LIST},
206  { "load",        0, LOAD_CMD ,          CMD_12},
207  { "lres",        0, LRES_CMD ,          CMD_2},
208  { "map",         0, MAP_CMD ,           RING_DECL},
209  { "matrix",      0, MATRIX_CMD ,        MATRIX_CMD},
210  { "maxideal",    0, MAXID_CMD ,         CMD_1},
211  { "memory",      0, MEMORY_CMD ,        CMD_1},
212  { "minbase",     0, MINBASE_CMD ,       CMD_1},
213  { "minor",       0, MINOR_CMD ,         CMD_2},
214  { "minres",      0, MINRES_CMD ,        CMD_1},
215  { "mod",         0, '%',                '%'},
216  { "module",      0, MODUL_CMD ,         MODUL_CMD},
217  { "modulo",      0, MODULO_CMD ,        CMD_2},
218  { "monitor",     0, MONITOR_CMD ,       CMD_12},
219  { "mult",        0, MULTIPLICITY_CMD ,  CMD_1},
220  #ifdef OLD_RES
221  { "mres",        0, MRES_CMD ,          CMD_23},
222  #else
223  { "mres",        0, MRES_CMD ,          CMD_2},
224  #endif
225  { "mstd",        0, MSTD_CMD ,          CMD_1},
226  { "nameof",      0, NAMEOF_CMD ,        CMD_1},
227  { "names",       0, NAMES_CMD ,         CMD_M},
228  { "ncols",       0, COLS_CMD ,          CMD_1},
229  { "not",         0, NOT ,               NOT},
230  { "npars",       0, NPARS_CMD ,         CMD_1},
231  #ifdef OLD_RES
232  { "nres",        0, RES_CMD ,           CMD_23},
233  #else
234  { "nres",        0, RES_CMD ,           CMD_2},
235  #endif
236  { "nrows",       0, ROWS_CMD ,          CMD_1},
237  { "number",      0, NUMBER_CMD ,        RING_DECL},
238  { "nvars",       0, NVARS_CMD ,         CMD_1},
239  { "open",        0, OPEN_CMD ,          CMD_1},
240  { "option",      0, OPTION_CMD ,        CMD_M},
241  { "or",          0, '|' ,               '|'},
242  { "ord",         0, ORD_CMD ,           CMD_1},
243  { "ordstr",      0, ORDSTR_CMD ,        CMD_1},
244  { "package",     0, PACKAGE_CMD ,       ROOT_DECL},
245  { "par",         0, PAR_CMD ,           CMD_1},
246  { "parameter",   0, PARAMETER ,         PARAMETER},
247  { "pardeg",      0, PARDEG_CMD ,        CMD_1},
248  { "parstr",      0, PARSTR_CMD ,        CMD_12},
249  { "poly",        0, POLY_CMD ,          RING_DECL},
250  { "preimage",    0, PREIMAGE_CMD ,      CMD_3},
251  { "prime",       0, PRIME_CMD ,         CMD_1},
252  { "print",       0, PRINT_CMD ,         CMD_12},
253  { "prune",       0, PRUNE_CMD ,         CMD_1},
254  { "proc",        0, PROC_CMD ,          PROC_CMD},
255  { "qhweight",    0, QHWEIGHT_CMD ,      CMD_1},
256  { "qring",       0, QRING_CMD ,         ROOT_DECL},
257  { "quote",       0, QUOTE ,             QUOTE},
258  { "quotient",    0, QUOTIENT_CMD ,      CMD_2},
259  { "random",      0, RANDOM_CMD ,        CMD_23},
260  { "read",        0, READ_CMD ,          CMD_12},
261  { "reduce",      0, REDUCE_CMD ,        CMD_23},
262  { "regularity",  0, REGULARITY_CMD ,    CMD_1},
263  { "reservedName",0, RESERVEDNAME_CMD ,  CMD_M},
264  { "resolution",  0, RESOLUTION_CMD ,    RING_DECL},
265  { "resultant",   0, RESULTANT_CMD,      CMD_3},
266  { "return",      0, RETURN ,            RETURN},
267  { "RETURN",      0, END_GRAMMAR ,       RETURN},
268  { "ring",        0, RING_CMD ,          RING_CMD},
269  { "rvar",        0, IS_RINGVAR ,        CMD_1},
270  { "setring",     0, SETRING_CMD ,       SETRING_CMD},
271  { "simplify",    0, SIMPLIFY_CMD ,      CMD_2},
272  { "size",        0, COUNT_CMD ,         CMD_1},
273  { "sortvec",     0, SORTVEC_CMD ,       CMD_1},
274  #ifdef OLD_RES
275  { "sres",        0, SRES_CMD ,          CMD_23},
276  #else
277  { "sres",        0, SRES_CMD ,          CMD_2},
278  #endif
279  { "status",      0, STATUS_CMD,         CMD_M},
280  { "std",         0, STD_CMD ,           CMD_123},
281  { "string",      0, STRING_CMD ,        ROOT_DECL_LIST},
282  { "subst",       0, SUBST_CMD ,         CMD_3},
283  { "system",      0, SYSTEM_CMD,         CMD_M},
284  { "syz",         0, SYZYGY_CMD ,        CMD_1},
285  { "test",        0, TEST_CMD ,          CMD_M},
286  { "trace",       0, TRACE_CMD ,         CMD_1},
287  { "transpose",   0, TRANSPOSE_CMD ,     CMD_1},
288  { "type",        0, TYPE_CMD ,          TYPE_CMD},
289  { "typeof",      0, TYPEOF_CMD ,        CMD_1},
290#ifdef HAVE_NAMESPACES
291  { "unload",      0, UNLOAD_CMD ,        CMD_M},
292#endif
293  { "var",         0, VAR_CMD ,           CMD_1},
294  { "varstr",      0, VARSTR_CMD ,        CMD_12},
295  { "vdim",        0, VDIM_CMD ,          CMD_1},
296  { "vector",      0, VECTOR_CMD ,        RING_DECL},
297  { "wedge",       0, WEDGE_CMD ,         CMD_2},
298  { "weight",      0, WEIGHT_CMD ,        CMD_1},
299  { "whileif",     0, IF_CMD ,            IF_CMD},
300  { "write",       0, WRITE_CMD ,         CMD_M},
301/* delete for next version:*/
302  { "IN",          1, LEAD_CMD ,          CMD_1},
303  { "NF",          1, REDUCE_CMD ,        CMD_23},
304  { "multiplicity",1, MULTIPLICITY_CMD ,  CMD_1},
305  { "verbose",     2, OPTION_CMD ,        CMD_M},
306//  { "rank",        1, ROWS_CMD ,          CMD_1},
307//  { "Current",     0, -1 ,                SYSVAR},
308//  { "Top",         0, -1 ,                SYSVAR},
309//  { "Up",          0, -1 ,                SYSVAR},
310
311/* set sys vars*/
312//#ifdef SRING
313  { "alternating", 0, VALTVARS ,          SYSVAR},
314//#endif
315  { "degBound",    0, VMAXDEG ,           SYSVAR},
316  { "echo",        0, VECHO ,             SYSVAR},
317  { "minpoly",     0, VMINPOLY ,          SYSVAR},
318  { "multBound",   0, VMAXMULT ,          SYSVAR},
319  { "noether",     0, VNOETHER ,          SYSVAR},
320  { "pagelength",  0, VPAGELENGTH ,       SYSVAR},
321  { "pagewidth",   0, VCOLMAX ,           SYSVAR},
322  { "printlevel",  0, VPRINTLEVEL ,       SYSVAR},
323  { "short",       0, VSHORTOUT ,         SYSVAR},
324  { "timer",       0, VTIMER ,            SYSVAR},
325  { "rtimer",      0, VRTIMER,            SYSVAR},
326  { "TRACE",       0, TRACE ,             SYSVAR},
327  { "voice",       0, VOICE ,             SYSVAR},
328
329/* other reserved words:scanner.l */
330  { "pause",       2, -1 ,             0},
331  { "while",       0, -1 ,             0},
332  { "for",         0, -1 ,             0},
333  { "help",        0, -1 ,             0},
334  { "newline",     0, -1 ,             0},
335  { "exit",        0, -1 ,             0},
336  { "quit",        0, -1 ,             0},
337/* end of list marker */
338  { NULL, 0, 0, 0}
339};
340#endif
341
342/*=================== operations with 2 args.: static proc =================*/
343static BOOLEAN jjOP_IV_I(leftv res, leftv u, leftv v)
344{
345  intvec* aa= (intvec *)u->CopyD(INTVEC_CMD);
346  int bb = (int)(v->Data());
347  if (errorreported) return TRUE;
348  switch (iiOp)
349  {
350    case '+': (*aa) += bb; break;
351    case '-': (*aa) -= bb; break;
352    case '*': (*aa) *= bb; break;
353    case '/':
354    case INTDIV: (*aa) /= bb; break;
355    case '%': (*aa) %= bb; break;
356  }
357  res->data=(char *)aa;
358  return FALSE;
359}
360static BOOLEAN jjOP_I_IV(leftv res, leftv u, leftv v)
361{
362  return jjOP_IV_I(res,v,u);
363}
364static BOOLEAN jjOP_IM_I(leftv res, leftv u, leftv v)
365{
366  intvec* aa= (intvec *)u->CopyD(INTVEC_CMD);
367  int bb = (int)(v->Data());
368  int i=min(aa->rows(),aa->cols());
369  switch (iiOp)
370  {
371    case '+': for (;i>0;i--) IMATELEM(*aa,i,i) += bb;
372              break;
373    case '-': for (;i>0;i--) IMATELEM(*aa,i,i) -= bb;
374              break;
375  }
376  res->data=(char *)aa;
377  return FALSE;
378}
379static BOOLEAN jjOP_I_IM(leftv res, leftv u, leftv v)
380{
381  return jjOP_IM_I(res,v,u);
382}
383static BOOLEAN jjDOTDOT(leftv res, leftv u, leftv v)
384{
385  res->data=(char *)new intvec((int)u->Data(),(int)v->Data());
386  return FALSE;
387}
388static void jjEQUAL_REST(leftv res,leftv u,leftv v)
389{
390  if ((res->data) && (u->next!=NULL) && (v->next!=NULL))
391  {
392    int save_iiOp=iiOp;
393    if (iiOp==NOTEQUAL)
394      iiExprArith2(res,u->next,EQUAL_EQUAL,v->next);
395    else
396      iiExprArith2(res,u->next,iiOp,v->next);
397    iiOp=save_iiOp;
398  }
399  if (iiOp==NOTEQUAL) res->data=(char *)(!(int)res->data);
400}
401static BOOLEAN jjCOMPARE_IV(leftv res, leftv u, leftv v)
402{
403  intvec*    a = (intvec * )(u->Data());
404  intvec*    b = (intvec * )(v->Data());
405  int r=a->compare(b);
406  switch  (iiOp)
407  {
408    case '<':
409      res->data  = (char *) (r<0);
410      break;
411    case '>':
412      res->data  = (char *) (r>0);
413      break;
414    case LE:
415      res->data  = (char *) (r<=0);
416      break;
417    case GE:
418      res->data  = (char *) (r>=0);
419      break;
420    case EQUAL_EQUAL:
421    case NOTEQUAL: /* negation handled by jjEQUAL_REST */
422      res->data  = (char *) (r==0);
423      break;
424  }
425  jjEQUAL_REST(res,u,v);
426  return r==-2;
427}
428static BOOLEAN jjCOMPARE_IV_I(leftv res, leftv u, leftv v)
429{
430  intvec* a = (intvec * )(u->Data());
431  int     b = (int )     (v->Data());
432  int r=a->compare(b);
433  switch  (iiOp)
434  {
435    case '<':
436      res->data  = (char *) (r<0);
437      break;
438    case '>':
439      res->data  = (char *) (r>0);
440      break;
441    case LE:
442      res->data  = (char *) (r<=0);
443      break;
444    case GE:
445      res->data  = (char *) (r>=0);
446      break;
447    case EQUAL_EQUAL:
448    case NOTEQUAL: /* negation handled by jjEQUAL_REST */
449      res->data  = (char *) (r==0);
450      break;
451  }
452  jjEQUAL_REST(res,u,v);
453  return FALSE;
454}
455static BOOLEAN jjCOMPARE_P(leftv res, leftv u, leftv v)
456{
457  poly p=(poly)u->Data();
458  poly q=(poly)v->Data();
459  int r=pComp(p,q);
460  if (r==0)
461  {
462    /* compare lead coeffs */
463    number h=nSub(pGetCoeff(p),pGetCoeff(q));
464    r = -1+nIsZero(h)+2*nGreaterZero(h); /* -1: <, 0:==, 1: > */
465    nDelete(&h);
466  }
467  else if (p==NULL)
468  {
469    if (q==NULL)
470    {
471      /* compare 0, 0 */
472      r=0;
473    }
474    else if(pIsConstant(q))
475    {
476      /* compare 0, const */
477      r = 1-2*nGreaterZero(pGetCoeff(q)); /* -1: <, 1: > */
478    }
479  }
480  else if (q==NULL)
481  {
482    if (pIsConstant(p))
483    {
484      /* compare const, 0 */
485      r = -1+2*nGreaterZero(pGetCoeff(p)); /* -1: <, 1: > */
486    }
487  }
488  switch  (iiOp)
489  {
490    case '<':
491      res->data  = (char *) (r < 0);
492      break;
493    case '>':
494      res->data  = (char *) (r > 0);
495      break;
496    case LE:
497      res->data  = (char *) (r <= 0);
498      break;
499    case GE:
500      res->data  = (char *) (r >= 0);
501      break;
502    //case EQUAL_EQUAL:
503    //case NOTEQUAL: /* negation handled by jjEQUAL_REST */
504    //  res->data  = (char *) (r == 0);
505    //  break;
506  }
507  jjEQUAL_REST(res,u,v);
508  return FALSE;
509}
510static BOOLEAN jjCOMPARE_S(leftv res, leftv u, leftv v)
511{
512  char*    a = (char * )(u->Data());
513  char*    b = (char * )(v->Data());
514  int result = strcmp(a,b);
515  switch  (iiOp)
516  {
517    case '<':
518      res->data  = (char *) (result  < 0);
519      break;
520    case '>':
521      res->data  = (char *) (result  > 0);
522      break;
523    case LE:
524      res->data  = (char *) (result  <= 0);
525      break;
526    case GE:
527      res->data  = (char *) (result  >= 0);
528      break;
529    case EQUAL_EQUAL:
530    case NOTEQUAL: /* negation handled by jjEQUAL_REST */
531      res->data  = (char *) (result  == 0);
532      break;
533  }
534  jjEQUAL_REST(res,u,v);
535  return FALSE;
536}
537static BOOLEAN jjOP_REST(leftv res, leftv u, leftv v)
538{
539  if (u->Next()!=NULL)
540  {
541    u=u->next;
542    res->next = (leftv)Alloc(sizeof(sleftv));
543    return iiExprArith2(res->next,u,iiOp,v);
544  }
545  else if (v->Next()!=NULL)
546  {
547    v=v->next;
548    res->next = (leftv)Alloc(sizeof(sleftv));
549    return iiExprArith2(res->next,u,iiOp,v);
550  }
551  return FALSE;
552}
553static BOOLEAN jjPOWER_I(leftv res, leftv u, leftv v)
554{
555  int b=(int)u->Data();
556  int e=(int)v->Data();
557  int rc = 1;
558  BOOLEAN overflow=FALSE;
559  if ((e >= 0)&&(b!=0))
560  {
561    int oldrc;
562    while ((e--)!=0)
563    {
564      oldrc=rc;
565      rc *= b;
566      if (!overflow)
567      {
568        if(rc/b!=oldrc) overflow=TRUE;
569      }
570    }
571    if (overflow)
572      Warn("int overflow(^), result may be wrong");
573    res->data = (char *)rc;
574    if (u!=NULL) return jjOP_REST(res,u,v);
575    return FALSE;
576  }
577  else
578  {
579    WerrorS("exponent must be non-negative");
580    return TRUE;
581  }
582}
583static BOOLEAN jjPOWER_N(leftv res, leftv u, leftv v)
584{
585  int e=(int)v->Data();
586  number n=(number)u->CopyD();
587  if (e<0)
588  {
589    number m=nInvers(n);
590    nDelete(&n);
591    n=m;
592    e=-e;
593  }
594  nPower(n,e,(number*)&res->data);
595  nDelete(&n);
596  if (u!=NULL) return jjOP_REST(res,u,v);
597  return FALSE;
598}
599static BOOLEAN jjPOWER_P(leftv res, leftv u, leftv v)
600{
601  res->data = (char *)pPower((poly)u->CopyD(POLY_CMD),(int)v->Data());
602  if (u!=NULL) return jjOP_REST(res,u,v);
603  return FALSE;
604}
605static BOOLEAN jjPOWER_ID(leftv res, leftv u, leftv v)
606{
607  res->data = (char *)idPower((ideal)(u->Data()),(int)(v->Data()));
608  if (u!=NULL) return jjOP_REST(res,u,v);
609  return FALSE;
610}
611static BOOLEAN jjPLUSMINUS_Gen(leftv res, leftv u, leftv v)
612{
613  u=u->next;
614  v=v->next;
615  if (u==NULL)
616  {
617    if (v==NULL) return FALSE;      /* u==NULL, v==NULL */
618    if (iiOp=='-')                  /* u==NULL, v<>NULL, iiOp=='-'*/
619    {
620      if (res->next==NULL)
621        res->next = (leftv)Alloc(sizeof(sleftv));
622      return iiExprArith1(res->next,v,'-');
623    }
624    loop                            /* u==NULL, v<>NULL, iiOp=='+' */
625    {
626      res->next = (leftv)Alloc0(sizeof(sleftv));
627      res=res->next;
628      res->data = v->CopyD();
629      res->rtyp = v->Typ();
630      v=v->next;
631      if (v==NULL) return FALSE;
632    }
633  }
634  if (v!=NULL)                     /* u<>NULL, v<>NULL */
635  {
636    res->next = (leftv)Alloc(sizeof(sleftv));
637    return iiExprArith2(res->next,u,iiOp,v);
638  }
639  loop                             /* u<>NULL, v==NULL */
640  {
641    res->next = (leftv)Alloc0(sizeof(sleftv));
642    res=res->next;
643    res->data = u->CopyD();
644    res->rtyp = u->Typ();
645    u=u->next;
646    if (u==NULL) return FALSE;
647  }
648}
649static BOOLEAN jjCOLCOL(leftv res, leftv u, leftv v)
650{
651#ifdef HAVE_NAMESPACES
652  BOOLEAN iiReLoadLib(idhdl packhdl);
653  BOOLEAN iiTryLoadLib(leftv v, char *id);
654  idhdl packhdl;
655
656  switch(u->Typ())
657  {
658      case 0:
659        //Print("%s of type 'ANY'. Trying load.\n", v->name);
660        if(iiTryLoadLib(u, u->name))
661        {
662          Werror("'%s' no such package", u->name);
663          return TRUE;
664        }
665        // else: use next case !!! no break !!!
666
667      case PACKAGE_CMD:
668        packhdl = (idhdl)u->data;
669        if(!IDPACKAGE(packhdl)->loaded)
670        {
671          //if(iiReLoadLib(packhdl))
672          //  Werror("unable to reload package '%s'", IDID(packhdl));
673        }
674        if(v->rtyp == IDHDL)
675        {
676          v->name = mstrdup(v->name);
677        }
678        namespaceroot->push( IDPACKAGE(packhdl), IDID(packhdl));
679        syMake(v, v->name, packhdl);
680        memcpy(res, v, sizeof(sleftv));
681        memset(v, 0, sizeof(sleftv));
682        namespaceroot->pop();
683        break;
684
685      case DEF_CMD:
686        break;
687
688      default:
689        WerrorS("<package>::<id> expected");
690        return TRUE;
691  }
692#else /* HAVE_NAMESPACES */
693  WerrorS("package is not supported in this version");
694#endif /* HAVE_NAMESPACES */
695  return FALSE;
696}
697static BOOLEAN jjPLUS_I(leftv res, leftv u, leftv v)
698{
699  unsigned int a=(unsigned int)u->Data();
700  unsigned int b=(unsigned int)v->Data();
701  unsigned int c=a+b;
702  res->data = (char *)c;
703  if (((Sy_bit(31)&a)==(Sy_bit(31)&b))&&((Sy_bit(31)&a)!=(Sy_bit(31)&c)))
704  {
705    Warn("int overflow(+), result may be wrong");
706  }
707  return jjPLUSMINUS_Gen(res,u,v);
708}
709static BOOLEAN jjPLUS_N(leftv res, leftv u, leftv v)
710{
711  res->data = (char *)(nAdd((number)u->Data(), (number)v->Data()));
712  return jjPLUSMINUS_Gen(res,u,v);
713}
714static BOOLEAN jjPLUS_P(leftv res, leftv u, leftv v)
715{
716  res->data = (char *)(pAdd((poly)u->CopyD(POLY_CMD) , (poly)v->CopyD(POLY_CMD)));
717  return jjPLUSMINUS_Gen(res,u,v);
718}
719static BOOLEAN jjPLUS_IV(leftv res, leftv u, leftv v)
720{
721  res->data = (char *)ivAdd((intvec*)(u->Data()), (intvec*)(v->Data()));
722  if (res->data==NULL)
723  {
724     WerrorS("intmat size not compatible");
725     return TRUE;
726  }
727  return jjPLUSMINUS_Gen(res,u,v);
728}
729static BOOLEAN jjPLUS_MA(leftv res, leftv u, leftv v)
730{
731  res->data = (char *)(mpAdd((matrix)u->Data() , (matrix)v->Data()));
732  if (res->data==NULL)
733  {
734     WerrorS("matrix size not compatible");
735     return TRUE;
736  }
737  return jjPLUSMINUS_Gen(res,u,v);
738}
739static BOOLEAN jjPLUS_MA_P(leftv res, leftv u, leftv v)
740{
741  matrix m=(matrix)u->Data();
742  matrix p= mpInitP(m->nrows,m->ncols,(poly)(v->CopyD()));
743  if (iiOp=='+')
744    res->data = (char *)mpAdd(m , p);
745  else
746    res->data = (char *)mpSub(m , p);
747  idDelete((ideal *)&p);
748  return jjPLUSMINUS_Gen(res,u,v);
749}
750static BOOLEAN jjPLUS_P_MA(leftv res, leftv u, leftv v)
751{
752  return jjPLUS_MA_P(res,v,u);
753}
754static BOOLEAN jjPLUS_S(leftv res, leftv u, leftv v)
755{
756  char*    a = (char * )(u->Data());
757  char*    b = (char * )(v->Data());
758  char*    r = (char * )AllocL(strlen(a) + strlen(b) + 1);
759  strcpy(r,a);
760  strcat(r,b);
761  res->data=r;
762  return jjPLUSMINUS_Gen(res,u,v);
763}
764static BOOLEAN jjPLUS_ID(leftv res, leftv u, leftv v)
765{
766  res->data = (char *)idAdd((ideal)u->Data(),(ideal)v->Data());
767  return jjPLUSMINUS_Gen(res,u,v);
768}
769static BOOLEAN jjMINUS_I(leftv res, leftv u, leftv v)
770{
771  unsigned int a=(unsigned int)u->Data();
772  unsigned int b=(unsigned int)v->Data();
773  unsigned int c=a-b;
774  if (((Sy_bit(31)&a)!=(Sy_bit(31)&b))&&((Sy_bit(31)&a)!=(Sy_bit(31)&c)))
775  {
776    Warn("int overflow(-), result may be wrong");
777  }
778  res->data = (char *)c;
779  return jjPLUSMINUS_Gen(res,u,v);
780}
781static BOOLEAN jjMINUS_N(leftv res, leftv u, leftv v)
782{
783  res->data = (char *)(nSub((number)u->Data(), (number)v->Data()));
784  return jjPLUSMINUS_Gen(res,u,v);
785}
786static BOOLEAN jjMINUS_P(leftv res, leftv u, leftv v)
787{
788  res->data = (char *)(pSub((poly)u->CopyD(POLY_CMD) , (poly)v->CopyD(POLY_CMD)));
789  return jjPLUSMINUS_Gen(res,u,v);
790}
791static BOOLEAN jjMINUS_IV(leftv res, leftv u, leftv v)
792{
793  res->data = (char *)ivSub((intvec*)(u->Data()), (intvec*)(v->Data()));
794  if (res->data==NULL)
795  {
796     WerrorS("intmat size not compatible");
797     return TRUE;
798  }
799  return jjPLUSMINUS_Gen(res,u,v);
800}
801static BOOLEAN jjMINUS_MA(leftv res, leftv u, leftv v)
802{
803  res->data = (char *)(mpSub((matrix)u->Data() , (matrix)v->Data()));
804  if (res->data==NULL)
805  {
806     WerrorS("matrix size not compatible");
807     return TRUE;
808  }
809  return jjPLUSMINUS_Gen(res,u,v);
810}
811static BOOLEAN jjTIMES_I(leftv res, leftv u, leftv v)
812{
813  int a=(int)u->Data();
814  int b=(int)v->Data();
815  int c=a * b;
816  if ((b!=0) && (c/b !=a))
817    Warn("int overflow(*), result may be wrong");
818  res->data = (char *)c;
819  if ((u->Next()!=NULL) || (v->Next()!=NULL))
820    return jjOP_REST(res,u,v);
821  return FALSE;
822}
823static BOOLEAN jjTIMES_N(leftv res, leftv u, leftv v)
824{
825  res->data = (char *)(nMult( (number)u->Data(), (number)v->Data()));
826  if ((v->next!=NULL) || (u->next!=NULL))
827    return jjOP_REST(res,u,v);
828  return FALSE;
829}
830static BOOLEAN jjTIMES_P(leftv res, leftv u, leftv v)
831{
832  poly a;
833  poly b;
834
835  if (v->next==NULL)
836  {
837    a=(poly)u->CopyD();
838    if (u->next==NULL)
839    {
840      b=(poly)v->CopyD();
841      res->data = (char *)(pMult( a, b));
842      return FALSE;
843    }
844    // u->next exists: copy v
845    b=pCopy((poly)v->Data());
846    res->data = (char *)(pMult( a, b));
847    return jjOP_REST(res,u,v);
848  }
849  // v->next exists: copy u
850  a=pCopy((poly)u->Data());
851  b=(poly)v->CopyD();
852  res->data = (char *)(pMult( a, b));
853  return jjOP_REST(res,u,v);
854}
855static BOOLEAN jjTIMES_ID(leftv res, leftv u, leftv v)
856{
857  res->data = (char *)idMult((ideal)u->Data(),(ideal)v->Data());
858  if ((v->next!=NULL) || (u->next!=NULL))
859    return jjOP_REST(res,u,v);
860  return FALSE;
861}
862static BOOLEAN jjTIMES_IV(leftv res, leftv u, leftv v)
863{
864  res->data = (char *)ivMult((intvec*)(u->Data()), (intvec*)(v->Data()));
865  if (res->data==NULL)
866  {
867     WerrorS("intmat size not compatible");
868     return TRUE;
869  }
870  if ((v->next!=NULL) || (u->next!=NULL))
871    return jjOP_REST(res,u,v);
872  return FALSE;
873}
874static BOOLEAN jjTIMES_MA_P1(leftv res, leftv u, leftv v)
875{
876  poly p=(poly)v->CopyD(POLY_CMD);
877  int r=pMaxComp(p);/* recompute the rank for the case ideal*vector*/
878  ideal I= (ideal)mpMultP((matrix)u->CopyD(MATRIX_CMD),p);
879  if (r>0) I->rank=r;
880  res->data = (char *)I;
881  return FALSE;
882}
883static BOOLEAN jjTIMES_MA_P2(leftv res, leftv u, leftv v)
884{
885  return jjTIMES_MA_P1(res,v,u);
886}
887static BOOLEAN jjTIMES_MA_N1(leftv res, leftv u, leftv v)
888{
889  number n=(number)v->CopyD(NUMBER_CMD);
890  poly p=pOne();
891  pSetCoeff(p,n);
892  res->data = (char *)mpMultP((matrix)u->CopyD(MATRIX_CMD),p);
893  return FALSE;
894}
895static BOOLEAN jjTIMES_MA_N2(leftv res, leftv u, leftv v)
896{
897  return jjTIMES_MA_N1(res,v,u);
898}
899static BOOLEAN jjTIMES_MA_I1(leftv res, leftv u, leftv v)
900{
901  res->data = (char *)mpMultI((matrix)u->CopyD(MATRIX_CMD),(int)v->Data());
902  return FALSE;
903}
904static BOOLEAN jjTIMES_MA_I2(leftv res, leftv u, leftv v)
905{
906  return jjTIMES_MA_I1(res,v,u);
907}
908static BOOLEAN jjTIMES_MA(leftv res, leftv u, leftv v)
909{
910  res->data = (char *)mpMult((matrix)u->Data(),(matrix)v->Data());
911  if (res->data==NULL)
912  {
913     WerrorS("matrix size not compatible");
914     return TRUE;
915  }
916  if ((v->next!=NULL) || (u->next!=NULL))
917    return jjOP_REST(res,u,v);
918  return FALSE;
919}
920static BOOLEAN jjGE_I(leftv res, leftv u, leftv v)
921{
922  res->data = (char *)((int)u->Data() >= (int)v->Data());
923  return FALSE;
924}
925static BOOLEAN jjGE_N(leftv res, leftv u, leftv v)
926{
927  number h=nSub((number)u->Data(),(number)v->Data());
928  res->data = (char *) (nGreaterZero(h)||(nIsZero(h)));
929  nDelete(&h);
930  return FALSE;
931}
932static BOOLEAN jjGT_I(leftv res, leftv u, leftv v)
933{
934  res->data = (char *)((int)u->Data()>(int)v->Data());
935  return FALSE;
936}
937static BOOLEAN jjGT_N(leftv res, leftv u, leftv v)
938{
939  number h=nSub((number)u->Data(),(number)v->Data());
940  res->data = (char *) (nGreaterZero(h)&&(!nIsZero(h)));
941  nDelete(&h);
942  return FALSE;
943}
944static BOOLEAN jjLE_I(leftv res, leftv u, leftv v)
945{
946  res->data = (char *)((int)u->Data() <= (int)v->Data());
947  return FALSE;
948}
949static BOOLEAN jjLE_N(leftv res, leftv u, leftv v)
950{
951  number h=nSub((number)v->Data(),(number)u->Data());
952  res->data = (char *) (nGreaterZero(h)||nIsZero(h));
953  nDelete(&h);
954  return FALSE;
955}
956static BOOLEAN jjLT_I(leftv res, leftv u, leftv v)
957{
958  res->data = (char *)((int)u->Data() < (int)v->Data());
959  return FALSE;
960}
961static BOOLEAN jjLT_N(leftv res, leftv u, leftv v)
962{
963  number h=nSub((number)v->Data(),(number)u->Data());
964  res->data = (char *) (nGreaterZero(h)&&(!nIsZero(h)));
965  nDelete(&h);
966  return FALSE;
967}
968static BOOLEAN jjDIV_I(leftv res, leftv u, leftv v)
969{
970  int a= (int) u->Data();
971  int b= (int) v->Data();
972  if (b==0)
973  {
974    WerrorS("div. by 0");
975    return TRUE;
976  }
977  //int c=a%ABS(b);
978  //if(c<0) c+=ABS(b);
979  //res->data = (char *)((a-c) / b);
980  res->data = (char *)(a / b);
981  return FALSE;
982}
983static BOOLEAN jjDIV_N(leftv res, leftv u, leftv v)
984{
985  number q=(number)v->Data();
986  if (nIsZero(q))
987  {
988    WerrorS("div. by 0");
989    return TRUE;
990  }
991  q = nDiv((number)u->Data(),q);
992  nNormalize(q);
993  res->data = (char *)q;
994  return FALSE;
995}
996static BOOLEAN jjDIV_P(leftv res, leftv u, leftv v)
997{
998  poly q=(poly)v->Data();
999  if (q==NULL)
1000  {
1001    WerrorS("div. by 0");
1002    return TRUE;
1003  }
1004  if (pNext(q)!=NULL)
1005  {
1006#ifdef HAVE_FACTORY
1007    res->data=(void*)(singclap_pdivide((poly)(u->Data()),
1008                                       (poly)(v->Data())));
1009#else
1010    WerrorS("division only by a monomial");
1011    return TRUE;
1012#endif
1013  }
1014  else
1015  {
1016    res->data = (char *)pDivideM((poly)u->CopyD(POLY_CMD),pHead(q));
1017  }
1018  return FALSE;
1019}
1020static BOOLEAN jjMOD_I(leftv res, leftv u, leftv v)
1021{
1022  int a=(int)u->Data();
1023  int b=ABS((int)v->Data());
1024  if (errorreported) return TRUE;
1025  if (b==0)
1026  {
1027    WerrorS("div. by 0");
1028    return TRUE;
1029  }
1030  int c=a%b;
1031  if(c<0) c+=b;
1032  res->data = (char *)c;
1033  return FALSE;
1034}
1035static BOOLEAN jjEQUAL_I(leftv res, leftv u, leftv v)
1036{
1037  res->data = (char *)((int)u->Data() == (int)v->Data());
1038  jjEQUAL_REST(res,u,v);
1039  return FALSE;
1040}
1041static BOOLEAN jjEQUAL_Ma(leftv res, leftv u, leftv v)
1042{
1043  res->data = (char *)mpEqual((matrix)u->Data(),(matrix)v->Data());
1044  jjEQUAL_REST(res,u,v);
1045  return FALSE;
1046}
1047static BOOLEAN jjEQUAL_N(leftv res, leftv u, leftv v)
1048{
1049  res->data = (char *)nEqual((number)u->Data(),(number)v->Data());
1050  jjEQUAL_REST(res,u,v);
1051  return FALSE;
1052}
1053static BOOLEAN jjEQUAL_P(leftv res, leftv u, leftv v)
1054{
1055  poly p=(poly)u->Data();
1056  poly q=(poly)v->Data();
1057  if (p==NULL)
1058  {
1059    res->data=(char *)(q==NULL);
1060  }
1061  else
1062  {
1063    if (q==NULL) res->data=(char *)FALSE;
1064    else
1065    {
1066      int r=pComp(p,q);
1067      if (r==0)
1068      {
1069        p=pSub(pCopy(p),pCopy(q));
1070        res->data = (char *) (p==NULL);
1071        pDelete(&p);
1072      }
1073      else
1074        res->data = (char *) FALSE;
1075    }
1076  }
1077  jjEQUAL_REST(res,u,v);
1078  return FALSE;
1079}
1080static BOOLEAN jjAND_I(leftv res, leftv u, leftv v)
1081{
1082  res->data = (char *)((int)u->Data() && (int)v->Data());
1083  return FALSE;
1084}
1085static BOOLEAN jjOR_I(leftv res, leftv u, leftv v)
1086{
1087  res->data = (char *)((int)u->Data() || (int)v->Data());
1088  return FALSE;
1089}
1090static BOOLEAN jjINDEX_I(leftv res, leftv u, leftv v)
1091{
1092  res->rtyp=u->rtyp; u->rtyp=0;
1093  res->data=u->data; u->data=NULL;
1094  res->name=u->name; u->name=NULL;
1095#ifdef HAVE_NAMESPACES
1096  res->packhdl=u->packhdl; u->packhdl=NULL;
1097  res->req_packhdl=u->req_packhdl; u->req_packhdl=NULL;
1098#endif /* HAVE_NAMESPACES */
1099  res->e=u->e;       u->e=NULL;
1100  if (res->e==NULL) res->e=jjMakeSub(v);
1101  else
1102  {
1103    Subexpr sh=res->e;
1104    while (sh->next != NULL) sh=sh->next;
1105    sh->next=jjMakeSub(v);
1106  }
1107  return FALSE;
1108}
1109static BOOLEAN jjINDEX_IV(leftv res, leftv u, leftv v)
1110{
1111  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
1112  {
1113    WerrorS("indexed object must have a name");
1114    return TRUE;
1115  }
1116  intvec * iv=(intvec *)v->Data();
1117  leftv p=NULL;
1118  int i;
1119  sleftv t;
1120
1121  memset(&t,0,sizeof(t));
1122  t.rtyp=INT_CMD;
1123  for (i=0;i<iv->length(); i++)
1124  {
1125    t.data=(char *)(*iv)[i];
1126    if (p==NULL)
1127    {
1128      p=res;
1129    }
1130    else
1131    {
1132      p->next=(leftv)Alloc0(sizeof(sleftv));
1133      p=p->next;
1134    }
1135    p->rtyp=IDHDL;
1136    p->data=u->data;
1137    p->name=u->name;
1138#ifdef HAVE_NAMESPACES
1139    p->packhdl=u->packhdl;
1140#endif /* HAVE_NAMESPACES */
1141    p->flag|=u->flag;
1142    p->e=jjMakeSub(&t);
1143  }
1144  u->rtyp=0;
1145  u->data=NULL;
1146  u->name=NULL;
1147  return FALSE;
1148}
1149static BOOLEAN jjINDEX_P(leftv res, leftv u, leftv v)
1150{
1151  poly p=(poly)u->Data();
1152  int i=(int)v->Data();
1153  int j=0;
1154  while (p!=NULL)
1155  {
1156    j++;
1157    if (j==i)
1158    {
1159      res->data=(char *)pHead(p);
1160      return FALSE;
1161    }
1162    pIter(p);
1163  }
1164  return FALSE;
1165}
1166static BOOLEAN jjINDEX_P_IV(leftv res, leftv u, leftv v)
1167{
1168  poly p=(poly)u->Data();
1169  poly r=NULL;
1170  intvec *iv=(intvec *)v->CopyD();
1171  int i;
1172  int sum=0;
1173  for(i=iv->length()-1;i>=0;i--)
1174    sum+=(*iv)[i];
1175  int j=0;
1176  while ((p!=NULL) && (sum>0))
1177  {
1178    j++;
1179    for(i=iv->length()-1;i>=0;i--)
1180    {
1181      if (j==(*iv)[i])
1182      {
1183        r=pAdd(r,pHead(p));
1184        sum-=j;
1185        (*iv)[i]=0;
1186        break;
1187      }
1188    }
1189    pIter(p);
1190  }
1191  delete iv;
1192  res->data=(char *)r;
1193  return FALSE;
1194}
1195static BOOLEAN jjINDEX_V(leftv res, leftv u, leftv v)
1196{
1197  poly p=(poly)u->CopyD();
1198  poly r=p; // pointer to the beginning of component i
1199  poly o=NULL;
1200  int i=(int)v->Data();
1201  while (p!=NULL)
1202  {
1203    if (pGetComp(p)!=i)
1204    {
1205      if (r==p) r=pNext(p);
1206      if (o!=NULL)
1207      {
1208        pDelete1(&pNext(o));
1209        p=pNext(o);
1210      }
1211      else
1212        pDelete1(&p);
1213    }
1214    else
1215    {
1216      pSetComp(p, 0);
1217      o=p;
1218      p=pNext(o);
1219    }
1220  }
1221  res->data=(char *)r;
1222  return FALSE;
1223}
1224static BOOLEAN jjINDEX_V_IV(leftv res, leftv u, leftv v)
1225{
1226  poly p=(poly)u->CopyD();
1227  if (p!=NULL)
1228  {
1229    poly r=pOne();
1230    poly hp=r;
1231    intvec *iv=(intvec *)v->Data();
1232    int i;
1233    loop
1234    {
1235      for(i=0;i<iv->length();i++)
1236      {
1237        if (pGetComp(p)==(*iv)[i])
1238        {
1239          poly h;
1240          pSplit(p,&h);
1241          pNext(hp)=p;
1242          p=h;
1243          pIter(hp);
1244          break;
1245        }
1246      }
1247      if (p==NULL) break;
1248      if (i==iv->length())
1249      {
1250        pDelete1(&p);
1251        if (p==NULL) break;
1252      }
1253    }
1254    pDelete1(&r);
1255    res->data=(char *)r;
1256  }
1257  return FALSE;
1258}
1259static BOOLEAN jjKLAMMER(leftv res, leftv u, leftv v)
1260{
1261  if(u->name==NULL) return TRUE;
1262  char * nn = (char *)AllocL(strlen(u->name) + 14);
1263  sprintf(nn,"%s(%d)",u->name,(int)v->Data());
1264  FreeL((ADDRESS)u->name);
1265  u->name=NULL;
1266  char *n=mstrdup(nn);
1267  FreeL((ADDRESS)nn);
1268#ifdef HAVE_NAMESPACES
1269  if(u->req_packhdl != NULL)
1270  {
1271    namespaceroot->push( IDPACKAGE(u->req_packhdl), IDID(u->req_packhdl));
1272    syMake(res,n);
1273    namespaceroot->pop();
1274  }
1275  else
1276#endif /* HAVE_NAMESPACES */
1277    syMake(res,n);
1278  return FALSE;
1279}
1280static BOOLEAN jjKLAMMER_IV(leftv res, leftv u, leftv v)
1281{
1282  intvec * iv=(intvec *)v->Data();
1283  leftv p=NULL;
1284  int i;
1285  int slen = strlen(u->name) + 14;
1286  char *n = (char*) Alloc(slen);
1287#ifdef HAVE_NAMESPACES
1288  BOOLEAN needpop=FALSE;
1289
1290  if(u->req_packhdl != NULL)
1291  {
1292    namespaceroot->push( IDPACKAGE(u->req_packhdl), IDID(u->req_packhdl));
1293    needpop = TRUE;
1294  }
1295#endif /* HAVE_NAMESPACES */
1296
1297  for (i=0;i<iv->length(); i++)
1298  {
1299    if (p==NULL)
1300    {
1301      p=res;
1302    }
1303    else
1304    {
1305      p->next=(leftv)Alloc0(sizeof(sleftv));
1306      p=p->next;
1307    }
1308    sprintf(n,"%s(%d)",u->name,(*iv)[i]);
1309    syMake(p,mstrdup(n));
1310  }
1311  FreeL((ADDRESS)u->name);
1312  u->name = NULL;
1313  Free(n, slen);
1314#ifdef HAVE_NAMESPACES
1315  if(needpop) namespaceroot->pop();
1316#endif /* HAVE_NAMESPACES */
1317  return FALSE;
1318}
1319static BOOLEAN jjPROC(leftv res, leftv u, leftv v)
1320{
1321#ifdef HAVE_NAMESPACES
1322  leftv sl = iiMake_proc((idhdl)u->data,u,v);
1323#else /* HAVE_NAMESPACES */
1324  leftv sl = iiMake_proc((idhdl)u->data,v);
1325#endif /* HAVE_NAMESPACES */
1326  if (sl==NULL)
1327  {
1328    return TRUE;
1329  }
1330  else
1331  {
1332    memcpy(res,sl,sizeof(sleftv));
1333  }
1334  return FALSE;
1335}
1336static BOOLEAN jjMAP(leftv res, leftv u, leftv v)
1337{
1338  //Print("try to map %s with %s\n",$3.Name(),$1.Name());
1339  leftv sl=NULL;
1340  if ((v->e==NULL)&&(v->name!=NULL))
1341  {
1342    map m=(map)u->Data();
1343    sl=iiMap(m,v->name);
1344  }
1345  else
1346  {
1347    Werror("%s(<name>) expected",u->Name());
1348  }
1349  if (sl==NULL) return TRUE;
1350  memcpy(res,sl,sizeof(sleftv));
1351  Free((ADDRESS)sl,sizeof(*sl));
1352  return FALSE;
1353}
1354static BOOLEAN jjCALL2MANY(leftv res, leftv u, leftv v)
1355{
1356  u->next=(leftv)Alloc(sizeof(sleftv));
1357  memcpy(u->next,v,sizeof(sleftv));
1358  BOOLEAN r=iiExprArithM(res,u,iiOp);
1359  v->rtyp=0; v->data=NULL; // iiExprArithM did the CleanUp
1360  return r;
1361}
1362static BOOLEAN jjCOEF(leftv res, leftv u, leftv v)
1363{
1364  res->data=(char *)mpCoeffProc((poly)u->Data(),(poly)v->Data());
1365  return FALSE;
1366}
1367static BOOLEAN jjCOEFFS_Id(leftv res, leftv u, leftv v)
1368{
1369  int i=pVar((poly)v->Data());
1370  if (i==0)
1371  {
1372    WerrorS("ringvar expected");
1373    return TRUE;
1374  }
1375  res->data=(char *)mpCoeffs((ideal)u->CopyD(),i);
1376  return FALSE;
1377}
1378static BOOLEAN jjCONTRACT(leftv res, leftv u, leftv v)
1379{
1380  res->data=(char *)idDiffOp((ideal)u->Data(),(ideal)v->Data(),FALSE);
1381  return FALSE;
1382}
1383static BOOLEAN jjDEG_IV(leftv res, leftv u, leftv v)
1384{
1385  short *iv=iv2array((intvec *)v->Data());
1386  res->data = (char *)pDegW((poly)u->Data(),iv);
1387  Free((ADDRESS)iv,(pVariables+1)*sizeof(short));
1388  return FALSE;
1389}
1390static BOOLEAN jjDIFF_P(leftv res, leftv u, leftv v)
1391{
1392  int i=pVar((poly)v->Data());
1393  if (i==0)
1394  {
1395    WerrorS("ringvar expected");
1396    return TRUE;
1397  }
1398  res->data=(char *)pDiff((poly)(u->Data()),i);
1399  return FALSE;
1400}
1401static BOOLEAN jjDIFF_ID(leftv res, leftv u, leftv v)
1402{
1403  int i=pVar((poly)v->Data());
1404  if (i==0)
1405  {
1406    WerrorS("ringvar expected");
1407    return TRUE;
1408  }
1409  res->data=(char *)idDiff((matrix)(u->Data()),i);
1410  return FALSE;
1411}
1412static BOOLEAN jjDIFF_ID_ID(leftv res, leftv u, leftv v)
1413{
1414  res->data=(char *)idDiffOp((ideal)u->Data(),(ideal)v->Data());
1415  return FALSE;
1416}
1417
1418static BOOLEAN jjELIMIN(leftv res, leftv u, leftv v)
1419{
1420  res->data=(char *)idElimination((ideal)u->Data(),(poly)v->Data());
1421  setFlag(res,FLAG_STD);
1422  return FALSE;
1423}
1424static BOOLEAN jjERROR(leftv res, leftv u)
1425{
1426  WerrorS((char *)u->Data());
1427  return TRUE;
1428}
1429static BOOLEAN jjDIM2(leftv res, leftv v, leftv w)
1430{
1431  assumeStdFlag(v);
1432  if(currQuotient==NULL)
1433    res->data = (char *)scDimInt((ideal)(v->Data()),(ideal)w->Data());
1434  else
1435  {
1436    ideal q=idSimpleAdd(currQuotient,(ideal)w->Data());
1437    res->data = (char *)scDimInt((ideal)(v->Data()),q);
1438    idDelete(&q);
1439  }
1440  return FALSE;
1441}
1442static BOOLEAN jjEXTGCD_I(leftv res, leftv u, leftv v)
1443{
1444  int p0=ABS((int)u->Data()),p1=ABS((int)v->Data());
1445  int f0 = 1, f1 = 0, g0 = 0, g1 = 1, q, r;
1446
1447  while ( p1!=0 )
1448  {
1449    q=p0 / p1;
1450    r=p0 % p1;
1451    p0 = p1; p1 = r;
1452    r = g0 - g1 * q;
1453    g0 = g1; g1 = r;
1454    r = f0 - f1 * q;
1455    f0 = f1; f1 = r;
1456  }
1457  int a = f0;
1458  int b = g0;
1459  if ( (int)u->Data() < 0 ) a=-a;
1460  if ( (int)v->Data() < 0 ) b=-b;
1461  lists L=(lists)Alloc(sizeof(slists));
1462  L->Init(3);
1463  L->m[0].rtyp=INT_CMD;
1464  L->m[0].data=(void *)p0;
1465  L->m[1].rtyp=INT_CMD;
1466  L->m[1].data=(void *)a;
1467  L->m[2].rtyp=INT_CMD;
1468  L->m[2].data=(void *)b;
1469  res->rtyp=LIST_CMD;
1470  res->data=(char *)L;
1471  return FALSE;
1472}
1473#ifdef HAVE_FACTORY
1474static BOOLEAN jjFACSTD2(leftv res, leftv v, leftv w)
1475{
1476  res->data=(void *)kStdfac((ideal)v->Data(),NULL,testHomog,NULL,
1477           (ideal)w->Data());
1478  setFlag(res,FLAG_STD);
1479  return FALSE;
1480}
1481#endif
1482static BOOLEAN jjFETCH(leftv res, leftv u, leftv v)
1483{
1484  ring r=(ring)u->Data();
1485  idhdl w;
1486
1487  if ((iiOp!=IMAP_CMD)
1488  && ((rInternalChar(currRing) != rInternalChar(r))
1489    || ((currRing->N != r->N)&& (iiOp==FETCH_CMD)))
1490  )
1491    goto err_fetch;
1492  if ((w=r->idroot->get(v->Name(),myynest))!=NULL)
1493  {
1494    int *perm=NULL;
1495    int *par_perm=NULL;
1496    int par_perm_size=0;
1497    BOOLEAN bo;
1498    if (iiOp==IMAP_CMD)
1499    {
1500      if (!nSetMap(rInternalChar(r),r->parameter,rPar(r),r->minpoly))
1501      {
1502        if (iiOp != IMAP_CMD) goto err_fetch;
1503        // Allow imap to be make an exception only for:
1504        if ( (rField_is_Q_a(r) &&  // Q(a..) -> Q(a..) || Q || Zp || Zp(a)
1505              (rField_is_Q() || rField_is_Q_a() ||
1506               (rField_is_Zp() || rField_is_Zp_a())))
1507             ||
1508             (rField_is_Zp_a(r) &&  // Zp(a..) -> Zp(a..) || Zp
1509              (rField_is_Zp(currRing, rInternalChar(r)) ||
1510               rField_is_Zp_a(currRing, rInternalChar(r)))) )
1511        {
1512          par_perm_size=rPar(r);
1513          BITSET save_test=test;
1514          naSetChar(rInternalChar(r),TRUE,r->parameter,rPar(r));
1515          nSetChar(rInternalChar(currRing),TRUE,currRing->parameter,
1516                   rPar(currRing));
1517          test=save_test;
1518        }
1519        else
1520        {
1521          goto err_fetch;
1522        }
1523      }
1524      perm=(int *)Alloc0((r->N+1)*sizeof(int));
1525      if (par_perm_size!=0)
1526        par_perm=(int *)Alloc0(par_perm_size*sizeof(int));
1527      maFindPerm(r->names,       r->N,       r->parameter,        r->P,
1528                 currRing->names,currRing->N,currRing->parameter, currRing->P,
1529                 perm,par_perm, currRing->ch);
1530    }
1531    sleftv tmpW;
1532    memset(&tmpW,0,sizeof(sleftv));
1533    tmpW.rtyp=IDTYP(w);
1534    tmpW.data=IDDATA(w);
1535    if ((bo=maApplyFetch(iiOp,NULL,res,&tmpW, r, perm,par_perm,par_perm_size)))
1536    {
1537      Werror("cannot map %s of type %s(%d)",v->name, Tok2Cmdname(w->typ),w->typ);
1538    }
1539    if (perm!=NULL)
1540      Free((ADDRESS)perm,(r->N+1)*sizeof(int));
1541    if (par_perm!=NULL)
1542      Free((ADDRESS)par_perm,par_perm_size*sizeof(int));
1543    return bo;
1544  }
1545  else
1546  {
1547    Werror("%s undefined in %s",v->Fullname(),u->Fullname());
1548  }
1549  return TRUE;
1550err_fetch:
1551  Werror("no identity map from %s",u->Fullname());
1552  return TRUE;
1553}
1554static BOOLEAN jjFIND2(leftv res, leftv u, leftv v)
1555{
1556  /*4
1557  * look for the substring what in the string where
1558  * return the position of the first char of what in where
1559  * or 0
1560  */
1561  char *where=(char *)u->Data();
1562  char *what=(char *)v->Data();
1563  char *found = strstr(where,what);
1564  if (found != NULL)
1565  {
1566    res->data=(char *)((found-where)+1);
1567  }
1568  /*else res->data=NULL;*/
1569  return FALSE;
1570}
1571static BOOLEAN jjGCD_I(leftv res, leftv u, leftv v)
1572{
1573  int p0=ABS((int)u->Data()),p1=ABS((int)v->Data());
1574  int r;
1575
1576  while ( p1!=0 )
1577  {
1578    r=p0 % p1;
1579    p0 = p1; p1 = r;
1580  }
1581  res->rtyp=INT_CMD;
1582  res->data=(char *)p0;
1583  return FALSE;
1584}
1585static BOOLEAN jjHILBERT2(leftv res, leftv u, leftv v)
1586{
1587  assumeStdFlag(u);
1588  intvec *module_w=(intvec*)atGet(u,"isHomog");
1589  intvec *iv=hFirstSeries((ideal)u->Data(),module_w,currQuotient);
1590  switch((int)v->Data())
1591  {
1592    case 1:
1593      res->data=(void *)iv;
1594      return FALSE;
1595    case 2:
1596      res->data=(void *)hSecondSeries(iv);
1597      delete iv;
1598      return FALSE;
1599  }
1600  WerrorS(feNotImplemented);
1601  delete iv;
1602  return TRUE;
1603}
1604static BOOLEAN jjHOMOG_P(leftv res, leftv u, leftv v)
1605{
1606  int i=pVar((poly)v->Data());
1607  if (i==0)
1608  {
1609    WerrorS("ringvar expected");
1610    return TRUE;
1611  }
1612  res->data = (char *)pHomogen((poly)u->Data(),i);
1613  return FALSE;
1614}
1615static BOOLEAN jjHOMOG_ID(leftv res, leftv u, leftv v)
1616{
1617  int i=pVar((poly)v->Data());
1618  if (i==0)
1619  {
1620    WerrorS("ringvar expected");
1621    return TRUE;
1622  }
1623  res->data = (char *)idHomogen((ideal)u->Data(),i);
1624  return FALSE;
1625}
1626static BOOLEAN jjINDEPSET2(leftv res, leftv u, leftv v)
1627{
1628  assumeStdFlag(u);
1629  res->data=(void *)scIndIndset((ideal)(u->Data()),(int)(v->Data()),
1630                    currQuotient);
1631  return FALSE;
1632}
1633static BOOLEAN jjINTERSECT(leftv res, leftv u, leftv v)
1634{
1635  res->data=(char *)idSect((ideal)u->Data(),(ideal)v->Data());
1636  setFlag(res,FLAG_STD);
1637  return FALSE;
1638}
1639static BOOLEAN jjJET_P(leftv res, leftv u, leftv v)
1640{
1641  res->data = (char *)pJet((poly)u->Data(),(int)v->Data());
1642  return FALSE;
1643}
1644static BOOLEAN jjJET_ID(leftv res, leftv u, leftv v)
1645{
1646  res->data = (char *)idJet((ideal)u->Data(),(int)v->Data());
1647  return FALSE;
1648}
1649static BOOLEAN jjKBASE2(leftv res, leftv u, leftv v)
1650{
1651  assumeStdFlag(u);
1652  res->data = (char *)scKBase((int)v->Data(),
1653                              (ideal)(u->Data()),currQuotient);
1654  return FALSE;
1655}
1656static BOOLEAN jjKoszul(leftv res, leftv u, leftv v)
1657{
1658  return mpKoszul(res, u,v);
1659}
1660static BOOLEAN jjKoszul_Id(leftv res, leftv u, leftv v)
1661{
1662  sleftv h;
1663  memset(&h,0,sizeof(sleftv));
1664  h.rtyp=INT_CMD;
1665  h.data=(void *)IDELEMS((ideal)v->Data());
1666  return mpKoszul(res, &h, u, v);
1667}
1668static BOOLEAN jjLIFT(leftv res, leftv u, leftv v)
1669{
1670  ideal m;
1671  int ul= IDELEMS((ideal)u->Data());
1672  int vl= IDELEMS((ideal)v->Data());
1673  if (hasFlag(u,FLAG_STD))
1674  {
1675    m = idLift((ideal)u->Data(),(ideal)v->Data());
1676    res->data = (char *)idModule2formatedMatrix(m,ul,vl);
1677  }
1678  else
1679  {
1680    // matrix ma=mpNew(1,1);
1681    // ideal mo=idLiftStd((ideal)u->CopyD(),currQuotient,&ma,testHomog);
1682    // m = idLift(mo,(ideal)v->Data());
1683    // matrix r=idModule2formatedMatrix(m, IDELEMS(mo),vl);
1684    // idDelete(&mo);
1685    // // idDelete(&m); already done by idModule2formatedMatrix
1686    // res->data=(char *)mpMult(ma,r);
1687    // idDelete((ideal *)&ma);
1688    // idDelete((ideal *)&r);
1689    m = idLiftNonStB((ideal)u->Data(),(ideal)v->Data());
1690    res->data = (char *)idModule2formatedMatrix(m,ul,vl);
1691  }
1692  return FALSE;
1693}
1694static BOOLEAN jjLIFTSTD(leftv res, leftv u, leftv v)
1695{
1696  if ((v->rtyp!=IDHDL)||(v->e!=NULL)) return TRUE;
1697  idhdl h=(idhdl)v->data;
1698  res->data = (char *)idLiftStd((ideal)u->CopyD(), currQuotient,
1699              &(h->data.umatrix),testHomog);
1700  setFlag(res,FLAG_STD);
1701  return FALSE;
1702}
1703static BOOLEAN jjMINOR(leftv res, leftv u, leftv v)
1704{
1705  res->data = (char *)idMinors((matrix)u->Data(),(int)v->Data());
1706  return FALSE;
1707}
1708static BOOLEAN jjMODULO(leftv res, leftv u, leftv v)
1709{
1710  res->data = (char *)idModulo((ideal)u->Data(),(ideal)v->Data());
1711  return FALSE;
1712}
1713static BOOLEAN jjMONITOR2(leftv res, leftv u,leftv v)
1714{
1715  char *opt=(char *)v->Data();
1716  int mode=0;
1717  while(*opt!='\0')
1718  {
1719    if (*opt=='i') mode |= PROT_I;
1720    else if (*opt=='o') mode |= PROT_O;
1721    opt++;
1722  }
1723  monitor((char *)(u->Data()),mode);
1724  return FALSE;
1725}
1726static BOOLEAN jjPARSTR2(leftv res, leftv u, leftv v)
1727{
1728  idhdl h=(idhdl)u->data;
1729  int i=(int)v->Data();
1730  int p=0;
1731  if ((0<i)
1732  && (IDRING(h)->parameter!=NULL)
1733  && (i<=(p=rPar(IDRING(h)))))
1734    res->data=mstrdup(IDRING(h)->parameter[i-1]);
1735  else
1736  {
1737    Werror("par number %d out of range 1..%d",i,p);
1738    return TRUE;
1739  }
1740  return FALSE;
1741}
1742static BOOLEAN jjQUOT(leftv res, leftv u, leftv v)
1743{
1744  res->data = (char *)idQuot((ideal)u->Data(),(ideal)v->Data(),
1745    hasFlag(u,FLAG_STD),u->Typ()==v->Typ());
1746  idDelMultiples((ideal)(res->data));
1747  return FALSE;
1748}
1749static BOOLEAN jjRANDOM(leftv res, leftv u, leftv v)
1750{
1751  int i=(int)u->Data();
1752  int j=(int)v->Data();
1753#ifdef buildin_rand
1754  res->data =(char *)((i > j) ? i : (siRand() % (j-i+1)) + i);
1755#else
1756  res->data =(char *)((i > j) ? i : (rand() % (j-i+1)) + i);
1757#endif
1758  return FALSE;
1759}
1760static BOOLEAN jjREAD2(leftv res, leftv u, leftv v)
1761{
1762  si_link l=(si_link)u->Data();
1763  leftv r=slRead(l,v);
1764  if (r==NULL)
1765  {
1766    const char *s;
1767    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
1768    else                            s=sNoName;
1769    Werror("cannot read from `%s`",s);
1770    return TRUE;
1771  }
1772  memcpy(res,r,sizeof(sleftv));
1773  Free((ADDRESS)r,sizeof(sleftv));
1774  return FALSE;
1775}
1776static BOOLEAN jjREDUCE_P(leftv res, leftv u, leftv v)
1777{
1778  assumeStdFlag(v);
1779  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(poly)u->Data());
1780  return FALSE;
1781}
1782static BOOLEAN jjREDUCE_ID(leftv res, leftv u, leftv v)
1783{
1784  assumeStdFlag(v);
1785  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(ideal)u->Data());
1786  return FALSE;
1787}
1788static BOOLEAN jjRES(leftv res, leftv u, leftv v)
1789{
1790  int maxl=(int)v->Data();
1791  if (maxl<0)
1792  {
1793    WerrorS("length for res must not be negative");
1794    return TRUE;
1795  }
1796  int l=0;
1797  //resolvente r;
1798  syStrategy r;
1799  intvec **weights=NULL;
1800  int wmaxl=maxl;
1801  ideal u_id=(ideal)u->Data();
1802  maxl--;
1803  if ((maxl==-1) && (iiOp!=MRES_CMD))
1804    maxl = pVariables-1;
1805  if ((iiOp == RES_CMD) || (iiOp == MRES_CMD))
1806  {
1807    //if (BTEST1(28))
1808    //{
1809    //  r=syMinRes(u_id,maxl,&l, iiOp==MRES_CMD);
1810    //}
1811    //else
1812    {
1813      intvec * iv=(intvec*)atGet(u,"isHomog");
1814      //if (iv!=NULL)
1815      //{
1816      //  weights = (intvec**)Alloc0(sizeof(intvec*));
1817      //  weights[0] = ivCopy(iv);
1818      //  l=1;
1819      //}
1820      //r=syResolvente(u_id,maxl,&l, &weights, iiOp==MRES_CMD);
1821      r=syResolution(u_id,maxl, iv, iiOp==MRES_CMD);
1822    }
1823  }
1824  else if (iiOp==SRES_CMD)
1825  //  r=sySchreyerResolvente(u_id,maxl+1,&l);
1826    r=sySchreyer(u_id,maxl+1);
1827  else /* LRES */
1828  {
1829    int dummy;
1830    if((currQuotient!=NULL)||
1831    (!idHomIdeal (u_id,NULL)))
1832    {
1833       WerrorS
1834       ("`lres` can not be called in q ring or with inhomogeneous input");
1835       return TRUE;
1836    }
1837    r=syLaScala3(u_id,&dummy);
1838  }
1839  if (r==NULL) return TRUE;
1840  //res->data=(void *)liMakeResolv(r,l,wmaxl,u->Typ(),weights);
1841  r->list_length=wmaxl;
1842  res->data=(void *)r;
1843  return FALSE;
1844}
1845static BOOLEAN jjRSUM(leftv res, leftv u, leftv v)
1846{
1847  ring r;
1848  int i=rSum((ring)u->Data(),(ring)v->Data(),r);
1849  res->data = (char *)r;
1850  return (i==-1);
1851}
1852#define SIMPL_LMDIV 32
1853#define SIMPL_LMEQ  16
1854#define SIMPL_MULT 8
1855#define SIMPL_EQU  4
1856#define SIMPL_NULL 2
1857#define SIMPL_NORM 1
1858static BOOLEAN jjSIMPL_ID(leftv res, leftv u, leftv v)
1859{
1860  int sw = (int)v->Data();
1861  ideal id = (ideal)u->CopyD();
1862  if (sw & SIMPL_LMDIV)
1863  {
1864    idDelDiv(id);
1865  }
1866  if (sw & SIMPL_LMEQ)
1867  {
1868    idDelLmEquals(id);
1869  }
1870  if (sw & SIMPL_NULL)
1871  {
1872    idSkipZeroes(id);
1873  }
1874  if (sw & SIMPL_NORM)
1875  {
1876    idNorm(id);
1877  }
1878  if (sw & SIMPL_MULT)
1879  {
1880    idDelMultiples(id);
1881  }
1882  else if(sw & SIMPL_EQU)
1883  {
1884    idDelEquals(id);
1885  }
1886  res->data = (char * )id;
1887  return FALSE;
1888}
1889static BOOLEAN jjSTATUS2(leftv res, leftv u, leftv v)
1890{
1891  res->data = mstrdup(slStatus((si_link) u->Data(), (char *) v->Data()));
1892  return FALSE;
1893}
1894static BOOLEAN jjSIMPL_P(leftv res, leftv u, leftv v)
1895{
1896  int sw = (int)v->Data();
1897  poly p = (poly)u->CopyD();
1898  if (sw & SIMPL_NORM)
1899  {
1900    pNorm(p);
1901  }
1902  res->data = (char * )p;
1903  return FALSE;
1904}
1905static BOOLEAN jjSTD_HILB(leftv res, leftv u, leftv v)
1906{
1907  ideal result;
1908  intvec *w=(intvec *)atGet(u,"isHomog");
1909  tHomog hom=testHomog;
1910  if (w!=NULL)
1911  {
1912    w=ivCopy(w);
1913    hom=isHomog;
1914  }
1915  result=kStd((ideal)(u->Data()),currQuotient,hom,&w,(intvec *)v->Data());
1916  idSkipZeroes(result);
1917  res->data = (char *)result;
1918  setFlag(res,FLAG_STD);
1919  if (w!=NULL) atSet(res,mstrdup("isHomog"),w,INTVEC_CMD);
1920  return FALSE;
1921}
1922static BOOLEAN jjSTD_1(leftv res, leftv u, leftv v)
1923{
1924  ideal result;
1925  intvec *w=(intvec *)atGet(u,"isHomog");
1926  tHomog hom=testHomog;
1927  if (w!=NULL)
1928  {
1929    w=ivCopy(w);
1930    hom=isHomog;
1931  }
1932  ideal i1=(ideal)u->Data();
1933  ideal i0=idInit(1,i1->rank);
1934  i0->m[0]=(poly)v->Data();
1935  i1=idSimpleAdd(i1,i0);
1936  i0->m[0]=NULL;
1937  idDelete(&i0);
1938  BITSET save_test=test;
1939  test|=Sy_bit(OPT_SB_1);
1940  result=kStd(i1,currQuotient,hom,&w);
1941  test=save_test;
1942  idDelete(&i1);
1943  idSkipZeroes(result);
1944  res->data = (char *)result;
1945  setFlag(res,FLAG_STD);
1946  if (w!=NULL) atSet(res,mstrdup("isHomog"),w,INTVEC_CMD);
1947  return FALSE;
1948}
1949static BOOLEAN jjVARSTR2(leftv res, leftv u, leftv v)
1950{
1951  idhdl h=(idhdl)u->data;
1952  int i=(int)v->Data();
1953  if ((0<i) && (i<=IDRING(h)->N))
1954    res->data=mstrdup(IDRING(h)->names[i-1]);
1955  else
1956  {
1957    Werror("var number %d out of range 1..%d",i,IDRING(h)->N);
1958    return TRUE;
1959  }
1960  return FALSE;
1961}
1962static BOOLEAN jjWEDGE(leftv res, leftv u, leftv v)
1963{
1964  res->data = (char *)mpWedge((matrix)u->Data(),(int)v->Data());
1965  return FALSE;
1966}
1967#define jjWRONG2 (proc2)jjWRONG
1968#define jjWRONG3 (proc3)jjWRONG
1969static BOOLEAN jjWRONG(leftv res, leftv u)
1970{
1971  return TRUE;
1972}
1973
1974static BOOLEAN jjLOAD_E(leftv res, leftv v, leftv u)
1975{
1976  char * s=(char *)u->Data();
1977  if(strcmp(s, "with")==0)
1978    return jjLOAD(res, v, TRUE);
1979  WerrorS("invalid second argument");
1980  WerrorS("load(\"libname\" [,\"with\"]);");
1981  return TRUE;
1982}
1983
1984/*=================== operations with 2 args.: table =================*/
1985
1986struct sValCmd2 dArith2[]=
1987{
1988// operations:
1989// proc        cmd              res             arg1        arg2
1990 {jjCOLCOL,    COLONCOLON,     ANY_TYPE,       DEF_CMD,    DEF_CMD      PROFILER}
1991,{jjPLUS_I,    '+',            INT_CMD,        INT_CMD,    INT_CMD        PROFILER}
1992,{jjPLUS_N,    '+',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD     PROFILER}
1993,{jjPLUS_P,    '+',            POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
1994,{jjPLUS_P,    '+',            VECTOR_CMD,     VECTOR_CMD, VECTOR_CMD PROFILER}
1995,{jjPLUS_ID,   '+',            IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
1996,{jjPLUS_ID,   '+',            MODUL_CMD,      MODUL_CMD,  MODUL_CMD PROFILER}
1997,{jjPLUS_P_MA, '+',            MATRIX_CMD,     POLY_CMD,   MATRIX_CMD PROFILER}
1998,{jjPLUS_MA_P, '+',            MATRIX_CMD,     MATRIX_CMD, POLY_CMD PROFILER}
1999,{jjPLUS_MA,   '+',            MATRIX_CMD,     MATRIX_CMD, MATRIX_CMD PROFILER}
2000,{jjPLUS_S,    '+',            STRING_CMD,     STRING_CMD, STRING_CMD PROFILER}
2001,{jjOP_IV_I,   '+',            INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
2002,{jjOP_I_IV,   '+',            INTVEC_CMD,     INT_CMD,    INTVEC_CMD PROFILER}
2003,{jjOP_IM_I,   '+',            INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
2004,{jjOP_I_IM,   '+',            INTMAT_CMD,     INT_CMD,    INTMAT_CMD PROFILER}
2005,{jjPLUS_IV,   '+',            INTVEC_CMD,     INTVEC_CMD, INTVEC_CMD PROFILER}
2006,{jjPLUS_IV,   '+',            INTMAT_CMD,     INTMAT_CMD, INTMAT_CMD PROFILER}
2007,{lAdd,        '+',            LIST_CMD,       LIST_CMD,   LIST_CMD PROFILER}
2008,{jjRSUM,      '+',            RING_CMD,       RING_CMD,   RING_CMD PROFILER}
2009,{jjMINUS_I,   '-',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2010,{jjMINUS_N,   '-',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD PROFILER}
2011,{jjMINUS_P,   '-',            POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2012,{jjMINUS_P,   '-',            VECTOR_CMD,     VECTOR_CMD, VECTOR_CMD PROFILER}
2013,{jjPLUS_MA_P, '-',            MATRIX_CMD,     MATRIX_CMD, POLY_CMD PROFILER}
2014,{jjMINUS_MA,  '-',            MATRIX_CMD,     MATRIX_CMD, MATRIX_CMD PROFILER}
2015,{jjOP_IV_I,   '-',            INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
2016,{jjOP_IM_I,   '-',            INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
2017,{jjMINUS_IV,  '-',            INTVEC_CMD,     INTVEC_CMD, INTVEC_CMD PROFILER}
2018,{jjMINUS_IV,  '-',            INTMAT_CMD,     INTMAT_CMD, INTMAT_CMD PROFILER}
2019,{jjTIMES_I,   '*',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2020,{jjTIMES_N,   '*',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD PROFILER}
2021,{jjTIMES_P,   '*',            POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2022,{jjTIMES_P,   '*',            VECTOR_CMD,     POLY_CMD,   VECTOR_CMD PROFILER}
2023,{jjTIMES_P,   '*',            VECTOR_CMD,     VECTOR_CMD, POLY_CMD PROFILER}
2024,{jjTIMES_MA_P1,'*',           IDEAL_CMD,      IDEAL_CMD,  POLY_CMD PROFILER}
2025,{jjTIMES_MA_P2,'*',           IDEAL_CMD,      POLY_CMD,   IDEAL_CMD PROFILER}
2026,{jjTIMES_ID,  '*',            IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
2027,{jjTIMES_MA_P1,'*',           MODUL_CMD,      IDEAL_CMD,  VECTOR_CMD PROFILER}
2028,{jjTIMES_MA_P2,'*',           MODUL_CMD,      VECTOR_CMD, IDEAL_CMD PROFILER}
2029,{jjTIMES_ID,  '*',            MODUL_CMD,      IDEAL_CMD,  MODUL_CMD PROFILER}
2030,{jjTIMES_ID,  '*',            MODUL_CMD,      MODUL_CMD,  IDEAL_CMD PROFILER}
2031,{jjTIMES_MA_P1,'*',           MATRIX_CMD,     MATRIX_CMD, POLY_CMD PROFILER}
2032,{jjTIMES_MA_P2,'*',           MATRIX_CMD,     POLY_CMD,   MATRIX_CMD PROFILER}
2033,{jjTIMES_MA_N1,'*',           MATRIX_CMD,     MATRIX_CMD, NUMBER_CMD PROFILER}
2034,{jjTIMES_MA_N2,'*',           MATRIX_CMD,     NUMBER_CMD, MATRIX_CMD PROFILER}
2035,{jjTIMES_MA_I1,'*',           MATRIX_CMD,     MATRIX_CMD, INT_CMD PROFILER}
2036,{jjTIMES_MA_I2,'*',           MATRIX_CMD,     INT_CMD,    MATRIX_CMD PROFILER}
2037,{jjTIMES_MA,  '*',            MATRIX_CMD,     MATRIX_CMD, MATRIX_CMD PROFILER}
2038,{jjOP_IV_I,   '*',            INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
2039,{jjOP_I_IV,   '*',            INTVEC_CMD,     INT_CMD,    INTVEC_CMD PROFILER}
2040,{jjOP_IV_I,   '*',            INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
2041,{jjOP_I_IV,   '*',            INTMAT_CMD,     INT_CMD,    INTMAT_CMD PROFILER}
2042,{jjTIMES_IV,  '*',            INTVEC_CMD,     INTMAT_CMD, INTVEC_CMD PROFILER}
2043,{jjTIMES_IV,  '*',            INTMAT_CMD,     INTMAT_CMD, INTMAT_CMD PROFILER}
2044,{jjTIMES_IV,  '*',            INTMAT_CMD,     INTVEC_CMD, INTMAT_CMD PROFILER}
2045,{jjDIV_N,     '/',            NUMBER_CMD,     NUMBER_CMD, NUMBER_CMD PROFILER}
2046,{jjDIV_P,     '/',            POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2047,{jjDIV_P,     '/',            VECTOR_CMD,     VECTOR_CMD, POLY_CMD PROFILER}
2048,{jjDIV_I,     '/',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2049,{jjOP_IV_I,   '/',            INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
2050,{jjOP_IV_I,   '/',            INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
2051,{jjDIV_I,     INTDIV,         INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2052,{jjOP_IV_I,   INTDIV,         INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
2053,{jjOP_IV_I,   INTDIV,         INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
2054,{jjMOD_I,     '%',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2055,{jjOP_IV_I,   '%',            INTVEC_CMD,     INTVEC_CMD, INT_CMD PROFILER}
2056,{jjOP_IV_I,   '%',            INTMAT_CMD,     INTMAT_CMD, INT_CMD PROFILER}
2057,{jjPOWER_I,   '^',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2058,{jjPOWER_N,   '^',            NUMBER_CMD,     NUMBER_CMD, INT_CMD PROFILER}
2059,{jjPOWER_P,   '^',            POLY_CMD,       POLY_CMD,   INT_CMD PROFILER}
2060,{jjPOWER_ID,  '^',            IDEAL_CMD,      IDEAL_CMD,  INT_CMD PROFILER}
2061,{jjLE_I,      LE,             INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2062,{jjLE_N,      LE,             INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
2063,{jjCOMPARE_S, LE,             INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
2064,{jjCOMPARE_IV_I,LE,           INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
2065,{jjCOMPARE_IV,LE,             INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
2066,{jjCOMPARE_P, LE,             INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
2067,{jjCOMPARE_P, LE,             INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
2068,{jjLT_I,      '<',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2069,{jjLT_N,      '<',            INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
2070,{jjCOMPARE_IV_I,'<',           INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
2071,{jjCOMPARE_IV,'<',            INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
2072,{jjCOMPARE_S, '<',            INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
2073,{jjCOMPARE_P, '<',            INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
2074,{jjCOMPARE_P, '<',            INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
2075,{jjGE_I,      GE,             INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2076,{jjGE_N,      GE,             INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
2077,{jjCOMPARE_S, GE,             INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
2078,{jjCOMPARE_IV_I,GE,           INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
2079,{jjCOMPARE_IV,GE,             INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
2080,{jjCOMPARE_P, GE,             INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
2081,{jjCOMPARE_P, GE,             INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
2082,{jjGT_I,      '>',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2083,{jjGT_N,      '>',            INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
2084,{jjCOMPARE_S, '>',            INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
2085,{jjCOMPARE_IV_I,'>',          INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
2086,{jjCOMPARE_IV,'>',            INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
2087,{jjCOMPARE_P, '>',            INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
2088,{jjCOMPARE_P, '>',            INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
2089,{jjAND_I,     '&',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2090,{jjOR_I,      '|',            INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2091,{jjEQUAL_I,   EQUAL_EQUAL,    INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2092,{jjEQUAL_N,   EQUAL_EQUAL,    INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
2093,{jjCOMPARE_S, EQUAL_EQUAL,    INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
2094,{jjEQUAL_P,   EQUAL_EQUAL,    INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
2095,{jjEQUAL_P,   EQUAL_EQUAL,    INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
2096,{jjCOMPARE_IV_I,EQUAL_EQUAL,  INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
2097,{jjCOMPARE_IV,EQUAL_EQUAL,    INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
2098,{jjCOMPARE_IV,EQUAL_EQUAL,    INT_CMD,        INTMAT_CMD, INTMAT_CMD PROFILER}
2099,{jjEQUAL_Ma,  EQUAL_EQUAL,    INT_CMD,        MATRIX_CMD, MATRIX_CMD PROFILER}
2100,{jjWRONG2,    EQUAL_EQUAL,    0,              IDEAL_CMD,  IDEAL_CMD PROFILER}
2101,{jjWRONG2,    EQUAL_EQUAL,    0,              MODUL_CMD,  MODUL_CMD PROFILER}
2102,{jjEQUAL_I,   NOTEQUAL,       INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2103,{jjEQUAL_N,   NOTEQUAL,       INT_CMD,        NUMBER_CMD, NUMBER_CMD PROFILER}
2104,{jjCOMPARE_S, NOTEQUAL,       INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
2105,{jjEQUAL_P,   NOTEQUAL,       INT_CMD,        POLY_CMD,   POLY_CMD PROFILER}
2106,{jjEQUAL_P,   NOTEQUAL,       INT_CMD,        VECTOR_CMD, VECTOR_CMD PROFILER}
2107,{jjCOMPARE_IV,NOTEQUAL,       INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
2108,{jjCOMPARE_IV,NOTEQUAL,       INT_CMD,        INTMAT_CMD, INTMAT_CMD PROFILER}
2109,{jjEQUAL_Ma,  NOTEQUAL,       INT_CMD,        MATRIX_CMD, MATRIX_CMD PROFILER}
2110,{jjWRONG2,    NOTEQUAL,       0,              IDEAL_CMD,  IDEAL_CMD PROFILER}
2111,{jjWRONG2,    NOTEQUAL,       0,              MODUL_CMD,  MODUL_CMD PROFILER}
2112,{jjDOTDOT,    DOTDOT,         INTVEC_CMD,     INT_CMD,    INT_CMD PROFILER}
2113,{jjINDEX_I,   '[',            INT_CMD,        INTVEC_CMD, INT_CMD PROFILER}
2114,{jjINDEX_IV,  '[',            INT_CMD,        INTVEC_CMD, INTVEC_CMD PROFILER}
2115,{jjINDEX_I,   '[',            POLY_CMD,       IDEAL_CMD,  INT_CMD PROFILER}
2116,{jjINDEX_I,   '[',            POLY_CMD,       MAP_CMD,    INT_CMD PROFILER}
2117,{jjINDEX_IV,  '[',            POLY_CMD,       IDEAL_CMD,  INTVEC_CMD PROFILER}
2118,{jjINDEX_I,   '[',            VECTOR_CMD,     MODUL_CMD,  INT_CMD PROFILER}
2119,{jjINDEX_IV,  '[',            VECTOR_CMD,     MODUL_CMD,  INTVEC_CMD PROFILER}
2120,{jjINDEX_I,   '[',            STRING_CMD,     STRING_CMD, INT_CMD PROFILER}
2121,{jjINDEX_IV,  '[',            STRING_CMD,     STRING_CMD, INTVEC_CMD PROFILER}
2122,{jjINDEX_I,   '[',            ANY_TYPE/*set by p*/,LIST_CMD, INT_CMD PROFILER}
2123,{jjINDEX_IV,  '[',            ANY_TYPE/*set by p*/,LIST_CMD, INTVEC_CMD PROFILER}
2124,{jjINDEX_P,   '[',            POLY_CMD,       POLY_CMD,   INT_CMD PROFILER}
2125,{jjINDEX_P_IV,'[',            POLY_CMD,       POLY_CMD,   INTVEC_CMD PROFILER}
2126,{jjINDEX_V,   '[',            POLY_CMD,       VECTOR_CMD, INT_CMD PROFILER}
2127,{jjINDEX_V_IV,'[',            VECTOR_CMD,     VECTOR_CMD, INTVEC_CMD PROFILER}
2128,{jjPROC,      '(',            ANY_TYPE/*set by p*/,PROC_CMD, DEF_CMD PROFILER}
2129,{jjMAP,       '(',            ANY_TYPE/*set by p*/,MAP_CMD, DEF_CMD PROFILER}
2130,{jjKLAMMER,   '(',            ANY_TYPE/*set by p*/,ANY_TYPE, INT_CMD PROFILER}
2131,{jjKLAMMER_IV,'(',            ANY_TYPE/*set by p*/,ANY_TYPE, INTVEC_CMD PROFILER}
2132// and the procedures with 2 arguments:
2133,{atATTRIB2,   ATTRIB_CMD,     NONE/*set by p*/,DEF_CMD,   STRING_CMD PROFILER}
2134,{jjCOEF,      COEF_CMD,       MATRIX_CMD,     POLY_CMD,   POLY_CMD PROFILER}
2135,{jjCOEFFS_Id, COEFFS_CMD,     MATRIX_CMD,     IDEAL_CMD,  POLY_CMD PROFILER}
2136,{jjCOEFFS_Id, COEFFS_CMD,     MATRIX_CMD,     MODUL_CMD,  POLY_CMD PROFILER}
2137,{jjCONTRACT,  CONTRACT_CMD,   MATRIX_CMD,     IDEAL_CMD,  IDEAL_CMD PROFILER}
2138,{jjDEG_IV,    DEG_CMD,        INT_CMD,        POLY_CMD,   INTVEC_CMD PROFILER}
2139,{lDelete,     DELETE_CMD,     LIST_CMD,       LIST_CMD,   INT_CMD PROFILER}
2140,{jjDIFF_P,    DIFF_CMD,       POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2141,{jjDIFF_P,    DIFF_CMD,       VECTOR_CMD,     VECTOR_CMD, POLY_CMD PROFILER}
2142,{jjDIFF_ID,   DIFF_CMD,       IDEAL_CMD,      IDEAL_CMD,  POLY_CMD PROFILER}
2143,{jjDIFF_ID_ID,DIFF_CMD,       MATRIX_CMD,     IDEAL_CMD,  IDEAL_CMD PROFILER}
2144,{jjDIFF_ID,   DIFF_CMD,       MODUL_CMD,      MODUL_CMD,  POLY_CMD PROFILER}
2145,{jjDIFF_ID,   DIFF_CMD,       MATRIX_CMD,     MATRIX_CMD, POLY_CMD PROFILER}
2146,{jjDIM2,      DIM_CMD,        INT_CMD,        IDEAL_CMD,  IDEAL_CMD PROFILER}
2147,{jjDIM2,      DIM_CMD,        INT_CMD,        MODUL_CMD,  IDEAL_CMD PROFILER}
2148,{jjELIMIN,    ELIMINATION_CMD,IDEAL_CMD,      IDEAL_CMD,  POLY_CMD PROFILER}
2149,{jjELIMIN,    ELIMINATION_CMD,MODUL_CMD,      MODUL_CMD,  POLY_CMD PROFILER}
2150,{jjEXTGCD_I,  EXTGCD_CMD,     LIST_CMD,       INT_CMD,    INT_CMD PROFILER}
2151#ifdef HAVE_FACTORY
2152,{jjEXTGCD_P,  EXTGCD_CMD,     LIST_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2153,{jjSQR_FREE_DEC,FAC_CMD,      IDEAL_CMD,      POLY_CMD,   INT_CMD PROFILER}
2154,{jjFACSTD2,    FACSTD_CMD,    LIST_CMD,       IDEAL_CMD,  IDEAL_CMD PROFILER}
2155#else
2156,{jjWRONG2,    EXTGCD_CMD,     LIST_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2157,{jjWRONG2,    FAC_CMD,        IDEAL_CMD,      POLY_CMD,   INT_CMD PROFILER}
2158,{jjWRONG2,    FACSTD_CMD,     LIST_CMD,       IDEAL_CMD,  IDEAL_CMD PROFILER}
2159#endif
2160,{jjFETCH,     FETCH_CMD,      ANY_TYPE/*set by p*/,RING_CMD,  ANY_TYPE PROFILER}
2161,{jjFETCH,     FETCH_CMD,      ANY_TYPE/*set by p*/,QRING_CMD, ANY_TYPE PROFILER}
2162#ifdef HAVE_FGLM
2163,{fglmProc,    FGLM_CMD,       IDEAL_CMD,      RING_CMD,   DEF_CMD PROFILER}
2164,{fglmProc,    FGLM_CMD,       IDEAL_CMD,      QRING_CMD,  DEF_CMD PROFILER}
2165#else
2166,{jjWRONG2,    FGLM_CMD,       IDEAL_CMD,      RING_CMD,   DEF_CMD PROFILER}
2167,{jjWRONG2,    FGLM_CMD,       IDEAL_CMD,      QRING_CMD,  DEF_CMD PROFILER}
2168#endif
2169,{jjFIND2,     FIND_CMD,       INT_CMD,        STRING_CMD, STRING_CMD PROFILER}
2170,{jjGCD_I,     GCD_CMD,        INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2171#ifdef HAVE_FACTORY
2172,{jjGCD_P,     GCD_CMD,        POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2173#else
2174,{jjWRONG2,    GCD_CMD,        POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2175#endif
2176,{jjHILBERT2,  HILBERT_CMD,    INTVEC_CMD,     IDEAL_CMD,  INT_CMD PROFILER}
2177,{jjHILBERT2,  HILBERT_CMD,    INTVEC_CMD,     MODUL_CMD,  INT_CMD PROFILER}
2178,{jjHOMOG_P,   HOMOG_CMD,      POLY_CMD,       POLY_CMD,   POLY_CMD PROFILER}
2179,{jjHOMOG_P,   HOMOG_CMD,      VECTOR_CMD,     VECTOR_CMD, POLY_CMD PROFILER}
2180,{jjHOMOG_ID,  HOMOG_CMD,      IDEAL_CMD,      IDEAL_CMD,  POLY_CMD PROFILER}
2181,{jjHOMOG_ID,  HOMOG_CMD,      MODUL_CMD,      MODUL_CMD,  POLY_CMD PROFILER}
2182,{jjCALL2MANY, IDEAL_CMD,      IDEAL_CMD,      DEF_CMD,    DEF_CMD PROFILER}
2183,{jjFETCH,     IMAP_CMD,       ANY_TYPE/*set by p*/,RING_CMD,  ANY_TYPE PROFILER}
2184,{jjFETCH,     IMAP_CMD,       ANY_TYPE/*set by p*/,QRING_CMD, ANY_TYPE PROFILER}
2185,{jjINDEPSET2, INDEPSET_CMD,   LIST_CMD,       IDEAL_CMD,  INT_CMD PROFILER}
2186,{lInsert,     INSERT_CMD,     LIST_CMD,       LIST_CMD,   DEF_CMD PROFILER}
2187,{jjINTERSECT, INTERSECT_CMD,  IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
2188,{jjINTERSECT, INTERSECT_CMD,  MODUL_CMD,      MODUL_CMD,  MODUL_CMD PROFILER}
2189,{jjJET_P,     JET_CMD,        POLY_CMD,       POLY_CMD,   INT_CMD PROFILER}
2190,{jjJET_ID,    JET_CMD,        IDEAL_CMD,      IDEAL_CMD,  INT_CMD PROFILER}
2191,{jjJET_P,     JET_CMD,        VECTOR_CMD,     VECTOR_CMD, INT_CMD PROFILER}
2192,{jjJET_ID,    JET_CMD,        MODUL_CMD,      MODUL_CMD,  INT_CMD PROFILER}
2193,{jjKBASE2,    KBASE_CMD,      IDEAL_CMD,      IDEAL_CMD,  INT_CMD PROFILER}
2194,{jjKBASE2,    KBASE_CMD,      MODUL_CMD,      MODUL_CMD,  INT_CMD PROFILER}
2195,{atKILLATTR2, KILLATTR_CMD,   NONE,           IDHDL,      STRING_CMD PROFILER}
2196,{jjKoszul,    KOSZUL_CMD,     MATRIX_CMD,     INT_CMD,    INT_CMD PROFILER}
2197,{jjKoszul_Id, KOSZUL_CMD,     MATRIX_CMD,     INT_CMD,    IDEAL_CMD PROFILER}
2198,{jjLIFT,      LIFT_CMD,       MATRIX_CMD,     IDEAL_CMD,  IDEAL_CMD PROFILER}
2199,{jjLIFT,      LIFT_CMD,       MATRIX_CMD,     MODUL_CMD,  MODUL_CMD PROFILER}
2200,{jjLIFTSTD,   LIFTSTD_CMD,    IDEAL_CMD,      IDEAL_CMD,  MATRIX_CMD PROFILER}
2201,{jjLIFTSTD,   LIFTSTD_CMD,    MODUL_CMD,      MODUL_CMD,  MATRIX_CMD PROFILER}
2202,{jjCALL2MANY, LIST_CMD,       LIST_CMD,       DEF_CMD,    DEF_CMD PROFILER}
2203,{jjRES,       LRES_CMD,       RESOLUTION_CMD, IDEAL_CMD,  INT_CMD PROFILER}
2204,{jjRES,       LRES_CMD,       RESOLUTION_CMD, MODUL_CMD,  INT_CMD PROFILER}
2205,{jjMINOR,     MINOR_CMD,      IDEAL_CMD,      MATRIX_CMD, INT_CMD PROFILER}
2206,{jjCALL2MANY, MODUL_CMD,      MODUL_CMD,      DEF_CMD,    DEF_CMD PROFILER}
2207,{jjMODULO,    MODULO_CMD,     MODUL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
2208,{jjMODULO,    MODULO_CMD,     MODUL_CMD,      MODUL_CMD,  MODUL_CMD PROFILER}
2209,{jjMONITOR2,  MONITOR_CMD,    NONE,           STRING_CMD, STRING_CMD PROFILER}
2210//,{jjRES,       MRES_CMD,       LIST_CMD,       IDEAL_CMD,  INT_CMD PROFILER}
2211//,{jjRES,       MRES_CMD,       LIST_CMD,       MODUL_CMD,  INT_CMD PROFILER}
2212,{jjRES,       MRES_CMD,       RESOLUTION_CMD, IDEAL_CMD,  INT_CMD PROFILER}
2213,{jjRES,       MRES_CMD,       RESOLUTION_CMD, MODUL_CMD,  INT_CMD PROFILER}
2214,{jjPARSTR2,   PARSTR_CMD,     STRING_CMD,     RING_CMD,   INT_CMD PROFILER}
2215,{jjPARSTR2,   PARSTR_CMD,     STRING_CMD,     QRING_CMD,  INT_CMD PROFILER}
2216,{jjPRINT_FORMAT, PRINT_CMD,   NONE,           DEF_CMD,    STRING_CMD PROFILER}
2217,{jjQUOT,      QUOTIENT_CMD,   IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
2218,{jjQUOT,      QUOTIENT_CMD,   MODUL_CMD,      MODUL_CMD,  IDEAL_CMD PROFILER}
2219,{jjQUOT,      QUOTIENT_CMD,   IDEAL_CMD,      MODUL_CMD,  MODUL_CMD PROFILER}
2220,{jjRANDOM,    RANDOM_CMD,     INT_CMD,        INT_CMD,    INT_CMD PROFILER}
2221,{jjREAD2,     READ_CMD,       STRING_CMD,     LINK_CMD,   STRING_CMD PROFILER}
2222,{jjREDUCE_P,  REDUCE_CMD,     POLY_CMD,       POLY_CMD,   IDEAL_CMD PROFILER}
2223,{jjREDUCE_P,  REDUCE_CMD,     VECTOR_CMD,     VECTOR_CMD, IDEAL_CMD PROFILER}
2224,{jjREDUCE_P,  REDUCE_CMD,     VECTOR_CMD,     VECTOR_CMD, MODUL_CMD PROFILER}
2225,{jjREDUCE_ID, REDUCE_CMD,     IDEAL_CMD,      IDEAL_CMD,  IDEAL_CMD PROFILER}
2226,{jjREDUCE_ID, REDUCE_CMD,     MODUL_CMD,      MODUL_CMD,  MODUL_CMD PROFILER}
2227,{jjREDUCE_ID, REDUCE_CMD,     MODUL_CMD,      MODUL_CMD,  IDEAL_CMD PROFILER}
2228//,{jjRES,       RES_CMD,        LIST_CMD,       IDEAL_CMD,  INT_CMD PROFILER}
2229//,{jjRES,       RES_CMD,        LIST_CMD,       MODUL_CMD,  INT_CMD PROFILER}
2230,{jjRES,       RES_CMD,        RESOLUTION_CMD, IDEAL_CMD,  INT_CMD PROFILER}
2231,{jjRES,       RES_CMD,        RESOLUTION_CMD, MODUL_CMD,  INT_CMD PROFILER}
2232,{jjSTATUS2,   STATUS_CMD,     STRING_CMD,     LINK_CMD,   STRING_CMD PROFILER}
2233,{jjSIMPL_P,   SIMPLIFY_CMD,   POLY_CMD,       POLY_CMD,   INT_CMD PROFILER}
2234,{jjSIMPL_P,   SIMPLIFY_CMD,   VECTOR_CMD,     VECTOR_CMD, INT_CMD PROFILER}
2235,{jjSIMPL_ID,  SIMPLIFY_CMD,   IDEAL_CMD,      IDEAL_CMD,  INT_CMD PROFILER}
2236,{jjSIMPL_ID,  SIMPLIFY_CMD,   MODUL_CMD,      MODUL_CMD,  INT_CMD PROFILER}
2237//,{jjRES,       SRES_CMD,       LIST_CMD,       IDEAL_CMD,  INT_CMD PROFILER}
2238//,{jjRES,       SRES_CMD,       LIST_CMD,       MODUL_CMD,  INT_CMD PROFILER}
2239,{jjRES,       SRES_CMD,       RESOLUTION_CMD, IDEAL_CMD,  INT_CMD PROFILER}
2240,{jjRES,       SRES_CMD,       RESOLUTION_CMD, MODUL_CMD,  INT_CMD PROFILER}
2241,{jjCALL2MANY, SYSTEM_CMD,     ANY_TYPE/*set by p*/,STRING_CMD, DEF_CMD PROFILER}
2242,{jjSTD_1,     STD_CMD,        IDEAL_CMD,      IDEAL_CMD,  POLY_CMD PROFILER}
2243,{jjSTD_1,     STD_CMD,        MODUL_CMD,      MODUL_CMD,  VECTOR_CMD PROFILER}
2244,{jjSTD_HILB,  STD_CMD,        IDEAL_CMD,      IDEAL_CMD,  INTVEC_CMD PROFILER}
2245,{jjSTD_HILB,  STD_CMD,        MODUL_CMD,      MODUL_CMD,  INTVEC_CMD PROFILER}
2246,{jjVARSTR2,   VARSTR_CMD,     STRING_CMD,     RING_CMD,   INT_CMD PROFILER}
2247,{jjVARSTR2,   VARSTR_CMD,     STRING_CMD,     QRING_CMD,  INT_CMD PROFILER}
2248,{jjWEDGE,     WEDGE_CMD,      MATRIX_CMD,     MATRIX_CMD, INT_CMD PROFILER}
2249,{jjLOAD_E,    LOAD_CMD,       NONE,           STRING_CMD, STRING_CMD PROFILER}
2250,{NULL,        0,              0,              0,          0 PROFILER}
2251};
2252/*=================== operations with 1 arg.: static proc =================*/
2253static BOOLEAN jjDUMMY(leftv res, leftv u)
2254{
2255  res->data = (char *)u->CopyD();
2256  return FALSE;
2257}
2258static BOOLEAN jjNULL(leftv res, leftv u)
2259{
2260  return FALSE;
2261}
2262//static BOOLEAN jjPLUSPLUS(leftv res, leftv u)
2263//{
2264//  res->data = (char *)((int)u->Data()+1);
2265//  return FALSE;
2266//}
2267//static BOOLEAN jjMINUSMINUS(leftv res, leftv u)
2268//{
2269//  res->data = (char *)((int)u->Data()-1);
2270//  return FALSE;
2271//}
2272static BOOLEAN jjPLUSPLUS(leftv res, leftv u)
2273{
2274  if (IDTYP((idhdl)u->data)==INT_CMD)
2275  {
2276    if (iiOp==PLUSPLUS) IDINT((idhdl)u->data)++;
2277    else                IDINT((idhdl)u->data)--;
2278    return FALSE;
2279  }
2280  return TRUE;
2281}
2282static BOOLEAN jjUMINUS_I(leftv res, leftv u)
2283{
2284  res->data = (char *)(-(int)u->Data());
2285  return FALSE;
2286}
2287static BOOLEAN jjUMINUS_N(leftv res, leftv u)
2288{
2289  number n=(number)u->CopyD();
2290  n=nNeg(n);
2291  res->data = (char *)n;
2292  return FALSE;
2293}
2294static BOOLEAN jjUMINUS_P(leftv res, leftv u)
2295{
2296  res->data = (char *)pNeg((poly)u->CopyD(POLY_CMD));
2297  return FALSE;
2298}
2299static BOOLEAN jjUMINUS_MA(leftv res, leftv u)
2300{
2301  poly m1=pISet(-1);
2302  res->data = (char *)mpMultP((matrix)u->CopyD(MATRIX_CMD),m1);
2303  return FALSE;
2304}
2305static BOOLEAN jjUMINUS_IV(leftv res, leftv u)
2306{
2307  intvec *iv=(intvec *)u->CopyD(INTVEC_CMD);
2308  (*iv)*=(-1);
2309  res->data = (char *)iv;
2310  return FALSE;
2311}
2312static BOOLEAN jjPROC1(leftv res, leftv u)
2313{
2314  if ((u->rtyp!=IDHDL) || (u->e!=NULL))
2315    return TRUE;
2316#ifdef HAVE_NAMESPACES
2317  leftv sl = iiMake_proc((idhdl) u->data,u,NULL);
2318#else /* HAVE_NAMESPACES */
2319  leftv sl = iiMake_proc((idhdl) u->data,NULL);
2320#endif /* HAVE_NAMESPACES */
2321  if (sl==NULL)
2322  {
2323    return TRUE;
2324  }
2325  else
2326  {
2327    memcpy(res,sl,sizeof(sleftv));
2328  }
2329  return FALSE;
2330}
2331static BOOLEAN jjBAREISS(leftv res, leftv v)
2332{
2333  //matrix m=(matrix)v->Data();
2334  //lists l=mpBareiss(m,FALSE);
2335  lists l=smCallNewBareiss((ideal)v->Data(),0,0);
2336  res->data = (char *)l;
2337  return FALSE;
2338}
2339static BOOLEAN jjBAREISS_IM(leftv res, leftv v)
2340{
2341  intvec *m=(intvec *)v->CopyD();
2342  ivTriangMat(m,1,1);
2343  res->data = (char *)m;
2344  return FALSE;
2345}
2346static BOOLEAN jjCALL1MANY(leftv res, leftv u)
2347{
2348  return iiExprArithM(res,u,iiOp);
2349}
2350static BOOLEAN jjCHAR(leftv res, leftv v)
2351{
2352  res->data = (char *)rChar((ring)v->Data());
2353  return FALSE;
2354}
2355static BOOLEAN jjCOLS(leftv res, leftv v)
2356{
2357  res->data = (char *)MATCOLS((matrix)(v->Data()));
2358  return FALSE;
2359}
2360static BOOLEAN jjCOLS_IV(leftv res, leftv v)
2361{
2362  res->data = (char *)((intvec*)(v->Data()))->cols();
2363  return FALSE;
2364}
2365static BOOLEAN jjCONTENT(leftv res, leftv v)
2366{
2367  poly p=(poly)v->CopyD();
2368  if (p!=NULL) pCleardenom(p);
2369  res->data = (char *)p;
2370  return FALSE;
2371}
2372static BOOLEAN jjCOUNT_N(leftv res, leftv v)
2373{
2374  res->data = (char *)nSize((number)v->Data());
2375  return FALSE;
2376}
2377static BOOLEAN jjCOUNT_L(leftv res, leftv v)
2378{
2379  lists l=(lists)v->Data();
2380  res->data = (char *)(l->nr+1);
2381  return FALSE;
2382}
2383static BOOLEAN jjCOUNT_M(leftv res, leftv v)
2384{
2385  matrix m=(matrix)v->Data();
2386  res->data = (char *)(MATROWS(m)*MATCOLS(m));
2387  return FALSE;
2388}
2389static BOOLEAN jjCOUNT_IV(leftv res, leftv v)
2390{
2391  res->data = (char *)((intvec*)(v->Data()))->length();
2392  return FALSE;
2393}
2394static BOOLEAN jjDEG(leftv res, leftv v)
2395{
2396  int dummy;
2397  poly p=(poly)v->Data();
2398  if (p!=NULL) res->data = (char *)pLDeg(p,&dummy);
2399  else res->data=(char *)-1;
2400  return FALSE;
2401}
2402static BOOLEAN jjDEGREE(leftv res, leftv v)
2403{
2404  assumeStdFlag(v);
2405  scDegree((ideal)v->Data(),currQuotient);
2406  return FALSE;
2407}
2408static BOOLEAN jjDEFINED(leftv res, leftv v)
2409{
2410  if ((v->rtyp==IDHDL)
2411  && ((myynest==IDLEV((idhdl)v->data))||(0==IDLEV((idhdl)v->data))))
2412  {
2413    res->data=(void *)(IDLEV((idhdl)v->data)+1);
2414  }
2415  else if (v->rtyp!=0) res->data=(void *)(-1);
2416  return FALSE;
2417}
2418#ifdef HAVE_FACTORY
2419static BOOLEAN jjDET(leftv res, leftv v)
2420{
2421  int i,j;
2422  matrix m=(matrix)v->Data();
2423  if (currRing->parameter==NULL)
2424  {
2425    for(i=m->rows();i>0;i--)
2426    {
2427      for(j=m->cols();j>0;j--)
2428      {
2429        if((MATELEM(m,i,j)!=NULL)
2430        && (!pIsConstant(MATELEM(m,i,j))))
2431        {
2432          goto nonconst;
2433        }
2434      }
2435    }
2436    res->data = (char *)singclap_det(m);
2437    return FALSE;
2438  }
2439nonconst:
2440//  res->data = (char *)mpDet(m);
2441  poly p = mpDetBareiss(m);
2442#ifdef PDEBUG
2443  poly old = mpDet(m);
2444  if (!pEqual(p,old))
2445  {
2446    WerrorS("error in mpDetBareiss");
2447  }
2448#endif
2449  res ->data = (char *)p;
2450  return FALSE;
2451}
2452static BOOLEAN jjDET_I(leftv res, leftv v)
2453{
2454  intvec * m=(intvec*)v->Data();
2455  int i,j;
2456  i=m->rows();j=m->cols();
2457  if(i==j)
2458    res->data = (char *)singclap_det_i(m);
2459  else
2460  {
2461    Werror("det of %d x %d intmat",i,j);
2462    return TRUE;
2463  }
2464  return FALSE;
2465}
2466#endif
2467static BOOLEAN jjDIM(leftv res, leftv v)
2468{
2469  assumeStdFlag(v);
2470  res->data = (char *)scDimInt((ideal)(v->Data()),currQuotient);
2471  return FALSE;
2472}
2473static BOOLEAN jjDUMP(leftv res, leftv v)
2474{
2475  si_link l = (si_link)v->Data();
2476  if (slDump(l))
2477  {
2478    const char *s;
2479    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
2480    else                            s=sNoName;
2481    Werror("cannot dump to `%s`",s);
2482    return TRUE;
2483  }
2484  else
2485    return FALSE;
2486}
2487static BOOLEAN jjE(leftv res, leftv v)
2488{
2489  res->data = (char *)pOne();
2490  pSetComp((poly)res->data,(int)v->Data());
2491  return FALSE;
2492}
2493#ifdef HAVE_FACTORY
2494static BOOLEAN jjFACSTD(leftv res, leftv v)
2495{
2496  res->data=(void *)kStdfac((ideal)v->Data(),NULL,testHomog,NULL);
2497  setFlag(res,FLAG_STD);
2498  return FALSE;
2499}
2500#endif
2501static BOOLEAN jjGETDUMP(leftv res, leftv v)
2502{
2503  si_link l = (si_link)v->Data();
2504  if (slGetDump(l))
2505  {
2506    const char *s;
2507    if ((l!=NULL)&&(l->name!=NULL)) s=l->name;
2508    else                            s=sNoName;
2509    Werror("cannot get dump from `%s`",s);
2510    return TRUE;
2511  }
2512  else
2513    return FALSE;
2514}
2515static BOOLEAN jjHIGHCORNER(leftv res, leftv v)
2516{
2517  assumeStdFlag(v);
2518  ideal I=(ideal)v->Data();
2519  res->data=(void *)iiHighCorner(I,0);
2520  return FALSE;
2521}
2522static BOOLEAN jjHIGHCORNER_M(leftv res, leftv v)
2523{
2524  assumeStdFlag(v);
2525  intvec *w=(intvec*)atGet(v,"isHomog");
2526  BOOLEAN delete_w=FALSE;
2527  ideal I=(ideal)v->Data();
2528  int i;
2529  poly p=NULL,po=NULL;
2530  int rk=idRankFreeModule(I);
2531  if (w==NULL)
2532  {
2533    w = new intvec(rk);
2534    delete_w=TRUE;
2535  }
2536  for(i=rk;i>0;i--)
2537  {
2538    p=iiHighCorner(I,i);
2539    if (p==NULL)
2540    {
2541      Werror("module must be zero-dimensional");
2542      if (delete_w) delete w;
2543      return TRUE;
2544    }
2545    if (po==NULL)
2546    {
2547      po=p;
2548    }
2549    else
2550    {
2551      // now po!=NULL, p!=NULL
2552      int d=(pFDeg(po)-(*w)[pGetComp(po)-1] - pFDeg(p)+(*w)[i-1]);
2553      if (d==0)
2554        d=pComp0(po,p);
2555      if (d > 0)
2556      {
2557        pDelete(&p);
2558      }
2559      else // (d < 0)
2560      {
2561        pDelete(&po); po=p;
2562      }
2563    }
2564  }
2565  if (delete_w) delete w;
2566  res->data=(void *)po;
2567  return FALSE;
2568}
2569static BOOLEAN jjHILBERT(leftv res, leftv v)
2570{
2571  assumeStdFlag(v);
2572  intvec *module_w=(intvec*)atGet(v,"isHomog");
2573  //scHilbertPoly((ideal)v->Data(),currQuotient);
2574  hLookSeries((ideal)v->Data(),module_w,currQuotient);
2575  return FALSE;
2576}
2577static BOOLEAN jjHILBERT_IV(leftv res, leftv v)
2578{
2579  res->data=(void *)hSecondSeries((intvec *)v->Data());
2580  return FALSE;
2581}
2582static BOOLEAN jjHOMOG1(leftv res, leftv v)
2583{
2584  intvec *w;
2585  res->data=(void *)idHomModule((ideal)v->Data(),currQuotient,&w);
2586  if ((v->rtyp==IDHDL)&&(w!=NULL))
2587    atSet((idhdl)v->data,mstrdup("isHomog"),w,INTVEC_CMD);
2588  return FALSE;
2589}
2590static BOOLEAN jjIDEAL_Ma(leftv res, leftv v)
2591{
2592  matrix mat=(matrix)v->CopyD();
2593  IDELEMS((ideal)mat)=MATCOLS(mat)*MATROWS(mat);
2594  MATROWS(mat)=1;
2595  mat->rank=1;
2596  res->data=(char *)mat;
2597  return FALSE;
2598}
2599static BOOLEAN jjIDEAL_Map(leftv res, leftv v)
2600{
2601  map m=(map)v->CopyD();
2602  FreeL((ADDRESS)m->preimage);
2603  m->preimage=NULL;
2604  ideal I=(ideal)m;
2605  I->rank=1;
2606  res->data=(char *)I;
2607  return FALSE;
2608}
2609static BOOLEAN jjIDEAL_R(leftv res, leftv v)
2610{
2611  if (currRing!=NULL)
2612  {
2613    ring q=(ring)v->Data();
2614    if ((rInternalChar(q)==rInternalChar(currRing))
2615    && (q->N==currRing->N)) /* && varnames equ. */
2616    {
2617      if (q->qideal==NULL)
2618        res->data=(char *)idInit(1,1);
2619      else
2620        res->data=(char *)idCopy(q->qideal);
2621      return FALSE;
2622    }
2623  }
2624  return TRUE;
2625}
2626static BOOLEAN jjIm2Iv(leftv res, leftv v)
2627{
2628  intvec *iv = (intvec *)v->CopyD();
2629  iv->makeVector();
2630  res->data = iv;
2631  return FALSE;
2632}
2633static BOOLEAN jjINDEPSET(leftv res, leftv v)
2634{
2635  assumeStdFlag(v);
2636  res->data=(void *)scIndIntvec((ideal)(v->Data()),currQuotient);
2637  return FALSE;
2638}
2639static BOOLEAN jjINTERRED(leftv res, leftv v)
2640{
2641  ideal result=kInterRed((ideal)(v->Data()),currQuotient);
2642  //if (result==NULL) return TRUE;
2643  idSkipZeroes(result);
2644  res->data = result;
2645  return FALSE;
2646}
2647static BOOLEAN jjIS_RINGVAR_P(leftv res, leftv v)
2648{
2649  res->data = (char *)pVar((poly)v->Data());
2650  return FALSE;
2651}
2652static BOOLEAN jjIS_RINGVAR_S(leftv res, leftv v)
2653{
2654  res->data = (char *)(rIsRingVar((char *)v->Data())+1);
2655  return FALSE;
2656}
2657static BOOLEAN jjIS_RINGVAR0(leftv res, leftv v)
2658{
2659  res->data = (char *)0;
2660  return FALSE;
2661}
2662static BOOLEAN jjJACOB_P(leftv res, leftv v)
2663{
2664  ideal i=idInit(pVariables,1);
2665  int k;
2666  for (k=pVariables;k>0;k--)
2667  {
2668    i->m[k-1]=pDiff(pCopy((poly)(v->Data())),k);
2669  }
2670  res->data = (char *)i;
2671  return FALSE;
2672}
2673static BOOLEAN jjKBASE(leftv res, leftv v)
2674{
2675  assumeStdFlag(v);
2676  res->data = (char *)scKBase(-1,(ideal)(v->Data()),currQuotient);
2677  return FALSE;
2678}
2679static BOOLEAN jjKLAMMER_LIB(leftv res, leftv u)
2680{
2681  char * s=(char *)u->Data();
2682  return iiLibCmd(s);
2683}
2684#ifdef MDEBUG
2685static BOOLEAN jjpHead(leftv res, leftv v)
2686{
2687  res->data=(char *)pHead((poly)v->Data());
2688  return FALSE;
2689}
2690#endif
2691static BOOLEAN jjL2R(leftv res, leftv v)
2692{
2693  res->data=(char *)syConvList((lists)v->Data());
2694  return FALSE;
2695}
2696static BOOLEAN jjLEADCOEF(leftv res, leftv v)
2697{
2698  poly p=(poly)v->Data();
2699  if (p==NULL)
2700  {
2701    res->data=(char *)nInit(0);
2702  }
2703  else
2704  {
2705    res->data=(char *)nCopy(pGetCoeff(p));
2706  }
2707  return FALSE;
2708}
2709static BOOLEAN jjLEADEXP(leftv res, leftv v)
2710{
2711  poly p=(poly)v->Data();
2712  int s=pVariables;
2713  if (v->Typ()==VECTOR_CMD) s++;
2714  intvec *iv=new intvec(s);
2715  if (p!=NULL)
2716  {
2717    for(int i = pVariables;i;i--)
2718    {
2719      (*iv)[i-1]=pGetExp(p,i);
2720    }
2721    if (s!=pVariables)
2722      (*iv)[pVariables]=pGetComp(p);
2723  }
2724  res->data=(char *)iv;
2725  return FALSE;
2726}
2727static BOOLEAN jjLEADMONOM(leftv res, leftv v)
2728{
2729  poly p=(poly)v->Data();
2730  if (p == NULL)
2731  {
2732    res->data = (char*) NULL;
2733  }
2734  else
2735  {
2736    poly lm = pCopy1(p);
2737    pSetCoeff(lm, nInit(1));
2738    res->data = (char*) lm;
2739  }
2740  return FALSE;
2741}
2742static BOOLEAN jjLIB(leftv res, leftv v)
2743{
2744  return iiLibCmd((char *)v->CopyD());
2745}
2746static BOOLEAN jjMEMORY(leftv res, leftv v)
2747{
2748#ifdef MM_COUNT
2749  switch(((int)v->Data()))
2750  {
2751  case 0:
2752    res->data = (char *)mmMemUsed();
2753    break;
2754  case 1:
2755    res->data = (char *)mmMemAlloc();
2756    break;
2757#ifdef HAVE_SBRK
2758  case 2:
2759    res->data = (char *)mmMemPhysical();
2760    break;
2761#endif
2762  default:
2763#ifndef MAKE_DISRIBUTION
2764    mmPrintStat();
2765#endif
2766    res->data = (char *)0;
2767  }
2768  return FALSE;
2769#else
2770  res->data = (char *)0;
2771  return FALSE;
2772#endif
2773}
2774static BOOLEAN jjMONITOR1(leftv res, leftv v)
2775{
2776  monitor((char *)(v->Data()),PROT_I);
2777  return FALSE;
2778}
2779static BOOLEAN jjMSTD(leftv res, leftv v)
2780{
2781  res->data=(void *)min_std((ideal)v->Data(),currQuotient,testHomog,NULL);
2782  return FALSE;
2783}
2784static BOOLEAN jjMULT(leftv res, leftv v)
2785{
2786  assumeStdFlag(v);
2787  res->data = (char *)scMultInt((ideal)(v->Data()),currQuotient);
2788  return FALSE;
2789}
2790static BOOLEAN jjNAMEOF(leftv res, leftv v)
2791{
2792  res->data = (char *)v->name;
2793  if (res->data==NULL) res->data=mstrdup("");
2794  v->name=NULL;
2795  return FALSE;
2796}
2797static BOOLEAN jjNAMES(leftv res, leftv v)
2798{
2799  res->data=ipNameList(((ring)v->Data())->idroot);
2800  return FALSE;
2801}
2802static BOOLEAN jjNVARS(leftv res, leftv v)
2803{
2804  res->data = (char *)(((ring)(v->Data()))->N);
2805  return FALSE;
2806}
2807static BOOLEAN jjOpenClose(leftv res, leftv v)
2808{
2809  si_link l=(si_link)v->Data();
2810  if (iiOp==OPEN_CMD) return slOpen(l, SI_LINK_OPEN);
2811  else                return slClose(l);
2812}
2813static BOOLEAN jjORD(leftv res, leftv v)
2814{
2815  poly p=(poly)v->Data();
2816  res->data=(char *)( p==NULL ? -1 : pFDeg(p) );
2817  return FALSE;
2818}
2819static BOOLEAN jjPAR1(leftv res, leftv v)
2820{
2821  int i=(int)v->Data();
2822  int p=0;
2823  p=rPar(currRing);
2824  if ((0<i) && (i<=p))
2825  {
2826    res->data=(char *)nPar(i);
2827  }
2828  else
2829  {
2830    Werror("par number %d out of range 1..%d",i,p);
2831    return TRUE;
2832  }
2833  return FALSE;
2834}
2835static BOOLEAN jjPARDEG(leftv res, leftv v)
2836{
2837  res->data = (char *)nParDeg((number)v->Data());
2838  return FALSE;
2839}
2840static BOOLEAN jjPARSTR1(leftv res, leftv v)
2841{
2842  if (currRing==NULL)
2843  {
2844    WerrorS("no ring active");
2845    return TRUE;
2846  }
2847  int i=(int)v->Data();
2848  int p=0;
2849  if ((0<i) && (currRing->parameter!=NULL) && (i<=(p=rPar(currRing))))
2850    res->data=mstrdup(currRing->parameter[i-1]);
2851  else
2852  {
2853    Werror("par number %d out of range 1..%d",i,p);
2854    return TRUE;
2855  }
2856  return FALSE;
2857}
2858static BOOLEAN jjP2I(leftv res, leftv v)
2859{
2860  poly p=(poly)v->Data();
2861  if (p==NULL) { /*res->data=(char *)0;*/ return FALSE; }
2862  if ((pNext(p)!=NULL)|| (!pIsConstant(p)))
2863  {
2864    WerrorS("poly must be constant");
2865    return TRUE;
2866  }
2867  res->data = (char *)nInt(pGetCoeff(p));
2868  return FALSE;
2869}
2870static BOOLEAN jjPRIME(leftv res, leftv v)
2871{
2872  int i = IsPrime((int)(v->Data()));
2873  res->data = (char *)(i > 1 ? i : 2);
2874  return FALSE;
2875}
2876static BOOLEAN jjP2N(leftv res, leftv v)
2877{
2878  number n;
2879  poly p;
2880  if (((p=(poly)v->Data())!=NULL)
2881  && (pIsConstant(p)))
2882  {
2883    n=nCopy(pGetCoeff(p));
2884  }
2885  else
2886  {
2887    n=nInit(0);
2888  }
2889  res->data = (char *)n;
2890  return FALSE;
2891}
2892static BOOLEAN jjRESERVEDNAME(leftv res, leftv v)
2893{
2894  char *s= (char *)v->Data();
2895  int i = 1;
2896  int l = strlen(s);
2897  while (cmds[i].tokval!=0)
2898  {
2899    if (strcmp(s, cmds[i].name) == 0)
2900    {
2901      res->data = (char *)1;
2902      return FALSE;
2903    }
2904    i++;
2905  }
2906  //res->data = (char *)0;
2907  return FALSE;
2908}
2909static BOOLEAN jjREAD(leftv res, leftv v)
2910{
2911  return jjREAD2(res,v,NULL);
2912}
2913static BOOLEAN jjREGULARITY(leftv res, leftv v)
2914{
2915  res->data = (char *)iiRegularity((lists)v->Data());
2916  return FALSE;
2917}
2918static BOOLEAN jjROWS(leftv res, leftv v)
2919{
2920  ideal i = (ideal)v->Data();
2921  res->data = (char *)i->rank;
2922  return FALSE;
2923}
2924static BOOLEAN jjROWS_IV(leftv res, leftv v)
2925{
2926  res->data = (char *)((intvec*)(v->Data()))->rows();
2927  return FALSE;
2928}
2929static BOOLEAN jjRPAR(leftv res, leftv v)
2930{
2931  res->data = (char *)rPar(((ring)v->Data()));
2932  return FALSE;
2933}
2934static BOOLEAN jjSTD(leftv res, leftv v)
2935{
2936  ideal result;
2937  intvec *w=(intvec *)atGet(v,"isHomog");
2938  tHomog hom=testHomog;
2939  if (w!=NULL)
2940  {
2941    w=ivCopy(w);
2942    hom=isHomog;
2943  }
2944  //if (hasFlag(v,FLAG_STD))
2945  //  result=stdred((ideal)v->Data(),currQuotient,hom,&w);
2946  //else
2947    result=kStd((ideal)(v->Data()),currQuotient,hom,&w);
2948  idSkipZeroes(result);
2949  res->data = (char *)result;
2950  setFlag(res,FLAG_STD);
2951  if (w!=NULL) atSet(res,mstrdup("isHomog"),w,INTVEC_CMD);
2952  return FALSE;
2953}
2954static BOOLEAN jjSTRING(leftv res, leftv v)
2955{
2956  res->data = (char *)v->String();
2957  if (res->data==NULL)
2958  {
2959    Werror("cannot convert %s to string",Tok2Cmdname(v->Typ()));
2960    return TRUE;
2961  }
2962  return FALSE;
2963}
2964static BOOLEAN jjSort_Id(leftv res, leftv v)
2965{
2966  res->data = (char *)idSort((ideal)v->Data());
2967  return FALSE;
2968}
2969static BOOLEAN jjSTRING_PROC(leftv res, leftv v)
2970{
2971  procinfov pi = IDPROC((idhdl)v->data);
2972  if((pi->language == LANG_SINGULAR) && (pi->data.s.body!=NULL))
2973  //if(pi->language == LANG_SINGULAR)
2974  {
2975    //if(pi->data.s.body==NULL)
2976    //  iiGetLibProcBuffer(IDPROC((idhdl)v->data));
2977    res->data=mstrdup(pi->data.s.body);
2978  }
2979  else
2980    res->data=mstrdup("");
2981  return FALSE;
2982}
2983static BOOLEAN jjSYZYGY(leftv res, leftv v)
2984{
2985  intvec *w=NULL;
2986  res->data = (char *)idSyzygies((ideal)v->Data(),currQuotient,testHomog,&w);
2987  if (w!=NULL) delete w;
2988  return FALSE;
2989}
2990static BOOLEAN jjTRACE_IV(leftv res, leftv v)
2991{
2992  res->data = (char *)ivTrace((intvec*)(v->Data()));
2993  return FALSE;
2994}
2995static BOOLEAN jjTRANSP_IV(leftv res, leftv v)
2996{
2997  res->data = (char *)ivTranp((intvec*)(v->Data()));
2998  return FALSE;
2999}
3000static BOOLEAN jjTYPEOF(leftv res, leftv v)
3001{
3002  switch ((int)v->data)
3003  {
3004    case INT_CMD:     res->data=mstrdup("int"); break;
3005    case POLY_CMD:   res->data=mstrdup("poly"); break;
3006    case VECTOR_CMD:  res->data=mstrdup("vector"); break;
3007    case STRING_CMD:  res->data=mstrdup("string"); break;
3008    case INTVEC_CMD:  res->data=mstrdup("intvec"); break;
3009    case IDEAL_CMD:   res->data=mstrdup("ideal"); break;
3010    case MATRIX_CMD: res->data=mstrdup("matrix"); break;
3011    case MODUL_CMD:   res->data=mstrdup("module"); break;
3012    case MAP_CMD:     res->data=mstrdup("map"); break;
3013    case PROC_CMD:    res->data=mstrdup("proc"); break;
3014    case RING_CMD:    res->data=mstrdup("ring"); break;
3015    case QRING_CMD:   res->data=mstrdup("qring"); break;
3016    case INTMAT_CMD:  res->data=mstrdup("intmat"); break;
3017    case NUMBER_CMD:  res->data=mstrdup("number"); break;
3018    case LIST_CMD:   res->data=mstrdup("list"); break;
3019    case PACKAGE_CMD: res->data=mstrdup("package"); break;
3020    case LINK_CMD:   res->data=mstrdup("link"); break;
3021    case RESOLUTION_CMD:res->data=mstrdup("resolution");break;
3022    case DEF_CMD:
3023    case NONE:    res->data=mstrdup("none"); break;
3024    default:       res->data=mstrdup("?unknown type?");
3025  }
3026  return FALSE;
3027}
3028static BOOLEAN jjVAR1(leftv res, leftv v)
3029{
3030  int i=(int)v->Data();
3031  if ((0<i) && (i<=currRing->N))
3032  {
3033    poly p=pOne();
3034    pSetExp(p,i,1);
3035    pSetm(p);
3036    res->data=(char *)p;
3037  }
3038  else
3039  {
3040    Werror("var number %d out of range 1..%d",i,currRing->N);
3041    return TRUE;
3042  }
3043  return FALSE;
3044}
3045static BOOLEAN jjVARSTR1(leftv res, leftv v)
3046{
3047  if (currRing==NULL)
3048  {
3049    WerrorS("no ring active");
3050    return TRUE;
3051  }
3052  int i=(int)v->Data();
3053  if ((0<i) && (i<=currRing->N))
3054    res->data=mstrdup(currRing->names[i-1]);
3055  else
3056  {
3057    Werror("var number %d out of range 1..%d",i,currRing->N);
3058    return TRUE;
3059  }
3060  return FALSE;
3061}
3062static BOOLEAN jjVDIM(leftv res, leftv v)
3063{
3064  assumeStdFlag(v);
3065  res->data = (char *)scMult0Int((ideal)v->Data(),currQuotient);
3066  return FALSE;
3067}
3068
3069static BOOLEAN jjLOAD1(leftv res, leftv v)
3070{
3071  return jjLOAD(res, v);
3072}
3073
3074static BOOLEAN jjLOAD(leftv res, leftv v, BOOLEAN autoexport)
3075{
3076  char * s=mstrdup((char *)v->Data());
3077  char libnamebuf[256];
3078  lib_types LT = type_of_LIB(s, libnamebuf);
3079  BOOLEAN result = TRUE;
3080#ifdef HAVE_DYNAMIC_LOADING
3081  extern BOOLEAN load_modules(char *newlib, char *fullpath, BOOLEAN tellerror);
3082#endif /* HAVE_DYNAMIC_LOADING */
3083
3084  switch(LT)
3085  {
3086      default:
3087      case LT_NONE:
3088        Werror("%s: unknown type", s);
3089        break;
3090
3091      case LT_SINGULAR:
3092#ifdef HAVE_NAMESPACES
3093        result = iiLibCmd(s, autoexport);
3094#else
3095        result = iiLibCmd(s);
3096#endif
3097        break;
3098
3099      case LT_ELF:
3100#ifdef HAVE_DYNAMIC_LOADING
3101        result = load_modules(s, libnamebuf, autoexport);
3102#else /* HAVE_DYNAMIC_LOADING */
3103        WerrorS("Dynamic modules are not supported by this version of Singular");
3104#endif /* HAVE_DYNAMIC_LOADING */
3105        break;
3106
3107      case LT_HPUX:
3108#ifdef HAVE_DYNAMIC_LOADING
3109        result = load_modules(s, libnamebuf, autoexport);
3110#else /* HAVE_DYNAMIC_LOADING */
3111        WerrorS("Dynamic modules are not supported by this version of Singular");
3112#endif /* HAVE_DYNAMIC_LOADING */
3113        break;
3114  }
3115  return result;
3116}
3117
3118/*=================== operations with 1 arg.: table =================*/
3119
3120#ifdef INIT_BUG
3121#define XS(A) -((short)A)
3122#define jjstrlen       (proc1)1
3123#define jjpLength      (proc1)2
3124#define jjidElem       (proc1)3
3125#define jjmpDetBareiss (proc1)4
3126#define jjidFreeModule (proc1)5
3127#define jjidVec2Ideal  (proc1)6
3128#define jjrCharStr     (proc1)7
3129#ifndef MDEBUG
3130#define jjpHead        (proc1)8
3131#endif
3132#define jjidHead       (proc1)9
3133#define jjidMaxIdeal   (proc1)10
3134#define jjidMinBase    (proc1)11
3135#define jjsyMinBase    (proc1)12
3136#define jjpMaxComp     (proc1)13
3137#define jjmpTrace      (proc1)14
3138#define jjmpTransp     (proc1)15
3139#define jjrOrdStr      (proc1)16
3140#define jjrVarStr      (proc1)18
3141#define jjrParStr      (proc1)19
3142#define jjidMinEmbedding (proc1)20
3143#define jjBETTI_R        (proc1)21
3144#define jjCOUNT_R        (proc1)22
3145#define jjDIM_R          (proc1)23
3146#define jjMINRES_R       (proc1)24
3147#define jjidTransp       (proc1)25
3148
3149extern struct sValCmd1 dArith1[];
3150void jjInitTab1()
3151{
3152  int i=0;
3153  for (;dArith1[i].cmd!=0;i++)
3154  {
3155    if (dArith1[i].res<0)
3156    {
3157      switch ((int)dArith1[i].p)
3158      {
3159        case (int)jjstrlen:       dArith1[i].p=(proc1)strlen; break;
3160        case (int)jjpLength:      dArith1[i].p=(proc1)pLength; break;
3161        case (int)jjidElem:       dArith1[i].p=(proc1)idElem; break;
3162        case (int)jjidVec2Ideal:  dArith1[i].p=(proc1)idVec2Ideal; break;
3163#ifndef HAVE_FACTORY
3164        case (int)jjmpDetBareiss: dArith1[i].p=(proc1)mpDetBareiss; break;
3165#endif
3166        case (int)jjidFreeModule: dArith1[i].p=(proc1)idFreeModule; break;
3167        case (int)jjrCharStr:     dArith1[i].p=(proc1)rCharStr; break;
3168#ifndef MDEBUG
3169        case (int)jjpHead:        dArith1[i].p=(proc1)pHeadProc; break;
3170#endif
3171        case (int)jjidHead:       dArith1[i].p=(proc1)idHead; break;
3172        case (int)jjidMaxIdeal:   dArith1[i].p=(proc1)idMaxIdeal; break;
3173        case (int)jjidMinBase:    dArith1[i].p=(proc1)idMinBase; break;
3174        case (int)jjsyMinBase:    dArith1[i].p=(proc1)syMinBase; break;
3175        case (int)jjpMaxComp:     dArith1[i].p=(proc1)pMaxComp; break;
3176        case (int)jjmpTrace:      dArith1[i].p=(proc1)mpTrace; break;
3177        case (int)jjmpTransp:     dArith1[i].p=(proc1)mpTransp; break;
3178        case (int)jjrOrdStr:      dArith1[i].p=(proc1)rOrdStr; break;
3179        case (int)jjrVarStr:      dArith1[i].p=(proc1)rVarStr; break;
3180        case (int)jjrParStr:      dArith1[i].p=(proc1)rParStr; break;
3181        case (int)jjidMinEmbedding: dArith1[i].p=(proc1)idMinEmbedding; break;
3182        case (int)jjBETTI_R:      dArith1[i].p=(proc1)syBettiOfComputation; break;
3183        case (int)jjCOUNT_R:      dArith1[i].p=(proc1)syLength; break;
3184        case (int)jjDIM_R:        dArith1[i].p=(proc1)syDim; break;
3185        case (int)jjMINRES_R:     dArith1[i].p=(proc1)syMinimize; break;
3186        case (int)jjidTransp:     dArith1[i].p=(proc1)idTransp; break;
3187#ifdef GENTABLE
3188        default: Werror("missing proc1-definition for %d",(int)dArith1[i].p);
3189#endif
3190      }
3191    }
3192  }
3193}
3194#else
3195#if defined(PROC_BUG)
3196#define XS(A) A
3197static BOOLEAN jjstrlen(leftv res, leftv v)
3198{
3199  res->data = (char *)strlen((char *)v->Data());
3200  return FALSE;
3201}
3202static BOOLEAN jjpLength(leftv res, leftv v)
3203{
3204  res->data = (char *)pLength((poly)v->Data());
3205  return FALSE;
3206}
3207static BOOLEAN jjidElem(leftv res, leftv v)
3208{
3209  res->data = (char *)idElem((ideal)v->Data());
3210  return FALSE;
3211}
3212static BOOLEAN jjmpDetBareiss(leftv res, leftv v)
3213{
3214  res->data = (char *)mpDetBareiss((matrix)v->Data());
3215  return FALSE;
3216}
3217static BOOLEAN jjidFreeModule(leftv res, leftv v)
3218{
3219  res->data = (char *)idFreeModule((int)v->Data());
3220  return FALSE;
3221}
3222static BOOLEAN jjidVec2Ideal(leftv res, leftv v)
3223{
3224  res->data = (char *)idVec2Ideal((poly)v->Data());
3225  return FALSE;
3226}
3227static BOOLEAN jjrCharStr(leftv res, leftv v)
3228{
3229  res->data = rCharStr((ring)v->Data());
3230  return FALSE;
3231}
3232#ifndef MDEBUG
3233static BOOLEAN jjpHead(leftv res, leftv v)
3234{
3235  res->data = (char *)pHead((poly)v->Data());
3236  return FALSE;
3237}
3238#endif
3239static BOOLEAN jjidHead(leftv res, leftv v)
3240{
3241  res->data = (char *)idHead((ideal)v->Data());
3242  return FALSE;
3243}
3244static BOOLEAN jjidMaxIdeal(leftv res, leftv v)
3245{
3246  res->data = (char *)idMaxIdeal((int)v->Data());
3247  return FALSE;
3248}
3249static BOOLEAN jjidMinBase(leftv res, leftv v)
3250{
3251  res->data = (char *)idMinBase((ideal)v->Data());
3252  return FALSE;
3253}
3254static BOOLEAN jjsyMinBase(leftv res, leftv v)
3255{
3256  res->data = (char *)syMinBase((ideal)v->Data());
3257  return FALSE;
3258}
3259static BOOLEAN jjpMaxComp(leftv res, leftv v)
3260{
3261  res->data = (char *)pMaxComp((poly)v->Data());
3262  return FALSE;
3263}
3264static BOOLEAN jjmpTrace(leftv res, leftv v)
3265{
3266  res->data = (char *)mpTrace((matrix)v->Data());
3267  return FALSE;
3268}
3269static BOOLEAN jjmpTransp(leftv res, leftv v)
3270{
3271  res->data = (char *)mpTransp((matrix)v->Data());
3272  return FALSE;
3273}
3274static BOOLEAN jjrOrdStr(leftv res, leftv v)
3275{
3276  res->data = rOrdStr((ring)v->Data());
3277  return FALSE;
3278}
3279static BOOLEAN jjrVarStr(leftv res, leftv v)
3280{
3281  res->data = rVarStr((ring)v->Data());
3282  return FALSE;
3283}
3284static BOOLEAN jjrParStr(leftv res, leftv v)
3285{
3286  res->data = rParStr((ring)v->Data());
3287  return FALSE;
3288}
3289static BOOLEAN jjidMinEmbedding(leftv res, leftv v)
3290{
3291  res->data = (char *)idMinEmbedding((ideal)v->Data());
3292  return FALSE;
3293}
3294static BOOLEAN jjBETTI_R(leftv res, leftv v)
3295{
3296  res->data=(char *)syBettiOfComputation((syStrategy)v->Data());
3297  return FALSE;
3298}
3299static BOOLEAN jjCOUNT_R(leftv res, leftv v)
3300{
3301  res->data=(char *)syLength((syStrategy)v->Data());
3302  return FALSE;
3303}
3304static BOOLEAN jjDIM_R(leftv res, leftv v)
3305{
3306  res->data = (char *)syDim((syStrategy)v->Data());
3307  return FALSE;
3308}
3309static BOOLEAN jjMINRES_R(leftv res, leftv v)
3310{
3311  res->data=(char *)syMinimize((syStrategy)v->Data());
3312  return FALSE;
3313}
3314static BOOLEAN jjidTransp(leftv res, leftv v)
3315{
3316  res->data = (char *)idTransp((ideal)v->Data());
3317  return FALSE;
3318}
3319#else
3320#define XS(A)          -((short)A)
3321#define jjstrlen       (proc1)strlen
3322#define jjpLength      (proc1)pLength
3323#define jjidElem       (proc1)idElem
3324#define jjmpDetBareiss (proc1)mpDetBareiss
3325#define jjidFreeModule (proc1)idFreeModule
3326#define jjidVec2Ideal  (proc1)idVec2Ideal
3327#define jjrCharStr     (proc1)rCharStr
3328#ifndef MDEBUG
3329#define jjpHead        (proc1)pHead
3330#endif
3331#define jjidHead       (proc1)idHead
3332#define jjidMaxIdeal   (proc1)idMaxIdeal
3333#define jjidMinBase    (proc1)idMinBase
3334#define jjsyMinBase    (proc1)syMinBase
3335#define jjpMaxComp     (proc1)pMaxComp
3336#define jjmpTrace      (proc1)mpTrace
3337#define jjmpTransp     (proc1)mpTransp
3338#define jjrOrdStr      (proc1)rOrdStr
3339#define jjrVarStr      (proc1)rVarStr
3340#define jjrParStr      (proc1)rParStr
3341#define jjidMinEmbedding (proc1)idMinEmbedding
3342#define jjBETTI_R        (proc1)syBettiOfComputation
3343#define jjCOUNT_R        (proc1)syLength
3344#define jjDIM_R        (proc1)syDim
3345#define jjMINRES_R     (proc1)syMinimize
3346#define jjidTransp     (proc1)idTransp
3347#endif
3348#endif
3349BOOLEAN jjnInt(leftv res, leftv u)
3350{
3351  number n=(number)u->CopyD();
3352  res->data=(char *)nInt(n);
3353  nDelete(&n);
3354  return FALSE;
3355}
3356#define s short
3357struct sValCmd1 dArith1[]=
3358{
3359// operations:
3360// proc         cmd               res             arg
3361// {jjPLUSPLUS,   PLUSPLUS,        INT_CMD,        INT_CMD }
3362//,{jjMINUSMINUS, MINUSMINUS,      INT_CMD,        INT_CMD }
3363 {jjPLUSPLUS,   PLUSPLUS,        NONE,           IDHDL }
3364,{jjPLUSPLUS,   MINUSMINUS,      NONE,           IDHDL }
3365,{jjUMINUS_I,   '-',             INT_CMD,        INT_CMD }
3366,{jjUMINUS_N,   '-',             NUMBER_CMD,     NUMBER_CMD }
3367,{jjUMINUS_P,   '-',             POLY_CMD,       POLY_CMD }
3368,{jjUMINUS_P,   '-',             VECTOR_CMD,     VECTOR_CMD }
3369,{jjUMINUS_MA,  '-',             MATRIX_CMD,     MATRIX_CMD }
3370,{jjUMINUS_IV,  '-',             INTVEC_CMD,     INTVEC_CMD }
3371,{jjUMINUS_IV,  '-',             INTMAT_CMD,     INTMAT_CMD }
3372,{jjPROC1,      '(',             ANY_TYPE/*set by p*/,PROC_CMD }
3373,{jjKLAMMER_LIB,'(',             NONE,           STRING_CMD }
3374// and the procedures with 1 argument:
3375,{atATTRIB1,    ATTRIB_CMD,      NONE,           DEF_CMD }
3376,{jjBAREISS_IM, BAREISS_CMD,     INTMAT_CMD,     INTMAT_CMD }
3377,{jjBAREISS,    BAREISS_CMD,     LIST_CMD,       MODUL_CMD }
3378,{jjBETTI,      BETTI_CMD,       INTMAT_CMD,     LIST_CMD }
3379,{jjBETTI_R,    BETTI_CMD,       XS(INTMAT_CMD), RESOLUTION_CMD }
3380,{jjCHAR,       CHARACTERISTIC_CMD, INT_CMD,     RING_CMD }
3381,{jjCHAR,       CHARACTERISTIC_CMD, INT_CMD,     QRING_CMD }
3382#ifdef HAVE_FACTORY
3383,{jjCHARSERIES, CHAR_SERIES_CMD, MATRIX_CMD,     IDEAL_CMD }
3384#else
3385,{jjWRONG,      CHAR_SERIES_CMD, MATRIX_CMD,     IDEAL_CMD }
3386#endif
3387,{jjrCharStr,   CHARSTR_CMD,     XS(STRING_CMD), RING_CMD }
3388,{jjrCharStr,   CHARSTR_CMD,     XS(STRING_CMD), QRING_CMD }
3389,{jjOpenClose,  CLOSE_CMD,       NONE,           LINK_CMD }
3390,{jjWRONG,      COLS_CMD,        0,              VECTOR_CMD }
3391,{jjCOLS,       COLS_CMD,        INT_CMD,        MATRIX_CMD }
3392,{jjCOLS,       COLS_CMD,        INT_CMD,        IDEAL_CMD }
3393,{jjCOLS,       COLS_CMD,        INT_CMD,        MODUL_CMD }
3394,{jjCOLS_IV,    COLS_CMD,        INT_CMD,        INTMAT_CMD }
3395,{jjWRONG,      COLS_CMD,        0,              INTVEC_CMD }
3396,{jjCONTENT,    CONTENT_CMD,     POLY_CMD,       POLY_CMD }
3397,{jjCONTENT,    CONTENT_CMD,     VECTOR_CMD,     VECTOR_CMD }
3398,{jjCOUNT_N,    COUNT_CMD,       INT_CMD,        NUMBER_CMD }
3399,{jjCOUNT_R,    COUNT_CMD,       XS(INT_CMD),    RESOLUTION_CMD }
3400,{jjstrlen,     COUNT_CMD,       XS(INT_CMD),    STRING_CMD }
3401,{jjpLength,    COUNT_CMD,       XS(INT_CMD),    POLY_CMD }
3402,{jjpLength,    COUNT_CMD,       XS(INT_CMD),    VECTOR_CMD }
3403,{jjidElem,     COUNT_CMD,       XS(INT_CMD),    IDEAL_CMD }
3404,{jjidElem,     COUNT_CMD,       XS(INT_CMD),    MODUL_CMD }
3405,{jjCOUNT_M,    COUNT_CMD,       INT_CMD,        MATRIX_CMD }
3406,{jjCOUNT_IV,   COUNT_CMD,       INT_CMD,        INTVEC_CMD }
3407,{jjCOUNT_IV,   COUNT_CMD,       INT_CMD,        INTMAT_CMD }
3408,{jjCOUNT_L,    COUNT_CMD,       INT_CMD,        LIST_CMD }
3409,{jjNULL,       DEF_CMD,         DEF_CMD,        INT_CMD }
3410,{jjWRONG,      DEF_CMD,         0,              ANY_TYPE }
3411,{jjDEG,        DEG_CMD,         INT_CMD,        POLY_CMD }
3412,{jjDEG,        DEG_CMD,         INT_CMD,        VECTOR_CMD }
3413,{jjDEGREE,     DEGREE_CMD,      NONE,           IDEAL_CMD }
3414,{jjDEGREE,     DEGREE_CMD,      NONE,           MODUL_CMD }
3415,{jjDEFINED,    DEFINED_CMD,     INT_CMD,        DEF_CMD }
3416#ifdef HAVE_FACTORY
3417,{jjDET_I,      DET_CMD,         INT_CMD,        INTMAT_CMD }
3418,{jjDET,        DET_CMD,         POLY_CMD,       MATRIX_CMD }
3419#else
3420,{jjWRONG,      DET_CMD,         INT_CMD,        INTMAT_CMD }
3421,{jjmpDetBareiss,DET_CMD,        XS(POLY_CMD),   MATRIX_CMD }
3422#endif
3423,{jjDIM,        DIM_CMD,         INT_CMD,        IDEAL_CMD }
3424,{jjDIM,        DIM_CMD,         INT_CMD,        MODUL_CMD }
3425,{jjDIM_R,      DIM_CMD,         XS(INT_CMD),    RESOLUTION_CMD }
3426,{jjDUMP,       DUMP_CMD,        NONE,           LINK_CMD }
3427,{jjE,          E_CMD,           VECTOR_CMD,     INT_CMD }
3428,{jjERROR,      ERROR_CMD,       NONE,           STRING_CMD }
3429#ifdef HAVE_FACTORY
3430,{jjFAC_P,      FAC_CMD,         LIST_CMD,       POLY_CMD }
3431#else
3432,{jjWRONG,      FAC_CMD,         LIST_CMD,       POLY_CMD }
3433#endif
3434#ifdef HAVE_FGLM
3435,{findUniProc,  FINDUNI_CMD,     IDEAL_CMD,      IDEAL_CMD}
3436#else
3437,{jjWRONG,      FINDUNI_CMD,     IDEAL_CMD,      IDEAL_CMD}
3438#endif
3439,{jjidFreeModule,FREEMODULE_CMD, XS(MODUL_CMD),  INT_CMD }
3440#ifdef HAVE_FACTORY
3441,{jjFACSTD,     FACSTD_CMD,      LIST_CMD,       IDEAL_CMD }
3442#else
3443,{jjWRONG,      FACSTD_CMD,      LIST_CMD,       IDEAL_CMD }
3444#endif
3445,{jjGETDUMP,    GETDUMP_CMD,     NONE,           LINK_CMD }
3446,{jjHIGHCORNER, HIGHCORNER_CMD,  POLY_CMD,       IDEAL_CMD }
3447,{jjHIGHCORNER_M, HIGHCORNER_CMD,VECTOR_CMD,     MODUL_CMD }
3448,{jjHILBERT,    HILBERT_CMD,     NONE,           IDEAL_CMD }
3449,{jjHILBERT,    HILBERT_CMD,     NONE,           MODUL_CMD }
3450,{jjHILBERT_IV, HILBERT_CMD,     INTVEC_CMD,     INTVEC_CMD }
3451,{jjHOMOG1,     HOMOG_CMD,       INT_CMD,        IDEAL_CMD }
3452,{jjHOMOG1,     HOMOG_CMD,       INT_CMD,        MODUL_CMD }
3453,{jjidVec2Ideal,IDEAL_CMD,       XS(IDEAL_CMD),  VECTOR_CMD }
3454,{jjIDEAL_Ma,   IDEAL_CMD,       IDEAL_CMD,      MATRIX_CMD }
3455,{jjIDEAL_R,    IDEAL_CMD,       IDEAL_CMD,      QRING_CMD }
3456,{jjIDEAL_R,    IDEAL_CMD,       IDEAL_CMD,      RING_CMD }
3457,{jjIDEAL_Map,  IDEAL_CMD,       IDEAL_CMD,      MAP_CMD }
3458,{jjDUMMY,      IDEAL_CMD,       IDEAL_CMD,      IDEAL_CMD }
3459,{jjINDEPSET,   INDEPSET_CMD,    INTVEC_CMD,     IDEAL_CMD }
3460,{jjDUMMY,      INT_CMD,         INT_CMD,        INT_CMD }
3461,{jjnInt,       INT_CMD,         INT_CMD,        NUMBER_CMD }
3462,{jjP2I,        INT_CMD,         INT_CMD,        POLY_CMD }
3463,{jjINTERRED,   INTERRED_CMD,    IDEAL_CMD,      IDEAL_CMD }
3464,{jjINTERRED,   INTERRED_CMD,    MODUL_CMD,      MODUL_CMD }
3465,{jjDUMMY,      INTMAT_CMD,      INTMAT_CMD,     INTMAT_CMD }
3466,{jjIm2Iv,      INTVEC_CMD,      INTVEC_CMD,     INTMAT_CMD }
3467,{jjDUMMY,      INTVEC_CMD,      INTVEC_CMD,     INTVEC_CMD }
3468,{jjIS_RINGVAR_P, IS_RINGVAR,    INT_CMD,        POLY_CMD }
3469,{jjIS_RINGVAR_S, IS_RINGVAR,    INT_CMD,        STRING_CMD }
3470,{jjIS_RINGVAR0,IS_RINGVAR,      INT_CMD,        ANY_TYPE }
3471,{jjJACOB_P,    JACOB_CMD,       IDEAL_CMD,      POLY_CMD }
3472,{mpJacobi,     JACOB_CMD,       MATRIX_CMD,     IDEAL_CMD }
3473,{jjKBASE,      KBASE_CMD,       IDEAL_CMD,      IDEAL_CMD }
3474,{jjKBASE,      KBASE_CMD,       MODUL_CMD,      MODUL_CMD }
3475,{atKILLATTR1,  KILLATTR_CMD,    NONE,           IDHDL }
3476#ifdef MDEBUG
3477,{jjpHead,      LEAD_CMD,        POLY_CMD,       POLY_CMD }
3478#else
3479,{jjpHead,      LEAD_CMD,        XS(POLY_CMD),   POLY_CMD }
3480#endif
3481,{jjidHead,     LEAD_CMD,        XS(IDEAL_CMD),  IDEAL_CMD }
3482#ifdef MDEBUG
3483,{jjpHead,      LEAD_CMD,        VECTOR_CMD,     VECTOR_CMD }
3484#else
3485,{jjpHead,      LEAD_CMD,        XS(VECTOR_CMD), VECTOR_CMD }
3486#endif
3487,{jjidHead,     LEAD_CMD,        XS(MODUL_CMD),  MODUL_CMD }
3488,{jjLEADCOEF,   LEADCOEF_CMD,    NUMBER_CMD,     POLY_CMD }
3489,{jjLEADCOEF,   LEADCOEF_CMD,    NUMBER_CMD,     VECTOR_CMD }
3490,{jjLEADEXP,    LEADEXP_CMD,     INTVEC_CMD,     POLY_CMD }
3491,{jjLEADEXP,    LEADEXP_CMD,     INTVEC_CMD,     VECTOR_CMD }
3492,{jjLEADMONOM,  LEADMONOM_CMD,   POLY_CMD,       POLY_CMD }
3493,{jjLEADMONOM,  LEADMONOM_CMD,   VECTOR_CMD,     VECTOR_CMD }
3494,{jjLIB,        LIB_CMD,         NONE,           STRING_CMD }
3495,{jjCALL1MANY,  LIST_CMD,        LIST_CMD,       DEF_CMD }
3496,{jjWRONG,      MAP_CMD,         0,              ANY_TYPE}
3497,{jjDUMMY,      MATRIX_CMD,      MATRIX_CMD,     MATRIX_CMD }
3498,{jjidMaxIdeal, MAXID_CMD,       XS(IDEAL_CMD),  INT_CMD }
3499,{jjMEMORY,     MEMORY_CMD,      INT_CMD,        INT_CMD }
3500,{jjidMinBase,  MINBASE_CMD,     XS(IDEAL_CMD),  IDEAL_CMD }
3501,{jjidMinBase,  MINBASE_CMD,     XS(MODUL_CMD),  MODUL_CMD }
3502,{jjMINRES,     MINRES_CMD,      LIST_CMD,       LIST_CMD }
3503,{jjMINRES_R,   MINRES_CMD,      XS(RESOLUTION_CMD), RESOLUTION_CMD }
3504,{jjDUMMY,      MODUL_CMD,       MODUL_CMD,      MODUL_CMD }
3505,{jjMONITOR1,   MONITOR_CMD,     NONE,           STRING_CMD }
3506,{jjMULT,       MULTIPLICITY_CMD,  INT_CMD,      IDEAL_CMD }
3507,{jjMULT,       MULTIPLICITY_CMD,  INT_CMD,      MODUL_CMD }
3508,{jjMSTD,       MSTD_CMD,        LIST_CMD,       IDEAL_CMD }
3509,{jjNAMEOF,     NAMEOF_CMD,      STRING_CMD,     ANY_TYPE }
3510,{jjNAMES,      NAMES_CMD,       LIST_CMD,       PACKAGE_CMD }
3511,{jjNAMES,      NAMES_CMD,       LIST_CMD,       RING_CMD }
3512,{jjNAMES,      NAMES_CMD,       LIST_CMD,       QRING_CMD }
3513,{jjDUMMY,      NUMBER_CMD,      NUMBER_CMD,     NUMBER_CMD }
3514,{jjP2N,        NUMBER_CMD,      NUMBER_CMD,     POLY_CMD }
3515,{jjRPAR,       NPARS_CMD,       INT_CMD,        RING_CMD }
3516,{jjRPAR,       NPARS_CMD,       INT_CMD,        QRING_CMD }
3517,{jjNVARS,      NVARS_CMD,       INT_CMD,        RING_CMD }
3518,{jjNVARS,      NVARS_CMD,       INT_CMD,        QRING_CMD }
3519,{jjOpenClose,  OPEN_CMD,        NONE,           LINK_CMD }
3520,{jjORD,        ORD_CMD,         INT_CMD,        POLY_CMD }
3521,{jjORD,        ORD_CMD,         INT_CMD,        VECTOR_CMD }
3522,{jjrOrdStr,    ORDSTR_CMD,      XS(STRING_CMD), RING_CMD }
3523,{jjrOrdStr,    ORDSTR_CMD,      XS(STRING_CMD), QRING_CMD }
3524,{jjPAR1,       PAR_CMD,         NUMBER_CMD,     INT_CMD }
3525,{jjPARDEG,     PARDEG_CMD,      INT_CMD,        NUMBER_CMD }
3526,{jjPARSTR1,    PARSTR_CMD,      STRING_CMD,     INT_CMD }
3527,{jjrParStr,    PARSTR_CMD,      XS(STRING_CMD), RING_CMD }
3528,{jjrParStr,    PARSTR_CMD,      XS(STRING_CMD), QRING_CMD }
3529,{jjDUMMY,      POLY_CMD,        POLY_CMD,       POLY_CMD }
3530,{jjPRIME,      PRIME_CMD,       INT_CMD,        INT_CMD }
3531,{jjPRINT_GEN,  PRINT_CMD,       NONE,           INT_CMD }
3532,{jjPRINT_INTVEC,PRINT_CMD,      NONE,           INTVEC_CMD }
3533,{jjPRINT_INTMAT,PRINT_CMD,      NONE,           INTMAT_CMD }
3534,{jjPRINT_GEN,  PRINT_CMD,       NONE,           STRING_CMD }
3535,{jjPRINT_GEN,  PRINT_CMD,       NONE,           POLY_CMD }
3536,{jjPRINT_V,    PRINT_CMD,       NONE,           VECTOR_CMD }
3537,{jjPRINT_GEN,  PRINT_CMD,       NONE,           IDEAL_CMD }
3538,{jjPRINT_MA,   PRINT_CMD,       NONE,           MATRIX_CMD }
3539,{jjPRINT_LIST, PRINT_CMD,       NONE,           LIST_CMD }
3540,{jjPRINT_GEN,  PRINT_CMD,       NONE,           RESOLUTION_CMD }
3541,{jjidMinEmbedding, PRUNE_CMD,   XS(MODUL_CMD),  MODUL_CMD }
3542,{kQHWeight,    QHWEIGHT_CMD,    INTVEC_CMD,     IDEAL_CMD }
3543,{kQHWeight,    QHWEIGHT_CMD,    INTVEC_CMD,     MODUL_CMD }
3544,{jjWRONG,      QRING_CMD,       0,              ANY_TYPE}
3545,{jjREAD,       READ_CMD,        STRING_CMD,     LINK_CMD }
3546,{jjREGULARITY, REGULARITY_CMD,  INT_CMD,        LIST_CMD }
3547,{jjRESERVEDNAME,RESERVEDNAME_CMD, INT_CMD,      STRING_CMD }
3548,{jjL2R,        RESOLUTION_CMD,  RESOLUTION_CMD, LIST_CMD }
3549,{jjDUMMY,      RESOLUTION_CMD,  RESOLUTION_CMD, RESOLUTION_CMD }
3550,{jjWRONG,      ROWS_CMD,        0,              POLY_CMD }
3551,{jjpMaxComp,   ROWS_CMD,        XS(INT_CMD),    VECTOR_CMD }
3552,{jjROWS,       ROWS_CMD,        INT_CMD,        MODUL_CMD }
3553,{jjROWS,       ROWS_CMD,        INT_CMD,        MATRIX_CMD }
3554,{jjROWS_IV,    ROWS_CMD,        INT_CMD,        INTMAT_CMD }
3555,{jjCOUNT_IV,   ROWS_CMD,        INT_CMD,        INTVEC_CMD }
3556,{jjSort_Id,    SORTVEC_CMD,     INTVEC_CMD,     IDEAL_CMD }
3557,{jjSort_Id,    SORTVEC_CMD,     INTVEC_CMD,     MODUL_CMD }
3558,{jjSTD,        STD_CMD,         IDEAL_CMD,      IDEAL_CMD }
3559,{jjSTD,        STD_CMD,         MODUL_CMD,      MODUL_CMD }
3560,{jjDUMMY,      STRING_CMD,      STRING_CMD,     STRING_CMD }
3561,{jjSTRING,     STRING_CMD,      STRING_CMD,     INT_CMD }
3562,{jjSTRING,     STRING_CMD,      STRING_CMD,     POLY_CMD }
3563,{jjSTRING,     STRING_CMD,      STRING_CMD,     VECTOR_CMD }
3564,{jjSTRING,     STRING_CMD,      STRING_CMD,     NUMBER_CMD }
3565,{jjSTRING,     STRING_CMD,      STRING_CMD,     MATRIX_CMD }
3566,{jjSTRING,     STRING_CMD,      STRING_CMD,     MODUL_CMD }
3567,{jjSTRING,     STRING_CMD,      STRING_CMD,     IDEAL_CMD }
3568,{jjSTRING,     STRING_CMD,      STRING_CMD,     MAP_CMD }
3569,{jjSTRING,     STRING_CMD,      STRING_CMD,     INTVEC_CMD }
3570,{jjSTRING,     STRING_CMD,      STRING_CMD,     INTMAT_CMD }
3571,{jjSTRING,     STRING_CMD,      STRING_CMD,     LINK_CMD }
3572,{jjSTRING_PROC,STRING_CMD,      STRING_CMD,     PROC_CMD }
3573,{jjSTRING,     STRING_CMD,      STRING_CMD,     RING_CMD }
3574,{jjSTRING,     STRING_CMD,      STRING_CMD,     QRING_CMD }
3575,{jjSYSTEM,     SYSTEM_CMD,      NONE,           STRING_CMD }
3576,{jjSYZYGY,     SYZYGY_CMD,      MODUL_CMD,      IDEAL_CMD }
3577,{jjSYZYGY,     SYZYGY_CMD,      MODUL_CMD,      MODUL_CMD }
3578,{jjWRONG,      TRACE_CMD,       0,              INTVEC_CMD }
3579,{jjWRONG,      TRACE_CMD,       0,              IDEAL_CMD }
3580,{jjTRACE_IV,   TRACE_CMD,       INT_CMD,        INTMAT_CMD }
3581,{jjmpTrace,    TRACE_CMD,       XS(POLY_CMD),   MATRIX_CMD }
3582,{jjTRANSP_IV,  TRANSPOSE_CMD,   INTMAT_CMD,     INTVEC_CMD }
3583,{jjTRANSP_IV,  TRANSPOSE_CMD,   INTMAT_CMD,     INTMAT_CMD }
3584,{jjmpTransp,   TRANSPOSE_CMD,   XS(MATRIX_CMD), MATRIX_CMD }
3585,{jjidTransp,   TRANSPOSE_CMD,   XS(MODUL_CMD),  MODUL_CMD }
3586,{jjTYPEOF,     TYPEOF_CMD,      STRING_CMD,     ANY_TYPE }
3587,{jjDUMMY,      VECTOR_CMD,      VECTOR_CMD,     VECTOR_CMD }
3588,{jjVDIM,       VDIM_CMD,        INT_CMD,        IDEAL_CMD }
3589,{jjVDIM,       VDIM_CMD,        INT_CMD,        MODUL_CMD }
3590,{jjVAR1,       VAR_CMD,         POLY_CMD,       INT_CMD }
3591,{jjVARSTR1,    VARSTR_CMD,      STRING_CMD,     INT_CMD }
3592,{jjrVarStr,    VARSTR_CMD,      XS(STRING_CMD), RING_CMD }
3593,{jjrVarStr,    VARSTR_CMD,      XS(STRING_CMD), QRING_CMD }
3594,{kWeight,      WEIGHT_CMD,      INTVEC_CMD,     IDEAL_CMD }
3595,{kWeight,      WEIGHT_CMD,      INTVEC_CMD,     MODUL_CMD }
3596,{jjLOAD1,      LOAD_CMD,        NONE,           STRING_CMD }
3597,{NULL,         0,               0,              0}
3598};
3599#undef s
3600/*=================== operations with 3 args.: static proc =================*/
3601static BOOLEAN jjBRACK_S(leftv res, leftv u, leftv v,leftv w)
3602{
3603  char *s= (char *)u->Data();
3604  int   r = (int)v->Data();
3605  int   c = (int)w->Data();
3606  int l = strlen(s);
3607
3608  if ( (r<1) || (r>l) || (c<0) )
3609  {
3610    Werror("wrong range[%d,%d] in string %s",r,c,u->Fullname());
3611    return TRUE;
3612  }
3613  res->data = (char *)AllocL(c+1);
3614  sprintf((char *)res->data,"%-*.*s",c,c,s+r-1);
3615  return FALSE;
3616}
3617static BOOLEAN jjBRACK_Im(leftv res, leftv u, leftv v,leftv w)
3618{
3619  intvec *iv = (intvec *)u->Data();
3620  int   r = (int)v->Data();
3621  int   c = (int)w->Data();
3622  if ((r<1)||(r>iv->rows())||(c<1)||(c>iv->cols()))
3623  {
3624    Werror("wrong range[%d,%d] in intmat %s(%d x %d)",
3625           r,c,u->Fullname(),iv->rows(),iv->cols());
3626    return TRUE;
3627  }
3628  res->data=u->data;
3629  u->data=NULL;
3630  res->rtyp=u->rtyp;
3631  u->rtyp=0;
3632  res->name=u->name;
3633  u->name=NULL;
3634  Subexpr e=jjMakeSub(v);
3635          e->next=jjMakeSub(w);
3636  if (u->e==NULL) res->e=e;
3637  else
3638  {
3639    Subexpr h=u->e;
3640    while (h->next!=NULL) h=h->next;
3641    h->next=e;
3642    res->e=u->e;
3643    u->e=NULL;
3644  }
3645  return FALSE;
3646}
3647static BOOLEAN jjBRACK_Ma(leftv res, leftv u, leftv v,leftv w)
3648{
3649  matrix m= (matrix)u->Data();
3650  int   r = (int)v->Data();
3651  int   c = (int)w->Data();
3652  //Print("gen. elem %d, %d\n",r,c);
3653  if ((r<1)||(r>MATROWS(m))||(c<1)||(c>MATCOLS(m)))
3654  {
3655    Werror("wrong range[%d,%d] in matrix %s(%d x %d)",r,c,u->Fullname(),
3656      MATROWS(m),MATCOLS(m));
3657    return TRUE;
3658  }
3659  res->data=u->data;
3660  u->data=NULL;
3661  res->rtyp=u->rtyp;
3662  u->rtyp=0;
3663  res->name=u->name;
3664  u->name=NULL;
3665  Subexpr e=jjMakeSub(v);
3666          e->next=jjMakeSub(w);
3667  if (u->e==NULL)
3668    res->e=e;
3669  else
3670  {
3671    Subexpr h=u->e;
3672    while (h->next!=NULL) h=h->next;
3673    h->next=e;
3674    res->e=u->e;
3675    u->e=NULL;
3676  }
3677  return FALSE;
3678}
3679static BOOLEAN jjBRACK_Ma_I_IV(leftv res, leftv u, leftv v,leftv w)
3680{
3681  sleftv t;
3682  sleftv ut;
3683  leftv p=NULL;
3684  intvec *iv=(intvec *)w->Data();
3685  int l;
3686  BOOLEAN nok;
3687
3688  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
3689  {
3690    WerrorS("cannot build expression lists from unnamed objects");
3691    return TRUE;
3692  }
3693  memcpy(&ut,u,sizeof(ut));
3694  memset(&t,0,sizeof(t));
3695  t.rtyp=INT_CMD;
3696  for (l=0;l< iv->length(); l++)
3697  {
3698    t.data=(char *)(*iv)[l];
3699    if (p==NULL)
3700    {
3701      p=res;
3702    }
3703    else
3704    {
3705      p->next=(leftv)Alloc0(sizeof(sleftv));
3706      p=p->next;
3707    }
3708    memcpy(u,&ut,sizeof(ut));
3709    if (u->Typ() == MATRIX_CMD)
3710      nok=jjBRACK_Ma(p,u,v,&t);
3711    else /* INTMAT_CMD */
3712      nok=jjBRACK_Im(p,u,v,&t);
3713    if (nok)
3714    {
3715      while (res->next!=NULL)
3716      {
3717        p=res->next->next;
3718        Free((ADDRESS)res->next,sizeof(sleftv));
3719        // res->e aufraeumen !!!!
3720        res->next=p;
3721      }
3722      return TRUE;
3723    }
3724  }
3725  return FALSE;
3726}
3727static BOOLEAN jjBRACK_Ma_IV_I(leftv res, leftv u, leftv v,leftv w)
3728{
3729  sleftv t;
3730  sleftv ut;
3731  leftv p=NULL;
3732  intvec *iv=(intvec *)v->Data();
3733  int l;
3734  BOOLEAN nok;
3735
3736  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
3737  {
3738    WerrorS("cannot build expression lists from unnamed objects");
3739    return TRUE;
3740  }
3741  memcpy(&ut,u,sizeof(ut));
3742  memset(&t,0,sizeof(t));
3743  t.rtyp=INT_CMD;
3744  for (l=0;l< iv->length(); l++)
3745  {
3746    t.data=(char *)((*iv)[l]);
3747    if (p==NULL)
3748    {
3749      p=res;
3750    }
3751    else
3752    {
3753      p->next=(leftv)Alloc0(sizeof(sleftv));
3754      p=p->next;
3755    }
3756    memcpy(u,&ut,sizeof(ut));
3757    if (u->Typ() == MATRIX_CMD)
3758      nok=jjBRACK_Ma(p,u,&t,w);
3759    else /* INTMAT_CMD */
3760      nok=jjBRACK_Im(p,u,&t,w);
3761    if (nok)
3762    {
3763      while (res->next!=NULL)
3764      {
3765        p=res->next->next;
3766        Free((ADDRESS)res->next,sizeof(sleftv));
3767        // res->e aufraeumen !!
3768        res->next=p;
3769      }
3770      return TRUE;
3771    }
3772  }
3773  return FALSE;
3774}
3775static BOOLEAN jjBRACK_Ma_IV_IV(leftv res, leftv u, leftv v,leftv w)
3776{
3777  sleftv t1,t2,ut;
3778  leftv p=NULL;
3779  intvec *vv=(intvec *)v->Data();
3780  intvec *wv=(intvec *)w->Data();
3781  int vl;
3782  int wl;
3783  BOOLEAN nok;
3784
3785  if ((u->rtyp!=IDHDL)||(u->e!=NULL))
3786  {
3787    WerrorS("cannot build expression lists from unnamed objects");
3788    return TRUE;
3789  }
3790  memcpy(&ut,u,sizeof(ut));
3791  memset(&t1,0,sizeof(sleftv));
3792  memset(&t2,0,sizeof(sleftv));
3793  t1.rtyp=INT_CMD;
3794  t2.rtyp=INT_CMD;
3795  for (vl=0;vl< vv->length(); vl++)
3796  {
3797    t1.data=(char *)((*vv)[vl]);
3798    for (wl=0;wl< wv->length(); wl++)
3799    {
3800      t2.data=(char *)((*wv)[wl]);
3801      if (p==NULL)
3802      {
3803        p=res;
3804      }
3805      else
3806      {
3807        p->next=(leftv)Alloc0(sizeof(sleftv));
3808        p=p->next;
3809      }
3810      memcpy(u,&ut,sizeof(ut));
3811      if (u->Typ() == MATRIX_CMD)
3812        nok=jjBRACK_Ma(p,u,&t1,&t2);
3813      else /* INTMAT_CMD */
3814        nok=jjBRACK_Im(p,u,&t1,&t2);
3815      if (nok)
3816      {
3817        res->CleanUp();
3818        return TRUE;
3819      }
3820    }
3821  }
3822  return FALSE;
3823}
3824static BOOLEAN jjPROC3(leftv res, leftv u, leftv v, leftv w)
3825{
3826  v->next=(leftv)Alloc(sizeof(sleftv));
3827  memcpy(v->next,w,sizeof(sleftv));
3828  BOOLEAN r=iiExprArith2(res,u,'(',v);
3829  v->rtyp=0; v->data=NULL;
3830  w->rtyp=0; w->data=NULL;
3831  return r;
3832}
3833static BOOLEAN jjCALL3MANY(leftv res, leftv u, leftv v, leftv w)
3834{
3835  u->next=(leftv)Alloc(sizeof(sleftv));
3836  memcpy(u->next,v,sizeof(sleftv));
3837  u->next->next=(leftv)Alloc(sizeof(sleftv));
3838  memcpy(u->next->next,w,sizeof(sleftv));
3839  BOOLEAN r=iiExprArithM(res,u,iiOp);
3840  v->rtyp=0; v->data=NULL; // iiExprArithM did the CleanUp
3841  w->rtyp=0; w->data=NULL;
3842  return r;
3843}
3844static BOOLEAN jjCOEFFS3_Id(leftv res, leftv u, leftv v, leftv w)
3845{
3846  if ((w->rtyp!=IDHDL)||(w->e!=NULL))
3847  {
3848    WerrorS("3rd argument must be a name of a matrix");
3849    return TRUE;
3850  }
3851  ideal i=(ideal)u->Data();
3852  int rank=(int)i->rank;
3853  BOOLEAN r=jjCOEFFS_Id(res,u,v);
3854  if (r) return TRUE;
3855  mpMonomials((matrix)res->data, rank, pVar((poly)v->Data()),(matrix)w->Data());
3856  return FALSE;
3857}
3858static BOOLEAN jjCOEFFS3_KB(leftv res, leftv u, leftv v, leftv w)
3859{
3860  res->data=(void*)idCoeffOfKBase((ideal)(u->Data()),
3861           (ideal)(v->Data()),(poly)(w->Data()));
3862  return FALSE;
3863}
3864static BOOLEAN jjCOEFFS3_P(leftv res, leftv u, leftv v, leftv w)
3865{
3866  if ((w->rtyp!=IDHDL)||(w->e!=NULL))
3867  {
3868    WerrorS("3rd argument must be a name of a matrix");
3869    return TRUE;
3870  }
3871  poly p=(poly)u->CopyD();
3872  ideal i=idInit(1,1);
3873  i->m[0]=p;
3874  sleftv t;
3875  memset(&t,0,sizeof(t));
3876  t.data=(char *)i;
3877  t.rtyp=IDEAL_CMD;
3878  int rank=1;
3879  if (u->Typ()==VECTOR_CMD)
3880  {
3881    i->rank=rank=pMaxComp(p);
3882    t.rtyp=MODUL_CMD;
3883  }
3884  BOOLEAN r=jjCOEFFS_Id(res,&t,v);
3885  t.CleanUp();
3886  if (r) return TRUE;
3887  mpMonomials((matrix)res->data, rank, pVar((poly)v->Data()),(matrix)w->Data());
3888  return FALSE;
3889}
3890static BOOLEAN jjELIMIN_HILB(leftv res, leftv u, leftv v, leftv w)
3891{
3892  res->data=(char *)idElimination((ideal)u->Data(),(poly)v->Data(),
3893    (intvec *)w->Data());
3894  setFlag(res,FLAG_STD);
3895  return FALSE;
3896}
3897static BOOLEAN jjFIND3(leftv res, leftv u, leftv v, leftv w)
3898{
3899  /*4
3900  * look for the substring what in the string where
3901  * starting at position n
3902  * return the position of the first char of what in where
3903  * or 0
3904  */
3905  int n=(int)w->Data();
3906  char *where=(char *)u->Data();
3907  char *what=(char *)v->Data();
3908  char *found;
3909  if ((1>n)||(n>(int)strlen(where)))
3910  {
3911    Werror("start position %d out of range",n);
3912    return TRUE;
3913  }
3914  found = strchr(where+n-1,*what);
3915  if (*(what+1)!='\0')
3916  {
3917    while((found !=NULL) && (strncmp(found+1,what+1,strlen(what+1))!=0))
3918    {
3919      found=strchr(found+1,*what);
3920    }
3921  }
3922  if (found != NULL)
3923  {
3924    res->data=(char *)((found-where)+1);
3925  }
3926  return FALSE;
3927}
3928static BOOLEAN jjJET_P_IV(leftv res, leftv u, leftv v, leftv w)
3929{
3930  short *iw=iv2array((intvec *)w->Data());
3931  res->data = (char *)pJetW((poly)u->Data(),(int)v->Data(),iw);
3932  Free((ADDRESS)iw,(pVariables+1)*sizeof(short));
3933  return FALSE;
3934}
3935static BOOLEAN jjJET_ID_IV(leftv res, leftv u, leftv v, leftv w)
3936{
3937  res->data = (char *)idJetW((ideal)u->Data(),(int)v->Data(),
3938                             (intvec *)w->Data());
3939  return FALSE;
3940}
3941static BOOLEAN jjPREIMAGE(leftv res, leftv u, leftv v, leftv w)
3942{
3943  idhdl h;
3944  ring rr;
3945  map mapping;
3946
3947  if ((v->name==NULL) || (w->name==NULL))
3948  {
3949    WerrorS("2nd/3rd arguments must have names");
3950    return TRUE;
3951  }
3952  rr=(ring)u->Data();
3953  const char *ring_name=u->Name();
3954  if ((h=rr->idroot->get(v->name,myynest))!=NULL)
3955  {
3956    if (h->typ==MAP_CMD)
3957    {
3958      mapping=IDMAP(h);
3959    }
3960    else if (h->typ==IDEAL_CMD)
3961    {
3962      mapping=IDMAP(h);
3963    }
3964    else
3965    {
3966      Werror("`%s` is no map nor ideal",IDID(h));
3967      return TRUE;
3968    }
3969  }
3970  else
3971  {
3972    Werror("`%s` is not defined in `%s`",v->name,ring_name);
3973    return TRUE;
3974  }
3975  if ((h=rr->idroot->get(w->name,myynest))!=NULL)
3976  {
3977    if (h->typ==IDEAL_CMD)
3978    {
3979      res->data=(char *)maGetPreimage(rr,mapping,IDIDEAL(h));
3980    }
3981    else
3982    {
3983      Werror("`%s` is no ideal",IDID(h));
3984      return TRUE;
3985    }
3986  }
3987  else
3988  {
3989    Werror("`%s` is not defined in `%s`",w->name,ring_name);
3990    return TRUE;
3991  }
3992  return FALSE;
3993}
3994static BOOLEAN jjRANDOM_Im(leftv res, leftv u, leftv v, leftv w)
3995{
3996  int di, k;
3997  int i=(int)u->Data();
3998  int r=(int)v->Data();
3999  int c=(int)w->Data();
4000  intvec *iv = new intvec(r, c, 0);
4001  if (iv->rows()==0)
4002  {
4003    delete iv;
4004    return TRUE;
4005  }
4006  if (i!=0)
4007  {
4008    if (i<0) i = -i;
4009    di = 2 * i + 1;
4010    for (k=0; k<iv->length(); k++)
4011    {
4012#ifdef buildin_rand
4013      (*iv)[k] = ((siRand() % di) - i);
4014#else
4015      (*iv)[k] = ((rand() % di) - i);
4016#endif
4017    }
4018  }
4019  res->data = (char *)iv;
4020  return FALSE;
4021}
4022static BOOLEAN jjSUBST_Test(leftv v,leftv w,
4023  int &ringvar, poly &monomexpr)
4024{
4025  monomexpr=(poly)w->Data();
4026  if (pLength(monomexpr)>1)
4027  {
4028    Werror("`%s` substitutes a ringvar only by a term",
4029      Tok2Cmdname(SUBST_CMD));
4030    return TRUE;
4031  }
4032  if (!(ringvar=pVar((poly)v->Data())))
4033  {
4034    WerrorS("ringvar expected");
4035    return TRUE;
4036  }
4037  return FALSE;
4038}
4039static BOOLEAN jjSUBST_P(leftv res, leftv u, leftv v,leftv w)
4040{
4041  int ringvar;
4042  poly monomexpr;
4043  BOOLEAN nok=jjSUBST_Test(v,w,ringvar,monomexpr);
4044  if (nok) return TRUE;
4045  res->data = pSubst((poly)u->CopyD(POLY_CMD),ringvar,monomexpr);
4046  return FALSE;
4047}
4048static BOOLEAN jjSUBST_Id(leftv res, leftv u, leftv v,leftv w)
4049{
4050  int ringvar;
4051  poly monomexpr;
4052  BOOLEAN nok=jjSUBST_Test(v,w,ringvar,monomexpr);
4053  if (nok) return TRUE;
4054  res->data = idSubst((ideal)u->CopyD(IDEAL_CMD),ringvar,monomexpr);
4055  return FALSE;
4056}
4057static BOOLEAN jjMATRIX_Id(leftv res, leftv u, leftv v,leftv w)
4058{
4059  matrix m=mpNew((int)v->Data(),(int)w->Data());
4060  ideal I=(ideal)u->CopyD(IDEAL_CMD);
4061  int i=min(IDELEMS(I),(int)v->Data()*(int)w->Data());
4062  //for(i=i-1;i>=0;i--)
4063  //{
4064  //  m->m[i]=I->m[i];
4065  //  I->m[i]=NULL;
4066  //}
4067  memcpy4(m->m,I->m,i*sizeof(poly));
4068  memset(I->m,0,i*sizeof(poly));
4069  idDelete(&I);
4070  res->data = (char *)m;
4071  return FALSE;
4072}
4073static BOOLEAN jjMATRIX_Mo(leftv res, leftv u, leftv v,leftv w)
4074{
4075  res->data = (char *)idModule2formatedMatrix((ideal)u->CopyD(MODUL_CMD),
4076           (int)v->Data(),(int)w->Data());
4077  return FALSE;
4078}
4079static BOOLEAN jjMATRIX_Ma(leftv res, leftv u, leftv v,leftv w)
4080{
4081  matrix m=mpNew((int)v->Data(),(int)w->Data());
4082  matrix I=(matrix)u->CopyD(MATRIX_CMD);
4083  int r=min(MATROWS(I),(int)v->Data());
4084  int c=min(MATCOLS(I),(int)w->Data());
4085  int i,j;
4086  for(i=r;i>0;i--)
4087  {
4088    for(j=c;j>0;j--)
4089    {
4090      MATELEM(m,i,j)=MATELEM(I,i,j);
4091      MATELEM(I,i,j)=NULL;
4092    }
4093  }
4094  idDelete((ideal *)&I);
4095  res->data = (char *)m;
4096  return FALSE;
4097}
4098static BOOLEAN jjLIFT3(leftv res, leftv u, leftv v, leftv w)
4099{
4100  int sw=(int)w->Data();
4101  if (sw==0)
4102  {
4103    return jjLIFT(res,u,v);
4104  }
4105  else
4106  {
4107    ideal m;
4108    ideal ui=(ideal)u->Data();
4109    ideal vi=(ideal)v->Data();
4110    int ul= IDELEMS(ui);
4111    int vl= IDELEMS(vi);
4112    m = idLiftNonStB(ui,vi, sw);
4113    res->data = (char *)idModule2formatedMatrix(m,ul,vl);
4114  }
4115  return FALSE;
4116}
4117static BOOLEAN jjREDUCE3_P(leftv res, leftv u, leftv v, leftv w)
4118{
4119  assumeStdFlag(v);
4120  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(poly)u->Data(),
4121    0,(int)w->Data());
4122  return FALSE;
4123}
4124static BOOLEAN jjREDUCE3_ID(leftv res, leftv u, leftv v, leftv w)
4125{
4126  assumeStdFlag(v);
4127  res->data = (char *)kNF((ideal)v->Data(),currQuotient,(ideal)u->Data(),
4128    0,(int)w->Data());
4129  return FALSE;
4130}
4131#ifdef OLD_RES
4132static BOOLEAN jjRES3(leftv res, leftv u, leftv v, leftv w)
4133{
4134  int maxl=(int)v->Data();
4135  int l=0;
4136  resolvente r;
4137  intvec **weights=NULL;
4138  int wmaxl=maxl;
4139  maxl--;
4140  if ((maxl==-1) && (iiOp!=MRES_CMD))
4141    maxl = pVariables-1;
4142  if ((iiOp == RES_CMD) || (iiOp == MRES_CMD))
4143  {
4144    if (BTEST1(28))
4145    {
4146      r=syMinRes((ideal)u->Data(),maxl,&l,iiOp==MRES_CMD);
4147    }
4148    else
4149    {
4150      intvec * iv=(intvec*)atGet(u,"isHomog");
4151      if (iv!=NULL)
4152      {
4153        weights = (intvec**)Alloc0(sizeof(intvec*));
4154        weights[0] = ivCopy(iv);
4155        l=1;
4156      }
4157      r=syResolvente((ideal)u->Data(),maxl,&l, &weights, iiOp==MRES_CMD);
4158    }
4159  }
4160  else
4161    r=sySchreyerResolvente((ideal)u->Data(),maxl+1,&l);
4162  if (r==NULL) return TRUE;
4163  int t3=u->Typ();
4164  iiMakeResolv(r,l,wmaxl,w->name,t3,weights);
4165  return FALSE;
4166  return TRUE;
4167}
4168#endif
4169static BOOLEAN jjSTATUS3(leftv res, leftv u, leftv v, leftv w)
4170{
4171  int yes;
4172  jjSTATUS2(res, u, v);
4173  yes = (strcmp((char *) res->data, (char *) w->Data()) == 0);
4174  FreeL((ADDRESS) res->data);
4175  res->data = (void *) yes;
4176  return FALSE;
4177}
4178static BOOLEAN jjSTD_HILB_W(leftv res, leftv u, leftv v, leftv w)
4179{
4180  ideal result;
4181  intvec *ww=(intvec *)atGet(u,"isHomog");
4182  tHomog hom=testHomog;
4183  if (ww!=NULL)
4184  {
4185    ww=ivCopy(ww);
4186    hom=isHomog;
4187  }
4188  result=kStd((ideal)(u->Data()),
4189              currQuotient,
4190              hom,
4191              &ww,                  // module weights
4192              (intvec *)v->Data(),  // hilbert series
4193              0,0,                  // syzComp, newIdeal
4194              (intvec *)w->Data()); // weights of vars
4195  idSkipZeroes(result);
4196  res->data = (char *)result;
4197  setFlag(res,FLAG_STD);
4198  if (ww!=NULL) atSet(res,mstrdup("isHomog"),ww,INTVEC_CMD);
4199  return FALSE;
4200}
4201
4202/*=================== operations with 3 args.: table =================*/
4203struct sValCmd3 dArith3[]=
4204{
4205// operations:
4206// proc             cmd          res         arg1        arg2        arg3
4207 {jjBRACK_S,        '[',        STRING_CMD, STRING_CMD, INT_CMD,    INT_CMD }
4208,{jjBRACK_Im,       '[',        INT_CMD,    INTMAT_CMD, INT_CMD,    INT_CMD }
4209,{jjBRACK_Ma_I_IV,  '[',        INT_CMD,    INTMAT_CMD, INT_CMD,    INTVEC_CMD }
4210,{jjBRACK_Ma_IV_I,  '[',        INT_CMD,    INTMAT_CMD, INTVEC_CMD, INT_CMD }
4211,{jjBRACK_Ma_IV_IV, '[',        INT_CMD,    INTMAT_CMD, INTVEC_CMD, INTVEC_CMD }
4212,{jjBRACK_Ma,       '[',        POLY_CMD,   MATRIX_CMD, INT_CMD,    INT_CMD }
4213,{jjBRACK_Ma_I_IV,  '[',        POLY_CMD,   MATRIX_CMD, INT_CMD,    INTVEC_CMD }
4214,{jjBRACK_Ma_IV_I,  '[',        POLY_CMD,   MATRIX_CMD, INTVEC_CMD, INT_CMD }
4215,{jjBRACK_Ma_IV_IV, '[',        POLY_CMD,   MATRIX_CMD, INTVEC_CMD, INTVEC_CMD }
4216,{jjPROC3,          '(',        ANY_TYPE,   PROC_CMD,   DEF_CMD,    DEF_CMD }
4217,{atATTRIB3,        ATTRIB_CMD, NONE,       IDHDL,      STRING_CMD, DEF_CMD }
4218,{jjCOEFFS3_P,      COEFFS_CMD, MATRIX_CMD, POLY_CMD,   POLY_CMD,   MATRIX_CMD }
4219,{jjCOEFFS3_P,      COEFFS_CMD, MATRIX_CMD, VECTOR_CMD, POLY_CMD,   MATRIX_CMD }
4220,{jjCOEFFS3_Id,     COEFFS_CMD, MATRIX_CMD, IDEAL_CMD,  POLY_CMD,   MATRIX_CMD }
4221,{jjCOEFFS3_Id,     COEFFS_CMD, MATRIX_CMD, MODUL_CMD,  POLY_CMD,   MATRIX_CMD }
4222,{jjCOEFFS3_KB,     COEFFS_CMD, MATRIX_CMD, IDEAL_CMD,  IDEAL_CMD,  POLY_CMD }
4223,{jjCOEFFS3_KB,     COEFFS_CMD, MATRIX_CMD, MODUL_CMD,  MODUL_CMD,  POLY_CMD }
4224,{jjELIMIN_HILB,    ELIMINATION_CMD,IDEAL_CMD, IDEAL_CMD, POLY_CMD, INTVEC_CMD }
4225,{jjFIND3,          FIND_CMD,   INT_CMD,    STRING_CMD, STRING_CMD, INT_CMD }
4226,{jjCALL3MANY,      IDEAL_CMD,  IDEAL_CMD,  DEF_CMD,    DEF_CMD,    DEF_CMD }
4227//,{jjCALL3MANY,      INTERSECT_CMD,  NONE,   DEF_CMD,    DEF_CMD,    DEF_CMD }
4228,{lInsert3,         INSERT_CMD, LIST_CMD,   LIST_CMD,   DEF_CMD,    INT_CMD }
4229,{jjCALL3MANY,      INTVEC_CMD, INTVEC_CMD, DEF_CMD,    DEF_CMD,    DEF_CMD }
4230,{jjJET_P_IV,       JET_CMD,    POLY_CMD,   POLY_CMD,   INT_CMD,    INTVEC_CMD }
4231,{jjJET_ID_IV,      JET_CMD,    IDEAL_CMD,  IDEAL_CMD,  INT_CMD,    INTVEC_CMD }
4232,{jjJET_P_IV,       JET_CMD,    VECTOR_CMD, VECTOR_CMD, INT_CMD,    INTVEC_CMD }
4233,{jjJET_ID_IV,      JET_CMD,    MODUL_CMD,  MODUL_CMD,  INT_CMD,    INTVEC_CMD }
4234,{mpKoszul,         KOSZUL_CMD, MATRIX_CMD, INT_CMD,    INT_CMD,    IDEAL_CMD }
4235,{jjCALL3MANY,      LIST_CMD,   LIST_CMD,   DEF_CMD,    DEF_CMD,    DEF_CMD }
4236,{jjMATRIX_Id,      MATRIX_CMD, MATRIX_CMD, IDEAL_CMD,  INT_CMD,    INT_CMD }
4237,{jjMATRIX_Mo,      MATRIX_CMD, MATRIX_CMD, MODUL_CMD,  INT_CMD,    INT_CMD }
4238,{jjMATRIX_Ma,      MATRIX_CMD, MATRIX_CMD, MATRIX_CMD, INT_CMD,    INT_CMD }
4239,{jjCALL3MANY,      MODUL_CMD,  MODUL_CMD,  DEF_CMD,    DEF_CMD,    DEF_CMD }
4240#ifdef OLD_RES
4241,{jjRES3,           MRES_CMD,   NONE,       IDEAL_CMD,  INT_CMD,    ANY_TYPE }
4242,{jjRES3,           MRES_CMD,   NONE,       MODUL_CMD,  INT_CMD,    ANY_TYPE }
4243#endif
4244,{jjLIFT3,          LIFT_CMD,   MATRIX_CMD, IDEAL_CMD,  IDEAL_CMD,  INT_CMD }
4245,{jjPREIMAGE,       PREIMAGE_CMD, IDEAL_CMD, RING_CMD,  ANY_TYPE,   ANY_TYPE }
4246,{jjPREIMAGE,       PREIMAGE_CMD, IDEAL_CMD, QRING_CMD, ANY_TYPE,   ANY_TYPE }
4247,{jjRANDOM_Im,      RANDOM_CMD, INTMAT_CMD, INT_CMD,    INT_CMD,    INT_CMD }
4248,{jjREDUCE3_P,      REDUCE_CMD, POLY_CMD,   POLY_CMD,   IDEAL_CMD,  INT_CMD }
4249,{jjREDUCE3_P,      REDUCE_CMD, VECTOR_CMD, VECTOR_CMD, IDEAL_CMD,  INT_CMD }
4250,{jjREDUCE3_P,      REDUCE_CMD, VECTOR_CMD, VECTOR_CMD, MODUL_CMD,  INT_CMD }
4251,{jjREDUCE3_ID,     REDUCE_CMD, IDEAL_CMD,  IDEAL_CMD,  IDEAL_CMD,  INT_CMD }
4252,{jjREDUCE3_ID,     REDUCE_CMD, MODUL_CMD,  MODUL_CMD,  MODUL_CMD,  INT_CMD }
4253,{jjREDUCE3_ID,     REDUCE_CMD, MODUL_CMD,  MODUL_CMD,  IDEAL_CMD,  INT_CMD }
4254#ifdef OLD_RES
4255,{jjRES3,           RES_CMD,    NONE,       IDEAL_CMD,  INT_CMD,    ANY_TYPE }
4256,{jjRES3,           RES_CMD,    NONE,       MODUL_CMD,  INT_CMD,    ANY_TYPE }
4257#endif
4258#ifdef HAVE_FACTORY
4259,{jjRESULTANT,      RESULTANT_CMD, POLY_CMD,POLY_CMD,   POLY_CMD,   POLY_CMD }
4260#else
4261,{jjWRONG3,         RESULTANT_CMD, POLY_CMD,POLY_CMD,   POLY_CMD,   POLY_CMD }
4262#endif
4263#ifdef OLD_RES
4264,{jjRES3,           SRES_CMD,   NONE,       IDEAL_CMD,  INT_CMD,    ANY_TYPE }
4265,{jjRES3,           SRES_CMD,   NONE,       MODUL_CMD,  INT_CMD,    ANY_TYPE }
4266#endif
4267,{jjSTATUS3,        STATUS_CMD, INT_CMD,    LINK_CMD,   STRING_CMD, STRING_CMD}
4268,{jjSTD_HILB_W,     STD_CMD,    IDEAL_CMD,  IDEAL_CMD,  INTVEC_CMD, INTVEC_CMD}
4269,{jjSTD_HILB_W,     STD_CMD,    MODUL_CMD,  MODUL_CMD,  INTVEC_CMD, INTVEC_CMD}
4270,{jjSUBST_P,        SUBST_CMD,  POLY_CMD,   POLY_CMD,   POLY_CMD,   POLY_CMD }
4271,{jjSUBST_P,        SUBST_CMD,  VECTOR_CMD, VECTOR_CMD, POLY_CMD,   POLY_CMD }
4272,{jjSUBST_Id,       SUBST_CMD,  IDEAL_CMD,  IDEAL_CMD,  POLY_CMD,   POLY_CMD }
4273,{jjSUBST_Id,       SUBST_CMD,  MODUL_CMD,  MODUL_CMD,  POLY_CMD,   POLY_CMD }
4274,{jjSUBST_Id,       SUBST_CMD,  MATRIX_CMD, MATRIX_CMD, POLY_CMD,   POLY_CMD }
4275,{jjCALL3MANY,      SYSTEM_CMD, NONE,       STRING_CMD, DEF_CMD,    DEF_CMD }
4276,{NULL,             0,          0,          0,          0,          0 }
4277};
4278/*=================== operations with many arg.: static proc =================*/
4279static BOOLEAN jjCALL1ARG(leftv res, leftv v)
4280{
4281  return iiExprArith1(res,v,iiOp);
4282}
4283static BOOLEAN jjCALL2ARG(leftv res, leftv u)
4284{
4285  leftv v=u->next;
4286  u->next=NULL;
4287  BOOLEAN b=iiExprArith2(res,u,iiOp,v);
4288  u->next=v;
4289  return b;
4290}
4291static BOOLEAN jjCALL3ARG(leftv res, leftv u)
4292{
4293  leftv v = u->next;
4294  leftv w = v->next;
4295  u->next = NULL;
4296  v->next = NULL;
4297  BOOLEAN b = iiExprArith3(res, iiOp, u, v, w);
4298  u->next = v;
4299  v->next = w;
4300  return b;
4301}
4302
4303static BOOLEAN jjCOEF_M(leftv res, leftv v)
4304{
4305  if((v->Typ() != VECTOR_CMD)
4306  || (v->next->Typ() != POLY_CMD)
4307  || (v->next->next->Typ() != MATRIX_CMD)
4308  || (v->next->next->next->Typ() != MATRIX_CMD))
4309     return TRUE;
4310  if (v->next->next->rtyp!=IDHDL) return TRUE;
4311  idhdl c=(idhdl)v->next->next->data;
4312  if (v->next->next->next->rtyp!=IDHDL) return TRUE;
4313  idhdl m=(idhdl)v->next->next->next->data;
4314  idDelete((ideal *)&(c->data.uideal));
4315  idDelete((ideal *)&(m->data.uideal));
4316  mpCoef2((poly)v->Data(),(poly)v->next->Data(),
4317    (matrix *)&(c->data.umatrix),(matrix *)&(m->data.umatrix));
4318  return FALSE;
4319}
4320static BOOLEAN jjIDEAL_PL(leftv res, leftv v)
4321{
4322  int s=1;
4323  leftv h=v;
4324  if (h!=NULL) s=exprlist_length(h);
4325  ideal id=idInit(s,1);
4326  int rank=1;
4327  int i=0;
4328  poly p=NULL;
4329  while (h!=NULL)
4330  {
4331    switch(h->Typ())
4332    {
4333      case POLY_CMD:
4334      {
4335        p=(poly)h->CopyD();
4336        break;
4337      }
4338      case INT_CMD:
4339      {
4340        number n=nInit((int)h->Data());
4341        if (!nIsZero(n))
4342        {
4343          p=pOne();
4344          pSetCoeff(p,n);
4345        }
4346        else
4347        {
4348          //p=NULL;
4349          nDelete(&n);
4350        }
4351        break;
4352      }
4353      case NUMBER_CMD:
4354      {
4355        number n=(number)h->CopyD();
4356        if (!nIsZero(n))
4357        {
4358          p=pOne();
4359          pSetCoeff(p,n);
4360        }
4361        else
4362        {
4363          //p=NULL;
4364          nDelete(&n);
4365        }
4366        break;
4367      }
4368      case VECTOR_CMD:
4369      {
4370        p=(poly)h->CopyD();
4371        if (iiOp!=MODUL_CMD)
4372        {
4373          idDelete(&id);
4374          pDelete(&p);
4375          return TRUE;
4376        }
4377        rank=max(rank,pMaxComp(p));
4378        break;
4379      }
4380      default:
4381      {
4382        idDelete(&id);
4383        return TRUE;
4384      }
4385    }
4386    if ((iiOp==MODUL_CMD)&&(p!=NULL)&&(pGetComp(p)==0))
4387    {
4388      pSetCompP(p,1);
4389    }
4390    id->m[i]=p;
4391    i++;
4392    h=h->next;
4393  }
4394  id->rank=rank;
4395  res->data=(char *)id;
4396  return FALSE;
4397}
4398static BOOLEAN jjINTERSECT_PL(leftv res, leftv v)
4399{
4400  leftv h=v;
4401  int l=v->listLength();
4402  resolvente r=(resolvente)Alloc0(l*sizeof(ideal));
4403  BOOLEAN *copied=(BOOLEAN *)Alloc0(l*sizeof(BOOLEAN));
4404  int t=0;
4405  // try to convert to IDEAL_CMD
4406  while (h!=NULL)
4407  {
4408    if (iiTestConvert(h->Typ(),IDEAL_CMD)!=0)
4409    {
4410      t=IDEAL_CMD;
4411    }
4412    else break;
4413    h=h->next;
4414  }
4415  // if failure, try MODUL_CMD
4416  if (t==0)
4417  {
4418    h=v;
4419    while (h!=NULL)
4420    {
4421      if (iiTestConvert(h->Typ(),MODUL_CMD)!=0)
4422      {
4423        t=MODUL_CMD;
4424      }
4425      else break;
4426      h=h->next;
4427    }
4428  }
4429  // check for success  in converting
4430  if (t==0)
4431  {
4432    WerrorS("cannot convert to ideal or module");
4433    return TRUE;
4434  }
4435  // call idMultSect
4436  h=v;
4437  int i=0;
4438  sleftv tmp;
4439  while (h!=NULL)
4440  {
4441    if (h->Typ()==t)
4442    {
4443      r[i]=(ideal)h->Data(); /*no copy*/
4444      h=h->next;
4445    }
4446    else if(iiConvert(h->Typ(),t,iiTestConvert(h->Typ(),t),h,&tmp))
4447    {
4448      Free((ADDRESS)copied,l*sizeof(BOOLEAN));
4449      Free((ADDRESS)r,l*sizeof(ideal));
4450      Werror("cannot convert arg. %d to %s",i+1,Tok2Cmdname(t));
4451      return TRUE;
4452    }
4453    else
4454    {
4455      r[i]=(ideal)tmp.Data(); /*now it's a copy*/
4456      copied[i]=TRUE;
4457      h=tmp.next;
4458    }
4459    i++;
4460  }
4461  res->rtyp=t;
4462  res->data=(char *)idMultSect(r,i);
4463  while(i>0)
4464  {
4465    i--;
4466    if (copied[i]) idDelete(&(r[i]));
4467  }
4468  Free((ADDRESS)copied,l*sizeof(BOOLEAN));
4469  Free((ADDRESS)r,l*sizeof(ideal));
4470  return FALSE;
4471}
4472static BOOLEAN jjINTVEC_PL(leftv res, leftv v)
4473{
4474  int i=0;
4475  leftv h=v;
4476  if (h!=NULL) i=exprlist_length(h);
4477  intvec *iv=new intvec(i);
4478  i=0;
4479  while (h!=NULL)
4480  {
4481    if(h->Typ()==INT_CMD)
4482    {
4483      (*iv)[i]=(int)h->Data();
4484    }
4485    else
4486    {
4487      delete iv;
4488      return TRUE;
4489    }
4490    i++;
4491    h=h->next;
4492  }
4493  res->data=(char *)iv;
4494  return FALSE;
4495}
4496static BOOLEAN jjKLAMMER_PL(leftv res, leftv u)
4497{
4498  leftv v=u->next;
4499  BOOLEAN b;
4500  if(v==NULL)
4501    b=iiExprArith1(res,u,iiOp);
4502  else
4503  {
4504    u->next=NULL;
4505    b=iiExprArith2(res,u,iiOp,v);
4506    u->next=v;
4507  }
4508  return b;
4509}
4510static BOOLEAN jjLIST_PL(leftv res, leftv v)
4511{
4512  int sl=0;
4513  if (v!=NULL) sl = v->listLength();
4514  lists L;
4515  if((sl==1)&&(v->Typ()==RESOLUTION_CMD))
4516  {
4517    L=syConvRes((syStrategy)v->Data());
4518  }
4519  else
4520  {
4521    L=(lists)Alloc(sizeof(slists));
4522    leftv h=NULL;
4523    int i;
4524    int rt;
4525
4526    L->Init(sl);
4527    for (i=0;i<sl;i++)
4528    {
4529      if (h!=NULL) { /* e.g. not in the first step:
4530                     * h is the pointer to the old sleftv,
4531                     * v is the pointer to the next sleftv
4532                     * (in this moment) */
4533                     h->next=v;
4534                   }
4535      h=v;
4536      v=v->next;
4537      h->next=NULL;
4538      rt=h->Typ();
4539      if (rt==0)
4540      {
4541        L->Clean();
4542        Werror("`%s` is undefined",h->Fullname());
4543        return TRUE;
4544      }
4545      if ((rt==RING_CMD)||(rt==QRING_CMD))
4546      {
4547        L->m[i].rtyp=rt;
4548        L->m[i].data=h->Data();
4549        ((ring)L->m[i].data)->ref++;
4550      }
4551      else
4552        L->m[i].Copy(h);
4553    }
4554  }
4555  res->data=(char *)L;
4556  return FALSE;
4557}
4558static BOOLEAN jjNAMES0(leftv res, leftv v)
4559{
4560  res->data=(void *)ipNameList(IDROOT);
4561  return FALSE;
4562}
4563static BOOLEAN jjOPTION_PL(leftv res, leftv v)
4564{
4565  if(v==NULL)
4566  {
4567    res->data=(char *)showOption();
4568    return FALSE;
4569  }
4570  res->rtyp=NONE;
4571  return setOption(res,v);
4572}
4573static BOOLEAN jjRESERVED0(leftv res, leftv v)
4574{
4575  int i=1;
4576  loop
4577  {
4578    Print("%-20s",cmds[i].name);
4579    i++;
4580    if(cmds[i].name==NULL)
4581      break;
4582    if ((i%3)==1) PrintLn();
4583  }
4584  PrintLn();
4585  return FALSE;
4586}
4587static BOOLEAN jjSTRING_PL(leftv res, leftv v)
4588{
4589  if ((v!=NULL)&&(v->next==NULL))
4590    return iiExprArith1(res,v,iiOp);
4591  int sl=0;
4592  leftv h=v,nachher;
4593  sleftv tmpR;
4594  BOOLEAN bo;
4595  char *sum=NULL;
4596  while(h!=NULL)
4597  {
4598    /* convert to string =================================*/
4599    nachher=h->next;
4600    h->next=NULL;
4601    bo=iiExprArith1(&tmpR,h,iiOp);
4602    if(bo)
4603    {
4604      h->next=nachher;
4605      FreeL(sum);
4606      return TRUE;
4607    }
4608    /* append to 'sum' =================================*/
4609    if(sum==NULL)
4610    {
4611      sum=(char *)tmpR.data;
4612      sl=strlen(sum);
4613    }
4614    else
4615    {
4616      int nl=strlen((char *)tmpR.data);
4617      char *s=(char *)AllocL(sl+nl+1);
4618      memcpy(s,sum,sl);
4619      memcpy(s+sl,(char *)tmpR.data,nl);
4620      s[sl+nl]='\0';
4621      sl+=nl;
4622      FreeL(sum);
4623      sum=s;
4624    }
4625    /* next sleftv =================================*/
4626    h->next=nachher;
4627    h=nachher;
4628  }
4629  if (sum==NULL) sum=mstrdup("");
4630  res->data=(char *)sum;
4631  return FALSE;
4632}
4633static BOOLEAN jjTEST(leftv res, leftv v)
4634{
4635  do
4636  {
4637    if (v->Typ()!=INT_CMD)
4638      return TRUE;
4639    test_cmd((int)v->Data());
4640    v=v->next;
4641  }
4642  while (v!=NULL);
4643  return FALSE;
4644}
4645
4646#ifndef __MWERKS__
4647static BOOLEAN jjSTATUS_M(leftv res, leftv v)
4648{
4649  if ((v->Typ() != LINK_CMD) ||
4650      (v->next->Typ() != STRING_CMD) ||
4651      (v->next->next->Typ() != STRING_CMD) ||
4652      (v->next->next->next->Typ() != INT_CMD))
4653    return TRUE;
4654  jjSTATUS3(res, v, v->next, v->next->next);
4655#if defined(HAVE_USLEEP)
4656  if (((int) res->data) == 0)
4657  {
4658    int i_s = (int) v->next->next->next->Data();
4659    if (i_s > 0)
4660    {
4661      usleep((int) v->next->next->next->Data());
4662      jjSTATUS3(res, v, v->next, v->next->next);
4663    }
4664  }
4665#elif defined(HAVE_SLEEP)
4666  if (((int) res->data) == 0)
4667  {
4668    int i_s = (int) v->next->next->next->Data();
4669    if (i_s > 0)
4670    {
4671      sleep((is - 1)/1000000 + 1);
4672      jjSTATUS3(res, v, v->next, v->next->next);
4673    }
4674  }
4675#endif
4676  return FALSE;
4677}
4678#endif
4679
4680#ifdef HAVE_NAMESPACES
4681static BOOLEAN jjIMPORTFROM(leftv res, leftv v);
4682
4683static BOOLEAN jjEXPORTTO(leftv res, leftv v)
4684{
4685  BOOLEAN nok=TRUE;
4686  leftv u=v;
4687  if(u->rtyp==NSHDL)
4688  {
4689    namehdl ns = (namehdl)(u->data);
4690    idhdl h = namespaceroot->root->get(ns->name, 0, TRUE);
4691    //Print("Export to '%s', lev %d\n", ns->name, ns->myynest);
4692    while(v->next!=NULL)
4693    {
4694      nok = iiInternalExport(v->next, ns->myynest, h);
4695      if(nok) { return nok; }
4696
4697      v = v->next;
4698    }
4699    return FALSE;
4700  }
4701  if(u->Typ()==PACKAGE_CMD)
4702  {
4703    //PrintS("export to package\n");
4704    while(v->next!=NULL)
4705    {
4706      nok = iiInternalExport(v->next, 0, u->data);
4707      if(nok) return nok;
4708      v = v->next;
4709    }
4710    return FALSE;
4711  }
4712  return TRUE;
4713}
4714#endif /* HAVE_NAMESPACES */
4715#ifdef HAVE_NAMESPACES
4716static BOOLEAN jjIMPORTFROM(leftv res, leftv v)
4717{
4718  BOOLEAN nok=FALSE;
4719  PrintS("jjIMPORT_FROM()\n");
4720  if(v->rtyp==NSHDL)
4721  {
4722    PrintS("Import from toplevel\n");
4723//While-schleife!!!
4724    return FALSE;
4725  }
4726  if(v->Typ()==PACKAGE_CMD)
4727  {
4728    Print("Import from package %s\n", v->name);
4729    while(v->next!=NULL)
4730    {
4731      //nok = iiInternalImport(v->next, 0, v->data);
4732      if(nok) return nok;
4733      v = v->next;
4734    }
4735    return FALSE;
4736  }
4737  return TRUE;
4738}
4739#endif
4740#ifdef HAVE_NAMESPACES
4741static BOOLEAN jjUNLOAD(leftv res, leftv v)
4742{
4743  if(v->Typ()==PACKAGE_CMD)
4744  {
4745    char *typ;
4746    idhdl h = (idhdl)v->data;
4747    package d=(package)v->Data();
4748    switch (d->language)
4749    {
4750      case LANG_C:
4751        typ="object";
4752        break;
4753      case LANG_SINGULAR:
4754      case LANG_NONE:
4755      default:
4756        killhdl(h);
4757    }
4758    return FALSE;
4759  }
4760  return TRUE;
4761}
4762#endif
4763/*=================== operations with many arg.: table =================*/
4764/* number_of_args:  -1: any, -2: any >0, .. */
4765struct sValCmdM dArithM[]=
4766{
4767// operations:
4768// proc         cmd               res            number_of_args
4769 {jjKLAMMER_PL,  '(',           ANY_TYPE,           -2  }
4770,{jjCALL2ARG,  COEF_CMD,        MATRIX_CMD,         2  }
4771,{jjCOEF_M,    COEF_CMD,        NONE,               4  }
4772,{jjDBPRINT,   DBPRINT_CMD,     NONE,               -2 }
4773,{jjCALL1ARG,  IDEAL_CMD,       IDEAL_CMD,          1  }
4774,{jjIDEAL_PL,  IDEAL_CMD,       IDEAL_CMD,          -1 }
4775,{jjCALL2ARG,  INTERSECT_CMD,   IDEAL_CMD,          2  }
4776,{jjINTERSECT_PL,INTERSECT_CMD, IDEAL_CMD,          -2 }
4777,{jjCALL1ARG,  INTVEC_CMD,      INTVEC_CMD,         1  }
4778,{jjINTVEC_PL, INTVEC_CMD,      INTVEC_CMD,         -1 }
4779,{jjLIST_PL,   LIST_CMD,        LIST_CMD,           -1 }
4780,{jjCALL1ARG,  MODUL_CMD,       MODUL_CMD,          1  }
4781,{jjIDEAL_PL,  MODUL_CMD,       MODUL_CMD,          -1 }
4782,{jjCALL1ARG,  NAMES_CMD,       LIST_CMD,            1 }
4783,{jjNAMES0,    NAMES_CMD,       LIST_CMD,            0 }
4784,{jjOPTION_PL, OPTION_CMD,      STRING_CMD/*or set by p*/,-1 }
4785,{jjCALL1ARG,  RESERVEDNAME_CMD, INT_CMD,            1 }
4786,{jjRESERVED0, RESERVEDNAME_CMD, NONE,               0 }
4787,{jjSTRING_PL, STRING_CMD,      STRING_CMD,         -1 }
4788,{jjSYSTEM,    SYSTEM_CMD,      NONE/*or set by p*/,-2 }
4789,{jjTEST,      TEST_CMD,        NONE,               -2 }
4790,{iiWRITE,     WRITE_CMD,       NONE,               -2 }
4791,{jjCALL2ARG,  STATUS_CMD,      STRING_CMD,          2 }
4792,{jjCALL3ARG,  STATUS_CMD,      INT_CMD,             3 }
4793#ifndef __MWERKS__
4794,{jjSTATUS_M,  STATUS_CMD,      INT_CMD,             4 }
4795#endif
4796#ifdef HAVE_NAMESPACES
4797,{jjIMPORTFROM,IMPORTFROM_CMD,  ANY_TYPE,           -2 }
4798,{jjEXPORTTO,  EXPORTTO_CMD,    NONE,               -2 }
4799,{jjUNLOAD,    UNLOAD_CMD,      NONE,               -2 }
4800#endif /* HAVE_NAMESPACES */
4801,{NULL,        0,               0,                  0  }
4802};
4803#ifdef MDEBUG
4804static Subexpr jjDBMakeSub(leftv e,char *f, int l)
4805#else
4806static Subexpr jjMakeSub(leftv e)
4807#endif
4808{
4809  // assume: e->Typ()==INT_CMD
4810#ifdef MDEBUG
4811  Subexpr r=(Subexpr)mmDBAllocBlock0(sizeof(*r),f,l);
4812#else
4813  Subexpr r=(Subexpr)Alloc0(sizeof(*r));
4814#endif
4815  r->start =(int)e->Data();
4816  return r;
4817}
4818
4819/*================ generating tables ============================*/
4820#ifdef GENTABLE
4821extern struct sValAssign dAssign[];
4822struct sValCmdTab dArithTab1[]={ {0,0}};
4823#define JJTAB1LEN 0
4824struct sValCmdTab dArithTab2[]={ {0,0}};
4825#define JJTAB2LEN 0
4826void ttGen1()
4827{
4828  FILE *outfile = myfopen("iparith.inc","w");
4829  int i,j,l1=0,l2=0;
4830  currRing=(ring)Alloc(sizeof(*currRing));
4831  fprintf(outfile,
4832  "/****************************************\n"
4833  "*  Computer Algebra System SINGULAR     *\n"
4834  "****************************************/\n\n");
4835/*-------------------------------------------------------------------*/
4836  fprintf(outfile,"// syntax table for Singular\n//\n");
4837  fprintf(outfile,"// - search for an exact match of the argument types\n");
4838  fprintf(outfile,"// - otherwise search for the first possibility\n");
4839  fprintf(outfile,"//   with converted types of the arguments\n");
4840  fprintf(outfile,"// - otherwise report an error\n//\n");
4841
4842  int op;
4843  i=0;
4844  while ((op=dArith1[i].cmd)!=0)
4845  {
4846    if (dArith1[i].p==jjWRONG)
4847      fprintf(outfile,"// DUMMY ");
4848    char *s = iiTwoOps(op);
4849    fprintf(outfile,"// operation: %s (%s)  ->  %s\n",
4850          s,
4851          Tok2Cmdname(dArith1[i].arg),
4852          Tok2Cmdname(ABS(dArith1[i].res)));
4853    i++;
4854  }
4855  fprintf(outfile,"/*---------------------------------------------*/\n");
4856  i=0;
4857  while ((op=dArith2[i].cmd)!=0)
4858  {
4859    if (dArith2[i].p==jjWRONG2)
4860      fprintf(outfile,"// DUMMY ");
4861    char *s = iiTwoOps(op);
4862    fprintf(outfile,"// operation: %s (%s, %s)  ->  %s\n",
4863          s,
4864          Tok2Cmdname(dArith2[i].arg1),
4865          Tok2Cmdname(dArith2[i].arg2),
4866          Tok2Cmdname(dArith2[i].res));
4867    i++;
4868  }
4869  fprintf(outfile,"/*---------------------------------------------*/\n");
4870  i=0;
4871  while ((op=dArith3[i].cmd)!=0)
4872  {
4873    char *s = iiTwoOps(op);
4874    if (dArith3[i].p==jjWRONG3)
4875      fprintf(outfile,"// DUMMY ");
4876    fprintf(outfile,"// operation: %s (%s, %s, %s)  ->  %s\n",
4877          s,
4878          Tok2Cmdname(dArith3[i].arg1),
4879          Tok2Cmdname(dArith3[i].arg2),
4880          Tok2Cmdname(dArith3[i].arg3),
4881          Tok2Cmdname(dArith3[i].res));
4882    i++;
4883  }
4884  fprintf(outfile,"/*---------------------------------------------*/\n");
4885  i=0;
4886  while ((op=dArithM[i].cmd)!=0)
4887  {
4888    char *s = iiTwoOps(op);
4889    fprintf(outfile,"// operation: %s (...)  ->  %s",
4890          s,
4891          Tok2Cmdname(dArithM[i].res));
4892    switch(dArithM[i].number_of_args)
4893    {
4894      case -2:
4895         fprintf(outfile," ( number of arguments >0 )\n");
4896         break;
4897      case -1:
4898         fprintf(outfile," ( any number of arguments )\n");
4899         break;
4900      default:
4901         fprintf(outfile," ( %d arguments )\n",dArithM[i].number_of_args);
4902         break;
4903    }
4904    i++;
4905  }
4906  fprintf(outfile,"/*---------------------------------------------*/\n");
4907  i=0;
4908  while ((op=dAssign[i].res)!=0)
4909  {
4910    fprintf(outfile,"// assign: %s =  %s\n",
4911          Tok2Cmdname(op/*dAssign[i].res*/),
4912          Tok2Cmdname(dAssign[i].arg));
4913    i++;
4914  }
4915/*-------------------------------------------------------------------*/
4916  fprintf(outfile,"/*---------------------------------------------*/\n");
4917  for (j=257;j<=MAX_TOK+1;j++)
4918  {
4919    for(i=257;i<=MAX_TOK+1;i++)
4920    {
4921      if ((i!=j) && (j!=IDHDL) && (j!=DEF_CMD) && (j!=ANY_TYPE)
4922      && iiTestConvert(i,j))
4923      {
4924        fprintf(outfile,"// convert %s -> %s\n",
4925          Tok2Cmdname(i), Tok2Cmdname(j));
4926        if (j==ANY_TYPE) break;
4927      }
4928    }
4929  }
4930  fprintf(outfile,"/*---------------------------------------------*/\n");
4931  char ops[]="=><+*/[.^,%(;";
4932  for(i=0;ops[i]!='\0';i++)
4933    fprintf(outfile,"// token %d : %c\n", (int)ops[i], ops[i]);
4934  for (i=257;i<=MAX_TOK;i++)
4935  {
4936    char *s=iiTwoOps(i);
4937    if (s[0]!='$')
4938    {
4939      fprintf(outfile,"// token %d : %s\n", i, s);
4940    }
4941  }
4942/*-------------------------------------------------------------------*/
4943  fprintf(outfile,"/*--max. token: %d, gr: %d --*/\n",MAX_TOK,UMINUS);
4944/*-------------------------------------------------------------------*/
4945  fprintf(outfile,"/*---------------------------------------------*/\n");
4946  fprintf(outfile,
4947  "struct sValCmdTab dArithTab1[]=\n"
4948  "{\n");
4949  for (j=1;j<=MAX_TOK+1;j++)
4950  {
4951    for(i=0;dArith1[i].cmd!=0;i++)
4952    {
4953      if (dArith1[i].cmd==j)
4954      {
4955        fprintf(outfile," { %d,%d },\n",j,i);
4956        l1++;
4957        break;
4958      }
4959    }
4960  }
4961  fprintf(outfile," { 10000,0 }\n};\n");
4962  fprintf(outfile,"#define JJTAB1LEN %d\n",l1);
4963/*-------------------------------------------------------------------*/
4964  fprintf(outfile,
4965  "struct sValCmdTab dArithTab2[]=\n"
4966  "{\n");
4967  for (j=1;j<=MAX_TOK+1;j++)
4968  {
4969    for(i=0;dArith2[i].cmd!=0;i++)
4970    {
4971      if (dArith2[i].cmd==j)
4972      {
4973        fprintf(outfile," { %d,%d },\n",j,i);
4974        l2++;
4975        break;
4976      }
4977    }
4978  }
4979  fprintf(outfile," { 10000,0 }\n};\n");
4980  fprintf(outfile,"#define JJTAB2LEN %d\n",l2);
4981  fclose(outfile);
4982}
4983/*-------------------------------------------------------------------*/
4984void ttGen2()
4985{
4986  FILE *outfile = myfopen("iparith.inc","a");
4987  fprintf(outfile,
4988  "/****************************************\n"
4989  "*  Computer Algebra System SINGULAR     *\n"
4990  "****************************************/\n\n");
4991/*-------------------------------------------------------------------*/
4992  fprintf(outfile,"// identifier table for Singular\n//\n");
4993
4994  fprintf(outfile,
4995  "cmdnames cmds[] =\n"
4996  "{  // name-string     alias  tokval toktype\n"
4997  "{ \"$INVALID$\",            0,  -1, 0},\n");
4998  int i=1;
4999  int m=-1;
5000  int id_nr=0;
5001  BOOLEAN f=FALSE;
5002  loop
5003  {
5004    while (cmds[i].tokval!=0)
5005    {
5006      if ((cmds[i].tokval!=-1)&&(cmds[i].name!=NULL))
5007      {
5008        if(m==-1)
5009        {
5010          m=i;
5011          f=TRUE;
5012        }
5013        else if(strcmp(cmds[m].name,cmds[i].name)>0)
5014        {
5015          m=i;
5016          f=TRUE;
5017        }
5018      }
5019      i++;
5020    }
5021    if(f)
5022    {
5023      id_nr++;
5024      if(cmds[m].tokval==VRTIMER) fprintf(outfile,"#ifdef HAVE_RTIMER\n");
5025      fprintf(outfile,"  {\"%s\", %*d, %3d, ",cmds[m].name,
5026                                             20-strlen(cmds[m].name),
5027                                             cmds[m].alias,
5028                                             cmds[m].tokval);
5029      switch(cmds[m].toktype)
5030      {
5031        case CMD_1:            fprintf(outfile,"CMD_1 },\n"); break;
5032        case CMD_2:            fprintf(outfile,"CMD_2 },\n"); break;
5033        case CMD_3:            fprintf(outfile,"CMD_3 },\n"); break;
5034        case CMD_12:           fprintf(outfile,"CMD_12 },\n"); break;
5035        case CMD_123 :         fprintf(outfile,"CMD_123 },\n"); break;
5036        case CMD_23:           fprintf(outfile,"CMD_23 },\n"); break;
5037        case CMD_M:            fprintf(outfile,"CMD_M },\n"); break;
5038        case SYSVAR:           fprintf(outfile,"SYSVAR },\n"); break;
5039        case ROOT_DECL:        fprintf(outfile,"ROOT_DECL },\n"); break;
5040        case ROOT_DECL_LIST:   fprintf(outfile,"ROOT_DECL_LIST },\n"); break;
5041        case RING_DECL:        fprintf(outfile,"RING_DECL },\n"); break;
5042        case NONE:             fprintf(outfile,"NONE },\n"); break;
5043        default:               if((cmds[m].toktype>' ')
5044                               &&(cmds[m].toktype<127))
5045                               {
5046                                 fprintf(outfile,"'%c' },\n",cmds[m].toktype);
5047                               }
5048                               else
5049                               {
5050                                 fprintf(outfile,"%d },\n",cmds[m].toktype);
5051                               }
5052                               break;
5053      }
5054      if(cmds[m].tokval==VRTIMER) fprintf(outfile,"#endif\n");
5055      cmds[m].name=NULL;
5056      m=-1;
5057      i=1;
5058      f=FALSE;
5059    }
5060    else break;
5061  }
5062  fprintf(outfile,
5063"/* list of scanner identifiers/only for feread/reservedName */\n");
5064  f=FALSE;
5065  i=1;m=-1;
5066  loop
5067  {
5068    while (cmds[i].tokval!=0)
5069    {
5070      if (cmds[i].name!=NULL)
5071      {
5072        if(m==-1)
5073        {
5074          m=i;
5075          f=TRUE;
5076        }
5077        else if(strcmp(cmds[m].name,cmds[i].name)>0)
5078        {
5079          m=i;
5080          f=TRUE;
5081        }
5082      }
5083      i++;
5084    }
5085    if(f)
5086    {
5087      fprintf(outfile,"  {\"%s\", %*d,  -1, 0 },\n",cmds[m].name,
5088                                             20-strlen(cmds[m].name),
5089                                             0/*cmds[m].alias*/
5090                                             /*-1 cmds[m].tokval*/
5091                                             /*0 cmds[m].toktype*/);
5092      cmds[m].name=NULL;
5093      m=-1;
5094      i=1;
5095      f=FALSE;
5096    }
5097    else break;
5098  }
5099  fprintf(outfile,
5100"/* end of list marker */\n"
5101"  { NULL, 0, 0, 0}\n"
5102"};\n"
5103"#ifdef HAVE_RTIMER\n"
5104"#define LAST_IDENTIFIER %d\n"
5105"#else\n"
5106"#define LAST_IDENTIFIER %d\n"
5107"#endif\n",id_nr,id_nr-1);
5108  fclose(outfile);
5109}
5110/*-------------------------------------------------------------------*/
5111#if 0
5112void ttGen3()
5113{
5114  FILE *outfile = myfopen("mpsr_tok.inc","w");
5115  fprintf(outfile,
5116  "/****************************************\n"
5117  "*  Computer Algebra System SINGULAR     *\n"
5118  "****************************************/\n\n");
5119/*-------------------------------------------------------------------*/
5120  fprintf(outfile,"// token table for Singular\n//\n");
5121
5122  fprintf(outfile,
5123  "short vtok[] =\n"
5124  "{\n");
5125  // operations with 1 arg: ===========================================
5126  int i=0;
5127  while (dArith1[i].cmd!=0)
5128  {
5129    if ((dArith1[i].p!=jjWRONG)
5130    &&((i==0)||(dArith1[i].cmd!=dArith1[i-1].cmd)))
5131    {
5132      fprintf(outfile,"  %d,\n",dArith1[i].cmd);
5133    }
5134    i++;
5135  }
5136  // operations with 2 args: ===========================================
5137  i=0;
5138  while (dArith2[i].cmd!=0)
5139  {
5140    if ((dArith2[i].p!=jjWRONG2)
5141    &&((i==0)||(dArith2[i].cmd!=dArith2[i-1].cmd)))
5142    {
5143      fprintf(outfile,"  %d,\n",dArith2[i].cmd);
5144    }
5145    i++;
5146  }
5147  // operations with 3 args: ===========================================
5148  i=0;
5149  while (dArith3[i].cmd!=0)
5150  {
5151    if (
5152    ((i==0)||(dArith3[i].cmd!=dArith3[i-1].cmd)))
5153    {
5154      fprintf(outfile,"  %d,\n",dArith3[i].cmd);
5155    }
5156    i++;
5157  }
5158  // operations with many args: ===========================================
5159  i=0;
5160  while (dArithM[i].cmd!=0)
5161  {
5162    if (
5163    ((i==0)||(dArithM[i].cmd!=dArithM[i-1].cmd)))
5164    {
5165      fprintf(outfile,"  %d,\n",dArithM[i].cmd);
5166    }
5167    i++;
5168  }
5169  // ====================================================================
5170  fprintf(outfile,
5171  "/* end of list marker */\n"
5172  " %d };\n",MAX_TOK);
5173  fclose(outfile);
5174}
5175#endif
5176/*-------------------------------------------------------------------*/
5177#else
5178#include "iparith.inc"
5179#endif
5180
5181/*=================== operations with 2 args. ============================*/
5182
5183BOOLEAN iiExprArith2(leftv res, leftv a, int op, leftv b, BOOLEAN proccall)
5184{
5185#ifndef GENTABLE
5186  memset(res,0,sizeof(sleftv));
5187
5188  if (!errorreported)
5189  {
5190#ifdef SIQ
5191    if (siq>0)
5192    {
5193      //Print("siq:%d\n",siq);
5194      command d=(command)Alloc0(sizeof(ip_command));
5195      memcpy(&d->arg1,a,sizeof(sleftv));
5196      memcpy(&d->arg2,b,sizeof(sleftv));
5197      d->argc=2;
5198      d->op=op;
5199      res->data=(char *)d;
5200      res->rtyp=COMMAND;
5201      return FALSE;
5202    }
5203#endif
5204    int at=a->Typ();
5205    int bt=b->Typ();
5206    int i=iiTabIndex(dArithTab2,JJTAB2LEN,op);
5207
5208    iiOp=op;
5209    while (dArith2[i].cmd==op)
5210    {
5211      if ((at==dArith2[i].arg1)
5212      && (bt==dArith2[i].arg2))
5213      {
5214        res->rtyp=dArith2[i].res;
5215        if (dArith2[i].p(res,a,b))
5216        {
5217          break;// leave loop, goto error handling
5218        }
5219        a->CleanUp();
5220        b->CleanUp();
5221        //Print("op: %d,result typ:%d\n",op,res->rtyp);
5222        return FALSE;
5223      }
5224      i++;
5225    }
5226    // implicite type conversion ----------------------------------------------
5227    if (dArith2[i].cmd!=op)
5228    {
5229      int ai,bi;
5230      leftv an = (leftv)Alloc0(sizeof(sleftv));
5231      leftv bn = (leftv)Alloc0(sizeof(sleftv));
5232      BOOLEAN failed=FALSE;
5233      i=iiTabIndex(dArithTab2,JJTAB2LEN,op);
5234      //Print("op: %c, type: %s %s\n",op,Tok2Cmdname(at),Tok2Cmdname(bt));
5235      while (dArith2[i].cmd==op)
5236      {
5237        //Print("test %s %s\n",Tok2Cmdname(dArith2[i].arg1),Tok2Cmdname(dArith2[i].arg2));
5238        if ((ai=iiTestConvert(at,dArith2[i].arg1))!=0)
5239        {
5240          if ((bi=iiTestConvert(bt,dArith2[i].arg2))!=0)
5241          {
5242            res->rtyp=dArith2[i].res;
5243            failed= ((iiConvert(at,dArith2[i].arg1,ai,a,an))
5244            || (iiConvert(bt,dArith2[i].arg2,bi,b,bn))
5245            || (dArith2[i].p(res,an,bn)));
5246            // everything done, clean up temp. variables
5247            if (failed)
5248            {
5249              // leave loop, goto error handling
5250              break;
5251            }
5252            else
5253            {
5254              // everything ok, clean up and return
5255              an->CleanUp();
5256              bn->CleanUp();
5257              Free((ADDRESS)an,sizeof(sleftv));
5258              Free((ADDRESS)bn,sizeof(sleftv));
5259              a->CleanUp();
5260              b->CleanUp();
5261              return FALSE;
5262            }
5263          }
5264        }
5265        i++;
5266      }
5267      an->CleanUp();
5268      bn->CleanUp();
5269      Free((ADDRESS)an,sizeof(sleftv));
5270      Free((ADDRESS)bn,sizeof(sleftv));
5271    }
5272    // error handling ---------------------------------------------------
5273    const char *s=NULL;
5274    if (!errorreported)
5275    {
5276      if ((at==0) && (a->Fullname()!=sNoName))
5277      {
5278        s=a->Fullname();
5279      }
5280      else if ((bt==0) && (b->Fullname()!=sNoName))
5281      {
5282        s=b->Fullname();
5283      }
5284      if (s!=NULL)
5285        Werror("`%s` is not defined",s);
5286      else
5287      {
5288        i=iiTabIndex(dArithTab2,JJTAB2LEN,op);
5289        s = iiTwoOps(op);
5290        if (proccall)
5291        {
5292          Werror("%s(`%s`,`%s`) is not supported"
5293                ,s,Tok2Cmdname(at),Tok2Cmdname(bt));
5294        }
5295        else
5296        {
5297          Werror("`%s` %s `%s` is not supported"
5298                ,Tok2Cmdname(at),s,Tok2Cmdname(bt));
5299        }
5300        if (BVERBOSE(V_SHOW_USE))
5301        {
5302          while (dArith2[i].cmd==op)
5303          {
5304            if(((at==dArith2[i].arg1)||(bt==dArith2[i].arg2))
5305            && (dArith2[i].res!=0)
5306            && (dArith2[i].p!=jjWRONG2))
5307            {
5308              if (proccall)
5309                Werror("expected %s(`%s`,`%s`)"
5310                  ,s,Tok2Cmdname(dArith2[i].arg1),Tok2Cmdname(dArith2[i].arg2));
5311              else
5312                Werror("expected `%s` %s `%s`"
5313                  ,Tok2Cmdname(dArith2[i].arg1),s,Tok2Cmdname(dArith2[i].arg2));
5314            }
5315            i++;
5316          }
5317        }
5318      }
5319    }
5320    res->rtyp = UNKNOWN;
5321  }
5322  a->CleanUp();
5323  b->CleanUp();
5324#endif
5325  return TRUE;
5326}
5327
5328/*==================== operations with 1 arg. ===============================*/
5329
5330BOOLEAN iiExprArith1(leftv res, leftv a, int op)
5331{
5332#ifndef GENTABLE
5333  memset(res,0,sizeof(sleftv));
5334
5335  if (!errorreported)
5336  {
5337#ifdef SIQ
5338    if (siq>0)
5339    {
5340      //Print("siq:%d\n",siq);
5341      command d=(command)Alloc0(sizeof(ip_command));
5342      memcpy(&d->arg1,a,sizeof(sleftv));
5343      d->op=op;
5344      d->argc=1;
5345      res->data=(char *)d;
5346      res->rtyp=COMMAND;
5347      return FALSE;
5348    }
5349#endif
5350    int at=a->Typ();
5351    BOOLEAN failed=FALSE;
5352
5353    iiOp=op;
5354    int i=iiTabIndex(dArithTab1,JJTAB1LEN,op);
5355    while (dArith1[i].cmd==op)
5356    {
5357      if (at==dArith1[i].arg)
5358      {
5359        res->rtyp=dArith1[i].res;
5360        if (dArith1[i].res<0)
5361        {
5362          res->rtyp=-res->rtyp;
5363          #ifdef PROC_BUG
5364          dArith1[i].p(res,a);
5365          #else
5366          res->data=(char *)((Proc1)dArith1[i].p)((char *)a->Data());
5367          #endif
5368        }
5369        else if (dArith1[i].p(res,a))
5370        {
5371          break;// leave loop, goto error handling
5372        }
5373        if (a->Next()!=NULL)
5374        {
5375          res->next=(leftv)Alloc(sizeof(sleftv));
5376          failed=iiExprArith1(res->next,a->next,op);
5377        }
5378        a->CleanUp();
5379        return failed;
5380      }
5381      i++;
5382    }
5383    // implicite type conversion --------------------------------------------
5384    if (dArith1[i].cmd!=op)
5385    {
5386      int ai;
5387      leftv an = (leftv)Alloc0(sizeof(sleftv));
5388      i=iiTabIndex(dArithTab1,JJTAB1LEN,op);
5389      //Print("fuer %c , typ: %s\n",op,Tok2Cmdname(at));
5390      while (dArith1[i].cmd==op)
5391      {
5392        //Print("test %s\n",Tok2Cmdname(dArith1[i].arg));
5393        if ((ai=iiTestConvert(at,dArith1[i].arg))!=0)
5394        {
5395          res->rtyp=dArith1[i].res;
5396          if (dArith1[i].res<0)
5397          {
5398            res->rtyp=-res->rtyp;
5399            failed= iiConvert(at,dArith1[i].arg,ai,a,an);
5400            if (!failed)
5401            {
5402              #ifdef PROC_BUG
5403              dArith1[i].p(res,a);
5404              #else
5405              res->data=(char *)((Proc1)dArith1[i].p)((char *)an->Data());
5406              #endif
5407            }
5408          }
5409          else
5410          {
5411            failed= ((iiConvert(at,dArith1[i].arg,ai,a,an))
5412            || (dArith1[i].p(res,an)));
5413          }
5414          // everything done, clean up temp. variables
5415          if (failed)
5416          {
5417            // leave loop, goto error handling
5418            break;
5419          }
5420          else
5421          {
5422            // everything ok, clean up and return
5423            an->CleanUp();
5424            Free((ADDRESS)an,sizeof(sleftv));
5425            a->CleanUp();
5426            return FALSE;
5427          }
5428        }
5429        i++;
5430      }
5431      an->CleanUp();
5432      Free((ADDRESS)an,sizeof(sleftv));
5433    }
5434    // error handling
5435    if (!errorreported)
5436    {
5437      if ((at==0) && (a->Fullname()!=sNoName))
5438      {
5439        Werror("`%s` is not defined",a->Fullname());
5440      }
5441      else
5442      {
5443        i=iiTabIndex(dArithTab1,JJTAB1LEN,op);
5444        char *s = iiTwoOps(op);
5445        Werror("%s(`%s`) is not supported"
5446                ,s,Tok2Cmdname(at));
5447        if (BVERBOSE(V_SHOW_USE))
5448        {
5449          while (dArith1[i].cmd==op)
5450          {
5451            if ((dArith1[i].res!=0)
5452            && (dArith1[i].p!=jjWRONG))
5453              Werror("expected %s(`%s`)"
5454                ,s,Tok2Cmdname(dArith1[i].arg));
5455            i++;
5456          }
5457        }
5458      }
5459    }
5460    res->rtyp = UNKNOWN;
5461  }
5462  a->CleanUp();
5463#endif
5464  return TRUE;
5465}
5466
5467/*=================== operations with 3 args. ============================*/
5468
5469BOOLEAN iiExprArith3(leftv res, int op, leftv a, leftv b, leftv c)