00001
00023
00024
00025
00026
00027
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
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
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
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
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
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
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 }