#include <stdlib.h>
#include <unistd.h>
#include <string.h>
-
-#include <string>
-#include <vector>
+#include <stdio.h>
#include "tape_block.hh"
#include "data_block.hh"
#include "data_block_0.hh"
+#include "data_block_0_0.hh"
+#include "data_block_0_1.hh"
+#include "data_block_0_2.hh"
+#include "data_block_0_3.hh"
+#include "data_block_0_4.hh"
+#include "data_block_0_10.hh"
+#include "data_block_0_14.hh"
+#include "data_block_0_24.hh"
+#include "data_block_0_44.hh"
+#include "data_block_0_30.hh"
+#include "data_block_0_54.hh"
+#include "data_block_0_60.hh"
+#include "data_block_0_50.hh"
+#include "eot_block.hh"
+#include "discard_block.hh"
#include "silent_code.hh"
#include "hw_constants.hh"
*\return ldc style descriptive line for the block
*/
vector<string> tape_block:: get_description(){
- char buffer[100];
- sprintf(buffer," (%0o-%02o) Untyped tape block",
- get_type(),get_subtype());
vector<string> result;
- result.insert(result.end(),buffer);
+ result.insert(result.end(),
+ "***** "+get_typestring()+"Untyped tape block");
return result;
}
*\brief Static factory method with file descriptor support.
*
* This method creates a tape_block by using the private
- * constructor with file descriptor support.\t
+ * constructor with file descriptor support.\n
* It always returns a valid pointer, errors
* or exceptional conditions during creation are marked in the
* object's state.\n
* This allows for easy use of the object using it's virtual
* interface methods or a cast of the pointer to a sub type pointer
* according to the type information, and then using the subtype's
- * methods not already present in tape_block.\t
- * Objects of the following subclasses are automagically generated:\t
+ * methods not already present in tape_block.\n
+ * Objects of the following subclasses are automagically generated:\n
* - eot_block
+ * - discard_block
* - data_block
- * -data_block_0
- * -data_block_0_0
- * -data_block_0_1
- * -data_block_0_2
- * -data_block_0_3
- * -data_block_0_4
- * -data_block_0_10
- * -data_block_0_14
- * -data_block_0_24
- * -data_block_0_30
- * -data_block_0_50
- * -data_block_0_54
- * -data_block_0_60
- * -data_block_1
- * -data_block_2
- * -data_block_3
- * -data_block_4
- * -data_block_5
- * -data_block_6
- * -data_block_7
+ * - data_block_0
+ * - data_block_0_0
+ * - data_block_0_1
+ * - data_block_0_2
+ * - data_block_0_3
+ * - data_block_0_4
+ * - data_block_0_10
+ * - data_block_0_14
+ * - data_block_0_24
+ * - data_block_0_30
+ * - data_block_0_50
+ * - data_block_0_54
+ * - data_block_0_60
+ * - data_block_1
+ * - data_block_2
+ * - data_block_3
+ * - data_block_4
+ * - data_block_5
+ * - data_block_6
+ * - data_block_7
*
*\return Pointer to an object of type tape_block or a subclass.
*\param fd A file descriptor where the read is taken from.
{
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;
-
+ 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
delete res_block;
res_block=d_block;
break;
+ case tape_block::TBT_EOT:
+ e_block=new eot_block(*res_block);
+ delete res_block;
+ res_block=e_block;
+ break;
+ 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;
}
res_block=d_block;
if (res_block->get_type()==0) switch(d0_block->get_subtype()){
-// case 000: d0_block=new data_block_0_00(d0_block); break;
-// case 001: d0_block=new data_block_0_01(d0_block); break;
-// case 002: d0_block=new data_block_0_02(d0_block); break;
-// case 003: d0_block=new data_block_0_03(d0_block); break;
-// case 004: d0_block=new data_block_0_04(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 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 060: d0_block=new data_block_0_50(d0_block); break;
+ 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;
default:
return res_block;
}
*/
tape_block::tape_block(){}
+/***************************************************************/
+/*!
+ *\brief get a short type description string.
+ *\return A small string to be used in description methods.
+ *
+ * The string is always 19 characters long.\n
+ * An example is "(99-99) ".
+ */
+string tape_block::get_typestring(){
+ char buffer[13];
+ sprintf(buffer,"(%o-%o) ",get_type(),get_subtype());
+ buffer[10]=0;
+ return string(buffer);
+}
/***************************************************************/
/*!