59 |
hashtbl symbols; /* Hash table of all variable bindings */ |
hashtbl symbols; /* Hash table of all variable bindings */ |
60 |
int err; /* Error flag */ |
int err; /* Error flag */ |
61 |
int non_eval_flag; |
int non_eval_flag; |
62 |
|
char *in_string; /* Input pending to be read */ |
63 |
} environment; |
} environment; |
64 |
|
|
65 |
/* A type for pointers to external functions */ |
/* A type for pointers to external functions */ |
71 |
{ |
{ |
72 |
int i; |
int i; |
73 |
|
|
74 |
|
env->in_string= NULL; |
75 |
env->err= 0; |
env->err= 0; |
76 |
env->non_eval_flag= 0; |
env->non_eval_flag= 0; |
77 |
for(i= 0; i<HASHTBLSIZE; i++) |
for(i= 0; i<HASHTBLSIZE; i++) |
907 |
init_env(&myenv); |
init_env(&myenv); |
908 |
|
|
909 |
while(1) { |
while(1) { |
910 |
fprintf(stderr, "okidok\n "); |
if(myenv.in_string==NULL) |
911 |
|
printf("okidok\n "); |
912 |
read(&myenv); |
read(&myenv); |
913 |
if(myenv.err) { |
if(myenv.err) { |
914 |
printf("(error %d) ", myenv.err); |
printf("(error %d) ", myenv.err); |
1295 |
int itemp, rerun= 0; |
int itemp, rerun= 0; |
1296 |
static int depth= 0; |
static int depth= 0; |
1297 |
char *rest, *match; |
char *rest, *match; |
|
static char *in_string= NULL; |
|
1298 |
size_t inlength; |
size_t inlength; |
1299 |
|
|
1300 |
if(in_string==NULL) { |
if(env->in_string==NULL) { |
1301 |
readline(env); if(env->err) return; |
readline(env); if(env->err) return; |
1302 |
|
|
1303 |
in_string= malloc(strlen(env->head->item->content.ptr)+1); |
env->in_string= malloc(strlen(env->head->item->content.ptr)+1); |
1304 |
strcpy(in_string, env->head->item->content.ptr); |
strcpy(env->in_string, env->head->item->content.ptr); |
1305 |
toss(env); if(env->err) return; |
toss(env); if(env->err) return; |
1306 |
} |
} |
1307 |
|
|
1308 |
inlength= strlen(in_string)+1; |
inlength= strlen(env->in_string)+1; |
1309 |
match= malloc(inlength); |
match= malloc(inlength); |
1310 |
rest= malloc(inlength); |
rest= malloc(inlength); |
1311 |
|
|
1312 |
if(sscanf(in_string, blankform, rest)) { |
if(sscanf(env->in_string, blankform, rest)) { |
1313 |
rerun= 1; |
rerun= 1; |
1314 |
} else if(sscanf(in_string, intform, &itemp, rest) > 0) { |
} else if(sscanf(env->in_string, intform, &itemp, rest) > 0) { |
1315 |
push_int(&(env->head), itemp); |
push_int(&(env->head), itemp); |
1316 |
} else if(sscanf(in_string, strform, match, rest) > 0) { |
} else if(sscanf(env->in_string, strform, match, rest) > 0) { |
1317 |
push_cstring(&(env->head), match); |
push_cstring(&(env->head), match); |
1318 |
} else if(sscanf(in_string, symbform, match, rest) > 0) { |
} else if(sscanf(env->in_string, symbform, match, rest) > 0) { |
1319 |
push_sym(env, match); |
push_sym(env, match); |
1320 |
} else if(sscanf(in_string, ebrackform, rest) > 0) { |
} else if(sscanf(env->in_string, ebrackform, rest) > 0) { |
1321 |
push_sym(env, "["); |
push_sym(env, "["); |
1322 |
pack(env); if(env->err) return; |
pack(env); if(env->err) return; |
1323 |
if(depth!=0) depth--; |
if(depth!=0) depth--; |
1324 |
} else if(sscanf(in_string, semicform, rest) > 0) { |
} else if(sscanf(env->in_string, semicform, rest) > 0) { |
1325 |
push_sym(env, ";"); |
push_sym(env, ";"); |
1326 |
} else if(sscanf(in_string, bbrackform, rest) > 0) { |
} else if(sscanf(env->in_string, bbrackform, rest) > 0) { |
1327 |
push_sym(env, "["); |
push_sym(env, "["); |
1328 |
depth++; |
depth++; |
1329 |
} else { |
} else { |
1330 |
free(rest); |
free(rest); |
1331 |
rest= NULL; |
rest= NULL; |
|
rerun= 1; |
|
1332 |
} |
} |
1333 |
|
|
1334 |
free(in_string); |
free(env->in_string); |
1335 |
free(match); |
free(match); |
1336 |
|
|
1337 |
in_string= rest; |
env->in_string= rest; |
1338 |
|
|
1339 |
if(rerun || depth) |
if(rerun || depth) |
1340 |
return read(env); |
return read(env); |