result.args.push_back(parse_bool());
break;
case 'e':
- result.args.push_back(parse_enum());
+ result.args.push_back(Value(ENUM, parse_enum()));
break;
}
}
};
#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<sizeof(float); ++i)
next_enum_id(1)
{
dict[DictEntry("__st", "iss")]=1;
- dict[DictEntry("__enum", "is")]=1;
+ dict[DictEntry("__enum", "is")]=2;
}
void BinaryWriter::write(const Statement &st)
kst.args.push_back(de.args);
write_(kst);
- dict.insert(Dictionary::value_type(de, next_st_id++)).first;
+ dict[de]=next_st_id++;
}
for(ValueArray::const_iterator i=st.args.begin(); i!=st.args.end(); ++i)
void BinaryWriter::write_int(long long n)
{
- unsigned i=1;
- for(; n>>(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));
}
*/
#include <msp/strings/formatter.h>
+#include <msp/strings/utils.h>
#include "input.h"
#include "textparser.h"
#include "token.h"
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;
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;
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);
};
Distributed under the LGPL
*/
+#include <msp/strings/utils.h>
#include "statement.h"
#include "textwriter.h"
{
out<<' ';
if(i->get_type()==STRING)
- out<<'\"'<<i->get_raw()<<'\"';
+ out<<'\"'<<c_escape(i->get_raw(), false)<<'\"';
else if(i->get_type()==BOOLEAN)
out<<(i->get<bool>() ? "true" : "false");
else