Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2026-04-09 07:49:30

0001 /*
0002  * Copyright (c) 2019 Opticks Team. All Rights Reserved.
0003  *
0004  * This file is part of Opticks
0005  * (see https://bitbucket.org/simoncblyth/opticks).
0006  *
0007  * Licensed under the Apache License, Version 2.0 (the "License"); 
0008  * you may not use this file except in compliance with the License.  
0009  * You may obtain a copy of the License at
0010  *
0011  *   http://www.apache.org/licenses/LICENSE-2.0
0012  *
0013  * Unless required by applicable law or agreed to in writing, software 
0014  * distributed under the License is distributed on an "AS IS" BASIS, 
0015  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.  
0016  * See the License for the specific language governing permissions and 
0017  * limitations under the License.
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 )  // 0 means in-code not giving args
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     //dump();
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 ) ;     // equivalent executable
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 }