You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
122 lines
4.0 KiB
122 lines
4.0 KiB
//==============================================================================
|
|
//
|
|
// Copyright (c) 2015-
|
|
// Authors:
|
|
// * Joachim Klein <klein@tcs.inf.tu-dresden.de>
|
|
// * David Mueller <david.mueller@tcs.inf.tu-dresden.de>
|
|
//
|
|
//------------------------------------------------------------------------------
|
|
//
|
|
// This file is part of the cpphoafparser library,
|
|
// http://automata.tools/hoa/cpphoafparser/
|
|
//
|
|
// The cpphoafparser library is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
// License as published by the Free Software Foundation; either
|
|
// version 2.1 of the License, or (at your option) any later version.
|
|
//
|
|
// The cpphoafparser library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
// Lesser General Public License for more details.
|
|
//
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
// License along with this library; if not, write to the Free Software
|
|
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
//
|
|
//==============================================================================
|
|
|
|
#ifndef CPPHOAFPARSER_HOAPARSERHELPER_H
|
|
#define CPPHOAFPARSER_HOAPARSERHELPER_H
|
|
|
|
#include <iostream>
|
|
#include <string>
|
|
#include <sstream>
|
|
|
|
#include "cpphoafparser/parser/hoa_parser_exception.hh"
|
|
|
|
namespace cpphoafparser {
|
|
|
|
/** Helper function for dealing with quoted strings */
|
|
class HOAParserHelper {
|
|
public:
|
|
/**
|
|
* Outputs a quoted version of the string to the ostream.
|
|
* The string is quoted to conform the to double-quoted
|
|
* string syntax of the HOA format.
|
|
*/
|
|
static void print_quoted(std::ostream& out, const std::string& s) {
|
|
std::string::size_type pos = s.find_first_of("\\\""); // find next \ or "
|
|
|
|
if (pos == std::string::npos) {
|
|
// nothing to quote
|
|
out << "\"" << s << "\"";
|
|
return;
|
|
}
|
|
|
|
out << "\"";
|
|
std::string::size_type last_pos = 0;
|
|
do {
|
|
out << s.substr(last_pos, pos); // characters that don't need to be quoted
|
|
out << "\\"; // add quote
|
|
out << s.substr(pos,1); // add character
|
|
|
|
last_pos = pos+1;
|
|
pos = s.find_first_of("\\\"", last_pos); // find next \ or "
|
|
} while (pos != std::string::npos);
|
|
if (last_pos < s.length()) {
|
|
out << s.substr(last_pos); // remaining
|
|
}
|
|
out << "\"";
|
|
}
|
|
|
|
/** Returns a double-quoted version of the string (HOA syntax and quoting rules). */
|
|
static std::string quote(const std::string& s) {
|
|
std::stringstream ss;
|
|
print_quoted(ss, s);
|
|
return ss.str();
|
|
}
|
|
|
|
/**
|
|
* Performs unquoting of a double-quoted string (HOA syntax and quoting rules).
|
|
* If the string is not a validly quoted string, a HOAParserException is thrown.
|
|
* @returns the unquoted string
|
|
**/
|
|
static std::string unquote(const std::string& s) {
|
|
if (s.length() == 0 || s.at(0) != '"') {
|
|
throw HOAParserException("String not quoted : " + s);
|
|
}
|
|
if (s.back() != '"') {
|
|
throw HOAParserException("String does not end with quote: " + s);
|
|
}
|
|
std::string::size_type pos = s.find_first_of("\\", 1); // find first '\'
|
|
|
|
if (pos == std::string::npos) {
|
|
// nothing to unquote, just remove outer quotes
|
|
return s.substr(1, s.length()-2);
|
|
}
|
|
|
|
std::stringstream ss;
|
|
std::string::size_type last_pos = 1;
|
|
do {
|
|
ss << s.substr(last_pos, pos); // characters that don't need to be quoted
|
|
if (pos+1 >= s.length()) {
|
|
throw HOAParserException("String ends with \\ character: s");
|
|
}
|
|
ss << s.substr(pos+1,1); // the quoted character
|
|
last_pos = pos+2; // skip quote character
|
|
pos = s.find_first_of("\\\"", last_pos); // find next '\'
|
|
} while (pos != std::string::npos);
|
|
|
|
if (last_pos < s.length()-1) {
|
|
ss << s.substr(last_pos, s.length()-1-last_pos); // remaining
|
|
}
|
|
|
|
return ss.str();
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
#endif
|