*** empty log message ***
[h316.git] / pc-tools / ldc2 / src / main.cpp
index dc2d12473ce6e5ccd2501f1b2d6b1baa6d8f3779..35f4ce632b4d10636a6764783c6993819f914a6c 100644 (file)
@@ -2,11 +2,14 @@
  * 
  * LDC2 source code
  *
- * $Date: 2007/03/26 01:15:21 $
+ * $Date: 2007/03/26 03:20:31 $
  * $Author: hachti $
  *
  * $Log: main.cpp,v $
- * Revision 2.1  2007/03/26 01:15:21  hachti
+ * Revision 2.2  2007/03/26 03:20:31  hachti
+ * *** empty log message ***
+ *
+ * Revision 2.1  2007-03-26 01:15:21  hachti
  * *** empty log message ***
  *
  * Revision 2.0  2007-03-26 01:00:40  hachti
@@ -44,13 +47,14 @@ using namespace std;
 
 /******************************************************************************/
 
-static FILE * stdwarn; //! Suppressable warning output file pointer.
-static vector<tape_block*> tape; //! Represents the whole tape contents.
+static FILE * stdwarn;       //! Suppressable warning output file pointer.
+static vector<tape_block*> tape;     //! The whole tape contents.
 static vector<vector<tape_block*> > objects; //! Tape content in objects.
 
-static int errors=0;
-static int warnings=0;
-static int errcode=0;  //! Variable for error codes.
+static int errors  = 0;  //! Global error counter.
+static int warnings= 0;  //! Global warning counter.
+static int errcode = 0;  //! Error code for error exit routine.
+
 
 /******************************************************************************/
 /*!
@@ -65,6 +69,7 @@ void exit_on_error(){
     exit(errcode);
   }
 }
+
   
 /******************************************************************************/
 /*!
@@ -92,12 +97,13 @@ void read_tape(){
   
   while(read_ahead){
 
-    bool err_checksum=false;
-    bool err_integrity=false;
+    bool err_checksum=false;  //! Checksum error flag.
+    bool err_integrity=false; //! Integrity error flag.
     
-    bool warning=false;
-    bool error=false;
+    bool warning=false;       //! Warning flag.
+    bool error=false;         //! Error flag.
     
+    // Try to generate block
     try{
       block=tape_block::gen_from_fd(in_fd);
     }
@@ -109,7 +115,8 @@ void read_tape(){
     
     catch(tape_block::io_error_exception){
       if (in_fd){
-       fprintf(stderr,"Error: Could not read from \"%s\"!\n",cfg_infile.c_str());
+       fprintf(stderr,"Error: Could not read from \"%s\"!\n",
+               cfg_infile.c_str());
       } else {
        fprintf(stderr,"Error: Could not read from stdin!\n");
       }
@@ -208,8 +215,11 @@ void read_tape(){
 
 
 /******************************************************************************/
+/*!
+ *\brief Do integrity test and object or block dumps.
+ */
 void process_tape(){
-  if (cfg_verbose) fprintf(stdwarn,"Processing Tape.\n");
+  if (cfg_verbose) fprintf(stdwarn,"\nProcessing Data.\n");
   
   bool in_object=false;
   char filename[100];
@@ -227,7 +237,8 @@ void process_tape(){
        objname="EOT";
        if (in_object){
          if (cfg_ignore_object_integrity_errors){
-           fprintf(stdwarn,"Warning: Object integrity error!\n");
+           fprintf(stdwarn,"Warning: Object integrity error!\
+ (Object no %i, Block %i unexpected)\n",obj_no,i);
            warnings++;
          } else {
            fprintf(stderr,"Error: Object integrity error!\
@@ -238,8 +249,8 @@ void process_tape(){
          }
        }
       }
-    
     if (!in_object){ // object begin
+      
       obj_no++;
       obj_start_block=i;
       
@@ -253,7 +264,6 @@ void process_tape(){
          objname=objname.substr(0,objname.find_last_not_of(" ")+1);
          unknown_count--;
          break;
-         
        }
       }
            
@@ -263,11 +273,12 @@ void process_tape(){
       
       // Open file for split objects
       if (cfg_split_objects && (block->get_type()!=tape_block::TBT_EOT)){
-       if (objname=="UNKNOWN")snprintf(filename,99,"UNKNOWN%02i.obj",unknown_count);
+       if (objname=="UNKNOWN")snprintf(filename,99,"UNKNOWN%02i.obj",
+                                       unknown_count);
        else snprintf(filename,99,"%s.obj",objname.c_str());
        if (fd>-1) close (fd);
+       if (cfg_verbose) fprintf(stdwarn,"Writing file: %s\n",filename);
        fd=open(filename,O_WRONLY|O_CREAT|O_TRUNC,0666);
-       printf("opening \"%s\"\n",filename);
        if (fd<0){
          fprintf(stderr,"Error: could not open file \"%s\" for writing!\n",
                  filename);
@@ -280,7 +291,8 @@ void process_tape(){
       // Open file for split objects numbered
       snprintf(filename_numbered,99,"%03i0-%s.obj",obj_no,objname.c_str());
       if (cfg_split_objects_numbered){
-       if (fd_numbered>-1) close (fd_numbered);
+       close (fd_numbered);
+       if (cfg_verbose) fprintf(stdwarn,"Writing file: %s\n",filename_numbered);
        fd_numbered=open(filename_numbered,O_WRONLY|O_CREAT|O_TRUNC,0666);
        if (fd_numbered<0){
          fprintf(stderr,"Error: could not open file \"%s\" for writing!\n",
@@ -325,13 +337,17 @@ void process_tape(){
     // Output individual block file if desired
     if (cfg_split_blocks){
       char fname[100];
-      snprintf(fname,99,"%03i0-%s-%03i.block",obj_no,objname.c_str(),i-obj_start_block);
+      snprintf(fname,99,"%03i0-%s-%03i.block",obj_no,objname.c_str(),
+              i-obj_start_block);
+      if (cfg_verbose) fprintf(stdwarn,"Writing file: %s\n",fname);
       int fd_block=open(fname,O_WRONLY|O_TRUNC|O_CREAT,0666);
       if (fd_block<0){
          fprintf(stderr,"Error: could not open file \"%s\" for writing!\n",
                  fname);
          errors++;
          errcode=1;
+         close(fd);
+         close(fd_numbered);
          return;
       }
       try{
@@ -342,6 +358,8 @@ void process_tape(){
                fname);
        errors++;
        errcode=1;
+       close(fd);
+       close(fd_numbered);
        return;
       }
       close(fd_block);
@@ -349,19 +367,21 @@ void process_tape(){
     
     if (block->is_endblock()||(block->get_type()==tape_block::TBT_EOT)) {
       in_object=false; 
-      if (fd!=-1) close(fd);
-      if (fd_numbered!=-1) close(fd_numbered);
+      close(fd);
+      close(fd_numbered);
     }
   } // for (...)
   
   if (in_object){
     if (cfg_ignore_object_integrity_errors){
-      fprintf(stdwarn,"Warning: Object integrity error!\n");
+      fprintf(stdwarn,"Warning: Object integrity error! Last object incomplete!\n");
       warnings++;
     } else {
-      fprintf(stdwarn,"Error: Object integrity error!\n");
+      fprintf(stdwarn,"Error: Object integrity error! Last Object incomplete!\n");
       errors++;
       errcode=6;
+      if (fd!=-1) close(fd);
+      if (fd_numbered!=-1) close(fd_numbered);
       return;
     }
   }
@@ -371,11 +391,13 @@ void process_tape(){
 /*!
  *\brief Everything that has to do with symbol listing.
  */
-void process_called_imports(){
+void process_symbols(){
   vector<string>exported;
   vector<string>called;
   vector <string>unsatisfied;
-  
+
+  if (cfg_verbose) fprintf(stdwarn,"\nProcessing Symbols.\n");  
+
   for (unsigned int i=0; i<tape.size();i++){
     merge_vector_unique(exported,tape[i]->get_exported_symbols());
     merge_vector_unique(called,tape[i]->get_called_symbols());
@@ -415,7 +437,7 @@ void process_called_imports(){
     dump_vector_fp(unsatisfied,outp);
   }
 
-}
+} // process_symbols()
 
 /******************************************************************************/
 /*!
@@ -443,15 +465,22 @@ int main(int argc, char ** args){
   process_tape();
   exit_on_error();
 
-  process_called_imports();
+  process_symbols();
   exit_on_error();
-  
-  
+    
   if (warnings>0){
     fprintf(stdwarn,"Warnings:%i\n",warnings);
     return 99;
   }
-  if (cfg_verbose) fprintf(stdwarn,"Success.\n");
+  if (cfg_verbose) fprintf(stdwarn,"\nSuccess.\n");
   return 0;
+
+  /*
+   * All over this program, no memory is freed. This is not necessary because
+   * everything is allocated once and that's it.
+   * The classes support proper freeing of their internal buffers.
+   */
+
 } // main()
 
+/******************************************************************************/