ldc2: Cosmetic fixes and support for compiler orverride
[h316.git] / pc-tools / ldc2 / src / main.cpp
index dc2d12473ce6e5ccd2501f1b2d6b1baa6d8f3779..8b7da8788adc4e0753701545b23467a48f19bcd1 100644 (file)
@@ -2,11 +2,28 @@
  * 
  * LDC2 source code
  *
- * $Date: 2007/03/26 01:15:21 $
+ * $Date: 2010/01/04 02:10:59 $
  * $Author: hachti $
  *
  * $Log: main.cpp,v $
- * Revision 2.1  2007/03/26 01:15:21  hachti
+ * 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
 #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>
@@ -44,13 +66,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 +88,7 @@ void exit_on_error(){
     exit(errcode);
   }
 }
+
   
 /******************************************************************************/
 /*!
@@ -92,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);
     }
@@ -109,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");
       }
@@ -120,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";
@@ -134,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;
@@ -208,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];
@@ -227,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!\
@@ -238,8 +268,8 @@ void process_tape(){
          }
        }
       }
-    
     if (!in_object){ // object begin
+      
       obj_no++;
       obj_start_block=i;
       
@@ -253,7 +283,6 @@ void process_tape(){
          objname=objname.substr(0,objname.find_last_not_of(" ")+1);
          unknown_count--;
          break;
-         
        }
       }
            
@@ -263,11 +292,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);
-       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);
@@ -278,9 +308,10 @@ void process_tape(){
       }
 
       // 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",
@@ -325,13 +356,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 +377,8 @@ void process_tape(){
                fname);
        errors++;
        errcode=1;
+       close(fd);
+       close(fd_numbered);
        return;
       }
       close(fd_block);
@@ -349,19 +386,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 +410,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 +456,7 @@ void process_called_imports(){
     dump_vector_fp(unsatisfied,outp);
   }
 
-}
+} // process_symbols()
 
 /******************************************************************************/
 /*!
@@ -443,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()
 
+/******************************************************************************/