LCOV - code coverage report
Current view: top level - src - ucs.cpp (source / functions) Hit Total Coverage
Test: qucs-core-0.0.19 Code Coverage Lines: 68 102 66.7 %
Date: 2015-01-05 16:01:02 Functions: 3 3 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 77 216 35.6 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * ucs.cpp - main program implementation
       3                 :            :  *
       4                 :            :  * Copyright (C) 2003-2009 Stefan Jahn <stefan@lkcc.org>
       5                 :            :  *
       6                 :            :  * This is free software; you can redistribute it and/or modify
       7                 :            :  * it under the terms of the GNU General Public License as published by
       8                 :            :  * the Free Software Foundation; either version 2, or (at your option)
       9                 :            :  * any later version.
      10                 :            :  *
      11                 :            :  * This software 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 package; see the file COPYING.  If not, write to
      18                 :            :  * the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
      19                 :            :  * Boston, MA 02110-1301, USA.
      20                 :            :  *
      21                 :            :  * $Id$
      22                 :            :  *
      23                 :            :  */
      24                 :            : 
      25                 :            : #if HAVE_CONFIG_H
      26                 :            : # include <config.h>
      27                 :            : #endif
      28                 :            : 
      29                 :            : #include <stdio.h>
      30                 :            : #include <stdlib.h>
      31                 :            : #include <assert.h>
      32                 :            : #include <string.h>
      33                 :            : #include <time.h>
      34                 :            : #include <list>
      35                 :            : #include <iostream>
      36                 :            : #include <fstream>
      37                 :            : 
      38                 :            : #include "logging.h"
      39                 :            : #include "precision.h"
      40                 :            : #include "component.h"
      41                 :            : #include "components.h"
      42                 :            : #include "net.h"
      43                 :            : #include "input.h"
      44                 :            : #include "dataset.h"
      45                 :            : #include "equation.h"
      46                 :            : #include "environment.h"
      47                 :            : #include "exceptionstack.h"
      48                 :            : #include "check_netlist.h"
      49                 :            : #include "module.h"
      50                 :            : 
      51                 :            : #if HAVE_UNISTD_H
      52                 :            : #include <unistd.h>
      53                 :            : #endif
      54                 :            : 
      55                 :            : using namespace qucs;
      56                 :            : 
      57                 :            : /*! \todo replace environement name root by "/" in order to be filesystem compatible */
      58                 :        107 : int main (int argc, char ** argv) {
      59                 :            : 
      60                 :        107 :   char * infile = NULL;
      61                 :        107 :   char * outfile = NULL;
      62                 :        107 :   char * projPath = NULL;
      63                 :            :   net * subnet;
      64                 :            :   input * in;
      65                 :            :   circuit * gnd;
      66                 :            :   dataset * out;
      67                 :            :   environment * root;
      68                 :        107 :   int listing = 0;
      69                 :        107 :   int ret = 0;
      70                 :        107 :   int dynamicLoad = 0;
      71                 :            : 
      72         [ +  - ]:        107 :   std::list<std::string> vamodules;
      73                 :            : 
      74         [ +  - ]:        107 :   loginit ();
      75                 :        107 :   ::srand (::time (NULL));
      76                 :            : 
      77                 :            :   // check program arguments
      78         [ +  + ]:        275 :   for (int i = 1; i < argc; i++) {
      79 [ +  + ][ -  + ]:        171 :     if (!strcmp (argv[i], "-v") || !strcmp (argv[i], "--version")) {
      80                 :            :       fprintf (stdout,
      81                 :            : #ifdef GIT
      82                 :            :         "Qucsator " PACKAGE_VERSION " (" GIT ") \n"
      83                 :            : #else
      84                 :            :         "Qucsator " PACKAGE_VERSION "\n"
      85                 :            : #endif
      86                 :            :         "Copyright (C) 2003-2009 "
      87                 :            :         "Stefan Jahn <stefan@lkcc.org>\n"
      88                 :            :         "Copyright (C) 2006 Helene Parruitte <parruit@enseirb.fr>\n"
      89                 :            :         "Copyright (C) 2006 Bastien Roucaries <roucaries.bastien@gmail.com>\n"
      90                 :            :         "\nThis is free software; see the source for copying "
      91                 :            :         "conditions.  There is NO\n"
      92                 :            :         "warranty; not even for MERCHANTABILITY or FITNESS FOR A "
      93         [ +  - ]:          3 :         "PARTICULAR PURPOSE.\n");
      94                 :          3 :       return 0;
      95                 :            :     }
      96 [ +  - ][ -  + ]:        168 :     if (!strcmp (argv[i], "-h") || !strcmp (argv[i], "--help")) {
      97                 :            :       fprintf (stdout,
      98                 :            :         "Usage: %s [OPTION]...\n\n"
      99                 :            :         "  -h, --help     display this help and exit\n"
     100                 :            :         "  -v, --version  display version information and exit\n"
     101                 :            :         "  -i FILENAME    use file as input netlist (default stdin)\n"
     102                 :            :         "  -o FILENAME    use file as output dataset (default stdout)\n"
     103                 :            :         "  -b, --bar      enable textual progress bar\n"
     104                 :            :         "  -g, --gui      special progress bar used by gui\n"
     105                 :            :         "  -c, --check    check the input netlist and exit\n"
     106                 :            : #if DEBUG
     107                 :            :     "  -l, --listing  emit C-code for available definitions\n"
     108                 :            : #endif
     109                 :            :     "  -p, --path     project path (or location of dynamic modules)\n"
     110                 :            :     "  -m, --module   list of dynamic loaded modules (base names separated by space)\n"
     111         [ #  # ]:          0 :         "\nReport bugs to <" PACKAGE_BUGREPORT ">.\n", argv[0]);
     112                 :          0 :       return 0;
     113                 :            :     }
     114         [ +  + ]:        168 :     else if (!strcmp (argv[i], "-i")) {
     115                 :        103 :       infile = argv[++i];
     116                 :            :     }
     117         [ +  + ]:         65 :     else if (!strcmp (argv[i], "-o")) {
     118                 :         64 :       outfile = argv[++i];
     119                 :         64 :       file_status = stdout;
     120                 :            :     }
     121 [ +  - ][ -  + ]:          1 :     else if (!strcmp (argv[i], "-b") || !strcmp (argv[i], "--bar")) {
     122                 :          0 :       progressbar_enable = 1;
     123                 :            :     }
     124 [ +  - ][ -  + ]:          1 :     else if (!strcmp (argv[i], "-g") || !strcmp (argv[i], "--gui")) {
     125                 :          0 :       progressbar_gui = 1;
     126                 :            :     }
     127 [ +  - ][ -  + ]:          1 :     else if (!strcmp (argv[i], "-c") || !strcmp (argv[i], "--check")) {
     128                 :          0 :       netlist_check = 1;
     129                 :            :     }
     130 [ -  + ][ #  # ]:          1 :     else if (!strcmp (argv[i], "-l") || !strcmp (argv[i], "--listing")) {
     131                 :          1 :       listing = 1;
     132                 :            :     }
     133                 :            :     // \todo remove command arguments
     134 [ #  # ][ #  # ]:          0 :     else if (!strcmp (argv[i], "-p") || !strcmp (argv[i], "--path")) {
     135                 :          0 :       projPath = argv[++i];
     136                 :            :     }
     137 [ #  # ][ #  # ]:          0 :     else if (!strcmp (argv[i], "-m") || !strcmp (argv[i], "--module")) {
     138                 :          0 :       dynamicLoad = 1;
     139                 :            :     }
     140                 :            :     else {
     141         [ #  # ]:          0 :       if (dynamicLoad) {
     142 [ #  # ][ #  # ]:          0 :         vamodules.push_back(argv[i]);
     143                 :            :       }
     144                 :            :     }
     145                 :            :   }
     146                 :            : 
     147                 :            :   // create static modules
     148         [ +  - ]:        104 :   module::registerModules ();
     149                 :            : 
     150                 :            : #if DEBUG
     151                 :            :   // emit C-code for available definitions if requested and exit
     152         [ +  + ]:        104 :   if (listing) {
     153         [ +  - ]:          1 :     module::print ();
     154                 :          1 :     return ret;
     155                 :            :   }
     156                 :            : #endif /* DEBUG */
     157                 :            : 
     158                 :            :   // look for dynamic libs, load and register them
     159                 :            :   // \todo, keep this way of loading or keep only annotated netlist?
     160         [ -  + ]:        103 :   if (dynamicLoad) {
     161 [ #  # ][ #  # ]:          0 :     module::registerDynamicModules (projPath, vamodules);
     162                 :            :   }
     163                 :            : 
     164                 :            :   else { //no argument, look into netlist
     165                 :            : 
     166         [ +  - ]:        103 :     std::string sLine = "";
     167         [ +  - ]:        103 :     std::ifstream file;
     168                 :            : 
     169         [ +  - ]:        103 :     std::string projPathNet ="";
     170         [ +  - ]:        103 :     std::string projVaMoules = "";
     171                 :            : 
     172         [ +  - ]:        103 :     file.open(infile);
     173                 :            : 
     174 [ +  - ][ +  + ]:       1609 :     while (!file.eof()) {
     175         [ +  - ]:       1506 :         getline(file, sLine);
     176                 :            : 
     177 [ +  - ][ -  + ]:       1506 :         if (sLine.find("--path") != std::string::npos) {
     178 [ #  # ][ #  # ]:          0 :             std::cout << sLine << std::endl;
     179                 :            : 
     180                 :          0 :             size_t pos = 0;
     181         [ #  # ]:          0 :             pos = sLine.find("=");
     182         [ #  # ]:          0 :             sLine.erase(0, pos + 1);
     183 [ #  # ][ #  # ]:          0 :             std::cout << sLine << std::endl;
     184                 :            : 
     185                 :            : //            projPath =  const_cast<char*>(sLine.c_str());
     186                 :            : //            projPath = (char*)sLine.c_str();
     187                 :            : 
     188                 :            : //            std::cout << "inside" << projPath << std::endl;
     189                 :            : 
     190         [ #  # ]:          0 :             projPathNet = sLine;
     191                 :            : 
     192                 :            :         }
     193                 :            : 
     194 [ +  - ][ -  + ]:       1506 :         if (sLine.find("--module") != std::string::npos) {
     195 [ #  # ][ #  # ]:          0 :             std::cout << sLine << std::endl;
     196                 :            : 
     197                 :          0 :             size_t pos = 0;
     198         [ #  # ]:          0 :             pos = sLine.find("=");
     199         [ #  # ]:          0 :             sLine.erase(0, pos + 1);
     200                 :            :             //std::cout << sLine << std::endl;
     201         [ #  # ]:          0 :             projVaMoules = sLine;
     202                 :            : 
     203                 :            :             // put module names into list
     204         [ #  # ]:          0 :             std::istringstream ss(sLine);
     205         [ #  # ]:          0 :             std::string token;
     206                 :            : 
     207 [ #  # ][ #  # ]:          0 :             while(std::getline(ss, token, ' ')) {
                 [ #  # ]
     208 [ #  # ][ #  # ]:          0 :                 std::cout << token << '\n';
     209                 :            : 
     210         [ #  # ]:          0 :                 vamodules.push_back(token);
     211         [ #  # ]:          0 :             }
     212                 :            :         }
     213                 :            :     }
     214                 :            : 
     215 [ +  - ][ +  - ]:        103 :     module::registerDynamicModules ((char*)projPathNet.c_str(), vamodules);
     216 [ +  - ][ +  - ]:        103 :     file.close();
     217                 :            :   }
     218                 :            : 
     219                 :            : 
     220                 :            :   // create root environment
     221 [ +  - ][ +  - ]:        103 :   root = new environment (std::string("root"));
                 [ +  - ]
     222                 :            : 
     223                 :            :   // create netlist object and input
     224 [ +  - ][ +  - ]:        103 :   subnet = new net ("subnet");
     225 [ +  - ][ +  - ]:        103 :   in = infile ? new input (infile) : new input ();
         [ +  - ][ #  # ]
                 [ #  # ]
     226                 :            : 
     227                 :            :   // pass root environment to netlist object and input
     228                 :        103 :   subnet->setEnv (root);
     229                 :        103 :   in->setEnv (root);
     230                 :            : 
     231                 :            :   // get input netlist
     232 [ +  - ][ -  + ]:        103 :   if (in->netlist (subnet) != 0) {
     233         [ #  # ]:          0 :     if (netlist_check) {
     234         [ #  # ]:          0 :       logprint (LOG_STATUS, "checker notice, netlist check FAILED\n");
     235                 :            :     }
     236                 :          0 :     return -1;
     237                 :            :   }
     238         [ -  + ]:        103 :   if (netlist_check) {
     239         [ #  # ]:          0 :     logprint (LOG_STATUS, "checker notice, netlist OK\n");
     240                 :          0 :     return 0;
     241                 :            :   }
     242                 :            : 
     243                 :            :   // attach a ground to the netlist
     244 [ +  - ][ +  - ]:        103 :   gnd = new ground ();
     245         [ +  - ]:        103 :   gnd->setNode (0, "gnd");
     246         [ +  - ]:        103 :   gnd->setName ("GND");
     247         [ +  - ]:        103 :   subnet->insertCircuit (gnd);
     248                 :            : 
     249                 :            :   // analyse the netlist
     250                 :        103 :   int err = 0;
     251         [ +  - ]:        103 :   out = subnet->runAnalysis (err);
     252                 :        103 :   ret |= err;
     253                 :            : 
     254                 :            :   // evaluate output dataset
     255         [ +  - ]:        103 :   ret |= root->equationSolver (out);
     256         [ +  - ]:        103 :   out->setFile (outfile);
     257         [ +  - ]:        103 :   out->print ();
     258                 :            : 
     259         [ +  - ]:        103 :   estack.print ("uncaught");
     260                 :            : 
     261 [ +  - ][ +  - ]:        103 :   delete subnet;
     262 [ +  - ][ +  - ]:        103 :   delete in;
     263 [ +  - ][ +  - ]:        103 :   delete out;
     264 [ +  - ][ +  - ]:        103 :   delete root;
     265                 :            : 
     266                 :            :   // delete static modules and dynamic modules
     267         [ +  - ]:        103 :   module::unregisterModules ();
     268                 :            : 
     269                 :            :   // close all the dynamic libs if any opened
     270         [ +  - ]:        103 :   module::closeDynamicLibs();
     271                 :            : 
     272         [ +  - ]:        103 :   netlist_destroy_env ();
     273                 :        107 :   return ret;
     274 [ +  - ][ +  - ]:        321 : }

Generated by: LCOV version 1.11