added qse_get_current_mbsdir()/qse_get_current_wcsdir().

writing qse_get_prog_path(). not yet done.
implementing the Path class
This commit is contained in:
2019-03-13 06:38:54 +00:00
parent 69d0e959da
commit 10b1eabe86
14 changed files with 622 additions and 133 deletions

View File

@ -1152,6 +1152,29 @@ QSE_EXPORT qse_size_t qse_mbsxjoinv (
va_list ap
);
QSE_EXPORT qse_size_t qse_mbscajoin (
qse_mchar_t* buf,
...
);
QSE_EXPORT qse_size_t qse_mbsxcajoin (
qse_mchar_t* buf,
qse_size_t size,
...
);
QSE_EXPORT qse_size_t qse_mbscajoinv (
qse_mchar_t* buf,
va_list ap
);
QSE_EXPORT qse_size_t qse_mbsxcajoinv (
qse_mchar_t* buf,
qse_size_t size,
va_list ap
);
/**
* The qse_wcsjoin() function joins a list of wide-charcter strings into
@ -1195,16 +1218,46 @@ QSE_EXPORT qse_size_t qse_wcsxjoinv (
va_list ap
);
QSE_EXPORT qse_size_t qse_wcscajoin (
qse_wchar_t* buf,
...
);
QSE_EXPORT qse_size_t qse_wcsxcajoin (
qse_wchar_t* buf,
qse_size_t size,
...
);
QSE_EXPORT qse_size_t qse_wcscajoinv (
qse_wchar_t* buf,
va_list ap
);
QSE_EXPORT qse_size_t qse_wcsxcajoinv (
qse_wchar_t* buf,
qse_size_t size,
va_list ap
);
#if defined(QSE_CHAR_IS_MCHAR)
# define qse_strjoin qse_mbsjoin
# define qse_strxjoin qse_mbsxjoin
# define qse_strjoinv qse_mbsjoinv
# define qse_strxjoinv qse_mbsxjoinv
# define qse_strcajoin qse_mbscajoin
# define qse_strxcajoin qse_mbsxcajoin
# define qse_strcajoinv qse_mbscajoinv
# define qse_strxcajoinv qse_mbsxcajoinv
#else
# define qse_strjoin qse_wcsjoin
# define qse_strxjoin qse_wcsxjoin
# define qse_strjoinv qse_wcsjoinv
# define qse_strxjoinv qse_wcsxjoinv
# define qse_strcajoin qse_wcscajoin
# define qse_strxcajoin qse_wcsxcajoin
# define qse_strcajoinv qse_wcscajoinv
# define qse_strxcajoinv qse_wcsxcajoinv
#endif
/* ---------------------------------------------------- */

View File

@ -30,6 +30,7 @@ pkginclude_HEADERS += \
App.hpp \
Condition.hpp \
Mutex.hpp \
Path.hpp \
SocketAddress.hpp \
Socket.hpp \
SpinLock.hpp \

View File

@ -91,6 +91,7 @@ host_triplet = @host@
@ENABLE_CXX_TRUE@ App.hpp \
@ENABLE_CXX_TRUE@ Condition.hpp \
@ENABLE_CXX_TRUE@ Mutex.hpp \
@ENABLE_CXX_TRUE@ Path.hpp \
@ENABLE_CXX_TRUE@ SocketAddress.hpp \
@ENABLE_CXX_TRUE@ Socket.hpp \
@ENABLE_CXX_TRUE@ SpinLock.hpp \
@ -136,7 +137,7 @@ am__can_run_installinfo = \
am__pkginclude_HEADERS_DIST = cnd.h dir.h fio.h fs.h glob.h intr.h \
log.h mtx.h mux.h netlink.h nwad.h nwif.h nwio.h os.h pio.h \
rwl.h sck.h sinfo.h sio.h spl.h task.h thr.h tio.h App.hpp \
Condition.hpp Mutex.hpp SocketAddress.hpp Socket.hpp \
Condition.hpp Mutex.hpp Path.hpp SocketAddress.hpp Socket.hpp \
SpinLock.hpp TcpServer.hpp Thread.hpp
am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
am__vpath_adj = case $$p in \

View File

@ -27,11 +27,12 @@
#ifndef _QSE_SI_PATH_CLASS_
#define _QSE_SI_PATH_CLASS_
#include <qse/types.h>
#include <qse/macros.h>
#include <qse/Types.hpp>
#include <qse/cmn/Mmged.hpp>
QSE_BEGIN_NAMESPACE(QSE)
class Path
class Path: public Mmged
{
public:
enum
@ -39,74 +40,65 @@ public:
MAX_LEN = QSE_PATH_MAX
};
Path ();
Path (const qse_char_t* n);
Path (const Path& fn);
Path& operator= (const Path& fn);
Path (Mmgr* mmgr = QSE_NULL) QSE_CPP_NOEXCEPT;
Path (const qse_char_t* n, Mmgr* mmgr = QSE_NULL) QSE_CPP_NOEXCEPT;
Path (const Path& path) QSE_CPP_NOEXCEPT;
Path& operator= (const Path& path) QSE_CPP_NOEXCEPT;
const qse_char_t* name () const
{
return full_path;
}
// NOTE: the current implementation doesn't have much to benefit from C++11 Move
// semantics and the rvalue reference.
void setName (const qse_char_t* n)
{
if (n == QSE_NULL || n[0] == QSE_CHAR('\0')) set_to_root();
else {
qse_strxcpy (full_path, qse_countof(full_path), n);
this->set_base_name ();
}
}
void setName (const qse_char_t* n) QSE_CPP_NOEXCEPT;
const qse_char_t* baseName () const
{
return base_name;
}
const qse_char_t* baseDir () const
{
return base_dir;
}
const qse_char_t* getName () const QSE_CPP_NOEXCEPT { return this->full_path; }
const qse_char_t* getBaseName () const QSE_CPP_NOEXCEPT { return this->base_name; }
const qse_char_t* getBaseDir () const QSE_CPP_NOEXCEPT { return this->base_dir; }
bool exists ()
{
return exists (full_path);
}
static bool exists (const qse_char_t* path);
#if 0
bool exists () const QSE_CPP_NOEXCEPT { return this->exists(this->full_path); }
static bool exists (const qse_mchar_t* path) QSE_CPP_NOEXCEPT;
static bool exists (const qse_wchar_t* path) QSE_CPP_NOEXCEPT;
int getSize (qse_off_t* sz);
bool isWritable ();
bool isReadable ();
bool isReadWritable ();
#ifndef _WIN32
bool isExecutable ();
int getSize (qse_foff_t* sz) const QSE_CPP_NOEXCEPT { return this->getSize(this->full_path, sz); }
static int getSize (const qse_mchar_t* path, qse_foff_t* sz) QSE_CPP_NOEXCEPT;
static int getSize (const qse_wchar_t* path, qse_foff_t* sz) QSE_CPP_NOEXCEPT;
bool isWritable () const QSE_CPP_NOEXCEPT;
bool isReadable () const QSE_CPP_NOEXCEPT;
bool isReadWritable () const QSE_CPP_NOEXCEPT;
bool isExecutable () const QSE_CPP_NOEXCEPT;
bool isDir () const QSE_CPP_NOEXCEPT { return this->isDir(this->full_path); }
static bool isDir (const qse_char_t* path) QSE_CPP_NOEXCEPT;
bool isRegular () const QSE_CPP_NOEXCEPT { return this->isRegular(this->full_path); }
static bool isRegular (const qse_char_t* path) QSE_CPP_NOEXCEPT;
#endif
bool isDirectory () const { return this->isDirectory (full_path); }
static bool isDirectory (const qse_char_t* path);
int chmod (qse_fmode_t mode) QSE_CPP_NOEXCEPT { return this->chmod(this->full_path, mode); }
static int chmod (const qse_mchar_t* path, qse_fmode_t mode) QSE_CPP_NOEXCEPT;
static int chmod (const qse_wchar_t* path, qse_fmode_t mode) QSE_CPP_NOEXCEPT;
bool isRegular () const { return this->isRegular (full_path); }
static bool isRegular (const qse_char_t* path);
int unlink () QSE_CPP_NOEXCEPT { return this->unlink(this->full_path); }
static int unlink (const qse_mchar_t* path) QSE_CPP_NOEXCEPT;
static int unlink (const qse_wchar_t* path) QSE_CPP_NOEXCEPT;
int chmod (qse_mode_t mode);
static int chmod (const qse_char_t* path, qse_mode_t mode);
int mkdir (qse_fmode_t mode) QSE_CPP_NOEXCEPT { return this->mkdir(this->full_path, mode); }
static int mkdir (const qse_mchar_t* path, qse_fmode_t mode) QSE_CPP_NOEXCEPT;
static int mkdir (const qse_wchar_t* path, qse_fmode_t mode) QSE_CPP_NOEXCEPT;
int unlink ();
static int unlink (const qse_char_t* path);
int mkdir (qse_mode_t mode);
static int mkdir (const qse_char_t* path, qse_mode_t mode);
int setToSelf (const qse_char_t* argv0 = QSE_NULL);
int setToSelf (const qse_mchar_t* argv0 = QSE_NULL) QSE_CPP_NOEXCEPT;
int setToSelf (const qse_wchar_t* argv0 = QSE_NULL) QSE_CPP_NOEXCEPT;
protected:
qse_char_t full_path[QSE_PATH_MAX + 1];
qse_char_t base_name[QSE_PATH_MAX + 1];
qse_char_t base_dir [QSE_PATH_MAX + 1];
void set_base_name ();
void set_to_root ();
void set_base_name () QSE_CPP_NOEXCEPT;
void set_to_root () QSE_CPP_NOEXCEPT;
};
QSE_END_NAMESPACE(QSE)
#endif

View File

@ -46,33 +46,7 @@
# define QSE_SIZEOF_FS_CHAR_T QSE_SIZEOF_MCHAR_T
#endif
#if (QSE_SIZEOF_MODE_T == QSE_SIZEOF_LONG)
# if defined(QSE_MODE_T_IS_SIGNED)
typedef long int qse_fs_mode_t;
# else
typedef unsigned long int qse_fs_mode_t;
# endif
#elif (QSE_SIZEOF_MODE_T == QSE_SIZEOF_INT)
# if defined(QSE_MODE_T_IS_SIGNED)
typedef int qse_fs_mode_t;
# else
typedef unsigned int qse_fs_mode_t;
# endif
#elif (QSE_SIZEOF_MODE_T == QSE_SIZEOF_SHORT)
# if defined(QSE_MODE_T_IS_SIGNED)
typedef short int qse_fs_mode_t;
# else
typedef unsigned short int qse_fs_mode_t;
# endif
#elif (QSE_SIZEOF_MODE_T == QSE_SIZEOF_CHAR)
# if defined(QSE_MODE_T_IS_SIGNED)
typedef signed char qse_fs_mode_t;
# else
typedef unsigned char qse_fs_mode_t;
# endif
#else
typedef unsigned int qse_fs_mode_t;
#endif
typedef qse_fmode_t qse_fs_mode_t;
enum qse_fs_errnum_t
{
@ -519,6 +493,34 @@ QSE_EXPORT int qse_fs_rmdirwcs (
#endif
/* =========================================================================
* GLOBAL UTILITIES NOT USING THE FS OBJECT
* ========================================================================= */
QSE_EXPORT qse_mchar_t* qse_get_current_mbsdir (
qse_mchar_t* buf,
qse_size_t size,
qse_mmgr_t* mmgr
);
QSE_EXPORT qse_wchar_t* qse_get_current_wcsdir (
qse_wchar_t* buf,
qse_size_t size,
qse_mmgr_t* mmgr
);
#if defined(QSE_CHAR_IS_MCHAR)
# define qse_get_current_dir(buf,size,mmgr) qse_get_current_mbsdir(buf,size,mmgr)
#else
# define qse_get_current_dir(buf,size,mmgr) qse_get_current_wcsdir(buf,size,mmgr)
#endif
QSE_EXPORT int qse_get_prog_path (
const qse_char_t* argv0,
qse_char_t* buf,
qse_size_t size,
qse_mmgr_t* mmgr
);
#if defined(__cplusplus)
}

View File

@ -914,9 +914,53 @@ typedef struct qse_tmgr_t qse_tmgr_t;
#elif defined(QSE_HAVE_INT16_T) && (QSE_SIZEOF_OFF_T==2)
typedef qse_int16_t qse_foff_t;
# define QSE_SIZEOF_FOFF_T QSE_SIZEOF_INT16_T
#elif defined(QSE_HAVE_INT8_T) && (QSE_SIZEOF_OFF_T==1)
typedef qse_int8_t qse_foff_t;
# define QSE_SIZEOF_FOFF_T QSE_SIZEOF_INT16_T
#else
typedef qse_int32_t qse_foff_t; /* this line is for doxygen */
# error Unsupported platform
# error Unsupported platform
#endif
/**
* The #qse_fmode_t type defines an integer that can represent a file offset.
* Depending on your system, it's defined to one of #qse_int64_t, #qse_int32_t,
* and #qse_int16_t.
*/
#if defined(QSE_MODE_T_IS_SIGNED)
# if defined(QSE_HAVE_INT64_T) && (QSE_SIZEOF_MODE_T==8)
typedef qse_int64_t qse_fmode_t;
# define QSE_SIZEOF_FMODE_T QSE_SIZEOF_INT64_T
# elif defined(QSE_HAVE_INT32_T) && (QSE_SIZEOF_MODE_T==4)
typedef qse_int32_t qse_fmode_t;
# define QSE_SIZEOF_FMODE_T QSE_SIZEOF_INT32_T
# elif defined(QSE_HAVE_INT16_T) && (QSE_SIZEOF_MODE_T==2)
typedef qse_int16_t qse_fmode_t;
# define QSE_SIZEOF_FMODE_T QSE_SIZEOF_INT16_T
# elif defined(QSE_HAVE_INT8_T) && (QSE_SIZEOF_MODE_T==1)
typedef qse_int8_t qse_fmode_t;
# define QSE_SIZEOF_FMODE_T QSE_SIZEOF_INT8_T
# else
typedef qse_int32_t qse_fmode_t; /* this line is for doxygen */
# error Unsupported platform
# endif
#else
# if defined(QSE_HAVE_INT64_T) && (QSE_SIZEOF_MODE_T==8)
typedef qse_uint64_t qse_fmode_t;
# define QSE_SIZEOF_FMODE_T QSE_SIZEOF_INT64_T
# elif defined(QSE_HAVE_INT32_T) && (QSE_SIZEOF_MODE_T==4)
typedef qse_uint32_t qse_fmode_t;
# define QSE_SIZEOF_FMODE_T QSE_SIZEOF_INT32_T
# elif defined(QSE_HAVE_INT16_T) && (QSE_SIZEOF_MODE_T==2)
typedef qse_uint16_t qse_fmode_t;
# define QSE_SIZEOF_FMODE_T QSE_SIZEOF_INT16_T
# elif defined(QSE_HAVE_INT8_T) && (QSE_SIZEOF_MODE_T==1)
typedef qse_uint8_t qse_fmode_t;
# define QSE_SIZEOF_FMODE_T QSE_SIZEOF_INT8_T
# else
typedef qse_uint32_t qse_fmode_t; /* this line is for doxygen */
# error Unsupported platform
# endif
#endif
/*