diff options
Diffstat (limited to 'autodoc/source/exes/adc_uni/adc_cl.cxx')
-rw-r--r-- | autodoc/source/exes/adc_uni/adc_cl.cxx | 402 |
1 files changed, 402 insertions, 0 deletions
diff --git a/autodoc/source/exes/adc_uni/adc_cl.cxx b/autodoc/source/exes/adc_uni/adc_cl.cxx new file mode 100644 index 000000000000..9c6aa56ee8dc --- /dev/null +++ b/autodoc/source/exes/adc_uni/adc_cl.cxx @@ -0,0 +1,402 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/************************************************************************* + * + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * Copyright 2000, 2010 Oracle and/or its affiliates. + * + * OpenOffice.org - a multi-platform office productivity suite + * + * This file is part of OpenOffice.org. + * + * OpenOffice.org is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License version 3 + * only, as published by the Free Software Foundation. + * + * OpenOffice.org is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License version 3 for more details + * (a copy is included in the LICENSE file that accompanied this code). + * + * You should have received a copy of the GNU Lesser General Public License + * version 3 along with OpenOffice.org. If not, see + * <http://www.openoffice.org/license.html> + * for a copy of the LGPLv3 License. + * + ************************************************************************/ + +#include <precomp.h> +#include <adc_cl.hxx> + + +// NOT FULLY DEFINED SERVICES +#include <algorithm> +#include <cosv/x.hxx> +#include <cosv/file.hxx> +#include <cosv/tpl/tpltools.hxx> +#include <ary/ary.hxx> +#include <tools/tkpchars.hxx> +#include <adc_msg.hxx> +#include "adc_cmds.hxx" +#include "adc_cmd_parse.hxx" +#include "cmd_sincedata.hxx" + + +namespace autodoc +{ + +CommandLine * CommandLine::pTheInstance_ = 0; + +const char * const C_sUserGuide = +"\n\n\n" +" General Use of Autodoc\n" +" ----------------------\n" +"\n" +" Example for C++:\n" +"\n" +" -html <OutputDirectory> -name \"UDK 3.x anything\" -lg c++\n" +" -p <ProjName> <ProjectRootDirectory>\n" +" -t <SourceDir_relativeToProjectRoot>\n" +"\n" +" There may be several projects specified by -p.\n" +"\n" +"\n" +" Example for IDL:\n" +"\n" +" -html <OutputDirectory> -name \"UDK 3.x anything\" -lg idl\n" +" -t <SourceDir1> <SourceDir2>\n" +"\n" +" For both languages, instead of or in addition to -t may be\n" +" used -d (no subdirectories) or -f (just one file). There can\n" +" be multiple arguments after each of these options (-t -d -f).\n" +"\n" +"\n" +" Replacing @since Tag Content\n" +" ----------------------------\n" +"\n" +" In both languages you can give a transformation file to replace\n" +" entries in @since tags by different entries.\n" +" This file is given by the option\n" +" -sincefile <TransformationFilePath>\n" +" This option has to appear between the -html and the -lg option.\n" +" Example:\n" +" -html <OutputDirectory> -sincefile replacesince.txt\n" +" -name \"UDK 3.x anything\" -lg idl -t <SourceDir>\n" +"\n" +"\n"; + +CommandLine::CommandLine() + : nDebugStyle(0), + pSinceTransformator(new command::SinceTagTransformationData), + aCommands(), + bInitOk(false), + pCommand_CreateHtml(0), + pReposy( & ary::Repository::Create_() ), + bCpp(false), + bIdl(false) +{ + csv_assert(pTheInstance_ == 0); + pTheInstance_ = this; +} + +CommandLine::~CommandLine() +{ + csv::erase_container_of_heap_ptrs(aCommands); + pTheInstance_ = 0; +} + +int +CommandLine::Run() const +{ + Cout() << "\nAutodoc version 2.2.5" + << "\n---------------------" + << "\n" << Endl(); + + bool + ok = true; + for ( CommandList::const_iterator it = aCommands.begin(); + ok AND it != aCommands.end(); + ++it ) + { + ok = (*it)->Run(); + } + + if (pCommand_CreateHtml != 0) + { + StreamStr aDiagnosticMessagesFile(700); + aDiagnosticMessagesFile + << pCommand_CreateHtml->OutputDir() + << csv::ploc::Delimiter() + << "Autodoc_DiagnosticMessages.txt"; + TheMessages().WriteFile(aDiagnosticMessagesFile.c_str()); + } + + return ok ? 0 : 1; +} + +CommandLine & +CommandLine::Get_() +{ + csv_assert(pTheInstance_ != 0); + return *pTheInstance_; +} + +bool +CommandLine::DoesTransform_SinceTag() const +{ + return pSinceTransformator->DoesTransform(); +} + +//bool +//CommandLine::Strip_SinceTagText( String & io_sSinceTagValue ) const +//{ +// return pSinceTransformator->StripSinceTagText(io_sSinceTagValue); +//} + +const String & +CommandLine::DisplayOf_SinceTagValue( const String & i_sVersionNumber ) const +{ + return pSinceTransformator->DisplayOf(i_sVersionNumber); +} + +void +CommandLine::do_Init( int argc, + char * argv[] ) +{ + try + { + bInitOk = false; + StringVector aParameters; + + char * * itpEnd = &argv[0] + argc; + for ( char * * itp = &argv[1]; itp != itpEnd; ++itp ) + { + if ( strncmp(*itp, "-I:", 3) != 0 ) + aParameters.push_back(String(*itp)); + else + load_IncludedCommands(aParameters, (*itp)+3); + } + + StringVector::const_iterator itEnd = aParameters.end(); + for ( StringVector::const_iterator it = aParameters.begin(); + it != itEnd; + ) + { + if ( *it == command::C_opt_Verbose ) + do_clVerbose(it,itEnd); + else if ( *it == command::C_opt_LangAll + OR *it == command::C_opt_Name + OR *it == command::C_opt_DevmanFile ) + do_clParse(it,itEnd); + else if (*it == command::C_opt_CreateHtml) + do_clCreateHtml(it,itEnd); + else if (*it == command::C_opt_SinceFile) + do_clSinceFile(it,itEnd); + else if (*it == command::C_opt_ExternNamespace) + { + sExternNamespace = *(++it); + ++it; + if ( strncmp(sExternNamespace.c_str(), "::", 2) != 0) + { + throw command::X_CommandLine( + "-extnsp needs an absolute qualified namespace, starting with \"::\"." + ); + } + } + else if (*it == command::C_opt_ExternRoot) + { + ++it; + StreamLock sl(1000); + if ( csv::compare(*it, 0, "http://", 7) != 0 ) + { + sl() << "http://" << *it; + } + if ( *(sl().end()-1) != '/') + sl() << '/'; + sExternRoot = sl().c_str(); + + ++it; + } +// else if (*it == command::C_opt_CreateXml) +// do_clCreateXml(it,itEnd); +// else if (command::C_opt_Load) +// do_clLoad(it,itEnd); +// else if (*it == command::C_opt_Save) +// do_clSave(it,itEnd); + else if (*it == "-h" OR *it == "-?" OR *it == "?") + // Leads to displaying help, because bInitOk stays on false. + return; + else if ( *it == command::C_opt_Parse ) + // Only for backwards compatibility. + // Just ignore "-parse". + ++it; + else + { + StreamLock sl(200); + throw command::X_CommandLine( + sl() << "Unknown commandline option \"" + << *it + << "\"." + << c_str ); + } + } // end for + sort_Commands(); + + bInitOk = true; + + } // end try + catch ( command::X_CommandLine & xxx ) + { + xxx.Report( Cerr() ); + } + catch ( csv::Exception & xxx ) + { + xxx.GetInfo( Cerr() ); + } +} + +void +CommandLine::do_PrintUse() const +{ + Cout() << C_sUserGuide << Endl(); +} + +bool +CommandLine::inq_CheckParameters() const +{ + if (NOT bInitOk OR aCommands.size() == 0) + return false; + return true; +} + +void +CommandLine::load_IncludedCommands( StringVector & out, + const char * i_filePath ) +{ + CharacterSource + aIncludedCommands; + csv::File + aFile(i_filePath, csv::CFM_READ); + if (NOT aFile.open()) + { + Cerr() << "Command include file \"" + << i_filePath + << "\" not found." + << Endl(); + throw command::X_CommandLine("Invalid file in option -I:<command-file>."); + } + aIncludedCommands.LoadText(aFile); + aFile.close(); + + bool bInToken = false; + StreamLock aTransmit(200); + for ( ; NOT aIncludedCommands.IsFinished(); aIncludedCommands.MoveOn() ) + { + if (bInToken) + { + if (aIncludedCommands.CurChar() <= 32) + { + const char * + pToken = aIncludedCommands.CutToken(); + bInToken = false; + + if ( strncmp(pToken, "-I:", 3) != 0 ) + { + aTransmit().seekp(0); + aTransmit() << pToken; + aTransmit().replace_all('\\', *csv::ploc::Delimiter()); + aTransmit().replace_all('/', *csv::ploc::Delimiter()); + out.push_back(String(aTransmit().c_str())); + } + else + load_IncludedCommands(out, pToken+3); + } + } + else + { + if (aIncludedCommands.CurChar() > 32) + { + aIncludedCommands.CutToken(); + bInToken = true; + } + } // endif (bInToken) else + + } // end while() +} + +namespace +{ +inline int +v_nr(StringVector::const_iterator it) +{ + return int( *(*it).c_str() ) - int('0'); +} +} // anonymous namespace + +void +CommandLine::do_clVerbose( opt_iter & it, + opt_iter itEnd ) +{ + ++it; + if ( it == itEnd ? true : v_nr(it) < 0 OR v_nr(it) > 7 ) + throw command::X_CommandLine( "Missing or invalid number in -v option." ); + nDebugStyle = v_nr(it); + ++it; +} + +void +CommandLine::do_clParse( opt_iter & it, + opt_iter itEnd ) +{ + command::Command * + pCmd_Parse = new command::Parse; + pCmd_Parse->Init(it, itEnd); + aCommands.push_back(pCmd_Parse); +} + +void +CommandLine::do_clCreateHtml( opt_iter & it, + opt_iter itEnd ) +{ + pCommand_CreateHtml = new command::CreateHtml; + pCommand_CreateHtml->Init(it, itEnd); + aCommands.push_back(pCommand_CreateHtml); +} + +void +CommandLine::do_clSinceFile( opt_iter & it, + opt_iter itEnd ) +{ + pSinceTransformator->Init(it, itEnd); +} + + +namespace +{ + +struct Less_RunningRank +{ + bool operator()( + const command::Command * const & + i1, + const command::Command * const & + i2 ) const + { return i1->RunningRank() < i2->RunningRank(); } +}; + +} // anonymous namespace + + + +void +CommandLine::sort_Commands() +{ + std::sort( aCommands.begin(), + aCommands.end(), + Less_RunningRank() ); +} + +} // namespace autodoc + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |