1 /************************************************************** 2 * 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * 20 *************************************************************/ 21 22 #include <precomp.h> 23 #include "adc_cmd_parse.hxx" 24 25 26 // NOT FULLY DEFINED SERVICES 27 #include <cosv/tpl/tpltools.hxx> 28 #include <adc_cl.hxx> 29 #include "adc_cmds.hxx" 30 #include "cmd_run.hxx" 31 32 33 34 namespace autodoc 35 { 36 namespace command 37 { 38 39 namespace 40 { 41 42 const String C_FileEnding_hxx("*.hxx"); 43 const String C_FileEnding_h("*.h"); 44 const String C_FileEnding_idl("*.idl"); 45 const String C_FileEnding_java("*.java"); 46 47 inline void 48 CHECK( bool b, const String & text ) 49 { 50 if (NOT b) 51 throw X_CommandLine( text ); 52 } 53 54 } // anonymous namespace 55 56 57 58 //************************** S_LanguageInfo ***********************// 59 60 S_LanguageInfo::~S_LanguageInfo() 61 { 62 } 63 64 void 65 S_LanguageInfo::do_Init( opt_iter & it, 66 opt_iter itEnd ) 67 { 68 ++it; // Cur is language. 69 CHECKOPT( it != itEnd AND 70 ( *it == C_arg_Cplusplus OR 71 *it == C_arg_Idl OR 72 *it == C_arg_Java ), 73 "language", 74 C_opt_LangAll ); 75 76 if ( *it == C_arg_Cplusplus ) { 77 eLanguage = cpp; 78 } 79 else if ( *it == C_arg_Idl ) { 80 eLanguage = idl; 81 } 82 else if ( *it == C_arg_Java ) { 83 eLanguage = java; 84 } 85 else { 86 csv_assert(false); 87 } 88 89 switch (eLanguage) 90 { 91 case cpp: aExtensions.push_back( C_FileEnding_hxx ); 92 aExtensions.push_back( C_FileEnding_h ); 93 CommandLine::Get_().Set_CppUsed(); 94 break; 95 case idl: aExtensions.push_back( C_FileEnding_idl ); 96 CommandLine::Get_().Set_IdlUsed(); 97 break; 98 case java: aExtensions.push_back( C_FileEnding_java ); 99 break; 100 default: // do nothing. 101 ; 102 } 103 104 ++it; // Cur is next option. 105 } 106 107 void 108 S_LanguageInfo::InitExtensions( opt_iter & it, 109 opt_iter itEnd ) 110 { 111 ++it; 112 CHECKOPT( it != itEnd AND (*it).char_at(0) == '.', 113 "extensions", 114 C_opt_ExtensionsAll ); 115 116 StreamLock slCheck(150); 117 slCheck() << C_opt_ExtensionsAll 118 << " used without previous " 119 << C_opt_LangAll; 120 121 CHECK( eLanguage != none, 122 slCheck().c_str() ); 123 124 do { 125 aExtensions.push_back(*it); 126 ++it; 127 } while (it != itEnd AND (*it).char_at(0) == '.'); 128 } 129 130 131 132 //************************** Parse ***********************// 133 134 Parse::Parse() 135 : sRepositoryName(), 136 aGlobalLanguage(), 137 aProjects(), 138 sDevelopersManual_RefFilePath() 139 { 140 } 141 142 Parse::~Parse() 143 { 144 csv::erase_container_of_heap_ptrs(aProjects); 145 } 146 147 void 148 Parse::do_Init( opt_iter & it, 149 opt_iter itEnd ) 150 { 151 for ( ; it != itEnd; ) 152 { 153 if (*it == C_opt_Name) 154 do_clName(it, itEnd); 155 else if (*it == C_opt_LangAll) 156 aGlobalLanguage.Init(it, itEnd); 157 else if (*it == C_opt_ExtensionsAll) 158 aGlobalLanguage.InitExtensions(it, itEnd); 159 else if (*it == C_opt_DevmanFile) 160 do_clDevManual(it, itEnd); 161 else if (*it == C_opt_Project) 162 do_clProject(it, itEnd); 163 else if ( *it == C_opt_SourceTree 164 OR *it == C_opt_SourceDir 165 OR *it == C_opt_SourceFile ) 166 do_clDefaultProject(it, itEnd); 167 else 168 break; 169 } // for 170 } 171 172 void 173 Parse::do_clName( opt_iter & it, 174 opt_iter itEnd ) 175 { 176 ++it; 177 CHECKOPT( it != itEnd AND (*it).char_at(0) != '-', 178 "name", 179 C_opt_Name ); 180 sRepositoryName = *it; 181 ++it; 182 } 183 184 void 185 Parse::do_clDevManual( opt_iter & it, 186 opt_iter itEnd ) 187 { 188 ++it; 189 CHECKOPT( it != itEnd AND (*it).char_at(0) != '-', 190 "link file path", 191 C_opt_DevmanFile ); 192 sDevelopersManual_RefFilePath = *it; 193 ++it; 194 } 195 196 void 197 Parse::do_clProject( opt_iter & it, 198 opt_iter itEnd ) 199 { 200 if ( aProjects.size() == 1 ) 201 { 202 if ( aProjects.front()->IsDefault() ) 203 throw X_CommandLine( "Both, named projects and a default project, cannot be used together." ); 204 } 205 206 S_ProjectData * dpProject = new S_ProjectData(aGlobalLanguage); 207 ++it; 208 dpProject->Init(it, itEnd); 209 aProjects.push_back(dpProject); 210 } 211 212 void 213 Parse::do_clDefaultProject( opt_iter & it, 214 opt_iter itEnd ) 215 { 216 if ( aProjects.size() > 0 ) 217 { 218 throw X_CommandLine( "Both, named projects and a default project, cannot be used together." ); 219 } 220 221 S_ProjectData * dpProject = new S_ProjectData( aGlobalLanguage, 222 S_ProjectData::default_prj ); 223 dpProject->Init(it, itEnd); 224 aProjects.push_back(dpProject); 225 } 226 227 bool 228 Parse::do_Run() const 229 { 230 run::Parser 231 aParser(*this); 232 return aParser.Perform(); 233 } 234 235 int 236 Parse::inq_RunningRank() const 237 { 238 return static_cast<int>(rank_Parse); 239 } 240 241 242 243 //************************** S_Sources ***********************// 244 245 void 246 S_Sources::do_Init( opt_iter & it, 247 opt_iter itEnd ) 248 { 249 StringVector * 250 pList = 0; 251 csv_assert((*it)[0] == '-'); 252 253 for ( ; it != itEnd; ++it) 254 { 255 if ((*it)[0] == '-') 256 { 257 if (*it == C_opt_SourceTree) 258 pList = &aTrees; 259 else if (*it == C_opt_SourceDir) 260 pList = &aDirectories; 261 else if (*it == C_opt_SourceFile) 262 pList = &aFiles; 263 else 264 return; 265 } 266 else 267 pList->push_back(*it); 268 } // end for 269 } 270 271 272 273 //************************** S_ProjectData ***********************// 274 275 276 S_ProjectData::S_ProjectData( const S_LanguageInfo & i_globalLanguage ) 277 : sName(), 278 aRootDirectory(), 279 aLanguage(i_globalLanguage), 280 aFiles(), 281 bIsDefault(false) 282 { 283 } 284 285 S_ProjectData::S_ProjectData( const S_LanguageInfo & i_globalLanguage, 286 E_Default ) 287 : sName(), 288 aRootDirectory("."), 289 aLanguage(i_globalLanguage), 290 aFiles(), 291 bIsDefault(true) 292 { 293 } 294 295 S_ProjectData::~S_ProjectData() 296 { 297 } 298 299 void 300 S_ProjectData::do_Init( opt_iter & it, 301 opt_iter itEnd ) 302 { 303 if (NOT IsDefault()) 304 { 305 CHECKOPT( it != itEnd AND (*it).char_at(0) != '-', 306 "name", 307 C_opt_Project ); 308 sName = *it; 309 ++it; 310 311 CHECKOPT( it != itEnd AND (*it).char_at(0) != '-', 312 "root directory", 313 C_opt_Project ); 314 aRootDirectory.Set((*it).c_str(), true); 315 ++it; 316 } 317 318 for ( ; it != itEnd; ) 319 { 320 if ( *it == C_opt_SourceTree 321 OR *it == C_opt_SourceDir 322 OR *it == C_opt_SourceFile ) 323 aFiles.Init(it, itEnd); 324 // else if (*it == C_opt_Lang) 325 // aLanguage.Init(it, itEnd); 326 // else if (*it == C_opt_Extensions) 327 // aLanguage.InitExtensions(it, itEnd); 328 else 329 break; 330 } // for 331 } 332 333 } // namespace command 334 } // namespace autodoc 335 336 337 338