--- loncom/homework/CAPA-converter/capaCommon.c 2000/05/03 15:35:11 1.2 +++ loncom/homework/CAPA-converter/capaCommon.c 2001/11/18 09:40:45 1.9 @@ -111,7 +111,7 @@ capa_parse(set,problem,filename,num_ques int set;Problem_t **problem;char *filename;int *num_questions; void (*func_ptr)(); { - int errcode; + int errcode,temp; extern FILE *Input_stream[MAX_OPENED_FILE]; extern char Opened_filename[MAX_OPENED_FILE][QUARTER_K]; extern int Lexi_line; @@ -152,7 +152,11 @@ extern void (*Status_Func)(); /*yyrestart(yyin);*/ begin_text(); /*if ( !yyparse() ) { errcode = Lexi_qnum; } else { errcode = 0; }*/ - if (!yylex()) { errcode = Lexi_qnum; } else { errcode = 0; } + if (!(temp=yylex())) { errcode = Lexi_qnum; } else { errcode = 0; } + fprintf(stderr,"\nExited on: %d\n",temp); + fprintf(stderr,"Current cache: %d\n",current_cache); + fprintf(stderr,"Flushing:\n"); + flush_delayed(); /* fclose(Input_stream[0]);*/ /*The Lexer handles closing this*/ /* print_symb_stat(); */ /* @@ -164,25 +168,238 @@ extern void (*Status_Func)(); return (errcode); } -char* delayed; +int dyn_maxlen=1000000; +int delay; +void dyn_init(struct dyn_string *dyn) +{ + dyn->len=0; + dyn->max=0; + dyn->str=NULL; +} + +void dyn_free(struct dyn_string* dyn) +{ + if (dyn->str) { + free(dyn->str);dyn->str=NULL; + dyn->len=0; + dyn->max=0; + } +} + + +int append_message(struct dyn_string *dyn_msg,char *format,va_list ap) { + char *new; + int len,result; + + if ((result=vasprintf(&new,format,ap))==-1) { + fprintf(stderr,"vaspintf didn't like :%s:",format); + exit(1); + } + len=strlen(new); + +#ifdef DYN_DEBUG + fprintf(stderr,"before: len %d; gcount %d; max %d\n", + len,dyn_msg->len,dyn_msg->max); +#endif /* DYN_DEBUG */ + + if (dyn_msg->len+len < dyn_maxlen) { + if (dyn_msg->len+len>dyn_msg->max-2) { + dyn_msg->max=(dyn_msg->len+len)*2; + if (dyn_msg->max>dyn_maxlen) { dyn_msg->max=dyn_maxlen; } + if (dyn_msg->max != 0) { + dyn_msg->str=realloc(dyn_msg->str,dyn_msg->max); + } else { + return 1; + } + dyn_msg->str[dyn_msg->len]='\0'; + } + strcat(dyn_msg->str,new); + dyn_msg->len+=len; + } else { + if (dyn_msg->max != dyn_maxlen-1) { /*already maxed out or can + we fit this one in?*/ + dyn_msg->max=dyn_maxlen; + dyn_msg->str=realloc(dyn_msg->str,dyn_msg->max); + dyn_msg->str[dyn_msg->len]='\0'; + strncat(dyn_msg->str,new,dyn_msg->max-dyn_msg->len-1); + dyn_msg->len=strlen(dyn_msg->str); + } + } + free(new); + +#ifdef DYN_DEBUG + fprintf(stderr,"after: len %d; gcount %d; max %d; strlen(dyn_msg): %d\n", + len,dyn_msg->len,dyn_msg->max,strlen(dyn_msg->str)); +#endif /* DYN_DEBUG */ + + return 1; +} + +void start_delayed(){ delay=1; } +void end_delayed(){ delay=0; } + +void add_delayed(char *format, ...) { + va_list ap; + + va_start(ap,format); + append_message(&dyn_delayed,format,ap); + if (do_cache[current_cache]) { + append_message(&cached_data[current_cache],format,ap); + } +} + +void flush_delayed() +{ + delay=0; + if (dyn_delayed.str) { send(dyn_delayed.str); } + dyn_free(&dyn_delayed);dyn_init(&dyn_delayed); +} + + +void send_to(int which, char *text, va_list ap) +{ + if (delay) { + append_message(&dyn_delayed,text,ap); + } else { + if (num_streams) { + if (which == ALL_STREAMS) { + int i; + for (i=0;i\n"); break; + case MODE_BLOCK: send_stream(which,"\n"); break; + case MODE_SCRIPT: send_stream(which,"\n"); break; + case MODE_OUTTEXT: send_stream(which,"\n"); break; + case MODE_ANSWER: send_stream(which,"\n"); break; + case MODE_HINT: send_stream(which,"\n\n\n"); break; + case MODE_IMPORT: send_stream(which,"\n"); break; + case MODE_NONE: break; + } + mode[which]=MODE_NONE; + watch_mode[which]=0; +} + +void start_mode(int newmode,char* args) +{ + start_mode_stream(ALL_STREAMS,newmode,args); +} + +void start_mode_stream(int which,int newmode,char* args) +{ + if (num_streams) { + if (which == ALL_STREAMS) { + int i; + for (i=0;i\n"); break; + case MODE_BLOCK: send_stream(which,"\n",args); break; + case MODE_SCRIPT: send_stream(which,"