574 |
/* Make a list. */ |
/* Make a list. */ |
575 |
extern void pack(environment *env) |
extern void pack(environment *env) |
576 |
{ |
{ |
|
void* delimiter; |
|
577 |
stackitem *iterator, *temp; |
stackitem *iterator, *temp; |
578 |
value *pack; |
value *pack; |
579 |
|
|
|
delimiter= env->head->item->content.ptr; /* Get delimiter */ |
|
|
toss(env); |
|
|
|
|
580 |
iterator= env->head; |
iterator= env->head; |
581 |
|
|
582 |
if(iterator==NULL || iterator->item->content.ptr==delimiter) { |
if(iterator==NULL |
583 |
|
|| (iterator->item->type==symb |
584 |
|
&& ((symbol*)(iterator->item->content.ptr))->id[0]=='[')) { |
585 |
temp= NULL; |
temp= NULL; |
586 |
toss(env); |
toss(env); |
587 |
} else { |
} else { |
588 |
/* Search for first delimiter */ |
/* Search for first delimiter */ |
589 |
while(iterator->next!=NULL |
while(iterator->next!=NULL |
590 |
&& iterator->next->item->content.ptr!=delimiter) |
&& (iterator->next->item->type!=symb |
591 |
|
|| ((symbol*)(iterator->next->item->content.ptr))->id[0]!='[')) |
592 |
iterator= iterator->next; |
iterator= iterator->next; |
593 |
|
|
594 |
/* Extract list */ |
/* Extract list */ |
606 |
pack->content.ptr= temp; |
pack->content.ptr= temp; |
607 |
pack->refcount= 1; |
pack->refcount= 1; |
608 |
|
|
609 |
temp= malloc(sizeof(stackitem)); |
push_val(env, pack); |
|
temp->item= pack; |
|
|
|
|
|
push(env, temp); |
|
610 |
rev(env); |
rev(env); |
611 |
} |
} |
612 |
|
|
1141 |
/* 'to' */ |
/* 'to' */ |
1142 |
extern void to(environment *env) { |
extern void to(environment *env) { |
1143 |
int i, start, ending; |
int i, start, ending; |
1144 |
|
stackitem *temp_head; |
1145 |
|
value *temp_val; |
1146 |
|
|
1147 |
if((env->head)==NULL || env->head->next==NULL) { |
if((env->head)==NULL || env->head->next==NULL) { |
1148 |
printerr("Too Few Arguments"); |
printerr("Too Few Arguments"); |
1162 |
start= env->head->item->content.val; |
start= env->head->item->content.val; |
1163 |
toss(env); if(env->err) return; |
toss(env); if(env->err) return; |
1164 |
|
|
1165 |
push_sym(env, "["); |
temp_head= env->head; |
1166 |
|
env->head= NULL; |
1167 |
|
|
1168 |
if(ending>=start) { |
if(ending>=start) { |
1169 |
for(i= start; i<=ending; i++) |
for(i= ending; i>=start; i--) |
1170 |
push_int(env, i); |
push_int(env, i); |
1171 |
} else { |
} else { |
1172 |
for(i= start; i>=ending; i--) |
for(i= ending; i<=start; i++) |
1173 |
push_int(env, i); |
push_int(env, i); |
1174 |
} |
} |
1175 |
|
|
1176 |
push_sym(env, "["); |
temp_val= malloc(sizeof(value)); |
1177 |
pack(env); if(env->err) return; |
temp_val->content.ptr= env->head; |
1178 |
|
temp_val->refcount= 1; |
1179 |
|
temp_val->type= list; |
1180 |
|
env->head= temp_head; |
1181 |
|
push_val(env, temp_val); |
1182 |
} |
} |
1183 |
|
|
1184 |
/* Read a string */ |
/* Read a string */ |
1225 |
} else if(sscanf(env->in_string, symbform, match, rest) > 0) { |
} else if(sscanf(env->in_string, symbform, match, rest) > 0) { |
1226 |
push_sym(env, match); |
push_sym(env, match); |
1227 |
} else if(sscanf(env->in_string, ebrackform, rest) > 0) { |
} else if(sscanf(env->in_string, ebrackform, rest) > 0) { |
|
push_sym(env, "["); |
|
1228 |
pack(env); if(env->err) return; |
pack(env); if(env->err) return; |
1229 |
if(depth!=0) depth--; |
if(depth!=0) depth--; |
1230 |
} else if(sscanf(env->in_string, semicform, rest) > 0) { |
} else if(sscanf(env->in_string, semicform, rest) > 0) { |