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 
13 GLOBAL_VAR static blackbox* blackboxTable[MAX_BB_TYPES];
14 GLOBAL_VAR static char *    blackboxName[MAX_BB_TYPES];
15 GLOBAL_VAR static int blackboxTableCnt=0;
16 #define BLACKBOX_OFFSET (MAX_TOK+1)
getBlackboxStuff(const int t)17 blackbox* 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 
blackbox_default_destroy(blackbox *,void *)26 void blackbox_default_destroy(blackbox */*b*/, void */*d*/)
27 {
28   WerrorS("missing blackbox_destroy");
29 }
blackbox_default_String(blackbox *,void *)30 char *blackbox_default_String(blackbox */*b*/,void */*d*/)
31 {
32   WerrorS("missing blackbox_String");
33   return omStrDup("");
34 }
blackbox_default_Copy(blackbox *,void *)35 void *blackbox_default_Copy(blackbox */*b*/,void */*d*/)
36 {
37   WerrorS("missing blackbox_Copy");
38   return NULL;
39 }
blackbox_default_Assign(leftv l,leftv r)40 BOOLEAN 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 }
blackbox_default_Print(blackbox * b,void * d)55 void blackbox_default_Print(blackbox *b,void *d)
56 {
57   char *s=b->blackbox_String(b,d);
58   PrintS(s);
59   omFree(s);
60 }
blackbox_default_Init(blackbox *)61 void *blackbox_default_Init(blackbox */*b*/)
62 {
63   return NULL;
64 }
65 
blackbox_default_serialize(blackbox *,void *,si_link)66 BOOLEAN blackbox_default_serialize(blackbox */*b*/, void */*d*/, si_link /*f*/)
67 {
68   WerrorS("blackbox_serialize is not implemented");
69   return TRUE;
70 }
71 
blackbox_default_deserialize(blackbox **,void **,si_link)72 BOOLEAN blackbox_default_deserialize(blackbox **/*b*/, void **/*d*/, si_link /*f*/)
73 {
74   WerrorS("blackbox_deserialize is not implemented");
75   return TRUE;
76 }
77 
blackboxDefaultOp1(int op,leftv l,leftv r)78 BOOLEAN 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 
blackboxDefaultOp2(int,leftv,leftv,leftv)97 BOOLEAN blackboxDefaultOp2(int /*op*/,leftv /*l*/, leftv /*r1*/, leftv /*r2*/)
98 {
99   return TRUE;
100 }
101 
blackboxDefaultOp3(int,leftv,leftv,leftv,leftv)102 BOOLEAN blackboxDefaultOp3(int /*op*/,leftv /*l*/, leftv /*r1*/,leftv /*r2*/, leftv /*r3*/)
103 {
104   return TRUE;
105 }
106 
blackboxDefaultOpM(int op,leftv res,leftv args)107 BOOLEAN 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 
blackbox_default_Check(blackbox *,leftv,leftv)138 BOOLEAN blackbox_default_Check(blackbox *,leftv,leftv)
139 {
140   return FALSE;
141 }
setBlackboxStuff(blackbox * bb,const char * n)142 int 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 
removeBlackboxStuff(const int rt)205 void 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 }
getBlackboxName(const int t)212 const char *getBlackboxName(const int t)
213 {
214  char *b=blackboxName[t-BLACKBOX_OFFSET];
215   if (b!=NULL) return b;
216   else         return "";
217 }
blackboxIsCmd(const char * n,int & tok)218 int 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 
printBlackboxTypes()235 void 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 
getBlackboxTypes()244 struct 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 }
263