• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2005, 2006, 2008 Apple Inc. All rights reserved.
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Library General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Library General Public License for more details.
13  *
14  * You should have received a copy of the GNU Library General Public License
15  * along with this library; see the file COPYING.LIB.  If not, write to
16  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17  * Boston, MA 02110-1301, USA.
18  *
19  */
20 
21 #include "config.h"
22 #include "FormDataList.h"
23 
24 namespace WebCore {
25 
FormDataList(const TextEncoding & c)26 FormDataList::FormDataList(const TextEncoding& c)
27     : m_encoding(c)
28 {
29 }
30 
appendString(const CString & s)31 void FormDataList::appendString(const CString& s)
32 {
33     m_list.append(s);
34 }
35 
36 // Change plain CR and plain LF to CRLF pairs.
fixLineBreaks(const CString & s)37 static CString fixLineBreaks(const CString& s)
38 {
39     // Compute the length.
40     unsigned newLen = 0;
41     const char* p = s.data();
42     while (char c = *p++) {
43         if (c == '\r') {
44             // Safe to look ahead because of trailing '\0'.
45             if (*p != '\n') {
46                 // Turn CR into CRLF.
47                 newLen += 2;
48             }
49         } else if (c == '\n') {
50             // Turn LF into CRLF.
51             newLen += 2;
52         } else {
53             // Leave other characters alone.
54             newLen += 1;
55         }
56     }
57     if (newLen == s.length()) {
58         return s;
59     }
60 
61     // Make a copy of the string.
62     p = s.data();
63     char* q;
64     CString result = CString::newUninitialized(newLen, q);
65     while (char c = *p++) {
66         if (c == '\r') {
67             // Safe to look ahead because of trailing '\0'.
68             if (*p != '\n') {
69                 // Turn CR into CRLF.
70                 *q++ = '\r';
71                 *q++ = '\n';
72             }
73         } else if (c == '\n') {
74             // Turn LF into CRLF.
75             *q++ = '\r';
76             *q++ = '\n';
77         } else {
78             // Leave other characters alone.
79             *q++ = c;
80         }
81     }
82     return result;
83 }
84 
appendString(const String & s)85 void FormDataList::appendString(const String& s)
86 {
87     CString cstr = fixLineBreaks(m_encoding.encode(s.characters(), s.length(), EntitiesForUnencodables));
88     m_list.append(cstr);
89 }
90 
91 } // namespace
92