Home | History | Annotate | Download | only in dom
      1 /*
      2  * Copyright (C) 2007 David Smith (catfish.man (at) gmail.com)
      3  * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
      4  *
      5  * This library is free software; you can redistribute it and/or
      6  * modify it under the terms of the GNU Library General Public
      7  * License as published by the Free Software Foundation; either
      8  * version 2 of the License, or (at your option) any later version.
      9  *
     10  * This library is distributed in the hope that it will be useful,
     11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13  * Library General Public License for more details.
     14  *
     15  * You should have received a copy of the GNU Library General Public License
     16  * along with this library; see the file COPYING.LIB.  If not, write to
     17  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
     18  * Boston, MA 02111-1307, USA.
     19  */
     20 
     21 #include "config.h"
     22 #include "SpaceSplitString.h"
     23 
     24 #include "HTMLParserIdioms.h"
     25 #include <wtf/ASCIICType.h>
     26 #include <wtf/text/StringBuilder.h>
     27 
     28 using namespace WTF;
     29 
     30 namespace WebCore {
     31 
     32 static bool hasNonASCIIOrUpper(const String& string)
     33 {
     34     const UChar* characters = string.characters();
     35     unsigned length = string.length();
     36     bool hasUpper = false;
     37     UChar ored = 0;
     38     for (unsigned i = 0; i < length; i++) {
     39         UChar c = characters[i];
     40         hasUpper |= isASCIIUpper(c);
     41         ored |= c;
     42     }
     43     return hasUpper || (ored & ~0x7F);
     44 }
     45 
     46 void SpaceSplitStringData::createVector()
     47 {
     48     ASSERT(!m_createdVector);
     49     ASSERT(m_vector.isEmpty());
     50 
     51     if (m_shouldFoldCase && hasNonASCIIOrUpper(m_string))
     52         m_string = m_string.foldCase();
     53 
     54     const UChar* characters = m_string.characters();
     55     unsigned length = m_string.length();
     56     unsigned start = 0;
     57     while (true) {
     58         while (start < length && isHTMLSpace(characters[start]))
     59             ++start;
     60         if (start >= length)
     61             break;
     62         unsigned end = start + 1;
     63         while (end < length && isNotHTMLSpace(characters[end]))
     64             ++end;
     65 
     66         m_vector.append(AtomicString(characters + start, end - start));
     67 
     68         start = end + 1;
     69     }
     70 
     71     m_string = String();
     72     m_createdVector = true;
     73 }
     74 
     75 bool SpaceSplitStringData::containsAll(SpaceSplitStringData& other)
     76 {
     77     ensureVector();
     78     other.ensureVector();
     79     size_t thisSize = m_vector.size();
     80     size_t otherSize = other.m_vector.size();
     81     for (size_t i = 0; i < otherSize; ++i) {
     82         const AtomicString& name = other.m_vector[i];
     83         size_t j;
     84         for (j = 0; j < thisSize; ++j) {
     85             if (m_vector[j] == name)
     86                 break;
     87         }
     88         if (j == thisSize)
     89             return false;
     90     }
     91     return true;
     92 }
     93 
     94 void SpaceSplitStringData::add(const AtomicString& string)
     95 {
     96     if (contains(string))
     97         return;
     98 
     99     m_vector.append(string);
    100 }
    101 
    102 void SpaceSplitStringData::remove(const AtomicString& string)
    103 {
    104     ensureVector();
    105 
    106     size_t position = 0;
    107     while (position < m_vector.size()) {
    108         if (m_vector[position] == string)
    109             m_vector.remove(position);
    110         else
    111             ++position;
    112     }
    113 }
    114 
    115 void SpaceSplitString::add(const AtomicString& string)
    116 {
    117     if (m_data)
    118         m_data->add(string);
    119 }
    120 
    121 void SpaceSplitString::remove(const AtomicString& string)
    122 {
    123     if (m_data)
    124         m_data->remove(string);
    125 }
    126 
    127 } // namespace WebCore
    128