More consistency of some sort...
Oh god, what has possessed me to do this?
3 * ===============================================================
4 * SourceMod (C)2004-2007 AlliedModders LLC. All rights reserved.
5 * ===============================================================
7 * This file is not open source and may not be copied without explicit
8 * written permission of AlliedModders LLC. This file may not be redistributed
9 * in whole or significant part.
10 * For information, see LICENSE.txt or http://www.sourcemod.net/license.php
18 #include <sm_platform.h>
19 #include "LibrarySys.h"
21 LibrarySystem g_LibSys;
27 #if defined PLATFORM_WINDOWS
29 #elif defined PLATFORM_POSIX
36 CLibrary::CLibrary(LibraryHandle me)
41 void CLibrary::CloseLibrary()
46 void *CLibrary::GetSymbolAddress(const char *symname)
48 #if defined PLATFORM_WINDOWS
49 return GetProcAddress(m_lib, symname);
50 #elif defined PLATFORM_POSIX
51 return dlsym(m_lib, symname);
61 CDirectory::CDirectory(const char *path)
63 #if defined PLATFORM_WINDOWS
64 char newpath[PLATFORM_MAX_PATH];
65 snprintf(newpath, sizeof(newpath), "%s\\*.*", path);
66 m_dir = FindFirstFileA(newpath, &m_fd);
69 m_fd.cFileName[0] = '\0';
71 #elif defined PLATFORM_POSIX
72 m_dir = opendir(path);
75 /* :TODO: we need to read past "." and ".."! */
77 snprintf(m_origpath, PLATFORM_MAX_PATH, "%s", path);
84 CDirectory::~CDirectory()
88 #if defined PLATFORM_WINDOWS
90 #elif defined PLATFORM_POSIX
96 void CDirectory::NextEntry()
98 #if defined PLATFORM_WINDOWS
99 if (FindNextFile(m_dir, &m_fd) == 0)
102 m_dir = INVALID_HANDLE_VALUE;
104 #elif defined PLATFORM_POSIX
105 if ((ep=readdir(m_dir)) == NULL)
113 bool CDirectory::IsEntryValid()
118 bool CDirectory::IsEntryDirectory()
120 #if defined PLATFORM_WINDOWS
121 return ((m_fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == FILE_ATTRIBUTE_DIRECTORY);
122 #elif defined PLATFORM_LINUX
123 char temppath[PLATFORM_MAX_PATH];
124 snprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName());
125 return g_LibSys.IsPathDirectory(temppath);
129 bool CDirectory::IsEntryFile()
131 #if defined PLATFORM_WINDOWS
132 return !(m_fd.dwFileAttributes & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE));
133 #elif defined PLATFORM_POSIX
134 char temppath[PLATFORM_MAX_PATH];
135 snprintf(temppath, sizeof(temppath), "%s/%s", m_origpath, GetEntryName());
136 return g_LibSys.IsPathFile(temppath);
140 const char *CDirectory::GetEntryName()
142 #if defined PLATFORM_WINDOWS
143 return m_fd.cFileName;
144 #elif defined PLATFORM_LINUX
145 return ep ? ep->d_name : "";
149 bool CDirectory::MoreFiles()
154 bool CDirectory::IsValid()
156 #if defined PLATFORM_WINDOWS
157 return (m_dir != INVALID_HANDLE_VALUE);
158 #elif defined PLATFORM_LINUX
159 return (m_dir != NULL);
164 /*************************
165 ** Library System Code **
166 *************************/
169 bool LibrarySystem::PathExists(const char *path)
171 #if defined PLATFORM_WINDOWS
172 DWORD attr = GetFileAttributesA(path);
174 return (attr != INVALID_FILE_ATTRIBUTES);
175 #elif defined PLATFORM_POSIX
178 return (stat(path, &s) == 0);
182 bool LibrarySystem::IsPathFile(const char *path)
184 #if defined PLATFORM_WINDOWS
185 DWORD attr = GetFileAttributes(path);
187 if (attr == INVALID_FILE_ATTRIBUTES)
192 if (attr & (FILE_ATTRIBUTE_DIRECTORY|FILE_ATTRIBUTE_DEVICE))
198 #elif defined PLATFORM_LINUX
201 if (stat(path, &s) != 0)
206 return S_ISREG(s.st_mode) ? true : false;
210 bool LibrarySystem::IsPathDirectory(const char *path)
212 #if defined PLATFORM_WINDOWS
213 DWORD attr = GetFileAttributes(path);
215 if (attr == INVALID_FILE_ATTRIBUTES)
220 if (attr & FILE_ATTRIBUTE_DIRECTORY)
225 #elif defined PLATFORM_LINUX
228 if (stat(path, &s) != 0)
233 if (S_ISDIR(s.st_mode))
242 IDirectory *LibrarySystem::OpenDirectory(const char *path)
244 CDirectory *dir = new CDirectory(path);
255 void LibrarySystem::GetPlatformError(char *error, size_t err_max)
257 if (error && err_max)
259 #if defined PLATFORM_WINDOWS
260 DWORD dw = GetLastError();
262 FORMAT_MESSAGE_FROM_SYSTEM,
265 MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
269 #elif defined PLATFORM_POSIX
270 snprintf(error, err_max, "%s", strerror(errno));
275 void LibrarySystem::CloseDirectory(IDirectory *dir)
280 ILibrary *LibrarySystem::OpenLibrary(const char *path, char *error, size_t err_max)
283 #if defined PLATFORM_WINDOWS
284 lib = LoadLibraryA(path);
287 GetPlatformError(error, err_max);
290 #elif defined PLATFORM_POSIX
291 lib = dlopen(path, RTLD_NOW);
294 GetPlatformError(error, err_max);
299 return new CLibrary(lib);
302 size_t LibrarySystem::PathFormat(char *buffer, size_t len, const char *fmt, ...)
306 size_t mylen = vsnprintf(buffer, len, fmt, ap);
312 buffer[mylen] = '\0';
315 for (size_t i=0; i<mylen; i++)
317 if (buffer[i] == PLATFORM_SEP_ALTCHAR)
319 buffer[i] = PLATFORM_SEP_CHAR;