diff -urN midi_prog-/txprm.c midi_prog/txprm.c --- midi_prog-/txprm.c Fri Apr 3 00:00:00 2015 +++ midi_prog/txprm.c Fri Apr 3 02:00:00 2015 @@ -38,6 +38,33 @@ } } +void +rev_cnv(char *type, char *name, char *val) +{ + if(strcmp(type, "int") == 0){ + int v = atoi(val); + fwrite(&v, sizeof(v), 1, stdout); + }else if(strcmp(type, "double") == 0){ + double v = atof(val); + fwrite(&v, sizeof(v), 1, stdout); + }else if(strcmp(type, "addr") == 0){ + void *v = NULL; + sscanf(val, "%p", &v); + fwrite(&v, sizeof(v), 1, stdout); + }else if(strcmp(type, "str") == 0){ + char *p; + int n; + if(val[0] == '"') val = val +1; + if((p = strrchr(val, '"')) != NULL) *p = '\0'; + n = strlen(val) + 1; + fwrite(val, n, 1, stdout); + }else{ + MSG(type); + MSG(name); + ERR("rev_cnv"); + } +} + char * loop(char *fmt, int idt, int n) { @@ -73,15 +100,34 @@ return fmt; } +void +rev_work(void) +{ + char buf[ 4096 ], type[32], name[32], val[4096]; + int i; + + while(fgets(buf, sizeof(buf), stdin) != NULL){ + for(i=0; buf[i]==' '; i++); + sscanf(buf+i, "%s %s %[^\n]\n", type, name, val); + rev_cnv(type, name, val); + } +} + int main(int ac, char **av) { char *fn = opt_str("-f", ac, av, "prmfmt.txt"); - int fd_fmt = open(fn, O_RDONLY); + int fd_fmt; struct stat sb; size_t len; char *fmt; + if(opt_idx("-r", ac, av) >= 0){ + rev_work(); + return 0; + } + + fd_fmt = open(fn, O_RDONLY); if(fd_fmt == -1){ MSG(fn); ERR("open");