gwenhywfar  4.3.1
fastbuffer.c
Go to the documentation of this file.
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