uint Scanner::unescape(SubStr &s) const
{
+ static const char * hex = "0123456789abcdef";
+ static const char * oct = "01234567";
+
s.len--;
uint c;
case 'x':
{
- static const char * hex = "0123456789abcdef";
- const char *p1, *p2;
+ if (s.len < 2)
+ {
+ fatal(s.ofs()+s.len, "Illegal hexadecimal character code, two hexadecimal digits are required");
+ return ~0;
+ }
+
+ const char *p1 = strchr(hex, tolower(s.str[0]));
+ const char *p2 = strchr(hex, tolower(s.str[1]));
- if (s.len < 2 || !(p1 = strchr(hex, tolower(s.str[0])))
- || !(p2 = strchr(hex, tolower(s.str[1]))))
+ if (!p1 || !p2)
{
- fatal("Illegal hexadecimal character code");
+ fatal(s.ofs()+(p1?1:0), "Illegal hexadecimal character code");
return ~0;
}
else
case 'X':
{
- static const char * hex = "0123456789abcdef";
- const char *p1, *p2, *p3, *p4;
+ if (s.len < 4)
+ {
+ fatal(s.ofs()+s.len, "Illegal hexadecimal character code, four hexadecimal digits are required");
+ return ~0;
+ }
+
+ const char *p1 = strchr(hex, tolower(s.str[0]));
+ const char *p2 = strchr(hex, tolower(s.str[1]));
+ const char *p3 = strchr(hex, tolower(s.str[2]));
+ const char *p4 = strchr(hex, tolower(s.str[3]));
- if (s.len < 4 || !(p1 = strchr(hex, tolower(s.str[0])))
- || !(p2 = strchr(hex, tolower(s.str[1])))
- || !(p3 = strchr(hex, tolower(s.str[2])))
- || !(p4 = strchr(hex, tolower(s.str[3]))))
+ if (!p1 || !p2 || !p3 || !p4)
{
- fatal("Illegal hexadecimal character code");
+ fatal(s.ofs()+(p1?1:0)+(p2?1:0)+(p3?1:0), "Illegal hexadecimal character code");
return ~0;
}
else
if (v >= nRealChars)
{
- fatal("Illegal hexadecimal character code");
+ fatal(s.ofs(), "Illegal hexadecimal character code, out of range");
}
return v;
}
}
- case '0':
- case '1':
- case '2':
- case '3':
case '4':
case '5':
case '6':
case '7':
{
- static const char * oct = "01234567";
- const char *p0, *p1, *p2;
+ fatal(s.ofs()-1, "Illegal octal character code, first digit must be 0 thru 3");
+ return ~0;
+ }
+
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ {
+ if (s.len < 2)
+ {
+ fatal(s.ofs()+s.len, "Illegal octal character code, three octal digits are required");
+ return ~0;
+ }
+
+ const char *p0 = strchr(oct, c);
+ const char *p1 = strchr(oct, s.str[0]);
+ const char *p2 = strchr(oct, s.str[1]);
- if (s.len < 2 || !(p0 = strchr(oct, c)) || c > '3'
- || !(p1 = strchr(oct, s.str[0]))
- || !(p2 = strchr(oct, s.str[1])))
+ if (!p0 || !p1 || !p2)
{
- fatal("Illegal octal character code");
+ fatal(s.ofs()+(p1?1:0), "Illegal octal character code");
return ~0;
}
else
-/* Generated by re2c 0.10.0.dev on Sun Jan 1 01:08:57 2006 */
+/* Generated by re2c 0.10.0.dev on Sun Jan 1 14:19:20 2006 */
#line 1 "scanner.re"
/* $Id$ */
#include <stdlib.h>
}
-void Scanner::fatal(const char *msg) const
+void Scanner::fatal(uint ofs, const char *msg) const
{
- std::cerr << "line " << tline << ", column " << (tchar + 1) << ": "
+ std::cerr << "line " << tline << ", column " << (tchar + ofs + 1) << ": "
<< msg << std::endl;
exit(1);
}
+void Scanner::fatal(const char *msg) const
+{
+ fatal(0, msg);
+}
+
void Scanner::config(const Str* cfg, int num)
{
if (cfg->to_string() == "indent")
int echo(std::ostream&);
int scan();
void fatal(const char*) const;
+ void fatal(uint, const char*) const;
void config(const Str*, const Str *);
void config(const Str*, int);
SubStr token() const;
*/
}
-void Scanner::fatal(char *msg) const
+void Scanner::fatal(uint ofs, const char *msg) const
{
- std::cerr << "line " << tline << ", column " << (tchar + 1) << ": "
+ std::cerr << "line " << tline << ", column " << (tchar + ofs + 1) << ": "
<< msg << std::endl;
exit(1);
}
+void Scanner::fatal(const char *msg) const
+{
+ fatal(0, msg);
+}
+
void Scanner::config(const Str* cfg, int num)
{
if (cfg->to_string() == "indent")
return (bool) (s1.len == s2.len && memcmp(s1.str, s2.str, s1.len) == 0);
}
-Str::Str(const SubStr& s) : SubStr(strndup(s.str, s.len), s.len)
+Str::Str(const SubStr& s)
+ : SubStr(strndup(s.str, s.len), s.len)
{
;
}
-Str::Str(Str& s) : SubStr(s.str, s.len)
+Str::Str(Str& s)
+ : SubStr(s.str, s.len)
{
s.str = NULL;
s.len = 0;
}
-Str::Str() : SubStr((char*) NULL, 0)
+Str::Str()
+ : SubStr((char*) NULL, 0)
{
;
}
}
} // end namespace re2c
-
{
public:
const char * str;
+ const char * const org;
uint len;
public:
SubStr(const SubStr&);
virtual ~SubStr();
void out(std::ostream&) const;
- std::string to_string() const
- {
- return std::string(str, len);
- }
+ std::string to_string() const;
+ uint ofs() const;
+
#ifdef PEDANTIC
protected:
SubStr& operator = (const SubStr& oth);
}
inline SubStr::SubStr(const uchar *s, uint l)
- : str((char*) s), len(l)
+ : str((char*)s), org((char*)s), len(l)
{ }
inline SubStr::SubStr(const char *s, uint l)
- : str(s), len(l)
+ : str(s), org(s), len(l)
{ }
inline SubStr::SubStr(const char *s)
- : str(s), len(strlen(s))
+ : str(s), org(s), len(strlen(s))
{ }
inline SubStr::SubStr(const SubStr &s)
- : str(s.str), len(s.len)
+ : str(s.str), org(s.str), len(s.len)
{ }
inline SubStr::~SubStr()
{ }
+inline std::string SubStr::to_string() const
+{
+ return std::string(str, len);
+}
+
+inline uint SubStr::ofs() const
+{
+ return str - org;
+}
+
#ifdef PEDANTIC
inline SubStr& SubStr::operator = (const SubStr& oth)
{
- str = oth.str;
+ new(this) SubStr(oth);
return *this;
}
#endif
--- /dev/null
+line 2, column 5: Illegal hexadecimal character code, two hexadecimal digits are required
+/* Generated by re2c */
+#line 1 "error4.re"
--- /dev/null
+/*!re2c
+[\x0] {}
+*/
--- /dev/null
+line 2, column 5: Illegal hexadecimal character code
+/* Generated by re2c */
+#line 1 "error5.re"
--- /dev/null
+/*!re2c
+[\x0Z] {}
+*/
--- /dev/null
+line 2, column 7: Illegal hexadecimal character code, four hexadecimal digits are required
+/* Generated by re2c */
+#line 1 "error6.re"
--- /dev/null
+/*!re2c
+[\X123] {}
+*/
--- /dev/null
+line 2, column 3: Illegal octal character code, first digit must be 0 thru 3
+/* Generated by re2c */
+#line 1 "error7.re"
--- /dev/null
+/*!re2c
+[\400] {}
+*/
--- /dev/null
+line 2, column 4: Illegal octal character code
+/* Generated by re2c */
+#line 1 "error8.re"
--- /dev/null
+/*!re2c
+[\090] {}
+*/
--- /dev/null
+line 2, column 5: Illegal octal character code
+/* Generated by re2c */
+#line 1 "error9.re"
--- /dev/null
+/*!re2c
+[\009] {}
+*/