xref: /aoo42x/main/tools/bootstrp/addexes2/mkfilt.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 
29cdf0e10cSrcweir #include <../../inc/tools/string.hxx>
30cdf0e10cSrcweir #include <../../inc/tools/list.hxx>
31cdf0e10cSrcweir 
32cdf0e10cSrcweir class TextFilter
33cdf0e10cSrcweir {
34cdf0e10cSrcweir protected:
35cdf0e10cSrcweir 	FILE			*pIn, *pOut;
36cdf0e10cSrcweir 	virtual void	Filter();
37cdf0e10cSrcweir public:
38cdf0e10cSrcweir 					TextFilter( ByteString aInFile = "stdin",
39cdf0e10cSrcweir 						ByteString aOutFile = "stdout" );
40cdf0e10cSrcweir 	virtual			~TextFilter();
41cdf0e10cSrcweir 
42cdf0e10cSrcweir 	virtual void	Execute();
43cdf0e10cSrcweir };
44cdf0e10cSrcweir 
TextFilter(ByteString aInFile,ByteString aOutFile)45cdf0e10cSrcweir TextFilter::TextFilter( ByteString aInFile, ByteString aOutFile )
46cdf0e10cSrcweir {
47cdf0e10cSrcweir 	if ( aInFile == "stdin" )
48cdf0e10cSrcweir 		pIn = stdin;
49cdf0e10cSrcweir 	else
50cdf0e10cSrcweir 		if (( pIn = fopen( aInFile.GetBuffer(), "r" )) == NULL )
51cdf0e10cSrcweir 			printf( "Can't read %s\n", aInFile.GetBuffer() );
52cdf0e10cSrcweir 
53cdf0e10cSrcweir 	if ( aOutFile == "stdout" )
54cdf0e10cSrcweir 		pOut = stdout;
55cdf0e10cSrcweir 	else
56cdf0e10cSrcweir 		if (( pOut = fopen( aOutFile.GetBuffer(), "w" )) == NULL )
57cdf0e10cSrcweir 			printf( "Can't write %s\n", aOutFile.GetBuffer() );
58cdf0e10cSrcweir }
59cdf0e10cSrcweir 
~TextFilter()60cdf0e10cSrcweir TextFilter::~TextFilter()
61cdf0e10cSrcweir {
62cdf0e10cSrcweir 	fclose( pOut );
63cdf0e10cSrcweir 	fclose( pIn );
64cdf0e10cSrcweir }
65cdf0e10cSrcweir 
Execute()66cdf0e10cSrcweir void TextFilter::Execute()
67cdf0e10cSrcweir {
68cdf0e10cSrcweir 	Filter();
69cdf0e10cSrcweir }
70cdf0e10cSrcweir 
Filter()71cdf0e10cSrcweir void TextFilter::Filter()
72cdf0e10cSrcweir {
73cdf0e10cSrcweir 	int c;
74cdf0e10cSrcweir 	while ( (c = fgetc( pIn )) != EOF )
75cdf0e10cSrcweir 		fputc( c, pOut );
76cdf0e10cSrcweir }
77cdf0e10cSrcweir 
78cdf0e10cSrcweir #define LINE_LEN 2048
79cdf0e10cSrcweir 
80cdf0e10cSrcweir class ByteStringList;
81cdf0e10cSrcweir 
82cdf0e10cSrcweir class MkLine
83cdf0e10cSrcweir {
84cdf0e10cSrcweir public:
85cdf0e10cSrcweir 	ByteString			aLine;
86cdf0e10cSrcweir 	ByteStringList*		pPrivateTnrLst;
87cdf0e10cSrcweir 	sal_Bool			bOut;
88cdf0e10cSrcweir 	sal_Bool			bHier;
89cdf0e10cSrcweir 
90cdf0e10cSrcweir 					MkLine();
91cdf0e10cSrcweir };
92cdf0e10cSrcweir 
MkLine()93cdf0e10cSrcweir MkLine::MkLine()
94cdf0e10cSrcweir {
95cdf0e10cSrcweir 	bOut = sal_False;
96cdf0e10cSrcweir 	bHier = sal_False;
97cdf0e10cSrcweir 	pPrivateTnrLst = NULL;
98cdf0e10cSrcweir }
99cdf0e10cSrcweir 
100cdf0e10cSrcweir DECLARE_LIST( ByteStringList, MkLine * )
101cdf0e10cSrcweir 
102cdf0e10cSrcweir class MkFilter : public TextFilter
103cdf0e10cSrcweir {
104cdf0e10cSrcweir 	static ByteString	aTnr;
105cdf0e10cSrcweir 	ByteStringList		*pLst;
106cdf0e10cSrcweir 	ByteStringList		*pTnrLst;
107cdf0e10cSrcweir protected:
108cdf0e10cSrcweir 	virtual void	Filter();
109cdf0e10cSrcweir public:
110cdf0e10cSrcweir 					MkFilter( ByteString aInFile = "stdin", ByteString aOutFile = "stdout");
111cdf0e10cSrcweir 					~MkFilter();
112cdf0e10cSrcweir };
113cdf0e10cSrcweir 
MkFilter(ByteString aInFile,ByteString aOutFile)114cdf0e10cSrcweir MkFilter::MkFilter( ByteString aInFile, ByteString aOutFile ) :
115cdf0e10cSrcweir 	TextFilter( aInFile, aOutFile )
116cdf0e10cSrcweir {
117cdf0e10cSrcweir 	pLst = new ByteStringList;
118cdf0e10cSrcweir 	pTnrLst = new ByteStringList;
119cdf0e10cSrcweir }
120cdf0e10cSrcweir 
~MkFilter()121cdf0e10cSrcweir MkFilter::~MkFilter()
122cdf0e10cSrcweir {
123cdf0e10cSrcweir 	delete pTnrLst;
124cdf0e10cSrcweir 	delete pLst;
125cdf0e10cSrcweir }
126cdf0e10cSrcweir 
127cdf0e10cSrcweir ByteString MkFilter::aTnr="$(TNR)";
128cdf0e10cSrcweir 
Filter()129cdf0e10cSrcweir void MkFilter::Filter()
130cdf0e10cSrcweir {
131cdf0e10cSrcweir 	char aLineBuf[LINE_LEN];
132cdf0e10cSrcweir 	int nState = 0;
133cdf0e10cSrcweir 
134cdf0e10cSrcweir 	while(( fgets(aLineBuf, LINE_LEN, pIn)) != NULL )
135cdf0e10cSrcweir 	{
136cdf0e10cSrcweir 		ByteString aLine( aLineBuf );
137cdf0e10cSrcweir 		//fprintf(stderr, "aLine :%s\n", aLine.GetBuffer());
138cdf0e10cSrcweir 		if ( aLine.Search("mkfilter1" ) != STRING_NOTFOUND )
139cdf0e10cSrcweir 		{
140cdf0e10cSrcweir 			// Zeilen unterdruecken
141cdf0e10cSrcweir 			fprintf( stderr, "mkfilter1\n" );
142cdf0e10cSrcweir 			nState = 0;
143cdf0e10cSrcweir 		}
144cdf0e10cSrcweir 		else if ( aLine.Search("unroll begin" ) != STRING_NOTFOUND )
145cdf0e10cSrcweir 		{
146cdf0e10cSrcweir 			// Zeilen raus schreiben mit ersetzen von $(TNR) nach int n
147cdf0e10cSrcweir 			fprintf( stderr, "\nunroll begin\n" );
148cdf0e10cSrcweir 			nState = 1;
149cdf0e10cSrcweir 		}
150cdf0e10cSrcweir 		;
151cdf0e10cSrcweir 
152cdf0e10cSrcweir 		if ( nState == 0  )
153cdf0e10cSrcweir 		{
154cdf0e10cSrcweir 			fprintf( stderr, "." );
155cdf0e10cSrcweir 			MkLine *pMkLine = new MkLine();
156cdf0e10cSrcweir 			ByteString *pStr = new ByteString( aLineBuf );
157cdf0e10cSrcweir 			pMkLine->aLine = *pStr;
158cdf0e10cSrcweir 			pMkLine->bOut = sal_False;
159cdf0e10cSrcweir 
160cdf0e10cSrcweir 			pLst->Insert( pMkLine, LIST_APPEND );
161cdf0e10cSrcweir 		}
162cdf0e10cSrcweir 		else if ( nState == 1 )
163cdf0e10cSrcweir 		{
164cdf0e10cSrcweir 			sal_Bool bInTnrList = sal_True;
165cdf0e10cSrcweir 			fprintf( stderr, ":" );
166cdf0e10cSrcweir 			MkLine *pMkLine = new MkLine();
167cdf0e10cSrcweir 			if ( aLine.Search("unroll end") != STRING_NOTFOUND )
168cdf0e10cSrcweir 			{
169cdf0e10cSrcweir 				fprintf( stderr, ";\nunroll end\n" );
170cdf0e10cSrcweir 				MkLine *p_MkLine = new MkLine();
171cdf0e10cSrcweir 				p_MkLine->bHier = sal_True;
172cdf0e10cSrcweir 				ByteString *pByteString = new ByteString("# do not delete this line === mkfilter3i\n");
173cdf0e10cSrcweir 				p_MkLine->aLine = *pByteString;
174cdf0e10cSrcweir 				p_MkLine->bOut = sal_False;
175cdf0e10cSrcweir 				p_MkLine->pPrivateTnrLst = pTnrLst;
176cdf0e10cSrcweir 				pTnrLst = new ByteStringList();
177cdf0e10cSrcweir 				pLst->Insert( p_MkLine, LIST_APPEND );
178cdf0e10cSrcweir 				nState = 0;
179cdf0e10cSrcweir 				bInTnrList = sal_False;
180cdf0e10cSrcweir 			}
181cdf0e10cSrcweir 			ByteString *pStr = new ByteString( aLineBuf );
182cdf0e10cSrcweir 			pMkLine->aLine = *pStr;
183cdf0e10cSrcweir 			pMkLine->bOut = sal_False;
184cdf0e10cSrcweir 
185cdf0e10cSrcweir 			if ( bInTnrList )
186cdf0e10cSrcweir 				pTnrLst->Insert( pMkLine, LIST_APPEND );
187cdf0e10cSrcweir 		}
188cdf0e10cSrcweir 		else {
189cdf0e10cSrcweir 			/* Zeilen ignorieren */;
190cdf0e10cSrcweir         }
191cdf0e10cSrcweir 	}	// End Of File
192cdf0e10cSrcweir 	fprintf( stderr, "\n" );
193cdf0e10cSrcweir 
194cdf0e10cSrcweir 	// das File wieder ausgegeben
195cdf0e10cSrcweir 	sal_uIntPtr nLines = pLst->Count();
196cdf0e10cSrcweir 	for ( sal_uIntPtr j=0; j<nLines; j++ )
197cdf0e10cSrcweir 	{
198cdf0e10cSrcweir 		MkLine *pLine = pLst->GetObject( j );
199cdf0e10cSrcweir 		if ( pLine->bHier )
200cdf0e10cSrcweir 		{
201cdf0e10cSrcweir 			// die List n - Mal abarbeiten
202cdf0e10cSrcweir 			for ( sal_uInt16 n=1; n<11; n++)
203cdf0e10cSrcweir 			{
204cdf0e10cSrcweir 				sal_uIntPtr nCount = pLine->pPrivateTnrLst->Count();
205cdf0e10cSrcweir 				for ( sal_uIntPtr i=0; i<nCount; i++ )
206cdf0e10cSrcweir 				{
207cdf0e10cSrcweir 					MkLine *pMkLine = pLine->pPrivateTnrLst->GetObject(i);
208cdf0e10cSrcweir 					ByteString aLine = pMkLine->aLine;
209cdf0e10cSrcweir 					while( aLine.SearchAndReplace( aTnr, ByteString::CreateFromInt32( n )) != (sal_uInt16)-1 ) ;
210cdf0e10cSrcweir 					fputs( aLine.GetBuffer(), pOut );
211cdf0e10cSrcweir 					fprintf( stderr, "o" );
212cdf0e10cSrcweir 				}
213cdf0e10cSrcweir 			}
214cdf0e10cSrcweir 			if ( pLine->pPrivateTnrLst != NULL )
215cdf0e10cSrcweir 				delete pLine->pPrivateTnrLst;
216cdf0e10cSrcweir 			pLine->pPrivateTnrLst = NULL;
217cdf0e10cSrcweir 		}
218cdf0e10cSrcweir 		if ( pLine->bOut )
219cdf0e10cSrcweir 				fputs(pLine->aLine.GetBuffer(), pOut );
220cdf0e10cSrcweir 	}
221cdf0e10cSrcweir 	fprintf( stderr, "\n" );
222cdf0e10cSrcweir }
223cdf0e10cSrcweir 
main()224cdf0e10cSrcweir int main()
225cdf0e10cSrcweir {
226cdf0e10cSrcweir 	int nRet = 0;
227cdf0e10cSrcweir 
228cdf0e10cSrcweir 	TextFilter *pFlt = new MkFilter();
229cdf0e10cSrcweir 	pFlt->Execute();
230cdf0e10cSrcweir 	delete pFlt;
231cdf0e10cSrcweir 
232cdf0e10cSrcweir 	return nRet;
233cdf0e10cSrcweir }
234