Annotation of parser3/src/main/pa_dir.C, revision 1.22

1.1       paf         1: /** @file
                      2:        Parser: directory scanning for different OS-es.
                      3: 
1.21      moko        4:        Copyright (c) 2000-2012 Art. Lebedev Studio (http://www.artlebedev.com)
1.11      paf         5:        Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
1.12      paf         6: */
1.1       paf         7: 
1.9       paf         8: #include "pa_common.h"
1.1       paf         9: #include "pa_dir.h"
                     10: 
1.22    ! moko       11: volatile const char * IDENT_PA_DIR_C="$Id: pa_dir.C,v 1.21 2012-03-16 09:24:13 moko Exp $" IDENT_PA_DIR_H;
1.21      moko       12: 
1.1       paf        13: #ifdef WIN32
                     14: 
1.22    ! moko       15: #define TICKS_PER_SECOND 10000000ULL
        !            16: #define EPOCH_DIFFERENCE 11644473600ULL
        !            17: time_t filetime_to_timet(FILETIME const& ft){
        !            18:        ULARGE_INTEGER ull;
        !            19:        ull.LowPart = ft.dwLowDateTime;
        !            20:        ull.HighPart = ft.dwHighDateTime;
        !            21:        long long secs=(ull.QuadPart / TICKS_PER_SECOND - EPOCH_DIFFERENCE);
        !            22:        time_t t =(time_t)secs;
        !            23:        return (secs == (long long)t) ? t : 0;
        !            24: }
        !            25: 
1.16      paf        26: bool findfirst(const char* _pathname, struct ffblk *_ffblk, int /*_attrib*/) {
1.1       paf        27:        char mask[MAXPATH];
                     28:        snprintf(mask, MAXPATH, "%s/*.*", _pathname);
                     29: 
                     30:        _ffblk->handle=FindFirstFile(mask, (_WIN32_FIND_DATAA *)_ffblk);
                     31:        return _ffblk->handle==INVALID_HANDLE_VALUE;
                     32: }
                     33: 
                     34: bool findnext(struct ffblk *_ffblk) {
1.22    ! moko       35:        return !FindNextFile(_ffblk->handle, (_WIN32_FIND_DATAA *)_ffblk);
        !            36: }
1.1       paf        37: 
                     38: void findclose(struct ffblk *_ffblk) {
                     39:        FindClose(_ffblk->handle);
                     40: }
                     41: 
1.22    ! moko       42: bool ffblk::is_dir() {
        !            43:        return (ff_attrib & FILE_ATTRIBUTE_DIRECTORY) != 0;
        !            44: }
        !            45: 
        !            46: double ffblk::size() {
        !            47:        ULARGE_INTEGER ull;
        !            48:        ull.LowPart = nFileSizeLow;
        !            49:        ull.HighPart = nFileSizeHigh;
        !            50:        return (double)ull.QuadPart;
        !            51: }
        !            52: 
        !            53: time_t ffblk::c_timestamp() {
        !            54:        return filetime_to_timet(ftCreationTime);
        !            55: }
        !            56: 
        !            57: time_t ffblk::m_timestamp() {
        !            58:        return filetime_to_timet(ftLastWriteTime);
        !            59: }
        !            60: 
        !            61: time_t ffblk::a_timestamp() {
        !            62:        return filetime_to_timet(ftLastAccessTime);
        !            63: }
        !            64: 
1.1       paf        65: #else
                     66: 
1.18      paf        67: bool findfirst(const char* _pathname, struct ffblk *_ffblk, int /*_attrib*/) {
1.22    ! moko       68:     strncpy(_ffblk->filePath, _pathname, MAXPATH-1);
        !            69:        _ffblk->filePath[MAXPATH-1]=0;
1.1       paf        70:        if(!(_ffblk->dir=opendir(_ffblk->filePath)))
                     71:         return true;
                     72: 
                     73:        return findnext(_ffblk);
                     74: }
                     75: 
                     76: bool findnext(struct ffblk *_ffblk) {
                     77:     while(true) {
                     78:         struct dirent *entry=readdir(_ffblk->dir);
                     79:         if(!entry)
                     80:             return true;
                     81: 
                     82:                int maxsize=sizeof(_ffblk->ff_name)-1;
1.22    ! moko       83:                strncpy(_ffblk->ff_name, entry->d_name, maxsize-1);
        !            84:                _ffblk->ff_name[maxsize]=0;
1.1       paf        85:                
1.22    ! moko       86: #ifdef HAVE_STRUCT_DIRENT_D_TYPE
        !            87:                // http://www.gnu.org/software/libc/manual/html_node/Directory-Entries.html
        !            88:                _ffblk->_d_type=entry->d_type;
        !            89: #endif
1.1       paf        90:                return false;
                     91:     }
                     92: }
                     93: 
                     94: void findclose(struct ffblk *_ffblk) {
                     95:        closedir(_ffblk->dir);
                     96: }
                     97: 
1.22    ! moko       98: #ifdef HAVE_STRUCT_DIRENT_D_TYPE
        !            99: void ffblk::stat_file() {
        !           100: #else
        !           101: void ffblk::real_stat_file() {
        !           102: #endif
        !           103:        char fileSpec[MAXPATH];
        !           104:        snprintf(fileSpec, MAXPATH, "%s/%s", filePath, ff_name);
        !           105:        
        !           106:        if(stat(fileSpec, &_st) != 0) {
        !           107:                memset(&_st,0,sizeof(_st));
        !           108:        }
        !           109: }
        !           110: 
        !           111: bool ffblk::is_dir() {
        !           112: #ifdef HAVE_STRUCT_DIRENT_D_TYPE
        !           113:        return (_d_type & DT_DIR) != 0;
        !           114: #else
        !           115:        real_stat_file();
        !           116:        return S_ISDIR(_st.st_mode) != 0;
        !           117: #endif
        !           118: }
        !           119: 
        !           120: double ffblk::size() {
        !           121:        return (double)_st.st_size;
        !           122: }
        !           123: 
        !           124: time_t ffblk::c_timestamp() {
        !           125:        return _st.st_ctime;
        !           126: }
        !           127: 
        !           128: time_t ffblk::m_timestamp() {
        !           129:        return _st.st_mtime;
        !           130: }
        !           131: 
        !           132: time_t ffblk::a_timestamp() {
        !           133:        return _st.st_atime;
        !           134: }
        !           135: 
1.1       paf       136: #endif

E-mail: