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