Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #ifdef HAVE_CONFIG_H
00011 # include <config.h>
00012 #endif
00013
00014
00015 #define DISABLE_DEBUGLOG
00016
00017
00018 #include "fastbuffer.h"
00019
00020 #include "i18n_l.h"
00021 #include <gwenhywfar/misc.h>
00022 #include <gwenhywfar/debug.h>
00023
00024 #include <assert.h>
00025
00026
00027 GWEN_FAST_BUFFER *GWEN_FastBuffer_new(uint32_t bsize, GWEN_SYNCIO *io) {
00028 GWEN_FAST_BUFFER *fb;
00029
00030 assert(bsize);
00031
00032 fb=(GWEN_FAST_BUFFER*) malloc(sizeof(GWEN_FAST_BUFFER)+bsize);
00033 assert(fb);
00034 memset(fb, 0, sizeof(GWEN_FAST_BUFFER)+bsize);
00035
00036 fb->bufferSize=bsize;
00037
00038 fb->io=io;
00039
00040 return fb;
00041 }
00042
00043
00044
00045 void GWEN_FastBuffer_free(GWEN_FAST_BUFFER *fb) {
00046 if (fb) {
00047 GWEN_FREE_OBJECT(fb);
00048 }
00049 }
00050
00051
00052
00053 int GWEN_FastBuffer_ReadLine(GWEN_FAST_BUFFER *fb, uint8_t *p, int len) {
00054 int bytes;
00055 int copied=0;
00056
00057 if (fb->bufferReadPos>=fb->bufferWritePos) {
00058 int rv;
00059
00060 rv=GWEN_SyncIo_Read(fb->io, fb->buffer, fb->bufferSize);
00061 if (rv<0) {
00062 DBG_DEBUG(GWEN_LOGDOMAIN, "here (%d)", rv);
00063 return rv;
00064 }
00065 }
00066
00067 bytes=fb->bufferWritePos-fb->bufferReadPos;
00068 if (bytes>len)
00069 bytes=len;
00070 while(bytes) {
00071 uint8_t c;
00072
00073 c=fb->buffer[fb->bufferReadPos++];
00074 fb->bytesRead++;
00075 if (c==10) {
00076 *(p++)=c;
00077 copied++;
00078 break;
00079 }
00080 else if (c!=13) {
00081 *(p++)=c;
00082 copied++;
00083 }
00084 bytes--;
00085 }
00086
00087 return copied;
00088 }
00089
00090
00091
00092 int GWEN_FastBuffer_ReadLineToBuffer(GWEN_FAST_BUFFER *fb, GWEN_BUFFER *buf) {
00093 int lineComplete=0;
00094 int hadSome=0;
00095
00096 while (!lineComplete) {
00097 int bytes;
00098 int copied=0;
00099 uint8_t *p;
00100
00101 if (fb->bufferReadPos>=fb->bufferWritePos) {
00102 int rv;
00103
00104 rv=GWEN_SyncIo_Read(fb->io, fb->buffer, fb->bufferSize);
00105 if (rv<0) {
00106 if (rv==GWEN_ERROR_EOF && hadSome) {
00107
00108 return 0;
00109 }
00110 DBG_INFO(GWEN_LOGDOMAIN, "here (%d)", rv);
00111 return rv;
00112 }
00113 else if (rv==0) {
00114 DBG_DEBUG(GWEN_LOGDOMAIN, "EOF met");
00115 return GWEN_ERROR_EOF;
00116 }
00117 else {
00118 fb->bufferWritePos=rv;
00119 fb->bufferReadPos=0;
00120 }
00121 }
00122
00123 bytes=fb->bufferWritePos-fb->bufferReadPos;
00124 p=fb->buffer+fb->bufferReadPos;
00125 while(bytes) {
00126 uint8_t c;
00127
00128 hadSome=1;
00129
00130 c=fb->buffer[fb->bufferReadPos++];
00131 fb->bytesRead++;
00132 bytes--;
00133 if (c==10) {
00134 lineComplete=1;
00135
00136 break;
00137 }
00138 else if (c==13) {
00139 break;
00140 }
00141 else {
00142 copied++;
00143 }
00144 }
00145
00146 if (copied)
00147 GWEN_Buffer_AppendBytes(buf, (const char*)p, copied);
00148 }
00149
00150 return 0;
00151 }
00152
00153
00154
00155 uint32_t GWEN_FastBuffer_GetFlags(const GWEN_FAST_BUFFER *fb) {
00156 assert(fb);
00157 return fb->flags;
00158 }
00159
00160
00161
00162 void GWEN_FastBuffer_SetFlags(GWEN_FAST_BUFFER *fb, uint32_t fl) {
00163 assert(fb);
00164 fb->flags=fl;
00165 }
00166
00167
00168
00169 void GWEN_FastBuffer_AddFlags(GWEN_FAST_BUFFER *fb, uint32_t fl) {
00170 assert(fb);
00171 fb->flags|=fl;
00172 }
00173
00174
00175
00176 void GWEN_FastBuffer_SubFlags(GWEN_FAST_BUFFER *fb, uint32_t fl) {
00177 assert(fb);
00178 fb->flags&=~fl;
00179 }
00180
00181
00182
00183 uint32_t GWEN_FastBuffer_GetBytesWritten(const GWEN_FAST_BUFFER *fb) {
00184 assert(fb);
00185 return fb->bytesWritten;
00186 }
00187
00188
00189
00190 uint32_t GWEN_FastBuffer_GetBytesRead(const GWEN_FAST_BUFFER *fb) {
00191 assert(fb);
00192 return fb->bytesRead;
00193 }
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204