source: git/Singular/sing_mp.cc @ f6b5f0

spielwiese
Last change on this file since f6b5f0 was f6b5f0, checked in by Hans Schönemann <hannes@…>, 27 years ago
* hannes: change Log: and Header: to Id: git-svn-id: file:///usr/local/Singular/svn/trunk@73 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 9.5 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/*
5* ABSTRACT
6*/
7/* $Id: sing_mp.cc,v 1.3 1997-03-24 14:25:50 Singular Exp $ */
8
9#include <stdio.h>
10#include <string.h>
11#include <unistd.h>
12#include "mod2.h"
13#include "tok.h"
14#include "mmemory.h"
15#include "febase.h"
16#include "subexpr.h"
17#include "ipid.h"
18#include "silink.h"
19
20
21/* =============== general utilities ====================================== */
22void FreeCmdArgs(int argc, char** argv)
23{
24  int i;
25  for (i=0; i<argc; i++)
26    FreeL(argv[i]);
27
28  Free(argv, argc*sizeof(char *));
29}
30/*-------------------------------------------------------------------*/
31#ifdef HAVE_MPSR
32/***************************************************************
33 *
34 * MP stuff
35 *
36 ***************************************************************/
37#include"mpsr.h"
38
39#ifdef MPSR_DEBUG
40#define MP_SET_LINK_OPTIONS(link) \
41if (link != NULL) MP_SetLinkOption(link,MP_LINK_LOG_MASK_OPT,MP_LOG_ALL_EVENTS)
42#else
43#define MP_SET_LINK_OPTIONS(link) ((void *) 0)
44#endif
45
46MP_Env_pt mp_Env = NULL;
47
48void slInitBatchLink(si_link l, int argc, char** argv)
49{
50  int i;
51  l->argv = (char **) Alloc0((argc +1) * sizeof(char *));
52  l->argv[0] = mstrdup("MP:connect");
53  for (i=1; i<=argc; i++)
54    l->argv[i] = mstrdup(argv[i]);
55  l->argc = argc + 1;
56  l->name = mstrdup("MP:connect");
57  slInit(l,NULL);
58}
59
60BOOLEAN slOpenWriteMPFile(si_link l)
61{
62  char **argv;
63  int argc;
64
65  GetCmdArgs(&argc, &argv, "-MPtransp FILE -MPmode write -MPfile /tmp/mpout");
66  MP_Link_pt link = NULL;
67
68  if (SI_LINK_R_OPEN_P(l))
69  {
70    Werror("can not open an MP write link to file %s as read link also",
71           l->name);
72    return TRUE;
73  }
74  if (l->name != NULL)
75  {
76    FreeL(argv[5]);
77    argv[5] = mstrdup(l->name);
78  }
79
80  if (mp_Env == NULL)
81    mp_Env = MP_InitializeEnv(MP_AllocateEnv());
82
83  if (mp_Env == NULL)
84  {
85    Werror("Initialization of MP Environment");
86    return TRUE;
87  }
88
89  if ((link = MP_OpenLink(mp_Env, argc, argv)) == NULL)
90  {
91    Werror("Opening of MP Write to file %s", l->name);
92    FreeCmdArgs(argc, argv);
93    return TRUE;
94  }
95  MP_SET_LINK_OPTIONS(link);
96
97  FreeCmdArgs(argc, argv);
98  SI_LINK_SET_W_OPEN_P(l);
99  l->data = (void *) link;
100  return FALSE;
101}
102
103MP_Link_pt OpenMPFile(char *fn, short mode)
104{
105  char **argv;
106  int argc;
107  MP_Link_pt link = NULL;
108
109  GetCmdArgs(&argc, &argv, "-MPtransp FILE -MPmode write -MPfile /tmp/mpout");
110
111  if (fn != NULL)
112  {
113    FreeL(argv[5]);
114    argv[5] = mstrdup(fn);
115  }
116
117  if (mode)
118  {
119    FreeL(argv[3]);
120    argv[3] = mstrdup("read");
121  }
122 
123  if (mp_Env == NULL)
124    mp_Env = MP_InitializeEnv(MP_AllocateEnv());
125
126  if (mp_Env == NULL)
127  {
128    Werror("Initialization of MP Environment");
129    FreeCmdArgs(argc, argv);
130    return NULL;
131  }
132
133  if ((link = MP_OpenLink(mp_Env, argc, argv)) == NULL)
134  {
135    Werror("Opening of MP file %s for %s", fn, (mode ? "writing" : "reading"));
136  }
137  MP_SET_LINK_OPTIONS(link);
138 
139  FreeCmdArgs(argc, argv);
140  return link;
141}
142
143 
144BOOLEAN slOpenReadMPFile(si_link l)
145{
146  if (SI_LINK_W_OPEN_P(l))
147  {
148    Werror("can not open an MP write link to file %s as read link also",
149           l->name);
150    return TRUE;
151  }
152
153  char argvstr[] = "-MPtransp FILE -MPmode read  -MPfile /tmp/mpout";
154  char **argv;
155  int argc;
156  MP_Link_pt link = NULL;
157
158  GetCmdArgs(&argc, &argv, argvstr);
159  if (l->name != NULL)
160  {
161    FreeL(argv[5]);
162    argv[5] = mstrdup(l->name);
163  }
164  if (mp_Env == NULL)
165    mp_Env = MP_InitializeEnv(MP_AllocateEnv());
166
167  if (mp_Env == NULL)
168  {
169    Werror("Initialization of MP Environment");
170    return TRUE;
171  }
172
173  if ((link = MP_OpenLink(mp_Env, 6, argv)) == NULL)
174  {
175    Werror("Opening of MP Read to file %s", l->name);
176    FreeCmdArgs(argc, argv);
177    return TRUE;
178  }
179  MP_SET_LINK_OPTIONS(link);
180
181  FreeCmdArgs(argc, argv);
182  SI_LINK_SET_R_OPEN_P(l);
183  l->data = (void *) link;
184  return FALSE;
185}
186
187MP_Link_pt slOpenMPConnect(si_link l)
188{
189  char argvstr[] = "-MPtransp TCP -MPmode connect -MPport 1025 -MPhost localhost";
190  char *port = IMP_GetCmdlineArg(l->argc, l->argv, "-MPport");
191  char *host = IMP_GetCmdlineArg(l->argc, l->argv, "-MPhost");
192  char **argv;
193  int argc;
194  MP_Link_pt link = NULL;
195
196  GetCmdArgs(&argc, &argv, argvstr);
197
198  if (port == NULL)
199    Warn("No port number specified for MP:connect; We try 1025");
200  else
201  {
202    FreeL(argv[5]);
203    argv[5] = mstrdup(port);
204  }
205
206  if (host == NULL)
207  {
208    char *hn = (char *) AllocL(64*sizeof(char*));
209    FreeL(argv[7]);
210    gethostname(hn, 64);
211    argv[7] = hn;
212    Warn("No host specified for MP:connect; We try %s", hn);
213  }
214  else
215  {
216    FreeL(argv[7]);
217    argv[7] = mstrdup(host);
218  }
219
220  link = MP_OpenLink(mp_Env, 8, argv);
221  MP_SET_LINK_OPTIONS(link);
222
223  FreeCmdArgs(argc, argv);
224
225  return link;
226}
227
228MP_Link_pt slOpenMPListen(si_link l)
229{
230  char argvstr[] = "-MPtransp TCP -MPmode listen -MPport 1025";
231  char *port = IMP_GetCmdlineArg(l->argc, l->argv, "-MPport");
232  char **argv;
233  int argc;
234  MP_Link_pt link;
235
236  GetCmdArgs(&argc, &argv, argvstr);
237
238  if (port == NULL)
239    Warn("No port number specified for MP:listen; We try 1025");
240  else
241  {
242    FreeL(argv[5]);
243    argv[5] = mstrdup(port);
244  }
245  link = MP_OpenLink(mp_Env, 6, argv);
246  MP_SET_LINK_OPTIONS(link);
247
248  FreeCmdArgs(argc, argv);
249  return link;
250}
251
252MP_Link_pt slOpenMPLaunch(si_link l)
253{
254  char *host = IMP_GetCmdlineArg(l->argc, l->argv, "-MPhost");
255  char *app  = IMP_GetCmdlineArg(l->argc, l->argv, "-MPapplication");
256  char *appargs = NULL;
257  char **argv;
258  int argc;
259  MP_Link_pt link=NULL;
260
261  GetCmdArgs(&argc, &argv,
262             "-MPtransp TCP -MPmode launch -MPhost localhost -MPapplication s");
263
264  FreeL(argv[5]);
265  if (host == NULL)
266  {
267    char *hn = (char *) AllocL(64*sizeof(char*));
268    FreeL(argv[7]);
269    gethostname(hn, 64);
270    argv[5] = hn;
271    Warn("No host specified for MP:connect; We try %s", hn);
272  }
273  else
274  {
275    argv[5] = mstrdup(host);
276  }
277
278  if (app  == NULL)
279  {
280    Warn("No application specified for MP:launch; We try: Singular -b");
281    FreeL(argv[7]);
282    argv[7] = mstrdup("Singular -b");
283  }
284  else
285  {
286    FreeL(argv[7]);
287    argv[7] = mstrdup(app);
288  }
289
290  link = MP_OpenLink(mp_Env, 8, argv);
291  MP_SET_LINK_OPTIONS(link);
292
293  FreeCmdArgs(argc, argv);
294  return link;
295}
296
297BOOLEAN slOpenMPTcp(si_link l)
298{
299  MP_Link_pt link = NULL;
300
301  if (l->argc < 1)
302    return TRUE;
303
304  if (mp_Env == NULL)
305    mp_Env = MP_InitializeEnv(MP_AllocateEnv());
306
307  if (mp_Env == NULL)
308  {
309    Werror("Initialization of MP Environment");
310    return TRUE;
311  }
312
313  if (strcmp(l->name, "MP:launch") == 0)
314    link = slOpenMPLaunch(l);
315  else if (strcmp(l->name, "MP:connect") == 0)
316    link = slOpenMPConnect(l);
317  else if (strcmp(l->name, "MP:listen") == 0)
318    link = slOpenMPListen(l);
319  else
320  {
321    Werror("link is not MP:launch, MP:connect or MP:listen");
322    return TRUE;
323  }
324
325  if (link == NULL)
326  {
327    Werror("Could not open link %s",l->name);
328    return TRUE;
329  }
330  SI_LINK_SET_RW_OPEN_P(l);
331  l->data = (void *) link;
332  return FALSE;
333}
334
335BOOLEAN slWriteMP(si_link l, leftv v)
336{
337  mpsr_ClearError();
338  if (mpsr_PutMsg((MP_Link_pt) l->data, v) != mpsr_Success)
339  {
340    mpsr_PrintError();
341    return TRUE;
342  }
343  else
344    return FALSE;
345}
346
347void SentQuitMsg(si_link l)
348{
349  leftv v = (leftv) Alloc0(sizeof(sleftv));
350
351  v->rtyp = STRING_CMD;
352  v->data = (void *) mstrdup("MP:Quit");
353  slWriteMP(l, v);
354  FreeL(v->data);
355  Free(v, sizeof(sleftv));
356}
357
358BOOLEAN slCloseMP(si_link l)
359{
360  if (l->data != NULL)
361  {
362    if (strcmp(l->name, "MP:launch") == 0)
363      SentQuitMsg(l);
364    MP_CloseLink((MP_Link_pt) l->data);
365    l->data = NULL;
366    SI_LINK_SET_CLOSE_P(l);
367    return FALSE;
368  }
369  else
370    return TRUE;
371}
372
373leftv slReadMP(si_link l)
374{
375  leftv v = NULL;
376  mpsr_ClearError();
377  if (mpsr_GetMsg((MP_Link_pt) l->data, v) != mpsr_Success)
378  {
379    mpsr_PrintError();
380    return NULL;
381  }
382  else
383    return v;
384}
385BOOLEAN slInitMP(si_link l,si_link_extension s)
386{
387  if (strncmp(l->argv[0], s->name,3) == 0)
388  {
389    return FALSE;
390  }
391  return TRUE;
392}
393si_link_extension slInitMPFile()
394{
395  si_link_extension s=(si_link_extension)Alloc0(sizeof(*s));
396  s->Init=slInitALink;
397  s->OpenRead=slOpenReadMPFile;
398  s->OpenWrite=slOpenWriteMPFile;
399  s->Close=slCloseMP;
400  s->Read=slReadMP;
401  //s->Read2=NULL;
402  s->Write=slWriteMP;
403  s->name="MP:file";
404  return s;
405}
406si_link_extension slInitMPTcp()
407{
408  si_link_extension s=(si_link_extension)Alloc0(sizeof(*s));
409  s->Init=slInitMP;
410  s->OpenRead=slOpenMPTcp;
411  s->OpenWrite=slOpenMPTcp;
412  s->Close=slCloseMP;
413  s->Read=slReadMP;
414  //s->Read2=NULL;
415  s->Write=slWriteMP;
416  s->name="MP:tcp";
417  return s;
418}
419
420BOOLEAN mpsr_IsMPLink(si_link l)
421{
422  return strcmp(l->name, "MP") > 0;
423}
424#endif
425
426#define MPSR_BATCH_DEBUG
427#ifdef MPSR_BATCH_DEBUG
428BOOLEAN stop = 1;
429#endif
430
431int Batch_do(int argc, char **argv)
432{
433#ifdef HAVE_MPSR
434  si_link silink = (si_link) Alloc0(sizeof(sip_link));
435  leftv v = NULL;
436
437#ifdef MPSR_BATCH_DEBUG
438  fprintf(stderr, "Was started with pid %d\n", getpid());
439  while (stop){};
440#endif
441 
442  // connect to a listening application
443  slInitBatchLink(silink, argc, argv);
444  if (slOpenMPTcp(silink))
445    return 1;
446
447  // the main read-eval-write loop
448  while(1)
449  {
450    v = slRead(silink, v);
451    if (feErrors != NULL)
452    {
453      if (v != NULL) v->CleanUp();
454      v = mpsr_InitLeftv(STRING_CMD, (void *) feErrors);
455      feErrors = NULL;
456    }
457
458    // no need to evaluate -- it is done in the read
459    if (v->Typ() == STRING_CMD && (strcmp((char *)v->Data(), "MP:Quit") == 0))
460    {
461      slKill(silink);
462      return 0;
463    }
464
465    slWriteMP(silink, v);
466
467    if (v != NULL)
468    {
469      v->CleanUp();
470      Free(v, sizeof(sleftv));
471      v = NULL;
472    }
473  }
474  // should never get here
475  return 1;
476#else
477  printf("Option -b not supported in this version\n");
478  return 0;
479#endif
480}
Note: See TracBrowser for help on using the repository browser.