diff options
Diffstat (limited to 'Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.cpp')
-rw-r--r-- | Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.cpp | 413 |
1 files changed, 0 insertions, 413 deletions
diff --git a/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.cpp b/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.cpp deleted file mode 100644 index 6b5a7b70f09..00000000000 --- a/Build/source/texk/dvisvgm/dvisvgm-src/src/InputReader.cpp +++ /dev/null @@ -1,413 +0,0 @@ -/************************************************************************* -** InputReader.cpp ** -** ** -** This file is part of dvisvgm -- a fast DVI to SVG converter ** -** Copyright (C) 2005-2021 Martin Gieseking <martin.gieseking@uos.de> ** -** ** -** This program is free software; you can redistribute it and/or ** -** modify it under the terms of the GNU General Public License as ** -** published by the Free Software Foundation; either version 3 of ** -** the License, or (at your option) any later version. ** -** ** -** This program 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 General Public License for more details. ** -** ** -** You should have received a copy of the GNU General Public License ** -** along with this program; if not, see <http://www.gnu.org/licenses/>. ** -*************************************************************************/ - -#include <cmath> -#include <cstring> -#include <functional> -#include "InputReader.hpp" - -using namespace std; - - -void StringMatcher::setPattern (const string &pattern) { - _pattern = pattern; - _charsRead = 0; - _borders.resize(pattern.length()+1); - // preprocessing to set up the border indexes - _borders[0] = -1; - int i=0, j=-1; - const int len = static_cast<int>(pattern.length()); - while (i < len) { - while (j >= 0 && _pattern[i] != _pattern[j]) - j = _borders[j]; - _borders[++i] = ++j; - } -} - - -/** Reads characters from an input stream until the pattern string or EOF is reached. - * The matching string is read too if found. An empty pattern matches any character, i.e. - * reading stops after the first character. - * @return true if the pattern was found */ -bool StringMatcher::match (InputReader &ir) { - int c; - int i=0; - const int len = static_cast<int>(_pattern.length()); - _charsRead = 0; - while ((c = ir.get()) >= 0) { - _charsRead++; - while (i >= 0 && c != _pattern[i]) - i = _borders[i]; - if (++i == len) - return true; - } - return false; -} - - -/** Reads characters from an input stream until the pattern string or EOF is reached - * and returns them as a string. The matching string is also appended to the returned string. */ -string StringMatcher::read (InputReader &ir) { - string ret; - int c; - int i=0; - const int len = static_cast<int>(_pattern.length()); - while ((c = ir.get()) >= 0) { - ret += char(c); - while (i >= 0 && c != _pattern[i]) - i = _borders[i]; - if (++i == len) - break; - } - _charsRead = ret.length(); - return ret; -} - -/////////////////////////////////////////////////////////////////////////// - -/** Skips n characters. */ -void InputReader::skip (size_t n) { - while (n-- > 0) - get(); -} - - -/** Moves the buffer pointer to the next non-space character. A following call - * of get() returns this character. */ -void InputReader::skipSpace () { - while (isspace(peek())) - get(); -} - - -/** Tries to find a given string and skips all characters preceding that string. If - * the string can't be found, all characters until EOF are skipped. - * @param[in] str string to look for (must not be longer than the maximal buffer size) - * @return true if str was found */ -bool InputReader::skipUntil (const char *str) { - StringMatcher matcher(str); - return matcher.match(*this); -} - - -/** Tries to find a given string and returns all characters including that string. If - * the string can't be found, all characters until EOF are read. - * @param[in] str string to look for (must not be longer than the maximal buffer size) - * @return the read characters */ -string InputReader::readUntil (const char *str) { - StringMatcher matcher(str); - return matcher.read(*this); -} - - -/** Looks for the first occurrence of a given character. - * @param[in] c character to lookup - * @return position of character relative to current location, -1 if character was not found */ -int InputReader::find (char c) const { - int pos = 0; - int cc; - while ((cc = peek(pos)) >= 0 && cc != c) - pos++; - return cc < 0 ? -1 : pos; -} - - -/** Checks if the next characters to be read match a given string. - * @param[in] s string to be matched - * @param[in] consume if true, the characters of the matched string are skipped - * @return true if s matches */ -bool InputReader::check (const char *s, bool consume) { - size_t count = 0; - for (const char *p=s; *p; p++) { - if (peek(count++) != *p) - return false; - } - if (consume) - skip(count); - return true; -} - - -/** Reads an integer from the buffer. All characters that are part of - * the read integer constant are skipped. If this function returns false, - * the buffer pointer points to the same position as before the function call. - * @param[out] val contains the read integer value on success - * @param[in] accept_sign if false, only positive integers (without sign) are accepted - * @return true if integer could be read */ -bool InputReader::parseInt (int &val, bool accept_sign) { - val = 0; - int fac=1; - int sign; // explicitly given sign - if (accept_sign && ((sign = peek()) == '+' || sign == '-')) { - if (isdigit(peek(1))) { - get(); // skip sign - if (sign == '-') - fac = -1; - } - else - return false; - } - else if (!isdigit(peek())) - return false; - - while (isdigit(peek())) - val = val*10 + (get()-'0'); - val *= fac; - return true; -} - - -bool InputReader::parseUInt (unsigned &val) { - val = 0; - if (!isdigit(peek())) - return false; - while (isdigit(peek())) - val = val*10 + (get()-'0'); - return true; -} - - -bool InputReader::parseUInt (int base, unsigned &val) { - if (base < 2 || base > 32) - return false; - - const char *digits = "0123456789abcdefghijklmnopqrstuvwxyz"; - const char maxdigit = digits[base-1]; - int c; - if (!isalnum(c = tolower(peek())) || c > maxdigit) - return false; - - val = 0; - while (isalnum(c = tolower(peek())) && c <= maxdigit) { - get(); - unsigned digit = c - (c <= '9' ? '0' : 'a'-10); - val = val*base + digit; - } - return true; -} - - -/** Reads a double from the buffer. All characters that are part of - * the read double constant are skipped. If this function returns false, - * the buffer pointer points to the same position as before the function call. - * @param[out] val contains the read double value on success - * @return number details: 0=no number, 'i'=integer, 'f'=floating point number */ -char InputReader::parseDouble (double &val) { - int fac=1; - int int_part=0; - bool is_float = false; - skipSpace(); - int sign = peek(); - if (parseInt(int_part)) { // match [+-]?[0-9]+\.? - if (peek() == '.') { - get(); - is_float = true; - } - if (int_part < 0 || sign == '-') { - fac = -1; - int_part = -int_part; - } - } - else { // match [+-]?\. - if ((sign = peek()) == '+' || sign == '-') { // match [+-]?\.[0-9] - if (peek(1) != '.' || !isdigit(peek(2))) - return 0; - if (sign == '-') - fac = -1; - skip(2); // skip sign and dot - } - else if (peek() == '.' && isdigit(peek(1))) - get(); - else - return 0; - is_float = true; - } - // parse fractional part - double frac_part=0.0; - for (double u=10; isdigit(peek()); u*=10) - frac_part += (get()-'0')/u; - val = (int_part + frac_part) * fac; - // parse exponent - int c; - if (tolower(peek()) == 'e' && (isdigit(c=peek(1)) || ((c == '+' || c == '-') && isdigit(peek(2))))) { - get(); // skip 'e' - int exp; - parseInt(exp); - val *= pow(10.0, exp); - is_float = true; - } - return is_float ? 'f' : 'i'; -} - - -/** Reads an integer value from the buffer. If no valid integer constant - * could be found at the current position 0 is returned. */ -int InputReader::getInt () { - skipSpace(); - int val; - return parseInt(val) ? val : 0; -} - - -/** Reads an double value from the buffer. If no valid double constant - * could be found at the current position 0 is returned. */ -double InputReader::getDouble () { - skipSpace(); - double val; - return parseDouble(val) ? val : 0.0; -} - - -/** Reads a string that consists of alphabetic letters only. Reading stops as - * soon as a non-alphabetic character is found or EOF is reached. */ -string InputReader::getWord () { - string ret; - skipSpace(); - while (isalpha(peek())) - ret += char(get()); - return ret; -} - - -/** Reads a single punctuation character. - * @return the read character or 0 if there's no punctuation character at the current position */ -char InputReader::getPunct () { - skipSpace(); - if (ispunct(peek())) - return char(get()); - return 0; -} - - -/** Reads a string optionally enclosed by a given quotation character. - * Before reading the string, all leading whitespace is skipped. Then, the function checks - * for one of the the given quotation characters. If it is found, all characters until the - * second appearance of the same quotation char are appended to the result. Otherwise, an - * empty string is returned. If the quotation character is 0, the behavior of this function - * is identical to a call of getString(). - * @param[in] quotechars recognized quotation characters bounding the string to be read - * @return the string read */ -string InputReader::getQuotedString (const char *quotechars) { - if (!quotechars) - return getString(); - - string ret; - skipSpace(); - if (const char *quotechar = strchr(quotechars, peek())) { - get(); - while (!eof() && peek() != *quotechar) - ret += char(get()); - get(); - } - return ret; -} - - -/** Reads a string delimited by whitespace and/or invisible characters. - * Before reading the string, all leading whitespace is skipped. Then, the function adds - * all printable characters to the result until a whitespace, an unprintable character, or - * EOF is found. - * @return the string read */ -string InputReader::getString () { - string ret; - skipSpace(); - while (!eof() && !isspace(peek()) && isprint(peek())) - ret += char(get()); - return ret; -} - - -/** Reads a given number of characters and returns the resulting string. - * @param n number of character to read - * @return the string read */ -string InputReader::getString (size_t n) { - string ret; - while (n-- > 0) - ret += char(get()); - return ret; -} - - -/** Reads a string delimited by EOF or a single character from a given set of characters. - * @param[in] delim characters delimiting the string - * @return the read string */ -string InputReader::getString (const char *delim) { - if (!delim || !delim[0]) - return getString(); - string ret; - skipSpace(); - while (!eof() && peek() > 0 && !strchr(delim, peek())) - ret += char(get()); - return ret; -} - - -string InputReader::getLine () { - string ret; - skipSpace(); - while (!eof() && peek() > 0 && peek() != '\n') - ret += char(get()); - // trim trailing whitespace - ret.erase(std::find_if(ret.rbegin(), ret.rend(), not1(ptr_fun<int, int>(isspace))).base(), ret.end()); - return ret; -} - - -/** Parses a sequence of key-value pairs of the form KEY=VALUE or KEY="VALUE". - * If parameter 'requireValues' is false, attributes may also consist of a key only. - * @param[out] attr the scanned atributes - * @param[in] requireValues true if all attributes require a value - * @param[in] quotechars recognized quote characters used to enclose the attribute values - * @return number of attributes scanned */ -int InputReader::parseAttributes (map<string,string> &attr, bool requireValues, const char *quotechars) { - while (!eof()) { - string key; - skipSpace(); - if (!isalpha(peek())) // first character of attribute name must be a letter - break; - key += char(get()); - while (isalnum(peek()) || strchr("-:._", peek())) - key += char(get()); - skipSpace(); - if (peek() == '=') { - get(); - skipSpace(); - string val = getQuotedString(quotechars); - attr.emplace(std::move(key), std::move(val)); - } - else if (!requireValues) - attr.emplace(std::move(key), ""); - } - return attr.size(); -} - -////////////////////////////////////////// - - -int StreamInputReader::peek (size_t n) const { - if (n == 0) - return peek(); - vector<char> chars(n); - _is.read(&chars[0], n); - int ret = peek(); - for (int i=n-1; i >= 0; i--) - _is.putback(chars[i]); - return ret; -} |