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