X-Git-Url: http://gitweb.hachti.de/?a=blobdiff_plain;f=pc-tools%2Fldc2%2Fsrc%2Ftape_block.cpp;h=ecc02376a8681590bd9f20b3d2eacd631edbba00;hb=fed2c751d37bf5e314fd26c98909471157cc86c0;hp=30f9819971a600528b7b68950a2ddcdd605c24d9;hpb=6c06db96fb1c7482f8cb7e1d14eee91603fbb894;p=h316.git diff --git a/pc-tools/ldc2/src/tape_block.cpp b/pc-tools/ldc2/src/tape_block.cpp index 30f9819..ecc0237 100644 --- a/pc-tools/ldc2/src/tape_block.cpp +++ b/pc-tools/ldc2/src/tape_block.cpp @@ -1,14 +1,35 @@ #include #include #include - -#include -#include +#include #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 "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" #include "silent_code.hh" #include "hw_constants.hh" @@ -38,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; @@ -101,11 +122,9 @@ int tape_block::get_subtype(){ *\return ldc style descriptive line for the block */ vector tape_block:: get_description(){ - char buffer[100]; - sprintf(buffer," (%0o-%02o) Untyped tape block", - get_type(),get_subtype()); vector result; - result.insert(result.end(),buffer); + result.insert(result.end(), + "***** "+get_typestring()+"Untyped tape block"); return result; } @@ -118,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 @@ -135,7 +164,7 @@ unsigned char * tape_block::get_raw_data(){ *\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 @@ -147,30 +176,32 @@ unsigned char * tape_block::get_raw_data(){ * 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_0_64 + * - 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. @@ -187,62 +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; + 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; - // 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; - break; - default: // All other cases - return res_block; - } - - // Retype again, if it's a data_block now + //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); - switch(res_block->get_type()){ - case 00: - d0_block=new data_block_0(*d_block); - d_block=d0_block; + // 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 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; + case tape_block::TBT_EOT: + n_eot_block=new eot_block(*n_tape_block); + delete n_tape_block; + return n_eot_block; + case tape_block::TBT_DISCARD: + 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; + } + 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_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; + // 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; } /***************************************************************/ @@ -251,6 +295,20 @@ tape_block * tape_block::gen_from_fd(int fd, */ 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); +} /***************************************************************/ /*! @@ -287,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 */ @@ -308,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){ @@ -324,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; @@ -335,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; @@ -352,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){ @@ -368,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; @@ -388,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; }