Julius 4.1.5
libsent/src/hmminfo/read_binhmmlist.c
00001 
00047 /*
00048  * Copyright (c) 1991-2007 Kawahara Lab., Kyoto University
00049  * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
00050  * Copyright (c) 2005-2007 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 static boolean
00059 load_hmmlist_callback(void **data_p, void *data, FILE *fp)
00060 {
00061   HTK_HMM_INFO *hmminfo = data;
00062   HMM_Logical *new;
00063   int len;
00064   char buf[MAX_HMMNAME_LEN];
00065   HTK_HMM_Data *d;
00066 
00067   new = (HMM_Logical *)mybmalloc2(sizeof(HMM_Logical), &(hmminfo->lroot));
00068   if (myfread(&(new->is_pseudo), sizeof(boolean), 1, fp) < 1) return FALSE;
00069   if (myfread(&len, sizeof(int), 1, fp) < 1) return FALSE;
00070   new->name = (char *)mybmalloc2(len, &(hmminfo->lroot));
00071   if (myfread(new->name, len, 1, fp) < 1) return FALSE;
00072   if (myfread(&len, sizeof(int), 1, fp) < 1) return FALSE;
00073   if (myfread(buf, len, 1, fp) < 1) return FALSE;
00074   if (new->is_pseudo) {
00075     jlog("Error: sorry, pseudo logical phone saving not implemented yet\n");
00076     return FALSE;
00077   } else {
00078     d = htk_hmmdata_lookup_physical(hmminfo, buf);
00079     if (d == NULL) {
00080       jlog("Error: load_hmmlist_callback: no name \"%s\" in hmmdefs!\n", buf);
00081       return FALSE;
00082     }
00083     new->body.defined = d;
00084   }
00085   new->next = hmminfo->lgstart;
00086   hmminfo->lgstart = new;
00087 
00088   *data_p = new;
00089   
00090   return TRUE;
00091 }
00092 
00093 boolean
00094 load_hmmlist_bin(FILE *fp, HTK_HMM_INFO *hmminfo)
00095 {
00096   HMM_Logical *l;
00097   int n;
00098 
00099   if (aptree_read(fp, &(hmminfo->logical_root), &(hmminfo->lroot), hmminfo, load_hmmlist_callback) == FALSE) {
00100     jlog("Error: load_hmmlist_bin: failed to read hmmlist from binary file\n");
00101     return FALSE;
00102   }
00103   n = 0;
00104   for(l=hmminfo->lgstart;l;l=l->next) n++;
00105   hmminfo->totallogicalnum = n;
00106 
00107   return TRUE;
00108 }