source: git/Singular/sing_mp.cc @ 04d4de

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