14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  SR_GrammarImpl.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#include "ESR_Session.h"
214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_AcousticModels.h"
224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_AcousticModelsImpl.h"
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_Grammar.h"
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_GrammarImpl.h"
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_SemanticGraphImpl.h"
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_SemanticProcessorImpl.h"
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_VocabularyImpl.h"
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "SR_NametagImpl.h"
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "passert.h"
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "plog.h"
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmemory.h"
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define MTAG NULL
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_Create(SR_Grammar** self)
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* impl;
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_BOOL exists;
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl = NEW(SR_GrammarImpl, MTAG);
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl == NULL)
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_OUT_OF_MEMORY"));
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_OUT_OF_MEMORY;
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.addNametagToSlot = &SR_Grammar_AddNametagToSlot;
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.addWordToSlot = &SR_Grammar_AddWordToSlot;
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.checkParse = &SR_Grammar_CheckParse;
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.compile = &SR_Grammar_Compile;
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.destroy = &SR_Grammar_Destroy;
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.getParameter = &SR_Grammar_GetParameter;
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.getSize_tParameter = &SR_Grammar_GetSize_tParameter;
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.resetAllSlots = &SR_Grammar_ResetAllSlots;
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.save = &SR_Grammar_Save;
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.setDispatchFunction = &SR_Grammar_SetDispatchFunction;
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.setParameter = &SR_Grammar_SetParameter;
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.setSize_tParameter = &SR_Grammar_SetSize_tParameter;
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.setupRecognizer = &SR_Grammar_SetupRecognizer;
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.unsetupRecognizer = &SR_Grammar_UnsetupRecognizer;
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->Interface.setupVocabulary = &SR_Grammar_SetupVocabulary;
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->syntax = NULL;
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->recognizer = NULL;
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->vocabulary = NULL;
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->eventLog = NULL;
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->logLevel = 0;
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->isActivated = ESR_FALSE;
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionTypeCreate(&impl->parameters));
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /**
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * Create the Semantic Graph and Processor to support CheckParse function
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * (Since this function gets called by 'New', a semgraph and semproc are always
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * created when the grammar is created)
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   */
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = SR_SemanticGraphCreate(&impl->semgraph);
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc != ESR_SUCCESS)
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = SR_SemanticProcessorCreate(&impl->semproc);
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc != ESR_SUCCESS)
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(ESR_rc2str(rc));
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, ESR_SessionExists(&exists));
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (exists)
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_SessionGetProperty(L("eventlog"), (void **)&impl->eventLog, TYPES_SR_EVENTLOG);
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc != ESR_NO_MATCH_ERROR && rc != ESR_SUCCESS)
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(ESR_rc2str(rc));
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_SessionGetSize_t(L("SREC.Recognizer.osi_log_level"), &impl->logLevel);
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc != ESR_NO_MATCH_ERROR && rc != ESR_SUCCESS)
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(ESR_rc2str(rc));
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *self = (SR_Grammar*) impl;
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(impl);
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_GrammarCreate(SR_Grammar** self)
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (self == NULL)
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_OUT_OF_MEMORY"));
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_OUT_OF_MEMORY;
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_Grammar_Create(self));
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_Compile(SR_Grammar* self)
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!CA_CompileSyntax(impl->syntax))
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PLogError(L("ESR_FATAL_ERROR"));
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_FATAL_ERROR;
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * The buffer for the pron is set very large because the real size is lost later on
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * and all that is checked is whether a single phoneme will fit in the buffer. There
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * is no concept of decrementing the bytes left. Because that code is one big monolithic
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * piece of crap, it is very difficult to fix correctly. This kludge is appropriate
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * because we don't have time to fix this correctly and there are probably dozens of
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * similar problems in other parts of the code.
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project */
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_AddWordToSlot(SR_Grammar* self, const LCHAR* slot, const LCHAR* word,
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project																				const LCHAR* pronunciation, int weight, const LCHAR* tag)
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_Vocabulary* vocab;
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR buffer[4096];
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  const LCHAR* input_pronunciation = pronunciation;
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t len = 4096;
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc = ESR_SUCCESS, logrc;
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int ca_rc = -99;
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ( slot != NULL )
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( strlen ( slot ) >= MAX_STRING_LEN )
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "SR_Grammar_AddWordToSlot slot : %s too long : Max %d", slot, MAX_STRING_LEN - 1 );
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ( ESR_INVALID_ARGUMENT );
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ( word != NULL )
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( strlen ( word ) >= MAX_STRING_LEN )
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "SR_Grammar_AddWordToSlot word : %s too long : Max %d", word, MAX_STRING_LEN - 1 );
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ( ESR_INVALID_ARGUMENT );
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ( pronunciation != NULL )
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( strlen ( pronunciation ) >= MAX_STRING_LEN )
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "SR_Grammar_AddWordToSlot pronunciation : %s too long : Max %d", pronunciation, MAX_STRING_LEN  - 1 );
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ( ESR_INVALID_ARGUMENT );
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if ( tag != NULL )
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ( strlen ( tag ) >= MAX_STRING_LEN )
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError ( "SR_Grammar_AddWordToSlot tag : %s too long : Max %d", tag, MAX_STRING_LEN - 1 );
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ( ESR_INVALID_ARGUMENT );
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if 0
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* make sure to have the latest arbdata to add words, however since
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     the arbdata is known to be constant for all acoustic models we
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	 have (ie for the different sample rates), then there is no need
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	 to do this, it slows down addition anyways */
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_Arbdata* ca_arbdata;
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModels* models;
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->recognizer->getModels( impl->recognizer, &models);
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ca_arbdata = models->GetArbdata(models);
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_AttachArbdataToSyntax( impl->syntax , ca_arbdata);
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* yw HACK: Xanavi's application has bug. remove this check to let it work */
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* TODO: add this word to the semantic graph with associated script tag */
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->vocabulary == NULL)
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_STATE"));
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* tag may be NULL which means no script (no-op denoted by a simple semi-colon) */
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!tag || !*tag)
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    tag = L(";");
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!pronunciation || !(*pronunciation) || !LSTRCMP(pronunciation, L("NULL")))
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    vocab = (SR_Vocabulary*) impl->vocabulary;
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, vocab->getPronunciation(vocab, word, buffer, &len));
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pronunciation = buffer;
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * 'buffer' contains a list of null-terminated pronunciations.
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * Two consecutive null characters denote the end of the list.
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   *
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * (In theory yes, but right now, only one pron is supported)
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   */
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->eventLog != NULL)
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(logrc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("igrm"), (int)impl));
2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("SLOT"), slot));
2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("WORD"), word));
2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (input_pronunciation)
2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("PRON"), pronunciation));
2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("GPRON"), pronunciation));
2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(logrc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("WEIGHT"), weight));
2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("TAG"), tag));
2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* add word to syntax first */
2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*
2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   *
2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * if word already exists and pron is same (i.e. as if no action)               returns FST_SUCCESS
2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * if word already exists and pron is different (e.g. read-rEd and read-red)    returns FST_SUCCESS
2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * if word does not exist and no duplicate pron exists (homonyms not supported) returns FST_SUCCESS
2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   *                                                                                 else FST_FAILED
2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   */
2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ca_rc = CA_AddWordToSyntax(impl->syntax, slot, word, pronunciation, weight);
2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  switch (ca_rc)
2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case FST_SUCCESS:
2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* successful, now add word & tag to semgraph */
2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, impl->semgraph->addWordToSlot(impl->semgraph, slot, word, tag, 1));
2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case FST_SUCCESS_ON_OLD_WORD:
2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case FST_FAILED_ON_HOMOGRAPH:
2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* successful, now add word & tag to semgraph */
2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, impl->semgraph->addWordToSlot(impl->semgraph, slot, word, tag, 0));
2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case FST_FAILED_ON_MEMORY:
2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_OUT_OF_MEMORY;
2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(ESR_rc2str(rc));
2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case FST_FAILED_ON_INVALID_ARGS:
2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_INVALID_ARGUMENT;
2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(ESR_rc2str(rc));
2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    case FST_FAILED_ON_HOMONYM:
2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_NOT_SUPPORTED;
2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* remove this message from product */
2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if !defined(NDEBUG) || defined(_WIN32)
2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(L("%s: Homonym '%s' could not be added"), ESR_rc2str(rc), word);
2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    default:
2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_INVALID_STATE;
2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(L("%s|%s|%s|ca_rc=%d"), word, pronunciation, ESR_rc2str(rc), ca_rc);
2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->eventLog != NULL && (impl->logLevel & OSI_LOG_LEVEL_ADDWD))
2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(logrc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("caRC"), (int) ca_rc));
2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("RSLT"), L("ok")));
2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(logrc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("ESRaddWd")));
2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PLogError(L("failed on |%s|%s|%s|\n"), slot, word, pronunciation);
2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->eventLog != NULL && (impl->logLevel & OSI_LOG_LEVEL_ADDWD))
2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(logrc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("caRC"), (int) ca_rc));
2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("RSLT"), L("err1")));
2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(logrc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("ESRaddWd")));
2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_ResetAllSlots(SR_Grammar* self)
3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc, logrc;
3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int irc;
3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = impl->semgraph->reset(impl->semgraph);
3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc == ESR_SUCCESS)
3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    irc = CA_ResetSyntax(impl->syntax);
3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = irc ? ESR_INVALID_STATE : ESR_SUCCESS;
3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->eventLog != NULL)
3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("igrm"), (int)impl));
3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc == ESR_SUCCESS)
3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("RSLT"), L("ok")));
3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(logrc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("RSLT"), L("fail")));
3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(logrc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("ESRrstSlot")));
3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_AddNametagToSlot(SR_Grammar* self, const LCHAR* slot,
3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                                           const SR_Nametag* nametag, int weight, const LCHAR* tag)
3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_NametagImpl* nametagImpl = (SR_NametagImpl*) nametag;
3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, self->addWordToSlot(self, slot, nametagImpl->id, nametagImpl->value, weight, tag));
3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_SetDispatchFunction(SR_Grammar* self, const LCHAR* functionName, void* userData, SR_GrammarDispatchFunction function)
3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_SemanticProcessorImpl* semprocImpl = (SR_SemanticProcessorImpl*) impl->semproc;
3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, EP_RegisterFunction(semprocImpl->parser, functionName, userData, function));
3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_GrammarLoad(const LCHAR* grammar, SR_Grammar** self)
3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_Grammar* Interface = NULL;
3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* impl;
3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR* tok;
3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LCHAR filename[P_PATH_MAX];
3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int addWords;
3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (self == NULL)
3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT"));
3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, SR_Grammar_Create(&Interface));
3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl = (SR_GrammarImpl*) Interface;
3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /**
3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * Our filename (referring to the grammar to load, may have associated grammar properties
3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * appended to the end of it. We need to split up the properties from the filename
3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * example:
3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   *  recog_nm/namesnnumsSC_dyn,addWords=2000 becomes
3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   *    filename: recog_nm/namesnnumsSC_dyn
3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   *    property: addWords=2000
3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   */
3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* init */
3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LSTRCPY(filename, grammar);
3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  addWords = 0;
3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (tok = strtok(filename, ","); tok; tok = strtok(NULL, ","))
3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (LSTRSTR(tok, "addWords"))
3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      addWords = atoi(LSTRCHR(tok, L('=')) + sizeof(LCHAR));
3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if (tok != filename)
3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(L("UNKNOWN grammar load property %s"), tok);
3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_INVALID_STATE;
3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /**
3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * Based on the filename, determine if you are loading from image or loading from text files.
3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * If from image, then the filename will have extension .g2g. If from file, then only a basename
4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * will be provided (i.e. without extension)
4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   */
4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->syntax = CA_AllocateSyntax();
4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->syntax == NULL)
4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = ESR_OUT_OF_MEMORY;
4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (LSTRSTR(filename, L(".g2g")))
4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* if the filename ends with .g2g, then we have a binary image */
4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (CA_LoadSyntaxFromImage(impl->syntax, (LCHAR*) filename))
4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_READ_ERROR;
4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(L("ESR_READ_ERROR: Problem loading syntax from image"));
4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (CA_LoadSyntaxAsExtensible(impl->syntax, (LCHAR*) filename, addWords))
4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_READ_ERROR;
4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(L("ESR_READ_ERROR: Problem loading syntax from text"));
4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEANUP;
4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*
4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * Semantic Graph Loading
4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   *
4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * - it was already created in Grammar_Create()
4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * - reuse the same input labels from the recognition context
4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   * - load knows how to load from base filename or .g2g image
4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   */
4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = impl->semgraph->load(impl->semgraph, impl->syntax->synx->olabels, filename, addWords);
4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc != ESR_SUCCESS)
4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("%s: loading semgraph from image %s"), ESR_rc2str(rc), filename);
4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->semgraph = NULL;
4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEANUP;
4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *self = Interface;
4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->eventLog)
4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("igrm"), (int)impl));
4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogToken_BASIC(impl->eventLog, impl->logLevel, L("name"), filename));
4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("ESRldgrm")));
4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (Interface != NULL)
4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    Interface->destroy(Interface);
4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *self = NULL;
4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_Save(SR_Grammar* self, const LCHAR* filename)
4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int version_number = 2;
4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (filename == NULL)
4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT"));
4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (CA_DumpSyntaxAsImage(impl->syntax, filename, version_number)) /* returns 1 on failure */
4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT"));
4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (SR_SemanticGraph_Save(impl->semgraph, filename, version_number) != ESR_SUCCESS)
4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT"));
4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_STATE;
4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_SetParameter(SR_Grammar* self, const LCHAR* key, void* value)
4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*TODO: complete with logging*/
4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_NOT_IMPLEMENTED;
4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_SetSize_tParameter(SR_Grammar* self, const LCHAR* key, size_t value)
4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t temp;
4954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = impl->parameters->getSize_t(impl->parameters, key, &temp);
4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc == ESR_SUCCESS)
4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (temp == value)
5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, impl->parameters->removeAndFreeProperty(impl->parameters, key));
5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else if (rc != ESR_NO_MATCH_ERROR)
5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return rc;
5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CHKLOG(rc, impl->parameters->setSize_t(impl->parameters, key, value));
5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_GetParameter(SR_Grammar* self, const LCHAR* key, void** value)
5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*TODO: complete with logging*/
5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_NOT_IMPLEMENTED;
5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_GetSize_tParameter(SR_Grammar* self, const LCHAR* key, size_t* value)
5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (!LSTRCMP(key, "locale"))
5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ESR_Locale locale;
5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = SR_VocabularyGetLanguage(impl->vocabulary, &locale);
5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc != ESR_SUCCESS)
5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return rc;
5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *value = locale;
5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
5344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
5364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = impl->parameters->getSize_t(impl->parameters, key, value);
5384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc == ESR_NO_MATCH_ERROR)
5394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
5404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      CHKLOG(rc, ESR_SessionGetSize_t(key, value));
5414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return ESR_SUCCESS;
5424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (rc != ESR_SUCCESS)
5444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
5454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PLogError(ESR_rc2str(rc));
5464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return rc;
5474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
5494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
5514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
5524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_Destroy(SR_Grammar* self)
5554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
5574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
5584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->parameters != NULL)
5604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, impl->parameters->destroy(impl->parameters));
5624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->parameters = NULL;
5634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->syntax != NULL)
5664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CA_FreeSyntax(impl->syntax);
5684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->syntax = NULL;
5694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->semgraph != NULL)
5724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, impl->semgraph->unload(impl->semgraph));
5744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, impl->semgraph->destroy(impl->semgraph));
5754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->semgraph = NULL;
5764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->semproc != NULL)
5794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, impl->semproc->destroy(impl->semproc));
5814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    impl->semproc = NULL;
5824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl->eventLog)
5854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
5864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogTokenInt_BASIC(impl->eventLog, impl->logLevel, L("igrm"), (int)impl));
5874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    CHKLOG(rc, SR_EventLogEvent_BASIC(impl->eventLog, impl->logLevel, L("ESRklgrm")));
5884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  FREE(self);
5914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
5924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectCLEANUP:
5934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
5944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
5954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_SetupRecognizer(SR_Grammar* self, SR_Recognizer* recognizer)
5974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
5994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
6004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_Arbdata* ca_arbdata;
6014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_AcousticModels* models = NULL;
6024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (impl == NULL || recognizer == NULL)
6044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT"));
6064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
6074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->recognizer  = recognizer;
6094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  recognizer->setWordAdditionCeiling( recognizer, self);
6104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = recognizer->getModels( recognizer, &models);
6124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(rc != ESR_SUCCESS || models == NULL) {
6134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  impl->recognizer = NULL;
6144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  CA_AttachArbdataToSyntax( impl->syntax, NULL);
6154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  return ESR_INVALID_STATE;
6164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ca_arbdata = (CA_Arbdata*)(models->getArbdata( models));
6184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = CA_AttachArbdataToSyntax( impl->syntax, ca_arbdata);
6194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(rc != 0)
6204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	  return ESR_INVALID_STATE;
6214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
6224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_UnsetupRecognizer(SR_Grammar* self)
6254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
6264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
6274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(impl == NULL) return ESR_INVALID_ARGUMENT;
6284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->recognizer  = NULL;
6294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_AttachArbdataToSyntax( impl->syntax, NULL);
6304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
6314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectSREC_GRAMMAR_API ESR_ReturnCode SR_Grammar_SetupVocabulary(SR_Grammar *self, SR_Vocabulary *vocabulary)
6344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
6354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
6364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (vocabulary == NULL)
6384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT"));
6404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
6414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  impl->vocabulary = vocabulary;
6434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return ESR_SUCCESS;
6444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_Grammar_CheckParse(SR_Grammar* self, const LCHAR* transcription, SR_SemanticResult** result, size_t* resultCount)
6474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
6484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
6494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* impl = (SR_GrammarImpl*) self;
6504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  size_t resultCountIn = *resultCount;
6514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (transcription == NULL)
6534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("ESR_INVALID_ARGUMENT"));
6554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_INVALID_ARGUMENT;
6564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* NULL for special implementation when CheckParse is called by application that does not know
6594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     about the hidden data structure SR_SemanticResult */
6604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (result == NULL)
6614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (CA_CheckTranscription(impl->syntax, transcription, 0) == 0)
6634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *resultCount = 1;
6644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
6654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *resultCount = 0;
6664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return ESR_SUCCESS;
6674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = impl->semproc->checkParse(impl->semproc, impl->semgraph, transcription, result, resultCount);
6694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (*resultCount == 0)
6704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* get the literal that did parse from the text_parser.c code */
6724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    char copy_of_trans[512];
6734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    strcpy(copy_of_trans, transcription);
6744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    *resultCount = resultCountIn;
6754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (CA_CheckTranscription(impl->syntax, (LCHAR*)copy_of_trans, 0) == 0)
6764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = impl->semproc->checkParse(impl->semproc, impl->semgraph, copy_of_trans, result, resultCount);
6774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
6794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define DISABLEcostdata 8192
6824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_GrammarAllowOnly(SR_Grammar* self, const char* transcription)
6844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
6854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char copy_of[512], *word;
6864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i, j;
6874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  wordID wdids[32], nw = 0;
6884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* impl = (SR_GrammarImpl*)self;
6894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_Syntax* ca_syntax = impl->syntax;
6904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  srec_context* fst = ca_syntax->synx;
6914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc = ESR_SUCCESS;
6924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  strcpy(copy_of, transcription);
6944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (word = strtok(copy_of, " "); word; nw++, word = strtok(NULL, " "))
6964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
6974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    wdids[nw] =   wordmap_find_index(fst->olabels, word);
6984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (wdids[nw] == MAXwordID)
6994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = ESR_NO_MATCH_ERROR;
7004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < fst->num_arcs; i++)
7034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
7044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    wordID wdid = fst->FSMarc_list[i].olabel;
7054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (wdid < EPSILON_OFFSET) ;
7064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if (wdid == fst->beg_silence_word) ;
7074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if (wdid == fst->end_silence_word) ;
7084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else
7094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
7104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (j = nw; --j >= 0;)
7114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (wdid == wdids[j]) break;
7124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (j < 0)
7134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
7144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        fst->FSMarc_list[i].cost |= DISABLEcostdata; /* disable this arc */
7154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
7164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else
7174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
7184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* pfprintf(PSTDOUT, "enabling arc %d for %d %s\n",
7194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project           i, wdid, transcription); */
7204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        fst->FSMarc_list[i].cost &= ~(DISABLEcostdata); /* enable this arc */
7214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
7224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
7234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* added, this way we prevent more failures due to dead ends */
7254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (; ;)
7264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
7274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FSMarc* arc;
7284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    arcID j, counter = 0;
7294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nodeID node;
7304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    costdata mincost;
7314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i = 0; i < fst->num_arcs; i++)
7334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    {
7344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (fst->FSMarc_list[i].cost < DISABLEcostdata)
7354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      {
7364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        node = fst->FSMarc_list[i].to_node;
7374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (node == fst->end_node) continue;
7384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        mincost = DISABLEcostdata;
7394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        for (j = fst->FSMnode_list[node].un_ptr.first_next_arc; j != MAXarcID; j = arc->linkl_next_arc)
7404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
7414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          arc = &fst->FSMarc_list[j];
7424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if (arc->cost < mincost) mincost = arc->cost;
7434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
7444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (mincost >= DISABLEcostdata)
7454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
7464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          fst->FSMarc_list[i].cost |= DISABLEcostdata;
7474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          counter++;
7484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
7494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
7504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
7514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (counter == 0) break;
7524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
7554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
7564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectESR_ReturnCode SR_GrammarAllowAll(SR_Grammar* self)
7584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
7594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i;
7604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SR_GrammarImpl* impl = (SR_GrammarImpl*)self;
7614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  CA_Syntax* ca_syntax = impl->syntax;
7624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  srec_context* fst = ca_syntax->synx;
7634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc = ESR_SUCCESS;
7644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i = 0; i < fst->num_arcs; i++)
7664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
7674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    fst->FSMarc_list[i].cost &= ~(DISABLEcostdata); /* enable this arc */
7684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return rc;
7704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
7714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
772