Patch file generated Wed May  9 19:11:11 NZST 2007 from
CVS branch ayjwork
CVS base branch HEAD
CVS repository: amosjeffries@cvs.devel.squid-cache.org:/cvsroot/squid
CVS module: squid3

cvs -q rdiff -u -kk -r Z-ayjwork_merge_HEAD -r ayjwork squid3
Index: squid3/src/ACLExtUser.cc
diff -u squid3/src/ACLExtUser.cc:1.8 squid3/src/ACLExtUser.cc:1.7.14.2
--- squid3/src/ACLExtUser.cc:1.8	Sat Apr 28 15:51:47 2007
+++ squid3/src/ACLExtUser.cc	Wed May  2 05:53:05 2007
@@ -79,7 +79,7 @@
 ACLExtUser::match(ACLChecklist *checklist)
 {
     if (checklist->request->extacl_user.size()) {
-        return data->match(checklist->request->extacl_user.buf());
+        return data->match(checklist->request->extacl_user.c_str());
     } else {
         return -1;
     }
Index: squid3/src/ACLHTTPHeaderData.cc
diff -u squid3/src/ACLHTTPHeaderData.cc:1.3 squid3/src/ACLHTTPHeaderData.cc:1.2.14.3
--- squid3/src/ACLHTTPHeaderData.cc:1.3	Sat Apr 28 15:51:47 2007
+++ squid3/src/ACLHTTPHeaderData.cc	Wed May  2 05:53:05 2007
@@ -63,18 +63,18 @@
     if (hdr == NULL)
         return false;
 
-    debugs(28, 3, "aclHeaderData::match: checking '" << hdrName.buf() << "'");
+    debugs(28, 3, "aclHeaderData::match: checking '" << hdrName << "'");
 
-    String value = hdrId != HDR_BAD_HDR ? hdr->getStrOrList(hdrId) : hdr->getByName(hdrName.buf());
+    string value = hdrId != HDR_BAD_HDR ? hdr->getStrOrList(hdrId) : hdr->getByName(hdrName.c_str());
 
-    return regex_rule->match(value.buf());
+    return regex_rule->match(value.c_str());
 }
 
 wordlist *
 ACLHTTPHeaderData::dump()
 {
     wordlist *W = NULL;
-    wordlistAdd(&W, hdrName.buf());
+    wordlistAdd(&W, hdrName.c_str());
     wordlist * regex_dump = regex_rule->dump();
     wordlistAddWl(&W, regex_dump);
     wordlistDestroy(&regex_dump);
@@ -87,14 +87,14 @@
     char* t = strtokFile();
     assert (t != NULL);
     hdrName = t;
-    hdrId = httpHeaderIdByNameDef(hdrName.buf(), strlen(hdrName.buf()));
+    hdrId = httpHeaderIdByNameDef(hdrName.c_str(), hdrName.size());
     regex_rule->parse();
 }
 
 bool
 ACLHTTPHeaderData::empty() const
 {
-    return (hdrId == HDR_BAD_HDR && !hdrName.buf()) || regex_rule->empty();
+    return (hdrId == HDR_BAD_HDR && !hdrName.c_str()) || regex_rule->empty();
 }
 
 ACLData<HttpHeader*> *
Index: squid3/src/ACLHTTPHeaderData.h
diff -u squid3/src/ACLHTTPHeaderData.h:1.2 squid3/src/ACLHTTPHeaderData.h:1.2.14.1
--- squid3/src/ACLHTTPHeaderData.h:1.2	Sat Aug  5 05:51:07 2006
+++ squid3/src/ACLHTTPHeaderData.h	Tue May  1 17:09:50 2007
@@ -53,7 +53,7 @@
 
 private:
     http_hdr_type hdrId; // set if header is known
-    String hdrName; // always set
+    string hdrName; // always set
     ACLData<char const *> * regex_rule;
 };
 
Index: squid3/src/ACLUrlPath.cc
diff -u squid3/src/ACLUrlPath.cc:1.2 squid3/src/ACLUrlPath.cc:1.2.22.1
--- squid3/src/ACLUrlPath.cc:1.2	Thu Jul 10 19:13:04 2003
+++ squid3/src/ACLUrlPath.cc	Wed May  2 05:53:05 2007
@@ -47,7 +47,7 @@
 int
 ACLUrlPathStrategy::match (ACLData<char const *> * &data, ACLChecklist *checklist)
 {
-    char *esc_buf = xstrdup(checklist->request->urlpath.buf());
+    char *esc_buf = xstrdup(checklist->request->urlpath.c_str());
     rfc1738_unescape(esc_buf);
     int result = data->match(esc_buf);
     safe_free(esc_buf);
Index: squid3/src/AuthUser.cc
diff -u squid3/src/AuthUser.cc:1.5 squid3/src/AuthUser.cc:1.3.4.2
--- squid3/src/AuthUser.cc:1.5	Mon Apr 30 10:51:35 2007
+++ squid3/src/AuthUser.cc	Thu May  3 06:37:04 2007
@@ -143,7 +143,7 @@
     if (!proxy_auth_username_cache) {
         /* First time around, 7921 should be big enough */
         proxy_auth_username_cache =
-            hash_create((HASHCMP *) strcmp, 7921, hash_string);
+            hash_create((HASHCMP *) std::strcmp, 7921, hash_string);
         assert(proxy_auth_username_cache);
         eventAdd("User Cache Maintenance", cacheCleanup, NULL, Config.authenticateGCInterval, 1);
     }
Index: squid3/src/CommonPool.h
diff -u squid3/src/CommonPool.h:1.3 squid3/src/CommonPool.h:1.3.22.3
--- squid3/src/CommonPool.h:1.3	Mon Aug  4 19:12:48 2003
+++ squid3/src/CommonPool.h	Thu May  3 06:37:05 2007
@@ -58,11 +58,11 @@
     void *operator new(size_t);
     void operator delete (void *);
     static CommonPool *Factory (unsigned char _class, CompositePoolNode::Pointer&);
-    char const* theClassTypeLabel() const {return typeLabel.buf();}
+    char const* theClassTypeLabel() const { return typeLabel.c_str(); }
 
 protected:
     CommonPool();
-    String typeLabel;
+    string typeLabel;
 };
 
 #endif
Index: squid3/src/CompositePoolNode.h
diff -u squid3/src/CompositePoolNode.h:1.6 squid3/src/CompositePoolNode.h:1.6.14.1
--- squid3/src/CompositePoolNode.h:1.6	Mon Apr 18 19:14:46 2005
+++ squid3/src/CompositePoolNode.h	Thu May  3 08:11:26 2007
@@ -78,7 +78,7 @@
 
         struct IN_ADDR src_addr;
         AuthUserRequest *user;
-        String tag;
+        string tag;
     };
 
 protected:
Index: squid3/src/ConfigParser.h
diff -u squid3/src/ConfigParser.h:1.6 squid3/src/ConfigParser.h:1.6.8.1
--- squid3/src/ConfigParser.h:1.6	Sun May 28 17:50:18 2006
+++ squid3/src/ConfigParser.h	Tue May  1 09:09:26 2007
@@ -61,7 +61,7 @@
     static void ParseUShort(u_short *var);
     static void ParseBool(bool *var);
     static void ParseString(char **var);
-    static void ParseString(String *var);
+    static void ParseString(string &var);
     static void ParseWordList(wordlist **list);
     static char * strtokFile();
 };
Index: squid3/src/DelayTagged.cc
diff -u squid3/src/DelayTagged.cc:1.4 squid3/src/DelayTagged.cc:1.3.24.3
--- squid3/src/DelayTagged.cc:1.4	Sat Apr 28 15:51:48 2007
+++ squid3/src/DelayTagged.cc	Mon May  7 03:32:21 2007
@@ -77,7 +77,7 @@
 DelayTaggedCmp(DelayTaggedBucket::Pointer const &left, DelayTaggedBucket::Pointer const &right)
 {
     /* for rate limiting, case insensitive */
-    return left->tag.caseCmp(right->tag.buf());
+    return strcasecmp(left->tag, right->tag);
 }
 
 void
@@ -183,7 +183,7 @@
     ::operator delete (address);
 }
 
-DelayTaggedBucket::DelayTaggedBucket(String &aTag) : tag (aTag)
+DelayTaggedBucket::DelayTaggedBucket(string &aTag) : tag (aTag)
 {
     debugs(77, 3, "DelayTaggedBucket::DelayTaggedBucket");
 }
@@ -196,11 +196,11 @@
 void
 DelayTaggedBucket::stats (StoreEntry *entry) const
 {
-    storeAppendPrintf(entry, " %s:", tag.buf());
+    storeAppendPrintf(entry, " %s:", tag.c_str());
     theBucket.stats (entry);
 }
 
-DelayTagged::Id::Id(DelayTagged::Pointer aDelayTagged, String &aTag) : theTagged(aDelayTagged)
+DelayTagged::Id::Id(DelayTagged::Pointer aDelayTagged, string &aTag) : theTagged(aDelayTagged)
 {
     theBucket = new DelayTaggedBucket(aTag);
     DelayTaggedBucket::Pointer const *existing = theTagged->buckets.find(theBucket, DelayTaggedCmp);
Index: squid3/src/DelayTagged.h
diff -u squid3/src/DelayTagged.h:1.4 squid3/src/DelayTagged.h:1.4.24.1
--- squid3/src/DelayTagged.h:1.4	Mon Aug  4 19:12:48 2003
+++ squid3/src/DelayTagged.h	Thu May  3 08:11:26 2007
@@ -58,10 +58,10 @@
     void operator delete (void *);
 
     void stats(StoreEntry *)const;
-    DelayTaggedBucket(String &aTag);
+    DelayTaggedBucket(string &aTag);
     ~DelayTaggedBucket();
     DelayBucket theBucket;
-    String tag;
+    string tag;
 };
 
 class DelayTagged : public CompositePoolNode
@@ -88,7 +88,7 @@
     public:
         void *operator new(size_t);
         void operator delete (void *);
-        Id (RefCount<DelayTagged>, String &);
+        Id (RefCount<DelayTagged>, string &);
         ~Id();
         virtual int bytesWanted (int min, int max) const;
         virtual void bytesIn(int qty);
Index: squid3/src/ESI.cc
diff -u squid3/src/ESI.cc:1.23 squid3/src/ESI.cc:1.22.8.3
--- squid3/src/ESI.cc:1.23	Sat Apr 28 15:51:48 2007
+++ squid3/src/ESI.cc	Mon May  7 03:32:21 2007
@@ -2450,7 +2450,7 @@
              */
             return 0;
 
-        if (strstr (sctusable->content.buf(), "ESI/1.0"))
+        if (strstr (sctusable->content, "ESI/1.0"))
             rv = 1;
 
         httpHdrScTargetDestroy (sctusable);
Index: squid3/src/ESIAssign.cc
diff -u squid3/src/ESIAssign.cc:1.4 squid3/src/ESIAssign.cc:1.3.20.3
--- squid3/src/ESIAssign.cc:1.4	Sat Apr 28 15:51:48 2007
+++ squid3/src/ESIAssign.cc	Thu May  3 08:03:33 2007
@@ -83,7 +83,7 @@
     variable = NULL;
 
     if (unevaluatedVariable.size()) {
-        varState->feedData(unevaluatedVariable.buf(), unevaluatedVariable.size());
+        varState->feedData(unevaluatedVariable.c_str(), unevaluatedVariable.size());
         char const *result = varState->extractChar ();
 
         /* Consider activating this, when we want to evaluate variables to a
@@ -117,7 +117,7 @@
     if (!value)
         return ESI_PROCESS_COMPLETE;
 
-    varState->addVariable (name.buf(), name.size(), value);
+    varState->addVariable (name.c_str(), name.size(), value);
 
     value = NULL;
 
@@ -181,12 +181,12 @@
 ESIVariableExpression::~ESIVariableExpression()
 {}
 
-ESIVariableExpression::ESIVariableExpression (String const &aString) : expression (aString)
+ESIVariableExpression::ESIVariableExpression (string const &aString) : expression (aString)
 {}
 
 void
 ESIVariableExpression::eval (ESIVarState &state, char const *subref, char const *defaultOnEmpty) const
 {
     /* XXX: Implement evaluation of the expression */
-    ESISegment::ListAppend (state.getOutput(), expression.buf(), expression.size());
+    ESISegment::ListAppend (state.getOutput(), expression.c_str(), expression.size());
 }
Index: squid3/src/ESIAssign.h
diff -u squid3/src/ESIAssign.h:1.3 squid3/src/ESIAssign.h:1.3.20.3
--- squid3/src/ESIAssign.h:1.3	Mon Aug 30 19:14:26 2004
+++ squid3/src/ESIAssign.h	Thu May  3 08:03:33 2007
@@ -49,11 +49,11 @@
 
 public:
     ~ESIVariableExpression();
-    ESIVariableExpression (String const &value);
+    ESIVariableExpression (string const &value);
     virtual void eval (ESIVarState &state, char const *, char const *) const;
 
 private:
-    String expression;
+    string expression;
 };
 
 /* ESIAssign */
@@ -81,10 +81,10 @@
     void evaluateVariable();
     esiTreeParentPtr parent;
     ESIVarState *varState;
-    String name;
+    string name;
     ESIVariableExpression * value;
     ESIElement::Pointer variable;
-    String unevaluatedVariable;
+    string unevaluatedVariable;
 };
 
 MEMPROXY_CLASS_INLINE(ESIAssign)
Index: squid3/src/ESICustomParser.cc
diff -u squid3/src/ESICustomParser.cc:1.8 squid3/src/ESICustomParser.cc:1.7.14.2
--- squid3/src/ESICustomParser.cc:1.8	Sat Apr 28 15:51:48 2007
+++ squid3/src/ESICustomParser.cc	Thu May  3 08:03:33 2007
@@ -109,7 +109,7 @@
     }
 
     size_t openESITags (0);
-    char const *currentPos = content.buf();
+    char const *currentPos = content.c_str();
     size_t remainingCount = content.size();
     char const *tag = NULL;
 
@@ -302,7 +302,7 @@
 ESICustomParser::errorString() const
 {
     if (error.size())
-        return error.buf();
+        return error.c_str();
     else
         return "Parsing error strings not implemented";
 }
Index: squid3/src/ESICustomParser.h
diff -u squid3/src/ESICustomParser.h:1.6 squid3/src/ESICustomParser.h:1.6.14.1
--- squid3/src/ESICustomParser.h:1.6	Sun Jul  3 19:14:11 2005
+++ squid3/src/ESICustomParser.h	Thu May  3 08:03:34 2007
@@ -60,9 +60,9 @@
 
     char const *findTag(char const *a, size_t b);
     ESIParserClient *theClient;
-    String error;
+    string error;
     /* cheap n dirty - buffer it all */
-    String content;
+    string content;
     /* TODO: make a class of this type code */
     ESITAG_t lastTag;
 };
Index: squid3/src/ESISegment.cc
diff -u squid3/src/ESISegment.cc:1.5 squid3/src/ESISegment.cc:1.4.22.3
--- squid3/src/ESISegment.cc:1.5	Sat Apr 28 15:51:48 2007
+++ squid3/src/ESISegment.cc	Thu May  3 03:05:07 2007
@@ -234,7 +234,7 @@
 void
 ESISegment::dumpOne() const
 {
-    String temp;
+    string temp;
     temp.limitInit(buf, len);
-    debugs(86, 9, "ESISegment::dumpOne: \"" << temp.buf() << "\"");
+    debugs(86, 9, "ESISegment::dumpOne: \"" << temp << "\"");
 }
Index: squid3/src/ESIVarState.cc
diff -u squid3/src/ESIVarState.cc:1.8 squid3/src/ESIVarState.cc:1.7.8.3
--- squid3/src/ESIVarState.cc:1.8	Sat Apr 28 15:51:48 2007
+++ squid3/src/ESIVarState.cc	Mon May  7 03:32:22 2007
@@ -318,9 +318,9 @@
 }
 
 void
-ESIVarState::removeVariable (String const &name)
+ESIVarState::removeVariable (string const &name)
 {
-    Variable *candidate = static_cast <Variable *>(variables.find (name.buf(), name.size()));
+    Variable *candidate = static_cast <Variable *>(variables.find (name.c_str(), name.size()));
 
     if (candidate) {
         /* XXX: remove me */
@@ -335,7 +335,7 @@
 void
 ESIVarState::addVariable(char const *name, size_t len, Variable *aVariable)
 {
-    String temp;
+    string temp;
     temp.limitInit (name, len);
     removeVariable (temp);
     variables.add(name, len, aVariable);
@@ -434,10 +434,10 @@
         if (!subref)
             s = state.header().getStr (HDR_COOKIE);
         else {
-            String S = state.header().getListMember (HDR_COOKIE, subref, ';');
+            string S = state.header().getListMember (HDR_COOKIE, subref, ';');
 
             if (S.size())
-                ESISegment::ListAppend (state.getOutput(), S.buf(), S.size());
+                ESISegment::ListAppend (state.getOutput(), S.c_str(), S.size());
             else if (found_default)
                 ESISegment::ListAppend (state.getOutput(), found_default, strlen (found_default));
         }
@@ -470,8 +470,8 @@
 
     if (state.header().has(HDR_ACCEPT_LANGUAGE)) {
         if (!subref) {
-            String S (state.header().getList (HDR_ACCEPT_LANGUAGE));
-            ESISegment::ListAppend (state.getOutput(), S.buf(), S.size());
+            string S (state.header().getList (HDR_ACCEPT_LANGUAGE));
+            ESISegment::ListAppend (state.getOutput(), S.c_str(), S.size());
         } else {
             if (state.header().hasListMember (HDR_ACCEPT_LANGUAGE, subref, ',')) {
                 s = "true";
@@ -885,10 +885,9 @@
     if (!tempstr[0])
         return;
 
-    String strVary (rep->header.getList (HDR_VARY));
+    string strVary (rep->header.getList (HDR_VARY));
 
-    if (!strVary.size() || strVary.buf()[0] != '*') {
+    if (!strVary.size() || strVary[0] != '*') {
         rep->header.putStr (HDR_VARY, tempstr);
     }
 }
-
Index: squid3/src/ESIVarState.h
diff -u squid3/src/ESIVarState.h:1.2 squid3/src/ESIVarState.h:1.2.24.1
--- squid3/src/ESIVarState.h:1.2	Mon Aug  4 19:12:48 2003
+++ squid3/src/ESIVarState.h	Thu May  3 08:03:34 2007
@@ -64,7 +64,7 @@
 
     class Variable;
     void addVariable (char const *, size_t, Variable *);
-    void removeVariable (String const &);
+    void removeVariable (string const &);
 
     void *operator new (size_t byteCount);
     void operator delete (void *address);
Index: squid3/src/ExternalACLEntry.h
diff -u squid3/src/ExternalACLEntry.h:1.5 squid3/src/ExternalACLEntry.h:1.5.8.1
--- squid3/src/ExternalACLEntry.h:1.5	Sun Aug 20 18:51:49 2006
+++ squid3/src/ExternalACLEntry.h	Tue May  1 09:09:26 2007
@@ -61,11 +61,11 @@
     ExternalACLEntryData() : result (-1) {}
 
     int result;
-    String user;
-    String password;
-    String message;
-    String tag;
-    String log;
+    string user;
+    string password;
+    string message;
+    string tag;
+    string log;
 };
 
 
@@ -88,11 +88,11 @@
     dlink_node lru;
     int result;
     time_t date;
-    String user;
-    String password;
-    String message;
-    String tag;
-    String log;
+    string user;
+    string password;
+    string message;
+    string tag;
+    string log;
     external_acl *def;
 
 private:
Index: squid3/src/HttpHdrCc.cc
diff -u squid3/src/HttpHdrCc.cc:1.7 squid3/src/HttpHdrCc.cc:1.6.12.4
--- squid3/src/HttpHdrCc.cc:1.7	Sat Apr 28 15:51:48 2007
+++ squid3/src/HttpHdrCc.cc	Thu May  3 03:05:07 2007
@@ -66,7 +66,7 @@
 
 
 /* local prototypes */
-static int httpHdrCcParseInit(HttpHdrCc * cc, const String * str);
+static int httpHdrCcParseInit(HttpHdrCc * cc, const string * str);
 
 
 /* module initialization */
@@ -96,7 +96,7 @@
 
 /* creates an cc object from a 0-terminating string */
 HttpHdrCc *
-httpHdrCcParseCreate(const String * str)
+httpHdrCcParseCreate(const string * str)
 {
     HttpHdrCc *cc = httpHdrCcCreate();
 
@@ -110,7 +110,7 @@
 
 /* parses a 0-terminating string and inits cc */
 static int
-httpHdrCcParseInit(HttpHdrCc * cc, const String * str)
+httpHdrCcParseInit(HttpHdrCc * cc, const string * str)
 {
     const char *item;
     const char *p;		/* '=' parameter */
@@ -131,17 +131,16 @@
             nlen = ilen;
 
         /* find type */
-        type = (http_hdr_cc_type ) httpHeaderIdByName(item, nlen,
-                CcFieldsInfo, CC_ENUM_END);
+        type = (http_hdr_cc_type ) httpHeaderIdByName(item, nlen, CcFieldsInfo, CC_ENUM_END);
 
         if (type < 0) {
-            debugs(65, 2, "hdr cc: unknown cache-directive: near '" << item << "' in '" << str->buf() << "'");
+            debugs(65, 2, "hdr cc: unknown cache-directive: near '" << item << "' in '" << *str << "'");
             type = CC_OTHER;
         }
 
         if (EBIT_TEST(cc->mask, type)) {
             if (type != CC_OTHER)
-                debugs(65, 2, "hdr cc: ignoring duplicate cache-directive: near '" << item << "' in '" << str->buf() << "'");
+                debugs(65, 2, "hdr cc: ignoring duplicate cache-directive: near '" << item << "' in '" << *str << "'");
 
             CcFieldsInfo[type].stat.repCount++;
 
@@ -206,8 +205,8 @@
 {
     assert(cc);
 
-    if (cc->other.buf())
-        cc->other.clean();
+    if (cc->other.c_str())
+        cc->other.clear();
 
     memFree(cc, MEM_HTTP_HDR_CC);
 }
@@ -236,7 +235,7 @@
         if (EBIT_TEST(cc->mask, flag) && flag != CC_OTHER) {
 
             /* print option name */
-            packerPrintf(p, (pcount ? ", %s" : "%s"), CcFieldsInfo[flag].name.buf());
+            packerPrintf(p, (pcount ? ", %s" : "%s"), CcFieldsInfo[flag].name.c_str());
 
             /* handle options with values */
 
@@ -254,7 +253,7 @@
     }
 
     if (cc->other.size())
-        packerPrintf(p, (pcount ? ", %s" : "%s"), cc->other.buf());
+        packerPrintf(p, (pcount ? ", %s" : "%s"), cc->other.c_str());
 }
 
 /* negative max_age will clean old max_Age setting */
@@ -300,7 +299,7 @@
     extern const HttpHeaderStat *dump_stat;	/* argh! */
     const int id = (int) val;
     const int valid_id = id >= 0 && id < CC_ENUM_END;
-    const char *name = valid_id ? CcFieldsInfo[id].name.buf() : "INVALID";
+    const char *name = valid_id ? CcFieldsInfo[id].name.c_str() : "INVALID";
 
     if (count || valid_id)
         storeAppendPrintf(sentry, "%2d\t %-20s\t %5d\t %6.2f\n",
Index: squid3/src/HttpHdrRange.cc
diff -u squid3/src/HttpHdrRange.cc:1.15 squid3/src/HttpHdrRange.cc:1.13.8.3
--- squid3/src/HttpHdrRange.cc:1.15	Mon Apr 30 10:51:35 2007
+++ squid3/src/HttpHdrRange.cc	Thu May  3 03:05:07 2007
@@ -231,7 +231,7 @@
 {}
 
 HttpHdrRange *
-HttpHdrRange::ParseCreate(const String * range_spec)
+HttpHdrRange::ParseCreate(const string * range_spec)
 {
     HttpHdrRange *r = new HttpHdrRange;
 
@@ -245,7 +245,7 @@
 
 /* returns true if ranges are valid; inits HttpHdrRange */
 bool
-HttpHdrRange::parseInit(const String * range_spec)
+HttpHdrRange::parseInit(const string * range_spec)
 {
     const char *item;
     const char *pos = NULL;
@@ -253,14 +253,14 @@
     int count = 0;
     assert(this && range_spec);
     ++ParsedCount;
-    debugs(64, 8, "parsing range field: '" << range_spec->buf() << "'");
+    debugs(64, 8, "parsing range field: '" << *range_spec << "'");
     /* check range type */
 
-    if (range_spec->caseCmp("bytes=", 6))
+    if (strncasecmp(*range_spec,"bytes=", 6))
         return 0;
 
     /* skip "bytes="; hack! */
-    pos = range_spec->buf() + 5;
+    pos = range_spec->c_str() + 5;
 
     /* iterate through comma separated list */
     while (strListGetItem(range_spec, ',', &item, &ilen, &pos)) {
@@ -276,8 +276,7 @@
         ++count;
     }
 
-    debugs(64, 8, "parsed range range count: " << count << ", kept " <<
-           specs.size());
+    debugs(64, 8, "parsed range range count: " << count << ", kept " << specs.size());
     return specs.count != 0;
 }
 
Index: squid3/src/HttpHdrSc.cc
diff -u squid3/src/HttpHdrSc.cc:1.6 squid3/src/HttpHdrSc.cc:1.5.8.5
--- squid3/src/HttpHdrSc.cc:1.6	Sat Apr 28 15:51:48 2007
+++ squid3/src/HttpHdrSc.cc	Mon May  7 03:32:22 2007
@@ -67,7 +67,7 @@
 
 
 /* local prototypes */
-static int httpHdrScParseInit(HttpHdrSc * sc, const String * str);
+static int httpHdrScParseInit(HttpHdrSc * sc, const string * str);
 
 /* module initialization */
 
@@ -94,7 +94,7 @@
 
 /* creates an sc object from a 0-terminating string */
 HttpHdrSc *
-httpHdrScParseCreate(const String * str)
+httpHdrScParseCreate(const string * str)
 {
     HttpHdrSc *sc = httpHdrScCreate();
 
@@ -108,7 +108,7 @@
 
 /* parses a 0-terminating string and inits sc */
 static int
-httpHdrScParseInit(HttpHdrSc * sc, const String * str)
+httpHdrScParseInit(HttpHdrSc * sc, const string * str)
 {
     const char *item;
     const char *p;		/* '=' parameter */
@@ -135,11 +135,10 @@
             ilen = p++ - item;
 
         /* find type */
-        type = httpHeaderIdByName(item, ilen,
-                                  ScFieldsInfo, SC_ENUM_END);
+        type = httpHeaderIdByName(item, ilen, ScFieldsInfo, SC_ENUM_END);
 
         if (type < 0) {
-            debugs(90, 2, "hdr sc: unknown control-directive: near '" << item << "' in '" << str->buf() << "'");
+            debugs(90, 2, "hdr sc: unknown control-directive: near '" << item << "' in '" << *str << "'");
             type = SC_OTHER;
         }
 
@@ -163,7 +162,7 @@
 
         if (EBIT_TEST(sct->mask, type)) {
             if (type != SC_OTHER)
-                debugs(90, 2, "hdr sc: ignoring duplicate control-directive: near '" << item << "' in '" << str->buf() << "'");
+                debugs(90, 2, "hdr sc: ignoring duplicate control-directive: near '" << item << "' in '" << *str << "'");
 
             ScFieldsInfo[type].stat.repCount++;
 
@@ -197,7 +196,7 @@
 
             if (!p || !httpHeaderParseQuotedString(p, &sct->content)) {
                 debugs(90, 2, "sc: invalid content= quoted string near '" << item << "'");
-                sct->content.clean();
+                sct->content.clear();
                 EBIT_CLR(sct->mask, type);
             }
 
@@ -258,7 +257,7 @@
         if (EBIT_TEST(sc->mask, flag) && flag != SC_OTHER) {
 
             /* print option name */
-            packerPrintf(p, (pcount ? ", %s" : "%s"), ScFieldsInfo[flag].name.buf());
+            packerPrintf(p, (pcount ? ", %s" : "%s"), ScFieldsInfo[flag].name.c_str());
 
             /* handle options with values */
 
@@ -266,14 +265,14 @@
                 packerPrintf(p, "=%d", (int) sc->max_age);
 
             if (flag == SC_CONTENT)
-                packerPrintf(p, "=\"%s\"", sc->content.buf());
+                packerPrintf(p, "=\"%s\"", sc->content.c_str());
 
             pcount++;
         }
     }
 
     if (sc->target.size())
-        packerPrintf (p, ";%s", sc->target.buf());
+        packerPrintf (p, ";%s", sc->target.c_str());
 }
 
 void
@@ -340,7 +339,7 @@
     extern const HttpHeaderStat *dump_stat;     /* argh! */
     const int id = (int) val;
     const int valid_id = id >= 0 && id < SC_ENUM_END;
-    const char *name = valid_id ? ScFieldsInfo[id].name.buf() : "INVALID";
+    const char *name = valid_id ? ScFieldsInfo[id].name.c_str() : "INVALID";
 
     if (count || valid_id)
         storeAppendPrintf(sentry, "%2d\t %-20s\t %5d\t %6.2f\n",
@@ -353,7 +352,7 @@
     extern const HttpHeaderStat *dump_stat;	/* argh! */
     const int id = (int) val;
     const int valid_id = id >= 0 && id < SC_ENUM_END;
-    const char *name = valid_id ? ScFieldsInfo[id].name.buf() : "INVALID";
+    const char *name = valid_id ? ScFieldsInfo[id].name.c_str() : "INVALID";
 
     if (count || valid_id)
         storeAppendPrintf(sentry, "%2d\t %-20s\t %5d\t %6.2f\n",
@@ -370,9 +369,9 @@
     while (node) {
         HttpHdrScTarget *sct = (HttpHdrScTarget *)node->data;
 
-        if (target && sct->target.buf() && !strcmp (target, sct->target.buf()))
+        if (target && !sct->target.empty() && !strcmp(target, sct->target) )
             return sct;
-        else if (!target && !sct->target.buf())
+        else if (!target && sct->target.empty())
             return sct;
 
         node = node->next;
Index: squid3/src/HttpHdrSc.h
diff -u squid3/src/HttpHdrSc.h:1.1 squid3/src/HttpHdrSc.h:1.1.18.1
--- squid3/src/HttpHdrSc.h:1.1	Sun Apr 23 04:27:37 2006
+++ squid3/src/HttpHdrSc.h	Tue May  1 09:09:26 2007
@@ -54,7 +54,7 @@
 extern void httpHdrScInitModule (void);
 extern void httpHdrScCleanModule (void);
 extern HttpHdrSc *httpHdrScCreate(void);
-extern HttpHdrSc *httpHdrScParseCreate(String const *);
+extern HttpHdrSc *httpHdrScParseCreate(string const *);
 extern void httpHdrScDestroy(HttpHdrSc * sc);
 extern HttpHdrSc *httpHdrScDup(const HttpHdrSc * sc);
 extern void httpHdrScPackInto(const HttpHdrSc * sc, Packer * p);
Index: squid3/src/HttpHdrScTarget.cc
diff -u squid3/src/HttpHdrScTarget.cc:1.4 squid3/src/HttpHdrScTarget.cc:1.4.8.1
--- squid3/src/HttpHdrScTarget.cc:1.4	Sun Apr 23 04:27:37 2006
+++ squid3/src/HttpHdrScTarget.cc	Tue May  1 09:09:26 2007
@@ -58,8 +58,6 @@
 httpHdrScTargetDestroy(HttpHdrScTarget * sc)
 {
     assert(sc);
-    sc->target.clean();
-    sc->content.clean();
     delete sc;
 }
 
@@ -68,7 +66,7 @@
 {
     HttpHdrScTarget *dup;
     assert(sc);
-    dup = httpHdrScTargetCreate(sc->target.buf());
+    dup = httpHdrScTargetCreate(sc->target.c_str());
     dup->mask = sc->mask;
     dup->max_age = sc->max_age;
     dup->content = sc->content;
Index: squid3/src/HttpHdrScTarget.h
diff -u squid3/src/HttpHdrScTarget.h:1.1 squid3/src/HttpHdrScTarget.h:1.1.18.1
--- squid3/src/HttpHdrScTarget.h:1.1	Sun Apr 23 04:27:37 2006
+++ squid3/src/HttpHdrScTarget.h	Tue May  1 09:09:26 2007
@@ -47,8 +47,8 @@
     int mask;
     int max_age;
     int max_stale;
-    String content;
-    String target;
+    string content;
+    string target;
 };
 
 MEMPROXY_CLASS_INLINE(HttpHdrScTarget);
Index: squid3/src/HttpHeader.cc
diff -u squid3/src/HttpHeader.cc:1.44 squid3/src/HttpHeader.cc:1.40.4.7
--- squid3/src/HttpHeader.cc:1.44	Mon May  7 11:51:32 2007
+++ squid3/src/HttpHeader.cc	Tue May  8 05:40:10 2007
@@ -256,7 +256,7 @@
 
 #define assert_eid(id) assert((id) >= 0 && (id) < HDR_ENUM_END)
 
-static void httpHeaderNoteParsedEntry(http_hdr_type id, String const &value, int error);
+static void httpHeaderNoteParsedEntry(http_hdr_type id, string const &value, int error);
 
 static void httpHeaderStatInit(HttpHeaderStat * hs, const char *label);
 static void httpHeaderStatDump(const HttpHeaderStat * hs, StoreEntry * e);
@@ -458,7 +458,7 @@
         if (e->id != HDR_OTHER)
             delById(e->id);
         else
-            delByName(e->name.buf());
+            delByName(e->name.c_str());
 
         addEntry(e->clone());
     }
@@ -565,7 +565,7 @@
         }
 
         if (e->id == HDR_CONTENT_LENGTH && (e2 = findEntry(e->id)) != NULL) {
-            if (e->value.cmp(e2->value.buf()) != 0) {
+            if (e->value.compare(e2->value) != 0) {
                 ssize_t l1, l2;
                 debugs(55, Config.onoff.relaxed_header_parser <= 0 ? 1 : 2,
                   "WARNING: found two conflicting content-length headers in {" << getStringPrefix(header_start, header_end) << "}");
@@ -575,12 +575,12 @@
                     goto reset;
                 }
 
-                if (!httpHeaderParseSize(e->value.buf(), &l1)) {
-                    debugs(55, 1, "WARNING: Unparseable content-length '" << e->value.buf() << "'");
+                if (!httpHeaderParseSize(e->value.c_str(), &l1)) {
+                    debugs(55, 1, "WARNING: Unparseable content-length '" << e->value << "'");
                     delete e;
                     continue;
-                } else if (!httpHeaderParseSize(e2->value.buf(), &l2)) {
-                    debugs(55, 1, "WARNING: Unparseable content-length '" << e2->value.buf() << "'");
+                } else if (!httpHeaderParseSize(e2->value.c_str(), &l2)) {
+                    debugs(55, 1, "WARNING: Unparseable content-length '" << e2->value << "'");
                     delById(e2->id);
                 } else if (l1 > l2) {
                     delById(e2->id);
@@ -602,7 +602,7 @@
             }
         }
 
-        if (e->id == HDR_OTHER && stringHasWhitespace(e->name.buf())) {
+        if (e->id == HDR_OTHER && strpbrk(e->name, w_space) != NULL) {
             debugs(55, Config.onoff.relaxed_header_parser <= 0 ? 1 : 2,
                    "WARNING: found whitespace in HTTP header name {" << 
                    getStringPrefix(field_start, field_end) << "}");
@@ -725,7 +725,7 @@
     debugs(55, 9, "deleting '" << name << "' fields in hdr " << this);
 
     while ((e = getEntry(&pos))) {
-        if (!e->name.caseCmp(name))
+        if (!strcasecmp(e->name,name))
             delAt(pos, count);
         else
             CBIT_SET(mask, e->id);
@@ -840,7 +840,7 @@
 }
 
 bool
-HttpHeader::getList(http_hdr_type id, String *s) const
+HttpHeader::getList(http_hdr_type id, string *s) const
 {
     HttpHeaderEntry *e;
     HttpHeaderPos pos = HttpHeaderInitPos;
@@ -853,7 +853,7 @@
 
     while ((e = getEntry(&pos))) {
         if (e->id == id)
-            strListAdd(s, e->value.buf(), ',');
+            strListAdd(s, e->value.c_str(), ',');
     }
 
     /*
@@ -871,7 +871,7 @@
 }
 
 /* return a list of entries with the same id separated by ',' and ws */
-String
+string
 HttpHeader::getList(http_hdr_type id) const
 {
     HttpHeaderEntry *e;
@@ -881,13 +881,13 @@
     assert(CBIT_TEST(ListHeadersMask, id));
 
     if (!CBIT_TEST(mask, id))
-        return String();
+        return "";
 
-    String s;
+    string s;
 
     while ((e = getEntry(&pos))) {
         if (e->id == id)
-            strListAdd(&s, e->value.buf(), ',');
+            strListAdd(&s, e->value.c_str(), ',');
     }
 
     /*
@@ -905,7 +905,7 @@
 }
 
 /* return a string or list of entries with the same id separated by ',' and ws */
-String
+string
 HttpHeader::getStrOrList(http_hdr_type id) const
 {
     HttpHeaderEntry *e;
@@ -916,13 +916,13 @@
     if ((e = findEntry(id)))
         return e->value;
 
-    return String();
+    return "";
 }
 
 /*
  * Returns the value of the specified header.
  */
-String
+string
 HttpHeader::getByName(const char *name) const
 {
     http_hdr_type id;
@@ -937,12 +937,12 @@
     if (id != -1)
         return getStrOrList(id);
 
-    String result;
+    string result;
 
     /* Sorry, an unknown header name. Do linear search */
     while ((e = getEntry(&pos))) {
-        if (e->id == HDR_OTHER && e->name.caseCmp(name) == 0) {
-            strListAdd(&result, e->value.buf(), ',');
+        if (e->id == HDR_OTHER && strcasecmp(e->name,name) == 0) {
+            strListAdd(&result, e->value.c_str(), ',');
         }
     }
 
@@ -952,10 +952,10 @@
 /*
  * Returns a the value of the specified list member, if any.
  */
-String
+string
 HttpHeader::getByNameListMember(const char *name, const char *member, const char separator) const
 {
-    String header;
+    string header;
     const char *pos = NULL;
     const char *item;
     int ilen;
@@ -965,7 +965,7 @@
 
     header = getByName(name);
 
-    String result;
+    string result;
 
     while (strListGetItem(&header, separator, &item, &ilen, &pos)) {
         if (strncmp(item, member, mlen) == 0 && item[mlen] == '=') {
@@ -980,10 +980,10 @@
 /*
  * returns a the value of the specified list member, if any.
  */
-String
+string
 HttpHeader::getListMember(http_hdr_type id, const char *member, const char separator) const
 {
-    String header;
+    string header;
     const char *pos = NULL;
     const char *item;
     int ilen;
@@ -992,7 +992,7 @@
     assert(id >= 0);
 
     header = getStrOrList(id);
-    String result;
+    string result;
 
     while (strListGetItem(&header, separator, &item, &ilen, &pos)) {
         if (strncmp(item, member, mlen) == 0 && item[mlen] == '=') {
@@ -1001,7 +1001,6 @@
         }
     }
 
-    header.clean();
     return result;
 }
 
@@ -1165,7 +1164,7 @@
     assert(Headers[id].type == ftDate_1123);	/* must be of an appropriate type */
 
     if ((e = findEntry(id))) {
-        value = parse_rfc1123(e->value.buf());
+        value = parse_rfc1123(e->value.c_str());
         httpHeaderNoteParsedEntry(e->id, e->value, value < 0);
     }
 
@@ -1182,7 +1181,7 @@
 
     if ((e = findEntry(id))) {
         httpHeaderNoteParsedEntry(e->id, e->value, 0);	/* no errors are possible */
-        return e->value.buf();
+        return e->value.c_str();
     }
 
     return NULL;
@@ -1198,7 +1197,7 @@
 
     if ((e = findLastEntry(id))) {
         httpHeaderNoteParsedEntry(e->id, e->value, 0);	/* no errors are possible */
-        return e->value.buf();
+        return e->value.c_str();
     }
 
     return NULL;
@@ -1208,7 +1207,7 @@
 HttpHeader::getCc() const
 {
     HttpHdrCc *cc;
-    String s;
+    string s;
 
     if (!CBIT_TEST(mask, HDR_CACHE_CONTROL))
         return NULL;
@@ -1255,7 +1254,7 @@
     if (!CBIT_TEST(mask, HDR_SURROGATE_CONTROL))
         return NULL;
 
-    String s;
+    string s;
    
     (void) getList(HDR_SURROGATE_CONTROL, &s);
 
@@ -1278,7 +1277,7 @@
     HttpHeaderEntry *e;
 
     if ((e = findEntry(HDR_CONTENT_RANGE))) {
-        cr = httpHdrContRangeParseCreate(e->value.buf());
+        cr = httpHdrContRangeParseCreate(e->value.c_str());
         httpHeaderNoteParsedEntry(e->id, e->value, !cr);
     }
 
@@ -1324,7 +1323,7 @@
     assert(Headers[id].type == ftETag);		/* must be of an appropriate type */
 
     if ((e = findEntry(id)))
-        etagParseInit(&etag, e->value.buf());
+        etagParseInit(&etag, e->value.c_str());
 
     return etag;
 }
@@ -1338,7 +1337,7 @@
     memset(&tot, 0, sizeof(tot));
 
     if ((e = findEntry(id))) {
-        const char *str = e->value.buf();
+        const char *str = e->value.c_str();
         /* try as an ETag */
 
         if (etagParseInit(&tot.tag, str)) {
@@ -1374,19 +1373,13 @@
 
     Headers[id].stat.aliveCount++;
 
-    debugs(55, 9, "created HttpHeaderEntry " << this << ": '" << name.buf() << " : " << value.buf());
+    debugs(55, 9, "created HttpHeaderEntry " << this << ": '" << name << " : " << value);
 }
 
 HttpHeaderEntry::~HttpHeaderEntry()
 {
     assert_eid(id);
-    debugs(55, 9, "destroying entry " << this << ": '" << name.buf() << ": " << value.buf() << "'");
-    /* clean name if needed */
-
-    if (id == HDR_OTHER)
-        name.clean();
-
-    value.clean();
+    debugs(55, 9, "destroying entry " << this << ": '" << name << ": " << value << "'");
 
     assert(Headers[id].stat.aliveCount);
 
@@ -1436,9 +1429,9 @@
     /* is it a "known" field? */
     http_hdr_type id = httpHeaderIdByName(field_start, name_len, Headers, HDR_ENUM_END);
 
-    String name;
+    string name;
 
-    String value;
+    string value;
 
     if (id < 0)
         id = HDR_OTHER;
@@ -1460,10 +1453,10 @@
 
     if (field_end - value_start > 65534) {
         /* String must be LESS THAN 64K and it adds a terminating NULL */
-        debugs(55, 1, "WARNING: ignoring '" << name.buf() << "' header of " << (field_end - value_start) << " bytes");
+        debugs(55, 1, "WARNING: ignoring '" << name << "' header of " << (field_end - value_start) << " bytes");
 
         if (id == HDR_OTHER)
-            name.clean();
+            name.clear();
 
         return NULL;
     }
@@ -1475,24 +1468,24 @@
 
     Headers[id].stat.aliveCount++;
 
-    debugs(55, 9, "parsed HttpHeaderEntry: '" << name.buf() << ": " << value.buf() << "'");
+    debugs(55, 9, "parsed HttpHeaderEntry: '" << name << ": " << value << "'");
 
-    return new HttpHeaderEntry(id, name.buf(), value.buf());
+    return new HttpHeaderEntry(id, name.c_str(), value.c_str());
 }
 
 HttpHeaderEntry *
 HttpHeaderEntry::clone() const
 {
-    return new HttpHeaderEntry(id, name.buf(), value.buf());
+    return new HttpHeaderEntry(id, name.c_str(), value.c_str());
 }
 
 void
 HttpHeaderEntry::packInto(Packer * p) const
 {
     assert(p);
-    packerAppend(p, name.buf(), name.size());
+    packerAppend(p, name.c_str(), name.size());
     packerAppend(p, ": ", 2);
-    packerAppend(p, value.buf(), value.size());
+    packerAppend(p, value.c_str(), value.size());
     packerAppend(p, "\r\n", 2);
 }
 
@@ -1502,7 +1495,7 @@
     assert_eid (id);
     assert (Headers[id].type == ftInt);
     int val = -1;
-    int ok = httpHeaderParseInt(value.buf(), &val);
+    int ok = httpHeaderParseInt(value.c_str(), &val);
     httpHeaderNoteParsedEntry(id, value, !ok);
     /* XXX: Should we check ok - ie
      * return ok ? -1 : value;
@@ -1511,13 +1504,13 @@
 }
 
 static void
-httpHeaderNoteParsedEntry(http_hdr_type id, String const &context, int error)
+httpHeaderNoteParsedEntry(http_hdr_type id, string const &context, int error)
 {
     Headers[id].stat.parsCount++;
 
     if (error) {
         Headers[id].stat.errCount++;
-        debugs(55, 2, "cannot parse hdr field: '" << Headers[id].name.buf() << ": " << context.buf() << "'");
+        debugs(55, 2, "cannot parse hdr field: '" << Headers[id].name << ": " << context << "'");
     }
 }
 
@@ -1534,7 +1527,7 @@
 {
     const int id = (int) val;
     const int valid_id = id >= 0 && id < HDR_ENUM_END;
-    const char *name = valid_id ? Headers[id].name.buf() : "INVALID";
+    const char *name = valid_id ? Headers[id].name.c_str() : "INVALID";
     int visible = count > 0;
     /* for entries with zero count, list only those that belong to current type of message */
 
@@ -1612,7 +1605,7 @@
     for (ht = (http_hdr_type)0; ht < HDR_ENUM_END; ++ht) {
         HttpHeaderFieldInfo *f = Headers + ht;
         storeAppendPrintf(e, "%2d\t %-20s\t %5d\t %6.3f\t %6.3f\n",
-                          f->id, f->name.buf(), f->stat.aliveCount,
+                          f->id, f->name.c_str(), f->stat.aliveCount,
                           xpercent(f->stat.errCount, f->stat.parsCount),
                           xpercent(f->stat.repCount, f->stat.seenCount));
     }
@@ -1625,15 +1618,15 @@
 }
 
 http_hdr_type
-httpHeaderIdByName(const char *name, int name_len, const HttpHeaderFieldInfo * info, int end)
+httpHeaderIdByName(const char *name, unsigned int name_len, const HttpHeaderFieldInfo * info, int end)
 {
     int i;
 
     for (i = 0; i < end; ++i) {
-        if (name_len >= 0 && name_len != info[i].name.size())
+        if (name_len >= 0 && name_len != (unsigned int)info[i].name.size())
             continue;
 
-        if (!strncasecmp(name, info[i].name.buf(),
+        if (!strncasecmp(name, info[i].name,
                          name_len < 0 ? info[i].name.size() + 1 : name_len))
             return info[i].id;
     }
@@ -1658,7 +1651,7 @@
 
     assert(id >= 0 && id < HDR_ENUM_END);
 
-    return Headers[id].name.buf();
+    return Headers[id].name.c_str();
 }
 
 int
@@ -1672,7 +1665,7 @@
 
     assert(id >= 0);
 
-    String header (getStrOrList(id));
+    string header (getStrOrList(id));
 
     while (strListGetItem(&header, separator, &item, &ilen, &pos)) {
         if (strncmp(item, member, mlen) == 0
@@ -1696,7 +1689,7 @@
 
     assert(name);
 
-    String header (getByName(name));
+    string header (getByName(name));
 
     while (strListGetItem(&header, separator, &item, &ilen, &pos)) {
         if (strncmp(item, member, mlen) == 0
@@ -1714,9 +1707,9 @@
 {
     if (has(HDR_CONNECTION)) {
         /* anything that matches Connection list member will be deleted */
-        String strConnection;
-	
-	(void) getList(HDR_CONNECTION, &strConnection);
+        string strConnection;
+
+        (void) getList(HDR_CONNECTION, &strConnection);
         const HttpHeaderEntry *e;
         HttpHeaderPos pos = HttpHeaderInitPos;
         /*
@@ -1730,7 +1723,7 @@
 
         int headers_deleted = 0;
         while ((e = getEntry(&pos))) {
-            if (strListIsMember(&strConnection, e->name.buf(), ','))
+            if (strListIsMember(&strConnection, e->name.c_str(), ','))
                 delAt(pos, headers_deleted);
         }
         if (headers_deleted)
Index: squid3/src/HttpHeader.h
diff -u squid3/src/HttpHeader.h:1.19 squid3/src/HttpHeader.h:1.18.4.4
--- squid3/src/HttpHeader.h:1.19	Mon May  7 11:51:32 2007
+++ squid3/src/HttpHeader.h	Tue May  8 05:40:10 2007
@@ -183,8 +183,8 @@
     int getInt() const;
     MEMPROXY_CLASS(HttpHeaderEntry);
     http_hdr_type id;
-    String name;
-    String value;
+    string name;
+    string value;
 };
 
 MEMPROXY_CLASS_INLINE(HttpHeaderEntry)
@@ -211,12 +211,12 @@
     void refreshMask();
     void addEntry(HttpHeaderEntry * e);
     void insertEntry(HttpHeaderEntry * e);
-    String getList(http_hdr_type id) const;
-    bool getList(http_hdr_type id, String *s) const;
-    String getStrOrList(http_hdr_type id) const;
-    String getByName(const char *name) const;
-    String getByNameListMember(const char *name, const char *member, const char separator) const;
-    String getListMember(http_hdr_type id, const char *member, const char separator) const;
+    string getList(http_hdr_type id) const;
+    bool getList(http_hdr_type id, string *s) const;
+    string getStrOrList(http_hdr_type id) const;
+    string getByName(const char *name) const;
+    string getByNameListMember(const char *name, const char *member, const char separator) const;
+    string getListMember(http_hdr_type id, const char *member, const char separator) const;
     int has(http_hdr_type id) const;
     void putInt(http_hdr_type id, int number);
     void putTime(http_hdr_type id, time_t htime);
@@ -258,7 +258,7 @@
 
 
 extern void httpHeaderRegisterWithCacheManager(CacheManager & manager);
-extern int httpHeaderParseQuotedString (const char *start, String *val);
+extern int httpHeaderParseQuotedString (const char *start, string *val);
 SQUIDCEXTERN int httpHeaderHasByNameListMember(const HttpHeader * hdr, const char *name, const char *member, const char separator);
 SQUIDCEXTERN void httpHeaderUpdate(HttpHeader * old, const HttpHeader * fresh, const HttpHeaderMask * denied_mask);
 int httpMsgIsPersistent(HttpVersion const &http_ver, const HttpHeader * hdr);
Index: squid3/src/HttpHeaderRange.h
diff -u squid3/src/HttpHeaderRange.h:1.9 squid3/src/HttpHeaderRange.h:1.9.8.3
--- squid3/src/HttpHeaderRange.h:1.9	Tue Jun  6 12:50:39 2006
+++ squid3/src/HttpHeaderRange.h	Thu May  3 03:05:11 2007
@@ -78,7 +78,7 @@
 
     static size_t ParsedCount;
     /* Http Range Header Field */
-    static HttpHdrRange *ParseCreate(const String * range_spec);
+    static HttpHdrRange *ParseCreate(const string * range_spec);
 
     HttpHdrRange();
     HttpHdrRange(HttpHdrRange const &);
@@ -96,7 +96,7 @@
     int canonize(size_t);
     int canonize(HttpReply *rep);
     /* returns true if ranges are valid; inits HttpHdrRange */
-    bool parseInit(const String * range_spec);
+    bool parseInit(const string * range_spec);
     void packInto(Packer * p) const;
     /* other */
     bool isComplex() const;
@@ -127,7 +127,7 @@
     ssize_t debt() const;
     void debt(ssize_t);
     ssize_t debt_size;		/* bytes left to send from the current spec */
-    String boundary;		/* boundary for multipart responses */
+    string boundary;		/* boundary for multipart responses */
     bool valid;
 };
 
Index: squid3/src/HttpHeaderTools.cc
diff -u squid3/src/HttpHeaderTools.cc:1.24 squid3/src/HttpHeaderTools.cc:1.21.4.5
--- squid3/src/HttpHeaderTools.cc:1.24	Mon May  7 11:51:32 2007
+++ squid3/src/HttpHeaderTools.cc	Tue May  8 05:40:10 2007
@@ -75,7 +75,7 @@
     int i;
 
     for (i = 0; i < count; ++i)
-        table[i].name.clean();
+        table[i].name.clear();
 
     delete [] table;
 }
@@ -161,7 +161,7 @@
 int
 httpHeaderHasConnDir(const HttpHeader * hdr, const char *directive)
 {
-    String list;
+    string list;
     http_hdr_type ht;
     int res;
     /* what type of header do we have? */
@@ -177,14 +177,12 @@
 
     res = strListIsMember(&list, directive, ',');
 
-    list.clean();
-
     return res;
 }
 
 /* returns true iff "m" is a member of the list */
 int
-strListIsMember(const String * list, const char *m, char del)
+strListIsMember(const string * list, const char *m, char del)
 {
     const char *pos = NULL;
     const char *item;
@@ -203,7 +201,7 @@
 
 /* returns true iff "s" is a substring of a member of the list */
 int
-strListIsSubstr(const String * list, const char *s, char del)
+strListIsSubstr(const string * list, const char *s, char del)
 {
     assert(list && del);
     return list->pos(s) != 0;
@@ -219,7 +217,7 @@
 
 /* appends an item to the list */
 void
-strListAdd(String * str, const char *item, char del)
+strListAdd(string * str, const char *item, char del)
 {
     assert(str && item);
 
@@ -243,7 +241,7 @@
  * init pos with NULL to start iteration.
  */
 int
-strListGetItem(const String * str, char del, const char **item, int *ilen, const char **pos)
+strListGetItem(const string * str, char del, const char **item, int *ilen, const char **pos)
 {
     size_t len;
     static char delim[2][3] = {
@@ -260,7 +258,7 @@
         else
             (*pos)++;
     } else {
-        *pos = str->buf();
+        *pos = str->c_str();
 
         if (!*pos)
             return 0;
@@ -349,10 +347,10 @@
  * RC TODO: This is too looose. We should honour the BNF and exclude CTL's
  */
 int
-httpHeaderParseQuotedString (const char *start, String *val)
+httpHeaderParseQuotedString (const char *start, string *val)
 {
     const char *end, *pos;
-    val->clean();
+    val->clear();
     assert (*start == '"');
     pos = start + 1;
 
Index: squid3/src/HttpReply.cc
diff -u squid3/src/HttpReply.cc:1.39 squid3/src/HttpReply.cc:1.38.4.5
--- squid3/src/HttpReply.cc:1.39	Fri Apr 20 00:58:35 2007
+++ squid3/src/HttpReply.cc	Mon May  7 03:32:22 2007
@@ -105,7 +105,7 @@
     // virtual function instead, but it is not clear whether virtual methods
     // are allowed with MEMPROXY_CLASS() and whether some cbdata void*
     // conversions are not going to kill virtual tables
-    const String pfx = protoPrefix;
+    const string pfx = protoPrefix;
     clean();
     init();
     protoPrefix = pfx;
@@ -220,7 +220,7 @@
         hdr->putStr(HDR_CONTENT_TYPE, ctype);
         content_type = ctype;
     } else
-        content_type = String();
+        content_type.clear();
 
     if (clen >= 0)
         hdr->putInt(HDR_CONTENT_LENGTH, clen);
@@ -262,7 +262,7 @@
 int
 HttpReply::validatorsMatch(HttpReply const * otherRep) const
 {
-    String one,two;
+    string one,two;
     assert (otherRep);
     /* Numbers first - easiest to check */
     /* Content-Length */
@@ -278,9 +278,7 @@
 
     two = otherRep->header.getStrOrList(HDR_ETAG);
 
-    if (!one.buf() || !two.buf() || strcasecmp (one.buf(), two.buf())) {
-        one.clean();
-        two.clean();
+    if (one.empty() || two.empty() || strcasecmp (one, two)) {
         return 0;
     }
 
@@ -292,9 +290,9 @@
 
     two = otherRep->header.getStrOrList(HDR_CONTENT_MD5);
 
-    if (!one.buf() || !two.buf() || strcasecmp (one.buf(), two.buf())) {
-        one.clean();
-        two.clean();
+    if (one.empty() || two.empty() || strcasecmp (one, two)) {
+        one.clear();
+        two.clear();
         return 0;
     }
 
@@ -383,7 +381,7 @@
     if (str)
         content_type.limitInit(str, strcspn(str, ";\t "));
     else
-        content_type = String();
+        content_type = "";
 
     /* be sure to set expires after date and cache-control */
     expires = hdrExpirationTime();
@@ -393,7 +391,7 @@
 void
 HttpReply::hdrCacheClean()
 {
-    content_type.clean();
+    content_type.clear();
 
     if (cache_control) {
         httpHdrCcDestroy(cache_control);
@@ -435,8 +433,8 @@
 
 bool HttpReply::sanityCheckStartLine(MemBuf *buf, http_status *error)
 {
-    if (buf->contentSize() >= protoPrefix.size() && protoPrefix.cmp(buf->content(), protoPrefix.size()) != 0) {
-        debugs(58, 3, "HttpReply::sanityCheckStartLine: missing protocol prefix (" << protoPrefix.buf() << ") in '" << buf->content() << "'");
+    if (buf->contentSize() >= protoPrefix.size() && strncmp(protoPrefix, buf->content(), protoPrefix.size()) != 0) {
+        debugs(58, 3, "HttpReply::sanityCheckStartLine: missing protocol prefix (" << protoPrefix << ") in '" << buf->content() << "'");
         *error = HTTP_INVALID_HEADER;
         return false;
     }
Index: squid3/src/HttpReply.h
diff -u squid3/src/HttpReply.h:1.18 squid3/src/HttpReply.h:1.18.8.1
--- squid3/src/HttpReply.h:1.18	Sun Apr 23 04:27:37 2006
+++ squid3/src/HttpReply.h	Tue May  1 09:09:26 2007
@@ -77,7 +77,7 @@
 
     time_t expires;
 
-    String content_type;
+    string content_type;
 
     HttpHdrSc *surrogate_control;
 
@@ -90,7 +90,7 @@
 
     HttpBody body;		/* for small constant memory-resident text bodies only */
 
-    String protoPrefix;       // e.g., "HTTP/"
+    string protoPrefix;       // e.g., "HTTP/"
 
     bool do_clean;
 
Index: squid3/src/HttpRequest.cc
diff -u squid3/src/HttpRequest.cc:1.39 squid3/src/HttpRequest.cc:1.37.4.3
--- squid3/src/HttpRequest.cc:1.39	Sat Apr 28 15:51:48 2007
+++ squid3/src/HttpRequest.cc	Tue May  1 17:09:50 2007
@@ -70,7 +70,7 @@
 {
     method = METHOD_NONE;
     protocol = PROTO_NONE;
-    urlpath = NULL;
+    urlpath.clear();
     login[0] = '\0';
     host[0] = '\0';
     auth_user_request = NULL;
@@ -115,7 +115,7 @@
 
     safe_free(vary_headers);
 
-    urlpath.clean();
+    urlpath.clear();
 
     header.clean();
 
@@ -129,13 +129,13 @@
         range = NULL;
     }
 
-    tag.clean();
+    tag.clear();
 
-    extacl_user.clean();
+    extacl_user.clear();
 
-    extacl_passwd.clean();
+    extacl_passwd.clear();
 
-    extacl_log.clean();
+    extacl_log.clear();
 }
 
 void
@@ -243,7 +243,7 @@
     assert(p);
     /* pack request-line */
     packerPrintf(p, "%s %s HTTP/1.0\r\n",
-                 RequestMethodStr[method], urlpath.buf());
+                 RequestMethodStr[method], urlpath.c_str());
     /* headers */
     header.packInto(p);
     /* trailer */
@@ -275,12 +275,12 @@
  * check anonymizer (aka header_access) configuration.
  */
 int
-httpRequestHdrAllowed(const HttpHeaderEntry * e, String * strConn)
+httpRequestHdrAllowed(const HttpHeaderEntry * e, string * strConn)
 {
     assert(e);
     /* check connection header */
 
-    if (strConn && strListIsMember(strConn, e->name.buf(), ','))
+    if (strConn && strListIsMember(strConn, e->name.c_str(), ','))
         return 0;
 
     return 1;
@@ -354,7 +354,7 @@
         return urlCanonical((HttpRequest*)this);
 
     if (urlpath.size())
-        return urlpath.buf();
+        return urlpath.c_str();
 
     return "/";
 }
Index: squid3/src/HttpRequest.h
diff -u squid3/src/HttpRequest.h:1.26 squid3/src/HttpRequest.h:1.25.4.3
--- squid3/src/HttpRequest.h:1.26	Mon Apr 16 11:04:49 2007
+++ squid3/src/HttpRequest.h	Thu May  3 03:05:11 2007
@@ -40,7 +40,7 @@
 #include "HttpRequestMethod.h"
 
 /*  Http Request */
-extern int httpRequestHdrAllowed(const HttpHeaderEntry * e, String * strConnection);
+extern int httpRequestHdrAllowed(const HttpHeaderEntry * e, string * strConnection);
 extern int httpRequestHdrAllowedByName(http_hdr_type id);
 extern void httpRequestPack(void *obj, Packer *p);
 
@@ -84,7 +84,7 @@
 
     u_short port;
 
-    String urlpath;
+    string urlpath;
 
     char *canonical;
 
@@ -120,13 +120,13 @@
 
     char *peer_domain;		/* Configured peer forceddomain */
 
-    String tag;			/* Internal tag for this request */
+    string tag;			/* Internal tag for this request */
 
-    String extacl_user;		/* User name returned by extacl lookup */
+    string extacl_user;		/* User name returned by extacl lookup */
 
-    String extacl_passwd;	/* Password returned by extacl lookup */
+    string extacl_passwd;	/* Password returned by extacl lookup */
 
-    String extacl_log;		/* String to be used for access.log purposes */
+    string extacl_log;		/* String to be used for access.log purposes */
 
 public:
     bool multipartRangeRequest() const;
Index: squid3/src/HttpStatusLine.cc
diff -u squid3/src/HttpStatusLine.cc:1.7 squid3/src/HttpStatusLine.cc:1.5.12.4
--- squid3/src/HttpStatusLine.cc:1.7	Fri May  4 15:51:11 2007
+++ squid3/src/HttpStatusLine.cc	Sat May  5 07:37:31 2007
@@ -82,7 +82,7 @@
  * so NULL-termination assumed.
  */
 int
-httpStatusLineParse(HttpStatusLine * sline, const String &protoPrefix, const char *start, const char *end)
+httpStatusLineParse(HttpStatusLine * sline, const string &protoPrefix, const char *start, const char *end)
 {
     assert(sline);
     sline->status = HTTP_INVALID_HEADER;	/* Squid header parsing error */
@@ -90,7 +90,7 @@
     // XXX: HttpMsg::parse() has a similar check but is using
     // casesensitive comparison (which is required by HTTP errata?)
 
-    if (protoPrefix.caseCmp(start, protoPrefix.size()) != 0)
+    if (strncasecmp(protoPrefix,start, protoPrefix.size()) != 0)
         return 0;
 
     start += protoPrefix.size();
Index: squid3/src/HttpStatusLine.h
diff -u squid3/src/HttpStatusLine.h:1.2 squid3/src/HttpStatusLine.h:1.2.12.1
--- squid3/src/HttpStatusLine.h:1.2	Mon Sep 12 19:12:43 2005
+++ squid3/src/HttpStatusLine.h	Tue May  1 09:09:26 2007
@@ -56,7 +56,7 @@
 SQUIDCEXTERN const char *httpStatusLineReason(const HttpStatusLine * sline);
 /* parse/pack */
 /* parse a 0-terminating buffer and fill internal structires; returns true on success */
-SQUIDCEXTERN int httpStatusLineParse(HttpStatusLine * sline, const String &protoPrefix,
+SQUIDCEXTERN int httpStatusLineParse(HttpStatusLine * sline, const string &protoPrefix,
                                      const char *start, const char *end);
 /* pack fields using Packer */
 SQUIDCEXTERN void httpStatusLinePackInto(const HttpStatusLine * sline, Packer * p);
Index: squid3/src/Makefile.am
diff -u squid3/src/Makefile.am:1.119 squid3/src/Makefile.am:1.116.2.6
--- squid3/src/Makefile.am:1.119	Tue May  8 09:51:26 2007
+++ squid3/src/Makefile.am	Tue May  8 23:59:35 2007
@@ -556,7 +556,7 @@
 	$(SSL_SOURCE) \
 	stat.cc \
 	StatHist.cc \
-	String.cc \
+	SqString.cc \
 	stmem.cc \
 	stmem.h \
 	store.cc \
@@ -626,7 +626,8 @@
 	MemBuf.h \
 	Store.cci \
 	StoreEntryStream.h \
-	String.cci \
+	SqString.cci \
+	SqString.h \
 	SquidString.h \
 	SquidTime.h
 
@@ -733,7 +734,7 @@
 	StoreMetaUnpacker.cc \
 	StoreMetaURL.cc \
 	StoreMetaVary.cc \
-	String.cc \
+	SqString.cc \
 	time.cc \
 	ufsdump.cc \
 	url.cc \
@@ -1095,6 +1096,7 @@
 	globals.cc
 
 check_PROGRAMS+= \
+	tests/testString \
 	tests/testAuth \
 	tests/testACLMaxUserIP \
 	tests/testBoilerplate \
@@ -1106,7 +1108,6 @@
 	tests/test_http_range \
 	tests/testHttpRequest \
 	tests/testStore \
-	tests/testString \
 	tests/testURL \
 	@STORE_TESTS@
 
@@ -1114,7 +1115,7 @@
 	authenticate.cc \
 	ConfigParser.cc \
 	tests/stub_acl.cc tests/stub_cache_cf.cc \
-	tests/stub_helper.cc cbdata.cc String.cc \
+	tests/stub_helper.cc cbdata.cc SqString.cc \
 	tests/stub_store.cc HttpHeaderTools.cc HttpHeader.cc acl.cc event.cc mem.cc \
 	MemBuf.cc HttpHdrContRange.cc Packer.cc ACLChecklist.cc HttpHdrCc.cc HttpHdrSc.cc \
 	HttpHdrScTarget.cc url.cc ACLProxyAuth.cc ACLRegexData.cc ACLUserData.cc \
@@ -1132,7 +1133,7 @@
 	URLScheme.cc \
 	wordlist.cc
 ##	acl.cc cache_cf.cc tools.cc \
-##	helper.cc String.cc cbdata.cc HttpHeaderTools.cc store.cc cache_manager.cc \
+##	helper.cc SqString.cc cbdata.cc HttpHeaderTools.cc store.cc cache_manager.cc \
 ##	HttpHeader.cc url.cc mem.cc HttpRequest.cc Packer.cc access_log.cc \
 ##	MemBuf.cc StatHist.cc logfile.cc
 
@@ -1168,7 +1169,7 @@
 ##	HttpHdrScTarget.cc \
 ##	Packer.cc \
 ##	StatHist.cc \
-##	String.cc \
+##	SqString.cc \
 tests_testACLMaxUserIP_SOURCES= \
 	acl.cc \
 	ACLChecklist.cc \
@@ -1193,7 +1194,7 @@
 	Parsing.cc \
 	StatHist.cc \
 	stmem.cc \
-	String.cc \
+	SqString.cc \
 	tests/stub_cache_cf.cc \
 	tests/stub_comm.cc \
 	tests/stub_DelayId.cc \
@@ -1241,7 +1242,7 @@
 	HttpRequest.cc \
 	HttpRequestMethod.cc \
 	mem.cc \
-	String.cc \
+	SqString.cc \
 	tests/testCacheManager.cc \
 	tests/testCacheManager.h \
 	tests/testMain.cc \
@@ -1405,7 +1406,7 @@
 	HttpRequestMethod.cc \
 	mem.cc \
 	RemovalPolicy.cc \
-	String.cc \
+	SqString.cc \
 	tests/CapturingStoreEntry.h \
 	tests/testEvent.cc \
 	tests/testEvent.h \
@@ -1557,7 +1558,7 @@
 	HttpRequestMethod.cc \
 	mem.cc \
 	RemovalPolicy.cc \
-	String.cc \
+	SqString.cc \
 	tests/testEventLoop.cc \
 	tests/testEventLoop.h \
 	tests/testMain.cc \
@@ -1845,7 +1846,7 @@
 	StoreMetaURL.cc \
 	StoreMetaVary.cc \
 	StoreSwapLogData.cc \
-	String.cc \
+	SqString.cc \
 	SwapDir.cc \
 	time.cc \
 	tools.cc \
@@ -1887,7 +1888,7 @@
 	HttpRequest.cc \
 	HttpRequestMethod.cc \
 	mem.cc \
-	String.cc \
+	SqString.cc \
 	tests/testHttpRequest.h \
 	tests/testHttpRequest.cc \
 	tests/testHttpRequestMethod.h \
@@ -2054,7 +2055,7 @@
 	SwapDir.cc \
 	authenticate.cc \
 	tests/stub_acl.cc tests/stub_cache_cf.cc \
-	tests/stub_helper.cc cbdata.cc String.cc \
+	tests/stub_helper.cc cbdata.cc SqString.cc \
 	tests/stub_comm.cc \
 	tests/stub_client_side_request.cc \
 	tests/stub_http.cc \
@@ -2107,11 +2108,10 @@
 tests_testStore_LDFLAGS = $(LIBADD_DL)
 tests_testStore_DEPENDENCIES = $(top_builddir)/lib/libmiscutil.a \
 	@SQUID_CPPUNIT_LA@
-
 # string needs mem.cc.
 tests_testString_SOURCES= \
 	mem.cc \
-	String.cc \
+	SqString.cc \
 	tests/testMain.cc \
 	tests/testString.cc \
 	tests/testString.h \
@@ -2223,7 +2223,7 @@
 	HttpRequestMethod.cc \
 	mem.cc \
 	RemovalPolicy.cc \
-	String.cc \
+	SqString.cc \
 	tests/testURL.cc \
 	tests/testURL.h \
 	tests/testURLScheme.cc \
Index: squid3/src/MemObject.cc
diff -u squid3/src/MemObject.cc:1.24 squid3/src/MemObject.cc:1.22.4.2
--- squid3/src/MemObject.cc:1.24	Mon Apr 30 10:51:35 2007
+++ squid3/src/MemObject.cc	Tue May  1 17:09:50 2007
@@ -168,7 +168,7 @@
     debugs(20, 1, "MemObject->nclients: " << nclients);
     debugs(20, 1, "MemObject->reply: " << _reply);
     debugs(20, 1, "MemObject->request: " << request);
-    debugs(20, 1, "MemObject->log_url: " << log_url << " " << checkNullString(log_url));
+    debugs(20, 1, "MemObject->log_url: " << (log_url ? log_url : "(NULL)") );
 }
 
 HttpReply const *
Index: squid3/src/PeerDigest.h
diff -u squid3/src/PeerDigest.h:1.1 squid3/src/PeerDigest.h:1.1.16.1
--- squid3/src/PeerDigest.h:1.1	Sun Aug 20 18:51:49 2006
+++ squid3/src/PeerDigest.h	Thu May  3 08:03:34 2007
@@ -97,7 +97,7 @@
 
     struct _peer *peer;			/* pointer back to peer structure, argh */
     CacheDigest *cd;		/* actual digest structure */
-    String host;		/* copy of peer->host */
+    string host;		/* copy of peer->host */
     const char *req_result;	/* text status of the last request */
 
     struct
Index: squid3/src/SqString.cc
diff -u /dev/null squid3/src/SqString.cc:1.1.2.4
--- /dev/null		Thu Jan  1 01:00:00 1970
+++ squid3/src/SqString.cc	Mon May  7 05:01:04 2007
@@ -0,0 +1,391 @@
+
+/*
+ * $Id$
+ *
+ * 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
Index: squid3/src/SqString.cci
diff -u /dev/null squid3/src/SqString.cci:1.1.2.1
--- /dev/null		Thu Jan  1 01:00:00 1970
+++ squid3/src/SqString.cci	Sat May  5 09:09:00 2007
@@ -0,0 +1,166 @@
+
+/*
+ * $Id$
+ *
+ * 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';
+}
Index: squid3/src/SqString.h
diff -u /dev/null squid3/src/SqString.h:1.1.2.4
--- /dev/null		Thu Jan  1 01:00:00 1970
+++ squid3/src/SqString.h	Mon May  7 05:01:04 2007
@@ -0,0 +1,155 @@
+
+/*
+ * $Id$
+ *
+ * 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 */
+
Index: squid3/src/SquidString.h
diff -u squid3/src/SquidString.h:1.8 squid3/src/SquidString.h:1.8.8.5
--- squid3/src/SquidString.h:1.8	Sun May 28 17:50:18 2006
+++ squid3/src/SquidString.h	Mon May  7 03:32:22 2007
@@ -3,7 +3,7 @@
  * $Id$
  *
  * DEBUG: section 67    String
- * AUTHOR: Duane Wessels
+ * AUTHOR: Duane Wessels, Amos Jeffries
  *
  * SQUID Web Proxy Cache          http://www.squid-cache.org/
  * ----------------------------------------------------------
@@ -33,112 +33,68 @@
  *
  */
 
+/**
+ *
+ *  To allow for easy future updates to the string handling within squid
+ *  We adopt the std::string API as the basis for string operations.
+ *  Then we typedef string (due to namespacing actually ::Squid::string)
+ *  as the preferred string handling class.
+ *  For Release 3.0 it is intended that the old String (no SquidString)
+ *  Will be the default string type.
+ *  For Release 3.1 it is expected that either std::string of another
+ *  custom managed type will be defined as default.
+ *
+ *  NP: checkout http://johnpanzer.com/tsc_cuj/ToolboxOfStrings.html
+ *      for possibly better and faster strings.
+ *
+ *  This has been done for several reasons:
+ * 
+ *  The initial String implementation was incomplete and non-standard
+ *  std::string provides a better known API for string handling
+ *  std::string or a derivative may be used in future within squid
+ *  String is a defined alternative to std::string in some systems
+ *  
+ *  These changes:
+ *    - move the old String class to SquidString making the
+ *      internal definition explicit.
+ *    - provide the well-known type of 'string' for general use
+ *    - migrate custom functions to well-known API:
+ *        buf()           -> c_str()
+ *        clean()         -> clear()
+ *    - remove redundant functions:
+ *        buf(char*)      -> operator=(char*)
+ *        initBuf(char*)  -> operator=(char*)
+ *        reset(char*)    -> operator=(char*)
+ *    - make init(char*) private for use by various assignment/costructor
+ *    - define standard string operators
+ *    - define debugs stream operator
+ *
+ */
+
 #ifndef SQUID_STRING_H
 #define SQUID_STRING_H
 
-/* forward decls */
-
-class CacheManager;
-
-#define DEBUGSTRINGS 0
-#if DEBUGSTRINGS
-#include "splay.h"
-
-class String;
-
-class StringRegistry
-{
-
-public:
-    static StringRegistry &Instance();
-
-    void add
-        (String const *);
-
-    void registerWithCacheManager(CacheManager & manager);
-
-    void remove
-        (String const *);
+    /* Provide standard 'string' type                                                */
+    /* class defined by the #include file MUST present the basic std::string API     */
+    /* at least partially as not all operatios are used by squid.                    */
+    /* API Ref:  http://www.sgi.com/tech/stl/basic_string.html                       */
 
-private:
-    static OBJH Stat;
+#include "SqString.h"
+typedef SqString string;
 
-    static StringRegistry Instance_;
 
-    static SplayNode<String const *>::SPLAYWALKEE Stater;
+    /* Overload standard C functions using the basic string API */
 
-    Splay<String const *> entries;
+inline int strncasecmp(const string &lhs, const string &rhs, size_t len) { return strncasecmp(lhs.c_str(), rhs.c_str(), len); }
+inline int strcasecmp(const string &lhs, const string &rhs) { return strcasecmp(lhs.c_str(), rhs.c_str()); }
 
-    bool registered;
+inline int strncmp(const string &lhs, const string &rhs, size_t len) { return strncmp(lhs.c_str(), rhs.c_str(), len); }
+inline int strcmp(const string &lhs, const string &rhs) { return strcmp(lhs.c_str(), rhs.c_str()); }
 
-};
+inline const char * strpbrk(const string &lhs, const string &rhs) { return strpbrk(lhs.c_str(), rhs.c_str()); }
 
-class StoreEntry;
-#endif
+inline const char * strstr(const string &lhs, const string &rhs) { return strstr(lhs.c_str(), rhs.c_str()); }
 
-class String
-{
-
-public:
-    _SQUID_INLINE_ String();
-    String (char const *);
-    String (String const &);
-    ~String();
-
-    String &operator =(char const *);
-    String &operator =(String const &);
-    bool operator ==(String const &) const;
-    bool operator !=(String const &) const;
-
-    _SQUID_INLINE_ int size() const;
-    _SQUID_INLINE_ char const * buf() const;
-    void buf(char *);
-    void init (char const *);
-    void initBuf(size_t sz);
-    void limitInit(const char *str, int len);
-    void clean();
-    void reset(char const *str);
-    void append(char const *buf, int len);
-    void append(char const *buf);
-    void append(char const);
-    void append (String const &);
-    void absorb(String &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_ int cmp (char const *) const;
-    _SQUID_INLINE_ int cmp (char const *, size_t count) const;
-    _SQUID_INLINE_ int cmp (String const &) const;
-    _SQUID_INLINE_ int caseCmp (char const *) const;
-    _SQUID_INLINE_ int caseCmp (char const *, size_t count) 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
-
-private:
-    /* never reference these directly! */
-    unsigned short int size_;	/* buffer size; 64K limit */
-
-    unsigned short int len_;	/* current length  */
-
-    char *buf_;
-};
-
-_SQUID_INLINE_ std::ostream & operator<<(std::ostream& os, String const &aString);
-
-#ifdef _USE_INLINE_
-#include "String.cci"
-#endif
+inline std::ostream& operator <<(std::ostream &os, const string &s) { os << s.c_str(); return os; }
 
 #endif /* SQUID_STRING_H */
-
Index: squid3/src/Store.h
diff -u squid3/src/Store.h:1.32 squid3/src/Store.h:1.25.4.2
--- squid3/src/Store.h:1.32	Sat Apr 21 00:52:54 2007
+++ squid3/src/Store.h	Tue May  1 09:09:27 2007
@@ -258,7 +258,7 @@
 
     /* TODO: imeplement the async version */
     virtual void get
-        (String const key , STOREGETCLIENT callback, void *cbdata) = 0;
+        (string const key , STOREGETCLIENT callback, void *cbdata) = 0;
 
     /* prepare the store for use. The store need not be usable immediately,
      * it should respond to readable() and writable() with true as soon
@@ -282,7 +282,7 @@
     virtual void unlink (StoreEntry &);
 
     /* search in the store */
-    virtual StoreSearch *search(String const url, HttpRequest *) = 0;
+    virtual StoreSearch *search(string const url, HttpRequest *) = 0;
 
     /* pulled up from SwapDir for migration.... probably do not belong here */
     virtual void reference(StoreEntry &) = 0;	/* Reference this object */
Index: squid3/src/StoreHashIndex.h
diff -u squid3/src/StoreHashIndex.h:1.2 squid3/src/StoreHashIndex.h:1.2.14.1
--- squid3/src/StoreHashIndex.h:1.2	Sun Jul  3 19:14:11 2005
+++ squid3/src/StoreHashIndex.h	Tue May  1 17:09:51 2007
@@ -57,7 +57,7 @@
         (const cache_key *);
 
     virtual void get
-        (String const, STOREGETCLIENT, void * cbdata);
+        (string const, STOREGETCLIENT, void * cbdata);
 
     virtual void init();
 
@@ -77,7 +77,7 @@
 
     virtual void updateSize(size_t, int);
 
-    virtual StoreSearch *search(String const url, HttpRequest *);
+    virtual StoreSearch *search(string const url, HttpRequest *);
 
 private:
     /* migration logic */
Index: squid3/src/String.cc
diff -u squid3/src/String.cc:1.12 squid3/src/String.cc:removed
--- squid3/src/String.cc:1.12	Fri Apr  6 05:54:13 2007
+++ squid3/src/String.cc	Wed May  9 00:11:20 2007
@@ -1,413 +0,0 @@
-
-/*
- * $Id$
- *
- * 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 "Store.h"
-
-void
-String::initBuf(size_t sz)
-{
-    PROF_start(StringInitBuf);
-    buf((char *)memAllocString(sz, &sz));
-    assert(sz < 65536);
-    size_ = sz;
-    PROF_stop(StringInitBuf);
-}
-
-void
-String::init(char const *str)
-{
-    assert(this);
-
-    PROF_start(StringInit);
-    if (str)
-        limitInit(str, strlen(str));
-    else
-        clean();
-    PROF_stop(StringInit);
-}
-
-String::String (char const *aString) : size_(0), len_(0), buf_(NULL)
-{
-    init (aString);
-#if DEBUGSTRINGS
-
-    StringRegistry::Instance().add(this);
-#endif
-}
-
-String &
-String::operator =(char const *aString)
-{
-    clean();
-    init (aString);
-    return *this;
-}
-
-String &
-String::operator = (String const &old)
-{
-    clean ();
-
-    if (old.len_)
-        limitInit (old.buf(), old.len_);
-
-    return *this;
-}
-
-bool
-String::operator == (String const &that) const
-{
-    if (0 == this->cmp(that))
-        return true;
-
-    return false;
-}
-
-bool
-String::operator != (String const &that) const
-{
-    if (0 == this->cmp(that))
-        return false;
-
-    return true;
-}
-
-void
-String::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);
-}
-
-String::String (String const &old) : size_(0), len_(0), buf_(NULL)
-{
-    init (old.buf());
-#if DEBUGSTRINGS
-
-    StringRegistry::Instance().add(this);
-#endif
-}
-
-void
-String::clean()
-{
-    PROF_start(StringClean);
-    assert(this);
-
-    if (buf())
-        memFreeString(size_, buf_);
-
-    len_ = 0;
-
-    size_ = 0;
-
-    buf_ = NULL;
-    PROF_stop(StringClean);
-}
-
-String::~String()
-{
-    clean();
-#if DEBUGSTRINGS
-
-    StringRegistry::Instance().remove(this);
-#endif
-}
-
-void
-String::reset(const char *str)
-{
-    PROF_start(StringReset);
-    clean();
-    init(str);
-    PROF_stop(StringReset);
-}
-
-void
-String::append(const char *str, int len)
-{
-    assert(this);
-    assert(str && len >= 0);
-
-    PROF_start(StringAppend);
-    if (len_ + len < size_) {
-        strncat(buf_, str, len);
-        len_ += len;
-    } else {
-        String snew;
-        snew.len_ = len_ + len;
-        snew.initBuf(snew.len_ + 1);
-
-        if (buf_)
-            xmemcpy(snew.buf_, buf(), len_);
-
-        if (len)
-            xmemcpy(snew.buf_ + len_, str, len);
-
-        snew.buf_[snew.len_] = '\0';
-
-        absorb(snew);
-    }
-    PROF_stop(StringAppend);
-}
-
-void
-String::append(char const *str)
-{
-    assert (str);
-    append (str, strlen(str));
-}
-
-void
-String::append (char chr)
-{
-    char myString[2];
-    myString[0]=chr;
-    myString[1]='\0';
-    append (myString, 1);
-}
-
-void
-String::append(String const &old)
-{
-    append (old.buf(), old.len_);
-}
-
-void
-String::absorb(String &old)
-{
-    clean();
-    size_ = old.size_;
-    buf (old.buf_);
-    len_ = old.len_;
-    old.size_ = 0;
-    old.buf_ = NULL;
-    old.len_ = 0;
-}
-
-void
-String::buf(char *newBuf)
-{
-    assert (buf_ == NULL);
-    buf_ = newBuf;
-}
-
-#if DEBUGSTRINGS
-void
-String::stat(StoreEntry *entry) const
-{
-    storeAppendPrintf(entry, "%p : %d/%d \"%s\"\n",this,len_, size_, buf());
-}
-
-StringRegistry &
-StringRegistry::Instance()
-{
-    return Instance_;
-}
-
-template <class C>
-int
-ptrcmp(C const &lhs, C const &rhs)
-{
-    return lhs - rhs;
-}
-
-void
-StringRegistry::registerWithCacheManager(CacheManager & manager)
-{
-    manager.registerAction("strings",
-                           "Strings in use in squid", Stat, 0, 1);
-}
-
-void
-
-StringRegistry::add
-    (String const *entry)
-{
-    entries.insert(entry, ptrcmp);
-}
-
-void
-
-StringRegistry::remove
-    (String const *entry)
-{
-    entries.remove(entry, ptrcmp);
-}
-
-StringRegistry StringRegistry::Instance_;
-
-extern size_t memStringCount();
-
-void
-StringRegistry::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
-StringRegistry::Stater(String const * const & nodedata, void *state)
-{
-    StoreEntry *entry = (StoreEntry *) state;
-    nodedata->stat(entry);
-}
-
-#endif
-
-/* TODO: move onto String */
-int
-stringHasWhitespace(const char *s)
-{
-    return strpbrk(s, w_space) != NULL;
-}
-
-/* TODO: move onto String */
-int
-stringHasCntl(const char *s)
-{
-    unsigned char c;
-
-    while ((c = (unsigned char) *s++) != '\0') {
-        if (c <= 0x1f)
-            return 1;
-
-        if (c >= 0x7f && c <= 0x9f)
-            return 1;
-    }
-
-    return 0;
-}
-
-/*
- * 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;
-}
-
-const char *
-checkNullString(const char *p)
-{
-    return p ? p : "(NULL)";
-}
-
-#ifndef _USE_INLINE_
-#include "String.cci"
-#endif
Index: squid3/src/String.cci
diff -u squid3/src/String.cci:1.6 squid3/src/String.cci:removed
--- squid3/src/String.cci:1.6	Fri Sep  1 16:50:33 2006
+++ squid3/src/String.cci	Wed May  9 00:11:20 2007
@@ -1,169 +0,0 @@
-
-/*
- * $Id$
- *
- * 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.
- *
- */
-
-String::String() : size_(0), len_(0), buf_ (NULL)
-{
-#if DEBUGSTRINGS
-    StringRegistry::Instance().add(this);
-#endif
-}
-
-int
-String::size() const
-{
-    return len_;
-}
-
-char const *
-String::buf() const
-{
-    return buf_;
-}
-
-const char *
-String::pos(char const *aString) const
-{
-    return strstr(buf(), aString);
-}
-
-const char *
-String::pos(char const ch) const
-{
-    return strchr(buf(), ch);
-}
-
-const char *
-String::rpos(char const ch) const
-{
-    return strrchr(buf(), (ch));
-}
-
-int
-String::cmp (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(buf(), aString);
-}
-
-int
-String::cmp (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(buf(), aString, count);
-}
-
-int
-String::cmp (String 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(buf(), aString.buf());
-}
-
-int
-String::caseCmp (char const *aString) const
-{
-    return strcasecmp(buf(), aString);
-}
-
-int
-String::caseCmp (char const *aString, size_t count) const
-{
-    return strncasecmp(buf(), aString, count);
-}
-
-/* FIXME: this is can perform buffer overflows and underflows! */
-void
-String::set (char const *loc, char const ch)
-{
-    buf_[loc-buf_] = ch;
-}
-
-/* FIXME: this is can perform buffer overflows and underflows! */
-void
-String::cut (size_t newLength)
-{
-    len_ = newLength;
-    buf_[newLength] = '\0';
-}
-
-/* FIXME: this is can perform buffer overflows and underflows! */
-void
-String::cutPointer (char const *loc)
-{
-    len_ = loc-buf_;
-    buf_[len_] = '\0';
-}
-
-std::ostream &
-operator<<(std::ostream& os, String const &aString)
-{
-    os << aString.buf();
-    return os;
-}
-
-
Index: squid3/src/SwapDir.cc
diff -u squid3/src/SwapDir.cc:1.11 squid3/src/SwapDir.cc:1.7.18.4
--- squid3/src/SwapDir.cc:1.11	Mon Apr 30 10:51:35 2007
+++ squid3/src/SwapDir.cc	Tue May  1 17:09:51 2007
@@ -276,7 +276,7 @@
 void
 
 SwapDir::get
-    (String const key, STOREGETCLIENT callback, void *cbdata)
+    (string const key, STOREGETCLIENT callback, void *cbdata)
 {
     fatal("not implemented");
 }
Index: squid3/src/SwapDir.h
diff -u squid3/src/SwapDir.h:1.12 squid3/src/SwapDir.h:1.12.8.1
--- squid3/src/SwapDir.h:1.12	Sun Aug 20 18:51:49 2006
+++ squid3/src/SwapDir.h	Tue May  1 09:09:27 2007
@@ -60,7 +60,7 @@
         (const cache_key *);
 
     virtual void get
-        (String const, STOREGETCLIENT, void * cbdata);
+        (string const, STOREGETCLIENT, void * cbdata);
 
     virtual void init();
 
@@ -74,7 +74,7 @@
 
     virtual void sync();	/* Sync the store prior to shutdown */
 
-    virtual StoreSearch *search(String const url, HttpRequest *);
+    virtual StoreSearch *search(string const url, HttpRequest *);
 
     virtual void reference(StoreEntry &);	/* Reference this object */
 
@@ -134,13 +134,13 @@
         (const cache_key *);
 
     virtual void get
-        (String const, STOREGETCLIENT, void * cbdata);
+        (string const, STOREGETCLIENT, void * cbdata);
 
 virtual size_t maxSize() const { return max_size;}
 
     virtual size_t minSize() const;
     virtual void stat (StoreEntry &anEntry) const;
-    virtual StoreSearch *search(String const url, HttpRequest *) = 0;
+    virtual StoreSearch *search(string const url, HttpRequest *) = 0;
 
     virtual void updateSize(size_t size, int sign);
 
Index: squid3/src/access_log.cc
diff -u squid3/src/access_log.cc:1.44 squid3/src/access_log.cc:1.41.4.6
--- squid3/src/access_log.cc:1.44	Sat Apr 28 15:51:48 2007
+++ squid3/src/access_log.cc	Thu May  3 08:03:35 2007
@@ -516,7 +516,7 @@
     logformat_token *fmt;
     static MemBuf mb;
     char tmp[1024];
-    String sb;
+    string sb;
 
     mb.reset();
 
@@ -626,7 +626,7 @@
             if (al->request)
                 sb = al->request->header.getByName(fmt->data.header.header);
 
-            out = sb.buf();
+            out = sb.c_str();
 
             quote = 1;
 
@@ -636,7 +636,7 @@
             if (al->reply)
                 sb = al->request->header.getByName(fmt->data.header.header);
 
-            out = sb.buf();
+            out = sb.c_str();
 
             quote = 1;
 
@@ -646,7 +646,7 @@
             if (al->request)
                 sb = al->request->header.getByNameListMember(fmt->data.header.header, fmt->data.header.element, fmt->data.header.separator);
 
-            out = sb.buf();
+            out = sb.c_str();
 
             quote = 1;
 
@@ -656,7 +656,7 @@
             if (al->reply)
                 sb = al->request->header.getByNameListMember(fmt->data.header.header, fmt->data.header.element, fmt->data.header.separator);
 
-            out = sb.buf();
+            out = sb.c_str();
 
             quote = 1;
 
@@ -804,7 +804,7 @@
 
         case LFT_TAG:
             if (al->request)
-                out = al->request->tag.buf();
+                out = al->request->tag.c_str();
 
             quote = 1;
 
@@ -812,7 +812,7 @@
 
         case LFT_EXT_LOG:
             if (al->request)
-                out = al->request->extacl_log.buf();
+                out = al->request->extacl_log.c_str();
 
             quote = 1;
 
@@ -882,7 +882,7 @@
         if (fmt->space)
             mb.append(" ", 1);
 
-        sb.clean();
+        sb.clear();
 
         if (dofree)
             safe_free(out);
@@ -1622,8 +1622,8 @@
 static void
 fvdbInit(void)
 {
-    via_table = hash_create((HASHCMP *) strcmp, 977, hash4);
-    forw_table = hash_create((HASHCMP *) strcmp, 977, hash4);
+    via_table = hash_create((HASHCMP *) std::strcmp, 977, hash4);
+    forw_table = hash_create((HASHCMP *) std::strcmp, 977, hash4);
 }
 
 static void
@@ -1708,10 +1708,10 @@
 {
     hashFreeItems(via_table, fvdbFreeEntry);
     hashFreeMemory(via_table);
-    via_table = hash_create((HASHCMP *) strcmp, 977, hash4);
+    via_table = hash_create((HASHCMP *) std::strcmp, 977, hash4);
     hashFreeItems(forw_table, fvdbFreeEntry);
     hashFreeMemory(forw_table);
-    forw_table = hash_create((HASHCMP *) strcmp, 977, hash4);
+    forw_table = hash_create((HASHCMP *) std::strcmp, 977, hash4);
 }
 
 #endif
Index: squid3/src/cache_cf.cc
diff -u squid3/src/cache_cf.cc:1.81 squid3/src/cache_cf.cc:1.79.2.6
--- squid3/src/cache_cf.cc:1.81	Sat Apr 28 15:51:48 2007
+++ squid3/src/cache_cf.cc	Sat May  5 07:33:54 2007
@@ -2201,14 +2201,14 @@
 }
 
 void
-ConfigParser::ParseString(String *var)
+ConfigParser::ParseString(string &var)
 {
     char *token = strtok(NULL, w_space);
 
     if (token == NULL)
         self_destruct();
 
-    var->reset(token);
+    var = token;
 }
 
 static void
Index: squid3/src/client_db.cc
diff -u squid3/src/client_db.cc:1.11 squid3/src/client_db.cc:1.10.8.2
--- squid3/src/client_db.cc:1.11	Sat Apr 28 15:51:49 2007
+++ squid3/src/client_db.cc	Thu May  3 06:37:05 2007
@@ -80,7 +80,7 @@
     if (client_table)
         return;
 
-    client_table = hash_create((HASHCMP *) strcmp, CLIENT_DB_HASH_SIZE, hash_string);
+    client_table = hash_create((HASHCMP *) std::strcmp, CLIENT_DB_HASH_SIZE, hash_string);
 }
 
 void
Index: squid3/src/client_side.cc
diff -u squid3/src/client_side.cc:1.125 squid3/src/client_side.cc:1.119.2.4
--- squid3/src/client_side.cc:1.125	Mon Apr 30 10:51:35 2007
+++ squid3/src/client_side.cc	Thu May  3 03:05:11 2007
@@ -459,7 +459,7 @@
     aLogEntry->http.version = request->http_ver;
     aLogEntry->hier = request->hier;
 
-    aLogEntry->cache.extuser = request->extacl_user.buf();
+    aLogEntry->cache.extuser = request->extacl_user.c_str();
 
     if (request->auth_user_request) {
 
@@ -483,10 +483,10 @@
 
         if (al.reply) {
             al.http.code = al.reply->sline.status;
-            al.http.content_type = al.reply->content_type.buf();
+            al.http.content_type = al.reply->content_type.c_str();
         } else if (loggingEntry() && loggingEntry()->mem_obj) {
             al.http.code = loggingEntry()->mem_obj->getReply()->sline.status;
-            al.http.content_type = loggingEntry()->mem_obj->getReply()->content_type.buf();
+            al.http.content_type = loggingEntry()->mem_obj->getReply()->content_type.c_str();
         }
 
         debugs(33, 9, "clientLogRequest: http.code='" << al.http.code << "'");
@@ -543,7 +543,7 @@
     safe_free(uri);
     safe_free(log_uri);
     safe_free(redirect.location);
-    range_iter.boundary.clean();
+    range_iter.boundary.clear();
     HTTPMSGUNLOCK(request);
 
     if (client_stream.tail)
@@ -828,15 +828,15 @@
 
 /* put terminating boundary for multiparts */
 static void
-clientPackTermBound(String boundary, MemBuf * mb)
+clientPackTermBound(string boundary, MemBuf * mb)
 {
-    mb->Printf("\r\n--%s--\r\n", boundary.buf());
+    mb->Printf("\r\n--%s--\r\n", boundary.c_str());
     debugs(33, 6, "clientPackTermBound: buf offset: " << mb->size);
 }
 
 /* appends a "part" HTTP header (as in a multi-part/range reply) to the buffer */
 static void
-clientPackRangeHdr(const HttpReply * rep, const HttpHdrRangeSpec * spec, String boundary, MemBuf * mb)
+clientPackRangeHdr(const HttpReply * rep, const HttpHdrRangeSpec * spec, string boundary, MemBuf * mb)
 {
     HttpHeader hdr(hoReply);
     Packer p;
@@ -844,10 +844,9 @@
     assert(spec);
 
     /* put boundary */
-    debugs(33, 5, "clientPackRangeHdr: appending boundary: " <<
-           boundary.buf());
+    debugs(33, 5, "clientPackRangeHdr: appending boundary: " << boundary);
     /* rfc2046 requires to _prepend_ boundary with <crlf>! */
-    mb->Printf("\r\n--%s\r\n", boundary.buf());
+    mb->Printf("\r\n--%s\r\n", boundary.c_str());
 
     /* stuff the header with required entries and pack it */
 
@@ -1039,12 +1038,12 @@
 
 /* generates a "unique" boundary string for multipart responses
  * the caller is responsible for cleaning the string */
-String
+string
 ClientHttpRequest::rangeBoundaryStr() const
 {
     assert(this);
     const char *key;
-    String b (full_appname_string);
+    string b (full_appname_string);
     b.append (":",1);
     key = storeEntry()->getMD5Text();
     b.append(key, strlen(key));
@@ -1156,7 +1155,7 @@
             hdr->delById(HDR_CONTENT_TYPE);
             httpHeaderPutStrf(hdr, HDR_CONTENT_TYPE,
                               "multipart/byteranges; boundary=\"%s\"",
-                              http->range_iter.boundary.buf());
+                              http->range_iter.boundary.c_str());
             /* Content-Length is not required in multipart responses
              * but it is always nice to have one */
             actual_clen = http->mRangeCLen();
@@ -2189,11 +2188,11 @@
     request->flags.tproxy = conn->port->tproxy;
 #endif
 
-    if (internalCheck(request->urlpath.buf())) {
+    if (internalCheck(request->urlpath.c_str())) {
         if (internalHostnameIs(request->host) &&
                 request->port == getMyPort()) {
             http->flags.internal = 1;
-        } else if (Config.onoff.global_internal_static && internalStaticCheck(request->urlpath.buf())) {
+        } else if (Config.onoff.global_internal_static && internalStaticCheck(request->urlpath.c_str())) {
             xstrncpy(request->host, internalHostname(),
                      SQUIDHOSTNAMELEN);
             request->port = getMyPort();
Index: squid3/src/client_side_reply.cc
diff -u squid3/src/client_side_reply.cc:1.98 squid3/src/client_side_reply.cc:1.90.4.5
--- squid3/src/client_side_reply.cc:1.98	Tue May  8 10:51:50 2007
+++ squid3/src/client_side_reply.cc	Tue May  8 23:59:35 2007
@@ -1266,7 +1266,7 @@
         int headers_deleted = 0;
         while ((e = hdr->getEntry(&pos))) {
             if (e->id == HDR_WWW_AUTHENTICATE || e->id == HDR_PROXY_AUTHENTICATE) {
-                const char *value = e->value.buf();
+                const char *value = e->value.c_str();
 
                 if ((strncasecmp(value, "NTLM", 4) == 0 &&
                         (value[4] == '\0' || value[4] == ' '))
@@ -1318,7 +1318,7 @@
     /* Append VIA */
     {
         LOCAL_ARRAY(char, bbuf, MAX_URL + 32);
-        String strVia;
+        string strVia;
        	hdr->getList(HDR_VIA, &strVia);
         snprintf(bbuf, sizeof(bbuf), "%d.%d %s",
                  reply->sline.version.major,
@@ -1326,7 +1326,7 @@
                  ThisCache);
         strListAdd(&strVia, bbuf, ',');
         hdr->delById(HDR_VIA);
-        hdr->putStr(HDR_VIA, strVia.buf());
+        hdr->putStr(HDR_VIA, strVia.c_str());
     }
     /* Signal keep-alive if needed */
     hdr->putStr(http->flags.accel ? HDR_CONNECTION : HDR_PROXY_CONNECTION,
Index: squid3/src/client_side_request.cc
diff -u squid3/src/client_side_request.cc:1.70 squid3/src/client_side_request.cc:1.66.4.6
--- squid3/src/client_side_request.cc:1.70	Tue May  8 09:51:26 2007
+++ squid3/src/client_side_request.cc	Tue May  8 23:59:35 2007
@@ -628,12 +628,10 @@
 #else
 
     if (req_hdr->has(HDR_PRAGMA)) {
-        String s = req_hdr->getList(HDR_PRAGMA);
+        string s = req_hdr->getList(HDR_PRAGMA);
 
         if (strListIsMember(&s, "no-cache", ','))
             no_cache++;
-
-        s.clean();
     }
 
     if (request->cache_control)
@@ -712,7 +710,7 @@
         request->flags.auth = 1;
 
     if (req_hdr->has(HDR_VIA)) {
-        String s = req_hdr->getList(HDR_VIA);
+        string s = req_hdr->getList(HDR_VIA);
         /*
          * ThisCache cannot be a member of Via header, "1.0 ThisCache" can.
          * Note ThisCache2 has a space prepended to the hostname so we don't
@@ -726,11 +724,11 @@
         }
 
 #if FORW_VIA_DB
-        fvdbCountVia(s.buf());
+        fvdbCountVia(s.c_str());
 
 #endif
 
-        s.clean();
+        s.clear();
     }
 
 #if USE_USERAGENT_LOG
@@ -747,9 +745,9 @@
 #if FORW_VIA_DB
 
     if (req_hdr->has(HDR_X_FORWARDED_FOR)) {
-        String s = req_hdr->getList(HDR_X_FORWARDED_FOR);
-        fvdbCountForw(s.buf());
-        s.clean();
+        string s = req_hdr->getList(HDR_X_FORWARDED_FOR);
+        fvdbCountForw(s.c_str());
+        s.clear();
     }
 
 #endif
Index: squid3/src/client_side_request.h
diff -u squid3/src/client_side_request.h:1.26 squid3/src/client_side_request.h:1.25.4.2
--- squid3/src/client_side_request.h:1.26	Tue May  8 09:51:26 2007
+++ squid3/src/client_side_request.h	Tue May  8 23:59:35 2007
@@ -75,7 +75,7 @@
     ClientHttpRequest(ClientHttpRequest const &);
     ClientHttpRequest& operator=(ClientHttpRequest const &);
 
-    String rangeBoundaryStr() const;
+    string rangeBoundaryStr() const;
     void freeResources();
     void updateCounters();
     void logRequest();
Index: squid3/src/dns_internal.cc
diff -u squid3/src/dns_internal.cc:1.40 squid3/src/dns_internal.cc:1.38.2.2
--- squid3/src/dns_internal.cc:1.40	Mon Apr 30 10:51:35 2007
+++ squid3/src/dns_internal.cc	Thu May  3 06:37:05 2007
@@ -1238,7 +1238,7 @@
     if (!init) {
         memDataInit(MEM_IDNS_QUERY, "idns_query", sizeof(idns_query), 0);
         memset(RcodeMatrix, '\0', sizeof(RcodeMatrix));
-        idns_lookup_hash = hash_create((HASHCMP *) strcmp, 103, hash_string);
+        idns_lookup_hash = hash_create((HASHCMP *) std::strcmp, 103, hash_string);
         init++;
     }
 }
Index: squid3/src/errorpage.cc
diff -u squid3/src/errorpage.cc:1.45 squid3/src/errorpage.cc:1.41.4.3
--- squid3/src/errorpage.cc:1.45	Mon Apr 30 10:51:36 2007
+++ squid3/src/errorpage.cc	Tue May  1 09:09:27 2007
@@ -540,7 +540,7 @@
         Packer p;
         str.Printf("%s %s HTTP/%d.%d\n",
                    RequestMethodStr[r->method],
-                   r->urlpath.size() ? r->urlpath.buf() : "/",
+                   r->urlpath.size() ? r->urlpath.c_str() : "/",
                    r->http_ver.major, r->http_ver.minor);
         packerToMemInit(&p, &str);
         r->header.packInto(&p);
@@ -745,7 +745,7 @@
             Packer p;
             mb.Printf("%s %s HTTP/%d.%d\n",
                       RequestMethodStr[r->method],
-                      r->urlpath.size() ? r->urlpath.buf() : "/",
+                      r->urlpath.size() ? r->urlpath.c_str() : "/",
                       r->http_ver.major, r->http_ver.minor);
             packerToMemInit(&p, &mb);
             r->header.packInto(&p);
Index: squid3/src/external_acl.cc
diff -u squid3/src/external_acl.cc:1.54 squid3/src/external_acl.cc:1.52.4.5
--- squid3/src/external_acl.cc:1.54	Sat Apr 28 15:51:52 2007
+++ squid3/src/external_acl.cc	Thu May  3 06:37:05 2007
@@ -689,7 +689,7 @@
 
     external_acl_cache_touch(acl->def, entry);
     result = entry->result;
-    external_acl_message = entry->message.buf();
+    external_acl_message = entry->message.c_str();
 
     debugs(82, 2, "aclMatchExternal: " << acl->def->name << " = " << result);
 
@@ -759,7 +759,7 @@
 
     for (format = acl_data->def->format; format; format = format->next) {
         const char *str = NULL;
-        String sb;
+        string sb;
 
         switch (format->type) {
 
@@ -812,7 +812,7 @@
             break;
 
         case _external_acl_format::EXT_ACL_PATH:
-            str = request->urlpath.buf();
+            str = request->urlpath.c_str();
             break;
 
         case _external_acl_format::EXT_ACL_METHOD:
@@ -821,22 +821,22 @@
 
         case _external_acl_format::EXT_ACL_HEADER:
             sb = request->header.getByName(format->header);
-            str = sb.buf();
+            str = sb.c_str();
             break;
 
         case _external_acl_format::EXT_ACL_HEADER_ID:
             sb = request->header.getStrOrList(format->header_id);
-            str = sb.buf();
+            str = sb.c_str();
             break;
 
         case _external_acl_format::EXT_ACL_HEADER_MEMBER:
             sb = request->header.getByNameListMember(format->header, format->member, format->separator);
-            str = sb.buf();
+            str = sb.c_str();
             break;
 
         case _external_acl_format::EXT_ACL_HEADER_ID_MEMBER:
             sb = request->header.getListMember(format->header_id, format->member, format->separator);
-            str = sb.buf();
+            str = sb.c_str();
             break;
 #if USE_SSL
 
@@ -886,7 +886,7 @@
 #endif
 
         case _external_acl_format::EXT_ACL_EXT_USER:
-            str = request->extacl_user.buf();
+            str = request->extacl_user.c_str();
             break;
 
         case _external_acl_format::EXT_ACL_UNKNOWN:
@@ -913,7 +913,7 @@
             strwordquote(&mb, str);
         }
 
-        sb.clean();
+        sb.clear();
 
         first = 0;
     }
@@ -1236,8 +1236,8 @@
         if (entry != NULL) {
             debugs(82, 4, "externalAclLookup: entry = { date=" <<
                    (long unsigned int) entry->date << ", result=" <<
-                   entry->result << ", user=" << entry->user.buf() << " tag=" <<
-                   entry->tag.buf() << " log=" << entry->log.buf() << " }");
+                   entry->result << ", user=" << entry->user << " tag=" <<
+                   entry->tag << " log=" << entry->log << " }");
 
         }
 
@@ -1270,7 +1270,7 @@
 
     for (p = Config.externalAclHelperList; p; p = p->next) {
         if (!p->cache)
-            p->cache = hash_create((HASHCMP *) strcmp, hashPrime(1024), hash4);
+            p->cache = hash_create((HASHCMP *) std::strcmp, hashPrime(1024), hash4);
 
         if (!p->theHelper)
             p->theHelper = helperCreate(p->name);
Index: squid3/src/fqdncache.cc
diff -u squid3/src/fqdncache.cc:1.19 squid3/src/fqdncache.cc:1.18.8.2
--- squid3/src/fqdncache.cc:1.19	Sat Apr 28 15:51:52 2007
+++ squid3/src/fqdncache.cc	Thu May  3 06:37:05 2007
@@ -527,7 +527,7 @@
 
     n = hashPrime(fqdncache_high / 4);
 
-    fqdn_table = hash_create((HASHCMP *) strcmp, n, hash4);
+    fqdn_table = hash_create((HASHCMP *) std::strcmp, n, hash4);
 
     memDataInit(MEM_FQDNCACHE_ENTRY, "fqdncache_entry",
                 sizeof(fqdncache_entry), 0);
Index: squid3/src/ftp.cc
diff -u squid3/src/ftp.cc:1.73 squid3/src/ftp.cc:1.62.4.9
--- squid3/src/ftp.cc:1.73	Mon May  7 14:51:23 2007
+++ squid3/src/ftp.cc	Tue May  8 05:40:11 2007
@@ -126,9 +126,9 @@
     int password_url;
     char *reply_hdr;
     int reply_hdr_state;
-    String clean_url;
-    String title_url;
-    String base_href;
+    string clean_url;
+    string title_url;
+    string base_href;
     int conn_att;
     int login_att;
     ftp_state_t state;
@@ -441,9 +441,9 @@
 
     safe_free(old_filepath);
 
-    title_url.clean();
+    title_url.clear();
 
-    base_href.clean();
+    base_href.clear();
 
     safe_free(filepath);
 
@@ -507,7 +507,7 @@
     wordlist *w;
     char *dirup;
     int i, j, k;
-    const char *title = title_url.buf();
+    const char *title = title_url.c_str();
     flags.listing_started = true;
     printfReplyBody("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n");
     printfReplyBody("<!-- HTML listing generated by Squid %s -->\n",
@@ -526,7 +526,7 @@
 
     if (flags.need_base_href)
         printfReplyBody("<BASE HREF=\"%s\">\n",
-                        html_quote(base_href.buf()));
+                        html_quote(base_href.c_str()));
 
     printfReplyBody("</HEAD><BODY>\n");
 
@@ -955,7 +955,7 @@
             if (flags.dir_slash) {
                 url = xstrdup("./");
             } else {
-                const char *title = title_url.buf();
+                const char *title = title_url.c_str();
                 int k = 6 + strcspn(&title[6], "/");
                 char *t;
                 url = xstrdup(title + k);
@@ -1436,11 +1436,11 @@
         flags.isdir = 1;
         flags.root_dir = 1;
         flags.need_base_href = 1;	/* Work around broken browsers */
-    } else if (!request->urlpath.cmp("/%2f/")) {
+    } else if (!request->urlpath.compare("/%2f/")) {
         /* UNIX root directory */
         flags.isdir = 1;
         flags.root_dir = 1;
-    } else if ((l >= 1) && (*(request->urlpath.buf() + l - 1) == '/')) {
+    } else if ((l >= 1) && (*(request->urlpath.c_str() + l - 1) == '/')) {
         /* Directory URL, ending in / */
         flags.isdir = 1;
 
@@ -1528,7 +1528,7 @@
     checkUrlpath();
     buildTitleUrl();
     debugs(9, 5, "ftpStart: host=" << request->host << ", path=" <<
-           request->urlpath.buf() << ", user=" << user << ", passwd=" <<
+           request->urlpath << ", user=" << user << ", passwd=" <<
            password);
 
     state = BEGIN;
@@ -1953,7 +1953,7 @@
             mode = 'A';
         } else {
             t = ftpState->request->urlpath.rpos('/');
-            filename = t ? t + 1 : ftpState->request->urlpath.buf();
+            filename = t ? t + 1 : ftpState->request->urlpath.c_str();
             mode = mimeGetTransferMode(filename);
         }
 
@@ -1981,7 +1981,7 @@
     debugs(9, 3, "This is ftpReadType");
 
     if (code == 200) {
-        p = path = xstrdup(ftpState->request->urlpath.buf());
+        p = path = xstrdup(ftpState->request->urlpath.c_str());
 
         if (*p == '/')
             p++;
@@ -2202,7 +2202,7 @@
         if (ftpState->size == 0) {
             debugs(9, 2, "ftpReadSize: SIZE reported " <<
                    ftpState->ctrl.last_reply << " on " <<
-                   ftpState->title_url.buf());
+                   ftpState->title_url);
 
             ftpState->size = -1;
         }
@@ -2908,7 +2908,7 @@
     safe_free(ftpState->filepath);
 
     /* Build the new path (urlpath begins with /) */
-    path = xstrdup(ftpState->request->urlpath.buf());
+    path = xstrdup(ftpState->request->urlpath.c_str());
 
     rfc1738_unescape(path);
 
@@ -2959,7 +2959,7 @@
     if (!ftpState->flags.isdir &&	/* Not a directory */
             !ftpState->flags.try_slash_hack &&	/* Not in slash hack */
             ftpState->mdtm <= 0 && ftpState->size < 0 &&	/* Not known as a file */
-            ftpState->request->urlpath.caseCmp("/%2f", 4) != 0) {	/* No slash encoded */
+            strncasecmp(ftpState->request->urlpath, "/%2f", 4) != 0) {	/* No slash encoded */
 
         switch (ftpState->state) {
 
@@ -3118,7 +3118,7 @@
 {
     const char *mime_type = NULL;
     const char *mime_enc = NULL;
-    String urlpath = request->urlpath;
+    string urlpath = request->urlpath;
     const char *filename = NULL;
     const char *t = NULL;
     StoreEntry *e = entry;
@@ -3139,7 +3139,7 @@
 
     e->buffer();	/* released when done processing current data payload */
 
-    filename = (t = urlpath.rpos('/')) ? t + 1 : urlpath.buf();
+    filename = (t = urlpath.rpos('/')) ? t + 1 : urlpath.c_str();
 
     if (flags.isdir) {
         mime_type = "text/html";
@@ -3272,7 +3272,7 @@
              request->host,
              portbuf,
              "/%2f",
-             request->urlpath.buf());
+             request->urlpath.c_str());
 
     if ((t = strchr(buf, '?')))
         *t = '\0';
Index: squid3/src/gopher.cc
diff -u squid3/src/gopher.cc:1.27 squid3/src/gopher.cc:1.23.4.4
--- squid3/src/gopher.cc:1.27	Mon Apr 30 10:51:36 2007
+++ squid3/src/gopher.cc	Thu May  3 03:05:12 2007
@@ -230,7 +230,7 @@
 static void
 gopher_request_parse(const HttpRequest * req, char *type_id, char *request)
 {
-    const char *path = req->urlpath.buf();
+    const char *path = req->urlpath.c_str();
 
     if (request)
         request[0] = '\0';
@@ -377,7 +377,7 @@
     }
 
     inbuf[len] = '\0';
-    String outbuf;
+    string outbuf;
 
     if (!gopherState->HTML_header_added) {
         if (gopherState->conversion == gopher_ds::HTML_CSO_RESULT)
@@ -691,12 +691,12 @@
     }				/* while loop */
 
     if (outbuf.size() > 0) {
-        entry->append(outbuf.buf(), outbuf.size());
+        entry->append(outbuf.c_str(), outbuf.size());
         /* now let start sending stuff to client */
         entry->flush();
     }
 
-    outbuf.clean();
+    outbuf.clear();
     return;
 }
 
Index: squid3/src/http.cc
diff -u squid3/src/http.cc:1.107 squid3/src/http.cc:1.99.2.8
--- squid3/src/http.cc:1.107	Tue May  8 09:51:26 2007
+++ squid3/src/http.cc	Tue May  8 23:59:35 2007
@@ -68,7 +68,7 @@
 static PF httpStateFree;
 static PF httpTimeout;
 static void httpMaybeRemovePublic(StoreEntry *, http_status);
-static void copyOneHeaderFromClientsideRequestToUpstreamRequest(const HttpHeaderEntry *e, String strConnection, HttpRequest * request, HttpRequest * orig_request,
+static void copyOneHeaderFromClientsideRequestToUpstreamRequest(const HttpHeaderEntry *e, string strConnection, HttpRequest * request, HttpRequest * orig_request,
         HttpHeader * hdr_out, int we_do_ranges, http_state_flags);
 #if ICAP_CLIENT
 static void icapAclCheckDoneWrapper(ICAPServiceRep::Pointer service, void *data);
@@ -92,7 +92,7 @@
         const char *url;
 
         if (_peer->options.originserver)
-            url = orig_request->urlpath.buf();
+            url = orig_request->urlpath.c_str();
         else
             url = entry->url();
 
@@ -430,9 +430,9 @@
     /* Pragma: no-cache in _replies_ is not documented in HTTP,
      * but servers like "Active Imaging Webcast/2.0" sure do use it */
     if (hdr->has(HDR_PRAGMA)) {
-        String s = hdr->getList(HDR_PRAGMA);
+        string s = hdr->getList(HDR_PRAGMA);
         const int no_cache = strListIsMember(&s, "no-cache", ',');
-        s.clean();
+        s.clear();
 
         if (no_cache) {
             if (!REFRESH_OVERRIDE(ignore_no_cache))
@@ -584,14 +584,14 @@
 const char *
 httpMakeVaryMark(HttpRequest * request, HttpReply const * reply)
 {
-    String vary, hdr;
+    string vary, hdr;
     const char *pos = NULL;
     const char *item;
     const char *value;
     int ilen;
-    static String vstr;
+    static string vstr;
 
-    vstr.clean();
+    vstr.clear();
     vary = reply->header.getList(HDR_VARY);
 
     while (strListGetItem(&vary, ',', &item, &ilen, &pos)) {
@@ -602,14 +602,14 @@
         if (strcmp(name, "*") == 0) {
             /* Can not handle "Vary: *" withtout ETag support */
             safe_free(name);
-            vstr.clean();
+            vstr.clear();
             break;
         }
 
         strListAdd(&vstr, name, ',');
         hdr = request->header.getByName(name);
         safe_free(name);
-        value = hdr.buf();
+        value = hdr.c_str();
 
         if (value) {
             value = rfc1738_escape_part(value);
@@ -618,10 +618,10 @@
             vstr.append("\"", 1);
         }
 
-        hdr.clean();
+        hdr.clear();
     }
 
-    vary.clean();
+    vary.clear();
 #if X_ACCELERATOR_VARY
 
     pos = NULL;
@@ -634,7 +634,7 @@
         strListAdd(&vstr, name, ',');
         hdr = request->header.getByName(name);
         safe_free(name);
-        value = hdr.buf();
+        value = hdr.c_str();
 
         if (value) {
             value = rfc1738_escape_part(value);
@@ -643,14 +643,14 @@
             vstr.append("\"", 1);
         }
 
-        hdr.clean();
+        hdr.clear();
     }
 
-    vary.clean();
+    vary.clear();
 #endif
 
-    debugs(11, 3, "httpMakeVaryMark: " << vstr.buf());
-    return vstr.buf();
+    debugs(11, 3, "httpMakeVaryMark: " << vstr);
+    return vstr.c_str();
 }
 
 void
@@ -1361,7 +1361,7 @@
     LOCAL_ARRAY(char, bbuf, BBUF_SZ);
     const HttpHeader *hdr_in = &orig_request->header;
     const HttpHeaderEntry *e;
-    String strFwd;
+    string strFwd;
     HttpHeaderPos pos = HttpHeaderInitPos;
     assert (hdr_out->owner == hoRequest);
     /* append our IMS header */
@@ -1371,7 +1371,7 @@
 
     bool we_do_ranges = decideIfWeDoRanges (orig_request);
 
-    String strConnection (hdr_in->getList(HDR_CONNECTION));
+    string strConnection (hdr_in->getList(HDR_CONNECTION));
 
     while ((e = hdr_in->getEntry(&pos)))
         copyOneHeaderFromClientsideRequestToUpstreamRequest(e, strConnection, request, orig_request, hdr_out, we_do_ranges, flags);
@@ -1390,24 +1390,24 @@
 
     /* append Via */
     if (Config.onoff.via) {
-        String strVia;
+        string strVia;
         strVia = hdr_in->getList(HDR_VIA);
         snprintf(bbuf, BBUF_SZ, "%d.%d %s",
                  orig_request->http_ver.major,
                  orig_request->http_ver.minor, ThisCache);
         strListAdd(&strVia, bbuf, ',');
-        hdr_out->putStr(HDR_VIA, strVia.buf());
-        strVia.clean();
+        hdr_out->putStr(HDR_VIA, strVia.c_str());
+        strVia.clear();
     }
 
 #if ESI
     {
         /* Append Surrogate-Capabilities */
-        String strSurrogate (hdr_in->getList(HDR_SURROGATE_CAPABILITY));
+        string strSurrogate (hdr_in->getList(HDR_SURROGATE_CAPABILITY));
         snprintf(bbuf, BBUF_SZ, "%s=\"Surrogate/1.0 ESI/1.0\"",
                  Config.Accel.surrogate_id);
         strListAdd(&strSurrogate, bbuf, ',');
-        hdr_out->putStr(HDR_SURROGATE_CAPABILITY, strSurrogate.buf());
+        hdr_out->putStr(HDR_SURROGATE_CAPABILITY, strSurrogate.c_str());
     }
 #endif
 
@@ -1419,9 +1419,9 @@
     else
         strListAdd(&strFwd, "unknown", ',');
 
-    hdr_out->putStr(HDR_X_FORWARDED_FOR, strFwd.buf());
+    hdr_out->putStr(HDR_X_FORWARDED_FOR, strFwd.c_str());
 
-    strFwd.clean();
+    strFwd.clear();
 
     /* append Host if not there already */
     if (!hdr_out->has(HDR_HOST)) {
@@ -1455,7 +1455,7 @@
             if (orig_request->auth_user_request)
                 username = orig_request->auth_user_request->username();
             else if (orig_request->extacl_user.size())
-                username = orig_request->extacl_user.buf();
+                username = orig_request->extacl_user.c_str();
 
             snprintf(loginbuf, sizeof(loginbuf), "%s%s", username, orig_request->peer_login + 1);
 
@@ -1464,7 +1464,7 @@
         } else if (strcmp(orig_request->peer_login, "PASS") == 0) {
             if (orig_request->extacl_user.size() && orig_request->extacl_passwd.size()) {
                 char loginbuf[256];
-                snprintf(loginbuf, sizeof(loginbuf), "%s:%s", orig_request->extacl_user.buf(), orig_request->extacl_passwd.buf());
+                snprintf(loginbuf, sizeof(loginbuf), "%s:%s", orig_request->extacl_user.c_str(), orig_request->extacl_passwd.c_str());
                 httpHeaderPutStrf(hdr_out, HDR_PROXY_AUTHORIZATION, "Basic %s",
                                   base64_encode(loginbuf));
             }
@@ -1491,7 +1491,7 @@
                 hdr_out->putStr(HDR_AUTHORIZATION, auth);
             } else if (orig_request->extacl_user.size() && orig_request->extacl_passwd.size()) {
                 char loginbuf[256];
-                snprintf(loginbuf, sizeof(loginbuf), "%s:%s", orig_request->extacl_user.buf(), orig_request->extacl_passwd.buf());
+                snprintf(loginbuf, sizeof(loginbuf), "%s:%s", orig_request->extacl_user.c_str(), orig_request->extacl_passwd.c_str());
                 httpHeaderPutStrf(hdr_out, HDR_AUTHORIZATION, "Basic %s",
                                   base64_encode(loginbuf));
             }
@@ -1503,7 +1503,7 @@
             if (orig_request->auth_user_request)
                 username = orig_request->auth_user_request->username();
             else if (orig_request->extacl_user.size())
-                username = orig_request->extacl_user.buf();
+                username = orig_request->extacl_user.c_str();
 
             snprintf(loginbuf, sizeof(loginbuf), "%s%s", username, orig_request->peer_login + 1);
 
@@ -1528,7 +1528,7 @@
             httpHdrCcSetMaxAge(cc, getMaxAge(url));
 
             if (request->urlpath.size())
-                assert(strstr(url, request->urlpath.buf()));
+                assert(strstr(url, request->urlpath.c_str()));
         }
 
         /* Set no-cache if determined needed but not found */
@@ -1563,16 +1563,16 @@
     if (Config2.onoff.mangle_request_headers)
         httpHdrMangleList(hdr_out, request, ROR_REQUEST);
 
-    strConnection.clean();
+    strConnection.clear();
 }
 
 void
-copyOneHeaderFromClientsideRequestToUpstreamRequest(const HttpHeaderEntry *e, String strConnection, HttpRequest * request, HttpRequest * orig_request, HttpHeader * hdr_out, int we_do_ranges, http_state_flags flags)
+copyOneHeaderFromClientsideRequestToUpstreamRequest(const HttpHeaderEntry *e, string strConnection, HttpRequest * request, HttpRequest * orig_request, HttpHeader * hdr_out, int we_do_ranges, http_state_flags flags)
 {
-    debugs(11, 5, "httpBuildRequestHeader: " << e->name.buf() << ": " << e->value.buf());
+    debugs(11, 5, "httpBuildRequestHeader: " << e->name << ": " << e->value);
 
     if (!httpRequestHdrAllowed(e, &strConnection)) {
-        debugs(11, 2, "'" << e->name.buf() << "' header denied by anonymize_headers configuration");
+        debugs(11, 2, "'" << e->name << "' header denied by anonymize_headers configuration");
         return;
     }
 
@@ -1731,7 +1731,7 @@
     HttpVersion httpver(1, 0);
     mb->Printf("%s %s HTTP/%d.%d\r\n",
                RequestMethodStr[request->method],
-               request->urlpath.size() ? request->urlpath.buf() : "/",
+               request->urlpath.size() ? request->urlpath.c_str() : "/",
                httpver.major,httpver.minor);
     /* build and pack headers */
     {
Index: squid3/src/ident.cc
diff -u squid3/src/ident.cc:1.16 squid3/src/ident.cc:1.15.4.2
--- squid3/src/ident.cc:1.16	Sat Apr 28 15:51:53 2007
+++ squid3/src/ident.cc	Thu May  3 06:37:06 2007
@@ -270,7 +270,7 @@
 void
 identInit(void)
 {
-    ident_hash = hash_create((HASHCMP *) strcmp,
+    ident_hash = hash_create((HASHCMP *) std::strcmp,
                              hashPrime(Squid_MaxFD / 8),
                              hash4);
 }
Index: squid3/src/internal.cc
diff -u squid3/src/internal.cc:1.17 squid3/src/internal.cc:1.15.8.3
--- squid3/src/internal.cc:1.17	Sat Apr 28 15:51:53 2007
+++ squid3/src/internal.cc	Tue May  1 17:09:51 2007
@@ -50,7 +50,7 @@
 internalStart(HttpRequest * request, StoreEntry * entry)
 {
     ErrorState *err;
-    const char *upath = request->urlpath.buf();
+    const char *upath = request->urlpath.c_str();
     debugs(76, 3, "internalStart: " << inet_ntoa(request->client_addr) << " requesting '" << upath << "'");
 
     if (0 == strcmp(upath, "/squid-internal-dynamic/netdb")) {
Index: squid3/src/ipcache.cc
diff -u squid3/src/ipcache.cc:1.20 squid3/src/ipcache.cc:1.19.8.2
--- squid3/src/ipcache.cc:1.20	Sat Apr 28 15:51:53 2007
+++ squid3/src/ipcache.cc	Thu May  3 06:37:06 2007
@@ -586,7 +586,7 @@
     ipcache_low = (long) (((float) Config.ipcache.size *
                            (float) Config.ipcache.low) / (float) 100);
     n = hashPrime(ipcache_high / 4);
-    ip_table = hash_create((HASHCMP *) strcmp, n, hash4);
+    ip_table = hash_create((HASHCMP *) std::strcmp, n, hash4);
     memDataInit(MEM_IPCACHE_ENTRY, "ipcache_entry", sizeof(ipcache_entry), 0);
 }
 
Index: squid3/src/net_db.cc
diff -u squid3/src/net_db.cc:1.30 squid3/src/net_db.cc:1.27.8.3
--- squid3/src/net_db.cc:1.30	Mon Apr 30 10:51:40 2007
+++ squid3/src/net_db.cc	Tue May  8 23:59:36 2007
@@ -892,11 +892,11 @@
 
     n = hashPrime(Config.Netdb.high / 4);
 
-    addr_table = hash_create((HASHCMP *) strcmp, n, hash_string);
+    addr_table = hash_create((HASHCMP *) std::strcmp, n, hash_string);
 
     n = hashPrime(3 * Config.Netdb.high / 4);
 
-    host_table = hash_create((HASHCMP *) strcmp, n, hash_string);
+    host_table = hash_create((HASHCMP *) std::strcmp, n, hash_string);
 
     eventAddIsh("netdbSaveState", netdbSaveState, NULL, 3600.0, 1);
 
Index: squid3/src/pconn.cc
diff -u squid3/src/pconn.cc:1.16 squid3/src/pconn.cc:1.14.2.2
--- squid3/src/pconn.cc:1.16	Mon Apr 30 10:51:40 2007
+++ squid3/src/pconn.cc	Thu May  3 06:37:06 2007
@@ -217,7 +217,7 @@
 PconnPool::PconnPool(const char *aDescr) : table(NULL), descr(aDescr)
 {
     int i;
-    table = hash_create((HASHCMP *) strcmp, 229, hash_string);
+    table = hash_create((HASHCMP *) std::strcmp, 229, hash_string);
 
     for (i = 0; i < PCONN_HIST_SZ; i++)
         hist[i] = 0;
Index: squid3/src/peer_digest.cc
diff -u squid3/src/peer_digest.cc:1.31 squid3/src/peer_digest.cc:1.27.4.3
--- squid3/src/peer_digest.cc:1.31	Mon Apr 30 10:51:40 2007
+++ squid3/src/peer_digest.cc	Thu May  3 08:03:35 2007
@@ -112,7 +112,7 @@
     if (pd->cd)
         cacheDigestDestroy(pd->cd);
 
-    pd->host.clean();
+    pd->host.clear();
 }
 
 CBDATA_CLASS_INIT(PeerDigest);
@@ -231,7 +231,7 @@
 {
     eventAdd("peerDigestCheck", peerDigestCheck, pd, (double) delay, 1);
     pd->times.next_check = squid_curtime + delay;
-    debugs(72, 3, "peerDigestSetCheck: will check peer " << pd->host.buf() << " in " << delay << " secs");
+    debugs(72, 3, "peerDigestSetCheck: will check peer " << pd->host << " in " << delay << " secs");
 }
 
 /*
@@ -241,10 +241,10 @@
 peerDigestNotePeerGone(PeerDigest * pd)
 {
     if (pd->flags.requested) {
-        debugs(72, 2, "peerDigest: peer " << pd->host.buf() << " gone, will destroy after fetch.");
+        debugs(72, 2, "peerDigest: peer " << pd->host << " gone, will destroy after fetch.");
         /* do nothing now, the fetching chain will notice and take action */
     } else {
-        debugs(72, 2, "peerDigest: peer " << pd->host.buf() << " is gone, destroying now.");
+        debugs(72, 2, "peerDigest: peer " << pd->host << " is gone, destroying now.");
         peerDigestDestroy(pd);
     }
 }
@@ -279,7 +279,7 @@
     /* per-peer limit */
 
     if (req_time - pd->times.received < PeerDigestReqMinGap) {
-        debugs(72, 2, "peerDigestCheck: " << pd->host.buf() <<
+        debugs(72, 2, "peerDigestCheck: " << pd->host <<
                ", avoiding close peer requests (" <<
                (int) (req_time - pd->times.received) << " < " <<
                (int) PeerDigestReqMinGap << " secs).");
@@ -289,7 +289,7 @@
 
     /* global limit */
     if (req_time - pd_last_req_time < GlobDigestReqMinGap) {
-        debugs(72, 2, "peerDigestCheck: " << pd->host.buf() <<
+        debugs(72, 2, "peerDigestCheck: " << pd->host <<
                ", avoiding close requests (" <<
                (int) (req_time - pd_last_req_time) << " < " <<
                (int) GlobDigestReqMinGap << " secs).");
@@ -546,7 +546,7 @@
         assert(reply);
         assert (reply->sline.status != 0);
         status = reply->sline.status;
-        debugs(72, 3, "peerDigestFetchReply: " << pd->host.buf() << " status: " << status << 
+        debugs(72, 3, "peerDigestFetchReply: " << pd->host << " status: " << status << 
                ", expires: " << (long int) reply->expires << " (" << std::showpos << 
                (int) (reply->expires - squid_curtime) << ")");
 
@@ -636,7 +636,7 @@
         assert (fetch->entry->getReply()->sline.status != 0);
 
         if (fetch->entry->getReply()->sline.status != HTTP_OK) {
-            debugs(72, 1, "peerDigestSwapInHeaders: " << fetch->pd->host.buf() <<
+            debugs(72, 1, "peerDigestSwapInHeaders: " << fetch->pd->host <<
                    " status " << fetch->entry->getReply()->sline.status <<
                    " got cached!");
 
@@ -764,7 +764,7 @@
 #endif
 
         else
-            host = pd->host.buf();
+            host = pd->host.c_str();
     }
 
     debugs(72, 6, step_name << ": peer " << host << ", offset: " <<
@@ -815,7 +815,7 @@
 peerDigestFetchStop(DigestFetchState * fetch, char *buf, const char *reason)
 {
     assert(reason);
-    debugs(72, 2, "peerDigestFetchStop: peer " << fetch->pd->host.buf() << ", reason: " << reason);
+    debugs(72, 2, "peerDigestFetchStop: peer " << fetch->pd->host << ", reason: " << reason);
     peerDigestReqFinish(fetch, buf, 1, 1, 1, reason, 0);
 }
 
@@ -824,7 +824,7 @@
 peerDigestFetchAbort(DigestFetchState * fetch, char *buf, const char *reason)
 {
     assert(reason);
-    debugs(72, 2, "peerDigestFetchAbort: peer " << fetch->pd->host.buf() << ", reason: " << reason);
+    debugs(72, 2, "peerDigestFetchAbort: peer " << fetch->pd->host << ", reason: " << reason);
     peerDigestReqFinish(fetch, buf, 1, 1, 1, reason, 1);
 }
 
@@ -874,7 +874,7 @@
 peerDigestPDFinish(DigestFetchState * fetch, int pcb_valid, int err)
 {
     PeerDigest *pd = fetch->pd;
-    const char *host = pd->host.buf();
+    const char *host = pd->host.c_str();
 
     pd->times.received = squid_curtime;
     pd->times.req_delay = fetch->resp_time;
@@ -988,7 +988,7 @@
 {
     StoreDigestCBlock cblock;
     int freed_size = 0;
-    const char *host = pd->host.buf();
+    const char *host = pd->host.c_str();
 
     xmemcpy(&cblock, buf, sizeof(cblock));
     /* network -> host conversions */
@@ -1082,7 +1082,7 @@
     const int bit_util = cacheDigestBitUtil(pd->cd);
 
     if (bit_util > 65) {
-        debugs(72, 0, "Warning: " << pd->host.buf() <<
+        debugs(72, 0, "Warning: " << pd->host <<
                " peer digest has too many bits on (" << bit_util << "%%).");
 
         return 0;
@@ -1108,7 +1108,7 @@
 
     assert(pd);
 
-    const char *host = pd->host.buf();
+    const char *host = pd->host.c_str();
     storeAppendPrintf(e, "\npeer digest from %s\n", host);
 
     cacheDigestGuessStatsReport(&pd->stats.guess, e, host);
Index: squid3/src/protos.h
diff -u squid3/src/protos.h:1.82 squid3/src/protos.h:1.80.2.3
--- squid3/src/protos.h:1.82	Fri Apr 20 17:16:10 2007
+++ squid3/src/protos.h	Wed May  2 05:53:05 2007
@@ -222,7 +222,7 @@
 SQUIDCEXTERN void httpHdrCcInitModule(void);
 SQUIDCEXTERN void httpHdrCcCleanModule(void);
 SQUIDCEXTERN HttpHdrCc *httpHdrCcCreate(void);
-SQUIDCEXTERN HttpHdrCc *httpHdrCcParseCreate(const String * str);
+SQUIDCEXTERN HttpHdrCc *httpHdrCcParseCreate(const string * str);
 SQUIDCEXTERN void httpHdrCcDestroy(HttpHdrCc * cc);
 SQUIDCEXTERN HttpHdrCc *httpHdrCcDup(const HttpHdrCc * cc);
 SQUIDCEXTERN void httpHdrCcPackInto(const HttpHdrCc * cc, Packer * p);
@@ -234,14 +234,14 @@
 /* Http Header Tools */
 SQUIDCEXTERN HttpHeaderFieldInfo *httpHeaderBuildFieldsInfo(const HttpHeaderFieldAttrs * attrs, int count);
 SQUIDCEXTERN void httpHeaderDestroyFieldsInfo(HttpHeaderFieldInfo * info, int count);
-SQUIDCEXTERN http_hdr_type httpHeaderIdByName(const char *name, int name_len, const HttpHeaderFieldInfo * attrs, int end);
+SQUIDCEXTERN http_hdr_type httpHeaderIdByName(const char *name, unsigned int name_len, const HttpHeaderFieldInfo * attrs, int end);
 SQUIDCEXTERN http_hdr_type httpHeaderIdByNameDef(const char *name, int name_len);
 SQUIDCEXTERN const char *httpHeaderNameById(int id);
 SQUIDCEXTERN int httpHeaderHasConnDir(const HttpHeader * hdr, const char *directive);
-SQUIDCEXTERN void strListAdd(String * str, const char *item, char del);
-SQUIDCEXTERN int strListIsMember(const String * str, const char *item, char del);
-SQUIDCEXTERN int strListIsSubstr(const String * list, const char *s, char del);
-SQUIDCEXTERN int strListGetItem(const String * str, char del, const char **item, int *ilen, const char **pos);
+SQUIDCEXTERN void strListAdd(string * str, const char *item, char del);
+SQUIDCEXTERN int strListIsMember(const string * str, const char *item, char del);
+SQUIDCEXTERN int strListIsSubstr(const string * list, const char *s, char del);
+SQUIDCEXTERN int strListGetItem(const string * str, char del, const char **item, int *ilen, const char **pos);
 SQUIDCEXTERN const char *getStringPrefix(const char *str, const char *end);
 SQUIDCEXTERN int httpHeaderParseInt(const char *start, int *val);
 SQUIDCEXTERN int httpHeaderParseSize(const char *start, ssize_t * sz);
Index: squid3/src/redirect.cc
diff -u squid3/src/redirect.cc:1.24 squid3/src/redirect.cc:1.21.8.5
--- squid3/src/redirect.cc:1.24	Mon May  7 11:51:34 2007
+++ squid3/src/redirect.cc	Tue May  8 05:40:12 2007
@@ -135,8 +135,8 @@
 
     if (http->request->auth_user_request)
         r->client_ident = http->request->auth_user_request->username();
-    else if (http->request->extacl_user.buf() != NULL) {
-        r->client_ident = http->request->extacl_user.buf();
+    else if (!http->request->extacl_user.empty()) {
+        r->client_ident = http->request->extacl_user.c_str();
     }
 
     if (!r->client_ident && (conn != NULL && conn->rfc931[0]))
Index: squid3/src/stat.cc
diff -u squid3/src/stat.cc:1.39 squid3/src/stat.cc:1.36.2.4
--- squid3/src/stat.cc:1.39	Sat Apr 28 15:51:56 2007
+++ squid3/src/stat.cc	Thu May  3 03:05:13 2007
@@ -1692,8 +1692,8 @@
 
         if (http->request->auth_user_request)
             p = http->request->auth_user_request->username();
-        else if (http->request->extacl_user.buf() != NULL) {
-            p = http->request->extacl_user.buf();
+        else if (!http->request->extacl_user.empty()) {
+            p = http->request->extacl_user.c_str();
         }
 
         if (!p && (conn != NULL && conn->rfc931[0]))
Index: squid3/src/store.cc
diff -u squid3/src/store.cc:1.60 squid3/src/store.cc:1.51.4.6
--- squid3/src/store.cc:1.60	Mon May  7 15:50:57 2007
+++ squid3/src/store.cc	Tue May  8 05:40:12 2007
@@ -685,7 +685,7 @@
 
         if (mem_obj->vary_headers && !storeGetPublic(mem_obj->url, mem_obj->method)) {
             /* Create "vary" base object */
-            String vary;
+            string vary;
             StoreEntry *pe = storeCreateEntry(mem_obj->url, mem_obj->log_url, request->flags, request->method);
             HttpVersion version(1, 0);
             /* We are allowed to do this typecast */
@@ -693,19 +693,19 @@
             rep->setHeaders(version, HTTP_OK, "Internal marker object", "x-squid-internal/vary", -1, -1, squid_curtime + 100000);
             vary = mem_obj->getReply()->header.getList(HDR_VARY);
 
-            if (vary.size()) {
+            if (!vary.empty()) {
                 /* Again, we own this structure layout */
-                rep->header.putStr(HDR_VARY, vary.buf());
-                vary.clean();
+                rep->header.putStr(HDR_VARY, vary.c_str());
+                vary.clear();
             }
 
 #if X_ACCELERATOR_VARY
             vary = mem_obj->getReply()->header.getList(HDR_X_ACCELERATOR_VARY);
 
-            if (vary.buf()) {
+            if (!vary.empty()) {
                 /* Again, we own this structure layout */
-                rep->header.putStr(HDR_X_ACCELERATOR_VARY, vary.buf());
-                vary.clean();
+                rep->header.putStr(HDR_X_ACCELERATOR_VARY, vary.c_str());
+                vary.clear();
             }
 
 #endif
Index: squid3/src/store_dir.cc
diff -u squid3/src/store_dir.cc:1.22 squid3/src/store_dir.cc:1.20.4.3
--- squid3/src/store_dir.cc:1.22	Sat Apr 28 15:51:56 2007
+++ squid3/src/store_dir.cc	Tue May  1 17:09:51 2007
@@ -502,7 +502,7 @@
 }
 
 StoreSearch *
-StoreController::search(String const url, HttpRequest *request)
+StoreController::search(string const url, HttpRequest *request)
 {
     /* cheat, for now you can't search the memory hot cache */
     return swapDir->search(url, request);
@@ -700,7 +700,7 @@
 void
 
 StoreController::get
-    (String const key, STOREGETCLIENT callback, void *cbdata)
+    (string const key, STOREGETCLIENT callback, void *cbdata)
 {
     fatal("not implemented");
 }
@@ -775,7 +775,7 @@
 void
 
 StoreHashIndex::get
-    (String const key, STOREGETCLIENT callback, void *cbdata)
+    (string const key, STOREGETCLIENT callback, void *cbdata)
 {
     fatal("not implemented");
 }
@@ -891,7 +891,7 @@
 }
 
 StoreSearch *
-StoreHashIndex::search(String const url, HttpRequest *)
+StoreHashIndex::search(string const url, HttpRequest *)
 {
     if (url.size())
         fatal ("Cannot search by url yet\n");
Index: squid3/src/store_log.cc
diff -u squid3/src/store_log.cc:1.9 squid3/src/store_log.cc:1.6.2.4
--- squid3/src/store_log.cc:1.9	Sat Apr 28 15:51:56 2007
+++ squid3/src/store_log.cc	Mon May  7 03:32:22 2007
@@ -87,7 +87,7 @@
                       (int) reply->date,
                       (int) reply->last_modified,
                       (int) reply->expires,
-                      reply->content_type.size() ? reply->content_type.buf() : "unknown",
+                      !reply->content_type.empty() ? reply->content_type.c_str() : "unknown",
                       reply->content_length,
                       e->contentLen(),
                       RequestMethodStr[mem->method],
Index: squid3/src/structs.h
diff -u squid3/src/structs.h:1.106 squid3/src/structs.h:1.105.2.3
--- squid3/src/structs.h:1.106	Mon Apr 16 11:05:01 2007
+++ squid3/src/structs.h	Thu May  3 03:05:13 2007
@@ -842,8 +842,8 @@
 
 class HttpHdrExtField
 {
-    String name;		/* field-name  from HTTP/1.1 (no column after name) */
-    String value;		/* field-value from HTTP/1.1 */
+    string name;		/* field-name  from HTTP/1.1 (no column after name) */
+    string value;		/* field-value from HTTP/1.1 */
 };
 
 /* http cache control header field */
@@ -856,7 +856,7 @@
     int max_age;
     int s_maxage;
     int max_stale;
-    String other;
+    string other;
 };
 
 /* some fields can hold either time or etag specs (e.g. If-Range) */
@@ -892,7 +892,7 @@
     HttpHeaderFieldInfo() : id (HDR_ACCEPT), type (ftInvalid){}
 
     http_hdr_type id;
-    String name;
+    string name;
     field_type type;
     HttpHeaderFieldStat stat;
 };
Index: squid3/src/url.cc
diff -u squid3/src/url.cc:1.18 squid3/src/url.cc:1.17.4.3
--- squid3/src/url.cc:1.18	Sat Apr 28 15:51:56 2007
+++ squid3/src/url.cc	Tue May  1 17:09:51 2007
@@ -268,7 +268,7 @@
     for (t = host; *t; t++)
         *t = xtolower(*t);
 
-    if (stringHasWhitespace(host)) {
+    if (strpbrk(host, w_space) != NULL) {
         if (URI_WHITESPACE_STRIP == Config.uri_whitespace) {
             t = q = host;
 
@@ -316,7 +316,7 @@
     }
 
 #endif
-    if (stringHasWhitespace(urlpath)) {
+    if (strpbrk(urlpath, w_space) != NULL) {
         debugs(23, 2, "urlParse: URI has whitespace: {" << url << "}");
 
         switch (Config.uri_whitespace) {
@@ -381,7 +381,7 @@
         return request->canonical;
 
     if (request->protocol == PROTO_URN) {
-        snprintf(urlbuf, MAX_URL, "urn:%s", request->urlpath.buf());
+        snprintf(urlbuf, MAX_URL, "urn:%s", request->urlpath.c_str());
     } else {
         switch (request->method) {
 
@@ -401,7 +401,7 @@
                      *request->login ? "@" : null_string,
                      request->host,
                      portbuf,
-                     request->urlpath.buf());
+                     request->urlpath.c_str());
 
             break;
         }
@@ -410,6 +410,22 @@
     return (request->canonical = xstrdup(urlbuf));
 }
 
+int
+stringHasCntl(const char *s)
+{
+    unsigned char c;
+
+    while ((c = (unsigned char) *s++) != '\0') {
+        if (c <= 0x1f)
+            return 1;
+
+        if (c >= 0x7f && c <= 0x9f)
+            return 1;
+    }
+
+    return 0;
+}
+
 char *
 urlCanonicalClean(const HttpRequest * request)
 {
@@ -419,7 +435,7 @@
     char *t;
 
     if (request->protocol == PROTO_URN) {
-        snprintf(buf, MAX_URL, "urn:%s", request->urlpath.buf());
+        snprintf(buf, MAX_URL, "urn:%s", request->urlpath.c_str());
     } else {
         switch (request->method) {
 
@@ -449,7 +465,7 @@
                      loginbuf,
                      request->host,
                      portbuf,
-                     request->urlpath.buf());
+                     request->urlpath.c_str());
             /*
              * strip arguments AFTER a question-mark
              */
Index: squid3/src/urn.cc
diff -u squid3/src/urn.cc:1.27 squid3/src/urn.cc:1.25.8.4
--- squid3/src/urn.cc:1.27	Sat Apr 28 15:51:56 2007
+++ squid3/src/urn.cc	Thu May  3 03:05:14 2007
@@ -53,11 +53,11 @@
     void *operator new (size_t byteCount);
     void operator delete (void *address);
     void start (HttpRequest *, StoreEntry *);
-    char *getHost (String &urlpath);
+    char *getHost (string &urlpath);
     void setUriResFromRequest(HttpRequest *);
     bool RequestNeedsMenu(HttpRequest *r);
     void updateRequestURL(HttpRequest *r, char const *newPath);
-    void createUriResRequest (String &uri);
+    void createUriResRequest (string &uri);
 
     virtual ~UrnState();
 
@@ -174,17 +174,17 @@
 }
 
 char *
-UrnState::getHost (String &urlpath)
+UrnState::getHost (string &urlpath)
 {
     char * result;
     char const *t;
 
     if ((t = urlpath.pos(':')) != NULL) {
         urlpath.set(t, '\0');
-        result = xstrdup(urlpath.buf());
+        result = xstrdup(urlpath.c_str());
         urlpath.set(t, ':');
     } else {
-        result = xstrdup(urlpath.buf());
+        result = xstrdup(urlpath.c_str());
     }
 
     return result;
@@ -193,7 +193,7 @@
 bool
 UrnState::RequestNeedsMenu(HttpRequest *r)
 {
-    return strncasecmp(r->urlpath.buf(), "menu.", 5) == 0;
+    return strncasecmp(r->urlpath, "menu.", 5) == 0;
 }
 
 void
@@ -205,11 +205,11 @@
 }
 
 void
-UrnState::createUriResRequest (String &uri)
+UrnState::createUriResRequest (string &uri)
 {
     LOCAL_ARRAY(char, local_urlres, 4096);
     char *host = getHost (uri);
-    snprintf(local_urlres, 4096, "http://%s/uri-res/N2L?urn:%s", host, uri.buf());
+    snprintf(local_urlres, 4096, "http://%s/uri-res/N2L?urn:%s", host, uri.c_str());
     safe_free (host);
     safe_free (urlres);
     urlres = xstrdup (local_urlres);
@@ -220,7 +220,7 @@
 UrnState::setUriResFromRequest(HttpRequest *r)
 {
     if (RequestNeedsMenu(r)) {
-        updateRequestURL(r, r->urlpath.buf() + 5);
+        updateRequestURL(r, r->urlpath.c_str() + 5);
         flags.force_menu = 1;
     }
 
Index: squid3/src/whois.cc
diff -u squid3/src/whois.cc:1.22 squid3/src/whois.cc:1.17.4.3
--- squid3/src/whois.cc:1.22	Mon Apr 30 10:51:41 2007
+++ squid3/src/whois.cc	Tue May  1 17:09:52 2007
@@ -100,7 +100,7 @@
 
     buf = (char *)xmalloc(l);
 
-    snprintf(buf, l, "%s\r\n", p->request->urlpath.buf() + 1);
+    snprintf(buf, l, "%s\r\n", p->request->urlpath.c_str() + 1);
 
     comm_write(fd, buf, strlen(buf), whoisWriteComplete, p, NULL);
     comm_read(fd, p->buf, BUFSIZ, whoisReadReply, p);
Index: squid3/src/DiskIO/AIO/AIODiskFile.h
diff -u squid3/src/DiskIO/AIO/AIODiskFile.h:1.2 squid3/src/DiskIO/AIO/AIODiskFile.h:1.2.8.1
--- squid3/src/DiskIO/AIO/AIODiskFile.h:1.2	Sun Aug 20 18:51:50 2006
+++ squid3/src/DiskIO/AIO/AIODiskFile.h	Thu May  3 06:37:07 2007
@@ -70,7 +70,7 @@
     CBDATA_CLASS(AIODiskFile);
     void error(bool const &);
     int fd;
-    String path;
+    string path;
     AIODiskIOStrategy *strategy;
     RefCount<IORequestor> ioRequestor;
     bool closed;
Index: squid3/src/ICAP/ICAPConfig.cc
diff -u squid3/src/ICAP/ICAPConfig.cc:1.13 squid3/src/ICAP/ICAPConfig.cc:1.12.4.3
--- squid3/src/ICAP/ICAPConfig.cc:1.13	Sat Apr 28 15:51:58 2007
+++ squid3/src/ICAP/ICAPConfig.cc	Thu May  3 08:03:35 2007
@@ -48,7 +48,7 @@
 ICAPConfig TheICAPConfig;
 
 ICAPServiceRep::Pointer
-ICAPConfig::findService(const String& key)
+ICAPConfig::findService(const string& key)
 {
     Vector<ICAPServiceRep::Pointer>::iterator iter = services.begin();
 
@@ -63,7 +63,7 @@
 }
 
 ICAPClass *
-ICAPConfig::findClass(const String& key)
+ICAPConfig::findClass(const string& key)
 {
     if (!key.size())
         return NULL;
@@ -87,7 +87,7 @@
     wordlist *service_names = NULL;
     wordlist *iter;
 
-    ConfigParser::ParseString(&key);
+    ConfigParser::ParseString(key);
     ConfigParser::ParseWordList(&service_names);
 
     for (iter = service_names; iter; iter = iter->next) {
@@ -125,7 +125,7 @@
 
     candidateClasses.clean();
 
-    matchedClass.clean();
+    matchedClass.clear();
 
     acl_checklist = NULL;
 
@@ -159,7 +159,7 @@
         ICAPClass *c = *ci;
         ICAPServiceRep::Pointer service = findBestService(c, false);
         if (service != NULL) {
-            debugs(93, 3, "ICAPAccessCheck::check: class '" << c->key.buf() << "' has candidate service '" << service->key.buf() << "'");
+            debugs(93, 3, "ICAPAccessCheck::check: class '" << c->key << "' has candidate service '" << service->key << "'");
             candidateClasses += c->key;
         }
     }
@@ -193,7 +193,7 @@
      */
     debugs(93, 3, "ICAPAccessCheck::check: NO candidates or matches found");
 
-    matchedClass.clean();
+    matchedClass.clear();
 
     ICAPAccessCheckCallbackWrapper(1, this);
 
@@ -207,7 +207,7 @@
     ICAPAccessCheck *ac = (ICAPAccessCheck*)data;
 
     if (ac->matchedClass.size()) {
-        debugs(93, 5, "ICAPAccessCheckCallbackWrapper matchedClass = " << ac->matchedClass.buf());
+        debugs(93, 5, "ICAPAccessCheckCallbackWrapper matchedClass = " << ac->matchedClass);
     }
 
     if (!answer) {
@@ -241,7 +241,7 @@
     debugs(93, 3, "ICAPAccessCheck::do_callback");
 
     if (matchedClass.size()) {
-        debugs(93, 3, "ICAPAccessCheck::do_callback matchedClass = " << matchedClass.buf());
+        debugs(93, 3, "ICAPAccessCheck::do_callback matchedClass = " << matchedClass);
     }
 
     void *validated_cbdata;
@@ -351,8 +351,8 @@
 
     for (VI i = services.begin(); i != services.end(); ++i) {
         const ICAPServiceRep::Pointer &r = *i;
-        storeAppendPrintf(entry, "%s %s_%s %s %d %s\n", name, r->key.buf(),
-                          r->methodStr(), r->vectPointStr(), r->bypass, r->uri.buf());
+        storeAppendPrintf(entry, "%s %s_%s %s %d %s\n", name, r->key.c_str(),
+                          r->methodStr(), r->vectPointStr(), r->bypass, r->uri.c_str());
     }
 };
 
@@ -380,7 +380,7 @@
     Vector<ICAPClass*>::iterator i = classes.begin();
 
     while (i != classes.end()) {
-        storeAppendPrintf(entry, "%s %s\n", name, (*i)->key.buf());
+        storeAppendPrintf(entry, "%s %s\n", name, (*i)->key.c_str());
         ++i;
     }
 };
@@ -388,13 +388,13 @@
 void
 ICAPConfig::parseICAPAccess(ConfigParser &parser)
 {
-    String aKey;
-    ConfigParser::ParseString(&aKey);
+    string aKey;
+    ConfigParser::ParseString(aKey);
     ICAPClass *theClass = TheICAPConfig.findClass(aKey);
 
     if (theClass == NULL)
         fatalf("Did not find ICAP class '%s' referenced on line %d\n",
-               aKey.buf(), config_lineno);
+               aKey.c_str(), config_lineno);
 
     aclParseAccessLine(parser, &theClass->accessList);
 };
@@ -413,7 +413,7 @@
     Vector<ICAPClass*>::iterator i = classes.begin();
 
     while (i != classes.end()) {
-        snprintf(nom, 64, "%s %s", name, (*i)->key.buf());
+        snprintf(nom, 64, "%s %s", name, (*i)->key.c_str());
         dump_acl_access(entry, nom, (*i)->accessList);
         ++i;
     }
Index: squid3/src/ICAP/ICAPConfig.h
diff -u squid3/src/ICAP/ICAPConfig.h:1.9 squid3/src/ICAP/ICAPConfig.h:1.9.4.1
--- squid3/src/ICAP/ICAPConfig.h:1.9	Thu Apr  5 22:52:42 2007
+++ squid3/src/ICAP/ICAPConfig.h	Thu May  3 06:37:07 2007
@@ -47,7 +47,7 @@
 {
 
 public:
-    String key;
+    string key;
     acl_access *accessList;
 
     Vector<ICAPServiceRep::Pointer> services;
@@ -73,8 +73,8 @@
     ICAPAccessCheckCallback *callback;
     void *callback_data;
     ACLChecklist *acl_checklist;
-    Vector<String> candidateClasses;
-    String matchedClass;
+    Vector<string> candidateClasses;
+    string matchedClass;
     void do_callback();
     ICAPServiceRep::Pointer findBestService(ICAPClass *c, bool preferUp);
 
@@ -115,8 +115,8 @@
     void parseICAPService(void);
     void freeICAPService(void);
     void dumpICAPService(StoreEntry *, const char *);
-    ICAPServiceRep::Pointer findService(const String&);
-    ICAPClass * findClass(const String& key);
+    ICAPServiceRep::Pointer findService(const string&);
+    ICAPClass * findClass(const string& key);
 
     void parseICAPClass(void);
     void freeICAPClass(void);
Index: squid3/src/ICAP/ICAPModXact.cc
diff -u squid3/src/ICAP/ICAPModXact.cc:1.22 squid3/src/ICAP/ICAPModXact.cc:1.19.4.5
--- squid3/src/ICAP/ICAPModXact.cc:1.22	Tue May  8 09:51:27 2007
+++ squid3/src/ICAP/ICAPModXact.cc	Tue May  8 23:59:37 2007
@@ -973,8 +973,8 @@
      * XXX These should use HttpHdr interfaces instead of Printfs
      */
     const ICAPServiceRep &s = service();
-    buf.Printf("%s %s ICAP/1.0\r\n", s.methodStr(), s.uri.buf());
-    buf.Printf("Host: %s:%d\r\n", s.host.buf(), s.port);
+    buf.Printf("%s %s ICAP/1.0\r\n", s.methodStr(), s.uri.c_str());
+    buf.Printf("Host: %s:%d\r\n", s.host.c_str(), s.port);
     buf.Printf("Date: %s\r\n", mkrfc1123(squid_curtime));
 
     if (!TheICAPConfig.reuse_connections)
@@ -995,7 +995,7 @@
 
     // to simplify, we could assume that request is always available
 
-    String urlPath;
+    string urlPath;
     if (request) {
         urlPath = request->urlpath;
         if (ICAP::methodRespmod == m)
@@ -1091,7 +1091,7 @@
     const HttpRequest *request = virgin.cause ?
         virgin.cause :
         dynamic_cast<const HttpRequest*>(virgin.header);
-    const String urlPath = request ? request->urlpath : String();
+    const string urlPath = request ? request->urlpath : "";
     size_t wantedSize;
     if (!service().wantsPreview(urlPath, wantedSize)) {
         debugs(93, 5, "ICAPModXact should not offer preview for " << urlPath);
Index: squid3/src/ICAP/ICAPOptXact.cc
diff -u squid3/src/ICAP/ICAPOptXact.cc:1.7 squid3/src/ICAP/ICAPOptXact.cc:1.5.4.3
--- squid3/src/ICAP/ICAPOptXact.cc:1.7	Tue May  8 09:51:28 2007
+++ squid3/src/ICAP/ICAPOptXact.cc	Tue May  8 23:59:37 2007
@@ -42,8 +42,8 @@
 void ICAPOptXact::makeRequest(MemBuf &buf)
 {
     const ICAPServiceRep &s = service();
-    buf.Printf("OPTIONS %s ICAP/1.0\r\n", s.uri.buf());
-    buf.Printf("Host: %s:%d\r\n", s.host.buf(), s.port);
+    buf.Printf("OPTIONS %s ICAP/1.0\r\n", s.uri.c_str());
+    buf.Printf("Host: %s:%d\r\n", s.host.c_str(), s.port);
     buf.append(ICAP::crlf, 2);
 }
 
Index: squid3/src/ICAP/ICAPOptions.cc
diff -u squid3/src/ICAP/ICAPOptions.cc:1.9 squid3/src/ICAP/ICAPOptions.cc:1.9.4.2
--- squid3/src/ICAP/ICAPOptions.cc:1.9	Thu Apr  5 22:52:43 2007
+++ squid3/src/ICAP/ICAPOptions.cc	Mon May  7 03:32:23 2007
@@ -31,7 +31,7 @@
 // future optimization note: this method is called by ICAP ACL code at least
 // twice for each HTTP message to see if the message should be ignored. For any
 // non-ignored HTTP message, ICAP calls to check whether a preview is needed.
-ICAPOptions::TransferKind ICAPOptions::transferKind(const String &urlPath) const
+ICAPOptions::TransferKind ICAPOptions::transferKind(const string &urlPath) const
 {
     if (theTransfers.preview.matches(urlPath))
         return xferPreview;
@@ -122,10 +122,10 @@
 // TODO: HttpHeader should provide a general method for this type of conversion
 void ICAPOptions::cfgIntHeader(const HttpHeader *h, const char *fname, int &value)
 {
-    const String s = h->getByName(fname);
+    const string s = h->getByName(fname);
 
-    if (s.size() && xisdigit(*s.buf()))
-        value = atoi(s.buf());
+    if (!s.empty() && xisdigit(s[0]))
+        value = atoi(s.c_str());
     else
         value = -1;
 
@@ -134,7 +134,7 @@
 
 void ICAPOptions::cfgTransferList(const HttpHeader *h, TransferList &list)
 {
-    const String buf = h->getByName(list.name);
+    const string buf = h->getByName(list.name);
     bool foundStar = false;
     list.parse(buf, foundStar);
 
@@ -162,7 +162,7 @@
     wordlistAdd(&extensions, extension);
 };
 
-bool ICAPOptions::TransferList::matches(const String &urlPath) const {
+bool ICAPOptions::TransferList::matches(const string &urlPath) const {
     const int urlLen = urlPath.size();
     for (wordlist *e = extensions; e; e = e->next) {
         // optimize: store extension lengths
@@ -172,8 +172,8 @@
         if (eLen < urlLen) {
             const int eOff = urlLen - eLen;
             // RFC 3507 examples imply that extensions come without leading '.'
-            if (urlPath.buf()[eOff-1] == '.' &&
-                strcmp(urlPath.buf() + eOff, e->key) == 0) {
+            if (urlPath[eOff-1] == '.' &&
+                strcmp(&urlPath[eOff], e->key) == 0) {
                 debugs(93,7, "ICAPOptions url " << urlPath << " matches " <<
                     name << " extension " << e->key);
                 return true;
@@ -184,7 +184,7 @@
     return false;
 }
 
-void ICAPOptions::TransferList::parse(const String &buf, bool &foundStar) {
+void ICAPOptions::TransferList::parse(const string &buf, bool &foundStar) {
     foundStar = false;
 
     const char *item;
Index: squid3/src/ICAP/ICAPOptions.h
diff -u squid3/src/ICAP/ICAPOptions.h:1.8 squid3/src/ICAP/ICAPOptions.h:1.8.4.1
--- squid3/src/ICAP/ICAPOptions.h:1.8	Thu Apr  5 22:52:43 2007
+++ squid3/src/ICAP/ICAPOptions.h	Thu May  3 06:37:07 2007
@@ -62,18 +62,18 @@
     time_t timestamp() const { return theTimestamp; };
 
     typedef enum { xferNone, xferPreview, xferIgnore, xferComplete } TransferKind;
-    TransferKind transferKind(const String &urlPath) const;
+    TransferKind transferKind(const string &urlPath) const;
 
 public:
     const char *error; // human-readable information; set iff !valid()
 
     // ICAP server MUST supply this info
     Vector<ICAP::Method> methods;
-    String istag;
+    string istag;
 
     // ICAP server MAY supply this info. If not, Squid supplies defaults.
-    String service;
-    String serviceId;
+    string service;
+    string serviceId;
     int max_connections;
     bool allow204;
     int preview;
@@ -86,9 +86,9 @@
             TransferList();
             ~TransferList();
 
-            bool matches(const String &urlPath) const;
+            bool matches(const string &urlPath) const;
 
-            void parse(const String &buf, bool &foundStar);
+            void parse(const string &buf, bool &foundStar);
             void add(const char *extension);
             void report(int level, const char *prefix) const;
 
Index: squid3/src/ICAP/ICAPServiceRep.cc
diff -u squid3/src/ICAP/ICAPServiceRep.cc:1.10 squid3/src/ICAP/ICAPServiceRep.cc:1.7.4.6
--- squid3/src/ICAP/ICAPServiceRep.cc:1.10	Tue May  8 09:51:28 2007
+++ squid3/src/ICAP/ICAPServiceRep.cc	Tue May  8 23:59:37 2007
@@ -80,24 +80,24 @@
 
     char *service_type = NULL;
 
-    ConfigParser::ParseString(&key);
+    ConfigParser::ParseString(key);
     ConfigParser::ParseString(&service_type);
     ConfigParser::ParseBool(&bypass);
-    ConfigParser::ParseString(&uri);
+    ConfigParser::ParseString(uri);
 
-    debugs(3, 5, "ICAPService::parseConfigLine (line " << config_lineno << "): " << key.buf() << " " << service_type << " " << bypass);
+    debugs(3, 5, "ICAPService::parseConfigLine (line " << config_lineno << "): " << key << " " << service_type << " " << bypass);
 
     method = parseMethod(service_type);
     point = parseVectPoint(service_type);
 
     debugs(3, 5, "ICAPService::parseConfigLine (line " << config_lineno << "): service is " << methodStr() << "_" << vectPointStr());
 
-    if (uri.cmp("icap://", 7) != 0) {
-        debugs(3, 0, "ICAPService::parseConfigLine (line " << config_lineno << "): wrong uri: " << uri.buf());
+    if (strncmp(uri, "icap://", 7) != 0) {
+        debugs(3, 0, "ICAPService::parseConfigLine (line " << config_lineno << "): wrong uri: " << uri);
         return false;
     }
 
-    const char *s = uri.buf() + 7;
+    const char *s = &uri[7];
 
     const char *e;
 
@@ -217,13 +217,13 @@
     return probed() && !up();
 }
 
-bool ICAPServiceRep::wantsUrl(const String &urlPath) const
+bool ICAPServiceRep::wantsUrl(const string &urlPath) const
 {
     Must(hasOptions());
     return theOptions->transferKind(urlPath) != ICAPOptions::xferIgnore;
 }
 
-bool ICAPServiceRep::wantsPreview(const String &urlPath, size_t &wantedSize) const
+bool ICAPServiceRep::wantsPreview(const string &urlPath, size_t &wantedSize) const
 {
     Must(hasOptions());
 
@@ -361,7 +361,7 @@
 
     if (!theOptions->methods.empty()) {
         bool method_found = false;
-        String method_list;
+        string method_list;
         Vector <ICAP::Method>::iterator iter = theOptions->methods.begin();
 
         while (iter != theOptions->methods.end()) {
@@ -379,8 +379,8 @@
         if (!method_found) {
             debugs(93,1, "WARNING: Squid is configured to use ICAP method " <<
                    ICAP::methodStr(method) <<
-                   " for service " << uri.buf() <<
-                   " but OPTIONS response declares the methods are " << method_list.buf());
+                   " for service " << uri <<
+                   " but OPTIONS response declares the methods are " << method_list);
         }
     }
 
@@ -393,7 +393,7 @@
         // TODO: If skew is negative, the option will be considered down
         // because of stale options. We should probably change this.
         debugs(93, 1, "ICAP service's clock is skewed by " << skew <<
-            " seconds: " << uri.buf());
+            " seconds: " << uri);
     }
 }
 
Index: squid3/src/ICAP/ICAPServiceRep.h
diff -u squid3/src/ICAP/ICAPServiceRep.h:1.7 squid3/src/ICAP/ICAPServiceRep.h:1.6.4.2
--- squid3/src/ICAP/ICAPServiceRep.h:1.7	Tue May  8 09:51:28 2007
+++ squid3/src/ICAP/ICAPServiceRep.h	Tue May  8 23:59:37 2007
@@ -91,22 +91,22 @@
     void callWhenReady(Callback *cb, void *data);
 
     // the methods below can only be called on an up() service
-    bool wantsUrl(const String &urlPath) const;
-    bool wantsPreview(const String &urlPath, size_t &wantedSize) const;
+    bool wantsUrl(const string &urlPath) const;
+    bool wantsPreview(const string &urlPath, size_t &wantedSize) const;
     bool allows204() const;
 
     void noteFailure(); // called by transactions to report service failure
 
 public:
-    String key;
+    string key;
     ICAP::Method method;
     ICAP::VectPoint point;
-    String uri;    // service URI
+    string uri;    // service URI
 
     // URI components
-    String host;
+    string host;
     int port;
-    String resource;
+    string resource;
 
     // XXX: use it when selecting a service and handling ICAP errors!
     bool bypass;
Index: squid3/src/ICAP/ICAPXaction.cc
diff -u squid3/src/ICAP/ICAPXaction.cc:1.15 squid3/src/ICAP/ICAPXaction.cc:1.12.2.4
--- squid3/src/ICAP/ICAPXaction.cc:1.15	Tue May  8 09:51:28 2007
+++ squid3/src/ICAP/ICAPXaction.cc	Tue May  8 23:59:38 2007
@@ -122,13 +122,19 @@
         disableRetries(); // we only retry pconn failures
     }
 
+<<<<<<< ICAPXaction.cc
+    if (connection < 0) {
+        connection = comm_open(SOCK_STREAM, 0, getOutgoingAddr(NULL), 0,
+                               COMM_NONBLOCKING, s.uri.c_str());
+=======
     connection = comm_open(SOCK_STREAM, 0, getOutgoingAddr(NULL), 0,
         COMM_NONBLOCKING, s.uri.buf());
+>>>>>>> 1.15
 
     if (connection < 0)
         dieOnConnectionFailure(); // throws
 
-    debugs(93,3, typeName << " opens connection to " << s.host.buf() << ":" << s.port);
+    debugs(93,3, typeName << " opens connection to " << s.host << ":" << s.port);
 
     commSetTimeout(connection, Config.Timeout.connect,
                    &ICAPXaction_noteCommTimedout, this);
@@ -137,7 +143,7 @@
     comm_add_close_handler(connection, closer, this);
 
     connector = &ICAPXaction_noteCommConnected;
-    commConnectStart(connection, s.host.buf(), s.port, connector, this);
+    commConnectStart(connection, s.host.c_str(), s.port, connector, this);
 }
 
 /*
@@ -171,8 +177,12 @@
         if (reuseConnection) {
             debugs(93,3, HERE << "pushing pconn" << status());
             commSetTimeout(connection, -1, NULL, NULL);
+<<<<<<< ICAPXaction.cc
+            icapPconnPool->push(connection, theService->host.c_str(), theService->port, NULL, NULL);
+=======
             icapPconnPool->push(connection, theService->host.buf(), theService->port, NULL, NULL);
             disableRetries();
+>>>>>>> 1.15
         } else {
             debugs(93,3, HERE << "closing pconn" << status());
             // comm_close will clear timeout
@@ -247,7 +257,7 @@
 
 void ICAPXaction::handleCommTimedout()
 {
-    debugs(93, 0, HERE << "ICAP FD " << connection << " timeout to " << theService->methodStr() << " " << theService->uri.buf());
+    debugs(93, 0, HERE << "ICAP FD " << connection << " timeout to " << theService->methodStr() << " " << theService->uri);
     reuseConnection = false;
     MemBuf mb;
     mb.init();
Index: squid3/src/auth/digest/auth_digest.cc
diff -u squid3/src/auth/digest/auth_digest.cc:1.32 squid3/src/auth/digest/auth_digest.cc:1.29.4.5
--- squid3/src/auth/digest/auth_digest.cc:1.32	Mon May  7 11:51:34 2007
+++ squid3/src/auth/digest/auth_digest.cc	Tue May  8 05:40:14 2007
@@ -204,7 +204,7 @@
         digest_nonce_pool = memPoolCreate("Digest Scheme nonce's", sizeof(digest_nonce_h));
 
     if (!digest_nonce_cache) {
-        digest_nonce_cache = hash_create((HASHCMP *) strcmp, 7921, hash_string);
+        digest_nonce_cache = hash_create((HASHCMP *) std::strcmp, 7921, hash_string);
         assert(digest_nonce_cache);
         eventAdd("Digest none cache maintenance", authenticateDigestNonceCacheCleanup, NULL, digestConfig.nonceGCInterval, 1);
     }
@@ -1091,7 +1091,7 @@
     while (xisspace(*proxy_auth))
         proxy_auth++;
 
-    String temp(proxy_auth);
+    string temp(proxy_auth);
 
     while (strListGetItem(&temp, ',', &item, &ilen, &pos)) {
         if ((p = strchr(item, '=')) && (p - item < ilen))
@@ -1207,7 +1207,7 @@
         }
     }
 
-    temp.clean();
+    temp.clear();
 
 
     /* now we validate the data given to us */
Index: squid3/src/auth/negotiate/auth_negotiate.cc
diff -u squid3/src/auth/negotiate/auth_negotiate.cc:1.13 squid3/src/auth/negotiate/auth_negotiate.cc:1.11.4.3
--- squid3/src/auth/negotiate/auth_negotiate.cc:1.13	Mon May  7 11:51:34 2007
+++ squid3/src/auth/negotiate/auth_negotiate.cc	Tue May  8 05:40:14 2007
@@ -179,7 +179,7 @@
             negotiateauthenticators = helperStatefulCreate("negotiateauthenticator");
 
         if (!proxy_auth_cache)
-            proxy_auth_cache = hash_create((HASHCMP *) strcmp, 7921, hash_string);
+            proxy_auth_cache = hash_create((HASHCMP *) std::strcmp, 7921, hash_string);
 
         assert(proxy_auth_cache);
 
Index: squid3/src/auth/ntlm/auth_ntlm.cc
diff -u squid3/src/auth/ntlm/auth_ntlm.cc:1.35 squid3/src/auth/ntlm/auth_ntlm.cc:1.33.4.3
--- squid3/src/auth/ntlm/auth_ntlm.cc:1.35	Mon May  7 11:51:34 2007
+++ squid3/src/auth/ntlm/auth_ntlm.cc	Tue May  8 05:40:14 2007
@@ -180,7 +180,7 @@
             ntlmauthenticators = helperStatefulCreate("ntlmauthenticator");
 
         if (!proxy_auth_cache)
-            proxy_auth_cache = hash_create((HASHCMP *) strcmp, 7921, hash_string);
+            proxy_auth_cache = hash_create((HASHCMP *) std::strcmp, 7921, hash_string);
 
         assert(proxy_auth_cache);
 
Index: squid3/src/fs/coss/CossSwapDir.h
diff -u squid3/src/fs/coss/CossSwapDir.h:1.6 squid3/src/fs/coss/CossSwapDir.h:1.6.8.1
--- squid3/src/fs/coss/CossSwapDir.h:1.6	Mon May 22 17:45:42 2006
+++ squid3/src/fs/coss/CossSwapDir.h	Wed May  2 05:53:05 2007
@@ -36,7 +36,7 @@
     virtual void create();
     virtual void dump(StoreEntry &)const;
     ~CossSwapDir();
-    virtual StoreSearch *search(String const url, HttpRequest *);
+    virtual StoreSearch *search(string const url, HttpRequest *);
     virtual void unlink (StoreEntry &);
     virtual void statfs (StoreEntry &)const;
     virtual int canStore(StoreEntry const &)const;
Index: squid3/src/fs/coss/store_dir_coss.cc
diff -u squid3/src/fs/coss/store_dir_coss.cc:1.35 squid3/src/fs/coss/store_dir_coss.cc:1.30.4.3
--- squid3/src/fs/coss/store_dir_coss.cc:1.35	Mon Apr 30 10:51:42 2007
+++ squid3/src/fs/coss/store_dir_coss.cc	Thu May  3 06:37:08 2007
@@ -1170,7 +1170,7 @@
 }
 
 StoreSearch *
-CossSwapDir::search(String const url, HttpRequest *)
+CossSwapDir::search(string const url, HttpRequest *)
 {
     if (url.size())
         fatal ("Cannot search by url yet\n");
@@ -1182,9 +1182,9 @@
 CossSwapDir::stripePath() const
 {
     if (!stripe_path) {
-        String result = path;
+        string result = path;
         result.append("/stripe");
-        const_cast<CossSwapDir *>(this)->stripe_path = xstrdup(result.buf());
+        const_cast<CossSwapDir *>(this)->stripe_path = xstrdup(result.c_str());
     }
 
     return stripe_path;
Index: squid3/src/fs/null/store_null.cc
diff -u squid3/src/fs/null/store_null.cc:1.9 squid3/src/fs/null/store_null.cc:1.9.4.1
--- squid3/src/fs/null/store_null.cc:1.9	Sun Oct  8 06:51:47 2006
+++ squid3/src/fs/null/store_null.cc	Thu May  3 08:11:27 2007
@@ -103,7 +103,7 @@
 }
 
 StoreSearch *
-NullSwapDir::search(String const url, HttpRequest *)
+NullSwapDir::search(string const url, HttpRequest *)
 {
     if (url.size())
         fatal ("Cannot search by url yet\n");
Index: squid3/src/fs/null/store_null.h
diff -u squid3/src/fs/null/store_null.h:1.3 squid3/src/fs/null/store_null.h:1.3.8.1
--- squid3/src/fs/null/store_null.h:1.3	Mon May 22 17:49:27 2006
+++ squid3/src/fs/null/store_null.h	Thu May  3 08:11:27 2007
@@ -49,7 +49,7 @@
     virtual StoreIOState::Pointer openStoreIO(StoreEntry &, StoreIOState::STFNCB *, StoreIOState::STIOCB *, void *);
     virtual void parse(int, char*);
     virtual void reconfigure (int, char *);
-    virtual StoreSearch *search(String const url, HttpRequest *);
+    virtual StoreSearch *search(string const url, HttpRequest *);
 };
 
 class StoreSearchNull : public StoreSearch
Index: squid3/src/fs/ufs/store_dir_ufs.cc
diff -u squid3/src/fs/ufs/store_dir_ufs.cc:1.31 squid3/src/fs/ufs/store_dir_ufs.cc:1.28.4.3
--- squid3/src/fs/ufs/store_dir_ufs.cc:1.31	Mon Apr 30 10:51:42 2007
+++ squid3/src/fs/ufs/store_dir_ufs.cc	Tue May  1 09:09:29 2007
@@ -1348,7 +1348,7 @@
 }
 
 StoreSearch *
-UFSSwapDir::search(String const url, HttpRequest *request)
+UFSSwapDir::search(string const url, HttpRequest *request)
 {
     if (url.size())
         fatal ("Cannot search by url yet\n");
Index: squid3/src/fs/ufs/ufscommon.h
diff -u squid3/src/fs/ufs/ufscommon.h:1.9 squid3/src/fs/ufs/ufscommon.h:1.9.4.1
--- squid3/src/fs/ufs/ufscommon.h:1.9	Wed Sep 13 18:50:33 2006
+++ squid3/src/fs/ufs/ufscommon.h	Tue May  1 09:09:29 2007
@@ -63,7 +63,7 @@
     virtual void create();
     virtual void dump(StoreEntry &) const;
     ~UFSSwapDir();
-    virtual StoreSearch *search(String const url, HttpRequest *);
+    virtual StoreSearch *search(string const url, HttpRequest *);
     virtual bool doubleCheck(StoreEntry &);
     virtual void unlink(StoreEntry &);
     virtual void statfs(StoreEntry &)const;
Index: squid3/src/tests/CapturingStoreEntry.h
diff -u squid3/src/tests/CapturingStoreEntry.h:1.1 squid3/src/tests/CapturingStoreEntry.h:1.1.16.1
--- squid3/src/tests/CapturingStoreEntry.h:1.1	Sun Aug  6 19:51:15 2006
+++ squid3/src/tests/CapturingStoreEntry.h	Wed May  2 05:53:06 2007
@@ -14,7 +14,7 @@
 
     CapturingStoreEntry() : _buffer_calls(0), _flush_calls(0) {}
 
-    String _appended_text;
+    string _appended_text;
     int _buffer_calls;
     int _flush_calls;
 
Index: squid3/src/tests/TestSwapDir.cc
diff -u squid3/src/tests/TestSwapDir.cc:1.3 squid3/src/tests/TestSwapDir.cc:1.3.8.1
--- squid3/src/tests/TestSwapDir.cc:1.3	Fri May 26 17:50:33 2006
+++ squid3/src/tests/TestSwapDir.cc	Thu May  3 06:37:09 2007
@@ -46,7 +46,7 @@
 {}
 
 StoreSearch *
-TestSwapDir::search(String, HttpRequest *)
+TestSwapDir::search(string, HttpRequest *)
 {
     return NULL;
 }
Index: squid3/src/tests/TestSwapDir.h
diff -u squid3/src/tests/TestSwapDir.h:1.4 squid3/src/tests/TestSwapDir.h:1.4.8.1
--- squid3/src/tests/TestSwapDir.h:1.4	Fri May 26 17:50:33 2006
+++ squid3/src/tests/TestSwapDir.h	Thu May  3 06:37:09 2007
@@ -21,7 +21,7 @@
     virtual StoreIOState::Pointer createStoreIO(StoreEntry &, StoreIOState::STFNCB *, StoreIOState::STIOCB *, void *);
     virtual StoreIOState::Pointer openStoreIO(StoreEntry &, StoreIOState::STFNCB *, StoreIOState::STIOCB *, void *);
     virtual void parse(int, char*);
-    virtual StoreSearch *search(String, HttpRequest *);
+    virtual StoreSearch *search(string, HttpRequest *);
 };
 
 typedef RefCount<TestSwapDir> TestSwapDirPointer;
Index: squid3/src/tests/testCacheManager.cc
diff -u squid3/src/tests/testCacheManager.cc:1.1 squid3/src/tests/testCacheManager.cc:1.1.16.1
--- squid3/src/tests/testCacheManager.cc:1.1	Sun May 28 17:50:19 2006
+++ squid3/src/tests/testCacheManager.cc	Wed May  2 05:53:06 2007
@@ -47,8 +47,8 @@
     CacheManager manager;
     manager.registerAction("sample", "my sample", &dummy_action, false, false);
     CacheManagerAction *anAction = manager.findAction("sample");
-    CPPUNIT_ASSERT_EQUAL(String("sample"), String(anAction->action));
-    CPPUNIT_ASSERT_EQUAL(String("my sample"), String(anAction->desc));
+    CPPUNIT_ASSERT_EQUAL( (string)"sample", (string)anAction->action );
+    CPPUNIT_ASSERT_EQUAL( (string)"my sample", (string)anAction->desc );
     CPPUNIT_ASSERT_EQUAL(&dummy_action, anAction->handler);
     CPPUNIT_ASSERT_EQUAL(0, (int)anAction->flags.pw_req);
     CPPUNIT_ASSERT_EQUAL(0, (int)anAction->flags.atomic);
Index: squid3/src/tests/testEvent.cc
diff -u squid3/src/tests/testEvent.cc:1.3 squid3/src/tests/testEvent.cc:1.3.14.1
--- squid3/src/tests/testEvent.cc:1.3	Sun Aug 20 18:51:51 2006
+++ squid3/src/tests/testEvent.cc	Wed May  2 05:53:06 2007
@@ -104,13 +104,12 @@
     scheduler.schedule("test event", CalledEvent::Handler, &event, 0, 0, false);
     scheduler.schedule("test event2", CalledEvent::Handler, &event2, 0, 0, false);
     scheduler.dump(anEntry);
-    CPPUNIT_ASSERT_EQUAL(String(
-                             "Last event to run: last event\n"
+    string expect =          "Last event to run: last event\n"
                              "\n"
                              "Operation\tNext Execution\tWeight\tCallback Valid?\n"
                              "test event\t0.000000 seconds\t0\tN/A\n"
-                             "test event2\t0.000000 seconds\t0\tN/A\n"
-                         ), anEntry->_appended_text);
+                             "test event2\t0.000000 seconds\t0\tN/A\n";
+    CPPUNIT_ASSERT_EQUAL( expect, anEntry->_appended_text);
     delete anEntry;
 }
 
Index: squid3/src/tests/testHttpRequest.cc
diff -u squid3/src/tests/testHttpRequest.cc:1.1 squid3/src/tests/testHttpRequest.cc:1.1.18.1
--- squid3/src/tests/testHttpRequest.cc:1.1	Wed May  3 07:50:43 2006
+++ squid3/src/tests/testHttpRequest.cc	Thu May  3 06:37:09 2007
@@ -38,10 +38,10 @@
     HttpRequest *nullRequest = NULL;
     CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
     CPPUNIT_ASSERT_EQUAL(METHOD_GET, aRequest->method);
-    CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->host));
-    CPPUNIT_ASSERT_EQUAL(String("/bar"), aRequest->urlpath);
+    CPPUNIT_ASSERT_EQUAL((string)"foo", (string)aRequest->host);
+    CPPUNIT_ASSERT_EQUAL((string)"/bar", aRequest->urlpath);
     CPPUNIT_ASSERT_EQUAL(PROTO_HTTP, aRequest->protocol);
-    CPPUNIT_ASSERT_EQUAL(String("http://foo:90/bar"), String(url));
+    CPPUNIT_ASSERT_EQUAL((string)"http://foo:90/bar", (string)url);
     xfree(url);
     /* vanilla url, different method */
     url = xstrdup("http://foo/bar");
@@ -49,10 +49,10 @@
     expected_port = 80;
     CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
     CPPUNIT_ASSERT_EQUAL(METHOD_PUT, aRequest->method);
-    CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->host));
-    CPPUNIT_ASSERT_EQUAL(String("/bar"), aRequest->urlpath);
+    CPPUNIT_ASSERT_EQUAL((string)"foo", (string)aRequest->host);
+    CPPUNIT_ASSERT_EQUAL((string)"/bar", aRequest->urlpath);
     CPPUNIT_ASSERT_EQUAL(PROTO_HTTP, aRequest->protocol);
-    CPPUNIT_ASSERT_EQUAL(String("http://foo/bar"), String(url));
+    CPPUNIT_ASSERT_EQUAL((string)"http://foo/bar", (string)url);
     /* a connect url with non-CONNECT data */
     url = xstrdup(":foo/bar");
     aRequest = HttpRequest::CreateFromUrlAndMethod(url, METHOD_CONNECT);
@@ -64,10 +64,10 @@
     expected_port = 45;
     CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
     CPPUNIT_ASSERT_EQUAL(METHOD_CONNECT, aRequest->method);
-    CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->host));
-    CPPUNIT_ASSERT_EQUAL(String(""), aRequest->urlpath);
+    CPPUNIT_ASSERT_EQUAL((string)"foo", (string)aRequest->host);
+    CPPUNIT_ASSERT_EQUAL((string)"", aRequest->urlpath);
     CPPUNIT_ASSERT_EQUAL(PROTO_NONE, aRequest->protocol);
-    CPPUNIT_ASSERT_EQUAL(String("foo:45"), String(url));
+    CPPUNIT_ASSERT_EQUAL((string)"foo:45", (string)url);
     xfree(url);
 }
 
@@ -84,9 +84,9 @@
     expected_port = 90;
     CPPUNIT_ASSERT_EQUAL(expected_port, aRequest->port);
     CPPUNIT_ASSERT_EQUAL(METHOD_GET, aRequest->method);
-    CPPUNIT_ASSERT_EQUAL(String("foo"), String(aRequest->host));
-    CPPUNIT_ASSERT_EQUAL(String("/bar"), aRequest->urlpath);
+    CPPUNIT_ASSERT_EQUAL((string)"foo", (string)aRequest->host);
+    CPPUNIT_ASSERT_EQUAL((string)"/bar", aRequest->urlpath);
     CPPUNIT_ASSERT_EQUAL(PROTO_HTTP, aRequest->protocol);
-    CPPUNIT_ASSERT_EQUAL(String("http://foo:90/bar"), String(url));
+    CPPUNIT_ASSERT_EQUAL((string)"http://foo:90/bar", (string)url);
     xfree(url);
 }
Index: squid3/src/tests/testHttpRequestMethod.cc
diff -u squid3/src/tests/testHttpRequestMethod.cc:1.2 squid3/src/tests/testHttpRequestMethod.cc:1.2.8.1
--- squid3/src/tests/testHttpRequestMethod.cc:1.2	Fri Sep  1 21:50:30 2006
+++ squid3/src/tests/testHttpRequestMethod.cc	Thu May  3 06:37:09 2007
@@ -79,7 +79,7 @@
 void
 testHttpRequestMethod::testConst_str()
 {
-    CPPUNIT_ASSERT_EQUAL(String("POST"), String(HttpRequestMethod("post").const_str()));
+    CPPUNIT_ASSERT_EQUAL((string)"POST", (string)HttpRequestMethod("post").const_str());
 }
 
 /*
@@ -115,5 +115,5 @@
 {
     std::ostringstream buffer;
     buffer << HttpRequestMethod("get");
-    CPPUNIT_ASSERT_EQUAL(String("GET"), String(buffer.str().c_str()));
+    CPPUNIT_ASSERT_EQUAL((string)"GET", (string)buffer.str().c_str() );
 }
Index: squid3/src/tests/testStore.cc
diff -u squid3/src/tests/testStore.cc:1.4 squid3/src/tests/testStore.cc:1.4.8.1
--- squid3/src/tests/testStore.cc:1.4	Wed May  3 07:50:43 2006
+++ squid3/src/tests/testStore.cc	Thu May  3 06:37:09 2007
@@ -21,7 +21,7 @@
 void
 
 TestStore::get
-    (String, void (*)(StoreEntry*, void*), void*)
+    (string, void (*)(StoreEntry*, void*), void*)
 {}
 
 void
@@ -48,7 +48,7 @@
 }
 
 StoreSearch *
-TestStore::search(String const url, HttpRequest *)
+TestStore::search(string const url, HttpRequest *)
 {
     return NULL;
 }
Index: squid3/src/tests/testStore.h
diff -u squid3/src/tests/testStore.h:1.2 squid3/src/tests/testStore.h:1.2.8.1
--- squid3/src/tests/testStore.h:1.2	Wed May  3 07:50:43 2006
+++ squid3/src/tests/testStore.h	Thu May  3 06:37:09 2007
@@ -49,7 +49,7 @@
         (const cache_key*);
 
     virtual void get
-        (String, void (*)(StoreEntry*, void*), void*);
+        (string, void (*)(StoreEntry*, void*), void*);
 
     virtual void init();
 
@@ -67,7 +67,7 @@
 
     virtual void updateSize(size_t size, int sign) {}
 
-    virtual StoreSearch *search(String const url, HttpRequest *);
+    virtual StoreSearch *search(string const url, HttpRequest *);
 };
 
 typedef RefCount<TestStore> TestStorePointer;
Index: squid3/src/tests/testStoreController.cc
diff -u squid3/src/tests/testStoreController.cc:1.5 squid3/src/tests/testStoreController.cc:1.4.8.2
--- squid3/src/tests/testStoreController.cc:1.5	Sat Apr 21 00:52:56 2007
+++ squid3/src/tests/testStoreController.cc	Thu May  3 06:37:09 2007
@@ -78,10 +78,9 @@
 static StoreEntry *
 addedEntry(StorePointer hashStore,
            StorePointer aStore,
-           String name,
-           String varySpec,
-           String varyKey
-
+           string name,
+           string varySpec,
+           string varyKey
           )
 {
     StoreEntry *e = new StoreEntry();
@@ -109,7 +108,7 @@
     EBIT_CLR(e->flags, KEY_PRIVATE);
     e->ping_status = PING_NONE;
     EBIT_CLR(e->flags, ENTRY_VALIDATED);
-    e->hashInsert((const cache_key *)name.buf());	/* do it after we clear KEY_PRIVATE */
+    e->hashInsert((const cache_key *)name.c_str());	/* do it after we clear KEY_PRIVATE */
     return e;
 }
 
Index: squid3/src/tests/testStoreEntryStream.cc
diff -u squid3/src/tests/testStoreEntryStream.cc:1.2 squid3/src/tests/testStoreEntryStream.cc:1.2.12.2
--- squid3/src/tests/testStoreEntryStream.cc:1.2	Sun Aug  6 19:51:16 2006
+++ squid3/src/tests/testStoreEntryStream.cc	Sat May  5 07:33:55 2007
@@ -39,7 +39,7 @@
         stream.flush();
         CPPUNIT_ASSERT_EQUAL(1, anEntry->_buffer_calls);
         CPPUNIT_ASSERT_EQUAL(1, anEntry->_flush_calls);
-        CPPUNIT_ASSERT_EQUAL(String("some text   !"), anEntry->_appended_text);
+        CPPUNIT_ASSERT_EQUAL((string)"some text   !", (string)anEntry->_appended_text);
     }
 
     delete anEntry;
Index: squid3/src/tests/testStoreHashIndex.cc
diff -u squid3/src/tests/testStoreHashIndex.cc:1.4 squid3/src/tests/testStoreHashIndex.cc:1.3.8.2
--- squid3/src/tests/testStoreHashIndex.cc:1.4	Sat Apr 21 00:52:56 2007
+++ squid3/src/tests/testStoreHashIndex.cc	Thu May  3 06:37:09 2007
@@ -59,9 +59,9 @@
 StoreEntry *
 addedEntry(StorePointer hashStore,
            StorePointer aStore,
-           String name,
-           String varySpec,
-           String varyKey
+           string name,
+           string varySpec,
+           string varyKey
 
           )
 {
@@ -90,7 +90,7 @@
     EBIT_CLR(e->flags, KEY_PRIVATE);
     e->ping_status = PING_NONE;
     EBIT_CLR(e->flags, ENTRY_VALIDATED);
-    e->hashInsert((const cache_key *)name.buf());	/* do it after we clear KEY_PRIVATE */
+    e->hashInsert((const cache_key *)name.c_str());	/* do it after we clear KEY_PRIVATE */
     return e;
 }
 
Index: squid3/src/tests/testString.cc
diff -u squid3/src/tests/testString.cc:1.2 squid3/src/tests/testString.cc:1.2.12.2
--- squid3/src/tests/testString.cc:1.2	Sun Aug  6 19:51:16 2006
+++ squid3/src/tests/testString.cc	Sat May  5 20:18:15 2007
@@ -21,41 +21,168 @@
 static Initer ensure_mempools;
 
 void
+testString::testDefaults()
+{
+    string aStr;
+
+    /* check this reports as empty */
+    CPPUNIT_ASSERT( aStr.empty() );
+    CPPUNIT_ASSERT_EQUAL( (const char*)NULL, aStr.c_str() );
+    CPPUNIT_ASSERT_EQUAL( 0, aStr.size() );
+
+    string bStr("foo bar");
+
+    /* check copy constructor */
+    CPPUNIT_ASSERT( !bStr.empty() );
+    CPPUNIT_ASSERT_EQUAL( 7, bStr.size() );
+    CPPUNIT_ASSERT( NULL != bStr.c_str() );
+    CPPUNIT_ASSERT( memcmp(bStr.c_str(), "foo bar", 8) == 0 );
+}
+
+void
+testString::testBooleans()
+{
+    const string smStr("bar");
+    const string bgStr("foo");
+    const string eqStr("foo");
+    const string nqStr("food");
+
+   /* mathematical boolean operators */
+   CPPUNIT_ASSERT(!(bgStr == smStr ));
+   CPPUNIT_ASSERT(  bgStr != smStr );
+   CPPUNIT_ASSERT(  bgStr >  smStr );
+   CPPUNIT_ASSERT(!(bgStr <  smStr ));
+   CPPUNIT_ASSERT(  bgStr >= smStr );
+   CPPUNIT_ASSERT(!(bgStr <= smStr ));
+
+   /* reverse order to catch corners */
+   CPPUNIT_ASSERT(!(smStr == bgStr ));
+   CPPUNIT_ASSERT(  smStr != bgStr );
+   CPPUNIT_ASSERT(!(smStr >  bgStr ));
+   CPPUNIT_ASSERT(  smStr <  bgStr );
+   CPPUNIT_ASSERT(!(smStr >= bgStr ));
+   CPPUNIT_ASSERT(  smStr <= bgStr );
+
+   /* check identical to catch corners */
+   CPPUNIT_ASSERT(  bgStr == eqStr );
+   CPPUNIT_ASSERT(!(bgStr != eqStr ));
+   CPPUNIT_ASSERT(!(bgStr >  eqStr ));
+   CPPUNIT_ASSERT(!(bgStr <  eqStr ));
+   CPPUNIT_ASSERT(  bgStr >= eqStr );
+   CPPUNIT_ASSERT(  bgStr <= eqStr );
+
+   /* check _almost_ identical to catch corners */
+   CPPUNIT_ASSERT(!(bgStr == nqStr ));
+   CPPUNIT_ASSERT(  bgStr != nqStr );
+   CPPUNIT_ASSERT(!(bgStr >  nqStr ));
+   CPPUNIT_ASSERT(  bgStr <  nqStr );
+   CPPUNIT_ASSERT(!(bgStr >= nqStr ));
+   CPPUNIT_ASSERT(  bgStr <= nqStr );
+}
+
+void
+testString::testAppend()
+{
+    // FIXME: make tests for this.
+    string aStr("hello");
+
+    aStr.append(" world");
+    CPPUNIT_ASSERT_EQUAL( (string)"hello world", aStr );
+    aStr.append(" howsit", 7);
+    CPPUNIT_ASSERT_EQUAL( (string)"hello world howsit", aStr );
+
+    string bStr;
+    string cStr("hello");
+
+    /* corner cases */
+    bStr.append(NULL, 2);
+    CPPUNIT_ASSERT( bStr.empty() );
+    CPPUNIT_ASSERT_EQUAL( 0, bStr.size() );
+    CPPUNIT_ASSERT_EQUAL( (string)"", bStr );
+
+    bStr.append("hello", 5);
+    CPPUNIT_ASSERT( !bStr.empty() );
+    CPPUNIT_ASSERT_EQUAL( 5, bStr.size() );
+    CPPUNIT_ASSERT_EQUAL( (string)"hello", bStr );
+
+    bStr.append(NULL, 2);
+    CPPUNIT_ASSERT( !bStr.empty() );
+    CPPUNIT_ASSERT_EQUAL( 5, bStr.size() );
+    CPPUNIT_ASSERT_EQUAL( (string)"hello", bStr );
+
+    bStr.append(" world untroubled by things such as null termination", 6);
+    CPPUNIT_ASSERT( !bStr.empty() );
+    CPPUNIT_ASSERT_EQUAL( 11, bStr.size() );
+    CPPUNIT_ASSERT_EQUAL( (string)"hello world", bStr );
+
+    cStr.append(" wo");
+    CPPUNIT_ASSERT( !cStr.empty() );
+    CPPUNIT_ASSERT_EQUAL( 8, cStr.size() );
+    CPPUNIT_ASSERT_EQUAL( (string)"hello wo", cStr );
+
+    cStr.append("rld\0 untroubled by things such as null termination", 10);
+    CPPUNIT_ASSERT( !cStr.empty() );
+    CPPUNIT_ASSERT_EQUAL( 18, cStr.size() );
+    CPPUNIT_ASSERT_EQUAL( (string)"hello world\0 untr", cStr );
+}
+
+void
+testString::testAssignments()
+{
+    // FIXME: make tests for this.
+}
+
+void
+testString::testCstrMethods()
+{
+    // FIXME: make tests for this.
+    // strcmp, strncmp, etc....
+}
+
+void
+testString::testSearch()
+{
+    // FIXME: make tests for this.
+
+// pos, rpos, find, rfind, etc...
+}
+
+void
 testString::testCmpDefault()
 {
-    String left, right;
+    string left, right;
     /* two default strings are equal */
-    CPPUNIT_ASSERT(!left.cmp(right));
-    CPPUNIT_ASSERT(!left.cmp(NULL));
-    CPPUNIT_ASSERT(!left.cmp(NULL, 1));
+    CPPUNIT_ASSERT(!left.compare(right));
+    CPPUNIT_ASSERT(!left.compare(NULL));
+    CPPUNIT_ASSERT(!left.compare(NULL, 1));
 }
 
 void
 testString::testCmpEmptyString()
 {
-    String left("");
-    String right;
+    string left("");
+    string right;
     /* an empty string ("") is equal to a default string */
-    CPPUNIT_ASSERT(!left.cmp(right));
-    CPPUNIT_ASSERT(!left.cmp(NULL));
-    CPPUNIT_ASSERT(!left.cmp(NULL, 1));
+    CPPUNIT_ASSERT(!left.compare(right));
+    CPPUNIT_ASSERT(!left.compare(NULL));
+    CPPUNIT_ASSERT(!left.compare(NULL, 1));
     /* reverse the order to catch corners */
-    CPPUNIT_ASSERT(!right.cmp(left));
-    CPPUNIT_ASSERT(!right.cmp(""));
-    CPPUNIT_ASSERT(!right.cmp("", 1));
+    CPPUNIT_ASSERT(!right.compare(left));
+    CPPUNIT_ASSERT(!right.compare(""));
+    CPPUNIT_ASSERT(!right.compare("", 1));
 }
 
 void
 testString::testCmpNotEmptyDefault()
 {
-    String left("foo");
-    String right;
+    string left("foo");
+    string right;
     /* empty string sorts before everything */
-    CPPUNIT_ASSERT(left.cmp(right) > 0);
-    CPPUNIT_ASSERT(left.cmp(NULL) > 0);
-    CPPUNIT_ASSERT(left.cmp(NULL, 1) > 0);
+    CPPUNIT_ASSERT(left.compare(right) > 0);
+    CPPUNIT_ASSERT(left.compare(NULL) > 0);
+    CPPUNIT_ASSERT(left.compare(NULL, 1) > 0);
     /* reverse for symmetry tests */
-    CPPUNIT_ASSERT(right.cmp(left) < 0);
-    CPPUNIT_ASSERT(right.cmp("foo") < 0);
-    CPPUNIT_ASSERT(right.cmp("foo", 1) < 0);
+    CPPUNIT_ASSERT(right.compare(left) < 0);
+    CPPUNIT_ASSERT(right.compare("foo") < 0);
+    CPPUNIT_ASSERT(right.compare("foo", 1) < 0);
 }
Index: squid3/src/tests/testString.h
diff -u squid3/src/tests/testString.h:1.1 squid3/src/tests/testString.h:1.1.18.1
--- squid3/src/tests/testString.h:1.1	Wed May  3 07:50:43 2006
+++ squid3/src/tests/testString.h	Sat May  5 20:18:16 2007
@@ -11,18 +11,33 @@
 class testString : public CPPUNIT_NS::TestFixture
 {
     CPPUNIT_TEST_SUITE( testString );
+    CPPUNIT_TEST( testDefaults );
+        /* boolean helper tests */
     CPPUNIT_TEST( testCmpDefault );
     CPPUNIT_TEST( testCmpEmptyString );
     CPPUNIT_TEST( testCmpNotEmptyDefault );
+
+    CPPUNIT_TEST( testBooleans );
+    CPPUNIT_TEST( testAppend );
+    CPPUNIT_TEST( testAssignments );
+    CPPUNIT_TEST( testCstrMethods );
+    CPPUNIT_TEST( testSearch );
     CPPUNIT_TEST_SUITE_END();
 
 public:
 
 protected:
+
+    /* std::string API */
+    void testDefaults();
     void testCmpDefault();
     void testCmpEmptyString();
     void testCmpNotEmptyDefault();
+    void testBooleans();
+    void testAppend();
+    void testAssignments();
+    void testCstrMethods();
+    void testSearch();
 };
 
 #endif
-
Index: squid3/src/tests/testURLScheme.cc
diff -u squid3/src/tests/testURLScheme.cc:1.2 squid3/src/tests/testURLScheme.cc:1.2.8.1
--- squid3/src/tests/testURLScheme.cc:1.2	Fri Sep  1 21:50:30 2006
+++ squid3/src/tests/testURLScheme.cc	Thu May  3 06:37:09 2007
@@ -104,9 +104,9 @@
 void
 testURLScheme::testConst_str()
 {
-    String lhs("wais");
+    string lhs("wais");
     URLScheme wais(PROTO_WAIS);
-    String rhs(wais.const_str());
+    string rhs(wais.const_str());
     CPPUNIT_ASSERT_EQUAL(lhs, rhs);
 }
 
@@ -143,7 +143,7 @@
 {
     std::ostringstream buffer;
     buffer << URLScheme(PROTO_HTTP);
-    String http_str("http");
-    String from_buf(buffer.str().c_str());
+    string http_str("http");
+    string from_buf(buffer.str().c_str());
     CPPUNIT_ASSERT_EQUAL(http_str, from_buf);
 }
Index: squid3/src/tests/test_http_range.cc
diff -u squid3/src/tests/test_http_range.cc:1.1 squid3/src/tests/test_http_range.cc:1.1.16.1
--- squid3/src/tests/test_http_range.cc:1.1	Sun May 21 07:50:42 2006
+++ squid3/src/tests/test_http_range.cc	Thu May  3 06:37:09 2007
@@ -56,10 +56,10 @@
     return NULL;
 }
 
-extern String httpHeaderGetList(const HttpHeader * hdr, http_hdr_type id)
+extern string httpHeaderGetList(const HttpHeader * hdr, http_hdr_type id)
 {
     fatal ("dummy function\n");
-    return String();
+    return "";
 }
 
 SQUIDCEXTERN int httpHeaderHas(const HttpHeader * hdr, http_hdr_type type)
@@ -76,7 +76,7 @@
 void
 testRangeParser(char const *rangestring)
 {
-    String aString (rangestring);
+    string aString (rangestring);
     HttpHdrRange *range = HttpHdrRange::ParseCreate (&aString);
 
     if (!range)
@@ -96,7 +96,7 @@
 HttpHdrRange *
 rangeFromString(char const *rangestring)
 {
-    String aString (rangestring);
+    string aString (rangestring);
     HttpHdrRange *range = HttpHdrRange::ParseCreate (&aString);
 
     if (!range)

