/* Write the current in-memory tape file out to disk */ int tape_write( const char* filename ) { libspectrum_id_t type; libspectrum_class_t class; libspectrum_byte *buffer; size_t length; int error; /* Work out what sort of file we want from the filename; default to .tzx if we couldn't guess */ error = libspectrum_identify_file_with_class( &type, &class, filename, NULL, 0 ); if( error ) return error; if( class != LIBSPECTRUM_CLASS_TAPE || type == LIBSPECTRUM_ID_UNKNOWN ) type = LIBSPECTRUM_ID_TAPE_TZX; length = 0; error = libspectrum_tape_write( &buffer, &length, tape, type ); if( error != LIBSPECTRUM_ERROR_NONE ) return error; error = utils_write_file( filename, buffer, length ); if( error ) { libspectrum_free( buffer ); return error; } tape_modified = 0; ui_tape_browser_update( UI_TAPE_BROWSER_MODIFIED, NULL ); libspectrum_free( buffer ); return 0; }
static int write_tape( char *filename, libspectrum_tape *tape ) { libspectrum_byte *buffer; size_t length; FILE *f; libspectrum_id_t type; if( get_type_from_string( &type, filename ) ) return 1; length = 0; if( libspectrum_tape_write( &buffer, &length, tape, type ) ) return 1; f = fopen( filename, "wb" ); if( !f ) { fprintf( stderr, "%s: couldn't open '%s': %s\n", progname, filename, strerror( errno ) ); free( buffer ); return 1; } if( fwrite( buffer, 1, length, f ) != length ) { fprintf( stderr, "%s: error writing to '%s'\n", progname, filename ); free( buffer ); fclose( f ); return 1; } free( buffer ); if( fclose( f ) ) { fprintf( stderr, "%s: couldn't close '%s': %s\n", progname, filename, strerror( errno ) ); return 1; } return 0; }
int main(int argc, char *argv[]) { int opt, i, quiet = 0; char *output = "output.tzx", *p; int turbo_params[6] = { 2168, 3323, 667, 735, 855, 1710 }; FILE *fd; size_t data_len; libspectrum_tape *tape; libspectrum_byte *data; libspectrum_tape_block *block; libspectrum_dword pause, pause_tstates; while ((opt = getopt(argc, argv, "vhqt:o:")) != -1) { switch(opt) { case 'q': quiet = 1; break; case 't': if (sscanf(optarg, "%i:%i:%i:%i:%i:%i", &turbo_params[0], &turbo_params[1], &turbo_params[2], &turbo_params[3], &turbo_params[4], &turbo_params[5]) != 6) fatal(argv[0], "Failed to parse turbo params"); break; case 'o': output = strdup(optarg); break; case 'h': help(argv[0]); exit(0); case 'v': fprintf(stderr, VERSION "\n"); exit(0); default: fprintf(stderr, "\n"); help(argv[0]); exit(1); } } if (optind >= argc) fatal(argv[0], "Expected input filename to process"); if (libspectrum_init()) fatal(argv[0], "Failed to init libspectrum"); fd = fopen(argv[optind], "rb"); if (!fd) fatal(argv[0], "Failed to open input file"); fseek(fd, 0, SEEK_END); data_len = ftell(fd); fseek(fd, 0, SEEK_SET); data = (libspectrum_byte *) malloc(data_len); if (!data) { fclose(fd); fatal(argv[0], "Failed to allocate memory"); } if (fread(data, sizeof(libspectrum_byte), data_len, fd) != data_len) { fclose(fd); free(data); fatal(argv[0], "Failed to read input file"); } fclose(fd); tape = libspectrum_tape_alloc(); if (!tape) { fclose(fd); free(data); fatal(argv[0], "Failed to allocate tape memory"); } if (libspectrum_tape_read(tape, data, data_len, LIBSPECTRUM_ID_UNKNOWN, argv[optind])) { fclose(fd); free(data); free(tape); fatal(argv[0], "Failed to read tape"); } free(data); for (i = optind + 1; i < argc; i++) { for (p = argv[i]; *p && isdigit(*p); p++); if (*p) { fprintf(stderr, "WARNING: Parameter is not a valid block number, skipping\n"); continue; } if (libspectrum_tape_nth_block(tape, atoi(argv[i]))) continue; block = libspectrum_tape_current_block(tape); if (!block) continue; if (!quiet) printf("%s: Setting block #%i (type 0x%02x): ", argv[0], atoi(argv[i]), libspectrum_tape_block_type(block)); data = libspectrum_tape_block_data(block); data_len = libspectrum_tape_block_data_length(block); pause = libspectrum_tape_block_pause(block); pause_tstates = libspectrum_tape_block_pause_tstates(block); if (libspectrum_tape_block_set_type(block, LIBSPECTRUM_TAPE_BLOCK_TURBO) || libspectrum_tape_block_set_pilot_pulses(block, turbo_params[1]) || libspectrum_tape_block_set_pilot_length(block, turbo_params[0]) || libspectrum_tape_block_set_sync1_length(block, turbo_params[2]) || libspectrum_tape_block_set_sync2_length(block, turbo_params[3]) || libspectrum_tape_block_set_bit0_length(block, turbo_params[4]) || libspectrum_tape_block_set_bit1_length(block, turbo_params[5]) || libspectrum_tape_block_set_data(block, data) || libspectrum_tape_block_set_data_length(block, data_len) || libspectrum_tape_block_set_pause(block, pause) || libspectrum_tape_block_set_pause_tstates(block, pause_tstates) || libspectrum_tape_block_set_bits_in_last_byte(block, 8) ) { if (!quiet) printf("failed!\n"); fprintf(stderr, "WARNING: Failed to set block %i\n", atoi(argv[i])); continue; } if (!quiet) printf("OK\n"); } data = NULL; data_len = 0; if (libspectrum_tape_write(&data, &data_len, tape, LIBSPECTRUM_ID_TAPE_TZX)) { free(tape); fatal(argv[0], "Failed to write the output file"); } fd = fopen(output, "wb"); if (!fd) { free(data); free(tape); fatal(argv[0], "Failed to open output file"); } if (fwrite(data, sizeof(libspectrum_byte), data_len, fd) != data_len) { fclose(fd); free(data); free(tape); fatal(argv[0], "Failed to write output file"); } fclose(fd); free(data); free(tape); exit(0); }