LCOV - code coverage report
Current view: top level - util - CubitDirIterator.cpp (source / functions) Hit Total Coverage
Test: coverage_sk.info Lines: 0 49 0.0 %
Date: 2020-06-30 00:58:45 Functions: 0 7 0.0 %
Branches: 0 56 0.0 %

           Branch data     Line data    Source code
       1                 :            : //- Class:          CubitDirIterator
       2                 :            : //- Description:    Class with functions to get files from a directory, etc.
       3                 :            : 
       4                 :            : #include "CubitDirIterator.hpp"
       5                 :            : #include "CubitString.hpp"
       6                 :            : 
       7                 :            : #ifdef _WIN32
       8                 :            :   #include <sys/types.h>
       9                 :            :   #include <sys/stat.h>
      10                 :            :   #include <windows.h>
      11                 :            : #else
      12                 :            :   #include <sys/types.h>
      13                 :            :   #include <sys/stat.h>
      14                 :            :   #include <dirent.h>
      15                 :            :   #include <cstdlib>
      16                 :            :   #include <sys/param.h>
      17                 :            :   #include <unistd.h>
      18                 :            :   #include <pwd.h>
      19                 :            :   #include <fnmatch.h>
      20                 :            : #endif
      21                 :            : #include <errno.h>
      22                 :            : #include <string.h>
      23                 :            : 
      24                 :            : struct CubitDirIterator::Helper
      25                 :            : {
      26                 :          0 :   Helper()
      27                 :            :   {
      28                 :            : #ifdef _WIN32
      29                 :            :     mFileHandle = INVALID_HANDLE_VALUE;
      30                 :            : #else
      31                 :          0 :     mDirHandle = NULL;
      32                 :          0 :     mFileHandle = NULL;
      33                 :            : #endif
      34                 :          0 :   }
      35                 :            : 
      36                 :            : #ifdef _WIN32
      37                 :            :   WIN32_FIND_DATAW mDirHandle;
      38                 :            :   HANDLE mFileHandle;
      39                 :            : #else
      40                 :            :   DIR* mDirHandle;
      41                 :            :   dirent* mFileHandle;
      42                 :            : #endif
      43                 :            : };
      44                 :            :   
      45                 :            : 
      46                 :          0 : CubitDirIterator::CubitDirIterator(const CubitString& path, const CubitString& pattern)
      47                 :            : {
      48 [ #  # ][ #  # ]:          0 :   this->mHelper = new Helper;
      49         [ #  # ]:          0 :   open(path, pattern);
      50                 :          0 : }
      51                 :            : 
      52                 :          0 : CubitDirIterator::~CubitDirIterator()
      53                 :            : {
      54         [ #  # ]:          0 :   cleanup();
      55                 :          0 :   delete this->mHelper;
      56         [ #  # ]:          0 : }
      57                 :            : 
      58                 :          0 : void CubitDirIterator::open(const CubitString& path, const CubitString& pattern)
      59                 :            : {
      60                 :          0 :   cleanup();
      61                 :            : 
      62         [ #  # ]:          0 :   if(pattern.length())
      63                 :          0 :     mPattern = pattern;
      64                 :            :   else
      65         [ #  # ]:          0 :     mPattern = "";
      66                 :            : 
      67                 :          0 :   this->atEnd = false;
      68                 :            : #ifdef _WIN32
      69                 :            :   CubitString p = path;
      70                 :            :   if (p.get_at(p.length()-1) != '\\')
      71                 :            :     p += "\\";
      72                 :            :   p += mPattern.length() == 0 ? "*" : mPattern;
      73                 :            :   this->mHelper->mFileHandle = FindFirstFileW(CubitString::toUtf16(p).c_str(), &this->mHelper->mDirHandle);
      74                 :            :   if(this->mHelper->mFileHandle == INVALID_HANDLE_VALUE)
      75                 :            :     this->atEnd = true;
      76                 :            : #else
      77                 :          0 :   this->mHelper->mDirHandle = opendir(path.c_str());
      78         [ #  # ]:          0 :   if(this->mHelper->mDirHandle)
      79                 :            :   {
      80         [ #  # ]:          0 :     do
      81                 :            :     {
      82                 :          0 :       this->mHelper->mFileHandle = readdir(this->mHelper->mDirHandle);
      83   [ #  #  #  # ]:          0 :     } while (this->mHelper->mFileHandle && 
      84         [ #  # ]:          0 :              (mPattern.length() != 0 && 
      85                 :          0 :              fnmatch(mPattern.c_str(), this->mHelper->mFileHandle->d_name, 0))
      86                 :            :              );
      87                 :            :   }
      88 [ #  # ][ #  # ]:          0 :   if(!this->mHelper->mDirHandle || !this->mHelper->mFileHandle)
      89                 :          0 :     this->atEnd = true;
      90                 :            : #endif
      91                 :          0 : }
      92                 :            : 
      93                 :          0 : void CubitDirIterator::cleanup()
      94                 :            : {
      95                 :            : #ifdef _WIN32
      96                 :            :   if(this->mHelper->mFileHandle != 0)
      97                 :            :     FindClose(this->mHelper->mFileHandle);
      98                 :            :   this->mHelper->mFileHandle = 0;
      99                 :            : #else
     100         [ #  # ]:          0 :   if(this->mHelper->mDirHandle)
     101                 :          0 :     closedir(this->mHelper->mDirHandle);
     102                 :          0 :   this->mHelper->mFileHandle = 0;
     103                 :          0 :   this->mHelper->mDirHandle = 0;
     104                 :            : #endif
     105                 :          0 : }
     106                 :            : 
     107                 :          0 : bool CubitDirIterator::has_next()
     108                 :            : {
     109                 :          0 :   return !this->atEnd;
     110                 :            : }
     111                 :            : 
     112                 :          0 : CubitString CubitDirIterator::next()
     113                 :            : {
     114                 :          0 :   CubitString file;
     115         [ #  # ]:          0 :   if(this->atEnd)
     116                 :          0 :     return file;
     117                 :            : 
     118                 :            : #ifdef _WIN32
     119                 :            :   file = CubitString::toUtf8(this->mHelper->mDirHandle.cFileName);
     120                 :            :   BOOL result = FindNextFileW(this->mHelper->mFileHandle, &this->mHelper->mDirHandle);
     121                 :            :   if(result == 0)
     122                 :            :     this->atEnd = true;
     123                 :            : #else
     124 [ #  # ][ #  # ]:          0 :   file = this->mHelper->mFileHandle->d_name;
                 [ #  # ]
     125         [ #  # ]:          0 :   do
     126                 :            :   {
     127         [ #  # ]:          0 :     this->mHelper->mFileHandle = readdir(this->mHelper->mDirHandle);
     128 [ #  # ][ #  # ]:          0 :   } while (this->mHelper->mFileHandle && 
     129 [ #  # ][ #  # ]:          0 :            (mPattern.length() != 0 && 
     130 [ #  # ][ #  # ]:          0 :            fnmatch(mPattern.c_str(), this->mHelper->mFileHandle->d_name, 0))
     131                 :            :            );
     132         [ #  # ]:          0 :   if(this->mHelper->mFileHandle == 0)
     133                 :          0 :     this->atEnd = true;
     134                 :            : #endif
     135                 :          0 :   return file;
     136                 :            : }
     137                 :            : 

Generated by: LCOV version 1.11