2 #include "LibrarySys.h"
4 LibrarySystem g_LibSys;
10 #if defined PLATFORM_WINDOWS
12 #else if defined PLATFORM_POSIX
19 CLibrary::CLibrary(LibraryHandle me)
24 void CLibrary::CloseLibrary()
29 void *CLibrary::GetSymbolAddress(const char *symname)
31 #if defined PLATFORM_WINDOWS
32 return GetProcAddress(m_lib, symname);
33 #else if defined PLATFORM_POSIX
34 return dlsym(m_lib, symname);
44 CDirectory::CDirectory(const char *path)
46 #if defined PLATFORM_WINDOWS
47 char newpath[PLATFORM_MAX_PATH];
48 snprintf(newpath, sizeof(newpath), "%s\\*.*", path);
49 m_dir = FindFirstFileA(newpath, &m_fd);
52 m_fd.cFileName[0] = '\0';
54 #else if defined PLATFORM_POSIX
55 m_dir = opendir(path);
58 /* :TODO: we need to read past "." and ".."! */
60 snprintf(m_origpath, PLATFORM_MAX_PATH, "%s", path);
67 CDirectory::~CDirectory()
71 #if defined PLATFORM_WINDOWS
73 #else if defined PLATFORM_POSIX
79 void CDirectory::NextEntry()
81 #if defined PLATFORM_WINDOWS
82 if (FindNextFile(m_dir, &m_fd) == 0)
85 m_dir = INVALID_HANDLE_VALUE;
87 #else if defined PLATFORM_POSIX
88 if ((ep=readdir(m_dir) == NULL)
96 bool CDirectory::IsEntryValid()
101 bool CDirectory::IsEntryDirectory()
103 #if defined PLATFORM_WINDOWS
104 return ((m_fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY);
105 #else if defined PLATFORM_LINUX
106 char temppath[PLATFORM_MAX_PATH];
107 snprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName());
108 return g_LibrarySys.IsPathDirectory(temppath);
112 bool CDirectory::IsEntryFile()
114 #if defined PLATFORM_WINDOWS
115 return !(m_fd.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE));
116 #else if defined PLATFORM_POSIX
117 char temppath[PLATFORM_MAX_PATH];
118 snprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName());
119 return g_LibrarySys.IsPathFile(temppath);
123 const char *CDirectory::GetEntryName()
125 #if defined PLATFORM_WINDOWS
126 return m_fd.cFileName;
127 #else if defined PLATFORM_LINUX
128 return ep ? ep->d_name : "";
132 bool CDirectory::MoreFiles()
137 bool CDirectory::IsValid()
139 #if defined PLATFORM_WINDOWS
140 return (m_dir != INVALID_HANDLE_VALUE);
141 #else if defined PLATFORM_LINUX
142 return (m_dir != NULL);
147 /*************************
148 ** Library System Code **
149 *************************/
152 bool LibrarySystem::PathExists(const char *path)
154 #if defined PLATFORM_WINDOWS
155 DWORD attr = GetFileAttributesA(path);
157 return (attr != INVALID_FILE_ATTRIBUTES);
158 #else if defined PLATFORM_POSIX
161 return (stat(path, &s) == 0);
165 bool LibrarySystem::IsPathFile(const char *path)
167 #if defined PLATFORM_WINDOWS
168 DWORD attr = GetFileAttributes(path);
170 if (attr == INVALID_FILE_ATTRIBUTES)
175 if (attr & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE))
181 #else if defined PLATFORM_LINUX
184 if (stat(path, &s) != 0)
189 return S_ISREG(s.st_mode) ? true : false;
193 bool LibrarySystem::IsPathDirectory(const char *path)
195 #if defined PLATFORM_WINDOWS
196 DWORD attr = GetFileAttributes(path);
198 if (attr == INVALID_FILE_ATTRIBUTES)
203 if (attr & FILE_ATTRIBUTE_DIRECTORY)
208 #else if defined PLATFORM_LINUX
211 if (stat(path, &s) != 0)
216 if (S_ISDIR(s.st_mode))
225 IDirectory *LibrarySystem::OpenDirectory(const char *path)
227 CDirectory *dir = new CDirectory(path);
238 void LibrarySystem::GetPlatformError(char *error, size_t err_max)
240 if (error && err_max)
242 #if defined PLATFORM_WINDOWS
243 DWORD dw = GetLastError();
245 FORMAT_MESSAGE_FROM_SYSTEM,
248 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
252 #else if defined PLATFORM_POSIX
253 snprintf(error, err_max, "%s", strerror(errno));
258 void LibrarySystem::CloseDirectory(IDirectory *dir)
263 ILibrary *LibrarySystem::OpenLibrary(const char *path, char *error, size_t err_max)
266 #if defined PLATFORM_WINDOWS
267 lib = LoadLibraryA(path);
270 GetPlatformError(error, err_max);
273 #else if defined PLATFORM_POSIX
274 lib = dlopen(path, RTLD_NOW);
277 GetPlatformError(error, err_max);
282 return new CLibrary(lib);
285 size_t LibrarySystem::PathFormat(char *buffer, size_t len, const char *fmt, ...)
289 size_t mylen = vsnprintf(buffer, len, fmt, ap);
292 mylen = (mylen >= len) ? (len - 1) : mylen;
294 for (size_t i=0; i<mylen; i++)
296 if (buffer[i] == PLATFORM_SEP_ALTCHAR)
298 buffer[i] = PLATFORM_SEP_CHAR;