source: git/Singular/ipassign.cc @ dfc6b54

spielwiese
Last change on this file since dfc6b54 was dfc6b54, checked in by Hans Schönemann <hannes@…>, 27 years ago
Wed Jul 9 17:50:23 MET DST 1997: hannes/siebert * added new type (resolution) -> extra.cc, ipid.cc, iparith.cc, ipconv.cc, syz.h, syz1.cc, grammar.y structs.h, subexpr.cc hannes: optimization in mmGetBlock: mmblock.c mmprivat.h loading of "standard.lib": tesths.cc git-svn-id: file:///usr/local/Singular/svn/trunk@502 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 30.3 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: ipassign.cc,v 1.16 1997-07-09 15:53:59 Singular Exp $ */
5
6/*
7* ABSTRACT: interpreter:
8*           assignment of expressions and lists to objects or lists
9*/
10
11#include <stdlib.h>
12#include <string.h>
13#include <ctype.h>
14
15#include "mod2.h"
16#include "tok.h"
17#include "ipid.h"
18#include "intvec.h"
19#include "mmemory.h"
20#include "febase.h"
21#include "polys.h"
22#include "ideals.h"
23#include "matpol.h"
24#include "kstd1.h"
25#include "timer.h"
26#include "ring.h"
27#include "subexpr.h"
28#include "numbers.h"
29#include "lists.h"
30#include "longalg.h"
31#include "stairc.h"
32#include "maps.h"
33#include "syz.h"
34#include "weight.h"
35#include "ipconv.h"
36#include "attrib.h"
37#include "silink.h"
38#include "ipshell.h"
39
40/*=================== proc =================*/
41#ifdef SRING
42static BOOLEAN jjALTVARS(leftv res, leftv a)
43{
44  pAltVars=(int)a->Data();
45  pSRING=(pAltVars<=pVariables);
46  pSDRING=pSDRING||pSRING;
47  currRing->partN=pAltVars;
48  return FALSE;
49}
50#endif
51static BOOLEAN jjECHO(leftv res, leftv a)
52{
53  si_echo=(int)a->Data();
54  return FALSE;
55}
56static BOOLEAN jjPAGELENGTH(leftv res, leftv a)
57{
58  pagelength=(int)a->Data();
59  return FALSE;
60}
61static BOOLEAN jjPRINTLEVEL(leftv res, leftv a)
62{
63  printlevel=(int)a->Data();
64  return FALSE;
65}
66static BOOLEAN jjCOLMAX(leftv res, leftv a)
67{
68  colmax=(int)a->Data();
69  return FALSE;
70}
71static BOOLEAN jjTIMER(leftv res, leftv a)
72{
73  timerv=(int)a->Data();
74  initTimer();
75  return FALSE;
76}
77#ifdef HAVE_RTIMER
78static BOOLEAN jjRTIMER(leftv res, leftv a)
79{
80  rtimerv=(int)a->Data();
81  initRTimer();
82  return FALSE;
83}
84#endif
85static BOOLEAN jjMAXDEG(leftv res, leftv a)
86{
87  Kstd1_deg=(int)a->Data();
88  if (Kstd1_deg!=0)
89    test |=Sy_bit(24);
90  else
91    test &=(~Sy_bit(24));
92  return FALSE;
93}
94static BOOLEAN jjMAXMULT(leftv res, leftv a)
95{
96  Kstd1_mu=(int)a->Data();
97  if (Kstd1_mu!=0)
98    test |=Sy_bit(23);
99  else
100    test &=(~Sy_bit(23));
101  return FALSE;
102}
103static BOOLEAN jjTRACE(leftv res, leftv a)
104{
105  traceit=(int)a->Data();
106  return FALSE;
107}
108static BOOLEAN jjSHORTOUT(leftv res, leftv a)
109{
110#ifdef HAVE_TCL
111  if (!tclmode)
112#endif
113    pShortOut=(int)a->Data();
114  return FALSE;
115}
116static BOOLEAN jjMINPOLY(leftv res, leftv a)
117{
118  if ((currRing->parameter!=NULL)
119  && (currRing->P>1))
120  {
121    WerrorS("no minpoly allowed");
122    return TRUE;
123  }
124  if (currRing->minpoly!=NULL)
125  {
126    WerrorS("minpoly already set");
127    return TRUE;
128  }
129  number p=(number)a->CopyD(NUMBER_CMD);
130  if (!nIsZero(p))
131  {
132    nNormalize(p);
133    currRing->minpoly=p;
134    naMinimalPoly=((lnumber)currRing->minpoly)->z;
135  }
136  else
137  {
138    naMinimalPoly=NULL;
139  }
140  return FALSE;
141}
142static BOOLEAN jjNOETHER(leftv res, leftv a)
143{
144  poly p=(poly)a->CopyD(POLY_CMD);
145  pDelete(&ppNoether);
146  ppNoether=p;
147  return FALSE;
148}
149/*=================== proc =================*/
150static void jiAssignAttr(leftv l,leftv r)
151{
152  // get the attribute of th right side
153  // and set it to l
154  leftv rv=r->LData();
155  if (rv!=NULL)
156  {
157    if (rv->e==NULL)
158    {
159      if (rv->attribute!=NULL)
160      {
161        attr la;
162        if (r->rtyp!=IDHDL)
163        {
164          la=rv->attribute;
165          rv->attribute=NULL;
166        }
167        else
168        {
169          la=rv->attribute->Copy();
170        }
171        l->attribute=la;
172      }
173      l->flag=rv->flag;
174    }
175  }
176  if (l->rtyp==IDHDL)
177  {
178    idhdl h=(idhdl)l->data;
179    IDATTR(h)=l->attribute;
180    IDFLAG(h)=l->flag;
181  }
182}
183static BOOLEAN jiA_INT(leftv res, leftv a, Subexpr e)
184{
185  if (e==NULL)
186  {
187    res->data=(void *)a->Data();
188    jiAssignAttr(res,a);
189  }
190  else
191  {
192    int i=e->start-1;
193    if (i<0)
194    {
195      Werror("index[%d] must be positive",i+1);
196      return TRUE;
197    }
198    intvec *iv=(intvec *)res->data;
199    if (e->next==NULL)
200    {
201      if (i>=iv->length())
202      {
203        intvec *iv1=new intvec(i+1);
204        (*iv1)[i]=(int)a->Data();
205        intvec *ivn=ivAdd(iv,iv1);
206        delete iv;
207        delete iv1;
208        res->data=(void *)ivn;
209      }
210      else
211        (*iv)[i]=(int)a->Data();
212    }
213    else
214    {
215      int c=e->next->start;
216      if ((i>=iv->rows())||(c<1)||(c>iv->cols()))
217      {
218        Werror("wrong range [%d,%d] in intmat (%d,%d)",i+1,c,iv->rows(),iv->cols());
219        return TRUE;
220      }
221      else
222        IMATELEM(*iv,i+1,c) = (int)a->Data();
223    }
224  }
225  return FALSE;
226}
227static BOOLEAN jiA_NUMBER(leftv res, leftv a, Subexpr e)
228{
229  number p=(number)a->CopyD(NUMBER_CMD);
230  if (res->data!=NULL) nDelete((number *)&res->data);
231  nNormalize(p);
232  res->data=(void *)p;
233  jiAssignAttr(res,a);
234  return FALSE;
235}
236static BOOLEAN jiA_LIST(leftv res, leftv a,Subexpr e)
237{
238  lists l=(lists)a->CopyD();
239  if (res->data!=NULL) ((lists)res->data)->Clean();
240  res->data=(void *)l;
241  jiAssignAttr(res,a);
242  return FALSE;
243}
244static BOOLEAN jiA_POLY(leftv res, leftv a,Subexpr e)
245{
246  poly p=(poly)a->CopyD(POLY_CMD);
247  pNormalize(p);
248  if (e==NULL)
249  {
250    if (res->data!=NULL) pDelete((poly*)&res->data);
251    res->data=(void*)p;
252    jiAssignAttr(res,a);
253  }
254  else
255  {
256    int i,j;
257    matrix m=(matrix)res->data;
258    i=e->start;
259    if (e->next==NULL)
260    {
261      j=i; i=1;
262      // for ideal/module: check indices
263      if (res->rtyp!=MAP_CMD)
264      {
265        if (j>MATCOLS(m))
266        {
267          pEnlargeSet(&(m->m),MATCOLS(m),j-MATCOLS(m));
268          MATCOLS(m)=j;
269        }
270        else if (j<=0)
271        {
272          Werror("index[%d] must be positive",j/*e->start*/);
273          return TRUE;
274        }
275      }
276    }
277    else
278    {
279      // for matrices: indices are correct (see ipExprArith3(..,'['..) )
280      j=e->next->start;
281    }
282    pDelete(&MATELEM(m,i,j));
283    MATELEM(m,i,j)=p;
284    /* for module: update rank */
285    if ((p!=NULL) && (pGetComp(p)!=0))
286    {
287      m->rank=max(m->rank,pMaxComp(p));
288    }
289  }
290  return FALSE;
291}
292static BOOLEAN jiA_1x1MATRIX(leftv res, leftv a,Subexpr e)
293{
294  if ((res->rtyp!=MATRIX_CMD) /*|| (e!=NULL) - TRUE because of type poly */)
295     return TRUE;
296  matrix am=(matrix)a->CopyD(MATRIX_CMD);
297  if ((MATROWS(am)!=1) || (MATCOLS(am)!=1))
298  {
299    idDelete((ideal *)&am);
300    return TRUE;
301  }
302  matrix m=(matrix)res->data;
303  // indices are correct (see ipExprArith3(..,'['..) )
304  int i=e->start;
305  int j=e->next->start;
306  pDelete(&MATELEM(m,i,j));
307  pNormalize(MATELEM(am,1,1));
308  MATELEM(m,i,j)=MATELEM(am,1,1);
309  return FALSE;
310}
311static BOOLEAN jiA_STRING(leftv res, leftv a, Subexpr e)
312{
313  if (e==NULL)
314  {
315    FreeL((ADDRESS)res->data);
316    res->data=(void *)a->CopyD(STRING_CMD);
317    jiAssignAttr(res,a);
318  }
319  else
320  {
321    char *s=(char *)res->data;
322    if ((e->start>0)&&(e->start<=(int)strlen(s)))
323      s[e->start-1]=(char)(*((char *)a->Data()));
324    else
325    {
326      Werror("string index %d out of range 1..%d",e->start,strlen(s));
327      return TRUE;
328    }
329  }
330  return FALSE;
331}
332static BOOLEAN jiA_INTVEC(leftv res, leftv a, Subexpr e)
333{
334  if (res->data!=NULL) delete ((intvec *)res->data);
335  res->data=(void *)a->CopyD(INTVEC_CMD);
336  jiAssignAttr(res,a);
337  return FALSE;
338}
339static BOOLEAN jiA_IDEAL(leftv res, leftv a, Subexpr e)
340{
341  if (res->data!=NULL) idDelete((ideal*)&res->data);
342  res->data=(void *)a->CopyD(MATRIX_CMD);
343  jiAssignAttr(res,a);
344  return FALSE;
345}
346static BOOLEAN jiA_RESOLUTION(leftv res, leftv a, Subexpr e)
347{
348  if (res->data!=NULL) syKillComputation((syStrategy)res->data);
349  res->data=(void *)a->CopyD(RESOLUTION_CMD);
350  jiAssignAttr(res,a);
351  return FALSE;
352}
353static BOOLEAN jiA_MODUL_P(leftv res, leftv a, Subexpr e)
354{
355  if (res->data!=NULL) idDelete((ideal*)&res->data);
356  ideal I=idInit(1,1);
357  I->m[0]=(poly)a->CopyD();
358  if (I->m[0]!=NULL) pSetComp(I->m[0],1);
359  res->data=(void *)I;
360  return FALSE;
361}
362static BOOLEAN jiA_IDEAL_M(leftv res, leftv a, Subexpr e)
363{
364  if (res->data!=NULL) idDelete((ideal*)&res->data);
365  matrix m=(matrix)a->CopyD(MATRIX_CMD);
366  IDELEMS((ideal)m)=MATROWS(m)*MATCOLS(m);
367  ((ideal)m)->rank=1;
368  MATROWS(m)=1;
369  res->data=(void *)m;
370  return FALSE;
371}
372static BOOLEAN jiA_LINK(leftv res, leftv a, Subexpr e)
373{
374  si_link l=(si_link)res->data;
375
376  if (l!=NULL) slCleanUp(l);
377
378  if (a->Typ() == STRING_CMD)
379  {
380    if (l == NULL)
381    {
382      l = (si_link) Alloc0(sizeof(sip_link));
383      res->data = (void *) l;
384    }
385    return slInit(l, (char *) a->Data());
386  }
387  else if (a->Typ() == LINK_CMD)
388  {
389    if (l != NULL) Free(l, sizeof(sip_link));
390    res->data = slCopy((si_link)a->Data());
391    return FALSE;
392  }
393  return TRUE;
394}
395static BOOLEAN jiA_MAP(leftv res, leftv a, Subexpr e)
396{
397  if (res->data!=NULL)
398  {
399    FreeL((ADDRESS)((map)res->data)->preimage);
400    ((map)res->data)->preimage=NULL;
401    idDelete((ideal*)&res->data);
402  }
403  res->data=(void *)a->CopyD();
404  jiAssignAttr(res,a);
405  return FALSE;
406}
407static BOOLEAN jiA_MAP_ID(leftv res, leftv a, Subexpr e)
408{
409  map f=(map)res->data;
410  char *rn=f->preimage; // save the old/already assigned preimage ring name
411  f->preimage=NULL;
412  idDelete((ideal *)&f);
413  res->data=(void *)a->CopyD(IDEAL_CMD);
414  f=(map)res->data;
415  f->preimage = rn;
416  return FALSE;
417}
418static BOOLEAN jiA_QRING(leftv res, leftv a,Subexpr e)
419{
420  if ((e!=NULL)||(res->rtyp!=IDHDL))
421  {
422    WerrorS("qring_id expected");
423    return TRUE;
424  }
425  ring qr;
426  int i,j;
427  int *pi;
428
429  assumeStdFlag(a);
430  qr=(ring)res->Data();
431  ring qrr=rCopy(currRing);
432  // hier fehlt noch: evtl. vorhandenen alten Ring streichen
433  // vorerst nur:
434  memcpy4(qr,qrr,sizeof(ip_sring));
435  Free(qrr,sizeof(ip_sring));
436  if (qr->qideal!=NULL) idDelete(&qr->qideal);
437  qr->qideal = (ideal)a->CopyD(IDEAL_CMD);
438  currRing=qr;
439  currRingHdl=(idhdl)res->data;
440  currQuotient=qr->qideal;
441  return FALSE;
442}
443static BOOLEAN jiA_RING(leftv res, leftv a, Subexpr e)
444{
445  if ((e!=NULL)||(res->rtyp!=IDHDL))
446  {
447    WerrorS("id expected");
448    return TRUE;
449  }
450  ring r=(ring)a->Data();
451  idhdl rl=(idhdl)res->data;
452  if (&IDRING(rl)!=NULL) rKill(rl);
453  r->ref++;
454  IDRING(rl)=r;
455  if ((IDLEV((idhdl)a->data)!=myynest) && (r==currRing))
456    currRingHdl=(idhdl)res->data;
457  return FALSE;
458}
459/*=================== table =================*/
460struct sValAssign dAssign[]=
461{
462// proc         res             arg
463 {jiA_IDEAL,    IDEAL_CMD,      IDEAL_CMD }
464,{jiA_RESOLUTION,RESOLUTION_CMD,RESOLUTION_CMD }
465,{jiA_IDEAL_M,  IDEAL_CMD,      MATRIX_CMD }
466,{jiA_INT,      INT_CMD,        INT_CMD }
467,{jiA_IDEAL,    MATRIX_CMD,     MATRIX_CMD }
468,{jiA_MAP_ID,   MAP_CMD,        IDEAL_CMD }
469,{jiA_MAP,      MAP_CMD,        MAP_CMD }
470,{jiA_IDEAL,    MODUL_CMD,      MODUL_CMD }
471,{jiA_MODUL_P,  MODUL_CMD,      POLY_CMD }
472,{jiA_POLY,     POLY_CMD,       POLY_CMD }
473,{jiA_1x1MATRIX,POLY_CMD,       MATRIX_CMD }
474,{jiA_QRING,    QRING_CMD,      IDEAL_CMD }
475,{jiA_RING,     RING_CMD,       RING_CMD }
476,{jiA_RING,     QRING_CMD,      QRING_CMD }
477,{jiA_STRING,   STRING_CMD,     STRING_CMD }
478,{jiA_STRING,   PROC_CMD,       STRING_CMD }
479,{jiA_STRING,   PROC_CMD,       PROC_CMD }
480,{jiA_POLY,     VECTOR_CMD,     VECTOR_CMD }
481,{jiA_INTVEC,   INTVEC_CMD,     INTVEC_CMD }
482,{jiA_INTVEC,   INTMAT_CMD,     INTMAT_CMD }
483,{jiA_NUMBER,   NUMBER_CMD,     NUMBER_CMD }
484,{jiA_LIST,     LIST_CMD,       LIST_CMD }
485,{jiA_LINK,     LINK_CMD,       STRING_CMD }
486,{jiA_LINK,     LINK_CMD,       LINK_CMD }
487,{NULL,         0,              0 }
488};
489struct sValAssign_sys dAssign_sys[]=
490{
491// sysvars:
492 {jjECHO,       VECHO,          INT_CMD }
493#ifdef SRING
494,{jjALTVARS,    VALTVARS,       INT_CMD }
495#endif
496,{jjPAGELENGTH, VPAGELENGTH,    INT_CMD }
497,{jjPRINTLEVEL, VPRINTLEVEL,    INT_CMD }
498,{jjCOLMAX,     VCOLMAX,        INT_CMD }
499,{jjTIMER,      VTIMER,         INT_CMD }
500#ifdef HAVE_RTIMER
501,{jjRTIMER,     VRTIMER,        INT_CMD }
502#endif
503,{jjMAXDEG,     VMAXDEG,        INT_CMD }
504,{jjMAXMULT,    VMAXMULT,       INT_CMD }
505,{jjTRACE,      TRACE,          INT_CMD }
506,{jjSHORTOUT,   VSHORTOUT,      INT_CMD }
507,{jjMINPOLY,    VMINPOLY,       NUMBER_CMD }
508,{jjNOETHER,    VNOETHER,       POLY_CMD }
509,{NULL,         0,              0 }
510};
511/*=================== operations ============================*/
512/*2
513* assign a = b
514*/
515static BOOLEAN jiAssign_1(leftv l, leftv r)
516{
517  int rt=r->Typ();
518  if (rt==0)
519  {
520    if (!errorreported) Werror("`%s` is undefined",r->name);
521    return TRUE;
522  }
523
524  int lt=l->Typ();
525  if((lt==0)&&(l->name!=NULL))
526  {
527    if (!errorreported) Werror("left side `%s` is undefined",l->name);
528    return TRUE;
529  }
530  if((rt==DEF_CMD)||(rt==NONE))
531  {
532    if (!errorreported) WerrorS("right side is not a datum");
533    return TRUE;
534  }
535
536  int i=0;
537  BOOLEAN nok=FALSE;
538
539  if (lt==DEF_CMD)
540  {
541    if (l->rtyp==IDHDL)
542    {
543      IDTYP((idhdl)l->data)=rt;
544    }
545    else if (l->name!=NULL)
546    {
547      sleftv ll;
548      iiDeclCommand(&ll,l,myynest,rt,&idroot);
549      memcpy(l,&ll,sizeof(sleftv));
550    }
551    else
552    {
553      l->rtyp=rt;
554    }
555    lt=rt;
556  }
557  else
558  {
559    if ((l->data==r->data)&&(l->e==NULL)&&(r->e==NULL))
560      return FALSE;
561  }
562  leftv ld=l;
563  if ((l->rtyp==IDHDL)&&(lt!=QRING_CMD)&&(lt!=RING_CMD))
564    ld=(leftv)l->data;
565  while (((dAssign[i].res!=lt)
566      || (dAssign[i].arg!=rt))
567    && (dAssign[i].res!=0)) i++;
568  if (dAssign[i].res!=0)
569  {
570    BOOLEAN b;
571    b=dAssign[i].p(ld,r,l->e);
572    if(l!=ld) /* i.e. l is IDHDL, l->data is ld */
573    {
574      l->flag=ld->flag;
575      l->attribute=ld->attribute;
576    }
577    return b;
578  }
579  // implicite type conversion ----------------------------------------------
580  if (dAssign[i].res==0)
581  {
582    int ri;
583    leftv rn = (leftv)Alloc0(sizeof(sleftv));
584    BOOLEAN failed=FALSE;
585    i=0;
586    while ((dAssign[i].res!=lt)
587      && (dAssign[i].res!=0)) i++;
588    while (dAssign[i].res==lt)
589    {
590      if ((ri=iiTestConvert(rt,dAssign[i].arg))!=0)
591      {
592        failed= iiConvert(rt,dAssign[i].arg,ri,r,rn);
593        if(!failed)
594        {
595          failed= dAssign[i].p(ld,rn,l->e);
596        }
597        // everything done, clean up temp. variables
598        rn->CleanUp();
599        Free((ADDRESS)rn,sizeof(sleftv));
600        if (failed)
601        {
602          // leave loop, goto error handling
603          break;
604        }
605        else
606        {
607          if(l!=ld) /* i.e. l is IDHDL, l->data is ld */
608          {
609            l->flag=ld->flag;
610            l->attribute=ld->attribute;
611          }
612          // everything ok, return
613          return FALSE;
614        }
615     }
616     i++;
617    }
618    // error handling ---------------------------------------------------
619    if (!errorreported)
620    {
621      Werror("`%s` = `%s` is not supported"
622             ,Tok2Cmdname(lt),Tok2Cmdname(rt));
623      if (BVERBOSE(V_SHOW_USE))
624      {
625        i=0;
626        while ((dAssign[i].res!=lt)
627          && (dAssign[i].res!=0)) i++;
628        while (dAssign[i].res==lt)
629        {
630          Werror("expected `%s` = `%s`"
631              ,Tok2Cmdname(lt),Tok2Cmdname(dAssign[i].arg));
632          i++;
633        }
634      }
635    }
636  }
637  return TRUE;
638}
639/*2
640* assign sys_var = val
641*/
642static BOOLEAN iiAssign_sys(leftv l, leftv r)
643{
644  int rt=r->Typ();
645
646  if (rt==0)
647  {
648    if (!errorreported) Werror("`%s` is undefined",r->name);
649    return TRUE;
650  }
651  int i=0;
652  int lt=l->rtyp;
653  while (((dAssign_sys[i].res!=lt)
654      || (dAssign_sys[i].arg!=rt))
655    && (dAssign_sys[i].res!=0)) i++;
656  if (dAssign_sys[i].res!=0)
657  {
658    if (!dAssign_sys[i].p(l,r))
659    {
660      // everything ok, clean up
661      return FALSE;
662    }
663  }
664  // implicite type conversion ----------------------------------------------
665  if (dAssign_sys[i].res==0)
666  {
667    int ri;
668    leftv rn = (leftv)Alloc0(sizeof(sleftv));
669    BOOLEAN failed=FALSE;
670    i=0;
671    while ((dAssign_sys[i].res!=lt)
672      && (dAssign_sys[i].res!=0)) i++;
673    while (dAssign_sys[i].res==lt)
674    {
675      if ((ri=iiTestConvert(rt,dAssign_sys[i].arg))!=0)
676      {
677        failed= ((iiConvert(rt,dAssign_sys[i].arg,ri,r,rn))
678            || (dAssign_sys[i].p(l,rn)));
679        // everything done, clean up temp. variables
680        rn->CleanUp();
681        Free((ADDRESS)rn,sizeof(sleftv));
682        if (failed)
683        {
684          // leave loop, goto error handling
685          break;
686        }
687        else
688        {
689          // everything ok, return
690          return FALSE;
691        }
692     }
693     i++;
694    }
695    // error handling ---------------------------------------------------
696    if(!errorreported)
697    {
698      Werror("`%s` = `%s` is not supported"
699             ,Tok2Cmdname(lt),Tok2Cmdname(rt));
700      if (BVERBOSE(V_SHOW_USE))
701      {
702        i=0;
703        while ((dAssign_sys[i].res!=lt)
704          && (dAssign_sys[i].res!=0)) i++;
705        while (dAssign_sys[i].res==lt)
706        {
707          Werror("expected `%s` = `%s`"
708              ,Tok2Cmdname(lt),Tok2Cmdname(dAssign_sys[i].arg));
709          i++;
710        }
711      }
712    }
713  }
714  return TRUE;
715}
716static BOOLEAN jiA_INTVEC_L(leftv l,leftv r)
717{
718  /* right side is intvec, left side is list (of int)*/
719  BOOLEAN nok;
720  int i=0;
721  leftv l1=l;
722  leftv h;
723  sleftv t;
724  intvec *iv=(intvec *)r->Data();
725  memset(&t,0,sizeof(sleftv));
726  t.rtyp=INT_CMD;
727  while ((i<iv->length())&&(l!=NULL))
728  {
729    t.data=(char *)(*iv)[i];
730    h=l->next;
731    l->next=NULL;
732    nok=jiAssign_1(l,&t);
733    if (nok) return TRUE;
734    i++;
735    l=h;
736  }
737  l1->CleanUp();
738  r->CleanUp();
739  return FALSE;
740}
741static BOOLEAN jjA_L_LIST(leftv l, leftv r)
742/* left side: list
743*  right side: expression list
744*/
745{
746  int sl = r->listLength();
747  lists L=(lists)Alloc(sizeof(slists));
748  leftv h=NULL,or=r;
749  int i;
750  int rt;
751
752  L->Init(sl);
753  for (i=0;i<sl;i++)
754  {
755    if (h!=NULL) { /* e.g. not in the first step:
756                   * h is the pointer to the old sleftv,
757                   * r is the pointer to the next sleftv
758                   * (in this moment) */
759                   h->next=r;
760                 }
761    h=r;
762    r=r->next;
763    h->next=NULL;
764    rt=h->Typ();
765    if ((rt==0)||(rt==NONE))
766    {
767      L->Clean();
768      Werror("`%s` is undefined",h->Name());
769      return TRUE;
770    }
771    //if ((rt==RING_CMD)||(rt==QRING_CMD))
772    //{
773    //  L->m[i].rtyp=rt;
774    //  L->m[i].data=h->Data();
775    //  ((ring)L->m[i].data)->ref++;
776    //}
777    //else
778      L->m[i].Copy(h);
779  }
780  IDLIST((idhdl)l->data)->Clean();
781  IDLIST((idhdl)l->data)=L;
782  ipMoveId((idhdl)l->data);
783  or->CleanUp();
784  return FALSE;
785}
786static BOOLEAN jiA_L_LIST(leftv l, leftv r)
787/* left side: list
788*  right side: expression list
789*/
790{
791  int sl = r->listLength();
792  lists L=(lists)Alloc(sizeof(slists));
793  leftv h=NULL;
794  int i;
795  int rt;
796
797  L->Init(sl);
798  for (i=0;i<sl;i++)
799  {
800    if (h!=NULL) { /* e.g. not in the first step:
801                   * h is the pointer to the old sleftv,
802                   * r is the pointer to the next sleftv
803                   * (in this moment) */
804                   h->next=r;
805                 }
806    h=r;
807    r=r->next;
808    h->next=NULL;
809    rt=h->Typ();
810    if (rt==0)
811    {
812      L->Clean();
813      Werror("`%s` is undefined",h->Name());
814      return TRUE;
815    }
816    if ((rt==RING_CMD)||(rt==QRING_CMD))
817    {
818      L->m[i].rtyp=rt;
819      L->m[i].data=h->Data();
820      ((ring)L->m[i].data)->ref++;
821    }
822    else
823      L->m[i].Copy(h);
824  }
825  IDLIST((idhdl)l->data)->Clean();
826  IDLIST((idhdl)l->data)=L;
827  return FALSE;
828}
829static BOOLEAN jjA_L_INTVEC(leftv l,leftv r,intvec *iv)
830{
831  /* left side is intvec/intmat, right side is list (of int,intvec,intmat)*/
832  leftv hh=r;
833  int i = 0;
834  while (hh!=NULL)
835  {
836    if (i>=iv->length()) break;
837    if (hh->Typ() == INT_CMD)
838    {
839      (*iv)[i++] = (int)(hh->Data());
840    }
841    else if ((hh->Typ() == INTVEC_CMD)
842            ||(hh->Typ() == INTMAT_CMD))
843    {
844      intvec *ivv = (intvec *)(hh->Data());
845      int ll = 0,l = min(ivv->length(),iv->length());
846      for (; l>0; l--)
847      {
848        (*iv)[i++] = (*ivv)[ll++];
849      }
850    }
851    else
852    {
853      delete iv;
854      return TRUE;
855    }
856    hh = hh->next;
857  }
858  if (IDINTVEC((idhdl)l->data)!=NULL) delete IDINTVEC((idhdl)l->data);
859  IDINTVEC((idhdl)l->data)=iv;
860  return FALSE;
861}
862static BOOLEAN jjA_L_STRING(leftv l,leftv r)
863{
864  /* left side is string, right side is list of string*/
865  leftv hh=r;
866  int sl = 1;
867  char *s;
868  char *t;
869  int tl;
870  /* find the length */
871  while (hh!=NULL)
872  {
873    if (hh->Typ()!= STRING_CMD)
874    {
875      return TRUE;
876    }
877    sl += strlen((char *)hh->Data());
878    hh = hh->next;
879  }
880  s = (char * )AllocL(sl);
881  sl=0;
882  hh = r;
883  while (hh!=NULL)
884  {
885    t=(char *)hh->Data();
886    tl=strlen(t);
887    memcpy(s+sl,t,tl);
888    sl+=tl;
889    hh = hh->next;
890  }
891  s[sl]='\0';
892  FreeL((ADDRESS)IDDATA((idhdl)(l->data)));
893  IDDATA((idhdl)(l->data))=s;
894  return FALSE;
895}
896static BOOLEAN jjA_LIST_L(leftv l,leftv r)
897{
898  /*left side are something, right side are lists*/
899  /*e.g. a,b,c=l */
900  //int ll=l->listLength();
901  if (l->listLength()==1) return jiAssign_1(l,r);
902  BOOLEAN nok;
903  sleftv t;
904  leftv h;
905  lists L=(lists)r->Data();
906  int rl=L->nr;
907  int i=0;
908
909  memset(&t,0,sizeof(sleftv));
910  while ((i<=rl)&&(l!=NULL))
911  {
912    memset(&t,0,sizeof(sleftv));
913    t.Copy(&L->m[i]);
914    h=l->next;
915    l->next=NULL;
916    nok=jiAssign_1(l,&t);
917    if (nok) return TRUE;
918    i++;
919    l=h;
920  }
921  r->CleanUp();
922  return FALSE;
923}
924static BOOLEAN jiA_MATRIX_L(leftv l,leftv r)
925{
926  /* right side is matrix, left side is list (of poly)*/
927  BOOLEAN nok=FALSE;
928  int i;
929  matrix m=(matrix)r->CopyD(MATRIX_CMD);
930  leftv h;
931  leftv ol=l;
932  leftv or=r;
933  sleftv t;
934  memset(&t,0,sizeof(sleftv));
935  t.rtyp=POLY_CMD;
936  loop
937  {
938    i=0;
939    while ((i<MATROWS(m)*MATCOLS(m))&&(l!=NULL))
940    {
941      t.data=(char *)m->m[i];
942      m->m[i]=NULL;
943      h=l->next;
944      l->next=NULL;
945      nok=jiAssign_1(l,&t);
946      l->next=h;
947      if (nok)
948      {
949        idDelete((ideal *)&m);
950        goto ende;
951      }
952      i++;
953      l=h;
954    }
955    idDelete((ideal *)&m);
956    h=r;
957    r=r->next;
958    if (l==NULL)
959    {
960      if (r!=NULL)
961      {
962        Warn("list length mismatch in assign (l>r)");
963        nok=TRUE;
964      }
965      break;
966    }
967    else if (r==NULL)
968    {
969      Warn("list length mismatch in assign (l<r)");
970      nok=TRUE;
971      break;
972    }
973    if ((r->Typ()==IDEAL_CMD)||(r->Typ()==MATRIX_CMD))
974      m=(matrix)r->CopyD(MATRIX_CMD);
975    else if (r->Typ()==POLY_CMD)
976    {
977      m=mpNew(1,1);
978      MATELEM(m,1,1)=(poly)r->CopyD(POLY_CMD);
979    }
980    else
981    {
982      nok=TRUE;
983      break;
984    }
985  }
986ende:
987  or->CleanUp();
988  ol->CleanUp();
989  return nok;
990}
991static BOOLEAN jiA_STRING_L(leftv l,leftv r)
992{
993  /*left side are strings, right side is a string*/
994  /*e.g. s[2..3]="12" */
995  /*the case s=t[1..4] is handled in iiAssign,
996  * the case s[2..3]=t[3..4] is handled in iiAssgn_rec*/
997  int ll=l->listLength();
998  int rl=r->listLength();
999  BOOLEAN nok=FALSE;
1000  sleftv t;
1001  leftv h,l1=l;
1002  int i=0;
1003  char *ss;
1004  char *s=(char *)r->Data();
1005  int sl=strlen(s);
1006
1007  memset(&t,0,sizeof(sleftv));
1008  t.rtyp=STRING_CMD;
1009  while ((i<sl)&&(l!=NULL))
1010  {
1011    ss=(char *)AllocL(2);
1012    ss[1]='\0';
1013    ss[0]=s[i];
1014    t.data=ss;
1015    h=l->next;
1016    l->next=NULL;
1017    nok=jiAssign_1(l,&t);
1018    if (nok)
1019    {
1020      break;
1021    }
1022    i++;
1023    l=h;
1024  }
1025  r->CleanUp();
1026  l1->CleanUp();
1027  return nok;
1028}
1029static BOOLEAN jiAssign_list(leftv l, leftv r)
1030{
1031  int i=l->e->start-1;
1032  if (i<0)
1033  {
1034    Werror("index[%d] must be positive",i+1);
1035    return TRUE;
1036  }
1037  if(l->attribute!=NULL)
1038  {
1039    atKillAll((idhdl)l);
1040    l->attribute=NULL;
1041  }
1042  l->flag=0;
1043  lists li;
1044  if (l->rtyp==IDHDL)
1045  {
1046    li=IDLIST((idhdl)l->data);
1047  }
1048  else
1049  {
1050    li=(lists)l->data;
1051  }
1052  if (i>li->nr)
1053  {
1054    li->m=(leftv)ReAlloc(li->m,(li->nr+1)*sizeof(sleftv),(i+1)*sizeof(sleftv));
1055    memset(&(li->m[li->nr+1]),0,(i-li->nr)*sizeof(sleftv));
1056    int j=li->nr+1;
1057    for(;j<=i;j++)
1058      li->m[j].rtyp=DEF_CMD;
1059    li->nr=i;
1060  }
1061  leftv ld=&(li->m[i]);
1062  ld->e=l->e->next;
1063  BOOLEAN b;
1064  if ((ld->rtyp!=LIST_CMD)
1065  &&(ld->e==NULL)
1066  &&(ld->Typ()!=r->Typ()))
1067  {
1068    sleftv tmp;
1069    memset(&tmp,0,sizeof(sleftv));
1070    tmp.rtyp=DEF_CMD;
1071    b=iiAssign(&tmp,r);
1072    ld->CleanUp();
1073    memcpy(ld,&tmp,sizeof(sleftv));
1074  }
1075  else
1076  {
1077    b=iiAssign(ld,r);
1078    l->e->next=ld->e;
1079  }
1080  return b;
1081}
1082static BOOLEAN jiAssign_rec(leftv l, leftv r)
1083{
1084  leftv l1=l;
1085  leftv r1=r;
1086  leftv lrest;
1087  leftv rrest;
1088  BOOLEAN b;
1089  do
1090  {
1091    lrest=l->next;
1092    rrest=r->next;
1093    l->next=NULL;
1094    r->next=NULL;
1095    b=iiAssign(l,r);
1096    l->next=lrest;
1097    r->next=rrest;
1098    l=lrest;
1099    r=rrest;
1100  } while  ((!b)&&(l!=NULL));
1101  l1->CleanUp();
1102  r1->CleanUp();
1103  return b;
1104}
1105BOOLEAN iiAssign(leftv l, leftv r)
1106{
1107  int ll=l->listLength();
1108  int rl;
1109  int lt=l->Typ();
1110  int rt=NONE;
1111  BOOLEAN b;
1112
1113  if(l->attribute!=NULL)
1114  {
1115    if (l->rtyp==IDHDL)
1116    {
1117      atKillAll((idhdl)l->data);
1118      l->attribute=NULL;
1119    }
1120    else
1121      atKillAll((idhdl)l);
1122  }
1123  if(l->rtyp==IDHDL)
1124  {
1125    IDFLAG((idhdl)l->data)=0;
1126  }
1127  l->flag=0;
1128  if (ll==1)
1129  {
1130    /* l[..] = ... */
1131    if((l->e!=NULL)
1132    && (((l->rtyp==IDHDL) && (IDTYP((idhdl)l->data)==LIST_CMD))
1133      || (l->rtyp==LIST_CMD)))
1134    {
1135       if(r->next!=NULL)
1136         b=jiA_L_LIST(l,r);
1137       else
1138         b=jiAssign_list(l,r);
1139       if((l->rtyp==IDHDL) && (l->data!=NULL))
1140       {
1141         ipMoveId((idhdl)l->data);
1142         l->attribute=IDATTR((idhdl)l->data);
1143         l->flag=IDFLAG((idhdl)l->data);
1144       }
1145       r->CleanUp();
1146       Subexpr h;
1147       while (l->e!=NULL)
1148       {
1149         h=l->e->next;
1150         Free((ADDRESS)l->e,sizeof(*(l->e)));
1151         l->e=h;
1152       }
1153       return b;
1154    }
1155    rl=r->listLength();
1156    if (rl==1)
1157    {
1158      /* system variables = ... */
1159      if(((l->rtyp>=VECHO)&&(l->rtyp<=VPRINTLEVEL))
1160      ||((l->rtyp>=VALTVARS)&&(l->rtyp<=VMINPOLY)))
1161      {
1162         b=iiAssign_sys(l,r);
1163         r->CleanUp();
1164         //l->CleanUp();
1165         return b;
1166      }
1167      rt=r->Typ();
1168      /* a = ... */
1169      if ((lt!=MATRIX_CMD)
1170      &&(lt!=INTMAT_CMD)
1171      &&((lt==rt)||(lt!=LIST_CMD)))
1172      {
1173         b=jiAssign_1(l,r);
1174         if (l->rtyp==IDHDL)
1175         {
1176           if ((lt==DEF_CMD)||(lt=LIST_CMD)) ipMoveId((idhdl)l->data);
1177           l->attribute=IDATTR((idhdl)l->data);
1178           l->flag=IDFLAG((idhdl)l->data);
1179           l->CleanUp();
1180         }
1181         r->CleanUp();
1182         return b;
1183      }
1184      if ((lt!=LIST_CMD)
1185      &&((rt==MATRIX_CMD)
1186        ||(rt==INTMAT_CMD)
1187        ||(rt==INTVEC_CMD)
1188        ||(rt==MODUL_CMD)))
1189      {
1190         b=jiAssign_1(l,r);
1191         if((l->rtyp==IDHDL)&&(l->data!=NULL))
1192         {
1193           if (lt==DEF_CMD) ipMoveId((idhdl)l->data);
1194           l->attribute=IDATTR((idhdl)l->data);
1195           l->flag=IDFLAG((idhdl)l->data);
1196         }
1197         r->CleanUp();
1198         Subexpr h;
1199         while (l->e!=NULL)
1200         {
1201           h=l->e->next;
1202           Free((ADDRESS)l->e,sizeof(*(l->e)));
1203           l->e=h;
1204         }
1205         return b;
1206      }
1207    }
1208    if (rt==NONE) rt=r->Typ();
1209  }
1210  else if (ll==(rl=r->listLength()))
1211  {
1212    b=jiAssign_rec(l,r);
1213    return b;
1214  }
1215  else
1216  {
1217    if (rt==NONE) rt=r->Typ();
1218    if (rt==INTVEC_CMD)
1219      return jiA_INTVEC_L(l,r);
1220    else if ((rt==IDEAL_CMD)||(rt==MATRIX_CMD))
1221      return jiA_MATRIX_L(l,r);
1222    else if ((rt==STRING_CMD)&&(rl==1))
1223      return jiA_STRING_L(l,r);
1224    Werror("length of lists in assignment does not match (l:%d,r:%d)",
1225      ll,rl);
1226    return TRUE;
1227  }
1228
1229  leftv hh=r;
1230  BOOLEAN nok=FALSE;
1231  BOOLEAN map_assign=FALSE;
1232  switch (lt)
1233  {
1234    case INTVEC_CMD:
1235      nok=jjA_L_INTVEC(l,r,new intvec(exprlist_length(r)));
1236      break;
1237    case INTMAT_CMD:
1238    {
1239      nok=jjA_L_INTVEC(l,r,new intvec(IDINTVEC((idhdl)l->data)));
1240      break;
1241    }
1242    case MAP_CMD:
1243    {
1244      // first element in the list sl (r) must be a ring
1245      if (((rt == RING_CMD)||(rt == QRING_CMD))&&(r->e==NULL))
1246      {
1247        FreeL((ADDRESS)IDMAP((idhdl)l->data)->preimage);
1248        IDMAP((idhdl)l->data)->preimage = mstrdup (r->Name());
1249        /* advance the expressionlist to get the next element after the ring */
1250        hh = r->next;
1251        //r=hh;
1252      }
1253      else
1254      {
1255        WerrorS("expected ring-name");
1256        nok=TRUE;
1257        break;
1258      }
1259      if (hh==NULL) /* map-assign: map f=r; */
1260      {
1261        WerrorS("expected image ideal");
1262        nok=TRUE;
1263        break;
1264      }
1265      if ((hh->next==NULL)&&(hh->Typ()==IDEAL_CMD))
1266        return jiAssign_1(l,hh); /* map-assign: map f=r,i; */
1267      //no break, handle the rest like an ideal:
1268      map_assign=TRUE;
1269    }
1270    case MATRIX_CMD:
1271    case IDEAL_CMD:
1272    case MODUL_CMD:
1273    {
1274      sleftv t;
1275      matrix olm = (matrix)l->Data();
1276      int rk=olm->rank;
1277      char *pr=((map)olm)->preimage;
1278      BOOLEAN module_assign=(/*l->Typ()*/ lt==MODUL_CMD);
1279      matrix lm ;
1280      matrix rm;
1281      int  num;
1282      int j,k;
1283      int i=0;
1284      int mtyp=MATRIX_CMD; /*Type of left side object*/
1285      int etyp=POLY_CMD;   /*Type of elements of left side object*/
1286
1287      if (lt /*l->Typ()*/==MATRIX_CMD)
1288      {
1289        num=olm->cols()*olm->rows();
1290        lm=mpNew(olm->rows(),olm->cols());
1291      }
1292      else /* IDEAL_CMD or MODUL_CMD */
1293      {
1294        num=exprlist_length(hh);
1295        lm=(matrix)idInit(num,1);
1296        rk=1;
1297        if (module_assign)
1298        {
1299          mtyp=MODUL_CMD;
1300          etyp=VECTOR_CMD;
1301        }
1302      }
1303
1304      int ht;
1305      loop
1306      {
1307        if (hh==NULL)
1308          break;
1309        else
1310        {
1311          ht=hh->Typ();
1312          if ((j=iiTestConvert(ht,etyp))!=0)
1313          {
1314            nok=iiConvert(ht,etyp,j,hh,&t);
1315            hh->next=t.next;
1316            if (nok) break;
1317            lm->m[i]=(poly)t.CopyD(etyp);
1318            if (module_assign) rk=max(rk,pMaxComp(lm->m[i]));
1319            i++;
1320          }
1321          else
1322          if ((j=iiTestConvert(ht,mtyp))!=0)
1323          {
1324            nok=iiConvert(ht,mtyp,j,hh,&t);
1325            hh->next=t.next;
1326            if (nok) break;
1327            rm = (matrix)t.CopyD(mtyp);
1328            if (module_assign)
1329            {
1330              j = min(num,rm->cols());
1331              rk=max(rk,rm->rank);
1332            }
1333            else
1334              j = min(num-i,rm->rows() * rm->cols());
1335            for(k=0;k<j;k++,i++)
1336            {
1337              lm->m[i]=rm->m[k];
1338              rm->m[k]=NULL;
1339            }
1340            idDelete((ideal *)&rm);
1341          }
1342          else
1343          {
1344            nok=TRUE;
1345            break;
1346          }
1347          t.next=NULL;t.CleanUp();
1348          if (i==num) break;
1349          hh=hh->next;
1350        }
1351      }
1352      if (nok)
1353        idDelete((ideal *)&lm);
1354      else
1355      {
1356        idDelete((ideal *)&olm);
1357        if (module_assign)   lm->rank=rk;
1358        else if (map_assign) ((map)lm)->preimage=pr;
1359#ifdef DRING
1360        else if (pDRING)
1361        {
1362          int i=IDELEMS(lm)-1;
1363          while (i>=0)
1364          {
1365            pdSetDFlag(lm->m[i],1);
1366            i--;
1367          }
1368        }
1369#endif
1370        l=l->LData();
1371        if (l->rtyp==IDHDL)
1372          IDMATRIX((idhdl)l->data)=lm;
1373        else
1374          l->data=(char *)lm;
1375      }
1376      break;
1377    }
1378    case STRING_CMD:
1379      nok=jjA_L_STRING(l,r);
1380      break;
1381    case LIST_CMD:
1382      nok=jjA_L_LIST(l,r);
1383      break;
1384    case NONE:
1385    case 0:
1386      Werror("cannot assign to %s",l->Name());
1387      nok=TRUE;
1388      break;
1389    default:
1390      WerrorS("assign not impl.");
1391      nok=TRUE;
1392      break;
1393  } /* end switch: typ */
1394  if (nok && (!errorreported)) WerrorS("incompatible type in list assignment");
1395  r->CleanUp();
1396  return nok;
1397}
Note: See TracBrowser for help on using the repository browser.