source: git/Singular/blackbox.cc @ 0509a99

spielwiese
Last change on this file since 0509a99 was 16f511, checked in by Oleksandr Motsak <motsak@…>, 11 years ago
Fixed the usage of "config.h" (if defined HAVE_CONFIG_H)
  • Property mode set to 100644
File size: 5.3 KB
Line 
1#ifdef HAVE_CONFIG_H
2#include "config.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
89  return WrongOp("blackbox_Op1", op, r);
90}
91
92BOOLEAN blackboxDefaultOp2(int op,leftv /*l*/, leftv r1, leftv /*r2*/)
93{
94  return WrongOp("blackbox_Op2", op, r1);
95}
96
97BOOLEAN blackbox_default_Op3(int op,leftv /*l*/, leftv r1,leftv /*r2*/, leftv /*r3*/)
98{
99  return WrongOp("blackbox_Op3", op, r1);
100}
101
102BOOLEAN blackbox_default_OpM(int op,leftv res, leftv args)
103{
104  if (op==LIST_CMD)
105  {
106    res->rtyp=LIST_CMD;
107    return jjLIST_PL(res,args);
108  }
109  else if(op==STRING_CMD)
110  {
111    blackbox *b=getBlackboxStuff(args->Typ());
112    res->data=b->blackbox_String(b,args->Data());
113    res->rtyp=STRING_CMD;
114    args=args->next;
115    if(args!=NULL)
116    {
117      sleftv res2;
118      int ret=iiExprArithM(&res2,args,op);
119      if (ret) return TRUE;
120      char *s2=(char*)omAlloc(strlen((char*)res->data)+strlen((char*)res2.data)+1);
121      sprintf(s2,"%s%s",(char*)res->data,(char*)res2.data);
122      omFree(res2.data);
123      omFree(res->data);
124      res->data=s2;
125    }
126    return FALSE;
127  }
128  return WrongOp("blackbox_OpM", op, args);
129}
130
131BOOLEAN blackbox_default_Check(blackbox *,leftv,leftv)
132{
133  return FALSE;
134}
135int setBlackboxStuff(blackbox *bb, const char *n)
136{
137  int where=-1;
138  if (MAX_BB_TYPES<=blackboxTableCnt)
139  {
140    // second try, find empty slot from removed bb:
141    for (int i=0;i<MAX_BB_TYPES;i++)
142    {
143      if (blackboxTable[i]==NULL) { where=i; break; }
144    }
145  }
146  else
147  {
148    where=blackboxTableCnt;
149    blackboxTableCnt++;
150  }
151  if (where==-1)
152  {
153    WerrorS("too many bb types defined");
154    return 0;
155  }
156  else
157  {
158    blackboxTable[where]=bb;
159    blackboxName[where]=omStrDup(n);
160#ifdef BLACKBOX_DEVEL
161  Print("setBlackboxStuff: define bb:name=%s:rt=%d (table:cnt=%d)\n",blackboxName[where],where+BLACKBOX_OFFSET,where);
162#endif
163    if (bb->blackbox_destroy==NULL) bb->blackbox_destroy=blackbox_default_destroy;
164    if (bb->blackbox_String==NULL)  bb->blackbox_String=blackbox_default_String;
165    if (bb->blackbox_Print==NULL)   bb->blackbox_Print=blackbox_default_Print;
166    if (bb->blackbox_Init==NULL)    bb->blackbox_Init=blackbox_default_Init;
167    if (bb->blackbox_Copy==NULL)    bb->blackbox_Copy=blackbox_default_Copy;
168    if (bb->blackbox_Op1==NULL)     bb->blackbox_Op1=blackboxDefaultOp1;
169    if (bb->blackbox_Op2==NULL)     bb->blackbox_Op2=blackboxDefaultOp2;
170    if (bb->blackbox_Op3==NULL)     bb->blackbox_Op3=blackbox_default_Op3;
171    if (bb->blackbox_OpM==NULL)     bb->blackbox_OpM=blackbox_default_OpM;
172    if (bb->blackbox_CheckAssign==NULL) bb->blackbox_CheckAssign=blackbox_default_Check;
173    if (bb->blackbox_serialize==NULL) bb->blackbox_serialize=blackbox_default_serialize;
174    if (bb->blackbox_deserialize==NULL) bb->blackbox_deserialize=blackbox_default_deserialize;
175    return where+BLACKBOX_OFFSET;
176  }
177}
178
179void removeBlackboxStuff(const int rt)
180{
181  omfree(blackboxTable[rt-BLACKBOX_OFFSET]);
182  omfree(blackboxName[rt-BLACKBOX_OFFSET]);
183  blackboxTable[rt-BLACKBOX_OFFSET]=NULL;
184  blackboxName[rt-BLACKBOX_OFFSET]=NULL;
185}
186const char *getBlackboxName(const int t)
187{
188 char *b=blackboxName[t-BLACKBOX_OFFSET];
189  if (b!=NULL) return b;
190  else         return "";
191}
192int blackboxIsCmd(const char *n, int & tok)
193{
194  for(int i=blackboxTableCnt-1;i>=0;i--)
195  {
196    if(strcmp(n,blackboxName[i])==0)
197    {
198#ifdef BLACKBOX_DEVEL
199      Print("blackboxIsCmd: found bb:%s:%d (table:%d)\n",n,i+BLACKBOX_OFFSET,i);
200#endif
201      tok=i+BLACKBOX_OFFSET;
202      return ROOT_DECL;
203    }
204  }
205  return 0;
206}
207
208void printBlackboxTypes()
209{
210  for(int i=blackboxTableCnt-1;i>=0;i--)
211  {
212    if (blackboxName[i]!=NULL)
213       Print("type %d: %s\n",i,blackboxName[i]);
214  }
215}
Note: See TracBrowser for help on using the repository browser.