source: git/Singular/attrib.cc @ 50a84c

spielwiese
Last change on this file since 50a84c was 50a84c, checked in by Hans Schönemann <hannes@…>, 25 years ago
* hannes: added ERROR, trace flag for proc git-svn-id: file:///usr/local/Singular/svn/trunk@2942 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 8.5 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: attrib.cc,v 1.11 1999-03-16 15:33:04 Singular 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 (v->Typ()==PROC_CMD)
266  {
267    procinfo *p=(procinfo *)v->Data();
268    if (p->trace_flag!=0)
269      Print("trace:%d\n",p->trace_flag);
270  }   
271  if (hasFlag(v,FLAG_STD))
272  {
273    PrintS("attr:isSB, type int\n");
274    if (at!=NULL) at->Print();
275  }
276  else
277  {
278    if (at!=NULL) at->Print();
279    else          PrintS("no attributes\n");
280  }
281  return FALSE;
282}
283BOOLEAN atATTRIB2(leftv res,leftv a,leftv b)
284{
285  char *name=(char *)b->Data();
286  leftv v=a;
287  if (a->e!=NULL)
288  {
289    v=a->LData();
290    if (v==NULL) return TRUE;
291  }
292  if (strcmp(name,"isSB")==0)
293  {
294    res->rtyp=INT_CMD;
295    res->data=(void *)hasFlag(v,FLAG_STD);
296  }
297  else if ((strcmp(name,"rank")==0)&&(v->Typ()==MODUL_CMD))
298  {
299    res->rtyp=INT_CMD;
300    res->data=(void *)(((ideal)v->Data())->rank);
301  }
302  else if ((v->Typ()==PROC_CMD) && (strcmp(name,"trace")==0))
303  {
304    procinfo *p=(procinfo *)v->Data();
305    res->rtyp=INT_CMD;
306    res->data=(void *)p->trace_flag;
307  }   
308  else
309  {
310    attr at=v->attribute->get(name);
311    if (at!=NULL)
312    {
313      res->rtyp=at->atyp;
314      res->data=at->CopyA();
315    }
316    else
317    {
318      res->rtyp=STRING_CMD;
319      res->data=mstrdup("");
320    }
321  }
322  return FALSE;
323}
324BOOLEAN atATTRIB3(leftv res,leftv a,leftv b,leftv c)
325{
326  idhdl h=(idhdl)a->data;
327  leftv v=a;
328  if (a->e!=NULL)
329  {
330    v=a->LData();
331    if (v==NULL) return TRUE;
332    h=NULL;
333  }
334  attr *at=&(v->attribute);
335  char *name=(char *)b->Data();
336  if (strcmp(name,"isSB")==0)
337  {
338    if (c->Typ()!=INT_CMD)
339    {
340      WerrorS("attrib isSB must be int");
341      return TRUE;
342    }
343    if (((int)c->Data())!=0)
344    {
345      if (h!=NULL) setFlag(h,FLAG_STD);
346      setFlag(v,FLAG_STD);
347    }
348    else
349    {
350      if (h!=NULL) resetFlag(h,FLAG_STD);
351      resetFlag(v,FLAG_STD);
352    }
353  }
354  else if ((strcmp(name,"rank")==0)&&(v->Typ()==MODUL_CMD))
355  {
356    if (c->Typ()!=INT_CMD)
357    {
358      WerrorS("attrib `rank` must be int");
359      return TRUE;
360    }
361    ideal I=(ideal)v->Data();
362    I->rank=max(I->rank,(int)c->Data());
363  }
364  else if ((strcmp(name,"trace")==0)&&(v->Typ()==PROC_CMD))
365  {
366    if (c->Typ()!=INT_CMD)
367    {
368      WerrorS("attrib `trace` must be int");
369      return TRUE;
370    }
371    procinfo *p=(procinfo *)v->Data();
372    p->trace_flag=(int)c->Data();
373  }   
374#ifdef DRING
375  else if (strcmp(name,"D")==0)
376  {
377    if (c->Typ()!=INT_CMD)
378    {
379      WerrorS("attrib `D` must be int");
380      return TRUE;
381    }
382    switch (v->Typ())
383    {
384      case POLY_CMD:
385      case VECTOR_CMD:
386        pdSetDFlagP((poly)v->Data(),(int)c->Data());
387        break;
388      case IDEAL_CMD:
389      case MODUL_CMD:
390        {
391          ideal I=(ideal)v->Data();
392          int i=IDELEMS(I)-1;
393          int cc=(int)c->Data();
394          while (i>=0) { pdSetDFlagP(I->m[i],cc); i--; }
395          break;
396        }
397      default:
398        WerrorS("cannot set attrib `D` for this type");
399    }
400  }
401#endif
402  else
403  {
404    atSet(v,mstrdup(name),c->CopyD(),c->Typ());
405    if (h!=NULL) IDATTR(h)=v->attribute;
406  }
407  return FALSE;
408}
409
410BOOLEAN atKILLATTR1(leftv res,leftv a)
411{
412  if ((a->rtyp!=IDHDL)||(a->e!=NULL))
413  {
414    WerrorS("object must have a name");
415    return TRUE;
416  }
417  resetFlag(a,FLAG_STD);
418  resetFlag((idhdl)a->data,FLAG_STD);
419  resetFlag(a,FLAG_DOPERATOR);
420  resetFlag((idhdl)a->data,FLAG_DOPERATOR);
421  if (a->attribute!=NULL)
422  {
423    atKillAll((idhdl)a->data);
424    a->attribute=NULL;
425  }
426  return FALSE;
427}
428BOOLEAN atKILLATTR2(leftv res,leftv a,leftv b)
429{
430  if ((a->rtyp!=IDHDL)||(a->e!=NULL))
431  {
432    WerrorS("object must have a name");
433    return TRUE;
434  }
435  char *name=(char *)b->Data();
436  if (strcmp(name,"isSB")==0)
437  {
438    resetFlag(a,FLAG_STD);
439    resetFlag((idhdl)a->data,FLAG_STD);
440  }
441#ifdef DRING
442  else if (strcmp(name,"D")==0)
443  {
444    resetFlag(a,FLAG_DOPERATOR);
445    resetFlag((idhdl)a->data,FLAG_DOPERATOR);
446  }
447#endif
448  else
449  {
450    atKill((idhdl)a->data,name);
451  }
452  return FALSE;
453}
Note: See TracBrowser for help on using the repository browser.