From fd0b3f9abd2c111a95b68f9ea4c5b16d9d4679d8 Mon Sep 17 00:00:00 2001 From: hyung-hwan Date: Wed, 4 May 2011 01:48:42 +0000 Subject: [PATCH] added qse_mbsbasename()/qse_wcsbasename() --- qse/cmd/sed/sed.c | 6 ++--- qse/include/qse/cmn/misc.h | 13 +++++++++- qse/include/qse/types.h | 4 +-- qse/lib/awk/rio.c | 50 +++++++++++++++++++++++--------------- qse/lib/cmn/misc.c | 32 ++++++++++++++++++------ 5 files changed, 72 insertions(+), 33 deletions(-) diff --git a/qse/cmd/sed/sed.c b/qse/cmd/sed/sed.c index 8df29bbd..2ed7c12c 100644 --- a/qse/cmd/sed/sed.c +++ b/qse/cmd/sed/sed.c @@ -37,9 +37,9 @@ static qse_ulong_t g_memlimit = 0; static qse_mmgr_t xma_mmgr = { - qse_xma_alloc, - qse_xma_realloc, - qse_xma_free, + (qse_mmgr_alloc_t)qse_xma_alloc, + (qse_mmgr_realloc_t)qse_xma_realloc, + (qse_mmgr_free_t)qse_xma_free, QSE_NULL }; diff --git a/qse/include/qse/cmn/misc.h b/qse/include/qse/cmn/misc.h index 15bcb6a4..26bca8db 100644 --- a/qse/include/qse/cmn/misc.h +++ b/qse/include/qse/cmn/misc.h @@ -24,12 +24,23 @@ #include #include +#ifdef QSE_CHAR_IS_MCHAR +# define qse_basename(path) qse_mbsbasename(path) +#else +# define qse_basename(path) qse_wcsbasename(path) +#endif #ifdef __cplusplus extern "C" { #endif -const qse_char_t* qse_basename (const qse_char_t* path); +const qse_mchar_t* qse_mbsbasename ( + const qse_mchar_t* path +); + +const qse_wchar_t* qse_wcsbasename ( + const qse_wchar_t* path +); #ifdef __cplusplus } diff --git a/qse/include/qse/types.h b/qse/include/qse/types.h index 1654499c..9a2549af 100644 --- a/qse/include/qse/types.h +++ b/qse/include/qse/types.h @@ -1,5 +1,5 @@ /* - * $Id: types.h 441 2011-04-22 14:28:43Z hyunghwan.chung $ + * $Id: types.h 450 2011-05-03 07:48:42Z hyunghwan.chung $ * Copyright 2006-2011 Chung, Hyung-Hwan. This file is part of QSE. @@ -39,7 +39,7 @@ #elif defined(vms) || defined(__vms) # include #else -# error unsupported operating system +# error Unsupported operating system #endif /** diff --git a/qse/lib/awk/rio.c b/qse/lib/awk/rio.c index 212a06d3..6e1ef148 100644 --- a/qse/lib/awk/rio.c +++ b/qse/lib/awk/rio.c @@ -1,5 +1,5 @@ /* - * $Id: rio.c 449 2011-05-01 14:37:17Z hyunghwan.chung $ + * $Id: rio.c 450 2011-05-03 07:48:42Z hyunghwan.chung $ * Copyright 2006-2011 Chung, Hyung-Hwan. This file is part of QSE. @@ -321,18 +321,24 @@ int qse_awk_rtx_readio ( ret = 1; - /* call the io handler */ + /* call the I/O handler */ while (1) { if (p->in.pos >= p->in.len) { qse_ssize_t x; - /* no more data. read more */ + /* no more data in the read buffer. + * let the I/O handler read more */ if (p->in.eof) { - if (QSE_STR_LEN(buf) == 0) ret = 0; + /* it has reached EOF at the previous call. */ + if (QSE_STR_LEN(buf) == 0) + { + /* we return EOF if the record buffer is empty */ + ret = 0; + } break; } @@ -345,7 +351,8 @@ int qse_awk_rtx_readio ( if (run->errinf.num == QSE_AWK_ENOERR) { /* if the error number has not been - * set by the user handler */ + * set by the user handler, we set + * it here to QSE_AWK_EIOIMPL. */ qse_awk_rtx_seterrnum (run, QSE_AWK_EIOIMPL, QSE_NULL); } @@ -358,7 +365,12 @@ int qse_awk_rtx_readio ( /* EOF reached */ p->in.eof = 1; - if (QSE_STR_LEN(buf) == 0) ret = 0; + if (QSE_STR_LEN(buf) == 0) + { + /* We can return EOF now if the record buffer + * is empty */ + ret = 0; + } else if (rrs.ptr != QSE_NULL && rrs.len == 0) { /* TODO: handle different line terminator */ @@ -674,7 +686,7 @@ int qse_awk_rtx_writeio_str ( handler = run->rio.handler[io_type]; if (handler == QSE_NULL) { - /* no io handler provided */ + /* no I/O handler provided */ qse_awk_rtx_seterrnum (run, QSE_AWK_EIOUSER, QSE_NULL); return -1; } @@ -744,10 +756,10 @@ int qse_awk_rtx_writeio_str ( run->rio.chain = p; /* usually, n == 0 indicates that it has reached the end - * of the input. the user io handler can return 0 for the + * of the input. the user I/O handler can return 0 for the * open request if it doesn't have any files to open. One * advantage of doing this would be that you can skip the - * entire pattern-block matching and exeuction. */ + * entire pattern-block matching and execution. */ if (n == 0) { p->out.eos = 1; @@ -806,7 +818,7 @@ int qse_awk_rtx_flushio ( QSE_ASSERT (out_type >= 0 && out_type <= QSE_COUNTOF(out_mode_map)); QSE_ASSERT (out_type >= 0 && out_type <= QSE_COUNTOF(out_mask_map)); - /* translate the out_type into the relevant io type and mode */ + /* translate the out_type into the relevant I/O type and mode */ io_type = out_type_map[out_type]; /*io_mode = out_mode_map[out_type];*/ io_mask = out_mask_map[out_type]; @@ -814,7 +826,7 @@ int qse_awk_rtx_flushio ( handler = run->rio.handler[io_type]; if (handler == QSE_NULL) { - /* no io handler provided */ + /* no I/O handler provided */ qse_awk_rtx_seterrnum (run, QSE_AWK_EIOUSER, QSE_NULL); return -1; } @@ -860,7 +872,7 @@ int qse_awk_rtx_nextio_read ( QSE_ASSERT (in_type >= 0 && in_type <= QSE_COUNTOF(in_mode_map)); QSE_ASSERT (in_type >= 0 && in_type <= QSE_COUNTOF(in_mask_map)); - /* translate the in_type into the relevant io type and mode */ + /* translate the in_type into the relevant I/O type and mode */ io_type = in_type_map[in_type]; /*io_mode = in_mode_map[in_type];*/ io_mask = in_mask_map[in_type]; @@ -868,7 +880,7 @@ int qse_awk_rtx_nextio_read ( handler = run->rio.handler[io_type]; if (handler == QSE_NULL) { - /* no io handler provided */ + /* no I/O handler provided */ qse_awk_rtx_seterrnum (run, QSE_AWK_EIOUSER, QSE_NULL); return -1; } @@ -938,7 +950,7 @@ int qse_awk_rtx_nextio_write ( QSE_ASSERT (out_type >= 0 && out_type <= QSE_COUNTOF(out_mode_map)); QSE_ASSERT (out_type >= 0 && out_type <= QSE_COUNTOF(out_mask_map)); - /* translate the out_type into the relevant io type and mode */ + /* translate the out_type into the relevant I/O type and mode */ io_type = out_type_map[out_type]; /*io_mode = out_mode_map[out_type];*/ io_mask = out_mask_map[out_type]; @@ -946,7 +958,7 @@ int qse_awk_rtx_nextio_write ( handler = run->rio.handler[io_type]; if (handler == QSE_NULL) { - /* no io handler provided */ + /* no I/O handler provided */ qse_awk_rtx_seterrnum (run, QSE_AWK_EIOUSER, QSE_NULL); return -1; } @@ -985,7 +997,7 @@ int qse_awk_rtx_nextio_write ( if (n == 0) { /* the next stream cannot be opened. - * set the eos flags so that the next call to nextio_write + * set the EOS flags so that the next call to nextio_write * will return 0 without executing the handler */ p->out.eos = 1; return 0; @@ -993,7 +1005,7 @@ int qse_awk_rtx_nextio_write ( else { /* as the next stream has been opened successfully, - * the eof flag should be cleared if set */ + * the EOF flag should be cleared if set */ p->out.eof = 0; return 1; } @@ -1010,7 +1022,7 @@ int qse_awk_rtx_closio_read ( QSE_ASSERT (in_type >= 0 && in_type <= QSE_COUNTOF(in_mode_map)); QSE_ASSERT (in_type >= 0 && in_type <= QSE_COUNTOF(in_mask_map)); - /* translate the in_type into the relevant io type and mode */ + /* translate the in_type into the relevant I/O type and mode */ io_type = in_type_map[in_type]; /*io_mode = in_mode_map[in_type];*/ io_mask = in_mask_map[in_type]; @@ -1018,7 +1030,7 @@ int qse_awk_rtx_closio_read ( handler = run->rio.handler[io_type]; if (handler == QSE_NULL) { - /* no io handler provided */ + /* no I/O handler provided */ qse_awk_rtx_seterrnum (run, QSE_AWK_EIOUSER, QSE_NULL); return -1; } diff --git a/qse/lib/cmn/misc.c b/qse/lib/cmn/misc.c index e1604443..74c9892c 100644 --- a/qse/lib/cmn/misc.c +++ b/qse/lib/cmn/misc.c @@ -1,5 +1,5 @@ /* - * $Id: misc.c 441 2011-04-22 14:28:43Z hyunghwan.chung $ + * $Id: misc.c 450 2011-05-03 07:48:42Z hyunghwan.chung $ * Copyright 2006-2011 Chung, Hyung-Hwan. This file is part of QSE. @@ -20,15 +20,31 @@ #include -const qse_char_t* qse_basename (const qse_char_t* path) -{ - const qse_char_t* p, * last = QSE_NULL; - for (p = path; *p != QSE_T('\0'); p++) +const qse_mchar_t* qse_mbsbasename (const qse_mchar_t* path) +{ + const qse_mchar_t* p, * last = QSE_NULL; + + for (p = path; *p != QSE_MT('\0'); p++) { - if (*p == QSE_T('/')) last = p; - #if defined(_WIN32) || defined(__OS2__) - else if (*p == QSE_T('\\')) last = p; + if (*p == QSE_MT('/')) last = p; + #if defined(__OS2__) || defined(_WIN32) || defined(__DOS__) + else if (*p == QSE_MT('\\')) last = p; + #endif + } + + return (last == QSE_NULL)? path: (last + 1); +} + +const qse_wchar_t* qse_wcsbasename (const qse_wchar_t* path) +{ + const qse_wchar_t* p, * last = QSE_NULL; + + for (p = path; *p != QSE_WT('\0'); p++) + { + if (*p == QSE_WT('/')) last = p; + #if defined(__OS2__) || defined(_WIN32) || defined(__DOS__) + else if (*p == QSE_WT('\\')) last = p; #endif }