diff -urN midi_prog-/txprm.c midi_prog/txprm.c --- midi_prog-/txprm.c Fri Apr 3 02:00:00 2015 +++ midi_prog/txprm.c Sat Apr 4 00:00:00 2015 @@ -2,24 +2,50 @@ #include #include "util.h" +int offset = 0; + char *work(char *fmt, int idt, int idx, int *p_cnt); void +pad_read(void *p, int sz) +{ + int pad = offset % sz; + while(pad-- > 0){ + getchar(); + offset++; + } + fread(p, sz, 1, stdin); + offset += sz; +} + +void +pad_write(void *p, int sz) +{ + int pad = offset % sz; + while(pad-- > 0){ + putchar(0); + offset++; + } + fwrite(p, sz, 1, stdout); + offset += sz; +} + +void cnv(char *type, char *name, int *np, int idx, int *p_cnt) { printf("%s %s_%d ", type, name, idx); if(strcmp(type, "int") == 0){ int v = 0; - fread(&v, sizeof(v), 1, stdin); + pad_read(&v, sizeof(v)); printf("%d\n", v); *np = v; }else if(strcmp(type, "double") == 0){ double v = 0; - fread(&v, sizeof(v), 1, stdin); + pad_read(&v, sizeof(v)); printf("%lf\n", v); }else if(strcmp(type, "addr") == 0){ void *v = NULL; - fread(&v, sizeof(v), 1, stdin); + pad_read(&v, sizeof(v)); printf("%p\n", v); }else if(strcmp(type, "str") == 0){ int ch, len = 0; @@ -28,9 +54,11 @@ putchar(ch); len++; } + len++; /* for '\0' */ putchar('"'); putchar('\n'); - if(p_cnt) *p_cnt += len + 1; + if(p_cnt) *p_cnt += len; + offset += len; }else{ MSG(type); MSG(name); @@ -43,14 +71,14 @@ { if(strcmp(type, "int") == 0){ int v = atoi(val); - fwrite(&v, sizeof(v), 1, stdout); + pad_write(&v, sizeof(v)); }else if(strcmp(type, "double") == 0){ double v = atof(val); - fwrite(&v, sizeof(v), 1, stdout); + pad_write(&v, sizeof(v)); }else if(strcmp(type, "addr") == 0){ void *v = NULL; sscanf(val, "%p", &v); - fwrite(&v, sizeof(v), 1, stdout); + pad_write(&v, sizeof(v)); }else if(strcmp(type, "str") == 0){ char *p; int n; @@ -58,6 +86,7 @@ if((p = strrchr(val, '"')) != NULL) *p = '\0'; n = strlen(val) + 1; fwrite(val, n, 1, stdout); + offset += n; }else{ MSG(type); MSG(name);