1 //===----------------------------------------------------------------------===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 // UNSUPPORTED: c++03, c++11 10 // UNSUPPORTED: libcpp-has-no-localization 11 12 // <iomanip> 13 14 // quoted 15 16 #include <iomanip> 17 #include <sstream> 18 #include <string_view> 19 #include <cassert> 20 21 #include "test_macros.h" 22 23 bool is_skipws ( const std::istream *is ) { 24 return ( is->flags() & std::ios_base::skipws ) != 0; 25 } 26 27 28 bool is_skipws ( const std::wistream *is ) { 29 return ( is->flags() & std::ios_base::skipws ) != 0; 30 } 31 32 void round_trip ( const char *p ) { 33 std::stringstream ss; 34 bool skippingws = is_skipws ( &ss ); 35 std::string_view sv {p}; 36 37 ss << std::quoted(sv); 38 std::string s; 39 ss >> std::quoted(s); 40 assert ( s == sv ); 41 assert ( skippingws == is_skipws ( &ss )); 42 } 43 44 void round_trip_ws ( const char *p ) { 45 std::stringstream ss; 46 std::noskipws ( ss ); 47 bool skippingws = is_skipws ( &ss ); 48 std::string_view sv {p}; 49 50 ss << std::quoted(sv); 51 std::string s; 52 ss >> std::quoted(s); 53 assert ( s == sv ); 54 assert ( skippingws == is_skipws ( &ss )); 55 } 56 57 void round_trip_d ( const char *p, char delim ) { 58 std::stringstream ss; 59 std::string_view sv {p}; 60 61 ss << std::quoted(sv, delim); 62 std::string s; 63 ss >> std::quoted(s, delim); 64 assert ( s == sv ); 65 } 66 67 void round_trip_e ( const char *p, char escape ) { 68 std::stringstream ss; 69 std::string_view sv {p}; 70 71 ss << std::quoted(sv, '"', escape ); 72 std::string s; 73 ss >> std::quoted(s, '"', escape ); 74 assert ( s == sv ); 75 } 76 77 78 79 std::string quote ( const char *p, char delim='"', char escape='\\' ) { 80 std::stringstream ss; 81 ss << std::quoted(p, delim, escape); 82 std::string s; 83 ss >> s; // no quote 84 return s; 85 } 86 87 std::string unquote ( const char *p, char delim='"', char escape='\\' ) { 88 std::stringstream ss; 89 ss << p; 90 std::string s; 91 ss >> std::quoted(s, delim, escape); 92 return s; 93 } 94 95 96 void round_trip ( const wchar_t *p ) { 97 std::wstringstream ss; 98 bool skippingws = is_skipws ( &ss ); 99 std::wstring_view sv {p}; 100 101 ss << std::quoted(sv); 102 std::wstring s; 103 ss >> std::quoted(s); 104 assert ( s == sv ); 105 assert ( skippingws == is_skipws ( &ss )); 106 } 107 108 109 void round_trip_ws ( const wchar_t *p ) { 110 std::wstringstream ss; 111 std::noskipws ( ss ); 112 bool skippingws = is_skipws ( &ss ); 113 std::wstring_view sv {p}; 114 115 ss << std::quoted(sv); 116 std::wstring s; 117 ss >> std::quoted(s); 118 assert ( s == sv ); 119 assert ( skippingws == is_skipws ( &ss )); 120 } 121 122 void round_trip_d ( const wchar_t *p, wchar_t delim ) { 123 std::wstringstream ss; 124 std::wstring_view sv {p}; 125 126 ss << std::quoted(sv, delim); 127 std::wstring s; 128 ss >> std::quoted(s, delim); 129 assert ( s == sv ); 130 } 131 132 void round_trip_e ( const wchar_t *p, wchar_t escape ) { 133 std::wstringstream ss; 134 std::wstring_view sv {p}; 135 136 ss << std::quoted(sv, wchar_t('"'), escape ); 137 std::wstring s; 138 ss >> std::quoted(s, wchar_t('"'), escape ); 139 assert ( s == sv ); 140 } 141 142 143 std::wstring quote ( const wchar_t *p, wchar_t delim='"', wchar_t escape='\\' ) { 144 std::wstringstream ss; 145 std::wstring_view sv {p}; 146 147 ss << std::quoted(sv, delim, escape); 148 std::wstring s; 149 ss >> s; // no quote 150 return s; 151 } 152 153 std::wstring unquote ( const wchar_t *p, wchar_t delim='"', wchar_t escape='\\' ) { 154 std::wstringstream ss; 155 std::wstring_view sv {p}; 156 157 ss << sv; 158 std::wstring s; 159 ss >> std::quoted(s, delim, escape); 160 return s; 161 } 162 163 int main(int, char**) 164 { 165 round_trip ( "" ); 166 round_trip_ws ( "" ); 167 round_trip_d ( "", 'q' ); 168 round_trip_e ( "", 'q' ); 169 170 round_trip ( L"" ); 171 round_trip_ws ( L"" ); 172 round_trip_d ( L"", 'q' ); 173 round_trip_e ( L"", 'q' ); 174 175 round_trip ( "Hi" ); 176 round_trip_ws ( "Hi" ); 177 round_trip_d ( "Hi", '!' ); 178 round_trip_e ( "Hi", '!' ); 179 assert ( quote ( "Hi", '!' ) == "!Hi!" ); 180 assert ( quote ( "Hi!", '!' ) == R"(!Hi\!!)" ); 181 182 round_trip ( L"Hi" ); 183 round_trip_ws ( L"Hi" ); 184 round_trip_d ( L"Hi", '!' ); 185 round_trip_e ( L"Hi", '!' ); 186 assert ( quote ( L"Hi", '!' ) == L"!Hi!" ); 187 assert ( quote ( L"Hi!", '!' ) == LR"(!Hi\!!)" ); 188 189 round_trip ( "Hi Mom" ); 190 round_trip_ws ( "Hi Mom" ); 191 round_trip ( L"Hi Mom" ); 192 round_trip_ws ( L"Hi Mom" ); 193 194 assert ( quote ( "" ) == "\"\"" ); 195 assert ( quote ( L"" ) == L"\"\"" ); 196 assert ( quote ( "a" ) == "\"a\"" ); 197 assert ( quote ( L"a" ) == L"\"a\"" ); 198 199 // missing end quote - must not hang 200 assert ( unquote ( "\"abc" ) == "abc" ); 201 assert ( unquote ( L"\"abc" ) == L"abc" ); 202 203 assert ( unquote ( "abc" ) == "abc" ); // no delimiter 204 assert ( unquote ( L"abc" ) == L"abc" ); // no delimiter 205 assert ( unquote ( "abc def" ) == "abc" ); // no delimiter 206 assert ( unquote ( L"abc def" ) == L"abc" ); // no delimiter 207 208 assert ( unquote ( "" ) == "" ); // nothing there 209 assert ( unquote ( L"" ) == L"" ); // nothing there 210 211 return 0; 212 } 213