14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* FILE: sub_grph.cpp 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * DATE MODIFIED: 31-Aug-07 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * DESCRIPTION: Part of the SREC graph compiler project source files. 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Copyright 2007, 2008 Nuance Communciations, Inc. * 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the 'License'); * 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * you may not use this file except in compliance with the License. * 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * You may obtain a copy of the License at * 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 * 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software * 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * distributed under the License is distributed on an 'AS IS' BASIS, * 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * See the License for the specific language governing permissions and * 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * limitations under the License. * 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/ 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <iostream> 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string> 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <assert.h> 2466d9f39f64360565c0b7176218412135b8242528Scott Tsai#include <cstdio> 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "sub_grph.h" 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int checkEntry (int *itemList, int count, int item); 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int checkEntry (int *itemList, int count, int item) 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (int ii= 0; ii < count; ii++) 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (item == itemList[ii]) 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ii; 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return -1; 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool IsSlot (std::string label) 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int count= label.size(); 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int fPos= label.find_first_of ("___"); 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int lPos= label.find_last_of ("___") + 1; 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // std::cout << label << " " << count << " " << fPos << " " << lPos << std::endl; 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (fPos >= 0 && lPos == count) 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return true; 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return false; 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::pushScope () 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project opStack[popOp++]= lastScope; 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project opStack[popOp++]= startId; 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project opStack[popOp++]= endId; 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project opStack[popOp++]= lastId; 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project opStack[popOp++]= arg1; 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project opStack[popOp++]= arg2; 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project opStack[popOp++]= numArc; 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::popScope () 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project prevStartId= startId; 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project prevEndId= endId; 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arcLoc= opStack[--popOp]; 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arg2= opStack[--popOp]; 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arg1= opStack[--popOp]; 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastId= opStack[--popOp]; 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endId= opStack[--popOp]; 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project startId= opStack[--popOp]; 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastScope= opStack[--popOp]; 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::BeginScope (int scopeType, int newArg1, int newArg2) 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Begin a new scope 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Create nodes for item and /item but no transitions 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pushScope(); 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arg1= newArg1; 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arg2= newArg2; 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastScope= scopeType; 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arcLoc= numArc; 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project startId= NewVertexId(); 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project switch (scopeType) { 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_ITEM: 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_RULE: 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_COUNT: 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_REPEAT: 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_OPT: 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endId= -1; 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastId= startId; 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_ONEOF: 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endId= NewVertexId(); 1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastId= endId; 1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project default: 1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project printf ("Shouldn't be getting here\n"); 1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::EndScope () 1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// End the current scope 1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int closeId= CloseScope(); 1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastId= ConnectLastScope (startId, closeId); 1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint SubGraph::ConnectLastScope (int beginScopeId, int endScopeId) 1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Connect up the child network to the parent 1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int begLabel, endLabel, begOutLabel, endOutLabel; 1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (endId == -1) 1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endId= lastId; 1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (lastScope == SCOPE_RULE) { 1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project begLabel= BEGINRULE_LABEL; 1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project begOutLabel= BEGINRULE_LABEL; 1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endLabel= ENDRULE_LABEL; 1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endOutLabel= arg1; // For inserting into closing brace 1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else { 1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project begLabel= BEGINSCOPE_LABEL; 1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project begOutLabel= BEGINRULE_LABEL; 1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endLabel= ENDSCOPE_LABEL; 1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endOutLabel= ENDSCOPE_LABEL; 1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project popScope(); 1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project switch (lastScope) { 1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_ITEM: 1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_COUNT: 1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_REPEAT: 1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_OPT: 1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (begLabel, begOutLabel, lastId, beginScopeId); 1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastId= NewVertexId(); 1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (endLabel, endOutLabel, endScopeId, lastId); 1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_ONEOF: 1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (begLabel, begOutLabel, startId, beginScopeId); 1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (endLabel, endOutLabel, endScopeId, endId); 1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_RULE: 1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (begLabel, begOutLabel, lastId, beginScopeId); 1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastId= NewVertexId(); 1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (endLabel, ruleId, endScopeId, lastId); 1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_ROOT: 1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (begLabel, begOutLabel, lastId, beginScopeId); 1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastId= NewVertexId(); 1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (endLabel, endOutLabel, endScopeId, lastId); 1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project default: 1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project printf ("Shouldn't be getting here\n"); 1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return lastId; 1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint SubGraph::CloseScope () 1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Closes the transitions and returns to the previous scope 1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project// Special case for count and repeats 1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int ii, finalId, endLoc, blockCount; 1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project switch (lastScope) { 1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_ITEM: 1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_RULE: 1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_ONEOF: 1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_OPT: 1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (NONE_LABEL, NONE_LABEL, startId, lastId); // start to end 1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_COUNT: 1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endLoc= numArc; 1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project blockCount= numVertex - startId - 1; 1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Special case, min-count= 0 1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ii= 1; ii < arg1; ii++) 1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CopyFastArcs (this, arcLoc, endLoc, ii * blockCount, -1, -1, -1, -1); 1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project finalId= lastId + (arg2 - 1) * blockCount; 1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for ( ; ii < arg2; ii++) { 1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CopyFastArcs (this, arcLoc, endLoc, ii * blockCount, -1, -1, -1, -1); 1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (NONE_LABEL, NONE_LABEL, lastId + (ii - 1) * blockCount, finalId); 1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (arg1 <= 0) 1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (NONE_LABEL, NONE_LABEL, startId, finalId); // start to end 1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project UpdateVertexCount (endLoc); 1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastId= finalId; 1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_REPEAT: 2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endLoc= numArc; 2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project blockCount= numVertex - startId - 1; 2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if 1 2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ii= 1; ii < arg1; ii++) 2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CopyFastArcs (this, arcLoc, endLoc, ii * blockCount, -1, -1, -1, -1); 2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project finalId= lastId + (arg1 - 1) * blockCount; 2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // loop 2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CopyFastArcs (this, arcLoc, endLoc, blockCount, startId, finalId, lastId, finalId); 2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // start to end 2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (arg1 == 0) 2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (NONE_LABEL, NONE_LABEL, startId, finalId); 2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else 2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // loop 2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CopyFastArcs (this, arcLoc, endLoc, blockCount, startId, lastId, lastId, lastId); 2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project UpdateVertexCount (endLoc); 2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // second part 2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project blockCount= numVertex - startId; 2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CopyFastArcs (this, arcLoc, endLoc, blockCount, startId, lastId, lastId, -1); 2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project UpdateVertexCount (endLoc); 2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // once 2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project finalId= lastId + blockCount; 2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project blockCount= numVertex - startId; 2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (arg1 <= 1) 2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CopyFastArcs (this, arcLoc, endLoc, blockCount, startId, startId, lastId, finalId); 2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // start to end 2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (arg1 == 0) 2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (NONE_LABEL, NONE_LABEL, startId, finalId); 2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project UpdateVertexCount (endLoc); 2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastId= finalId; 2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project default: 2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project printf ("Shouldn't be getting here\n"); 2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return lastId; 2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint SubGraph::AddItem (int inputLabel, int tagLabel) 2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int newId; 2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project switch (lastScope) { 2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_RULE: 2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arg1= tagLabel; 2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_ITEM: 2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_OPT: 2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_COUNT: 2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_REPEAT: 2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project newId= NewVertexId(); 2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (inputLabel, tagLabel, lastId, newId); 2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastId= newId; 2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_ONEOF: 2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (inputLabel, tagLabel, startId, endId); 2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastId= endId; 2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project default: ; 2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project printf ("Shouldn't be getting here\n"); 2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return lastId; 2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint SubGraph::AddTag (int tagLabel) 2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int newId; 2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project switch (lastScope) { 2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_RULE: 2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_ITEM: 2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_OPT: 2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_COUNT: 2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_REPEAT: 2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project newId= NewVertexId(); 2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (TAG_LABEL, tagLabel, lastId, newId); 2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastId= newId; 2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project case SCOPE_ONEOF: 2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (TAG_LABEL, tagLabel, startId, endId); 2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastId= endId; 2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project break; 2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project default: 2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project printf ("Shouldn't be getting here\n"); 2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return lastId; 2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::ExpandRules (SubGraph **subList, int *lookupList, int numSubs) 2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int initialId, finalId, ruleId, pos; 2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (int ii= 0; ii < numArc; ii++) { 2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ruleId= arc[ii]->GetInput(); 2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (ruleId < 0 && ruleId > NONE_LABEL) { 3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project initialId= arc[ii]->GetFromId(); 3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project finalId= arc[ii]->GetToId(); 3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ruleId= checkEntry (lookupList, numSubs, -ruleId); 3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project assert (ruleId >= 0); 3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // printf ("Expanding rule (%d) %s\n", -ruleId, subList[ruleId]->title); 3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arc[ii]->AssignInput (DISCARD_LABEL); // Clear down the rule 3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // printf ("------------------------"); 3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // subList[ruleId]->SortLanguage(); 3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // subList[ruleId]->Print(); 3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // printf ("------------------------////"); 3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project pos= numArc; 3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CopyFastArcs (subList[ruleId], 0, subList[ruleId]->numArc, numVertex, 3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project subList[ruleId]->startId, initialId, subList[ruleId]->lastId, finalId); 3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project UpdateVertexCount (pos); 3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project UpdateVertexCount (0); 3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SortLanguage (); 3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::UpdateVertexCount (int startLoc) 3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int vertId, maxVertId; 3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project maxVertId= -1; 3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (int ii= startLoc; ii < numArc; ii++) { 3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project vertId= arc[ii]->GetFromId(); 3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (maxVertId < vertId) 3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project maxVertId= vertId; 3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project vertId= arc[ii]->GetToId(); 3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (maxVertId < vertId) 3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project maxVertId= vertId; 3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project maxVertId++; 3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (startLoc <= 0) // i.e. a fresh start 3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project numVertex= maxVertId; 3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (numVertex < maxVertId) 3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project numVertex= maxVertId; 3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::AddTerminalConnections () 3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Add terminal transition 3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (TERMINAL_LABEL, NONE_LABEL, lastId, TERMINAL_LABEL); 3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::RemoveRuleConnections () 3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project AddTerminalConnections (); 3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveTagConnections (-1, -1); 3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveRuleStarts (-1, -1); 3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveRuleEnds (-1, -1); 3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveNulls (-1, -1); 3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ClearRuleIds (); 3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ClearDuplicateArcs (); 3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveUnvisitedArcs (startId, lastId); 3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveDiscardedArcs (); 3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RenumberNodes (); 3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project UpdateVertexCount (0); 3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SortLanguage (); 3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::RemoveRuleStarts (int startPoint, int endPoint) 3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (startPoint == -1 && endPoint == -1) { 3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project startPoint= startId; 3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endPoint= lastId; 3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *nodeList= new int [numVertex]; 3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *visitList= new int [numVertex]; 3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (int ii= 0; ii < numVertex; ii++) 3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project visitList[ii]= 0; 3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SortLanguage (); 3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ProcessBegins (startPoint, endPoint, BEGINRULE_LABEL, nodeList, 0, visitList, numVertex); 3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ClearLabelledConnections (BEGINRULE_LABEL); 3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete [] nodeList; 3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete [] visitList; 3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::RemoveRuleEnds (int startPoint, int endPoint) 3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (startPoint == -1 && endPoint == -1) { 3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project startPoint= startId; 3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endPoint= lastId; 3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *nodeList= new int [numVertex]; 3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *visitList= new int [numVertex]; 3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (int ii= 0; ii < numVertex; ii++) 4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project visitList[ii]= 0; 4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SortLanguageReverse (); 4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ProcessEnds (endPoint, startPoint, ENDRULE_LABEL, nodeList, 0, visitList, numVertex); 4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ClearLabelledConnections (ENDRULE_LABEL); 4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete [] nodeList; 4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete [] visitList; 4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::RemoveNulls (int startPoint, int endPoint) 4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (startPoint == -1 && endPoint == -1) { 4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project startPoint= startId; 4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endPoint= lastId; 4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *nodeList= new int [numVertex]; 4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *visitList= new int [numVertex]; 4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (int ii= 0; ii < numVertex; ii++) 4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project visitList[ii]= 0; 4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SortLanguage (); 4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ProcessBegins (startPoint, endPoint, NONE_LABEL, nodeList, 0, visitList, numVertex); 4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ClearLabelledConnections (NONE_LABEL); 4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete [] nodeList; 4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete [] visitList; 4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::RemoveInternalConnections () 4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveForwardConnections (-1, -1); 4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveBackwardConnections (-1, -1); 4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ClearDuplicateArcs (); 4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveUnvisitedArcs (startId, lastId); 4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveDiscardedArcs (); 4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RenumberNodes (); 4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project UpdateVertexCount (0); 4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SortLanguage (); 4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::RemoveForwardConnections (int startPoint, int endPoint) 4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Code to pull up nodes for forward connecting transitions 4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (startPoint == -1 && endPoint == -1) { 4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project startPoint= startId; 4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endPoint= lastId; 4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *nodeList= new int [numVertex]; 4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *visitList= new int [numVertex]; 4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (int ii= 0; ii < numVertex; ii++) 4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project visitList[ii]= 0; 4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SortLanguage (); 4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ProcessBegins (startPoint, endPoint, BEGINSCOPE_LABEL, nodeList, 0, visitList, numVertex); 4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ClearLabelledConnections (BEGINSCOPE_LABEL); 4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveDiscardedArcs (); 4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete [] nodeList; 4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete [] visitList; 4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::PullUpBegins (int currId, int baseId, int finalId, int procLabel, 4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *nodeList, int currNum, int maxNum) 4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int rix; 4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project nodeList[currNum]= currId; 4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rix= FindFromIndex (currId); 4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rix < 0) 4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (rix < sortNum && arc[forwardList[rix]]->GetFromId() == currId) { 4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (arc[forwardList[rix]]->GetInput() == procLabel) { 4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PullUpBegins (arc[forwardList[rix]]->GetToId(), baseId, 4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project finalId, procLabel, nodeList, currNum+1, maxNum); 4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (arc[forwardList[rix]]->GetInput() != DISCARD_LABEL) 4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project InheritArc (arc[forwardList[rix]], baseId); 4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rix++; 4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::ProcessBegins (int currId, int finalId, int procLabel, 4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *nodeList, int currNum, int *visitMark, int maxNum) 4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int rix, nextId; 4954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project nodeList[currNum]= currId; 4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rix= FindFromIndex (currId); 4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rix < 0) { 4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project visitMark[currId]= 1; 5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (rix < sortNum && arc[forwardList[rix]]->GetFromId() == currId) { 5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (arc[forwardList[rix]]->GetInput() == procLabel) { 5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PullUpBegins (arc[forwardList[rix]]->GetToId(), currId, 5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project finalId, procLabel, nodeList, currNum, maxNum); 5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project nextId= arc[forwardList[rix]]->GetToId(); 5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (nextId >= 0 && nextId != finalId && checkEntry (nodeList, currNum, nextId) < 0 5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project && visitMark[nextId] == 0) 5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ProcessBegins (nextId, finalId, procLabel, nodeList, currNum+1, visitMark, maxNum); 5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rix++; 5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project visitMark[currId]= 1; 5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::RemoveBackwardConnections (int startPoint, int endPoint) 5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Code to push back nodes for reverse connecting transitions 5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (startPoint == -1 && endPoint == -1) { 5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project startPoint= startId; 5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endPoint= lastId; 5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *nodeList= new int [numVertex]; 5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *visitList= new int [numVertex]; 5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (int ii= 0; ii < numVertex; ii++) 5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project visitList[ii]= 0; 5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SortLanguageReverse (); 5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ProcessEnds (endPoint, startPoint, ENDSCOPE_LABEL, nodeList, 0, visitList, numVertex); 5344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ClearLabelledConnections (ENDSCOPE_LABEL); 5354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveDiscardedArcs (); 5364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete [] nodeList; 5384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete [] visitList; 5394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 5404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 5414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::PullUpEnds (int currId, int baseId, int initialId, int procLabel, 5434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *nodeList, int currNum, int maxNum) 5444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 5454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int rix; 5464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project nodeList[currNum]= currId; 5484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rix= FindToIndex (currId); 5494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rix < 0) 5504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 5514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (rix < sortRevNum && arc[backwardList[rix]]->GetToId() == currId) { 5524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (arc[backwardList[rix]]->GetInput() == procLabel) { 5534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PullUpEnds (arc[backwardList[rix]]->GetFromId(), baseId, 5544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project initialId, procLabel, nodeList, currNum+1, maxNum); 5554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (arc[backwardList[rix]]->GetInput() != DISCARD_LABEL) 5574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project InheritReverseArc (arc[backwardList[rix]], baseId); 5584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rix++; 5594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 5614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 5624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::ProcessEnds (int currId, int initialId, int procLabel, 5644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *nodeList, int currNum, int *visitMark, int maxNum) 5654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 5664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int rix, nextId; 5674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project nodeList[currNum]= currId; 5694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rix= FindToIndex (currId); 5704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rix < 0) { 5714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project visitMark[currId]= 1; 5724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 5734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (rix < sortRevNum && arc[backwardList[rix]]->GetToId() == currId) { 5754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (arc[backwardList[rix]]->GetInput() == procLabel) { 5764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project PullUpEnds (arc[backwardList[rix]]->GetFromId(), currId, 5774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project initialId, procLabel, nodeList, currNum, maxNum); 5784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project nextId= arc[backwardList[rix]]->GetFromId(); 5804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (nextId != initialId && checkEntry (nodeList, currNum, nextId) < 0 5814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project && visitMark[nextId] == 0) 5824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ProcessEnds (nextId, initialId, procLabel, nodeList, currNum+1, visitMark, maxNum); 5834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rix++; 5844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project visitMark[currId]= 1; 5864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 5874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 5884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::RemoveUnreachedConnections (int startPoint, int endPoint) 5904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 5914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Obtain nodes with real transitions 5924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Code to pull up nodes for forward connecting transitions 5934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Code to push back nodes for reverse connecting transitions 5944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 5954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (startPoint == -1 && endPoint == -1) { 5964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project startPoint= startId; 5974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endPoint= lastId; 5984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 5994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ClearDuplicateArcs (); 6014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveUnvisitedArcs (startPoint, endPoint); 6024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveDiscardedArcs (); 6034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RenumberNodes (); 6044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project UpdateVertexCount (0); 6054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 6074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 6084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::RemoveUnreachedConnectionsDebug (int startPoint, int endPoint) 6104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 6114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Obtain nodes with real transitions 6124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Code to pull up nodes for forward connecting transitions 6134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Code to push back nodes for reverse connecting transitions 6144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (startPoint == -1 && endPoint == -1) { 6164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project startPoint= startId; 6174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endPoint= lastId; 6184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // ClearDuplicateArcs (); 6214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveUnvisitedArcs (startPoint, endPoint); 6224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveDiscardedArcs (); 6234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // RenumberNodes (); 6244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project UpdateVertexCount (0); 6254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 6274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 6284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::ReduceArcsByEquivalence () 6304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 6314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int ii, *equivMap, *depthMap; 6324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Sort by Input, Output and to nodes 6344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SortLanguage (); 6354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SortLanguageReverse (); 6364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Calculate depth 6384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project depthMap= new int [numVertex]; 6394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ii= 0; ii < numVertex; ii++) 6404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project depthMap[ii]= MAXNUM; 6414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (lastId >= 0) 6424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ReverseDepthData (lastId, depthMap, 1); 6434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ReverseDepthOnTerminal (depthMap); 6444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ii= 0; ii < numVertex; ii++) 6454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (depthMap[ii] == MAXNUM) 6464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project depthMap[ii]= -1; 6474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Create equivalence list 6494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project equivMap= new int [numVertex]; 6504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ii= 0; ii < numVertex; ii++) 6514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project equivMap[ii]= ii; 6524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Equivalence test to use equivalence list, duplicate transitions ignored 6544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Test nodes with same equivalence 6554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project IdentifyEquivalence (depthMap, equivMap); 6564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // On identification of an equivalence 6584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Update equivalence entry 6594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project MapGraphVertices (equivMap); 6604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveDiscardedArcs (); 6614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Sort for general access 6634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SortLanguage (); 6644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete [] depthMap; 6664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete [] equivMap; 6674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 6684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 6694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::DeterminizeArcs () 6714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 6724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int ii; 6734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool allDone; 6744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SortLanguage (); 6764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project DetCache *cache= new DetCache; 6774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 6784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetupVisitationCache (); 6794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project assert (VisitationConsistencyCheck () == 0); 6804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project printf ("Determinization\n"); 6814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project allDone= false; 6824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (!allDone) { 6834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project allDone= true; 6844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ii= 0; ii < numVertex; ii++) { 6854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (QueryMinProperty(ii) == false) { 6864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (startId == ii || QueryNodeProperty(ii) > 0) { 6874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project DeterminizeAtVertex (ii, cache); 6884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SetMinProperty (ii); 6894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project allDone= false; 6904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project //printf (" Node %d, Total %d, Arcs %d\n", ii, numVertex, numArc); 6914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project assert (VisitationConsistencyCheck () == 0); 6934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // hmm .. this seems harmless but .. 6944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // printf("assert(0) in SubGraph::DeterminizeArcs() ii=%d allDone=%d\n", ii, allDone); 6954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // assert (0); 6964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 6994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ClearVisitationCache (); 7014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete cache; 7034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 7044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 7054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint SubGraph::IsDeterminized (int currId) 7074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 7084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int count, rix, lastInput; 7094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project count= 0; 7114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastInput= -1; 7124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rix= FindFromIndex (currId); 7134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rix < 0) 7144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return -1; 7154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (rix < sortNum && arc[forwardList[rix]]->GetFromId() == currId) { 7164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (lastInput >= 0 && lastInput == arc[forwardList[rix]]->GetInput()) 7174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project count++; 7184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 7194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project lastInput= arc[forwardList[rix]]->GetInput(); 7204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rix++; 7214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return count; 7234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 7244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::ReverseGraphForOutput () 7264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 7274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int ii, incId, outId; 7284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project assert (startId == 0); 7304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project UpdateVertexCount (0); 7314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (ii= 0; ii < numArc; ii++) { 7324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project incId= arc[ii]->GetFromId(); 7334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project outId= arc[ii]->GetToId(); 7344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (outId == TERMINAL_LABEL) { 7354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arc[ii]->AssignFromId (0); 7364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arc[ii]->AssignInput (NONE_LABEL); 7374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arc[ii]->AssignOutput (NONE_LABEL); 7384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arc[ii]->AssignToId (incId); 7394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else { 7414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arc[ii]->AssignFromId (outId); 7424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (incId == 0) 7434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arc[ii]->AssignToId (numVertex); 7444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 7454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arc[ii]->AssignToId (incId); 7464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project (void) CreateArc (TERMINAL_LABEL, NONE_LABEL, numVertex, TERMINAL_LABEL); // Add terminal transition 7494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project numVertex++; 7504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 7524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 7534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::RemoveTagConnections (int startPoint, int endPoint) 7554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 7564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project // Code to push back nodes for reverse connecting transitions 7574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (startPoint == -1 && endPoint == -1) { 7594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project startPoint= startId; 7604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project endPoint= lastId; 7614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *nodeList= new int [numVertex]; 7644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *visitList= new int [numVertex]; 7654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project for (int ii= 0; ii < numVertex; ii++) 7664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project visitList[ii]= 0; 7674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project SortLanguageReverse (); 7694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ProcessTags (endPoint, startPoint, nodeList, 0, visitList, numVertex); 7704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ClearLabelledConnections (TAG_LABEL); 7714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project RemoveDiscardedArcs (); 7724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete [] nodeList; 7744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project delete [] visitList; 7754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 7764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 7774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool SubGraph::PullUpTags (int currId, int baseId, int initialId, 7794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int outTag, int *nodeList, int currNum, int maxNum) 7804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 7814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int rix; 7824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project bool hasCascade= false; 7834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 7844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project nodeList[currNum]= currId; 7854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rix= FindToIndex (currId); 7864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rix < 0) 7874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return hasCascade; 7884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (rix < sortRevNum && arc[backwardList[rix]]->GetToId() == currId) { 7894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (arc[backwardList[rix]]->GetInput() == TAG_LABEL) { 7904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (PullUpTags (arc[backwardList[rix]]->GetFromId(), baseId, initialId, 7914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arc[backwardList[rix]]->GetOutput(), nodeList, currNum+1, maxNum)) 7924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CreateCopyWithOutput (arc[backwardList[rix]], NONE_LABEL); 7934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project hasCascade= true; 7944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else if (arc[backwardList[rix]]->GetInput() != DISCARD_LABEL) 7964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project InheritReverseArcWithTag (arc[backwardList[rix]], baseId, outTag); 7974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rix++; 7984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 7994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return hasCascade; 8004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 8014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 8024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid SubGraph::ProcessTags (int currId, int initialId, int *nodeList, int currNum, 8034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int *visitMark, int maxNum) 8044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 8054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int rix, nextId; 8064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 8074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project nodeList[currNum]= currId; 8084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rix= FindToIndex (currId); 8094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (rix < 0) { 8104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project visitMark[currId]= 1; 8114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 8124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 8134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project while (rix < sortRevNum && arc[backwardList[rix]]->GetToId() == currId) { 8144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (arc[backwardList[rix]]->GetInput() == TAG_LABEL) { 8154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (PullUpTags (arc[backwardList[rix]]->GetFromId(), currId, initialId, 8164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project arc[backwardList[rix]]->GetOutput(), nodeList, currNum, maxNum)) 8174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CreateCopyWithOutput (arc[backwardList[rix]], NONE_LABEL); 8184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 8194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project nextId= arc[backwardList[rix]]->GetFromId(); 8204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (nextId != initialId && checkEntry (nodeList, currNum, nextId) < 0 8214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project && visitMark[nextId] == 0) 8224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ProcessTags (nextId, initialId, nodeList, currNum+1, visitMark, maxNum); 8234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project rix++; 8244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project } 8254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project visitMark[currId]= 1; 8264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return; 8274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 828