1 /* 2 * Copyright (C) 2013 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 #include "wtf/testing/WTFTestHelpers.h" 33 34 #include "wtf/text/WTFString.h" 35 #include <ios> // NOLINT 36 #include <ostream> // NOLINT 37 38 namespace WTF { 39 40 std::ostream& operator<<(std::ostream& out, const String& string) 41 { 42 if (string.isNull()) 43 return out << "<null>"; 44 45 out << '"'; 46 for (unsigned index = 0; index < string.length(); ++index) { 47 // Print shorthands for select cases. 48 UChar character = string[index]; 49 switch (character) { 50 case '\t': 51 out << "\\t"; 52 break; 53 case '\n': 54 out << "\\n"; 55 break; 56 case '\r': 57 out << "\\r"; 58 break; 59 case '"': 60 out << "\\\""; 61 break; 62 case '\\': 63 out << "\\\\"; 64 break; 65 default: 66 if (character >= 0x20 && character < 0x7F) { 67 out << static_cast<char>(character); 68 } else { 69 // Print "\uXXXX" for control or non-ASCII characters. 70 out << "\\u"; 71 out.width(4); 72 out.fill('0'); 73 out.setf(std::ios_base::hex, std::ios_base::basefield); 74 out.setf(std::ios::uppercase); 75 out << character; 76 } 77 break; 78 } 79 } 80 return out << '"'; 81 } 82 83 } // namespace WTF 84