68#include "RConfigure.h" 
   86static struct BoolNameTable_t {
 
  115   TEnvParser(
TEnv *
e, FILE *
f) : fIfp(
f), fEnv(
e) { }
 
  116   virtual ~TEnvParser() { }
 
  126void TEnvParser::Parse()
 
  133   while ((
c = fgetc(fIfp)) != EOF) {
 
  138         if (
name.Length() > 0) {
 
  181         if (
c != 
' ' && 
c != 
'\t')
 
  194         state = (
c == 
':') ? 3 : 4;
 
  198         state = (
c == 
')') ? 6 : 5;
 
  217   if (
name.Length() > 0) {
 
  228class TReadEnvParser : 
public TEnvParser {
 
  236      { fEnv->SetValue(
name, value, fLevel, 
type); }
 
  242class TWriteEnvParser : 
public TEnvParser {
 
  248   TWriteEnvParser(
TEnv *
e, FILE *
f, FILE *of) : TEnvParser(
e, 
f), fOfp(of) { }
 
  264      fprintf(fOfp, 
"%s", value.
Data());
 
  275   : fName(
n), fType(t), fLevel(
l)
 
  301           "duplicate entry <%s=%s> for level %d; ignored", 
fName.
Data(), 
v, 
l);
 
  337   char *
v, *vorg = 
StrDup(value);
 
  342   while ((
s1 = (
char*)strstr(
v, 
"$("))) {
 
  344      s2 = (
char*)strchr(
s1, 
')');
 
  351      if (vv) len += strlen(vv);
 
  362   int nch = strlen(
v) + len;
 
  363   char *nv = 
new char[nch];
 
  366   while ((
s1 = (
char*)strstr(
v, 
"$("))) {
 
  371      s2 = (
char*)strchr(
s1, 
')');
 
  374      if (vv) strlcat(nv, vv,nch);
 
  379   if (*
v) strlcat(nv, 
v,nch);
 
  445      haveProgName = 
kTRUE;
 
  451      aname += 
"."; aname += 
name;
 
  456      aname += 
"."; aname += 
name;
 
  463   if (er == 0 && haveProgName && 
gProgName) {
 
  467   if (er == 0 && 
gROOT) {
 
  468      aname = 
gROOT->GetName(); aname += 
"."; aname += 
name;
 
  472      aname = 
"*.*."; aname += 
name;
 
  476      aname = 
"*."; aname += 
name;
 
  495      char buf2[512], *cp2 = buf2;
 
  497      while (isspace((
int)*cp))
 
  501         if (isdigit((
int)*cp) || *cp == 
'-' || *cp == 
'+')
 
  503         while (isalpha((
int)*cp))
 
  504            *cp2++ = toupper((
int)*cp++);
 
  507            if (strcmp(buf2, bt->fName) == 0)
 
  524      if (val == 0.0 && cp == endptr)
 
  558   if (!opt || !opt[0]) {
 
  563   if (!strcmp(opt, 
"global"))
 
  565   if (!strcmp(opt, 
"user"))
 
  567   if (!strcmp(opt, 
"local"))
 
  580   static const char *lc[] = { 
"Global", 
"User", 
"Local", 
"Changed", 
"All" };
 
  582   while ((er = (
TEnvRec*) next()))
 
  594   if (!fname || !fname[0]) {
 
  595      Error(
"ReadFile", 
"no file name specified");
 
  600   if ((ifp = fopen(fname, 
"r"))) {
 
  601      TReadEnvParser rp(
this, ifp, level);
 
  619   if (!fname || !fname[0]) {
 
  620      Error(
"WriteFile", 
"no file name specified");
 
  625      Error(
"WriteFile", 
"TEnv table is empty");
 
  630   if ((ofp = fopen(fname, 
"w"))) {
 
  633      while ((er = (
TEnvRec*) next()))
 
  641   Error(
"WriteFile", 
"cannot open %s for writing", fname);
 
  652      Error(
"Save", 
"no resource file name specified");
 
  667      Error(
"SaveLevel", 
"no resource file name specified");
 
  672      Error(
"SaveLevel", 
"TEnv table is empty");
 
  695   if ((ofp = fopen(
Form(
"%s.new", rootrcdir.
Data()), 
"w"))) {
 
  696      ifp = fopen(rootrcdir.
Data(), 
"r");
 
  698         ifp = fopen(rootrcdir.
Data(), 
"w");
 
  704      if (ifp || (ifp = fopen(rootrcdir.
Data(), 
"r"))) {
 
  705         TWriteEnvParser wp(
this, ifp, ofp);
 
  710         while ((er = (
TEnvRec*) next())) {
 
  715               if (er->
fLevel == level) {
 
  730      Error(
"SaveLevel", 
"cannot write to file %s", rootrcdir.
Data());
 
  742   const char *nam = 
name;
 
  744   if (
name[0] == 
'+') {
 
static struct BoolNameTable_t gBoolNames[]
 
char * Form(const char *fmt,...)
 
void Printf(const char *fmt,...)
 
char * StrDup(const char *str)
Duplicate the string str.
 
R__EXTERN const char * gProgName
 
R__EXTERN TSystem * gSystem
 
void ChangeValue(const char *v, const char *t, EEnvLevel l, Bool_t append=kFALSE, Bool_t ignoredup=kFALSE)
Change the value of a resource.
 
TString ExpandValue(const char *v)
Replace all  strings by the value defined in the shell (obtained via TSystem::Getenv()).
 
Int_t Compare(const TObject *obj) const
Comparison function for resources.
 
~TEnvRec()
TNamed destructor.
 
The TEnv class reads config files, by default named .rootrc.
 
virtual void PrintEnv(EEnvLevel level=kEnvAll) const
Print all resources for a certain level (global, user, local, changed).
 
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
 
virtual Int_t WriteFile(const char *fname, EEnvLevel level=kEnvAll)
Write resource records to file fname for a certain level.
 
Bool_t IgnoreDuplicates(Bool_t ignore)
If set to true, no warnings in case of duplicates are issued.
 
virtual Int_t ReadFile(const char *fname, EEnvLevel level)
Read and parse the resource file for a certain level.
 
virtual void SetValue(const char *name, const char *value, EEnvLevel level=kEnvChange, const char *type=nullptr)
Set the value of a resource or create a new resource.
 
virtual TEnvRec * Lookup(const char *n) const
Loop over all resource records and return the one with name.
 
virtual void Save()
Write the resource files for each level.
 
const char * Getvalue(const char *name) const
Returns the character value for a named resource.
 
virtual void Print(Option_t *option="") const
Print all resources or the global, user or local resources separately.
 
virtual void SaveLevel(EEnvLevel level)
Write the resource file for a certain level.
 
virtual ~TEnv()
Delete the resource table.
 
TEnv(const TEnv &)=delete
 
THashList implements a hybrid collection class consisting of a hash table and a list to store TObject...
 
TObject * FindObject(const char *name) const
Find object using its name.
 
void Delete(Option_t *option="")
Remove all objects from the list AND delete all heap based objects.
 
virtual void Add(TObject *obj)
 
virtual const char * GetName() const
Returns name of object.
 
Mother of all ROOT objects.
 
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
 
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
 
static const TString & GetEtcDir()
Get the sysconfig directory in the installation. Static utility function.
 
int CompareTo(const char *cs, ECaseCompare cmp=kExact) const
Compare a string to char *cs2.
 
const char * Data() const
 
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
 
virtual const char * Getenv(const char *env)
Get environment variable.
 
virtual char * ConcatFileName(const char *dir, const char *name)
Concatenate a directory and a file name. User must delete returned string.
 
virtual int Rename(const char *from, const char *to)
Rename a file.
 
virtual const char * WorkingDirectory()
Return working directory.
 
virtual const char * HomeDirectory(const char *userName=nullptr)
Return the user's home directory.
 
void CallRecursiveRemoveIfNeeded(TObject &obj)
call RecursiveRemove for obj if gROOT is valid and obj.TestBit(kMustCleanup) is true.