mirror of https://github.com/openssl/openssl.git
				
				
				
			
		
			
	
	
		
			97 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
		
		
			
		
	
	
			97 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
|  | The stack data structure is used to store an ordered list of objects. | ||
|  | It is basically misnamed to call it a stack but it can function that way | ||
|  | and that is what I originally used it for.  Due to the way element | ||
|  | pointers are kept in a malloc()ed array, the most efficient way to use this | ||
|  | structure is to add and delete elements from the end via sk_pop() and | ||
|  | sk_push().  If you wish to do 'lookups' sk_find() is quite efficient since | ||
|  | it will sort the stack (if required) and then do a binary search to lookup  | ||
|  | the requested item.  This sorting occurs automatically so just sk_push() | ||
|  | elements on the stack and don't worry about the order.  Do remember that if | ||
|  | you do a sk_find(), the order of the elements will change. | ||
|  | 
 | ||
|  | You should never need to 'touch' this structure directly. | ||
|  | typedef struct stack_st | ||
|  | 	{ | ||
|  | 	unsigned int num; | ||
|  | 	char **data; | ||
|  | 	int sorted; | ||
|  | 
 | ||
|  | 	unsigned int num_alloc; | ||
|  | 	int (*comp)(); | ||
|  | 	} STACK; | ||
|  | 
 | ||
|  | 'num' holds the number of elements in the stack, 'data' is the array of | ||
|  | elements.  'sorted' is 1 is the list has been sorted, 0 if not. | ||
|  | 
 | ||
|  | num_alloc is the number of 'nodes' allocated in 'data'.  When num becomes | ||
|  | larger than num_alloc, data is realloced to a larger size. | ||
|  | If 'comp' is set, it is a function that is used to compare 2 of the items | ||
|  | in the stack.  The function should return -1, 0 or 1, depending on the | ||
|  | ordering. | ||
|  | 
 | ||
|  | #define sk_num(sk)	((sk)->num) | ||
|  | #define sk_value(sk,n)	((sk)->data[n]) | ||
|  | 
 | ||
|  | These 2 macros should be used to access the number of elements in the | ||
|  | 'stack' and to access a pointer to one of the values. | ||
|  | 
 | ||
|  | STACK *sk_new(int (*c)()); | ||
|  | 	This creates a new stack.  If 'c', the comparison function, is not | ||
|  | specified, the various functions that operate on a sorted 'stack' will not | ||
|  | work (sk_find()).  NULL is returned on failure. | ||
|  | 
 | ||
|  | void sk_free(STACK *); | ||
|  | 	This function free()'s a stack structure.  The elements in the | ||
|  | stack will not be freed so one should 'pop' and free all elements from the | ||
|  | stack before calling this function or call sk_pop_free() instead. | ||
|  | 
 | ||
|  | void sk_pop_free(STACK *st; void (*func)()); | ||
|  | 	This function calls 'func' for each element on the stack, passing | ||
|  | the element as the argument.  sk_free() is then called to free the 'stack' | ||
|  | structure. | ||
|  | 
 | ||
|  | int sk_insert(STACK *sk,char *data,int where); | ||
|  | 	This function inserts 'data' into stack 'sk' at location 'where'. | ||
|  | If 'where' is larger that the number of elements in the stack, the element | ||
|  | is put at the end.  This function tends to be used by other 'stack' | ||
|  | functions.  Returns 0 on failure, otherwise the number of elements in the | ||
|  | new stack. | ||
|  | 
 | ||
|  | char *sk_delete(STACK *st,int loc); | ||
|  | 	Remove the item a location 'loc' from the stack and returns it. | ||
|  | Returns NULL if the 'loc' is out of range. | ||
|  | 
 | ||
|  | char *sk_delete_ptr(STACK *st, char *p); | ||
|  | 	If the data item pointed to by 'p' is in the stack, it is deleted | ||
|  | from the stack and returned.  NULL is returned if the element is not in the | ||
|  | stack. | ||
|  | 
 | ||
|  | int sk_find(STACK *st,char *data); | ||
|  | 	Returns the location that contains a value that is equal to  | ||
|  | the 'data' item.  If the comparison function was not set, this function | ||
|  | does a linear search.  This function actually qsort()s the stack if it is not | ||
|  | in order and then uses bsearch() to do the initial search.  If the | ||
|  | search fails,, -1 is returned.  For mutliple items with the same | ||
|  | value, the index of the first in the array is returned. | ||
|  | 
 | ||
|  | int sk_push(STACK *st,char *data); | ||
|  | 	Append 'data' to the stack.  0 is returned if there is a failure | ||
|  | (due to a malloc failure), else 1.  This is  | ||
|  | sk_insert(st,data,sk_num(st)); | ||
|  | 
 | ||
|  | int sk_unshift(STACK *st,char *data); | ||
|  | 	Prepend 'data' to the front (location 0) of the stack.  This is | ||
|  | sk_insert(st,data,0); | ||
|  | 
 | ||
|  | char *sk_shift(STACK *st); | ||
|  | 	Return and delete from the stack the first element in the stack. | ||
|  | This is sk_delete(st,0); | ||
|  | 
 | ||
|  | char *sk_pop(STACK *st); | ||
|  | 	Return and delete the last element on the stack.  This is | ||
|  | sk_delete(st,sk_num(sk)-1); | ||
|  | 
 | ||
|  | void sk_zero(STACK *st); | ||
|  | 	Removes all items from the stack.  It does not 'free' | ||
|  | pointers but is a quick way to clear a 'stack of references'. |