int save_midi(char *filename, MIDI *midi) { int c; long len; PACKFILE *fp; int num_tracks = 0; if(!midi) return 1; fp = pack_fopen_password(filename, F_WRITE,""); /* open the file */ if(!fp) return 2; for(c=0; c<MIDI_TRACKS; c++) if(midi->track[c].len > 0) num_tracks++; pack_fwrite((void *) "MThd", 4, fp); /* write midi header */ pack_mputl(6, fp); /* header chunk length = 6 */ pack_mputw((num_tracks==1) ? 0 : 1, fp); /* MIDI file type */ pack_mputw(num_tracks, fp); /* number of tracks */ pack_mputw(midi->divisions, fp); /* beat divisions (negatives?) */ for(c=0; c<num_tracks; c++) /* write each track */ { pack_fwrite((void *) "MTrk", 4, fp); /* write track header */ len = midi->track[c].len; pack_mputl(len, fp); /* length of track chunk */ if(pack_fwrite(midi->track[c].data, len, fp) != len) goto err; } pack_fclose(fp); return 0; /* oh dear... */ err: pack_fclose(fp); delete_file(filename); return 3; }
/* saves a sample into the datafile format */ static int save_sample_in_datafile(DATAFILE *dat, AL_CONST int *fixed_prop, int pack, int pack_kids, int strip, int sort, int verbose, int extra, PACKFILE *f) { SAMPLE *spl = (SAMPLE *)dat->dat; *allegro_errno = 0; pack_mputw((spl->stereo) ? -spl->bits : spl->bits, f); pack_mputw(spl->freq, f); pack_mputl(spl->len, f); if (spl->bits == 8) { pack_fwrite(spl->data, spl->len * ((spl->stereo) ? 2 : 1), f); } else { int i; for (i=0; i < (int)spl->len * ((spl->stereo) ? 2 : 1); i++) { pack_iputw(((int16_t *)spl->data)[i], f); } } if (*allegro_errno) return FALSE; else return TRUE; }
void update_file(char *filename, char *dataname) { PACKFILE *f, *ef, *df = NULL; char *tmpname; int c; #ifdef ALLEGRO_HAVE_MKSTEMP char tmp_buf[] = "XXXXXX"; char tmp[512]; int tmp_fd; tmp_fd = mkstemp(tmp_buf); close(tmp_fd); tmpname = uconvert_ascii(tmp_buf, tmp); #else tmpname = tmpnam(NULL); #endif get_stats(); if (!err) { if ((!stat_hasdata) && (!dataname)) { fprintf(stderr, "%s has no appended data: cannot remove it\n", filename); err = 1; return; } rename_file(filename, tmpname); ef = pack_fopen(tmpname, F_READ); if (!ef) { delete_file(tmpname); fprintf(stderr, "Error reading temporary file\n"); err = 1; return; } f = pack_fopen(filename, F_WRITE); if (!f) { pack_fclose(ef); rename_file(tmpname, filename); fprintf(stderr, "Error writing to %s\n", filename); err = 1; return; } #ifdef ALLEGRO_UNIX chmod(filename, stat_stat.st_mode); #endif for (c=0; c<stat_exe_size; c++) pack_putc(pack_getc(ef), f); pack_fclose(ef); delete_file(tmpname); if (dataname) { if (stat_hasdata) printf("replacing %d bytes of currently appended data\n", stat_uncompressed_size); if (opt_allegro) { printf("reading %s as Allegro format compressed data\n", dataname); df = pack_fopen(dataname, F_READ_PACKED); } else if (opt_binary) { printf("reading %s as raw binary data\n", dataname); df = pack_fopen(dataname, F_READ); } else { printf("autodetecting format of %s: ", dataname); df = pack_fopen(dataname, F_READ_PACKED); if (df) { printf("Allegro compressed data\n"); } else { df = pack_fopen(dataname, F_READ); if (df) printf("raw binary data\n"); else printf("\n"); } } if (!df) { pack_fclose(f); fprintf(stderr, "Error opening %s\n", dataname); err = 1; return; } f = pack_fopen_chunk(f, opt_compress); while ((c = pack_getc(df)) != EOF) pack_putc(c, f); f = pack_fclose_chunk(f); pack_mputl(F_EXE_MAGIC, f); pack_mputl(_packfile_filesize+16, f); printf("%s has been appended onto %s\n" "original executable size: %d bytes (%dk)\n" "appended data size: %d bytes (%dk)\n" "compressed into: %d bytes (%dk)\n" "ratio: %d%%\n", dataname, filename, stat_exe_size, stat_exe_size/1024, _packfile_datasize, _packfile_datasize/1024, _packfile_filesize, _packfile_filesize/1024, (_packfile_datasize) ? _packfile_filesize*100/_packfile_datasize : 0); } else { printf("%d bytes of appended data removed from %s\n", stat_uncompressed_size, filename); } pack_fclose(f); pack_fclose(df); } }