void apply_create_sigarray(struct apply_handle *h, struct fsm *net) { struct sigma *sig; struct fsm_state *fsm; int i, maxsigma; fsm = net->states; maxsigma = sigma_max(net->sigma); // Default size created at init, resized later if necessary h->sigmatch_array = xxcalloc(1024,sizeof(struct sigmatch_array)); h->sigmatch_array_size = 1024; h->sigs = xxmalloc(sizeof(char **)*(maxsigma+1)); h->has_flags = 0; h->flag_list = NULL; /* Malloc first array of trie and store trie ptrs to free later */ h->sigma_trie = xxcalloc(256,sizeof(struct sigma_trie)); h->sigma_trie_arrays = xxmalloc(sizeof(struct sigma_trie_arrays)); h->sigma_trie_arrays->arr = h->sigma_trie; h->sigma_trie_arrays->next = NULL; for (i=0;i<256;i++) (h->sigma_trie+i)->next = NULL; for (sig = h->gsigma; sig != NULL && sig->number != -1; sig = sig->next) { if (flag_check(sig->symbol)) { h->has_flags = 1; apply_add_flag(h, flag_get_name(sig->symbol)); } *(h->sigs+(sig->number)) = sig->symbol; /* Add sigma entry to trie */ if (sig->number > IDENTITY) { apply_add_sigma_trie(h, sig->number, sig->symbol); } } if (h->has_flags) { h->flag_lookup = xxmalloc(sizeof(struct flag_lookup)*(maxsigma+1)); for (i=0; i <= maxsigma; i++) { (h->flag_lookup+i)->type = 0; (h->flag_lookup+i)->name = NULL; (h->flag_lookup+i)->value = NULL; } for (sig = h->gsigma; sig != NULL ; sig = sig->next) { if (flag_check(sig->symbol)) { (h->flag_lookup+sig->number)->type = flag_get_type(sig->symbol); (h->flag_lookup+sig->number)->name = flag_get_name(sig->symbol); (h->flag_lookup+sig->number)->value = flag_get_value(sig->symbol); } } } }
struct flags *flag_extract (struct fsm *net) { struct sigma *sigma; struct flags *flags, *flagst; flags = NULL; for (sigma = net->sigma ; sigma != NULL; sigma = sigma->next) { if (flag_check(sigma->symbol)) { flagst = xxmalloc(sizeof(struct flags)); flagst->next = flags; flags = flagst; flags->type = flag_get_type(sigma->symbol); flags->name = flag_get_name(sigma->symbol); flags->value = flag_get_value(sigma->symbol); } } return(flags); }
void apply_create_sigarray(struct apply_handle *h, struct fsm *net) { struct sigma *sig; int i, maxsigma; maxsigma = sigma_max(net->sigma); h->sigma_size = maxsigma+1; // Default size created at init, resized later if necessary h->sigmatch_array = xxcalloc(1024,sizeof(struct sigmatch_array)); h->sigmatch_array_size = 1024; h->sigs = xxmalloc(sizeof(struct sigs)*(maxsigma+1)); h->has_flags = 0; h->flag_list = NULL; /* Malloc first array of trie and store trie ptrs to be able to free later */ /* when apply_clear() is called. */ h->sigma_trie = xxcalloc(256,sizeof(struct sigma_trie)); h->sigma_trie_arrays = xxmalloc(sizeof(struct sigma_trie_arrays)); h->sigma_trie_arrays->arr = h->sigma_trie; h->sigma_trie_arrays->next = NULL; for (i=0;i<256;i++) (h->sigma_trie+i)->next = NULL; for (sig = h->gsigma; sig != NULL && sig->number != -1; sig = sig->next) { if (flag_check(sig->symbol)) { h->has_flags = 1; apply_add_flag(h, flag_get_name(sig->symbol)); } (h->sigs+(sig->number))->symbol = sig->symbol; (h->sigs+(sig->number))->length = strlen(sig->symbol); /* Add sigma entry to trie */ if (sig->number > IDENTITY) { apply_add_sigma_trie(h, sig->number, sig->symbol, (h->sigs+(sig->number))->length); } } if (maxsigma >= IDENTITY) { (h->sigs+EPSILON)->symbol = "0"; (h->sigs+EPSILON)->length = 1; (h->sigs+UNKNOWN)->symbol = "?"; (h->sigs+UNKNOWN)->length = 1; (h->sigs+IDENTITY)->symbol = "@"; (h->sigs+IDENTITY)->length = 1; } if (h->has_flags) { h->flag_lookup = xxmalloc(sizeof(struct flag_lookup)*(maxsigma+1)); for (i=0; i <= maxsigma; i++) { (h->flag_lookup+i)->type = 0; (h->flag_lookup+i)->name = NULL; (h->flag_lookup+i)->value = NULL; } for (sig = h->gsigma; sig != NULL ; sig = sig->next) { if (flag_check(sig->symbol)) { (h->flag_lookup+sig->number)->type = flag_get_type(sig->symbol); (h->flag_lookup+sig->number)->name = flag_get_name(sig->symbol); (h->flag_lookup+sig->number)->value = flag_get_value(sig->symbol); } } apply_mark_flagstates(h); } }