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