libsent/src/dfa/cpair.c

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

Generated on Tue Dec 18 15:59:54 2007 for Julius by  doxygen 1.5.4