void tape_block::operator=(tape_block &org){
block_type=org.block_type;
init_state=org.init_state;
- data_read=org.data_read;
+ discarded_bytes=org.discarded_bytes;
raw_data=0;
raw_size=org.raw_size;
word_data=0;
return raw_size;
}
+/***************************************************************/
+/*!
+ *\brief Get amount of bytes discarded before beginning
+ * of block sensed.
+ *\return Length of unusable tape before block start delimiter.
+ */
+int tape_block::get_discarded_bytes(){
+ return discarded_bytes;
+}
+
/***************************************************************/
/*!
*\brief Access internal raw data buffer
eot_block * n_eot_block=0;
discard_block * n_discard_block=0;
+ //Use the private constructor which reads in the block from a file descriptor
n_tape_block=new tape_block(fd,input_start,input_stop,start_stop_arg);
// Retype to data_block, eot_block, discard_block - if possible
n_discard_block = new discard_block(*n_tape_block);
delete n_tape_block;
return n_discard_block;
- default:
- return n_tape_block;
+ default: // Unknown block, a bad thing!
+ return n_tape_block;
}
delete n_tape_block;
}
// Here only type 0 left
-
switch(n_data_block_0->get_subtype()){
case 000: n_data_block_0_x=new data_block_0_0(*n_data_block_0); break;
case 001: n_data_block_0_x=new data_block_0_1(*n_data_block_0); break;
block_type= TBT_DISCARD;
init_state= TBS_DEFAULT;
- data_read = 0;
+ discarded_bytes=0;
raw_data = 0;
raw_size = 0;
word_data = 0;
word_size = 0;
-
+ poolsize = 1024;
+
+ // Get initial portion of memory
+ raw_data=(unsigned char*)malloc(poolsize);
+
if (input_start) input_start (start_stop_arg);
/* Look for block start in input stream */
init_state=TBS_IOERR;
return;
}
- data_read++;
+ discarded_bytes++;
/* Look for end ot tape sequence */
switch(eot_needed){
if (buffer==EOT_SEQ_3){
raw_data=(unsigned char*)malloc(3);
raw_size=3;
+ discarded_bytes-=3;
raw_data[0]=EOT_SEQ_1;
raw_data[1]=EOT_SEQ_2;
raw_data[2]=EOT_SEQ_3;
break;
}
} while (buffer != (unsigned char) BLOCK_START_DELIMITER);
-
+ discarded_bytes--; // Dont want to declare the start delimiter discarded!
+ raw_size=1; // But we want to account it here!
/* Now input the block data */
block_complete = 0;
init_state=TBS_IOERR;
return;
}
- data_read++; // We have consumed a byte
/* sort in the new byte */
raw_size++;
- raw_data=(unsigned char*)realloc(raw_data,raw_size);
- raw_data[raw_size-1]=buffer;
+ // Need more memory??
+ if (raw_size==poolsize){
+ poolsize+=1024;
+ raw_data=(unsigned char*)realloc(raw_data,poolsize);
+ }
+
+ raw_data[raw_size-2]=buffer;
/* Look for end ot block sequence */
switch(eob_needed){
case 1:
if (buffer==BLOCK_END_DELIMITER_2){
raw_size-=EOB_LENGTH; // Don't want the delimiter(s) in the data!
- raw_data=(unsigned char*)realloc(raw_data,raw_size);
block_complete=1;
}
else eob_needed=EOB_LENGTH;
init_state=TBS_CHECKSUM;
return;
}
-
+ raw_size+=EOB_LENGTH; // Now we want it...
+
block_type=TBT_DATA;
init_state=TBS_OK;
}