| /************************************************************** |
| * |
| * 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. |
| * |
| *************************************************************/ |
| |
| |
| |
| // 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" |
| |
| //#define TEST |
| |
| 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() |
| { |
| delete pSources; |
| delete pSearchPath; |
| delete pFileList; |
| } |
| |
| void CppDep::Execute() |
| { |
| sal_uIntPtr nCount = pSources->Count(); |
| for ( sal_uIntPtr n=0; n<nCount;n++) |
| { |
| ByteString *pStr = pSources->GetObject(n); |
| Search( *pStr ); |
| } |
| } |
| |
| sal_Bool CppDep::AddSearchPath( const char* aPath ) |
| { |
| ByteString *pStr = new ByteString( aPath ); |
| pSearchPath->Insert( pStr, LIST_APPEND ); |
| return sal_False; |
| } |
| |
| sal_Bool CppDep::AddSource( const char* aSource ) |
| { |
| ByteString *pStr = new ByteString( aSource ); |
| pSources->Insert( pStr, LIST_APPEND ); |
| 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; |
| sal_uIntPtr nCount = pFileList->Count(); |
| for ( sal_uIntPtr i=0; i<nCount; i++ ) |
| { |
| ByteString *pStr = pFileList->GetObject(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->Insert( new ByteString( aNewFile ), LIST_APPEND ); |
| #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 |
| |
| sal_uIntPtr nCount = pSearchPath->Count(); |
| for ( sal_uIntPtr n=0; n<nCount; n++) |
| { |
| struct stat aBuf; |
| ByteString *pPathName = pSearchPath->GetObject(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") ) |
| { |
| aTmpStr = 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 |