1*89b56da7SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
3*89b56da7SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
4*89b56da7SAndrew Rist * or more contributor license agreements. See the NOTICE file
5*89b56da7SAndrew Rist * distributed with this work for additional information
6*89b56da7SAndrew Rist * regarding copyright ownership. The ASF licenses this file
7*89b56da7SAndrew Rist * to you under the Apache License, Version 2.0 (the
8*89b56da7SAndrew Rist * "License"); you may not use this file except in compliance
9*89b56da7SAndrew Rist * with the License. You may obtain a copy of the License at
10*89b56da7SAndrew Rist *
11*89b56da7SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12*89b56da7SAndrew Rist *
13*89b56da7SAndrew Rist * Unless required by applicable law or agreed to in writing,
14*89b56da7SAndrew Rist * software distributed under the License is distributed on an
15*89b56da7SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*89b56da7SAndrew Rist * KIND, either express or implied. See the License for the
17*89b56da7SAndrew Rist * specific language governing permissions and limitations
18*89b56da7SAndrew Rist * under the License.
19*89b56da7SAndrew Rist *
20*89b56da7SAndrew Rist *************************************************************/
21*89b56da7SAndrew Rist
22*89b56da7SAndrew Rist
23cdf0e10cSrcweir
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_tools.hxx"
26cdf0e10cSrcweir
27cdf0e10cSrcweir #include <stdio.h>
28cdf0e10cSrcweir #include <string.h>
29cdf0e10cSrcweir
30cdf0e10cSrcweir #include <unistd.h>
31cdf0e10cSrcweir
32cdf0e10cSrcweir #include <sys/stat.h>
33cdf0e10cSrcweir #include <tools/stream.hxx>
34cdf0e10cSrcweir #include "cppdep.hxx"
35cdf0e10cSrcweir
36cdf0e10cSrcweir //#define TEST
37cdf0e10cSrcweir
CppDep(ByteString aFileName)38cdf0e10cSrcweir CppDep::CppDep( ByteString aFileName )
39cdf0e10cSrcweir {
40cdf0e10cSrcweir aSourceFile = aFileName;
41cdf0e10cSrcweir
42cdf0e10cSrcweir pSearchPath = new ByteStringList;
43cdf0e10cSrcweir pFileList = new ByteStringList;
44cdf0e10cSrcweir }
45cdf0e10cSrcweir
CppDep()46cdf0e10cSrcweir CppDep::CppDep()
47cdf0e10cSrcweir {
48cdf0e10cSrcweir pSources = new ByteStringList;
49cdf0e10cSrcweir pSearchPath = new ByteStringList;
50cdf0e10cSrcweir pFileList = new ByteStringList;
51cdf0e10cSrcweir }
52cdf0e10cSrcweir
~CppDep()53cdf0e10cSrcweir CppDep::~CppDep()
54cdf0e10cSrcweir {
55cdf0e10cSrcweir delete pSources;
56cdf0e10cSrcweir delete pSearchPath;
57cdf0e10cSrcweir delete pFileList;
58cdf0e10cSrcweir }
59cdf0e10cSrcweir
Execute()60cdf0e10cSrcweir void CppDep::Execute()
61cdf0e10cSrcweir {
62cdf0e10cSrcweir sal_uIntPtr nCount = pSources->Count();
63cdf0e10cSrcweir for ( sal_uIntPtr n=0; n<nCount;n++)
64cdf0e10cSrcweir {
65cdf0e10cSrcweir ByteString *pStr = pSources->GetObject(n);
66cdf0e10cSrcweir Search( *pStr );
67cdf0e10cSrcweir }
68cdf0e10cSrcweir }
69cdf0e10cSrcweir
AddSearchPath(const char * aPath)70cdf0e10cSrcweir sal_Bool CppDep::AddSearchPath( const char* aPath )
71cdf0e10cSrcweir {
72cdf0e10cSrcweir ByteString *pStr = new ByteString( aPath );
73cdf0e10cSrcweir pSearchPath->Insert( pStr, LIST_APPEND );
74cdf0e10cSrcweir return sal_False;
75cdf0e10cSrcweir }
76cdf0e10cSrcweir
AddSource(const char * aSource)77cdf0e10cSrcweir sal_Bool CppDep::AddSource( const char* aSource )
78cdf0e10cSrcweir {
79cdf0e10cSrcweir ByteString *pStr = new ByteString( aSource );
80cdf0e10cSrcweir pSources->Insert( pStr, LIST_APPEND );
81cdf0e10cSrcweir return sal_False;
82cdf0e10cSrcweir }
83cdf0e10cSrcweir
Search(ByteString aFileName)84cdf0e10cSrcweir sal_Bool CppDep::Search( ByteString aFileName )
85cdf0e10cSrcweir {
86cdf0e10cSrcweir #ifdef DEBUG_VERBOSE
87cdf0e10cSrcweir fprintf( stderr, "SEARCH : %s\n", aFileName.GetBuffer());
88cdf0e10cSrcweir #endif
89cdf0e10cSrcweir sal_Bool bRet = sal_False;
90cdf0e10cSrcweir
91cdf0e10cSrcweir SvFileStream aFile;
92cdf0e10cSrcweir ByteString aReadLine;
93cdf0e10cSrcweir
94cdf0e10cSrcweir UniString suFileName( aFileName, gsl_getSystemTextEncoding());
95cdf0e10cSrcweir
96cdf0e10cSrcweir aFile.Open( suFileName, STREAM_READ );
97cdf0e10cSrcweir while ( aFile.ReadLine( aReadLine ))
98cdf0e10cSrcweir {
99cdf0e10cSrcweir sal_uInt16 nPos = aReadLine.Search( "include" );
100cdf0e10cSrcweir if ( nPos != STRING_NOTFOUND )
101cdf0e10cSrcweir {
102cdf0e10cSrcweir #ifdef DEBUG_VERBOSE
103cdf0e10cSrcweir fprintf( stderr, "found : %d %s\n", nPos, aReadLine.GetBuffer() );
104cdf0e10cSrcweir #endif
105cdf0e10cSrcweir ByteString aResult = IsIncludeStatement( aReadLine );
106cdf0e10cSrcweir #ifdef DEBUG_VERBOSE
107cdf0e10cSrcweir fprintf( stderr, "Result : %s\n", aResult.GetBuffer() );
108cdf0e10cSrcweir #endif
109cdf0e10cSrcweir
110cdf0e10cSrcweir ByteString aNewFile;
111cdf0e10cSrcweir if ( aResult !="")
112cdf0e10cSrcweir if ( (aNewFile = Exists( aResult )) != "" )
113cdf0e10cSrcweir {
114cdf0e10cSrcweir sal_Bool bFound = sal_False;
115cdf0e10cSrcweir sal_uIntPtr nCount = pFileList->Count();
116cdf0e10cSrcweir for ( sal_uIntPtr i=0; i<nCount; i++ )
117cdf0e10cSrcweir {
118cdf0e10cSrcweir ByteString *pStr = pFileList->GetObject(i);
119cdf0e10cSrcweir if ( *pStr == aNewFile )
120cdf0e10cSrcweir bFound = sal_True;
121cdf0e10cSrcweir }
122cdf0e10cSrcweir #ifdef DEBUG_VERBOSE
123cdf0e10cSrcweir fprintf( stderr, "not in list : %d %s\n", nPos, aReadLine.GetBuffer() );
124cdf0e10cSrcweir #endif
125cdf0e10cSrcweir if ( !bFound )
126cdf0e10cSrcweir {
127cdf0e10cSrcweir pFileList->Insert( new ByteString( aNewFile ), LIST_APPEND );
128cdf0e10cSrcweir #ifdef DEBUG_VERBOSE
129cdf0e10cSrcweir fprintf( stderr, " CppDep %s\\\n", aNewFile.GetBuffer() );
130cdf0e10cSrcweir #endif
131cdf0e10cSrcweir Search(aNewFile);
132cdf0e10cSrcweir }
133cdf0e10cSrcweir }
134cdf0e10cSrcweir }
135cdf0e10cSrcweir }
136cdf0e10cSrcweir aFile.Close();
137cdf0e10cSrcweir
138cdf0e10cSrcweir return bRet;
139cdf0e10cSrcweir }
140cdf0e10cSrcweir
Exists(ByteString aFileName)141cdf0e10cSrcweir ByteString CppDep::Exists( ByteString aFileName )
142cdf0e10cSrcweir {
143cdf0e10cSrcweir char pFullName[1023];
144cdf0e10cSrcweir ByteString aString;
145cdf0e10cSrcweir
146cdf0e10cSrcweir #ifdef DEBUG_VERBOSE
147cdf0e10cSrcweir fprintf( stderr, "Searching %s \n", aFileName.GetBuffer() );
148cdf0e10cSrcweir #endif
149cdf0e10cSrcweir
150cdf0e10cSrcweir sal_uIntPtr nCount = pSearchPath->Count();
151cdf0e10cSrcweir for ( sal_uIntPtr n=0; n<nCount; n++)
152cdf0e10cSrcweir {
153cdf0e10cSrcweir struct stat aBuf;
154cdf0e10cSrcweir ByteString *pPathName = pSearchPath->GetObject(n);
155cdf0e10cSrcweir
156cdf0e10cSrcweir strcpy( pFullName, pPathName->GetBuffer());
157cdf0e10cSrcweir strcat( pFullName, DIR_SEP );
158cdf0e10cSrcweir strcat( pFullName, aFileName.GetBuffer());
159cdf0e10cSrcweir
160cdf0e10cSrcweir #ifdef DEBUG_VERBOSE
161cdf0e10cSrcweir fprintf( stderr, "looking for %s\t ", pFullName );
162cdf0e10cSrcweir #endif
163cdf0e10cSrcweir if ( stat( pFullName, &aBuf ) == 0 )
164cdf0e10cSrcweir {
165cdf0e10cSrcweir #ifdef DEBUG_VERBOSE
166cdf0e10cSrcweir fprintf( stderr, "Got Dependency ", pFullName );
167cdf0e10cSrcweir #endif
168cdf0e10cSrcweir #ifdef DEBUG_VERBOSE
169cdf0e10cSrcweir fprintf( stderr, "%s \\\n", pFullName );
170cdf0e10cSrcweir #endif
171cdf0e10cSrcweir
172cdf0e10cSrcweir return ByteString(pFullName);
173cdf0e10cSrcweir }
174cdf0e10cSrcweir }
175cdf0e10cSrcweir return aString;
176cdf0e10cSrcweir }
177cdf0e10cSrcweir
IsIncludeStatement(ByteString aLine)178cdf0e10cSrcweir ByteString CppDep::IsIncludeStatement( ByteString aLine )
179cdf0e10cSrcweir {
180cdf0e10cSrcweir ByteString aRetStr;
181cdf0e10cSrcweir if ( aLine.Search("/*",0) != STRING_NOTFOUND )
182cdf0e10cSrcweir {
183cdf0e10cSrcweir #ifdef DEBUG_VERBOSE
184cdf0e10cSrcweir fprintf( stderr, "found starting C comment : %s\n", aLine.GetBuffer() );
185cdf0e10cSrcweir #endif
186cdf0e10cSrcweir aLine.Erase(aLine.Search("/*",0), aLine.Len() - 1);
187cdf0e10cSrcweir #ifdef DEBUG_VERBOSE
188cdf0e10cSrcweir fprintf( stderr, "cleaned string : %s\n", aLine.GetBuffer() );
189cdf0e10cSrcweir #endif
190cdf0e10cSrcweir }
191cdf0e10cSrcweir if ( aLine.Search("//",0) != STRING_NOTFOUND )
192cdf0e10cSrcweir {
193cdf0e10cSrcweir #ifdef DEBUG_VERBOSE
194cdf0e10cSrcweir fprintf( stderr, "found C++ comment : %s\n", aLine.GetBuffer() );
195cdf0e10cSrcweir #endif
196cdf0e10cSrcweir aLine.Erase(aLine.Search("//",0), aLine.Len() - 1);
197cdf0e10cSrcweir #ifdef DEBUG_VERBOSE
198cdf0e10cSrcweir fprintf( stderr, "cleaned string : %s\n", aLine.GetBuffer() );
199cdf0e10cSrcweir #endif
200cdf0e10cSrcweir }
201cdf0e10cSrcweir // WhiteSpacesfressen
202cdf0e10cSrcweir aLine.EraseAllChars(' ');
203cdf0e10cSrcweir aLine.EraseAllChars('\t');
204cdf0e10cSrcweir #ifdef DEBUG_VERBOSE
205cdf0e10cSrcweir fprintf( stderr, "now : %s\n", aLine.GetBuffer() );
206cdf0e10cSrcweir #endif
207cdf0e10cSrcweir // ist der erste Teil ein #include ?
208cdf0e10cSrcweir ByteString aTmpStr;
209cdf0e10cSrcweir aTmpStr = aLine.Copy( 0, 8 );
210cdf0e10cSrcweir #ifdef DEBUG_VERBOSE
211cdf0e10cSrcweir fprintf( stderr, "is include : %s\n", aTmpStr.GetBuffer() );
212cdf0e10cSrcweir #endif
213cdf0e10cSrcweir if ( aTmpStr.Equals("#include") )
214cdf0e10cSrcweir {
215cdf0e10cSrcweir aTmpStr = aLine.Erase( 0, 8 );
216cdf0e10cSrcweir sal_uInt16 nLen = aLine.Len();
217cdf0e10cSrcweir aLine.Erase( nLen-1, 1 );
218cdf0e10cSrcweir aLine.Erase( 0, 1 );
219cdf0e10cSrcweir #ifdef DEBUG_VERBOSE
220cdf0e10cSrcweir fprintf( stderr, "Gotcha : %s\n", aLine.GetBuffer() );
221cdf0e10cSrcweir #endif
222cdf0e10cSrcweir aRetStr = aLine;
223cdf0e10cSrcweir }
224cdf0e10cSrcweir return aRetStr;
225cdf0e10cSrcweir }
226cdf0e10cSrcweir
227cdf0e10cSrcweir #ifdef TEST
228cdf0e10cSrcweir
main(int argc,char ** argv)229cdf0e10cSrcweir int main( int argc, char **argv )
230cdf0e10cSrcweir {
231cdf0e10cSrcweir CppDep *pDep = new CppDep( "cppdep.cxx" );
232cdf0e10cSrcweir pDep->AddSearchPath(".");
233cdf0e10cSrcweir pDep->AddSearchPath("/usr/include");
234cdf0e10cSrcweir pDep->AddSearchPath("/usr/local/include");
235cdf0e10cSrcweir pDep->AddSearchPath("/usr/include/sys");
236cdf0e10cSrcweir pDep->AddSearchPath("/usr/include/X11");
237cdf0e10cSrcweir pDep->Execute();
238cdf0e10cSrcweir delete pDep;
239cdf0e10cSrcweir return 0;
240cdf0e10cSrcweir }
241cdf0e10cSrcweir
242cdf0e10cSrcweir #endif
243