/** Open specified .vtx file and read vtx file header * * Open specified .vtx file and read vtx file header in struct vtx * Return value: true if success, else false */ int ayemu_vtx_open (ayemu_vtx_t *vtx, const char *filename) { char buf[2]; int error = 0; int32_t int_regdata_size; vtx->regdata = NULL; if ((vtx->fp = vfs_fopen (filename, "rb")) == NULL) { fprintf(stderr, "ayemu_vtx_open: Cannot open file %s: %s\n", filename, strerror(errno)); return 0; } if (vfs_fread(buf, 2, 1, vtx->fp) != 1) { fprintf(stderr,"ayemu_vtx_open: Can't read from %s: %s\n", filename, strerror(errno)); error = 1; } buf[0] = tolower(buf[0]); buf[1] = tolower(buf[1]); if (strncmp(buf, "ay", 2) == 0) vtx->hdr.chiptype = AYEMU_AY; else if (strncmp (buf, "ym", 2) == 0) vtx->hdr.chiptype = AYEMU_YM; else { fprintf (stderr, "File %s is _not_ VORTEX format!\nIt not begins from AY or YM.\n", filename); error = 1; } /* read VTX header info in order format specified, see http:// ..... */ if (!error) error = read_byte(vtx->fp, &vtx->hdr.stereo); if (!error) error = read_word16(vtx->fp, &vtx->hdr.loop); if (!error) error = read_word32(vtx->fp, &vtx->hdr.chipFreq); if (!error) error = read_byte(vtx->fp, &vtx->hdr.playerFreq); if (!error) error = read_word16(vtx->fp, &vtx->hdr.year); if (!error) { error = read_word32(vtx->fp, &int_regdata_size); vtx->hdr.regdata_size = (size_t) int_regdata_size; } if (!error) error = read_NTstring(vtx->fp, vtx->hdr.title); if (!error) error = read_NTstring(vtx->fp, vtx->hdr.author); if (!error) error = read_NTstring(vtx->fp, vtx->hdr.from); if (!error) error = read_NTstring(vtx->fp, vtx->hdr.tracker); if (!error) error = read_NTstring (vtx->fp, vtx->hdr.comment); if (error) { vfs_fclose(vtx->fp); vtx->fp = NULL; } return !error; }
static data_ptr_t read_header(data_ptr_t buf, ayemu_vtx_t **target, size_t size) { char hdr[3]; ayemu_vtx_t *vtx; hdr[0] = tolower(*buf++); hdr[1] = tolower(*buf++); hdr[2] = '\0'; if (size < 20) { fprintf(stderr, "ayemu_vtx_open: file size < 20 bytes - it is impossible\n"); return NULL; } vtx = (ayemu_vtx_t*) calloc(1, sizeof(ayemu_vtx_t)); if (strncmp(hdr, "ay", 2) == 0) vtx->chiptype = AYEMU_AY; else if (strncmp (hdr, "ym", 2) == 0) vtx->chiptype = AYEMU_YM; else { trace ("File is _not_ VORTEX format!\n" "It not begins with 'ay' or 'ym' string.\n"); goto clean_and_ret_null; } buf = read_byte(buf, &vtx->stereo); buf = read_word16(buf, &vtx->loop); buf = read_word32(buf, &vtx->chipFreq); buf = read_byte(buf, &vtx->playerFreq); buf = read_word16(buf, &vtx->year); buf = read_word32(buf, &vtx->regdata_size); buf = read_string(buf, &vtx->title); buf = read_string(buf, &vtx->author); buf = read_string(buf, &vtx->from); buf = read_string(buf, &vtx->tracker); buf = read_string(buf, &vtx->comment); *target = vtx; return buf; clean_and_ret_null: ayemu_vtx_free(vtx); return NULL; }