14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  grxmldoc.cpp  *
34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Licensed under the Apache License, Version 2.0 (the 'License');          *
74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  you may not use this file except in compliance with the License.         *
84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  You may obtain a copy of the License at                                  *
104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0                           *
114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software      *
134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  distributed under the License is distributed on an 'AS IS' BASIS,        *
144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  See the License for the specific language governing permissions and      *
164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  limitations under the License.                                           *
174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *                                                                           *
184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/
194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <assert.h>
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdlib.h>
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <fstream>
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <sstream>
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <iostream>
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <algorithm> // for std::sort
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "tinyxml.h"
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "grph.h"       // The word graph object and interface
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "sub_grph.h"	// The sub-graph object and interface
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "hashmap.h"
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "grxmldoc.h"
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_Session.h"
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//#include "LCHAR.h"
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define GRXML_DEBUG 0
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MAX_PATH_NAME 512
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define FATAL_ERROR(x,y) { std::cout << (x) << std::endl; exit ((y)); }
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define WARNING(x) std::cout << (x) << std::endl;
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if GRXML_DEBUG
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//#define DEBUG_PRINT(x) //
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DEBUG_PRINT(x) std::cout << (x) << std::endl;
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define PRINT_EXPRESSION(x)
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project//#define PRINT_EXPRESSION(x) std::cout << (x) << std::endl;
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DEBUG_PRINT(x) //
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define PRINT_EXPRESSION(x) //
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectusing namespace std;
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define CHECK_NOT_EMPTY(s, t) { if (s.empty()) \
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project				{ \
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project				std::cout << "ERROR: Empty string of type "  << t <<std::endl; \
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project				} \
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			     }
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint get_range(const std::string& s, int* minCnt, int* maxCnt)
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  std::string sval;
6273018b4a1d088cdda0e7bd059fddf1f308a8195aIan Rogers  size_t p1 =s.find("-");
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ( p1 !=string::npos ) {
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    sval.assign( s, 0, p1 );
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(strspn(sval.c_str(),"0123456789")<1) return 1;
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *minCnt = atoi( sval.c_str() );
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    sval.assign( s, p1+1, s.size() );
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *maxCnt = -1;    // 0== any?
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // If max is given then use BeginCount otherwise use BeginItemRepeat
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (!sval.empty() ) {
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(strspn(sval.c_str(),"0123456789")<1) return 1;
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *maxCnt = atoi( sval.c_str() );
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 0;
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  p1 = s.find("+");
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if( p1 != string::npos) {
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    sval.assign( s, 0, p1 );
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(strspn(sval.c_str(),"0123456789")<1) return 1;
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *minCnt = atoi( sval.c_str() );
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *maxCnt = -1;
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 0;
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(strspn(s.c_str(),"0123456789")<1) return 1;
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *minCnt = *maxCnt = atoi( s.c_str());
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectGRXMLDoc::GRXMLDoc()
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_NodeKeyWords.insert(make_pair("grammar", NodeTypeGrammar));
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_NodeKeyWords.insert(make_pair("rule", NodeTypeRule));
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_NodeKeyWords.insert(make_pair("ruleref", NodeTypeRuleReference));
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_NodeKeyWords.insert(make_pair("one-of", NodeTypeOneOf));
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_NodeKeyWords.insert(make_pair("item", NodeTypeItem));
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_NodeKeyWords.insert(make_pair("tag", NodeTypeTag));
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_NodeKeyWords.insert(make_pair("count", NodeTypeCount));
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_NodeKeyWords.insert(make_pair("meta", NodeTypeMeta));
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_pGraph = 0;
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_RuleAutoIndex = 0;
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_TagAutoIndex = 0;
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_LabelAutoIndex = 0;
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_ExpandedRulesAutoIndex = 0;
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_XMLFileName = "dummy.xml";
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectGRXMLDoc::~GRXMLDoc()
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    deleteRules();
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (m_pGraph) {
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        delete m_pGraph;
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::parseGrammar( XMLNode &node, std::string & xMLFileName )
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_XMLFileName = xMLFileName;
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Set up the internally defined rules, etc.
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    initializeLists();
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // The top level "document" node is given to this fn
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Create the container for the word graph.
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (m_pGraph) {
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        delete m_pGraph;
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_pGraph = new Graph("XML grammar");
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SubGraph *p_SubGraph;
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    parseNode( node, p_SubGraph, 1 );     // NB Subgraph pointed to will change in recursive fn.
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (findSubGraph( m_RootRule, p_SubGraph )) {
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	m_pGraph->ExpandRules (p_SubGraph);
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	p_SubGraph->RemoveInternalConnections ();
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	//Print the root rule.
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	//printSubgraph( *p_SubGraph );
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::parseNode( XMLNode &node, SubGraph *&p_SubGraph, const unsigned int level )
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // We will create a new subgraph for each rule node.
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // The "current" subgraph is substituted with the new subgraph for all ops on child nodes.
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // After processing child nodes the original subgraph is reinstated
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // for final operations in the endNode() fn.
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Initial processing of the current node before processing children
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if 0 && GRXML_DEBUG
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if(node.Type() == TiXmlNode::ELEMENT)
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		node.ToElement()->Print( stdout, level);
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	else if(node.Type() == TiXmlNode::DOCUMENT)
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		node.ToDocument()->Print( stdout, level);
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	else if(node.Type() == TiXmlNode::TEXT)
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		node.ToText()->Print( stdout, level);
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	else if(node.Type() == TiXmlNode::DECLARATION)
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		node.ToDeclaration()->Print( stdout, level);
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	else {
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		const char* text = node.Value();
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		if(!text) text = "__NULL__";
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		printf("processing node type %d text %s\n", node.Type(), text);
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    beginNode( node, p_SubGraph, level );
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SubGraph *p_LocalSubGraph;
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p_LocalSubGraph = p_SubGraph;
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	TiXmlNode* child;
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	for( child = node.FirstChild(); child; child = child->NextSibling() )
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		parseNode ( *child, p_SubGraph, level+1 );
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Revert current node
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p_SubGraph = p_LocalSubGraph;
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Finish processing current node
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    endNode( node, p_SubGraph, level );
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} // parseNode
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::beginNode( XMLNode &node, SubGraph *&p_SubGraph, const unsigned int level )
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string name = node.Value();
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    DEBUG_PRINT("Element = " + name);
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // XMLNode::Type type = node.getType();
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( node.Type() == TiXmlNode::TEXT) // isCData()
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      const char* cc_name = node.Parent()->Value();
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      std::string str_name(cc_name);
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      DEBUG_PRINT (std::string("CDATA ") + name);
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      DEBUG_PRINT (std::string("CDATA ") + str_name);
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      processCDATA( node, p_SubGraph );
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if ( node.Type()== TiXmlNode::ELEMENT /*isNode()*/ || node.NoChildren() /*isLeaf()*/)
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	//printNode(node, level);
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	// Use enum value
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	KEYWDPAIR::iterator pos;
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	pos = m_NodeKeyWords.find( name );
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	KeywordValues nodeType = NodeTypeBadValue;
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if ( pos != m_NodeKeyWords.end() )
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	{
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    nodeType = (*pos).second;
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    DEBUG_PRINT("nodeType=" + nodeType);
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	} else if(node.Type() == TiXmlNode::COMMENT) {
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		return true;
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	} else if(node.Type() == TiXmlNode::DECLARATION && name.length()==0) {
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		return true;
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	} else {
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  FATAL_ERROR( std::string("Error: unknown tag ") + name, ESR_INVALID_ARGUMENT);
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	switch ( nodeType )
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	{
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	case NodeTypeGrammar:
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    {
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		beginParseGrammarNode( node );
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    }
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    break;
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	case NodeTypeRule:
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    {
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		// NB This fn creates a new subgraph.
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		beginParseRuleNode( node, p_SubGraph );
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    }
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    break;
2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case NodeTypeRuleReference:
2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    {
2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		// NB This fn creates a new subgraph.
2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		beginRuleRef( node, p_SubGraph );
2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    }
2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    break;
2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case NodeTypeOneOf:
2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    {
2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		beginOneOf( node, p_SubGraph );
2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    }
2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    break;
2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case NodeTypeItem:
2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    {
2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		beginItem( node, p_SubGraph );
2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    }
2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    break;
2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case NodeTypeTag:
2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    {
2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		beginTag( node, p_SubGraph );
2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    }
2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    break;
2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case NodeTypeCount:
2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    {
2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		beginCount( node, p_SubGraph );
2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    }
2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    break;
2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case NodeTypeMeta:
2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    {
2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	        beginParseMetaNode( node );
2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    }
2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    break;
2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    case NodeTypeBadValue:
2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    default:
2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		DEBUG_PRINT( "UNKNOWN node name: " + name );
2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    break;
2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}; // switch
2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    } //is a Node or Leaf
2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if ( node.Type() == TiXmlNode::TEXT) // isCData()
2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	DEBUG_PRINT (std::string("CDATA ") + name);
2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	processCDATA( node, p_SubGraph );
2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} // beginNode()
2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::endNode( XMLNode &node, SubGraph *&p_SubGraph, const unsigned int level )
2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string name = node.Value();
2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //XMLNode::Type type = node.getType();
2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( node.Type()== TiXmlNode::ELEMENT /*isNode()*/ || node.NoChildren() )
2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	KEYWDPAIR::iterator pos;
2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	pos = m_NodeKeyWords.find( name );
2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	KeywordValues nodeType = NodeTypeBadValue;
2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if ( pos != m_NodeKeyWords.end() )
2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	{
2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    nodeType = (*pos).second;
2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}  else if(node.Type() == TiXmlNode::COMMENT) {
2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		return true;
2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	} else if(node.Type() == TiXmlNode::DECLARATION && name.length()==0) {
2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		return true;
2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	} else if(node.Type() == TiXmlNode::TEXT) {
2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	} else {
2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  FATAL_ERROR( std::string("Error: unknown tag ") + name, ESR_INVALID_ARGUMENT );
2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	switch ( nodeType )
3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	{
3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	case NodeTypeGrammar:
3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	{
3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    endParseGrammarNode( node );
3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	break;
3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	case NodeTypeRule:
3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	{
3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    endParseRuleNode( node, p_SubGraph );
3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	break;
3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	case NodeTypeRuleReference:
3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	{
3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    endRuleRef( node, p_SubGraph );
3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	break;
3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	case NodeTypeOneOf:
3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	{
3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    endOneOf( node, p_SubGraph );
3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	break;
3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	case NodeTypeItem:
3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	{
3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    endItem(node, p_SubGraph );
3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	break;
3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	case NodeTypeTag:
3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	{
3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    endTag( node, p_SubGraph );
3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	break;
3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	case NodeTypeCount:
3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	{
3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    endCount( node, p_SubGraph );
3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	break;
3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        case NodeTypeMeta:
3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	{
3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            endParseMetaNode( node );
3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	break;
3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	case NodeTypeBadValue:
3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	default:
3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    DEBUG_PRINT( "UNKNOWN node name: ");
3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    DEBUG_PRINT( name.c_str() );
3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	//Extend the
3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	break;
3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}; // switch
3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    } //isNode() or isLeaf()
3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	// Do nothing?
3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} // endNode()
3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::beginParseGrammarNode(XMLNode &node)
3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	const char* attr;
3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define GETATTR(nAmE) ((attr=node.ToElement()->Attribute(nAmE))!=NULL) ? attr:""
3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	m_XMLMode      = GETATTR("mode");
3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	m_XMLLanguage  = GETATTR("xml:lang");
3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_RootRule     = GETATTR("root");	// The root rule name
3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    DEBUG_PRINT("Root rule = " + m_RootRule);
3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_XMLTagFormat = GETATTR("tag-format");
3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_XMLVersion   = GETATTR("version");
3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_XMLBase      = GETATTR("xml:base");
3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::beginParseMetaNode(XMLNode &node)
3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  const char* attr;
3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  std::string meta_name  = GETATTR("name");
3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  std::string meta_value = GETATTR("content");
3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(meta_name == "word_penalty") {
3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_MetaKeyValPairs.insert(meta_name,meta_value);
3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // m_MetaKeyValPairs.print();
3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  } else if(meta_name == "do_skip_interword_silence") {
3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for(int j = 0; j<(int)meta_value.size(); j++){
3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      meta_value[j] = tolower(meta_value[j]); //lower();
3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(meta_value!="true" && meta_value!="false")
3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      printf ("\nWarning: %s must be set to 'true' or 'false'; defaulting to 'false'\n", meta_name.c_str());
3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      m_MetaKeyValPairs.insert(meta_name,meta_value);
3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  } else if(meta_name == "userdict_name") {
3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    printf ("\nWarning: ignoring unsupported meta %s %s\n", meta_name.c_str(), meta_value.c_str());
3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  } else {
3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    printf ("\nWarning: ignoring unsupported meta %s %s\n", meta_name.c_str(), meta_value.c_str());
3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return true;
3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::endParseGrammarNode(XMLNode &node)
4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // End parse operations
4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::beginParseRuleNode( XMLNode &node, SubGraph *&p_SubGraph)
4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	const char* attr;
4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Note: The subGraph may change if there are forward references. This
4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // is fine as we revert to the previous one when finished parsing the current node.
4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    DEBUG_PRINT ( "---- Rule\n" );
4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string ruleName = GETATTR("id" );
4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string s_tag    = GETATTR("tag" );
4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if( s_tag.length()>0) {
4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      FATAL_ERROR("Error: unsupported tag= syntax, use <tag> ... </tag>", 1)
4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHECK_NOT_EMPTY( ruleName, "id" );
4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Rule name must be unique within scope of entire grammar.
4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Put rule on stack - for context
4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_RuleListStack.push( ruleName );
4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Check whether a ruleref placeholder exists for this rule.
4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int index;
4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool foundRule = findRuleIndex( ruleName, index );
4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (foundRule) {
4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	// Rule is already declared; it must have been forward referenced
4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	// so swap the placeholder subgraph in.
4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	// NB subgraph and rule name are already known to lists.
4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	SubGraph *p_ExistingSubgraph;
4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if ( findSubGraph( ruleName, p_ExistingSubgraph ) ) {
4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    p_SubGraph = p_ExistingSubgraph;
4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	else {
4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    FATAL_ERROR("ERROR! Subgraph without rule name entry found!", -1);
4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else {
4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	// Create a Word Graph node for each rule node
4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	SubGraph *newGraph;
4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	addRuleToList( ruleName, newGraph );
4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	p_SubGraph = newGraph;
4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Make a note of the scope or rules; public, etc - used in map file.
4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    findRuleIndex( ruleName, index );
4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string ruleScope = GETATTR("scope" );
4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( !ruleScope.empty() ) {
4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        m_RuleScope.insert(index, ruleScope);
4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // We must accommodate Rules that have CDATA without an <item> element.
4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // We need to infer this element for all rules.
4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_pGraph->BeginItem( p_SubGraph );
4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PRINT_EXPRESSION( ruleName + " = { " );
4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} // beginParseRuleNode()
4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::endParseRuleNode( XMLNode &node, SubGraph *&p_SubGraph )
4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // The rule expression has been built as a subgraph and ID added to the rule list.
4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Finished editing subgraph
4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    DEBUG_PRINT ( "---- /Rule\n" );
4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //m_pGraph->EndRule(&p_SubGraph);
4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Tell the world
4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //std::string ruleName = attr.get( "id" );
4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string ruleName = m_RuleListStack.top();
4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_RuleListStack.pop();
4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //CHECK_NOT_EMPTY( ruleName, "id" );
4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Must be unique rule name within scope of entire grammar.
4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Check whether a ruleref placeholder exists for this rule.
4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_pGraph->addSubGraph ( p_SubGraph );
4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // We must accommodate Rules that have CDATA without an <item> element.
4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // We need to infer this element for all rules.
4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_pGraph->EndItem( p_SubGraph );
4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PRINT_EXPRESSION( " }\n" );
4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::processCDATA( XMLNode &node, SubGraph *&p_SubGraph )
4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Note the Item's CDATA
4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Strip leading and trailing whitespace
4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    const char* cc_name = node.Parent()->Value();
4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string str_name(cc_name); // = node.Parent()->ValueStr(); // getName
4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // std::string name = node.Parent()->Value(); // getName
4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //if ( name == "item" ) {
4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( str_name != "tag" ) {
4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	const char* const whitespace = " \t\r\n\v\f";
4954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	std::string cdata = node.Value(); // getCData()
4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	std::string word; // Words are whitespace separated
4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	cdata.erase(0, cdata.find_first_not_of(whitespace) );
4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	cdata.erase(cdata.find_last_not_of(whitespace) + 1);
5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if GRXML_DEBUG
5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        std::cout << "/--" << cdata << "--/\n";
5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	std::string::size_type begIdx, endIdx;
5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        //search beginning of the first word
5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        begIdx = cdata.find_first_not_of(whitespace);
5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        //while beginning of a word found
5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	while (begIdx != std::string::npos) {
5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            //search end of the actual word
5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            endIdx = cdata.find_first_of (whitespace, begIdx);
5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            if (endIdx == string::npos) {
5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                //end of word is end of line
5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                endIdx = cdata.length();
5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            word.clear();
5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    // word.assign(cdata,begIdx,endIdx);
5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    word.append (cdata, begIdx, endIdx - begIdx);
5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    if ( !word.empty() )
5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    {
5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if GRXML_DEBUG
5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		std::cout << " -->" << word << "<--\n";
5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		int index;
5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		// If a slot then take note of rule name
5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		if ( IsSlot( word ) ) {
5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		  const char* xmlBasename;
5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		  std::string ruleName = m_RuleListStack.top();
5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		  m_SlotList.insert(index, ruleName);
5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		  xmlBasename = strrchr(m_XMLFileName.c_str(),'/');
5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		  xmlBasename = xmlBasename ? xmlBasename+1 : m_XMLFileName.c_str();
5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		  word = (std::string)xmlBasename + "." + ruleName + "@" + word;
5344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		  addLabelToList( word );
5354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		  findLabelIndex( word, index );
5364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		} else {
5374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		  addLabelToList( word );
5384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		  findLabelIndex( word, index );
5394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
5404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		m_pGraph->AddLabel( p_SubGraph, index );
5414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    }
5424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    begIdx = cdata.find_first_not_of (whitespace, endIdx);
5434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
5454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    } //tag
5464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else {
5474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	// Do nothing with CDATA for elements that are not items.
5484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	// In particular, do not strip whitespace from tag cdata.
5494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	// However, CPPDOM appears to remove linefeeds. May need to tidy up.
5504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
5534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} // cdata
5544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::beginItem( XMLNode &node, SubGraph *&p_SubGraph )
5564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	const char* attr;
5584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    DEBUG_PRINT ("---- Item:\n");
5594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // First check whethere there is a count/repeat
5604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string s     = GETATTR("repeat" );
5614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int minCnt=0,maxCnt=0;
5624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string s_tag = GETATTR("tag" );
5634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if( s_tag.length()>0) {
5644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      FATAL_ERROR("Error: unsupported tag= syntax, use <tag> ... </tag>", 1)
5654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if( s.length()>0 && get_range( s, &minCnt, &maxCnt) ) {
5674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      FATAL_ERROR(std::string("error: while parsing range ") + s,1);
5684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( !s.empty() ) {
5704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      // RED FLAG: max should not be 0! A +ve number should have been given.
5714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if( maxCnt>0) {
5724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	m_pGraph->BeginCount( p_SubGraph, minCnt, maxCnt );
5734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
5744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else {
5754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	// NB: BeginItemRepeat  can only use min of 0 or 1!
5764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	m_pGraph->BeginItemRepeat ( p_SubGraph, minCnt, -1);
5774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
5784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else {
5804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	m_pGraph->BeginItem( p_SubGraph );
5814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
5834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::endItem( XMLNode &node, SubGraph *&p_SubGraph )
5874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    DEBUG_PRINT ( "---- /Item\n" );
5894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // What TODO if no tag for an item?
5914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_pGraph->EndItem( p_SubGraph );
5934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
5944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::beginRuleRef( XMLNode &node, SubGraph *&p_SubGraph )
5984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Extend word FST node with an entire FST subgraph.
6004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Forward referencing of rules is supported.
6014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // NB Remove the leading # from the ruleref name!
6024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    DEBUG_PRINT ( "---- Ruleref\n" );
6034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	const char* attr;
6054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string s_tag = GETATTR("tag" );
6064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if( s_tag.length()>0) {
6074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      FATAL_ERROR("Error: unsupported tag= syntax, use <tag> ... </tag>", 1)
6084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
6094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string s = GETATTR("uri" );
6104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (s.empty())
6114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
6124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	//
6134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	FATAL_ERROR( "ERROR! Ruleref specifies no uri name!", -1 );
6144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
6154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Remove the #:
6164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int p1 = s.find("#");
6174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( p1 !=0 ) {
6184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	FATAL_ERROR( "ERROR! bad ruleref name: '" + s + "'" + ". Rule reference must start with a '#'. External references are not supported.", -1 );
6194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
6204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    string ruleName;
6214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    getRuleRefName( node, ruleName );
6224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //std::string parentRuleName = m_RuleListStack.top();
6244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //addRuleDependency( parentRuleName, ruleName );
6254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int index;
6274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool foundRule = findRuleIndex( ruleName, index );
6284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (!foundRule) {
6294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	// Forward reference; create a placeholder subgraph ptr.
6304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	//SubGraph *newGraph = new SubGraph( (char *) ruleName.c_str() );
6314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	// RED FLAG:  Remember to check fwd ref rule was filled in at end.
6324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	SubGraph *newGraph;
6334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	addRuleToList( ruleName, newGraph );
6344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	findRuleIndex( ruleName, index );
6354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
6364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // We can now treat a forward-referenced graph as if it was defined.
6374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // We will add the subgraph when we have the tag - see endItem().
6384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_pGraph->BeginRule( p_SubGraph );
6394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_pGraph->AddRuleRef( p_SubGraph, index );
6404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_pGraph->EndRule( p_SubGraph );
6414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
6434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::endRuleRef(XMLNode &grmNode, SubGraph *&p_SubGraph )
6474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
6484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    DEBUG_PRINT ( "---- /Ruleref\n" );
6494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Does nothing
6504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // NB The tag is not under the ruleref element - it is in the current item element.
6514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // We now add the tag of the AddRuleRef as we see the tag element. See EndTag().
6524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
6544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::beginOneOf(XMLNode &grmNode, SubGraph *&p_SubGraph)
6584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
6594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    DEBUG_PRINT ( "----OneOf\n" );
6604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_pGraph->BeginOneOf (p_SubGraph);
6614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
6624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::endOneOf(XMLNode &grmNode, SubGraph *&p_SubGraph)
6664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
6674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    DEBUG_PRINT ( "----/OneOf\n" );
6684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_pGraph->EndOneOf (p_SubGraph);
6694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
6704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::beginTag( XMLNode &node, SubGraph *&p_SubGraph )
6744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
6754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    DEBUG_PRINT ("---- Tag\n");
6764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string s = node.ToElement()->GetText(); // getCdata();
6774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if GRXML_DEBUG
6784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::cout << s;     // debug
6794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
6804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Store the semantic tag info.
6814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // NB Do not strip whitespace from tag cdata
6824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( !s.empty() )
6834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
6844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	int index;
6854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	addTagToList( s );
6864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	findTagIndex( s, index );
6874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	m_pGraph->AddTag ( p_SubGraph, index );
6884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
6894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
6914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::endTag( XMLNode &node, SubGraph *&p_SubGraph )
6954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
6964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    DEBUG_PRINT ("---- /Tag\n");
6974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
6984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::beginCount( XMLNode &node, SubGraph *&p_SubGraph )
7024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
7034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	const char* attr;
7044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Count of reps applies to the text elements in this count node
7054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    DEBUG_PRINT ("---- Count\n");
7064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Get number attr
7074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string s     = GETATTR("number");
7084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string s_tag = GETATTR("tag" );
7094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if( s_tag.length()>0) {
7104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      FATAL_ERROR("Error: unsupported tag= syntax, use <tag> ... </tag>", 1)
7114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
7124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (s.empty()) {
7134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		return false;
7144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
7154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // not  in subgraph but in graph?!
7164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //graph.BeginCount(n);
7174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int minCnt=-1, maxCnt=-1;
7194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if( get_range( s, &minCnt, &maxCnt) ) {
7204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      FATAL_ERROR(std::string("error: while parsing range ") + s,1);
7214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
7224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( s.c_str() == std::string("optional") )
7234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
7244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	m_pGraph->BeginOptional( p_SubGraph );
7254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
7264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if ( minCnt>0 && maxCnt>0)
7274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
7284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	m_pGraph->BeginCount( p_SubGraph, minCnt, maxCnt );
7294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
7304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if( minCnt>0 )
7314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
7324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	m_pGraph->BeginItemRepeat ( p_SubGraph, minCnt, -1);
7334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
7344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else { //
7354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    	m_pGraph->BeginOptional ( p_SubGraph );
7364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
7374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
7394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
7404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::endCount( XMLNode &node, SubGraph *&p_SubGraph )
7434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
7444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    DEBUG_PRINT ("---- /Count\n");
7454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_pGraph->EndCount( p_SubGraph );
7464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
7474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
7484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::endParseMetaNode(XMLNode &node)
7504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
7514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  // End parse operations
7524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return true;
7534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
7544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid GRXMLDoc::printNode(XMLNode &node, int level)
7564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
7574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string name = node.Value();
7584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int type = node.Type();
7594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string c_data;
7604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for(int i=0;i<level;i++) std::cout << " ";
7624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    char c = ' ';
7644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    switch(type)
7654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
7664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case TiXmlNode::ELEMENT:
7674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	// case XMLNode::xml_nt_node: // grammar, rule, one-of, item, count
7684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	 c = '+';
7694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	 break;
7704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	/* case TiXmlNode::TEXT:
7714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	// case XMLNode::xml_nt_leaf:
7724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	c = '-';
7734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	break; */
7744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case TiXmlNode::DOCUMENT:
7754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // case XMLNode::xml_nt_document:
7764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	c = '\\';
7774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	break;
7784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case TiXmlNode::TEXT:
7794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // case XMLNode::xml_nt_cdata:
7804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	c = '#';
7814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	c_data = node.Value(); // getCdata();
7824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	break;
7834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	case TiXmlNode::UNKNOWN:
7844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	case TiXmlNode::COMMENT:
7854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	case TiXmlNode::TYPECOUNT:
7864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	case TiXmlNode::DECLARATION:
7874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	default:
7884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		std::cout << "Error: not sure what to do here" << std::endl;
7894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		break;
7904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
7914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if(node.Type() == TiXmlNode::TEXT)  // isCData()
7924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  std::cout << c << name.c_str() << "[" << c_data << "]" << std::endl;
7934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	//Extend the tag hashtable
7944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
7954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  std::cout << c << name.c_str() << std::endl;
7964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if( node.Type() == TiXmlNode::ELEMENT) {
7984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		for(TiXmlAttribute* attr=node.ToElement()->FirstAttribute();
8004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			attr; attr=attr->Next() ) {
8014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		  // guru: added output of attributes
8034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			for (int i=0; i<level; i++)
8044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project				std::cout << " ";
8054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			std::cout << "   ";
8064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			std::cout << attr->Name() << ": " << attr->Value() << std::endl;
8074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
8084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
8094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
8114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/** Function: addRuleToList
8134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    Extends list of SubGraphs with given subGraph
8144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    and extends list of rule names too.
8154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    TODO: Can we use one hash and use internal numeric index for rule IDs?
8164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project*/
8174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::addRuleToList(std::string const & ruleName, SubGraph *&p_SubGraph)
8204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
8214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int index;
8224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( findRuleIndex ( ruleName, index ) ) {
8234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	FATAL_ERROR("ERROR! Rule name " + ruleName + " is already defined!", -1 );
8244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
8254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    addLabelToList( m_XMLFileName + "@" + ruleName);
8274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    findLabelIndex( m_XMLFileName + "@" + ruleName, index );
8284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if GRXML_DEBUG
8294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::cout << "Rule " << ruleName << std::endl;
8304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
8314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Create the new subgraph and update lists
8324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_RuleList.insert( ruleName, index );
8334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p_SubGraph = new SubGraph( (char *) ruleName.c_str(), index );
8344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool success = m_SubgraphList.insert( ruleName, p_SubGraph );
8364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (!success) {
8374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	FATAL_ERROR("ERROR! subgraph for " + ruleName + " is already defined!", -1 );
8384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
8394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if ADD_BRACES
8404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    addLabelToList( "{" );
8414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::stringstream  ss;
8424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ss << "}(" << index << ")";
8434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    addLabelToList( ss.str());
8444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
8454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return success;
8464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
8474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::deleteRules()
8504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
8514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Delete all allocated subgraphs.
8524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // The rule strings are part of the hashtables and get deleted by them.
8534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int index;
8544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SubGraph *p_SubGraph;
8554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string ruleName;
8564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    while ( !m_RuleList.isEmpty() ) {
8574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	m_RuleList.getFirst( &ruleName, &index );
8584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	m_RuleList.remove( ruleName );
8594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if (m_SubgraphList.getValue( ruleName, &p_SubGraph ) ) {
8604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    delete p_SubGraph;
8614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
8624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	else {
8634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    FATAL_ERROR("No subgraph for rule " + ruleName + "! Mismatched rules and subgraph hashtables!", -1);
8644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
8654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
8664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_SubgraphList.clear();
8674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_RuleList.clear();
8684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_LabelList.clear();
8694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_TagList.clear();
8704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return true;
8714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
8724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::findSubGraph(std::string & s, SubGraph *&p_SubGraph)
8744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
8754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return m_SubgraphList.getValue(s, &p_SubGraph);
8764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
8774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::findRule(int i, std::string &s )
8794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
8804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return m_RuleList.getIndex( i, &s );
8814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
8824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::findTag(int i, std::string &s )
8844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
8854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return m_TagList.getValue( i, &s );
8864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
8874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::findLabel(int i, std::string &s )
8894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
8904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return m_LabelList.getValue( i, &s );
8914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
8924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::findSubGraphIndex( SubGraph *p_SubGraph, std::string &s )
8944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
8954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return m_SubgraphList.getIndex( p_SubGraph, &s );
8964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
8974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::findRuleIndex( std::string s, int &i )
8994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return m_RuleList.getValue( s, &i );
9014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::findTagIndex( std::string s, int &i )
9034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return m_TagList.getIndex( s, &i );
9054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::findLabelIndex( std::string s, int &i )
9074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return m_LabelList.getIndex( s, &i );
9094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::findMeta(const std::string & sn, std::string &s)
9114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return m_MetaKeyValPairs.getValue( sn, &s );
9134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::setMeta(const std::string & sn, const std::string &s)
9154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  std::string tmp;
9174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(findMeta(sn,tmp))
9184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_MetaKeyValPairs.remove(sn);
9194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return m_MetaKeyValPairs.insert(sn,s);
9204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::addTagToList( std::string const& s )
9234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool success = true;
9254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // Make values unique
9264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int index;
9274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( !findTagIndex( s, index ) )
9284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	success = m_TagList.insert( m_TagAutoIndex++, s );
9294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return success;
9304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::addLabelToList( std::string const& s )
9344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  // TODO: Labels should be unique. Change key.
9364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int index;
9374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bool bRes = m_LabelList.getIndex( s, &index );
9384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(bRes == true) {
9394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return false; // exists
9404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bRes = m_LabelList.insert( m_LabelAutoIndex++, s );
9424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return  bRes;
9434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid GRXMLDoc::printLists()
9464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_SubgraphList.print();
9484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_RuleList.print();
9494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_TagList.print();
9504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_LabelList.print();
9514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid GRXMLDoc::printSubgraphs()
9554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SubGraph *p_SubGraph;
9574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string rule;
9584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int index;
9594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( m_RuleList.getFirst( &rule, &index) ) {
9604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if ( findSubGraph( rule, p_SubGraph ) ) {
9614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    DEBUG_PRINT("============ Rule: " + rule + "============");
9624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    printSubgraph( *p_SubGraph );
9634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    while ( m_RuleList.getNext( &rule, &index) ) {
9644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		if ( findSubGraph( rule, p_SubGraph ) ) {
9654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    printSubgraph( *p_SubGraph );
9664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
9674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    }
9684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
9694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
9704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid GRXMLDoc::printSubgraph( SubGraph &p_SubGraph )
9744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p_SubGraph.PrintWithLabels( *this );
9764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::getRuleRefName(XMLNode &node, std::string &ruleName)
9804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  const char* attr;
9824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  std::string s = GETATTR("uri" );
9834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (s.empty()) {
9844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FATAL_ERROR( "ERROR! Ruleref specifies no uri name!", -1 );
9854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  // Remove the #:
9874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int p1 = s.find("#");
9884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ( p1 !=0 ) {
9894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FATAL_ERROR( "ERROR! bad ruleref name: '" + s + "'", -1 );
9904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ruleName.assign( s, 1, s.size() );
9924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return true;
9934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid GRXMLDoc::initializeLists()
9964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  m_SubgraphList.setName("Subgraphs");
9984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  m_RuleList.setName("Rules");
9994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  m_TagList.setName("Tags");
10004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  m_LabelList.setName("Labels");
10014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Predefined rules. NB Labels are also created for each rule added.
10034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  // The required order for these labels in the .map output file is:
10044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //     0   eps
10054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //     next come slots
10064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //     pau and pau2
10074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //     everything else
10084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  // We will add all these now in case they are referenced and we will
10094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  // reindex after we have parsed the grammar -- when we have the list
10104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  // of slots. This re-indexing is for the output files .map and .P.txt.
10114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  //
10124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  */
10134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    addLabelToList( "eps" );
10144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    addLabelToList( "-pau-" );
10164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    addLabelToList( "-pau2-" );
10174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
10184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid GRXMLDoc::writeMapFile( std::string & fileName )
10204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
10214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // We need to re-index in order to put the labels in correct order:
10224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // 1. eps
10234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // 2. all slots
10244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // 3. all rules
10254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // 4. -pau- words
10264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // 5. remaining labels
10274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ofstream outfile;
10284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int index, origIndex;
10294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string label;
10304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string slotRuleName;
10314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string scope; // For rules
10324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    HashMap<int,std::string> orderedList;
10334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int orderedIndex=0;
10344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // 1. eps
10354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    orderedList.insert( orderedIndex++, "eps" );
10364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // 2. slots
10384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( m_LabelList.getFirst( &origIndex, &label ) ) {
10394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if ( IsSlot( label ) ) {
10404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    orderedList.insert( orderedIndex++, label );
10414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
10424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	while (m_LabelList.getNext( &origIndex, &label ) ) {
10434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    if ( IsSlot( label ) ) {
10444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		orderedList.insert( orderedIndex++, label );
10454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    }
10464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
10474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
10484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // 3.  Now rules, or anything with @
10504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( m_LabelList.getFirst( &origIndex, &label ) ) {
10514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	do {
10524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if GRXML_DEBUG
10534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    std::cout << label << " "<< label.find_first_of ("@") << std::endl;
10544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
10554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            if (!IsSlot(label) && label.find_first_of ("@") != string::npos) {
10564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if GRXML_DEBUG
10574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		std::cout << "    Adding " << label << std::endl;
10584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
10594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		orderedList.insert( orderedIndex++, label );
10604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    }
10614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	} while (m_LabelList.getNext( &origIndex, &label ) );
10624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
10634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // 4. pau
10654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    orderedList.insert( orderedIndex++, "-pau-" );
10664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    orderedList.insert( orderedIndex++, "-pau2-" );
10674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // 5. Remaining stuff. NB We depend upon the label not
10694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //    being added twice.
10704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( m_LabelList.getFirst( &origIndex, &label ) ) {
10714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if ( !orderedList.getIndex( label, &index ) ) {
10724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  orderedList.insert( orderedIndex++, label );
10734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
10744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	while (m_LabelList.getNext( &origIndex, &label ) ) {
10754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    if ( !orderedList.getIndex( label, &index ) ) {
10764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	      orderedList.insert( orderedIndex++, label );
10774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    }
10784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
10794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
10804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    outfile.open ( fileName.c_str() );
10814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bool bRes = orderedList.getFirst( &index, &label );
10834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    do {
10844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(!bRes) break;
10854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      // Look up scope using original index
10864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      m_LabelList.getIndex( label, &origIndex );
10874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (m_RuleScope.getValue(origIndex, &scope) )
10884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	label = scope + ":" + label;
10894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      outfile << label << " " << index << std::endl;
10904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      bRes = orderedList.getNext( &index, &label );
10914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    } while(bRes);
10924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    outfile.close();
10944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
10954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid GRXMLDoc::writeScriptFile( std::string & fileName )
10984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
10994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ofstream outfile;
11004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int index;
11014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string label;
11024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    outfile.open ( fileName.c_str() );
11034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( m_TagList.getFirst( &index, &label ) ) {
11044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    	outfile << index << " " << label << std::endl;
11054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
11064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    while (m_TagList.getNext( &index, &label ) ) {
11074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    	outfile << index << " " << label << std::endl;
11084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
11094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    outfile.close();
11104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //m_LabelList.writeFile( fileName );
11124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
11134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid GRXMLDoc::writeParamsFile( std::string & fileName )
11154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
11164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  std::string wtw;
11174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ofstream outfile;
11184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bool bRes;
11194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  outfile.open(fileName.c_str());
11214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  std::string metaname = "word_penalty";
11234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bRes = findMeta(metaname, wtw);
11244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(bRes)
11254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    outfile << metaname.c_str() << "\t=\t" << wtw.c_str() << std::endl;
11264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  // outfile << "locale"  << "\t=\t" << m_XMLLanguage << std::endl;
11284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  outfile.close();
11294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
11304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid GRXMLDoc::writeGraphFiles( std::string& prefix, bool bDoWriteRecogGraphs)
11324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
11334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SubGraph *p_SubGraph;
11344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SubGraph *p_SemGraph;
11354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string fileName;
11364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( !findSubGraph( m_RootRule, p_SubGraph ) ) {
11374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	FATAL_ERROR ("ERROR: writeGraphFiles - no root rule "+ m_RootRule + " defined. No file created", -1 );
11384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
11394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    //  Create .P.txt
11414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    printf ("\nCreating semantic graph file\n");
11424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p_SemGraph = new SubGraph( (char *) "Main", -1);
11434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_pGraph->BeginRule( p_SemGraph );
11444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_pGraph->AddRuleRef( p_SemGraph, p_SubGraph->getRuleId());
11454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_pGraph->EndRule( p_SemGraph );
11464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_pGraph->ExpandRules (p_SemGraph);
11474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p_SemGraph->RemoveInternalConnections ();
11484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p_SemGraph->AddTerminalConnections ();
11504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p_SemGraph->ReduceArcsByEquivalence();
11514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p_SemGraph->RemoveUnreachedConnections (-1, -1);
11524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p_SemGraph->DeterminizeArcs();
11534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p_SemGraph->RemoveUnreachedConnections (-1, -1);
11544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p_SemGraph->ReduceArcsByEquivalence();
11554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p_SemGraph->RemoveUnreachedConnections (-1, -1);
11564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    fileName = prefix + ".P.txt";
11574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p_SemGraph->WriteForwardGraphWithSemantic( fileName, *this );
11584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    delete p_SemGraph;
11594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    fileName = prefix + ".omap";
11614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    this->WriteOLabels(fileName);
11624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
11634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid GRXMLDoc::sortLabels()
11654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
11664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    // We need to re-index in order to put the labels in correct order:
11674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    int index=0, origIndex;
11684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string label;
11694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string slotRuleName;
11704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string scope; // For rules
11714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::vector <std::string> orderedList;
11724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( m_LabelList.getFirst( &origIndex, &label ) ) {
11734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        // Look up scope using original index
11744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        orderedList.push_back( label );
11754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        while (m_LabelList.getNext( &origIndex, &label ) ) {
11764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            orderedList.push_back( label );
11774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
11784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
11794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::sort(orderedList.begin(), orderedList.end() );
11804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_SortedLabelList.clear();
11814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    index=0;
11824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (std::vector<std::string>::const_iterator citer = orderedList.begin();
11834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     citer != orderedList.end(); ++citer) {
11844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        label = *citer;
11854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        m_LabelList.getIndex( label, &origIndex );
11864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        m_SortedLabelList.insert( index, label );
11874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        index++;
11884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        // std::cout <<"Sorted: " << index <<" " << label <<std::endl;
11894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
11904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return;
11914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
11924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::findSortedLabel(int i, std::string &s )
11944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
11954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (m_SortedLabelList.isEmpty() ) {
11964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        sortLabels(); // Create the sorted label list.
11974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
11984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return m_SortedLabelList.getValue( i, &s );
11994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
12004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::findSortedLabelIndex( int i, int &sortedIndex )
12024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
12034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::string s;
12044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (m_SortedLabelList.isEmpty() ) {
12054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        sortLabels(); // Create the sorted label list.
12064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
12074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( m_LabelList.getValue( i, &s ) ) {
12084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if ( m_SortedLabelList.getIndex(s, &sortedIndex )) {
12094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            return true;
12104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
12114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
12124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return false;
12134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
12144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid GRXMLDoc::addOLabelToOList( std::string &s)
12164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
12174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_OutputPtxtLabels.insert( s, 0);
12184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
12194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectbool GRXMLDoc::WriteOLabels(const std::string& fileName)
12214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
12224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  HashMap<int,std::string> invMap;
12234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int count = 0;
12244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int max_script_label = 0;
12254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int scriptID = 0;
12264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  std::map<std::string, int>::iterator iter;
12274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bool bFound;
12284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int tmp;
12294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  std::string strIndex = "eps";
12314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bFound = m_OutputPtxtLabels.getValue(strIndex, &tmp);
12324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(bFound)
12334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_OutputPtxtLabels.remove(strIndex);
12344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  m_OutputPtxtLabels.insert(strIndex, count);
12354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  invMap.insert( count, strIndex);
12364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  count++;
12374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  strIndex = "{";
12394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bFound = m_OutputPtxtLabels.getValue(strIndex, &tmp);
12404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(bFound)
12414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m_OutputPtxtLabels.remove(strIndex);
12424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  m_OutputPtxtLabels.insert(strIndex, count);
12434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  invMap.insert( count, strIndex);
12444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  count++;
12454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  iter = m_OutputPtxtLabels.begin();
12474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for( ; iter!=m_OutputPtxtLabels.end(); iter++) {
12484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    const char* label = iter->first.c_str();
12494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if( !strncmp(label,SCRIPT_LABEL_PREFIX, SCRIPT_LABEL_PREFIX_LEN)
12504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	&& strspn(label+SCRIPT_LABEL_PREFIX_LEN,"0123456789")==strlen(label+SCRIPT_LABEL_PREFIX_LEN) ) {
12514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      scriptID = atoi(label+SCRIPT_LABEL_PREFIX_LEN);
12524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(max_script_label < scriptID)
12534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	max_script_label = scriptID;
12544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }/* else if( !strncmp(label,SCRIPT_LABEL_PREFIX, SCRIPT_LABEL_PREFIX_LEN)) {
12554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      invMap.insert(count, iter->first);
12564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      iter->second = count;
12574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      count++;
12584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }*/
12594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if(!invMap.getIndex((iter->first), &tmp)){
12604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      invMap.insert(count, iter->first);
12614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      iter->second = count;
12624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      count++;
12634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
12644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
12654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  cout << "found max_script_label " << max_script_label << endl;
12674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for(int j=0; j<=max_script_label; j++) {
12684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    std::stringstream ss;
12694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ss << SCRIPT_LABEL_PREFIX << j;
12704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(!invMap.getIndex( ss.str(), &tmp)) {
12714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      invMap.insert( count++, ss.str());
12724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
12734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
12744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  std::ofstream outfile(fileName.c_str());
12764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  std::string outscript;
12774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(!outfile) {
12784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FATAL_ERROR( "Error: opening the omap file for output", 1);
12794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    WARNING( "Error: opening the omap file for output");
12804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
12814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
12824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for(int i=0; i<count; i++) {
12834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    outscript = "";
12844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    invMap.getValue(i,&outscript);
12854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(outscript.length() == 0) {
12864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      cout << "error: internal error while making .omap " << i << endl;
12874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      FATAL_ERROR("error",1);
12884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
12894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    outfile << outscript.c_str() << " " << i << std::endl;
12904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
12914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  outfile.close();
12924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
12934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1294