From 4243cf488ca2c53471831ad5096994ba895d7ff5 Mon Sep 17 00:00:00 2001 From: Ulya Fokanova Date: Mon, 20 Jan 2014 18:43:41 +0300 Subject: [PATCH] Removed compatibility encoding mode 'UTF32_16', generate error message when multiple encodings are set. --- re2c/code.cc | 6 +++ re2c/enc.h | 21 ++--------- re2c/main.cc | 2 +- re2c/test/repeat-07.gir.re | 2 +- re2c/test/repeat-07_error.gir.c | 2 + re2c/test/repeat-07_error.gir.re | 64 ++++++++++++++++++++++++++++++++ 6 files changed, 78 insertions(+), 19 deletions(-) create mode 100644 re2c/test/repeat-07_error.gir.c create mode 100755 re2c/test/repeat-07_error.gir.re diff --git a/re2c/code.cc b/re2c/code.cc index 2d6c659b..23e9b9e4 100644 --- a/re2c/code.cc +++ b/re2c/code.cc @@ -2264,6 +2264,8 @@ void Scanner::config(const Str& cfg, int num) encoding.setUTF32(); else encoding.unsetUTF32(); + if (encoding.isBad()) + fatal("Cannot set '-u' switch: please reset '-e', '-w' and '-8' switches at first.\n"); } else if (cfg.to_string() == "flags:w") { @@ -2275,6 +2277,8 @@ void Scanner::config(const Str& cfg, int num) encoding.setUTF16(); else encoding.unsetUTF16(); + if (encoding.isBad()) + fatal("Cannot set '-w' switch: please reset '-e', '-u' and '-8' switches at first.\n"); } else if (cfg.to_string() == "flags:8") { @@ -2286,6 +2290,8 @@ void Scanner::config(const Str& cfg, int num) encoding.setUTF8(); else encoding.unsetUTF8(); + if (encoding.isBad()) + fatal("Cannot set '-8' switch: please reset '-e', '-w' and '-u' switches at first.\n"); } else { diff --git a/re2c/enc.h b/re2c/enc.h index ab7b68b6..8afd92ad 100644 --- a/re2c/enc.h +++ b/re2c/enc.h @@ -8,12 +8,6 @@ namespace re2c { class Enc { // Supported encodings. - // - // UTF32_16 mode is necessary for inplace configurations like: - // re2c:flags:u = 1; - // re2c:flags:w = 1; - // which are for some strange reason considered valid. - // (see test 're2c/test/repeat-07.gir.re' for example) enum type_t { ASCII = 0x00000000u , EBCDIC = 0x00000001u @@ -101,8 +95,7 @@ inline uint Enc::nSymbols() const case ASCII: return ASCII_SYMBOLS; case EBCDIC: return EBCDIC_SYMBOLS; case UTF16: return UTF16_SYMBOLS; - case UTF32: - case UTF32_16: return UTF32_SYMBOLS; + case UTF32: return UTF32_SYMBOLS; case UTF8: return UTF8_SYMBOLS; default: return BAD; } @@ -115,8 +108,7 @@ inline uint Enc::nChars() const case ASCII: return ASCII_CHARS; case EBCDIC: return EBCDIC_CHARS; case UTF16: return UTF16_CHARS; - case UTF32: - case UTF32_16: return UTF32_CHARS; + case UTF32: return UTF32_CHARS; case UTF8: return UTF8_CHARS; default: return BAD; } @@ -130,7 +122,6 @@ inline uint Enc::szSymbol() const case EBCDIC: return 1; case UTF16: return 2; case UTF32: - case UTF32_16: case UTF8: return 4; default: return BAD; } @@ -144,14 +135,12 @@ inline uint Enc::szChar() const case EBCDIC: case UTF8: return 1; case UTF16: return 2; - case UTF32: - case UTF32_16: return 4; + case UTF32: return 4; default: return BAD; } } -// This test returns 'true' for all valid -// encoding types except UTF32_16 +// This test returns 'true' for all valid encoding types inline bool Enc::isBad() const { // test if 'type' is a power of 2 @@ -169,7 +158,6 @@ inline uint Enc::xlat(uint c) const case EBCDIC: return asc2ebc[c & 0xFF]; case UTF16: case UTF32: - case UTF32_16: case UTF8: return c; default: return BAD; } @@ -183,7 +171,6 @@ inline uint Enc::talx(uint c) const case EBCDIC: return ebc2asc[c & 0xFF]; case UTF16: case UTF32: - case UTF32_16: case UTF8: return c; default: return BAD; } diff --git a/re2c/main.cc b/re2c/main.cc index 1cc304a3..971433e6 100644 --- a/re2c/main.cc +++ b/re2c/main.cc @@ -362,7 +362,7 @@ int main(int argc, char *argv[]) if (encoding.isBad()) { - std::cerr << "re2c: error: Cannot combine -8 with -w or -u or -e switch\n"; + std::cerr << "re2c: error: Only one of switches -8, -w, -u and -e must be set\n"; return 2; } diff --git a/re2c/test/repeat-07.gir.re b/re2c/test/repeat-07.gir.re index 10d3793f..a068493a 100755 --- a/re2c/test/repeat-07.gir.re +++ b/re2c/test/repeat-07.gir.re @@ -49,8 +49,8 @@ void scan(unsigned int* in) { /*!use:re2c +re2c:flags:w = 0; re2c:flags:u = 1; -re2c:flags:w = 1; re2c:define:YYCTYPE = 'unsigned int'; re2c:define:YYFILL = 'fill3'; diff --git a/re2c/test/repeat-07_error.gir.c b/re2c/test/repeat-07_error.gir.c new file mode 100644 index 00000000..0ab2c8a3 --- /dev/null +++ b/re2c/test/repeat-07_error.gir.c @@ -0,0 +1,2 @@ +re2c: error: line 52, column 17: Cannot set '-u' switch: please reset '-e', '-w' and '-8' switches at first. + diff --git a/re2c/test/repeat-07_error.gir.re b/re2c/test/repeat-07_error.gir.re new file mode 100755 index 00000000..10d3793f --- /dev/null +++ b/re2c/test/repeat-07_error.gir.re @@ -0,0 +1,64 @@ +// multiple scanners, additional rules, char width change + +void scan(unsigned char* in) +{ +/*!rules:re2c + +"a" := return "a"; +"b" := return "b"; +"c" := return "c"; +"d" := return "d"; + +re2c:indent:top = 1; + +*//*!use:re2c + +re2c:flags:u = 0; +re2c:flags:w = 0; + +re2c:define:YYCTYPE = 'unsigned char'; +re2c:define:YYFILL = 'fill1'; +re2c:define:YYCURSOR = 'cursor1'; +re2c:define:YYLIMIT = 'limit1'; + +"1" := return "1"; +. := return "."; + +*/ +} + +void scan(unsigned short* in) +{ +/*!use:re2c + +re2c:flags:u = 0; +re2c:flags:w = 1; + +re2c:define:YYCTYPE = 'unsigned short'; +re2c:define:YYFILL = 'fill2'; +re2c:define:YYCURSOR = 'cursor2'; +re2c:define:YYLIMIT = 'limit2'; + +"2" := return "2"; +. := return "."; + +*/ +} + +void scan(unsigned int* in) +{ +/*!use:re2c + +re2c:flags:u = 1; +re2c:flags:w = 1; + +re2c:define:YYCTYPE = 'unsigned int'; +re2c:define:YYFILL = 'fill3'; +re2c:define:YYCURSOR = 'cursor3'; +re2c:define:YYLIMIT = 'limit3'; + +"3" := return "3"; +. := return "."; + +*/ +} -- 2.40.0