ldc2: Cosmetic fixes and support for compiler orverride
[h316.git] / pc-tools / ldc2 / src / main.cpp
index eafdf6a1d309fc38aeedb5ec2f5765e778638f5e..8b7da8788adc4e0753701545b23467a48f19bcd1 100644 (file)
@@ -1,12 +1,49 @@
-/* ldc2 preliminary main program */
-
+/******************************************************************************
+ * 
+ * LDC2 source code
+ *
+ * $Date: 2010/01/04 02:10:59 $
+ * $Author: hachti $
+ *
+ * $Log: main.cpp,v $
+ * Revision 2.6  2010/01/04 02:10:59  hachti
+ * *** empty log message ***
+ *
+ * Revision 2.5  2008-10-01 13:30:14  hachti
+ * Added some includes
+ *
+ * Revision 2.4  2008-08-25 21:02:24  hachti
+ * *** empty log message ***
+ *
+ * Revision 2.3  2007-05-30 02:51:16  hachti
+ * Changed everything towards LDC2 use.
+ * Worked on the buildlib.sh.
+ * Centralized  buildlib.sh to a new lib/common directory.
+ *
+ * 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
+ * *** empty log message ***
+ *
+ *
+ ******************************************************************************/
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdlib.h>
+
 
 #include <vector>
 #include <string>
-
+  
 #include "config.hh"
 #include "tool.hh"
 
@@ -29,21 +66,29 @@ 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.
 
 
+/******************************************************************************/
+/*!
+ *\brief Error exit routine.
+ *
+ * This routine tests the global error counter and terminates the program
+ * if necessary.
+ */
 void exit_on_error(){
   if (errors){
     fprintf(stderr,"Failed. (%i)\n",errcode);
     exit(errcode);
   }
 }
+
   
 /******************************************************************************/
 /*!
@@ -71,12 +116,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);
     }
@@ -88,7 +134,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");
       }
@@ -99,7 +146,7 @@ void read_tape(){
     
     catch(tape_block::eof_illegal_exception &e){
       block=e.get_block();
-      err_integrity=true;
+      //      err_integrity=true;
       read_ahead=false;
       if (cfg_ignore_block_errors){
        message="Warning: Block integrity check failed!\n";
@@ -113,7 +160,7 @@ void read_tape(){
     
     catch(tape_block::checksum_error_exception &e){
       block=e.get_block();
-      err_checksum=true;
+      //      err_checksum=true;
       if (cfg_ignore_checksum_errors){
        message="Warning: Block checksum wrong!\n";
        warning=true;
@@ -187,8 +234,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];
@@ -206,7 +256,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!\
@@ -217,8 +268,8 @@ void process_tape(){
          }
        }
       }
-    
     if (!in_object){ // object begin
+      
       obj_no++;
       obj_start_block=i;
       
@@ -232,7 +283,6 @@ void process_tape(){
          objname=objname.substr(0,objname.find_last_not_of(" ")+1);
          unknown_count--;
          break;
-         
        }
       }
            
@@ -242,27 +292,33 @@ 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);
-       else snprintf(filename,99,"%s.obj",objname.c_str());
+       if (objname=="UNKNOWN")snprintf(filename,99,"UNKNOWN%02i",
+                                       unknown_count);
+       else snprintf(filename,99,"%s",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);
-       exit (1);
+         errors++;
+         errcode=1;
+         return;
        }
       }
 
       // Open file for split objects numbered
-      snprintf(filename_numbered,99,"%03i0-%s.obj",obj_no,objname.c_str());
+      snprintf(filename_numbered,99,"%03i0-%s",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",
                  filename_numbered);
-       exit (1);
+         errors++;
+         errcode=1;
+         return;
        }
       }
       in_object=true;
@@ -277,7 +333,9 @@ void process_tape(){
       catch (tape_block::io_error_exception e){
        fprintf(stderr,"Error: could write to file \"%s\"!\n",
                filename);
-       exit (1);
+       errors++;
+       errcode=1;
+       return;
       }
     } // if (cfg_split_objects)
 
@@ -289,19 +347,27 @@ void process_tape(){
       catch (tape_block::io_error_exception e){
        fprintf(stderr,"Error: could write to file \"%s\"!\n",
                filename_numbered);
-       exit (1);
+         errors++;
+         errcode=1;
+         return;
       }
     } // if (cfg_split_objects_numbered)
 
     // 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);
-       exit (1);
+         errors++;
+         errcode=1;
+         close(fd);
+         close(fd_numbered);
+         return;
       }
       try{
        block->dump_to_fd(fd_block);
@@ -309,38 +375,48 @@ void process_tape(){
       catch (tape_block::io_error_exception e){
        fprintf(stderr,"Error: could write to file \"%s\"!\n",
                fname);
-       exit (1);
+       errors++;
+       errcode=1;
+       close(fd);
+       close(fd_numbered);
+       return;
       }
       close(fd_block);
     }
     
     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;
     }
   }
-   
-
 } // process_tape()
 
-void process_called_imports(){
+/******************************************************************************/
+/*!
+ *\brief Everything that has to do with symbol listing.
+ */
+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());
@@ -380,11 +456,12 @@ void process_called_imports(){
     dump_vector_fp(unsatisfied,outp);
   }
 
-}
+} // process_symbols()
 
 /******************************************************************************/
 /*!
  *\brief The main routine.
+ *
  */
 int main(int argc, char ** args){
 
@@ -407,15 +484,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()
 
+/******************************************************************************/