File indexing completed on 2026-04-09 07:49:30
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020 #include <cstring>
0021 #include <cassert>
0022 #include <cstdlib>
0023 #include <iostream>
0024 #include <sstream>
0025 #include <vector>
0026
0027 #include "SSys.hh"
0028 #include "SAr.hh"
0029
0030 SAr* SAr::Instance = NULL ;
0031
0032 SAr::SAr( const char* name , const char* envvar, char delim )
0033 :
0034 _argc(1),
0035 _argv( new char*[1] ),
0036 _cmdline(NULL)
0037 {
0038 _argv[0] = strdup(name) ;
0039
0040 init(envvar, delim);
0041 }
0042
0043 SAr::SAr( int argc_ , char** argv_ , const char* envvar, char delim )
0044 :
0045 _argc( argc_ ),
0046 _argv( argc_ > 0 ? new char*[argc_] : NULL ),
0047 _cmdline(NULL)
0048 {
0049 assert( _argc < 100 && "argc_ sanity check " );
0050 for(int i=0 ; i < argc_ ; i++ ) _argv[i] = strdup(argv_[i]) ;
0051
0052 init(envvar, delim);
0053 }
0054
0055 void SAr::init(const char* envvar, char delim)
0056 {
0057 if(_argc == 0 )
0058 {
0059 std::cout << "SAr::init _argc == 0 presumably from OPTICKS_LOG__(0,0) : args_from_envvar _argc " << _argc << std::endl ;
0060 args_from_envvar( envvar, delim) ;
0061 }
0062
0063 sanitycheck();
0064
0065 std::string aline = argline();
0066 _cmdline = strdup(aline.c_str());
0067
0068 if(has_arg("--args"))
0069 {
0070 std::cout << _cmdline << std::endl ;
0071 }
0072
0073 if(Instance)
0074 std::cout << "SAr::SAr replacing Instance " << std::endl ;
0075
0076 Instance = this ;
0077
0078
0079 }
0080
0081
0082
0083 void SAr::sanitycheck() const
0084 {
0085 for(int i=0 ; i < _argc ; i++)
0086 {
0087 const char* s = _argv[i] ;
0088 if(strlen(s) > 3 && strncmp(s, "---", 3) == 0)
0089 {
0090 std::cout << "SAr::sanitycheck FAILURE for argument " << i << "[" << s << "]" << std::endl ;
0091 assert(0 && "arguments starting with three dashes --- are not allowed ");
0092 }
0093 }
0094
0095 }
0096
0097
0098 const char* SAr::exepath() const
0099 {
0100 return _argv ? _argv[0] : NULL ;
0101 }
0102 const char* SAr::exename() const
0103 {
0104 return Basename(exepath());
0105 }
0106 const char* SAr::cmdline() const
0107 {
0108 return _cmdline ;
0109 }
0110
0111 const char* SAr::Basename(const char* path)
0112 {
0113 if(!path) return NULL ;
0114 const char *s = strrchr(path, '/') ;
0115 return s ? strdup(s+1) : strdup(path) ;
0116 }
0117
0118
0119 void SAr::args_from_envvar( const char* envvar, char delim )
0120 {
0121 const char* argline = envvar ? getenv(envvar) : NULL ;
0122
0123 if(argline == NULL)
0124 {
0125 std::cout << "SAr::args_from_envvar but no argline provided " << std::endl ;
0126 return ;
0127 }
0128
0129 std::cout << "SAr::args_from_envvar argline: " << argline << std::endl ;
0130
0131 std::stringstream ss;
0132 ss.str(argline) ;
0133
0134 std::vector<std::string> args ;
0135 args.push_back( envvar ) ;
0136
0137 std::string s;
0138 while (std::getline(ss, s, delim)) args.push_back(s) ;
0139
0140 _argc = args.size();
0141 _argv = new char*[_argc] ;
0142
0143 for(int i=0 ; i < _argc ; i++ ) _argv[i] = strdup(args[i].c_str()) ;
0144 }
0145
0146
0147
0148 void SAr::dump() const
0149 {
0150 std::cout << "SAr::dump " ;
0151 std::cout << "SAr _argc " << _argc << " ( " ;
0152 for(int i=0 ; i < _argc ; i++ ) std::cout << " " << ( _argv[i] ? _argv[i] : "NULL" ) ;
0153 std::cout << " ) " << std::endl ;
0154 }
0155
0156
0157 std::string SAr::argline() const
0158 {
0159 std::stringstream ss ;
0160 for(int i=0 ; i < _argc ; i++ ) ss << ( _argv[i] ? _argv[i] : "NULL" ) << " " ;
0161 return ss.str();
0162 }
0163
0164 const char* SAr::get_arg_after(const char* option, const char* fallback) const
0165 {
0166 for(int i=1 ; i < _argc - 1 ; i++ )
0167 {
0168 const char* a0 = _argv[i] ;
0169 const char* a1 = _argv[i+1] ;
0170 if(a0 && strcmp(a0, option) == 0) return a1 ;
0171 }
0172 return fallback ;
0173 }
0174
0175 int SAr::get_int_after(const char* option, const char* fallback) const
0176 {
0177 const char* arg = get_arg_after(option, fallback);
0178 return SSys::atoi_(arg);
0179 }
0180
0181
0182 bool SAr::has_arg( const char* arg ) const
0183 {
0184 for(int i=1 ; i < _argc ; i++ )
0185 {
0186 if(_argv[i] && strcmp(_argv[i], arg) == 0) return true ;
0187 }
0188 return false ;
0189 }