1 #ifndef SILINK_H
2 #define SILINK_H
3 /****************************************
4 *  Computer Algebra System SINGULAR     *
5 ****************************************/
6 /*
7 * ABSTRACT: general interface to links
8 */
9 
10 #include "singularconfig.h"
11 #include "omalloc/omalloc.h"
12 #include "kernel/structs.h"
13 
14 #include "Singular/links/sing_dbm.h"
15 #include "Singular/lists.h"
16 #include "Singular/attrib.h"
17 
18 struct sip_link;
19 typedef struct sip_link    ip_link;
20 typedef ip_link *          si_link;
21 
22 
23 // extension links:
24 typedef BOOLEAN    (*slOpenProc)(si_link l, short flag, leftv h);
25 typedef BOOLEAN    (*slWriteProc)(si_link l, leftv lv);
26 typedef BOOLEAN    (*slCloseProc)(si_link l);
27 typedef BOOLEAN    (*slPrepCloseProc)(si_link l);
28 typedef BOOLEAN    (*slKillProc)(si_link l);
29 typedef leftv      (*slReadProc)(si_link l);
30 typedef leftv      (*slRead2Proc)(si_link l, leftv a);
31 typedef BOOLEAN    (*slDumpProc)(si_link l);
32 typedef BOOLEAN    (*slGetDumpProc)(si_link l);
33 typedef const char* (*slStatusProc)(si_link l, const char *request);
34 typedef BOOLEAN    (*slSetRingProc)(si_link l, ring r, BOOLEAN send);
35 
36 struct s_si_link_extension
37 {
38   si_link_extension next;
39   slOpenProc       Open;
40   slCloseProc      Close;
41   slPrepCloseProc  PrepClose;
42   slKillProc       Kill;
43   slReadProc       Read;
44   slRead2Proc      Read2;
45   slWriteProc      Write;
46   slDumpProc       Dump;
47   slGetDumpProc    GetDump;
48   slStatusProc     Status;
49   slSetRingProc    SetRing;
50   const char       *type;
51 };
52 
53 struct sip_link
54 {
55   si_link_extension m; // methods
56   char *mode;
57   char *name;          // used for filename and/or further specs
58   void *data;          // the link itself
59   BITSET flags;        // 0=close open = 1: read = 2: write = 3
60   short ref;           // reference counter
61 };
62 
63 // flags:
64 #define SI_LINK_CLOSE   0
65 #define SI_LINK_OPEN    1
66 #define SI_LINK_READ    2
67 #define SI_LINK_WRITE   4
68 
69 // tests:
70 #define SI_LINK_CLOSE_P(l)  (!(l)->flags)
71 #define SI_LINK_OPEN_P(l)   ((l)->flags & SI_LINK_OPEN)
72 #define SI_LINK_W_OPEN_P(l) ((l)->flags &  SI_LINK_WRITE)
73 #define SI_LINK_R_OPEN_P(l) ((l)->flags &  SI_LINK_READ)
74 #define SI_LINK_RW_OPEN_P(l) (SI_LINK_W_OPEN_P(l) && SI_LINK_R_OPEN_P(l))
75 
76 #define SI_LINK_SET_CLOSE_P(l)  ((l)->flags = SI_LINK_CLOSE)
77 #define SI_LINK_SET_OPEN_P(l, flag)   ((l)->flags |= SI_LINK_OPEN |flag)
78 #define SI_LINK_SET_W_OPEN_P(l) ((l)->flags |= (SI_LINK_OPEN | SI_LINK_WRITE))
79 #define SI_LINK_SET_R_OPEN_P(l) ((l)->flags |= (SI_LINK_OPEN | SI_LINK_READ))
80 #define SI_LINK_SET_RW_OPEN_P(l) ((l)->flags |= (SI_LINK_OPEN | SI_LINK_READ | SI_LINK_WRITE))
81 
82 BOOLEAN slOpen(si_link l, short flag, leftv h);
83 BOOLEAN slClose(si_link l);
84 BOOLEAN slPrepClose(si_link l);
85 leftv   slRead(si_link l,leftv a=NULL);
86 BOOLEAN slWrite(si_link l, leftv v);
87 BOOLEAN slDump(si_link l);
88 BOOLEAN slGetDump(si_link l);
89 const char* slStatus(si_link l, const char *request);
90 BOOLEAN slInit(si_link l, char *str);
91 void slKill(si_link l);
92 void slCleanUp(si_link l);
93 void slStandardInit();
slCopy(si_link l)94 static inline si_link slCopy(si_link l)
95 {
96   l->ref++;
97   return l;
98 }
99 
100 
slString(si_link l)101 static inline char* slString(si_link l)
102 {
103   if (l->name != NULL)
104   {
105     return omStrDup(l->name);
106   }
107   else
108   {
109     return omStrDup("");
110   }
111 }
112 
113 EXTERN_VAR omBin s_si_link_extension_bin;
114 EXTERN_VAR omBin sip_link_bin;
115 EXTERN_VAR omBin ip_link_bin;
116 
117 int slStatusSsiL(lists L, int timeout);
118 int ssiBatch(const char *host, const char * port);
119 
120 
121 typedef struct
122 {
123   leftv u;
124   si_link l;
125   void * next;
126 } link_struct;
127 
128 typedef link_struct* link_list;
129 
130 EXTERN_VAR link_list ssiToBeClosed;
131 EXTERN_VAR volatile BOOLEAN ssiToBeClosed_inactive;
132 #endif // SILINK_H
133