• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*---------------------------------------------------------------------------*
2  *  voc_basi.c  *
3  *                                                                           *
4  *  Copyright 2007, 2008 Nuance Communciations, Inc.                               *
5  *                                                                           *
6  *  Licensed under the Apache License, Version 2.0 (the 'License');          *
7  *  you may not use this file except in compliance with the License.         *
8  *                                                                           *
9  *  You may obtain a copy of the License at                                  *
10  *      http://www.apache.org/licenses/LICENSE-2.0                           *
11  *                                                                           *
12  *  Unless required by applicable law or agreed to in writing, software      *
13  *  distributed under the License is distributed on an 'AS IS' BASIS,        *
14  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
15  *  See the License for the specific language governing permissions and      *
16  *  limitations under the License.                                           *
17  *                                                                           *
18  *---------------------------------------------------------------------------*/
19 
20 #include <stdlib.h>
21 #include <string.h>
22 #ifndef _RTT
23 #include <stdio.h>
24 #endif
25 
26 #ifdef unix
27 #include <unistd.h>
28 #endif
29 #include <assert.h>
30 
31 
32 #include "simapi.h"
33 #include "portable.h"
34 
35 static const char voc_basi[] = "$Id: voc_basi.c,v 1.11.6.14 2008/01/21 20:30:05 dahan Exp $";
36 
37 #define ADD_SUNDRY_LABELS 0
38 #define ALLOW_UNDERSCORES       1
39 #define MAX_WORD_LEN 128
40 
CA_AllocateVocabulary(void)41 CA_Vocab *CA_AllocateVocabulary(void)
42 {
43   CA_Vocab *hVocab = NULL;
44 
45   TRY_CA_EXCEPT
46 
47   hVocab = (CA_Vocab *) CALLOC_CLR(1, sizeof(CA_Vocab), "ca.hVocab");
48   hVocab->is_loaded = False;
49   hVocab->ca_rtti = CA_VOCABULARY_SIGNATURE;
50   return (hVocab);
51 
52   BEG_CATCH_CA_EXCEPT
53   END_CATCH_CA_EXCEPT(hVocab)
54 }
55 
56 
CA_FreeVocabulary(CA_Vocab * hVocab)57 void CA_FreeVocabulary(CA_Vocab *hVocab)
58 {
59   TRY_CA_EXCEPT
60   ASSERT(hVocab);
61   FREE((char *) hVocab);
62   return;
63 
64   BEG_CATCH_CA_EXCEPT
65   END_CATCH_CA_EXCEPT(hVocab)
66 }
67 
CA_LoadDictionary(CA_Vocab * hVocab,const LCHAR * vocname,char * phtname,ESR_Locale * locale)68 void CA_LoadDictionary(CA_Vocab *hVocab, const LCHAR *vocname, char *phtname, ESR_Locale* locale)
69 {
70   TRY_CA_EXCEPT
71 #ifndef _RTT
72 
73   ASSERT(hVocab);
74 //  if (phtname != NULL && strlen(phtname) > 0)
75 //  hVocab->voc.pht_table= read_phoneme_table (phtname);
76 
77   if (0 <= read_word_transcription(vocname, &hVocab->voc, locale)) {
78     hVocab->is_loaded = True;
79   } else {
80     hVocab->is_loaded = False;
81   }
82   return;
83 #else
84   log_report("RTT not in module\n");
85   SERVICE_ERROR(FEATURE_NOT_SUPPORTED);
86   return;
87 #endif
88 
89   BEG_CATCH_CA_EXCEPT
90   END_CATCH_CA_EXCEPT(hVocab)
91 }
92 
CA_UnloadDictionary(CA_Vocab * hVocab)93 void CA_UnloadDictionary(CA_Vocab *hVocab)
94 {
95   TRY_CA_EXCEPT
96   ASSERT(hVocab);
97   if (hVocab->is_loaded == False)
98     SERVICE_ERROR(VOCAB_NOT_LOADED);
99 
100   delete_word_transcription(&hVocab->voc);
101 
102   hVocab->is_loaded = False;
103   return;
104 
105   BEG_CATCH_CA_EXCEPT
106   END_CATCH_CA_EXCEPT(hVocab)
107 }
108 
109 
CA_CheckEntryInDictionary(CA_Vocab * hVocab,const char * label)110 int CA_CheckEntryInDictionary(CA_Vocab *hVocab, const char *label)
111 {
112   int pronCount;
113   char prons[256];
114   TRY_CA_EXCEPT
115   ASSERT(hVocab);
116 
117   pronCount = get_prons(&hVocab->voc, label, prons, sizeof(prons));
118 
119   if (pronCount <= 0) {
120     /* try lower case, the general convention for dictionaries */
121     unsigned i;
122     char lower[128];
123     for (i = 0; label[i]; i++) {
124       if (i >= sizeof(lower) - 1) return -1;
125       lower[i] = tolower(label[i]);
126     }
127     lower[i] = 0;
128     pronCount = get_prons(&hVocab->voc, lower, prons, sizeof(prons));
129     if (pronCount <= 0) return False;
130   }
131 
132   return (True);
133 
134   BEG_CATCH_CA_EXCEPT
135   END_CATCH_CA_EXCEPT(hVocab)
136 }
137 
138 int CA_GetFullEntryInDictionary(CA_Vocab *hVocab, const char *label, char *pron, int *pronSize, int pronMaxSize);
139 
CA_GetEntryInDictionary(CA_Vocab * hVocab,const char * label,char * pron,int * pronSize,int pronMaxSize)140 int CA_GetEntryInDictionary(CA_Vocab *hVocab, const char *label, char *pron, int *pronSize, int pronMaxSize)
141 {
142   int rc;
143   TRY_CA_EXCEPT
144   ASSERT(hVocab);
145   rc = CA_GetFullEntryInDictionary(hVocab, label, pron, pronSize, pronMaxSize);
146   return rc;
147   BEG_CATCH_CA_EXCEPT
148   END_CATCH_CA_EXCEPT(hVocab)
149 }
150 
151 /* this looks up the entry entire, underscores and all, eg "good_bye" */
152 
CA_GetFullEntryInDictionary(CA_Vocab * hVocab,const char * label,char * pron,int * pronSize,int pronMaxSize)153 int CA_GetFullEntryInDictionary(CA_Vocab *hVocab, const char *label, char *pron, int *pronSize, int pronMaxSize)
154 {
155   TRY_CA_EXCEPT
156   int pronCount;
157 
158   ASSERT(hVocab);
159 
160   pronCount = get_prons(&hVocab->voc, label, pron, pronMaxSize);
161   if (pronCount <= 0)
162   {
163     /* try lower case, the general convention for dictionaries */
164     unsigned i;
165     char lower[128];
166     for (i = 0; label[i]; i++) {
167       if (i >= sizeof(lower) - 1) return -1;
168       lower[i] = tolower((unsigned char)label[i]);
169     }
170     lower[i] = 0;
171     pronCount = get_prons(&hVocab->voc, lower, pron, pronMaxSize);
172     if (pronCount <= 0) return False;
173   }
174   //*pronSize = pronCount;
175 
176   return (True);
177 
178   BEG_CATCH_CA_EXCEPT
179     END_CATCH_CA_EXCEPT(hVocab)
180 }
181