void clrdat(SINGLE_QSP_ARG_DECL) /* just clears data tables */ { List *lp; Node *np; Trial_Class *tcp; Data_Tbl *dtp; int i; lp=class_list(SINGLE_QSP_ARG); if( lp == NO_LIST ) return; np=lp->l_head; while(np!=NO_NODE){ tcp = (Trial_Class *) np->n_data; dtp = CLASS_DATA_TBL(tcp); if( dtp == NULL ){ sprintf(ERROR_STRING, "Stimulus class %s has null data table, initializing...", CLASS_NAME(tcp) ); advise(ERROR_STRING); dtp = alloc_data_tbl(tcp,_nvals); } fprintf(stderr,"clrdat: clearing data table for class %s\n",CLASS_NAME(tcp)); SET_DTBL_N(dtp,0); for(i=0;i<DTBL_SIZE(dtp);i++){ SET_DATUM_NTOTAL(DTBL_ENTRY(dtp,i),0); SET_DATUM_NCORR(DTBL_ENTRY(dtp,i),0); } np=np->n_next; } fprintf(stderr,"clrdat: DONE\n"); }
static COMMAND_FUNC( do_read_data ) /** read a data file */ { FILE *fp; const char *filename; char num_str[16]; filename=nameof("data file"); fp=try_open( filename, "r" ); if( !fp ) return; /* We used to clear the data tables here, * but now they are dynamically allocated * and cleared at that time... */ /* clear old classes */ do_delete_all_classes(SINGLE_QSP_ARG); //curr_tcp=NULL; n_have_classes=0; if( read_exp_data(QSP_ARG fp) != 0 ){ fclose(fp); sprintf(ERROR_STRING,"do_read_data: error return from read_exp_data, file %s",filename); WARN(ERROR_STRING); return; } fclose(fp); n_have_classes = eltcount(class_list()); sprintf(num_str,"%d",n_have_classes); // BUG? buffer overflow // if n_have_classes too big??? assign_reserved_var( "n_classes" , num_str ); if( verbose ){ sprintf(ERROR_STRING,"File %s read, %d classes, %d x-values", filename,n_have_classes,_nvals); advise(ERROR_STRING); } }