LCOV - code coverage report
Current view: top level - src - check_csv.cpp (source / functions) Hit Total Coverage
Test: qucs-core-0.0.19 Code Coverage Lines: 0 76 0.0 %
Date: 2015-01-05 16:01:02 Functions: 0 6 0.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 0 114 0.0 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * check_csv.cpp - checker for CSV files
       3                 :            :  *
       4                 :            :  * Copyright (C) 2007, 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 <string.h>
      32                 :            : #include <ctype.h>
      33                 :            : #include <cmath>
      34                 :            : 
      35                 :            : #include "logging.h"
      36                 :            : #include "complex.h"
      37                 :            : #include "object.h"
      38                 :            : #include "vector.h"
      39                 :            : #include "matrix.h"
      40                 :            : #include "matvec.h"
      41                 :            : #include "dataset.h"
      42                 :            : #include "strlist.h"
      43                 :            : #include "constants.h"
      44                 :            : #include "check_csv.h"
      45                 :            : 
      46                 :            : using namespace qucs;
      47                 :            : 
      48                 :            : strlist * csv_header = NULL;
      49                 :            : qucs::vector  * csv_vector = NULL;
      50                 :            : dataset * csv_result = NULL;
      51                 :            : 
      52                 :            : /* Removes temporary data items from memory if necessary. */
      53                 :          0 : static void csv_finalize (void) {
      54                 :            :   qucs::vector * root, * next;
      55         [ #  # ]:          0 :   for (root = csv_vector; root != NULL; root = next) {
      56                 :          0 :     next = (qucs::vector *) root->getNext ();
      57         [ #  # ]:          0 :     delete root;
      58                 :            :   }
      59                 :          0 :   csv_vector = NULL;
      60         [ #  # ]:          0 :   if (csv_header != NULL) {
      61         [ #  # ]:          0 :     delete csv_header;
      62                 :          0 :     csv_header = NULL;
      63                 :            :   }
      64                 :          0 :   csv_lex_destroy ();
      65                 :          0 : }
      66                 :            : 
      67                 :            : /* Validates a data vector identifier. */
      68                 :          0 : static void csv_validate_str (char * n) {
      69                 :          0 :   char * p = n;
      70         [ #  # ]:          0 :   if (!isalpha (*p)) *p = '_';
      71                 :          0 :   p++;
      72         [ #  # ]:          0 :   while (*p) {
      73 [ #  # ][ #  # ]:          0 :     if (!isalnum (*p) && *p != '.' && *p != ',' && *p != '[' && *p != ']')
         [ #  # ][ #  # ]
         [ #  # ][ #  # ]
      74                 :          0 :       *p = '_';
      75                 :          0 :     p++;
      76                 :            :   }
      77                 :          0 : }
      78                 :            : 
      79                 :            : /* Creates dataset from CSV vectors. */
      80                 :          0 : static void csv_create_dataset (int len) {
      81                 :            :   qucs::vector * dep, * indep, * v;
      82                 :            :   char * n, depn[256];
      83                 :            :   strlist * s;
      84                 :            : 
      85                 :            :   // create dataset
      86 [ #  # ][ #  # ]:          0 :   csv_result = new dataset ();
      87                 :            : 
      88                 :            :   // add dependency vector
      89 [ #  # ][ #  # ]:          0 :   indep = new qucs::vector ();
      90         [ #  # ]:          0 :   csv_result->appendDependency (indep);
      91 [ #  # ][ #  # ]:          0 :   s = new strlist ();
      92 [ #  # ][ #  # ]:          0 :   n = csv_header ? csv_header->get (0) : (char *) "x";
      93         [ #  # ]:          0 :   csv_validate_str (n);
      94         [ #  # ]:          0 :   s->add (n);
      95         [ #  # ]:          0 :   indep->setName (n);
      96                 :            : 
      97                 :            :   // create variable vector(s)
      98         [ #  # ]:          0 :   for (int i = 1; i < len; i++) {
      99 [ #  # ][ #  # ]:          0 :     v = new qucs::vector ();
     100 [ #  # ][ #  # ]:          0 :     n = csv_header ? csv_header->get (i) : NULL;
     101         [ #  # ]:          0 :     if (n == NULL) {
     102                 :          0 :       sprintf (depn, "y%d", i);
     103                 :          0 :       n = depn;
     104                 :            :     }
     105         [ #  # ]:          0 :     csv_validate_str (n);
     106         [ #  # ]:          0 :     v->setName (n);
     107 [ #  # ][ #  # ]:          0 :     v->setDependencies (new strlist (*s));
                 [ #  # ]
     108         [ #  # ]:          0 :     csv_result->addVariable (v);
     109                 :            :   }
     110                 :            : 
     111                 :            :   // fill all vectors in dataset
     112         [ #  # ]:          0 :   for (v = csv_vector; v != NULL; v = (qucs::vector *) v->getNext ()) {
     113                 :          0 :     dep = csv_result->getVariables ();
     114                 :            :     int l;
     115 [ #  # ][ #  # ]:          0 :     for (l = 0; l < v->getSize () - 1; l++) {
     116 [ #  # ][ #  # ]:          0 :       dep->add (v->get (l));
     117                 :          0 :       dep = (qucs::vector *) dep->getNext ();
     118                 :            :     }
     119 [ #  # ][ #  # ]:          0 :     indep->add (v->get (l));
     120                 :            :   }
     121                 :            : 
     122                 :            :   // cleanup
     123 [ #  # ][ #  # ]:          0 :   delete s;
     124                 :          0 : }
     125                 :            : 
     126                 :            : /* This function is the checker routine for a parsed CSV.  It returns
     127                 :            :    zero on success or non-zero if the parsed csv contained errors. */
     128                 :          0 : int csv_check (void) {
     129                 :            : 
     130                 :          0 :   int len = -1, errors = 0;
     131                 :            : 
     132                 :            :   // no data
     133         [ #  # ]:          0 :   if (csv_vector == NULL) {
     134                 :          0 :     logprint (LOG_ERROR, "checker error, no data in csv file\n");
     135                 :          0 :     errors++;
     136                 :            :   }
     137                 :            :   // data lines available
     138                 :            :   else {
     139                 :            :     // check number of columns in each data line
     140         [ #  # ]:          0 :     for (qucs::vector * v = csv_vector; v != NULL; v = (qucs::vector *) v->getNext ()) {
     141         [ #  # ]:          0 :       if (len == -1) len = v->getSize ();
     142                 :            :       else {
     143         [ #  # ]:          0 :         if (v->getSize () != len) {
     144                 :            :           logprint (LOG_ERROR, "checker error, different cols (%d != %d) in "
     145                 :          0 :                     "csv data line\n", v->getSize (), len);
     146                 :          0 :           errors++;
     147                 :            :         }
     148                 :            :       }
     149                 :            :     }
     150                 :            :     // check number of columns in data and header
     151 [ #  # ][ #  # ]:          0 :     if (csv_header && csv_header->length () != len) {
                 [ #  # ]
     152                 :            :       logprint (LOG_ERROR, "checker error, different cols (%d != %d) in "
     153                 :          0 :                 "data and header lines\n", csv_header->length (), len);
     154                 :          0 :       errors++;
     155                 :            :     }
     156                 :            :     // create dataset if possible
     157         [ #  # ]:          0 :     if (!errors) {
     158                 :          0 :       csv_create_dataset (len);
     159                 :            :     }
     160                 :            :   }
     161                 :            : 
     162                 :            :   /* free temporary memory */
     163                 :          0 :   csv_finalize ();
     164                 :            : 
     165         [ #  # ]:          0 :   return errors ? -1 : 0;
     166                 :            : }
     167                 :            : 
     168                 :            : 
     169                 :            : // Destroys data used by the CSV file lexer, parser and checker.
     170                 :          0 : void csv_destroy (void) {
     171         [ #  # ]:          0 :   if (csv_result != NULL) {
     172                 :            :     // delete associated dataset
     173         [ #  # ]:          0 :     delete csv_result;
     174                 :          0 :     csv_result = NULL;
     175                 :            :   }
     176         [ #  # ]:          0 :   if (csv_vector != NULL) {
     177                 :          0 :     csv_finalize ();
     178                 :          0 :     csv_vector = NULL;
     179                 :            :   }
     180                 :          0 : }
     181                 :            : 
     182                 :            : // Initializes the CSV file checker.
     183                 :          0 : void csv_init (void) {
     184                 :          0 :   csv_result = NULL;
     185                 :          0 :   csv_vector = NULL;
     186                 :          0 :   csv_header = NULL;
     187                 :          0 : }
     188                 :            : 

Generated by: LCOV version 1.11