17ce20373SAndrew Rist /************************************************************** 27ce20373SAndrew Rist * 37ce20373SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 47ce20373SAndrew Rist * or more contributor license agreements. See the NOTICE file 57ce20373SAndrew Rist * distributed with this work for additional information 67ce20373SAndrew Rist * regarding copyright ownership. The ASF licenses this file 77ce20373SAndrew Rist * to you under the Apache License, Version 2.0 (the 87ce20373SAndrew Rist * "License"); you may not use this file except in compliance 97ce20373SAndrew Rist * with the License. You may obtain a copy of the License at 107ce20373SAndrew Rist * 117ce20373SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 127ce20373SAndrew Rist * 137ce20373SAndrew Rist * Unless required by applicable law or agreed to in writing, 147ce20373SAndrew Rist * software distributed under the License is distributed on an 157ce20373SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 167ce20373SAndrew Rist * KIND, either express or implied. See the License for the 177ce20373SAndrew Rist * specific language governing permissions and limitations 187ce20373SAndrew Rist * under the License. 197ce20373SAndrew Rist * 207ce20373SAndrew Rist *************************************************************/ 217ce20373SAndrew Rist 22cdf0e10cSrcweir #include <stdio.h> 23cdf0e10cSrcweir #include <stdlib.h> 24cdf0e10cSrcweir #include <string.h> 25cdf0e10cSrcweir 26cdf0e10cSrcweir #include "cpp.h" 27cdf0e10cSrcweir 28cdf0e10cSrcweir /* 29cdf0e10cSrcweir Nlist * pMacro; 30cdf0e10cSrcweir Token * pTokenWhereMacroBecomesValid; 31cdf0e10cSrcweir struct macroValidator * 32cdf0e10cSrcweir pNext; 33cdf0e10cSrcweir */ 34cdf0e10cSrcweir 35cdf0e10cSrcweir void 36cdf0e10cSrcweir mvl_init(MacroValidatorList * out_pValidators) 37cdf0e10cSrcweir { 38*509a48ffSpfg out_pValidators->pFirst = NULL; 39cdf0e10cSrcweir out_pValidators->nextFreeIdentifier = 1; 40cdf0e10cSrcweir } 41cdf0e10cSrcweir 42cdf0e10cSrcweir void 43cdf0e10cSrcweir mvl_destruct(MacroValidatorList * out_pValidators) 44cdf0e10cSrcweir { 45cdf0e10cSrcweir MacroValidator * pV = out_pValidators->pFirst; 46cdf0e10cSrcweir MacroValidator * pDel; 47cdf0e10cSrcweir for ( pDel = out_pValidators->pFirst; 48*509a48ffSpfg pDel != NULL; 49cdf0e10cSrcweir pDel = pV ) 50cdf0e10cSrcweir { 51cdf0e10cSrcweir pV = pV->pNext; 52cdf0e10cSrcweir 53cdf0e10cSrcweir pDel->pMacro->flag &= (~ISACTIVE); 54cdf0e10cSrcweir dofree(pDel); 55cdf0e10cSrcweir } 56cdf0e10cSrcweir } 57cdf0e10cSrcweir 58cdf0e10cSrcweir 59cdf0e10cSrcweir #define INVALID_TILL_ENDOFROW 32000 60cdf0e10cSrcweir 61cdf0e10cSrcweir /* If in_pTokenWhereMacroBecomesValid == 0, the macro is at row end 62cdf0e10cSrcweir and therefore there does not exist any token, where the macro becomes 63cdf0e10cSrcweir valid again. It is revalidated, when the row was processed complete. 64cdf0e10cSrcweir */ 65cdf0e10cSrcweir void 66cdf0e10cSrcweir mvl_add( MacroValidatorList * inout_pValidators, 67cdf0e10cSrcweir Nlist * in_pMacro, 68cdf0e10cSrcweir Token * in_pTokenWhereMacroBecomesValid ) 69cdf0e10cSrcweir { 70cdf0e10cSrcweir 71cdf0e10cSrcweir MacroValidator * pNew = new(MacroValidator); 72cdf0e10cSrcweir pNew->pMacro = in_pMacro; 73cdf0e10cSrcweir 74*509a48ffSpfg if (in_pTokenWhereMacroBecomesValid == NULL) 75cdf0e10cSrcweir { 76cdf0e10cSrcweir pNew->nTokenWhereMacroBecomesValid = INVALID_TILL_ENDOFROW; 77cdf0e10cSrcweir } 78cdf0e10cSrcweir else if (in_pTokenWhereMacroBecomesValid->identifier > 0) 79cdf0e10cSrcweir { 80cdf0e10cSrcweir pNew->nTokenWhereMacroBecomesValid = in_pTokenWhereMacroBecomesValid->identifier; 81cdf0e10cSrcweir } 82cdf0e10cSrcweir else 83cdf0e10cSrcweir { 84cdf0e10cSrcweir pNew->nTokenWhereMacroBecomesValid = inout_pValidators->nextFreeIdentifier; 85cdf0e10cSrcweir in_pTokenWhereMacroBecomesValid->identifier = inout_pValidators->nextFreeIdentifier; 86cdf0e10cSrcweir inout_pValidators->nextFreeIdentifier++; 87cdf0e10cSrcweir } 88cdf0e10cSrcweir 89cdf0e10cSrcweir pNew->pNext = inout_pValidators->pFirst; 90cdf0e10cSrcweir inout_pValidators->pFirst = pNew; 91cdf0e10cSrcweir } 92cdf0e10cSrcweir 93cdf0e10cSrcweir /* 94cdf0e10cSrcweir void 95cdf0e10cSrcweir mvl_move( MacroValidatorList * inout_pValidators, 96cdf0e10cSrcweir int in_nSpace ) 97cdf0e10cSrcweir { 98cdf0e10cSrcweir MacroValidator * pV; 99cdf0e10cSrcweir for ( pV = inout_pValidators->pFirst; 100cdf0e10cSrcweir pV != 0; 101cdf0e10cSrcweir pV = pV->pNext ) 102cdf0e10cSrcweir { 103cdf0e10cSrcweir pV->pTokenWhereMacroBecomesValid += in_nSpace; 104cdf0e10cSrcweir } 105cdf0e10cSrcweir } 106cdf0e10cSrcweir */ 107cdf0e10cSrcweir 108cdf0e10cSrcweir void 109cdf0e10cSrcweir mvl_check( MacroValidatorList * inout_pValidators, 110cdf0e10cSrcweir Token * inout_pTokenToCheck) 111cdf0e10cSrcweir { 112cdf0e10cSrcweir MacroValidator * pV; /* Running pointer */ 113cdf0e10cSrcweir MacroValidator * pCheckedOnes; /* Here new list is built. */ 114*509a48ffSpfg pCheckedOnes = NULL; 115cdf0e10cSrcweir 116cdf0e10cSrcweir for ( pV = inout_pValidators->pFirst; 117*509a48ffSpfg pV != NULL; 118cdf0e10cSrcweir pV = inout_pValidators->pFirst ) 119cdf0e10cSrcweir { 120cdf0e10cSrcweir inout_pValidators->pFirst = pV->pNext; 121cdf0e10cSrcweir 122cdf0e10cSrcweir if (pV->nTokenWhereMacroBecomesValid == inout_pTokenToCheck->identifier) 123cdf0e10cSrcweir { 124cdf0e10cSrcweir pV->pMacro->flag &= (~ISACTIVE); 125cdf0e10cSrcweir dofree(pV); 126cdf0e10cSrcweir } 127cdf0e10cSrcweir else 128cdf0e10cSrcweir { 129cdf0e10cSrcweir pV->pNext = pCheckedOnes; 130cdf0e10cSrcweir pCheckedOnes = pV; 131cdf0e10cSrcweir } 132cdf0e10cSrcweir } /* end for */ 133cdf0e10cSrcweir 134cdf0e10cSrcweir /* Assign new built list (too old ones were removed) to 135cdf0e10cSrcweir original list: 136cdf0e10cSrcweir */ 137cdf0e10cSrcweir inout_pValidators->pFirst = pCheckedOnes; 138cdf0e10cSrcweir } 139cdf0e10cSrcweir 140cdf0e10cSrcweir 141cdf0e10cSrcweir void 142cdf0e10cSrcweir tokenrow_zeroTokenIdentifiers(Tokenrow* trp) 143cdf0e10cSrcweir { 144cdf0e10cSrcweir Token * tp; 145cdf0e10cSrcweir for (tp = trp->bp; tp < trp->lp; tp++) 146cdf0e10cSrcweir { 147cdf0e10cSrcweir tp->identifier = 0; 148cdf0e10cSrcweir } 149cdf0e10cSrcweir } 150cdf0e10cSrcweir 151