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";
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;
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
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);