File 10805.patch of Package squid-beta
---------------------
PatchSet 10805
Date: 2007/05/18 06:44:35
Author: amosjeffries
Branch: HEAD
Tag: (none)
Log:
SqString core apparently not automatically added to cvs by patch.
Members:
src/SqString.cc:INITIAL->1.1
src/SqString.cci:INITIAL->1.1
src/SqString.h:INITIAL->1.1
--- /dev/null Fri May 18 06:52:30 2007
+++ squid3/src/SqString.cc Fri May 18 06:52:30 2007
@@ -0,0 +1,391 @@
+
+/*
+ * $Id: SqString.cc,v 1.1 2007/05/18 06:44:35 amosjeffries Exp $
+ *
+ * DEBUG: section 67 String
+ * AUTHOR: Duane Wessels
+ *
+ * SQUID Web Proxy Cache http://www.squid-cache.org/
+ * ----------------------------------------------------------
+ *
+ * Squid is the result of efforts by numerous individuals from
+ * the Internet community; see the CONTRIBUTORS file for full
+ * details. Many organizations have provided support for Squid's
+ * development; see the SPONSORS file for full details. Squid is
+ * Copyrighted (C) 2001 by the Regents of the University of
+ * California; see the COPYRIGHT file for full details. Squid
+ * incorporates software developed and/or copyrighted by other
+ * sources; see the CREDITS file for full details.
+ *
+ * This program is free 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 2 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, USA.
+ *
+ */
+
+#include "squid.h"
+#include "SqString.h"
+#include "Store.h"
+
+void
+SqString::initBuf(size_t sz)
+{
+ PROF_start(StringInitBuf);
+ clear();
+ buf_ = (char *)memAllocString(sz, &sz);
+ assert(sz < 65536);
+ size_ = sz;
+ PROF_stop(StringInitBuf);
+}
+
+void
+SqString::limitInit(const char *str, int len)
+{
+ PROF_start(StringLimitInit);
+ assert(this && str);
+ initBuf(len + 1);
+ len_ = len;
+ xmemcpy(buf_, str, len);
+ buf_[len] = '\0';
+ PROF_stop(StringLimitInit);
+}
+
+void
+SqString::init(char const *str)
+{
+ assert(this);
+
+ PROF_start(StringInit);
+
+ if (str)
+ limitInit(str, strlen(str));
+ else
+ clear();
+ PROF_stop(StringInit);
+}
+
+void
+SqString::clear()
+{
+ PROF_start(StringClean);
+ assert(this);
+
+ if (buf_)
+ memFreeString(size_, buf_);
+
+ len_ = 0;
+ size_ = 0;
+ buf_ = NULL;
+ PROF_stop(StringClean);
+}
+
+SqString::~SqString()
+{
+ clear();
+#if DEBUGSTRINGS
+
+ SqStringRegistry::Instance().remove(this);
+#endif
+}
+
+SqString::SqString (char const *aString)
+{
+ memset(this, 0, sizeof(SqString));
+
+ init(aString);
+#if DEBUGSTRINGS
+
+ SqStringRegistry::Instance().add(this);
+#endif
+}
+
+SqString &
+SqString::operator =(char const *aString)
+{
+ assert(this);
+ init(aString);
+ return *this;
+}
+
+SqString &
+SqString::operator = (SqString const &old)
+{
+ if (old.size())
+ limitInit(old.c_str(), old.size());
+ else
+ clear();
+
+ return *this;
+}
+
+bool
+SqString::operator == (SqString const &that) const
+{
+ return (this->compare(that) == 0);
+}
+
+bool
+SqString::operator != (SqString const &that) const
+{
+ return (this->compare(that) != 0);
+}
+
+bool
+SqString::operator >= (SqString const &that) const
+{
+ return (this->compare(that) >= 0);
+}
+
+bool
+SqString::operator <= (SqString const &that) const
+{
+ return (this->compare(that) <= 0);
+}
+
+bool
+SqString::operator > (SqString const &that) const
+{
+ return (this->compare(that) > 0);
+}
+
+bool
+SqString::operator < (SqString const &that) const
+{
+ return (this->compare(that) < 0);
+}
+
+SqString::SqString (SqString const &old)
+{
+ memset(this, 0, sizeof(SqString));
+
+ init (old.c_str());
+#if DEBUGSTRINGS
+
+ SqStringRegistry::Instance().add(this);
+#endif
+}
+
+void
+SqString::append(const char *str, int len)
+{
+ assert(this);
+
+ PROF_start(StringAppend);
+
+ if(len < 1 || str == NULL)
+ return;
+
+ if (len_ + len < size_) {
+ strncat(buf_, str, len);
+ len_ += len;
+ } else {
+ unsigned int ssz = len_ + len;
+ unsigned int bsz = len_ + len + 1;
+ char* tmp = (char *)memAllocString(ssz, &bsz);
+ assert(bsz < 65536);
+
+ if (buf_)
+ xmemcpy(tmp, buf_, len_);
+
+ if (len)
+ xmemcpy(tmp + len_, str, len);
+
+ tmp[ssz + 1] = '\0';
+
+ clear();
+
+ size_ = bsz;
+ len_ = ssz;
+ buf_ = tmp;
+ tmp = NULL;
+ }
+ PROF_stop(StringAppend);
+}
+
+void
+SqString::append(char const *str)
+{
+ assert (str);
+ append (str, strlen(str));
+}
+
+void
+SqString::append (char chr)
+{
+ char myString[2];
+ myString[0]=chr;
+ myString[1]='\0';
+ append (myString, 1);
+}
+
+void
+SqString::append(SqString const &old)
+{
+ append (old.c_str(), old.len_);
+}
+
+char&
+SqString::operator [](unsigned int pos)
+{
+ assert(pos < size_ );
+
+ return buf_[pos];
+}
+
+#if DEBUGSTRINGS
+void
+SqString::stat(StoreEntry *entry) const
+{
+ storeAppendPrintf(entry, "%p : %d/%d \"%s\"\n",this,len_, size_, c_str());
+}
+
+SqStringRegistry &
+SqStringRegistry::Instance()
+{
+ return Instance_;
+}
+
+template <class C>
+int
+ptrcmp(C const &lhs, C const &rhs)
+{
+ return lhs - rhs;
+}
+
+void
+SqStringRegistry::registerWithCacheManager(CacheManager & manager)
+{
+ manager.registerAction("strings",
+ "Strings in use in squid", Stat, 0, 1);
+}
+
+void
+SqStringRegistry::add(SqString const *entry)
+{
+ entries.insert(entry, ptrcmp);
+}
+
+void
+SqStringRegistry::remove(SqString const *entry)
+{
+ entries.remove(entry, ptrcmp);
+}
+
+SqStringRegistry SqStringRegistry::Instance_;
+
+extern size_t memStringCount();
+
+void
+SqStringRegistry::Stat(StoreEntry *entry)
+{
+ storeAppendPrintf(entry, "%lu entries, %lu reported from MemPool\n", (unsigned long) Instance().entries.elements, (unsigned long) memStringCount());
+ Instance().entries.head->walk(Stater, entry);
+}
+
+void
+SqStringRegistry::Stater(SqString const * const & nodedata, void *state)
+{
+ StoreEntry *entry = (StoreEntry *) state;
+ nodedata->stat(entry);
+}
+
+#endif
+
+/*
+ * Similar to strtok, but has some rudimentary knowledge
+ * of quoting
+ */
+char *
+strwordtok(char *buf, char **t)
+{
+ unsigned char *word = NULL;
+ unsigned char *p = (unsigned char *) buf;
+ unsigned char *d;
+ unsigned char ch;
+ int quoted = 0;
+
+ if (!p)
+ p = (unsigned char *) *t;
+
+ if (!p)
+ goto error;
+
+ while (*p && xisspace(*p))
+ p++;
+
+ if (!*p)
+ goto error;
+
+ word = d = p;
+
+ while ((ch = *p)) {
+ switch (ch) {
+
+ case '\\':
+ p++;
+
+ switch (*p) {
+
+ case 'n':
+ ch = '\n';
+
+ break;
+
+ case 'r':
+ ch = '\r';
+
+ break;
+
+ default:
+ ch = *p;
+
+ break;
+
+ }
+
+ *d++ = ch;
+
+ if (ch)
+ p++;
+
+ break;
+
+ case '"':
+ quoted = !quoted;
+
+ p++;
+
+ break;
+
+ default:
+ if (!quoted && xisspace(*p)) {
+ p++;
+ goto done;
+ }
+
+ *d++ = *p++;
+ break;
+ }
+ }
+
+done:
+ *d++ = '\0';
+
+error:
+ *t = (char *) p;
+ return (char *) word;
+}
+
+#ifndef _USE_INLINE_
+#include "SqString.cci"
+#endif
--- /dev/null Fri May 18 06:52:30 2007
+++ squid3/src/SqString.cci Fri May 18 06:52:30 2007
@@ -0,0 +1,166 @@
+
+/*
+ * $Id: SqString.cci,v 1.1 2007/05/18 06:44:35 amosjeffries Exp $
+ *
+ * DEBUG: section 67 String
+ * AUTHOR: Duane Wessels
+ *
+ * SQUID Web Proxy Cache http://www.squid-cache.org/
+ * ----------------------------------------------------------
+ *
+ * Squid is the result of efforts by numerous individuals from
+ * the Internet community; see the CONTRIBUTORS file for full
+ * details. Many organizations have provided support for Squid's
+ * development; see the SPONSORS file for full details. Squid is
+ * Copyrighted (C) 2001 by the Regents of the University of
+ * California; see the COPYRIGHT file for full details. Squid
+ * incorporates software developed and/or copyrighted by other
+ * sources; see the CREDITS file for full details.
+ *
+ * This program is free 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 2 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, USA.
+ *
+ */
+
+SqString::SqString() : size_(0), len_(0), buf_ (NULL)
+{
+#if DEBUGSTRINGS
+ SqStringRegistry::Instance().add(this);
+#endif
+}
+
+void
+SqString::absorb(SqString &old)
+{
+ clear();
+ size_ = old.size_;
+ buf_ = old.buf_;
+ len_ = old.len_;
+ old.size_ = 0;
+ old.buf_ = NULL;
+ old.len_ = 0;
+}
+
+int
+SqString::size() const
+{
+ return len_;
+}
+
+char const *
+SqString::c_str() const
+{
+ return buf_;
+}
+
+const char *
+SqString::pos(char const *aString) const
+{
+ return strstr(c_str(), aString);
+}
+
+const char *
+SqString::pos(char const ch) const
+{
+ return strchr(c_str(), ch);
+}
+
+const char *
+SqString::rpos(char const ch) const
+{
+ return strrchr(c_str(), ch);
+}
+
+bool
+SqString::empty() const
+{
+ return (buf_ == NULL || len_ == 0);
+}
+
+int
+SqString::compare(char const *aString) const
+{
+ /* strcmp fails on NULLS */
+
+ if (size() == 0 && (aString == NULL || aString[0] == '\0'))
+ return 0;
+
+ if (size() == 0)
+ return -1;
+
+ if (aString == NULL || aString[0] == '\0')
+ return 1;
+
+ return strcmp(c_str(), aString);
+}
+
+int
+SqString::compare(char const *aString, size_t count) const
+{
+ /* always the same at length 0 */
+
+ if (count == 0)
+ return 0;
+
+ if (size() == 0 && (aString == NULL || aString[0] == '\0'))
+ return 0;
+
+ if (size() == 0)
+ return -1;
+
+ if (aString == NULL || aString[0] == '\0')
+ return 1;
+
+ return strncmp(c_str(), aString, count);
+}
+
+int
+SqString::compare(SqString const &aString) const
+{
+ /* strcmp fails on NULLS */
+
+ if (size() == 0 && aString.size() == 0)
+ return 0;
+
+ if (size() == 0)
+ return -1;
+
+ if (aString.size() == 0)
+ return 1;
+
+ return strcmp(c_str(), aString.c_str());
+}
+
+/* FIXME: this is can perform buffer overflows and underflows! */
+void
+SqString::set (char const *loc, char const ch)
+{
+ buf_[loc-buf_] = ch;
+}
+
+/* FIXME: this is can perform buffer overflows and underflows! */
+void
+SqString::cut (size_t newLength)
+{
+ len_ = newLength;
+ buf_[newLength] = '\0';
+}
+
+/* FIXME: this is can perform buffer overflows and underflows! */
+void
+SqString::cutPointer (char const *loc)
+{
+ len_ = loc-buf_;
+ buf_[len_] = '\0';
+}
--- /dev/null Fri May 18 06:52:30 2007
+++ squid3/src/SqString.h Fri May 18 06:52:30 2007
@@ -0,0 +1,155 @@
+
+/*
+ * $Id: SqString.h,v 1.1 2007/05/18 06:44:35 amosjeffries Exp $
+ *
+ * DEBUG: section 67 String
+ * AUTHOR: Duane Wessels
+ *
+ * SQUID Web Proxy Cache http://www.squid-cache.org/
+ * ----------------------------------------------------------
+ *
+ * Squid is the result of efforts by numerous individuals from
+ * the Internet community; see the CONTRIBUTORS file for full
+ * details. Many organizations have provided support for Squid's
+ * development; see the SPONSORS file for full details. Squid is
+ * Copyrighted (C) 2001 by the Regents of the University of
+ * California; see the COPYRIGHT file for full details. Squid
+ * incorporates software developed and/or copyrighted by other
+ * sources; see the CREDITS file for full details.
+ *
+ * This program is free 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 2 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, USA.
+ *
+ */
+
+#ifndef SQSTRING_H
+#define SQSTRING_H
+
+/* forward decls */
+
+class CacheManager;
+
+#define DEBUGSTRINGS 0
+#if DEBUGSTRINGS
+#include "splay.h"
+
+class SqString;
+
+class SqStringRegistry
+{
+
+public:
+ static StringRegistry &Instance();
+
+ void add
+ (SqString const *);
+
+ void registerWithCacheManager(CacheManager & manager);
+
+ void remove
+ (SqString const *);
+
+private:
+ static OBJH Stat;
+
+ static StringRegistry Instance_;
+
+ static SplayNode<SqString const *>::SPLAYWALKEE Stater;
+
+ Splay<SqString const *> entries;
+
+ bool registered;
+
+};
+
+class StoreEntry;
+#endif
+
+class SqString
+{
+
+public:
+
+ /* std::string API available */
+ _SQUID_INLINE_ SqString();
+ SqString (char const *);
+ SqString (SqString const &);
+ ~SqString();
+
+ SqString &operator =(char const *);
+ SqString &operator =(SqString const &);
+ bool operator ==(SqString const &) const;
+ bool operator !=(SqString const &) const;
+ bool operator >=(SqString const &) const;
+ bool operator <=(SqString const &) const;
+ bool operator >(SqString const &) const;
+ bool operator <(SqString const &) const;
+
+ _SQUID_INLINE_ int size() const;
+ _SQUID_INLINE_ char const * c_str() const;
+
+ char& operator [](unsigned int);
+
+ void clear();
+
+ void append(char const *buf, int len);
+ void append(char const *buf);
+ void append(char const);
+ void append(SqString const &);
+
+ _SQUID_INLINE_ bool empty() const;
+ _SQUID_INLINE_ int compare(char const *) const;
+ _SQUID_INLINE_ int compare(char const *, size_t count) const;
+ _SQUID_INLINE_ int compare(SqString const &) const;
+
+/* Custom Squid Operations available */
+ /// Super-efficient string assignment. Moves internal content from one object to another.
+ /// then resets the initial pobject to empty.
+ _SQUID_INLINE_ void absorb(SqString &old);
+ _SQUID_INLINE_ const char * pos(char const *) const;
+ _SQUID_INLINE_ const char * pos(char const ch) const;
+ _SQUID_INLINE_ const char * rpos(char const ch) const;
+
+ _SQUID_INLINE_ void set
+ (char const *loc, char const ch);
+
+ _SQUID_INLINE_ void cut (size_t newLength);
+
+ _SQUID_INLINE_ void cutPointer (char const *loc);
+
+#if DEBUGSTRINGS
+
+ void stat (StoreEntry *) const;
+
+#endif
+
+ void limitInit(const char *str, int len);
+private:
+ void initBuf(size_t sz);
+ void init (char const *);
+
+ /* never reference these directly! */
+ unsigned short int size_; /* buffer size; 64K limit */
+
+ unsigned short int len_; /* current length */
+
+ char *buf_;
+};
+
+#ifdef _USE_INLINE_
+#include "SqString.cci"
+#endif
+
+#endif /* SQSTRING_H */
+