source: git/Singular/silink.cc @ e6969d

spielwiese
Last change on this file since e6969d was e6969d, checked in by Olaf Bachmann <obachman@…>, 27 years ago
Wed Mar 26 14:02:15 1997 Olaf Bachmann <obachman@ratchwum.mathematik.uni-kl.de (Olaf Bachmann)> * added reference counter to links, updated slKill, slCopy, slInit * various small bug fixes for Batch mode git-svn-id: file:///usr/local/Singular/svn/trunk@78 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 8.3 KB
Line 
1/****************************************
2*  Computer Algebra System SINGULAR     *
3****************************************/
4/*
5* ABSTRACT
6*/
7/* $Log: not supported by cvs2svn $
8// Revision 1.1.1.1  1997/03/19  13:18:42  obachman
9// Imported Singular sources
10//
11*/
12
13#include <stdio.h>
14#include <string.h>
15#include "mod2.h"
16#include "tok.h"
17#include "mmemory.h"
18#include "febase.h"
19#include "subexpr.h"
20#include "ipid.h"
21#include "silink.h"
22
23/* =============== general utilities ====================================== */
24void GetCmdArgs(int *argc, char ***argv, char *str)
25{
26  int i = 0, sl = strlen(str)+1, j;
27  char *s2=mstrdup(str);
28
29#ifdef HAVE_MPSR
30  char *appl = strstr(s2, "-MPapplication");
31  if (appl != NULL)
32  {
33    *(appl-1) = '\0';
34    i = 2;
35  }
36#endif
37
38  if (strtok(s2, " ") != NULL)
39  {
40    i++;
41    while (strtok(NULL," ") != NULL) i++;
42  }
43  *argc = i;
44  if (i>0)
45  {
46    *argv = (char **) Alloc0(i*sizeof(char *));
47#ifdef HAVE_MPSR
48    if (appl != NULL) i -= 2;
49#endif
50    if (i>0)
51    {
52      strcpy(s2,str);
53      *argv[0] = mstrdup(strtok(s2, " "));
54      for(j = 1; j <i; j++)
55        (*argv)[j] = mstrdup(strtok(NULL, " "));
56    }
57  }
58  else
59    *argv = NULL;
60
61#ifdef HAVE_MPSR
62  if (appl != NULL)
63  {
64    (*argv)[*argc -2] = mstrdup("-MPapplication");
65    (*argv)[*argc -1] = mstrdup(&(appl[14]));
66  }
67#endif
68
69  FreeL(s2);
70}
71/* ====================================================================== */
72si_link_extension si_link_root=NULL;
73BOOLEAN slInit(si_link l, char *istr)
74{
75  char **argv;
76  int argc;
77
78  if (istr!=NULL)
79  {
80    GetCmdArgs(&argc, &argv, istr);
81    // let's parse the results
82    if ( argc <2 )
83    {
84      if (argc == 0)
85      {
86        argv = (char **) Alloc(2*sizeof(char *));
87        argv[0]=mstrdup("");
88      }
89      else if (argc == 1)
90      {
91        char *n=argv[0];
92        Free((ADDRESS)argv,sizeof(char *));
93        argv = (char **) Alloc(2*sizeof(char *));
94        argv[0]=n;
95      }
96      argv[1]=mstrdup("ascii");
97      argc=2;
98    }
99    l->argc = argc;
100    l->argv = argv;
101  }
102  if (l->name==NULL)
103    l->name = mstrdup(argv[0]);
104
105  l->ref = 0;
106
107  BOOLEAN not_found=TRUE;
108  si_link_extension s=si_link_root;
109  while (s!=NULL)
110  {
111    if (!(not_found=s->Init(l,s)))
112    {
113      l->m=s;
114      l->linkType=s->index;
115      break;
116    }
117    s=s->next;
118  }
119  if (not_found) Werror("unknown link type `%s`",argv[1]);
120  return not_found;
121}
122
123void slCleanUp(si_link l)
124{
125  (l->ref)--;
126  if (l->ref < 0)
127  {
128    if (SI_LINK_OPEN_P(l)) slClose(l);
129    if (l->name != NULL) FreeL((ADDRESS)l->name);
130    l->name=NULL;
131    if (l->argc!=0 && l->argv != NULL)
132    {
133      int i=l->argc-1;
134      while(i>=0)
135      {
136        if (l->argv[i] != NULL) FreeL((ADDRESS)l->argv[i]);
137        i--;
138      }
139      Free((ADDRESS)l->argv,l->argc*sizeof(char *));
140    }
141    l->argv=NULL;
142    l->argc=0;
143    l->ref=0;
144  }
145}
146
147 
148void slKill(si_link l)
149{
150  if (l->ref == 0)
151  {
152    slCleanUp(l);
153    Free((ADDRESS)l, sizeof(ip_link));
154  }
155  else
156   slCleanUp(l); 
157}
158
159//--------------------------------------------------------------------------
160BOOLEAN slOpenRead(si_link l)
161{
162  if(SI_LINK_R_OPEN_P(l)) return FALSE; // already open r
163  si_link_extension s=si_link_root;
164  while ((s!=NULL) && (s->index!=l->linkType)) s=s->next;
165  if ((s==NULL)||(s->OpenRead==NULL))
166     return TRUE;
167  l->m=s;   
168  return  s->OpenRead(l);   
169}
170
171BOOLEAN slOpenWrite(si_link l)
172{
173  if(SI_LINK_W_OPEN_P(l)) return FALSE; // already open w
174  si_link_extension s=si_link_root;
175  while ((s!=NULL) && (s->index!=l->linkType)) s=s->next;
176  if ((s==NULL)||(s->OpenWrite==NULL))
177     return TRUE;
178  l->m=s;   
179  return  s->OpenWrite(l);   
180}
181
182BOOLEAN slClose(si_link l)
183{
184  if(! SI_LINK_OPEN_P(l)) return FALSE; // already closed
185  si_link_extension s=l->m;
186  if (s==NULL)
187  {
188    s=si_link_root;
189    while ((s!=NULL) && (s->index!=l->linkType)) s=s->next;
190  } 
191  if ((s==NULL)||(s->Close==NULL))
192    return TRUE;
193  return  s->Close(l);   
194}
195
196leftv slRead(si_link l,leftv a)
197{
198  leftv v = NULL;
199  if( ! SI_LINK_R_OPEN_P(l)) // open r ?
200  {
201    if (slOpenRead(l)) return NULL;
202  }
203  if ((SI_LINK_R_OPEN_P(l))&&(l->m!=NULL))
204  { // open r
205    if (a==NULL)
206    {
207      if (l->m->Read!=NULL)
208        v=l->m->Read(l);
209    }
210    else
211    {
212      if (l->m->Read2!=NULL)
213        v=l->m->Read2(l,a);
214    }
215  }
216  // here comes the eval:
217  if (v != NULL) 
218  {
219    v->Eval();
220  }
221  return v;
222}
223
224BOOLEAN slWrite(si_link l, leftv v)
225{
226  if(! SI_LINK_W_OPEN_P(l)) // open w ?
227  {
228    if (slOpenWrite(l)) return TRUE;
229  }
230  if((SI_LINK_W_OPEN_P(l))&&(l->m!=NULL))
231  { // now open w
232    if (l->m->Write!=NULL)
233      return l->m->Write(l,v);
234  }
235  return TRUE;
236}
237
238/* =============== ASCII ============================================= */
239BOOLEAN slOpenWriteAscii(si_link l)
240{
241  if(SI_LINK_R_OPEN_P(l)&&(l->name[0]!='\0'))
242  {
243    Werror("cannot open input file %s as output file",l->name);
244    return TRUE; // already open r
245  }
246  FILE *outfile;
247  char *mode="a";
248  char *filename=l->name;
249  if(filename[0]=='\0')
250  {
251    SI_LINK_SET_W_OPEN_P(l); /*open, write */
252    l->data=(void *)stdout;
253    return FALSE;
254  }
255  else if(filename[0]=='>')
256  {
257    if (filename[1]=='>')
258      filename+=2;
259    else
260    {
261      filename++;
262      mode="w";
263    }
264  }
265  int i=2;
266  while (i<l->argc)
267  {
268    if(strncmp(l->argv[i],"mode:",5)==0)
269      mode=l->argv[i]+5;
270    else if(strcmp(l->argv[i],"showPath")!=0)
271      Warn("ignore link property %s",l->argv[i]);
272    i++;
273  }
274  outfile=fopen(filename,mode);
275  if (outfile!=NULL)
276  {
277    SI_LINK_SET_W_OPEN_P(l); /*open, write */
278    l->data=(void *)outfile;
279    return FALSE;
280  }
281  return TRUE;
282}
283BOOLEAN slOpenReadAscii(si_link l)
284{
285  if(SI_LINK_W_OPEN_P(l))
286  {
287    Werror("cannot open output file %s as input file",l->name);
288    return TRUE; // already open w
289  }
290  if (l->name[0]!='\0')
291  {
292    char *where=NULL;
293    int i=2;
294    while (i<l->argc)
295    {
296      if(strcmp(l->argv[i],"showPath")==0)
297        where=(char *)Alloc(120);
298      else if(strncmp(l->argv[i],"mode:",5)!=0)
299        Warn("ignore link property %s",l->argv[i]);
300      i++;
301    }
302    FILE *rfile=feFopen(l->name,"r",where);
303    if (where!=NULL)
304    {
305      Print("open %s, success:%d\n",where,rfile!=NULL);
306      Free((ADDRESS)where,120);
307    }
308    if (rfile!=NULL)
309    {
310      l->data=(void *)rfile;
311      SI_LINK_SET_R_OPEN_P(l);
312      return FALSE;
313    }
314    Werror("cannot open %s",l->name);
315    l->data=NULL;
316    return TRUE;
317  }
318  SI_LINK_SET_R_OPEN_P(l);
319  return FALSE;
320}
321BOOLEAN slCloseAscii(si_link l)
322{
323  SI_LINK_SET_CLOSE_P(l);
324  if (l->name[0]!='\0')
325  {
326    return (fclose((FILE *)l->data)!=0);
327  }
328  return FALSE;
329}
330leftv slReadAscii(si_link l)
331{
332  FILE * fp=(FILE *)l->data;
333  char * buf=NULL;
334  if (fp!=NULL)
335  {
336    fseek(fp,0L,SEEK_END);
337    long len=ftell(fp);
338    fseek(fp,0L,SEEK_SET);
339    buf=(char *)AllocL((int)len+1);
340    if (BVERBOSE(V_READING)) Print("//Reading %d chars\n",len);
341    fread( buf, len, 1, fp);
342    buf[len]='\0';
343  }
344  else
345  {
346    PrintS("? "); mflush();
347    buf=(char *)AllocL(80);
348    fe_fgets_stdin(buf,80);
349  }
350  leftv v=(leftv)Alloc0(sizeof(sleftv));
351  v->rtyp=STRING_CMD;
352  v->data=buf;
353  return v;
354}
355BOOLEAN slWriteAscii(si_link l, leftv v)
356{
357  FILE *outfile=(FILE *)l->data;
358  BOOLEAN err=FALSE;
359  char *s;
360  while (v!=NULL)
361  {
362    s = v->String();
363    // free v ??
364    if (s!=NULL)
365    {
366      fprintf(outfile,"%s\n",s);
367      FreeL((ADDRESS)s);
368    }
369    else
370    {
371      Werror("cannot convert to string");
372      err=TRUE;
373    }
374    v = v->next;
375  }
376  fflush(outfile);
377  return err;
378}
379
380BOOLEAN slInitALink(si_link l,si_link_extension s)
381{
382  if (strcmp(l->argv[1], s->name) == 0)
383  {
384    return FALSE;
385  }
386  return TRUE;
387}
388
389
390/*-------------------------------------------------------------------*/
391void slExtensionInit(si_link_extension s)
392{
393  s->index=si_link_root->index+10;
394  s->next=si_link_root;
395  si_link_root=s;
396}
397
398#ifdef HAVE_DBM
399#include "sing_dbm.h"
400#endif
401
402#ifdef HAVE_MPSR
403#include "sing_mp.h"
404#endif 
405
406void slStandardInit()
407{
408  si_link_root=(si_link_extension)Alloc0(sizeof(*si_link_root));
409  si_link_root->Init=slInitALink;
410  si_link_root->OpenRead=slOpenReadAscii;
411  si_link_root->OpenWrite=slOpenWriteAscii;
412  si_link_root->Close=slCloseAscii;
413  si_link_root->Read=slReadAscii;
414  //si_link_root->Read2=NULL;
415  si_link_root->Write=slWriteAscii;
416  si_link_root->name="ascii";
417  si_link_root->index=1;
418#ifdef HAVE_DBM
419#ifndef HAVE_MODULE_DBM
420  slExtensionInit(dbInit());
421#endif
422#endif
423#ifdef HAVE_MPSR
424  slExtensionInit(slInitMPFile());
425  slExtensionInit(slInitMPTcp());
426#endif 
427}
Note: See TracBrowser for help on using the repository browser.