source: git/Singular/blackbox.cc @ 997bf7

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