LTP GCOV extension - code coverage report
Current view: directory - src/cpp/dev/idlc - idlc_main.cpp
Test: YAORB-0.2.info
Date: 2006-02-27 Instrumented lines: 172
Code covered: 55.2 % Executed lines: 95

       1                 : //==============================================================================
       2                 : // File <$/src/cpp/dev/idlc/idlc_main.cpp>
       3                 : // This file is part of YaOrb : Yet Another Object Request Broker,
       4                 : // Copyright (c) 2000-2003, 2006, Marc Alff.
       5                 : //
       6                 : // This program is free software; you can redistribute it and/or
       7                 : // modify it under the terms of the GNU General Public License
       8                 : // as published by the Free Software Foundation; either version 2
       9                 : // of the License, or (at your option) any later version.
      10                 : //
      11                 : // This program is distributed in the hope that it will be useful,
      12                 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
      13                 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      14                 : // GNU General Public License for more details.
      15                 : //
      16                 : // You should have received a copy of the GNU General Public License
      17                 : // along with this program; if not, write to the Free Software
      18                 : // Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
      19                 : //
      20                 : //==============================================================================
      21                 : 
      22                 : // Portability
      23                 : #include "yaorb/config.h"
      24                 : #include "src/cpp/prod/port/port_stdc.h"
      25                 : #include "src/cpp/prod/port/port_stdlib.h"
      26                 : 
      27                 : #include <stdio.h>
      28                 : #include <iostream>
      29                 : 
      30                 : #include "src/cpp/prod/tool/DEVELOPMENT.h"
      31                 : #include "src/cpp/prod/tool/Assert.h"
      32                 : 
      33                 : #include "src/cpp/prod/tool/String.h"
      34                 : #include "src/cpp/prod/tool/Version.h"
      35                 : 
      36                 : #include "src/cpp/dev/idlc/yyutils.h"
      37                 : #include "src/cpp/dev/idlc/compiler.h"
      38                 : #include "src/cpp/dev/idlc/sym_tab.h"
      39                 : #include "src/cpp/dev/idlc/back/lang_cpp/lang_cpp.h"
      40                 : #include "src/cpp/dev/idlc/back/lang_cpp/info.h"
      41                 : #include "src/cpp/dev/idlc/back/lang_java/lang_java.h"
      42                 : #include "src/cpp/dev/idlc/back/lang_java/javainfo.h"
      43                 : 
      44                 : // FIXME : use header file or automake config.h
      45                 : static const char* const G_DIR_SEPARATOR = "/" ;
      46                 : 
      47                 : // Command line options, general
      48              33 : String arg_input_file("") ;
      49              33 : String arg_output_file("") ;
      50              33 : String arg_output_dir("") ;
      51                 : StringList arg_directory ;
      52                 : bool arg_preprocessing_only ;
      53              33 : String arg_language("") ;
      54                 : 
      55                 : // Command line options, C++
      56              33 : String arg_cpp_stub("") ;
      57              33 : String arg_cpp_skel("") ;
      58              33 : String arg_cpp_impl("") ;
      59              33 : String arg_cpp_generate_module("") ;
      60                 : 
      61                 : // Command line options, Java
      62              33 : String arg_java_generate_module("") ;
      63                 : 
      64                 : // Debug code, not used
      65                 : // void ExitHandler(void)
      66                 : // {
      67                 : //    fprintf(stderr, " EXIT HANDLER\n") ;
      68                 : //    fflush(stderr) ;
      69                 : // }
      70                 : 
      71               0 : void MemHandler(void)
      72                 : {
      73               0 :    fprintf(stderr, " MEMORY HANDLER\n") ;
      74               0 :    fflush(stderr) ;
      75                 : }
      76                 : 
      77               0 : void Usage(FILE * where)
      78                 : {
      79                 :    static const char* text[] =
      80                 :    {
      81                 : "",
      82                 : "idlc : YAORB IDL Compiler",
      83                 : "=========================",
      84                 : "",
      85                 : "Copyright (C) 2000-2003, 2006, Marc Alff.",
      86                 : "",
      87                 : "Usage:",
      88                 : "idlc <<General Options>> <<Language specific options>>",
      89                 : "",
      90                 : "General Options:",
      91                 : "----------------",
      92                 : " -c <filename>     : input IDL source to compile",
      93                 : " -o <filename>     : basename for output files",
      94                 : " -odir <dirname>   : output directory",
      95                 : " -I <directory>    : add <directory> to the #include search path",
      96                 : " -E                : preprocessing only, do not generate code",
      97                 : " -D<macro>         : #define <macro> with value 1",
      98                 : " -D<macro>=<value> : #define <macro> with value <value>",
      99                 : " -U<macro>         : #undefine <macro>",
     100                 : " -language C++     : IDL->C++ mapping",
     101                 : " -language Java    : IDL->Java mapping",
     102                 : 
     103                 : #ifdef LATER
     104                 : " -language C       : IDL->C mapping (not supported in this release) ,",
     105                 : #endif
     106                 : 
     107                 : " --help            : print this help",
     108                 : " --version         : print version",
     109                 : 
     110                 : "",
     111                 : "IDL->C++ Specific Options:",
     112                 : "--------------------------",
     113                 : " -C++-Stub <pattern> : sprintf format for Stub classes (default \"%s_Stub\")",
     114                 : " -C++-Skel <pattern> : sprintf format for Skel classes (default \"%s_Skel\")",
     115                 : " -C++-Impl <pattern> : sprintf format for Impl classes (default \"%s_Impl\")",
     116                 : " -C++-Generate <Module> : Generate code for <Module> only",
     117                 : 
     118                 : "",
     119                 : "IDL->Java Specific Options:",
     120                 : "---------------------------",
     121                 : " -Java-Generate <Module> : Generate code for <Module> only",
     122                 : 
     123                 : NULL
     124                 :    } ;
     125                 : 
     126                 :    const char** tmp = & text[0] ;
     127                 : 
     128               0 :    while (*tmp != NULL)
     129                 :    {
     130               0 :       fprintf(where, "%s\n", *tmp) ;
     131                 :       tmp ++ ;
     132                 :    }
     133                 : }
     134                 : 
     135               0 : void Version(FILE * where)
     136                 : {
     137               0 :    PrintVersion(where) ;
     138               0 :    PrintSpecs(where) ;
     139                 : }
     140                 : 
     141              33 : void ParseArg(int argc, char* argv[])
     142                 : {
     143              33 :    if (argc < 1)
     144                 :    {
     145               0 :       Usage(stderr) ;
     146               0 :       exit(1) ;
     147                 :    }
     148                 : 
     149              33 :    argc -- ; argv ++ ; // Eat idlc
     150                 : 
     151             261 :    while (argc >= 1)
     152                 :    {
     153             228 :       if (argc >= 2)
     154                 :       {
     155             228 :          if (strcmp(argv[0], "-c") == 0)
     156                 :          {
     157              33 :             if (arg_input_file != "")
     158                 :             {
     159               0 :                Usage(stderr) ; // -c <filename> already specified
     160               0 :                exit(1) ;
     161                 :             }
     162                 : 
     163                 :             argc -- ; argv ++ ; // Eat -c
     164              33 :             arg_input_file = argv[0] ;
     165              33 :             argc -- ; argv ++ ; // Eat <filename>
     166                 : 
     167              33 :             continue ;
     168                 :          }
     169                 : 
     170             195 :          if (strcmp(argv[0], "-o") == 0)
     171                 :          {
     172              31 :             if (arg_output_file != "")
     173                 :             {
     174               0 :                Usage(stderr) ; // already specified
     175               0 :                exit(1) ;
     176                 :             }
     177                 : 
     178                 :             argc -- ; argv ++ ; // Eat -o
     179              31 :             arg_output_file = argv[0] ;
     180              31 :             argc -- ; argv ++ ; // Eat <filename>
     181                 : 
     182              31 :             continue ;
     183                 :          }
     184                 : 
     185             164 :          if (strcmp(argv[0], "-odir") == 0)
     186                 :          {
     187              31 :             if (arg_output_dir != "")
     188                 :             {
     189               0 :                Usage(stderr) ; // already specified
     190               0 :                exit(1) ;
     191                 :             }
     192                 : 
     193                 :             argc -- ; argv ++ ; // Eat -odir
     194              31 :             arg_output_dir = argv[0] ;
     195              31 :             argc -- ; argv ++ ; // Eat <dirname>
     196                 : 
     197              31 :             continue ;
     198                 :          }
     199                 : 
     200             133 :          if (strcmp(argv[0], "-I") == 0)
     201                 :          {
     202                 :             argc -- ; argv ++ ; // Eat -I
     203              69 :             String *dir = new String(argv[0]) ;
     204              69 :             argc -- ; argv ++ ; // Eat <dirname>
     205                 : 
     206                 :             arg_directory.addTail(dir) ;
     207                 : 
     208              69 :             continue ;
     209                 :          }
     210                 : 
     211              64 :          if (strncmp(argv[0], "-I", 2) == 0)
     212                 :          {
     213                 :             const char* dirname = & argv[0][2] ;
     214               0 :             String *dir = new String(dirname) ;
     215               0 :             argc -- ; argv ++ ; // Eat -I<dirname>
     216                 : 
     217                 :             arg_directory.addTail(dir) ;
     218                 : 
     219               0 :             continue ;
     220                 :          }
     221                 : 
     222              64 :          if (strcmp(argv[0], "-language") == 0)
     223                 :          {
     224              32 :             if (arg_language != "")
     225                 :             {
     226               0 :                Usage(stderr) ; // -language <lang_spec> already specified
     227               0 :                exit(1) ;
     228                 :             }
     229                 : 
     230                 :             argc -- ; argv ++ ; // Eat -language
     231              32 :             arg_language = argv[0] ;
     232              32 :             argc -- ; argv ++ ; // Eat <lang_spec>
     233                 : 
     234              34 :             if (   (arg_language != "C++")
     235                 :                 && (arg_language != "Java") )
     236                 :             {
     237               0 :                Usage(stderr) ;
     238               0 :                exit(1) ;
     239                 :             }
     240                 : 
     241                 :             continue ;
     242                 :          }
     243                 : 
     244              32 :          if (strcmp(argv[0], "-C++-Stub") == 0)
     245                 :          {
     246               0 :             if (arg_cpp_stub != "")
     247                 :             {
     248               0 :                Usage(stderr) ; // already specified
     249               0 :                exit(1) ;
     250                 :             }
     251                 : 
     252                 :             argc -- ; argv ++ ; // Eat -C++-Stub
     253               0 :             arg_cpp_stub = argv[0] ;
     254               0 :             argc -- ; argv ++ ; // Eat <pattern>
     255                 : 
     256               0 :             continue ;
     257                 :          }
     258                 : 
     259              32 :          if (strcmp(argv[0], "-C++-Skel") == 0)
     260                 :          {
     261               0 :             if (arg_cpp_skel != "")
     262                 :             {
     263               0 :                Usage(stderr) ; // already specified
     264               0 :                exit(1) ;
     265                 :             }
     266                 : 
     267                 :             argc -- ; argv ++ ; // Eat -C++-Skel
     268               0 :             arg_cpp_skel = argv[0] ;
     269               0 :             argc -- ; argv ++ ; // Eat <pattern>
     270                 : 
     271               0 :             continue ;
     272                 :          }
     273                 : 
     274              32 :          if (strcmp(argv[0], "-C++-Impl") == 0)
     275                 :          {
     276               0 :             if (arg_cpp_impl != "")
     277                 :             {
     278               0 :                Usage(stderr) ; // already specified
     279               0 :                exit(1) ;
     280                 :             }
     281                 : 
     282                 :             argc -- ; argv ++ ; // Eat -C++-Impl
     283               0 :             arg_cpp_impl = argv[0] ;
     284               0 :             argc -- ; argv ++ ; // Eat <pattern>
     285                 : 
     286               0 :             continue ;
     287                 :          }
     288                 : 
     289              32 :          if (strcmp(argv[0], "-C++-Generate") == 0)
     290                 :          {
     291              30 :             if (arg_cpp_generate_module != "")
     292                 :             {
     293               0 :                Usage(stderr) ; // already specified
     294               0 :                exit(1) ;
     295                 :             }
     296                 : 
     297                 :             argc -- ; argv ++ ; // Eat -C++-Generate
     298              30 :             arg_cpp_generate_module = argv[0] ;
     299              30 :             argc -- ; argv ++ ; // Eat <Module>
     300                 : 
     301              30 :             continue ;
     302                 :          }
     303                 : 
     304               2 :          if (strcmp(argv[0], "-Java-Generate") == 0)
     305                 :          {
     306               2 :             if (arg_java_generate_module != "")
     307                 :             {
     308               0 :                Usage(stderr) ; // already specified
     309               0 :                exit(1) ;
     310                 :             }
     311                 : 
     312                 :             argc -- ; argv ++ ; // Eat -Java-Generate
     313               2 :             arg_java_generate_module = argv[0] ;
     314               2 :             argc -- ; argv ++ ; // Eat <Module>
     315                 : 
     316               2 :             continue ;
     317                 :          }
     318                 :       }
     319                 : 
     320               0 :       if (strncmp(argv[0], "-D", 2) == 0)
     321                 :       {
     322               0 :          NON_DEV("option -D") ;
     323               0 :          argc -- ; argv ++ ;
     324                 : 
     325               0 :          continue ;
     326                 :       }
     327                 : 
     328               0 :       if (strncmp(argv[0], "-U", 2) == 0)
     329                 :       {
     330               0 :          NON_DEV("option -U") ;
     331               0 :          argc -- ; argv ++ ;
     332                 : 
     333               0 :          continue ;
     334                 :       }
     335                 : 
     336               0 :       if (strncmp(argv[0], "-E", 2) == 0)
     337                 :       {
     338               0 :          arg_preprocessing_only = true ;
     339               0 :          argc -- ; argv ++ ;
     340                 : 
     341               0 :          continue ;
     342                 :       }
     343                 : 
     344               0 :       if (strcmp(argv[0], "--help") == 0)
     345                 :       {
     346                 :          argc -- ; argv ++ ; // eat --help
     347                 : 
     348               0 :          Usage(stdout) ;
     349               0 :          exit(0) ;
     350                 :       }
     351                 : 
     352               0 :       if (strcmp(argv[0], "--version") == 0)
     353                 :       {
     354                 :          argc -- ; argv ++ ; // eat --version
     355                 : 
     356               0 :          Version(stdout) ;
     357               0 :          exit(0) ;
     358                 :       }
     359                 : 
     360               0 :       if (strncmp(argv[0], "-", 1) == 0)
     361                 :       {
     362               0 :          fprintf(stderr, "Unknown option %s\n", argv[0]) ;
     363               0 :          Usage(stderr) ;
     364               0 :          exit(1) ;
     365                 :       }
     366                 : 
     367               0 :       if (arg_input_file != "")
     368                 :       {
     369               0 :          Usage(stderr) ; // -c <filename>  or <filename> already specified
     370               0 :          exit(1) ;
     371                 :       }
     372                 : 
     373               0 :       arg_input_file = argv[0] ;
     374               0 :       argc -- ; argv ++ ; // Eat <filename>
     375                 :    }
     376                 : 
     377                 :    // defaults
     378                 : 
     379              33 :    if (arg_language == "")
     380                 :    {
     381               1 :       arg_language = "C++" ;
     382                 :    }
     383                 : 
     384              33 :    if (arg_output_file == "")
     385                 :    {
     386               2 :       char *tmp = strdup(arg_input_file) ;
     387               2 :       int len = strlen(tmp) ;
     388                 : 
     389               2 :       if (len > 4)
     390                 :       {
     391                 :          char *end = & tmp [len - 4] ;
     392               2 :          if (strcasecmp(end, ".idl") == 0)
     393                 :          {
     394                 :             len -= 4 ; // truncate .idl
     395               2 :             tmp[len] = '\0' ;
     396                 :          }
     397                 :       }
     398                 : 
     399               2 :       arg_output_file = tmp ;
     400               2 :       free (tmp) ;
     401                 :    }
     402                 : 
     403              33 :    if (arg_output_dir != "")
     404                 :    {
     405              31 :       int len = strlen(arg_output_dir) ;
     406              31 :       const char* tmpStr = arg_output_dir ;
     407                 :       char last = tmpStr[len-1] ;
     408                 : 
     409              31 :       if (last != G_DIR_SEPARATOR[0])
     410                 :       {
     411              31 :          arg_output_dir += G_DIR_SEPARATOR ;
     412                 :       }
     413                 :    }
     414                 : }
     415                 : 
     416              33 : int main(int argc, char *argv[])
     417                 : {
     418              33 :    int nb_err = 0 ;
     419              33 :    int nb_warn = 0 ;
     420                 : 
     421              33 :    std::set_new_handler(MemHandler) ;
     422                 :    // atexit(ExitHandler) ;
     423                 : 
     424              33 :    ParseArg(argc, argv) ;
     425                 : 
     426                 :    SymbolTable *symTab = NULL ;
     427                 : 
     428                 :    symTab = CompileIDL(
     429                 :       arg_input_file,
     430                 :       arg_directory,
     431                 :       nb_err,
     432                 :       nb_warn,
     433              33 :       arg_preprocessing_only) ;
     434                 : 
     435                 :    arg_directory.clearAndDestroy() ;
     436                 : 
     437              33 :    if (nb_err == 0)
     438                 :    {
     439              30 :       if (arg_language == "C++")
     440                 :       {
     441              28 :          LangCpp mapping ;
     442                 : 
     443              28 :          if (arg_cpp_stub != "")
     444                 :          {
     445               0 :             CppInfo::SetStubPattern(arg_cpp_stub) ;
     446                 :          }
     447                 : 
     448              28 :          if (arg_cpp_skel != "")
     449                 :          {
     450               0 :             CppInfo::SetSkelPattern(arg_cpp_skel) ;
     451                 :          }
     452                 : 
     453              28 :          if (arg_cpp_impl != "")
     454                 :          {
     455               0 :             CppInfo::SetImplPattern(arg_cpp_impl) ;
     456                 :          }
     457                 : 
     458              28 :          if (arg_cpp_generate_module != "")
     459                 :          {
     460              27 :             mapping.SetGenerateOption(arg_cpp_generate_module) ;
     461                 :          }
     462                 : 
     463              28 :          mapping.SetOutputFile(arg_output_file) ;
     464                 : 
     465              28 :          mapping.SetOutputDir(arg_output_dir) ;
     466                 : 
     467              28 :          mapping.GenerateCode(symTab) ;
     468                 :       }
     469               2 :       else if (arg_language == "Java")
     470                 :       {
     471               2 :          LangJava mapping ;
     472                 : 
     473               2 :          if (arg_java_generate_module != "")
     474                 :          {
     475               2 :             mapping.SetGenerateOption(arg_java_generate_module) ;
     476                 :          }
     477                 : 
     478               2 :          mapping.SetOutputDir(arg_output_dir) ;
     479                 : 
     480               2 :          mapping.GenerateCode(symTab) ;
     481                 :       }
     482                 :    }
     483                 :    else
     484                 :    {
     485               3 :       errLog << "Code generation aborted due to errors." << std::endl ;
     486               9 :       errLog << nb_err << " errors, " << nb_warn << " warnings." << std::endl ;
     487                 :    }
     488                 : 
     489              33 :    delete symTab ;
     490                 : 
     491                 :    return 0 ;
     492              33 : }
     493              33 : 

Generated by: LTP GCOV extension version 1.4