office-gobmx/tools/bootstrp/cppdep.cxx
2011-08-16 09:04:09 +01:00

258 lines
6.9 KiB
C++

/* -*- 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.
*
************************************************************************/
// MARKER(update_precomp.py): autogen include statement, do not remove
#include "precompiled_tools.hxx"
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <tools/stream.hxx>
#include "cppdep.hxx"
CppDep::CppDep( ByteString aFileName )
{
aSourceFile = aFileName;
pSearchPath = new ByteStringList;
pFileList = new ByteStringList;
}
CppDep::CppDep()
{
pSources = new ByteStringList;
pSearchPath = new ByteStringList;
pFileList = new ByteStringList;
}
CppDep::~CppDep()
{
for ( size_t i = 0, n = pSources->size(); i < n; ++i ) {
delete (*pSources)[ i ];
}
delete pSources;
for ( size_t i = 0, n = pSearchPath->size(); i < n; ++i ) {
delete (*pSearchPath)[ i ];
}
delete pSearchPath;
for ( size_t i = 0, n = pFileList->size(); i < n; ++i ) {
delete (*pFileList)[ i ];
}
delete pFileList;
}
void CppDep::Execute()
{
size_t nCount = pSources->size();
for ( size_t n = 0; n < nCount; n++ )
{
ByteString *pStr = (*pSources)[ n ];
Search( *pStr );
}
}
sal_Bool CppDep::AddSearchPath( const char* aPath )
{
ByteString *pStr = new ByteString( aPath );
pSearchPath->push_back( pStr );
return sal_False;
}
sal_Bool CppDep::AddSource( const char* aSource )
{
ByteString *pStr = new ByteString( aSource );
pSources->push_back( pStr );
return sal_False;
}
sal_Bool CppDep::Search( ByteString aFileName )
{
#ifdef DEBUG_VERBOSE
fprintf( stderr, "SEARCH : %s\n", aFileName.GetBuffer());
#endif
sal_Bool bRet = sal_False;
SvFileStream aFile;
ByteString aReadLine;
UniString suFileName( aFileName, gsl_getSystemTextEncoding());
aFile.Open( suFileName, STREAM_READ );
while ( aFile.ReadLine( aReadLine ))
{
sal_uInt16 nPos = aReadLine.Search( "include" );
if ( nPos != STRING_NOTFOUND )
{
#ifdef DEBUG_VERBOSE
fprintf( stderr, "found : %d %s\n", nPos, aReadLine.GetBuffer() );
#endif
ByteString aResult = IsIncludeStatement( aReadLine );
#ifdef DEBUG_VERBOSE
fprintf( stderr, "Result : %s\n", aResult.GetBuffer() );
#endif
ByteString aNewFile;
if ( aResult !="")
if ( (aNewFile = Exists( aResult )) != "" )
{
sal_Bool bFound = sal_False;
size_t nCount = pFileList->size();
for ( size_t i = 0; i < nCount; i++ )
{
ByteString *pStr = (*pFileList)[ i ];
if ( *pStr == aNewFile )
bFound = sal_True;
}
#ifdef DEBUG_VERBOSE
fprintf( stderr, "not in list : %d %s\n", nPos, aReadLine.GetBuffer() );
#endif
if ( !bFound )
{
pFileList->push_back( new ByteString( aNewFile ) );
#ifdef DEBUG_VERBOSE
fprintf( stderr, " CppDep %s\\\n", aNewFile.GetBuffer() );
#endif
Search(aNewFile);
}
}
}
}
aFile.Close();
return bRet;
}
ByteString CppDep::Exists( ByteString aFileName )
{
char pFullName[1023];
ByteString aString;
#ifdef DEBUG_VERBOSE
fprintf( stderr, "Searching %s \n", aFileName.GetBuffer() );
#endif
size_t nCount = pSearchPath->size();
for ( size_t n = 0; n < nCount; n++ )
{
struct stat aBuf;
ByteString *pPathName = (*pSearchPath)[ n ];
strcpy( pFullName, pPathName->GetBuffer());
strcat( pFullName, DIR_SEP );
strcat( pFullName, aFileName.GetBuffer());
#ifdef DEBUG_VERBOSE
fprintf( stderr, "looking for %s\t ", pFullName );
#endif
if ( stat( pFullName, &aBuf ) == 0 )
{
#ifdef DEBUG_VERBOSE
fprintf( stderr, "Got Dependency ", pFullName );
#endif
#ifdef DEBUG_VERBOSE
fprintf( stderr, "%s \\\n", pFullName );
#endif
return ByteString(pFullName);
}
}
return aString;
}
ByteString CppDep::IsIncludeStatement( ByteString aLine )
{
ByteString aRetStr;
if ( aLine.Search("/*",0) != STRING_NOTFOUND )
{
#ifdef DEBUG_VERBOSE
fprintf( stderr, "found starting C comment : %s\n", aLine.GetBuffer() );
#endif
aLine.Erase(aLine.Search("/*",0), aLine.Len() - 1);
#ifdef DEBUG_VERBOSE
fprintf( stderr, "cleaned string : %s\n", aLine.GetBuffer() );
#endif
}
if ( aLine.Search("//",0) != STRING_NOTFOUND )
{
#ifdef DEBUG_VERBOSE
fprintf( stderr, "found C++ comment : %s\n", aLine.GetBuffer() );
#endif
aLine.Erase(aLine.Search("//",0), aLine.Len() - 1);
#ifdef DEBUG_VERBOSE
fprintf( stderr, "cleaned string : %s\n", aLine.GetBuffer() );
#endif
}
// WhiteSpacesfressen
aLine.EraseAllChars(' ');
aLine.EraseAllChars('\t');
#ifdef DEBUG_VERBOSE
fprintf( stderr, "now : %s\n", aLine.GetBuffer() );
#endif
// ist der erste Teil ein #include ?
ByteString aTmpStr;
aTmpStr = aLine.Copy( 0, 8 );
#ifdef DEBUG_VERBOSE
fprintf( stderr, "is include : %s\n", aTmpStr.GetBuffer() );
#endif
if ( aTmpStr.Equals("#include") )
{
aLine.Erase( 0, 8 );
sal_uInt16 nLen = aLine.Len();
aLine.Erase( nLen-1, 1 );
aLine.Erase( 0, 1 );
#ifdef DEBUG_VERBOSE
fprintf( stderr, "Gotcha : %s\n", aLine.GetBuffer() );
#endif
aRetStr = aLine;
}
return aRetStr;
}
#ifdef TEST
int main( int argc, char **argv )
{
CppDep *pDep = new CppDep( "cppdep.cxx" );
pDep->AddSearchPath(".");
pDep->AddSearchPath("/usr/include");
pDep->AddSearchPath("/usr/local/include");
pDep->AddSearchPath("/usr/include/sys");
pDep->AddSearchPath("/usr/include/X11");
pDep->Execute();
delete pDep;
return 0;
}
#endif
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */