xref: /aoo4110/main/tools/bootstrp/rscdep.cxx (revision b1cdbd2c)
1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_tools.hxx"
26*b1cdbd2cSJim Jagielski #if defined(UNX) || defined(OS2)
27*b1cdbd2cSJim Jagielski #include <unistd.h>
28*b1cdbd2cSJim Jagielski #endif
29*b1cdbd2cSJim Jagielski 
30*b1cdbd2cSJim Jagielski #include <sys/stat.h>
31*b1cdbd2cSJim Jagielski #include <stdio.h>
32*b1cdbd2cSJim Jagielski #include <string.h>
33*b1cdbd2cSJim Jagielski 
34*b1cdbd2cSJim Jagielski #include "bootstrp/prj.hxx"
35*b1cdbd2cSJim Jagielski #include "sal/main.h"
36*b1cdbd2cSJim Jagielski 
37*b1cdbd2cSJim Jagielski #include <tools/string.hxx>
38*b1cdbd2cSJim Jagielski #include <tools/list.hxx>
39*b1cdbd2cSJim Jagielski #include <tools/fsys.hxx>
40*b1cdbd2cSJim Jagielski #include <tools/stream.hxx>
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski #include "cppdep.hxx"
43*b1cdbd2cSJim Jagielski 
44*b1cdbd2cSJim Jagielski class RscHrcDep : public CppDep
45*b1cdbd2cSJim Jagielski {
46*b1cdbd2cSJim Jagielski public:
47*b1cdbd2cSJim Jagielski 					RscHrcDep();
48*b1cdbd2cSJim Jagielski 	virtual			~RscHrcDep();
49*b1cdbd2cSJim Jagielski 
50*b1cdbd2cSJim Jagielski 	virtual void 	Execute();
51*b1cdbd2cSJim Jagielski };
52*b1cdbd2cSJim Jagielski 
RscHrcDep()53*b1cdbd2cSJim Jagielski RscHrcDep::RscHrcDep()	:
54*b1cdbd2cSJim Jagielski 	CppDep()
55*b1cdbd2cSJim Jagielski {
56*b1cdbd2cSJim Jagielski }
57*b1cdbd2cSJim Jagielski 
~RscHrcDep()58*b1cdbd2cSJim Jagielski RscHrcDep::~RscHrcDep()
59*b1cdbd2cSJim Jagielski {
60*b1cdbd2cSJim Jagielski }
61*b1cdbd2cSJim Jagielski 
Execute()62*b1cdbd2cSJim Jagielski void RscHrcDep::Execute()
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski 	CppDep::Execute();
65*b1cdbd2cSJim Jagielski }
66*b1cdbd2cSJim Jagielski 
67*b1cdbd2cSJim Jagielski //static String aDelim;
68*b1cdbd2cSJim Jagielski 
main(int argc,char ** argv)69*b1cdbd2cSJim Jagielski int main( int argc, char** argv )
70*b1cdbd2cSJim Jagielski {
71*b1cdbd2cSJim Jagielski 	char aBuf[255];
72*b1cdbd2cSJim Jagielski 	char pFileNamePrefix[255];
73*b1cdbd2cSJim Jagielski 	char pOutputFileName[255];
74*b1cdbd2cSJim Jagielski 	char pSrsFileName[255];
75*b1cdbd2cSJim Jagielski 	String aSrsBaseName;
76*b1cdbd2cSJim Jagielski 	sal_Bool bSource = sal_False;
77*b1cdbd2cSJim Jagielski 	ByteString aRespArg;
78*b1cdbd2cSJim Jagielski //  who needs anything but '/' ?
79*b1cdbd2cSJim Jagielski //	String aDelim = String(DirEntry::GetAccessDelimiter());
80*b1cdbd2cSJim Jagielski 	String aDelim = '/';
81*b1cdbd2cSJim Jagielski 	RscHrcDep *pDep = new RscHrcDep;
82*b1cdbd2cSJim Jagielski 
83*b1cdbd2cSJim Jagielski     // When the options are processed, the non-option arguments are
84*b1cdbd2cSJim Jagielski     // collected at the head of the argv array.
85*b1cdbd2cSJim Jagielski     // nLastNonOption points to the last of them.
86*b1cdbd2cSJim Jagielski     int nLastNonOption (-1);
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski     pOutputFileName[0] = 0;
89*b1cdbd2cSJim Jagielski     pSrsFileName[0] = 0;
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski 	for ( int i=1; i<argc; i++)
92*b1cdbd2cSJim Jagielski 	{
93*b1cdbd2cSJim Jagielski 		strcpy( aBuf, (const char *)argv[i] );
94*b1cdbd2cSJim Jagielski         const sal_Int32 nLength (strlen(aBuf));
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski #ifdef DEBUG
97*b1cdbd2cSJim Jagielski         printf("option %d is [%s] and has length %d\n", i, aBuf, (int)nLength);
98*b1cdbd2cSJim Jagielski #endif
99*b1cdbd2cSJim Jagielski 
100*b1cdbd2cSJim Jagielski         if (nLength == 0)
101*b1cdbd2cSJim Jagielski         {
102*b1cdbd2cSJim Jagielski             // Is this even possible?
103*b1cdbd2cSJim Jagielski             continue;
104*b1cdbd2cSJim Jagielski         }
105*b1cdbd2cSJim Jagielski         if (aBuf[0] == '-' && nLength > 0)
106*b1cdbd2cSJim Jagielski         {
107*b1cdbd2cSJim Jagielski             bool bIsKnownOption (true);
108*b1cdbd2cSJim Jagielski             // Make a switch on the first character after the - for a
109*b1cdbd2cSJim Jagielski             // preselection of the option.
110*b1cdbd2cSJim Jagielski             // This is faster then multiple ifs and improves readability.
111*b1cdbd2cSJim Jagielski             switch (aBuf[1])
112*b1cdbd2cSJim Jagielski             {
113*b1cdbd2cSJim Jagielski                 case 'p':
114*b1cdbd2cSJim Jagielski                     if (nLength>1 && aBuf[2] == '=' )
115*b1cdbd2cSJim Jagielski                         strcpy(pFileNamePrefix, &aBuf[3]);
116*b1cdbd2cSJim Jagielski                     else
117*b1cdbd2cSJim Jagielski                         bIsKnownOption = false;
118*b1cdbd2cSJim Jagielski                     break;
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski                 case 'f':
121*b1cdbd2cSJim Jagielski                     if (nLength>2 && aBuf[2] == 'o' && aBuf[3] == '=' )
122*b1cdbd2cSJim Jagielski                     {
123*b1cdbd2cSJim Jagielski                         strcpy(pOutputFileName, &aBuf[4]);
124*b1cdbd2cSJim Jagielski                     }
125*b1cdbd2cSJim Jagielski                     else if (nLength>2 && aBuf[2] == 'p' && aBuf[3] == '=' )
126*b1cdbd2cSJim Jagielski                     {
127*b1cdbd2cSJim Jagielski                         strcpy(pSrsFileName, &aBuf[4]);
128*b1cdbd2cSJim Jagielski                         String aName( pSrsFileName, gsl_getSystemTextEncoding());
129*b1cdbd2cSJim Jagielski                         DirEntry aDest( aName );
130*b1cdbd2cSJim Jagielski                         aSrsBaseName = aDest.GetBase();
131*b1cdbd2cSJim Jagielski                     }
132*b1cdbd2cSJim Jagielski                     else
133*b1cdbd2cSJim Jagielski                         bIsKnownOption = false;
134*b1cdbd2cSJim Jagielski                     break;
135*b1cdbd2cSJim Jagielski 
136*b1cdbd2cSJim Jagielski                 case 'i':
137*b1cdbd2cSJim Jagielski                 case 'I':
138*b1cdbd2cSJim Jagielski #ifdef DEBUG_VERBOSE
139*b1cdbd2cSJim Jagielski                     printf("Include : %s\n", &aBuf[2] );
140*b1cdbd2cSJim Jagielski #endif
141*b1cdbd2cSJim Jagielski                     pDep->AddSearchPath( &aBuf[2] );
142*b1cdbd2cSJim Jagielski                     break;
143*b1cdbd2cSJim Jagielski 
144*b1cdbd2cSJim Jagielski                 case 'h' :
145*b1cdbd2cSJim Jagielski                 case 'H' :
146*b1cdbd2cSJim Jagielski                 case '?' :
147*b1cdbd2cSJim Jagielski                     printf("RscDep 1.0\n");
148*b1cdbd2cSJim Jagielski                     break;
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski                 case 'a' :
151*b1cdbd2cSJim Jagielski #ifdef DEBUG_VERBOSE
152*b1cdbd2cSJim Jagielski                     printf("option a\n");
153*b1cdbd2cSJim Jagielski #endif
154*b1cdbd2cSJim Jagielski                     break;
155*b1cdbd2cSJim Jagielski 
156*b1cdbd2cSJim Jagielski                 case 'l' :
157*b1cdbd2cSJim Jagielski #ifdef DEBUG_VERBOSE
158*b1cdbd2cSJim Jagielski                     printf("option l with Value %s\n", &aBuf[2] );
159*b1cdbd2cSJim Jagielski #endif
160*b1cdbd2cSJim Jagielski                     pDep->AddSource(&aBuf[2]);
161*b1cdbd2cSJim Jagielski                     break;
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski                 default:
164*b1cdbd2cSJim Jagielski                     bIsKnownOption = false;
165*b1cdbd2cSJim Jagielski                     break;
166*b1cdbd2cSJim Jagielski             }
167*b1cdbd2cSJim Jagielski #ifdef DEBUG_VERBOSE
168*b1cdbd2cSJim Jagielski             if ( ! bIsKnownOption)
169*b1cdbd2cSJim Jagielski 				printf("Unknown option error [%s]\n", aBuf);
170*b1cdbd2cSJim Jagielski #endif
171*b1cdbd2cSJim Jagielski         }
172*b1cdbd2cSJim Jagielski 		else if (aBuf[0] == '@' )
173*b1cdbd2cSJim Jagielski 		{
174*b1cdbd2cSJim Jagielski 			ByteString aToken;
175*b1cdbd2cSJim Jagielski 			String aRespName( &aBuf[1], gsl_getSystemTextEncoding());
176*b1cdbd2cSJim Jagielski 			SimpleConfig aConfig( aRespName );
177*b1cdbd2cSJim Jagielski 			while ( (aToken = aConfig.GetNext()) != "")
178*b1cdbd2cSJim Jagielski 			{
179*b1cdbd2cSJim Jagielski 				char aBuf2[255];
180*b1cdbd2cSJim Jagielski 				(void) strcpy( aBuf2, aToken.GetBuffer());
181*b1cdbd2cSJim Jagielski 				if ( aBuf[0] == '-' && aBuf[1] == 'p' && aBuf[2] == '=' )
182*b1cdbd2cSJim Jagielski 				{
183*b1cdbd2cSJim Jagielski 					strcpy(pFileNamePrefix, &aBuf[3]);
184*b1cdbd2cSJim Jagielski 					//break;
185*b1cdbd2cSJim Jagielski 				}
186*b1cdbd2cSJim Jagielski 				if ( aBuf2[0] == '-' && aBuf2[1] == 'f' && aBuf2[2] == 'o' )
187*b1cdbd2cSJim Jagielski 				{
188*b1cdbd2cSJim Jagielski 					strcpy(pOutputFileName, &aBuf2[3]);
189*b1cdbd2cSJim Jagielski 					//break;
190*b1cdbd2cSJim Jagielski 				}
191*b1cdbd2cSJim Jagielski 				if ( aBuf2[0] == '-' && aBuf2[1] == 'f' && aBuf2[2] == 'p' )
192*b1cdbd2cSJim Jagielski 				{
193*b1cdbd2cSJim Jagielski 					strcpy(pSrsFileName, &aBuf2[3]);
194*b1cdbd2cSJim Jagielski 					String aName( pSrsFileName, gsl_getSystemTextEncoding());
195*b1cdbd2cSJim Jagielski 					DirEntry aDest( aName );
196*b1cdbd2cSJim Jagielski 					aSrsBaseName = aDest.GetBase();
197*b1cdbd2cSJim Jagielski 					//break;
198*b1cdbd2cSJim Jagielski 				}
199*b1cdbd2cSJim Jagielski 				if (aBuf2[0] == '-' &&  aBuf2[1] == 'i' )
200*b1cdbd2cSJim Jagielski 				{
201*b1cdbd2cSJim Jagielski 					//printf("Include : %s\n", &aBuf[2] );
202*b1cdbd2cSJim Jagielski 					pDep->AddSearchPath( &aBuf2[2] );
203*b1cdbd2cSJim Jagielski 				}
204*b1cdbd2cSJim Jagielski 				if (aBuf2[0] == '-' &&  aBuf2[1] == 'I' )
205*b1cdbd2cSJim Jagielski 				{
206*b1cdbd2cSJim Jagielski 					//printf("Include : %s\n", &aBuf[2] );
207*b1cdbd2cSJim Jagielski 					pDep->AddSearchPath( &aBuf2[2] );
208*b1cdbd2cSJim Jagielski 				}
209*b1cdbd2cSJim Jagielski 				if (( aBuf2[0] != '-' ) && ( aBuf2[0] != '@' ))
210*b1cdbd2cSJim Jagielski 				{
211*b1cdbd2cSJim Jagielski 					pDep->AddSource( &aBuf2[0] );
212*b1cdbd2cSJim Jagielski 					aRespArg += " ";
213*b1cdbd2cSJim Jagielski 					aRespArg += &aBuf2[0];
214*b1cdbd2cSJim Jagielski 					bSource = sal_True;
215*b1cdbd2cSJim Jagielski 				}
216*b1cdbd2cSJim Jagielski 			}
217*b1cdbd2cSJim Jagielski 		}
218*b1cdbd2cSJim Jagielski         else
219*b1cdbd2cSJim Jagielski         {
220*b1cdbd2cSJim Jagielski             // Collect all non-options at the head of argv.
221*b1cdbd2cSJim Jagielski             if (++nLastNonOption < i)
222*b1cdbd2cSJim Jagielski                 argv[nLastNonOption] = argv[i];
223*b1cdbd2cSJim Jagielski         }
224*b1cdbd2cSJim Jagielski 	}
225*b1cdbd2cSJim Jagielski 
226*b1cdbd2cSJim Jagielski 	DirEntry aEntry(".");
227*b1cdbd2cSJim Jagielski 	aEntry.ToAbs();
228*b1cdbd2cSJim Jagielski //	String aCwd = aEntry.GetName();
229*b1cdbd2cSJim Jagielski 	String aCwd(pFileNamePrefix, gsl_getSystemTextEncoding());
230*b1cdbd2cSJim Jagielski /*	sal_uInt16 nPos;
231*b1cdbd2cSJim Jagielski #ifndef UNX
232*b1cdbd2cSJim Jagielski 	while ( (nPos = aCwd.Search('\\') != STRING_NOTFOUND  ))
233*b1cdbd2cSJim Jagielski #else
234*b1cdbd2cSJim Jagielski 	while ( (nPos = aCwd.Search('/') != STRING_NOTFOUND  ))
235*b1cdbd2cSJim Jagielski #endif
236*b1cdbd2cSJim Jagielski 	{
237*b1cdbd2cSJim Jagielski 		String attt = aCwd.Copy( 0, nPos );
238*b1cdbd2cSJim Jagielski 		aCwd.Erase( 0, nPos );
239*b1cdbd2cSJim Jagielski 	} */
240*b1cdbd2cSJim Jagielski 	SvFileStream aOutStream;
241*b1cdbd2cSJim Jagielski 	String aOutputFileName( pOutputFileName, gsl_getSystemTextEncoding());
242*b1cdbd2cSJim Jagielski 	DirEntry aOutEntry( aOutputFileName );
243*b1cdbd2cSJim Jagielski 	String aOutPath = aOutEntry.GetPath().GetFull();
244*b1cdbd2cSJim Jagielski 
245*b1cdbd2cSJim Jagielski 	String aFileName( aOutPath );
246*b1cdbd2cSJim Jagielski 	aFileName += aDelim;
247*b1cdbd2cSJim Jagielski 	aFileName += aCwd;
248*b1cdbd2cSJim Jagielski 	aFileName += String(".", gsl_getSystemTextEncoding());
249*b1cdbd2cSJim Jagielski 	aFileName += aSrsBaseName;
250*b1cdbd2cSJim Jagielski 	aFileName += String(".dprr", gsl_getSystemTextEncoding());
251*b1cdbd2cSJim Jagielski 	//fprintf( stderr, "OutFileName : %s \n",aFileName.GetStr());
252*b1cdbd2cSJim Jagielski 	aOutStream.Open( aFileName, STREAM_WRITE );
253*b1cdbd2cSJim Jagielski 
254*b1cdbd2cSJim Jagielski     // Process the yet unhandled non-options.  These are supposed to
255*b1cdbd2cSJim Jagielski     // be names of files on which the target depends.
256*b1cdbd2cSJim Jagielski 	ByteString aString;
257*b1cdbd2cSJim Jagielski     if (nLastNonOption >= 0)
258*b1cdbd2cSJim Jagielski 	{
259*b1cdbd2cSJim Jagielski #ifdef DEBUG_VERBOSE
260*b1cdbd2cSJim Jagielski 		printf("further arguments : ");
261*b1cdbd2cSJim Jagielski #endif
262*b1cdbd2cSJim Jagielski 		aString = ByteString( pSrsFileName );
263*b1cdbd2cSJim Jagielski 		aString.SearchAndReplaceAll('\\', ByteString( aDelim,  RTL_TEXTENCODING_ASCII_US ));
264*b1cdbd2cSJim Jagielski 		aString += ByteString(" : " );
265*b1cdbd2cSJim Jagielski 
266*b1cdbd2cSJim Jagielski         for (sal_Int32 nIndex=0; nIndex<=nLastNonOption; ++nIndex)
267*b1cdbd2cSJim Jagielski 		{
268*b1cdbd2cSJim Jagielski 
269*b1cdbd2cSJim Jagielski #ifdef DEBUG
270*b1cdbd2cSJim Jagielski             printf("option at %d is [%s]\n", (int)nIndex, argv[nIndex]);
271*b1cdbd2cSJim Jagielski #endif
272*b1cdbd2cSJim Jagielski 			if (!bSource )
273*b1cdbd2cSJim Jagielski 			{
274*b1cdbd2cSJim Jagielski 				aString += ByteString("	" );
275*b1cdbd2cSJim Jagielski 				aString += ByteString( argv[nIndex]);
276*b1cdbd2cSJim Jagielski 				pDep->AddSource( argv[nIndex]);
277*b1cdbd2cSJim Jagielski 			}
278*b1cdbd2cSJim Jagielski 		}
279*b1cdbd2cSJim Jagielski 	}
280*b1cdbd2cSJim Jagielski 	aString += aRespArg;
281*b1cdbd2cSJim Jagielski 	pDep->Execute();
282*b1cdbd2cSJim Jagielski 	ByteStringList *pLst = pDep->GetDepList();
283*b1cdbd2cSJim Jagielski 	sal_uIntPtr nCount = pLst->Count();
284*b1cdbd2cSJim Jagielski 	if ( nCount == 0 )
285*b1cdbd2cSJim Jagielski 	{
286*b1cdbd2cSJim Jagielski 		aOutStream.WriteLine( aString );
287*b1cdbd2cSJim Jagielski 	}
288*b1cdbd2cSJim Jagielski 	else
289*b1cdbd2cSJim Jagielski 	{
290*b1cdbd2cSJim Jagielski 		aString += ByteString( "\\" );
291*b1cdbd2cSJim Jagielski 		aOutStream.WriteLine( aString );
292*b1cdbd2cSJim Jagielski 	}
293*b1cdbd2cSJim Jagielski 
294*b1cdbd2cSJim Jagielski 	for ( sal_uIntPtr j=0; j<nCount; j++ )
295*b1cdbd2cSJim Jagielski 	{
296*b1cdbd2cSJim Jagielski 		ByteString *pStr = pLst->GetObject(j);
297*b1cdbd2cSJim Jagielski 		pStr->SearchAndReplaceAll('\\', ByteString( aDelim,  RTL_TEXTENCODING_ASCII_US ));
298*b1cdbd2cSJim Jagielski 		if ( j != (nCount-1) )
299*b1cdbd2cSJim Jagielski 			*pStr += ByteString( "\\" );
300*b1cdbd2cSJim Jagielski 		aOutStream.WriteLine( *pStr );
301*b1cdbd2cSJim Jagielski 	}
302*b1cdbd2cSJim Jagielski 	delete pDep;
303*b1cdbd2cSJim Jagielski 	aOutStream.Close();
304*b1cdbd2cSJim Jagielski 
305*b1cdbd2cSJim Jagielski 	return 0;
306*b1cdbd2cSJim Jagielski }
307*b1cdbd2cSJim Jagielski 
308