14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------*
24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *  run_seq_lts.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 <stdlib.h>
234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <string.h>
244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <math.h>
254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <ctype.h>
264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef NO_STDERR
284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <stdio.h>
294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectextern void PrintError(char *msg, unsigned long p1, unsigned long p2, unsigned long p3);
314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "passert.h"
344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "pmemory.h"
354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "plog.h"
364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "phashtable.h"
374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "lts_error.h"
384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "lts.h"
394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "lts_seq_internal.h"
404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "port_fileio.h"
414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "platform_utils.h" /* strdup, safe_strtok, etc */
424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define ASSERT(x) passert(x)
444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef TI_DSP
464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "tidsp_defines.h"
474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef _DEBUG
504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define PRINT_LOAD_TREE_SUMMARY 0
514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define PRINT_LOAD_TREE 0
524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define PRINT_CONS_COMB 0
534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define PRINT_DP_LETTER 0
544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define PRINT_LTS_WORD 0
554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define PRINT_DICT_LOOKUP 0
564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define LTS_MARKER_WORD_START "WS"
594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define LTS_MARKER_PRON_START "PS"
604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define LTS_MARKER_SYLL_START "SS"
614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define LTS_MARKER_SYLL_START_DD "SS%d"
624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define LTS_MARKER_PIPESEP "|"
634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define LTS_MARKER_PIPESEP_CHAR '|'
644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int load_int(PORT_FILE *fp);
664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult load_lquestions(LQUESTION ***pquestions, int *pnum_questions, PORT_FILE *fp);
674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult free_lquestions(LQUESTION ** questions, int num_questions);
684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult load_letter_mapping(PORT_FILE *fp, LM **ppLetterMap);
694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult free_letter_mapping(LM *lm);
704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult load_phone_mapping(PORT_FILE *fp, PM **ppPhoneMap);
714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult free_phone_mapping(PM *pm);
724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult load_outputs(char ***poutputs, char ***pinputs, int *pnum, PORT_FILE *fp);
734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult free_outputs(char **outputs, char **inputs, int num);
744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult load_trees(RT_LTREE ***ptrees, int *num_letters,
754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                              LQUESTION ***pquestions, int *num_questions, LM **plm, PORT_FILE *fp);
764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult free_trees(RT_LTREE **trees, int num_letters, LQUESTION **questions, int num_questions, LM *lm);
774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult load_allowable_cons_comb(LTS *lts, PORT_FILE *fp);
784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult free_allowable_cons_comb(LTS *lts);
794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult load_question_strings(LTS* lts, PORT_FILE* fp);
804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult free_question_strings(LTS* lts);
814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define find_letter_index( myLet, myLM) (myLM->letter_index_for_letter[ toupper(myLet)])
824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint find_phone(const char *ph, PM *pm);
834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint find_best_string(const char *str, LTS* lts);
844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint find_best_prefix_string(const char *str, LTS* lts);
854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint fill_up_dp_for_letter(LTS *lts, const char *input_word, int word_len, int index, int root_start, int root_end, int left_phone);
864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define in_list(myV, myQ)   (bitarray_read_bit( myQ->membership, myV))
874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define qmatches(myQ, myU)  (in_list( myU->properties[ myQ->type], myQ))
884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint matches(LQUESTION *q1, LQUESTION *q2, int type, LDP *dp) ;
894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint find_output_for_dp(LTS *lts, int *pbackoff_output);
904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint add_output(char *output, char **output_phone_string, int out_len, int max_phone_length);
914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint is_allowable_cons_comb(LTS *lts, const char *cons_string);
924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid adjust_syllable_boundaries(LTS *lts, char **output_phone_string, int num_out, int max_phone_length);
934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectSWIsltsResult lts_for_word(LTS *lts, char *word, int word_len, char **output_phone_string, int max_phone_length, int *num_out);
944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*------------
964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * bitarray
984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *-----------*/
1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define bitarray_read_bit( biTs, iBiT) ( biTs[iBiT/16] & (1<<((iBiT)%16)) )
1024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* int bitarray_read_bit( unsigned short* bits, int iBit)
1034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   {  // ASSERT( iBit<256);
1044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   return bits[iBit/16] & (1<<((iBit)%16));
1054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   } */
1064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid bitarray_write_bit( unsigned short* bits, int iBit, int iVal)
1084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned short sect;
1104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ASSERT( iBit<256);
1114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  sect = bits[iBit/16];
1124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(iVal) { sect |= (1<<(iBit%16)); }
1134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else { sect &= ~(1<<(iBit%16)); }
1144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  bits[ iBit/16] = sect;
1154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid bitarray_populate_from_list(unsigned short* bits, char* list, int listlen)
1174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned int i;
1194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for(i=0; i<UCHAR_MAX/sizeof(unsigned short)/8; i++)
1204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bits[i] = 0;
1214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for(i=0; i<(unsigned int)listlen; i++)
1224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bitarray_write_bit( bits, list[i], 1);
1234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*-----------
1264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
1274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * PHashTable
1284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
1294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *-----------*/
1304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int HashCmpWord(const LCHAR *key1, const LCHAR *key2)
1324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ return strcmp((const char*)key1,(const char*)key2); }
1334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic unsigned int HashGetCode(const void *key)
1344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  const char* k = (const char*)key;
1364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned int i, len, h = 0;
1374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  len = strlen(k);
1384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0; i<len; i++) h = 31*h + (unsigned int)k[i];
1394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return h;
1404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid* my_PHashTableCreate_FromStrings( const char* strings[], int num_strings,
1424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project				       const LCHAR* hashName)
1434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PHashTable* table = NULL;
1454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode       rc = ESR_SUCCESS;
1464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PHashTableArgs       hashArgs;
1474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i;
1484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hashArgs.capacity = 63;
1494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hashArgs.compFunction = HashCmpWord; // PHASH_TABLE_DEFAULT_COMP_FUNCTION;
1504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hashArgs.hashFunction = HashGetCode; // PHASH_TABLE_DEFAULT_HASH_FUNCTION;
1514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hashArgs.maxLoadFactor = PHASH_TABLE_DEFAULT_MAX_LOAD_FACTOR;
1524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = PHashTableCreate( &hashArgs, hashName, &table);
1534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for(i=0; i<num_strings; i++) {
1544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    void* old;
1554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* formerly the code used linear lookup, so let's avoid dups to match up */
1564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    rc = PHashTableGetValue( table, strings[i], (void**)&old);
1574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(rc != ESR_SUCCESS) {
1584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      rc = PHashTablePutValue( table, strings[i], (const void *)i, NULL );
1594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
1604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return table;
1624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------
1654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
1664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * i/o
1674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *
1684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------*/
1694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic int load_int(PORT_FILE *fp)
1714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int v;
1734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PORT_FREAD_INT16((uint16 *)&v, sizeof(int), 1, fp);
1754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return v;
1774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
1784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult load_lquestions(LQUESTION ***pquestions, int *pnum_questions, PORT_FILE *fp)
1804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
1814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  i, num_questions;
1824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LQUESTION         ** questions;
1834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult          nRes = SWIsltsSuccess;
1844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  num_questions = load_int(fp);
1864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LOAD_TREE_SUMMARY
1884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT,"loading %d questions\n", num_questions);
1894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
1904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pquestions = questions = (LQUESTION**) lts_alloc(num_questions, sizeof(LQUESTION*));
1924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (questions == NULL) {
1934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nRes = SWIsltsErrAllocResource;
1944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
1954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
1964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
1974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0;i<num_questions;i++) {
1984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    questions[i] = (LQUESTION*) lts_alloc(1, sizeof(LQUESTION));
1994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (questions[i] == NULL) {
2004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      nRes = SWIsltsErrAllocResource;
2014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEAN_UP;
2024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
2034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LOAD_TREE
2054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pfprintf(PSTDOUT,"LOAD_TREE: loading question %d\n", i);
2064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
2074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PORT_FREAD_CHAR(&(questions[i]->type), sizeof(char), 1, fp);
2094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PORT_FREAD_CHAR(&(questions[i]->num_list), sizeof(char), 1, fp);
2104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    questions[i]->list = (unsigned char*) lts_alloc(questions[i]->num_list, sizeof(unsigned char));
2124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (questions[i]->list == NULL) {
2134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      nRes = SWIsltsErrAllocResource;
2144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEAN_UP;
2154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
2164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PORT_FREAD_CHAR(questions[i]->list, sizeof(char), (questions[i]->num_list), fp);
2184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bitarray_populate_from_list( questions[i]->membership, (char*) questions[i]->list, questions[i]->num_list);
2204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pnum_questions = num_questions;
2234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return SWIsltsSuccess;
2244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEAN_UP:
2264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  free_lquestions(questions, num_questions);
2284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pnum_questions = 0;
2294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pquestions = NULL;
2304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
2314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* deallocate questions */
2344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult free_lquestions(LQUESTION ** questions, int num_questions)
2354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult          nRes = SWIsltsSuccess;
2374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  i;
2384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (questions) {
2404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i=0; i<num_questions; i++) {
2414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (questions[i]->list) {
2424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        FREE(questions[i]->list);
2434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        questions[i]->list = NULL;
2444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
2454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      FREE(questions[i]);
2464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      questions[i] = NULL;
2474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
2484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(questions);
2494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
2514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
2524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult load_letter_mapping(PORT_FILE *fp, LM **ppLetterMap)
2544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
2554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult          nRes = SWIsltsSuccess;
2564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned char        len;
2574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LM                 * lm;
2584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  i;
2594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*  pfprintf(PSTDOUT,"got len %d\n", len);*/
2614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lm = (LM*) lts_alloc(1, sizeof(LM));
2624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (lm == NULL) {
2634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nRes = SWIsltsErrAllocResource;
2644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
2654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PORT_FREAD_CHAR(&len, sizeof(char), 1, fp);
2684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lm->num_letters = len;
2694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lm->letters = (char*) lts_alloc(len, sizeof(char));
2714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (lm->letters == NULL) {
2724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nRes = SWIsltsErrAllocResource;
2734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
2744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lm->type = (char*) lts_alloc(len, sizeof(char));
2774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (lm->type == NULL) {
2784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nRes = SWIsltsErrAllocResource;
2794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
2804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PORT_FREAD_CHAR(lm->letters, sizeof(char), len, fp);
2834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PORT_FREAD_CHAR(lm->type, sizeof(char), len, fp);
2844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  {
2864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    unsigned int letter;
2874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (letter=0; letter <= UCHAR_MAX; letter++)
2884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      lm->letter_index_for_letter[letter] = LTS_MAXCHAR;
2894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0;i<len;i++) {
2924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    char letter = toupper(lm->letters[i]);
2934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    lm->letters[i] = letter;
2944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    lm->letter_index_for_letter[(unsigned char)letter] = i;
2954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
2964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *ppLetterMap = lm;
2974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return SWIsltsSuccess;
2984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
2994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEAN_UP:
3004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  free_letter_mapping(lm);
3014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *ppLetterMap = NULL;
3024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
3034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* deallocate letter mapping */
3064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult free_letter_mapping(LM *lm)
3074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult          nRes = SWIsltsSuccess;
3094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (lm) {
3114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (lm->letters) {
3124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      FREE(lm->letters);
3134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      lm->letters = NULL;
3144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (lm->type) {
3164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      FREE(lm->type);
3174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      lm->type = NULL;
3184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    lm->num_letters = 0;
3204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(lm);
3214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
3234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult load_phone_mapping(PORT_FILE *fp, PM **ppPhoneMap)
3264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult          nRes = SWIsltsSuccess;
3284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PM                 * pm;
3294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  i;
3304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned char        len;
3314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char               * ph;
3324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pm = (PM*) lts_alloc(1, sizeof(PM));
3344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (pm == NULL) {
3354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nRes = SWIsltsErrAllocResource;
3364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
3374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pm->num_phones = load_int(fp);
3404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pm->phones = (char**) lts_alloc(pm->num_phones, sizeof(char*));
3424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (pm->phones == NULL) {
3434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nRes = SWIsltsErrAllocResource;
3444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
3454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0;i<pm->num_phones;i++) {
3484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PORT_FREAD_CHAR(&len, sizeof(unsigned char), 1, fp);
3494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pm->phoneH = NULL;
3514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pm->phones[i] = ph = (char*) lts_alloc(len+1, sizeof(char));
3524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (ph == NULL) {
3534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      nRes = SWIsltsErrAllocResource;
3544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEAN_UP;
3554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PORT_FREAD_CHAR(ph, sizeof(char), len, fp);
3584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    ph[len] = '\0';
3594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pm->phoneH = my_PHashTableCreate_FromStrings( (const char**)pm->phones,
3614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project						pm->num_phones,
3624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project						L("lts.phoneH"));
3634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(pm->phoneH == NULL) {
3644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nRes = SWIsltsErrAllocResource;
3654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
3664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *ppPhoneMap = pm;
3684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return SWIsltsSuccess;
3694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEAN_UP:
3714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  free_phone_mapping(pm);
3724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *ppPhoneMap = NULL;
3734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
3754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
3764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* deallocate phone mapping */
3784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult free_phone_mapping(PM *pm)
3794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
3804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult          nRes = SWIsltsSuccess;
3814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  i;
3824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
3834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (pm) {
3844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (pm->phones) {
3854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (i=0; i<pm->num_phones; i++) {
3864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (pm->phones[i]) {
3874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          FREE(pm->phones[i]);
3884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          pm->phones[i] = NULL;
3894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
3904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
3914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      FREE(pm->phones);
3924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pm->phones = NULL;
3934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
3944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(pm->phoneH)
3954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PHashTableDestroy( (PHashTable*)pm->phoneH);
3964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pm->phoneH = NULL;
3974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(pm);
3984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
3994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
4004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult load_outputs(char ***poutputs, char ***pinputs, int *pnum, PORT_FILE *fp)
4044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult        nRes = SWIsltsSuccess;
4064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  i;
4074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char              ** outputs = NULL;
4084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char              ** inputs = NULL;
4094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  num;
4104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned char        olen;
4114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char               * out;
4124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned char        ilen;
4134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char               * in;
4144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  num = load_int(fp);
4164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *poutputs = outputs = (char **) lts_alloc(num, sizeof(char*));
4184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (outputs == NULL) {
4194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nRes = SWIsltsErrAllocResource;
4204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
4214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pinputs = inputs = (char **) lts_alloc(num, sizeof(char*));
4244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (inputs == NULL) {
4254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nRes = SWIsltsErrAllocResource;
4264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
4274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0;i<num;i++) {
4304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PORT_FREAD_CHAR(&olen, sizeof(char), 1, fp);
4314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    out = outputs[i] = lts_alloc(olen + 1, sizeof(char));
4324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (out == NULL) {
4334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      nRes = SWIsltsErrAllocResource;
4344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEAN_UP;
4354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (olen > 0) {
4384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PORT_FREAD_CHAR(out, sizeof(char), olen, fp);
4394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    out[olen] = '\0';
4414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PORT_FREAD_CHAR(&ilen, sizeof(char), 1, fp);
4424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    in = inputs[i] = lts_alloc(ilen + 1, sizeof(char));
4434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (in == NULL) {
4444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      nRes = SWIsltsErrAllocResource;
4454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEAN_UP;
4464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (ilen > 0) {
4494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PORT_FREAD_CHAR(in, sizeof(char), ilen, fp);
4504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    in[ilen] = '\0';
4524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LOAD_TREE
4534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (ilen > 0) pfprintf(PSTDOUT,"LOAD_TREE: got input %s out %s\n", in, outputs[i]);
4544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pfprintf(PSTDOUT,"LOAD_TREE: outputs[%d] len %d out %x out %s\n", i, olen, outputs[i], outputs[i]);
4554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
4564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pnum = num;
4594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return SWIsltsSuccess;
4604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEAN_UP:
4624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  free_outputs(outputs, inputs, num);
4644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *poutputs = NULL;
4654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pinputs = NULL;
4664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pnum = 0;
4674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
4694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult free_outputs(char **outputs, char **inputs, int num)
4724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
4734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult          nRes = SWIsltsSuccess;
4744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  i;
4754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (outputs) {
4774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i=0; i<num; i++) {
4784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (outputs[i]) {
4794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        FREE(outputs[i]);
4804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        outputs[i] = NULL;
4814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
4824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(outputs);
4844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (inputs) {
4874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i=0; i<num; i++) {
4884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (inputs[i]) {
4894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        FREE(inputs[i]);
4904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        inputs[i] = NULL;
4914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
4924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
4934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(inputs);
4944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
4954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
4964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
4974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
4984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult load_trees(RT_LTREE ***ptrees, int *num_letters,
4994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                      LQUESTION ***pquestions, int *num_questions, LM **plm, PORT_FILE *fp)
5004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
5014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult          nRes = SWIsltsSuccess;
5024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  let, i;
5034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  RT_LTREE           * tree = NULL;
5044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  RT_LTREE          ** trees = NULL;
5054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LOAD_TREE_SUMMARY
5074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT,"loading letter mapping\n");
5084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
5094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *ptrees = NULL;
5104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pquestions = NULL;
5114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *plm = NULL;
5124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  nRes = load_letter_mapping(fp, plm);
5144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (nRes != SWIsltsSuccess) {
5154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
5164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LOAD_TREE_SUMMARY
5194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT,"loading questions\n");
5204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
5214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  nRes = load_lquestions(pquestions, num_questions, fp);
5234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (nRes != SWIsltsSuccess) {
5244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
5254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *num_letters = load_int(fp);
5284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (*num_letters != (*plm)->num_letters) {
5304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef NO_STDERR
5314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("Error loading data, num_letters %d doesn't match num from mapping %d\n"),
5324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            *num_letters, (*plm)->num_letters);
5334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
5344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nRes = SWIsltsInternalErr;
5354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
5364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *ptrees = trees = (RT_LTREE**) lts_alloc(*num_letters, sizeof(RT_LTREE*));
5394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (trees == NULL) {
5404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nRes = SWIsltsErrAllocResource;
5414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
5424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (let=0;let<*num_letters;let++) {
5454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /*    pfprintf(PSTDOUT,"loading for t %d\n", t);*/
5464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    trees[let] = tree = (RT_LTREE*) lts_alloc(1, sizeof(RT_LTREE));
5484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (tree == NULL) {
5494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      nRes = SWIsltsErrAllocResource;
5504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEAN_UP;
5514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    tree->num_nodes = load_int(fp);
5544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    tree->values_or_question1 = (short*) lts_alloc(tree->num_nodes, sizeof(short));
5564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (tree->values_or_question1 == NULL) {
5574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      nRes = SWIsltsErrAllocResource;
5584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEAN_UP;
5594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    tree->question2 = (short*) lts_alloc(tree->num_nodes, sizeof(short));
5624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (tree->question2 == NULL) {
5634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      nRes = SWIsltsErrAllocResource;
5644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEAN_UP;
5654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    tree->left_nodes = (short *) lts_alloc(tree->num_nodes, sizeof(short));
5684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (tree->left_nodes == NULL) {
5694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      nRes = SWIsltsErrAllocResource;
5704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEAN_UP;
5714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LOAD_TREE
5744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pfprintf(PSTDOUT,"LOAD_TREE: Tree for let %d num_nodes %d\n", let, tree->num_nodes);
5754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
5764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i=0;i<tree->num_nodes;i++) {
5784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PORT_FREAD_INT16(&(tree->left_nodes[i]), sizeof(short), 1, fp);
5794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PORT_FREAD_INT16(&(tree->values_or_question1[i]), sizeof(short), 1, fp);
5804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LOAD_TREE
5824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pfprintf(PSTDOUT,"LOAD_TREE:  node[%d] %d %d", i, tree->left_nodes[i], tree->values_or_question1[i]);
5834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
5844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PORT_FREAD_INT16(&(tree->question2[i]), sizeof(short), 1, fp);
5864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (tree->left_nodes[i] != NO_NODE) {
5874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (tree->question2[i] == -1) tree->question2[i] = 0;
5884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LOAD_TREE
5894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        pfprintf(PSTDOUT," %x", (unsigned short) tree->question2[i]);
5904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
5914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
5924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LOAD_TREE
5944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pfprintf(PSTDOUT,"\n");
5954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
5964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
5974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
5984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
5994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return SWIsltsSuccess;
6004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEAN_UP:
6024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  free_trees(trees, *num_letters, *pquestions, *num_questions, *plm);
6044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *ptrees = NULL;
6054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pquestions = NULL;
6064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *plm = NULL;
6074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *num_letters = 0;
6084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *num_questions = 0;
6094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
6114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* deallocate trees */
6144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult free_trees(RT_LTREE **trees, int num_letters,
6154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                       LQUESTION **questions, int num_questions, LM *lm)
6164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
6174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult          nRes = SWIsltsSuccess;
6184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  i;
6194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  RT_LTREE           * tree;
6204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (lm) {
6224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    free_letter_mapping(lm);
6234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (questions) {
6254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    free_lquestions(questions, num_questions);
6264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (trees) {
6294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i=0; i<num_letters; i++) {
6304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (trees[i]) {
6314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        tree = trees[i];
6324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (tree->values_or_question1) {
6334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          FREE(tree->values_or_question1);
6344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          tree->values_or_question1 = NULL;
6354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
6364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (tree->question2) {
6374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          FREE(tree->question2);
6384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          tree->question2 = NULL;
6394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
6404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (tree->left_nodes) {
6414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          FREE(tree->left_nodes);
6424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          tree->left_nodes = NULL;
6434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
6444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        FREE(trees[i]);
6454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        trees[i] = NULL;
6464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
6474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
6484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(trees);
6494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
6504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
6514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
6524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult load_allowable_cons_comb(LTS *lts, PORT_FILE *fp)
6544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
6554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult          nRes = SWIsltsSuccess;
6564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char                line[50];
6574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char                tempstr[50];
6584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char              * tok;
6594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                 i, toklen;
6604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                 count;
6614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char          seps[] = " 	\n";
6624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lts->num_cons_comb = 0;
6644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lts->allowable_cons_combH = NULL;
6654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  while (PORT_FGETS(line, 50, fp)) {
6674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef TI_DSP
6694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /*need to get rid of sme crud at the end of the line because it is being read in binary mode*/
6714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i=strlen(line)-1;i>=0;i--) {
6724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (!isalpha(line[i])) line[i] = ' ';
6734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
6744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
6754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    count = 0;
6764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    tok = safe_strtok(line, seps, &toklen);
6774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    tempstr[0] = '\0';
6784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* get all available sequence of tokens */
6804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    while(tok && toklen > 0){
6814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      count += toklen;
6824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      strncat(tempstr, tok, toklen);
6834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      tempstr[count+1] = '\0';
6844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      strcat(tempstr, " ");
6854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      count++;
6864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      tok = safe_strtok(tok+toklen, seps, &toklen);
6884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
6894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (count > 0) {
6904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* delete the final space */
6924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        tempstr[count-1] = '\0';
6934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
6944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        lts->allowable_cons_comb[lts->num_cons_comb] = (char*) lts_alloc(strlen(tempstr)+1, sizeof(char));
6954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (lts->allowable_cons_comb[lts->num_cons_comb] == NULL) {
6964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          nRes = SWIsltsErrAllocResource;
6974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          goto CLEAN_UP;
6984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
6994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        strcpy(lts->allowable_cons_comb[lts->num_cons_comb], tempstr);
7014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_CONS_COMB
7034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        pfprintf(PSTDOUT,"LOAD_TREE: allowable_cons_comb[%d]: %s\n", lts->num_cons_comb, tempstr);
7044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
7054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        lts->num_cons_comb++;
7074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (lts->num_cons_comb >= MAX_CONS_COMB) {
7084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef NO_STDERR
7094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            PLogError(L("MAX_CONS_COMB %d exceeded\n"), MAX_CONS_COMB);
7104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
7114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          nRes = SWIsltsInternalErr;
7124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          goto CLEAN_UP;
7134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
7144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
7154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (lts->num_cons_comb == 0) {
7174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef NO_STDERR
7184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("Warning: the data file is missing consonant combinations - syllable boundaries will be incorrect\n"));
7194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
7204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lts->allowable_cons_combH = my_PHashTableCreate_FromStrings( (const char**)lts->allowable_cons_comb, lts->num_cons_comb, L("lts.allowable_cons_combH"));
7224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(lts->allowable_cons_combH == NULL) {
7234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nRes = SWIsltsErrAllocResource;
7244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
7254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LOAD_TREE_SUMMARY
7284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT,"loaded %d cons combinations\n", lts->num_cons_comb);
7294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
7304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return SWIsltsSuccess;
7324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEAN_UP:
7344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  free_allowable_cons_comb(lts);
7364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
7384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
7394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult free_allowable_cons_comb(LTS *lts)
7414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
7424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult          nRes = SWIsltsSuccess;
7434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  i;
7444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0; i<lts->num_cons_comb; i++) {
7464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (lts->allowable_cons_comb[i]) {
7474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      FREE(lts->allowable_cons_comb[i]);
7484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      lts->allowable_cons_comb[i] = NULL;
7494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
7504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(lts->allowable_cons_combH)
7524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PHashTableDestroy( (PHashTable*)lts->allowable_cons_combH);
7534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lts->allowable_cons_combH = NULL;
7544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
7554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
7564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult load_question_strings(LTS* lts, PORT_FILE* fp)
7584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
7594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult          nRes = SWIsltsSuccess;
7604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  i;
7614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  num;
7624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned char        len;
7634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char              ** strings;
7644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char               * str;
7654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  num = load_int(fp);
7674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lts->strings = strings = (char **) lts_alloc(num, sizeof(char*));
7694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lts->string_lens = (char*)lts_alloc(num, sizeof(char));
7704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (strings == NULL || lts->string_lens == NULL ) {
7724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nRes = SWIsltsErrAllocResource;
7734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
7744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0;i<num;i++) {
7774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PORT_FREAD_CHAR(&len, sizeof(char), 1, fp);
7784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    str = strings[i] = lts_alloc(len + 1, sizeof(char));
7804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (str == NULL) {
7814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      nRes = SWIsltsErrAllocResource;
7824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEAN_UP;
7834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
7844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (len > 0) {
7864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      PORT_FREAD_CHAR(str, sizeof(char), len, fp);
7874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
7884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    str[len] = '\0';
7894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    bitarray_populate_from_list( lts->membership, lts->strings[i], len);
7914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    lts->string_lens[i] = strlen(lts->strings[i]);
7924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
7934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  // *pnum = num;
7954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lts->num_strings = num;
7964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return SWIsltsSuccess;
7984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
7994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEAN_UP:
8004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  free_question_strings(lts);
8024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
8044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
8054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* deallocate question strings */
8074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic SWIsltsResult free_question_strings(LTS* lts)
8084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
8094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult          nRes = SWIsltsSuccess;
8104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  i;
8114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (lts->strings) {
8134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    for (i=0;i<lts->num_strings;i++) {
8144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (lts->strings[i]) {
8154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        FREE(lts->strings[i]);
8164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        lts->strings[i] = NULL;
8174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
8184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
8194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(lts->strings);
8204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if(lts->string_lens) FREE(lts->string_lens);
8214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    lts->strings = NULL;
8224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    lts->string_lens = NULL;
8234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
8254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
8264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectSWIsltsResult create_lts(char *data_filename, LTS_HANDLE *phLts)
8294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
8304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult          nRes = SWIsltsSuccess;
8314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LTS                * lts;
8324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_STATIC_SLTS
8344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* TODO: language-specific ID here? */
8354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lts = &g_lts;
8364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else /* !USE_STATIC_SLTS */
8384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PORT_FILE *fp;
8404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lts = (LTS*) lts_alloc(1, sizeof(LTS));
8424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (lts == NULL) {
8434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nRes = SWIsltsErrAllocResource;
8444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
8454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  fp = PORT_FOPEN(data_filename, "rb");
8484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (fp == NULL) {
8494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef NO_STDERR
8504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("Cannot open %s\n"), data_filename);
8514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
8524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nRes = SWIsltsFileOpenErr;
8534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
8544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   nRes = load_phone_mapping(fp, &lts->phone_mapping);
8564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   if (nRes != SWIsltsSuccess) {
8574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     PLogError(L("SWIsltsErr: load_phone_mapping() failed: Err_code = %d\n"), nRes);
8584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     goto CLEAN_UP;
8594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   }
8604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   nRes = load_question_strings(lts, fp);
8624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   if (nRes != SWIsltsSuccess) {
8634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     PLogError(L("SWIsltsErr: load_question_strings() failed: Err_code = %d\n"), nRes);
8644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     goto CLEAN_UP;
8654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   }
8664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   nRes  = load_outputs(&(lts->outputs), &(lts->input_for_output), &lts->num_outputs, fp);
8684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   if (nRes != SWIsltsSuccess) {
8694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     PLogError(L("SWIsltsErr: load_outputs() failed: Err_code = %d\n"), nRes);
8704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     goto CLEAN_UP;
8714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project   }
8724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LOAD_TREE
8744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT,"LOAD_TREE: got %d outputs, loading trees\n", lts->num_outputs);
8754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
8764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  nRes = load_trees(&(lts->trees), &(lts->num_letters),
8784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                 &(lts->questions), &(lts->num_questions),
8794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                 &(lts->letter_mapping),
8804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                 fp);
8814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (nRes != SWIsltsSuccess) {
8824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("SWIsltsErr: load_trees() failed: Err_code = %d\n"), nRes);
8834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
8844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  nRes = load_allowable_cons_comb(lts, fp);
8874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (nRes != SWIsltsSuccess) {
8884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("SWIsltsErr: load_allowable_cons_comb() failed: Err_code = %d\n"), nRes);
8894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
8904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
8914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  PORT_FCLOSE(fp);
8934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* !USE_STATIC_SLTS */
8954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *phLts = lts;
8974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return SWIsltsSuccess;
8984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
8994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEAN_UP:
9004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  free_lts(lts);
9024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *phLts = NULL;
9034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
9044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* deallocates LTS */
9074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectSWIsltsResult free_lts(LTS_HANDLE hlts)
9084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult          nRes = SWIsltsSuccess;
9104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LTS                * lts = (LTS *)hlts;
9114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (lts) {
9134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef USE_STATIC_SLTS
9154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    free_phone_mapping(lts->phone_mapping);
9164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    free_question_strings(lts);
9174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    lts->strings = NULL;
9184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    lts->phone_mapping = NULL;
9194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    free_outputs(lts->outputs, lts->input_for_output, lts->num_outputs);
9214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    lts->input_for_output = lts->outputs = NULL;
9224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    free_trees(lts->trees, lts->num_letters,
9244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project               lts->questions, lts->num_questions,
9254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project               lts->letter_mapping);
9264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    lts->trees = NULL;
9274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    lts->questions = NULL;
9284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    lts->letter_mapping = NULL;
9294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    free_allowable_cons_comb(lts);
9314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    FREE(lts);
9324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* !USE_STATIC_LTS */
9334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
9364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint find_phone(const char *ph, PM *pm)
9404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
9424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int iRet = -1;
9434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = PHashTableGetValue((PHashTable*)pm->phoneH, ph, (void**)(void*)&iRet);
9444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (rc != ESR_SUCCESS)
9454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError("error while in find_phone(%s,%x)\n", ph, pm);
9464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return iRet;
9474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint find_best_string(const char *str, LTS* lts)
9504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i, maxlen, maxi, len;
9524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int len_str;
9534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(str[0] == '\0')   return -1;
9554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  len_str = strlen(str);
9564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  maxi = -1;
9584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  maxlen = 0;
9594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0;i<lts->num_strings;i++) {
9614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    len = lts->string_lens[i];
9624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if( len > len_str)
9634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      continue; /* no point in comparison */
9644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (strncmp(str, lts->strings[i], len) == 0) {
9654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (len > maxlen) {
9664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	maxlen = len;
9674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        maxi = i;
9684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
9694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
9704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return maxi;
9724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
9734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint find_best_prefix_string(const char *str, LTS* lts)
9754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
9764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i;
9774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int maxlen;
9784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int maxi;
9794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int len;
9804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int prelen;
9814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  maxi = -1;
9834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  maxlen = 0;
9844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  prelen = strlen(str);
9864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
9874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0;i<lts->num_strings;i++) {
9884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    len = lts->string_lens[i];
9894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (len <= prelen) {
9904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (strncmp(str + (prelen - len), lts->strings[i], len) == 0) {
9914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (len > maxlen) {
9924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          maxlen = len;
9934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          maxi = i;
9944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
9954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
9964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
9974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
9984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return maxi;
9994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
10004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint fill_up_dp_for_letter(LTS *lts, const char *input_word, int word_len, int index, int root_start, int root_end, int left_phone)
10024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
10034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i,j;
10044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LDP *dp;
10054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned char letter;
10064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int hit_wb;
10074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LM *lm;
10084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  unsigned char word[MAX_WORD_LEN];
10094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char tempstr[MAX_WORD_LEN];
10104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int first_syl_end;
10114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int last_syl_start;
10124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  dp = &(lts->dp);
10144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lm = lts->letter_mapping;
10154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* the LTS decision tree does not seem to be well trained at all for
10174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     the letter ' when followed by "s"  ... It seems to result in the
10184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	 phoneme 'm', which is wrong.   "'t" seems to be OK though.
10194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	 BAD: Kevin's : k6v6nmz ...  pal's : palmz ... paul's : p{lz
10204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	 BAD: janice's : jan6s6mz ... tom's house : t)mmz&h?s ... tonya's : t)ny6mz
10214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	 BAD: jake's house : jAk6mz&h?s
10224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	 Ignoring ' as below we get ...
10234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     BETTER: Kevin's : kev6nz  ... pal's : palz ... paul's : p{lz
10244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	 BETTER: janice's : jan6s6s ... tom's house : t)mz&h?s ... tonya's : t)ny6s
10254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	 BETTER: jake's house : jAk6s&h?s
10264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	 The proper solution requires a legitimate text normalizer with special
10274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	 handling of cases like 's which would always put a "z" there,
10284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	 except if preceded by an unvoiced stop (ptk) which requires a "s" there.
10294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	 For now let's just skip the ' letter, which testing shows to be generally
10304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project	 safe (janice's, jake's etc are better but still not quite right). */
10314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(input_word[index] == '\'')
10334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1; // same as unknown character
10344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  letter = find_letter_index(input_word[index], lm);
10364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (letter == LTS_MAXCHAR) {
10384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* lisa - we need to decide how to handle this case.  Do we just silently skip unknown
10394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    characters or warn the app or user somehow*/
10404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef NO_STDERR
10414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PrintError("unknown character on input %c - skipping\n", input_word[index], NULL, NULL);
10424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
10434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("unknown character on input %c - skipping\n"), input_word[index]);
10444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
10454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
10464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
10474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hit_wb = 0;
10494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*pfprintf(PSTDOUT,"left context\n");*/
10514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (j=0;j<5;j++) {
10534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (hit_wb) {
10544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      dp->properties[ Left1+j] = find_letter_index(LTS_MARKER_PIPESEP_CHAR, lm);
10554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    } else {
10564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      i = index - (j+1);
10574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (i < 0) dp->properties[ Left1+j] = find_letter_index(LTS_MARKER_PIPESEP_CHAR, lm);
10584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else {
10594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        dp->properties[ Left1+j] = find_letter_index(input_word[i], lm);
10604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (dp->properties[ Left1+j] == LTS_MAXCHAR) { /*assume an unknown character is a word boundary*/
10614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          dp->properties[ Left1+j] = find_letter_index(LTS_MARKER_PIPESEP_CHAR, lm);
10624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          hit_wb = 1;
10634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
10644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
10654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
10664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
10674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*pfprintf(PSTDOUT,"right context\n");*/
10694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  hit_wb = 0;
10714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (j=0;j<5;j++) {
10724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (hit_wb) {
10734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      dp->properties[ Right1+j] = find_letter_index(LTS_MARKER_PIPESEP_CHAR, lm);
10744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    } else {
10754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      i = index + (j+1);
10764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (i >= word_len) dp->properties[Right1+j] = find_letter_index(LTS_MARKER_PIPESEP_CHAR, lm);
10774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else {
10784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        dp->properties[ Right1+j] = find_letter_index(input_word[i], lm);
10794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (dp->properties[ Right1+j] == LTS_MAXCHAR) { /*assume an unknown character is a word boundary*/
10804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          dp->properties[ Right1+j] = find_letter_index(LTS_MARKER_PIPESEP_CHAR, lm);
10814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          hit_wb = 1;
10824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
10834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
10844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
10854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
10864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  dp->letter = letter; // properties[ Letter] = letter;
10884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  dp->properties[ LeftPhone1] = left_phone;
10904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*pfprintf(PSTDOUT,"word stuff\n"); */
10924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*find word start and end - use unknown character as word boundaries*/
10944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  dp->properties[ WordLen] = word_len;
10964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
10974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (index == 0) dp->properties[ LetInWord] = 0;
10984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else if (index == word_len-1) dp->properties[ LetInWord] = 2;
10994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else dp->properties[ LetInWord] = 1;
11004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0;i<word_len;i++) {
11024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    word[i] = find_letter_index(input_word[i], lm);
11034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
11044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*figure out syllable in word - not really syllables - just looks to see if is or at first or last vowel*/
11064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*  pfprintf(PSTDOUT,"syl stuff\n");*/
11074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  first_syl_end = word_len;
11094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0;i<word_len;i++) {
11104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (lm->type[word[i]] == 1) {
11114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (j=i+1;j<word_len;j++) {
11124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (lm->type[word[j]] != 1) break;
11134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      first_syl_end = j;
11154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
11164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
11174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
11184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  last_syl_start = 0;
11194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=word_len-1;i>=0;i--) {
11204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (lm->type[word[i]] == 1) {
11214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (j=i-1;j>=0;j--) {
11224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (lm->type[word[j]] != 1) break;
11234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      last_syl_start = j;
11254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
11264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
11274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
11284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_DP_LETTER
11304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT,"first_syl_end %d last_syl_start %d\n", first_syl_end, last_syl_start);
11314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
11324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (index > last_syl_start) dp->properties[ SylInWord] = 2;
11344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else if (index < first_syl_end) dp->properties[ SylInWord] = 0;
11354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else dp->properties[ SylInWord] = 1;
11364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  first_syl_end = word_len;
11384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0;i<word_len;i++) {
11394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (lm->type[word[i]] == 1) {
11404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (j=i+1;j<word_len;j++) {
11414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (lm->type[word[j]] != 1) break;
11424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (;j<word_len;j++) {
11444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (lm->type[word[j]] == 1) break;
11454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      first_syl_end = j;
11474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
11484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
11494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
11504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  last_syl_start = 0;
11514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=word_len-1;i>=0;i--) {
11524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (lm->type[word[i]] == 1) {
11534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (j=i-1;j>=0;j--) {
11544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (lm->type[word[j]] != 1) break;
11554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (;j>=0;j--) {
11574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (lm->type[word[j]] == 1) break;
11584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      last_syl_start = j;
11604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
11614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
11624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
11634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_DP_LETTER
11654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT,"first_syl_end %d last_syl_start %d\n", first_syl_end, last_syl_start);
11664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
11674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (index > last_syl_start) dp->properties[ Syl2InWord] = 2;
11694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else if (index  < first_syl_end) dp->properties[ Syl2InWord] = 0;
11704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else dp->properties[Syl2InWord] = 1;
11714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  first_syl_end = word_len;
11744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=root_start;i<root_end;i++) {
11754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (lm->type[word[i]] == 1) {
11764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (j=i+1;j<word_len;j++) {
11774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (lm->type[word[j]] != 1) break;
11784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      first_syl_end = j;
11804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
11814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
11824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
11834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  last_syl_start = 0;
11844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=root_end-1;i>=root_start;i--) {
11854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (lm->type[word[i]] == 1) {
11864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (j=i-1;j>=0;j--) {
11874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (lm->type[word[j]] != 1) break;
11884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
11894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      last_syl_start = j;
11904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
11914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
11924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
11934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_DP_LETTER
11954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT,"first_syl_end %d last_syl_start %d\n", first_syl_end, last_syl_start);
11964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
11974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
11984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (index > last_syl_start) dp->properties[SylInRoot] = 2;
11994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else if (index < first_syl_end) dp->properties[ SylInRoot] = 0;
12004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else dp->properties[ SylInRoot] = 1;
12014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  first_syl_end = word_len;
12034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=root_start;i<root_end;i++) {
12044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (lm->type[word[i]] == 1) {
12054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (j=i+1;j<word_len;j++) {
12064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (lm->type[word[j]] != 1) break;
12074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
12084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (;j<word_len;j++) {
12094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (lm->type[word[j]] == 1) break;
12104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
12114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      first_syl_end = j;
12124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
12134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
12144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
12154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  last_syl_start = 0;
12164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=root_end-1;i>=root_start;i--) {
12174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (lm->type[word[i]] == 1) {
12184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (j=i-1;j>=0;j--) {
12194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (lm->type[word[j]] != 1) break;
12204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
12214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (;j>=0;j--) {
12224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (lm->type[word[j]] == 1) break;
12234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
12244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      last_syl_start = j;
12254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      break;
12264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
12274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
12284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_DP_LETTER
12304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT,"first_syl_end %d last_syl_start %d\n", first_syl_end, last_syl_start);
12314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
12324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (index > last_syl_start) dp->properties[Syl2InRoot] = 2;
12344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else if (index  < first_syl_end) dp->properties[Syl2InRoot] = 0;
12354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else dp->properties[Syl2InRoot] = 1;
12364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  dp->properties[Left_DFRE] = index - root_start;
12394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  dp->properties[Right_DFRE] = (root_end - index) - 1;
12404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*  pfprintf(PSTDOUT,"strings\n");*/
12434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_DP_LETTER
12444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT,"input word %s num_strings %d\n", input_word, lts->num_strings);
12454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
12464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  dp->properties[RightString] = find_best_string(input_word+index+1, lts);
12484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  strcpy(tempstr, input_word);
12494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  tempstr[index] = '\0';
12504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  dp->properties[LeftString] = find_best_prefix_string(tempstr, lts);
12524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_DP_LETTER
12544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT,"dp %c ", lm->letters[dp->letter]);
12554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0;i<word_len;i++) {
12574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pfprintf(PSTDOUT,"%c", lm->letters[word[i]]);
12584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
12594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pfprintf(PSTDOUT," %c%c%c {%c} %c%c%c liw %d siw %d s2iw %d nw %d sir %d s2ir %d left_DFRE %d right_DFRE %d\n",
12604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         lm->letters[dp->left_context[2]],
12614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         lm->letters[dp->left_context[1]],
12624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         lm->letters[dp->left_context[0]],
12634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         lm->letters[dp->letter],
12644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         lm->letters[dp->right_context[0]],
12654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         lm->letters[dp->right_context[1]],
12664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         lm->letters[dp->right_context[2]],
12674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         dp->let_in_word,
12684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         dp->syl_in_word,
12694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         dp->syl2_in_word,
12704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         dp->word_len,
12714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         dp->syl_in_root,
12724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         dp->syl2_in_root,
12734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project         dp->left_DFRE, dp->right_DFRE);
12744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
12754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return 0;
12774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
12784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
12794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint matches(LQUESTION *q1, LQUESTION *q2, int type, LDP *dp)
12804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
12814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int m1, m2;
12824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  switch(type) {
12834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  case 0:
12844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return qmatches(q1, dp);
12854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  case 1:
12864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m1 = qmatches(q1, dp);
12874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m2 = qmatches(q2, dp);
12884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return(m1 && m2);
12894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  case 2:
12904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m1 = qmatches(q1, dp);
12914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m2 = qmatches(q2, dp);
12924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return(m1 && !m2);
12934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  case 3:
12944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m1 = qmatches(q1, dp);
12954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m2 = qmatches(q2, dp);
12964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return(!m1 && m2);
12974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  case 4:
12984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m1 = qmatches(q1, dp);
12994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    m2 = qmatches(q2, dp);
13004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return(!m1 && !m2);
13014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  default:
13024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return -1;
13034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
13044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* should not come here */
13054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return -1;
13064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
13074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint find_output_for_dp(LTS *lts, int *pbackoff_output)
13094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
13104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LDP *dp;
13114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int index;
13124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  RT_LTREE *tree;
13134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LQUESTION *q1;
13144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LQUESTION *q2;
13154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int comb_type;
13164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int q2_index;
13174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int left_index;
13184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  dp = &(lts->dp);
13204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  tree = lts->trees[dp->letter]; // properties[Letter]];
13214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  index = 0;
13234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  while (1) {
13254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    left_index = tree->left_nodes[index];
13264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (left_index == NO_NODE) { /*means its a leaf node*/
13284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      *pbackoff_output = tree->question2[index];
13294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      return tree->values_or_question1[index];
13304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
13314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    q1 = lts->questions[tree->values_or_question1[index]];
13324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    q2_index = tree->question2[index] & 0x1FFF;
13334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    comb_type = (tree->question2[index] & 0xE000) >> 13;
13344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    q2 = lts->questions[q2_index];
13364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (matches(q1, q2, comb_type, dp)) {
13384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      index = left_index;
13394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    } else {
13404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      index = left_index+1;
13414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
13424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
13434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
13444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint add_output(char *output, char **output_phone_string, int out_len, int max_phone_length)
13454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
13464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char *tok;
13474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int toklen;
13484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char seps[] = " ";
13494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (strlen(output) == 0) return out_len;
13514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  tok = safe_strtok(output, seps, &toklen);
13534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  while (tok && toklen) {
13544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ((toklen > 0) && (strncmp(tok, "null", 4) != 0)) {
13554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (isdigit(tok[toklen-1])) {
13574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /*means it's a vowel.  So, add a syllable boundary.  It's position
13584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          gets adjusted later by adjust_syllable_boundaries()*/
13594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        strcpy(output_phone_string[out_len++], LTS_MARKER_SYLL_START);
13604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (out_len >= max_phone_length) return max_phone_length;
13614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
13624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      strncpy(output_phone_string[out_len], tok, toklen);
13634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      output_phone_string[out_len++][toklen] = '\0';
13644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (out_len >= max_phone_length) return max_phone_length;
13654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
13664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    tok = safe_strtok(tok+toklen, seps, &toklen);
13674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
13684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return out_len;
13694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
13704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectint is_allowable_cons_comb(LTS *lts, const char *cons_string)
13724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
13734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* int i;
13744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     for (i=0;i<lts->num_cons_comb;i++) {
13754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     #if PRINT_CONS_COMB
13764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     pfprintf(PSTDOUT,"checking {%s} vs c[%d] {%s}\n", cons_string, i, lts->allowable_cons_comb[i]);
13774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     #endif
13784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     if (strcmp(cons_string, lts->allowable_cons_comb[i]) == 0) return 1;
13794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     }
13804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project     return 0;
13814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  */
13824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  ESR_ReturnCode rc;
13834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  void* iVal = NULL;
13844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  rc = PHashTableGetValue( (PHashTable*)lts->allowable_cons_combH, cons_string, &iVal);
13854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if(rc == ESR_SUCCESS)
13864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 1;
13874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  else
13884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    return 0;
13894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
13904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
13954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid adjust_syllable_boundaries(LTS *lts, char **output_phone_string, int num_out, int max_phone_length)
13964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
13974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char *out;
13984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int i,j;
13994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int syl_start;
14004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int stress = 0;
14014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int first_syl_bound;
14024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char tempstr[20];
14044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*there should already be a syllable boundary before each vowel (add_output put one there)*/
14064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*so just find these, then shift back by allowable consonant combinations and move the syllable mark*/
14074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0;i<num_out;i++) {
14094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    out = output_phone_string[i];
14104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (strcmp(out, LTS_MARKER_SYLL_START) == 0) { /*means there is a syllable boundary
14114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      														 find start of allowable sequence*/
14124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      syl_start = 0;
14144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (j=i-1;j>0;j--) {
14164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        out = output_phone_string[j];
14174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (isdigit(out[strlen(out)-1])) {
14184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          syl_start = j+1;
14194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          break; /*means it's a vowel*/
14204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
14214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (strcmp(out, LTS_MARKER_WORD_START) == 0) {
14224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          syl_start = j+1;
14234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          break; /*don't push syl boundaries before word boundaries*/
14244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
14254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (strcmp(out, LTS_MARKER_PRON_START) == 0) {
14264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          syl_start = j+1;
14274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          break; /*don't push syl boundaries before phrase boundaries*/
14284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
14294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* for sequences longer than 2,
14314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project           check 3-syllable onset first, then check 2-syllable onset */
14324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if(j > 1){
14334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          sprintf(tempstr, "%s %s %s", output_phone_string[j-2], output_phone_string[j-1],
14344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            output_phone_string[j]);
14354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if (!is_allowable_cons_comb(lts, tempstr)) {
14364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            sprintf(tempstr, "%s %s", output_phone_string[j-1], output_phone_string[j]);
14374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            if (!is_allowable_cons_comb(lts, tempstr)) {
14384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_CONS_COMB
14394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              pfprintf(PSTDOUT,"cons comb %s %s not allowed\n", output_phone_string[j-1],
14404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                output_phone_string[j]);
14414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
14424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              syl_start = j;
14434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              break;
14444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
14454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
14464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
14474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* for sequences shorter than 2 */
14484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        else
14494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        {
14504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          sprintf(tempstr, "%s %s", output_phone_string[j-1], output_phone_string[j]);
14514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if (!is_allowable_cons_comb(lts, tempstr)) {
14524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_CONS_COMB
14534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            pfprintf(PSTDOUT,"cons comb %s %s not allowed\n", output_phone_string[j-1],
14544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              output_phone_string[j]);
14554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
14564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            syl_start = j;
14574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            break;
14584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
14594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
14604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      } /* end for j=i-1 */
14614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /*shift over stuff between syl_start a gap*/
14634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (j=i;j>syl_start;j--) {
14644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        strcpy(output_phone_string[j], output_phone_string[j-1]);
14654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
14664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /*now find stress level from phone (and remove it) and add it to syl bound*/
14674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (i<num_out-1) {
14694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        out = output_phone_string[i+1];
14704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (isdigit(out[strlen(out)-1])) {
14724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          stress = atoi(out + strlen(out)-1);
14734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        } else {
14744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          stress = 0; /*should not happen*/
14754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
14764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      } else {
14774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        stress = 0; /*should not happen*/
14784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
14794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      sprintf(output_phone_string[syl_start], LTS_MARKER_SYLL_START_DD, stress);
14814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    } /* end if (strcmp(out, LTS_MARKER_SYLL_START) == 0) */
14824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  } /* end for i=0 */
14834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*remove all the stress marking from the vowels*/
14854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0;i<num_out;i++) {
14864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    out = output_phone_string[i];
14874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ((strncmp(out, LTS_MARKER_SYLL_START, 2) != 0) && isdigit(out[strlen(out)-1])) {
14884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      out[strlen(out)-1] = '\0'; /*remove the stress from the vowel*/
14894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
14904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
14914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
14924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /* word boundary must be followed by syllable boundary
14934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if no syllable boundary exists after a word boundary, move the first
14944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    syllable boundary to after the word boundary */
14954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  first_syl_bound = -1;
14964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  syl_start = -1;
14974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=1;i<num_out;i++) {
14984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ((strcmp(output_phone_string[i-1], LTS_MARKER_WORD_START) == 0) &&
14994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      (strncmp(output_phone_string[i], LTS_MARKER_SYLL_START, 2) != 0)) {
15004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      syl_start = i;
15024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* search for first occurance of syllable boundary */
15034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for(j=syl_start+1;j<num_out; j++){
15044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        out = output_phone_string[j];
15054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if(strncmp(out, LTS_MARKER_SYLL_START, 2) == 0 && isdigit(out[strlen(out)-1])){
15064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            stress = atoi(out + strlen(out)-1);
15074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            first_syl_bound = j;
15084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            break;
15094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
15104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
15114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /* swap entries until syl bound reaches word bound */
15134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if(first_syl_bound >= 0){
15144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        for(; j>syl_start; j--){
15154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          strcpy(output_phone_string[j], output_phone_string[j-1]);
15164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
15174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* put syllable boundary after word boundary */
15184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        sprintf(output_phone_string[syl_start], LTS_MARKER_SYLL_START_DD, stress);
15194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /* advance i, reset variables */
15214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        i = first_syl_bound;
15224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        first_syl_bound = syl_start = -1;
15234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
15254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
15264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
15274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
15294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectSWIsltsResult lts_for_word(LTS *lts, char *word, int word_len, char **output_phone_string, int max_phone_length, int *pnum_out)
15324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
15334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult          nRes = SWIsltsSuccess;
15344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  i,j;
15354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  root_start;
15364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  root_end;
15374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  output_index;
15384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  left_phone;
15394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char               * input_seq;
15404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  found_match;
15414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  start_num_out;
15424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  backoff_output;
15434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                  num_out;
15444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  start_num_out = num_out = *pnum_out;
15464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  root_start = 0;
15484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  root_end = word_len;
15494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0;i<word_len;i++) {
15514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ((i == 0) || (num_out == 0)) {
15534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      /*      pfprintf(PSTDOUT,"about to call find_phone1\n");*/
15544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      left_phone = find_phone(LTS_MARKER_PIPESEP, lts->phone_mapping);
15554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LTS_WORD
15574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pfprintf(PSTDOUT,"got phone %d for initial | (LTS_MARKER_PIPESEP)\n", left_phone);
15584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
15594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (left_phone < 0) {
15604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef NO_STDERR
15624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PrintError("Error, cannot find | in phone mappings\n", NULL, NULL, NULL);
15634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
15644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError(L("Error, cannot find | in phone mappings\n"));
15654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
15664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        nRes = SWIsltsInternalErr;
15674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        goto CLEAN_UP;
15684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
15694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    } else {
15704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LTS_WORD
15724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pfprintf(PSTDOUT,"about to call find_phone2 num_out %d\n", num_out);
15734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pfprintf(PSTDOUT,"out[%d] %s\n", num_out-1, output_phone_string[num_out-1]);
15744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
15754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (strcmp(output_phone_string[num_out-1], LTS_MARKER_PRON_START) == 0) left_phone = find_phone(LTS_MARKER_PIPESEP, lts->phone_mapping);
15774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else if (strcmp(output_phone_string[num_out-1], LTS_MARKER_WORD_START) == 0) left_phone = find_phone(LTS_MARKER_PIPESEP, lts->phone_mapping);
15784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      else left_phone = find_phone(output_phone_string[num_out-1], lts->phone_mapping);
15794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LTS_WORD
15814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pfprintf(PSTDOUT,"got phone %d for %s\n", left_phone, output_phone_string[num_out-1]);
15824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
15834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (left_phone < 0) {
15854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef NO_STDERR
15874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PrintError("Error, cannot find %s in phone mappings\n", (unsigned long)output_phone_string[num_out-1], NULL, NULL);
15884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
15894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        PLogError(L("Error, cannot find %s in phone mappings\n"), output_phone_string[num_out-1]);
15904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
15914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        nRes = SWIsltsInternalErr;
15924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        goto CLEAN_UP;
15934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
15944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
15954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /*    pfprintf(PSTDOUT,"calling fill up dp\n");*/
15974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (fill_up_dp_for_letter(lts, word, word_len, i, root_start, root_end, left_phone)) continue;
15984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
15994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /*    pfprintf(PSTDOUT,"calling find output\n");*/
16004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    output_index = find_output_for_dp(lts, &backoff_output);
16014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LTS_WORD
16034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pfprintf(PSTDOUT,"got output %d\n", output_index);
16044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
16054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    found_match = 1;
16074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (strlen(lts->input_for_output[output_index]) > 0) {
16094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /*some extra input string to use up*/
16104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LTS_WORD
16114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pfprintf(PSTDOUT,"GOT INPUT %s for %s letter %c\n", lts->input_for_output[output_index], word, word[i]);
16124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
16134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      input_seq = lts->input_for_output[output_index];
16154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (input_seq[0] == '=') {
16164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        root_end = i;
16174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        input_seq = input_seq+1; /*skip suffix indicator*/
16184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
16194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      for (j=i+1;;j++) {
16204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (input_seq[j-(i+1)] == '\0') break;
16214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (input_seq[j-(i+1)] == '-') {
16224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          root_start = j;
16234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          break;
16244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
16254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (j >= word_len) {
16264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          found_match = 0;
16274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          break;
16284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
16294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (input_seq[j-(i+1)] != word[j]) {
16314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          found_match = 0;
16324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          break;
16334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
16344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
16354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (found_match) {
16364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        i = j-1;
16374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
16384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
16394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (!found_match) {
16414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LTS_WORD
16424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      pfprintf(PSTDOUT,"using backoff output %s instead of regular %s\n",
16434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project               lts->outputs[backoff_output],
16444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project               ts->outputs[output_index]);
16454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
16464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      num_out = add_output(lts->outputs[backoff_output], output_phone_string, num_out, max_phone_length);
16484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
16494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else {
16504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      num_out = add_output(lts->outputs[output_index], output_phone_string, num_out, max_phone_length);
16514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
16524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if (num_out >= max_phone_length) {
16534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      nRes = SWIsltsMaxInputExceeded;
16544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      goto CLEAN_UP;
16554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
16564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
16574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pnum_out = num_out;
16594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return SWIsltsSuccess;
16604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEAN_UP:
16624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *pnum_out = 0;
16644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
16654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
16664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source ProjectSWIsltsResult run_lts(LTS_HANDLE h, FSM_DICT_HANDLE hdict, char *input_sentence, char **output_phone_string, int *phone_length)
16704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
16714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  SWIsltsResult            nRes = SWIsltsSuccess;
16724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                    i;
16734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                    len;
16744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                    num_out = 0;
16754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  LTS                  * lts;
16764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                    was_in_phrase;
16774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  char                   word[MAX_WORD_LEN];
16784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                    num_in_word;
16794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                    max_phone_length;
16804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  int                    pron_len;
16814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  max_phone_length = *phone_length;
16834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  len = strlen(input_sentence);
16854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  lts = (LTS*) h;
16874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  was_in_phrase = 0;
16894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*add a phrase start then word start at beginning*/
16914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  strcpy(output_phone_string[num_out++], LTS_MARKER_PRON_START);
16934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  if (num_out >= max_phone_length) {
16944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    nRes = SWIsltsMaxInputExceeded;
16954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    goto CLEAN_UP;
16964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
16974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
16984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  num_in_word = 0;
16994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  pron_len = 1;    // for the first time through
17004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  for (i=0;i<=len;i++) {
17024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_LTS_WORD
17044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    pfprintf(PSTDOUT,"WORKING on letter %d %c\n", i, input_sentence[i]);
17054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
17064a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17074a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    /* Treat hyphen as word delimiter.  Not quite right for German
17084a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project       hyphenated compounds, but still an improvement. */
17094a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    if ((input_sentence[i] == ' ') || (input_sentence[i] == '-') || (input_sentence[i] == '\t') || (i == len)) {
17104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (num_in_word>0 ) {
17114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        strcpy(output_phone_string[num_out++], LTS_MARKER_WORD_START);
17124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (num_out >= max_phone_length) {
17134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          nRes = SWIsltsMaxInputExceeded;
17144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          goto CLEAN_UP;
17154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
17164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        word[num_in_word] = '\0';
17184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (1) {
17204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#if PRINT_DICT_LOOKUP
17224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          pfprintf(PSTDOUT,"Did not find %s in dictionary\n", word);
17234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
17244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		  pron_len = -num_out;
17254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          nRes = lts_for_word(lts, word, num_in_word, output_phone_string, max_phone_length, &num_out);
17264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		  pron_len += num_out; // now pron_len is the number of phonemes/markers added
17274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project		  if(pron_len == 0)
17284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project			  num_out--; // to backspace on the LTS_MARKER_WORD_START !!
17294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if (nRes != SWIsltsSuccess) {
17304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            goto CLEAN_UP;
17314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
17324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
17334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        num_in_word = 0;
17344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
17354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
17364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else if ( (input_sentence[i] == '.')
17374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                || (input_sentence[i] == ',')
17384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                || (input_sentence[i] == '!')
17394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                || (input_sentence[i] == '?')
17404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project                || (input_sentence[i] == '\n')) {
17414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (was_in_phrase) {
17424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        /*add a phrase boundary after lts is called*/
17434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (num_in_word > 0) {
17444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          strcpy(output_phone_string[num_out++], LTS_MARKER_WORD_START);
17454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if (num_out >= max_phone_length) {
17464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            nRes = SWIsltsMaxInputExceeded;
17474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            goto CLEAN_UP;
17484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
17494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          word[num_in_word] = '\0';
17514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          if (1) {
17534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            nRes = lts_for_word(lts, word, num_in_word, output_phone_string, max_phone_length, &num_out);
17544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            if (nRes != SWIsltsSuccess) {
17554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project              goto CLEAN_UP;
17564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project            }
17574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          }
17584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          num_in_word = 0;
17594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
17604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        strcpy(output_phone_string[num_out++], LTS_MARKER_PRON_START);
17614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        if (num_out >= max_phone_length) {
17624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          nRes = SWIsltsMaxInputExceeded;
17634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project          goto CLEAN_UP;
17644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        }
17654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        was_in_phrase = 0;
17664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
17674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
17684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    else {
17694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      if (num_in_word < MAX_WORD_LEN-1) {
17704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        word[num_in_word++] = toupper(input_sentence[i]);
17714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project        was_in_phrase = 1;
17724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project      }
17734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    }
17744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  }
17754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  /*adjust syllable boundaries*/
17764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  adjust_syllable_boundaries(lts, output_phone_string, num_out, max_phone_length);
17774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *phone_length = num_out;
17794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return SWIsltsSuccess;
17804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project CLEAN_UP:
17824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  *phone_length = 0;
17844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return nRes;
17854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
17864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef USE_STATIC_SLTS
17884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid *lts_alloc(int num, int size)
17894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
17904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifdef NO_STDERR
17914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PrintError("USE_STATIC_SLTS: lts_alloc should not be called", NULL, NULL, NULL);
17924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
17934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project    PLogError(L("USE_STATIC_SLTS: lts_alloc should not be called"));
17944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif
17954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return NULL;
17964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
17974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#else
17984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project
17994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectvoid *lts_alloc(int num, int size)
18004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{
18014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  void *p;
18024a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  p = CALLOC(num, size, MTAG);
18034a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project  return p;
18044a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project}
18054a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif /* USE_STATIC_SLTS */
1806