]> granicus.if.org Git - re2c/commitdiff
More accurate handling of default rule for '--skeleton'.
authorUlya Trofimovich <skvadrik@gmail.com>
Tue, 15 Sep 2015 09:45:19 +0000 (10:45 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Tue, 15 Sep 2015 09:45:19 +0000 (10:45 +0100)
re2c/src/codegen/skeleton/generate_code.cc
re2c/src/codegen/skeleton/generate_data.cc
re2c/src/codegen/skeleton/skeleton.cc
re2c/src/codegen/skeleton/skeleton.h

index 7d849229c823bb7b1d89e221eb8b45cbaabed5b5..47083942be1e278f78473650c3fea6a96b652d79 100644 (file)
@@ -28,11 +28,7 @@ static void exact_uint (OutputFile & o, size_t width)
 
 void Skeleton::emit_prolog (OutputFile & o, uint32_t maxfill) const
 {
-       const uint32_t default_rule = sizeof_key == 1
-               ? UINT8_MAX
-               : sizeof_key == 2
-                       ? UINT16_MAX
-                       : UINT32_MAX;
+       const uint32_t default_rule = maxkey ();
 
        o << "\n" << "#include <stdio.h>";
        o << "\n" << "#include <stdlib.h> // malloc, free";
index 625b7047464532f060429c2d895d12763758383b..b7b691dc39a1ad3a8aee1f6e576256622a5de034 100644 (file)
@@ -246,13 +246,17 @@ void Skeleton::emit_data (const char * fname)
 template <typename key_t>
        static void keygen (FILE * f, size_t count, size_t len, size_t len_match, rule_rank_t match)
 {
+       const key_t m = match.is_none ()
+               ? Skeleton::maxkey<key_t> ()
+               : static_cast<key_t> (match.uint32 ());
+
        const size_t keys_size = 3 * count;
        key_t * keys = new key_t [keys_size];
        for (uint32_t i = 0; i < keys_size;)
        {
                keys[i++] = static_cast<key_t> (len);
                keys[i++] = static_cast<key_t> (len_match);
-               keys[i++] = static_cast<key_t> (match.uint32 ());
+               keys[i++] = m;
        }
        fwrite (keys, sizeof (key_t), keys_size, f);
        delete [] keys;
index 616ada98f01590191a05db4a53b3dd4697980f0b..ae41fb63dd063e78e88e1763d47fc1e9bb5beaa0 100644 (file)
@@ -118,4 +118,19 @@ Skeleton::~Skeleton ()
        delete [] nodes;
 }
 
+template <> uint32_t Skeleton::maxkey<uint32_t> () { return UINT32_MAX; }
+template <> uint16_t Skeleton::maxkey<uint16_t> () { return UINT16_MAX; }
+template <> uint8_t  Skeleton::maxkey<uint8_t>  () { return UINT8_MAX;  }
+
+uint32_t Skeleton::maxkey () const
+{
+       switch (sizeof_key)
+       {
+               default: // shouldn't happen
+               case 4: return maxkey<uint32_t> ();
+               case 2: return maxkey<uint16_t> ();
+               case 1: return maxkey<uint8_t>  ();
+       }
+}
+
 } // namespace re2c
index cab3b21ea301bb31010c0f0d1f08e3add9276d36..804e6479085ff0e530eccd2534a41f1882677b3e 100644 (file)
@@ -75,6 +75,10 @@ struct Skeleton
        static void emit_epilog (OutputFile & o);
        static void emit_action (OutputFile & o, uint32_t ind, rule_rank_t rank);
 
+       template <typename key_t>
+               static key_t maxkey ();
+       uint32_t maxkey () const;
+
 private:
        template <typename cunit_t, typename key_t>
                void generate_paths_cunit_key (FILE * input, FILE * keys);