source: git/Singular/blackbox.cc @ b521f3

spielwiese
Last change on this file since b521f3 was b521f3, checked in by Hans Schoenemann <hannes@…>, 13 years ago
fix printBlackboxTypes git-svn-id: file:///usr/local/Singular/svn/trunk@13911 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 4.2 KB
Line 
1#include <Singular/mod2.h>
2#include <Singular/tok.h>
3#include <Singular/subexpr.h>
4#include <Singular/ipshell.h>
5#include <Singular/blackbox.h>
6
7#define MAX_BB_TYPES 256
8// #define BLACKBOX_DEVEL 1
9
10static blackbox* blackboxTable[MAX_BB_TYPES];
11static char *    blackboxName[MAX_BB_TYPES];
12static int blackboxTableCnt=0;
13#define BLACKBOX_OFFSET (MAX_TOK+1)
14blackbox* getBlackboxStuff(const int t)
15{
16  return (blackboxTable[t-BLACKBOX_OFFSET]);
17}
18
19
20void blackbox_default_destroy(blackbox  *b, void *d)
21{
22  Werror("missing blackbox_destroy");
23}
24char *blackbox_default_String(blackbox *b,void *d)
25{
26  Werror("missing blackbox_String");
27  return omStrDup("");
28}
29void *blackbox_default_Copy(blackbox *b,void *d)
30{
31  Werror("missing blackbox_Copy");
32  return NULL;
33}
34void blackbox_default_Print(blackbox *b,void *d)
35{
36  char *s=b->blackbox_String(b,d);
37  PrintS(s);
38  omFree(s);
39}
40void *blackbox_default_Init(blackbox *b)
41{
42  return NULL;
43}
44BOOLEAN blackboxDefaultOp1(int op,leftv l, leftv r)
45{
46  if (op==TYPEOF_CMD)
47  {
48    l->data=omStrDup(getBlackboxName(r->Typ()));
49    l->rtyp=STRING_CMD;
50    return FALSE;
51  }
52  Werror("blackbox_Op1 of type %s(%d) for op %s(%d) not implemented",
53     getBlackboxName(r->Typ()),r->Typ(),Tok2Cmdname(op),op);
54  return TRUE;
55}
56BOOLEAN blackboxDefaultOp2(int op,leftv l, leftv r1, leftv r2)
57{
58  Werror("blackbox_Op2 of type %s(%d) for op %s(%d) not implemented",
59     getBlackboxName(r1->Typ()),r1->Typ(),Tok2Cmdname(op),op);
60  return TRUE;
61}
62BOOLEAN blackbox_default_Op3(int op,leftv l, leftv r1,leftv r2, leftv r3)
63{
64  Werror("blackbox_Op3 of type %s(%d) for op %s(%d) not implemented",
65     getBlackboxName(r1->Typ()),r1->Typ(),Tok2Cmdname(op),op);
66  return TRUE;
67}
68BOOLEAN blackbox_default_OpM(int op,leftv l, leftv r)
69{
70  Werror("blackbox_OpM of type %s(%d) for op %s(%d) not implemented",
71     getBlackboxName(r->Typ()),r->Typ(),Tok2Cmdname(op),op);
72  return TRUE;
73}
74
75BOOLEAN blackbox_default_Check(blackbox *b, void *d)
76{
77  return FALSE;
78}
79int setBlackboxStuff(blackbox *bb, const char *n)
80{
81  int where=-1;
82  if (MAX_BB_TYPES<=blackboxTableCnt)
83  {
84    // second try, find empty slot from removed bb:
85    for (int i=0;i<MAX_BB_TYPES;i++)
86    {
87      if (blackboxTable[i]==NULL) { where=i; break; }
88    }
89  }
90  else
91  {
92    where=blackboxTableCnt;
93    blackboxTableCnt++;
94  }
95  if (where==-1)
96  {
97    WerrorS("too many bb types defined");
98    return 0;
99  }
100  else
101  {
102    blackboxTable[where]=bb;
103    blackboxName[where]=omStrDup(n);
104#ifdef BLACKBOX_DEVEL
105  Print("setBlackboxStuff: define bb:name=%s:rt=%d (table:cnt=%d)\n",blackboxName[where],where+BLACKBOX_OFFSET,where);
106#endif
107    if (bb->blackbox_destroy==NULL) bb->blackbox_destroy=blackbox_default_destroy;
108    if (bb->blackbox_String==NULL)  bb->blackbox_String=blackbox_default_String;
109    if (bb->blackbox_Print==NULL)   bb->blackbox_Print=blackbox_default_Print;
110    if (bb->blackbox_Init==NULL)    bb->blackbox_Init=blackbox_default_Init;
111    if (bb->blackbox_Copy==NULL)    bb->blackbox_Copy=blackbox_default_Copy;
112    if (bb->blackbox_Op1==NULL)     bb->blackbox_Op1=blackboxDefaultOp1;
113    if (bb->blackbox_Op2==NULL)     bb->blackbox_Op2=blackboxDefaultOp2;
114    if (bb->blackbox_Op3==NULL)     bb->blackbox_Op3=blackbox_default_Op3;
115    if (bb->blackbox_OpM==NULL)     bb->blackbox_OpM=blackbox_default_OpM;
116    if (bb->blackbox_Check==NULL)   bb->blackbox_Check=blackbox_default_Check;
117    return where+BLACKBOX_OFFSET;
118  }
119}
120void removeBlackboxStuff(const int rt)
121{
122  omfree(blackboxTable[rt-BLACKBOX_OFFSET]);
123  omfree(blackboxName[rt-BLACKBOX_OFFSET]);
124  blackboxTable[rt-BLACKBOX_OFFSET]=NULL;
125  blackboxName[rt-BLACKBOX_OFFSET]=NULL;
126}
127const char *getBlackboxName(const int t)
128{
129 char *b=blackboxName[t-BLACKBOX_OFFSET];
130  if (b!=NULL) return b;
131  else         return "";
132}
133int blackboxIsCmd(const char *n, int & tok)
134{
135  for(int i=blackboxTableCnt-1;i>=0;i--)
136  {
137    if(strcmp(n,blackboxName[i])==0)
138    {
139#ifdef BLACKBOX_DEVEL
140      Print("blackboxIsCmd: found bb:%s:%d (table:%d)\n",n,i+BLACKBOX_OFFSET,i);
141#endif
142      tok=i+BLACKBOX_OFFSET;
143      return ROOT_DECL;
144    }
145  }
146  return 0;
147}
148
149void printBlackboxTypes()
150{
151  for(int i=blackboxTableCnt-1;i>=0;i--)
152  {
153    if (blackboxName[i]!=NULL)
154       Print("type %d: %s\n",i,blackboxName[i]);
155  }
156}
Note: See TracBrowser for help on using the repository browser.