source: git/Singular/links/s_buff.cc @ bc0d32

spielwiese
Last change on this file since bc0d32 was bc0d32, checked in by Hans Schoenemann <hannes@…>, 11 years ago
add: handling signals in systyem calls
  • Property mode set to 100644
File size: 4.4 KB
RevLine 
[00e336]1#include <unistd.h>
[df326b]2#include <stdio.h>
[00e336]3#include <ctype.h>
4#include <sys/types.h>
5#include <sys/stat.h>
6#include <fcntl.h>
7#include <signal.h>
8
9#include <coeffs/si_gmp.h>
10
11#include <omalloc/omalloc.h>
12#include <Singular/links/s_buff.h>
[bc0d32]13#include <Singular/si_signals.h>
[00e336]14//struct s_buff_s
15//{
16//    char * buff; // buffer
17//    int fd;      // file descrr.
18//    int size;    // size of buff
19//    int bp;      // current pos. in buff
20//    int end;     // last position in buff
21//};
22
23//typedef struct s_buff_s * s_buff;
24
[df326b]25#define S_BUFF_LEN 4096
[00e336]26
27sigset_t ssi_sigmask; // set in ssiLink.cc
28sigset_t ssi_oldmask; // set in ssiLink.cc
29
30#define SSI_BLOCK_CHLD sigprocmask(SIG_SETMASK, &ssi_sigmask, &ssi_oldmask)
31#define SSI_UNBLOCK_CHLD sigprocmask(SIG_SETMASK, &ssi_oldmask, NULL)
32
33s_buff s_open(int fd)
34{
35  SSI_BLOCK_CHLD;
36  s_buff F=(s_buff)omAlloc0(sizeof(*F));
37  F->fd=fd;
38  F->buff=(char*)omAlloc(S_BUFF_LEN);
39  SSI_UNBLOCK_CHLD;
40  return F;
41}
42
43s_buff s_open_by_name(const char *n)
44{
45  SSI_BLOCK_CHLD;
[bc0d32]46  int fd=si_open(n,O_RDONLY);
[00e336]47  SSI_UNBLOCK_CHLD;
48  return s_open(fd);
49}
50
51int    s_close(s_buff &F)
52{
53  if (F!=NULL)
54  {
55    SSI_BLOCK_CHLD;
56    omFreeSize(F->buff,S_BUFF_LEN);
[bc0d32]57    int r=si_close(F->fd);
[00e336]58    omFreeSize(F,sizeof(*F));
59    F=NULL;
60    SSI_UNBLOCK_CHLD;
61    return r;
62  }
63  return 0;
64}
65
66int s_getc(s_buff F)
67{
68  if (F==NULL)
69  {
70    printf("link closed");
71    return 0;
72  }
73  if (F->bp>=F->end)
74  {
75    memset(F->buff,0,S_BUFF_LEN); /*debug*/
76    SSI_BLOCK_CHLD;
[bc0d32]77    int r=si_read(F->fd,F->buff,S_BUFF_LEN);
[00e336]78    SSI_UNBLOCK_CHLD;
79    if (r<=0)
80    {
81      F->is_eof=1;
82      return -1;
83    }
84    else
85    {
86      F->end=r-1;
87      F->bp=0;
88      return F->buff[0];
89    }
90  }
91  /*else*/
92  F->bp++;
93  return F->buff[F->bp];
94}
95int s_isready(s_buff F)
96{
97  if (F==NULL)
98  {
99    printf("link closed");
100    return 0;
101  }
102  if (F->bp>=F->end) return 0;
103  int p=F->bp+1;
104  while((p<F->end)&&(F->buff[p]<=' ')) p++;
105  if (p>=F->end) return 0;
106  return 1;
107}
108
109void s_ungetc(int c, s_buff F)
110{
111  if (F==NULL)
112  {
113    printf("link closed");
114  }
[df326b]115  else if (F->bp>=0)
[00e336]116  {
117    F->buff[F->bp]=c;
118    F->bp--;
119  }
120}
121
122int s_readint(s_buff F)
123{
124  if (F==NULL)
125  {
126    printf("link closed");
127    return 0;
128  }
129  char c;
130  int neg=1;
131  int r=0;
132  //int digit=0;
133  do
134  {
135    c=s_getc(F);
136  } while((!F->is_eof) && (c<=' '));
137  if (c=='-') { neg=-1; c=s_getc(F); }
138  while(isdigit(c))
139  {
140    //digit++;
141    r=r*10+(c-'0');
142    c=s_getc(F);
143  }
144  s_ungetc(c,F);
145  //if (digit==0) { printf("unknown char %c(%d)\n",c,c); /*debug*/
146  //                printf("buffer:%s\np=%d,e=%d\n",F->buff,F->bp,F->end);fflush(stdout); } /*debug*/
147  return r*neg;
148}
149
[df326b]150long s_readlong(s_buff F)
151{
152  if (F==NULL)
153  {
154    printf("link closed");
155    return 0;
156  }
157  char c;
158  long neg=1;
159  long r=0;
160  //int digit=0;
161  do
162  {
163    c=s_getc(F);
164  } while((!F->is_eof) && (c<=' '));
165  if (c=='-') { neg=-1; c=s_getc(F); }
166  while(isdigit(c))
167  {
168    //digit++;
169    r=r*10+(c-'0');
170    c=s_getc(F);
171  }
172  s_ungetc(c,F);
173  //if (digit==0) { printf("unknown char %c(%d)\n",c,c); /*debug*/
174  //                printf("buffer:%s\np=%d,e=%d\n",F->buff,F->bp,F->end);fflush(stdout); } /*debug*/
175  return r*neg;
176}
177
[00e336]178int s_readbytes(char *buff,int len, s_buff F)
179{
180  if (F==NULL)
181  {
182    printf("link closed");
183    return 0;
184  }
185  int i=0;
186  while((!F->is_eof)&&(i<len))
187  {
188    buff[i]=s_getc(F);
189    i++;
190  }
191  return i;
192}
193
194void s_readmpz(s_buff F, mpz_t a)
195{
196  if (F==NULL)
197  {
198    printf("link closed");
199    return;
200  }
201  mpz_set_ui(a,0);
202  char c;
203  int neg=1;
204  do
205  {
206    c=s_getc(F);
207  } while((!F->is_eof) && (c<=' '));
208  if (c=='-') { neg=-1; c=s_getc(F); }
209  while(isdigit(c))
210  {
211    mpz_mul_ui(a,a,10);
212    mpz_add_ui(a,a,(c-'0'));
213    c=s_getc(F);
214  }
215  s_ungetc(c,F);
216  if (neg==-1) mpz_neg(a,a);
217}
218
219void s_readmpz_base(s_buff F, mpz_ptr a, int base)
220{
221  if (F==NULL)
222  {
223    printf("link closed");
224    return;
225  }
226  mpz_set_ui(a,0);
227  char c;
228  int neg=1;
229  do
230  {
231    c=s_getc(F);
232  } while((!F->is_eof) && (c<=' '));
233  if (c=='-') { neg=-1; c=s_getc(F); }
234  while(c>' ')
235  {
236    if (isdigit(c))
237    {
238      mpz_mul_ui(a,a,base);
239      mpz_add_ui(a,a,(c-'0'));
240    }
241    else if ((c>='a') && (c<='z'))
242    {
243      mpz_mul_ui(a,a,base);
244      mpz_add_ui(a,a,(c-'a'+10));
245    }
246    else if ((c>='A') && (c<='Z'))
247    {
248      mpz_mul_ui(a,a,base);
249      mpz_add_ui(a,a,(c-'A'+10));
250    }
251    else
252    {
253      s_ungetc(c,F);
254      break;
255    }
256    c=s_getc(F);
257  }
258  if (neg==-1) mpz_neg(a,a);
259}
260int s_iseof(s_buff F)
261{
262  if (F!=NULL) return F->is_eof;
263  else         return 1;
264}
265
Note: See TracBrowser for help on using the repository browser.