*/
#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;