source: git/Singular/attrib.cc @ 0e1846

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