blob: f3449d5453330f48407dc7c2fb37a77a1fd5e989 [file] [log] [blame]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#include <precomp.h>
#include "adc_cmd_parse.hxx"
// NOT FULLY DEFINED SERVICES
#include <cosv/tpl/tpltools.hxx>
#include <adc_cl.hxx>
#include "adc_cmds.hxx"
#include "cmd_run.hxx"
namespace autodoc
{
namespace command
{
namespace
{
const String C_FileEnding_hxx("*.hxx");
const String C_FileEnding_h("*.h");
const String C_FileEnding_idl("*.idl");
const String C_FileEnding_java("*.java");
inline void
CHECK( bool b, const String & text )
{
if (NOT b)
throw X_CommandLine( text );
}
} // anonymous namespace
//************************** S_LanguageInfo ***********************//
S_LanguageInfo::~S_LanguageInfo()
{
}
void
S_LanguageInfo::do_Init( opt_iter & it,
opt_iter itEnd )
{
++it; // Cur is language.
CHECKOPT( it != itEnd AND
( *it == C_arg_Cplusplus OR
*it == C_arg_Idl OR
*it == C_arg_Java ),
"language",
C_opt_LangAll );
if ( *it == C_arg_Cplusplus ) {
eLanguage = cpp;
}
else if ( *it == C_arg_Idl ) {
eLanguage = idl;
}
else if ( *it == C_arg_Java ) {
eLanguage = java;
}
else {
csv_assert(false);
}
switch (eLanguage)
{
case cpp: aExtensions.push_back( C_FileEnding_hxx );
aExtensions.push_back( C_FileEnding_h );
CommandLine::Get_().Set_CppUsed();
break;
case idl: aExtensions.push_back( C_FileEnding_idl );
CommandLine::Get_().Set_IdlUsed();
break;
case java: aExtensions.push_back( C_FileEnding_java );
break;
default: // do nothing.
;
}
++it; // Cur is next option.
}
void
S_LanguageInfo::InitExtensions( opt_iter & it,
opt_iter itEnd )
{
++it;
CHECKOPT( it != itEnd AND (*it).char_at(0) == '.',
"extensions",
C_opt_ExtensionsAll );
StreamLock slCheck(150);
slCheck() << C_opt_ExtensionsAll
<< " used without previous "
<< C_opt_LangAll;
CHECK( eLanguage != none,
slCheck().c_str() );
do {
aExtensions.push_back(*it);
++it;
} while (it != itEnd AND (*it).char_at(0) == '.');
}
//************************** Parse ***********************//
Parse::Parse()
: sRepositoryName(),
aGlobalLanguage(),
aProjects(),
sDevelopersManual_RefFilePath()
{
}
Parse::~Parse()
{
csv::erase_container_of_heap_ptrs(aProjects);
}
void
Parse::do_Init( opt_iter & it,
opt_iter itEnd )
{
for ( ; it != itEnd; )
{
if (*it == C_opt_Name)
do_clName(it, itEnd);
else if (*it == C_opt_LangAll)
aGlobalLanguage.Init(it, itEnd);
else if (*it == C_opt_ExtensionsAll)
aGlobalLanguage.InitExtensions(it, itEnd);
else if (*it == C_opt_DevmanFile)
do_clDevManual(it, itEnd);
else if (*it == C_opt_Project)
do_clProject(it, itEnd);
else if ( *it == C_opt_SourceTree
OR *it == C_opt_SourceDir
OR *it == C_opt_SourceFile )
do_clDefaultProject(it, itEnd);
else
break;
} // for
}
void
Parse::do_clName( opt_iter & it,
opt_iter itEnd )
{
++it;
CHECKOPT( it != itEnd AND (*it).char_at(0) != '-',
"name",
C_opt_Name );
sRepositoryName = *it;
++it;
}
void
Parse::do_clDevManual( opt_iter & it,
opt_iter itEnd )
{
++it;
CHECKOPT( it != itEnd AND (*it).char_at(0) != '-',
"link file path",
C_opt_DevmanFile );
sDevelopersManual_RefFilePath = *it;
++it;
}
void
Parse::do_clProject( opt_iter & it,
opt_iter itEnd )
{
if ( aProjects.size() == 1 )
{
if ( aProjects.front()->IsDefault() )
throw X_CommandLine( "Both, named projects and a default project, cannot be used together." );
}
S_ProjectData * dpProject = new S_ProjectData(aGlobalLanguage);
++it;
dpProject->Init(it, itEnd);
aProjects.push_back(dpProject);
}
void
Parse::do_clDefaultProject( opt_iter & it,
opt_iter itEnd )
{
if ( aProjects.size() > 0 )
{
throw X_CommandLine( "Both, named projects and a default project, cannot be used together." );
}
S_ProjectData * dpProject = new S_ProjectData( aGlobalLanguage,
S_ProjectData::default_prj );
dpProject->Init(it, itEnd);
aProjects.push_back(dpProject);
}
bool
Parse::do_Run() const
{
run::Parser
aParser(*this);
return aParser.Perform();
}
int
Parse::inq_RunningRank() const
{
return static_cast<int>(rank_Parse);
}
//************************** S_Sources ***********************//
void
S_Sources::do_Init( opt_iter & it,
opt_iter itEnd )
{
StringVector *
pList = 0;
csv_assert((*it)[0] == '-');
for ( ; it != itEnd; ++it)
{
if ((*it)[0] == '-')
{
if (*it == C_opt_SourceTree)
pList = &aTrees;
else if (*it == C_opt_SourceDir)
pList = &aDirectories;
else if (*it == C_opt_SourceFile)
pList = &aFiles;
else
return;
}
else
pList->push_back(*it);
} // end for
}
//************************** S_ProjectData ***********************//
S_ProjectData::S_ProjectData( const S_LanguageInfo & i_globalLanguage )
: sName(),
aRootDirectory(),
aLanguage(i_globalLanguage),
aFiles(),
bIsDefault(false)
{
}
S_ProjectData::S_ProjectData( const S_LanguageInfo & i_globalLanguage,
E_Default )
: sName(),
aRootDirectory("."),
aLanguage(i_globalLanguage),
aFiles(),
bIsDefault(true)
{
}
S_ProjectData::~S_ProjectData()
{
}
void
S_ProjectData::do_Init( opt_iter & it,
opt_iter itEnd )
{
if (NOT IsDefault())
{
CHECKOPT( it != itEnd AND (*it).char_at(0) != '-',
"name",
C_opt_Project );
sName = *it;
++it;
CHECKOPT( it != itEnd AND (*it).char_at(0) != '-',
"root directory",
C_opt_Project );
aRootDirectory.Set((*it).c_str(), true);
++it;
}
for ( ; it != itEnd; )
{
if ( *it == C_opt_SourceTree
OR *it == C_opt_SourceDir
OR *it == C_opt_SourceFile )
aFiles.Init(it, itEnd);
// else if (*it == C_opt_Lang)
// aLanguage.Init(it, itEnd);
// else if (*it == C_opt_Extensions)
// aLanguage.InitExtensions(it, itEnd);
else
break;
} // for
}
} // namespace command
} // namespace autodoc