1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3basetree.h> 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef ANTLR3_WINDOWS 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4100 ) 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"] 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved. 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met: 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer. 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer in the 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// documentation and/or other materials provided with the distribution. 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// derived from this software without specific prior written permission. 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void * getChild (pANTLR3_BASE_TREE tree, ANTLR3_UINT32 i); 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getChildCount (pANTLR3_BASE_TREE tree); 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getCharPositionInLine 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(pANTLR3_BASE_TREE tree); 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 getLine (pANTLR3_BASE_TREE tree); 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 42324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetFirstChildWithType 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver(pANTLR3_BASE_TREE tree, ANTLR3_UINT32 type); 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void addChild (pANTLR3_BASE_TREE tree, pANTLR3_BASE_TREE child); 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void addChildren (pANTLR3_BASE_TREE tree, pANTLR3_LIST kids); 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void replaceChildren (pANTLR3_BASE_TREE parent, ANTLR3_INT32 startChildIndex, ANTLR3_INT32 stopChildIndex, pANTLR3_BASE_TREE t); 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void freshenPACIndexesAll(pANTLR3_BASE_TREE tree); 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void freshenPACIndexes (pANTLR3_BASE_TREE tree, ANTLR3_UINT32 offset); 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void setChild (pANTLR3_BASE_TREE tree, ANTLR3_UINT32 i, void * child); 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void * deleteChild (pANTLR3_BASE_TREE tree, ANTLR3_UINT32 i); 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void * dupTree (pANTLR3_BASE_TREE tree); 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING toStringTree (pANTLR3_BASE_TREE tree); 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 57324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API pANTLR3_BASE_TREE 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3BaseTreeNew(pANTLR3_BASE_TREE tree) 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* api */ 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->getChild = getChild; 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->getChildCount = getChildCount; 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->addChild = (void (*)(pANTLR3_BASE_TREE, void *))(addChild); 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->addChildren = addChildren; 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->setChild = setChild; 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->deleteChild = deleteChild; 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->dupTree = dupTree; 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->toStringTree = toStringTree; 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->getCharPositionInLine = getCharPositionInLine; 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->getLine = getLine; 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->replaceChildren = replaceChildren; 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->freshenPACIndexesAll = freshenPACIndexesAll; 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->freshenPACIndexes = freshenPACIndexes; 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->getFirstChildWithType = (void *(*)(pANTLR3_BASE_TREE, ANTLR3_UINT32))(getFirstChildWithType); 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->children = NULL; 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->strFactory = NULL; 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Rest must be filled in by caller. 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tree; 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 84324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetCharPositionInLine (pANTLR3_BASE_TREE tree) 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 90324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetLine (pANTLR3_BASE_TREE tree) 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_BASE_TREE 95324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetFirstChildWithType (pANTLR3_BASE_TREE tree, ANTLR3_UINT32 type) 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 i; 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 cs; 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE t; 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tree->children != NULL) 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver cs = tree->children->size(tree->children); 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i = 0; i < cs; i++) 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = (pANTLR3_BASE_TREE) (tree->children->get(tree->children, i)); 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tree->getType(t) == type) 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return (pANTLR3_BASE_TREE)t; 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void * 119324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetChild (pANTLR3_BASE_TREE tree, ANTLR3_UINT32 i) 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( tree->children == NULL 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver || i >= tree->children->size(tree->children)) 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tree->children->get(tree->children, i); 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic ANTLR3_UINT32 131324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvergetChildCount (pANTLR3_BASE_TREE tree) 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tree->children == NULL) 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tree->children->size(tree->children); 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruvervoid 144324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraddChild (pANTLR3_BASE_TREE tree, pANTLR3_BASE_TREE child) 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 n; 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 i; 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (child == NULL) 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (child->isNilNode(child) == ANTLR3_TRUE) 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (child->children != NULL && child->children == tree->children) 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // TODO: Change to exception rather than ANTLR3_FPRINTF? 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FPRINTF(stderr, "ANTLR3: An attempt was made to add a child list to itself!\n"); 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Add all of the children's children to this list 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (child->children != NULL) 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tree->children == NULL) 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We are build ing the tree structure here, so we need not 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // worry about duplication of pointers as the tree node 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // factory will only clean up each node once. So we just 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // copy in the child's children pointer as the child is 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // a nil node (has not root itself). 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->children = child->children; 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child->children = NULL; 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver freshenPACIndexesAll(tree); 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Need to copy the children 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver n = child->children->size(child->children); 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i = 0; i < n; i++) 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE entry; 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver entry = child->children->get(child->children, i); 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // ANTLR3 lists can be sparse, unlike Array Lists 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (entry != NULL) 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->children->add(tree->children, entry, (void (ANTLR3_CDECL *) (void *))child->free); 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Tree we are adding is not a Nil and might have children to copy 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tree->children == NULL) 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // No children in the tree we are adding to, so create a new list on 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // the fly to hold them. 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->createChildrenList(tree); 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->children->add(tree->children, child, (void (ANTLR3_CDECL *)(void *))child->free); 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Add all elements of the supplied list as children of this node 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 222324c4644fee44b9898524c09511bd33c3f12e2dfBen GruveraddChildren (pANTLR3_BASE_TREE tree, pANTLR3_LIST kids) 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 i; 225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 s; 226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s = kids->size(kids); 228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i = 0; i<s; i++) 229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->addChild(tree, (pANTLR3_BASE_TREE)(kids->get(kids, i+1))); 231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 236324c4644fee44b9898524c09511bd33c3f12e2dfBen GruversetChild (pANTLR3_BASE_TREE tree, ANTLR3_UINT32 i, void * child) 237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tree->children == NULL) 239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->createChildrenList(tree); 241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->children->set(tree->children, i, child, NULL, ANTLR3_FALSE); 243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void * 246324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdeleteChild (pANTLR3_BASE_TREE tree, ANTLR3_UINT32 i) 247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( tree->children == NULL) 249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return NULL; 251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tree->children->remove(tree->children, i); 254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void * 257324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverdupTree (pANTLR3_BASE_TREE tree) 258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE newTree; 260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 i; 261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 s; 262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newTree = tree->dupNode (tree); 264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tree->children != NULL) 266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s = tree->children->size (tree->children); 268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i = 0; i < s; i++) 270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE t; 272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE newNode; 273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = (pANTLR3_BASE_TREE) tree->children->get(tree->children, i); 275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (t!= NULL) 277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newNode = t->dupTree(t); 279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newTree->addChild(newTree, newNode); 280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return newTree; 285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic pANTLR3_STRING 288324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvertoStringTree (pANTLR3_BASE_TREE tree) 289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_STRING string; 291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 i; 292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 n; 293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE t; 294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tree->children == NULL || tree->children->size(tree->children) == 0) 296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return tree->toString(tree); 298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Need a new string with nothing at all in it. 301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver string = tree->strFactory->newRaw(tree->strFactory); 303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tree->isNilNode(tree) == ANTLR3_FALSE) 305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver string->append8 (string, "("); 307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver string->appendS (string, tree->toString(tree)); 308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver string->append8 (string, " "); 309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tree->children != NULL) 311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver n = tree->children->size(tree->children); 313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i = 0; i < n; i++) 315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver t = (pANTLR3_BASE_TREE) tree->children->get(tree->children, i); 317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (i > 0) 319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver string->append8(string, " "); 321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver string->appendS(string, t->toStringTree(t)); 323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (tree->isNilNode(tree) == ANTLR3_FALSE) 326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver string->append8(string,")"); 328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return string; 331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Delete children from start to stop and replace with t even if t is 334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// a list (nil-root tree). Num of children can increase or decrease. 335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// For huge child lists, inserting children can force walking rest of 336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// children to set their child index; could be slow. 337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// 338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 339324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverreplaceChildren (pANTLR3_BASE_TREE parent, ANTLR3_INT32 startChildIndex, ANTLR3_INT32 stopChildIndex, pANTLR3_BASE_TREE newTree) 340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 replacingHowMany; // How many nodes will go away 342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 replacingWithHowMany; // How many nodes will replace them 343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 numNewChildren; // Tracking variable 344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 delta; // Difference in new vs existing count 345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 i; 347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 j; 348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_VECTOR newChildren; // Iterator for whatever we are going to add in 350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_BOOLEAN freeNewChildren; // Whether we created the iterator locally or reused it 351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (parent->children == NULL) 353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FPRINTF(stderr, "replaceChildren call: Indexes are invalid; no children in list for %s", parent->getText(parent)->chars); 355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Either use the existing list of children in the supplied nil node, or build a vector of the 359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // tree we were given if it is not a nil node, then we treat both situations exactly the same 360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (newTree->isNilNode(newTree)) 362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newChildren = newTree->children; 364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver freeNewChildren = ANTLR3_FALSE; // We must NO free this memory 365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newChildren = antlr3VectorNew(1); 369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (newChildren == NULL) 370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FPRINTF(stderr, "replaceChildren: out of memory!!"); 372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver exit(1); 373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newChildren->add(newChildren, (void *)newTree, NULL); 375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver freeNewChildren = ANTLR3_TRUE; // We must free this memory 377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Initialize 380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver replacingHowMany = stopChildIndex - startChildIndex + 1; 382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver replacingWithHowMany = newChildren->size(newChildren); 383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver delta = replacingHowMany - replacingWithHowMany; 384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver numNewChildren = newChildren->size(newChildren); 385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // If it is the same number of nodes, then do a direct replacement 387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (delta == 0) 389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE child; 391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Same number of nodes 393324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 394324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver j = 0; 395324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (i = startChildIndex; i <= stopChildIndex; i++) 396324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 397324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child = (pANTLR3_BASE_TREE) newChildren->get(newChildren, j); 398324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parent->children->set(parent->children, i, child, NULL, ANTLR3_FALSE); 399324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child->setParent(child, parent); 400324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child->setChildIndex(child, i); 401324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 402324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 403324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else if (delta > 0) 404324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 405324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 indexToDelete; 406324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 407324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Less nodes than there were before 408324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // reuse what we have then delete the rest 409324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 410324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (j = 0; j < numNewChildren; j++) 411324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 412324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parent->children->set(parent->children, startChildIndex + j, newChildren->get(newChildren, j), NULL, ANTLR3_FALSE); 413324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 414324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 415324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // We just delete the same index position until done 416324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 417324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver indexToDelete = startChildIndex + numNewChildren; 418324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 419324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (j = indexToDelete; j <= (ANTLR3_INT32)stopChildIndex; j++) 420324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 421324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parent->children->remove(parent->children, indexToDelete); 422324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 423324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 424324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parent->freshenPACIndexes(parent, startChildIndex); 425324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 426324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 427324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 428324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 numToInsert; 429324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 430324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // More nodes than there were before 431324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Use what we can, then start adding 432324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 433324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (j = 0; j < replacingHowMany; j++) 434324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 435324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parent->children->set(parent->children, startChildIndex + j, newChildren->get(newChildren, j), NULL, ANTLR3_FALSE); 436324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 437324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 438324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver numToInsert = replacingWithHowMany - replacingHowMany; 439324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 440324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (j = replacingHowMany; j < replacingWithHowMany; j++) 441324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 442324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parent->children->add(parent->children, newChildren->get(newChildren, j), NULL); 443324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 444324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 445324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver parent->freshenPACIndexes(parent, startChildIndex); 446324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 447324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 448324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (freeNewChildren == ANTLR3_TRUE) 449324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 450324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FREE(newChildren->elements); 451324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newChildren->elements = NULL; 452324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver newChildren->size = 0; 453324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_FREE(newChildren); // Will not free the nodes 454324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 455324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 456324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 457324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Set the parent and child indexes for all children of the 458324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// supplied tree. 459324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// 460324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 461324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfreshenPACIndexesAll(pANTLR3_BASE_TREE tree) 462324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 463324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver tree->freshenPACIndexes(tree, 0); 464324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 465324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 466324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// Set the parent and child indexes for some of the children of the 467324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// supplied tree, starting with the child at the supplied index. 468324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/// 469324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 470324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverfreshenPACIndexes (pANTLR3_BASE_TREE tree, ANTLR3_UINT32 offset) 471324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 472324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 count; 473324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_UINT32 c; 474324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 475324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver count = tree->getChildCount(tree); // How many children do we have 476324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 477324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Loop from the supplied index and set the indexes and parent 478324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 479324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (c = offset; c < count; c++) 480324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 481324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver pANTLR3_BASE_TREE child; 482324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 483324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child = tree->getChild(tree, c); 484324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 485324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child->setChildIndex(child, c); 486324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver child->setParent(child, tree); 487324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 488324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 489324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 490