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