226 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			226 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
	
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
 | 
						|
// See https://llvm.org/LICENSE.txt for license information.
 | 
						|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
// UNSUPPORTED: c++03, c++11
 | 
						|
// UNSUPPORTED: no-localization
 | 
						|
// UNSUPPORTED: !stdlib=libc++ && c++14
 | 
						|
 | 
						|
// <iomanip>
 | 
						|
 | 
						|
// quoted
 | 
						|
 | 
						|
#include <iomanip>
 | 
						|
#include <sstream>
 | 
						|
#include <string_view>
 | 
						|
#include <cassert>
 | 
						|
 | 
						|
#include "test_macros.h"
 | 
						|
 | 
						|
bool is_skipws ( const std::istream *is ) {
 | 
						|
    return ( is->flags() & std::ios_base::skipws ) != 0;
 | 
						|
}
 | 
						|
 | 
						|
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 | 
						|
bool is_skipws ( const std::wistream *is ) {
 | 
						|
    return ( is->flags() & std::ios_base::skipws ) != 0;
 | 
						|
}
 | 
						|
#endif
 | 
						|
 | 
						|
void round_trip ( const char *p ) {
 | 
						|
    std::stringstream ss;
 | 
						|
    bool skippingws = is_skipws ( &ss );
 | 
						|
    std::string_view sv {p};
 | 
						|
 | 
						|
    ss << std::quoted(sv);
 | 
						|
    std::string s;
 | 
						|
    ss >> std::quoted(s);
 | 
						|
    assert ( s == sv );
 | 
						|
    assert ( skippingws == is_skipws ( &ss ));
 | 
						|
    }
 | 
						|
 | 
						|
void round_trip_ws ( const char *p ) {
 | 
						|
    std::stringstream ss;
 | 
						|
    std::noskipws ( ss );
 | 
						|
    bool skippingws = is_skipws ( &ss );
 | 
						|
    std::string_view sv {p};
 | 
						|
 | 
						|
    ss << std::quoted(sv);
 | 
						|
    std::string s;
 | 
						|
    ss >> std::quoted(s);
 | 
						|
    assert ( s == sv );
 | 
						|
    assert ( skippingws == is_skipws ( &ss ));
 | 
						|
    }
 | 
						|
 | 
						|
void round_trip_d ( const char *p, char delim ) {
 | 
						|
    std::stringstream ss;
 | 
						|
    std::string_view sv {p};
 | 
						|
 | 
						|
    ss << std::quoted(sv, delim);
 | 
						|
    std::string s;
 | 
						|
    ss >> std::quoted(s, delim);
 | 
						|
    assert ( s == sv );
 | 
						|
    }
 | 
						|
 | 
						|
void round_trip_e ( const char *p, char escape ) {
 | 
						|
    std::stringstream ss;
 | 
						|
    std::string_view sv {p};
 | 
						|
 | 
						|
    ss << std::quoted(sv, '"', escape );
 | 
						|
    std::string s;
 | 
						|
    ss >> std::quoted(s, '"', escape );
 | 
						|
    assert ( s == sv );
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
 | 
						|
std::string quote ( const char *p, char delim='"', char escape='\\' ) {
 | 
						|
    std::stringstream ss;
 | 
						|
    ss << std::quoted(p, delim, escape);
 | 
						|
    std::string s;
 | 
						|
    ss >> s;    // no quote
 | 
						|
    return s;
 | 
						|
}
 | 
						|
 | 
						|
std::string unquote ( const char *p, char delim='"', char escape='\\' ) {
 | 
						|
    std::stringstream ss;
 | 
						|
    ss << p;
 | 
						|
    std::string s;
 | 
						|
    ss >> std::quoted(s, delim, escape);
 | 
						|
    return s;
 | 
						|
}
 | 
						|
 | 
						|
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 | 
						|
void round_trip ( const wchar_t *p ) {
 | 
						|
    std::wstringstream ss;
 | 
						|
    bool skippingws = is_skipws ( &ss );
 | 
						|
    std::wstring_view sv {p};
 | 
						|
 | 
						|
    ss << std::quoted(sv);
 | 
						|
    std::wstring s;
 | 
						|
    ss >> std::quoted(s);
 | 
						|
    assert ( s == sv );
 | 
						|
    assert ( skippingws == is_skipws ( &ss ));
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
void round_trip_ws ( const wchar_t *p ) {
 | 
						|
    std::wstringstream ss;
 | 
						|
    std::noskipws ( ss );
 | 
						|
    bool skippingws = is_skipws ( &ss );
 | 
						|
    std::wstring_view sv {p};
 | 
						|
 | 
						|
    ss << std::quoted(sv);
 | 
						|
    std::wstring s;
 | 
						|
    ss >> std::quoted(s);
 | 
						|
    assert ( s == sv );
 | 
						|
    assert ( skippingws == is_skipws ( &ss ));
 | 
						|
    }
 | 
						|
 | 
						|
void round_trip_d ( const wchar_t *p, wchar_t delim ) {
 | 
						|
    std::wstringstream ss;
 | 
						|
    std::wstring_view sv {p};
 | 
						|
 | 
						|
    ss << std::quoted(sv, delim);
 | 
						|
    std::wstring s;
 | 
						|
    ss >> std::quoted(s, delim);
 | 
						|
    assert ( s == sv );
 | 
						|
    }
 | 
						|
 | 
						|
void round_trip_e ( const wchar_t *p, wchar_t escape ) {
 | 
						|
    std::wstringstream ss;
 | 
						|
    std::wstring_view sv {p};
 | 
						|
 | 
						|
    ss << std::quoted(sv, wchar_t('"'), escape );
 | 
						|
    std::wstring s;
 | 
						|
    ss >> std::quoted(s, wchar_t('"'), escape );
 | 
						|
    assert ( s == sv );
 | 
						|
    }
 | 
						|
 | 
						|
 | 
						|
std::wstring quote ( const wchar_t *p, wchar_t delim='"', wchar_t escape='\\' ) {
 | 
						|
    std::wstringstream ss;
 | 
						|
    std::wstring_view sv {p};
 | 
						|
 | 
						|
    ss << std::quoted(sv, delim, escape);
 | 
						|
    std::wstring s;
 | 
						|
    ss >> s;    // no quote
 | 
						|
    return s;
 | 
						|
}
 | 
						|
 | 
						|
std::wstring unquote ( const wchar_t *p, wchar_t delim='"', wchar_t escape='\\' ) {
 | 
						|
    std::wstringstream ss;
 | 
						|
    std::wstring_view sv {p};
 | 
						|
 | 
						|
    ss << sv;
 | 
						|
    std::wstring s;
 | 
						|
    ss >> std::quoted(s, delim, escape);
 | 
						|
    return s;
 | 
						|
}
 | 
						|
#endif // TEST_HAS_NO_WIDE_CHARACTERS
 | 
						|
 | 
						|
int main(int, char**)
 | 
						|
{
 | 
						|
    round_trip    (  "" );
 | 
						|
    round_trip_ws (  "" );
 | 
						|
    round_trip_d  (  "", 'q' );
 | 
						|
    round_trip_e  (  "", 'q' );
 | 
						|
 | 
						|
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 | 
						|
    round_trip    ( L"" );
 | 
						|
    round_trip_ws ( L"" );
 | 
						|
    round_trip_d  ( L"", 'q' );
 | 
						|
    round_trip_e  ( L"", 'q' );
 | 
						|
#endif
 | 
						|
 | 
						|
    round_trip    (  "Hi" );
 | 
						|
    round_trip_ws (  "Hi" );
 | 
						|
    round_trip_d  (  "Hi", '!' );
 | 
						|
    round_trip_e  (  "Hi", '!' );
 | 
						|
    assert ( quote ( "Hi", '!' ) == "!Hi!" );
 | 
						|
    assert ( quote ( "Hi!", '!' ) == R"(!Hi\!!)" );
 | 
						|
 | 
						|
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 | 
						|
    round_trip    ( L"Hi" );
 | 
						|
    round_trip_ws ( L"Hi" );
 | 
						|
    round_trip_d  ( L"Hi", '!' );
 | 
						|
    round_trip_e  ( L"Hi", '!' );
 | 
						|
    assert ( quote ( L"Hi", '!' )  == L"!Hi!" );
 | 
						|
    assert ( quote ( L"Hi!", '!' ) == LR"(!Hi\!!)" );
 | 
						|
#endif
 | 
						|
 | 
						|
    round_trip    (  "Hi Mom" );
 | 
						|
    round_trip_ws (  "Hi Mom" );
 | 
						|
 | 
						|
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 | 
						|
    round_trip    ( L"Hi Mom" );
 | 
						|
    round_trip_ws ( L"Hi Mom" );
 | 
						|
#endif
 | 
						|
 | 
						|
    assert ( quote (  "" )  ==  "\"\"" );
 | 
						|
    assert ( quote (  "a" ) ==  "\"a\"" );
 | 
						|
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 | 
						|
    assert ( quote ( L"" )  == L"\"\"" );
 | 
						|
    assert ( quote ( L"a" ) == L"\"a\"" );
 | 
						|
#endif
 | 
						|
 | 
						|
    // missing end quote - must not hang
 | 
						|
    assert ( unquote (  "\"abc" ) ==  "abc" );
 | 
						|
    assert ( unquote (  "abc" ) == "abc" ); // no delimiter
 | 
						|
    assert ( unquote (  "abc def" ) ==  "abc" ); // no delimiter
 | 
						|
    assert ( unquote (  "" ) ==  "" ); // nothing there
 | 
						|
 | 
						|
#ifndef TEST_HAS_NO_WIDE_CHARACTERS
 | 
						|
    assert ( unquote ( L"\"abc" ) == L"abc" );
 | 
						|
    assert ( unquote ( L"abc" ) == L"abc" ); // no delimiter
 | 
						|
    assert ( unquote ( L"abc def" ) == L"abc" ); // no delimiter
 | 
						|
    assert ( unquote ( L"" ) == L"" ); // nothing there
 | 
						|
#endif
 | 
						|
 | 
						|
    return 0;
 | 
						|
}
 |