source: git/Singular/blackbox.cc @ dcd92d

spielwiese
Last change on this file since dcd92d was 4488e3, checked in by Hans Schoenemann <hannes@…>, 11 years ago
add: nameof for blackbox types
  • Property mode set to 100644
File size: 5.5 KB
Line 
1#ifdef HAVE_CONFIG_H
2#include "singularconfig.h"
3#endif /* HAVE_CONFIG_H */
4#include <kernel/mod2.h>
5#include <misc/auxiliary.h>
6
7#include "tok.h"
8#include "subexpr.h"
9#include "ipshell.h"
10
11#include "blackbox.h"
12
13#define MAX_BB_TYPES 256
14// #define BLACKBOX_DEVEL 1
15
16static blackbox* blackboxTable[MAX_BB_TYPES];
17static char *    blackboxName[MAX_BB_TYPES];
18static int blackboxTableCnt=0;
19#define BLACKBOX_OFFSET (MAX_TOK+1)
20blackbox* getBlackboxStuff(const int t)
21{
22  return (blackboxTable[t-BLACKBOX_OFFSET]);
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}
40void blackbox_default_Print(blackbox *b,void *d)
41{
42  char *s=b->blackbox_String(b,d);
43  PrintS(s);
44  omFree(s);
45}
46void *blackbox_default_Init(blackbox */*b*/)
47{
48  return NULL;
49}
50
51BOOLEAN blackbox_default_serialize(blackbox */*b*/, void */*d*/, si_link /*f*/)
52{
53  return TRUE;
54}
55
56BOOLEAN blackbox_default_deserialize(blackbox **/*b*/, void **/*d*/, si_link /*f*/)
57{
58  return TRUE;
59}
60
61// Tok2Cmdname -> iiTwoOps
62BOOLEAN WrongOp(const char* cmd, int op, leftv bb)
63{
64  assume( bb->Typ() > MAX_TOK ); // it IS a blackbox type, right?!
65
66  if( op > 127 )
67    Werror("'%s' of type %s(%d) for op %s(%d) not implemented",
68           cmd,
69           getBlackboxName(bb->Typ()),bb->Typ(),
70           iiTwoOps(op), op);
71  else
72    Werror("'%s' of type %s(%d) for op '%c' not implemented",
73           cmd,
74           getBlackboxName(bb->Typ()), bb->Typ(),
75           op);
76
77  return TRUE;
78}
79
80BOOLEAN blackboxDefaultOp1(int op,leftv l, leftv r)
81{
82  if (op==TYPEOF_CMD)
83  {
84    l->data=omStrDup(getBlackboxName(r->Typ()));
85    l->rtyp=STRING_CMD;
86    return FALSE;
87  }
88  else if (op==NAMEOF_CMD)
89  {
90    if (r->name==NULL) l->data=omStrDup("");
91    else               l->data=omStrDup(r->name);
92    l->rtyp=STRING_CMD;
93    return FALSE;
94  }
95
96  return WrongOp("blackbox_Op1", op, r);
97}
98
99BOOLEAN blackboxDefaultOp2(int op,leftv /*l*/, leftv r1, leftv /*r2*/)
100{
101  return WrongOp("blackbox_Op2", op, r1);
102}
103
104BOOLEAN blackbox_default_Op3(int op,leftv /*l*/, leftv r1,leftv /*r2*/, leftv /*r3*/)
105{
106  return WrongOp("blackbox_Op3", op, r1);
107}
108
109BOOLEAN blackbox_default_OpM(int op,leftv res, leftv args)
110{
111  if (op==LIST_CMD)
112  {
113    res->rtyp=LIST_CMD;
114    return jjLIST_PL(res,args);
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 WrongOp("blackbox_OpM", op, args);
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  if (MAX_BB_TYPES<=blackboxTableCnt)
146  {
147    // second try, find empty slot from removed bb:
148    for (int i=0;i<MAX_BB_TYPES;i++)
149    {
150      if (blackboxTable[i]==NULL) { where=i; break; }
151    }
152  }
153  else
154  {
155    where=blackboxTableCnt;
156    blackboxTableCnt++;
157  }
158  if (where==-1)
159  {
160    WerrorS("too many bb types defined");
161    return 0;
162  }
163  else
164  {
165    blackboxTable[where]=bb;
166    blackboxName[where]=omStrDup(n);
167#ifdef BLACKBOX_DEVEL
168  Print("setBlackboxStuff: define bb:name=%s:rt=%d (table:cnt=%d)\n",blackboxName[where],where+BLACKBOX_OFFSET,where);
169#endif
170    if (bb->blackbox_destroy==NULL) bb->blackbox_destroy=blackbox_default_destroy;
171    if (bb->blackbox_String==NULL)  bb->blackbox_String=blackbox_default_String;
172    if (bb->blackbox_Print==NULL)   bb->blackbox_Print=blackbox_default_Print;
173    if (bb->blackbox_Init==NULL)    bb->blackbox_Init=blackbox_default_Init;
174    if (bb->blackbox_Copy==NULL)    bb->blackbox_Copy=blackbox_default_Copy;
175    if (bb->blackbox_Op1==NULL)     bb->blackbox_Op1=blackboxDefaultOp1;
176    if (bb->blackbox_Op2==NULL)     bb->blackbox_Op2=blackboxDefaultOp2;
177    if (bb->blackbox_Op3==NULL)     bb->blackbox_Op3=blackbox_default_Op3;
178    if (bb->blackbox_OpM==NULL)     bb->blackbox_OpM=blackbox_default_OpM;
179    if (bb->blackbox_CheckAssign==NULL) bb->blackbox_CheckAssign=blackbox_default_Check;
180    if (bb->blackbox_serialize==NULL) bb->blackbox_serialize=blackbox_default_serialize;
181    if (bb->blackbox_deserialize==NULL) bb->blackbox_deserialize=blackbox_default_deserialize;
182    return where+BLACKBOX_OFFSET;
183  }
184}
185
186void removeBlackboxStuff(const int rt)
187{
188  omfree(blackboxTable[rt-BLACKBOX_OFFSET]);
189  omfree(blackboxName[rt-BLACKBOX_OFFSET]);
190  blackboxTable[rt-BLACKBOX_OFFSET]=NULL;
191  blackboxName[rt-BLACKBOX_OFFSET]=NULL;
192}
193const char *getBlackboxName(const int t)
194{
195 char *b=blackboxName[t-BLACKBOX_OFFSET];
196  if (b!=NULL) return b;
197  else         return "";
198}
199int blackboxIsCmd(const char *n, int & tok)
200{
201  for(int i=blackboxTableCnt-1;i>=0;i--)
202  {
203    if(strcmp(n,blackboxName[i])==0)
204    {
205#ifdef BLACKBOX_DEVEL
206      Print("blackboxIsCmd: found bb:%s:%d (table:%d)\n",n,i+BLACKBOX_OFFSET,i);
207#endif
208      tok=i+BLACKBOX_OFFSET;
209      return ROOT_DECL;
210    }
211  }
212  return 0;
213}
214
215void printBlackboxTypes()
216{
217  for(int i=blackboxTableCnt-1;i>=0;i--)
218  {
219    if (blackboxName[i]!=NULL)
220       Print("type %d: %s\n",i,blackboxName[i]);
221  }
222}
Note: See TracBrowser for help on using the repository browser.