14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  test_g2g.c  *
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
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pstdio.h"
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmemory.h"
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "plog.h"
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "HashMap.h"
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_Grammar.h"
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_Vocabulary.h"
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_SemanticResult.h"
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_Session.h"
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_Locale.h"
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "ESR_CommandLine.h"
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "LCHAR.h"
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "PFileSystem.h"
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "PANSIFileSystem.h"
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_GrammarImpl.h"
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "simapi.h"
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "srec_context.h"
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "srec_arb.h"
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/**
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * @todo document
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttypedef struct
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned short nnodes;
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned long  size;
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  long    phoneme;
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned short node_pos;
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned long  node_off;
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  short    low_genone_no;
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  short    high_genone_no;
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  short    low_pel_no;
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  short    high_pel_no;
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projecttree_head;
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint usage(LCHAR* exename)
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT,"usage: %s -base <basefilename> \n",exename);
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT,"<basefilename> can be a file.g2g or @g2gfilelist\n");
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT,"[-checkword id] .. also checks word id in the file\n");
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT,"[-swiarb esr/config/lang/models/generic.swiarb] ... enables word check\n");
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 1;
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* protos */
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode find_phonemes_for_ihmms( CA_Arbdata* ca_arbdata, modelID* ihmms, int num_hmms);
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode Parse(SR_Grammar* grammar, LCHAR* trans, PFile* fout);
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint CheckG2G(CA_Arbdata* arbdata, int* p4pTable, const char* base, int wordid, char* outbase);
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid load_filelist(char* filelist, char*** pfiles, int *pnum_files);
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint *phonemecode_for_pel_table(CA_Arbdata* arbdata);
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint debug = 0;
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MAX_LINE_LENGTH 256
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MAX_STR_LENGTH   80
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MAX_SEM_RESULTS   3
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MAX_KEYS         30
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* main */
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint main (int argc, char **argv)
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR base[P_PATH_MAX] = L("");
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i;
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_Arbdata* ca_arbdata;
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char*  arbfile = NULL;
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char** g2glist;
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int g2glist_len;
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char* outbase = NULL;
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int *p4pTable;
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int wordid = 0;
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int log_level = 0;
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * Initialize portable library.
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   */
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, PMemInit());
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*  CHKLOG(rc, PFileSystemCreate());
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, PANSIFileSystemCreate());
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, PANSIFileSystemAddPath(L("/dev/ansi"), L("/")));*/
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Set ANSI file-system as default file-system */
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*  CHKLOG(rc, PANSIFileSystemSetDefault(ESR_TRUE));*/
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* Set virtual current working directory to native current working directory */
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*  len = P_PATH_MAX;
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, PANSIFileSystemGetcwd(cwd, &len));
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, PFileSystemChdir(cwd));*/
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if( argc <= 1)
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	{
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    usage(argv[0]);
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    exit(EXIT_FAILURE);
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	for (i = 1; i < argc; ++i)
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	{
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		if(!LSTRCMP(argv[i], L("-base")))
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		{
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			++i;
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			LSTRCPY(base, argv[i]);
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		else if(!LSTRCMP(argv[i],L("-out")))
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		{
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			outbase = argv[++i];
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		else if(!LSTRCMP(argv[i],L("-swiarb")))
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		{
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			arbfile = argv[++i];
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		else if(!LSTRCMP(argv[i],L("-checkword")))
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		{
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			wordid = atoi(argv[++i]);
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		else if(!LSTRCMP(argv[i],L("-log")))
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		{
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			log_level = 10;
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		else
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		{
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			printf("unrecog'd argument %s\n", argv[i]);
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			exit(1);
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		}
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	CHK(rc, PLogInit(NULL, log_level));
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if(arbfile) {
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		ca_arbdata = CA_LoadArbdata(arbfile);
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		if(!ca_arbdata) {
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pfprintf(PSTDOUT, "Error: loading arbfile %s\n", arbfile);
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pfprintf(PSTDOUT, "arbdata done\n");
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p4pTable  = phonemecode_for_pel_table(ca_arbdata);
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pfprintf(PSTDOUT, "p4pTable done\n");
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  } else {
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ca_arbdata = 0;
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    p4pTable = 0;
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(base[0] == '@') {
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    load_filelist(base+1, &g2glist, &g2glist_len);
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pfprintf(PSTDOUT, "g2glist %s .. %d entries\n", g2glist_len);
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for(i=0; i<g2glist_len; i++)
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CheckG2G( ca_arbdata, p4pTable, g2glist[i], wordid, outbase);
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else {
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CheckG2G( ca_arbdata, p4pTable, base, wordid, outbase);
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PLogShutdown();
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*  PANSIFileSystemDestroy();
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PFileSystemDestroy();*/
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PMemSetLogFile(PSTDOUT);
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PMemDumpLogFile();
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PMemShutdown();
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint CheckG2G(CA_Arbdata* ca_arbdata, int* p4pTable, const char* base, int wordid, char* outbase)
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl *grammarImpl;
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_Grammar* grammar = NULL;
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  srec_context* fst;
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_Syntax* syntax;
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  modelID ilabels_preceding[64], num_ilabels_preceding;
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  modelID ilabels_following[64], num_ilabels_following;
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  modelID ilabels[128], num_ilabels;
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i,j;
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned long g2gsize;
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(1) {
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FILE* fp;
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    fp = fopen(base, "rb");
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(!fp) g2gsize = 0;
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else {
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      fseek(fp, 0, SEEK_END);
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      g2gsize = ftell(fp);
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      fclose(fp);
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = SR_GrammarLoad(base, &grammar);
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(rc != ESR_SUCCESS) {
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pfprintf(PSTDOUT, "%s failed at load\n", base);
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  grammarImpl = (SR_GrammarImpl*)grammar;
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  syntax = grammarImpl->syntax;
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(outbase) {
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_DumpSyntax( syntax, outbase);
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  fst = syntax->synx;
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT, "%s %d arcs %d/%d/%d nodes %d/%d/%d words %d/%d chars %d/%d modelver %d\n",
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	   base, g2gsize,
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		 fst->num_arcs, fst->num_base_arcs, fst->FSMarc_list_len,
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		 fst->num_nodes, fst->num_base_nodes, fst->FSMnode_list_len,
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	   fst->olabels->num_words, fst->olabels->max_words,
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	   fst->olabels->next_chars-fst->olabels->chars,
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	   fst->olabels->max_chars,
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef IMAGE_FORMAT_V2
2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	   fst->modelid
2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	   -1
2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	   );
2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(wordid == 0 || ca_arbdata == 0)
2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(wordid >= fst->olabels->num_words) {
2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pfprintf(PSTDOUT, "%s failed 'cuz numwords(%d) < %d\n", base,
2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	     fst->olabels->num_words, wordid);
2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for(i=0; i<fst->num_arcs; i++) {
2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(fst->FSMarc_list[i].olabel == wordid) {
2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      FSMnode* node;
2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      FSMarc* arc = &fst->FSMarc_list[i];
2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      nodeID fr_node = arc->fr_node;
2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      arcID iarc;
2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      ilabels_following[0] = arc->ilabel;
2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      num_ilabels_following = 1;
2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      num_ilabels_preceding = 0;
2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for( ; fr_node!=fst->start_node; fr_node=arc->fr_node) {
2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	node = &fst->FSMnode_list[fr_node];
2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	iarc = node->first_prev_arc;
2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	for( ; iarc!=MAXarcID; iarc=arc->linkl_prev_arc) {
2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  arc = &fst->FSMarc_list[iarc];
2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  if(arc->fr_node != fr_node) break;
2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if(iarc == MAXarcID) {
2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  pfprintf(PSTDOUT, "%s failed at 11\n", base);
2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  goto CLEANUP;
2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if(arc->ilabel == WORD_BOUNDARY) break;
2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	ilabels_preceding[num_ilabels_preceding++] = arc->ilabel;
2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      arc = &fst->FSMarc_list[i];
2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      fr_node = arc->to_node;
2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for( ; fr_node!=fst->end_node; fr_node=arc->to_node) {
2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	node = &fst->FSMnode_list[fr_node];
2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	iarc = node->un_ptr.first_next_arc;
2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	for( ; iarc!=MAXarcID; iarc=arc->linkl_next_arc) {
2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  arc = &fst->FSMarc_list[iarc];
2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  if(arc->to_node != fr_node) break;
2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if(iarc == MAXarcID) {
2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  pfprintf(PSTDOUT, "%s failed at 12\n", base);
2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  goto CLEANUP;
2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	ilabels_following[num_ilabels_following++] = arc->ilabel;
2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if(arc->ilabel == WORD_BOUNDARY) break;
2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      num_ilabels = 0;
2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for(j=0; j<num_ilabels_preceding; j++)
2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	ilabels[num_ilabels++] = ilabels_preceding[num_ilabels_preceding-1-j];
2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for(j=0; j<num_ilabels_following; j++)
2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	ilabels[num_ilabels++] = ilabels_following[j];
2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(ilabels[num_ilabels-1] == WORD_BOUNDARY)
2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	num_ilabels--;
2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for(j=0; j<num_ilabels; j++) {
2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	if(ilabels[j]<fst->hmm_ilabel_offset) {
2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  pfprintf(PSTDOUT, "%s failed at 15\n", base);
2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  goto CLEANUP;
2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	} else
2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  ilabels[j] = ilabels[j] - (labelID)fst->hmm_ilabel_offset;
2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pfprintf(PSTDOUT, "%s (W%d) ihmms ", fst->olabels->words[wordid], wordid);
3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for(j=0;j<num_ilabels;j++)
3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	pfprintf(PSTDOUT, " %d", ilabels[j]);
3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pfprintf(PSTDOUT, "\n");
3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(num_ilabels < 2) {
3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	pfprintf(PSTDOUT, "%s failed at 1\n", base);
3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	goto CLEANUP;
3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(p4pTable)
3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	rc = find_phonemes_for_ihmms( ca_arbdata, ilabels, num_ilabels);
3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else {
3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	rc = ESR_SUCCESS;
3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	for(j=0; j<num_ilabels; j++) {
3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  if(p4pTable[ ilabels[j]]<0) {
3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    rc = ESR_NO_MATCH_ERROR;
3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    ilabels[j] = MAXmodelID;
3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  } else {
3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	    ilabels[j] = (modelID)p4pTable[ ilabels[j]];
3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  }
3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	}
3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(rc) {
3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	pfprintf(PSTDOUT, "%s failed at 2\n", base);
3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	goto CLEANUP;
3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pfprintf(PSTDOUT, "%s ", fst->olabels->words[wordid]);
3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for(j=0;j<num_ilabels;j++) pfprintf(PSTDOUT, "%c", ilabels[j]);
3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pfprintf(PSTDOUT, "\n");
3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = Parse( grammar, fst->olabels->words[wordid], PSTDOUT);
3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(rc) {
3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	pfprintf(PSTDOUT, "%s failed at 3\n", base);
3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	goto CLEANUP;
3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pfprintf(PSTDOUT, "%s PASSED (on %s)\n", base, fst->olabels->words[wordid]);
3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEANUP:
3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(grammar) SR_GrammarDestroy(grammar);
3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 1;
3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint traverse_tree(tree_node* node, tree_head *tree_topo, int *num_terminal_nodes)
3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(node)
3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    tree_topo->nnodes++;
3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(node->node.quest_index < 0) {
3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(num_terminal_nodes)
3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      (*num_terminal_nodes)++;
3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if( node->term.pelid < tree_topo->low_pel_no)
3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      tree_topo->low_pel_no = tree_topo->low_genone_no = node->term.pelid;
3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if( node->term.pelid > tree_topo->high_pel_no)
3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      tree_topo->high_pel_no = tree_topo->high_genone_no = node->term.pelid;
3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  } else {
3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    traverse_tree( (tree_node*)node->node.fail, tree_topo, num_terminal_nodes);
3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    traverse_tree( (tree_node*)node->node.pass, tree_topo, num_terminal_nodes);
3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint num_nodes_in_tree(tree_node* node, int *num_terminal_nodes)
3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  tree_head topo;
3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *num_terminal_nodes = 0;
3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  topo.nnodes = 0;
3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  traverse_tree(node, &topo, num_terminal_nodes);
3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return topo.nnodes;
3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode find_phonemes_for_ihmms( CA_Arbdata* ca_arbdata, modelID* ihmms, int num_ihmms)
3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int ii, i;
3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_hmms_in_phoneme;
3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  tree_head topo;
3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  srec_arbdata* a = (srec_arbdata*)ca_arbdata;
3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_phonemes_for_ihmms = 0;
3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for(ii=0; ii<num_ihmms; ii++) {
3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for(i=0; i<a->num_phonemes; i++) {
3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      num_hmms_in_phoneme = 0;
3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      topo.low_pel_no  = 32567;
3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      topo.high_pel_no = 0;
3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      traverse_tree(a->pdata[i].model_nodes, &topo, &num_hmms_in_phoneme);
3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(debug)printf("phoneme %d num_hmms %d (%d-%d)\n", i, num_hmms_in_phoneme,
3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		      topo.low_pel_no, topo.high_pel_no);
3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(ihmms[ii] >= topo.low_pel_no && ihmms[ii]<= topo.high_pel_no) {
3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	ihmms[ii] = (modelID)i;
3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	num_phonemes_for_ihmms++;
3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	break;
3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if( i==a->num_phonemes) {
3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(ihmms[ii]<=5) {
3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	ihmms[ii] = 0;
4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	num_phonemes_for_ihmms++;
4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      } else {
4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	PLogError("error: could not find hmm%d under any phoneme! ",ihmms[ii]);
4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(num_phonemes_for_ihmms != num_ihmms)
4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else {
4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for(ii=0; ii<num_ihmms; ii++) ihmms[ii] =  a->pdata[ ihmms[ii]].code;
4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid display_results(SR_SemanticResult *result, PFile* fout)
4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t i, size, len;
4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR* keys[MAX_KEYS]; /* array of pointers to strings */
4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR  value[MAX_STR_LENGTH];
4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size = MAX_KEYS;
4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = result->getKeyList(result, (LCHAR**) &keys, &size); /* get the key list */
4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(rc == ESR_SUCCESS)
4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for(i=0; i<size; i++)
4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      len = MAX_STR_LENGTH;
4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if ((rc = result->getValue(result,keys[i],value,&len)) == ESR_SUCCESS)
4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        pfprintf(fout,"{%s : %s}\n",keys[i],value);
4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else
4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        pfprintf(fout,"Error: %s\n",ESR_rc2str(rc));
4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pfprintf(fout,"Error: %s\n",ESR_rc2str(rc));
4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode Parse(SR_Grammar* grammar, LCHAR* trans, PFile* fout)
4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i, result_count;
4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_SemanticResult* semanticResults[MAX_SEM_RESULTS];
4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  result_count = MAX_SEM_RESULTS; /* initially not greater than MAX */
4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for(i =0; i<result_count; i++)
4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    SR_SemanticResultCreate(&semanticResults[i]); /* create the result holders */
4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lstrtrim(trans);
4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = grammar->checkParse(grammar, trans, semanticResults, (size_t*) &result_count);
4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(rc != ESR_SUCCESS)
4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return rc;
4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(result_count < 1)
4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pfprintf(fout,"no parse\n\n");
4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_NO_MATCH_ERROR;
4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pfprintf(fout,"parse ok (%d results)\n", result_count);
4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for(i=0; i < result_count; i++)
4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      display_results(semanticResults[i],fout);
4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for(i=0; i < MAX_SEM_RESULTS; i++)
4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = semanticResults[i]->destroy(semanticResults[i]);
4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(rc != ESR_SUCCESS)
4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        return rc;
4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid load_filelist(char* filelist, char*** pfiles, int *pnum_files)
4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i = 0;
4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FILE* fp;
4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char line[512];
4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char **files = 0, *file;
4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_files = 0;
4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  fp = fopen(filelist, "r");
4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(!fp) {
4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pfprintf(PSTDOUT, "failed to open %s\n", filelist);
4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto DONE;
4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  while( fgets(line, sizeof(line), fp)) {
4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(line[0] == '#') continue;
4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    i++;
4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  fclose(fp);
4954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  num_files = i;
4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *files = CALLOC( num_files, sizeof(char*), __FILE__);
4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  fp = fopen(filelist, "r");
4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for(i=0; fgets(line,sizeof(line),fp) && i<num_files; i++) {
5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(line[0] == '#') continue;
5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    strtok(line,"\n\r\t");
5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    file = files[i++] = CALLOC(strlen(line)+1,sizeof(char),__FILE__);
5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    strcpy( file, line);
5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  fclose(fp);
5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  num_files = i;
5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project DONE:
5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pfiles = files;
5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pnum_files = num_files;
5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint* phonemecode_for_pel_table(CA_Arbdata* ca_arbdata)
5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  static int table[2048];
5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i,j;
5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  tree_head topo;
5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  srec_arbdata* a = (srec_arbdata*)ca_arbdata;
5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int num_hmms_in_phoneme;
5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for(j=0; j< (int)(sizeof(table)/sizeof(int)); j++)
5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    table[j] = 0;
5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for(i=0; i<a->num_phonemes; i++) {
5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    num_hmms_in_phoneme = 0;
5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    topo.low_pel_no  = 32567;
5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    topo.high_pel_no = 0;
5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    traverse_tree(a->pdata[i].model_nodes, &topo, &num_hmms_in_phoneme);
5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(debug)printf("phoneme %d num_hmms %d (%d-%d)\n", i, num_hmms_in_phoneme,
5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		    topo.low_pel_no, topo.high_pel_no);
5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for(j=topo.low_pel_no; j<=topo.high_pel_no; j++)
5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      table[j] = a->pdata[i].code;
5344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return &table[0];
5364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
537