gwenhywfar  5.10.1
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 {
29  GWEN_FAST_BUFFER *fb;
30 
31  assert(bsize);
32 
34  assert(fb);
35  memset(fb, 0, sizeof(GWEN_FAST_BUFFER)+bsize);
36 
37  fb->bufferSize=bsize;
38 
39  fb->io=io;
40 
41  return fb;
42 }
43 
44 
45 
47 {
48  if (fb) {
50  }
51 }
52 
53 
54 
55 int GWEN_FastBuffer_ReadLine(GWEN_FAST_BUFFER *fb, uint8_t *p, int len)
56 {
57  int bytes;
58  int copied=0;
59 
60  if (fb->bufferReadPos>=fb->bufferWritePos) {
61  int rv;
62 
63  rv=GWEN_SyncIo_Read(fb->io, fb->buffer, fb->bufferSize);
64  if (rv<0) {
65  DBG_DEBUG(GWEN_LOGDOMAIN, "here (%d)", rv);
66  return rv;
67  }
68  }
69 
70  bytes=fb->bufferWritePos-fb->bufferReadPos;
71  if (bytes>len)
72  bytes=len;
73  while (bytes) {
74  uint8_t c;
75 
76  c=fb->buffer[fb->bufferReadPos++];
77  fb->bytesRead++;
78  if (c==10) {
79  *(p++)=c;
80  copied++;
81  break;
82  }
83  else if (c!=13) {
84  *(p++)=c;
85  copied++;
86  }
87  bytes--;
88  } /* while */
89 
90  return copied;
91 }
92 
93 
94 
96 {
97  int lineComplete=0;
98  int hadSome=0;
99 
100  while (!lineComplete) {
101  int bytes;
102  int copied=0;
103  uint8_t *p;
104 
105  if (fb->bufferReadPos>=fb->bufferWritePos) {
106  int rv;
107 
108  rv=GWEN_SyncIo_Read(fb->io, fb->buffer, fb->bufferSize);
109  if (rv<0) {
110  if (rv==GWEN_ERROR_EOF && hadSome) {
111  /* done */
112  return 0;
113  }
114  DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
115  return rv;
116  }
117  else if (rv==0) {
118  DBG_DEBUG(GWEN_LOGDOMAIN, "EOF met");
119  if (!hadSome)
120  return GWEN_ERROR_EOF;
121  lineComplete=1;
122  /* TODO: maybe we should have a flag that indicates that we met EOF here... */
123  }
124  else {
125  fb->bufferWritePos=rv;
126  fb->bufferReadPos=0;
127  }
128  }
129 
130  bytes=fb->bufferWritePos-fb->bufferReadPos;
131  p=fb->buffer+fb->bufferReadPos;
132  while (bytes) {
133  uint8_t c;
134 
135  hadSome=1;
136 
137  c=fb->buffer[fb->bufferReadPos++];
138  fb->bytesRead++;
139  bytes--;
140  if (c==10) {
141  lineComplete=1;
142  /* don't include this character */
143  break;
144  }
145  else if (c==13) {
146  break;
147  }
148  else {
149  copied++;
150  }
151  } /* while */
152 
153  if (copied)
154  GWEN_Buffer_AppendBytes(buf, (const char *)p, copied);
155  }
156 
157  return 0;
158 }
159 
160 
161 
163 {
164  assert(fb);
165  return fb->flags;
166 }
167 
168 
169 
171 {
172  assert(fb);
173  fb->flags=fl;
174 }
175 
176 
177 
179 {
180  assert(fb);
181  fb->flags|=fl;
182 }
183 
184 
185 
187 {
188  assert(fb);
189  fb->flags&=~fl;
190 }
191 
192 
193 
195 {
196  assert(fb);
197  return fb->bytesWritten;
198 }
199 
200 
201 
203 {
204  assert(fb);
205  return fb->bytesRead;
206 }
207 
208 
209 
210 
211 
212 
213 
214 
215 
216 
217 
int GWEN_SyncIo_Read(GWEN_SYNCIO *sio, uint8_t *buffer, uint32_t size)
Definition: syncio.c:133
uint32_t GWEN_FastBuffer_GetBytesRead(const GWEN_FAST_BUFFER *fb)
Definition: fastbuffer.c:202
GWEN_SYNCIO * io
Definition: fastbuffer.h:30
uint32_t bufferSize
Definition: fastbuffer.h:31
int GWEN_FastBuffer_ReadLineToBuffer(GWEN_FAST_BUFFER *fb, GWEN_BUFFER *buf)
Definition: fastbuffer.c:95
void GWEN_Memory_dealloc(void *p)
Definition: memory.c:69
int GWEN_FastBuffer_ReadLine(GWEN_FAST_BUFFER *fb, uint8_t *p, int len)
Definition: fastbuffer.c:55
uint8_t buffer[1]
Definition: fastbuffer.h:37
void GWEN_FastBuffer_free(GWEN_FAST_BUFFER *fb)
Definition: fastbuffer.c:46
uint32_t GWEN_FastBuffer_GetBytesWritten(const GWEN_FAST_BUFFER *fb)
Definition: fastbuffer.c:194
#define GWEN_LOGDOMAIN
Definition: logger.h:35
uint32_t bufferReadPos
Definition: fastbuffer.h:32
uint32_t bytesWritten
Definition: fastbuffer.h:35
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40
uint32_t GWEN_FastBuffer_GetFlags(const GWEN_FAST_BUFFER *fb)
Definition: fastbuffer.c:162
#define DBG_DEBUG(dbg_logger, format, args...)
Definition: debug.h:214
void * GWEN_Memory_malloc(size_t wsize)
Definition: memory.c:39
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
void GWEN_FastBuffer_SubFlags(GWEN_FAST_BUFFER *fb, uint32_t fl)
Definition: fastbuffer.c:186
#define GWEN_ERROR_EOF
Definition: error.h:96
uint32_t bufferWritePos
Definition: fastbuffer.h:33
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
int GWEN_Buffer_AppendBytes(GWEN_BUFFER *bf, const char *buffer, uint32_t size)
Definition: buffer.c:361
void GWEN_FastBuffer_SetFlags(GWEN_FAST_BUFFER *fb, uint32_t fl)
Definition: fastbuffer.c:170
void GWEN_FastBuffer_AddFlags(GWEN_FAST_BUFFER *fb, uint32_t fl)
Definition: fastbuffer.c:178
uint32_t flags
Definition: fastbuffer.h:34
uint32_t bytesRead
Definition: fastbuffer.h:36
GWEN_FAST_BUFFER * GWEN_FastBuffer_new(uint32_t bsize, GWEN_SYNCIO *io)
Definition: fastbuffer.c:27