xref: /trunk/main/soltools/cpp/_mcrvalid.c (revision 534d93521fb9d960038706348aeef53f37423a94)
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