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
mvl_init(MacroValidatorList * out_pValidators)36cdf0e10cSrcweir mvl_init(MacroValidatorList * out_pValidators)
37cdf0e10cSrcweir {
38*509a48ffSpfg out_pValidators->pFirst = NULL;
39cdf0e10cSrcweir out_pValidators->nextFreeIdentifier = 1;
40cdf0e10cSrcweir }
41cdf0e10cSrcweir
42cdf0e10cSrcweir void
mvl_destruct(MacroValidatorList * out_pValidators)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
mvl_add(MacroValidatorList * inout_pValidators,Nlist * in_pMacro,Token * in_pTokenWhereMacroBecomesValid)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
mvl_check(MacroValidatorList * inout_pValidators,Token * inout_pTokenToCheck)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
tokenrow_zeroTokenIdentifiers(Tokenrow * trp)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 }
150