libsent/src/dfa/cpair.c

Go to the documentation of this file.
00001 
00023 /*
00024  * Copyright (c) 1991-2006 Kawahara Lab., Kyoto University
00025  * Copyright (c) 2000-2005 Shikano Lab., Nara Institute of Science and Technology
00026  * Copyright (c) 2005-2006 Julius project team, Nagoya Institute of Technology
00027  * All rights reserved
00028  */
00029 
00030 #include <sent/stddefs.h>
00031 #include <sent/dfa.h>
00032 
00034 static unsigned char cp_table[] = {
00035   0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
00036 };
00037 
00047 boolean
00048 dfa_cp(DFA_INFO *dfa, int i, int j)
00049 {
00050   /*return(dfa->cp[i][j]);*/
00051   return((dfa->cp[i][j>>3] & cp_table[j&7]) ? TRUE : FALSE);
00052 }
00053 
00062 boolean
00063 dfa_cp_begin(DFA_INFO *dfa, int i)
00064 {
00065   /*return(dfa->cp_begin[i]);*/
00066   return((dfa->cp_begin[i>>3] & cp_table[i&7]) ? TRUE : FALSE);
00067 }
00068 
00077 boolean
00078 dfa_cp_end(DFA_INFO *dfa, int i)
00079 {
00080   /*return(dfa->cp_end[i]);*/
00081   return((dfa->cp_end[i>>3] & cp_table[i&7]) ? TRUE : FALSE);
00082 }
00083 
00092 void
00093 set_dfa_cp(DFA_INFO *dfa, int i, int j, boolean value)
00094 {
00095   /*dfa->cp[i][j] = value;*/
00096   if (value) {
00097     dfa->cp[i][j>>3] |= cp_table[j&7];
00098   } else {
00099     dfa->cp[i][j>>3] &= ~ cp_table[j&7];
00100   }
00101 }
00102 
00111 void
00112 set_dfa_cp_begin(DFA_INFO *dfa, int i, boolean value)
00113 {
00114   /*dfa->cp_begin[i] = value;*/
00115   if (value) {
00116     dfa->cp_begin[i>>3] |= cp_table[i&7];
00117   } else {
00118     dfa->cp_begin[i>>3] &= ~ cp_table[i&7];
00119   }
00120 }
00121 
00130 void
00131 set_dfa_cp_end(DFA_INFO *dfa, int i, boolean value)
00132 {
00133   /*dfa->cp_end[i] = value;*/
00134   if (value) {
00135     dfa->cp_end[i>>3] |= cp_table[i&7];
00136   } else {
00137     dfa->cp_end[i>>3] &= ~ cp_table[i&7];
00138   }
00139 }
00140 
00146 void
00147 init_dfa_cp(DFA_INFO *dfa)
00148 {
00149   dfa->cp_root = NULL;
00150   dfa->cp = NULL;
00151   dfa->cp_begin = NULL;
00152   dfa->cp_end = NULL;
00153 }
00154 
00161 void
00162 malloc_dfa_cp(DFA_INFO *dfa, int term_num)
00163 {
00164   int i, j, x;
00165 
00166   x = (term_num + 7) >> 3;
00167   dfa->cp_root = (unsigned char *)mymalloc(sizeof(unsigned char) * term_num * x);
00168   dfa->cp = (unsigned char **)mymalloc(sizeof(unsigned char *) * term_num);
00169   for(i=0;i<term_num;i++) {
00170     dfa->cp[i] = &(dfa->cp_root[x*i]);
00171     for(j=0;j<term_num;j++) {
00172       set_dfa_cp(dfa, i, j, FALSE);
00173     }
00174   }
00175   dfa->cp_begin = (unsigned char *)mymalloc(sizeof(unsigned char) * x);
00176   dfa->cp_end = (unsigned char *)mymalloc(sizeof(unsigned char) * x);
00177   for(i=0;i<term_num;i++) {
00178     set_dfa_cp_begin(dfa, i, FALSE);
00179     set_dfa_cp_end(dfa, i, FALSE);
00180   }
00181   dfa->term_num = term_num;
00182 }
00183 
00192 void
00193 realloc_dfa_cp(DFA_INFO *dfa, int old_term_num, int new_term_num)
00194 {
00195   int i, j, n, x, old_x;
00196   unsigned char *oldroot, *oldbegin, *oldend;
00197   unsigned char **oldcp;
00198 
00199   if (dfa->cp == NULL) {
00200     malloc_dfa_cp(dfa, new_term_num);
00201     return;
00202   }
00203 
00204   x = (new_term_num + 7) >> 3;
00205   old_x = (old_term_num + 7) >> 3;
00206 
00207   oldroot = dfa->cp_root;
00208   oldcp   = dfa->cp;
00209   
00210   dfa->cp_root = (unsigned char *)mymalloc(sizeof(unsigned char) * new_term_num * x);
00211   dfa->cp = (unsigned char **)mymalloc(sizeof(unsigned char *) * new_term_num);
00212   for(i=0;i<new_term_num;i++) {
00213     dfa->cp[i] = &(dfa->cp_root[x*i]);
00214   }
00215   for(i=0;i<old_term_num;i++) {
00216     for(n=0;n<old_x;n++) {
00217       dfa->cp[i][n] = oldcp[i][n];
00218     }
00219   }
00220   for(i=old_term_num;i<new_term_num;i++) {
00221     for(j=0;j<old_term_num;j++) {
00222       set_dfa_cp(dfa, i, j, FALSE);
00223       set_dfa_cp(dfa, j, i, FALSE);
00224     }
00225     set_dfa_cp(dfa, i, i, FALSE);
00226   }
00227   free(oldcp);
00228   free(oldroot);
00229 
00230   oldbegin = dfa->cp_begin;
00231   oldend = dfa->cp_end;
00232   dfa->cp_begin = (unsigned char *)mymalloc(sizeof(unsigned char) * x);
00233   dfa->cp_end = (unsigned char *)mymalloc(sizeof(unsigned char) * x);
00234   for(n=0;n<old_x;n++) {
00235     dfa->cp_begin[n] = oldbegin[n];
00236     dfa->cp_end[n] = oldend[n];
00237   }
00238   for(i=old_term_num;i<new_term_num;i++) {
00239     set_dfa_cp_begin(dfa, i, FALSE);
00240     set_dfa_cp_end(dfa, i, FALSE);
00241   }
00242   free(oldbegin);
00243   free(oldend);
00244 
00245   dfa->term_num = new_term_num;
00246 }
00247 
00253 void
00254 free_dfa_cp(DFA_INFO *dfa)
00255 {
00256   if (dfa->cp != NULL) {
00257     free(dfa->cp_begin);
00258     free(dfa->cp_end);
00259     free(dfa->cp);
00260     free(dfa->cp_root);
00261   }
00262 }

Generated on Tue Dec 26 16:16:33 2006 for Julius by  doxygen 1.5.0