/* * $Revision: 2626 $ * * last checkin: * $Author: gutwenger $ * $Date: 2012-07-17 12:10:52 +0200 (Di, 17. Jul 2012) $ ***************************************************************/ /** \file * \brief Implementation of basic functionality (incl. file and * directory handling) * * \author Carsten Gutwenger * * \par License: * This file is part of the Open Graph Drawing Framework (OGDF). * * \par * Copyright (C)
* See README.txt in the root directory of the OGDF installation for details. * * \par * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * Version 2 or 3 as published by the Free Software Foundation; * see the file LICENSE.txt included in the packaging of this file * for details. * * \par * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * \par * You should have received a copy of the GNU General Public * License along with this program; if not, write to the Free * Software Foundation, Inc., 51 Franklin Street, Fifth Floor, * Boston, MA 02110-1301, USA. * * \see http://www.gnu.org/copyleft/gpl.html ***************************************************************/ #include "basic.h" #include "List.h" #include "String.h" #include // Windows includes #ifdef OGDF_SYSTEM_WINDOWS #include #if defined(_MSC_VER) && defined(UNICODE) #undef GetFileAttributes #undef FindFirstFile #undef FindNextFile #define GetFileAttributes GetFileAttributesA #define FindFirstFile FindFirstFileA #define WIN32_FIND_DATA WIN32_FIND_DATAA #define FindNextFile FindNextFileA #endif #endif #ifdef __BORLANDC__ #define _chdir chdir #endif // Unix includes #ifdef OGDF_SYSTEM_UNIX #include #include #include #include #include #include double OGDF_clk_tck = sysconf(_SC_CLK_TCK); //is long. but definig it here avoids casts... #endif #ifdef OGDF_DLL #ifdef OGDF_SYSTEM_WINDOWS #ifdef __MINGW32__ extern "C" #endif BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: ogdf::PoolMemoryAllocator::init(); ogdf::System::init(); break; case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: break; case DLL_PROCESS_DETACH: ogdf::PoolMemoryAllocator::cleanup(); break; } return TRUE; } #else void __attribute__ ((constructor)) my_load(void) { ogdf::PoolMemoryAllocator::init(); ogdf::System::init(); } void __attribute__ ((destructor)) my_unload(void) { ogdf::PoolMemoryAllocator::cleanup(); } #endif #else namespace ogdf { //static int variables are automatically initialized with 0 int Initialization::s_count; Initialization::Initialization() { if (s_count++ == 0) { ogdf::PoolMemoryAllocator::init(); ogdf::System::init(); } } Initialization::~Initialization() { if (--s_count == 0) { ogdf::PoolMemoryAllocator::cleanup(); } } } // namespace ogdf #endif namespace ogdf { // debug level (in debug build only) #ifdef OGDF_DEBUG DebugLevel debugLevel; #endif double usedTime(double& T) { double t = T; #ifdef OGDF_SYSTEM_WINDOWS T = double(clock())/CLOCKS_PER_SEC; #endif #ifdef OGDF_SYSTEM_UNIX struct tms now; times (&now); T = now.tms_utime/OGDF_clk_tck; #endif return T-t; } #ifdef OGDF_SYSTEM_WINDOWS bool isFile(const char *fileName) { DWORD att = GetFileAttributes(fileName); if (att == 0xffffffff) return false; return (att & FILE_ATTRIBUTE_DIRECTORY) == 0; } bool isDirectory(const char *fileName) { DWORD att = GetFileAttributes(fileName); if (att == 0xffffffff) return false; return (att & FILE_ATTRIBUTE_DIRECTORY) != 0; } bool changeDir(const char *dirName) { return (_chdir(dirName) == 0); } void getEntriesAppend(const char *dirName, FileType t, List &entries, const char *pattern) { OGDF_ASSERT(isDirectory(dirName)); String filePattern; filePattern.sprintf("%s\\%s", dirName, pattern); WIN32_FIND_DATA findData; HANDLE handle = FindFirstFile(filePattern.cstr(), &findData); if (handle != INVALID_HANDLE_VALUE) { do { DWORD isDir = (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY); if(isDir && ( strcmp(findData.cFileName,".") == 0 || strcmp(findData.cFileName,"..") == 0) ) continue; if (t == ftEntry || (t == ftFile && !isDir) || (t == ftDirectory && isDir)) { entries.pushBack(findData.cFileName); } } while(FindNextFile(handle, &findData)); FindClose(handle); } } #endif #ifdef OGDF_SYSTEM_UNIX bool isDirectory(const char *fname) { struct stat stat_buf; if (stat(fname,&stat_buf) != 0) return false; return (stat_buf.st_mode & S_IFMT) == S_IFDIR; } bool isFile(const char *fname) { struct stat stat_buf; if (stat(fname,&stat_buf) != 0) return false; return (stat_buf.st_mode & S_IFMT) == S_IFREG; } bool changeDir(const char *dirName) { return (chdir(dirName) == 0); } void getEntriesAppend(const char *dirName, FileType t, List &entries, const char *pattern) { OGDF_ASSERT(isDirectory(dirName)); DIR* dir_p = opendir(dirName); dirent* dir_e; while ( (dir_e = readdir(dir_p)) != NULL ) { const char *fname = dir_e->d_name; if (pattern != 0 && fnmatch(pattern,fname,0)) continue; String fullName; fullName.sprintf("%s/%s", dirName, fname); bool isDir = isDirectory(fullName.cstr()); if(isDir && ( strcmp(fname,".") == 0 || strcmp(fname,"..") == 0) ) continue; if (t == ftEntry || (t == ftFile && !isDir) || (t == ftDirectory && isDir)) { entries.pushBack(fname); } } closedir(dir_p); } #endif void getEntries(const char *dirName, FileType t, List &entries, const char *pattern) { entries.clear(); getEntriesAppend(dirName, t, entries, pattern); } void getFiles(const char *dirName, List &files, const char *pattern) { getEntries(dirName, ftFile, files, pattern); } void getSubdirs(const char *dirName, List &subdirs, const char *pattern) { getEntries(dirName, ftDirectory, subdirs, pattern); } void getEntries(const char *dirName, List &entries, const char *pattern) { getEntries(dirName, ftEntry, entries, pattern); } void getFilesAppend(const char *dirName, List &files, const char *pattern) { getEntriesAppend(dirName, ftFile, files, pattern); } void getSubdirsAppend(const char *dirName, List &subdirs, const char *pattern) { getEntriesAppend(dirName, ftDirectory, subdirs, pattern); } void getEntriesAppend(const char *dirName, List &entries, const char *pattern) { getEntriesAppend(dirName, ftEntry, entries, pattern); } } // end namespace ogdf