--- stack/symbols.c 2003/08/05 09:09:51 1.4 +++ stack/symbols.c 2003/08/08 14:20:49 1.5 @@ -1,4 +1,5 @@ #include "stack.h" +#include "messages.h" /* Print newline. */ extern void nl(environment *env) @@ -304,8 +305,7 @@ /* Clear stack */ extern void clear(environment *env) { - while(env->head->type != empty) - toss(env); + env->head= new_val(env); } /* Forgets a symbol (remove it from the hash table) */ @@ -1463,3 +1463,127 @@ push_cstring(env, new_string); } +/* "fork" */ +extern void sx_666f726b(environment *env) +{ + push_int(env, fork()); +} + +/* "waitpid" */ +extern void sx_77616974706964(environment *env) +{ + + if(env->head->type==empty) { + printerr("Too Few Arguments"); + env->err= 1; + return; + } + + if(CAR(env->head)->type!=integer) { + printerr("Bad Argument Type"); + env->err= 2; + return; + } + + push_int(env, waitpid(CAR(env->head)->content.i, NULL, 0)); + swap(env); toss(env); +} + + +/* Discard the top element of the stack. */ +extern void toss(environment *env) +{ + if(env->head->type==empty) { + printerr("Too Few Arguments"); + env->err= 1; + return; + } + + env->head= CDR(env->head); /* Remove the top stack item */ +} + + +/* Quit stack. */ +extern void quit(environment *env) +{ + int i; + + env->head= new_val(env); + + if (env->err) return; + for(i= 0; isymbols[i]!= NULL) { + forget_sym(&(env->symbols[i])); + } + env->symbols[i]= NULL; + } + + env->gc_limit= 0; + gc_maybe(env); + + words(env); + + if(env->free_string!=NULL) + free(env->free_string); + +#ifdef __linux__ + muntrace(); +#endif + + exit(EXIT_SUCCESS); +} + + +/* List all defined words */ +extern void words(environment *env) +{ + symbol *temp; + int i; + + for(i= 0; isymbols[i]; + while(temp!=NULL) { +#ifdef DEBUG + if (temp->val != NULL && temp->val->gc.flag.protect) + printf("(protected) "); +#endif /* DEBUG */ + printf("%s ", temp->id); + temp= temp->next; + } + } +} + + +/* Only to be called by itself function printstack. */ +void print_st(environment *env, value *stack_head, long counter) +{ + if(CDR(stack_head)->type != empty) + print_st(env, CDR(stack_head), counter+1); + printf("%ld: ", counter); + print_val(env, CAR(stack_head), 0, NULL, stdout); + printf("\n"); +} + + +/* Prints the stack. */ +extern void printstack(environment *env) +{ + if(env->head->type == empty) { + printf("Stack Empty\n"); + return; + } + + print_st(env, env->head, 1); +} + + +extern void copying(environment *env) +{ + printf(license_message); +} + + +extern void warranty(environment *env) +{ + printf(warranty_message); +}