Julius 4.2
|
00001 00047 /* 00048 * Copyright (c) 1991-2011 Kawahara Lab., Kyoto University 00049 * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology 00050 * Copyright (c) 2005-2011 Julius project team, Nagoya Institute of Technology 00051 * All rights reserved 00052 */ 00053 00054 #include <sent/stddefs.h> 00055 #include <sent/htk_hmm.h> 00056 #include <sent/ptree.h> 00057 00058 #define MAXLINEINHMMLIST 256 ///< Maximum line length in HMMList 00059 00068 boolean 00069 rdhmmlist(FILE *fp, HTK_HMM_INFO *hmminfo) 00070 { 00071 char *buf, *lname, *pname; 00072 HMM_Logical *new, *match; 00073 HTK_HMM_Data *mapped; 00074 boolean ok_flag = TRUE; 00075 int n; 00076 /* 1 column ... define HMM_Logical of the name as referring to HMM of the same name */ 00077 /* 2 column ... define HMM_Logical of the name "$1" which has pointer to $2 */ 00078 00079 buf = (char *)mymalloc(MAXLINEINHMMLIST); 00080 n = 0; 00081 while (getl(buf, MAXLINEINHMMLIST, fp) != NULL) { 00082 n++; 00083 if ((lname = strtok(buf, DELM)) == NULL) { 00084 jlog("Error: rdhmmlist: failed to parse, corrupted or invalid data?\n"); 00085 return FALSE; 00086 } 00087 if (strlen(lname) >= MAX_HMMNAME_LEN) { 00088 jlog("Error: rdhmmlist: %d: name too long: \"%s\"\n", n, lname); 00089 jlog("Error: rdhmmlist: try increase value of MAX_HMMNAME_LEN\n"); 00090 return FALSE; 00091 } 00092 pname = strtok(NULL, DELM); 00093 if (pname == NULL) { 00094 /* 1 column */ 00095 mapped = htk_hmmdata_lookup_physical(hmminfo, lname); 00096 if (mapped == NULL) { 00097 jlog("Error: rdhmmlist: line %d: physical HMM \"%s\" not found\n", n, lname); 00098 ok_flag = FALSE; 00099 continue; 00100 } 00101 } else { 00102 /* 2 column */ 00103 mapped = htk_hmmdata_lookup_physical(hmminfo, pname); 00104 if (strlen(pname) >= MAX_HMMNAME_LEN) { 00105 jlog("Error: rdhmmlist: %d: name too long: \"%s\"\n", n, pname); 00106 jlog("Error: rdhmmlist: please increase MAX_HMMNAME_LEN (%d) and re-compile\n", MAX_HMMNAME_LEN); 00107 return FALSE; 00108 } 00109 if (mapped == NULL) { 00110 jlog("Error: rdhmmlist: line %d: physical HMM \"%s\" not found\n", n, pname); 00111 ok_flag = FALSE; 00112 continue; 00113 } 00114 } 00115 /* create new HMM_Logical */ 00116 new = (HMM_Logical *)mybmalloc2(sizeof(HMM_Logical), &(hmminfo->lroot)); 00117 new->name = mybstrdup2(lname, &(hmminfo->lroot)); 00118 new->is_pseudo = FALSE; 00119 new->body.defined = mapped; 00120 new->next = hmminfo->lgstart; 00121 hmminfo->lgstart = new; 00122 /* add index to search index tree */ 00123 if (hmminfo->logical_root == NULL) { 00124 hmminfo->logical_root = aptree_make_root_node(new, &(hmminfo->lroot)); 00125 } else { 00126 match = aptree_search_data(new->name, hmminfo->logical_root); 00127 if (match != NULL && strmatch(match->name, new->name)) { 00128 jlog("Error: rdhmmlist: line %d: logical HMM \"%s\" duplicated\n", n, new->name); 00129 ok_flag = FALSE; 00130 } else { 00131 aptree_add_entry(new->name, new, match->name, &(hmminfo->logical_root), &(hmminfo->lroot)); 00132 } 00133 } 00134 00135 } 00136 00137 hmminfo->totallogicalnum = n; 00138 free(buf); 00139 00140 return(ok_flag); 00141 }