source: git/Singular/attrib.cc @ 4c001a

spielwiese
Last change on this file since 4c001a was 4c001a, checked in by Olaf Bachmann <obachman@…>, 27 years ago
Merged fixes from 1-0-0 release git-svn-id: file:///usr/local/Singular/svn/trunk@358 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 7.9 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/*
5* ABSTRACT: attributes to leftv and idhdl
6*/
7
8#include <stdlib.h>
9#include <stdio.h>
10#include <string.h>
11#include <ctype.h>
12
13#ifndef macintosh
14#include <unistd.h>
15#endif
16
17#include "mod2.h"
18#include "tok.h"
19#include "ipid.h"
20#include "intvec.h"
21#include "polys.h"
22#include "ideals.h"
23#include "matpol.h"
24#include "ipshell.h"
25#include "attrib.h"
26
27void sattr::Print()
28{
29  mmTestP(this,sizeof(sattr));
30  ::Print("attr:%s, type %s \n",name,Tok2Cmdname(atyp));
31  if (next!=NULL) next->Print();
32}
33
34attr sattr::Copy()
35{
36  mmTestP(this,sizeof(sattr));
37  attr n=(attr)Alloc0(sizeof(sattr));
38  n->atyp=atyp;
39  if (name!=NULL) n->name=mstrdup(name);
40  n->data=CopyA();
41  if (next!=NULL)
42  {
43    n->next=next->Copy();
44  }
45  return n;
46}
47
48void * sattr::CopyA()
49{
50  mmTestP(this,sizeof(sattr));
51  switch (atyp)
52  {
53    case INTVEC_CMD:
54      return (void *)ivCopy((intvec *)data);
55    case MATRIX_CMD:
56      return (void *)mpCopy((matrix)data);
57    case IDEAL_CMD:
58    case MODUL_CMD:
59      return (void *)idCopy((ideal)data);
60    case POLY_CMD:
61    case VECTOR_CMD:
62      return (void *)pCopy((poly)data);
63    case INT_CMD:
64      return (void *)data;
65    case STRING_CMD:
66      return (void *)mstrdup((char *)data);
67#ifdef TEST
68    default:
69      ::Print("CopyA: unknown type %d\n",atyp);  /* DEBUG */
70#endif
71  }
72  return NULL;
73}
74
75attr sattr::set(char * s, void * data, int t)
76{
77  attr h = get(s);
78  if (h!=NULL)
79  {
80    switch (h->atyp)
81    {
82    case INTVEC_CMD:
83      delete (intvec *)h->data;
84      break;
85    case IDEAL_CMD:
86    case MODUL_CMD:
87    case MATRIX_CMD:
88      idDelete((ideal *)&h->data);
89      break;
90    case POLY_CMD:
91    case VECTOR_CMD:
92      pDelete((poly *)&h->data);
93      break;
94    case INT_CMD:
95      break;
96    case STRING_CMD:
97      FreeL((ADDRESS)h->data);
98      break;
99#ifdef TEST
100    default:
101      ::Print("at-set: unknown type\n",atyp);  /* DEBUG */
102#endif
103    } /* end switch: (atyp) */
104    FreeL((ADDRESS)s);
105  }
106  else
107  {
108     h = (attr)Alloc0(sizeof(sattr));
109     h->name = s;
110     h->next = this;
111     h->data = data;
112     h->atyp = t;
113     return  h;
114  }
115  //::Print("set attr >>%s<< of type %d\n",h->name,t);
116  h->data = data;
117  h->atyp = t;
118  return  this;
119}
120
121attr sattr::get(char * s)
122{
123  attr h = this;
124  while (h!=NULL)
125  {
126    if (0 == strcmp(s,h->name)) return h;
127    h = h->next;
128  }
129  return NULL;
130}
131
132void * atGet(idhdl root,char * name)
133{
134  attr temp = root->attribute->get(name);
135  if (temp!=NULL)
136    return temp->data;
137  else
138    return NULL;
139}
140
141void * atGet(leftv root,char * name)
142{
143  attr temp = root->attribute->get(name);
144  if ((temp==NULL) && (root->rtyp==IDHDL))
145  {
146    idhdl h=(idhdl)root->data;
147    temp=h->attribute->get(name);
148  }
149  if (temp!=NULL)
150    return temp->data;
151  else
152    return NULL;
153}
154
155void atSet(idhdl root,char * name,void * data,int typ)
156{
157  if (root!=NULL)
158  {
159    root->attribute=root->attribute->set(name,data,typ);
160  }
161}
162
163void atSet(leftv root,char * name,void * data,int typ)
164{
165  if (root!=NULL)
166  {
167    if (root->e!=NULL)
168    {
169      Werror("object must have a name for attrib %s",name);
170    }
171    else
172    {
173      if (root->rtyp==IDHDL)
174      {
175        idhdl h=(idhdl)root->data;
176        h->attribute=h->attribute->set(name,data,typ);
177        root->attribute=h->attribute;
178      }
179      else
180      {
181        root->attribute=root->attribute->set(name,data,typ);
182      }
183    }
184  }
185}
186
187void sattr::kill()
188{
189  FreeL((ADDRESS)name);
190  name=NULL;
191  switch (atyp)
192  {
193  case INTVEC_CMD:
194    delete (intvec *)data;
195    break;
196  case IDEAL_CMD:
197  case MODUL_CMD:
198  case MATRIX_CMD:
199    idDelete((ideal *)&data);
200    break;
201  case POLY_CMD:
202  case VECTOR_CMD:
203    pDelete((poly *)&data);
204    break;
205  case INT_CMD:
206    break;
207  case STRING_CMD:
208    FreeL((ADDRESS)data);
209    break;
210#ifdef TEST
211  default:
212    ::Print("atKill: unknown type\n",atyp);  /* DEBUG */
213#endif
214  } /* end switch: (atyp) */
215  data=NULL;
216  Free((ADDRESS)this,sizeof(sattr));
217}
218
219void sattr::killAll()
220{
221  attr temp = this,temp1;
222
223  while (temp!=NULL)
224  {
225    temp1 = temp->next;
226    temp->kill();
227    temp = temp1;
228  }
229}
230
231void atKill(idhdl root,char * name)
232{
233  attr temp = root->attribute->get(name);
234  if (temp!=NULL)
235  {
236    attr N = temp->next;
237    attr temp1 = root->attribute;
238    if (temp1==temp)
239    {
240      root->attribute = N;
241    }
242    else
243    {
244      while (temp1->next!=temp) temp1 = temp1->next;
245      temp1->next = N;
246    }
247    temp->kill();
248  }
249}
250
251void atKillAll(idhdl root)
252{
253  root->attribute->killAll();
254  root->attribute = NULL;
255}
256
257BOOLEAN atATTRIB1(leftv res,leftv a)
258{
259  leftv v=a;
260  if (a->e!=NULL)
261  {
262    v=a->LData();
263    if (v==NULL) return TRUE;
264  }
265  attr at=v->attribute;
266  if (hasFlag(v,FLAG_STD))
267  {
268    PrintS("attr:isSB, type int\n");
269    if (at!=NULL) at->Print();
270  }
271  else
272  {
273    if (at!=NULL) at->Print();
274    else          PrintS("no attributes\n");
275  }
276  return FALSE;
277}
278BOOLEAN atATTRIB2(leftv res,leftv a,leftv b)
279{
280  char *name=(char *)b->Data();
281  leftv v=a;
282  if (a->e!=NULL)
283  {
284    v=a->LData();
285    if (v==NULL) return TRUE;
286  }
287  if (strcmp(name,"isSB")==0)
288  {
289    res->rtyp=INT_CMD;
290    res->data=(void *)hasFlag(v,FLAG_STD);
291  }
292  else if ((strcmp(name,"rank")==0)&&(v->Typ()==MODUL_CMD))
293  {
294    res->rtyp=INT_CMD;
295    res->data=(void *)(((ideal)v->Data())->rank);
296  }
297  else
298  {
299    attr at=v->attribute->get(name);
300    if (at!=NULL)
301    {
302      res->rtyp=at->atyp;
303      res->data=at->CopyA();
304    }
305    else
306    {
307      res->rtyp=STRING_CMD;
308      res->data=mstrdup("");
309    }
310  }
311  return FALSE;
312}
313BOOLEAN atATTRIB3(leftv res,leftv a,leftv b,leftv c)
314{
315  idhdl h=(idhdl)a->data;
316  leftv v=a;
317  if (a->e!=NULL)
318  {
319    v=a->LData();
320    if (v==NULL) return TRUE;
321    h=NULL;
322  }
323  attr *at=&(v->attribute);
324  char *name=(char *)b->Data();
325  if (strcmp(name,"isSB")==0)
326  {
327    if (c->Typ()!=INT_CMD)
328    {
329      WerrorS("attrib isSB must be int");
330      return TRUE;
331    }
332    if (((int)c->Data())!=0)
333    {
334      if (h!=NULL) setFlag(h,FLAG_STD);
335      setFlag(v,FLAG_STD);
336    }
337    else
338    {
339      if (h!=NULL) resetFlag(h,FLAG_STD);
340      resetFlag(v,FLAG_STD);
341    }
342  }
343  else if ((strcmp(name,"rank")==0)&&(v->Typ()==MODUL_CMD))
344  {
345    if (c->Typ()!=INT_CMD)
346    {
347      WerrorS("attrib `rank` must be int");
348      return TRUE;
349    }
350    ideal I=(ideal)v->Data();
351    I->rank=max(I->rank,(int)c->Data());
352  }
353#ifdef DRING
354  else if (strcmp(name,"D")==0)
355  {
356    if (c->Typ()!=INT_CMD)
357    {
358      WerrorS("attrib `D` must be int");
359      return TRUE;
360    }
361    switch (v->Typ())
362    {
363      case POLY_CMD:
364      case VECTOR_CMD:
365        pdSetDFlag((poly)v->Data(),(int)c->Data());
366        break;
367      case IDEAL_CMD:
368      case MODUL_CMD:
369        {
370          ideal I=(ideal)v->Data();
371          int i=IDELEMS(I)-1;
372          int cc=(int)c->Data();
373          while (i>=0) { pdSetDFlag(I->m[i],cc); i--; }
374          break;
375        }
376      default:
377        WerrorS("cannot set attrib `D` for this type");
378    }
379  }
380#endif
381  else
382  {
383    atSet(v,mstrdup(name),c->CopyD(),c->Typ());
384    if (h!=NULL) IDATTR(h)=v->attribute;
385  }
386  return FALSE;
387}
388
389BOOLEAN atKILLATTR1(leftv res,leftv a)
390{
391  if ((a->rtyp!=IDHDL)||(a->e!=NULL))
392  {
393    WerrorS("object must have a name");
394    return TRUE;
395  }
396  resetFlag(a,FLAG_STD);
397  resetFlag((idhdl)a->data,FLAG_STD);
398  resetFlag(a,FLAG_DOPERATOR);
399  resetFlag((idhdl)a->data,FLAG_DOPERATOR);
400  if (a->attribute!=NULL)
401  {
402    atKillAll((idhdl)a->data);
403    a->attribute=NULL;
404  }
405  return FALSE;
406}
407BOOLEAN atKILLATTR2(leftv res,leftv a,leftv b)
408{
409  if ((a->rtyp!=IDHDL)||(a->e!=NULL))
410  {
411    WerrorS("object must have a name");
412    return TRUE;
413  }
414  char *name=(char *)b->Data();
415  if (strcmp(name,"isSB")==0)
416  {
417    resetFlag(a,FLAG_STD);
418    resetFlag((idhdl)a->data,FLAG_STD);
419  }
420#ifdef DRING
421  else if (strcmp(name,"D")==0)
422  {
423    resetFlag(a,FLAG_DOPERATOR);
424    resetFlag((idhdl)a->data,FLAG_DOPERATOR);
425  }
426#endif
427  else
428  {
429    atKill((idhdl)a->data,name);
430  }
431  return FALSE;
432}
Note: See TracBrowser for help on using the repository browser.