gwenhywfar  4.3.3
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  return GWEN_ERROR_EOF;
116  }
117  else {
118  fb->bufferWritePos=rv;
119  fb->bufferReadPos=0;
120  }
121  }
122 
123  bytes=fb->bufferWritePos-fb->bufferReadPos;
124  p=fb->buffer+fb->bufferReadPos;
125  while(bytes) {
126  uint8_t c;
127 
128  hadSome=1;
129 
130  c=fb->buffer[fb->bufferReadPos++];
131  fb->bytesRead++;
132  bytes--;
133  if (c==10) {
134  lineComplete=1;
135  /* don't include this character */
136  break;
137  }
138  else if (c==13) {
139  break;
140  }
141  else {
142  copied++;
143  }
144  } /* while */
145 
146  if (copied)
147  GWEN_Buffer_AppendBytes(buf, (const char*)p, copied);
148  }
149 
150  return 0;
151 }
152 
153 
154 
156  assert(fb);
157  return fb->flags;
158 }
159 
160 
161 
163  assert(fb);
164  fb->flags=fl;
165 }
166 
167 
168 
170  assert(fb);
171  fb->flags|=fl;
172 }
173 
174 
175 
177  assert(fb);
178  fb->flags&=~fl;
179 }
180 
181 
182 
184  assert(fb);
185  return fb->bytesWritten;
186 }
187 
188 
189 
191  assert(fb);
192  return fb->bytesRead;
193 }
194 
195 
196 
197 
198 
199 
200 
201 
202 
203 
204