]> granicus.if.org Git - re2c/commitdiff
Automatically resync options on read acccess (if they have been updated).
authorUlya Trofimovich <skvadrik@gmail.com>
Wed, 23 Sep 2015 21:08:39 +0000 (22:08 +0100)
committerUlya Trofimovich <skvadrik@gmail.com>
Wed, 23 Sep 2015 21:08:39 +0000 (22:08 +0100)
re2c/bootstrap/src/conf/parse_opts.cc
re2c/src/conf/opt.cc
re2c/src/conf/opt.h
re2c/src/conf/parse_opts.re

index 98306458e4ffa53bf6fbf9fce638d4573cb3bba6..d372e1ab35b79f0fe9f464da042f773b34030a99 100644 (file)
@@ -1,4 +1,4 @@
-/* Generated by re2c 0.14.3 on Wed Sep 23 17:21:05 2015 */
+/* Generated by re2c 0.14.3 on Wed Sep 23 18:04:07 2015 */
 #line 1 "../src/conf/parse_opts.re"
 #include <stdio.h>
 
@@ -1853,8 +1853,6 @@ yy623:
 
 
 end:
-       opts.sync ();
-
        if (!opts.source_file)
        {
                error ("no source file");
index 0735917769b3408e130d3ba5aa03a20fcc8ff950..854131838e02e9636317878d3d3987b4a6dabb03 100644 (file)
@@ -272,92 +272,118 @@ void opt_t::fix ()
        }
 }
 
-const opt_t Opt::baseopt;
+realopt_t::realopt_t (useropt_t & opt)
+       : real ()
+       , user (opt)
+{}
+
+const opt_t * realopt_t::operator -> ()
+{
+       sync ();
+       return &real;
+}
 
-void Opt::sync ()
+void realopt_t::sync ()
 {
-       realopt = useropt;
-       realopt.fix ();
+       if (user.diverge)
+       {
+               real = user.opt;
+               real.fix ();
+               user.diverge = false;
+       }
 }
 
+useropt_t::useropt_t ()
+       : opt ()
+       , diverge (false)
+{}
+
+opt_t * useropt_t::operator -> ()
+{
+       diverge = true;
+       return &opt;
+}
+
+const opt_t Opt::baseopt;
+
 void Opt::set_target (opt_t::target_t tgt)
 {
-       useropt.target = tgt;
+       useropt->target = tgt;
 }
 
 void Opt::bit_vectors ()
 {
-       useropt.bFlag = true;
+       useropt->bFlag = true;
 }
 
 void Opt::start_conditions ()
 {
-       useropt.cFlag = true;
+       useropt->cFlag = true;
 }
 
 void Opt::debug_output ()
 {
-       useropt.dFlag = true;
+       useropt->dFlag = true;
 }
 
 void Opt::storable_state ()
 {
-       useropt.fFlag = true;
+       useropt->fFlag = true;
 }
 
 void Opt::flex_syntax ()
 {
-       useropt.FFlag = true;
+       useropt->FFlag = true;
 }
 
 void Opt::computed_gotos ()
 {
-       useropt.gFlag = true;
+       useropt->gFlag = true;
 }
 
 void Opt::no_debug_info ()
 {
-       useropt.iFlag = true;
+       useropt->iFlag = true;
 }
 
 void Opt::reusable ()
 {
-       useropt.rFlag = true;
+       useropt->rFlag = true;
 }
 
 void Opt::nested_ifs ()
 {
-       useropt.sFlag = true;
+       useropt->sFlag = true;
 }
 
 void Opt::no_generation_date ()
 {
-       useropt.bNoGenerationDate = true;
+       useropt->bNoGenerationDate = true;
 }
 
 void Opt::case_insensitive ()
 {
-       useropt.bCaseInsensitive = true;
+       useropt->bCaseInsensitive = true;
 }
 
 void Opt::case_inverted ()
 {
-       useropt.bCaseInverted = true;
+       useropt->bCaseInverted = true;
 }
 
 void Opt::encoding_policy (Enc::policy_t p)
 {
-       useropt.encoding.setPolicy (p);
+       useropt->encoding.setPolicy (p);
 }
 
 void Opt::input (InputAPI::type_t i)
 {
-       useropt.input_api.set (i);
+       useropt->input_api.set (i);
 }
 
 void Opt::empty_class (empty_class_policy_t p)
 {
-       useropt.empty_class_policy = p;
+       useropt->empty_class_policy = p;
 }
 
 bool Opt::source (const char * s)
@@ -390,233 +416,203 @@ bool Opt::output (const char * s)
 
 bool Opt::type_header (const char * s)
 {
-       if (useropt.header_file)
+       if (useropt->header_file)
        {
-               error ("multiple header files: %s, %s", useropt.header_file, s);
+               error ("multiple header files: %s, %s", useropt->header_file, s);
                return false;
        }
        else
        {
-               useropt.tFlag = true;
-               useropt.header_file = s;
+               useropt->tFlag = true;
+               useropt->header_file = s;
                return true;
        }
 }
 
 bool Opt::ecb ()
 {
-       return useropt.encoding.set (Enc::EBCDIC);
+       return useropt->encoding.set (Enc::EBCDIC);
 }
 
 bool Opt::unicode ()
 {
-       return useropt.encoding.set(Enc::UTF32);
+       return useropt->encoding.set(Enc::UTF32);
 }
 
 bool Opt::wide_chars ()
 {
-       return useropt.encoding.set(Enc::UCS2);
+       return useropt->encoding.set(Enc::UCS2);
 }
 
 bool Opt::utf_16 ()
 {
-       return useropt.encoding.set(Enc::UTF16);
+       return useropt->encoding.set(Enc::UTF16);
 }
 
 bool Opt::utf_8 ()
 {
-       return useropt.encoding.set(Enc::UTF8);
+       return useropt->encoding.set(Enc::UTF8);
 }
 
 bool Opt::sync_mapCodeName (const std::string & key, const std::string & val)
 {
-       if (!useropt.mapCodeName.insert (std::make_pair (key, val)).second)
+       if (!useropt->mapCodeName.insert (std::make_pair (key, val)).second)
        {
                return false;
        }
-       sync ();
        return true;
 }
 
 void Opt::sync_condPrefix (const std::string & s)
 {
-       useropt.condPrefix = s;
-       sync ();
+       useropt->condPrefix = s;
 }
 
 void Opt::sync_condEnumPrefix (const std::string & s)
 {
-       useropt.condEnumPrefix = s;
-       sync ();
+       useropt->condEnumPrefix = s;
 }
 
 void Opt::sync_condDivider (const std::string & s)
 {
-       useropt.condDivider = s;
-       sync ();
+       useropt->condDivider = s;
 }
 
 void Opt::sync_condDividerParam (const std::string & s)
 {
-       useropt.condDividerParam = s;
-       sync ();
+       useropt->condDividerParam = s;
 }
 
 void Opt::sync_condGoto (const std::string & s)
 {
-       useropt.condGoto = s;
-       sync ();
+       useropt->condGoto = s;
 }
 
 void Opt::sync_condGotoParam (const std::string & s)
 {
-       useropt.condGotoParam = s;
-       sync ();
+       useropt->condGotoParam = s;
 }
 
 void Opt::sync_cGotoThreshold (uint32_t n)
 {
-       useropt.cGotoThreshold = n;
-       sync ();
+       useropt->cGotoThreshold = n;
 }
 
 void Opt::sync_bUseYYFillNaked (bool b)
 {
-       useropt.bUseYYFillNaked = b;
-       sync ();
+       useropt->bUseYYFillNaked = b;
 }
 
 void Opt::sync_yyFillLength (const std::string & s)
 {
-       useropt.yyFillLength = s;
-       useropt.bUseYYFillParam = false;
-       sync ();
+       useropt->yyFillLength = s;
+       useropt->bUseYYFillParam = false;
 }
 
 void Opt::sync_bUseYYGetConditionNaked (bool b)
 {
-       useropt.bUseYYGetConditionNaked = b;
-       sync ();
+       useropt->bUseYYGetConditionNaked = b;
 }
 
 void Opt::sync_bUseYYGetStateNaked (bool b)
 {
-       useropt.bUseYYGetStateNaked = b;
-       sync ();
+       useropt->bUseYYGetStateNaked = b;
 }
 
 void Opt::sync_yySetConditionParam (const std::string & s)
 {
-       useropt.yySetConditionParam = s;
-       useropt.bUseYYSetConditionParam = false;
-       sync ();
+       useropt->yySetConditionParam = s;
+       useropt->bUseYYSetConditionParam = false;
 }
 
 void Opt::sync_bUseYYSetStateNaked (bool b)
 {
-       useropt.bUseYYSetStateNaked = b;
-       sync ();
+       useropt->bUseYYSetStateNaked = b;
 }
 
 void Opt::sync_yySetStateParam (const std::string & s)
 {
-       useropt.yySetStateParam = s;
-       useropt.bUseYYSetStateParam = false;
-       sync ();
+       useropt->yySetStateParam = s;
+       useropt->bUseYYSetStateParam = false;
 }
 
 bool Opt::sync_encoding (Enc::type_t t)
 {
-       if (!useropt.encoding.set (t))
+       if (!useropt->encoding.set (t))
        {
                return false;
        }
-       sync ();
        return true;
 }
 
 void Opt::sync_encoding_unset (Enc::type_t t)
 {
-       useropt.encoding.unset (t);
-       sync ();
+       useropt->encoding.unset (t);
 }
 
 void Opt::sync_indString (const std::string & s)
 {
-       useropt.indString = s;
-       sync ();
+       useropt->indString = s;
 }
 
 void Opt::sync_topIndent (uint32_t n)
 {
-       useropt.topIndent = n;
-       sync ();
+       useropt->topIndent = n;
 }
 
 void Opt::sync_labelPrefix (const std::string & s)
 {
-       useropt.labelPrefix = s;
-       sync ();
+       useropt->labelPrefix = s;
 }
 
 void Opt::sync_bUseStateAbort (bool b)
 {
-       useropt.bUseStateAbort = b;
-       sync ();
+       useropt->bUseStateAbort = b;
 }
 
 void Opt::sync_bUseStateNext (bool b)
 {
-       useropt.bUseStateNext = b;
-       sync ();
+       useropt->bUseStateNext = b;
 }
 
 void Opt::sync_yybmHexTable (bool b)
 {
-       useropt.yybmHexTable = b;
-       sync ();
+       useropt->yybmHexTable = b;
 }
 
 void Opt::sync_yychConversion (bool b)
 {
-       useropt.yychConversion = b;
-       sync ();
+       useropt->yychConversion = b;
 }
 
 void Opt::sync_bEmitYYCh (bool b)
 {
-       useropt.bEmitYYCh = b;
-       sync ();
+       useropt->bEmitYYCh = b;
 }
 
 void Opt::sync_bUseYYFillCheck (bool b)
 {
-       useropt.bUseYYFillCheck = b;
-       sync ();
+       useropt->bUseYYFillCheck = b;
 }
 
 void Opt::sync_bUseYYFill (bool b)
 {
-       useropt.bUseYYFill = b;
-       sync ();
+       useropt->bUseYYFill = b;
 }
 
 void Opt::sync_bUseYYFillParam (bool b)
 {
-       useropt.bUseYYFillParam = b;
-       sync ();
+       useropt->bUseYYFillParam = b;
 }
 
 void Opt::sync_reset_encoding (const Enc & enc)
 {
-       useropt.encoding = enc;
-       sync ();
+       useropt->encoding = enc;
 }
 
 void Opt::sync_reset_mapCodeName ()
 {
-       useropt.mapCodeName.clear ();
-       sync ();
+       useropt->mapCodeName.clear ();
 }
 
 } // namespace re2c
index c8eed62d1a68ff01c38a40009f7e752e582ecb5f..7477281ca4e347a63260369edcdf7b43225b8b8d 100644 (file)
@@ -71,6 +71,27 @@ struct opt_t
        void fix ();
 };
 
+class useropt_t;
+class realopt_t
+{
+       opt_t real;
+       useropt_t & user;
+public:
+       realopt_t (useropt_t & opt);
+       const opt_t * operator -> ();
+       void sync ();
+};
+
+class useropt_t
+{
+       opt_t opt;
+       bool diverge;
+public:
+       useropt_t ();
+       opt_t * operator -> ();
+       friend void realopt_t::sync ();
+};
+
 struct Opt
 {
        static const opt_t baseopt;
@@ -79,19 +100,22 @@ struct Opt
        const char * output_file;
 
 private:
-       opt_t useropt;
-       opt_t realopt;
+       useropt_t useropt;
+       realopt_t realopt;
 
 public:
        Opt ()
                : source_file (NULL)
                , output_file (NULL)
                , useropt ()
-               , realopt ()
+               , realopt (useropt)
        {}
 
-       void sync ();
-
+       // Inplace configurations are applied immediately when parsed.
+       // This is very bad: first, re2c behaviour is changed in the middle
+       // of the block; second, config is resynced too often (every
+       // attempt to read config that has been updated results in
+       // automatic resync). It is much better to set all options at once.
        void set_target (opt_t::target_t tgt);
        void bit_vectors ();
        void start_conditions ();
@@ -116,10 +140,6 @@ public:
        bool wide_chars ();
        bool utf_16 ();
        bool utf_8 ();
-
-       // Inplace configurations are applied immediately when parsed.
-       // This is very bad: first, re2c behaviour is changed in the middle
-       // of the block; second, we have to re-sync config every time.
        bool sync_mapCodeName (const std::string & key, const std::string & val);
        bool sync_encoding (Enc::type_t t);
        void sync_encoding_unset (Enc::type_t t);
@@ -153,57 +173,57 @@ public:
        void sync_reset_encoding (const Enc & enc);
        void sync_reset_mapCodeName ();
 
-       opt_t::target_t target ()                  const { return realopt.target; }
-       bool bFlag ()                              const { return realopt.bFlag; }
-       bool cFlag ()                              const { return realopt.cFlag; }
-       bool dFlag ()                              const { return realopt.dFlag; }
-       bool fFlag ()                              const { return realopt.fFlag; }
-       bool FFlag ()                              const { return realopt.FFlag; }
-       bool gFlag ()                              const { return realopt.gFlag; }
-       bool iFlag ()                              const { return realopt.iFlag; }
-       bool rFlag ()                              const { return realopt.rFlag; }
-       bool sFlag ()                              const { return realopt.sFlag; }
-       bool tFlag ()                              const { return realopt.tFlag; }
-       const char * header_file ()                const { return realopt.header_file; }
-       bool bNoGenerationDate ()                  const { return realopt.bNoGenerationDate; }
-       bool bEmitYYCh ()                          const { return realopt.bEmitYYCh; }
-       std::string yychConversion () const
+       opt_t::target_t target ()                  { return realopt->target; }
+       bool bFlag ()                              { return realopt->bFlag; }
+       bool cFlag ()                              { return realopt->cFlag; }
+       bool dFlag ()                              { return realopt->dFlag; }
+       bool fFlag ()                              { return realopt->fFlag; }
+       bool FFlag ()                              { return realopt->FFlag; }
+       bool gFlag ()                              { return realopt->gFlag; }
+       bool iFlag ()                              { return realopt->iFlag; }
+       bool rFlag ()                              { return realopt->rFlag; }
+       bool sFlag ()                              { return realopt->sFlag; }
+       bool tFlag ()                              { return realopt->tFlag; }
+       const char * header_file ()                { return realopt->header_file; }
+       bool bNoGenerationDate ()                  { return realopt->bNoGenerationDate; }
+       bool bEmitYYCh ()                          { return realopt->bEmitYYCh; }
+       std::string yychConversion ()
        {
-               return realopt.yychConversion
-                       ? "(" + realopt.mapCodeName["YYCTYPE"] + ")"
+               return realopt->yychConversion
+                       ? "(" + realopt->mapCodeName["YYCTYPE"] + ")"
                        : "";
        }
-       bool bUseStateNext ()                      const { return realopt.bUseStateNext; }
-       bool bUseYYFill ()                         const { return realopt.bUseYYFill; }
-       bool bUseYYFillParam ()                    const { return realopt.bUseYYFillParam; }
-       bool bUseYYFillCheck ()                    const { return realopt.bUseYYFillCheck; }
-       bool bUseYYFillNaked ()                    const { return realopt.bUseYYFillNaked; }
-       bool bUseYYSetConditionParam ()            const { return realopt.bUseYYSetConditionParam; }
-       bool bUseYYGetConditionNaked ()            const { return realopt.bUseYYGetConditionNaked; }
-       bool bUseYYSetStateParam ()                const { return realopt.bUseYYSetStateParam; }
-       bool bUseYYSetStateNaked ()                const { return realopt.bUseYYSetStateNaked; }
-       bool bUseYYGetStateNaked ()                const { return realopt.bUseYYGetStateNaked; }
-       bool yybmHexTable ()                       const { return realopt.yybmHexTable; }
-       bool bUseStateAbort ()                     const { return realopt.bUseStateAbort; }
-       bool bCaseInsensitive ()                   const { return realopt.bCaseInsensitive; }
-       bool bCaseInverted ()                      const { return realopt.bCaseInverted; }
-       uint32_t cGotoThreshold ()                 const { return realopt.cGotoThreshold; }
-       uint32_t topIndent ()                      const { return realopt.topIndent; }
-       const std::string & indString ()           const { return realopt.indString; }
-       const std::string & labelPrefix ()         const { return realopt.labelPrefix; }
-       const std::string & condPrefix ()          const { return realopt.condPrefix; }
-       const std::string & condEnumPrefix ()      const { return realopt.condEnumPrefix; }
-       const std::string & condDivider ()         const { return realopt.condDivider; }
-       const std::string & condDividerParam ()    const { return realopt.condDividerParam; }
-       const std::string & condGoto ()            const { return realopt.condGoto; }
-       const std::string & condGotoParam ()       const { return realopt.condGotoParam; }
-       const std::string & yyFillLength ()        const { return realopt.yyFillLength; }
-       const std::string & yySetConditionParam () const { return realopt.yySetConditionParam; }
-       const std::string & yySetStateParam ()     const { return realopt.yySetStateParam; }
-       const CodeNames & mapCodeName ()           const { return realopt.mapCodeName; }
-       const Enc & encoding ()                    const { return realopt.encoding; }
-       const InputAPI & input_api ()              const { return realopt.input_api; }
-       empty_class_policy_t empty_class_policy () const { return realopt.empty_class_policy; }
+       bool bUseStateNext ()                      { return realopt->bUseStateNext; }
+       bool bUseYYFill ()                         { return realopt->bUseYYFill; }
+       bool bUseYYFillParam ()                    { return realopt->bUseYYFillParam; }
+       bool bUseYYFillCheck ()                    { return realopt->bUseYYFillCheck; }
+       bool bUseYYFillNaked ()                    { return realopt->bUseYYFillNaked; }
+       bool bUseYYSetConditionParam ()            { return realopt->bUseYYSetConditionParam; }
+       bool bUseYYGetConditionNaked ()            { return realopt->bUseYYGetConditionNaked; }
+       bool bUseYYSetStateParam ()                { return realopt->bUseYYSetStateParam; }
+       bool bUseYYSetStateNaked ()                { return realopt->bUseYYSetStateNaked; }
+       bool bUseYYGetStateNaked ()                { return realopt->bUseYYGetStateNaked; }
+       bool yybmHexTable ()                       { return realopt->yybmHexTable; }
+       bool bUseStateAbort ()                     { return realopt->bUseStateAbort; }
+       bool bCaseInsensitive ()                   { return realopt->bCaseInsensitive; }
+       bool bCaseInverted ()                      { return realopt->bCaseInverted; }
+       uint32_t cGotoThreshold ()                 { return realopt->cGotoThreshold; }
+       uint32_t topIndent ()                      { return realopt->topIndent; }
+       const std::string & indString ()           { return realopt->indString; }
+       const std::string & labelPrefix ()         { return realopt->labelPrefix; }
+       const std::string & condPrefix ()          { return realopt->condPrefix; }
+       const std::string & condEnumPrefix ()      { return realopt->condEnumPrefix; }
+       const std::string & condDivider ()         { return realopt->condDivider; }
+       const std::string & condDividerParam ()    { return realopt->condDividerParam; }
+       const std::string & condGoto ()            { return realopt->condGoto; }
+       const std::string & condGotoParam ()       { return realopt->condGotoParam; }
+       const std::string & yyFillLength ()        { return realopt->yyFillLength; }
+       const std::string & yySetConditionParam () { return realopt->yySetConditionParam; }
+       const std::string & yySetStateParam ()     { return realopt->yySetStateParam; }
+       const CodeNames & mapCodeName ()           { return realopt->mapCodeName; }
+       const Enc & encoding ()                    { return realopt->encoding; }
+       const InputAPI & input_api ()              { return realopt->input_api; }
+       empty_class_policy_t empty_class_policy () { return realopt->empty_class_policy; }
 
        FORBID_COPY (Opt);
 };
index 5e3da4485b98a09db02bf3108df7ab5e20a27dd1..64be37db727e128c255450976b156998b3e4094f 100644 (file)
@@ -226,8 +226,6 @@ opt_empty_class:
 */
 
 end:
-       opts.sync ();
-
        if (!opts.source_file)
        {
                error ("no source file");