diff --git a/qse/include/qse/awk/awk.h b/qse/include/qse/awk/awk.h index 2f64f797..ad6f0552 100644 --- a/qse/include/qse/awk/awk.h +++ b/qse/include/qse/awk/awk.h @@ -1432,11 +1432,6 @@ QSE_EXPORT int qse_awk_close ( qse_awk_t* awk /**< awk */ ); -QSE_EXPORT void qse_awk_setmmgr ( - qse_awk_t* awk, - qse_mmgr_t* mmgr -); - QSE_EXPORT qse_mmgr_t* qse_awk_getmmgr ( qse_awk_t* awk ); diff --git a/qse/include/qse/cmn/Makefile.am b/qse/include/qse/cmn/Makefile.am index fe5649ea..61707b92 100644 --- a/qse/include/qse/cmn/Makefile.am +++ b/qse/include/qse/cmn/Makefile.am @@ -5,6 +5,7 @@ pkginclude_HEADERS = \ chr.h \ cp949.h \ cp950.h \ + dir.h \ dll.h \ env.h \ fio.h \ @@ -21,6 +22,7 @@ pkginclude_HEADERS = \ map.h \ mbwc.h \ mem.h \ + mux.h \ nwad.h \ nwif.h \ nwio.h \ diff --git a/qse/include/qse/cmn/Makefile.in b/qse/include/qse/cmn/Makefile.in index 4b6a6e39..83ab52c4 100644 --- a/qse/include/qse/cmn/Makefile.in +++ b/qse/include/qse/cmn/Makefile.in @@ -52,12 +52,12 @@ CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = SOURCES = DIST_SOURCES = -am__pkginclude_HEADERS_DIST = alg.h chr.h cp949.h cp950.h dll.h env.h \ - fio.h fma.h fmt.h fs.h gdl.h glob.h htb.h hton.h ipad.h lda.h \ - main.h map.h mbwc.h mem.h nwad.h nwif.h nwio.h oht.h opt.h \ - path.h pio.h pma.h rbt.h rex.h sio.h sll.h slmb.h stdio.h \ - str.h task.h time.h tio.h tre.h uri.h utf8.h xma.h Mmgr.hpp \ - StdMmgr.hpp Mmged.hpp +am__pkginclude_HEADERS_DIST = alg.h chr.h cp949.h cp950.h dir.h dll.h \ + env.h fio.h fma.h fmt.h fs.h gdl.h glob.h htb.h hton.h ipad.h \ + lda.h main.h map.h mbwc.h mem.h mux.h nwad.h nwif.h nwio.h \ + oht.h opt.h path.h pio.h pma.h rbt.h rex.h sio.h sll.h slmb.h \ + stdio.h str.h task.h time.h tio.h tre.h uri.h utf8.h xma.h \ + Mmgr.hpp StdMmgr.hpp Mmged.hpp am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; am__vpath_adj = case $$p in \ $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \ @@ -262,11 +262,12 @@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ -pkginclude_HEADERS = alg.h chr.h cp949.h cp950.h dll.h env.h fio.h \ - fma.h fmt.h fs.h gdl.h glob.h htb.h hton.h ipad.h lda.h main.h \ - map.h mbwc.h mem.h nwad.h nwif.h nwio.h oht.h opt.h path.h \ - pio.h pma.h rbt.h rex.h sio.h sll.h slmb.h stdio.h str.h \ - task.h time.h tio.h tre.h uri.h utf8.h xma.h $(am__append_1) +pkginclude_HEADERS = alg.h chr.h cp949.h cp950.h dir.h dll.h env.h \ + fio.h fma.h fmt.h fs.h gdl.h glob.h htb.h hton.h ipad.h lda.h \ + main.h map.h mbwc.h mem.h mux.h nwad.h nwif.h nwio.h oht.h \ + opt.h path.h pio.h pma.h rbt.h rex.h sio.h sll.h slmb.h \ + stdio.h str.h task.h time.h tio.h tre.h uri.h utf8.h xma.h \ + $(am__append_1) all: all-am .SUFFIXES: diff --git a/qse/include/qse/cmn/dir.h b/qse/include/qse/cmn/dir.h new file mode 100644 index 00000000..8826cbbc --- /dev/null +++ b/qse/include/qse/cmn/dir.h @@ -0,0 +1,108 @@ +/* + * $Id$ + * + Copyright 2006-2012 Chung, Hyung-Hwan. + This file is part of QSE. + + QSE is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + QSE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with QSE. If not, see . + */ + +#ifndef _QSE_DIR_H_ +#define _QSE_DIR_H_ + +/** @file + * This file provides functions and data types for I/O multiplexing. + */ + +#include +#include +#include + +typedef struct qse_dir_t qse_dir_t; +typedef struct qse_dir_ent_t qse_dir_ent_t; + +enum qse_dir_errnum_t +{ + QSE_DIR_ENOERR = 0, /**< no error */ + QSE_DIR_EOTHER, /**< other error */ + QSE_DIR_ENOIMPL, /**< not implemented */ + QSE_DIR_ESYSERR, /**< subsystem(system call) error */ + QSE_DIR_EINTERN, /**< internal error */ + + QSE_DIR_ENOMEM, /**< out of memory */ + QSE_DIR_EINVAL, /**< invalid parameter */ + QSE_DIR_EACCES, /**< access denied */ + QSE_DIR_ENOENT, /**< no such file */ + QSE_DIR_EEXIST, /**< already exist */ + QSE_DIR_EINTR /**< interrupted */ +}; +typedef enum qse_dir_errnum_t qse_dir_errnum_t; + +enum qse_dir_flag_t +{ + QSE_DIR_MBSPATH = (1 << 0), + QSE_DIR_SORT = (1 << 1), + QSE_DIR_STAT = (1 << 2) +}; + +struct qse_dir_ent_t +{ + const qse_char_t* name; + + struct + { + int type; + qse_foff_t size; + qse_ntime_t tmmod; + } stat; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +qse_dir_t* qse_dir_open ( + qse_mmgr_t* mmgr, + qse_size_t xtnsize, + const qse_char_t* path, + int flags +); + +void qse_dir_close ( + qse_dir_t* dir +); + +qse_mmgr_t* qse_dir_getmmgr ( + qse_dir_t* dir +); + +void* qse_dir_getxtn ( + qse_dir_t* dir +); + +int qse_dir_reset ( + qse_dir_t* dir, + const qse_char_t* path +); + +int qse_dir_read ( + qse_dir_t* dir, + qse_dir_ent_t* ent +); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/qse/include/qse/cmn/glob.h b/qse/include/qse/cmn/glob.h index 6a3136fd..0d688922 100644 --- a/qse/include/qse/cmn/glob.h +++ b/qse/include/qse/cmn/glob.h @@ -66,15 +66,6 @@ int qse_glob ( qse_mmgr_t* mmgr ); -int qse_globwithcmgr ( - const qse_char_t* pattern, - qse_glob_cbimpl_t cbimpl, - void* cbctx, - int flags, - qse_mmgr_t* mmgr, - qse_cmgr_t* cmgr -); - #ifdef __cplusplus } #endif diff --git a/qse/include/qse/cmn/mux.h b/qse/include/qse/cmn/mux.h new file mode 100644 index 00000000..124d821a --- /dev/null +++ b/qse/include/qse/cmn/mux.h @@ -0,0 +1,123 @@ +/* + * $Id$ + * + Copyright 2006-2012 Chung, Hyung-Hwan. + This file is part of QSE. + + QSE is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + QSE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with QSE. If not, see . + */ + +#ifndef _QSE_MUX_H_ +#define _QSE_MUX_H_ + +/** @file + * This file provides functions and data types for I/O multiplexing. + */ + +#include +#include +#include + +typedef struct qse_mux_t qse_mux_t; +typedef struct qse_mux_evt_t qse_mux_evt_t; + +enum qse_mux_errnum_t +{ + QSE_MUX_ENOERR = 0, /**< no error */ + QSE_MUX_EOTHER, /**< other error */ + QSE_MUX_ENOIMPL, /**< not implemented */ + QSE_MUX_ESYSERR, /**< subsystem(system call) error */ + QSE_MUX_EINTERN, /**< internal error */ + + QSE_MUX_ENOMEM, /**< out of memory */ + QSE_MUX_EINVAL, /**< invalid parameter */ + QSE_MUX_EACCES, /**< access denied */ + QSE_MUX_ENOENT, /**< no such file */ + QSE_MUX_EEXIST, /**< already exist */ + QSE_MUX_EINTR /**< interrupted */ +}; +typedef enum qse_mux_errnum_t qse_mux_errnum_t; + +#if defined(_WIN32) + typedef qse_uintptr_t qse_mux_hnd_t; +#elif defined(__OS2__) + typedef int qse_mux_hnd_t; +#elif defined(__DOS__) + typedef int qse_mux_hnd_t; +#else + typedef int qse_mux_hnd_t; +#endif + +enum qse_mux_evtmask_t +{ + QSE_MUX_IN = (1 << 0), + QSE_MUX_OUT = (1 << 1) +}; +typedef enum qse_mux_evtmask_t qse_mux_evtmask_t; + +typedef void (*qse_mux_evtfun_t) ( + qse_mux_t* mux, + const qse_mux_evt_t* evt +); + +struct qse_mux_evt_t +{ + qse_mux_hnd_t hnd; + int mask; + void* data; +}; + +#ifdef __cplusplus +extern "C" { +#endif + +qse_mux_t* qse_mux_open ( + qse_mmgr_t* mmgr, + qse_size_t xtnsize, + qse_mux_evtfun_t evtfun, + qse_size_t capahint +); + +void qse_mux_close ( + qse_mux_t* mux +); + +qse_mmgr_t* qse_mux_getmmgr ( + qse_mux_t* mux +); + +void* qse_mux_getxtn ( + qse_mux_t* mux +); + +int qse_mux_insert ( + qse_mux_t* mux, + const qse_mux_evt_t* evt +); + +int qse_mux_delete ( + qse_mux_t* mux, + const qse_mux_evt_t* evt +); + +int qse_mux_poll ( + qse_mux_t* mux, + qse_ntime_t timeout +); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/qse/include/qse/cmn/nwio.h b/qse/include/qse/cmn/nwio.h index 61c17b78..149bcc05 100644 --- a/qse/include/qse/cmn/nwio.h +++ b/qse/include/qse/cmn/nwio.h @@ -80,13 +80,13 @@ struct qse_nwio_tmout_t typedef struct qse_nwio_tmout_t qse_nwio_tmout_t; #if defined(_WIN32) - typedef qse_intptr_t qse_nwio_hnd_t; + typedef qse_uintptr_t qse_nwio_hnd_t; #elif defined(__OS2__) - typedef int qse_nwio_hnd_t; /**< defines a pipe handle type */ + typedef int qse_nwio_hnd_t; #elif defined(__DOS__) - typedef int qse_nwio_hnd_t; /**< defines a pipe handle type */ + typedef int qse_nwio_hnd_t; #else - typedef int qse_nwio_hnd_t; /**< defines a pipe handle type */ + typedef int qse_nwio_hnd_t; #endif typedef struct qse_nwio_t qse_nwio_t; diff --git a/qse/include/qse/cmn/path.h b/qse/include/qse/cmn/path.h index a867113e..bada94ef 100644 --- a/qse/include/qse/cmn/path.h +++ b/qse/include/qse/cmn/path.h @@ -49,6 +49,17 @@ enum qse_canonpath_flag_t QSE_CANONPATH_DROPTRAILINGSEP = (1 << 2) }; + +#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) +# define QSE_ISPATHSEP(c) ((c) == QSE_T('/') || (c) == QSE_T('\\')) +# define QSE_ISPATHMBSEP(c) ((c) == QSE_MT('/') || (c) == QSE_MT('\\')) +# define QSE_ISPATHWCSEP(c) ((c) == QSE_WT('/') || (c) == QSE_WT('\\')) +#else +# define QSE_ISPATHSEP(c) ((c) == QSE_T('/')) +# define QSE_ISPATHMBSEP(c) ((c) == QSE_MT('/')) +# define QSE_ISPATHWCSEP(c) ((c) == QSE_WT('/')) +#endif + #ifdef __cplusplus extern "C" { #endif diff --git a/qse/include/qse/macros.h b/qse/include/qse/macros.h index 90670098..f0b9b0d1 100644 --- a/qse/include/qse/macros.h +++ b/qse/include/qse/macros.h @@ -329,7 +329,6 @@ * of a relevant object created with an extension size greater than 0. */ #define QSE_DEFINE_COMMON_FUNCTIONS(name) \ -void qse_##name##_setmmgr (qse_##name##_t* name, qse_mmgr_t* mmgr); \ qse_mmgr_t* qse_##name##_getmmgr (qse_##name##_t* name); \ void* qse_##name##_getxtn (qse_##name##_t* name); @@ -345,10 +344,6 @@ void* qse_##name##_getxtn (qse_##name##_t* name); * an object. */ #define QSE_IMPLEMENT_COMMON_FUNCTIONS(name) \ -void qse_##name##_setmmgr (qse_##name##_t* name, qse_mmgr_t* mmgr) \ -{ \ - (name)->mmgr = mmgr; \ -} \ qse_mmgr_t* qse_##name##_getmmgr (qse_##name##_t* name) \ { \ return (name)->mmgr; \ diff --git a/qse/include/qse/net/htrd.h b/qse/include/qse/net/htrd.h index 513fab86..cb9d7032 100644 --- a/qse/include/qse/net/htrd.h +++ b/qse/include/qse/net/htrd.h @@ -135,11 +135,6 @@ QSE_EXPORT void qse_htrd_fini ( qse_htrd_t* htrd ); -QSE_EXPORT void qse_htrd_setmmgr ( - qse_htrd_t* htrd, - qse_mmgr_t* mmgr -); - QSE_EXPORT qse_mmgr_t* qse_htrd_getmmgr ( qse_htrd_t* htrd ); diff --git a/qse/include/qse/net/httpd.h b/qse/include/qse/net/httpd.h index ad7df6ac..afa9f478 100644 --- a/qse/include/qse/net/httpd.h +++ b/qse/include/qse/net/httpd.h @@ -29,6 +29,7 @@ #include typedef struct qse_httpd_t qse_httpd_t; +typedef struct qse_httpd_server_t qse_httpd_server_t; typedef struct qse_httpd_client_t qse_httpd_client_t; enum qse_httpd_errnum_t @@ -73,36 +74,6 @@ struct qse_httpd_stat_t qse_ntime_t mtime; }; -enum qse_httpd_server_flag_t -{ - QSE_HTTPD_SERVER_ACTIVE = (1 << 0), - QSE_HTTPD_SERVER_SECURE = (1 << 1), - QSE_HTTPD_SERVER_BINDTONWIF = (1 << 2) -}; - -typedef struct qse_httpd_server_t qse_httpd_server_t; - -typedef void (*qse_httpd_server_predetach_t) ( - qse_httpd_t* httpd, - qse_httpd_server_t* server -); - -struct qse_httpd_server_t -{ - /* ---------------------------------------------- */ - int flags; - qse_nwad_t nwad; /* binding address */ - unsigned int nwif; /* interface number to bind to */ - - /* set by server.open callback */ - qse_ubi_t handle; - - /* private */ - qse_httpd_server_predetach_t predetach; - qse_httpd_server_t* next; - qse_httpd_server_t* prev; -}; - typedef struct qse_httpd_peer_t qse_httpd_peer_t; struct qse_httpd_peer_t { @@ -162,11 +133,9 @@ struct qse_httpd_scb_t struct { - void* (*open) (qse_httpd_t* httpd); + void* (*open) (qse_httpd_t* httpd, qse_httpd_muxcb_t muxcb); void (*close) (qse_httpd_t* httpd, void* mux); - int (*addhnd) ( - qse_httpd_t* httpd, void* mux, qse_ubi_t handle, - int mask, qse_httpd_muxcb_t cbfun, void* cbarg); + int (*addhnd) (qse_httpd_t* httpd, void* mux, qse_ubi_t handle, int mask, void* cbarg); int (*delhnd) (qse_httpd_t* httpd, void* mux, qse_ubi_t handle); int (*poll) (qse_httpd_t* httpd, void* mux, qse_ntime_t timeout); @@ -266,6 +235,8 @@ struct qse_httpd_rcb_t qse_mchar_t* buf, int bufsz); }; +/* -------------------------------------------------------------------------- */ + typedef struct qse_httpd_task_t qse_httpd_task_t; typedef int (*qse_httpd_task_init_t) ( @@ -286,7 +257,6 @@ typedef int (*qse_httpd_task_main_t) ( qse_httpd_task_t* task ); - enum qse_httpd_task_trigger_mask_t { QSE_HTTPD_TASK_TRIGGER_READ = (1 << 0), @@ -322,11 +292,19 @@ struct qse_httpd_task_t qse_httpd_task_t* next; }; +enum qse_httpd_sctype_t +{ + QSE_HTTPD_SERVER, + QSE_HTTPD_CLIENT +}; +typedef enum qse_httpd_sctype_t qse_httpd_sctype_t; struct qse_httpd_client_t { - /* == PUBLIC == */ + /* == PRIVATE == */ + qse_httpd_sctype_t type; + /* == PUBLIC == */ qse_ubi_t handle; qse_ubi_t handle2; qse_nwad_t remote_addr; @@ -354,6 +332,38 @@ struct qse_httpd_client_t } task; }; +enum qse_httpd_server_flag_t +{ + QSE_HTTPD_SERVER_ACTIVE = (1 << 0), + QSE_HTTPD_SERVER_SECURE = (1 << 1), + QSE_HTTPD_SERVER_BINDTONWIF = (1 << 2) +}; + +typedef void (*qse_httpd_server_predetach_t) ( + qse_httpd_t* httpd, + qse_httpd_server_t* server +); + +struct qse_httpd_server_t +{ + qse_httpd_sctype_t type; + + /* ---------------------------------------------- */ + int flags; + qse_nwad_t nwad; /* binding address */ + unsigned int nwif; /* interface number to bind to */ + + /* set by server.open callback */ + qse_ubi_t handle; + + /* private */ + qse_httpd_server_predetach_t predetach; + qse_httpd_server_t* next; + qse_httpd_server_t* prev; +}; + +/* -------------------------------------------------------------------------- */ + /** * The qse_httpd_rsrc_type_t defines the resource type than can * be entasked with qse_httpd_entaskrsrc(). @@ -523,11 +533,6 @@ QSE_EXPORT void qse_httpd_close ( qse_httpd_t* httpd ); -QSE_EXPORT void qse_httpd_setmmgr ( - qse_httpd_t* httpd, - qse_mmgr_t* mmgr -); - QSE_EXPORT qse_mmgr_t* qse_httpd_getmmgr ( qse_httpd_t* httpd ); diff --git a/qse/include/qse/net/upxd.h b/qse/include/qse/net/upxd.h index 65541588..c6b445d7 100644 --- a/qse/include/qse/net/upxd.h +++ b/qse/include/qse/net/upxd.h @@ -152,11 +152,6 @@ QSE_EXPORT void qse_upxd_seterrnum ( qse_upxd_errnum_t errnum ); -QSE_EXPORT void qse_upxd_setmmgr ( - qse_upxd_t* upxd, - qse_mmgr_t* mmgr -); - QSE_EXPORT qse_mmgr_t* qse_upxd_getmmgr ( qse_upxd_t* upxd ); diff --git a/qse/include/qse/sed/sed.h b/qse/include/qse/sed/sed.h index 238dc5d0..88ce7024 100644 --- a/qse/include/qse/sed/sed.h +++ b/qse/include/qse/sed/sed.h @@ -414,11 +414,6 @@ QSE_EXPORT void qse_sed_close ( qse_sed_t* sed /**< stream editor */ ); -QSE_EXPORT void qse_sed_setmmgr ( - qse_sed_t* sed, - qse_mmgr_t* mmgr -); - QSE_EXPORT qse_mmgr_t* qse_sed_getmmgr ( qse_sed_t* sed ); diff --git a/qse/lib/awk/awk.c b/qse/lib/awk/awk.c index 95a31c3f..a2488c03 100644 --- a/qse/lib/awk/awk.c +++ b/qse/lib/awk/awk.c @@ -412,11 +412,6 @@ int qse_awk_clear (qse_awk_t* awk) return 0; } -void qse_awk_setmmgr (qse_awk_t* awk, qse_mmgr_t* mmgr) -{ - awk->mmgr = mmgr; -} - qse_mmgr_t* qse_awk_getmmgr (qse_awk_t* awk) { return awk->mmgr; diff --git a/qse/lib/cmn/Makefile.am b/qse/lib/cmn/Makefile.am index 4691cbfe..1dea26a7 100644 --- a/qse/lib/cmn/Makefile.am +++ b/qse/lib/cmn/Makefile.am @@ -28,6 +28,7 @@ libqsecmn_la_SOURCES = \ alg-sort.c \ assert.c \ chr.c \ + dir.c \ dll.c \ env.c \ gdl.c \ @@ -46,6 +47,7 @@ libqsecmn_la_SOURCES = \ mbwc.c \ mbwc-str.c \ mem.c \ + mux.c \ nwad.c \ nwif.c \ nwio.c \ diff --git a/qse/lib/cmn/Makefile.in b/qse/lib/cmn/Makefile.in index 2661503c..6e1bc8b0 100644 --- a/qse/lib/cmn/Makefile.in +++ b/qse/lib/cmn/Makefile.in @@ -88,11 +88,11 @@ LTLIBRARIES = $(lib_LTLIBRARIES) am__DEPENDENCIES_1 = libqsecmn_la_DEPENDENCIES = $(am__DEPENDENCIES_1) am__libqsecmn_la_SOURCES_DIST = alg-base64.c alg-rand.c alg-search.c \ - alg-sort.c assert.c chr.c dll.c env.c gdl.c htb.c fio.c fma.c \ - fmt.c fs.c fs-err.c fs-move.c glob.c hton.c ipad.c lda.c \ - main.c mbwc.c mbwc-str.c mem.c nwad.c nwif.c nwio.c oht.c \ - opt.c path-basename.c path-canon.c pio.c pma.c rbt.c rex.c \ - sio.c sll.c slmb.c stdio.c str-beg.c str-cat.c str-chr.c \ + alg-sort.c assert.c chr.c dir.c dll.c env.c gdl.c htb.c fio.c \ + fma.c fmt.c fs.c fs-err.c fs-move.c glob.c hton.c ipad.c lda.c \ + main.c mbwc.c mbwc-str.c mem.c mux.c nwad.c nwif.c nwio.c \ + oht.c opt.c path-basename.c path-canon.c pio.c pma.c rbt.c \ + rex.c sio.c sll.c slmb.c stdio.c str-beg.c str-cat.c str-chr.c \ str-cnv.c str-cmp.c str-cpy.c str-del.c str-dup.c str-dynm.c \ str-dynw.c str-end.c str-excl.c str-fcpy.c str-fnmat.c \ str-incl.c str-len.c str-pac.c str-pbrk.c str-put.c str-rev.c \ @@ -103,10 +103,10 @@ am__libqsecmn_la_SOURCES_DIST = alg-base64.c alg-rand.c alg-search.c \ xma.c cp949.c cp950.c @INCLUDE_MORE_CMGRS_TRUE@am__objects_1 = cp949.lo cp950.lo am_libqsecmn_la_OBJECTS = alg-base64.lo alg-rand.lo alg-search.lo \ - alg-sort.lo assert.lo chr.lo dll.lo env.lo gdl.lo htb.lo \ - fio.lo fma.lo fmt.lo fs.lo fs-err.lo fs-move.lo glob.lo \ + alg-sort.lo assert.lo chr.lo dir.lo dll.lo env.lo gdl.lo \ + htb.lo fio.lo fma.lo fmt.lo fs.lo fs-err.lo fs-move.lo glob.lo \ hton.lo ipad.lo lda.lo main.lo mbwc.lo mbwc-str.lo mem.lo \ - nwad.lo nwif.lo nwio.lo oht.lo opt.lo path-basename.lo \ + mux.lo nwad.lo nwif.lo nwio.lo oht.lo opt.lo path-basename.lo \ path-canon.lo pio.lo pma.lo rbt.lo rex.lo sio.lo sll.lo \ slmb.lo stdio.lo str-beg.lo str-cat.lo str-chr.lo str-cnv.lo \ str-cmp.lo str-cpy.lo str-del.lo str-dup.lo str-dynm.lo \ @@ -350,9 +350,9 @@ noinst_HEADERS = \ tre-stack.h libqsecmn_la_SOURCES = alg-base64.c alg-rand.c alg-search.c alg-sort.c \ - assert.c chr.c dll.c env.c gdl.c htb.c fio.c fma.c fmt.c fs.c \ - fs-err.c fs-move.c glob.c hton.c ipad.c lda.c main.c mbwc.c \ - mbwc-str.c mem.c nwad.c nwif.c nwio.c oht.c opt.c \ + assert.c chr.c dir.c dll.c env.c gdl.c htb.c fio.c fma.c fmt.c \ + fs.c fs-err.c fs-move.c glob.c hton.c ipad.c lda.c main.c \ + mbwc.c mbwc-str.c mem.c mux.c nwad.c nwif.c nwio.c oht.c opt.c \ path-basename.c path-canon.c pio.c pma.c rbt.c rex.c sio.c \ sll.c slmb.c stdio.c str-beg.c str-cat.c str-chr.c str-cnv.c \ str-cmp.c str-cpy.c str-del.c str-dup.c str-dynm.c str-dynw.c \ @@ -455,6 +455,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/chr.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cp949.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cp950.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dir.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dll.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/env.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fio.Plo@am__quote@ @@ -473,6 +474,7 @@ distclean-compile: @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbwc-str.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbwc.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mem.Plo@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mux.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nwad.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nwif.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nwio.Plo@am__quote@ diff --git a/qse/lib/cmn/dir.c b/qse/lib/cmn/dir.c new file mode 100644 index 00000000..6f7f557b --- /dev/null +++ b/qse/lib/cmn/dir.c @@ -0,0 +1,536 @@ +/* + * $Id$ + * + Copyright 2006-2012 Chung, Hyung-Hwan. + This file is part of QSE. + + QSE is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + QSE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with QSE. If not, see . + */ + +#include +#include +#include +#include +#include "mem.h" + +#if defined(_WIN32) +# include +#elif defined(__OS2__) +# define INCL_DOSFILEMGR +# define INCL_ERRORS +# include +#elif defined(__DOS__) +# include +# include +#else +# include "syscall.h" +#endif + +struct qse_dir_t +{ + qse_mmgr_t* mmgr; + int flags; + + qse_str_t tbuf; + qse_mbs_t mbuf; + +#if defined(_WIN32) + HANDLE h; + WIN32_FIND_DATA wfd; + int done; +#elif defined(__OS2__) + HDIR h; + FILEFINDBUF3L ffb; + ULONG count; + int opened; +#elif defined(__DOS__) + struct find_t f; + int done; + int opened; +#else + DIR* dp; +#endif +}; + +int qse_dir_init (qse_dir_t* dir, qse_mmgr_t* mmgr, const qse_char_t* path, int flags); +void qse_dir_fini (qse_dir_t* dir); + +static int reset_to_path (qse_dir_t* dir, const qse_char_t* path); + +qse_dir_t* qse_dir_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, const qse_char_t* path, int flags) +{ + qse_dir_t* dir; + + dir = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(*dir) + xtnsize); + if (dir) + { + if (qse_dir_init (dir, mmgr, path, flags) <= -1) + { + QSE_MMGR_FREE (mmgr, dir); + dir = QSE_NULL; + } + else QSE_MEMSET (dir + 1, 0, xtnsize); + } + + return dir; +} + +void qse_dir_close (qse_dir_t* dir) +{ + qse_dir_fini (dir); + QSE_MMGR_FREE (dir->mmgr, dir); +} + +qse_mmgr_t* qse_dir_getmmgr (qse_dir_t* dir) +{ + return dir->mmgr; +} + +void* qse_dir_getxtn (qse_dir_t* dir) +{ + return QSE_XTN (dir); +} + +int qse_dir_init (qse_dir_t* dir, qse_mmgr_t* mmgr, const qse_char_t* path, int flags) +{ + QSE_MEMSET (dir, 0, QSE_SIZEOF(*dir)); + + dir->mmgr = mmgr; + dir->flags = flags; + + if (qse_str_init (&dir->tbuf, mmgr, 256) <= -1) return -1; + if (qse_mbs_init (&dir->mbuf, mmgr, 256) <= -1) + { + qse_str_fini (&dir->tbuf); + return -1; + } + +#if defined(_WIN32) + dir->h = INVALID_HANDLE_VALUE; +#endif + + return reset_to_path (dir, path); +} + +static void close_dir_safely (qse_dir_t* dir) +{ +#if defined(_WIN32) + if (dir->h != INVALID_HANDLE_VALUE) + { + FindClose (dir->h); + dir->h = INVALID_HANDLE_VALUE; + } +#elif defined(__OS2__) + if (dir->opened) + { + DosFindClose (dir->h); + dir->opened = 0; + } +#elif defined(__DOS__) + if (dir->opened) + { + _dos_findclose (&dir->f); + dir->opened = 0; + } +#else + if (dir->dp) + { + QSE_CLOSEDIR (dir->dp); + dir->dp = QSE_NULL; + } +#endif +} + +void qse_dir_fini (qse_dir_t* dir) +{ + close_dir_safely (dir); + + qse_mbs_fini (&dir->mbuf); + qse_str_fini (&dir->tbuf); +} + +static qse_mchar_t* wcs_to_mbuf (qse_dir_t* dir, const qse_wchar_t* wcs, qse_mbs_t* mbs) +{ + qse_size_t ml, wl; + + if (qse_wcstombs (wcs, &wl, QSE_NULL, &ml) <= -1 || + qse_mbs_setlen (mbs, ml) == (qse_size_t)-1) return QSE_NULL; + + qse_wcstombs (wcs, &wl, QSE_MBS_PTR(mbs), &ml); + return QSE_MBS_PTR(mbs); +} + +static qse_wchar_t* mbs_to_wbuf (qse_dir_t* dir, const qse_mchar_t* mbs, qse_wcs_t* wcs) +{ + qse_size_t ml, wl; + + if (qse_mbstowcs (mbs, &ml, QSE_NULL, &wl) <= -1 || + qse_wcs_setlen (wcs, wl) == (qse_size_t)-1) return QSE_NULL; + + qse_mbstowcs (mbs, &ml, QSE_WCS_PTR(wcs), &wl); + return QSE_WCS_PTR(wcs); +} + +static qse_mchar_t* make_mbsdos_path (qse_dir_t* dir, const qse_mchar_t* mpath) +{ + if (mpath[0] == QSE_MT('\0')) + { + if (qse_mbs_cpy (&dir->mbuf, QSE_MT("*.*")) == (qse_size_t)-1) return QSE_NULL; + } + else + { + qse_size_t len; + if ((len = qse_mbs_cpy (&dir->mbuf, mpath)) == (qse_size_t)-1 || + (!QSE_ISPATHMBSEP(mpath[len - 1]) && + !qse_ismbsdrivecurpath(mpath) && + qse_mbs_ccat (&dir->mbuf, QSE_MT('\\')) == (qse_size_t)-1) || + qse_mbs_cat (&dir->mbuf, QSE_MT("*.*")) == (qse_size_t)-1) + { + return QSE_NULL; + } + } + + return QSE_MBS_PTR(&dir->mbuf); +} + +static qse_char_t* make_dos_path (qse_dir_t* dir, const qse_char_t* path) +{ + if (path[0] == QSE_T('\0')) + { + if (qse_str_cpy (&dir->tbuf, QSE_T("*.*")) == (qse_size_t)-1) return QSE_NULL; + } + else + { + qse_size_t len; + if ((len = qse_str_cpy (&dir->tbuf, path)) == (qse_size_t)-1 || + (!QSE_ISPATHSEP(path[len - 1]) && + !qse_isdrivecurpath(path) && + qse_str_ccat (&dir->tbuf, QSE_T('\\')) == (qse_size_t)-1) || + qse_str_cat (&dir->tbuf, QSE_T("*.*")) == (qse_size_t)-1) + { + return QSE_NULL; + } + } + + return QSE_STR_PTR(&dir->tbuf); +} + + +static qse_mchar_t* mkdospath (qse_dir_t* dir, const qse_char_t* path) +{ + +#if defined(QSE_CHAR_IS_MCHAR) + return make_dos_path (dir, path); +#else + if (dir->flags & QSE_DIR_MBSPATH) + { + return make_mbsdos_path (dir, (const qse_mchar_t*) path); + } + else + { + qse_char_t* tptr; + qse_mchar_t* mptr; + + tptr = make_dos_path (dir, path); + if (tptr == QSE_NULL) return QSE_NULL; + + mptr = wcs_to_mbuf (dir, QSE_STR_PTR(&dir->tbuf), &dir->mbuf); + if (mptr == QSE_NULL) return QSE_NULL; + + return mptr; + } +#endif + +} + +static int reset_to_path (qse_dir_t* dir, const qse_char_t* path) +{ +#if defined(_WIN32) + /* ------------------------------------------------------------------- */ + qse_char_t* tptr; + + dir->done = 0; + + #if defined(QSE_CHAR_IS_MCHAR) + tptr = make_dos_path (dir, path); + #else + if (dir->flags & QSE_DIR_MBSPATH) + { + qse_mchar_t* mptr = make_mbsdos_path (dir, (const qse_mchar_t*) path); + if (mptr == QSE_NULL) return -1; + tptr = mbs_to_wbuf (dir, mptr, &dir->tbuf); + } + else + { + tptr = make_dos_path (dir, path); + if (tptr == QSE_NULL) return -1; + } + #endif + if (tptr == QSE_NULL) return -1; + + dir->h = FindFirstFile (tptr, &dir->wfd); + if (dir->h == INVALID_HANDLE_VALUE) return -1; + + return 0; + /* ------------------------------------------------------------------- */ + +#elif defined(__OS2__) + + /* ------------------------------------------------------------------- */ + APIRET rc; + qse_mchar_t* mptr; + + dir->h = HDIR_CREATE; + dir->count = 1; + + #if defined(QSE_CHAR_IS_MCHAR) + mptr = make_dos_path (dir, path); + #else + if (dir->flags & QSE_DIR_MBSPATH) + { + mptr = make_mbsdos_path (dir, (const qse_mchar_t*) path); + } + else + { + qse_char_t* tptr = make_dos_path (dir, path); + if (tptr == QSE_NULL) return -1; + mptr = wcs_to_mbuf (dir, tptr, &dir->mbuf); + } + #endif + if (mptr == QSE_NULL) return -1; + + rc = DosFindFirst ( + mptr, + &dir->h, + FILE_DIRECTORY | FILE_READONLY, + &dir->ffb, + QSE_SIZEOF(dir->ffb), + &dir->count, + FIL_STANDARDL); + + if (rc != NO_ERROR) return -1; + + dir->opened = 1; + return 0; + /* ------------------------------------------------------------------- */ + +#elif defined(__DOS__) + + /* ------------------------------------------------------------------- */ + unsigned int rc; + qse_mchar_t* mptr; + + dir->done = 0; + + #if defined(QSE_CHAR_IS_MCHAR) + mptr = make_dos_path (dir, path); + #else + if (dir->flags & QSE_DIR_MBSPATH) + { + mptr = make_mbsdos_path (dir, (const qse_mchar_t*) path); + } + else + { + qse_char_t* tptr = make_dos_path (dir, path); + if (tptr == QSE_NULL) return -1; + mptr = wcs_to_mbuf (dir, tptr, &dir->mbuf); + } + #endif + if (mptr == QSE_NULL) return -1; + + rc = _dos_findfirst (mptr, _A_NORMAL | _A_SUBDIR, &dir->f); + if (rc != 0) return -1; + + dir->opened = 1; + return 0; + /* ------------------------------------------------------------------- */ + +#else + DIR* dp; + + #if defined(QSE_CHAR_IS_MCHAR) + dp = QSE_OPENDIR (path[0] == QSE_MT('\0')? QSE_T("."): path); + #else + if (dir->flags & QSE_DIR_MBSPATH) + { + const qse_mchar_t* mpath = (const qse_mchar_t*)path; + dp = QSE_OPENDIR (mpath == QSE_MT('\0')? QSE_MT("."): mpath); + } + else + { + if (path[0] == QSE_T('\0')) + { + dp = QSE_OPENDIR (QSE_MT(".")); + } + else + { + qse_mchar_t* mptr; + + mptr = wcs_to_mbuf (dir, path, &dir->mbuf); + if (mptr == QSE_NULL) return -1; + + dp = QSE_OPENDIR (mptr); + } + } + #endif + + dir->dp = dp; + return 0; +#endif +} + +int qse_dir_reset (qse_dir_t* dir, const qse_char_t* path) +{ + close_dir_safely (dir); + return reset_to_path (dir, path); +} + +static int read_dir_to_tbuf (qse_dir_t* dir, void** name) +{ +#if defined(_WIN32) + + /* ------------------------------------------------------------------- */ + if (dir->done) return (dir->done > 0)? 0: -1; + + #if defined(QSE_CHAR_IS_MCHAR) + if (qse_str_cpy (&dir->tbuf, dir->wfd.cFileName) == (qse_size_t)-1) return -1; + *name = QSE_STR_PTR(&dir->tbuf); + #else + if (dir->flags & QSE_DIR_MBSPATH) + { + if (wcs_to_mbuf (dir, dir->wfd.cFileName, &dir->mbuf) == QSE_NULL) return -1; + *name = QSE_STR_PTR(&dir->mbuf); + } + else + { + if (qse_str_cpy (&dir->tbuf, dir->wfd.cFileName) == (qse_size_t)-1) return -1; + *name = QSE_STR_PTR(&dir->tbuf); + } + #endif + + if (FindNextFile (dir->h, &dir->wfd) == FALSE) + dir->done = (GetLastError() == ERROR_NO_MORE_FILES)? 1: -1; + + return 1; + /* ------------------------------------------------------------------- */ + +#elif defined(__OS2__) + + /* ------------------------------------------------------------------- */ + APIRET rc; + + if (dir->count <= 0) return 0; + + #if defined(QSE_CHAR_IS_MCHAR) + if (qse_str_cpy (&dir->tbuf, dir->ffb.achName) == (qse_size_t)-1) return -1; + *name = QSE_STR_PTR(&dir->tbuf); + #else + if (dir->flags & QSE_DIR_MBSPATH) + { + if (qse_mbs_cpy (&dir->mbuf, dir->ffb.achName) == (qse_size_t)-1) return -1; + *name = QSE_MBS_PTR(&dir->mbuf); + } + else + { + if (mbs_to_wbuf (dir, dir->ffb.achName, &dir->tbuf) == QSE_NULL) return -1; + *name = QSE_STR_PTR(&dir->tbuf); + } + #endif + + rc = DosFindNext (dir->h, &dir->ffb, QSE_SIZEOF(dir->ffb), &dir->count); + if (rc == ERROR_NO_MORE_FILES) dir->count = 0; + else if (rc != NO_ERROR) return -1; + + return 1; + /* ------------------------------------------------------------------- */ + +#elif defined(__DOS__) + + /* ------------------------------------------------------------------- */ + unsigned int rc; + + if (dir->done) return (dir->done > 0)? 0: -1; + + #if defined(QSE_CHAR_IS_MCHAR) + if (qse_str_cpy (&dir->tbuf, dir->f.name) == (qse_size_t)-1) return -1; + *name = QSE_STR_PTR(&dir->tbuf); + #else + if (dir->flags & QSE_DIR_MBSPATH) + { + if (qse_mbs_cpy (&dir->mbuf, dir->f.name) == (qse_size_t)-1) return -1; + *name = QSE_MBS_PTR(&dir->mbuf); + } + else + { + if (mbs_to_wbuf (dir, dir->f.name, &dir->tbuf) == QSE_NULL) return -1; + *name = QSE_STR_PTR(&dir->tbuf); + } + #endif + + rc = _dos_findnext (&dir->f); + if (rc != 0) dir->done = (errno == ENOENT)? 1: -1; + + return 1; + /* ------------------------------------------------------------------- */ + +#else + + /* ------------------------------------------------------------------- */ + qse_dirent_t* de; + + errno = 0; + de = QSE_READDIR (dir->dp); + if (de == NULL) return (errno == 0)? 0: -1; + + #if defined(QSE_CHAR_IS_MCHAR) + if (qse_str_cpy (&dir->tbuf, de->d_name) == (qse_size_t)-1) return -1; + *name = QSE_STR_PTR(&dir->tbuf); + #else + if (dir->flags & QSE_DIR_MBSPATH) + { + if (qse_mbs_cpy (&dir->mbuf, de->d_name) == (qse_size_t)-1) return -1; + *name = QSE_MBS_PTR(&dir->mbuf); + } + else + { + if (mbs_to_wbuf (dir, de->d_name, &dir->tbuf) == QSE_NULL) return -1; + *name = QSE_STR_PTR(&dir->tbuf); + } + #endif + + return 1; + /* ------------------------------------------------------------------- */ + +#endif +} + +int qse_dir_read (qse_dir_t* dir, qse_dir_ent_t* ent) +{ + int x; + void* name; + + x = read_dir_to_tbuf (dir, &name); + if (x >= 1) + { + QSE_MEMSET (ent, 0, QSE_SIZEOF(ent)); + ent->name = name; + + if (dir->flags & QSE_DIR_STAT) + { + /* TODO: more information */ + } + } + + return x; +} diff --git a/qse/lib/cmn/glob.c b/qse/lib/cmn/glob.c index 578eb540..ec818a94 100644 --- a/qse/lib/cmn/glob.c +++ b/qse/lib/cmn/glob.c @@ -22,6 +22,7 @@ #include #include #include +#include #include "mem.h" #if defined(_WIN32) @@ -44,17 +45,7 @@ # define IS_ESC(c) ((c) == QSE_T('\\')) #endif -#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) -# define SEPC QSE_T('\\') -#else -# define SEPC QSE_T('/') -#endif - -#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) -# define IS_SEP(c) ((c) == QSE_T('/') || (c) == QSE_T('\\')) -#else -# define IS_SEP(c) ((c) == QSE_T('/')) -#endif +#define IS_SEP(c) QSE_ISPATHSEP(c) #define IS_NIL(c) ((c) == QSE_T('\0')) #define IS_SEP_OR_NIL(c) (IS_SEP(c) || IS_NIL(c)) @@ -83,7 +74,6 @@ struct glob_t void* cbctx; qse_mmgr_t* mmgr; - qse_cmgr_t* cmgr; qse_str_t path; qse_str_t tbuf; /* temporary buffer */ @@ -108,10 +98,10 @@ static qse_mchar_t* wcs_to_mbuf (glob_t* g, const qse_wchar_t* wcs, qse_mbs_t* m { qse_size_t ml, wl; - if (qse_wcstombswithcmgr (wcs, &wl, QSE_NULL, &ml, g->cmgr) <= -1 || + if (qse_wcstombs (wcs, &wl, QSE_NULL, &ml) <= -1 || qse_mbs_setlen (mbs, ml) == (qse_size_t)-1) return QSE_NULL; - qse_wcstombswithcmgr (wcs, &wl, QSE_MBS_PTR(mbs), &ml, g->cmgr); + qse_wcstombs (wcs, &wl, QSE_MBS_PTR(mbs), &ml); return QSE_MBS_PTR(mbs); } @@ -322,338 +312,6 @@ static int get_next_segment (glob_t* g, segment_t* seg) return seg->type; } -#if defined(_WIN32) - -struct qse_dir_t -{ - HANDLE h; - WIN32_FIND_DATA wfd; - int done; -}; -typedef struct qse_dir_t qse_dir_t; - -#elif defined(__OS2__) - -struct qse_dir_t -{ - HDIR h; - FILEFINDBUF3L ffb; - ULONG count; -}; -typedef struct qse_dir_t qse_dir_t; - -#elif defined(__DOS__) - -struct qse_dir_t -{ - struct find_t f; - int done; -}; -typedef struct qse_dir_t qse_dir_t; - -#endif - -static qse_dir_t* xopendir (glob_t* g, const qse_cstr_t* path) -{ -#if defined(_WIN32) - - /* ------------------------------------------------------------------- */ - qse_dir_t* dp; - - dp = QSE_MMGR_ALLOC (g->mmgr, QSE_SIZEOF(*dp)); - if (dp == QSE_NULL) return QSE_NULL; - - dp->done = 0; - - if (path->len <= 0) - { - if (qse_str_cpy (&g->tbuf, QSE_T("*")) == (qse_size_t)-1) - { - QSE_MMGR_FREE (g->mmgr, dp); - return QSE_NULL; - } - } - else - { - if (qse_str_cpy (&g->tbuf, path->ptr) == (qse_size_t)-1 || - (!IS_SEP(path->ptr[path->len-1]) && - !qse_isdrivecurpath(path->ptr) && - qse_str_ccat (&g->tbuf, QSE_T('\\')) == (qse_size_t)-1) || - qse_str_ccat (&g->tbuf, QSE_T('*')) == (qse_size_t)-1) - { - QSE_MMGR_FREE (g->mmgr, dp); - return QSE_NULL; - } - } - - dp->h = FindFirstFile (QSE_STR_PTR(&g->tbuf), &dp->wfd); - if (dp->h == INVALID_HANDLE_VALUE) - { - QSE_MMGR_FREE (g->mmgr, dp); - return QSE_NULL; - } - - return dp; - /* ------------------------------------------------------------------- */ - -#elif defined(__OS2__) - - /* ------------------------------------------------------------------- */ - qse_dir_t* dp; - APIRET rc; - qse_mchar_t* mptr; - - dp = QSE_MMGR_ALLOC (g->mmgr, QSE_SIZEOF(*dp)); - if (dp == QSE_NULL) return QSE_NULL; - - if (path->len <= 0) - { - if (qse_str_cpy (&g->tbuf, QSE_T("*.*")) == (qse_size_t)-1) - { - QSE_MMGR_FREE (g->mmgr, dp); - return QSE_NULL; - } - } - else - { - if (qse_str_cpy (&g->tbuf, path->ptr) == (qse_size_t)-1 || - (!IS_SEP(path->ptr[path->len-1]) && - !qse_isdrivecurpath(path->ptr) && - qse_str_ccat (&g->tbuf, QSE_T('\\')) == (qse_size_t)-1) || - qse_str_cat (&g->tbuf, QSE_T("*.*")) == (qse_size_t)-1) - { - QSE_MMGR_FREE (g->mmgr, dp); - return QSE_NULL; - } - } - - dp->h = HDIR_CREATE; - dp->count = 1; - -#if defined(QSE_CHAR_IS_MCHAR) - mptr = QSE_STR_PTR(&g->tbuf); -#else - mptr = wcs_to_mbuf (g, QSE_STR_PTR(&g->tbuf), &g->mbuf); - if (mptr == QSE_NULL) - { - QSE_MMGR_FREE (g->mmgr, dp); - return QSE_NULL; - } -#endif - - rc = DosFindFirst ( - mptr, - &dp->h, - FILE_DIRECTORY | FILE_READONLY, - &dp->ffb, - QSE_SIZEOF(dp->ffb), - &dp->count, - FIL_STANDARDL); - - if (rc != NO_ERROR) - { - QSE_MMGR_FREE (g->mmgr, dp); - return QSE_NULL; - } - - return dp; - /* ------------------------------------------------------------------- */ - -#elif defined(__DOS__) - - /* ------------------------------------------------------------------- */ - qse_dir_t* dp; - unsigned int rc; - qse_mchar_t* mptr; - qse_size_t wl, ml; - - dp = QSE_MMGR_ALLOC (g->mmgr, QSE_SIZEOF(*dp)); - if (dp == QSE_NULL) return QSE_NULL; - - dp->done = 0; - - if (path->len <= 0) - { - if (qse_str_cpy (&g->tbuf, QSE_T("*.*")) == (qse_size_t)-1) - { - QSE_MMGR_FREE (g->mmgr, dp); - return QSE_NULL; - } - } - else - { - if (qse_str_cpy (&g->tbuf, path->ptr) == (qse_size_t)-1 || - (!IS_SEP(path->ptr[path->len-1]) && - !qse_isdrivecurpath(path->ptr) && - qse_str_ccat (&g->tbuf, QSE_T('\\')) == (qse_size_t)-1) || - qse_str_cat (&g->tbuf, QSE_T("*.*")) == (qse_size_t)-1) - { - QSE_MMGR_FREE (g->mmgr, dp); - return QSE_NULL; - } - } - -#if defined(QSE_CHAR_IS_MCHAR) - mptr = QSE_STR_PTR(&g->tbuf); -#else - mptr = wcs_to_mbuf (g, QSE_STR_PTR(&g->tbuf), &g->mbuf); - if (mptr == QSE_NULL) - { - QSE_MMGR_FREE (g->mmgr, dp); - return QSE_NULL; - } -#endif - - rc = _dos_findfirst (mptr, _A_NORMAL | _A_SUBDIR, &dp->f); - - if (rc != 0) - { - QSE_MMGR_FREE (g->mmgr, dp); - return QSE_NULL; - } - - return dp; - /* ------------------------------------------------------------------- */ - -#else - - /* ------------------------------------------------------------------- */ -#if defined(QSE_CHAR_IS_MCHAR) - return QSE_OPENDIR ((path->len <= 0)? QSE_T("."): path->ptr); -#else - if (path->len <= 0) - { - return QSE_OPENDIR (QSE_MT(".")); - } - else - { - qse_mchar_t* mptr; - - mptr = wcs_to_mbuf (g, path->ptr, &g->mbuf); - if (mptr == QSE_NULL) return QSE_NULL; - - return QSE_OPENDIR (mptr); - } -#endif - /* ------------------------------------------------------------------- */ - -#endif -} - -static int xreaddir (glob_t* g, qse_dir_t* dp, qse_str_t* path) -{ -#if defined(_WIN32) - - /* ------------------------------------------------------------------- */ - if (dp->done) return (dp->done > 0)? 0: -1; - - if (qse_str_cat (path, dp->wfd.cFileName) == (qse_size_t)-1) return -1; - - if (FindNextFile (dp->h, &dp->wfd) == FALSE) - dp->done = (GetLastError() == ERROR_NO_MORE_FILES)? 1: -1; - - return 1; - /* ------------------------------------------------------------------- */ - -#elif defined(__OS2__) - - /* ------------------------------------------------------------------- */ - APIRET rc; -#if defined(QSE_CHAR_IS_MCHAR) - /* nothing */ -#else - qse_size_t ml, wl, tmp; -#endif - - if (dp->count <= 0) return 0; - -#if defined(QSE_CHAR_IS_MCHAR) - if (qse_str_cat (path, dp->ffb.achName) == (qse_size_t)-1) return -1; -#else - tmp = QSE_STR_LEN(path); - if (qse_mbstowcswithcmgr (dp->ffb.achName, &ml, QSE_NULL, &wl, g->cmgr) <= -1 || - qse_str_setlen (path, tmp + wl) == (qse_size_t)-1) return -1; - qse_mbstowcswithcmgr (dp->ffb.achName, &ml, QSE_STR_CPTR(&g->path,tmp), &wl, g->cmgr); -#endif - - rc = DosFindNext (dp->h, &dp->ffb, QSE_SIZEOF(dp->ffb), &dp->count); - if (rc == ERROR_NO_MORE_FILES) dp->count = 0; - else if (rc != NO_ERROR) return -1; - - return 1; - /* ------------------------------------------------------------------- */ - -#elif defined(__DOS__) - - /* ------------------------------------------------------------------- */ - unsigned int rc; -#if defined(QSE_CHAR_IS_MCHAR) - /* nothing */ -#else - qse_size_t ml, wl, tmp; -#endif - - if (dp->done) return (dp->done > 0)? 0: -1; - -#if defined(QSE_CHAR_IS_MCHAR) - if (qse_str_cat (path, dp->f.name) == (qse_size_t)-1) return -1; -#else - tmp = QSE_STR_LEN(path); - if (qse_mbstowcswithcmgr (dp->f.name, &ml, QSE_NULL, &wl, g->cmgr) <= -1 || - qse_str_setlen (path, tmp + wl) == (qse_size_t)-1) return -1; - qse_mbstowcswithcmgr (dp->f.name, &ml, QSE_STR_CPTR(&g->path,tmp), &wl, g->cmgr); -#endif - - rc = _dos_findnext (&dp->f); - if (rc != 0) dp->done = (errno == ENOENT)? 1: -1; - - return 1; - /* ------------------------------------------------------------------- */ - -#else - - /* ------------------------------------------------------------------- */ - qse_dirent_t* de; -#if defined(QSE_CHAR_IS_MCHAR) - /* nothing */ -#else - qse_size_t ml, wl, tmp; -#endif - - de = QSE_READDIR (dp); - if (de == NULL) return 0; - -#if defined(QSE_CHAR_IS_MCHAR) - if (qse_str_cat (path, de->d_name) == (qse_size_t)-1) return -1; -#else - tmp = QSE_STR_LEN(path); - if (qse_mbstowcswithcmgr (de->d_name, &ml, QSE_NULL, &wl, g->cmgr) <= -1 || - qse_str_setlen (path, tmp + wl) == (qse_size_t)-1) return -1; - qse_mbstowcswithcmgr (de->d_name, &ml, QSE_STR_CPTR(&g->path,tmp), &wl, g->cmgr); -#endif - - return 1; - /* ------------------------------------------------------------------- */ - -#endif -} - -static void xclosedir (glob_t* g, qse_dir_t* dp) -{ -#if defined(_WIN32) - FindClose (dp->h); - QSE_MMGR_FREE (g->mmgr, dp); -#elif defined(__OS2__) - DosFindClose (dp->h); - QSE_MMGR_FREE (g->mmgr, dp); -#elif defined(__DOS__) - _dos_findclose (&dp->f); - QSE_MMGR_FREE (g->mmgr, dp); -#else - QSE_CLOSEDIR (dp); -#endif -} - static int handle_non_wild_segments (glob_t* g, segment_t* seg) { while (get_next_segment(g, seg) != NONE && !seg->wild) @@ -731,6 +389,8 @@ static int search (glob_t* g, segment_t* seg) { qse_dir_t* dp; qse_size_t tmp, tmp2; + qse_dir_ent_t ent; + int x; #if defined(NO_RECURSION) stack_node_t* r; @@ -744,7 +404,7 @@ entry: if (seg->wild) { - dp = xopendir (g, QSE_STR_CSTR(&g->path)); + dp = qse_dir_open (g->mmgr, 0, QSE_STR_PTR(&g->path), 0); if (dp) { tmp = QSE_STR_LEN(&g->path); @@ -756,7 +416,11 @@ entry: { qse_str_setlen (&g->path, tmp2); - if (xreaddir (g, dp, &g->path) <= 0) break; + x = qse_dir_read (dp, &ent); + if (x <= -1) goto oops; + if (x == 0) break; + + if (qse_str_cat (&g->path, ent.name) == (qse_size_t)-1) goto oops; if (qse_strnfnmat (QSE_STR_CPTR(&g->path,tmp2), seg->ptr, seg->len, g->fnmat_flags) > 0) { @@ -810,7 +474,7 @@ entry: } qse_str_setlen (&g->path, tmp); - xclosedir (g, dp); dp = QSE_NULL; + qse_dir_close (dp); dp = QSE_NULL; } } @@ -850,14 +514,14 @@ entry: return 0; oops: - if (dp) xclosedir (g, dp); + if (dp) qse_dir_close (dp); #if defined(NO_RECURSION) while (g->stack) { r = g->stack; g->stack = r->next; - xclosedir (g, r->dp); + qse_dir_close (r->dp); QSE_MMGR_FREE (g->mmgr, r); } @@ -871,7 +535,7 @@ oops: return -1; } -int qse_globwithcmgr (const qse_char_t* pattern, qse_glob_cbimpl_t cbimpl, void* cbctx, int flags, qse_mmgr_t* mmgr, qse_cmgr_t* cmgr) +int qse_glob (const qse_char_t* pattern, qse_glob_cbimpl_t cbimpl, void* cbctx, int flags, qse_mmgr_t* mmgr) { segment_t seg; glob_t g; @@ -881,7 +545,6 @@ int qse_globwithcmgr (const qse_char_t* pattern, qse_glob_cbimpl_t cbimpl, void* g.cbimpl = cbimpl; g.cbctx = cbctx; g.mmgr = mmgr; - g.cmgr = cmgr; #if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) g.fnmat_flags |= QSE_STRFNMAT_IGNORECASE; @@ -928,8 +591,3 @@ int qse_globwithcmgr (const qse_char_t* pattern, qse_glob_cbimpl_t cbimpl, void* return g.expanded; } -int qse_glob (const qse_char_t* pattern, qse_glob_cbimpl_t cbimpl, void* cbctx, int flags, qse_mmgr_t* mmgr) -{ - return qse_globwithcmgr (pattern, cbimpl, cbctx, flags, mmgr, qse_getdflcmgr()); -} - diff --git a/qse/lib/cmn/mux.c b/qse/lib/cmn/mux.c new file mode 100644 index 00000000..4f76e279 --- /dev/null +++ b/qse/lib/cmn/mux.c @@ -0,0 +1,621 @@ +/* + * $Id$ + * + Copyright 2006-2012 Chung, Hyung-Hwan. + This file is part of QSE. + + QSE is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + QSE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with QSE. If not, see . + */ + +#include +#include "mem.h" + +#if defined(_WIN32) +# define FD_SETSIZE 4096 /* what is the best value??? */ +# include +# include +# define USE_SELECT +#elif defined(__OS2__) +# include +# include +# include +# include +# include +# include +# define INCL_DOSERRORS +# include +# pragma library("tcpip32.lib") + +#elif defined(__DOS__) +# include +#else +# include +# include +# include +# if defined(HAVE_SYS_EPOLL_H) +# include +# if defined(HAVE_EPOLL_CREATE) +# define USE_EPOLL +# endif +# elif defined(HAVE_POLL_H) +# define USE_POLL +# else +# define USE_SELECT +# endif +#endif + +struct qse_mux_t +{ + qse_mmgr_t* mmgr; + qse_mux_errnum_t errnum; + + qse_mux_evtfun_t evtfun; + +#if defined(USE_SELECT) + fd_set rset; + fd_set wset; + fd_set tmprset; + fd_set tmpwset; + int size; + int maxhnd; + + struct + { + qse_mux_evt_t** ptr; + int ubound; + } me; + +#elif defined(USE_EPOLL) + int fd; + + struct + { + struct epoll_event* ptr; + qse_size_t len; + qse_size_t capa; + } ee; + + struct + { + qse_mux_evt_t** ptr; + int ubound; + } me; +#endif +}; + +int qse_mux_init (qse_mux_t* mux, qse_mmgr_t* mmgr, qse_mux_evtfun_t evtfun, qse_size_t capahint); +void qse_mux_fini (qse_mux_t* mux); + +#if defined(_WIN32) +static qse_mux_errnum_t syserr_to_errnum (DWORD e) +{ + + switch (e) + { + case ERROR_NOT_ENOUGH_MEMORY: + case ERROR_OUTOFMEMORY: + return QSE_MUX_ENOMEM; + + case ERROR_INVALID_PARAMETER: + case ERROR_INVALID_HANDLE: + case ERROR_INVALID_NAME: + return QSE_MUX_EINVAL; + + case ERROR_ACCESS_DENIED: + return QSE_MUX_EACCES; + + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + return QSE_MUX_ENOENT; + + case ERROR_ALREADY_EXISTS: + case ERROR_FILE_EXISTS: + return QSE_MUX_EEXIST; + + default: + return QSE_MUX_ESYSERR; + } +} +#elif defined(__OS2__) +static qse_mux_errnum_t syserr_to_errnum (APIRET e) +{ + switch (e) + { + case ERROR_NOT_ENOUGH_MEMORY: + return QSE_MUX_ENOMEM; + + case ERROR_INVALID_PARAMETER: + case ERROR_INVALID_HANDLE: + case ERROR_INVALID_NAME: + return QSE_MUX_EINVAL; + + case ERROR_ACCESS_DENIED: + return QSE_MUX_EACCES; + + case ERROR_FILE_NOT_FOUND: + case ERROR_PATH_NOT_FOUND: + return QSE_MUX_ENOENT; + + case ERROR_ALREADY_EXISTS: + return QSE_MUX_EEXIST; + + default: + return QSE_MUX_ESYSERR; + } +} +#elif defined(__DOS__) +static qse_mux_errnum_t syserr_to_errnum (int e) +{ + switch (e) + { + case ENOMEM: + return QSE_MUX_ENOMEM; + + case EINVAL: + return QSE_MUX_EINVAL; + + case EACCES: + return QSE_MUX_EACCES; + + case ENOENT: + return QSE_MUX_ENOENT; + + case EEXIST: + return QSE_MUX_EEXIST; + + default: + return QSE_MUX_ESYSERR; + } +} + +#else +static qse_mux_errnum_t syserr_to_errnum (int e) +{ + switch (e) + { + case ENOMEM: + return QSE_MUX_ENOMEM; + + case EINVAL: + return QSE_MUX_EINVAL; + + case ENOENT: + return QSE_MUX_ENOENT; + + case EACCES: + return QSE_MUX_EACCES; + + case EEXIST: + return QSE_MUX_EEXIST; + + case EINTR: + return QSE_MUX_EINTR; + + default: + return QSE_MUX_ESYSERR; + } +} +#endif + +qse_mux_t* qse_mux_open (qse_mmgr_t* mmgr, qse_size_t xtnsize, qse_mux_evtfun_t evtfun, qse_size_t capahint) +{ + qse_mux_t* mux; + + mux = QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(*mux) + xtnsize); + if (mux) + { + if (qse_mux_init (mux, mmgr, evtfun, capahint) <= -1) + { + QSE_MMGR_FREE (mmgr, mux); + mux = QSE_NULL; + } + else QSE_MEMSET (mux + 1, 0, xtnsize); + } + + return mux; +} + +void qse_mux_close (qse_mux_t* mux) +{ + qse_mux_fini (mux); + QSE_MMGR_FREE (mux->mmgr, mux); +} + +int qse_mux_init (qse_mux_t* mux, qse_mmgr_t* mmgr, qse_mux_evtfun_t evtfun, qse_size_t capahint) +{ + QSE_MEMSET (mux, 0, QSE_SIZEOF(*mux)); + mux->mmgr = mmgr; + mux->evtfun = evtfun; + + /* epoll_create returns an error and set errno to EINVAL + * if size is 0. Having a positive size greater than 0 + * also makes easier other parts like maintaining internal + * event buffers */ + if (capahint <= 0) capahint = 1; + +#if defined(USE_SELECT) + FD_ZERO (&mux->rset); + FD_ZERO (&mux->wset); + mux->maxhnd = -1; + +#elif defined(USE_EPOLL) + #if defined(HAVE_EPOLL_CREATE1) && defined(O_CLOEXEC) + mux->fd = epoll_create1 (O_CLOEXEC); + #else + mux->fd = epoll_create (capahint); + #endif + if (mux->fd <= -1) + { + mux->errnum = syserr_to_errnum (errno); + return -1; + } + + #if defined(HAVE_EPOLL_CREATE1) && defined(O_CLOEXEC) + /* nothing to do */ + #elif defined(FD_CLOEXEC) + { + int flag = fcntl (mux->fd, F_GETFD); + if (flag >= 0) fcntl (mux->fd, F_SETFD, flag | FD_CLOEXEC); + } + #endif +#else + /* TODO: */ + mux->errnum = QSE_MUX_ENOIMPL; + return -1; +#endif + + return 0; +} + +void qse_mux_fini (qse_mux_t* mux) +{ +#if defined(USE_SELECT) + FD_ZERO (&mux->rset); + FD_ZERO (&mux->wset); + + if (mux->me.ptr) + { + int i; + + for (i = 0; i < mux->me.ubound; i++) + { + if (mux->me.ptr[i]) + QSE_MMGR_FREE (mux->mmgr, mux->me.ptr[i]); + } + + QSE_MMGR_FREE (mux->mmgr, mux->me.ptr); + mux->me.ubound = 0; + mux->maxhnd = -1; + } + +#elif defined(USE_EPOLL) + close (mux->fd); + + if (mux->ee.ptr) + { + QSE_MMGR_FREE (mux->mmgr, mux->ee.ptr); + mux->ee.len = 0; + mux->ee.capa = 0; + } + + if (mux->me.ptr) + { + int i; + + for (i = 0; i < mux->me.ubound; i++) + { + if (mux->me.ptr[i]) + QSE_MMGR_FREE (mux->mmgr, mux->me.ptr[i]); + } + + QSE_MMGR_FREE (mux->mmgr, mux->me.ptr); + mux->me.ubound = 0; + } +#endif +} + +qse_mmgr_t* qse_mux_getmmgr (qse_mux_t* mux) +{ + return mux->mmgr; +} + +void* qse_mux_getxtn (qse_mux_t* mux) +{ + return QSE_XTN (mux); +} + +#define ALIGN_TO(num,align) ((((num) + (align) - 1) / (align)) * (align)) + +int qse_mux_insert (qse_mux_t* mux, const qse_mux_evt_t* evt) +{ +#if defined(USE_SELECT) + + if (evt->hnd >= mux->me.ubound) + { + qse_mux_evt_t** tmp; + int ubound; + + ubound = evt->hnd + 1; + ubound = ALIGN_TO (ubound, 128); + + tmp = QSE_MMGR_REALLOC (mux->mmgr, mux->me.ptr, QSE_SIZEOF(*mux->me.ptr) * ubound); + if (tmp == QSE_NULL) + { + mux->errnum = QSE_MUX_ENOMEM; + return -1; + } + + QSE_MEMSET (&tmp[mux->me.ubound], 0, QSE_SIZEOF(*mux->me.ptr) * (ubound - mux->me.ubound)); + mux->me.ptr = tmp; + mux->me.ubound = ubound; + } + + if (!mux->me.ptr[evt->hnd]) + { + mux->me.ptr[evt->hnd] = QSE_MMGR_ALLOC (mux->mmgr, QSE_SIZEOF(*evt)); + if (!mux->me.ptr[evt->hnd]) + { + mux->errnum = QSE_MUX_ENOMEM; + return -1; + } + } + + if (evt->mask & QSE_MUX_IN) FD_SET (evt->hnd, &mux->rset); + if (evt->mask & QSE_MUX_OUT) FD_SET (evt->hnd, &mux->wset); + + *mux->me.ptr[evt->hnd] = *evt; + if (evt->hnd > mux->maxhnd) mux->maxhnd = evt->hnd; + mux->size++; + return 0; + +#elif defined(USE_EPOLL) + struct epoll_event ev; + + QSE_MEMSET (&ev, 0, QSE_SIZEOF(ev)); + if (evt->mask & QSE_MUX_IN) ev.events |= EPOLLIN; + if (evt->mask & QSE_MUX_OUT) ev.events |= EPOLLOUT; + ev.data.fd = evt->hnd; + + if (ev.events == 0 || evt->hnd < 0) + { + mux->errnum = QSE_MUX_EINVAL; + return -1; + } + + if (evt->hnd >= mux->me.ubound) + { + qse_mux_evt_t** tmp; + int ubound; + + ubound = evt->hnd + 1; + ubound = ALIGN_TO (ubound, 128); + + tmp = QSE_MMGR_REALLOC (mux->mmgr, mux->me.ptr, QSE_SIZEOF(*mux->me.ptr) * ubound); + if (tmp == QSE_NULL) + { + mux->errnum = QSE_MUX_ENOMEM; + return -1; + } + + QSE_MEMSET (&tmp[mux->me.ubound], 0, QSE_SIZEOF(*mux->me.ptr) * (ubound - mux->me.ubound)); + mux->me.ptr = tmp; + mux->me.ubound = ubound; + } + + if (!mux->me.ptr[evt->hnd]) + { + mux->me.ptr[evt->hnd] = QSE_MMGR_ALLOC (mux->mmgr, QSE_SIZEOF(*evt)); + if (!mux->me.ptr[evt->hnd]) + { + mux->errnum = QSE_MUX_ENOMEM; + return -1; + } + } + + if (mux->ee.len >= mux->ee.capa) + { + struct epoll_event* tmp; + qse_size_t newcapa; + + newcapa = (mux->ee.capa + 1) * 2; + newcapa = ALIGN_TO (newcapa, 256); + + tmp = QSE_MMGR_REALLOC ( + mux->mmgr, mux->ee.ptr, + QSE_SIZEOF(*mux->ee.ptr) * newcapa); + if (tmp == QSE_NULL) + { + mux->errnum = QSE_MUX_ENOMEM; + return -1; + } + + mux->ee.ptr = tmp; + mux->ee.capa = newcapa; + } + + if (epoll_ctl (mux->fd, EPOLL_CTL_ADD, evt->hnd, &ev) == -1) + { + mux->errnum = syserr_to_errnum (errno); + return -1; + } + + *mux->me.ptr[evt->hnd] = *evt; + mux->ee.len++; + return 0; +#else + /* TODO: */ + mux->errnum = QSE_MUX_ENOIMPL; + return -1; +#endif +} + +int qse_mux_delete (qse_mux_t* mux, const qse_mux_evt_t* evt) +{ +#if defined(USE_SELECT) + qse_mux_evt_t* mevt; + + if (mux->size <= 0 || evt->hnd < 0 || evt->hnd >= mux->me.ubound) + { + mux->errnum = QSE_MUX_EINVAL; + return -1; + } + + mevt = mux->me.ptr[evt->hnd]; + if (mevt->hnd != evt->hnd) + { + /* already deleted??? */ + mux->errnum = QSE_MUX_EINVAL; + return -1; + } + + if (mevt->mask & QSE_MUX_IN) FD_CLR (evt->hnd, &mux->rset); + if (mevt->mask & QSE_MUX_OUT) FD_CLR (evt->hnd, &mux->wset); + + if (mevt->hnd == mux->maxhnd) + { + qse_mux_hnd_t i; + + for (i = mevt->hnd; i > 0; ) + { + i--; + if (mux->me.ptr[i] && mux->me.ptr[i]->hnd >= 0) + { + QSE_ASSERT (i == mux->me.ptr[i]->hnd); + mux->maxhnd = mux->me.ptr[i]->hnd; + goto done; + } + } + + mux->maxhnd = -1; + QSE_ASSERT (mux->size == 1); + } + +done: + mevt->hnd = -1; + mux->size--; + return 0; + +#elif defined(USE_EPOLL) + if (mux->ee.len <= 0) + { + mux->errnum = QSE_MUX_EINVAL; + return -1; + } + + if (epoll_ctl (mux->fd, EPOLL_CTL_DEL, evt->hnd, QSE_NULL) <= -1) + { + mux->errnum = syserr_to_errnum(errno); + return -1; + } + + mux->ee.len--; + return 0; +#else + /* TODO */ + mux->errnum = QSE_MUX_ENOIMPL; + return -1; +#endif +} + +int qse_mux_poll (qse_mux_t* mux, qse_ntime_t timeout) +{ + +#if defined(USE_SELECT) + struct timeval tv; + int n; + + tv.tv_sec = timeout / QSE_MSECS_PER_SEC; + tv.tv_usec = (timeout % QSE_MSECS_PER_SEC) * QSE_USECS_PER_MSEC; + + mux->tmprset = mux->rset; + mux->tmpwset = mux->wset; + + n = select (mux->maxhnd + 1, &mux->tmprset, &mux->tmpwset, QSE_NULL, &tv); + if (n <= -1) + { + #if defined(_WIN32) + mux->errnum = syserr_to_errnum(WSAGetLastError()); + #else + mux->errnum = syserr_to_errnum(errno); + #endif + return -1; + } + + if (n > 0) + { + qse_mux_hnd_t i; + qse_mux_evt_t* evt, xevt; + + for (i = 0 ; i < mux->maxhnd; i++) + { + evt = mux->me.ptr[i]; + if (!evt || evt->hnd != i) continue; + + QSE_MEMCPY (&xevt, evt, QSE_SIZEOF(xevt)); + + xevt.mask = 0; + if ((evt->mask & QSE_MUX_IN) && FD_ISSET(evt->hnd, &mux->tmprset)) xevt.mask |= QSE_MUX_IN; + if ((evt->mask & QSE_MUX_OUT) && FD_ISSET(evt->hnd, &mux->tmpwset)) xevt.mask |= QSE_MUX_OUT; + + if (xevt.mask > 0) mux->evtfun (mux, &xevt); + } + } + + return n; + +#elif defined(USE_EPOLL) + int nfds, hnd, i, mask; + qse_mux_evt_t* evt, xevt; + + nfds = epoll_wait (mux->fd, mux->ee.ptr, mux->ee.len, timeout); + if (nfds <= -1) + { + mux->errnum = syserr_to_errnum(errno); + return -1; + } + + for (i = 0; i < nfds; i++) + { + hnd = mux->ee.ptr[i].data.fd; + evt = mux->me.ptr[hnd]; + + QSE_ASSERT (evt->hnd == hnd); + + QSE_MEMCPY (&xevt, evt, QSE_SIZEOF(xevt)); + + xevt.mask = 0; + if (mux->ee.ptr[i].events & EPOLLIN) xevt.mask |= QSE_MUX_IN; + if (mux->ee.ptr[i].events & EPOLLOUT) xevt.mask |= QSE_MUX_OUT; + + if (mux->ee.ptr[i].events & EPOLLHUP) + { + if (evt->mask & QSE_MUX_IN) + xevt.mask |= QSE_MUX_IN; + if (evt->mask & QSE_MUX_OUT) + xevt.mask |= QSE_MUX_OUT; + } + + mux->evtfun (mux, &xevt); + } + + return nfds; + +#else + /* TODO */ + mux->errnum = QSE_MUX_ENOIMPL; + return -1; +#endif + +} + diff --git a/qse/lib/cmn/path-basename.c b/qse/lib/cmn/path-basename.c index 797c0b78..042ffec0 100644 --- a/qse/lib/cmn/path-basename.c +++ b/qse/lib/cmn/path-basename.c @@ -20,13 +20,8 @@ #include -#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) -# define IS_MSEP(c) ((c) == QSE_MT('/') || (c) == QSE_MT('\\')) -# define IS_WSEP(c) ((c) == QSE_WT('/') || (c) == QSE_WT('\\')) -#else -# define IS_MSEP(c) ((c) == QSE_MT('/')) -# define IS_WSEP(c) ((c) == QSE_WT('/')) -#endif +#define IS_MSEP(c) QSE_ISPATHMBSEP(c) +#define IS_WSEP(c) QSE_ISPATHWCSEP(c) const qse_mchar_t* qse_mbsbasename (const qse_mchar_t* path) { diff --git a/qse/lib/cmn/path-canon.c b/qse/lib/cmn/path-canon.c index 58c4bbc5..a2d0be74 100644 --- a/qse/lib/cmn/path-canon.c +++ b/qse/lib/cmn/path-canon.c @@ -24,12 +24,7 @@ /* MBS IMPLEMENTATION */ /* ------------------------------------------------------------------ */ - -#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) -# define IS_MSEP(c) ((c) == QSE_MT('/') || (c) == QSE_MT('\\')) -#else -# define IS_MSEP(c) ((c) == QSE_MT('/')) -#endif +#define IS_MSEP(c) QSE_ISPATHMBSEP(c) #define IS_MNIL(c) ((c) == QSE_MT('\0')) #define IS_MSEP_OR_MNIL(c) (IS_MSEP(c) || IS_MNIL(c)) diff --git a/qse/lib/cmn/syscall.h b/qse/lib/cmn/syscall.h index ed893e0f..ef195f73 100644 --- a/qse/lib/cmn/syscall.h +++ b/qse/lib/cmn/syscall.h @@ -363,7 +363,6 @@ #endif /* ===== DIRECTORY - not really system calls ===== */ -typedef DIR qse_dir_t; #define QSE_OPENDIR(name) opendir(name) #define QSE_CLOSEDIR(name) closedir(name) diff --git a/qse/lib/net/htrd.c b/qse/lib/net/htrd.c index 542eb14e..8daad8c4 100644 --- a/qse/lib/net/htrd.c +++ b/qse/lib/net/htrd.c @@ -448,11 +448,6 @@ void qse_htrd_clear (qse_htrd_t* htrd) clear_feed (htrd); } -void qse_htrd_setmmgr (qse_htrd_t* htrd, qse_mmgr_t* mmgr) -{ - htrd->mmgr = mmgr; -} - qse_mmgr_t* qse_htrd_getmmgr (qse_htrd_t* htrd) { return htrd->mmgr; diff --git a/qse/lib/net/httpd-std.c b/qse/lib/net/httpd-std.c index 120a6f97..0d15b504 100644 --- a/qse/lib/net/httpd-std.c +++ b/qse/lib/net/httpd-std.c @@ -28,6 +28,8 @@ #include #include #include +#include +#include #if defined(_WIN32) # include @@ -47,7 +49,7 @@ # if defined(HAVE_SYS_SENDFILE_H) # include # endif -# if defined(HAVE_EPOLL) && defined(HAVE_SYS_EPOLL_H) +# if defined(HAVE_SYS_EPOLL_H) # include # endif # if defined(__linux__) @@ -544,11 +546,15 @@ static int server_open (qse_httpd_t* httpd, qse_httpd_server_t* server) fd = socket (SOCKADDR_FAMILY(&addr), SOCK_STREAM, IPPROTO_TCP); if (fd <= -1) goto oops; +#if defined(FD_CLOEXEC) flag = fcntl (fd, F_GETFD); if (flag >= 0) fcntl (fd, F_SETFD, flag | FD_CLOEXEC); +#endif +#if defined(SO_REUSEADDR) flag = 1; setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &flag, QSE_SIZEOF(flag)); +#endif /* TODO: linux. use capset() to set required capabilities just in case */ #if defined(IP_TRANSPARENT) @@ -621,21 +627,41 @@ IP_TRANSPRENT is needed for: if (listen (fd, 10) <= -1) goto oops; +#if defined(O_NONBLOCK) flag = fcntl (fd, F_GETFL); if (flag >= 0) fcntl (fd, F_SETFL, flag | O_NONBLOCK); +#endif server->handle.i = fd; return 0; oops: +#if defined(_WIN32) + qse_httpd_seterrnum (httpd, syserr_to_errnum(WSAGetLastError())); + if (fd != INVALID_SOCKET) closesocket (fd); +#elif defined(__OS2__) + qse_httpd_seterrnum (httpd, syserr_to_errnum(sock_errno())); + if (fd >= 0) soclose (fd); +#elif defined(__DOS__) + /* TODO: */ +#else qse_httpd_seterrnum (httpd, syserr_to_errnum(errno)); if (fd >= 0) QSE_CLOSE (fd); +#endif return -1; } static void server_close (qse_httpd_t* httpd, qse_httpd_server_t* server) { +#if defined(_WIN32) + closesocket (server->handle.i); +#elif defined(__OS2__) + soclose (server->handle.i); +#elif defined(__DOS__) + /* TODO: */ +#else QSE_CLOSE (server->handle.i); +#endif } static int server_accept ( @@ -643,7 +669,7 @@ static int server_accept ( { sockaddr_t addr; -#ifdef HAVE_SOCKLEN_T +#if defined(HAVE_SOCKLEN_T) socklen_t addrlen; #else int addrlen; @@ -667,12 +693,16 @@ qse_fprintf (QSE_STDERR, QSE_T("Error: too many client?\n")); return -1; } #endif + +#if defined(FD_CLOEXEC) flag = fcntl (fd, F_GETFD); if (flag >= 0) fcntl (fd, F_SETFD, flag | FD_CLOEXEC); +#endif +#if defined(O_NONBLOCK) flag = fcntl (fd, F_GETFL); if (flag >= 0) fcntl (fd, F_SETFL, flag | O_NONBLOCK); - +#endif if (sockaddr_to_nwad (&addr, &client->remote_addr) <= -1) { @@ -721,10 +751,22 @@ qse_fprintf (QSE_STDERR, QSE_T("Error: too many client?\n")); static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer) { - int fd = -1, flag; sockaddr_t connaddr, bindaddr; int connaddrsize, bindaddrsize; int connected = 1; +#if defined(_WIN32) + SOCKET fd = -1; + unsigned long cmd; +#elif defined(__OS2__) + int fd = -1; + int flag; +#elif defined(__DOS__) + int fd = -1; + int flag; +#else + int fd = -1; + int flag; +#endif connaddrsize = nwad_to_sockaddr (&peer->nwad, &connaddr); bindaddrsize = nwad_to_sockaddr (&peer->local, &bindaddr); @@ -741,14 +783,37 @@ static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer) flag = 1; setsockopt (fd, SOL_IP, IP_TRANSPARENT, &flag, QSE_SIZEOF(flag)); #endif + if (bind (fd, (struct sockaddr*)&bindaddr, bindaddrsize) <= -1) { /* i won't care about binding faiulre */ /* TODO: some logging for this failure though */ } + +#if defined(_WIN32) + cmd = 1; + if (ioctlsocket(fd, FIONBIO, &cmd) == SOCKET_ERROR) goto oops; + + if (connect (fd, (struct sockaddr*)&connaddr, connaddrsize) <= -1) + { + if (WSAGetLastError() != WSAEWOULDBLOCK) goto oops; + connected = 0; + } + + cmd = 0; + if (ioctlsocket(fd, FIONBIO, &cmd) == SOCKET_ERROR) goto oops; +#elif defined(__OS2__) + /* TODO: */ + +#elif defined(__DOS__) + /* TODO: */ +#else + + #if defined(FD_CLOEXEC) flag = fcntl (fd, F_GETFD); if (flag >= 0) fcntl (fd, F_SETFD, flag | FD_CLOEXEC); + #endif flag = fcntl (fd, F_GETFL); if (flag >= 0) fcntl (fd, F_SETFL, flag | O_NONBLOCK); @@ -761,32 +826,85 @@ static int peer_open (qse_httpd_t* httpd, qse_httpd_peer_t* peer) /* restore flags */ if (fcntl (fd, F_SETFL, flag) <= -1) goto oops; +#endif peer->handle.i = fd; return connected; oops: +#if defined(_WIN32) + qse_httpd_seterrnum (httpd, syserr_to_errnum(WSAGetLastError())); + if (fd != INVALID_SOCKET) closesocket (fd); +#elif defined(__OS2__) + qse_httpd_seterrnum (httpd, syserr_to_errnum(sock_errno())); + if (fd >= 0) soclose (fd); +#elif defined(__DOS__) + /* TODO: */ +#else qse_httpd_seterrnum (httpd, syserr_to_errnum(errno)); if (fd >= 0) QSE_CLOSE (fd); +#endif return -1; } static void peer_close (qse_httpd_t* httpd, qse_httpd_peer_t* peer) { +#if defined(_WIN32) + closesocket (peer->handle.i); +#elif defined(__OS2__) + soclose (peer->handle.i); +#elif defined(__DOS__) + /* TODO: */ +#else QSE_CLOSE (peer->handle.i); +#endif } static int peer_connected (qse_httpd_t* httpd, qse_httpd_peer_t* peer) { -#ifdef HAVE_SOCKLEN_T - socklen_t len; -#else +#if defined(_WIN32) int len; -#endif + DWORD ret; + + len = QSE_SIZEOF(ret); + if (getsockopt (peer->handle.i, SOL_SOCKET, SO_ERROR, (char*)&ret, &len) == SOCKET_ERROR) + { + qse_httpd_seterrnum (httpd, syserr_to_errnum (ret)); + return -1; + } + + if (ret == WSAEWOULDBLOCK) return 0; + if (ret != 0) + { + qse_httpd_seterrnum (httpd, syserr_to_errnum (ret)); + return -1; + } + + return 1; /* connection completed */ + +#elif defined(__OS2__) + /* TODO */ + httpd->errnum = QSE_HTTPD_ENOIMPL; + return -1; +#elif defined(__DOS__) + /* TODO */ + httpd->errnum = QSE_HTTPD_ENOIMPL; + return -1; +#else + + #if defined(HAVE_SOCKLEN_T) + socklen_t len; + #else + int len; + #endif int ret; len = QSE_SIZEOF(ret); - if (getsockopt (peer->handle.i, SOL_SOCKET, SO_ERROR, &ret, &len) <= -1) return -1; + if (getsockopt (peer->handle.i, SOL_SOCKET, SO_ERROR, &ret, &len) <= -1) + { + qse_httpd_seterrnum (httpd, syserr_to_errnum (ret)); + return -1; + } if (ret == EINPROGRESS) return 0; if (ret != 0) @@ -796,13 +914,14 @@ static int peer_connected (qse_httpd_t* httpd, qse_httpd_peer_t* peer) } return 1; /* connection completed */ +#endif } static qse_ssize_t peer_recv ( qse_httpd_t* httpd, qse_httpd_peer_t* peer, qse_mchar_t* buf, qse_size_t bufsize) { - ssize_t ret = read (peer->handle.i, buf, bufsize); + ssize_t ret = recv (peer->handle.i, buf, bufsize, 0); if (ret <= -1) qse_httpd_seterrnum (httpd, syserr_to_errnum(errno)); return ret; } @@ -811,216 +930,101 @@ static qse_ssize_t peer_send ( qse_httpd_t* httpd, qse_httpd_peer_t* peer, const qse_mchar_t* buf, qse_size_t bufsize) { - ssize_t ret = write (peer->handle.i, buf, bufsize); + ssize_t ret = send (peer->handle.i, buf, bufsize, 0); if (ret <= -1) qse_httpd_seterrnum (httpd, syserr_to_errnum(errno)); return ret; } /* ------------------------------------------------------------------- */ -struct mux_ev_t +typedef struct mux_xtn_t mux_xtn_t; +struct mux_xtn_t { - qse_ubi_t handle; - int reqmask; + qse_httpd_t* httpd; qse_httpd_muxcb_t cbfun; - void* cbarg; }; -struct mux_t +static void dispatch_muxcb (qse_mux_t* mux, const qse_mux_evt_t* evt) { - int fd; + mux_xtn_t* xtn; + qse_ubi_t ubi; - struct - { - struct epoll_event* ptr; - qse_size_t len; - qse_size_t capa; - } ee; + xtn = qse_mux_getxtn (mux); + ubi.i = evt->hnd; + xtn->cbfun (xtn->httpd, mux, ubi, evt->mask, evt->data); +} - struct - { - struct mux_ev_t** ptr; - qse_size_t capa; - } mev; -}; - -#define MUX_EV_ALIGN 64 - -static void* mux_open (qse_httpd_t* httpd) +static void* mux_open (qse_httpd_t* httpd, qse_httpd_muxcb_t cbfun) { - struct mux_t* mux; + qse_mux_t* mux; + mux_xtn_t* xtn; - mux = qse_httpd_allocmem (httpd, QSE_SIZEOF(*mux)); - if (mux == QSE_NULL) return QSE_NULL; - - QSE_MEMSET (mux, 0, QSE_SIZEOF(*mux)); - -#if defined(HAVE_EPOLL_CREATE1) && defined(O_CLOEXEC) - mux->fd = epoll_create1 (O_CLOEXEC); -#else - mux->fd = epoll_create (100); -#endif - if (mux->fd <= -1) + mux = qse_mux_open (httpd->mmgr, QSE_SIZEOF(*xtn), dispatch_muxcb, 256); + if (!mux) { - qse_httpd_freemem (httpd, mux); - qse_httpd_seterrnum (httpd, syserr_to_errnum(errno)); +/* TODO + qse_httpd_seterrnum (httpd, muxerr_to_errnum(mux)); +*/ return QSE_NULL; } -#if defined(HAVE_EPOLL_CREATE1) && defined(O_CLOEXEC) - /* nothing else to do */ -#else - { - int flag = fcntl (mux->fd, F_GETFD); - if (flag >= 0) fcntl (mux->fd, F_SETFD, flag | FD_CLOEXEC); - } -#endif - + xtn = qse_mux_getxtn (mux); + xtn->httpd = httpd; + xtn->cbfun = cbfun; return mux; } static void mux_close (qse_httpd_t* httpd, void* vmux) { - struct mux_t* mux = (struct mux_t*)vmux; - if (mux->ee.ptr) qse_httpd_freemem (httpd, mux->ee.ptr); - if (mux->mev.ptr) - { - qse_size_t i; - for (i = 0; i < mux->mev.capa; i++) - if (mux->mev.ptr[i]) qse_httpd_freemem (httpd, mux->mev.ptr[i]); - qse_httpd_freemem (httpd, mux->mev.ptr); - } - QSE_CLOSE (mux->fd); - qse_httpd_freemem (httpd, mux); + qse_mux_close ((qse_mux_t*)vmux); } static int mux_addhnd ( - qse_httpd_t* httpd, void* vmux, qse_ubi_t handle, - int mask, qse_httpd_muxcb_t cbfun, void* cbarg) + qse_httpd_t* httpd, void* vmux, qse_ubi_t handle, int mask, void* data) { - struct mux_t* mux = (struct mux_t*)vmux; - struct epoll_event ev; - struct mux_ev_t* mev; + qse_mux_evt_t evt; - ev.events = 0; - if (mask & QSE_HTTPD_MUX_READ) ev.events |= EPOLLIN; - if (mask & QSE_HTTPD_MUX_WRITE) ev.events |= EPOLLOUT; + evt.hnd = handle.i; + evt.mask = 0; + if (mask & QSE_HTTPD_MUX_READ) evt.mask |= QSE_MUX_IN; + if (mask & QSE_HTTPD_MUX_WRITE) evt.mask |= QSE_MUX_OUT; + evt.data = data; - if (ev.events == 0 || handle.i <= -1) + if (qse_mux_insert ((qse_mux_t*)vmux, &evt) <= -1) { - qse_httpd_seterrnum (httpd, QSE_HTTPD_EINVAL); +/* TODO + qse_httpd_seterrnum (httpd, muxerr_to_errnum(mux)); +*/ return -1; } - if (handle.i >= mux->mev.capa) - { - struct mux_ev_t** tmp; - qse_size_t tmpcapa, i; - - tmpcapa = (((handle.i + MUX_EV_ALIGN) / MUX_EV_ALIGN) * MUX_EV_ALIGN); - - tmp = (struct mux_ev_t**) qse_httpd_reallocmem ( - httpd, mux->mev.ptr, - QSE_SIZEOF(*mux->mev.ptr) * tmpcapa); - if (tmp == QSE_NULL) return -1; - - for (i = mux->mev.capa; i < tmpcapa; i++) tmp[i] = QSE_NULL; - mux->mev.ptr = tmp; - mux->mev.capa = tmpcapa; - } - - if (mux->mev.ptr[handle.i] == QSE_NULL) - { - /* the location of the data passed to epoll_ctl() - * must not change unless i update the info with epoll() - * whenever there is reallocation. so i simply - * make mux-mev.ptr reallocatable but auctual - * data fixed once allocated. */ - mux->mev.ptr[handle.i] = qse_httpd_allocmem ( - httpd, QSE_SIZEOF(*mux->mev.ptr[handle.i])); - if (mux->mev.ptr[handle.i] == QSE_NULL) return -1; - } - - if (mux->ee.len >= mux->ee.capa) - { - struct epoll_event* tmp; - - tmp = qse_httpd_reallocmem ( - httpd, mux->ee.ptr, - QSE_SIZEOF(*mux->ee.ptr) * (mux->ee.capa + 1) * 2); - if (tmp == QSE_NULL) return -1; - - mux->ee.ptr = tmp; - mux->ee.capa = (mux->ee.capa + 1) * 2; - } - - mev = mux->mev.ptr[handle.i]; - mev->handle = handle; - mev->reqmask = mask; - mev->cbfun = cbfun; - mev->cbarg = cbarg; - - ev.data.ptr = mev; - - if (epoll_ctl (mux->fd, EPOLL_CTL_ADD, handle.i, &ev) <= -1) - { - /* don't rollback ee.ptr */ - qse_httpd_seterrnum (httpd, syserr_to_errnum(errno)); - return -1; - } - - mux->ee.len++; return 0; } static int mux_delhnd (qse_httpd_t* httpd, void* vmux, qse_ubi_t handle) { - struct mux_t* mux = (struct mux_t*)vmux; - - if (epoll_ctl (mux->fd, EPOLL_CTL_DEL, handle.i, QSE_NULL) <= -1) + qse_mux_evt_t evt; + evt.hnd = handle.i; + if (qse_mux_delete ((qse_mux_t*)vmux, &evt) <= -1) { - qse_httpd_seterrnum (httpd, syserr_to_errnum(errno)); +/* TODO + qse_httpd_seterrnum (httpd, muxerr_to_errnum(mux)); +*/ return -1; } - - mux->ee.len--; return 0; } static int mux_poll (qse_httpd_t* httpd, void* vmux, qse_ntime_t timeout) { - struct mux_t* mux = (struct mux_t*)vmux; - struct mux_ev_t* mev; - int mask, nfds, i; - - nfds = epoll_wait (mux->fd, mux->ee.ptr, mux->ee.len, timeout); - if (nfds <= -1) + if (qse_mux_poll ((qse_mux_t*)vmux, timeout) <= -1) { - qse_httpd_seterrnum (httpd, syserr_to_errnum(errno)); +/* TODO + qse_httpd_seterrnum (httpd, muxerr_to_errnum(mux)); +*/ return -1; } - for (i = 0; i < nfds; i++) - { - mev = mux->ee.ptr[i].data.ptr; - - mask = 0; - - if (mux->ee.ptr[i].events & EPOLLIN) - mask |= QSE_HTTPD_MUX_READ; - if (mux->ee.ptr[i].events & EPOLLOUT) - mask |= QSE_HTTPD_MUX_WRITE; - - if (mux->ee.ptr[i].events & EPOLLHUP) - { - if (mev->reqmask & QSE_HTTPD_MUX_READ) - mask |= QSE_HTTPD_MUX_READ; - if (mev->reqmask & QSE_HTTPD_MUX_WRITE) - mask |= QSE_HTTPD_MUX_WRITE; - } - - mev->cbfun (httpd, mux, mev->handle, mask, mev->cbarg); - } return 0; } @@ -1064,11 +1068,24 @@ static int mux_writable (qse_httpd_t* httpd, qse_ubi_t handle, qse_ntoff_t msec) /* ------------------------------------------------------------------- */ - static int stat_file ( qse_httpd_t* httpd, const qse_mchar_t* path, qse_httpd_stat_t* hst, int regonly) { + +#if defined(_WIN32) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#elif defined(__OS2__) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#elif defined(__DOS__) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#else qse_stat_t st; /* TODO: lstat? or stat? */ @@ -1092,24 +1109,39 @@ static int stat_file ( hst->dev = st.st_dev; hst->ino = st.st_ino; hst->size = st.st_size; -#if defined(HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC) + #if defined(HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC) hst->mtime = QSE_SECNSEC_TO_MSEC(st.st_mtim.tv_sec,st.st_mtim.tv_nsec); -#elif defined(HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC) + #elif defined(HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC) hst->mtime = QSE_SECNSEC_TO_MSEC(st.st_mtimespec.tv_sec,st.st_mtimespec.tv_nsec); -#else + #else hst->mtime = QSE_SEC_TO_MSEC(st.st_mtime); -#endif + #endif return 0; +#endif } /* ------------------------------------------------------------------- */ static int file_executable (qse_httpd_t* httpd, const qse_mchar_t* path) { +#if defined(_WIN32) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#elif defined(__OS2__) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#elif defined(__DOS__) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#else if (access (path, X_OK) == -1) return (errno == EACCES)? 0 /*no*/: -1 /*error*/; return 1; /* yes */ +#endif } static int file_stat ( @@ -1121,13 +1153,27 @@ static int file_stat ( static int file_ropen ( qse_httpd_t* httpd, const qse_mchar_t* path, qse_ubi_t* handle) { +#if defined(_WIN32) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#elif defined(__OS2__) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#elif defined(__DOS__) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#else + int fd; int flags; flags = O_RDONLY; -#if defined(O_LARGEFILE) + #if defined(O_LARGEFILE) flags |= O_LARGEFILE; -#endif + #endif qse_printf (QSE_T("opening file [%hs] for reading\n"), path); fd = QSE_OPEN (path, flags, 0); @@ -1143,19 +1189,34 @@ qse_printf (QSE_T("opening file [%hs] for reading\n"), path); handle->i = fd; qse_printf (QSE_T("opened file %hs\n"), path); return 0; + +#endif } static int file_wopen ( qse_httpd_t* httpd, const qse_mchar_t* path, qse_ubi_t* handle) { +#if defined(_WIN32) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#elif defined(__OS2__) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#elif defined(__DOS__) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#else int fd; int flags; flags = O_WRONLY | O_CREAT | O_TRUNC; -#if defined(O_LARGEFILE) + #if defined(O_LARGEFILE) flags |= O_LARGEFILE; -#endif + #endif qse_printf (QSE_T("opening file [%hs] for writing\n"), path); fd = QSE_OPEN (path, flags, 0644); @@ -1167,26 +1228,69 @@ qse_printf (QSE_T("opening file [%hs] for writing\n"), path); handle->i = fd; return 0; +#endif } static void file_close (qse_httpd_t* httpd, qse_ubi_t handle) { +#if defined(_WIN32) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#elif defined(__OS2__) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#elif defined(__DOS__) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#else qse_printf (QSE_T("closing file %d\n"), handle.i); QSE_CLOSE (handle.i); +#endif } static qse_ssize_t file_read ( qse_httpd_t* httpd, qse_ubi_t handle, qse_mchar_t* buf, qse_size_t len) { +#if defined(_WIN32) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#elif defined(__OS2__) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#elif defined(__DOS__) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#else return QSE_READ (handle.i, buf, len); +#endif } static qse_ssize_t file_write ( qse_httpd_t* httpd, qse_ubi_t handle, const qse_mchar_t* buf, qse_size_t len) { +#if defined(_WIN32) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#elif defined(__OS2__) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#elif defined(__DOS__) + /* TODO: */ + qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOIMPL); + return -1; +#else return QSE_WRITE (handle.i, buf, len); +#endif } /* ------------------------------------------------------------------- */ @@ -1217,7 +1321,7 @@ static int dir_open (qse_httpd_t* httpd, const qse_mchar_t* path, qse_ubi_t* han return -1; } - d->dp = QSE_OPENDIR (path); + d->dp = qse_dir_open (httpd->mmgr, 0, (const qse_char_t*)path, QSE_DIR_MBSPATH | QSE_DIR_SORT); if (d->dp == QSE_NULL) { qse_httpd_seterrnum (httpd, syserr_to_errnum(errno)); @@ -1236,7 +1340,7 @@ static void dir_close (qse_httpd_t* httpd, qse_ubi_t handle) d = (dir_t*)handle.ptr; - QSE_CLOSEDIR (d->dp); + qse_dir_close (d->dp); QSE_MMGR_FREE (httpd->mmgr, d->path); QSE_MMGR_FREE (httpd->mmgr, d); @@ -1245,23 +1349,22 @@ static void dir_close (qse_httpd_t* httpd, qse_ubi_t handle) static int dir_read (qse_httpd_t* httpd, qse_ubi_t handle, qse_httpd_dirent_t* dirent) { dir_t* d; - qse_dirent_t* de; + qse_dir_ent_t de; qse_mchar_t* fpath; int n; d = (dir_t*)handle.ptr; - errno = 0; - de = QSE_READDIR (d->dp); - if (de == QSE_NULL) + n = qse_dir_read (d->dp, &de); + if (n <= -1) { - if (errno == 0) return 0; - qse_httpd_seterrnum (httpd, syserr_to_errnum(errno)); + qse_httpd_seterrnum (httpd, QSE_HTTPD_ESYSERR); return -1; } + else if (n == 0) return 0; /* i assume that d->path ends with a slash */ - fpath = qse_mbsdup2 (d->path, de->d_name, httpd->mmgr); + fpath = qse_mbsdup2 (d->path, (const qse_mchar_t*)de.name, httpd->mmgr); if (fpath == QSE_NULL) { qse_httpd_seterrnum (httpd, QSE_HTTPD_ENOMEM); @@ -1272,7 +1375,7 @@ static int dir_read (qse_httpd_t* httpd, qse_ubi_t handle, qse_httpd_dirent_t* d QSE_MMGR_FREE (httpd->mmgr, fpath); if (n <= -1) QSE_MEMSET (dirent, 0, QSE_SIZEOF(*dirent)); - dirent->name = de->d_name; + dirent->name = (const qse_mchar_t*)de.name; return 1; } @@ -1966,7 +2069,17 @@ auth_ok: xpath = merge_paths (httpd, server_xtn->cfg[SERVER_XTN_CFG_DOCROOT], qpath); if (xpath == QSE_NULL) return -1; +#if defined(_WIN32) + /* TODO */ +#elif defined(__OS2__) + + /* TODO */ +#elif defined(__DOS__) + + /* TODO */ +#else if (QSE_STAT (xpath, &st) == 0 && S_ISDIR(st.st_mode)) +#endif { /* it is a directory */ if (server_xtn->cfg2.s.idxstd) diff --git a/qse/lib/net/httpd.c b/qse/lib/net/httpd.c index b8b90f18..cc8536bf 100644 --- a/qse/lib/net/httpd.c +++ b/qse/lib/net/httpd.c @@ -99,11 +99,6 @@ void qse_httpd_seterrnum (qse_httpd_t* httpd, qse_httpd_errnum_t errnum) httpd->errnum = errnum; } -void qse_httpd_setmmgr (qse_httpd_t* httpd, qse_mmgr_t* mmgr) -{ - httpd->mmgr = mmgr; -} - qse_mmgr_t* qse_httpd_getmmgr (qse_httpd_t* httpd) { return httpd->mmgr; @@ -300,6 +295,7 @@ static qse_httpd_client_t* new_client ( QSE_MEMSET (client, 0, QSE_SIZEOF(*client)); + client->type = QSE_HTTPD_CLIENT; client->htrd = qse_htrd_open (httpd->mmgr, QSE_SIZEOF(*xtn)); if (client->htrd == QSE_NULL) { @@ -442,8 +438,7 @@ qse_printf (QSE_T("failed to accept from server %s\n"), tmp); qse_printf (QSE_T("MUX ADDHND CLIENT READ %d\n"), client->handle.i); if (httpd->scb->mux.addhnd ( - httpd, mux, client->handle, QSE_HTTPD_MUX_READ, - perform_client_task, client) <= -1) + httpd, mux, client->handle, QSE_HTTPD_MUX_READ, client) <= -1) { free_client (httpd, client); return -1; @@ -511,8 +506,7 @@ qse_printf (QSE_T("FAILED TO ACTIVATE SERVER....[%s]\n"), buf); qse_printf (QSE_T("MUX ADDHND SERVER %d\n"), server->handle.i); if (httpd->scb->mux.addhnd ( - httpd, httpd->mux, server->handle, QSE_HTTPD_MUX_READ, - accept_client, server) <= -1) + httpd, httpd->mux, server->handle, QSE_HTTPD_MUX_READ, server) <= -1) { qse_printf (QSE_T("FAILED TO ADD SERVER HANDLE TO MUX....\n")); httpd->scb->server.close (httpd, server); @@ -556,6 +550,7 @@ qse_httpd_server_t* qse_httpd_attachserver ( QSE_MEMCPY (server, tmpl, QSE_SIZEOF(*server)); QSE_MEMSET (server + 1, 0, xtnsize); + server->type = QSE_HTTPD_SERVER; server->flags &= ~QSE_HTTPD_SERVER_ACTIVE; server->predetach = predetach; @@ -827,8 +822,7 @@ qse_printf (QSE_T("REMOVING XXXXX FROM READING NO MORE TASK....\n")); if (mux_status) { if (httpd->scb->mux.addhnd ( - httpd, httpd->mux, client->handle, - mux_mask, perform_client_task, client) <= -1) + httpd, httpd->mux, client->handle, mux_mask, client) <= -1) { return -1; } @@ -915,7 +909,7 @@ qse_printf (QSE_T("REMOVING XXXXX FROM READING NO MORE TASK....\n")); { if (httpd->scb->mux.addhnd ( httpd, httpd->mux, task->trigger[i].handle, - trigger_mux_mask, perform_client_task, client) <= -1) + trigger_mux_mask, client) <= -1) { return -1; } @@ -949,7 +943,7 @@ qse_printf (QSE_T("REMOVING XXXXX FROM READING NO MORE TASK....\n")); { if (httpd->scb->mux.addhnd ( httpd, httpd->mux, client->handle, - client_handle_mux_mask, perform_client_task, client) <= -1) + client_handle_mux_mask, client) <= -1) { return -1; } @@ -1073,7 +1067,7 @@ qse_printf (QSE_T("MUX ADDHND CLIENT RW(ENTASK) %d\n"), client->handle.i); if (httpd->scb->mux.addhnd ( httpd, httpd->mux, client->handle, QSE_HTTPD_MUX_READ | QSE_HTTPD_MUX_WRITE, - perform_client_task, client) <= -1) + client) <= -1) { /*purge_client (httpd, client);*/ client->status |= CLIENT_BAD; @@ -1085,6 +1079,14 @@ qse_printf (QSE_T("MUX ADDHND CLIENT RW(ENTASK) %d\n"), client->handle.i); return new_task; } +static int dispatch_mux ( + qse_httpd_t* httpd, void* mux, qse_ubi_t handle, int mask, void* cbarg) +{ + return ((qse_httpd_server_t*)cbarg)->type == QSE_HTTPD_SERVER? + accept_client (httpd, mux, handle, mask, cbarg): + perform_client_task (httpd, mux, handle, mask, cbarg); +} + int qse_httpd_loop (qse_httpd_t* httpd, qse_httpd_scb_t* scb, qse_httpd_rcb_t* rcb, qse_ntime_t timeout) { QSE_ASSERTX (httpd->server.list.head != QSE_NULL, @@ -1106,7 +1108,7 @@ int qse_httpd_loop (qse_httpd_t* httpd, qse_httpd_scb_t* scb, qse_httpd_rcb_t* r QSE_ASSERT (httpd->server.navail > 0); - httpd->mux = httpd->scb->mux.open (httpd); + httpd->mux = httpd->scb->mux.open (httpd, dispatch_mux); if (httpd->mux == QSE_NULL) { qse_printf (QSE_T("can't open mux....\n")); diff --git a/qse/lib/net/upxd.c b/qse/lib/net/upxd.c index 0a8cde06..373e67d5 100644 --- a/qse/lib/net/upxd.c +++ b/qse/lib/net/upxd.c @@ -73,12 +73,6 @@ void qse_upxd_fini (qse_upxd_t* upxd) free_all_servers (upxd); } - -void qse_upxd_setmmgr (qse_upxd_t* upxd, qse_mmgr_t* mmgr) -{ - upxd->mmgr = mmgr; -} - qse_mmgr_t* qse_upxd_getmmgr (qse_upxd_t* upxd) { return upxd->mmgr; diff --git a/qse/lib/sed/sed.c b/qse/lib/sed/sed.c index db1e2484..27006823 100644 --- a/qse/lib/sed/sed.c +++ b/qse/lib/sed/sed.c @@ -143,11 +143,6 @@ void qse_sed_fini (qse_sed_t* sed) qse_str_fini (&sed->tmp.rex); } -void qse_sed_setmmgr (qse_sed_t* sed, qse_mmgr_t* mmgr) -{ - sed->mmgr = mmgr; -} - qse_mmgr_t* qse_sed_getmmgr (qse_sed_t* sed) { return sed->mmgr; diff --git a/qse/mod/awk/Makefile.am b/qse/mod/awk/Makefile.am index 6208f8ac..ea4048f1 100644 --- a/qse/mod/awk/Makefile.am +++ b/qse/mod/awk/Makefile.am @@ -15,6 +15,11 @@ libqseawk_sys_la_SOURCES = sys.c libqseawk_sys_la_LDFLAGS = $(LDFLAGS_COMMON) libqseawk_sys_la_LIBADD = $(LIBADD_COMMON) +mod_LTLIBRARIES += libqseawk-dir.la +libqseawk_dir_la_SOURCES = dir.c +libqseawk_dir_la_LDFLAGS = $(LDFLAGS_COMMON) +libqseawk_dir_la_LIBADD = $(LIBADD_COMMON) + if HAVE_LIBUCI mod_LTLIBRARIES += libqseawk-uci.la libqseawk_uci_la_SOURCES = uci.c diff --git a/qse/mod/awk/Makefile.in b/qse/mod/awk/Makefile.in index 274a7a24..eb6bb63f 100644 --- a/qse/mod/awk/Makefile.in +++ b/qse/mod/awk/Makefile.in @@ -81,6 +81,12 @@ am__uninstall_files_from_dir = { \ am__installdirs = "$(DESTDIR)$(moddir)" LTLIBRARIES = $(mod_LTLIBRARIES) am__DEPENDENCIES_1 = +libqseawk_dir_la_DEPENDENCIES = $(am__DEPENDENCIES_1) +am_libqseawk_dir_la_OBJECTS = dir.lo +libqseawk_dir_la_OBJECTS = $(am_libqseawk_dir_la_OBJECTS) +libqseawk_dir_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \ + $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ + $(libqseawk_dir_la_LDFLAGS) $(LDFLAGS) -o $@ @HAVE_C_MPI_TRUE@libqseawk_mpi_la_DEPENDENCIES = \ @HAVE_C_MPI_TRUE@ $(am__DEPENDENCIES_1) am__libqseawk_mpi_la_SOURCES_DIST = mpi.c @@ -119,9 +125,10 @@ CCLD = $(CC) LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \ --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \ $(LDFLAGS) -o $@ -SOURCES = $(libqseawk_mpi_la_SOURCES) $(libqseawk_sys_la_SOURCES) \ - $(libqseawk_uci_la_SOURCES) -DIST_SOURCES = $(am__libqseawk_mpi_la_SOURCES_DIST) \ +SOURCES = $(libqseawk_dir_la_SOURCES) $(libqseawk_mpi_la_SOURCES) \ + $(libqseawk_sys_la_SOURCES) $(libqseawk_uci_la_SOURCES) +DIST_SOURCES = $(libqseawk_dir_la_SOURCES) \ + $(am__libqseawk_mpi_la_SOURCES_DIST) \ $(libqseawk_sys_la_SOURCES) \ $(am__libqseawk_uci_la_SOURCES_DIST) ETAGS = etags @@ -307,10 +314,14 @@ AM_CPPFLAGS = \ LDFLAGS_COMMON = -L$(abs_builddir)/../../lib/cmn -L$(abs_builddir)/../../lib/awk -L$(libdir) -no-undefined -version-info 1:0:0 LIBADD_COMMON = -lqseawk -lqsecmn moddir = $(libdir) -mod_LTLIBRARIES = libqseawk-sys.la $(am__append_1) $(am__append_2) +mod_LTLIBRARIES = libqseawk-sys.la libqseawk-dir.la $(am__append_1) \ + $(am__append_2) libqseawk_sys_la_SOURCES = sys.c libqseawk_sys_la_LDFLAGS = $(LDFLAGS_COMMON) libqseawk_sys_la_LIBADD = $(LIBADD_COMMON) +libqseawk_dir_la_SOURCES = dir.c +libqseawk_dir_la_LDFLAGS = $(LDFLAGS_COMMON) +libqseawk_dir_la_LIBADD = $(LIBADD_COMMON) @HAVE_LIBUCI_TRUE@libqseawk_uci_la_SOURCES = uci.c @HAVE_LIBUCI_TRUE@libqseawk_uci_la_LDFLAGS = $(LDFLAGS_COMMON) @HAVE_LIBUCI_TRUE@libqseawk_uci_la_LIBADD = $(LIBADD_COMMON) $(UCI_LIBS) @@ -383,6 +394,8 @@ clean-modLTLIBRARIES: echo "rm -f \"$${dir}/so_locations\""; \ rm -f "$${dir}/so_locations"; \ done +libqseawk-dir.la: $(libqseawk_dir_la_OBJECTS) $(libqseawk_dir_la_DEPENDENCIES) $(EXTRA_libqseawk_dir_la_DEPENDENCIES) + $(libqseawk_dir_la_LINK) -rpath $(moddir) $(libqseawk_dir_la_OBJECTS) $(libqseawk_dir_la_LIBADD) $(LIBS) libqseawk-mpi.la: $(libqseawk_mpi_la_OBJECTS) $(libqseawk_mpi_la_DEPENDENCIES) $(EXTRA_libqseawk_mpi_la_DEPENDENCIES) $(libqseawk_mpi_la_LINK) $(am_libqseawk_mpi_la_rpath) $(libqseawk_mpi_la_OBJECTS) $(libqseawk_mpi_la_LIBADD) $(LIBS) libqseawk-sys.la: $(libqseawk_sys_la_OBJECTS) $(libqseawk_sys_la_DEPENDENCIES) $(EXTRA_libqseawk_sys_la_DEPENDENCIES) @@ -396,6 +409,7 @@ mostlyclean-compile: distclean-compile: -rm -f *.tab.c +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dir.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqseawk_mpi_la-mpi.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sys.Plo@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uci.Plo@am__quote@ diff --git a/qse/mod/awk/dir.c b/qse/mod/awk/dir.c new file mode 100644 index 00000000..8fc18b0f --- /dev/null +++ b/qse/mod/awk/dir.c @@ -0,0 +1,538 @@ +/* + * $Id$ + * + Copyright 2006-2012 Chung, Hyung-Hwan. + This file is part of QSE. + + QSE is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + QSE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with QSE. If not, see . + */ + +#include +#include +#include +#include +#include "../../lib/cmn/mem.h" + +typedef struct dir_list_t dir_list_t; +typedef struct dir_node_t dir_node_t; + +enum +{ + DIR_ENOERR, + DIR_ENOMEM, + DIR_EINVAL, + DIR_ENOENT +}; + +struct dir_node_t +{ + int id; + qse_dir_t* ctx; + dir_node_t* prev; + dir_node_t* next; +}; + +struct dir_list_t +{ + dir_node_t* head; + dir_node_t* tail; + dir_node_t* free; + + /* mapping table to map 'id' to 'node' */ + struct + { + dir_node_t** tab; + int capa; + int high; + } map; + + int errnum; +}; + +static dir_node_t* new_dir_node (qse_awk_rtx_t* rtx, dir_list_t* list, const qse_char_t* path) +{ + /* create a new context node and append it to the list tail */ + dir_node_t* node; + + node = QSE_NULL; + + if (list->free) node = list->free; + else + { + node = qse_awk_rtx_callocmem (rtx, QSE_SIZEOF(*node)); + if (!node) goto oops; + } + + node->ctx = qse_dir_open (qse_awk_rtx_getmmgr(rtx), 0, path, 0); + if (!node->ctx) goto oops; + + if (node == list->free) list->free = node->next; + else + { + if (list->map.high <= list->map.capa) + { + int newcapa; + dir_node_t** tmp; + + newcapa = list->map.capa + 64; + if (newcapa < list->map.capa) goto oops; /* overflow */ + + tmp = (dir_node_t**) qse_awk_rtx_reallocmem ( + rtx, list->map.tab, QSE_SIZEOF(*tmp) * newcapa); + if (!tmp) goto oops; + + QSE_MEMSET (&tmp[list->map.capa], 0, + QSE_SIZEOF(*tmp) * (newcapa - list->map.capa)); + + list->map.tab = tmp; + list->map.capa = newcapa; + } + + node->id = list->map.high; + QSE_ASSERT (list->map.tab[node->id] == QSE_NULL); + list->map.tab[node->id] = node; + list->map.high++; + } + + /* append it to the tail */ + node->next = QSE_NULL; + node->prev = list->tail; + if (list->tail) list->tail->next = node; + else list->head = node; + list->tail = node; + + return node; + +oops: + if (node) qse_awk_rtx_freemem (rtx, node); + qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); + return QSE_NULL; +} + +static void free_dir_node (qse_awk_rtx_t* rtx, dir_list_t* list, dir_node_t* node) +{ + if (node->prev) node->prev->next = node->next; + if (node->next) node->next->prev = node->prev; + if (list->head == node) list->head = node->next; + if (list->tail == node) list->tail = node->prev; + + list->map.tab[node->id] = QSE_NULL; + + if (node->ctx) + { + qse_dir_close (node->ctx); + } + + if (list->map.high == node->id + 1) + { + /* destroy the actual node if the node to be freed has the + * highest id */ + QSE_MMGR_FREE (qse_awk_rtx_getmmgr(rtx), node); + list->map.high--; + } + else + { + /* otherwise, chain the node to the free list */ + node->ctx = QSE_NULL; + node->next = list->free; + list->free = node; + } + + /* however, i destroy the whole free list when all the nodes are + * chanined to the free list */ + if (list->head == QSE_NULL) + { + qse_mmgr_t* mmgr; + dir_node_t* curnode; + + mmgr = qse_awk_rtx_getmmgr(rtx); + + while (list->free) + { + curnode = list->free; + list->free = list->free->next; + QSE_ASSERT (curnode->ctx == QSE_NULL); + QSE_MMGR_FREE (mmgr, curnode); + } + + QSE_MMGR_FREE (mmgr, list->map.tab); + list->map.high = 0; + list->map.capa = 0; + list->map.tab = QSE_NULL; + } +} + +/* ------------------------------------------------------------------------ */ + +static int close_byid (qse_awk_rtx_t* rtx, dir_list_t* list, qse_long_t id) +{ + int x = DIR_EINVAL; + + if (id >= 0 && id < list->map.high && list->map.tab[id]) + { + free_dir_node (rtx, list, list->map.tab[id]); + x = DIR_ENOERR; + } + + return -x; +} + +static int reset_byid (qse_awk_rtx_t* rtx, dir_list_t* list, qse_long_t id, const qse_char_t* path) +{ + int x = DIR_EINVAL; + + if (id >= 0 && id < list->map.high && list->map.tab[id]) + { + if (qse_dir_reset (list->map.tab[id]->ctx, path) >= 0) x = DIR_ENOERR; + } + + return -x; +} + +static int read_byid (qse_awk_rtx_t* rtx, dir_list_t* list, qse_long_t id, qse_awk_val_t** retv) +{ + int x = DIR_EINVAL; + + if (id >= 0 && id < list->map.high && list->map.tab[id]) + { + int y; + qse_dir_ent_t ent; + y = qse_dir_read (list->map.tab[id]->ctx, &ent); + if (y == 0) x = DIR_ENOENT; + else if (y >= 1) + { + qse_awk_val_t* tmp; + tmp = qse_awk_rtx_makestrvalwithstr (rtx, ent.name); + if (tmp) + { + *retv = tmp; + x = DIR_ENOERR; + } + else x = DIR_ENOMEM; + } + } + + return -x; +} + +/* ------------------------------------------------------------------------ */ + +static QSE_INLINE dir_list_t* rtx_to_list (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) +{ + qse_rbt_pair_t* pair; + pair = qse_rbt_search ((qse_rbt_t*)fi->mod->ctx, &rtx, QSE_SIZEOF(rtx)); + QSE_ASSERT (pair != QSE_NULL); + return (dir_list_t*)QSE_RBT_VPTR(pair); +} + +static int fnc_dir_errno (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) +{ + dir_list_t* list; + qse_awk_val_t* retv; + + list = rtx_to_list (rtx, fi); + + retv = qse_awk_rtx_makeintval (rtx, list->errnum); + if (retv == QSE_NULL) return -1; + + qse_awk_rtx_setretval (rtx, retv); + return 0; +} + +static qse_char_t* errmsg[] = +{ + QSE_T("no error"), + QSE_T("out of memory"), + QSE_T("invalid data"), + QSE_T("no entry"), + QSE_T("unknown error") +}; + +static int fnc_dir_errstr (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) +{ + dir_list_t* list; + qse_awk_val_t* retv; + qse_long_t errnum; + + list = rtx_to_list (rtx, fi); + + if (qse_awk_rtx_getnargs (rtx) <= 0 || + qse_awk_rtx_valtolong (rtx, qse_awk_rtx_getarg (rtx, 0), &errnum) <= -1) + { + errnum = list->errnum; + } + + if (errnum < 0 || errnum >= QSE_COUNTOF(errmsg)) errnum = QSE_COUNTOF(errmsg) - 1; + + retv = qse_awk_rtx_makestrvalwithstr (rtx, errmsg[errnum]); + if (retv == QSE_NULL) return -1; + + qse_awk_rtx_setretval (rtx, retv); + return 0; +} + +static int fnc_dir_open (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) +{ + dir_list_t* list; + dir_node_t* node; + qse_long_t ret; + qse_awk_val_t* retv; + qse_char_t* path; + + list = rtx_to_list (rtx, fi); + + path = qse_awk_rtx_valtostrdup (rtx, qse_awk_rtx_getarg (rtx, 0), QSE_NULL); + if (path == QSE_NULL) + { + list->errnum = DIR_ENOMEM; + ret = -DIR_ENOMEM; + } + else + { + node = new_dir_node (rtx, list, path); + ret = node? node->id: -DIR_ENOMEM; + qse_awk_rtx_freemem (rtx, path); + } + + if (ret <= -1) + { + list->errnum = -ret; + ret = -1; + } + + retv = qse_awk_rtx_makeintval (rtx, ret); + if (retv == QSE_NULL) return -1; + + qse_awk_rtx_setretval (rtx, retv); + return 0; +} + +static int fnc_dir_close (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) +{ + dir_list_t* list; + qse_awk_val_t* retv; + qse_long_t id; + int ret; + + list = rtx_to_list (rtx, fi); + + ret = qse_awk_rtx_valtolong (rtx, qse_awk_rtx_getarg (rtx, 0), &id); + if (ret <= -1) ret = -DIR_EINVAL; + else ret = close_byid (rtx, list, id); + + if (ret <= -1) + { + list->errnum = -ret; + ret = -1; + } + + retv = qse_awk_rtx_makeintval (rtx, ret); + if (retv == QSE_NULL) return -1; + + qse_awk_rtx_setretval (rtx, retv); + return 0; +} + +static int fnc_dir_reset (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) +{ + dir_list_t* list; + qse_awk_val_t* retv; + qse_long_t id; + int ret; + + list = rtx_to_list (rtx, fi); + + ret = qse_awk_rtx_valtolong (rtx, qse_awk_rtx_getarg (rtx, 0), &id); + if (ret <= -1) ret = -DIR_EINVAL; + else + { + qse_char_t* path; + + path = qse_awk_rtx_valtostrdup (rtx, qse_awk_rtx_getarg(rtx, 1), QSE_NULL); + if (path) + { + ret = reset_byid (rtx, list, id, path); + qse_awk_rtx_freemem (rtx, path); + } + else ret = -DIR_ENOMEM; + } + + if (ret <= -1) + { + list->errnum = -ret; + ret = -1; + } + + retv = qse_awk_rtx_makeintval (rtx, ret); + if (retv == QSE_NULL) return -1; + + qse_awk_rtx_setretval (rtx, retv); + return 0; +} + +static int fnc_dir_read (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) +{ + dir_list_t* list; + qse_awk_val_t* retv; + qse_long_t id; + int ret; + + list = rtx_to_list (rtx, fi); + + ret = qse_awk_rtx_valtolong (rtx, qse_awk_rtx_getarg (rtx, 0), &id); + if (ret <= -1) ret = -DIR_EINVAL; + else ret = read_byid (rtx, list, id, &retv); + + if (ret <= -1) + { + list->errnum = -ret; + } + else + { + qse_awk_rtx_setretval (rtx, retv); + } + + return 0; +} + +/* ------------------------------------------------------------------------ */ + +typedef struct fnctab_t fnctab_t; +struct fnctab_t +{ + const qse_char_t* name; + qse_awk_mod_sym_fnc_t info; +}; + +static fnctab_t fnctab[] = +{ + { QSE_T("close"), { { 1, 1, QSE_NULL }, fnc_dir_close, 0 } }, + { QSE_T("errno"), { { 0, 0, QSE_NULL }, fnc_dir_errno, 0 } }, + { QSE_T("errstr"), { { 0, 1, QSE_NULL }, fnc_dir_errstr, 0 } }, + { QSE_T("open"), { { 1, 1, QSE_NULL }, fnc_dir_open, 0 } }, + { QSE_T("read"), { { 1, 1, QSE_NULL }, fnc_dir_read, 0 } }, + { QSE_T("reset"), { { 2, 2, QSE_NULL }, fnc_dir_reset, 0 } }, +}; + +/* ------------------------------------------------------------------------ */ + +static int query (qse_awk_mod_t* mod, qse_awk_t* awk, const qse_char_t* name, qse_awk_mod_sym_t* sym) +{ + qse_cstr_t ea; + int left, right, mid, n; + + left = 0; right = QSE_COUNTOF(fnctab) - 1; + + while (left <= right) + { + mid = (left + right) / 2; + + n = qse_strcmp (fnctab[mid].name, name); + if (n > 0) right = mid - 1; + else if (n < 0) left = mid + 1; + else + { + sym->type = QSE_AWK_MOD_FNC; + sym->u.fnc = fnctab[mid].info; + return 0; + } + } + + ea.ptr = name; + ea.len = qse_strlen(name); + qse_awk_seterror (awk, QSE_AWK_ENOENT, &ea, QSE_NULL); + return -1; +} + +static int init (qse_awk_mod_t* mod, qse_awk_rtx_t* rtx) +{ + qse_rbt_t* rbt; + dir_list_t list; + + rbt = (qse_rbt_t*)mod->ctx; + + QSE_MEMSET (&list, 0, QSE_SIZEOF(list)); + if (qse_rbt_insert (rbt, &rtx, QSE_SIZEOF(rtx), &list, QSE_SIZEOF(list)) == QSE_NULL) + { + qse_awk_rtx_seterrnum (rtx, QSE_AWK_ENOMEM, QSE_NULL); + return -1; + } + + return 0; +} + +static void fini (qse_awk_mod_t* mod, qse_awk_rtx_t* rtx) +{ + qse_rbt_t* rbt; + qse_rbt_pair_t* pair; + + rbt = (qse_rbt_t*)mod->ctx; + + /* garbage clean-up */ + pair = qse_rbt_search (rbt, &rtx, QSE_SIZEOF(rtx)); + if (pair) + { + dir_list_t* list; + dir_node_t* node, * next; + + list = QSE_RBT_VPTR(pair); + node = list->head; + while (node) + { + next = node->next; + free_dir_node (rtx, list, node); + node = next; + } + + qse_rbt_delete (rbt, &rtx, QSE_SIZEOF(rtx)); + } +} + +static void unload (qse_awk_mod_t* mod, qse_awk_t* awk) +{ + qse_rbt_t* rbt; + + rbt = (qse_rbt_t*)mod->ctx; + + QSE_ASSERT (QSE_RBT_SIZE(rbt) == 0); + qse_rbt_close (rbt); +} + +QSE_EXPORT int load (qse_awk_mod_t* mod, qse_awk_t* awk) +{ + qse_rbt_t* rbt; + + mod->query = query; + mod->unload = unload; + + mod->init = init; + mod->fini = fini; + + rbt = qse_rbt_open (qse_awk_getmmgr(awk), 0, 1, 1); + if (rbt == QSE_NULL) + { + qse_awk_seterrnum (awk, QSE_AWK_ENOMEM, QSE_NULL); + return -1; + } + qse_rbt_setmancbs (rbt, qse_getrbtmancbs(QSE_RBT_MANCBS_INLINE_COPIERS)); + + mod->ctx = rbt; + return 0; +} + +#if defined(__DOS__) +/* kind of DllMain() for Causeway DLL */ +int main (int eax) { return 0; } +#endif + diff --git a/qse/mod/awk/mpi.c b/qse/mod/awk/mpi.c index 7632f097..eee7aeeb 100644 --- a/qse/mod/awk/mpi.c +++ b/qse/mod/awk/mpi.c @@ -1,3 +1,23 @@ +/* + * $Id$ + * + Copyright 2006-2012 Chung, Hyung-Hwan. + This file is part of QSE. + + QSE is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + QSE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with QSE. If not, see . + */ + #include #include #include diff --git a/qse/mod/awk/sys.c b/qse/mod/awk/sys.c index 990e59c6..12ccedfa 100644 --- a/qse/mod/awk/sys.c +++ b/qse/mod/awk/sys.c @@ -1,3 +1,23 @@ +/* + * $Id$ + * + Copyright 2006-2012 Chung, Hyung-Hwan. + This file is part of QSE. + + QSE is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + QSE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with QSE. If not, see . + */ + #include #include #include diff --git a/qse/mod/awk/uci.c b/qse/mod/awk/uci.c index bd08c200..d41ff237 100644 --- a/qse/mod/awk/uci.c +++ b/qse/mod/awk/uci.c @@ -1,3 +1,23 @@ +/* + * $Id$ + * + Copyright 2006-2012 Chung, Hyung-Hwan. + This file is part of QSE. + + QSE is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, either version 3 of + the License, or (at your option) any later version. + + QSE is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with QSE. If not, see . + */ + #include #include #include diff --git a/qse/watcom/debug/dos32/lib/cmn/qsecmn.tgt b/qse/watcom/debug/dos32/lib/cmn/qsecmn.tgt index d2b9d9df..4a95c304 100755 --- a/qse/watcom/debug/dos32/lib/cmn/qsecmn.tgt +++ b/qse/watcom/debug/dos32/lib/cmn/qsecmn.tgt @@ -42,7 +42,7 @@ WVList 0 10 WPickList -85 +87 11 MItem 3 @@ -222,7 +222,7 @@ WVList 51 MItem 28 -../../../../../lib/cmn/dll.c +../../../../../lib/cmn/dir.c 52 WString 4 @@ -240,7 +240,7 @@ WVList 55 MItem 28 -../../../../../lib/cmn/env.c +../../../../../lib/cmn/dll.c 56 WString 4 @@ -258,7 +258,7 @@ WVList 59 MItem 28 -../../../../../lib/cmn/fio.c +../../../../../lib/cmn/env.c 60 WString 4 @@ -276,7 +276,7 @@ WVList 63 MItem 28 -../../../../../lib/cmn/fma.c +../../../../../lib/cmn/fio.c 64 WString 4 @@ -294,7 +294,7 @@ WVList 67 MItem 28 -../../../../../lib/cmn/fmt.c +../../../../../lib/cmn/fma.c 68 WString 4 @@ -311,8 +311,8 @@ WVList 0 71 MItem -31 -../../../../../lib/cmn/fs-err.c +28 +../../../../../lib/cmn/fmt.c 72 WString 4 @@ -329,8 +329,8 @@ WVList 0 75 MItem -32 -../../../../../lib/cmn/fs-move.c +31 +../../../../../lib/cmn/fs-err.c 76 WString 4 @@ -347,8 +347,8 @@ WVList 0 79 MItem -27 -../../../../../lib/cmn/fs.c +32 +../../../../../lib/cmn/fs-move.c 80 WString 4 @@ -365,8 +365,8 @@ WVList 0 83 MItem -28 -../../../../../lib/cmn/gdl.c +27 +../../../../../lib/cmn/fs.c 84 WString 4 @@ -383,8 +383,8 @@ WVList 0 87 MItem -29 -../../../../../lib/cmn/glob.c +28 +../../../../../lib/cmn/gdl.c 88 WString 4 @@ -401,8 +401,8 @@ WVList 0 91 MItem -28 -../../../../../lib/cmn/htb.c +29 +../../../../../lib/cmn/glob.c 92 WString 4 @@ -419,8 +419,8 @@ WVList 0 95 MItem -29 -../../../../../lib/cmn/hton.c +28 +../../../../../lib/cmn/htb.c 96 WString 4 @@ -438,7 +438,7 @@ WVList 99 MItem 29 -../../../../../lib/cmn/ipad.c +../../../../../lib/cmn/hton.c 100 WString 4 @@ -455,8 +455,8 @@ WVList 0 103 MItem -28 -../../../../../lib/cmn/lda.c +29 +../../../../../lib/cmn/ipad.c 104 WString 4 @@ -473,8 +473,8 @@ WVList 0 107 MItem -29 -../../../../../lib/cmn/main.c +28 +../../../../../lib/cmn/lda.c 108 WString 4 @@ -491,8 +491,8 @@ WVList 0 111 MItem -33 -../../../../../lib/cmn/mbwc-str.c +29 +../../../../../lib/cmn/main.c 112 WString 4 @@ -509,8 +509,8 @@ WVList 0 115 MItem -29 -../../../../../lib/cmn/mbwc.c +33 +../../../../../lib/cmn/mbwc-str.c 116 WString 4 @@ -527,8 +527,8 @@ WVList 0 119 MItem -28 -../../../../../lib/cmn/mem.c +29 +../../../../../lib/cmn/mbwc.c 120 WString 4 @@ -545,8 +545,8 @@ WVList 0 123 MItem -29 -../../../../../lib/cmn/nwad.c +28 +../../../../../lib/cmn/mem.c 124 WString 4 @@ -563,8 +563,8 @@ WVList 0 127 MItem -29 -../../../../../lib/cmn/nwif.c +28 +../../../../../lib/cmn/mux.c 128 WString 4 @@ -582,7 +582,7 @@ WVList 131 MItem 29 -../../../../../lib/cmn/nwio.c +../../../../../lib/cmn/nwad.c 132 WString 4 @@ -599,8 +599,8 @@ WVList 0 135 MItem -28 -../../../../../lib/cmn/oht.c +29 +../../../../../lib/cmn/nwif.c 136 WString 4 @@ -617,8 +617,8 @@ WVList 0 139 MItem -28 -../../../../../lib/cmn/opt.c +29 +../../../../../lib/cmn/nwio.c 140 WString 4 @@ -635,8 +635,8 @@ WVList 0 143 MItem -38 -../../../../../lib/cmn/path-basename.c +28 +../../../../../lib/cmn/oht.c 144 WString 4 @@ -653,8 +653,8 @@ WVList 0 147 MItem -35 -../../../../../lib/cmn/path-canon.c +28 +../../../../../lib/cmn/opt.c 148 WString 4 @@ -671,8 +671,8 @@ WVList 0 151 MItem -28 -../../../../../lib/cmn/pio.c +38 +../../../../../lib/cmn/path-basename.c 152 WString 4 @@ -689,8 +689,8 @@ WVList 0 155 MItem -28 -../../../../../lib/cmn/pma.c +35 +../../../../../lib/cmn/path-canon.c 156 WString 4 @@ -708,7 +708,7 @@ WVList 159 MItem 28 -../../../../../lib/cmn/rbt.c +../../../../../lib/cmn/pio.c 160 WString 4 @@ -726,7 +726,7 @@ WVList 163 MItem 28 -../../../../../lib/cmn/rex.c +../../../../../lib/cmn/pma.c 164 WString 4 @@ -744,7 +744,7 @@ WVList 167 MItem 28 -../../../../../lib/cmn/sio.c +../../../../../lib/cmn/rbt.c 168 WString 4 @@ -762,7 +762,7 @@ WVList 171 MItem 28 -../../../../../lib/cmn/sll.c +../../../../../lib/cmn/rex.c 172 WString 4 @@ -779,8 +779,8 @@ WVList 0 175 MItem -29 -../../../../../lib/cmn/slmb.c +28 +../../../../../lib/cmn/sio.c 176 WString 4 @@ -797,8 +797,8 @@ WVList 0 179 MItem -30 -../../../../../lib/cmn/stdio.c +28 +../../../../../lib/cmn/sll.c 180 WString 4 @@ -815,8 +815,8 @@ WVList 0 183 MItem -32 -../../../../../lib/cmn/str-beg.c +29 +../../../../../lib/cmn/slmb.c 184 WString 4 @@ -833,8 +833,8 @@ WVList 0 187 MItem -32 -../../../../../lib/cmn/str-cat.c +30 +../../../../../lib/cmn/stdio.c 188 WString 4 @@ -852,7 +852,7 @@ WVList 191 MItem 32 -../../../../../lib/cmn/str-chr.c +../../../../../lib/cmn/str-beg.c 192 WString 4 @@ -870,7 +870,7 @@ WVList 195 MItem 32 -../../../../../lib/cmn/str-cmp.c +../../../../../lib/cmn/str-cat.c 196 WString 4 @@ -888,7 +888,7 @@ WVList 199 MItem 32 -../../../../../lib/cmn/str-cnv.c +../../../../../lib/cmn/str-chr.c 200 WString 4 @@ -906,7 +906,7 @@ WVList 203 MItem 32 -../../../../../lib/cmn/str-cpy.c +../../../../../lib/cmn/str-cmp.c 204 WString 4 @@ -924,7 +924,7 @@ WVList 207 MItem 32 -../../../../../lib/cmn/str-del.c +../../../../../lib/cmn/str-cnv.c 208 WString 4 @@ -942,7 +942,7 @@ WVList 211 MItem 32 -../../../../../lib/cmn/str-dup.c +../../../../../lib/cmn/str-cpy.c 212 WString 4 @@ -959,8 +959,8 @@ WVList 0 215 MItem -33 -../../../../../lib/cmn/str-dynm.c +32 +../../../../../lib/cmn/str-del.c 216 WString 4 @@ -977,8 +977,8 @@ WVList 0 219 MItem -33 -../../../../../lib/cmn/str-dynw.c +32 +../../../../../lib/cmn/str-dup.c 220 WString 4 @@ -995,8 +995,8 @@ WVList 0 223 MItem -32 -../../../../../lib/cmn/str-end.c +33 +../../../../../lib/cmn/str-dynm.c 224 WString 4 @@ -1014,7 +1014,7 @@ WVList 227 MItem 33 -../../../../../lib/cmn/str-excl.c +../../../../../lib/cmn/str-dynw.c 228 WString 4 @@ -1031,8 +1031,8 @@ WVList 0 231 MItem -33 -../../../../../lib/cmn/str-fcpy.c +32 +../../../../../lib/cmn/str-end.c 232 WString 4 @@ -1049,8 +1049,8 @@ WVList 0 235 MItem -34 -../../../../../lib/cmn/str-fnmat.c +33 +../../../../../lib/cmn/str-excl.c 236 WString 4 @@ -1068,7 +1068,7 @@ WVList 239 MItem 33 -../../../../../lib/cmn/str-incl.c +../../../../../lib/cmn/str-fcpy.c 240 WString 4 @@ -1085,8 +1085,8 @@ WVList 0 243 MItem -32 -../../../../../lib/cmn/str-len.c +34 +../../../../../lib/cmn/str-fnmat.c 244 WString 4 @@ -1103,8 +1103,8 @@ WVList 0 247 MItem -32 -../../../../../lib/cmn/str-pac.c +33 +../../../../../lib/cmn/str-incl.c 248 WString 4 @@ -1121,8 +1121,8 @@ WVList 0 251 MItem -33 -../../../../../lib/cmn/str-pbrk.c +32 +../../../../../lib/cmn/str-len.c 252 WString 4 @@ -1140,7 +1140,7 @@ WVList 255 MItem 32 -../../../../../lib/cmn/str-put.c +../../../../../lib/cmn/str-pac.c 256 WString 4 @@ -1157,8 +1157,8 @@ WVList 0 259 MItem -32 -../../../../../lib/cmn/str-rev.c +33 +../../../../../lib/cmn/str-pbrk.c 260 WString 4 @@ -1176,7 +1176,7 @@ WVList 263 MItem 32 -../../../../../lib/cmn/str-rot.c +../../../../../lib/cmn/str-put.c 264 WString 4 @@ -1194,7 +1194,7 @@ WVList 267 MItem 32 -../../../../../lib/cmn/str-set.c +../../../../../lib/cmn/str-rev.c 268 WString 4 @@ -1212,7 +1212,7 @@ WVList 271 MItem 32 -../../../../../lib/cmn/str-spl.c +../../../../../lib/cmn/str-rot.c 272 WString 4 @@ -1230,7 +1230,7 @@ WVList 275 MItem 32 -../../../../../lib/cmn/str-spn.c +../../../../../lib/cmn/str-set.c 276 WString 4 @@ -1248,7 +1248,7 @@ WVList 279 MItem 32 -../../../../../lib/cmn/str-str.c +../../../../../lib/cmn/str-spl.c 280 WString 4 @@ -1265,8 +1265,8 @@ WVList 0 283 MItem -34 -../../../../../lib/cmn/str-subst.c +32 +../../../../../lib/cmn/str-spn.c 284 WString 4 @@ -1284,7 +1284,7 @@ WVList 287 MItem 32 -../../../../../lib/cmn/str-tok.c +../../../../../lib/cmn/str-str.c 288 WString 4 @@ -1301,8 +1301,8 @@ WVList 0 291 MItem -32 -../../../../../lib/cmn/str-trm.c +34 +../../../../../lib/cmn/str-subst.c 292 WString 4 @@ -1319,8 +1319,8 @@ WVList 0 295 MItem -33 -../../../../../lib/cmn/str-word.c +32 +../../../../../lib/cmn/str-tok.c 296 WString 4 @@ -1337,8 +1337,8 @@ WVList 0 299 MItem -29 -../../../../../lib/cmn/task.c +32 +../../../../../lib/cmn/str-trm.c 300 WString 4 @@ -1355,8 +1355,8 @@ WVList 0 303 MItem -29 -../../../../../lib/cmn/time.c +33 +../../../../../lib/cmn/str-word.c 304 WString 4 @@ -1373,8 +1373,8 @@ WVList 0 307 MItem -28 -../../../../../lib/cmn/tio.c +29 +../../../../../lib/cmn/task.c 308 WString 4 @@ -1391,8 +1391,8 @@ WVList 0 311 MItem -32 -../../../../../lib/cmn/tre-ast.c +29 +../../../../../lib/cmn/time.c 312 WString 4 @@ -1409,8 +1409,8 @@ WVList 0 315 MItem -36 -../../../../../lib/cmn/tre-compile.c +28 +../../../../../lib/cmn/tio.c 316 WString 4 @@ -1427,8 +1427,8 @@ WVList 0 319 MItem -44 -../../../../../lib/cmn/tre-match-backtrack.c +32 +../../../../../lib/cmn/tre-ast.c 320 WString 4 @@ -1445,8 +1445,8 @@ WVList 0 323 MItem -43 -../../../../../lib/cmn/tre-match-parallel.c +36 +../../../../../lib/cmn/tre-compile.c 324 WString 4 @@ -1463,8 +1463,8 @@ WVList 0 327 MItem -34 -../../../../../lib/cmn/tre-parse.c +44 +../../../../../lib/cmn/tre-match-backtrack.c 328 WString 4 @@ -1481,8 +1481,8 @@ WVList 0 331 MItem -34 -../../../../../lib/cmn/tre-stack.c +43 +../../../../../lib/cmn/tre-match-parallel.c 332 WString 4 @@ -1499,8 +1499,8 @@ WVList 0 335 MItem -28 -../../../../../lib/cmn/tre.c +34 +../../../../../lib/cmn/tre-parse.c 336 WString 4 @@ -1517,8 +1517,8 @@ WVList 0 339 MItem -29 -../../../../../lib/cmn/utf8.c +34 +../../../../../lib/cmn/tre-stack.c 340 WString 4 @@ -1536,7 +1536,7 @@ WVList 343 MItem 28 -../../../../../lib/cmn/xma.c +../../../../../lib/cmn/tre.c 344 WString 4 @@ -1553,44 +1553,44 @@ WVList 0 347 MItem -3 -*.h +29 +../../../../../lib/cmn/utf8.c 348 WString -3 -NIL +4 +COBJ 349 WVList 0 350 WVList 0 --1 +11 1 1 0 351 MItem 28 -../../../../../lib/cmn/mem.h +../../../../../lib/cmn/xma.c 352 WString -3 -NIL +4 +COBJ 353 WVList 0 354 WVList 0 -347 +11 1 1 0 355 MItem -32 -../../../../../lib/cmn/syscall.h +3 +*.h 356 WString 3 @@ -1601,7 +1601,43 @@ WVList 358 WVList 0 -347 +-1 +1 +1 +0 +359 +MItem +28 +../../../../../lib/cmn/mem.h +360 +WString +3 +NIL +361 +WVList +0 +362 +WVList +0 +355 +1 +1 +0 +363 +MItem +32 +../../../../../lib/cmn/syscall.h +364 +WString +3 +NIL +365 +WVList +0 +366 +WVList +0 +355 1 1 0 diff --git a/qse/watcom/debug/dos32/mod/awk/awk-dir.tgt b/qse/watcom/debug/dos32/mod/awk/awk-dir.tgt new file mode 100755 index 00000000..8dd3256b --- /dev/null +++ b/qse/watcom/debug/dos32/mod/awk/awk-dir.tgt @@ -0,0 +1,185 @@ +40 +targetIdent +0 +MProject +1 +MComponent +0 +2 +WString +5 +CWDLL +3 +WString +5 +dx2do +1 +0 +1 +4 +MCommand +0 +5 +MCommand +0 +6 +MItem +11 +awk-dir.dll +7 +WString +5 +CWDLL +8 +WVList +4 +9 +MVState +10 +WString +5 +WLINK +11 +WString +28 +?????Library directories(;): +1 +12 +WString +27 +../../lib/cmn ../../lib/awk +0 +13 +MVState +14 +WString +5 +WLINK +15 +WString +18 +?????Libraries(,): +1 +16 +WString +13 +qsecmn qseawk +0 +17 +MVState +18 +WString +5 +WLINK +19 +WString +21 +dx???Export names(,): +1 +20 +WString +5 +load_ +0 +21 +MCState +22 +WString +5 +WLINK +23 +WString +24 +?????Eliminate dead code +1 +1 +24 +WVList +0 +-1 +1 +1 +0 +25 +WPickList +2 +26 +MItem +3 +*.c +27 +WString +4 +COBJ +28 +WVList +3 +29 +MVState +30 +WString +3 +WCC +31 +WString +25 +d????Include directories: +1 +32 +WString +37 +"$(%watcom)/h;../../../../../include" +0 +33 +MVState +34 +WString +3 +WCC +35 +WString +23 +?????Macro definitions: +1 +36 +WString +15 +QSE_BUILD_DEBUG +0 +37 +MCState +38 +WString +3 +WCC +39 +WString +33 +?????Disable stack depth checking +1 +1 +40 +WVList +0 +-1 +1 +1 +0 +41 +MItem +28 +../../../../../mod/awk/dir.c +42 +WString +4 +COBJ +43 +WVList +0 +44 +WVList +0 +26 +1 +1 +0 diff --git a/qse/watcom/debug/os2/lib/cmn/qsecmn.tgt b/qse/watcom/debug/os2/lib/cmn/qsecmn.tgt index dfe4984e..5220201e 100755 --- a/qse/watcom/debug/os2/lib/cmn/qsecmn.tgt +++ b/qse/watcom/debug/os2/lib/cmn/qsecmn.tgt @@ -42,7 +42,7 @@ WVList 0 10 WPickList -85 +87 11 MItem 3 @@ -234,7 +234,7 @@ WVList 54 MItem 28 -../../../../../lib/cmn/dll.c +../../../../../lib/cmn/dir.c 55 WString 4 @@ -252,7 +252,7 @@ WVList 58 MItem 28 -../../../../../lib/cmn/env.c +../../../../../lib/cmn/dll.c 59 WString 4 @@ -270,7 +270,7 @@ WVList 62 MItem 28 -../../../../../lib/cmn/fio.c +../../../../../lib/cmn/env.c 63 WString 4 @@ -288,7 +288,7 @@ WVList 66 MItem 28 -../../../../../lib/cmn/fma.c +../../../../../lib/cmn/fio.c 67 WString 4 @@ -306,7 +306,7 @@ WVList 70 MItem 28 -../../../../../lib/cmn/fmt.c +../../../../../lib/cmn/fma.c 71 WString 4 @@ -323,8 +323,8 @@ WVList 0 74 MItem -31 -../../../../../lib/cmn/fs-err.c +28 +../../../../../lib/cmn/fmt.c 75 WString 4 @@ -341,8 +341,8 @@ WVList 0 78 MItem -32 -../../../../../lib/cmn/fs-move.c +31 +../../../../../lib/cmn/fs-err.c 79 WString 4 @@ -359,8 +359,8 @@ WVList 0 82 MItem -27 -../../../../../lib/cmn/fs.c +32 +../../../../../lib/cmn/fs-move.c 83 WString 4 @@ -377,8 +377,8 @@ WVList 0 86 MItem -28 -../../../../../lib/cmn/gdl.c +27 +../../../../../lib/cmn/fs.c 87 WString 4 @@ -395,8 +395,8 @@ WVList 0 90 MItem -29 -../../../../../lib/cmn/glob.c +28 +../../../../../lib/cmn/gdl.c 91 WString 4 @@ -413,8 +413,8 @@ WVList 0 94 MItem -28 -../../../../../lib/cmn/htb.c +29 +../../../../../lib/cmn/glob.c 95 WString 4 @@ -431,8 +431,8 @@ WVList 0 98 MItem -29 -../../../../../lib/cmn/hton.c +28 +../../../../../lib/cmn/htb.c 99 WString 4 @@ -450,7 +450,7 @@ WVList 102 MItem 29 -../../../../../lib/cmn/ipad.c +../../../../../lib/cmn/hton.c 103 WString 4 @@ -467,8 +467,8 @@ WVList 0 106 MItem -28 -../../../../../lib/cmn/lda.c +29 +../../../../../lib/cmn/ipad.c 107 WString 4 @@ -485,8 +485,8 @@ WVList 0 110 MItem -29 -../../../../../lib/cmn/main.c +28 +../../../../../lib/cmn/lda.c 111 WString 4 @@ -503,8 +503,8 @@ WVList 0 114 MItem -33 -../../../../../lib/cmn/mbwc-str.c +29 +../../../../../lib/cmn/main.c 115 WString 4 @@ -521,8 +521,8 @@ WVList 0 118 MItem -29 -../../../../../lib/cmn/mbwc.c +33 +../../../../../lib/cmn/mbwc-str.c 119 WString 4 @@ -539,8 +539,8 @@ WVList 0 122 MItem -28 -../../../../../lib/cmn/mem.c +29 +../../../../../lib/cmn/mbwc.c 123 WString 4 @@ -557,8 +557,8 @@ WVList 0 126 MItem -29 -../../../../../lib/cmn/nwad.c +28 +../../../../../lib/cmn/mem.c 127 WString 4 @@ -575,8 +575,8 @@ WVList 0 130 MItem -29 -../../../../../lib/cmn/nwif.c +28 +../../../../../lib/cmn/mux.c 131 WString 4 @@ -594,7 +594,7 @@ WVList 134 MItem 29 -../../../../../lib/cmn/nwio.c +../../../../../lib/cmn/nwad.c 135 WString 4 @@ -611,8 +611,8 @@ WVList 0 138 MItem -28 -../../../../../lib/cmn/oht.c +29 +../../../../../lib/cmn/nwif.c 139 WString 4 @@ -629,8 +629,8 @@ WVList 0 142 MItem -28 -../../../../../lib/cmn/opt.c +29 +../../../../../lib/cmn/nwio.c 143 WString 4 @@ -647,8 +647,8 @@ WVList 0 146 MItem -38 -../../../../../lib/cmn/path-basename.c +28 +../../../../../lib/cmn/oht.c 147 WString 4 @@ -665,8 +665,8 @@ WVList 0 150 MItem -35 -../../../../../lib/cmn/path-canon.c +28 +../../../../../lib/cmn/opt.c 151 WString 4 @@ -683,8 +683,8 @@ WVList 0 154 MItem -28 -../../../../../lib/cmn/pio.c +38 +../../../../../lib/cmn/path-basename.c 155 WString 4 @@ -701,8 +701,8 @@ WVList 0 158 MItem -28 -../../../../../lib/cmn/pma.c +35 +../../../../../lib/cmn/path-canon.c 159 WString 4 @@ -720,7 +720,7 @@ WVList 162 MItem 28 -../../../../../lib/cmn/rbt.c +../../../../../lib/cmn/pio.c 163 WString 4 @@ -738,7 +738,7 @@ WVList 166 MItem 28 -../../../../../lib/cmn/rex.c +../../../../../lib/cmn/pma.c 167 WString 4 @@ -756,7 +756,7 @@ WVList 170 MItem 28 -../../../../../lib/cmn/sio.c +../../../../../lib/cmn/rbt.c 171 WString 4 @@ -774,7 +774,7 @@ WVList 174 MItem 28 -../../../../../lib/cmn/sll.c +../../../../../lib/cmn/rex.c 175 WString 4 @@ -791,8 +791,8 @@ WVList 0 178 MItem -29 -../../../../../lib/cmn/slmb.c +28 +../../../../../lib/cmn/sio.c 179 WString 4 @@ -809,8 +809,8 @@ WVList 0 182 MItem -30 -../../../../../lib/cmn/stdio.c +28 +../../../../../lib/cmn/sll.c 183 WString 4 @@ -827,8 +827,8 @@ WVList 0 186 MItem -32 -../../../../../lib/cmn/str-beg.c +29 +../../../../../lib/cmn/slmb.c 187 WString 4 @@ -845,8 +845,8 @@ WVList 0 190 MItem -32 -../../../../../lib/cmn/str-cat.c +30 +../../../../../lib/cmn/stdio.c 191 WString 4 @@ -864,7 +864,7 @@ WVList 194 MItem 32 -../../../../../lib/cmn/str-chr.c +../../../../../lib/cmn/str-beg.c 195 WString 4 @@ -882,7 +882,7 @@ WVList 198 MItem 32 -../../../../../lib/cmn/str-cmp.c +../../../../../lib/cmn/str-cat.c 199 WString 4 @@ -900,7 +900,7 @@ WVList 202 MItem 32 -../../../../../lib/cmn/str-cnv.c +../../../../../lib/cmn/str-chr.c 203 WString 4 @@ -918,7 +918,7 @@ WVList 206 MItem 32 -../../../../../lib/cmn/str-cpy.c +../../../../../lib/cmn/str-cmp.c 207 WString 4 @@ -936,7 +936,7 @@ WVList 210 MItem 32 -../../../../../lib/cmn/str-del.c +../../../../../lib/cmn/str-cnv.c 211 WString 4 @@ -954,7 +954,7 @@ WVList 214 MItem 32 -../../../../../lib/cmn/str-dup.c +../../../../../lib/cmn/str-cpy.c 215 WString 4 @@ -971,8 +971,8 @@ WVList 0 218 MItem -33 -../../../../../lib/cmn/str-dynm.c +32 +../../../../../lib/cmn/str-del.c 219 WString 4 @@ -989,8 +989,8 @@ WVList 0 222 MItem -33 -../../../../../lib/cmn/str-dynw.c +32 +../../../../../lib/cmn/str-dup.c 223 WString 4 @@ -1007,8 +1007,8 @@ WVList 0 226 MItem -32 -../../../../../lib/cmn/str-end.c +33 +../../../../../lib/cmn/str-dynm.c 227 WString 4 @@ -1026,7 +1026,7 @@ WVList 230 MItem 33 -../../../../../lib/cmn/str-excl.c +../../../../../lib/cmn/str-dynw.c 231 WString 4 @@ -1043,8 +1043,8 @@ WVList 0 234 MItem -33 -../../../../../lib/cmn/str-fcpy.c +32 +../../../../../lib/cmn/str-end.c 235 WString 4 @@ -1061,8 +1061,8 @@ WVList 0 238 MItem -34 -../../../../../lib/cmn/str-fnmat.c +33 +../../../../../lib/cmn/str-excl.c 239 WString 4 @@ -1080,7 +1080,7 @@ WVList 242 MItem 33 -../../../../../lib/cmn/str-incl.c +../../../../../lib/cmn/str-fcpy.c 243 WString 4 @@ -1097,8 +1097,8 @@ WVList 0 246 MItem -32 -../../../../../lib/cmn/str-len.c +34 +../../../../../lib/cmn/str-fnmat.c 247 WString 4 @@ -1115,8 +1115,8 @@ WVList 0 250 MItem -32 -../../../../../lib/cmn/str-pac.c +33 +../../../../../lib/cmn/str-incl.c 251 WString 4 @@ -1133,8 +1133,8 @@ WVList 0 254 MItem -33 -../../../../../lib/cmn/str-pbrk.c +32 +../../../../../lib/cmn/str-len.c 255 WString 4 @@ -1152,7 +1152,7 @@ WVList 258 MItem 32 -../../../../../lib/cmn/str-put.c +../../../../../lib/cmn/str-pac.c 259 WString 4 @@ -1169,8 +1169,8 @@ WVList 0 262 MItem -32 -../../../../../lib/cmn/str-rev.c +33 +../../../../../lib/cmn/str-pbrk.c 263 WString 4 @@ -1188,7 +1188,7 @@ WVList 266 MItem 32 -../../../../../lib/cmn/str-rot.c +../../../../../lib/cmn/str-put.c 267 WString 4 @@ -1206,7 +1206,7 @@ WVList 270 MItem 32 -../../../../../lib/cmn/str-set.c +../../../../../lib/cmn/str-rev.c 271 WString 4 @@ -1224,7 +1224,7 @@ WVList 274 MItem 32 -../../../../../lib/cmn/str-spl.c +../../../../../lib/cmn/str-rot.c 275 WString 4 @@ -1242,7 +1242,7 @@ WVList 278 MItem 32 -../../../../../lib/cmn/str-spn.c +../../../../../lib/cmn/str-set.c 279 WString 4 @@ -1260,7 +1260,7 @@ WVList 282 MItem 32 -../../../../../lib/cmn/str-str.c +../../../../../lib/cmn/str-spl.c 283 WString 4 @@ -1277,8 +1277,8 @@ WVList 0 286 MItem -34 -../../../../../lib/cmn/str-subst.c +32 +../../../../../lib/cmn/str-spn.c 287 WString 4 @@ -1296,7 +1296,7 @@ WVList 290 MItem 32 -../../../../../lib/cmn/str-tok.c +../../../../../lib/cmn/str-str.c 291 WString 4 @@ -1313,8 +1313,8 @@ WVList 0 294 MItem -32 -../../../../../lib/cmn/str-trm.c +34 +../../../../../lib/cmn/str-subst.c 295 WString 4 @@ -1331,8 +1331,8 @@ WVList 0 298 MItem -33 -../../../../../lib/cmn/str-word.c +32 +../../../../../lib/cmn/str-tok.c 299 WString 4 @@ -1349,8 +1349,8 @@ WVList 0 302 MItem -29 -../../../../../lib/cmn/task.c +32 +../../../../../lib/cmn/str-trm.c 303 WString 4 @@ -1367,8 +1367,8 @@ WVList 0 306 MItem -29 -../../../../../lib/cmn/time.c +33 +../../../../../lib/cmn/str-word.c 307 WString 4 @@ -1385,8 +1385,8 @@ WVList 0 310 MItem -28 -../../../../../lib/cmn/tio.c +29 +../../../../../lib/cmn/task.c 311 WString 4 @@ -1403,8 +1403,8 @@ WVList 0 314 MItem -32 -../../../../../lib/cmn/tre-ast.c +29 +../../../../../lib/cmn/time.c 315 WString 4 @@ -1421,8 +1421,8 @@ WVList 0 318 MItem -36 -../../../../../lib/cmn/tre-compile.c +28 +../../../../../lib/cmn/tio.c 319 WString 4 @@ -1439,8 +1439,8 @@ WVList 0 322 MItem -44 -../../../../../lib/cmn/tre-match-backtrack.c +32 +../../../../../lib/cmn/tre-ast.c 323 WString 4 @@ -1457,8 +1457,8 @@ WVList 0 326 MItem -43 -../../../../../lib/cmn/tre-match-parallel.c +36 +../../../../../lib/cmn/tre-compile.c 327 WString 4 @@ -1475,8 +1475,8 @@ WVList 0 330 MItem -34 -../../../../../lib/cmn/tre-parse.c +44 +../../../../../lib/cmn/tre-match-backtrack.c 331 WString 4 @@ -1493,8 +1493,8 @@ WVList 0 334 MItem -34 -../../../../../lib/cmn/tre-stack.c +43 +../../../../../lib/cmn/tre-match-parallel.c 335 WString 4 @@ -1511,8 +1511,8 @@ WVList 0 338 MItem -28 -../../../../../lib/cmn/tre.c +34 +../../../../../lib/cmn/tre-parse.c 339 WString 4 @@ -1529,8 +1529,8 @@ WVList 0 342 MItem -29 -../../../../../lib/cmn/utf8.c +34 +../../../../../lib/cmn/tre-stack.c 343 WString 4 @@ -1548,7 +1548,7 @@ WVList 346 MItem 28 -../../../../../lib/cmn/xma.c +../../../../../lib/cmn/tre.c 347 WString 4 @@ -1565,44 +1565,44 @@ WVList 0 350 MItem -3 -*.h +29 +../../../../../lib/cmn/utf8.c 351 WString -3 -NIL +4 +COBJ 352 WVList 0 353 WVList 0 --1 +11 1 1 0 354 MItem 28 -../../../../../lib/cmn/mem.h +../../../../../lib/cmn/xma.c 355 WString -3 -NIL +4 +COBJ 356 WVList 0 357 WVList 0 -350 +11 1 1 0 358 MItem -32 -../../../../../lib/cmn/syscall.h +3 +*.h 359 WString 3 @@ -1613,7 +1613,43 @@ WVList 361 WVList 0 -350 +-1 +1 +1 +0 +362 +MItem +28 +../../../../../lib/cmn/mem.h +363 +WString +3 +NIL +364 +WVList +0 +365 +WVList +0 +358 +1 +1 +0 +366 +MItem +32 +../../../../../lib/cmn/syscall.h +367 +WString +3 +NIL +368 +WVList +0 +369 +WVList +0 +358 1 1 0 diff --git a/qse/watcom/debug/os2/mod/awk/awk-dir.tgt b/qse/watcom/debug/os2/mod/awk/awk-dir.tgt new file mode 100755 index 00000000..4b989dd1 --- /dev/null +++ b/qse/watcom/debug/os2/mod/awk/awk-dir.tgt @@ -0,0 +1,185 @@ +40 +targetIdent +0 +MProject +1 +MComponent +0 +2 +WString +4 +ODLL +3 +WString +5 +o_2do +1 +0 +1 +4 +MCommand +0 +5 +MCommand +0 +6 +MItem +11 +awk-dir.dll +7 +WString +4 +ODLL +8 +WVList +4 +9 +MVState +10 +WString +5 +WLINK +11 +WString +28 +?????Library directories(;): +1 +12 +WString +27 +../../lib/cmn ../../lib/awk +0 +13 +MVState +14 +WString +5 +WLINK +15 +WString +18 +?????Libraries(,): +1 +16 +WString +13 +qsecmn qseawk +0 +17 +MVState +18 +WString +5 +WLINK +19 +WString +21 +o????Export names(,): +1 +20 +WString +5 +load_ +0 +21 +MCState +22 +WString +5 +WLINK +23 +WString +24 +?????Eliminate dead code +1 +1 +24 +WVList +0 +-1 +1 +1 +0 +25 +WPickList +2 +26 +MItem +3 +*.c +27 +WString +4 +COBJ +28 +WVList +3 +29 +MVState +30 +WString +3 +WCC +31 +WString +25 +o?2??Include directories: +1 +32 +WString +54 +"$(%watcom)/h;$(%watcom)/h/os2;../../../../../include" +0 +33 +MVState +34 +WString +3 +WCC +35 +WString +23 +?????Macro definitions: +1 +36 +WString +15 +QSE_BUILD_DEBUG +0 +37 +MCState +38 +WString +3 +WCC +39 +WString +33 +?????Disable stack depth checking +1 +1 +40 +WVList +0 +-1 +1 +1 +0 +41 +MItem +28 +../../../../../mod/awk/dir.c +42 +WString +4 +COBJ +43 +WVList +0 +44 +WVList +0 +26 +1 +1 +0 diff --git a/qse/watcom/debug/os2/mod/awk/awk-sys.tgt b/qse/watcom/debug/os2/mod/awk/awk-sys.tgt index 2048639d..033758a8 100755 --- a/qse/watcom/debug/os2/mod/awk/awk-sys.tgt +++ b/qse/watcom/debug/os2/mod/awk/awk-sys.tgt @@ -113,7 +113,7 @@ WString COBJ 28 WVList -1 +3 29 MVState 30 @@ -131,24 +131,52 @@ WString "$(%watcom)/h;$(%watcom)/h/os2;../../../../../include" 0 33 +MVState +34 +WString +3 +WCC +35 +WString +23 +?????Macro definitions: +1 +36 +WString +15 +QSE_BUILD_DEBUG +0 +37 +MCState +38 +WString +3 +WCC +39 +WString +33 +?????Disable stack depth checking +1 +1 +40 WVList 0 -1 1 1 0 -34 +41 MItem 28 ../../../../../mod/awk/sys.c -35 +42 WString 4 COBJ -36 +43 WVList 0 -37 +44 WVList 0 26 diff --git a/qse/watcom/qse.wpj b/qse/watcom/qse.wpj index 14802286..d3a9f739 100755 --- a/qse/watcom/qse.wpj +++ b/qse/watcom/qse.wpj @@ -4,8 +4,8 @@ projectIdent VpeMain 1 WRect -520 -120 +530 +106 9320 9680 2 @@ -16,7 +16,7 @@ MCommand 4 MCommand 0 -15 +17 5 WFileName 30 @@ -78,11 +78,19 @@ WFileName 29 debug/os2/mod/awk/awk-sys.tgt 20 -WVList -15 +WFileName +29 +debug/os2/mod/awk/awk-dir.tgt 21 -VComponent +WFileName +31 +debug/dos32/mod/awk/awk-dir.tgt 22 +WVList +17 +23 +VComponent +24 WRect 1070 2520 @@ -90,15 +98,15 @@ WRect 4240 1 0 -23 +25 WFileName 30 release/os2/lib/cmn/qsecmn.tgt 0 5 -24 +26 VComponent -25 +27 WRect 90 1240 @@ -106,15 +114,15 @@ WRect 4240 1 0 -26 +28 WFileName 30 release/os2/lib/sed/qsesed.tgt 0 0 -27 +29 VComponent -28 +30 WRect 2100 1400 @@ -122,31 +130,31 @@ WRect 4240 1 0 -29 +31 WFileName 30 release/os2/cmd/sed/qsesed.tgt 0 1 -30 +32 VComponent -31 +33 WRect -780 -480 +2830 +346 5700 4240 1 0 -32 +34 WFileName 28 debug/os2/lib/cmn/qsecmn.tgt -45 -48 -33 +0 +22 +35 VComponent -34 +36 WRect 1050 2360 @@ -154,31 +162,31 @@ WRect 4240 1 0 -35 +37 WFileName 28 debug/os2/lib/sed/qsesed.tgt 0 3 -36 +38 VComponent -37 +39 WRect 420 -333 +320 5700 4240 1 0 -38 +40 WFileName 28 debug/os2/lib/awk/qseawk.tgt 0 0 -39 +41 VComponent -40 +42 WRect 330 400 @@ -186,47 +194,47 @@ WRect 4240 1 0 -41 +43 WFileName 28 debug/os2/cmd/awk/qseawk.tgt 0 1 -42 +44 VComponent -43 +45 WRect 2670 40 5700 4240 -1 0 -44 +0 +46 WFileName 30 debug/dos32/lib/cmn/qsecmn.tgt 0 -0 -45 +2 +47 VComponent -46 +48 WRect 1620 1360 5700 4240 -1 0 -47 +0 +49 WFileName 30 debug/dos32/lib/awk/qseawk.tgt 0 0 -48 +50 VComponent -49 +51 WRect 0 200 @@ -234,15 +242,15 @@ WRect 4240 1 0 -50 +52 WFileName 30 debug/dos32/cmd/awk/qseawk.tgt 0 0 -51 +53 VComponent -52 +54 WRect 0 0 @@ -250,15 +258,15 @@ WRect 4240 1 0 -53 +55 WFileName 30 debug/dos32/lib/sed/qsesed.tgt 0 5 -54 +56 VComponent -55 +57 WRect 580 560 @@ -266,15 +274,15 @@ WRect 4240 1 0 -56 +58 WFileName 30 debug/dos32/cmd/sed/qsesed.tgt 0 1 -57 +59 VComponent -58 +60 WRect 0 0 @@ -282,15 +290,15 @@ WRect 4240 1 0 -59 +61 WFileName 28 debug/os2/cmd/sed/qsesed.tgt 0 1 -60 +62 VComponent -61 +63 WRect 2610 1080 @@ -298,26 +306,58 @@ WRect 4240 0 0 -62 +64 WFileName 31 debug/dos32/mod/awk/awk-sys.tgt 0 0 -63 +65 VComponent -64 +66 WRect -290 -280 +1140 +226 5700 4240 +1 0 -0 -65 +67 WFileName 29 debug/os2/mod/awk/awk-sys.tgt 0 0 -63 +68 +VComponent +69 +WRect +470 +3066 +5700 +4253 +1 +0 +70 +WFileName +29 +debug/os2/mod/awk/awk-dir.tgt +0 +1 +71 +VComponent +72 +WRect +580 +573 +5700 +4253 +0 +0 +73 +WFileName +31 +debug/dos32/mod/awk/awk-dir.tgt +0 +0 +71 diff --git a/qse/watcom/release/os2/lib/cmn/qsecmn.tgt b/qse/watcom/release/os2/lib/cmn/qsecmn.tgt index d636062c..d71b50f3 100755 --- a/qse/watcom/release/os2/lib/cmn/qsecmn.tgt +++ b/qse/watcom/release/os2/lib/cmn/qsecmn.tgt @@ -42,7 +42,7 @@ WVList 0 10 WPickList -83 +85 11 MItem 3 @@ -270,7 +270,7 @@ WVList 63 MItem 28 -../../../../../lib/cmn/dll.c +../../../../../lib/cmn/dir.c 64 WString 4 @@ -288,7 +288,7 @@ WVList 67 MItem 28 -../../../../../lib/cmn/fio.c +../../../../../lib/cmn/dll.c 68 WString 4 @@ -306,7 +306,7 @@ WVList 71 MItem 28 -../../../../../lib/cmn/fma.c +../../../../../lib/cmn/fio.c 72 WString 4 @@ -324,7 +324,7 @@ WVList 75 MItem 28 -../../../../../lib/cmn/fmt.c +../../../../../lib/cmn/fma.c 76 WString 4 @@ -341,8 +341,8 @@ WVList 0 79 MItem -31 -../../../../../lib/cmn/fs-err.c +28 +../../../../../lib/cmn/fmt.c 80 WString 4 @@ -359,8 +359,8 @@ WVList 0 83 MItem -32 -../../../../../lib/cmn/fs-move.c +31 +../../../../../lib/cmn/fs-err.c 84 WString 4 @@ -377,8 +377,8 @@ WVList 0 87 MItem -27 -../../../../../lib/cmn/fs.c +32 +../../../../../lib/cmn/fs-move.c 88 WString 4 @@ -395,8 +395,8 @@ WVList 0 91 MItem -28 -../../../../../lib/cmn/gdl.c +27 +../../../../../lib/cmn/fs.c 92 WString 4 @@ -413,8 +413,8 @@ WVList 0 95 MItem -29 -../../../../../lib/cmn/glob.c +28 +../../../../../lib/cmn/gdl.c 96 WString 4 @@ -431,8 +431,8 @@ WVList 0 99 MItem -28 -../../../../../lib/cmn/htb.c +29 +../../../../../lib/cmn/glob.c 100 WString 4 @@ -449,8 +449,8 @@ WVList 0 103 MItem -29 -../../../../../lib/cmn/ipad.c +28 +../../../../../lib/cmn/htb.c 104 WString 4 @@ -467,8 +467,8 @@ WVList 0 107 MItem -28 -../../../../../lib/cmn/lda.c +29 +../../../../../lib/cmn/ipad.c 108 WString 4 @@ -485,8 +485,8 @@ WVList 0 111 MItem -29 -../../../../../lib/cmn/main.c +28 +../../../../../lib/cmn/lda.c 112 WString 4 @@ -503,8 +503,8 @@ WVList 0 115 MItem -33 -../../../../../lib/cmn/mbwc-str.c +29 +../../../../../lib/cmn/main.c 116 WString 4 @@ -521,8 +521,8 @@ WVList 0 119 MItem -29 -../../../../../lib/cmn/mbwc.c +33 +../../../../../lib/cmn/mbwc-str.c 120 WString 4 @@ -539,8 +539,8 @@ WVList 0 123 MItem -28 -../../../../../lib/cmn/mem.c +29 +../../../../../lib/cmn/mbwc.c 124 WString 4 @@ -557,8 +557,8 @@ WVList 0 127 MItem -29 -../../../../../lib/cmn/nwad.c +28 +../../../../../lib/cmn/mem.c 128 WString 4 @@ -575,8 +575,8 @@ WVList 0 131 MItem -29 -../../../../../lib/cmn/nwif.c +28 +../../../../../lib/cmn/mux.c 132 WString 4 @@ -594,7 +594,7 @@ WVList 135 MItem 29 -../../../../../lib/cmn/nwio.c +../../../../../lib/cmn/nwad.c 136 WString 4 @@ -611,8 +611,8 @@ WVList 0 139 MItem -28 -../../../../../lib/cmn/oht.c +29 +../../../../../lib/cmn/nwif.c 140 WString 4 @@ -629,8 +629,8 @@ WVList 0 143 MItem -28 -../../../../../lib/cmn/opt.c +29 +../../../../../lib/cmn/nwio.c 144 WString 4 @@ -647,8 +647,8 @@ WVList 0 147 MItem -38 -../../../../../lib/cmn/path-basename.c +28 +../../../../../lib/cmn/oht.c 148 WString 4 @@ -665,8 +665,8 @@ WVList 0 151 MItem -35 -../../../../../lib/cmn/path-canon.c +28 +../../../../../lib/cmn/opt.c 152 WString 4 @@ -683,8 +683,8 @@ WVList 0 155 MItem -28 -../../../../../lib/cmn/pio.c +38 +../../../../../lib/cmn/path-basename.c 156 WString 4 @@ -701,8 +701,8 @@ WVList 0 159 MItem -28 -../../../../../lib/cmn/pma.c +35 +../../../../../lib/cmn/path-canon.c 160 WString 4 @@ -720,7 +720,7 @@ WVList 163 MItem 28 -../../../../../lib/cmn/rbt.c +../../../../../lib/cmn/pio.c 164 WString 4 @@ -738,7 +738,7 @@ WVList 167 MItem 28 -../../../../../lib/cmn/rex.c +../../../../../lib/cmn/pma.c 168 WString 4 @@ -756,7 +756,7 @@ WVList 171 MItem 28 -../../../../../lib/cmn/sio.c +../../../../../lib/cmn/rbt.c 172 WString 4 @@ -774,7 +774,7 @@ WVList 175 MItem 28 -../../../../../lib/cmn/sll.c +../../../../../lib/cmn/rex.c 176 WString 4 @@ -791,8 +791,8 @@ WVList 0 179 MItem -29 -../../../../../lib/cmn/slmb.c +28 +../../../../../lib/cmn/sio.c 180 WString 4 @@ -809,8 +809,8 @@ WVList 0 183 MItem -30 -../../../../../lib/cmn/stdio.c +28 +../../../../../lib/cmn/sll.c 184 WString 4 @@ -827,8 +827,8 @@ WVList 0 187 MItem -32 -../../../../../lib/cmn/str-beg.c +29 +../../../../../lib/cmn/slmb.c 188 WString 4 @@ -845,8 +845,8 @@ WVList 0 191 MItem -32 -../../../../../lib/cmn/str-cat.c +30 +../../../../../lib/cmn/stdio.c 192 WString 4 @@ -864,7 +864,7 @@ WVList 195 MItem 32 -../../../../../lib/cmn/str-chr.c +../../../../../lib/cmn/str-beg.c 196 WString 4 @@ -882,7 +882,7 @@ WVList 199 MItem 32 -../../../../../lib/cmn/str-cmp.c +../../../../../lib/cmn/str-cat.c 200 WString 4 @@ -900,7 +900,7 @@ WVList 203 MItem 32 -../../../../../lib/cmn/str-cnv.c +../../../../../lib/cmn/str-chr.c 204 WString 4 @@ -918,7 +918,7 @@ WVList 207 MItem 32 -../../../../../lib/cmn/str-cpy.c +../../../../../lib/cmn/str-cmp.c 208 WString 4 @@ -936,7 +936,7 @@ WVList 211 MItem 32 -../../../../../lib/cmn/str-del.c +../../../../../lib/cmn/str-cnv.c 212 WString 4 @@ -954,7 +954,7 @@ WVList 215 MItem 32 -../../../../../lib/cmn/str-dup.c +../../../../../lib/cmn/str-cpy.c 216 WString 4 @@ -971,8 +971,8 @@ WVList 0 219 MItem -33 -../../../../../lib/cmn/str-dynm.c +32 +../../../../../lib/cmn/str-del.c 220 WString 4 @@ -989,8 +989,8 @@ WVList 0 223 MItem -33 -../../../../../lib/cmn/str-dynw.c +32 +../../../../../lib/cmn/str-dup.c 224 WString 4 @@ -1007,8 +1007,8 @@ WVList 0 227 MItem -32 -../../../../../lib/cmn/str-end.c +33 +../../../../../lib/cmn/str-dynm.c 228 WString 4 @@ -1026,7 +1026,7 @@ WVList 231 MItem 33 -../../../../../lib/cmn/str-excl.c +../../../../../lib/cmn/str-dynw.c 232 WString 4 @@ -1043,8 +1043,8 @@ WVList 0 235 MItem -33 -../../../../../lib/cmn/str-fcpy.c +32 +../../../../../lib/cmn/str-end.c 236 WString 4 @@ -1061,8 +1061,8 @@ WVList 0 239 MItem -34 -../../../../../lib/cmn/str-fnmat.c +33 +../../../../../lib/cmn/str-excl.c 240 WString 4 @@ -1080,7 +1080,7 @@ WVList 243 MItem 33 -../../../../../lib/cmn/str-incl.c +../../../../../lib/cmn/str-fcpy.c 244 WString 4 @@ -1097,8 +1097,8 @@ WVList 0 247 MItem -32 -../../../../../lib/cmn/str-len.c +34 +../../../../../lib/cmn/str-fnmat.c 248 WString 4 @@ -1115,8 +1115,8 @@ WVList 0 251 MItem -32 -../../../../../lib/cmn/str-pac.c +33 +../../../../../lib/cmn/str-incl.c 252 WString 4 @@ -1133,8 +1133,8 @@ WVList 0 255 MItem -33 -../../../../../lib/cmn/str-pbrk.c +32 +../../../../../lib/cmn/str-len.c 256 WString 4 @@ -1152,7 +1152,7 @@ WVList 259 MItem 32 -../../../../../lib/cmn/str-put.c +../../../../../lib/cmn/str-pac.c 260 WString 4 @@ -1169,8 +1169,8 @@ WVList 0 263 MItem -32 -../../../../../lib/cmn/str-rev.c +33 +../../../../../lib/cmn/str-pbrk.c 264 WString 4 @@ -1188,7 +1188,7 @@ WVList 267 MItem 32 -../../../../../lib/cmn/str-rot.c +../../../../../lib/cmn/str-put.c 268 WString 4 @@ -1206,7 +1206,7 @@ WVList 271 MItem 32 -../../../../../lib/cmn/str-set.c +../../../../../lib/cmn/str-rev.c 272 WString 4 @@ -1224,7 +1224,7 @@ WVList 275 MItem 32 -../../../../../lib/cmn/str-spl.c +../../../../../lib/cmn/str-rot.c 276 WString 4 @@ -1242,7 +1242,7 @@ WVList 279 MItem 32 -../../../../../lib/cmn/str-spn.c +../../../../../lib/cmn/str-set.c 280 WString 4 @@ -1260,7 +1260,7 @@ WVList 283 MItem 32 -../../../../../lib/cmn/str-str.c +../../../../../lib/cmn/str-spl.c 284 WString 4 @@ -1277,8 +1277,8 @@ WVList 0 287 MItem -34 -../../../../../lib/cmn/str-subst.c +32 +../../../../../lib/cmn/str-spn.c 288 WString 4 @@ -1296,7 +1296,7 @@ WVList 291 MItem 32 -../../../../../lib/cmn/str-tok.c +../../../../../lib/cmn/str-str.c 292 WString 4 @@ -1313,8 +1313,8 @@ WVList 0 295 MItem -32 -../../../../../lib/cmn/str-trm.c +34 +../../../../../lib/cmn/str-subst.c 296 WString 4 @@ -1331,8 +1331,8 @@ WVList 0 299 MItem -33 -../../../../../lib/cmn/str-word.c +32 +../../../../../lib/cmn/str-tok.c 300 WString 4 @@ -1349,8 +1349,8 @@ WVList 0 303 MItem -29 -../../../../../lib/cmn/task.c +32 +../../../../../lib/cmn/str-trm.c 304 WString 4 @@ -1367,8 +1367,8 @@ WVList 0 307 MItem -29 -../../../../../lib/cmn/time.c +33 +../../../../../lib/cmn/str-word.c 308 WString 4 @@ -1385,8 +1385,8 @@ WVList 0 311 MItem -28 -../../../../../lib/cmn/tio.c +29 +../../../../../lib/cmn/task.c 312 WString 4 @@ -1403,8 +1403,8 @@ WVList 0 315 MItem -32 -../../../../../lib/cmn/tre-ast.c +29 +../../../../../lib/cmn/time.c 316 WString 4 @@ -1421,8 +1421,8 @@ WVList 0 319 MItem -36 -../../../../../lib/cmn/tre-compile.c +28 +../../../../../lib/cmn/tio.c 320 WString 4 @@ -1439,8 +1439,8 @@ WVList 0 323 MItem -44 -../../../../../lib/cmn/tre-match-backtrack.c +32 +../../../../../lib/cmn/tre-ast.c 324 WString 4 @@ -1457,8 +1457,8 @@ WVList 0 327 MItem -43 -../../../../../lib/cmn/tre-match-parallel.c +36 +../../../../../lib/cmn/tre-compile.c 328 WString 4 @@ -1475,8 +1475,8 @@ WVList 0 331 MItem -34 -../../../../../lib/cmn/tre-parse.c +44 +../../../../../lib/cmn/tre-match-backtrack.c 332 WString 4 @@ -1493,8 +1493,8 @@ WVList 0 335 MItem -34 -../../../../../lib/cmn/tre-stack.c +43 +../../../../../lib/cmn/tre-match-parallel.c 336 WString 4 @@ -1511,8 +1511,8 @@ WVList 0 339 MItem -28 -../../../../../lib/cmn/tre.c +34 +../../../../../lib/cmn/tre-parse.c 340 WString 4 @@ -1529,8 +1529,8 @@ WVList 0 343 MItem -29 -../../../../../lib/cmn/utf8.c +34 +../../../../../lib/cmn/tre-stack.c 344 WString 4 @@ -1548,7 +1548,7 @@ WVList 347 MItem 28 -../../../../../lib/cmn/xma.c +../../../../../lib/cmn/tre.c 348 WString 4 @@ -1565,44 +1565,44 @@ WVList 0 351 MItem -3 -*.h +29 +../../../../../lib/cmn/utf8.c 352 WString -3 -NIL +4 +COBJ 353 WVList 0 354 WVList 0 --1 +11 1 1 0 355 MItem 28 -../../../../../lib/cmn/mem.h +../../../../../lib/cmn/xma.c 356 WString -3 -NIL +4 +COBJ 357 WVList 0 358 WVList 0 -351 +11 1 1 0 359 MItem -32 -../../../../../lib/cmn/syscall.h +3 +*.h 360 WString 3 @@ -1613,7 +1613,43 @@ WVList 362 WVList 0 -351 +-1 +1 +1 +0 +363 +MItem +28 +../../../../../lib/cmn/mem.h +364 +WString +3 +NIL +365 +WVList +0 +366 +WVList +0 +359 +1 +1 +0 +367 +MItem +32 +../../../../../lib/cmn/syscall.h +368 +WString +3 +NIL +369 +WVList +0 +370 +WVList +0 +359 1 1 0