added qse_tio_writembs() and qse_tio_readmbs()

This commit is contained in:
2011-12-18 17:40:37 +00:00
parent 7f0ad74286
commit d5db73dfce
20 changed files with 777 additions and 555 deletions

View File

@ -133,7 +133,6 @@ struct qse_fio_t
* in sio.c. make sure that you update the static instantiation
* when you change the structure of qse_fio_t */
QSE_DEFINE_COMMON_FIELDS (fio)
int errnum;
qse_fio_hnd_t handle;
int flags; /* extra flags */
qse_tio_t* tio;
@ -147,7 +146,6 @@ struct qse_fio_lck_t
qse_fio_ori_t origin; /* origin */
};
#define QSE_FIO_ERRNUM(fio) ((fio)->errnum)
#define QSE_FIO_HANDLE(fio) ((fio)->handle)
#ifdef __cplusplus

View File

@ -40,6 +40,7 @@ enum qse_pio_oflag_t
/** enable text based I/O. */
QSE_PIO_TEXT = (1 << 0),
QSE_PIO_IGNOREMBWCERR = (1 << 1),
QSE_PIO_NOAUTOFLUSH = (1 << 2),
/** execute the command via a system shell
* (/bin/sh on *nix, cmd.exe on windows) */

View File

@ -30,7 +30,7 @@
#include <qse/cmn/fio.h>
#include <qse/cmn/tio.h>
enum qse_sio_open_flag_t
enum qse_sio_oflag_t
{
QSE_SIO_HANDLE = QSE_FIO_HANDLE,
QSE_SIO_TEMPORARY = QSE_FIO_TEMPORARY,
@ -60,6 +60,15 @@ enum qse_sio_open_flag_t
QSE_SIO_NOAUTOFLUSH = (1 << 31)
};
typedef qse_tio_errnum_t qse_sio_errnum_t;
#define QSE_SIO_ENOERR QSE_TIO_ENOERR
#define QSE_SIO_ENOMEM QSE_TIO_ENOMEM
#define QSE_SIO_ENOSPC QSE_TIO_ENOSPC
#define QSE_SIO_EILSEQ QSE_TIO_EILSEQ
#define QSE_SIO_EICSEQ QSE_TIO_EICSEQ
#define QSE_SIO_EILCHR QSE_TIO_EILCHR
#define QSE_SIO_ERRNUM(sio) QSE_TIO_ERRNUM(&((sio)->tio))
typedef qse_fio_off_t qse_sio_pos_t;
typedef qse_fio_hnd_t qse_sio_hnd_t;
typedef qse_fio_std_t qse_sio_std_t;
@ -76,9 +85,9 @@ typedef struct qse_sio_t qse_sio_t;
struct qse_sio_t
{
qse_mmgr_t* mmgr;
qse_fio_t fio;
qse_tio_t tio;
QSE_DEFINE_COMMON_FIELDS (tio)
qse_fio_t fio;
qse_tio_t tio;
};
#ifdef __cplusplus
@ -100,14 +109,14 @@ qse_sio_t* qse_sio_open (
qse_mmgr_t* mmgr, /**< memory manager */
qse_size_t xtnsize, /**< extension size in bytes */
const qse_char_t* file, /**< file name */
int flags /**< number OR'ed of #qse_sio_open_flag_t */
int oflags /**< number OR'ed of #qse_sio_oflag_t */
);
qse_sio_t* qse_sio_openstd (
qse_mmgr_t* mmgr, /**< memory manager */
qse_size_t xtnsize, /**< extension size in bytes */
qse_sio_std_t std, /**< standard I/O identifier */
int flags /**< number OR'ed of #qse_sio_open_flag_t */
int oflags /**< number OR'ed of #qse_sio_oflag_t */
);
/**
@ -135,7 +144,11 @@ void qse_sio_fini (
qse_sio_t* sio
);
qse_fio_hnd_t qse_sio_gethandle (
qse_sio_errnum_t qse_sio_geterrnum (
qse_sio_t* sio
);
qse_sio_hnd_t qse_sio_gethandle (
qse_sio_t* sio
);
@ -147,57 +160,91 @@ void qse_sio_purge (
qse_sio_t* sio
);
qse_ssize_t qse_sio_getc (
qse_sio_t* sio,
qse_char_t* c
qse_ssize_t qse_sio_getmc (
qse_sio_t* sio,
qse_mchar_t* c
);
qse_ssize_t qse_sio_gets (
qse_sio_t* sio,
qse_char_t* buf,
qse_size_t size
qse_ssize_t qse_sio_getwc (
qse_sio_t* sio,
qse_wchar_t* c
);
qse_ssize_t qse_sio_getsn (
qse_sio_t* sio,
qse_char_t* buf,
qse_size_t size
qse_ssize_t qse_sio_getmbs (
qse_sio_t* sio,
qse_mchar_t* buf,
qse_size_t size
);
qse_ssize_t qse_sio_putc (
qse_sio_t* sio,
qse_char_t c
qse_ssize_t qse_sio_getmbsn (
qse_sio_t* sio,
qse_mchar_t* buf,
qse_size_t size
);
qse_ssize_t qse_sio_putms (
qse_ssize_t qse_sio_getwcs (
qse_sio_t* sio,
qse_wchar_t* buf,
qse_size_t size
);
qse_ssize_t qse_sio_getwcsn (
qse_sio_t* sio,
qse_wchar_t* buf,
qse_size_t size
);
#if defined(QSE_CHAR_IS_MCHAR)
# define qse_sio_getc(sio,c) qse_sio_getmb(sio,c)
# define qse_sio_getstr(sio,buf,size) qse_sio_getmbs(sio,buf,size)
# define qse_sio_getstrn(sio,buf,size) qse_sio_getmbsn(sio,buf,size)
#else
# define qse_sio_getc(sio,c) qse_sio_getwc(sio,c)
# define qse_sio_getstr(sio,buf,size) qse_sio_getwcs(sio,buf,size)
# define qse_sio_getstrn(sio,buf,size) qse_sio_getwcsn(sio,buf,size)
#endif
qse_ssize_t qse_sio_putmb (
qse_sio_t* sio,
qse_mchar_t c
);
qse_ssize_t qse_sio_putwc (
qse_sio_t* sio,
qse_wchar_t c
);
qse_ssize_t qse_sio_putmbs (
qse_sio_t* sio,
const qse_mchar_t* str
);
qse_ssize_t qse_sio_putws (
qse_ssize_t qse_sio_putwcs (
qse_sio_t* sio,
const qse_wchar_t* str
);
qse_ssize_t qse_sio_putmsn (
qse_ssize_t qse_sio_putmbsn (
qse_sio_t* sio,
const qse_mchar_t* str,
qse_size_t size
);
qse_ssize_t qse_sio_putwsn (
qse_ssize_t qse_sio_putwcsn (
qse_sio_t* sio,
const qse_wchar_t* str,
qse_size_t size
);
#if defined(QSE_CHAR_IS_MCHAR)
# define qse_sio_puts(sio,str) qse_sio_putms(sio,str)
# define qse_sio_putsn(sio,str,size) qse_sio_putmsn(sio,str,size)
# define qse_sio_putc(sio,c) qse_sio_putmb(sio,c)
# define qse_sio_putstr(sio,str) qse_sio_putmbs(sio,str)
# define qse_sio_putstrn(sio,str,size) qse_sio_putmbsn(sio,str,size)
#else
# define qse_sio_puts(sio,str) qse_sio_putws(sio,str)
# define qse_sio_putsn(sio,str,size) qse_sio_putwsn(sio,str,size)
# define qse_sio_putc(sio,c) qse_sio_putwc(sio,c)
# define qse_sio_putstr(sio,str) qse_sio_putwcs(sio,str)
# define qse_sio_putstrn(sio,str,size) qse_sio_putwcsn(sio,str,size)
#endif
/**

View File

@ -57,7 +57,8 @@ enum
* (i.e. 6 for utf8)
*/
QSE_TIO_MAX_INBUF_LEN = 4096,
QSE_TIO_MAX_OUTBUF_LEN = 4096
QSE_TIO_MAX_OUTBUF_LEN = 4096,
QSE_TIO_MAX_INWBUF_LEN = 1024
};
enum qse_tio_cmd_t
@ -97,7 +98,7 @@ struct qse_tio_t
{
QSE_DEFINE_COMMON_FIELDS (tio)
qse_tio_errnum_t errnum;
int flags;
int flags;
/* io functions */
qse_tio_io_t input_func;
@ -106,21 +107,16 @@ struct qse_tio_t
void* output_arg;
/* for housekeeping */
int input_status;
qse_size_t inbuf_curp;
qse_size_t inbuf_len;
qse_size_t outbuf_len;
int input_status;
qse_size_t inbuf_cur;
qse_size_t inbuf_len;
qse_size_t outbuf_len;
qse_size_t inwbuf_cur;
qse_size_t inwbuf_len;
qse_mchar_t inbuf[QSE_TIO_MAX_INBUF_LEN];
qse_mchar_t outbuf[QSE_TIO_MAX_OUTBUF_LEN];
#ifdef QSE_CHAR_IS_WCHAR
struct
{
qse_mbstate_t in;
qse_mbstate_t out;
} mbstate;
#endif
qse_wchar_t inwbuf[QSE_TIO_MAX_INWBUF_LEN];
};
#ifdef __cplusplus
@ -133,9 +129,9 @@ QSE_DEFINE_COMMON_FUNCTIONS (tio)
* The qse_tio_open() function creates an text stream processoor.
*/
qse_tio_t* qse_tio_open (
qse_mmgr_t* mmgr,
qse_size_t xtnsize,
int flags
qse_mmgr_t* mmgr, /**< memory manager */
qse_size_t xtnsize, /**< extension size in bytes */
int flags /**< ORed of qse_tio_flag_t enumerators */
);
/**
@ -228,38 +224,64 @@ void qse_tio_purge (
qse_tio_t* tio
);
/**
* The qse_tio_read() functio reads text.
*/
qse_ssize_t qse_tio_read (
qse_tio_t* tio,
qse_char_t* buf,
qse_size_t size
qse_ssize_t qse_tio_readmbs (
qse_tio_t* tio,
qse_mchar_t* buf,
qse_size_t size
);
qse_ssize_t qse_tio_readwcs (
qse_tio_t* tio,
qse_wchar_t* buf,
qse_size_t size
);
/**
* The qse_tio_write() function writes text.
* If the size paramenter is (qse_size_t)-1, the function treats the data
* parameter as a pointer to a null-terminated string.
* The qse_tio_read() macro is character-type neutral. It maps
* to qse_tio_readmbs() or qse_tio_readwcs().
*/
qse_ssize_t qse_tio_write (
qse_tio_t* tio,
const qse_char_t* data,
qse_size_t size
);
#ifdef QSE_CHAR_IS_MCHAR
# define qse_tio_read(tio,buf,size) qse_tio_readmbs(tio,buf,size)
#else
# define qse_tio_read(tio,buf,size) qse_tio_readwcs(tio,buf,size)
#endif
qse_ssize_t qse_tio_writembsn (
/**
* The qse_tio_writembs() function writes the @a size characters
* from a multibyte string @a str. If @a size is (qse_size_t)-1,
* it writes on until a terminating null is found. It doesn't
* write more than QSE_TYPE_MAX(qse_ssize_t) characters.
* @return number of characters written on success, -1 on failure.
*/
qse_ssize_t qse_tio_writembs (
qse_tio_t* tio,
const qse_mchar_t* data,
const qse_mchar_t* str,
qse_size_t size
);
qse_ssize_t qse_tio_writewcsn (
/**
* The qse_tio_writembs() function writes the @a size characters
* from a wide-character string @a str. If @a size is (qse_size_t)-1,
* it writes on until a terminating null is found. It doesn't write
* more than QSE_TYPE_MAX(qse_ssize_t) characters.
* @return number of characters written on success, -1 on failure.
*/
qse_ssize_t qse_tio_writewcs (
qse_tio_t* tio,
const qse_wchar_t* data,
const qse_wchar_t* str,
qse_size_t size
);
/**
* The qse_tio_write() macro is character-type neutral. It maps
* to qse_tio_writembs() or qse_tio_writewcs().
*/
#ifdef QSE_CHAR_IS_MCHAR
# define qse_tio_write(tio,str,size) qse_tio_writembs(tio,str,size)
#else
# define qse_tio_write(tio,str,size) qse_tio_writewcs(tio,str,size)
#endif
#ifdef __cplusplus
}
#endif