diff --git a/qse/lib/awk/mod-dir.c b/qse/lib/awk/mod-dir.c index eb8e8ae5..702b273f 100644 --- a/qse/lib/awk/mod-dir.c +++ b/qse/lib/awk/mod-dir.c @@ -18,6 +18,22 @@ License along with QSE. If not, see . */ + +/* +BEGIN { + x = dir::open ("/etc", dir::SORT); # dir::open ("/etc", 0) + if (x <= -1) { + print "cannot open"; + return -1; + } + + while (dir::read(x, q) > 0) { + print q; + } + dir::close (x); +} +*/ + #include "mod-dir.h" #include #include @@ -104,7 +120,7 @@ static int awk_err_to_errnum (qse_awk_errnum_t num) } } -static dir_node_t* new_dir_node (qse_awk_rtx_t* rtx, dir_list_t* list, const qse_char_t* path) +static dir_node_t* new_dir_node (qse_awk_rtx_t* rtx, dir_list_t* list, const qse_char_t* path, qse_awk_int_t flags) { /* create a new context node and append it to the list tail */ dir_node_t* node; @@ -123,7 +139,7 @@ static dir_node_t* new_dir_node (qse_awk_rtx_t* rtx, dir_list_t* list, const qse } } - node->ctx = qse_dir_open (qse_awk_rtx_getmmgr(rtx), 0, path, 0, &oe); + node->ctx = qse_dir_open (qse_awk_rtx_getmmgr(rtx), 0, path, flags, &oe); if (!node->ctx) { list->errnum = dir_err_to_errnum (oe); @@ -372,6 +388,7 @@ static int fnc_dir_open (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) qse_char_t* path; qse_awk_val_t* retv; qse_awk_val_t* a0; + qse_awk_int_t flags = 0; list = rtx_to_list (rtx, fi); @@ -379,13 +396,21 @@ static int fnc_dir_open (qse_awk_rtx_t* rtx, const qse_awk_fnc_info_t* fi) path = qse_awk_rtx_getvalstr (rtx, a0, QSE_NULL); if (path) { - node = new_dir_node (rtx, list, path); + if (qse_awk_rtx_getnargs (rtx) >= 2 && + qse_awk_rtx_valtoint (rtx, qse_awk_rtx_getarg (rtx, 1), &flags) <= -1) + { + qse_awk_rtx_freevalstr (rtx, a0, path); + goto oops; + } + + node = new_dir_node (rtx, list, path, flags); if (node) ret = node->id; else ret = -1; qse_awk_rtx_freevalstr (rtx, a0, path); } else { + oops: list->errnum = awk_err_to_errnum (qse_awk_rtx_geterrnum (rtx)); ret = -1; } @@ -498,16 +523,30 @@ struct fnctab_t qse_awk_mod_sym_fnc_t info; }; +typedef struct inttab_t inttab_t; +struct inttab_t +{ + const qse_char_t* name; + qse_awk_mod_sym_int_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("open"), { { 1, 2, QSE_NULL }, fnc_dir_open, 0 } }, { QSE_T("read"), { { 2, 2, QSE_T("vr") }, fnc_dir_read, 0 } }, { QSE_T("reset"), { { 2, 2, QSE_NULL }, fnc_dir_reset, 0 } }, }; +static inttab_t inttab[] = +{ + /* keep this table sorted for binary search in query(). */ + { QSE_T("SORT"), { QSE_DIR_SORT } } +}; + /* ------------------------------------------------------------------------ */ static int query (qse_awk_mod_t* mod, qse_awk_t* awk, const qse_char_t* name, qse_awk_mod_sym_t* sym) @@ -532,6 +571,22 @@ static int query (qse_awk_mod_t* mod, qse_awk_t* awk, const qse_char_t* name, qs } } + left = 0; right = QSE_COUNTOF(inttab) - 1; + while (left <= right) + { + mid = (left + right) / 2; + + n = qse_strcmp (inttab[mid].name, name); + if (n > 0) right = mid - 1; + else if (n < 0) left = mid + 1; + else + { + sym->type = QSE_AWK_MOD_INT; + sym->u.in = inttab[mid].info; + return 0; + } + } + ea.ptr = name; ea.len = qse_strlen(name); qse_awk_seterror (awk, QSE_AWK_ENOENT, &ea, QSE_NULL); diff --git a/qse/lib/cmn/dir.c b/qse/lib/cmn/dir.c index 57ba325f..7150e64a 100644 --- a/qse/lib/cmn/dir.c +++ b/qse/lib/cmn/dir.c @@ -695,6 +695,7 @@ static int read_dir_to_tbuf (qse_dir_t* dir, void** name) } #endif + return 1; /* ------------------------------------------------------------------- */ #endif diff --git a/qse/lib/cmn/nwad-skad.c b/qse/lib/cmn/nwad-skad.c index 65c442df..0a0d412b 100644 --- a/qse/lib/cmn/nwad-skad.c +++ b/qse/lib/cmn/nwad-skad.c @@ -47,6 +47,10 @@ #else # include # include + +# if defined(QSE_SIZEOF_STRUCT_SOCKADDR_IN6) && (QSE_SIZEOF_STRUCT_SOCKADDR_IN6 == 0) +# undef AF_INET6 +# endif #endif union sockaddr_t