TAPE: Enhanced file type detection performance and cleaned up stylistic details

This commit is contained in:
Larry Baker 2020-06-14 14:10:55 -07:00 committed by Mark Pizzolato
parent 1d3d20e999
commit c062c7589d

View file

@ -144,7 +144,7 @@ struct tape_context {
uint32 dbit; /* debugging bit for trace */ uint32 dbit; /* debugging bit for trace */
uint32 auto_format; /* Format determined dynamically */ uint32 auto_format; /* Format determined dynamically */
#if defined SIM_ASYNCH_IO #if defined SIM_ASYNCH_IO
int asynch_io; /* Asynchronous Interrupt scheduling enabled */ t_bool asynch_io; /* Asynchronous Interrupt scheduling enabled */
int asynch_io_latency; /* instructions to delay pending interrupt */ int asynch_io_latency; /* instructions to delay pending interrupt */
pthread_mutex_t lock; pthread_mutex_t lock;
pthread_t io_thread; /* I/O Thread Id */ pthread_t io_thread; /* I/O Thread Id */
@ -173,7 +173,7 @@ struct tape_context *ctx = (struct tape_context *)uptr->tape_ctx; \
\ \
if (ctx == NULL) \ if (ctx == NULL) \
return sim_messagef (SCPE_IERR, "Bad Attach\n"); \ return sim_messagef (SCPE_IERR, "Bad Attach\n"); \
if ((!callback) || !ctx->asynch_io) if ((callback == NULL) || !(ctx->asynch_io))
#define AIO_CALL(op, _buf, _bc, _fc, _max, _vbc, _gaplen, _bpi, _obj, _callback)\ #define AIO_CALL(op, _buf, _bc, _fc, _max, _vbc, _gaplen, _bpi, _obj, _callback)\
if (ctx->asynch_io) { \ if (ctx->asynch_io) { \
@ -589,7 +589,7 @@ if (!ctx) return SCPE_UNATT;
if (ctx->asynch_io) { if (ctx->asynch_io) {
pthread_mutex_lock (&ctx->io_lock); pthread_mutex_lock (&ctx->io_lock);
ctx->asynch_io = 0; ctx->asynch_io = FALSE;
pthread_cond_signal (&ctx->io_cond); pthread_cond_signal (&ctx->io_cond);
pthread_mutex_unlock (&ctx->io_lock); pthread_mutex_unlock (&ctx->io_lock);
pthread_join (ctx->io_thread, NULL); pthread_join (ctx->io_thread, NULL);
@ -636,7 +636,7 @@ DEVICE *dptr;
if ((dptr = find_dev_from_unit (uptr)) == NULL) if ((dptr = find_dev_from_unit (uptr)) == NULL)
return SCPE_NOATT; return SCPE_NOATT;
return sim_tape_attach_ex (uptr, cptr, ((dptr->flags & DEV_DEBUG) || (dptr->debflags)) ? MTSE_DBG_API : 0, 0); return sim_tape_attach_ex (uptr, cptr, ((dptr->flags & DEV_DEBUG) || (dptr->debflags != NULL)) ? MTSE_DBG_API : 0, 0);
} }
t_stat sim_tape_attach_ex (UNIT *uptr, const char *cptr, uint32 dbit, int completion_delay) t_stat sim_tape_attach_ex (UNIT *uptr, const char *cptr, uint32 dbit, int completion_delay)
@ -704,7 +704,7 @@ switch (MT_GET_FMT (uptr)) {
} }
tape = ansi_create_tape (label, uptr->recsize, MT_GET_ANSI_TYP (uptr)); tape = ansi_create_tape (label, uptr->recsize, MT_GET_ANSI_TYP (uptr));
uptr->fileref = (FILE *)tape; uptr->fileref = (FILE *)tape;
if (!uptr->fileref) if (uptr->fileref == NULL)
return SCPE_MEM; return SCPE_MEM;
while (*cptr != 0) { /* do all mods */ while (*cptr != 0) { /* do all mods */
uint32 initial_file_count = tape->file_count; uint32 initial_file_count = tape->file_count;
@ -761,7 +761,7 @@ switch (MT_GET_FMT (uptr)) {
tape = memory_create_tape (); tape = memory_create_tape ();
uptr->fileref = (FILE *)tape; uptr->fileref = (FILE *)tape;
if (!uptr->fileref) if (uptr->fileref == NULL)
return SCPE_MEM; return SCPE_MEM;
f = fopen (cptr, "rb"); f = fopen (cptr, "rb");
if (f == NULL) { if (f == NULL) {
@ -769,7 +769,7 @@ switch (MT_GET_FMT (uptr)) {
break; break;
} }
tape_classify_file_contents (f, &max_record_size, &lf_line_endings, &crlf_line_endings); tape_classify_file_contents (f, &max_record_size, &lf_line_endings, &crlf_line_endings);
if ((!lf_line_endings) && (!crlf_line_endings)) { /* binary file? */ if (!lf_line_endings && !crlf_line_endings) { /* binary file? */
if (uptr->recsize == 0) { if (uptr->recsize == 0) {
r = sim_messagef (SCPE_ARG, "Binary file %s must specify a record size with -B\n", cptr); r = sim_messagef (SCPE_ARG, "Binary file %s must specify a record size with -B\n", cptr);
fclose (f); fclose (f);
@ -804,7 +804,7 @@ switch (MT_GET_FMT (uptr)) {
if (sim_switches & SWMASK ('C')) { if (sim_switches & SWMASK ('C')) {
uint32 i; uint32 i;
for (i=0; i<uptr->recsize; i++) for (i = 0; i < uptr->recsize; i++)
block[i] = ascii2ebcdic[block[i]]; block[i] = ascii2ebcdic[block[i]];
} }
error = memory_tape_add_block (tape, block, uptr->recsize); error = memory_tape_add_block (tape, block, uptr->recsize);
@ -835,7 +835,7 @@ switch (MT_GET_FMT (uptr)) {
tape = memory_create_tape(); tape = memory_create_tape();
tape->block_size = uptr->recsize; tape->block_size = uptr->recsize;
uptr->fileref = (FILE *)tape; uptr->fileref = (FILE *)tape;
if (!uptr->fileref) if (uptr->fileref == NULL)
return SCPE_MEM; return SCPE_MEM;
while (*cptr != 0) { while (*cptr != 0) {
@ -1017,11 +1017,11 @@ return SCPE_OK;
t_stat sim_tape_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr) t_stat sim_tape_attach_help(FILE *st, DEVICE *dptr, UNIT *uptr, int32 flag, const char *cptr)
{ {
fprintf (st, "%s Tape Attach Help\n\n", dptr->name); fprintf (st, "%s Tape Attach Help\n\n", dptr->name);
if (0 == (uptr-dptr->units)) { if (0 == (uptr - dptr->units)) {
if (dptr->numunits > 1) { if (dptr->numunits > 1) {
uint32 i; uint32 i;
for (i=0; i < dptr->numunits; ++i) for (i = 0; i < dptr->numunits; ++i)
if (dptr->units[i].flags & UNIT_ATTABLE) if (dptr->units[i].flags & UNIT_ATTABLE)
fprintf (st, " sim> ATTACH {switches} %s%d tapefile\n\n", dptr->name, i); fprintf (st, " sim> ATTACH {switches} %s%d tapefile\n\n", dptr->name, i);
} }
@ -4306,7 +4306,7 @@ static void ansi_make_HDR2 (HDR2 *hdr, t_bool fixed_record, size_t block_size, s
hdr->record_format = ansi->record_format ? ansi->record_format : (fixed_record ? 'F' : 'D'); hdr->record_format = ansi->record_format ? ansi->record_format : (fixed_record ? 'F' : 'D');
sprintf (size, "%05d", (int)block_size); sprintf (size, "%05d", (int)block_size);
memcpy (hdr->block_length, size, sizeof (hdr->block_length)); memcpy (hdr->block_length, size, sizeof (hdr->block_length));
sprintf (size, "%05d", (ansi->zero_record_length)? 0 : (int)record_size); sprintf (size, "%05d", (ansi->zero_record_length) ? 0 : (int)record_size);
memcpy (hdr->record_length, size, sizeof (hdr->record_length)); memcpy (hdr->record_length, size, sizeof (hdr->record_length));
hdr->carriage_control = ansi->carriage_control ? ansi->carriage_control : (fixed_record ? 'M' : ' '); hdr->carriage_control = ansi->carriage_control ? ansi->carriage_control : (fixed_record ? 'M' : ' ');
memcpy (hdr->buffer_offset, "00", 2); memcpy (hdr->buffer_offset, "00", 2);
@ -4399,7 +4399,7 @@ static void memory_free_tape (void *vtape)
uint32 i; uint32 i;
MEMORY_TAPE *tape = (MEMORY_TAPE *)vtape; MEMORY_TAPE *tape = (MEMORY_TAPE *)vtape;
for (i=0; i<tape->record_count; i++) { for (i = 0; i < tape->record_count; i++) {
free (tape->records[i]); free (tape->records[i]);
tape->records[i] = NULL; tape->records[i] = NULL;
} }
@ -4530,7 +4530,7 @@ while (year >= 2000)
today = ((year - 70) * 1000) + tm->tm_yday + 1; today = ((year - 70) * 1000) + tm->tm_yday + 1;
sprintf (FullPath, "%s%s", directory, filename); sprintf (FullPath, "%s%s", directory, filename);
f = tape_open_and_check_file(FullPath); f = tape_open_and_check_file (FullPath);
if (f == NULL) if (f == NULL)
return; return;
@ -4588,7 +4588,7 @@ memory_tape_add_block (tape, NULL, 0);
++tape->file_count; ++tape->file_count;
} }
static FILE *tape_open_and_check_file(const char *filename) static FILE *tape_open_and_check_file (const char *filename)
{ {
FILE *file = fopen(filename, "rb"); FILE *file = fopen(filename, "rb");
@ -4621,7 +4621,7 @@ long last_cr = -1;
long last_lf = -1; long last_lf = -1;
long line_start = 0; long line_start = 0;
int chr; int chr;
long non_print_chars = 0; t_bool non_print_chars = FALSE;
long lf_lines = 0; long lf_lines = 0;
long crlf_lines = 0; long crlf_lines = 0;
@ -4631,8 +4631,10 @@ long crlf_lines = 0;
rewind (f); rewind (f);
while (EOF != (chr = fgetc (f))) { while (EOF != (chr = fgetc (f))) {
++pos; ++pos;
if (!isprint (chr) && (chr != '\r') && (chr != '\n') && (chr != '\t') && (chr != '\f')) if (!isprint (chr) && (chr != '\r') && (chr != '\n') && (chr != '\t') && (chr != '\f')) {
++non_print_chars; non_print_chars = TRUE;
break;
}
if (chr == '\r') if (chr == '\r')
last_cr = pos; last_cr = pos;
if (chr == '\n') { if (chr == '\n') {
@ -4700,7 +4702,7 @@ HDR2 hdr2;
HDR3 hdr3; HDR3 hdr3;
HDR4 hdr4; HDR4 hdr4;
f = tape_open_and_check_file(filename); f = tape_open_and_check_file (filename);
if (f == NULL) if (f == NULL)
return TRUE; return TRUE;
@ -4712,22 +4714,22 @@ if (ansi->fixed_text)
max_record_size = 512; max_record_size = 512;
ansi_make_HDR2 (&hdr2, !lf_line_endings && !crlf_line_endings, tape->block_size, max_record_size, tape->ansi_type); ansi_make_HDR2 (&hdr2, !lf_line_endings && !crlf_line_endings, tape->block_size, max_record_size, tape->ansi_type);
if (!ansi->nohdr3) { /* Need HDR3? */ if (!(ansi->nohdr3)) { /* Need HDR3? */
if (!lf_line_endings && !crlf_line_endings) /* Binary File? */ if (!lf_line_endings && !crlf_line_endings) /* Binary File? */
memcpy (&hdr3, ansi->hdr3_fixed, sizeof (hdr3)); memcpy (&hdr3, ansi->hdr3_fixed, sizeof (hdr3));
else { /* Text file */ else { /* Text file */
if ((lf_line_endings) && !(ansi->fixed_text)) if (lf_line_endings && !(ansi->fixed_text))
memcpy (&hdr3, ansi->hdr3_lf_line_endings, sizeof (hdr3)); memcpy (&hdr3, ansi->hdr3_lf_line_endings, sizeof (hdr3));
else else
memcpy (&hdr3, ansi->hdr3_crlf_line_endings, sizeof (hdr3)); memcpy (&hdr3, ansi->hdr3_crlf_line_endings, sizeof (hdr3));
} }
} }
memory_tape_add_block (tape, (uint8 *)&hdr1, sizeof (hdr1)); memory_tape_add_block (tape, (uint8 *)&hdr1, sizeof (hdr1));
if (!ansi->nohdr2) if (!(ansi->nohdr2))
memory_tape_add_block (tape, (uint8 *)&hdr2, sizeof (hdr2)); memory_tape_add_block (tape, (uint8 *)&hdr2, sizeof (hdr2));
if (!ansi->nohdr3) if (!(ansi->nohdr3))
memory_tape_add_block (tape, (uint8 *)&hdr3, sizeof (hdr3)); memory_tape_add_block (tape, (uint8 *)&hdr3, sizeof (hdr3));
if ((0 != memcmp (hdr4.extra_name_used, "00", 2)) && !ansi->nohdr3 && !ansi->nohdr2) if ((0 != memcmp (hdr4.extra_name_used, "00", 2)) && !(ansi->nohdr3) && !(ansi->nohdr2))
memory_tape_add_block (tape, (uint8 *)&hdr4, sizeof (hdr4)); memory_tape_add_block (tape, (uint8 *)&hdr4, sizeof (hdr4));
memory_tape_add_block (tape, NULL, 0); /* Tape Mark */ memory_tape_add_block (tape, NULL, 0); /* Tape Mark */
rewind (f); rewind (f);
@ -4757,11 +4759,11 @@ memcpy (hdr4.type, "EOF", sizeof (hdr4.type));
sprintf (block_count_string, "%06d", block_count); sprintf (block_count_string, "%06d", block_count);
memcpy (hdr1.block_count, block_count_string, sizeof (hdr1.block_count)); memcpy (hdr1.block_count, block_count_string, sizeof (hdr1.block_count));
memory_tape_add_block (tape, (uint8 *)&hdr1, sizeof (hdr1)); memory_tape_add_block (tape, (uint8 *)&hdr1, sizeof (hdr1));
if (!ansi->nohdr2) if (!(ansi->nohdr2))
memory_tape_add_block (tape, (uint8 *)&hdr2, sizeof (hdr2)); memory_tape_add_block (tape, (uint8 *)&hdr2, sizeof (hdr2));
if (!ansi->nohdr3) if (!(ansi->nohdr3))
memory_tape_add_block (tape, (uint8 *)&hdr3, sizeof (hdr3)); memory_tape_add_block (tape, (uint8 *)&hdr3, sizeof (hdr3));
if ((0 != memcmp (hdr4.extra_name_used, "00", 2)) && !ansi->nohdr3 && !ansi->nohdr2) if ((0 != memcmp (hdr4.extra_name_used, "00", 2)) && !(ansi->nohdr3) && !(ansi->nohdr2))
memory_tape_add_block (tape, (uint8 *)&hdr4, sizeof (hdr4)); memory_tape_add_block (tape, (uint8 *)&hdr4, sizeof (hdr4));
memory_tape_add_block (tape, NULL, 0); /* Tape Mark */ memory_tape_add_block (tape, NULL, 0); /* Tape Mark */
if (sim_switches & SWMASK ('V')) if (sim_switches & SWMASK ('V'))