diff -urN midi_prog-/Makefile midi_prog/Makefile --- midi_prog-/Makefile Fri Apr 17 00:00:00 2015 +++ midi_prog/Makefile Sat Apr 18 00:00:00 2015 @@ -1,6 +1,6 @@ CC = gcc LIB = -lm -lpthread -L../cui -lcui -TARG = prog56 +TARG = prog57 OBJS = main.o vcf.o ch.o delay.o stat.o note.o env.o tone.o filter.o lfo.o modu.o vco.o wave.o out.o rd.o util.o OBJS += rec.o OBJS += cui_tone.o diff -urN midi_prog-/main.c midi_prog/main.c --- midi_prog-/main.c Fri Mar 27 02:00:00 2015 +++ midi_prog/main.c Sat Apr 18 00:00:00 2015 @@ -82,7 +82,9 @@ stat_buf_init(); ch_init(ac, av); - if(pthread_create(&pth, NULL, pth_func, av)) ERR("pthrad_create"); + if(opt_idx("-nocui", ac, av) < 0){ + if(pthread_create(&pth, NULL, pth_func, av)) ERR("pthrad_create"); + } tempo = 500000; tempo_delta_sum = 0; diff -urN midi_prog-/rec.c midi_prog/rec.c --- midi_prog-/rec.c Fri Apr 17 00:00:00 2015 +++ midi_prog/rec.c Sat Apr 18 00:00:00 2015 @@ -252,20 +252,6 @@ for(i=0; rec->membs[i].type; i++) memb_save(obj, &rec->membs[i], fp, idt); } -void -rec_save_text(void *obj, char *name, FILE *fp) -{ - struct rec *rec; - - if((rec = rec_get(name)) == NULL){ - MSG(name); - ERR("not found"); - } - fprintf(fp, "%s\n", name); - - rec_save(obj, rec, fp, 0); -} - static void non_rec_in(char *type, void *addr, FILE *fp) { @@ -328,7 +314,6 @@ void *p; char strip_type[ TYPE_MAX ], buf[ BUF_MAX ]; int c; - char c1; fscanf(fp, "%s", buf); if(strcmp(buf, memb->name) != 0){ @@ -368,30 +353,45 @@ return; } - fscanf(fp, "%c", &c1); - if (c != '{') ERR("unexpect"); - skip1('\n', fp); - + fscanf(fp, "%s\n", buf); + if (strcmp(buf, "{") != 0){ + MSG(buf); + ERR("unexpect"); + } for(;;){ sl = stklst_alloc(rec->size, sl); rec_load(sl->p, rec, fp); if(rec_is_tail(sl->p, rec)) break; - fscanf(fp, "%c", &c1); - if (c != ',') ERR("unexpect"); - skip1('\n', fp); + fscanf(fp, "%s\n", buf); + if (strcmp(buf, ",") != 0){ + MSG(buf); + ERR("unexpect"); + } } memb_set_pointer(obj, memb, stklst_to_arr(sl)); - fscanf(fp, "%c", &c1); - if (c != '}') ERR("unexpect"); - skip1('\n', fp); + fscanf(fp, "%s\n", buf); + if (strcmp(buf, "}") != 0){ + MSG(buf); + ERR("unexpect"); + } return; } skip1(' ', fp); - if(strcmp(strip_type, "char") == 0){ - fscanf(fp, "\"%s\"", buf); + + c = fgetc(fp); + ungetc(c, fp); + if(c == 'N'){ + fscanf(fp, "%s", buf); + if(strcmp(buf, "NULL") != 0){ + MSG(buf); + ERR("unexpect"); + } + p = NULL; + }else if(strcmp(strip_type, "char") == 0){ + fscanf(fp, "\"%[^\"]\"", buf); if ((p = strdup(buf)) == NULL) ERR("No Mem"); }else{ if ((p = type_alloc(strip_type, 1)) == NULL) ERR("No Mem"); diff -urN midi_prog-/rec.h midi_prog/rec.h --- midi_prog-/rec.h Fri Apr 17 00:00:00 2015 +++ midi_prog/rec.h Sat Apr 18 00:00:00 2015 @@ -19,7 +19,7 @@ #define MEMB(rec, type, memb) { #type, #memb, offsetof(rec, memb), membsizeof(rec, memb) } struct rec *rec_get(char *name); -void rec_save_text(void *rec, char *name, FILE *fp); +void rec_save(void *obj, struct rec *rec, FILE *fp, int idt); void rec_load(void *obj, struct rec *rec, FILE *fp); #endif diff -urN midi_prog-/tone.c midi_prog/tone.c --- midi_prog-/tone.c Fri Apr 17 00:00:00 2015 +++ midi_prog/tone.c Sat Apr 18 00:00:00 2015 @@ -391,6 +391,18 @@ tone_load_fp(stdin); } +static void +try_save(void) +{ + char *save_hd = "save\n"; + + if(!rd_str_chk_peek(save_hd)) return; + rd_str_chk(strlen(save_hd), save_hd); + tone_save_fp(stdout); + fflush(stdout); + exit(1); +} + void tone_init(void) { @@ -403,7 +415,9 @@ for(tone_compo=tones_lst[i].tone_compo; tone_compo->name; tone_compo++){ tone_compo->tone = name_search(tone_compo->name); } + tone_compo->tone = NULL; } + try_save(); } #define CH_PROG(ch) ( (ch) == 9 ? 0 : ch_inf[ch].prog ) @@ -466,15 +480,20 @@ } void -tone_save(char *path) +tone_save_fp(FILE *fp) { - FILE *fp; struct tone_all_rec all = { tone_inf, tones_lst }; + rec_save(&all, rec_get("struct tone_all_rec"), fp, 0); +} +void +tone_save(char *path) +{ + FILE *fp; if((fp = fopen(path, "w")) == NULL){ MSG(path); ERR("open"); } - rec_save_text(&all, "struct tone_all_rec", fp); + tone_save_fp(fp); fclose(fp); } @@ -494,8 +513,6 @@ tone_load_fp(FILE *fp) { struct tone_all_rec all; - - while(fgetc(fp) != '\n'); rec_load(&all, rec_get("struct tone_all_rec"), fp); tone_inf = all.tone; diff -urN midi_prog-/tone.h midi_prog/tone.h --- midi_prog-/tone.h Fri Apr 17 00:00:00 2015 +++ midi_prog/tone.h Sat Apr 18 00:00:00 2015 @@ -42,6 +42,7 @@ struct tone_compo_rec *tone_compo_get(int ch, int note, int *ret_n); double tone_out(struct stat_rec *stat, double freq, double env_v); void tone_save(char *path); +void tone_save_fp(FILE *fp); void tone_load(char *path); void tone_load_fp(FILE *fp);