8 |
#include <dlfcn.h> |
#include <dlfcn.h> |
9 |
/* strcmp, strcpy, strlen, strcat, strdup */ |
/* strcmp, strcpy, strlen, strcat, strdup */ |
10 |
#include <string.h> |
#include <string.h> |
11 |
|
/* mtrace, muntrace */ |
12 |
|
#include <mcheck.h> |
13 |
|
|
14 |
#define HASHTBLSIZE 2048 |
#define HASHTBLSIZE 2048 |
15 |
|
|
105 |
break; |
break; |
106 |
case integer: |
case integer: |
107 |
case func: |
case func: |
108 |
|
break; |
109 |
case symb: |
case symb: |
110 |
|
free(((symbol*)(val->content.ptr))->id); |
111 |
|
if(((symbol*)(val->content.ptr))->val!=NULL) |
112 |
|
free_val(((symbol*)(val->content.ptr))->val); |
113 |
|
free(val->content.ptr); |
114 |
break; |
break; |
115 |
} |
} |
116 |
if(val->id!=NULL) |
free(val); /* Free the actual value structure */ |
|
free(val->id); |
|
|
free(val); /* Free the actual list value */ |
|
117 |
} |
} |
118 |
} |
} |
119 |
|
|
179 |
|
|
180 |
new_value->content.val= in_val; |
new_value->content.val= in_val; |
181 |
new_value->type= integer; |
new_value->type= integer; |
182 |
new_value->refcount= 1; |
new_value->refcount= 0; |
|
new_value->id= NULL; |
|
183 |
|
|
184 |
push_val(env, new_value); |
push_val(env, new_value); |
185 |
} |
} |
192 |
new_value->content.ptr= malloc(strlen(in_string)+1); |
new_value->content.ptr= malloc(strlen(in_string)+1); |
193 |
strcpy(new_value->content.ptr, in_string); |
strcpy(new_value->content.ptr, in_string); |
194 |
new_value->type= string; |
new_value->type= string; |
195 |
new_value->refcount= 1; |
new_value->refcount= 0; |
|
new_value->id= NULL; |
|
196 |
|
|
197 |
push_val(env, new_value); |
push_val(env, new_value); |
198 |
} |
} |
611 |
pack= malloc(sizeof(value)); |
pack= malloc(sizeof(value)); |
612 |
pack->type= list; |
pack->type= list; |
613 |
pack->content.ptr= temp; |
pack->content.ptr= temp; |
614 |
pack->refcount= 1; |
pack->refcount= 0; |
615 |
|
|
616 |
push_val(env, pack); |
push_val(env, pack); |
617 |
rev(env); |
rev(env); |
740 |
|
|
741 |
extern void clear(environment *); |
extern void clear(environment *); |
742 |
void forget_sym(symbol **); |
void forget_sym(symbol **); |
743 |
|
extern void words(environment *); |
744 |
|
|
745 |
/* Quit stack. */ |
/* Quit stack. */ |
746 |
extern void quit(environment *env) |
extern void quit(environment *env) |
748 |
long i; |
long i; |
749 |
|
|
750 |
clear(env); |
clear(env); |
751 |
|
|
752 |
|
words(env); |
753 |
|
|
754 |
if (env->err) return; |
if (env->err) return; |
755 |
for(i= 0; i<HASHTBLSIZE; i++) { |
for(i= 0; i<HASHTBLSIZE; i++) { |
756 |
while(env->symbols[i]!= NULL) { |
while(env->symbols[i]!= NULL) { |
758 |
} |
} |
759 |
env->symbols[i]= NULL; |
env->symbols[i]= NULL; |
760 |
} |
} |
761 |
|
|
762 |
|
words(env); |
763 |
|
|
764 |
|
if(env->free_string!=NULL) |
765 |
|
free(env->free_string); |
766 |
|
|
767 |
|
muntrace(); |
768 |
|
|
769 |
exit(EXIT_SUCCESS); |
exit(EXIT_SUCCESS); |
770 |
} |
} |
771 |
|
|
840 |
{ |
{ |
841 |
environment myenv; |
environment myenv; |
842 |
|
|
843 |
|
mtrace(); |
844 |
|
|
845 |
init_env(&myenv); |
init_env(&myenv); |
846 |
|
|
847 |
while(1) { |
while(1) { |
1217 |
|
|
1218 |
temp_val= malloc(sizeof(value)); |
temp_val= malloc(sizeof(value)); |
1219 |
temp_val->content.ptr= env->head; |
temp_val->content.ptr= env->head; |
1220 |
temp_val->refcount= 1; |
temp_val->refcount= 0; |
1221 |
temp_val->type= list; |
temp_val->type= list; |
1222 |
env->head= temp_head; |
env->head= temp_head; |
1223 |
push_val(env, temp_val); |
push_val(env, temp_val); |
1243 |
|
|
1244 |
int itemp, readlength= -1; |
int itemp, readlength= -1; |
1245 |
static int depth= 0; |
static int depth= 0; |
1246 |
char *rest, *match; |
char *match; |
1247 |
size_t inlength; |
size_t inlength; |
1248 |
|
|
1249 |
if(env->in_string==NULL) { |
if(env->in_string==NULL) { |
1260 |
|
|
1261 |
inlength= strlen(env->in_string)+1; |
inlength= strlen(env->in_string)+1; |
1262 |
match= malloc(inlength); |
match= malloc(inlength); |
|
rest= malloc(inlength); |
|
1263 |
|
|
1264 |
if(sscanf(env->in_string, blankform, &readlength)!=EOF |
if(sscanf(env->in_string, blankform, &readlength)!=EOF |
1265 |
&& readlength != -1) { |
&& readlength != -1) { |
1287 |
} else { |
} else { |
1288 |
free(env->free_string); |
free(env->free_string); |
1289 |
env->in_string = env->free_string = NULL; |
env->in_string = env->free_string = NULL; |
|
free(match); |
|
1290 |
} |
} |
1291 |
if ( env->in_string != NULL) { |
if ( env->in_string != NULL) { |
1292 |
env->in_string += readlength; |
env->in_string += readlength; |
1293 |
} |
} |
1294 |
|
|
1295 |
|
free(match); |
1296 |
|
|
1297 |
if(depth) |
if(depth) |
1298 |
return read(env); |
return read(env); |
1299 |
} |
} |