Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | 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 Tue Oct 5 01:09:20 2004 for WvStreams by doxygen 1.3.7