From 4a3f2cb747b2553485f48dc440e141e30ade5a70 Mon Sep 17 00:00:00 2001 From: Stephan Bergmann Date: Thu, 23 Mar 2017 11:02:10 +0100 Subject: Fix some usage of std::istream unformatted input in hwpfilter/source/hwpeq.cxx (Though some deficiencies remain, e.g. when values are assumed to be valid characters and not eof().) Change-Id: Ia5ec681a68086e9843206a6b44a44f8ec3800b88 --- hwpfilter/source/hwpeq.cxx | 52 ++++++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 20 deletions(-) diff --git a/hwpfilter/source/hwpeq.cxx b/hwpfilter/source/hwpeq.cxx index 9120bc9573ca..7d632998f729 100644 --- a/hwpfilter/source/hwpeq.cxx +++ b/hwpfilter/source/hwpeq.cxx @@ -41,14 +41,21 @@ using namespace std; # define ENDL "\n" #endif -#define WS " \t\r\n\v\f" - #define EQ_CASE 0x01 // case sensitive cmd #define EQ_ENV 0x02 // equiv to latex environment #define EQ_ATOP 0x04 // must revert order -#define IS_WS(ch) (strchr(WS, ch)) -#define IS_BINARY(ch) (strchr("+-<=>", ch)) +static bool IS_WS(std::istream::int_type ch) { + return ch != std::istream::traits_type::eof() + && rtl::isAsciiWhiteSpace( + static_cast( + std::istream::traits_type::to_char_type(ch))); +} + +static bool IS_BINARY(std::istream::int_type ch) { + return ch != std::istream::traits_type::eof() + && strchr("+-<=>", std::istream::traits_type::to_char_type(ch)); +} #ifdef _WIN32 #define STRICMP stricmp @@ -479,7 +486,7 @@ void push_token(MzString &white, MzString &token, istream *strm) * alphabet string, sigle character */ static int next_token(MzString &white, MzString &token, istream *strm) { - int ch = 0; + std::istream::int_type ch = 0; if( stk->state(strm) ) { white = stk->white; @@ -500,7 +507,9 @@ static int next_token(MzString &white, MzString &token, istream *strm) while( IS_WS(ch = strm->get()) ); } - if( ch == '\\' || ch & 0x80 || isalpha(ch) ) { + if( ch == '\\' || ch & 0x80 + || (ch != std::istream::traits_type::eof() && rtl::isAsciiAlpha(ch)) ) + { if( ch == '\\' ) { token << (char) ch; ch = strm->get(); @@ -509,8 +518,8 @@ static int next_token(MzString &white, MzString &token, istream *strm) token << (char) ch; ch = strm->get(); } while( ch != std::istream::traits_type::eof() - && (ch & 0x80 || isalpha(ch)) ) ; - strm->putback(sal::static_int_cast(ch)); + && (ch & 0x80 || rtl::isAsciiAlpha(ch)) ) ; + strm->putback(static_cast(ch)); /* special treatment of sub, sub, over, atop The reason for this is that affect next_state(). */ @@ -531,12 +540,14 @@ static int next_token(MzString &white, MzString &token, istream *strm) else if( IS_BINARY(ch) ) { do token << (char) ch; while( IS_BINARY(ch = strm->get()) ); - strm->putback(sal::static_int_cast(ch)); + strm->putback(static_cast(ch)); } - else if( isdigit(ch) ) { - do token << (char) ch; - while( isdigit(ch = strm->get()) ); - strm->putback(sal::static_int_cast(ch)); + else if( ch != std::istream::traits_type::eof() && rtl::isAsciiDigit(ch) ) { + do { + token << (char) ch; + ch = strm->get(); + } while( ch != std::istream::traits_type::eof() && rtl::isAsciiDigit(ch) ); + strm->putback(static_cast(ch)); } else token << (char) ch; @@ -544,20 +555,20 @@ static int next_token(MzString &white, MzString &token, istream *strm) return token.length(); } -static int read_white_space(MzString& outs, istream *strm) +static std::istream::int_type read_white_space(MzString& outs, istream *strm) { - int result; + std::istream::int_type result; if( stk->state(strm) ) { outs << stk->white; stk->white = nullptr; - result = stk->token[0]; + result = std::istream::traits_type::to_int_type(stk->token[0]); } else { - int ch; + std::istream::int_type ch; while( IS_WS(ch = strm->get()) ) outs << (char )ch; - strm->putback(sal::static_int_cast(ch)); + strm->putback(static_cast(ch)); result = ch; } return result; @@ -619,7 +630,7 @@ static int eq_word(MzString& outs, istream *strm, int status) if( nullptr != (eq = lookup_eqn(keyword)) ) { int nargs = eq->nargs; while( nargs-- ) { - const int ch = read_white_space(state, strm); + const std::istream::int_type ch = read_white_space(state, strm); if( ch != '{' ) state << '{'; eq_word(state, strm, script_status); if( ch != '{' ) state << '}'; @@ -678,7 +689,8 @@ static char eq2ltxconv(MzString& sstr, istream *strm, const char *sentinel) { MzString white, token; char key[256]; - int ch, result; + std::istream::int_type ch; + int result; while( 0 != (result = next_token(white, token, strm)) ) { if( sentinel && (result == 1) && strchr(sentinel, token[0]) ) -- cgit