gwenhywfar  4.8.0beta
fastbuffer.c
Go to the documentation of this file.
1 /***************************************************************************
2  begin : Tue Apr 27 2010
3  copyright : (C) 2010 by Martin Preuss
4  email : martin@libchipcard.de
5 
6  ***************************************************************************
7  * Please see toplevel file COPYING for license details *
8  ***************************************************************************/
9 
10 #ifdef HAVE_CONFIG_H
11 # include <config.h>
12 #endif
13 
14 
15 #define DISABLE_DEBUGLOG
16 
17 
18 #include "fastbuffer.h"
19 
20 #include "i18n_l.h"
21 #include <gwenhywfar/misc.h>
22 #include <gwenhywfar/debug.h>
23 
24 #include <assert.h>
25 
26 
28  GWEN_FAST_BUFFER *fb;
29 
30  assert(bsize);
31 
32  fb=(GWEN_FAST_BUFFER*) malloc(sizeof(GWEN_FAST_BUFFER)+bsize);
33  assert(fb);
34  memset(fb, 0, sizeof(GWEN_FAST_BUFFER)+bsize);
35 
36  fb->bufferSize=bsize;
37 
38  fb->io=io;
39 
40  return fb;
41 }
42 
43 
44 
46  if (fb) {
47  GWEN_FREE_OBJECT(fb);
48  }
49 }
50 
51 
52 
53 int GWEN_FastBuffer_ReadLine(GWEN_FAST_BUFFER *fb, uint8_t *p, int len) {
54  int bytes;
55  int copied=0;
56 
57  if (fb->bufferReadPos>=fb->bufferWritePos) {
58  int rv;
59 
60  rv=GWEN_SyncIo_Read(fb->io, fb->buffer, fb->bufferSize);
61  if (rv<0) {
62  DBG_DEBUG(GWEN_LOGDOMAIN, "here (%d)", rv);
63  return rv;
64  }
65  }
66 
67  bytes=fb->bufferWritePos-fb->bufferReadPos;
68  if (bytes>len)
69  bytes=len;
70  while(bytes) {
71  uint8_t c;
72 
73  c=fb->buffer[fb->bufferReadPos++];
74  fb->bytesRead++;
75  if (c==10) {
76  *(p++)=c;
77  copied++;
78  break;
79  }
80  else if (c!=13) {
81  *(p++)=c;
82  copied++;
83  }
84  bytes--;
85  } /* while */
86 
87  return copied;
88 }
89 
90 
91 
93  int lineComplete=0;
94  int hadSome=0;
95 
96  while (!lineComplete) {
97  int bytes;
98  int copied=0;
99  uint8_t *p;
100 
101  if (fb->bufferReadPos>=fb->bufferWritePos) {
102  int rv;
103 
104  rv=GWEN_SyncIo_Read(fb->io, fb->buffer, fb->bufferSize);
105  if (rv<0) {
106  if (rv==GWEN_ERROR_EOF && hadSome) {
107  /* done */
108  return 0;
109  }
110  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
111  return rv;
112  }
113  else if (rv==0) {
114  DBG_DEBUG(GWEN_LOGDOMAIN, "EOF met");
115  if (!hadSome)
116  return GWEN_ERROR_EOF;
117  lineComplete=1;
118  /* TODO: maybe we should have a flag that indicates that we met EOF here... */
119  }
120  else {
121  fb->bufferWritePos=rv;
122  fb->bufferReadPos=0;
123  }
124  }
125 
126  bytes=fb->bufferWritePos-fb->bufferReadPos;
127  p=fb->buffer+fb->bufferReadPos;
128  while(bytes) {
129  uint8_t c;
130 
131  hadSome=1;
132 
133  c=fb->buffer[fb->bufferReadPos++];
134  fb->bytesRead++;
135  bytes--;
136  if (c==10) {
137  lineComplete=1;
138  /* don't include this character */
139  break;
140  }
141  else if (c==13) {
142  break;
143  }
144  else {
145  copied++;
146  }
147  } /* while */
148 
149  if (copied)
150  GWEN_Buffer_AppendBytes(buf, (const char*)p, copied);
151  }
152 
153  return 0;
154 }
155 
156 
157 
159  assert(fb);
160  return fb->flags;
161 }
162 
163 
164 
166  assert(fb);
167  fb->flags=fl;
168 }
169 
170 
171 
173  assert(fb);
174  fb->flags|=fl;
175 }
176 
177 
178 
180  assert(fb);
181  fb->flags&=~fl;
182 }
183 
184 
185 
187  assert(fb);
188  return fb->bytesWritten;
189 }
190 
191 
192 
194  assert(fb);
195  return fb->bytesRead;
196 }
197 
198 
199 
200 
201 
202 
203 
204 
205 
206 
207