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 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 60 TextFilter::~TextFilter() 61 { 62 fclose( pOut ); 63 fclose( pIn ); 64 } 65 66 void TextFilter::Execute() 67 { 68 Filter(); 69 } 70 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 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 114 MkFilter::MkFilter( ByteString aInFile, ByteString aOutFile ) : 115 TextFilter( aInFile, aOutFile ) 116 { 117 pLst = new ByteStringList; 118 pTnrLst = new ByteStringList; 119 } 120 121 MkFilter::~MkFilter() 122 { 123 delete pTnrLst; 124 delete pLst; 125 } 126 127 ByteString MkFilter::aTnr="$(TNR)"; 128 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 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