Environment.cpp
Go to the documentation of this file.00001 #include "GaudiKernel/Environment.h"
00002 #include <cstdlib>
00003
00004 namespace {
00005 std::string i_resolve(std::string& source, int recursions) {
00006 if ( recursions > 0 ) {
00007 int lvl = 0, mx_lvl = 0;
00008 for(const char* c=source.c_str(), *beg=0; *c != 0; ++c) {
00009 switch ( *c ) {
00010 case '$':
00011 if ( *(c+1) == '{' ) {
00012 lvl++;
00013 if ( lvl > mx_lvl ) {
00014 mx_lvl = lvl;
00015 beg = c;
00016 }
00017 c += 2;
00018 }
00019 break;
00020 case '}':
00021 if ( lvl == mx_lvl ) {
00022 std::string env(beg+2,c-beg-2);
00023 const char* res = ::getenv(env.c_str());
00024 std::string rep = (res) ? std::string(res) : i_resolve(env,--recursions);
00025 if ( rep.length() ) {
00026 std::string e(beg,c-beg+1);
00027 size_t idx=std::string::npos;
00028 while((idx=source.find(e)) != std::string::npos) {
00029 source.replace(idx, e.length(), rep);
00030 }
00031 return i_resolve(source, --recursions);
00032 }
00033 else {
00034
00035
00036 }
00037 }
00038 lvl--;
00039 break;
00040 default:
00041 break;
00042 }
00043 }
00044 }
00045 return source;
00046 }
00047 }
00048
00049 StatusCode System::resolveEnv(const std::string& var, std::string& res, int recursions) {
00050 std::string source = var;
00051 res = i_resolve(source, recursions);
00052 if ( res.find("${") == std::string::npos ) {
00053 return StatusCode::SUCCESS;
00054 }
00055 return StatusCode::FAILURE;
00056 }
00057
00058 std::string System::homeDirectory() {
00059
00060 std::string home_dir = "./";
00061 const char *h = 0;
00062 if ( 0 == (h = ::getenv("home"))) {
00063 h = ::getenv("HOME");
00064 }
00065 if ( h ) {
00066 home_dir = h;
00067 }
00068 else {
00069
00070
00071 h = ::getenv("HOMESHARE");
00072 if ( 0 == h ) {
00073 h = ::getenv("HOMEDRIVE");
00074 }
00075 if (h) {
00076 home_dir = h;
00077 h = ::getenv("HOMEPATH");
00078 if( h ) {
00079 home_dir += h;
00080 }
00081 }
00082 }
00083 return home_dir;
00084 }
00085
00086 std::string System::tempDirectory() {
00087
00088
00089 const char *dir = ::getenv("TEMP");
00090 if (!dir) dir = ::getenv("TEMPDIR");
00091 if (!dir) dir = ::getenv("TEMP_DIR");
00092 if (!dir) dir = ::getenv("TMP");
00093 if (!dir) dir = ::getenv("TMPDIR");
00094 if (!dir) dir = ::getenv("TMP_DIR");
00095 if (!dir) return homeDirectory();
00096 return dir;
00097 }