Julius 4.2
libsent/src/hmminfo/rdhmmlist.c
説明を見る。
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 }