source: git/Singular/sing_mp.cc @ 6ae4f5

spielwiese
Last change on this file since 6ae4f5 was 6ae4f5, checked in by Hans Schönemann <hannes@…>, 27 years ago
* hannes: - corrected scanner.l: parsing of strings in blocks: if (1) { write("","}"); } - corrected ipassign.cc: assignment of "dummy" types: DEF, NONE - corrected sleftv::Print(_), initialisation of _ - added conversion int->def - added CopyD(DEF) - in insert(..): object should not be of type NONE (lists.cc:lInsert0) - added int*intvec, int*intmat to iparith.cc git-svn-id: file:///usr/local/Singular/svn/trunk@145 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 10.1 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/* $Id: sing_mp.cc,v 1.8 1997-04-09 12:20:10 Singular 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 %s", mp_Env->thishost);
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 %s", mp_Env->thishost);
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  mpsr_ClearError();
273  if (mpsr_PutMsg((MP_Link_pt) l->data, v) != mpsr_Success)
274  {
275    mpsr_PrintError((MP_Link_pt) l->data);
276    return TRUE;
277  }
278  else
279    return FALSE;
280}
281
282leftv slReadMP(si_link l)
283{
284  leftv v = NULL;
285  mpsr_ClearError();
286  if (mpsr_GetMsg((MP_Link_pt) l->data, v) != mpsr_Success)
287  {
288    mpsr_PrintError((MP_Link_pt) l->data);
289    return NULL;
290  }
291  else
292    return v;
293}
294
295static void SentQuitMsg(si_link l)
296{
297  leftv v = (leftv) Alloc0(sizeof(sleftv));
298
299  v->rtyp = STRING_CMD;
300  v->data = "MP:Quit";
301  slWriteMP(l, v);
302  Free(v, sizeof(sleftv));
303}
304
305BOOLEAN slCloseMP(si_link l)
306{
307  if ((strcmp(l->mode, "launch") == 0) &&
308      (MP_GetLinkStatus((MP_Link_pt)l->data,MP_LinkReadyWriting) == MP_TRUE))
309    SentQuitMsg(l);
310  MP_CloseLink((MP_Link_pt) l->data);
311  SI_LINK_SET_CLOSE_P(l);
312  return FALSE;
313}
314
315
316BOOLEAN slDumpMP(si_link l)
317{
318  mpsr_ClearError();
319  if (mpsr_PutDump((MP_Link_pt) l->data) != mpsr_Success)
320  {
321    mpsr_PrintError((MP_Link_pt) l->data);
322    return TRUE;
323  }
324  else
325    return FALSE;
326}
327
328BOOLEAN slGetDumpMP(si_link l)
329{
330  mpsr_ClearError();
331  if (mpsr_GetDump((MP_Link_pt) l->data) != mpsr_Success)
332  {
333    mpsr_PrintError((MP_Link_pt) l->data);
334    return TRUE;
335  }
336  else
337    return FALSE;
338}
339
340char* slStatusMP(si_link l, char* request)
341{
342  if (strcmp(request, "read") == 0)
343  {
344    if (SI_LINK_R_OPEN_P(l) &&
345        (MP_GetLinkStatus((MP_Link_pt)l->data,MP_LinkReadyReading) == MP_TRUE))
346        return "ready";
347    else return "not ready";
348  }
349  else if (strcmp(request, "write") == 0)
350  {
351    if (SI_LINK_W_OPEN_P(l) &&
352        (MP_GetLinkStatus((MP_Link_pt)l->data,MP_LinkReadyWriting) == MP_TRUE))
353        return "ready";
354    else return "not ready";
355  }
356  else return "unknown status request";
357}
358
359/***************************************************************
360 *
361 * MP batch stuff
362 *
363 ***************************************************************/
364
365// #define MPSR_BATCH_DEBUG
366#ifdef MPSR_BATCH_DEBUG
367static BOOLEAN stop = 1;
368#endif
369
370int Batch_do(int argc, char **argv)
371{
372#ifdef MPSR_BATCH_DEBUG
373  fprintf(stderr, "Was started with pid %d\n", getpid());
374  while (stop){};
375#endif
376  si_link silink = (si_link) Alloc0(sizeof(sip_link));
377  leftv v = NULL;
378  char *port = IMP_GetCmdlineArg(argc, argv, "-MPport");
379  char *host = IMP_GetCmdlineArg(argc, argv, "-MPhost");
380  char *istr;
381  idhdl id;
382
383  // parse argv to get port and host
384  if (port == NULL)
385  {
386    fprintf(stderr,
387            "Need '-MPport portnumber' command line argument in batch modus\n");
388    return 1;
389  }
390  if (host == NULL)
391  {
392    fprintf(stderr,
393            "Need '-MPhost hostname' command line argument in batch modus\n");
394    return 1;
395  }
396
397  // initialize si_link
398  istr = (char *) AllocL((strlen(port) + strlen(host) + 40)*sizeof(char));
399  sprintf(istr, "MPtcp:connect -MPport %s -MPhost %s", port, host);
400  slInit(silink, istr);
401  FreeL(istr);
402
403  // open link
404  if (slOpen(silink, SI_LINK_OPEN))
405  {
406    fprintf(stderr, "Batch side could not connect on port %s and host %s\n",
407            port, host);
408    return 1;
409  }
410
411  // establish top-level identifier for link
412  id = enterid(mstrdup("mp_ll"), 0, LINK_CMD, &idroot, FALSE);
413  IDLINK(id) = silink;
414
415  // the main read-eval-write loop
416  while(1)
417  {
418    v = slRead(silink, v);
419    if (feErrors != NULL)
420    {
421      if (v != NULL) v->CleanUp();
422      v = mpsr_InitLeftv(STRING_CMD, (void *) feErrors);
423      feErrors = NULL;
424    }
425
426    // no need to evaluate -- it is done in the read
427    if (v->Typ() == STRING_CMD && (strcmp((char *)v->Data(), "MP:Quit") == 0))
428    {
429      slKill(silink);
430      return 0;
431    }
432
433    slWriteMP(silink, v);
434
435    if (v != NULL)
436    {
437      v->CleanUp();
438      Free(v, sizeof(sleftv));
439      v = NULL;
440    }
441  }
442  // should never get here
443  return 1;
444}
445
446/***************************************************************
447 *
448 * MP link Extension inits
449 *
450 ***************************************************************/
451
452void slInitMPFileExtension(si_link_extension s)
453{
454  s->Open=slOpenMPFile;
455  s->Close=slCloseMP;
456  s->Read=slReadMP;
457  //s->Read2=NULL;
458  s->Dump=slDumpMP;
459  s->GetDump=slGetDumpMP;
460  s->Write=slWriteMP;
461  s->Status=slStatusMP;
462  s->type="MPfile";
463}
464
465void slInitMPTcpExtension(si_link_extension s)
466{
467  s->Open=slOpenMPTcp;
468  s->Close=slCloseMP;
469  s->Read=slReadMP;
470  //s->Read2=NULL;
471  s->Dump=slDumpMP;
472  s->GetDump=slGetDumpMP;
473  s->Write=slWriteMP;
474  s->Status=slStatusMP;
475  s->type="MPtcp";
476}
477
478#endif
479
Note: See TracBrowser for help on using the repository browser.