diff --git a/qse/cmd/sed/sed.c b/qse/cmd/sed/sed.c index 20ac8983..8e5fab11 100644 --- a/qse/cmd/sed/sed.c +++ b/qse/cmd/sed/sed.c @@ -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_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; } } - if (qse_ferror(fp)) - { - qse_fprintf (QSE_STDERR, QSE_T("ERROR: cannot read %s\n"), file); - qse_str_fini (&script); - qse_fclose (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; } diff --git a/qse/include/qse/cmn/fio.h b/qse/include/qse/cmn/fio.h index 77318187..5dc66ec4 100644 --- a/qse/include/qse/cmn/fio.h +++ b/qse/include/qse/cmn/fio.h @@ -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. @@ -33,10 +33,11 @@ enum qse_fio_open_flag_t { /* request qse_char_io based IO */ - QSE_FIO_TEXT = (1 << 0), + 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), diff --git a/qse/include/qse/cmn/pio.h b/qse/include/qse/cmn/pio.h index bebbec97..aa7cf5f7 100644 --- a/qse/include/qse/cmn/pio.h +++ b/qse/include/qse/cmn/pio.h @@ -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. @@ -38,15 +38,16 @@ enum qse_pio_oflag_t { /** enable text based I/O. */ - QSE_PIO_TEXT = (1 << 0), + 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), diff --git a/qse/include/qse/cmn/sio.h b/qse/include/qse/cmn/sio.h index 9529c136..8cfc8fc1 100644 --- a/qse/include/qse/cmn/sio.h +++ b/qse/include/qse/cmn/sio.h @@ -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. @@ -32,19 +32,20 @@ enum qse_sio_open_flag_t { - QSE_SIO_HANDLE = QSE_FIO_HANDLE, + QSE_SIO_HANDLE = QSE_FIO_HANDLE, + QSE_SIO_IGNOREMBWCERR = QSE_FIO_IGNOREMBWCERR, - QSE_SIO_READ = QSE_FIO_READ, - QSE_SIO_WRITE = QSE_FIO_WRITE, - QSE_SIO_APPEND = QSE_FIO_APPEND, + QSE_SIO_READ = QSE_FIO_READ, + QSE_SIO_WRITE = QSE_FIO_WRITE, + QSE_SIO_APPEND = QSE_FIO_APPEND, - QSE_SIO_CREATE = QSE_FIO_CREATE, - QSE_SIO_TRUNCATE = QSE_FIO_TRUNCATE, - QSE_SIO_EXCLUSIVE = QSE_FIO_EXCLUSIVE, - QSE_SIO_SYNC = QSE_FIO_SYNC, + QSE_SIO_CREATE = QSE_FIO_CREATE, + QSE_SIO_TRUNCATE = QSE_FIO_TRUNCATE, + QSE_SIO_EXCLUSIVE = QSE_FIO_EXCLUSIVE, + QSE_SIO_SYNC = QSE_FIO_SYNC, - QSE_SIO_NOSHRD = QSE_FIO_NOSHRD, - QSE_SIO_NOSHWR = QSE_FIO_NOSHWR + QSE_SIO_NOSHRD = QSE_FIO_NOSHRD, + QSE_SIO_NOSHWR = QSE_FIO_NOSHWR }; typedef qse_fio_off_t qse_sio_pos_t; diff --git a/qse/include/qse/cmn/tio.h b/qse/include/qse/cmn/tio.h index 018cafd7..f74c1e5c 100644 --- a/qse/include/qse/cmn/tio.h +++ b/qse/include/qse/cmn/tio.h @@ -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,10 +81,10 @@ 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, - void* arg, - void* data, - qse_size_t size + 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 ); /** diff --git a/qse/lib/cmn/fio.c b/qse/lib/cmn/fio.c index 1260d136..29340321 100644 --- a/qse/lib/cmn/fio.c +++ b/qse/lib/cmn/fio.c @@ -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); diff --git a/qse/lib/cmn/pio.c b/qse/lib/cmn/pio.c index 4819dc06..4a3b451b 100644 --- a/qse/lib/cmn/pio.c +++ b/qse/lib/cmn/pio.c @@ -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); diff --git a/qse/lib/cmn/sio.c b/qse/lib/cmn/sio.c index 43de9c61..9d89a63b 100644 --- a/qse/lib/cmn/sio.c +++ b/qse/lib/cmn/sio.c @@ -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 #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 @@ -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; diff --git a/qse/lib/cmn/tio-get.c b/qse/lib/cmn/tio-get.c index 6fc01d0c..3320ecb3 100644 --- a/qse/lib/cmn/tio-get.c +++ b/qse/lib/cmn/tio-get.c @@ -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; diff --git a/qse/lib/cmn/tio-put.c b/qse/lib/cmn/tio-put.c index 65cdf8c3..0fa674e9 100644 --- a/qse/lib/cmn/tio-put.c +++ b/qse/lib/cmn/tio-put.c @@ -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; } diff --git a/qse/lib/cmn/tio.c b/qse/lib/cmn/tio.c index aeabc596..275dfef6 100644 --- a/qse/lib/cmn/tio.c +++ b/qse/lib/cmn/tio.c @@ -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; }