From 2f79370bffe0bac865dc97c5114dc87c1936fbb4 Mon Sep 17 00:00:00 2001 From: Mikko Rasa Date: Thu, 27 Sep 2007 20:22:41 +0000 Subject: [PATCH] Fix binary format Use c_escape and c_unescape functions from mspstrings --- source/binaryparser.cpp | 4 +-- source/binarywriter.cpp | 15 ++++++---- source/textparser.cpp | 63 +++++++---------------------------------- source/textparser.h | 1 - source/textwriter.cpp | 3 +- 5 files changed, 25 insertions(+), 61 deletions(-) diff --git a/source/binaryparser.cpp b/source/binaryparser.cpp index 6aed5b1..c3d53d7 100644 --- a/source/binaryparser.cpp +++ b/source/binaryparser.cpp @@ -87,7 +87,7 @@ Statement BinaryParser::parse_statement() result.args.push_back(parse_bool()); break; case 'e': - result.args.push_back(parse_enum()); + result.args.push_back(Value(ENUM, parse_enum())); break; } } @@ -132,7 +132,7 @@ float BinaryParser::parse_float() }; #if BYTE_ORDER == LITTLE_ENDIAN - for(unsigned i=sizeof(float)-1; i--;) + for(unsigned i=sizeof(float); i--;) d[i]=in.get(); #else for(unsigned i=0; i>(i*7); ++i); - for(; i--;) + unsigned i=sizeof(long long)-1; + + if(n>=0) + for(; (i>0 && (n>>(i*7-1))==0); --i); + else + for(; (i>0 && (n>>(i*7-1))==-1); --i); + + for(++i; i--;) out.put(n>>(i*7) & 0x7F | (i?0x80:0)); } diff --git a/source/textparser.cpp b/source/textparser.cpp index 298b7ca..78d2f1d 100644 --- a/source/textparser.cpp +++ b/source/textparser.cpp @@ -6,6 +6,7 @@ Distributed under the LGPL */ #include +#include #include "input.h" #include "textparser.h" #include "token.h" @@ -266,7 +267,16 @@ Token TextParser::parse_token() if(c=='\\') escape=!escape; else if(c=='"' && !escape) - return Token(Token::STRING, unescape_string(buf)); + { + try + { + return Token(Token::STRING, c_unescape(buf.substr(1, buf.size()-2))); + } + catch(const Exception &e) + { + throw ParseError(format("%s: %s", get_location(), e.what()), src, in.get_line_number()); + } + } else escape=false; break; @@ -297,57 +307,6 @@ bool TextParser::isodigit(int c) return (c>='0' && c<='7'); } -string TextParser::unescape_string(const string &str) -{ - string result; - bool escape=false; - unsigned hexcape=0; - for(string::const_iterator i=str.begin()+1; i!=str.end()-1; ++i) - { - if(escape) - { - if(*i=='n') - result+='\n'; - else if(*i=='t') - result+='\t'; - else if(*i=='\\') - result+='\\'; - else if(*i=='"') - result+='"'; - else if(*i=='x') - hexcape=0x100; - else - throw ParseError(format("%s: Invalid escape sequence '\\%c'", get_location(), *i), src, in.get_line_number()); - escape=false; - } - else if(hexcape) - { - unsigned digit=0; - if(*i>='0' && *i<='9') - digit=*i-'0'; - else if(*i>='a' && *i<='f') - digit=*i-'a'+10; - else if(*i>='A' && *i<='F') - digit=*i-'A'+10; - else - throw ParseError(get_location()+": Invalid hex digit", src, in.get_line_number()); - - hexcape=(hexcape<<4)|digit; - if(hexcape&0x10000) - { - result+=hexcape&0xFF; - hexcape=0; - } - } - else if(*i=='\\') - escape=true; - else - result+=*i; - } - - return result; -} - string TextParser::get_location() { ostringstream ss; diff --git a/source/textparser.h b/source/textparser.h index 9dfcf6d..a260cd8 100644 --- a/source/textparser.h +++ b/source/textparser.h @@ -25,7 +25,6 @@ protected: Token parse_token(); bool is_delimiter(int); bool isodigit(int); - std::string unescape_string(const std::string &); std::string get_location(); void parse_error(int, int); }; diff --git a/source/textwriter.cpp b/source/textwriter.cpp index 68111c0..def744c 100644 --- a/source/textwriter.cpp +++ b/source/textwriter.cpp @@ -5,6 +5,7 @@ Copyright © 2006 Mikko Rasa, Mikkosoft Productions Distributed under the LGPL */ +#include #include "statement.h" #include "textwriter.h" @@ -31,7 +32,7 @@ void TextWriter::write_(const Statement &st, unsigned level) { out<<' '; if(i->get_type()==STRING) - out<<'\"'<get_raw()<<'\"'; + out<<'\"'<get_raw(), false)<<'\"'; else if(i->get_type()==BOOLEAN) out<<(i->get() ? "true" : "false"); else -- 2.43.0