зеркало из
				https://github.com/iharh/notes.git
				synced 2025-10-31 21:56:08 +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);
 | |
| }
 | |
| 
 | 
