#include <algorithm>
#include <iostream>
#include <iterator>
#include <map>
#include <sstream>
#include <string>
using namespace std;
template < typename T>
T findNonEscaped( T start, T end, const char ch) {
T result = find( start, end, ch) ;
while ( result ! = end && result[ - 1 ] == '\\ ' ) result = find( start, end, ch) ;
return result;
}
template < typename T>
T extractParenthesis( T start, T end) {
T finish = findNonEscaped( start, end, ')' ) ;
for ( auto i = findNonEscaped( next( start) , end, '(' ) ; i ! = end && i < finish; i = findNonEscaped( next( i) , end, '(' ) ) finish = findNonEscaped( next( finish) , end, ')' ) ;
return finish;
}
int main( ) {
const auto input = "data1(\" value 1 \" ) data2 (\" value 2\" ) anything3(\" data3(\" value\" ) \" )" s;
map< string, string> output;
for ( auto openParenthesis = findNonEscaped( input.cbegin ( ) , input.cend ( ) , '(' ) , closeParenthesis = input.cbegin ( ) ; openParenthesis ! = input.cend ( ) ; openParenthesis = findNonEscaped( openParenthesis, input.cend ( ) , '(' ) ) {
decltype( output) :: key_type key;
istringstream ss{ string{ make_reverse_iterator( openParenthesis) , make_reverse_iterator( closeParenthesis) } } ;
ss >> key;
closeParenthesis = extractParenthesis( openParenthesis, input.cend ( ) ) ;
output[ decltype( output) :: key_type { key.crbegin ( ) , key.crend ( ) } ] = decltype( output) :: mapped_type { next( findNonEscaped( next( openParenthesis) , closeParenthesis, '"' ) ) , prev( findNonEscaped( make_reverse_iterator( closeParenthesis) , make_reverse_iterator( next( openParenthesis) ) , '"' ) .base ( ) ) } ;
openParenthesis = closeParenthesis;
}
for ( auto & i : output) {
cout << i.first << " : " << i.second << endl;
}
}
I2luY2x1ZGUgPGFsZ29yaXRobT4KI2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8aXRlcmF0b3I+CiNpbmNsdWRlIDxtYXA+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+ClQgZmluZE5vbkVzY2FwZWQoVCBzdGFydCwgVCBlbmQsIGNvbnN0IGNoYXIgY2gpIHsKCVQgcmVzdWx0ID0gZmluZChzdGFydCwgZW5kLCBjaCk7CgoJd2hpbGUgKHJlc3VsdCAhPSBlbmQgJiYgcmVzdWx0Wy0xXSA9PSAnXFwnKSByZXN1bHQgPSBmaW5kKHN0YXJ0LCBlbmQsIGNoKTsKCglyZXR1cm4gcmVzdWx0Owp9Cgp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KVCBleHRyYWN0UGFyZW50aGVzaXMoVCBzdGFydCwgVCBlbmQpIHsKCVQgZmluaXNoID0gZmluZE5vbkVzY2FwZWQoc3RhcnQsIGVuZCwgJyknKTsKCglmb3IgKGF1dG8gaSA9IGZpbmROb25Fc2NhcGVkKG5leHQoc3RhcnQpLCBlbmQsICcoJyk7IGkgIT0gZW5kICYmIGkgPCBmaW5pc2g7IGkgPSBmaW5kTm9uRXNjYXBlZChuZXh0KGkpLCBlbmQsICcoJykpIGZpbmlzaCA9IGZpbmROb25Fc2NhcGVkKG5leHQoZmluaXNoKSwgZW5kLCAnKScpOwoJcmV0dXJuIGZpbmlzaDsKfQoKaW50IG1haW4oKSB7Cgljb25zdCBhdXRvIGlucHV0ID0gImRhdGExKFwiIHZhbHVlIDEgXCIpIGRhdGEyIChcInZhbHVlIDJcIikgYW55dGhpbmczKFwiICBkYXRhMyhcInZhbHVlXCIpIFwiKSJzOwoJbWFwPHN0cmluZywgc3RyaW5nPiBvdXRwdXQ7CgoJZm9yIChhdXRvIG9wZW5QYXJlbnRoZXNpcyA9IGZpbmROb25Fc2NhcGVkKGlucHV0LmNiZWdpbigpLCBpbnB1dC5jZW5kKCksICcoJyksIGNsb3NlUGFyZW50aGVzaXMgPSBpbnB1dC5jYmVnaW4oKTsgb3BlblBhcmVudGhlc2lzICE9IGlucHV0LmNlbmQoKTsgb3BlblBhcmVudGhlc2lzID0gZmluZE5vbkVzY2FwZWQob3BlblBhcmVudGhlc2lzLCBpbnB1dC5jZW5kKCksICcoJykpIHsKCQlkZWNsdHlwZShvdXRwdXQpOjprZXlfdHlwZSBrZXk7CgkJaXN0cmluZ3N0cmVhbSBzc3sgc3RyaW5neyBtYWtlX3JldmVyc2VfaXRlcmF0b3Iob3BlblBhcmVudGhlc2lzKSwgbWFrZV9yZXZlcnNlX2l0ZXJhdG9yKGNsb3NlUGFyZW50aGVzaXMpIH0gfTsKCQkKCQlzcyA+PiBrZXk7CgkJY2xvc2VQYXJlbnRoZXNpcyA9IGV4dHJhY3RQYXJlbnRoZXNpcyhvcGVuUGFyZW50aGVzaXMsIGlucHV0LmNlbmQoKSk7CgkJb3V0cHV0W2RlY2x0eXBlKG91dHB1dCk6OmtleV90eXBleyBrZXkuY3JiZWdpbigpLCBrZXkuY3JlbmQoKSB9XSA9IGRlY2x0eXBlKG91dHB1dCk6Om1hcHBlZF90eXBleyBuZXh0KGZpbmROb25Fc2NhcGVkKG5leHQob3BlblBhcmVudGhlc2lzKSwgY2xvc2VQYXJlbnRoZXNpcywgJyInKSksIHByZXYoZmluZE5vbkVzY2FwZWQobWFrZV9yZXZlcnNlX2l0ZXJhdG9yKGNsb3NlUGFyZW50aGVzaXMpLCBtYWtlX3JldmVyc2VfaXRlcmF0b3IobmV4dChvcGVuUGFyZW50aGVzaXMpKSwgJyInKS5iYXNlKCkpIH07CgkJb3BlblBhcmVudGhlc2lzID0gY2xvc2VQYXJlbnRoZXNpczsKCX0KCglmb3IgKGF1dG8mIGkgOiBvdXRwdXQpIHsKCQljb3V0IDw8IGkuZmlyc3QgPDwgIiA6ICIgPDwgaS5zZWNvbmQgPDwgZW5kbDsKCX0KfQ==