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