Home | History | Annotate | Download | only in flip_server
      1 // Copyright (c) 2010 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef NET_TOOLS_FLIP_SERVER_STRING_PIECE_UTILS_H_
      6 #define NET_TOOLS_FLIP_SERVER_STRING_PIECE_UTILS_H_
      7 #pragma once
      8 
      9 #include <ctype.h>
     10 
     11 #include "base/port.h"
     12 #include "base/string_piece.h"
     13 
     14 namespace net {
     15 
     16 struct StringPieceCaseHash {
     17   size_t operator()(const base::StringPiece& sp) const {
     18     // based on __stl_string_hash in http://www.sgi.com/tech/stl/string
     19     size_t hash_val = 0;
     20     for (base::StringPiece::const_iterator it = sp.begin();
     21          it != sp.end(); ++it) {
     22       hash_val = 5 * hash_val + tolower(*it);
     23     }
     24     return hash_val;
     25   }
     26 };
     27 
     28 struct StringPieceUtils {
     29   static bool EqualIgnoreCase(const base::StringPiece& piece1,
     30                               const base::StringPiece& piece2) {
     31     base::StringPiece::const_iterator p1i = piece1.begin();
     32     base::StringPiece::const_iterator p2i = piece2.begin();
     33     if (piece1.empty() && piece2.empty()) {
     34       return true;
     35     } else if (piece1.size() != piece2.size()) {
     36       return false;
     37     }
     38     while (p1i != piece1.end() && p2i != piece2.begin()) {
     39       if (tolower(*p1i) != tolower(*p2i))
     40         return false;
     41     }
     42     return true;
     43   }
     44 
     45   static void RemoveWhitespaceContext(base::StringPiece* piece1) {
     46     base::StringPiece::const_iterator c = piece1->begin();
     47     base::StringPiece::const_iterator e = piece1->end();
     48     while (c != e && isspace(*c)) {
     49       ++c;
     50     }
     51     if (c == e) {
     52       *piece1 = base::StringPiece(c, e-c);
     53       return;
     54     }
     55     --e;
     56     while (c != e &&isspace(*e)) {
     57       --e;
     58     }
     59     ++e;
     60     *piece1 = base::StringPiece(c, e-c);
     61   }
     62 
     63   static bool StartsWithIgnoreCase(const base::StringPiece& text,
     64                                    const base::StringPiece& starts_with) {
     65     if (text.size() < starts_with.size())
     66       return false;
     67     return EqualIgnoreCase(text.substr(0, starts_with.size()), starts_with);
     68   }
     69 };
     70 struct StringPieceCaseEqual {
     71   bool operator()(const base::StringPiece& piece1,
     72                   const base::StringPiece& piece2) const {
     73     return StringPieceUtils::EqualIgnoreCase(piece1, piece2);
     74   }
     75 };
     76 
     77 
     78 
     79 }  // namespace net
     80 
     81 #endif  // NET_TOOLS_FLIP_SERVER_STRING_PIECE_UTILS_H_
     82 
     83