source: git/Singular/attrib.cc @ b7b08c

spielwiese
Last change on this file since b7b08c was b7b08c, checked in by Olaf Bachmann <obachman@…>, 25 years ago
* us short exponent vectors in divisbility tests * AllocSizeOf * garbage collection * scanner/gmp: allow .0 and 1. input of reals git-svn-id: file:///usr/local/Singular/svn/trunk@3711 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 7.2 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: attrib.cc,v 1.16 1999-10-14 14:26:57 obachman Exp $ */
5
6/*
7* ABSTRACT: attributes to leftv and idhdl
8*/
9
10#include <stdlib.h>
11#include <stdio.h>
12#include <string.h>
13#include <ctype.h>
14#include <unistd.h>
15
16#include "mod2.h"
17#include "tok.h"
18#include "ipid.h"
19#include "intvec.h"
20#include "polys.h"
21#include "ideals.h"
22#include "matpol.h"
23#include "ipshell.h"
24#include "attrib.h"
25#include "mmemory.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)Alloc0SizeOf(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)Alloc0SizeOf(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  FreeSizeOf((ADDRESS)this,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  else
354  {
355    int typ=c->Typ();
356    atSet(v,mstrdup(name),c->CopyD(typ),typ/*c->T(yp()*/);
357    if (h!=NULL) IDATTR(h)=v->attribute;
358  }
359  return FALSE;
360}
361
362BOOLEAN atKILLATTR1(leftv res,leftv a)
363{
364  if ((a->rtyp!=IDHDL)||(a->e!=NULL))
365  {
366    WerrorS("object must have a name");
367    return TRUE;
368  }
369  resetFlag(a,FLAG_STD);
370  resetFlag((idhdl)a->data,FLAG_STD);
371  resetFlag(a,FLAG_DOPERATOR);
372  resetFlag((idhdl)a->data,FLAG_DOPERATOR);
373  if (a->attribute!=NULL)
374  {
375    atKillAll((idhdl)a->data);
376    a->attribute=NULL;
377  }
378  return FALSE;
379}
380BOOLEAN atKILLATTR2(leftv res,leftv a,leftv b)
381{
382  if ((a->rtyp!=IDHDL)||(a->e!=NULL))
383  {
384    WerrorS("object must have a name");
385    return TRUE;
386  }
387  char *name=(char *)b->Data();
388  if (strcmp(name,"isSB")==0)
389  {
390    resetFlag(a,FLAG_STD);
391    resetFlag((idhdl)a->data,FLAG_STD);
392  }
393  else
394  {
395    atKill((idhdl)a->data,name);
396  }
397  return FALSE;
398}
Note: See TracBrowser for help on using the repository browser.