00001 /* $Id: OSCommandLineReader.cpp 4263 2011-09-09 20:19:26Z Gassmann $ */ 00016 #include "OSCommandLineReader.h" 00017 #include "OSCommandLine.h" 00018 #include "OSFileUtil.h" 00019 #include "OSConfig.h" 00020 00021 00022 00023 typedef struct yy_buffer_state *YY_BUFFER_STATE; 00024 YY_BUFFER_STATE osss_scan_string(const char* osss, void* scanner); 00025 void setyyextra(OSCommandLine *oscommandline, void* scanner); 00026 int ossslex(void* scanner); 00027 int ossslex_init(void** ptr); 00028 int ossslex_destroy(void* scanner); 00029 00030 00031 OSCommandLineReader::OSCommandLineReader( ) 00032 { 00033 m_oscommandline = new OSCommandLine(); 00034 } 00035 00036 OSCommandLine* OSCommandLineReader::readCommandLine(const std::string& osss) throw(ErrorClass) 00037 { 00038 void* scanner; 00039 bool scannerActive; 00040 // scan the command line once 00041 scannerActive = true; 00042 ossslex_init(&scanner); 00043 setyyextra(m_oscommandline, scanner); 00044 osss_scan_string(osss.c_str(), scanner); 00045 #ifdef DEBUG_CL_INTERFACE 00046 std::cout << "call ossslex" << std::endl; 00047 #endif 00048 ossslex(scanner); 00049 ossslex_destroy(scanner); 00050 scannerActive = false; 00051 #ifdef DEBUG_CL_INTERFACE 00052 std::cout << "done with call to ossslex" << std::endl; 00053 #endif 00054 00055 // if there is a config file, get those options 00056 if (m_oscommandline->configFile != "") 00057 { 00058 FileUtil *fileUtil = NULL; 00059 scannerActive = true; 00060 ossslex_init(&scanner); 00061 #ifdef DEBUG_CL_INTERFACE 00062 cout << "configFileName = " << configFileName << endl; 00063 #endif 00064 std::string configFileOptions = fileUtil->getFileAsString( 00065 m_oscommandline->configFile.c_str()); 00066 #ifdef DEBUG_CL_INTERFACE 00067 std::cout << "Call Text Extra" << std::endl; 00068 #endif 00069 setyyextra(m_oscommandline, scanner); 00070 #ifdef DEBUG_CL_INTERFACE 00071 std::cout << "Done with call Text Extra" << std::endl; 00072 #endif 00073 osss_scan_string(configFileOptions.c_str(), scanner); 00074 ossslex(scanner); 00075 ossslex_destroy(scanner); 00076 00077 // now read the command line a second time 00078 ossslex_init(&scanner); 00079 setyyextra(m_oscommandline, scanner); 00080 osss_scan_string(osss.c_str(), scanner); 00081 #ifdef DEBUG_CL_INTERFACE 00082 std::cout << "call ossslex" << std::endl; 00083 #endif 00084 ossslex(scanner); 00085 ossslex_destroy(scanner); 00086 scannerActive = false; 00087 } 00088 00089 00090 return m_oscommandline; 00091 } 00092 00093 OSCommandLineReader::~OSCommandLineReader() 00094 { 00095 if(m_oscommandline != NULL) delete m_oscommandline; 00096 m_oscommandline = NULL; 00097 } 00098