00001
00047
00048
00049
00050
00051
00052
00053
00054 #include <sent/stddefs.h>
00055 #include <sent/htk_hmm.h>
00056 #include <sent/ptree.h>
00057
00058 #define MAXLINEINHMMLIST 256
00059
00060
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
00077
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
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
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
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
00123 if (hmminfo->logical_root == NULL) {
00124 hmminfo->logical_root = aptree_make_root_node(new);
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));
00132 }
00133 }
00134
00135 }
00136
00137 hmminfo->totallogicalnum = n;
00138 free(buf);
00139 return(ok_flag);
00140 }