/** * @file mkterminfo.c * * * @brief カテゴリごとの単語のリストを作成する * * * * @brief Make a word list for each category * * * @author Akinobu LEE * @date Tue Feb 15 14:47:27 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 /* construct table: terminal(category) ID -> word list */ /** * Make a word list for each category. * * @param tinfo [i/o] terminal data structure to hold the result * @param dinfo [in] DFA gammar to supply the number of category in the grammar * @param winfo [in] word dictionary. */ void make_terminfo(TERM_INFO *tinfo, DFA_INFO *dinfo, WORD_INFO *winfo) { int i,w,t; int tnum; /* set terminal number */ tnum = tinfo->term_num = dinfo->term_num; /* allocate memory for the list of word num */ tinfo->wnum = (int *)mymalloc(sizeof(int) * tnum); /* count number of belonging words for each category */ for(i=0;iwnum[i]=0; for(w=0;wnum;w++) { tinfo->wnum[winfo->wton[w]]++; } /* allocate memory for the list body */ tinfo->tw = (WORD_ID **)mymalloc(sizeof(WORD_ID *) * tnum); for(i=0;itw[i] = (WORD_ID *)mymalloc(sizeof(WORD_ID) * tinfo->wnum[i]); } /* store the word to each corresponding list */ for(i=0;iwnum[i]=0; for(w=0;wnum;w++) { t = winfo->wton[w]; tinfo->tw[t][tinfo->wnum[t]] = w; tinfo->wnum[t]++; } } /** * Free word list for each category. * * @param tinfo [in] terminal data structure holding the content. * */ void free_terminfo(TERM_INFO *tinfo) { int i; if (tinfo->tw != NULL) { for(i=0;iterm_num;i++) { free(tinfo->tw[i]); } free(tinfo->tw); free(tinfo->wnum); } } /** * Append the terminal(category) word list. * * @param dst [i/o] category data * @param src [i/o] category data to be appended to @a dst * @param coffset [in] category id offset in @a dst where the new data should be stored * @param woffset [in] word id offset where the new data should be stored */ void terminfo_append(TERM_INFO *dst, TERM_INFO *src, int coffset, int woffset) { int t, new_termnum; int i, j; new_termnum = coffset + src->term_num; if (dst->tw == NULL) { dst->tw = (WORD_ID **)mymalloc(sizeof(WORD_ID *) * new_termnum); dst->wnum = (int *)mymalloc(sizeof(int) * new_termnum); } else { dst->tw = (WORD_ID **)myrealloc(dst->tw, sizeof(WORD_ID *) * new_termnum); dst->wnum = (int *)myrealloc(dst->wnum, sizeof(int) * new_termnum); } for(i=0;iterm_num;i++) { t = i + coffset; dst->wnum[t] = src->wnum[i]; dst->tw[t] = (WORD_ID *)mymalloc(sizeof(WORD_ID) * src->wnum[i]); for(j=0;jwnum[i];j++) { dst->tw[t][j] = src->tw[i][j] + woffset; } } dst->term_num = new_termnum; }