]> granicus.if.org Git - re2c/commitdiff
Removed compatibility encoding mode 'UTF32_16', generate error message when multiple...
authorUlya Fokanova <skvadrik@gmail.com>
Mon, 20 Jan 2014 15:43:41 +0000 (18:43 +0300)
committerUlya Fokanova <skvadrik@gmail.com>
Mon, 20 Jan 2014 15:43:41 +0000 (18:43 +0300)
re2c/code.cc
re2c/enc.h
re2c/main.cc
re2c/test/repeat-07.gir.re
re2c/test/repeat-07_error.gir.c [new file with mode: 0644]
re2c/test/repeat-07_error.gir.re [new file with mode: 0755]

index 2d6c659bab047c22b4c2e577da55b68b7ed6cc8c..23e9b9e4af07143745f96ab49d6b621e79561beb 100644 (file)
@@ -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
        {
index ab7b68b6265749b2a91c97d7626f8be069bd3bbe..8afd92adc24ebc2a504263e05b14e15400534211 100644 (file)
@@ -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;
        }
index 1cc304a3d691b1cab9c9d9690abbcef64e3d07da..971433e6b111fd62ebfe0421d08f6d75585ae489 100644 (file)
@@ -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;
        }
 
index 10d3793fc0ffe3547628569f8b1beb64746064dc..a068493ae9c4eda23fc50e9b5c2e187630a98aa4 100755 (executable)
@@ -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 (file)
index 0000000..0ab2c8a
--- /dev/null
@@ -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 (executable)
index 0000000..10d3793
--- /dev/null
@@ -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 ".";
+
+*/
+}