Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | Directories | File List | Namespace Members | Class Members | File Members | Related Pages

wvbuffer.cc

Go to the documentation of this file.
00001 /*
00002  * Worldvisions Weaver Software:
00003  *   Copyright (C) 1997-2002 Net Integration Technologies, Inc.
00004  * 
00005  * Specializations of the generic buffering API.
00006  */
00007 #include "wvbuf.h"
00008 
00009 /***** Specialization for raw memory buffers *****/
00010 
00011 // Instantiate some commonly used templates
00012 template WvBufBaseCommonImpl<unsigned char>;
00013 template WvInPlaceBufBase<unsigned char>;
00014 template WvConstInPlaceBufBase<unsigned char>;
00015 template WvCircularBufBase<unsigned char>;
00016 template WvDynBufBase<unsigned char>;
00017 template WvNullBufBase<unsigned char>;
00018 template WvBufCursorBase<unsigned char>;
00019 
00020 void WvBufBase<unsigned char>::putstr(WvStringParm str)
00021 {
00022     put((const unsigned char*)str.cstr(), str.len());
00023 }
00024 
00025 
00026 WvString WvBufBase<unsigned char>::getstr()
00027 {
00028     /* Copy the contents into the string.
00029      * We used to just return a reference to those bytes, but
00030      * that required modifying the buffer to append a null
00031      * terminator, which does not work with read-only buffers.
00032      * This method is also somewhat safer if a little slower.
00033      */ 
00034     WvString result;
00035     size_t len = used();
00036     result.setsize(len + 1);
00037     char *str = result.edit();
00038     move(str, len);
00039     str[len] = '\0';
00040     return result;
00041 }
00042 
00043 
00044 WvString WvBufBase<unsigned char>::getstr(size_t len)
00045 {
00046     WvString result;
00047     result.setsize(len + 1);
00048     char *str = result.edit();
00049     move(str, len);
00050     str[len] = '\0';
00051     return result;
00052 }
00053 
00054 
00055 size_t WvBufBase<unsigned char>::strchr(int ch)
00056 {
00057     size_t offset = 0;
00058     size_t avail = used();
00059     while (offset < avail)
00060     {
00061         size_t len = optpeekable(offset);
00062         const unsigned char *str = peek(offset, len);
00063         for (size_t i = 0; i < len; ++i)
00064             if (str[i] == ch)
00065                 return offset + i + 1;
00066         offset += len;
00067     }
00068     return 0;
00069 }
00070 
00071 
00072 size_t WvBufBase<unsigned char>::_match(const void *bytelist,
00073     size_t numbytes, bool reverse)
00074 {
00075     size_t offset = 0;
00076     size_t avail = used();
00077     const unsigned char *chlist = (const unsigned char*)bytelist;
00078     while (offset < avail)
00079     {
00080         size_t len = optpeekable(offset);
00081         const unsigned char *str = peek(offset, len);
00082         for (size_t i = 0; i < len; ++i)
00083         {
00084             int ch = str[i];
00085             size_t c;
00086             for (c = 0; c < numbytes; ++c)
00087                 if (chlist[c] == ch)
00088                     break;
00089             if (reverse)
00090             {
00091                 if (c == numbytes)
00092                     continue;
00093             }
00094             else
00095             {
00096                 if (c != numbytes)
00097                     continue;
00098             }
00099             return offset + i;
00100         }
00101         offset += len;
00102     }
00103     return reverse ? offset : 0;
00104 }
00105 
00106 
00107 /***** WvConstStringBuffer *****/
00108 
00109 WvConstStringBuffer::WvConstStringBuffer(WvStringParm _str)
00110 {
00111     reset(_str);
00112 }
00113 
00114 
00115 WvConstStringBuffer::WvConstStringBuffer()
00116 {
00117 }
00118 
00119 
00120 void WvConstStringBuffer::reset(WvStringParm _str)
00121 {
00122     xstr = _str;
00123     WvConstInPlaceBuf::reset(xstr.cstr(), xstr.len());
00124 }

Generated on Wed Dec 15 15:08:10 2004 for WvStreams by  doxygen 1.3.9.1