X-Git-Url: http://gitweb.hachti.de/?a=blobdiff_plain;f=pc-tools%2Fldc2%2Fsrc%2Fmain.cpp;h=53c764e0f6e31870aa6da8122b46d4c1eb4da41c;hb=ea4c19a49ff6621c58e0c4bba5ab5d271a3604c8;hp=4c74b0338cc7cdd2f0612c02918654e8d6ba36d8;hpb=27bbb60df360a89da0116eb56cc6937ba1d5d85f;p=h316.git diff --git a/pc-tools/ldc2/src/main.cpp b/pc-tools/ldc2/src/main.cpp index 4c74b03..53c764e 100644 --- a/pc-tools/ldc2/src/main.cpp +++ b/pc-tools/ldc2/src/main.cpp @@ -1,30 +1,185 @@ -/* -$Id: main.cpp,v 1.2 2006/11/20 01:19:01 hachti Exp $ -*/ -#include -#include +/* ldc2 preliminary main program */ + +#include +#include + +#include "config.hh" +#include "tool.hh" #include "tape_block.hh" -#include "data_block.hh" - -void tape_start(void* m){ - printf("tape_start\n"); -} - -void tape_stop(void* m){ - printf("tape_stop\n"); -} - -int main(){ - tape_block * myblock=0; - do{ - if (myblock) delete myblock; - myblock=tape_block::gen_from_fd(0); - - vector desc=myblock->get_description(); - for (vector::iterator iter=desc.begin(); - iter!=desc.end();iter++) - printf("%s\n",(*iter).c_str()); - } while (myblock->get_state()==tape_block::TBS_OK); - return 0; -} +#include "data_block_0.hh" + +using namespace std; + +/*! + *\brief The main routine. + */ +int main(int argc, char ** args){ + + // Do all the configuration stuff + do_config(argc,args); + + // Now we go to read the data! + + + vector tape; + vector > objects; + vector current_object; + + tape_block * block=0; + bool read_ahead=true; + int read_pointer=0; + int block_start=0; + int block_end=0; + int blocks_read=0; + bool in_object=false; + int errors=0; + int warnings=0; + int errcode=0; + + while(read_ahead){ + block=tape_block::gen_from_fd(in_fd); + + block_start=read_pointer+block->get_discarded_bytes(); + block_end=block_start+block->get_raw_size()-1; + read_pointer=block_end+1; + //printf("Discarded:%2x, Raw Size:%2x\n",block->get_discarded_bytes(),block->get_raw_size()); + switch(block->get_state()){ // switchy + case tape_block::TBS_EOF_LEGAL: + delete block; + if (!in_object){ + fprintf(stderr,"File successfully read.\n"); + } else { + if (cfg_ignore_object_integrity_errors){ + fprintf(stderr,"Warning: Object integrity check failed!\n"); + warnings++; + } else { + fprintf(stderr,"Error: Object integrity check failed!\n"); + errors++; + errcode=6; + } + } + read_ahead=false; + break; + case tape_block::TBS_EOF_ILLEGAL: + delete block; + if (cfg_ignoreblock_errors){ + fprintf(stderr,"Warning: Block integrity check failed!\n"); + warnings++; + } else { + fprintf(stderr,"Error: Block integrity check failed!\n"); + errors++; + errcode=3; + } + read_ahead=false; + break; + case tape_block::TBS_CHECKSUM: + delete block; + char buffer[200]; + snprintf(buffer,200,"Block No. %3i: Start(hex):%5x End(hex):%5x Size(hex):%3x\n", + blocks_read-1, + block_start, + block_end, + block->get_raw_size()); + if (cfg_ignorechecksum_errors){ + char buffer[200]; + snprintf(buffer,200,"Block No. %3i: Start(hex):%5x End(hex):%5x Size(hex):%3x\n", + blocks_read-1, + block_start, + block_end, + block->get_raw_size()); + write (out_fd,buffer,strlen(buffer)); + fprintf(stderr,"Warning: Block checksum wrong!\n"); + fprintf(stderr,buffer); + warnings++; + } else { + fprintf(stderr,"Error: Block checksum wrong!\n"); + fprintf(stderr,buffer); + errors++; + read_ahead=false; + errcode=4; + } + break; + case tape_block::TBS_DEFAULT: + delete block; + fprintf(stderr,"TBS_DEFAULT encountered ->> SEVERE INTERNAL ERROR!\n"); + errors++; + errcode=100; + read_ahead=false; + break; + case tape_block::TBS_IOERR: + delete block; + if (in_fd){ + fprintf(stderr,"Error: Could not read from \"%s\"!\n",cfg_infile.c_str()); + } else { + fprintf(stderr,"Error: Could not read from stdin!\n"); + } + errors++; + read_ahead=false; + errcode=2; + case tape_block::TBS_OK: + tape.insert(tape.end(),block); + blocks_read++; + + if (cfg_verbose){ + char buffer[200]; + snprintf(buffer,200,"Block No. %3i: Start(hex):%5x End(hex):%5x Size(hex):%3x\n", + blocks_read-1, + block_start, + block_end, + block->get_raw_size()); + write (out_fd,buffer,strlen(buffer)); + } + + if(cfg_list_contents) + dump_vector(block->get_description()); + + if (block->get_type()==0x10){ // Unknown data block! + if (cfg_ignore_unknown_block_errors){ + fprintf(stderr,"Warning: Unknown block type!\n"); + warnings++; + }else { + fprintf(stderr,"Error: Unknown block type!\n"); + errors++; + errcode=5; + read_ahead=false; + } + } + + current_object.insert(current_object.end(),block); + + if ((block->get_type()==data_block::TBT_EOT) + ||((block->get_type()==0)&&(block->get_subtype()==3)) + ||((block->get_type()==4)||(block->get_type()==3)) + ||((block->get_type()==0)&&(block->get_subtype()==014))){ + in_object=false; + objects.insert(objects.end(),current_object); + current_object.clear(); + } else { + in_object=true; + } + + break; + } // switch + } // generate loop + close(in_fd); + + // Now we have our blocks, tell the user about that! + char buffer[200]; + sprintf(buffer,"Bytes read:%i Blocks read:%i\nErrors:%i Warnings:%i\n", + read_pointer,blocks_read,errors,warnings); + if(cfg_output_info){ + write (out_fd,buffer,strlen(buffer)); +// } else { +// fprintf(stderr,buffer); + } + + if (errors>0){ + fprintf(stderr,"Errors make me sick. Goodbye!\n"); + exit(errcode); + } + + + return 0; +} // main() +