source: git/Singular/blackbox.cc @ 16c27a

fieker-DuValspielwiese
Last change on this file since 16c27a was 17f056, checked in by Hans Schoenemann <hannes@…>, 4 years ago
chg: impl. backbox_default_Assign
  • Property mode set to 100644
File size: 6.6 KB
Line 
1#include "kernel/mod2.h"
2
3#include "Singular/tok.h"
4#include "Singular/subexpr.h"
5#include "Singular/ipshell.h"
6#include "Singular/ipid.h"
7
8#include "Singular/blackbox.h"
9
10#define MAX_BB_TYPES 256
11// #define BLACKBOX_DEVEL 1
12
13GLOBAL_VAR static blackbox* blackboxTable[MAX_BB_TYPES];
14GLOBAL_VAR static char *    blackboxName[MAX_BB_TYPES];
15GLOBAL_VAR static int blackboxTableCnt=0;
16#define BLACKBOX_OFFSET (MAX_TOK+1)
17blackbox* getBlackboxStuff(const int t)
18{
19  if (t>MAX_TOK)  /*MAX_TOK+1 is BLACKBOX_OFFSET*/
20    return (blackboxTable[t-BLACKBOX_OFFSET]);
21  else
22    return NULL;
23}
24
25
26void blackbox_default_destroy(blackbox */*b*/, void */*d*/)
27{
28  WerrorS("missing blackbox_destroy");
29}
30char *blackbox_default_String(blackbox */*b*/,void */*d*/)
31{
32  WerrorS("missing blackbox_String");
33  return omStrDup("");
34}
35void *blackbox_default_Copy(blackbox */*b*/,void */*d*/)
36{
37  WerrorS("missing blackbox_Copy");
38  return NULL;
39}
40BOOLEAN blackbox_default_Assign(leftv l, leftv r)
41{
42  int lt=l->Typ();
43  blackbox* b=getBlackboxStuff(lt);
44  if ((lt==r->Typ())
45  && (l->Data()!=r->Data()))
46  {
47    b->blackbox_destroy(b,(void*)l->Data());
48    if (l->rtyp==IDHDL)
49      IDDATA((idhdl)l->data)=(char*)b->blackbox_Copy(b,r->Data());
50    else
51      l->data=b->blackbox_Copy(b,r->Data());
52  }
53  return FALSE;
54}
55void blackbox_default_Print(blackbox *b,void *d)
56{
57  char *s=b->blackbox_String(b,d);
58  PrintS(s);
59  omFree(s);
60}
61void *blackbox_default_Init(blackbox */*b*/)
62{
63  return NULL;
64}
65
66BOOLEAN blackbox_default_serialize(blackbox */*b*/, void */*d*/, si_link /*f*/)
67{
68  WerrorS("blackbox_serialize is not implemented");
69  return TRUE;
70}
71
72BOOLEAN blackbox_default_deserialize(blackbox **/*b*/, void **/*d*/, si_link /*f*/)
73{
74  WerrorS("blackbox_deserialize is not implemented");
75  return TRUE;
76}
77
78BOOLEAN blackboxDefaultOp1(int op,leftv l, leftv r)
79{
80  if (op==TYPEOF_CMD)
81  {
82    l->data=omStrDup(getBlackboxName(r->Typ()));
83    l->rtyp=STRING_CMD;
84    return FALSE;
85  }
86  else if (op==NAMEOF_CMD)
87  {
88    if (r->name==NULL) l->data=omStrDup("");
89    else               l->data=omStrDup(r->name);
90    l->rtyp=STRING_CMD;
91    return FALSE;
92  }
93
94  return TRUE;
95}
96
97BOOLEAN blackboxDefaultOp2(int /*op*/,leftv /*l*/, leftv /*r1*/, leftv /*r2*/)
98{
99  return TRUE;
100}
101
102BOOLEAN blackboxDefaultOp3(int /*op*/,leftv /*l*/, leftv /*r1*/,leftv /*r2*/, leftv /*r3*/)
103{
104  return TRUE;
105}
106
107BOOLEAN blackboxDefaultOpM(int op,leftv res, leftv args)
108{
109  if (op==LIST_CMD)
110  {
111    res->rtyp=LIST_CMD;
112    BOOLEAN bo=jjLIST_PL(res,args);
113    args->CleanUp();
114    return bo;
115  }
116  else if(op==STRING_CMD)
117  {
118    blackbox *b=getBlackboxStuff(args->Typ());
119    res->data=b->blackbox_String(b,args->Data());
120    res->rtyp=STRING_CMD;
121    args=args->next;
122    if(args!=NULL)
123    {
124      sleftv res2;
125      int ret=iiExprArithM(&res2,args,op);
126      if (ret) return TRUE;
127      char *s2=(char*)omAlloc(strlen((char*)res->data)+strlen((char*)res2.data)+1);
128      sprintf(s2,"%s%s",(char*)res->data,(char*)res2.data);
129      omFree(res2.data);
130      omFree(res->data);
131      res->data=s2;
132    }
133    return FALSE;
134  }
135  return TRUE;
136}
137
138BOOLEAN blackbox_default_Check(blackbox *,leftv,leftv)
139{
140  return FALSE;
141}
142int setBlackboxStuff(blackbox *bb, const char *n)
143{
144  int where = -1;
145  for (int i=0;i<MAX_BB_TYPES;i++)
146  {
147    if (blackboxTable[i]!=NULL && strcmp(blackboxName[i],n)==0) {
148      where = i;
149      break;
150    }
151  }
152  if (where < 0) {
153    if (MAX_BB_TYPES<=blackboxTableCnt)
154    {
155      // second try, find empty slot from removed bb:
156      for (int i=0;i<MAX_BB_TYPES;i++)
157      {
158        if (blackboxTable[i]==NULL) { where=i; break; }
159      }
160    }
161    else
162    {
163      where=blackboxTableCnt;
164      blackboxTableCnt++;
165    }
166  }
167  if (where==-1)
168  {
169    WerrorS("too many bb types defined");
170    return 0;
171  }
172  else
173  {
174    // check for alreday defined bb:
175    for (int i=0;i<MAX_BB_TYPES;i++)
176    {
177      if ((blackboxName[i]!=NULL) && (strcmp(blackboxName[i],n)==0))
178      {
179        Warn("not redefining blackbox type %s (%d)",n,i+BLACKBOX_OFFSET);
180        return 0;
181      }
182    }
183    blackboxTable[where]=bb;
184    blackboxName[where]=omStrDup(n);
185#ifdef BLACKBOX_DEVEL
186    Print("setBlackboxStuff: define bb:name=%s:rt=%d (table:cnt=%d)\n",blackboxName[where],where+BLACKBOX_OFFSET,where);
187#endif
188    if (bb->blackbox_destroy==NULL) bb->blackbox_destroy=blackbox_default_destroy;
189    if (bb->blackbox_String==NULL)  bb->blackbox_String=blackbox_default_String;
190    if (bb->blackbox_Print==NULL)   bb->blackbox_Print=blackbox_default_Print;
191    if (bb->blackbox_Init==NULL)    bb->blackbox_Init=blackbox_default_Init;
192    if (bb->blackbox_Copy==NULL)    bb->blackbox_Copy=blackbox_default_Copy;
193    if (bb->blackbox_Assign==NULL)  bb->blackbox_Assign=blackbox_default_Assign;
194    if (bb->blackbox_Op1==NULL)     bb->blackbox_Op1=blackboxDefaultOp1;
195    if (bb->blackbox_Op2==NULL)     bb->blackbox_Op2=blackboxDefaultOp2;
196    if (bb->blackbox_Op3==NULL)     bb->blackbox_Op3=blackboxDefaultOp3;
197    if (bb->blackbox_OpM==NULL)     bb->blackbox_OpM=blackboxDefaultOpM;
198    if (bb->blackbox_CheckAssign==NULL) bb->blackbox_CheckAssign=blackbox_default_Check;
199    if (bb->blackbox_serialize==NULL) bb->blackbox_serialize=blackbox_default_serialize;
200    if (bb->blackbox_deserialize==NULL) bb->blackbox_deserialize=blackbox_default_deserialize;
201    return where+BLACKBOX_OFFSET;
202  }
203}
204
205void removeBlackboxStuff(const int rt)
206{
207  omfree(blackboxTable[rt-BLACKBOX_OFFSET]);
208  omfree(blackboxName[rt-BLACKBOX_OFFSET]);
209  blackboxTable[rt-BLACKBOX_OFFSET]=NULL;
210  blackboxName[rt-BLACKBOX_OFFSET]=NULL;
211}
212const char *getBlackboxName(const int t)
213{
214 char *b=blackboxName[t-BLACKBOX_OFFSET];
215  if (b!=NULL) return b;
216  else         return "";
217}
218int blackboxIsCmd(const char *n, int & tok)
219{
220  for(int i=blackboxTableCnt-1;i>=0;i--)
221  {
222    if(strcmp(n,blackboxName[i])==0)
223    {
224#ifdef BLACKBOX_DEVEL
225      Print("blackboxIsCmd: found bb:%s:%d (table:%d)\n",n,i+BLACKBOX_OFFSET,i);
226#endif
227      tok=i+BLACKBOX_OFFSET;
228      return ROOT_DECL;
229    }
230  }
231  tok=0;
232  return 0;
233}
234
235void printBlackboxTypes()
236{
237  for(int i=blackboxTableCnt-1;i>=0;i--)
238  {
239    if (blackboxName[i]!=NULL)
240       Print("type %d: %s\n",i,blackboxName[i]);
241  }
242}
243
244struct blackbox_list *getBlackboxTypes()
245{
246        int i = 0;
247        void **l = (void **)omalloc0(blackboxTableCnt * sizeof(void *));
248        struct blackbox_list *list_struct = (struct blackbox_list *) omAlloc0(sizeof(struct blackbox_list));
249        list_struct->count = blackboxTableCnt;
250        list_struct->list = l;
251
252        for (i = blackboxTableCnt-1; i >= 0 ;i--)
253        {
254                if (blackboxName[i]!=NULL) {
255                        l[i] = (void *)omStrDup(blackboxName[i]);
256                        //Print("type %d: %s\n",i,blackboxName[i]);
257                } else {
258                        l[i] = NULL;
259                }
260        }
261        return list_struct;
262}
Note: See TracBrowser for help on using the repository browser.