LCOV - code coverage report
Current view: top level - utils - parser.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 55 114 48.2 %
Date: 2020-07-01 15:24:36 Functions: 7 9 77.8 %
Branches: 57 222 25.7 %

           Branch data     Line data    Source code
       1                 :            : /*********************************************
       2                 :            : Reactor Geometry Generator
       3                 :            : Argonne National Laboratory
       4                 :            : 
       5                 :            : Contains CParser class implementation.
       6                 :            : *********************************************/
       7                 :            : #include <cctype>
       8                 :            : #include "meshkit/parser.hpp"
       9                 :            : #include <stdlib.h>
      10                 :            : 
      11                 :        120 : CParser::CParser ()
      12                 :            : // ---------------------------------------------------------------------------
      13                 :            : // Function: default constructor
      14                 :            : // Input:    none
      15                 :            : // Output:   none
      16                 :            : // ---------------------------------------------------------------------------
      17                 :            : {
      18                 :        120 : }
      19                 :            : 
      20                 :        120 : CParser::~CParser ()
      21                 :            : // ---------------------------------------------------------------------------
      22                 :            : // Function: destructor
      23                 :            : // Input:    none
      24                 :            : // Output:   none
      25                 :            : // ---------------------------------------------------------------------------
      26                 :            : {
      27                 :        120 : }
      28                 :            : 
      29                 :       1404 : bool CParser::ReadNextLine (std::ifstream& FileInput, int& nLineNum, 
      30                 :            :                             std::string& szInputString, const int MAXCHARS,
      31                 :            :                             const std::string& szComment, bool bLowerCase)
      32                 :            : // ---------------------------------------------------------------------------
      33                 :            : // Function: reads the next line skipping over the comment lines
      34                 :            : //           and converts all alphabets to lower case if requested
      35                 :            : // Input:    file istream, line #, string to hold the input line,
      36                 :            : //           max. # of characters expected in each input line,
      37                 :            : //           comment character(s) at the beginning of a comment line,
      38                 :            : //           lowercase conversion option
      39                 :            : // Output:   updated values of line # and the string
      40                 :            : //           return value is true if successful
      41                 :            : //                           false if an error state is encountered
      42                 :            : // Restriction: Cannot read a line over 256 characters
      43                 :            : // ---------------------------------------------------------------------------
      44                 :            : {
      45                 :       1404 :   int flag = 0;
      46                 :       1404 :   int flag1 =0;
      47                 :       1404 :   bool bWhSpc = false;
      48                 :       1404 :   int tokenfound = 1;
      49                 :       1404 :   const int MAXCH = 10000;
      50                 :            :   char szInp[MAXCH];
      51                 :            :   char szTemp [MAXCH];
      52         [ +  - ]:       1404 :   std::vector<std::string> tokens;
      53                 :            : 
      54                 :            :   // enough capacity to read and store?
      55         [ -  + ]:       1404 :   if (MAXCHARS > MAXCH)
      56                 :          0 :     return false;
      57                 :            : 
      58                 :            :   // comment character(s)
      59                 :       1404 :   int nCLen = static_cast<int>(szComment.length());
      60                 :            :   // read the line (skip over comment lines)
      61                 :            :   for(;;)
      62                 :            :     {
      63                 :       1656 :       ++nLineNum;
      64         [ +  - ]:       1656 :       FileInput.getline (szInp, MAXCHARS);
      65                 :            :       //       // end-of-file?
      66                 :            :       //       if (FileInput.eof())
      67                 :            :       //        return false;
      68 [ +  - ][ -  + ]:       1656 :       if (FileInput.fail())
      69 [ #  # ][ #  # ]:          0 :         FileInput.clear (FileInput.rdstate() & ~std::ios::failbit);
         [ #  # ][ #  # ]
      70                 :            :       // unrecoverable error?
      71 [ +  - ][ -  + ]:       1656 :       if (FileInput.bad())
      72                 :          0 :         return false;
      73                 :            : 
      74                 :            :       // successful read
      75         [ +  - ]:       1656 :       szInputString = szInp;
      76 [ +  - ][ +  - ]:       1656 :       GetTokens(szInputString, " ", tokens);
      77         [ +  - ]:       1656 :       bWhSpc = EatWhiteSpace(szInputString);
      78 [ +  - ][ +  - ]:       1656 :       if ((szInputString.substr(0,nCLen) != szComment)&& (bWhSpc ==false)){        
         [ +  + ][ +  - ]
                 [ +  - ]
           [ +  +  #  # ]
      79         [ +  - ]:       1404 :         szInputString = szInp;
      80 [ +  - ][ +  - ]:       1404 :         GetTokens(szInputString, " ", tokens);
      81         [ +  + ]:       6168 :         for(unsigned int i=0; i< tokens.size(); i++){
      82         [ +  - ]:       4764 :           std::string const& temptoken = tokens[i];
      83 [ +  - ][ -  + ]:       4764 :           if (temptoken == "&")
      84                 :          0 :             flag1 = 1;
      85                 :            :         }
      86                 :            : 
      87                 :            :         //Filter the comment tokens
      88                 :            :         //  FilterComment(szInputString, szComment);
      89                 :            : 
      90                 :            :         //if "&" is found continue to read the next line      
      91         [ +  - ]:       1404 :         std::string szTempString = szInputString;
      92                 :            : 
      93                 :            :         // check if line is continued &
      94 [ -  + ][ #  # ]:       1404 :         while(flag1 ==1 && tokenfound == 1){    
      95 [ #  # ][ #  # ]:          0 :           GetTokens(szTempString, " ", tokens);
      96         [ #  # ]:          0 :           for(unsigned int i=1; i<=tokens.size(); i++){
      97         [ #  # ]:          0 :             std::string const& temptoken = tokens[i-1];
      98 [ #  # ][ #  # ]:          0 :             if (temptoken == "&"){
      99                 :          0 :               tokenfound = 1;
     100                 :          0 :               flag = 1;
     101                 :            :             }
     102                 :            :             else{
     103         [ #  # ]:          0 :               if(flag==1)
     104                 :          0 :                 flag = 1;//do nothing token already found
     105                 :            :               else
     106                 :          0 :                 tokenfound = 0;
     107                 :            :             }
     108                 :            :           }
     109         [ #  # ]:          0 :           if(tokenfound ==1){
     110                 :          0 :             ++nLineNum;
     111         [ #  # ]:          0 :             RemoveToken(szInputString);
     112                 :            :             //- getting more tokens and add to the existing 
     113         [ #  # ]:          0 :             FileInput.getline (szTemp, MAXCHARS);
     114                 :            :             // end-of-file?
     115 [ #  # ][ #  # ]:          0 :             if (FileInput.eof())
     116                 :          0 :               return false;
     117 [ #  # ][ #  # ]:          0 :             if (FileInput.fail())
     118 [ #  # ][ #  # ]:          0 :               FileInput.clear (FileInput.rdstate() & ~std::ios::failbit);
         [ #  # ][ #  # ]
     119                 :            :             // unrecoverable error?
     120 [ #  # ][ #  # ]:          0 :             if (FileInput.bad())
     121                 :          0 :               return false;
     122                 :            :             // successful read 
     123         [ #  # ]:          0 :             szTempString = szTemp;
     124         [ #  # ]:          0 :             FilterComment(szTempString, szComment);
     125         [ #  # ]:          0 :             szInputString+=" ";
     126         [ #  # ]:          0 :             szInputString+=szTemp;
     127                 :            :           }
     128                 :            :           else{
     129                 :          0 :             break;//while loop ents
     130                 :            :           }
     131                 :          0 :           flag = 0;
     132                 :            :         }
     133                 :            :         // while loop ends
     134                 :            :         // convert to lower case?
     135         [ +  - ]:       1404 :         if (bLowerCase){
     136         [ +  + ]:      26748 :           for (int i=0; i < static_cast<int>(szInputString.length()); i++)
     137 [ +  - ][ +  - ]:      25344 :             szInputString[i] = tolower(szInputString[i]);
     138                 :            :         }
     139         [ -  + ]:       1404 :         break;
     140                 :            :       }
     141                 :        252 :     }
     142                 :       1404 :   return true;
     143                 :            : }
     144                 :            : 
     145                 :       4716 : void CParser::GetTokens (const std::string& input, 
     146                 :            :                          const std::string& delims, 
     147                 :            :                          std::vector<std::string>& tokens)
     148                 :            : // ----------------------------------------------------------------------------
     149                 :            : // Function: Parses the input line and gets the tokens
     150                 :            : // Input:    string, delimiters
     151                 :            : // Output:   vector containing the tokens
     152                 :            : // ----------------------------------------------------------------------------
     153                 :            : {
     154                 :            :   std::string::size_type beg_index, end_index;
     155                 :            : 
     156                 :            :   // clear the vector that will store the tokens
     157                 :       4716 :   tokens.clear();
     158                 :            : 
     159                 :            :   // get location of the first character that is not a delimiter
     160                 :       4716 :   beg_index = input.find_first_not_of(delims);
     161                 :            : 
     162                 :            :   // loop while the beginning index is not the end of string
     163         [ +  + ]:      19632 :   while (beg_index != std::string::npos)
     164                 :            :     {
     165                 :            :       // get location of the next delimiter
     166                 :      14916 :       end_index = input.find_first_of (delims, beg_index);
     167                 :            : 
     168                 :            :       // if this location is the end of string then adjust the value
     169                 :            :       // as string length
     170         [ +  + ]:      14916 :       if (end_index == std::string::npos) end_index = input.length();
     171                 :            : 
     172                 :            :       // save the string between beg_index and end_index
     173         [ +  - ]:      14916 :       tokens.push_back (input.substr(beg_index,end_index-beg_index));
     174                 :            : 
     175                 :            :       // get location of the next character that is not a delimiter
     176                 :      14916 :       beg_index = input.find_first_not_of (delims, end_index);
     177                 :            :     }
     178                 :       4716 : }
     179                 :            : 
     180                 :            : 
     181                 :          0 : void CParser:: FilterComment (std::string& input,  const std::string& szComment)
     182                 :            : 
     183                 :            : // ----------------------------------------------------------------------------
     184                 :            : // Function: Parses the input line and gets the tokens
     185                 :            : // Input:    string, delimiters
     186                 :            : // Output:   vector containing the tokens
     187                 :            : // ----------------------------------------------------------------------------
     188                 :            : {
     189                 :            :   // remove comment from the line obtained
     190                 :            :   unsigned int i;
     191         [ #  # ]:          0 :   std::vector<std::string> tokens;
     192         [ #  # ]:          0 :   std::string tempInput;
     193 [ #  # ][ #  # ]:          0 :   GetTokens(input, " ", tokens);
     194         [ #  # ]:          0 :   for(i=0; i<tokens.size(); i++){
     195         [ #  # ]:          0 :     std::string const& temptoken = tokens[i];
     196 [ #  # ][ #  # ]:          0 :     if(temptoken == szComment){
     197                 :          0 :       break;
     198                 :            :     }
     199                 :            :     else{
     200         [ #  # ]:          0 :       tempInput+=temptoken;
     201         [ #  # ]:          0 :       if(i!=(tokens.size()-1)){ //indent{
     202 [ #  # ][ #  # ]:          0 :         if (tokens[i+1]!=szComment)
                 [ #  # ]
     203         [ #  # ]:          0 :           tempInput+=" ";
     204                 :            :       }
     205                 :            :       else{
     206         [ #  # ]:          0 :         tempInput+=""; // no indent
     207                 :            :       }
     208                 :            :     }
     209                 :            :   }
     210         [ #  # ]:          0 :   input = tempInput.c_str();
     211                 :          0 : }
     212                 :            : 
     213                 :          0 : void CParser:: RemoveToken (std::string& input)
     214                 :            : 
     215                 :            : // ----------------------------------------------------------------------------
     216                 :            : // Function: Parses the input line and gets the tokens
     217                 :            : // Input:    string, delimiters
     218                 :            : // Output:   vector containing the tokens
     219                 :            : // ----------------------------------------------------------------------------
     220                 :            : {
     221                 :            :   // remove comment from the line obtained
     222                 :            :   unsigned int i;
     223         [ #  # ]:          0 :   std::vector<std::string> tokens;
     224         [ #  # ]:          0 :   std::string tempInput;
     225 [ #  # ][ #  # ]:          0 :   GetTokens(input, " ", tokens);
     226         [ #  # ]:          0 :   for(i=0; i<tokens.size(); i++){
     227         [ #  # ]:          0 :     std::string const& temptoken = tokens[i];
     228 [ #  # ][ #  # ]:          0 :     if(temptoken == "&"){
     229                 :          0 :       break;
     230                 :            :     }
     231                 :            :     else{
     232         [ #  # ]:          0 :       tempInput+=temptoken;
     233         [ #  # ]:          0 :       if(i!=(tokens.size()-1)){ //indent{
     234 [ #  # ][ #  # ]:          0 :         if (tokens[i+1]!="&")
                 [ #  # ]
     235         [ #  # ]:          0 :           tempInput+=" ";
     236                 :            :       }
     237                 :            :       else{
     238         [ #  # ]:          0 :         tempInput+=""; // no indent
     239                 :            :       }
     240                 :            :     }
     241                 :            :   }
     242         [ #  # ]:          0 :   input = tempInput.c_str();
     243                 :          0 : }
     244                 :            : 
     245                 :       1656 : bool CParser:: EatWhiteSpace (std::string& input)
     246                 :            : 
     247                 :            : // ----------------------------------------------------------------------------
     248                 :            : // Function: Parses the input line and gets the tokens
     249                 :            : // Input:    string, delimiters
     250                 :            : // Output:   vector containing the tokens
     251                 :            : // ----------------------------------------------------------------------------
     252                 :            : {
     253                 :            :   // remove comment from the line obtained
     254                 :            :   unsigned int i;
     255         [ +  - ]:       1656 :   std::vector<std::string> tokens;
     256         [ +  - ]:       3312 :   std::string tempInput;
     257 [ +  - ][ +  - ]:       1656 :   GetTokens(input, " ", tokens);
     258         [ +  - ]:       1656 :   for(i=0; i<tokens.size(); i++){
     259         [ +  - ]:       1656 :     std::string const& temptoken = tokens[i];
     260 [ +  - ][ +  - ]:       1656 :     if(temptoken != " " && temptoken !="!"){
         [ +  - ][ +  + ]
                 [ +  + ]
     261                 :       1416 :       return false;
     262                 :            :       break;  
     263                 :            :     }
     264 [ +  - ][ +  - ]:        240 :     else if(temptoken =="!"){
     265                 :        240 :       return true;
     266                 :            :       break;
     267                 :            :     }
     268                 :            :   }
     269                 :       1656 :   return false;
     270 [ +  - ][ +  - ]:       1872 : }

Generated by: LCOV version 1.11