gwenhywfar
4.3.3
|
00001 /*************************************************************************** 00002 begin : Tue Apr 27 2010 00003 copyright : (C) 2010 by Martin Preuss 00004 email : martin@libchipcard.de 00005 00006 *************************************************************************** 00007 * Please see toplevel file COPYING for license details * 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 } /* while */ 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 /* done */ 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 /* don't include this character */ 00136 break; 00137 } 00138 else if (c==13) { 00139 break; 00140 } 00141 else { 00142 copied++; 00143 } 00144 } /* while */ 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