Functions | Variables
silink.cc File Reference
#include "kernel/mod2.h"
#include "omalloc/omalloc.h"
#include "misc/options.h"
#include "misc/intvec.h"
#include "reporter/si_signals.h"
#include "coeffs/numbers.h"
#include "polys/matpol.h"
#include "polys/monomials/ring.h"
#include "kernel/ideals.h"
#include "Singular/lists.h"
#include "Singular/cntrlc.h"
#include "Singular/links/ssiLink.h"
#include "Singular/links/pipeLink.h"
#include "Singular/tok.h"
#include "Singular/subexpr.h"
#include "Singular/ipid.h"
#include "Singular/links/silink.h"
#include "Singular/links/slInit.h"
#include "Singular/ipshell.h"
#include "feOpt.h"

Go to the source code of this file.

Functions

static si_link_extension slTypeInit (si_link_extension s, const char *type)
 
BOOLEAN slInit (si_link l, char *istr)
 
void slCleanUp (si_link l)
 
void slKill (si_link l)
 
const char * slStatus (si_link l, const char *request)
 
BOOLEAN slSetRingDummy (si_link, ring r, BOOLEAN)
 
BOOLEAN slOpen (si_link l, short flag, leftv h)
 
BOOLEAN slPrepClose (si_link l)
 
BOOLEAN slClose (si_link l)
 
leftv slRead (si_link l, leftv a)
 
BOOLEAN slWrite (si_link l, leftv v)
 
BOOLEAN slDump (si_link l)
 
BOOLEAN slGetDump (si_link l)
 

Variables

omBin s_si_link_extension_bin = omGetSpecBin(sizeof(s_si_link_extension))
 
omBin sip_link_bin = omGetSpecBin(sizeof(sip_link))
 
omBin ip_link_bin = omGetSpecBin(sizeof(ip_link))
 
si_link_extension si_link_root =NULL
 

Function Documentation

◆ slCleanUp()

void slCleanUp ( si_link  l)

Definition at line 127 of file silink.cc.

128 {
129  defer_shutdown++;
130  (l->ref)--;
131  if (l->ref == 0)
132  {
133  if (SI_LINK_OPEN_P(l))
134  {
135  if (l->m->Close != NULL) l->m->Close(l);
136  }
137  if ((l->data != NULL) && (l->m->Kill != NULL)) l->m->Kill(l);
138  omFree((ADDRESS)l->name);
139  omFree((ADDRESS)l->mode);
140  memset((void *) l, 0, sizeof(ip_link));
141  }
142  defer_shutdown--;
143  if (!defer_shutdown && do_shutdown) m2_end(1);
144 }
void * ADDRESS
Definition: auxiliary.h:133
volatile BOOLEAN do_shutdown
Definition: cntrlc.cc:79
#define omFree(addr)
Definition: omAllocDecl.h:261
void m2_end(int i)
Definition: misc_ip.cc:1099
#define NULL
Definition: omList.c:10
volatile int defer_shutdown
Definition: cntrlc.cc:80
int l
Definition: cfEzgcd.cc:93

◆ slClose()

BOOLEAN slClose ( si_link  l)

Definition at line 242 of file silink.cc.

243 {
244 
245  if(! SI_LINK_OPEN_P(l))
246  return FALSE;
247 
248  defer_shutdown++;
249  BOOLEAN res = TRUE;
250  if (l->m->Close != NULL)
251  {
252  res = l->m->Close(l);
253  if (res)
254  Werror("close: Error for link of type: %s, mode: %s, name: %s",
255  l->m->type, l->mode, l->name);
256  }
257  defer_shutdown--;
258  if (!defer_shutdown && do_shutdown) m2_end(1);
260  return res;
261 }
#define FALSE
Definition: auxiliary.h:94
#define TRUE
Definition: auxiliary.h:98
CanonicalForm res
Definition: facAbsFact.cc:64
volatile BOOLEAN do_shutdown
Definition: cntrlc.cc:79
void m2_end(int i)
Definition: misc_ip.cc:1099
#define NULL
Definition: omList.c:10
volatile int defer_shutdown
Definition: cntrlc.cc:80
int BOOLEAN
Definition: auxiliary.h:85
void Werror(const char *fmt,...)
Definition: reporter.cc:189
int l
Definition: cfEzgcd.cc:93

◆ slDump()

BOOLEAN slDump ( si_link  l)

Definition at line 346 of file silink.cc.

347 {
348  BOOLEAN res;
349 
350  if(! SI_LINK_W_OPEN_P(l)) // open w ?
351  {
352  if (slOpen(l, SI_LINK_WRITE,NULL)) return TRUE;
353  }
354 
355  if(SI_LINK_W_OPEN_P(l))
356  { // now open w
357  if (l->m->Dump != NULL)
358  res = l->m->Dump(l);
359  else
360  res = TRUE;
361 
362  if (res)
363  Werror("dump: Error for link of type %s, mode: %s, name: %s",
364  l->m->type, l->mode, l->name);
365  if (!SI_LINK_R_OPEN_P(l)) slClose(l); // do not close r/w links
366  return res;
367  }
368  else
369  {
370  Werror("dump: Error to open link of type %s, mode: %s, name: %s for writing",
371  l->m->type, l->mode, l->name);
372  return TRUE;
373  }
374 }
#define TRUE
Definition: auxiliary.h:98
CanonicalForm res
Definition: facAbsFact.cc:64
#define NULL
Definition: omList.c:10
int BOOLEAN
Definition: auxiliary.h:85
void Werror(const char *fmt,...)
Definition: reporter.cc:189
int l
Definition: cfEzgcd.cc:93

◆ slGetDump()

BOOLEAN slGetDump ( si_link  l)

Definition at line 376 of file silink.cc.

377 {
378  BOOLEAN res;
379 
380  if(! SI_LINK_R_OPEN_P(l)) // open r ?
381  {
382  if (slOpen(l, SI_LINK_READ,NULL)) return TRUE;
383  }
384 
385  if(SI_LINK_R_OPEN_P(l))
386  { // now open r
387  if (l->m->GetDump != NULL)
388  res = l->m->GetDump(l);
389  else
390  res = TRUE;
391 
392  if (res)
393  Werror("getdump: Error for link of type %s, mode: %s, name: %s",
394  l->m->type, l->mode, l->name);
395  //res|=slClose(l);
396  return res;
397  }
398  else
399  {
400  Werror("dump: Error open link of type %s, mode: %s, name: %s for reading",
401  l->m->type, l->mode, l->name);
402  return TRUE;
403  }
404 }
#define TRUE
Definition: auxiliary.h:98
CanonicalForm res
Definition: facAbsFact.cc:64
#define NULL
Definition: omList.c:10
int BOOLEAN
Definition: auxiliary.h:85
void Werror(const char *fmt,...)
Definition: reporter.cc:189
int l
Definition: cfEzgcd.cc:93

◆ slInit()

BOOLEAN slInit ( si_link  l,
char *  istr 
)

Definition at line 48 of file silink.cc.

49 {
50  char *type = NULL, *mode = NULL, *name = NULL;
51  int i = 0, j;
52 
53  // set mode and type
54  if (istr != NULL)
55  {
56  // find the first colon char in istr
57  i = 0;
58  while (istr[i] != ':' && istr[i] != '\0') i++;
59  if (istr[i] == ':')
60  {
61  // if found, set type
62  if (i > 0)
63  {
64  istr[i] = '\0';
65  type = omStrDup(istr);
66  istr[i] = ':';
67  }
68  // and check for mode
69  j = ++i;
70  while (istr[j] != ' ' && istr[j] != '\0') j++;
71  if (j > i)
72  {
73  mode = omStrDup(&(istr[i]));
74  mode[j - i] = '\0';
75  }
76  // and for the name
77  while (istr[j] == ' '&& istr[j] != '\0') j++;
78  if (istr[j] != '\0') name = omStrDup(&(istr[j]));
79  }
80  else // no colon find -- string is entire name
81  {
82  j=0;
83  while (istr[j] == ' '&& istr[j] != '\0') j++;
84  if (istr[j] != '\0') name = omStrDup(&(istr[j]));
85  }
86  }
87 
88  // set the link extension
89  if (type != NULL)
90  {
91  si_link_extension s = si_link_root;
92  si_link_extension prev = s;
93 
94  while (strcmp(s->type, type) != 0)
95  {
96  if (s->next == NULL)
97  {
98  prev = s;
99  s = NULL;
100  break;
101  }
102  else
103  {
104  s = s->next;
105  }
106  }
107 
108  if (s != NULL)
109  l->m = s;
110  else
111  {
112  l->m = slTypeInit(prev, type);
113  }
114  omFree(type);
115  }
116  else
117  l->m = si_link_root;
118 
119  if (l->m == NULL) return TRUE;
120 
121  l->name = (name != NULL ? name : omStrDup(""));
122  l->mode = (mode != NULL ? mode : omStrDup(""));
123  l->ref = 1;
124  return FALSE;
125 }
const CanonicalForm int s
Definition: facAbsFact.cc:55
int j
Definition: facHensel.cc:105
#define FALSE
Definition: auxiliary.h:94
#define TRUE
Definition: auxiliary.h:98
#define omFree(addr)
Definition: omAllocDecl.h:261
int i
Definition: cfEzgcd.cc:125
char name(const Variable &v)
Definition: factory.h:180
#define NULL
Definition: omList.c:10
int l
Definition: cfEzgcd.cc:93
#define omStrDup(s)
Definition: omAllocDecl.h:263

◆ slKill()

void slKill ( si_link  l)

Definition at line 146 of file silink.cc.

147 {
148  defer_shutdown++;
149  slCleanUp(l);
150  if ((l!=NULL) &&(l->ref == 0))
152  defer_shutdown--;
153  if (!defer_shutdown && do_shutdown) m2_end(1);
154 }
void * ADDRESS
Definition: auxiliary.h:133
volatile BOOLEAN do_shutdown
Definition: cntrlc.cc:79
void m2_end(int i)
Definition: misc_ip.cc:1099
#define NULL
Definition: omList.c:10
volatile int defer_shutdown
Definition: cntrlc.cc:80
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259
int l
Definition: cfEzgcd.cc:93

◆ slOpen()

BOOLEAN slOpen ( si_link  l,
short  flag,
leftv  h 
)

Definition at line 194 of file silink.cc.

195 {
196  BOOLEAN res = TRUE;
197  if (l!=NULL)
198  {
199 
200  if (l->m == NULL) slInit(l, ((char*)""));
201 
202  if (feOptValue(FE_OPT_NO_SHELL)) {WerrorS("no links allowed");return TRUE;}
203 
204  const char *c="_";;
205  if (h!=NULL) c=h->Name();
206 
207  if (SI_LINK_OPEN_P(l))
208  {
209  Warn("open: link of type: %s, mode: %s, name: %s is already open",
210  l->m->type, l->mode, l->name);
211  return FALSE;
212  }
213  else if (l->m->Open != NULL)
214  {
215  res = l->m->Open(l, flag, h);
216  if (res)
217  Werror("open: Error for link %s of type: %s, mode: %s, name: %s",
218  c, l->m->type, l->mode, l->name);
219  }
220  if (l->m->SetRing==NULL) l->m->SetRing=slSetRingDummy;
221  }
222  return res;
223 }
static void * feOptValue(feOptIndex opt)
Definition: feOpt.h:40
#define FALSE
Definition: auxiliary.h:94
#define TRUE
Definition: auxiliary.h:98
void WerrorS(const char *s)
Definition: feFopen.cc:24
const char * Name()
Definition: subexpr.h:120
CanonicalForm res
Definition: facAbsFact.cc:64
#define NULL
Definition: omList.c:10
int BOOLEAN
Definition: auxiliary.h:85
void Werror(const char *fmt,...)
Definition: reporter.cc:189
int l
Definition: cfEzgcd.cc:93
#define Warn
Definition: emacs.cc:77

◆ slPrepClose()

BOOLEAN slPrepClose ( si_link  l)

Definition at line 225 of file silink.cc.

226 {
227 
228  if(! SI_LINK_OPEN_P(l))
229  return FALSE;
230 
231  BOOLEAN res = TRUE;
232  if (l->m->PrepClose != NULL)
233  {
234  res = l->m->PrepClose(l);
235  if (res)
236  Werror("close: Error for link of type: %s, mode: %s, name: %s",
237  l->m->type, l->mode, l->name);
238  }
239  return res;
240 }
#define FALSE
Definition: auxiliary.h:94
#define TRUE
Definition: auxiliary.h:98
CanonicalForm res
Definition: facAbsFact.cc:64
#define NULL
Definition: omList.c:10
int BOOLEAN
Definition: auxiliary.h:85
void Werror(const char *fmt,...)
Definition: reporter.cc:189
int l
Definition: cfEzgcd.cc:93

◆ slRead()

leftv slRead ( si_link  l,
leftv  a 
)

Definition at line 263 of file silink.cc.

264 {
265  leftv v = NULL;
266  if( ! SI_LINK_R_OPEN_P(l)) // open r ?
267  {
268 #ifdef HAVE_DBM
269 #ifdef USE_GDBM
270  if (! SI_LINK_CLOSE_P(l))
271  {
272  if (slClose(l)) return NULL;
273  }
274 #endif
275 #endif
276  if (slOpen(l, SI_LINK_READ,NULL)) return NULL;
277  }
278 
279  if (SI_LINK_R_OPEN_P(l))
280  { // open r
281  if (a==NULL)
282  {
283  if (l->m->Read != NULL) v = l->m->Read(l);
284  }
285  else
286  {
287  if (l->m->Read2 != NULL) v = l->m->Read2(l,a);
288  }
289  }
290  else
291  {
292  Werror("read: Error to open link of type %s, mode: %s, name: %s for reading",
293  l->m->type, l->mode, l->name);
294  return NULL;
295  }
296 
297  // here comes the eval:
298  if (v != NULL)
299  {
300  if (v->Eval() && !errorreported)
301  WerrorS("eval: failed");
302  }
303  else
304  Werror("read: Error for link of type %s, mode: %s, name: %s",
305  l->m->type, l->mode, l->name);
306  return v;
307 }
Class used for (list of) interpreter objects.
Definition: subexpr.h:82
int Eval()
Definition: subexpr.cc:1752
void WerrorS(const char *s)
Definition: feFopen.cc:24
short errorreported
Definition: feFopen.cc:23
const Variable & v
< [in] a sqrfree bivariate poly
Definition: facBivar.h:37
#define NULL
Definition: omList.c:10
void Werror(const char *fmt,...)
Definition: reporter.cc:189
int l
Definition: cfEzgcd.cc:93

◆ slSetRingDummy()

BOOLEAN slSetRingDummy ( si_link  ,
ring  r,
BOOLEAN   
)

Definition at line 189 of file silink.cc.

190 {
191  if (currRing!=r) rChangeCurrRing(r);
192  return FALSE;
193 }
#define FALSE
Definition: auxiliary.h:94
void rChangeCurrRing(ring r)
Definition: polys.cc:15
ring currRing
Widely used global variable which specifies the current polynomial ring for Singular interpreter and ...
Definition: polys.cc:13

◆ slStatus()

const char* slStatus ( si_link  l,
const char *  request 
)

Definition at line 156 of file silink.cc.

157 {
158  if (l == NULL) return "empty link";
159  else if (l->m == NULL) return "unknown link type";
160  else if (strcmp(request, "type") == 0) return l->m->type;
161  else if (strcmp(request, "mode") == 0) return l->mode;
162  else if (strcmp(request, "name") == 0) return l->name;
163  else if (strcmp(request, "exists") ==0)
164  {
165  struct stat buf;
166  if (si_lstat(l->name,&buf)==0) return "yes";
167  else return "no";
168  }
169  else if (strcmp(request, "open") == 0)
170  {
171  if (SI_LINK_OPEN_P(l)) return "yes";
172  else return "no";
173  }
174  else if (strcmp(request, "openread") == 0)
175  {
176  if (SI_LINK_R_OPEN_P(l)) return "yes";
177  else return "no";
178  }
179  else if (strcmp(request, "openwrite") == 0)
180  {
181  if (SI_LINK_W_OPEN_P(l)) return "yes";
182  else return "no";
183  }
184  else if (l->m->Status == NULL) return "unknown status request";
185  else return l->m->Status(l, request);
186 }
int status int void * buf
Definition: si_signals.h:59
#define NULL
Definition: omList.c:10
int l
Definition: cfEzgcd.cc:93

◆ slTypeInit()

static si_link_extension slTypeInit ( si_link_extension  s,
const char *  type 
)
static

Definition at line 409 of file silink.cc.

410 {
411  assume(s != NULL);
412  s->next = NULL;
413  si_link_extension ns = (si_link_extension)omAlloc0Bin(s_si_link_extension_bin);
414 
415  if (0)
416  ; // dummy
417 #ifdef HAVE_DBM
418  else if (strcmp(type, "DBM") == 0)
419  s->next = slInitDBMExtension(ns);
420 #endif
421 #if 1
422  else if (strcmp(type, "ssi") == 0)
423  s->next = slInitSsiExtension(ns);
424 #endif
425 #if 1
426  else if (strcmp(type, "|") == 0)
427  s->next = slInitPipeExtension(ns);
428 #endif
429  else
430  {
431  Warn("Found unknown link type: %s", type);
432  Warn("Use default link type: %s", si_link_root->type);
434  return si_link_root;
435  }
436 
437  if (s->next == NULL)
438  {
439  Werror("Can not initialize link type %s", type);
441  return NULL;
442  }
443  return s->next;
444 }
const CanonicalForm int s
Definition: facAbsFact.cc:55
#define assume(x)
Definition: mod2.h:390
#define omAlloc0Bin(bin)
Definition: omAllocDecl.h:206
#define NULL
Definition: omList.c:10
si_link_extension slInitDBMExtension(si_link_extension s)
#define omFreeBin(addr, bin)
Definition: omAllocDecl.h:259
void Werror(const char *fmt,...)
Definition: reporter.cc:189
#define Warn
Definition: emacs.cc:77

◆ slWrite()

BOOLEAN slWrite ( si_link  l,
leftv  v 
)

Definition at line 309 of file silink.cc.

310 {
311  BOOLEAN res;
312 
313  if(! SI_LINK_W_OPEN_P(l)) // open w ?
314  {
315 #ifdef HAVE_DBM
316 #ifdef USE_GDBM
317  if (! SI_LINK_CLOSE_P(l))
318  {
319  if (slClose(l)) return TRUE;
320  }
321 #endif
322 #endif
323  if (slOpen(l, SI_LINK_WRITE,NULL)) return TRUE;
324  }
325 
326  if (SI_LINK_W_OPEN_P(l))
327  { // now open w
328  if (l->m->Write != NULL)
329  res = l->m->Write(l,v);
330  else
331  res = TRUE;
332 
333  if (res)
334  Werror("write: Error for link of type %s, mode: %s, name: %s",
335  l->m->type, l->mode, l->name);
336  return res;
337  }
338  else
339  {
340  Werror("write: Error to open link of type %s, mode: %s, name: %s for writing",
341  l->m->type, l->mode, l->name);
342  return TRUE;
343  }
344 }
#define TRUE
Definition: auxiliary.h:98
CanonicalForm res
Definition: facAbsFact.cc:64
#define NULL
Definition: omList.c:10
int BOOLEAN
Definition: auxiliary.h:85
void Werror(const char *fmt,...)
Definition: reporter.cc:189
int l
Definition: cfEzgcd.cc:93

Variable Documentation

◆ ip_link_bin

omBin ip_link_bin = omGetSpecBin(sizeof(ip_link))

Definition at line 42 of file silink.cc.

◆ s_si_link_extension_bin

omBin s_si_link_extension_bin = omGetSpecBin(sizeof(s_si_link_extension))

Definition at line 40 of file silink.cc.

◆ si_link_root

si_link_extension si_link_root =NULL

Definition at line 46 of file silink.cc.

◆ sip_link_bin

omBin sip_link_bin = omGetSpecBin(sizeof(sip_link))

Definition at line 41 of file silink.cc.