/[cvs]/stack/stack.c
ViewVC logotype

Diff of /stack/stack.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.69 by masse, Mon Feb 11 00:54:04 2002 UTC revision 1.70 by masse, Mon Feb 11 01:20:35 2002 UTC
# Line 59  typedef struct { Line 59  typedef struct {
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 */
# Line 70  void init_env(environment *env) Line 71  void init_env(environment *env)
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++)
# Line 905  int main() Line 907  int main()
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);
# Line 1292  extern void read(environment *env) { Line 1295  extern void read(environment *env) {
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);

Legend:
Removed from v.1.69  
changed lines
  Added in v.1.70

root@recompile.se
ViewVC Help
Powered by ViewVC 1.1.26