source: git/Singular/sing_mp.cc @ 286bd57

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