*** empty log message ***
[h316.git] / pc-tools / ldc2 / src / tape_block.cpp
index 0d011ebb0392b59635a3becec22f5c71eb3776c6..ecc02376a8681590bd9f20b3d2eacd631edbba00 100644 (file)
 #include "data_block_0_54.hh"
 #include "data_block_0_60.hh"
 #include "data_block_0_50.hh"
+#include "data_block_0_64.hh"
+#include "data_block_1.hh"
+#include "data_block_2.hh"
+#include "data_block_3.hh"
+#include "data_block_4.hh"
+#include "data_block_5.hh"
+#include "data_block_6.hh"
+#include "data_block_7.hh"
 
 #include "eot_block.hh"
 #include "discard_block.hh"
@@ -51,7 +59,7 @@ tape_block::tape_block(tape_block & org){
 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;
@@ -129,6 +137,16 @@ int tape_block::get_raw_size(){
   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
@@ -176,6 +194,7 @@ unsigned char * tape_block::get_raw_data(){
  *     - data_block_0_50
  *     - data_block_0_54
  *     - data_block_0_60
+ *     - data_block_0_64
  *   - data_block_1
  *   - data_block_2
  *   - data_block_3
@@ -199,75 +218,75 @@ tape_block * tape_block::gen_from_fd(int  fd,
                                     void (*input_stop)(void *),
                                     void * start_stop_arg)
 {
-  tape_block * res_block;
-  res_block=new tape_block(fd,input_start,input_stop,start_stop_arg);
-  data_block    * d_block;
-  data_block_0  * d0_block;
-  eot_block     * e_block;
-  discard_block * di_block;
-
-  // Retype to data_block if possible
-  switch(res_block->get_type()){
-  case tape_block::TBT_DATA:    // Make pointer a data block
-    d_block=new data_block(*res_block);
-    delete res_block;
-    res_block=d_block;
+  tape_block  * n_tape_block=0;
+  data_block  * n_data_block=0;
+  data_block  * n_data_block_x=0;
+  data_block_0  * n_data_block_0=0;
+  data_block_0  * n_data_block_0_x=0;
+  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
+  switch(n_tape_block->get_type()){
+  case tape_block::TBT_DATA:
+    n_data_block = new data_block(*n_tape_block); 
     break;
   case tape_block::TBT_EOT:
-    e_block=new eot_block(*res_block);
-    delete res_block;
-    res_block=e_block;
-    break;
+    n_eot_block=new eot_block(*n_tape_block); 
+    delete n_tape_block;
+    return n_eot_block;
   case tape_block::TBT_DISCARD:
-    di_block=new discard_block(*res_block);
-    delete res_block;
-    res_block=di_block;
-    break;
-  default:          // All other cases
-    return res_block;
+    n_discard_block = new discard_block(*n_tape_block); 
+    delete n_tape_block;
+    return n_discard_block;
+  default: // Unknown block, a bad thing!         
+    return n_tape_block; 
   }
-  
-  // Retype again, if it's a data_block now
-  
-  switch(res_block->get_type()){
-  case 00: 
-    d0_block=new data_block_0(*d_block); 
-    d_block=d0_block;
-    break;
-//   case 01: d_block=new data_block_1(*d_block); break;
-//   case 02: d_block=new data_block_2(*d_block); break;
-//   case 03: d_block=new data_block_3(*d_block); break;
-//   case 04: d_block=new data_block_4(*d_block); break;
-//   case 05: d_block=new data_block_5(*d_block); break;
-//   case 06: d_block=new data_block_6(*d_block); break;
-//   case 07: d_block=new data_block_7(*d_block); break;
+  delete n_tape_block;
+
+  // Now only data blocks are left
+
+  switch(n_data_block->get_type()){
+  case 00: n_data_block_0=new data_block_0(*n_data_block); break;
+  case 01: n_data_block_x=new data_block_1(*n_data_block); break;
+  case 02: n_data_block_x=new data_block_2(*n_data_block); break;
+  case 03: n_data_block_x=new data_block_3(*n_data_block); break;
+  case 04: n_data_block_x=new data_block_4(*n_data_block); break;
+  case 05: n_data_block_x=new data_block_5(*n_data_block); break;
+  case 06: n_data_block_x=new data_block_6(*n_data_block); break;
+  case 07: n_data_block_x=new data_block_7(*n_data_block); break;
   default:
-    return res_block;
+    return n_data_block;
+  }
+  if (n_data_block_0==0){ // So we must have found another one
+    delete n_data_block;
+    return n_data_block_x;
   }
-  delete res_block;
-  res_block=d_block;
   
-  if (res_block->get_type()==0) switch(d0_block->get_subtype()){
-  case 000: d0_block=new data_block_0_0(*d0_block); break;
-  case 001: d0_block=new data_block_0_1(*d0_block); break;
-  case 002: d0_block=new data_block_0_2(*d0_block); break;
-  case 003: d0_block=new data_block_0_3(*d0_block); break;
-  case 004: d0_block=new data_block_0_4(*d0_block); break;
-  case 010: d0_block=new data_block_0_10(*d0_block); break;
-  case 014: d0_block=new data_block_0_14(*d0_block); break;
-  case 024: d0_block=new data_block_0_24(*d0_block); break;
-  case 044: d0_block=new data_block_0_44(*d0_block); break;
-  case 030: d0_block=new data_block_0_30(*d0_block); break;
-  case 054: d0_block=new data_block_0_54(*d0_block); break;
-  case 060: d0_block=new data_block_0_60(*d0_block); break;
-  case 050: d0_block=new data_block_0_50(*d0_block); break;
+  // 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;
+  case 002: n_data_block_0_x=new data_block_0_2(*n_data_block_0); break;
+  case 003: n_data_block_0_x=new data_block_0_3(*n_data_block_0); break;
+  case 004: n_data_block_0_x=new data_block_0_4(*n_data_block_0); break;
+  case 010: n_data_block_0_x=new data_block_0_10(*n_data_block_0); break;
+  case 014: n_data_block_0_x=new data_block_0_14(*n_data_block_0); break;
+  case 024: n_data_block_0_x=new data_block_0_24(*n_data_block_0); break;
+  case 044: n_data_block_0_x=new data_block_0_44(*n_data_block_0); break;
+  case 030: n_data_block_0_x=new data_block_0_30(*n_data_block_0); break;
+  case 054: n_data_block_0_x=new data_block_0_54(*n_data_block_0); break;
+  case 060: n_data_block_0_x=new data_block_0_60(*n_data_block_0); break;
+  case 064: n_data_block_0_x=new data_block_0_64(*n_data_block_0); break;
+  case 050: n_data_block_0_x=new data_block_0_50(*n_data_block_0); break;
   default:
-    return res_block;
+    return n_data_block_0;
   }
-  delete res_block;
-  res_block=d0_block;
-  return res_block;
+  delete n_data_block_0;
+  return n_data_block_0_x;
 }
 
 /***************************************************************/
@@ -326,12 +345,16 @@ tape_block::tape_block (int  fd,
 
   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 */
@@ -347,7 +370,7 @@ tape_block::tape_block (int  fd,
       init_state=TBS_IOERR;
       return;
     }
-    data_read++;
+    discarded_bytes++;
     
     /* Look for end ot tape sequence */
     switch(eot_needed){
@@ -363,6 +386,7 @@ tape_block::tape_block (int  fd,
       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;
@@ -374,7 +398,8 @@ tape_block::tape_block (int  fd,
       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;
@@ -391,12 +416,16 @@ tape_block::tape_block (int  fd,
       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){
@@ -407,7 +436,6 @@ tape_block::tape_block (int  fd,
     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;
@@ -427,7 +455,8 @@ tape_block::tape_block (int  fd,
     init_state=TBS_CHECKSUM;
     return;
   }
-  
+  raw_size+=EOB_LENGTH; // Now we want it...
+
   block_type=TBT_DATA;    
   init_state=TBS_OK;
 }