1 #ifndef BLACKBOX_H 2 #define BLACKBOX_H 3 4 #include "kernel/mod2.h" 5 6 #include "kernel/structs.h" 7 8 #include "Singular/lists.h" 9 #include "Singular/links/silink.h" 10 11 void removeBlackboxStuff(const int rt); 12 13 struct blackbox_struct; 14 15 typedef struct blackbox_struct blackbox; 16 17 struct blackbox_struct 18 { 19 /// destroy the object: b points to blackbox_struct, d to data 20 void (*blackbox_destroy)(blackbox *b, void *d); 21 /// convert the object to a string (which should be freed by omFree) 22 char *(*blackbox_String)(blackbox *b,void *d); 23 /// print the object: default: use string representation 24 void (*blackbox_Print)(blackbox *b,void *d); 25 /// construct the default object 26 void *(*blackbox_Init)(blackbox *b); 27 /// copy the object: b points to blackbox_struct, d to data 28 void *(*blackbox_Copy)(blackbox *b,void *d); 29 /// interpreter assign: l:=r 30 BOOLEAN (*blackbox_Assign)(leftv l, leftv r); 31 /// interpreter: unary operations op(r), r(), ... 32 // convention for blackbox_Op1..blackbox_OpM: 33 // return FALSE, if op was successfully performed 34 // return TRUE (and an error message) for failure 35 // return TRUE (and no error message) if not defined 36 BOOLEAN (*blackbox_Op1)(int op,leftv l, leftv r); 37 /// interpreter: binary operations: op(r1,r2), r1 op r2,... 38 BOOLEAN (*blackbox_Op2)(int op,leftv l, leftv r1,leftv r2); 39 /// interpreter: tertiary op: op(r1,r2,r3) 40 BOOLEAN (*blackbox_Op3)(int op,leftv l, leftv r1,leftv r2, leftv r3); 41 /// interpreter: operations with undefined number of operands 42 BOOLEAN (*blackbox_OpM)(int op,leftv l, leftv r); 43 /// is an assign of r to l (part of b) impossible? 44 BOOLEAN (*blackbox_CheckAssign)(blackbox *b,leftv l, leftv r); 45 /// serialize 46 BOOLEAN (*blackbox_serialize)(blackbox *b,void *d, si_link f); 47 /// deserialize 48 BOOLEAN (*blackbox_deserialize)(blackbox **b,void **d, si_link f); 49 /// additional type info 50 void *data; 51 /// addtinional gneral properties 52 int properties; // bit 0:blackbox is only a wrapper for lists 53 #define BB_LIKE_LIST(B) ((B)->properties &1) 54 } ; 55 /// default procedure blackboxDefaultOp1, to be called as "default:" branch 56 BOOLEAN blackboxDefaultOp1(int op,leftv l, leftv r); 57 58 /// default procedure blackboxDefaultOp2, to be called as "default:" branch 59 BOOLEAN blackboxDefaultOp2(int op,leftv l, leftv r1, leftv r2); 60 61 /// default procedure blackboxDefaultOp3, to be called as "default:" branch 62 BOOLEAN blackboxDefaultOp3(int op,leftv l, leftv r1,leftv r2, leftv r3); 63 64 /// default procedure blackboxDefaultOpM, to be called as "default:" branch 65 BOOLEAN blackboxDefaultOpM(int op,leftv l, leftv r); 66 67 /// default procedure blackbox_default_Print: print the string 68 void blackbox_default_Print(blackbox *b,void *d); 69 70 /// return the structure to the type given by t 71 blackbox* getBlackboxStuff(const int t); 72 /// return the name to the type given by t (r/o) 73 const char * getBlackboxName(const int t); 74 /// used by scanner: returns ROOT_DECL for known types 75 /// (and the type number in @c tok) 76 int blackboxIsCmd(const char *n, int & tok); 77 /// define a new type 78 int setBlackboxStuff(blackbox *bb,const char *name); 79 80 /// list all defined type (for debugging) 81 void printBlackboxTypes(); 82 83 /// struct for containing list of blackbox names and the number of them. 84 struct blackbox_list { 85 int count; 86 void **list; 87 }; 88 89 /// return array of all define types. 90 struct blackbox_list *getBlackboxTypes(); 91 92 #endif 93