FreeCalypso > hg > fc-magnetite
view src/aci2/bmi/mmiDictionary.c @ 614:7ca17426c890
doc/C1xx-Howto: fc-host-tools-latest symlink
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 29 Jun 2019 02:00:16 +0000 |
parents | 3c2acfa1a72f |
children |
line wrap: on
line source
/******************************************************************************* CONDAT (UK) ******************************************************************************** This software product is the property of Condat (UK) Ltd and may not be disclosed to any third party without the express permission of the owner. ******************************************************************************** $Project name: Basic MMI $Project code: BMI $Module: MMI $File: Dixtionary.c $Revision: 1.0 $Author: Condat(UK) $Date: ******************************************************************************** Description: Predictive text dictionary functions. Interfaces between the Lation text editor and the EziText API. ******************************************************************************** $History: Dictionary.c Aug 16, 2004 REF: CRR 24323 Deepa M.D Bug:Clenup of sprintf used for tracing Fix:Replace the char buf[]; sprintf (buf, "...", ...); TRACE_EVENT (buf); statements by TRACE_EVENT_PX 03/10/02 Replaced most of the file with version on 3.3.3 line (MC, SPR 1242) $End *******************************************************************************/ #define ENTITY_MFW /* includes */ #include <string.h> #include <stdio.h> #include <stdlib.h> #if defined (NEW_FRAME) #include "typedefs.h" #include "vsi.h" #include "pei.h" #include "custom.h" #include "gsm.h" #else #include "STDDEFS.H" #include "custom.h" #include "gsm.h" #include "vsi.h" #endif //#include "MmiBookShared.h" #include "MmiBlkLangDB.h" #include "MmiDictionary.h" #include "zi8api.h" #include "mfw_kbd.h" /************************************ MACROS****************************************/ #define MAX_NO_OF_ELEMENTS 12 #define CANDIDATES_PER_GROUP 1 /************************************* Data Type definitions ****************************/ typedef struct dict_data_ { ZI8GETPARAM getParam; //global ezitext data structure int no_of_candidates; int candidate_cursor; int more_count; } dict_data; /*MC, SPR 1150 - Added data structure definitions*/ typedef struct { UBYTE condat_lang; /*Condat language code e.g. ENGLISH LANGAUGE*/ UBYTE zi_lang; /*Zi library language code */ UBYTE zi_sub_lang; /*Zi library sub-language code e.g. British English*/ }lang_code_table_entry; typedef struct { UBYTE no_of_entries; lang_code_table_entry* entries; }lang_code_table; /*MC end*/ /*************************************Global Variables***********************************/ ZI8WCHAR element_buffer[MAX_NO_OF_ELEMENTS]; ZI8WCHAR candidates_buffer[MAX_NO_OF_ELEMENTS*CANDIDATES_PER_GROUP]; static dict_data Dictionary; /*MC SPR 1150- hardcoded Language table*/ /*This is used to correlate the current language with the language settings needed for Ezitext*/ /*If we add new lanaguages, we just need to amend this table*/ lang_code_table_entry LangCodeTableEntries[] = { {ENGLISH_LANGUAGE, ZI8_LANG_EN, ZI8_SUBLANG_EN_UK}, {GERMAN_LANGUAGE, ZI8_LANG_DE, ZI8_SUBLANG_DEFAULT} }; lang_code_table LangCodeTable = { 2, LangCodeTableEntries}; /*************************************Prototypes***********************************/ void convert_chars_to_ascii(char* string, UBYTE language);/*SPR 1508*/ /******************************************************************************* $Function: Initialize_Dict $Description: Initialises Predictive Text libs $Returns: status int $Arguments: language, text entry mode(may be used for chinese e.g. pinyin/stroke) *******************************************************************************/ int Initialize_Dict(UBYTE language, UBYTE entry_mode) { int i; Zi8Initialize(); /*MC, SPR 1150- more generic code for setting Zi library parameters*/ /* for each entry in language table*/ for(i=0; i< LangCodeTable.no_of_entries; i++) {/*if current language in table*/ if (LangCodeTable.entries[i].condat_lang == language) { /*use Zi language definitions*/ Dictionary.getParam.Language = LangCodeTable.entries[i].zi_lang; Dictionary.getParam.SubLanguage = LangCodeTable.entries[i].zi_sub_lang; break; } } /*if no entry found*/ if (i>=LangCodeTable.no_of_entries) return 1; /*exit with error code*/ Dictionary.getParam.GetMode = ZI8_GETMODE_DEFAULT; Dictionary.getParam.SubLanguage = ZI8_SUBLANG_EN_ALL; Dictionary.getParam.Context = ZI8_GETCONTEXT_DEFAULT; Dictionary.getParam.GetOptions = ZI8_GETOPTION_STRINGS; Dictionary.getParam.pElements = element_buffer; Dictionary.getParam.pCandidates = candidates_buffer; Dictionary.getParam.MaxCandidates = CANDIDATES_PER_GROUP + 1; Dictionary.getParam.pScratch = NULL; Dictionary.getParam.FirstCandidate = 0; memset(element_buffer, 0, MAX_NO_OF_ELEMENTS*sizeof(ZI8WCHAR)); memset(candidates_buffer, 0, MAX_NO_OF_ELEMENTS*CANDIDATES_PER_GROUP); Dictionary.getParam.ElementCount = 0; Dictionary.more_count = 0; Dictionary.no_of_candidates = 0; Dictionary.candidate_cursor = 0; return 0; } /******************************************************************************* $Function: DictAlphaKeyPress $Description: Passes keypress to pred text lib and puts first match into string param $Returns: status int $Arguments: keycode, string *******************************************************************************/ int DictAlphaKeyPress(UBYTE keycode, char* first_candidate) { ZI8WCHAR new_keycode; //convert keycode to Ezitext code switch (keycode) { case KCD_1: new_keycode = ZI8_CODE_LATIN_PUNCT; break; case KCD_2: new_keycode = ZI8_CODE_LATIN_ABC; break; case KCD_3: new_keycode = ZI8_CODE_LATIN_DEF; break; case KCD_4: new_keycode = ZI8_CODE_LATIN_GHI; break; case KCD_5: new_keycode = ZI8_CODE_LATIN_JKL; break; case KCD_6: new_keycode = ZI8_CODE_LATIN_MNO; break; case KCD_7: new_keycode = ZI8_CODE_LATIN_PQRS; break; case KCD_8: new_keycode = ZI8_CODE_LATIN_TUV; break; case KCD_9: new_keycode = ZI8_CODE_LATIN_WXYZ; break; default: break; } /*MC, SPR 1150 - removed any code for chinese Pinyin from this function*/ //place in array of elements Dictionary.getParam.pElements[Dictionary.getParam.ElementCount++] = new_keycode; Dictionary.more_count = 0; Dictionary.getParam.FirstCandidate = 0; //start new word search Dictionary.candidate_cursor = 0; Dictionary.no_of_candidates = Zi8GetCandidates(&Dictionary.getParam); if (Dictionary.no_of_candidates == 0) { TRACE_EVENT("NO candidates returned"); return DictBackSpace(first_candidate); } else { /***************************Go-lite Optimization changes Start***********************/ //Aug 16, 2004 REF: CRR 24323 Deepa M.D TRACE_EVENT_P1("No of candidates returned: %d", Dictionary.no_of_candidates); /***************************Go-lite Optimization changes end***********************/ } Zi8Copy((PZI8UCHAR)first_candidate, (&Dictionary.getParam), Dictionary.candidate_cursor); /*MC, SPR 1150 - removed any code for chinese Pinyin from this function*/ /*SPR 1508*/ if (Mmi_getCurrentLanguage() == GERMAN_LANGUAGE) convert_chars_to_ascii(first_candidate, Mmi_getCurrentLanguage()); /*return 0;*/ /* SH - '1' will now be returned if the key is accepted, 0 otherwise */ return 1; } /******************************************************************************* $Function: ResetDictSearch $Description: Resets dictionary search as match selected $Returns: status int $Arguments: none *******************************************************************************/ int ResetDictSearch() { Dictionary.getParam.ElementCount = 0; Dictionary.more_count = 0; Dictionary.no_of_candidates = 0; Dictionary.candidate_cursor = 0; return 0; } /******************************************************************************* $Function: MoreCandidates $Description: gets next (set of) candidate(s) $Returns: status int $Arguments: string, pointer to int(not used ATM) *******************************************************************************/ //get the next set of candidates //At the moment we only get one candidate at a time, but this allows us to get more than one int MoreCandidates(char* first_candidate, int* no_of_candidates) { ZI8UCHAR temp[MAX_NO_OF_ELEMENTS + 1]; //any more candidates to retrieve? if (Dictionary.no_of_candidates > CANDIDATES_PER_GROUP) { Dictionary.more_count++; Dictionary.getParam.FirstCandidate = Dictionary.more_count *CANDIDATES_PER_GROUP; Dictionary.no_of_candidates = Zi8GetCandidates(&Dictionary.getParam); Zi8Copy((PZI8UCHAR)first_candidate, &(Dictionary.getParam), Dictionary.candidate_cursor); //return first candidate in group } else { Dictionary.more_count = 0; Dictionary.getParam.FirstCandidate = 0; Dictionary.no_of_candidates = Zi8GetCandidates(&Dictionary.getParam); Zi8Copy((PZI8UCHAR)first_candidate, &(Dictionary.getParam), Dictionary.candidate_cursor); } /*SPR 1508*/ if (Mmi_getCurrentLanguage() == GERMAN_LANGUAGE) convert_chars_to_ascii(first_candidate, Mmi_getCurrentLanguage()); return 0; } /******************************************************************************* $Function: ConvertToKeyPresses $Description: Takes a string and sends it as keypresses to dictionary to start new search $Returns: status int $Arguments: input string, output string(first match) *******************************************************************************/ //takes in a string int ConvertToKeyPresses(char* string, char* first_candidate) { int no_of_chars; int i; ResetDictSearch(); no_of_chars = strlen(string); for (i=0; i < no_of_chars; i++) { switch (string[i]) { case ('A'): case ('a'): case ('B'): case ('b'): case ('C'): case ('c'): DictAlphaKeyPress(KCD_2, first_candidate); break; case ('D'): case ('d'): case ('E'): case ('e'): case ('F'): case ('f'): DictAlphaKeyPress(KCD_3, first_candidate); break; case ('G'): case ('g'): case ('H'): case ('h'): case ('I'): case ('i'): DictAlphaKeyPress(KCD_4, first_candidate); break; case ('J'): case ('j'): case ('K'): case ('k'): case ('L'): case ('l'): DictAlphaKeyPress(KCD_5, first_candidate); break; case ('M'): case ('m'): case ('N'): case ('n'): case ('O'): case ('o'): DictAlphaKeyPress(KCD_6, first_candidate); break; case ('P'): case ('p'): case ('Q'): case ('q'): case ('R'): case ('r'): case ('S'): case ('s'): DictAlphaKeyPress(KCD_7, first_candidate); break; case ('T'): case ('t'): case ('U'): case ('u'): case ('V'): case ('v'): DictAlphaKeyPress(KCD_8, first_candidate); break; case ('W'): case ('w'): case ('X'): case ('x'): case ('Y'): case ('y'): case ('Z'): case ('z'): DictAlphaKeyPress(KCD_9, first_candidate); break; default: DictAlphaKeyPress(KCD_1, first_candidate); break; } } Dictionary.no_of_candidates = Zi8GetCandidates(&Dictionary.getParam); Zi8Copy((PZI8UCHAR)first_candidate, &Dictionary.getParam, Dictionary.candidate_cursor); /*SPR1508*/ if (Mmi_getCurrentLanguage() == GERMAN_LANGUAGE) convert_chars_to_ascii(first_candidate, Mmi_getCurrentLanguage()); return 0; } /******************************************************************************* $Function: DictBackSpace $Description: Removes last char from list of elements in dictionary search $Returns: status int $Arguments: output string(first match) *******************************************************************************/ int DictBackSpace(char* first_candidate) { if (Dictionary.more_count != 0) { Dictionary.more_count --;} else if (Dictionary.getParam.ElementCount != 0) { //replace last element with 0 Dictionary.getParam.pElements[--Dictionary.getParam.ElementCount] = 0; } Dictionary.more_count = 0; Dictionary.getParam.FirstCandidate = 0; //start new word search Dictionary.candidate_cursor = 0; Dictionary.no_of_candidates = Zi8GetCandidates(&Dictionary.getParam); Zi8Copy((PZI8UCHAR)first_candidate, &Dictionary.getParam, Dictionary.candidate_cursor); /*SPR 1508*/ if (Mmi_getCurrentLanguage() == GERMAN_LANGUAGE) convert_chars_to_ascii(first_candidate, Mmi_getCurrentLanguage()); return 0; } /******************************************************************************* $Function: convert_chars_to_ascii $Description: Changes any language-specific chars from ezitext encoding to our ascii encoding. Added for SPR 1508. $Returns: none $Arguments: input string, language *******************************************************************************/ void convert_chars_to_ascii(char* string, UBYTE language) { switch(language) { case (GERMAN_LANGUAGE): { int i; for (i=0; i< strlen(string);i++) { switch (string[i]) { case (0x1e):string[i] = 225;break; /*SS*/ case (0x7B):string[i] = 132;break; /*a with umlaut*/ case (0x7c):string[i] = 148;break; /*o with umlaut*/ case (0x7e):string[i] = 154;break; /*u with umlaut*/ } } break; } } }