Add function to measure the length of the fifo buffer
[citadel.git] / libcitadel / lib / stringbuf.c
index 55daf6192c57b9127e1735b71a947ea9772804dd..c8f8a6434d53436b8894b336f39d0e6b3b0e0337 100644 (file)
@@ -1,3 +1,21 @@
+/*
+ * Copyright (c) 1987-2011 by the citadel.org team
+ *
+ * This program is open source software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
 #include "sysdep.h"
 #include <ctype.h>
 #include <errno.h>
@@ -2125,6 +2143,7 @@ long StrECMAEscAppend(StrBuf *Target, const StrBuf *Source, const char *PlainIn)
        const char *aptr, *eiptr;
        char *bptr, *eptr;
        long len;
+       int IsUtf8Sequence;
 
        if (((Source == NULL) && (PlainIn == NULL)) || (Target == NULL) )
                return -1;
@@ -2663,6 +2682,8 @@ int StrBufRFC2047encode(StrBuf **target, const StrBuf *source)
                    (ch  > 126) || 
                    (ch ==  61) ||
                    (ch == '=') ||
+                    (ch == '?') ||
+                   (ch == '_') ||
                    (ch == '[') ||
                    (ch == ']')   )
                {
@@ -2670,7 +2691,10 @@ int StrBufRFC2047encode(StrBuf **target, const StrBuf *source)
                        (*target)->BufUsed += 3;
                }
                else {
-                       (*target)->buf[(*target)->BufUsed] = ch;
+                       if (ch == ' ')
+                               (*target)->buf[(*target)->BufUsed] = '_';
+                       else
+                               (*target)->buf[(*target)->BufUsed] = ch;
                        (*target)->BufUsed++;
                }
        }
@@ -3315,7 +3339,7 @@ static inline int Ctdl_GetUtf8SequenceLength(const char *CharS, const char *Char
        int n = 0;
         unsigned char test = (1<<7);
 
-       if ((*CharS & 0xC0) == 0) 
+       if ((*CharS & 0xC0) != 0xC0) 
                return 1;
 
        while ((n < 8) && 
@@ -3338,7 +3362,7 @@ static inline int Ctdl_GetUtf8SequenceLength(const char *CharS, const char *Char
 static inline int Ctdl_IsUtf8SequenceStart(const char Char)
 {
 /** 11??.???? indicates an UTF8 Sequence. */
-       return ((Char & 0xC0) != 0);
+       return ((Char & 0xC0) == 0xC0);
 }
 
 /**
@@ -3699,7 +3723,18 @@ eReadState StrBufChunkSipLine(StrBuf *LineBuf, IOBuffer *FB)
                        optr --;
                if ((*(ptr - 1) != '\r') && (*(ptr - 1) != '\n')) {
                        LineBuf->BufUsed = optr - LineBuf->buf;
-                       *optr = '\0';       
+                       *optr = '\0';
+                       if ((FB->ReadWritePointer != NULL) && 
+                           (FB->ReadWritePointer != FB->Buf->buf))
+                       {
+                               /* Ok, the client application read all the data 
+                                  it was interested in so far. Since there is more to read, 
+                                  we now shrink the buffer, and move the rest over.
+                               */
+                               StrBufCutLeft(FB->Buf, 
+                                             FB->ReadWritePointer - FB->Buf->buf);
+                               FB->ReadWritePointer = FB->Buf->buf;
+                       }
                        return eMustReadMore;
                }
        }
@@ -3739,6 +3774,14 @@ eReadState StrBufCheckBuffer(IOBuffer *FB)
        return eReadSuccess;
 }
 
+long IOBufferStrLength(IOBuffer *FB)
+{
+       if (FB->ReadWritePointer == NULL)
+               return StrLength(FB->Buf);
+       
+       return StrLength(FB->Buf) - (FB->ReadWritePointer - FB->Buf->buf);
+}
+
 /*******************************************************************************
  *           File I/O; Prefer buffered read since its faster!                  *
  *******************************************************************************/