]> granicus.if.org Git - re2c/commitdiff
Narrowed the scope of ".data" file.
authorUlya Trofimovich <skvadrik@gmail.com>
Wed, 2 Sep 2015 11:39:47 +0000 (12:39 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Wed, 2 Sep 2015 11:39:47 +0000 (12:39 +0100)
re2c/src/codegen/output.cc
re2c/src/codegen/output.h
re2c/src/codegen/skeleton/skeleton.cc
re2c/src/codegen/skeleton/skeleton.h
re2c/src/ir/bytecode/bytecode.cc
re2c/src/main.cc

index e7e78f4f22d450d42e33da5eaa4195c945c4f2b5..854d1862828aa6425b5503dd64e9feb43ff5bed5 100644 (file)
@@ -343,31 +343,9 @@ HeaderFile::~HeaderFile ()
        }
 }
 
-DataFile::DataFile (const char * fn)
-       : file_name (fn == NULL ? "" : fn)
-       , file ()
-{
-       file_name += ".data";
-}
-
-bool DataFile::open ()
-{
-       file.open (file_name.c_str (), std::ofstream::out | std::ofstream::binary);
-       return file.is_open ();
-}
-
-DataFile::~DataFile ()
-{
-       if (file.is_open ())
-       {
-               file.close ();
-       }
-}
-
 Output::Output (const char * source_name, const char * header_name)
        : source (source_name)
        , header (header_name)
-       , data (source_name)
        , types ()
        , max_fill (1)
 {}
index 85d79782db9cea874e0cb87c398bfcbba084b229..fa0de2803c06a03a15a2d8311134cb397222dfbd 100644 (file)
@@ -49,8 +49,10 @@ struct OutputBlock
 
 struct OutputFile
 {
-private:
+public:
        const char * file_name;
+
+private:
        FILE * file;
        std::vector<OutputBlock *> blocks;
 
@@ -121,21 +123,10 @@ private:
        FORBID_COPY (HeaderFile);
 };
 
-struct DataFile
-{
-       DataFile (const char * fn);
-       ~DataFile ();
-       bool open ();
-
-       std::string file_name;
-       std::ofstream file;
-};
-
 struct Output
 {
        OutputFile source;
        HeaderFile header;
-       DataFile data;
        std::vector<std::string> types;
        uint32_t max_fill;
 
index c8af5425e8d9992735a1ffe4b0c2037d7d6886c7..e2b5ed895596fc5af5158f392d1326b30bd0491d 100644 (file)
@@ -1,6 +1,9 @@
+#include <stdlib.h> // exit
+
 #include "src/codegen/indent.h"
 #include "src/codegen/print.h"
 #include "src/codegen/skeleton/skeleton.h"
+#include "src/conf/msg.h"
 #include "src/ir/regexp/regexp_rule.h"
 #include "src/util/allocate.h"
 
@@ -266,8 +269,17 @@ void Skeleton::generate_paths (std::vector<path_t> & results)
        }
 }
 
-void Skeleton::emit_data (DataFile & o)
+void Skeleton::emit_data (const char * fname)
 {
+       const std::string dfname = std::string (fname) + ".data";
+       std::ofstream f;
+       f.open (dfname.c_str (), std::ofstream::out | std::ofstream::binary);
+       if (!f.is_open ())
+       {
+               error ("cannot open data file: %s", dfname.c_str ());
+               exit (1);
+       }
+
        uint32_t ind = 0;
 
        std::string yyctype;
@@ -284,19 +296,19 @@ void Skeleton::emit_data (DataFile & o)
                        break;
        }
 
-       o.file << "#define " << mapCodeName["YYCTYPE"] << yyctype << "\n";
-       o.file << "#define " << mapCodeName["YYPEEK"] << "() *cursor\n";
-       o.file << "#define " << mapCodeName["YYSKIP"] << "() ++cursor\n";
-       o.file << "#define " << mapCodeName["YYBACKUP"] << "() marker = cursor\n";
-       o.file << "#define " << mapCodeName["YYBACKUPCTX"] << "() ctxmarker = cursor\n";
-       o.file << "#define " << mapCodeName["YYRESTORE"] << "() cursor = marker\n";
-       o.file << "#define " << mapCodeName["YYRESTORECTX"] << "() cursor = ctxmarker\n";
-       o.file << "#define " << mapCodeName["YYLESSTHAN"] << "(n) (limit - cursor) < n\n";
-       o.file << "#define " << mapCodeName["YYFILL"] << "(n) { break; }\n";
+       f << "#define " << mapCodeName["YYCTYPE"] << yyctype << "\n";
+       f << "#define " << mapCodeName["YYPEEK"] << "() *cursor\n";
+       f << "#define " << mapCodeName["YYSKIP"] << "() ++cursor\n";
+       f << "#define " << mapCodeName["YYBACKUP"] << "() marker = cursor\n";
+       f << "#define " << mapCodeName["YYBACKUPCTX"] << "() ctxmarker = cursor\n";
+       f << "#define " << mapCodeName["YYRESTORE"] << "() cursor = marker\n";
+       f << "#define " << mapCodeName["YYRESTORECTX"] << "() cursor = ctxmarker\n";
+       f << "#define " << mapCodeName["YYLESSTHAN"] << "(n) (limit - cursor) < n\n";
+       f << "#define " << mapCodeName["YYFILL"] << "(n) { break; }\n";
 
-       o.file << indent (ind) << "// These strings correspond to paths in DFA.\n";
-       o.file << indent (ind) << "YYCTYPE data [] =\n";
-       o.file << indent (ind) << "{\n";
+       f << indent (ind) << "// These strings correspond to paths in DFA.\n";
+       f << indent (ind) << "YYCTYPE data [] =\n";
+       f << indent (ind) << "{\n";
 
        std::vector<path_t> ys;
        generate_paths (ys);
@@ -314,53 +326,55 @@ void Skeleton::emit_data (DataFile & o)
        }
        for (size_t i = 0; i < count; ++i)
        {
-               o.file << indent (ind + 1);
+               f << indent (ind + 1);
                const size_t len = ys[i].len ();
                for (size_t j = 0 ; j < len; ++j)
                {
-                       prtChOrHex (o.file, ys[i][j]);
-                       o.file << ",";
+                       prtChOrHex (f, ys[i][j]);
+                       f << ",";
                }
-               o.file << "\n";
+               f << "\n";
        }
-       o.file << indent (ind + 1);
+       f << indent (ind + 1);
        for (size_t j = 0 ; j < max_len; ++j) // pad with YMAXFILL zeroes
        {
-               o.file << "0,";
+               f << "0,";
        }
-       o.file << "\n";
-       o.file << indent (ind) << "};\n";
-       o.file << indent (ind) << "const unsigned int data_size = sizeof (data) / sizeof (YYCTYPE);\n";
+       f << "\n";
+       f << indent (ind) << "};\n";
+       f << indent (ind) << "const unsigned int data_size = sizeof (data) / sizeof (YYCTYPE);\n";
 
-       o.file << indent (ind) << "const unsigned int count = " << count << ";\n";
+       f << indent (ind) << "const unsigned int count = " << count << ";\n";
 
        size_t pos = 0;
-       o.file << indent (ind) << "struct Result {\n";
-       o.file << indent (ind + 1) << "unsigned int endpos;\n";
-       o.file << indent (ind + 1) << "unsigned int startpos;\n";
-       o.file << indent (ind + 1) << "unsigned int rule;\n";
-       o.file << indent (ind + 1) << "Result (unsigned int e, unsigned int s, unsigned int r) : endpos (e), startpos (s), rule (r) {}\n";
-       o.file << indent (ind) << "};\n";
-       o.file << indent (ind) << "Result result [] =\n";
-       o.file << indent (ind) << "{\n";
+       f << indent (ind) << "struct Result {\n";
+       f << indent (ind + 1) << "unsigned int endpos;\n";
+       f << indent (ind + 1) << "unsigned int startpos;\n";
+       f << indent (ind + 1) << "unsigned int rule;\n";
+       f << indent (ind + 1) << "Result (unsigned int e, unsigned int s, unsigned int r) : endpos (e), startpos (s), rule (r) {}\n";
+       f << indent (ind) << "};\n";
+       f << indent (ind) << "Result result [] =\n";
+       f << indent (ind) << "{\n";
        for (size_t i = 0; i < count; ++i)
        {
                const size_t new_pos = pos + ys[i].len ();
-               o.file << indent (ind + 1) << "Result (" << pos + ys[i].len_matching () << "," << new_pos << "," << ys[i].match () << "),\n";
+               f << indent (ind + 1) << "Result (" << pos + ys[i].len_matching () << "," << new_pos << "," << ys[i].match () << "),\n";
                pos = new_pos;
        }
-       o.file << indent (ind) << "};\n";
+       f << indent (ind) << "};\n";
+
+       f << indent (ind) << "const YYCTYPE * cursor = data;\n";
+       f << indent (ind) << "const YYCTYPE * marker = data;\n";
+       f << indent (ind) << "const YYCTYPE * ctxmarker = data;\n";
+       f << indent (ind) << "const YYCTYPE * const limit = &data[data_size - 1];\n";
 
-       o.file << indent (ind) << "const YYCTYPE * cursor = data;\n";
-       o.file << indent (ind) << "const YYCTYPE * marker = data;\n";
-       o.file << indent (ind) << "const YYCTYPE * ctxmarker = data;\n";
-       o.file << indent (ind) << "const YYCTYPE * const limit = &data[data_size - 1];\n";
+       f.close ();
 }
 
-void emit_prolog (OutputFile & o, uint32_t ind, const char * data_name)
+void emit_prolog (OutputFile & o, uint32_t ind)
 {
        o << indent (ind) << "#include <stdio.h>\n";
-       o << indent (ind) << "#include \"" << data_name << "\"\n";
+       o << indent (ind) << "#include \"" << o.file_name << ".data" << "\"\n";
        o << indent (ind) << "int main ()\n";
        o << indent (ind) << "{\n";
        o << indent (ind + 1) << "for (unsigned int i = 0; i < count; ++i)\n";
index d36993b11b676dcabd21246ecd70d7f20c358649..ae62cb26e08a5ba1e11fde5db3838b680f65576e 100644 (file)
@@ -62,12 +62,12 @@ struct Skeleton
        ~Skeleton ();
        void generate_paths (std::vector<path_t> & results);
        void warn_undefined_control_flow (uint32_t line, const std::string & cond);
-       void emit_data (DataFile & o);
+       void emit_data (const char * fname);
 
        FORBID_COPY (Skeleton);
 };
 
-void emit_prolog (OutputFile & o, uint32_t ind, const char * data_name);
+void emit_prolog (OutputFile & o, uint32_t ind);
 void emit_epilog (OutputFile & o, uint32_t ind);
 
 } // namespace re2c
index b38ff8c2281d46ae7c4255b6d1e7ba13c991761c..b893fb4e364c7ad337598d16672280466575ffad 100644 (file)
@@ -61,8 +61,8 @@ smart_ptr<DFA> genCode (RegExp *re, Output & output, uint32_t ind, const std::st
 
        if (flag_skeleton)
        {
-               skeleton.emit_data (output.data);
-               emit_prolog (output.source, ind, output.data.file_name.c_str ());
+               skeleton.emit_data (output.source.file_name);
+               emit_prolog (output.source, ind);
        }
 
        dfa->prepare (output.source, output.max_fill);
index 550e04c297e71382965f46dcc1bce5f8e66ba8bf..448b3f360e3a4c5a305a8d001bacc5351da429cc 100644 (file)
@@ -47,11 +47,6 @@ int main(int, char *argv[])
                error ("cannot open header file: %s", opts.header_file);
                return 1;
        }
-       if (flag_skeleton && !output.data.open ())
-       {
-               error ("cannot open data file: %s", output.data.file_name.c_str ());
-               return 1;
-       }
 
        Scanner scanner (input, output.source);
        parse (scanner, output);