]> granicus.if.org Git - re2c/commitdiff
Continued adding "--skeleton" switch.
authorUlya Trofimovich <skvadrik@gmail.com>
Mon, 20 Apr 2015 12:26:25 +0000 (13:26 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Mon, 20 Apr 2015 12:26:25 +0000 (13:26 +0100)
Give up counting data when reached certain limit
('Skeleton::MAX_PATHS').

re2c/skeleton.cc
re2c/skeleton.h

index 5967d275d0d891e1fdefc390258c48a0d105be4a..177b1aa74b20680e1d7db21a80309a76136fd01a 100644 (file)
@@ -5,6 +5,8 @@
 namespace re2c
 {
 
+const uint Skeleton::MAX_PATHS = 1024 * 1024; // 1Mb
+
 Skeleton::Skeleton (const DFA & dfa)
        : states_count (dfa.nStates + 1)
        , states (new SkeletonState [states_count])
@@ -49,34 +51,36 @@ Skeleton::~Skeleton ()
        delete [] states;
 }
 
-unsigned long count_data (SkeletonState * s, unsigned long count)
+bool Skeleton::count (SkeletonState * s, uint n, uint & result)
 {
        if (s->is_end ())
        {
-               return count;
+               const bool overflow = MAX_PATHS - n < result;
+               if (!overflow)
+               {
+                       result += n;
+               }
+               return overflow;
        }
        else if (s->visited < 2)
        {
                s->visited++;
-               unsigned long result = 0;
                for (SkeletonState::go_t::iterator i = s->go.begin (); i != s->go.end (); ++i)
                {
-                       result += count_data (i->first, i->second.size () * count);
+                       if (count (i->first, i->second.size () * n, result))
+                       {
+                               return true;
+                       }
                }
                s->visited--;
-               return result;
+               return false;
        }
        else
        {
-               return 0;
+               return false;
        }
 }
 
-unsigned long Skeleton::count ()
-{
-       return count_data (states, 1);
-}
-
 /*
 void generate_data (DataFile & o, uint ind, SkeletonState * s, const std::vector<Path> & xs, std::vector<Result> & ys)
 {
@@ -214,7 +218,8 @@ void Skeleton::generate_data (std::vector<Path> & results)
 
 void Skeleton::emit_data (DataFile & o)
 {
-//     fprintf (stderr, "%lx\n%lx\n", 0xFFFFffffFFFFffff, count ());
+       uint result = 0;
+       fprintf (stderr, "%d\n", count (states, 1, result));
        uint ind = 0;
 
        std::string yyctype;
index 28dc261ea330db19659d21048c4cf8333faa3b06..fb8166411c539ce92d307fc7a225770a469cb9f3 100644 (file)
@@ -72,11 +72,13 @@ struct SkeletonState
 
 struct Skeleton
 {
+       static const uint MAX_PATHS;
        const uint states_count;
        SkeletonState * states;
+
        Skeleton (const DFA & dfa);
        ~Skeleton ();
-       unsigned long count ();
+       bool count (SkeletonState * s, uint n, uint & result);
        void generate_data (std::vector<Path> & results);
        void emit_data (DataFile & o);
 };