4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * egman.c
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * SOFTWARE RIGHTS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Set (PCCTS) -- PCCTS is in the public domain. An individual or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * company may do whatever they wish with source code distributed with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PCCTS or the code generated by PCCTS, including the incorporation of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PCCTS, or its output, into commerical software.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * We encourage users to develop software with PCCTS. However, we do ask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * that credit is given to us for developing PCCTS. By "credit",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * we mean that if you incorporate our source code into one of your
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * programs (commercial product, research project, or otherwise) that you
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * acknowledge this fact somewhere in the documentation, research report,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * etc... If you like PCCTS and have developed a nice tool with the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * output, please mention that you developed it using PCCTS. In
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * addition, we ask that this header remain intact in our source code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * As long as these guidelines are kept, we expect to continue enhancing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * this system and expect to make other tools available as they are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * completed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * ANTLR 1.33MR10
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 2001
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <stdio.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <stdlib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "set.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "syn.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "hash.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "generic.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "proto.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic ExceptionGroup **egArray=NULL; /* ExceptionGroup by BlkLevel */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic LabelEntry **leArray=NULL; /* LabelEntry by BlkLevel */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic Junction **altArray=NULL; /* start of alternates */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic int arraySize=0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic int highWater=0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic ExceptionGroup *lastEG=NULL; /* used in altFixup() */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic int lastBlkLevel=0; /* used in altFixup() */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef __USE_PROTOS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic void arrayCheck(void);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic void arrayCheck();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* Called to add an exception group for an alternative EG */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef __USE_PROTOS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid egAdd(ExceptionGroup * eg)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid egAdd(eg)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncExceptionGroup *eg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExceptionGroup *nextEG;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExceptionGroup *innerEG;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LabelEntry *nextLE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LabelEntry *innerLE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Junction *nextAlt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Junction *innerAlt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync lastEG=eg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync lastBlkLevel=BlkLevel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync arrayCheck();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync eg->pendingLink=egArray[BlkLevel];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync egArray[BlkLevel]=eg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* EG for alternates already have their altID filled in */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i=BlkLevel+1; i<=highWater ; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (innerEG=egArray[i]; innerEG != NULL ; innerEG=nextEG) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nextEG=innerEG->pendingLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync innerEG->pendingLink=NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync innerEG->outerEG=eg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync egArray[i]=NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * for patching up the LabelEntry you might use an EG for the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * current alternative - unlike patching up an alternative EG
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * i.e. start the loop at BlkLevel rather than (BlkLevel+1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * fill it in only if the EG and the LE are for the very
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * same alternative if they're at the same BlkLevel
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * it's easier to leave the LE on this list (filled in) rather than
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * trying to selectively remove it. It will eventually be
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * removed anyway when the BlkLevel gets small enough.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i=BlkLevel; i<=highWater ; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (innerLE=leArray[i]; innerLE != NULL ; innerLE=nextLE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nextLE=innerLE->pendingLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlkLevel != i ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync innerLE->curAltNum == CurAltNum_array[BlkLevel]) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (innerLE->outerEG == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync innerLE->outerEG=eg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlkLevel != i) leArray[i]=NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * For the start of alternatives it is necessary to make a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * distinction between the exception group for the current
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * alternative and the "fallback" EG for the block which
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * contains the alternative
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The fallback outerEG is used to handle the case where
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * no alternative of a block matches. In that case the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * signal is "NoViableAlt" (or "NoSemViableAlt" and the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * generator needs the EG of the block CONTAINING the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * current one.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * rule: ( ( ( a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * | b
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * | c
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * | d
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i=BlkLevel; i <= highWater ; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (innerAlt=altArray[i]; innerAlt != NULL ; innerAlt=nextAlt) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nextAlt=innerAlt->pendingLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* first fill in the EG for the current alternative */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* but leave it on the list in order to get the fallback EG */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* if the EG is at the same LEVEL as the alternative then */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* fill it in only if in the very same alternative */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* rule: ( a */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* | b */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* | c exception ... */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* ) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* if the EG is outside the alternative (e.g. BlkLevel < i) */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* then it doesn't matter about the alternative */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* rule: ( a */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* | b */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* | c */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* ) exception ... */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync printf("BlkLevel=%d i=%d altnum=%d CurAltNum=%d altID=%s\n",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlkLevel,i,innerAlt->curAltNum,CurAltNum_array[BlkLevel],eg->altID);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlkLevel != i ||
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync innerAlt->curAltNum == CurAltNum_array[BlkLevel]) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (innerAlt->exception_label == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync innerAlt->exception_label=eg->altID;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* ocurs at a later pass then for the exception_label */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* if an outerEG has been found then fill in the outer EG */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* remove if from the list when the BlkLevel gets smaller */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlkLevel != i) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (innerAlt->outerEG == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync innerAlt->outerEG=eg;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlkLevel != i) altArray[i]=NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef __USE_PROTOS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid leAdd(LabelEntry * le)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid leAdd(le)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncLabelEntry *le;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync arrayCheck();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync le->pendingLink=leArray[BlkLevel];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync le->curAltNum=CurAltNum_array[BlkLevel];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync leArray[BlkLevel]=le;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef __USE_PROTOS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid altAdd(Junction *alt)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid altAdd(alt)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncJunction *alt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync arrayCheck();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync printf("BlkLevel=%d CurAltNum=%d\n",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BlkLevel,CurAltNum_array[BlkLevel]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync alt->curAltNum=CurAltNum_array[BlkLevel];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync alt->pendingLink=altArray[BlkLevel];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync altArray[BlkLevel]=alt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic void
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef __USE_PROTOS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncarrayCheck(void)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncarrayCheck()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExceptionGroup **egArrayNew;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LabelEntry **leArrayNew;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Junction **altArrayNew;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int arraySizeNew;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlkLevel > highWater) highWater=BlkLevel;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (BlkLevel >= arraySize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync arraySizeNew=BlkLevel+5; /* MR20 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync egArrayNew=(ExceptionGroup **)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync calloc(arraySizeNew,sizeof(ExceptionGroup *));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync leArrayNew=(LabelEntry **)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync calloc(arraySizeNew,sizeof(LabelEntry *));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync altArrayNew=(Junction **)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync calloc(arraySizeNew,sizeof(Junction *));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i=0; i<arraySize ; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync egArrayNew[i]=egArray[i];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync leArrayNew[i]=leArray[i];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync altArrayNew[i]=altArray[i];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync arraySize=arraySizeNew;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (egArray != NULL) free( (char *) egArray);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (leArray != NULL) free( (char *) leArray);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (altArray != NULL) free( (char *) altArray);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync egArray=egArrayNew;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync leArray=leArrayNew;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync altArray=altArrayNew;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* always call leFixup() BEFORE egFixup() */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef __USE_PROTOS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncegFixup(void)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncegFixup()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExceptionGroup *nextEG;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ExceptionGroup *innerEG;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i=1; i<=highWater ; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (innerEG=egArray[i]; innerEG != NULL ; innerEG=nextEG) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nextEG=innerEG->pendingLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync innerEG->pendingLink=NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync egArray[i]=NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync lastEG=NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync lastBlkLevel=0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* always call leFixup() BEFORE egFixup() */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef __USE_PROTOS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid leFixup(void)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid leFixup()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LabelEntry *nextLE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LabelEntry *innerLE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i=BlkLevel; i<=highWater ; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (innerLE=leArray[i]; innerLE != NULL ; innerLE=nextLE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nextLE=innerLE->pendingLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync innerLE->pendingLink=NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync leArray[i]=NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* always call altFixup() BEFORE egFixup() */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef __USE_PROTOS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid altFixup(void)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid altFixup()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int i;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Junction *nextAlt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Junction *innerAlt;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (i=BlkLevel; i<=highWater ; i++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (innerAlt=altArray[i]; innerAlt != NULL ; innerAlt=nextAlt) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* if an outerEG has been found then fill in the outer EG */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (lastBlkLevel <= i) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (innerAlt->outerEG == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync innerAlt->outerEG=lastEG;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nextAlt=innerAlt->pendingLink;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync innerAlt->pendingLink=NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync altArray[i]=NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync };
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync