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