--- stack/stack.c 2002/02/01 23:30:55 1.18 +++ stack/stack.c 2002/02/02 14:50:44 1.19 @@ -269,6 +269,42 @@ printerr("Not a function"); } +/* Make a list. */ +extern void pack(stackitem** stack_head) +{ + void* delimiter; + stackitem *iterator, *temp, *pack; + + if((*stack_head)==NULL) { + printerr("Stack empty"); + return; + } + + delimiter= (*stack_head)->content.ptr; /* Get delimiter */ + toss(stack_head); + + iterator= *stack_head; + + /* Search for first delimiter */ + while(iterator->next!=NULL && iterator->next->content.ptr!=delimiter) + iterator= iterator->next; + + /* Extract list */ + temp= *stack_head; + *stack_head= iterator->next; + iterator->next= NULL; + + if(*stack_head!=NULL && (*stack_head)->content.ptr==delimiter) + toss(stack_head); + + /* Push list */ + pack= malloc(sizeof(stackitem)); + pack->type= list; + pack->content.ptr= temp; + + push(stack_head, pack); +} + /* Parse input. */ int stack_read(stackitem** stack_head, hashtbl in_hash, char* in_line) { @@ -298,14 +334,22 @@ break; } /* If symbol */ - if((convert= sscanf(in_line, "%[^ ;\n\r]%[^\n\r]", temp, rest))) { + if((convert= sscanf(in_line, "%[^] ;\n\r]%[^\n\r]", temp, rest))) { push_ref(stack_head, in_hash, temp); break; } - /* If ';' */ - if((convert= sscanf(in_line, "%c%[^\n\r]", temp, rest)) && *temp==';') { - eval(stack_head); /* Evaluate top element */ - break; + /* If single char */ + if((convert= sscanf(in_line, "%c%[^\n\r]", temp, rest))) { + if(*temp==';') { + eval(stack_head); /* Evaluate top element */ + break; + } + + if(*temp==']') { + push_ref(stack_head, in_hash, "["); + pack(stack_head); + break; + } } } while(0); @@ -323,42 +367,6 @@ return 1; } -/* Make a list. */ -extern void pack(stackitem** stack_head) -{ - void* delimiter; - stackitem *iterator, *temp, *pack; - - if((*stack_head)==NULL) { - printerr("Stack empty"); - return; - } - - delimiter= (*stack_head)->content.ptr; /* Get delimiter */ - toss(stack_head); - - iterator= *stack_head; - - /* Search for first delimiter */ - while(iterator->next!=NULL && iterator->next->content.ptr!=delimiter) - iterator= iterator->next; - - /* Extract list */ - temp= *stack_head; - *stack_head= iterator->next; - iterator->next= NULL; - - if(*stack_head!=NULL && (*stack_head)->content.ptr==delimiter) - toss(stack_head); - - /* Push list */ - pack= malloc(sizeof(stackitem)); - pack->type= list; - pack->content.ptr= temp; - - push(stack_head, pack); -} - /* Relocate elements of the list on the stack. */ extern void expand(stackitem** stack_head) {