#include #include #include #include #include #include #include #include #ifndef O_BINARY #define O_BINARY 0 #endif int main(int argc, char *argv[]) { unsigned long cofst, xlong; unsigned char *bbuf; unsigned short xshort; long bbuflen; int outfd, infd, i, maxsect; char title[20]; if (argc < 2) { fprintf(stderr, "Usage: %s prcfile\n", argv[0]); exit(1); } if ((infd = open(argv[1], O_BINARY | O_RDONLY)) < 1) { fprintf(stderr, "Can't open midi file %s\n", argv[3]); exit(-2); } if (!(bbuf = malloc(65536))) exit(-3); lseek(infd, 76, SEEK_SET); read(infd, &xshort, 2); /* num resources */ maxsect = htons(xshort); for (i = 0; i < maxsect; i++) { read(infd, title, 4); read(infd, &xshort, 2); xshort = htons(xshort); sprintf(&title[4], "%04x", xshort); strcat(title, ".bin"); read(infd, &xlong, 4); cofst = htonl(xlong); xlong = lseek(infd, 0, SEEK_CUR); if (i + 1 != maxsect) { lseek(infd, 6 , SEEK_CUR); read(infd, &bbuflen, 4); bbuflen = htonl(bbuflen); bbuflen = bbuflen - cofst; } else bbuflen = 65534; lseek(infd, cofst, SEEK_SET); bbuflen = read(infd, bbuf, bbuflen); lseek(infd, xlong, SEEK_SET); fprintf(stderr, "%s %d\n", title, bbuflen); outfd = open(title, O_BINARY | O_RDWR | O_CREAT); write(outfd, bbuf, bbuflen); close(outfd); } return 0; }