/**
* @file write_hmmlist.c
*
*
* @brief HMMListファイルをバイナリ形式で出力する
*
*
*
* @brief Write HMMList data to binary file
*
*
*
* @author Akinobu LEE
* @date Wed Feb 16 04:04:23 2005
*
* $Revision: 1.4 $
*
*/
/*
* Copyright (c) 1991-2012 Kawahara Lab., Kyoto University
* Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
* Copyright (c) 2005-2012 Julius project team, Nagoya Institute of Technology
* All rights reserved
*/
#include
#include
#include
/**
* Callback to write hmmlist data into file.
*
* @param data [in] hmmlist node data
* @param fp [in] file pointer to write
*
* @return TRUE on success, FALSE on failure.
*/
static boolean
save_hmmlist_callback(void *data, FILE *fp)
{
HMM_Logical *l = data;
char *s;
int len;
if (myfwrite(&(l->is_pseudo), sizeof(boolean), 1, fp) < 1) return FALSE;
len = strlen(l->name) + 1;
if (myfwrite(&len, sizeof(int), 1, fp) < 1) return FALSE;
if (myfwrite(l->name, len, 1, fp) < 1) return FALSE;
if (l->is_pseudo) {
s = l->body.pseudo->name;
} else {
s = l->body.defined->name;
}
len = strlen(s) + 1;
if (myfwrite(&len, sizeof(int), 1, fp) < 1) return FALSE;
if (myfwrite(s, len, 1, fp) < 1) return FALSE;
return TRUE;
}
/**
* Callback to write cdset data into file.
*
* @param data [in] cdset node data
* @param fp [in] file pointer to write
*
* @return TRUE on success, FALSE on failure.
*/
static boolean
save_cdset_callback(void *data, FILE *fp)
{
CD_Set *cd = data;
int len;
int i, j;
len = strlen(cd->name) + 1;
if (myfwrite(&len, sizeof(int), 1, fp) < 1) return FALSE;
if (myfwrite(cd->name, len, 1, fp) < 1) return FALSE;
if (myfwrite(&(cd->tr->id), sizeof(int), 1, fp) < 1) return FALSE;
if (myfwrite(&(cd->state_num), sizeof(unsigned short), 1, fp) < 1) return FALSE;
for(i=0;istate_num;i++) {
if (myfwrite(&(cd->stateset[i].num), sizeof(unsigned short), 1, fp) < 1) return FALSE;
for(j=0;jstateset[i].num;j++) {
if (myfwrite(&(cd->stateset[i].s[j]->id), sizeof(int), 1, fp) < 1) return FALSE;
}
}
return TRUE;
}
/**
* Write hmmlist (logical-to-physical mapping table) and
* cdset (pseudo phone set) to file.
*
* @param fp [in] file pointer to write
* @param hmminfo [in] HMM definition data
*
* @return TRUE on success, FALSE on failure.
*/
boolean
save_hmmlist_bin(FILE *fp, HTK_HMM_INFO *hmminfo)
{
/* write 4 byte as NULL to auto detect file format at read time */
/* this mark will be read in init_hmminfo() */
int x = 0;
if (myfwrite(&x, sizeof(int), 1, fp) < 1) {
jlog("Error: save_hmmlist_bin: failed to write hmmlist to binary file\n");
return FALSE;
}
/* write hmmlist */
if (aptree_write(fp, hmminfo->logical_root, save_hmmlist_callback) == FALSE) {
jlog("Error: save_hmmlist_bin: failed to write hmmlist to binary file\n");
return FALSE;
}
/* write cdset */
if (aptree_write(fp, hmminfo->cdset_info.cdtree, save_cdset_callback) == FALSE) {
jlog("Error: save_hmmlist_bin: failed to write cdset to binary file\n");
return FALSE;
}
return TRUE;
}