source: git/Singular/attrib.cc @ 194f5e5

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