xref: /aoo42x/main/tools/bootstrp/cppdep.cxx (revision 89b56da7)
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