added QSE_TIO_IGNOREMBWCERR
This commit is contained in:
parent
00e15a42e9
commit
e2affec43b
@ -237,43 +237,51 @@ static int handle_args (int argc, qse_char_t* argv[])
|
||||
return 1;
|
||||
}
|
||||
|
||||
qse_char_t* load_script_file (const qse_char_t* file)
|
||||
qse_char_t* load_script_file (qse_sed_t* sed, const qse_char_t* file)
|
||||
{
|
||||
qse_cint_t c;
|
||||
qse_str_t script;
|
||||
QSE_FILE* fp;
|
||||
qse_sio_t* fp;
|
||||
qse_xstr_t xstr;
|
||||
qse_char_t buf[256];
|
||||
|
||||
fp = qse_fopen (file, QSE_T("r"));
|
||||
fp = qse_sio_open (
|
||||
qse_sed_getmmgr(sed), 0, file,
|
||||
QSE_SIO_READ | QSE_SIO_IGNOREMBWCERR);
|
||||
if (fp == QSE_NULL) return QSE_NULL;
|
||||
|
||||
if (qse_str_init (&script, QSE_MMGR_GETDFL(), 1024) <= -1)
|
||||
{
|
||||
qse_fclose (fp);
|
||||
qse_sio_close (fp);
|
||||
qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot load %s\n"), file);
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
while ((c = qse_fgetc (fp)) != QSE_CHAR_EOF)
|
||||
while (1)
|
||||
{
|
||||
if (qse_str_ccat (&script, c) == (qse_size_t)-1)
|
||||
{
|
||||
qse_str_fini (&script);
|
||||
qse_fclose (fp);
|
||||
return QSE_NULL;
|
||||
}
|
||||
}
|
||||
if (qse_ferror(fp))
|
||||
qse_ssize_t n;
|
||||
|
||||
n = qse_sio_gets (fp, buf, QSE_COUNTOF(buf));
|
||||
if (n == 0) break;
|
||||
if (n <= -1)
|
||||
{
|
||||
qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot read %s\n"), file);
|
||||
qse_str_fini (&script);
|
||||
qse_fclose (fp);
|
||||
qse_sio_close (fp);
|
||||
return QSE_NULL;
|
||||
}
|
||||
|
||||
if (qse_str_ncat (&script, buf, n) == (qse_size_t)-1)
|
||||
{
|
||||
qse_fprintf (QSE_STDERR, QSE_T("ERROR: out of memory\n"));
|
||||
qse_str_fini (&script);
|
||||
qse_sio_close (fp);
|
||||
return QSE_NULL;
|
||||
}
|
||||
}
|
||||
|
||||
qse_str_yield (&script, &xstr, 0);
|
||||
qse_str_fini (&script);
|
||||
qse_fclose (fp);
|
||||
qse_sio_close (fp);
|
||||
|
||||
return xstr.ptr;
|
||||
}
|
||||
@ -314,7 +322,7 @@ int sed_main (int argc, qse_char_t* argv[])
|
||||
{
|
||||
QSE_ASSERT (g_script == QSE_NULL);
|
||||
|
||||
g_script = load_script_file (g_script_file);
|
||||
g_script = load_script_file (sed, g_script_file);
|
||||
if (g_script == QSE_NULL) goto oops;
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: fio.h 556 2011-08-31 15:43:46Z hyunghwan.chung $
|
||||
* $Id: fio.h 565 2011-09-11 02:48:21Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -34,9 +34,10 @@ enum qse_fio_open_flag_t
|
||||
{
|
||||
/* request qse_char_io based IO */
|
||||
QSE_FIO_TEXT = (1 << 0),
|
||||
QSE_FIO_IGNOREMBWCERR = (1 << 1),
|
||||
|
||||
/* treat the file name pointer as a handle pointer */
|
||||
QSE_FIO_HANDLE = (1 << 1),
|
||||
QSE_FIO_HANDLE = (1 << 3),
|
||||
|
||||
QSE_FIO_READ = (1 << 8),
|
||||
QSE_FIO_WRITE = (1 << 9),
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: pio.h 556 2011-08-31 15:43:46Z hyunghwan.chung $
|
||||
* $Id: pio.h 565 2011-09-11 02:48:21Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -39,14 +39,15 @@ enum qse_pio_oflag_t
|
||||
{
|
||||
/** enable text based I/O. */
|
||||
QSE_PIO_TEXT = (1 << 0),
|
||||
QSE_PIO_IGNOREMBWCERR = (1 << 1),
|
||||
|
||||
/** execute the command via a system shell
|
||||
* (/bin/sh on *nix, cmd.exe on windows) */
|
||||
QSE_PIO_SHELL = (1 << 1),
|
||||
QSE_PIO_SHELL = (1 << 3),
|
||||
|
||||
/** indicate that the command to qse_pio_open() is a multi-byte string.
|
||||
* it is useful if #QSE_CHAR_IS_WCHAR is defined. */
|
||||
QSE_PIO_MBSCMD = (1 << 2),
|
||||
QSE_PIO_MBSCMD = (1 << 4),
|
||||
|
||||
/** write to stdin of a child process */
|
||||
QSE_PIO_WRITEIN = (1 << 8),
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: sio.h 556 2011-08-31 15:43:46Z hyunghwan.chung $
|
||||
* $Id: sio.h 565 2011-09-11 02:48:21Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -33,6 +33,7 @@
|
||||
enum qse_sio_open_flag_t
|
||||
{
|
||||
QSE_SIO_HANDLE = QSE_FIO_HANDLE,
|
||||
QSE_SIO_IGNOREMBWCERR = QSE_FIO_IGNOREMBWCERR,
|
||||
|
||||
QSE_SIO_READ = QSE_FIO_READ,
|
||||
QSE_SIO_WRITE = QSE_FIO_WRITE,
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: tio.h 556 2011-08-31 15:43:46Z hyunghwan.chung $
|
||||
* $Id: tio.h 565 2011-09-11 02:48:21Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -60,12 +60,18 @@ enum
|
||||
QSE_TIO_MAX_OUTBUF_LEN = 4096
|
||||
};
|
||||
|
||||
enum
|
||||
enum qse_tio_cmd_t
|
||||
{
|
||||
QSE_TIO_IO_OPEN,
|
||||
QSE_TIO_IO_CLOSE,
|
||||
QSE_TIO_IO_DATA
|
||||
};
|
||||
typedef enum qse_tio_cmd_t qse_tio_cmd_t;
|
||||
|
||||
enum qse_tio_flag_t
|
||||
{
|
||||
QSE_TIO_IGNOREMBWCERR = (1 << 0)
|
||||
};
|
||||
|
||||
#define QSE_TIO_ERRNUM(tio) ((const qse_tio_errnum_t)(tio)->errnum)
|
||||
|
||||
@ -75,7 +81,7 @@ typedef struct qse_tio_t qse_tio_t;
|
||||
* The qse_tio_io_t types define a text I/O handler.
|
||||
*/
|
||||
typedef qse_ssize_t (*qse_tio_io_t) (
|
||||
int cmd,
|
||||
qse_tio_cmd_t cmd,
|
||||
void* arg,
|
||||
void* data,
|
||||
qse_size_t size
|
||||
@ -90,6 +96,7 @@ struct qse_tio_t
|
||||
{
|
||||
QSE_DEFINE_COMMON_FIELDS (tio)
|
||||
qse_tio_errnum_t errnum;
|
||||
int flags;
|
||||
|
||||
/* io functions */
|
||||
qse_tio_io_t input_func;
|
||||
@ -126,7 +133,8 @@ QSE_DEFINE_COMMON_FUNCTIONS (tio)
|
||||
*/
|
||||
qse_tio_t* qse_tio_open (
|
||||
qse_mmgr_t* mmgr,
|
||||
qse_size_t xtnsize
|
||||
qse_size_t xtnsize,
|
||||
int flags
|
||||
);
|
||||
|
||||
/**
|
||||
@ -142,7 +150,8 @@ int qse_tio_close (
|
||||
*/
|
||||
int qse_tio_init (
|
||||
qse_tio_t* tio,
|
||||
qse_mmgr_t* mmgr
|
||||
qse_mmgr_t* mmgr,
|
||||
int flags
|
||||
);
|
||||
|
||||
/**
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: fio.c 556 2011-08-31 15:43:46Z hyunghwan.chung $
|
||||
* $Id: fio.c 565 2011-09-11 02:48:21Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -45,8 +45,8 @@
|
||||
|
||||
QSE_IMPLEMENT_COMMON_FUNCTIONS (fio)
|
||||
|
||||
static qse_ssize_t fio_input (int cmd, void* arg, void* buf, qse_size_t size);
|
||||
static qse_ssize_t fio_output (int cmd, void* arg, void* buf, qse_size_t size);
|
||||
static qse_ssize_t fio_input (qse_tio_cmd_t cmd, void* arg, void* buf, qse_size_t size);
|
||||
static qse_ssize_t fio_output (qse_tio_cmd_t cmd, void* arg, void* buf, qse_size_t size);
|
||||
|
||||
qse_fio_t* qse_fio_open (
|
||||
qse_mmgr_t* mmgr, qse_size_t ext,
|
||||
@ -365,8 +365,11 @@ int qse_fio_init (
|
||||
if (flags & QSE_FIO_TEXT)
|
||||
{
|
||||
qse_tio_t* tio;
|
||||
int opt = 0;
|
||||
|
||||
tio = qse_tio_open (fio->mmgr, 0);
|
||||
if (fio->flags & QSE_FIO_IGNOREMBWCERR) opt |= QSE_TIO_IGNOREMBWCERR;
|
||||
|
||||
tio = qse_tio_open (fio->mmgr, 0, opt);
|
||||
if (tio == QSE_NULL) QSE_THROW_ERR (tio);
|
||||
|
||||
if (qse_tio_attachin (tio, fio_input, fio) <= -1 ||
|
||||
@ -826,7 +829,7 @@ int qse_fio_unlock (qse_fio_t* fio, qse_fio_lck_t* lck, int flags)
|
||||
return -1;
|
||||
}
|
||||
|
||||
static qse_ssize_t fio_input (int cmd, void* arg, void* buf, qse_size_t size)
|
||||
static qse_ssize_t fio_input (qse_tio_cmd_t cmd, void* arg, void* buf, qse_size_t size)
|
||||
{
|
||||
qse_fio_t* fio = (qse_fio_t*)arg;
|
||||
QSE_ASSERT (fio != QSE_NULL);
|
||||
@ -838,7 +841,7 @@ static qse_ssize_t fio_input (int cmd, void* arg, void* buf, qse_size_t size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static qse_ssize_t fio_output (int cmd, void* arg, void* buf, qse_size_t size)
|
||||
static qse_ssize_t fio_output (qse_tio_cmd_t cmd, void* arg, void* buf, qse_size_t size)
|
||||
{
|
||||
qse_fio_t* fio = (qse_fio_t*)arg;
|
||||
QSE_ASSERT (fio != QSE_NULL);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: pio.c 556 2011-08-31 15:43:46Z hyunghwan.chung $
|
||||
* $Id: pio.c 565 2011-09-11 02:48:21Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -40,8 +40,8 @@
|
||||
|
||||
QSE_IMPLEMENT_COMMON_FUNCTIONS (pio)
|
||||
|
||||
static qse_ssize_t pio_input (int cmd, void* arg, void* buf, qse_size_t size);
|
||||
static qse_ssize_t pio_output (int cmd, void* arg, void* buf, qse_size_t size);
|
||||
static qse_ssize_t pio_input (qse_tio_cmd_t cmd, void* arg, void* buf, qse_size_t size);
|
||||
static qse_ssize_t pio_output (qse_tio_cmd_t cmd, void* arg, void* buf, qse_size_t size);
|
||||
|
||||
qse_pio_t* qse_pio_open (
|
||||
qse_mmgr_t* mmgr, qse_size_t ext,
|
||||
@ -999,11 +999,15 @@ int qse_pio_init (
|
||||
|
||||
if (oflags & QSE_PIO_TEXT)
|
||||
{
|
||||
int topt = 0;
|
||||
|
||||
if (oflags & QSE_PIO_IGNOREMBWCERR) topt |= QSE_TIO_IGNOREMBWCERR;
|
||||
|
||||
for (i = 0; i < QSE_COUNTOF(tio); i++)
|
||||
{
|
||||
int r;
|
||||
|
||||
tio[i] = qse_tio_open (pio->mmgr, 0);
|
||||
tio[i] = qse_tio_open (pio->mmgr, 0, topt);
|
||||
if (tio[i] == QSE_NULL)
|
||||
{
|
||||
pio->errnum = QSE_PIO_ENOMEM;
|
||||
@ -1565,7 +1569,7 @@ int qse_pio_kill (qse_pio_t* pio)
|
||||
#endif
|
||||
}
|
||||
|
||||
static qse_ssize_t pio_input (int cmd, void* arg, void* buf, qse_size_t size)
|
||||
static qse_ssize_t pio_input (qse_tio_cmd_t cmd, void* arg, void* buf, qse_size_t size)
|
||||
{
|
||||
qse_pio_pin_t* pin = (qse_pio_pin_t*)arg;
|
||||
QSE_ASSERT (pin != QSE_NULL);
|
||||
@ -1580,7 +1584,7 @@ static qse_ssize_t pio_input (int cmd, void* arg, void* buf, qse_size_t size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static qse_ssize_t pio_output (int cmd, void* arg, void* buf, qse_size_t size)
|
||||
static qse_ssize_t pio_output (qse_tio_cmd_t cmd, void* arg, void* buf, qse_size_t size)
|
||||
{
|
||||
qse_pio_pin_t* pin = (qse_pio_pin_t*)arg;
|
||||
QSE_ASSERT (pin != QSE_NULL);
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: sio.c 556 2011-08-31 15:43:46Z hyunghwan.chung $
|
||||
* $Id: sio.c 565 2011-09-11 02:48:21Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -21,8 +21,8 @@
|
||||
#include <qse/cmn/sio.h>
|
||||
#include "mem.h"
|
||||
|
||||
static qse_ssize_t __sio_input (int cmd, void* arg, void* buf, qse_size_t size);
|
||||
static qse_ssize_t __sio_output (int cmd, void* arg, void* buf, qse_size_t size);
|
||||
static qse_ssize_t __sio_input (qse_tio_cmd_t cmd, void* arg, void* buf, qse_size_t size);
|
||||
static qse_ssize_t __sio_output (qse_tio_cmd_t cmd, void* arg, void* buf, qse_size_t size);
|
||||
|
||||
#if defined(_WIN32)
|
||||
# include <windows.h>
|
||||
@ -56,6 +56,7 @@ static qse_sio_t __sio_in =
|
||||
{
|
||||
QSE_NULL,
|
||||
0,
|
||||
0,
|
||||
|
||||
__sio_input,
|
||||
__sio_output,
|
||||
@ -97,6 +98,7 @@ static qse_sio_t __sio_out =
|
||||
{
|
||||
QSE_NULL,
|
||||
0,
|
||||
0,
|
||||
|
||||
__sio_input,
|
||||
__sio_output,
|
||||
@ -138,6 +140,7 @@ static qse_sio_t __sio_err =
|
||||
{
|
||||
QSE_NULL,
|
||||
0,
|
||||
0,
|
||||
|
||||
__sio_input,
|
||||
__sio_output,
|
||||
@ -195,6 +198,7 @@ int qse_sio_init (
|
||||
qse_sio_t* sio, qse_mmgr_t* mmgr, const qse_char_t* file, int flags)
|
||||
{
|
||||
int mode;
|
||||
int topt = 0;
|
||||
|
||||
if (mmgr == QSE_NULL) mmgr = QSE_MMGR_GETDFL();
|
||||
|
||||
@ -206,7 +210,9 @@ int qse_sio_init (
|
||||
|
||||
if (qse_fio_init (&sio->fio, mmgr, file, flags, mode) <= -1) return -1;
|
||||
|
||||
if (qse_tio_init(&sio->tio, mmgr) <= -1)
|
||||
if (flags & QSE_SIO_IGNOREMBWCERR) topt |= QSE_TIO_IGNOREMBWCERR;
|
||||
|
||||
if (qse_tio_init(&sio->tio, mmgr, topt) <= -1)
|
||||
{
|
||||
qse_fio_fini (&sio->fio);
|
||||
return -1;
|
||||
@ -329,7 +335,7 @@ int qse_sio_seek (qse_sio_t* sio, qse_sio_seek_t pos)
|
||||
}
|
||||
#endif
|
||||
|
||||
static qse_ssize_t __sio_input (int cmd, void* arg, void* buf, qse_size_t size)
|
||||
static qse_ssize_t __sio_input (qse_tio_cmd_t cmd, void* arg, void* buf, qse_size_t size)
|
||||
{
|
||||
qse_sio_t* sio = (qse_sio_t*)arg;
|
||||
|
||||
@ -358,7 +364,7 @@ static qse_ssize_t __sio_input (int cmd, void* arg, void* buf, qse_size_t size)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static qse_ssize_t __sio_output (int cmd, void* arg, void* buf, qse_size_t size)
|
||||
static qse_ssize_t __sio_output (qse_tio_cmd_t cmd, void* arg, void* buf, qse_size_t size)
|
||||
{
|
||||
qse_sio_t* sio = (qse_sio_t*)arg;
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: tio-get.c 556 2011-08-31 15:43:46Z hyunghwan.chung $
|
||||
* $Id: tio-get.c 565 2011-09-11 02:48:21Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -84,6 +84,12 @@ static qse_ssize_t tio_getc (qse_tio_t* tio, qse_char_t* c)
|
||||
if (n == 0)
|
||||
{
|
||||
/* illegal sequence */
|
||||
if (tio->flags & QSE_TIO_IGNOREMBWCERR)
|
||||
{
|
||||
*c = tio->inbuf[tio->inbuf_curp++];
|
||||
return 1;
|
||||
}
|
||||
|
||||
tio->inbuf_curp++; /* skip one byte */
|
||||
tio->errnum = QSE_TIO_EILSEQ;
|
||||
return -1;
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: tio-put.c 559 2011-09-04 16:21:54Z hyunghwan.chung $
|
||||
* $Id: tio-put.c 565 2011-09-11 02:48:21Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -51,6 +51,12 @@ static qse_ssize_t tio_putc (qse_tio_t* tio, qse_char_t c, int* flush_needed)
|
||||
n = qse_wcrtomb (c, mc, QSE_COUNTOF(mc), &tio->mbstate.out);
|
||||
if (n == 0)
|
||||
{
|
||||
if (tio->flags & QSE_TIO_IGNOREMBWCERR)
|
||||
{
|
||||
/* return 1 as if c has been written successfully */
|
||||
return 1;
|
||||
}
|
||||
|
||||
tio->errnum = QSE_TIO_EILCHR;
|
||||
return -1;
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* $Id: tio.c 559 2011-09-04 16:21:54Z hyunghwan.chung $
|
||||
* $Id: tio.c 565 2011-09-11 02:48:21Z hyunghwan.chung $
|
||||
*
|
||||
Copyright 2006-2011 Chung, Hyung-Hwan.
|
||||
This file is part of QSE.
|
||||
@ -23,7 +23,7 @@
|
||||
|
||||
QSE_IMPLEMENT_COMMON_FUNCTIONS (tio)
|
||||
|
||||
qse_tio_t* qse_tio_open (qse_mmgr_t* mmgr, qse_size_t xtnsize)
|
||||
qse_tio_t* qse_tio_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, int flags)
|
||||
{
|
||||
qse_tio_t* tio;
|
||||
|
||||
@ -40,7 +40,7 @@ qse_tio_t* qse_tio_open (qse_mmgr_t* mmgr, qse_size_t xtnsize)
|
||||
tio = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(qse_tio_t) + xtnsize);
|
||||
if (tio == QSE_NULL) return QSE_NULL;
|
||||
|
||||
if (qse_tio_init (tio, mmgr) <= -1)
|
||||
if (qse_tio_init (tio, mmgr, flags) <= -1)
|
||||
{
|
||||
QSE_MMGR_FREE (mmgr, tio);
|
||||
return QSE_NULL;
|
||||
@ -56,13 +56,14 @@ int qse_tio_close (qse_tio_t* tio)
|
||||
return n;
|
||||
}
|
||||
|
||||
int qse_tio_init (qse_tio_t* tio, qse_mmgr_t* mmgr)
|
||||
int qse_tio_init (qse_tio_t* tio, qse_mmgr_t* mmgr, int flags)
|
||||
{
|
||||
if (mmgr == QSE_NULL) mmgr = QSE_MMGR_GETDFL();
|
||||
|
||||
QSE_MEMSET (tio, 0, QSE_SIZEOF(*tio));
|
||||
|
||||
tio->mmgr = mmgr;
|
||||
tio->flags = flags;
|
||||
|
||||
/*
|
||||
tio->input_func = QSE_NULL;
|
||||
@ -77,7 +78,6 @@ int qse_tio_init (qse_tio_t* tio, qse_mmgr_t* mmgr)
|
||||
*/
|
||||
|
||||
tio->errnum = QSE_TIO_ENOERR;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user