зеркало из
https://github.com/iharh/notes.git
synced 2025-10-29 12:46:06 +02:00
86 строки
1.9 KiB
Plaintext
86 строки
1.9 KiB
Plaintext
// foma.h
|
|
|
|
/** User stack */
|
|
struct stack_entry {
|
|
int number;
|
|
struct apply_handle *ah;
|
|
struct apply_med_handle *amedh;
|
|
struct fsm *fsm;
|
|
struct stack_entry *next;
|
|
struct stack_entry *previous;
|
|
};
|
|
|
|
// stack.c
|
|
|
|
extern int quiet_mode;
|
|
|
|
struct stack_entry *main_stack;
|
|
|
|
int stack_size() {
|
|
int i;
|
|
struct stack_entry *stack_ptr;
|
|
for (i=0, stack_ptr = main_stack; stack_ptr->next != NULL; i++)
|
|
stack_ptr = stack_ptr->next;
|
|
return i;
|
|
}
|
|
|
|
int stack_init() {
|
|
main_stack = xxmalloc(sizeof(struct stack_entry));
|
|
main_stack->number = -1;
|
|
main_stack->fsm = NULL;
|
|
main_stack->next = NULL;
|
|
main_stack->previous = NULL;
|
|
return 1;
|
|
}
|
|
|
|
int stack_add(struct fsm *fsm) {
|
|
int i;
|
|
struct stack_entry *stack_ptr, *stack_ptr_previous;
|
|
stack_ptr_previous = NULL;
|
|
|
|
fsm_count(fsm);
|
|
if (strcmp(fsm->name,"") == 0)
|
|
sprintf(fsm->name, "%X",rand());
|
|
for (i=0, stack_ptr = main_stack; stack_ptr->number != -1; i++) {
|
|
stack_ptr_previous = stack_ptr;
|
|
stack_ptr = stack_ptr->next;
|
|
}
|
|
stack_ptr->next = xxmalloc(sizeof(struct stack_entry));
|
|
stack_ptr->fsm = fsm;
|
|
stack_ptr->ah = NULL;
|
|
stack_ptr->amedh = NULL;
|
|
stack_ptr->number = i;
|
|
stack_ptr->previous = stack_ptr_previous;
|
|
(stack_ptr->next)->number = -1;
|
|
(stack_ptr->next)->fsm = NULL;
|
|
(stack_ptr->next)->next = NULL;
|
|
(stack_ptr->next)->previous = stack_ptr;
|
|
if (!quiet_mode)
|
|
print_stats(fsm);
|
|
return(stack_ptr->number);
|
|
}
|
|
|
|
|
|
|
|
struct apply_handle *stack_get_ah() {
|
|
struct stack_entry *se;
|
|
se = stack_find_top();
|
|
if (se == NULL) {
|
|
return(NULL);
|
|
}
|
|
if (se->ah == NULL) {
|
|
se->ah = apply_init(se->fsm); // apply.c, !!!clb!!! simple data-race like a singleton
|
|
}
|
|
return(se->ah);
|
|
}
|
|
|
|
struct stack_entry *stack_find_top () {
|
|
struct stack_entry *stack_ptr;
|
|
if (main_stack->number == -1) {
|
|
return NULL;
|
|
}
|
|
for (stack_ptr = main_stack; (stack_ptr->next)->number != -1; stack_ptr = stack_ptr->next);
|
|
return(stack_ptr);
|
|
}
|
|
|