/** * @file voca_malloc.c * * * @brief 単語辞書構造体のメモリ割り付けと解放 * * * * @brief Memory allocation of word dictionary information * * * @author Akinobu LEE * @date Fri Feb 18 21:33:29 2005 * * $Revision: 1.7 $ * */ /* * 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 /** * Allocate a new word dictionary structure. * * @return pointer to the newly allocated WORD_INFO. */ WORD_INFO * word_info_new() { WORD_INFO *new; new = (WORD_INFO *)mymalloc(sizeof(WORD_INFO)); new->mroot = NULL; new->work = NULL; new->wname = NULL; new->woutput = NULL; new->wlen = NULL; new->wton = NULL; #ifdef CLASS_NGRAM new->cprob = NULL; #endif new->is_transparent = NULL; return(new); } /** * Free all informations in the WORD_INFO. * * @param winfo [i/o] word dictionary data to be freed. */ void word_info_free(WORD_INFO *winfo) { /* free each word info */ if (winfo->mroot != NULL) mybfree2(&(winfo->mroot)); /* free word info */ if (winfo->wname != NULL) free(winfo->wname); if (winfo->woutput != NULL) free(winfo->woutput); if (winfo->wlen != NULL) free(winfo->wlen); if (winfo->wton != NULL) free(winfo->wton); #ifdef CLASS_NGRAM if (winfo->cprob != NULL) free(winfo->cprob); #endif if (winfo->is_transparent != NULL) free(winfo->is_transparent); /* free whole */ free(winfo); } /** * Initialize a new word dictionary structure. * * @param winfo [i/o] word dictionary to be initialized. */ void winfo_init(WORD_INFO *winfo) { int n; n = MAXWSTEP; winfo->wlen = (unsigned char *)mymalloc(sizeof(unsigned char)*n); winfo->wname = (char **)mymalloc(sizeof(char *)*n); winfo->woutput = (char **)mymalloc(sizeof(char *)*n); winfo->wseq = (HMM_Logical ***)mymalloc(sizeof(HMM_Logical **)*n); winfo->wton = (WORD_ID *)mymalloc(sizeof(WORD_ID)*n); #ifdef CLASS_NGRAM winfo->cprob = (LOGPROB *)mymalloc(sizeof(LOGPROB)*n); winfo->cwnum = 0; #endif winfo->is_transparent = (boolean *)mymalloc(sizeof(boolean)*n); winfo->maxnum = n; winfo->num = 0; winfo->head_silwid = winfo->tail_silwid = WORD_INVALID; winfo->maxwn = 0; winfo->maxwlen = 0; winfo->errnum = 0; winfo->errph_root = NULL; } /** * Expand the word dictionary. * * @param winfo [i/o] word dictionary to be expanded. */ boolean winfo_expand(WORD_INFO *winfo) { int n; n = winfo->maxnum; if (n >= MAX_WORD_NUM) { jlog("Error: voca_malloc: maximum dict size exceeded limit (%d)\n", MAX_WORD_NUM); return FALSE; } n *= 2; if (n > MAX_WORD_NUM) n = MAX_WORD_NUM; winfo->wlen = (unsigned char *)myrealloc(winfo->wlen, sizeof(unsigned char)*n); winfo->wname = (char **)myrealloc(winfo->wname, sizeof(char *)*n); winfo->woutput = (char **)myrealloc(winfo->woutput, sizeof(char *)*n); winfo->wseq = (HMM_Logical ***)myrealloc(winfo->wseq, sizeof(HMM_Logical **)*n); winfo->wton = (WORD_ID *)myrealloc(winfo->wton, sizeof(WORD_ID)*n); #ifdef CLASS_NGRAM winfo->cprob = (LOGPROB *)myrealloc(winfo->cprob, sizeof(LOGPROB)*n); #endif winfo->is_transparent = (boolean *)myrealloc(winfo->is_transparent, sizeof(boolean)*n); winfo->maxnum = n; return TRUE; }