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, <s->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), <s->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