source: git/Singular/silink.cc @ 20d92ca

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