source: git/Singular/attrib.cc @ 400884

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