--- stack/stack.c 2002/01/09 05:01:24 1.13 +++ stack/stack.c 2002/01/31 19:51:12 1.14 @@ -25,6 +25,8 @@ typedef stackitem* hashtbl[HASHTBLSIZE]; typedef void (*funcp)(stackitem**); + +/* Initiates a newly created hash table. */ void init_hashtbl(hashtbl out_hash) { long i; @@ -33,6 +35,7 @@ out_hash[i]= NULL; } +/* Returns a pointer to an element in the hash table. */ stackitem** hash(hashtbl in_hashtbl, const char* in_string) { long i= 0; @@ -61,7 +64,7 @@ } } - +/* Generic push function. */ int push(stackitem** stack_head, stackitem* in_item) { in_item->next= *stack_head; @@ -69,6 +72,7 @@ return 1; } +/* Push a value on the stack. */ int push_val(stackitem** stack_head, int in_val) { stackitem* new_item= malloc(sizeof(stackitem)); @@ -79,6 +83,7 @@ return 1; } +/* Copy a string onto the stack. */ int push_cstring(stackitem** stack_head, const char* in_string) { stackitem* new_item= malloc(sizeof(stackitem)); @@ -90,6 +95,7 @@ return 1; } +/* Create a new hash entry. */ int mk_hashentry(hashtbl in_hashtbl, stackitem* in_item, const char* id) { in_item->id= malloc(strlen(id)+1); @@ -100,6 +106,7 @@ return 1; } +/* Define a function a new function in the hash table. */ void def_func(hashtbl in_hashtbl, funcp in_func, const char* id) { stackitem* temp= malloc(sizeof(stackitem)); @@ -110,6 +117,7 @@ mk_hashentry(in_hashtbl, temp, id); } +/* Define a new symbol in the hash table. */ void def_sym(hashtbl in_hashtbl, const char* id) { stackitem* temp= malloc(sizeof(stackitem)); @@ -119,6 +127,7 @@ mk_hashentry(in_hashtbl, temp, id); } +/* Push a reference to an entry in the hash table onto the stack. */ int push_ref(stackitem** stack_head, hashtbl in_hash, const char* in_string) { static void* handle= NULL; @@ -146,6 +155,7 @@ return 1; } +/* Discard the top element of the stack. */ extern void toss(stackitem** stack_head) { stackitem* temp= *stack_head; @@ -160,11 +170,13 @@ free(temp); } +/* Print newline. */ extern void nl() { printf("\n"); } +/* Prints the top element of the stack. */ void print_(stackitem** stack_head) { if((*stack_head)==NULL) @@ -187,13 +199,14 @@ } } +/* Prints the top element of the stack and then discards it. */ extern void print(stackitem** stack_head) { print_(stack_head); toss(stack_head); } -/* print_stack(stack); */ +/* Only to be called by function printstack. */ void print_st(stackitem* stack_head, long counter) { if(stack_head->next != NULL) @@ -204,6 +217,7 @@ nl(); } +/* Prints the stack. */ extern void printstack(stackitem** stack_head) { if(*stack_head != NULL) { @@ -212,7 +226,9 @@ } } - +/* If the top element is a reference, determine if it's a reference to a + function, and if it is execute and pop the reference and execute the + function. */ extern void eval(stackitem** stack_head) { funcp in_func; @@ -228,6 +244,7 @@ } } +/* Parse input. */ int stack_read(stackitem** stack_head, hashtbl in_hash, char* in_line) { char *temp, *rest; @@ -263,6 +280,7 @@ return 1; } +/* Make a list. */ extern void pack(stackitem** stack_head) { void* delimiter; @@ -293,6 +311,7 @@ push(stack_head, pack); } +/* Push elements of the list on the stack. */ extern void expand(stackitem** stack_head) { stackitem *temp, *new_head; @@ -310,6 +329,7 @@ *stack_head= new_head; } +/* Swap the two top elements on the stack. */ extern void swap(stackitem** stack_head) { stackitem* temp= (*stack_head); @@ -322,6 +342,7 @@ (*stack_head)->next= temp; } +/* Compares two elements by reference. */ extern void eq(stackitem** stack_head) { void *left, *right; @@ -339,6 +360,7 @@ push_val(stack_head, (left==right)); } +/* Negates the top element on the stack. */ extern void not(stackitem** stack_head) { int value; @@ -351,12 +373,15 @@ push_val(stack_head, !value); } +/* Compares the two top elements on the stack and return 0 if they're the + same. */ extern void neq(stackitem** stack_head) { eq(stack_head); not(stack_head); } +/* Give a symbol some content. */ extern void def(stackitem** stack_head) { stackitem *temp, *value; @@ -374,6 +399,7 @@ toss(stack_head); toss(stack_head); } +/* Quit stack. */ extern void quit() { exit(EXIT_SUCCESS);