#define _FILEFN_H_
#ifdef __GNUG__
-#pragma interface "filefn.h"
+ #pragma interface "filefn.h"
#endif
#include <wx/list.h>
// define off_t
#ifndef __WXMAC__
-#include <sys/types.h>
+ #include <sys/types.h>
#else
-typedef long off_t;
+ typedef long off_t;
#endif
#if defined(__VISUALC__) || defined(__MWERKS__)
const off_t wxInvalidOffset = (off_t)-1;
-typedef enum {
+enum wxSeekMode
+{
wxFromStart,
wxFromCurrent,
wxFromEnd
-} wxSeekMode;
+};
WXDLLEXPORT_DATA(extern const char*) wxEmptyString;
#define FileNameFromPath wxFileNameFromPath
// Get directory
-WXDLLEXPORT char* wxPathOnly(char *path);
WXDLLEXPORT wxString wxPathOnly(const wxString& path);
#define PathOnly wxPathOnly
WXDLLEXPORT void wxMac2UnixFilename(char *s);
WXDLLEXPORT void wxUnix2MacFilename(char *s);
#endif
+
// Strip the extension, in situ
WXDLLEXPORT void wxStripExtension(char *buffer);
WXDLLEXPORT void wxStripExtension(wxString& buffer);
// Flags are reserved for future use.
#define wxFILE 1
#define wxDIR 2
-WXDLLEXPORT char* wxFindFirstFile(const char *spec, int flags = wxFILE);
-WXDLLEXPORT char* wxFindNextFile(void);
+WXDLLEXPORT wxString wxFindFirstFile(const char *spec, int flags = wxFILE);
+WXDLLEXPORT wxString wxFindNextFile();
// Does the pattern contain wildcards?
WXDLLEXPORT bool wxIsWild(const wxString& pattern);
// IMPORTANT NOTE getcwd is know not to work under some releases
// of Win32s 1.3, according to MS release notes!
WXDLLEXPORT char* wxGetWorkingDirectory(char *buf = (char *) NULL, int sz = 1000);
+// new and preferred version of wxGetWorkingDirectory
+// NB: can't have the same name because of overloading ambiguity
+WXDLLEXPORT wxString wxGetCwd();
// Set working directory
WXDLLEXPORT bool wxSetWorkingDirectory(const wxString& d);
WXDLLEXPORT bool wxRmdir(const wxString& dir, int flags = 0);
// separators in file names
-#define FILE_SEP_EXT '.'
-#define FILE_SEP_DSK ':'
-#define FILE_SEP_PATH_DOS '\\'
-#define FILE_SEP_PATH_UNIX '/'
+#define wxFILE_SEP_EXT '.'
+#define wxFILE_SEP_DSK ':'
+#define wxFILE_SEP_PATH_DOS '\\'
+#define wxFILE_SEP_PATH_UNIX '/'
// separator in the path list (as in PATH environment variable)
// NB: these are strings and not characters on purpose!
-#define PATH_SEP_DOS ";"
-#define PATH_SEP_UNIX ":"
+#define wxPATH_SEP_DOS ";"
+#define wxPATH_SEP_UNIX ":"
// platform independent versions
#ifdef __UNIX__
- #define FILE_SEP_PATH FILE_SEP_PATH_UNIX
- #define PATH_SEP PATH_SEP_UNIX
+ #define wxFILE_SEP_PATH wxFILE_SEP_PATH_UNIX
+ #define wxPATH_SEP wxPATH_SEP_UNIX
#else // Windows
- #define FILE_SEP_PATH FILE_SEP_PATH_DOS
- #define PATH_SEP PATH_SEP_DOS
+ #define wxFILE_SEP_PATH wxFILE_SEP_PATH_DOS
+ #define wxPATH_SEP wxPATH_SEP_DOS
#endif // Unix/Windows
// this is useful for wxString::IsSameAs(): to compare two file names use
// is the char a path separator?
inline bool wxIsPathSeparator(char c)
- { return c == FILE_SEP_PATH_DOS || c == FILE_SEP_PATH_UNIX; }
+ { return c == wxFILE_SEP_PATH_DOS || c == wxFILE_SEP_PATH_UNIX; }
// does the string ends with path separator?
WXDLLEXPORT bool wxEndsWithPathSeparator(const char *pszFileName);
class WXDLLEXPORT wxPathList : public wxStringList
{
public:
- void AddEnvList(const wxString& envVariable); // Adds all paths in environment variable
+ // Adds all paths in environment variable
+ void AddEnvList(const wxString& envVariable);
void Add(const wxString& path);
// Avoid compiler warning
wxNode *Add(const char *s) { return wxStringList::Add(s); }
-
- wxString FindValidPath(const wxString& filename); // Find the first full path
- // for which the file exists
- wxString FindAbsoluteValidPath(const wxString& filename); // Find the first full path
- // for which the file exists; ensure it's an absolute
- // path that gets returned.
- void EnsureFileAccessible(const wxString& path); // Given full path and filename,
- // add path to list
+ // Find the first full path for which the file exists
+ wxString FindValidPath(const wxString& filename);
+ // Find the first full path for which the file exists; ensure it's an
+ // absolute path that gets returned.
+ wxString FindAbsoluteValidPath(const wxString& filename);
+ // Given full path and filename, add path to list
+ void EnsureFileAccessible(const wxString& path);
+ // Returns TRUE if the path is in the list
bool Member(const wxString& path);
private:
/////////////////////////////////////////////////////////////////////////////
#ifdef __GNUG__
-#pragma implementation "filefn.h"
+ #pragma implementation "filefn.h"
#endif
// For compilers that support precompilation, includes "wx.h".
#include "wx/defs.h"
#ifdef __BORLANDC__
-#pragma hdrstop
+ #pragma hdrstop
#endif
#ifndef WX_PRECOMP
-#include "wx/defs.h"
+ #include "wx/defs.h"
#endif
#include "wx/utils.h"
#include <time.h>
#ifndef __MWERKS__
-#include <sys/types.h>
-#include <sys/stat.h>
+ #include <sys/types.h>
+ #include <sys/stat.h>
#else
-#include <stat.h>
-#include <unistd.h>
+ #include <stat.h>
+ #include <unistd.h>
#endif
#ifdef __UNIX__
-#include <unistd.h>
-#include <dirent.h>
+ #include <unistd.h>
+ #include <dirent.h>
#endif
#ifdef __WINDOWS__
#if !defined( __GNUWIN32__ ) && !defined( __MWERKS__ ) && !defined(__SALFORDC__)
-#include <direct.h>
-#include <dos.h>
-#endif
-#endif
+ #include <direct.h>
+ #include <dos.h>
+#endif // __WINDOWS__
+#endif // native Win compiler
#ifdef __GNUWIN32__
-#ifndef __TWIN32__
-#include <sys/unistd.h>
-#endif
+ #ifndef __TWIN32__
+ #include <sys/unistd.h>
+ #endif
-#define stricmp strcasecmp
+ #define stricmp strcasecmp
#endif
#ifdef __BORLANDC__ // Please someone tell me which version of Borland needs
// this (3.1 I believe) and how to test for it.
// If this works for Borland 4.0 as well, then no worries.
-#include <dir.h>
+ #include <dir.h>
#endif
#ifdef __SALFORDC__
-#include <dir.h>
-#include <unix.h>
+ #include <dir.h>
+ #include <unix.h>
#endif
#include "wx/setup.h"
// No, Cygwin doesn't appear to have fnmatch.h after all.
#if defined(HAVE_FNMATCH_H)
-#include "fnmatch.h"
+ #include "fnmatch.h"
#endif
#ifdef __WINDOWS__
-#include "windows.h"
+ #include "windows.h"
#endif
#define _MAXPATHLEN 500
extern char *wxBuffer;
#ifdef __WXMAC__
-extern char gwxMacFileName[] ;
-extern char gwxMacFileName2[] ;
-extern char gwxMacFileName3[] ;
+ extern char gwxMacFileName[] ;
+ extern char gwxMacFileName2[] ;
+ extern char gwxMacFileName3[] ;
#endif
#if !USE_SHARED_LIBRARIES
-IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList)
+ IMPLEMENT_DYNAMIC_CLASS(wxPathList, wxStringList)
#endif
void wxPathList::Add (const wxString& path)
{
- wxStringList::Add ((char *)(const char *)path);
+ wxStringList::Add ((char *)(const char *)path);
}
// Add paths e.g. from the PATH environment variable
// to the list if not already there.
void wxPathList::EnsureFileAccessible (const wxString& path)
{
- wxString path1(path);
- char *path_only = wxPathOnly (WXSTRINGCAST path1);
- if (path_only)
- {
- if (!Member (wxString(path_only)))
- Add (wxString(path_only));
- }
+ wxString path_only(wxPathOnly(path));
+ if ( !path_only.IsEmpty() )
+ {
+ if ( !Member(path_only) )
+ Add(path_only);
+ }
}
bool wxPathList::Member (const wxString& path)
if (! IsAbsolutePath(wxExpandPath(wxBuffer, filename))) {
char buf[_MAXPATHLEN];
buf[0] = '\0';
- wxGetWorkingDirectory(buf, sizeof(buf)/sizeof(char));
+ wxGetWorkingDirectory(buf, WXSIZEOF(buf));
char ch = buf[strlen(buf) - 1];
#ifdef __WXMSW__
if (ch != '\\' && ch != '/')
// Flags are reserved for future use.
#ifndef __VMS__
-static DIR *wxDirStream = (DIR *) NULL;
-static char *wxFileSpec = (char *) NULL;
-static int wxFindFileFlags = 0;
+ static DIR *gs_dirStream = (DIR *) NULL;
+ static wxString gs_strFileSpec;
+ static int gs_findFlags = 0;
#endif
-char *wxFindFirstFile(const char *spec, int flags)
+wxString wxFindFirstFile(const char *spec, int flags)
{
+ wxString result;
+
#ifndef __VMS__
- if (wxDirStream)
- closedir(wxDirStream); // edz 941103: better housekeping
+ if (gs_dirStream)
+ closedir(gs_dirStream); // edz 941103: better housekeping
- wxFindFileFlags = flags;
+ gs_findFlags = flags;
- if (wxFileSpec)
- delete[] wxFileSpec;
- wxFileSpec = copystring(spec);
+ gs_strFileSpec = spec;
- // Find path only so we can concatenate
- // found file onto path
- char *p = wxPathOnly(wxFileSpec);
+ // Find path only so we can concatenate
+ // found file onto path
+ wxString path(wxPathOnly(gs_strFileSpec));
- /* MATTHEW: special case: path is really "/" */
- if (p && !*p && *wxFileSpec == '/')
- p = "/";
- /* MATTHEW: p is NULL => Local directory */
- if (!p)
- p = ".";
+ // special case: path is really "/"
+ if ( !path && gs_strFileSpec[0u] == '/' )
+ path = '/';
+ // path is empty => Local directory
+ if ( !path )
+ path = '.';
- if ((wxDirStream=opendir(p))==NULL)
- return (char *) NULL;
+ gs_dirStream = opendir(path);
+ if ( !gs_dirStream )
+ {
+ wxLogSysError(_("Can not enumerate files in directory '%s'"),
+ path.c_str());
+ }
+ else
+ {
+ result = wxFindNextFile();
+ }
+#endif // !VMS
- /* MATTHEW: [5] wxFindNextFile can do the rest of the work */
- return wxFindNextFile();
-#endif
- // ifndef __VMS__
- return (char *) NULL;
+ return result;
}
-char *wxFindNextFile(void)
+wxString wxFindNextFile()
{
-#ifndef __VMS__
- static char buf[400]; // FIXME static buffer
+ wxString result;
- /* MATTHEW: [2] Don't crash if we read too many times */
- if (!wxDirStream)
- return (char *) NULL;
+#ifndef __VMS__
+ wxCHECK_MSG( gs_dirStream, result, "must call wxFindFirstFile first" );
+
+ // Find path only so we can concatenate
+ // found file onto path
+ wxString path(wxPathOnly(gs_strFileSpec));
+ wxString name(wxFileNameFromPath(gs_strFileSpec));
+
+ /* MATTHEW: special case: path is really "/" */
+ if ( !path && gs_strFileSpec[0u] == '/')
+ path = '/';
+
+ // Do the reading
+ struct dirent *nextDir;
+ for ( nextDir = readdir(gs_dirStream);
+ nextDir != NULL;
+ nextDir = readdir(gs_dirStream) )
+ {
+ if (wxMatchWild(name, nextDir->d_name))
+ {
+ result.Empty();
+ if ( !path.IsEmpty() )
+ {
+ result = path;
+ if ( path != '/' )
+ result += '/';
+ }
- // Find path only so we can concatenate
- // found file onto path
- char *p = wxPathOnly(wxFileSpec);
- char *n = wxFileNameFromPath(wxFileSpec);
+ result += nextDir->d_name;
- /* MATTHEW: special case: path is really "/" */
- if (p && !*p && *wxFileSpec == '/')
- p = "/";
+ // Only return "." and ".." when they match
+ bool isdir;
+ if ( (strcmp(nextDir->d_name, ".") == 0) ||
+ (strcmp(nextDir->d_name, "..") == 0))
+ {
+ if ( (gs_findFlags & wxDIR) != 0 )
+ isdir = TRUE;
+ else
+ continue;
+ }
+ else
+ isdir = wxDirExists(result);
- // Do the reading
- struct dirent *nextDir;
- for (nextDir = readdir(wxDirStream); nextDir != NULL; nextDir = readdir(wxDirStream))
- {
+ // and only return directories when flags & wxDIR
+ if ( !gs_findFlags ||
+ ((gs_findFlags & wxDIR) && isdir) ||
+ ((gs_findFlags & wxFILE) && !isdir) )
+ {
+ return result;
+ }
+ }
+ }
- /* MATTHEW: [5] Only return "." and ".." when they match, and only return
- directories when flags & wxDIR */
- if (wxMatchWild(n, nextDir->d_name)) {
- bool isdir;
+ result.Empty(); // not found
- buf[0] = 0;
- if (p && *p) {
- strcpy(buf, p);
- if (strcmp(p, "/") != 0)
- strcat(buf, "/");
- }
- strcat(buf, nextDir->d_name);
-
- if ((strcmp(nextDir->d_name, ".") == 0) ||
- (strcmp(nextDir->d_name, "..") == 0)) {
- if (wxFindFileFlags && !(wxFindFileFlags & wxDIR))
- continue;
- isdir = TRUE;
- } else
- isdir = wxDirExists(buf);
-
- if (!wxFindFileFlags
- || ((wxFindFileFlags & wxDIR) && isdir)
- || ((wxFindFileFlags & wxFILE) && !isdir))
- return buf;
- }
- }
- closedir(wxDirStream);
- wxDirStream = (DIR *) NULL;
-#endif
- // ifndef __VMS__
+ closedir(gs_dirStream);
+ gs_dirStream = (DIR *) NULL;
+#endif // !VMS
- return (char *) NULL;
+ return result;
}
#elif defined(__WXMSW__)
#ifdef __WIN32__
-HANDLE wxFileStrucHandle = INVALID_HANDLE_VALUE;
-WIN32_FIND_DATA wxFileStruc;
-#else
-#ifdef __BORLANDC__
-static struct ffblk wxFileStruc;
-#else
-static struct _find_t wxFileStruc;
-#endif
-#endif
-static wxString wxFileSpec = "";
-static int wxFindFileFlags;
-
-char *wxFindFirstFile(const char *spec, int flags)
+ static HANDLE gs_hFileStruct = INVALID_HANDLE_VALUE;
+ static WIN32_FIND_DATA gs_findDataStruct;
+#else // Win16
+ #ifdef __BORLANDC__
+ static struct ffblk gs_findDataStruct;
+ #else
+ static struct _find_t gs_findDataStruct;
+ #endif // Borland
+#endif // Win32/16
+
+static wxString gs_strFileSpec;
+static int gs_findFlags = 0;
+
+wxString wxFindFirstFile(const char *spec, int flags)
{
- wxFileSpec = spec;
- wxFindFileFlags = flags; /* MATTHEW: [5] Remember flags */
-
- // Find path only so we can concatenate
- // found file onto path
- wxString path1(wxFileSpec);
- char *p = wxPathOnly(WXSTRINGCAST path1);
- if (p && (strlen(p) > 0))
- strcpy(wxBuffer, p);
- else
- wxBuffer[0] = 0;
+ wxString result;
+
+ gs_strFileSpec = spec;
+ gs_findFlags = flags; /* MATTHEW: [5] Remember flags */
+
+ // Find path only so we can concatenate found file onto path
+ wxString path(wxPathOnly(gs_strFileSpec));
+ if ( !path.IsEmpty() )
+ result << path << '\\';
#ifdef __WIN32__
- if (wxFileStrucHandle != INVALID_HANDLE_VALUE)
- FindClose(wxFileStrucHandle);
+ if ( gs_hFileStruct != INVALID_HANDLE_VALUE )
+ FindClose(gs_hFileStruct);
- wxFileStrucHandle = ::FindFirstFile(WXSTRINGCAST spec, &wxFileStruc);
+ gs_hFileStruct = ::FindFirstFile(WXSTRINGCAST spec, &gs_findDataStruct);
- if (wxFileStrucHandle == INVALID_HANDLE_VALUE)
- return NULL;
+ if ( gs_hFileStruct == INVALID_HANDLE_VALUE )
+ {
+ wxLogSysError(_("Can not enumerate files in directory '%s'"),
+ path.c_str());
- bool isdir = !!(wxFileStruc.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
+ result.Empty();
- if (isdir && !(flags & wxDIR))
- return wxFindNextFile();
- else if (!isdir && flags && !(flags & wxFILE))
- return wxFindNextFile();
+ return result;
+ }
- if (wxBuffer[0] != 0)
- strcat(wxBuffer, "\\");
- strcat(wxBuffer, wxFileStruc.cFileName);
- return wxBuffer;
-#else
+ bool isdir = !!(gs_findDataStruct.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
+
+ if (isdir && !(flags & wxDIR))
+ return wxFindNextFile();
+ else if (!isdir && flags && !(flags & wxFILE))
+ return wxFindNextFile();
- int flag = _A_NORMAL;
- if (flags & wxDIR) /* MATTHEW: [5] Use & */
- flag = _A_SUBDIR;
+ result += gs_findDataStruct.cFileName;
+
+ return result;
+#else
+ int flag = _A_NORMAL;
+ if (flags & wxDIR) /* MATTHEW: [5] Use & */
+ flag = _A_SUBDIR;
#ifdef __BORLANDC__
- if (findfirst(WXSTRINGCAST spec, &wxFileStruc, flag) == 0)
+ if (findfirst(WXSTRINGCAST spec, &gs_findDataStruct, flag) == 0)
#else
- if (_dos_findfirst(WXSTRINGCAST spec, flag, &wxFileStruc) == 0)
+ if (_dos_findfirst(WXSTRINGCAST spec, flag, &gs_findDataStruct) == 0)
#endif
- {
- /* MATTHEW: [5] Check directory flag */
- char attrib;
+ {
+ /* MATTHEW: [5] Check directory flag */
+ char attrib;
#ifdef __BORLANDC__
- attrib = wxFileStruc.ff_attrib;
+ attrib = gs_findDataStruct.ff_attrib;
#else
- attrib = wxFileStruc.attrib;
+ attrib = gs_findDataStruct.attrib;
#endif
- if (attrib & _A_SUBDIR) {
- if (!(wxFindFileFlags & wxDIR))
- return wxFindNextFile();
- } else if (wxFindFileFlags && !(wxFindFileFlags & wxFILE))
+ if (attrib & _A_SUBDIR) {
+ if (!(gs_findFlags & wxDIR))
+ return wxFindNextFile();
+ } else if (gs_findFlags && !(gs_findFlags & wxFILE))
return wxFindNextFile();
- if (wxBuffer[0] != 0)
- strcat(wxBuffer, "\\");
-
+ result +=
#ifdef __BORLANDC__
- strcat(wxBuffer, wxFileStruc.ff_name);
+ gs_findDataStruct.ff_name
#else
- strcat(wxBuffer, wxFileStruc.name);
+ gs_findDataStruct.name
#endif
- return wxBuffer;
- }
- else
- return NULL;
+ ;
+ }
#endif // __WIN32__
+
+ return result;
}
-char *wxFindNextFile(void)
+wxString wxFindNextFile()
{
- // Find path only so we can concatenate
- // found file onto path
- wxString p2(wxFileSpec);
- char *p = wxPathOnly(WXSTRINGCAST p2);
- if (p && (strlen(p) > 0))
- strcpy(wxBuffer, p);
- else
- wxBuffer[0] = 0;
+ wxString result;
- try_again:
+ // Find path only so we can concatenate found file onto path
+ wxString path(wxPathOnly(gs_strFileSpec));
+
+try_again:
#ifdef __WIN32__
- if (wxFileStrucHandle == INVALID_HANDLE_VALUE)
- return NULL;
-
- bool success = (FindNextFile(wxFileStrucHandle, &wxFileStruc) != 0);
- if (!success) {
- FindClose(wxFileStrucHandle);
- wxFileStrucHandle = INVALID_HANDLE_VALUE;
- return NULL;
- }
+ if (gs_hFileStruct == INVALID_HANDLE_VALUE)
+ return NULL;
- bool isdir = !!(wxFileStruc.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
+ bool success = (FindNextFile(gs_hFileStruct, &gs_findDataStruct) != 0);
+ if (!success)
+ {
+ FindClose(gs_hFileStruct);
+ gs_hFileStruct = INVALID_HANDLE_VALUE;
+ }
+ else
+ {
+ bool isdir = !!(gs_findDataStruct.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY);
- if (isdir && !(wxFindFileFlags & wxDIR))
- goto try_again;
- else if (!isdir && wxFindFileFlags && !(wxFindFileFlags & wxFILE))
- goto try_again;
+ if (isdir && !(gs_findFlags & wxDIR))
+ goto try_again;
+ else if (!isdir && gs_findFlags && !(gs_findFlags & wxFILE))
+ goto try_again;
- if (wxBuffer[0] != 0)
- strcat(wxBuffer, "\\");
- strcat(wxBuffer, wxFileStruc.cFileName);
- return wxBuffer;
-#else
+ if ( !path.IsEmpty() )
+ result << path << '\\';
+ result << gs_findDataStruct.cFileName;
+ }
+
+ return result;
+#else // Win16
#ifdef __BORLANDC__
- if (findnext(&wxFileStruc) == 0)
+ if (findnext(&gs_findDataStruct) == 0)
#else
- if (_dos_findnext(&wxFileStruc) == 0)
+ if (_dos_findnext(&gs_findDataStruct) == 0)
#endif
- {
- /* MATTHEW: [5] Check directory flag */
- char attrib;
+ {
+ /* MATTHEW: [5] Check directory flag */
+ char attrib;
#ifdef __BORLANDC__
- attrib = wxFileStruc.ff_attrib;
+ attrib = gs_findDataStruct.ff_attrib;
#else
- attrib = wxFileStruc.attrib;
+ attrib = gs_findDataStruct.attrib;
#endif
- if (attrib & _A_SUBDIR) {
- if (!(wxFindFileFlags & wxDIR))
- goto try_again;
- } else if (wxFindFileFlags && !(wxFindFileFlags & wxFILE))
- goto try_again;
+ if (attrib & _A_SUBDIR) {
+ if (!(gs_findFlags & wxDIR))
+ goto try_again;
+ } else if (gs_findFlags && !(gs_findFlags & wxFILE))
+ goto try_again;
- if (wxBuffer[0] != 0)
- strcat(wxBuffer, "\\");
+ result +=
#ifdef __BORLANDC__
- strcat(wxBuffer, wxFileStruc.ff_name);
+ gs_findDataStruct.ff_name
#else
- strcat(wxBuffer, wxFileStruc.name);
-#endif
- return wxBuffer;
- }
- else
- return NULL;
+ gs_findDataStruct.name
#endif
+ ;
+ }
+#endif // Win32/16
+
+ return result;
}
-#endif
- // __WXMSW__
+#endif // Unix/Windows
// Get current working directory.
// If buf is NULL, allocates space using new, else
return buf;
}
+wxString wxGetCwd()
+{
+ return wxString(wxGetWorkingDirectory());
+}
+
bool wxSetWorkingDirectory(const wxString& d)
{
#if defined( __UNIX__ ) || defined( __WXMAC__ )
wxString strFile;
char *pc;
- for ( pc = strtok(szPath, PATH_SEP); pc; pc = strtok((char *) NULL, PATH_SEP) ) {
+ for ( pc = strtok(szPath, wxPATH_SEP);
+ pc != NULL;
+ pc = strtok((char *) NULL, wxPATH_SEP) )
+ {
// search for the file in this directory
strFile = pc;
if ( !wxEndsWithPathSeparator(pc) )
- strFile += FILE_SEP_PATH;
+ strFile += wxFILE_SEP_PATH;
strFile += pszFile;
if ( FileExists(strFile) ) {
{
wxCHECK_RET( pszFileName, "NULL file name in wxSplitPath" );
- const char *pDot = strrchr(pszFileName, FILE_SEP_EXT);
- const char *pSepUnix = strrchr(pszFileName, FILE_SEP_PATH_UNIX);
- const char *pSepDos = strrchr(pszFileName, FILE_SEP_PATH_DOS);
+ const char *pDot = strrchr(pszFileName, wxFILE_SEP_EXT);
+ const char *pSepUnix = strrchr(pszFileName, wxFILE_SEP_PATH_UNIX);
+ const char *pSepDos = strrchr(pszFileName, wxFILE_SEP_PATH_DOS);
// take the last of the two: nPosUnix containts the last slash in the
// filename
// Created: 29/01/98
// RCS-ID: $Id$
// Copyright: (c) 1998 Vadim Zeitlin <zeitlin@dptmaths.ens-cachan.fr>
-// Licence: wxWindows license
+// Licence: wxWindows license
/////////////////////////////////////////////////////////////////////////////
// ============================================================================
// public variable pointing to the next element in a linked list (or NULL)
wxMsgCatalog *m_pNext;
-
+
private:
// this implementation is binary compatible with GNU gettext() version 0.10
ofsTransTable; // +10: start of translated string table
size_t32 nHashSize, // +14: hash table size
ofsHashTable; // +18: offset of hash table start
- };
-
+ };
+
// all data is stored here, NULL if no data loaded
size_t8 *m_pData;
-
+
// data description
size_t32 m_numStrings, // number of strings in this domain
m_nHashSize; // number of entries in hash table
// swap the 2 halves of 32 bit integer if needed
size_t32 wxMsgCatalog::Swap(size_t32 ui) const
{
- return m_bSwapped ? (ui << 24) | ((ui & 0xff00) << 8) |
+ return m_bSwapped ? (ui << 24) | ((ui & 0xff00) << 8) |
((ui >> 8) & 0xff00) | (ui >> 24)
: ui;
}
-wxMsgCatalog::wxMsgCatalog()
-{
+wxMsgCatalog::wxMsgCatalog()
+{
m_pData = NULL;
m_pszName = NULL;
}
-wxMsgCatalog::~wxMsgCatalog()
-{
- wxDELETEA(m_pData);
- wxDELETEA(m_pszName);
+wxMsgCatalog::~wxMsgCatalog()
+{
+ wxDELETEA(m_pData);
+ wxDELETEA(m_pszName);
}
// small class to suppress the translation erros until exit from current scope
NoTransErr() { wxSuppressTransErrors(); }
~NoTransErr() { wxRestoreTransErrors(); }
};
-
+
// return all directories to search for given prefix
static wxString GetAllMsgCatalogSubdirs(const char *prefix,
const char *lang)
// search first in prefix/fr/LC_MESSAGES, then in prefix/fr and finally in
// prefix (assuming the language is 'fr')
- searchPath << prefix << FILE_SEP_PATH << lang << FILE_SEP_PATH
- << "LC_MESSAGES" << PATH_SEP
- << prefix << FILE_SEP_PATH << lang << PATH_SEP
- << prefix << PATH_SEP;
+ searchPath << prefix << wxFILE_SEP_PATH << lang << wxFILE_SEP_PATH
+ << "LC_MESSAGES" << wxPATH_SEP
+ << prefix << wxFILE_SEP_PATH << lang << wxPATH_SEP
+ << prefix << wxPATH_SEP;
return searchPath;
}
for ( size_t n = 0; n < count; n++ )
{
searchPath << GetAllMsgCatalogSubdirs(s_searchPrefixes[n], lang)
- << PATH_SEP;
+ << wxPATH_SEP;
}
// then take the current directory
// FIXME it should be the directory of the executable
- searchPath << GetAllMsgCatalogSubdirs(".", lang) << PATH_SEP;
+ searchPath << GetAllMsgCatalogSubdirs(".", lang) << wxPATH_SEP;
// and finally add some standard ones
searchPath
- << GetAllMsgCatalogSubdirs("/usr/share/locale", lang) << PATH_SEP
- << GetAllMsgCatalogSubdirs("/usr/lib/locale", lang) << PATH_SEP
+ << GetAllMsgCatalogSubdirs("/usr/share/locale", lang) << wxPATH_SEP
+ << GetAllMsgCatalogSubdirs("/usr/lib/locale", lang) << wxPATH_SEP
<< GetAllMsgCatalogSubdirs("/usr/local/share/locale", lang);
return searchPath;
if ( pszLcPath != NULL )
strPath += pszLcPath + wxString(szDirPrefix) + MSG_PATH;
#endif // 0
-
+
wxString searchPath = GetFullSearchPath(szDirPrefix);
const char *sublocale = strchr(szDirPrefix, '_');
if ( sublocale )
// exist
searchPath << GetFullSearchPath(wxString(szDirPrefix).
Left((size_t)(sublocale - szDirPrefix)))
- << PATH_SEP;
+ << wxPATH_SEP;
}
-
+
wxString strFile = szName;
strFile += MSGCATALOG_EXTENSION;
// open file
wxLogVerbose(_("using catalog '%s' from '%s'."),
szName, strFullName.c_str());
-
+
wxFile fileMsg(strFullName);
if ( !fileMsg.IsOpened() )
return FALSE;
wxDELETEA(m_pData);
return FALSE;
}
-
+
// examine header
bool bValid = (size_t)nSize > sizeof(wxMsgCatalogHeader);
-
+
wxMsgCatalogHeader *pHeader = (wxMsgCatalogHeader *)m_pData;
if ( bValid ) {
// we'll have to swap all the integers if it's true
// check the magic number
bValid = m_bSwapped || pHeader->magic == MSGCATALOG_MAGIC;
}
-
+
if ( !bValid ) {
// it's either too short or has incorrect magic number
wxLogWarning(_("'%s' is not a valid message catalog."), strFullName.c_str());
-
+
wxDELETEA(m_pData);
return FALSE;
}
-
+
// initialize
m_numStrings = Swap(pHeader->numStrings);
- m_pOrigTable = (wxMsgTableEntry *)(m_pData +
+ m_pOrigTable = (wxMsgTableEntry *)(m_pData +
Swap(pHeader->ofsOrigTable));
- m_pTransTable = (wxMsgTableEntry *)(m_pData +
+ m_pTransTable = (wxMsgTableEntry *)(m_pData +
Swap(pHeader->ofsTransTable));
m_nHashSize = Swap(pHeader->nHashSize);
return NULL;
if ( HasHashTable() ) { // use hash table for lookup if possible
- size_t32 nHashVal = GetHash(szOrig);
+ size_t32 nHashVal = GetHash(szOrig);
size_t32 nIndex = nHashVal % m_nHashSize;
size_t32 nIncr = 1 + (nHashVal % (m_nHashSize - 2));
-
+
while ( TRUE ) {
size_t32 nStr = Swap(m_pHashTable[nIndex]);
if ( nStr == 0 )
return NULL;
-
+
if ( strcmp(szOrig, StringAtOfs(m_pOrigTable, nStr - 1)) == 0 )
return StringAtOfs(m_pTransTable, nStr - 1);
}
// NB: this function has (desired) side effect of changing current locale
-bool wxLocale::Init(const char *szName,
- const char *szShort,
+bool wxLocale::Init(const char *szName,
+ const char *szShort,
const char *szLocale,
bool bLoadDefault)
{
// this wild guess is surely wrong
m_strShort = wxToLower(szLocale[0]) + wxToLower(szLocale[1]);
}
-
+
// save the old locale to be able to restore it later
- m_pOldLocale = wxSetLocale(this);
-
+ m_pOldLocale = wxSetLocale(this);
+
// load the default catalog with wxWindows standard messages
m_pMsgCat = NULL;
bool bOk = TRUE;
}
// get the translation of given string in current locale
-const char *wxLocale::GetString(const char *szOrigString,
+const char *wxLocale::GetString(const char *szOrigString,
const char *szDomain) const
{
wxASSERT( szOrigString != NULL ); // would be pretty silly
wxMsgCatalog *pMsgCat;
if ( szDomain != NULL ) {
pMsgCat = FindCatalog(szDomain);
-
+
// does the catalog exist?
if ( pMsgCat != NULL )
pszTrans = pMsgCat->GetString(szOrigString);
#else // !debug
wxSuppressTransErrors();
#endif // debug/!debug
-
+
if ( szDomain != NULL )
{
wxLogWarning(_("string '%s' not found in domain '%s' for locale '%s'."),
if ( Stricmp(pMsgCat->GetName(), szDomain) == 0 )
return pMsgCat;
}
-
+
return NULL;
}
bool wxLocale::AddCatalog(const char *szDomain)
{
wxMsgCatalog *pMsgCat = new wxMsgCatalog;
-
+
if ( pMsgCat->Load(m_strShort, szDomain) ) {
// add it to the head of the list so that in GetString it will
// be searched before the catalogs added earlier
pMsgCat->m_pNext = m_pMsgCat;
m_pMsgCat = pMsgCat;
-
+
return TRUE;
}
else {
// don't add it because it couldn't be loaded anyway
delete pMsgCat;
-
+
return FALSE;
}
}
wxLocale *wxGetLocale()
{
- return g_pLocale;
+ return g_pLocale;
}
wxLocale *wxSetLocale(wxLocale *pLocale)
{
- wxLocale *pOld = g_pLocale;
- g_pLocale = pLocale;
- return pOld;
+ wxLocale *pOld = g_pLocale;
+ g_pLocale = pLocale;
+ return pOld;
}