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