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{
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
55int 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_Buffer_AppendBytes(GWEN_BUFFER *bf, const char *buffer, uint32_t size)
Definition: buffer.c:361
#define DBG_DEBUG(dbg_logger, format, args...)
Definition: debug.h:214
#define DBG_INFO(dbg_logger, format, args...)
Definition: debug.h:181
#define GWEN_ERROR_EOF
Definition: error.h:96
uint32_t GWEN_FastBuffer_GetBytesRead(const GWEN_FAST_BUFFER *fb)
Definition: fastbuffer.c:202
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
void GWEN_FastBuffer_SubFlags(GWEN_FAST_BUFFER *fb, uint32_t fl)
Definition: fastbuffer.c:186
int GWEN_FastBuffer_ReadLine(GWEN_FAST_BUFFER *fb, uint8_t *p, int len)
Definition: fastbuffer.c:55
GWEN_FAST_BUFFER * GWEN_FastBuffer_new(uint32_t bsize, GWEN_SYNCIO *io)
Definition: fastbuffer.c:27
uint32_t GWEN_FastBuffer_GetFlags(const GWEN_FAST_BUFFER *fb)
Definition: fastbuffer.c:162
int GWEN_FastBuffer_ReadLineToBuffer(GWEN_FAST_BUFFER *fb, GWEN_BUFFER *buf)
Definition: fastbuffer.c:95
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
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
Definition: buffer.h:38
#define GWEN_LOGDOMAIN
Definition: logger.h:35
void * GWEN_Memory_malloc(size_t wsize)
Definition: memory.c:39
void GWEN_Memory_dealloc(void *p)
Definition: memory.c:69
uint32_t bytesWritten
Definition: fastbuffer.h:35
uint32_t bufferReadPos
Definition: fastbuffer.h:32
uint32_t flags
Definition: fastbuffer.h:34
uint8_t buffer[1]
Definition: fastbuffer.h:37
uint32_t bufferWritePos
Definition: fastbuffer.h:33
uint32_t bytesRead
Definition: fastbuffer.h:36
uint32_t bufferSize
Definition: fastbuffer.h:31
GWEN_SYNCIO * io
Definition: fastbuffer.h:30
int GWEN_SyncIo_Read(GWEN_SYNCIO *sio, uint8_t *buffer, uint32_t size)
Definition: syncio.c:133
struct GWEN_SYNCIO GWEN_SYNCIO
Definition: syncio.h:40