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