Re: New release of Debian ROOT packages - Development Snapshot

From: Christian Holm Christensen <cholm_at_nbi.dk>
Date: Tue, 31 Oct 2006 09:24:20 +0100


Hi Fons,

On Mon, 2006-10-30 at 17:50 +0100, Fons Rademakers wrote:
> Hi Valeri,
>
> yes I can expose the content of config.h via TROOT.

I suggest, if you do that, that you make a dedicated singleton class (perhaps with interfaces from TROOT) that looks something like

        class TROOTSourceConfig 
        {
        public:
          static TROOTSourceConfig& Instance()
          {
             if (!fgInstance) fgInstance = new TROOTSourceConfig;
             return *fgInstance;
          }
          const char* GetBinDir() const 
          { 
            return GetEnvOrFixed(fBinDir, "ROOTBINDIR", "bin", ROOTBINDIR");
          }
          // .. More like this 
        protected:
          TROOTSourceConfig() {}
          TROOTSourceConfig(const TROOTSourceConfig&) {}
          TROOTSourceConfig& operator=(const TROOTSourceConfig&) { return *this; }
          const char* GetEnvOrFixed(TString& var, const char* env, const char* postfix,
                                    const char* fixed) const
          { 
            if (var.IsNull()) {
               const char* tmp = 0;
               if      ((tmp = gROOT->Getenv(env)))       var = tmp;
               else if ((tmp = gROOT->Getenv("ROOTSYS"))) var = Form("%s/%s", tmp, postfix);
               else                                       var = fixed;
               if (tmp) delete tmp;
            }
            return var.Data();
          }
          mutable TString fBinDir;
          // ... more like this

    };

In this way, the same compiled code can be used for both an environment driven install and a fixed location install. If TString is substituded with `std::string', the TROOT::Getenv calls are substituted with `std::getenv' calls, and the Form call is substituted with an internal function, this code could also be used in start=up programs like `root', `rootd', etc. - that is, programs that may not load `libCore' immediately.

If a function like

        bool ReadFromFile(const char* file)
        {
           std::ifstream in(file);
           if (!in) return false;
           
           while (true) {
             std::string line;
             bool done = false;
             while (true) {
               char c = in.peek();
               switch (c) {
               case ' ':   // Leading white space 
               case '\t':
               case '\n':
                 in.get();
                 break;
               case '#': // Comment line 
                 std::getline(in, line);
                 break;
               default:
                 done = true;
                 break;
               }
               if (done) break;
             }
             // Get key 
             std::string key; 
             in >> key;
             if (key[key.size()-1] == ':') key.erase(key.size()-1);
            
             // Read white space, and optional `:'
             while (true) {
               bool done = false;
             while (true) {
               char c = in.peek();
               switch (c) {
               case ' ':   // Leading white space 
               case '\t':
               case '\n': // Allow broken lines
               case ':':
                 in.get();
                 break;
               case '#': // Comment line 
                 std::getline(in, line);
                 break;
               default:
                 done = true;
                 break;
               }
               if (done) break;
             }
             std::string val;
             in >> val;
        
             if      (key == "BinDir")   fBinDir = val;
             else if (key == "LibDir")   fLibDir = val;
             ...
          }
          return true;
        }
        

This would allow programs to read fixed settings from a (user specified) file, making it easier to make the code relocatable (there's still a problem with the dynamic library path though). For example, one could add a command line switch to `root' that allowed the user to select which file to read from. All this could of course be done via TEnv if it didn't depend on `libCore'.

Yours,

-- 
 ___  |  Christian Holm Christensen 
  |_| |  -------------------------------------------------------------
    | |  Address: Sankt Hansgade 23, 1. th.  Phone:  (+45) 35 35 96 91
     _|           DK-2200 Copenhagen N       Cell:   (+45) 24 61 85 91
    _|            Denmark                    Office: (+45) 353  25 404
 ____|   Email:   cholm_at_nbi.dk               Web:    www.nbi.dk/~cholm
 | |
Received on Tue Oct 31 2006 - 09:24:32 MET

This archive was generated by hypermail 2.2.0 : Mon Jan 01 2007 - 16:32:01 MET