Compare commits

...

8 Commits

Author SHA1 Message Date
hyung-hwan 3d8ce4dbcd removed redundant return in a void function
continuous-integration/drone/push Build is passing
2026-05-26 12:25:49 +09:00
hyung-hwan 0d313cf474 added some test cases to cover unary with relational ops
continuous-integration/drone/push Build is passing
refactored htb and rbt a bit
2026-05-25 11:56:22 +09:00
hyung-hwan 1ca8160e07 removed HAWK_FNMAT_IS_SEP()
continuous-integration/drone/push Build is passing
2026-05-24 19:47:39 +09:00
hyung-hwan 6e05998bc9 added sys::uname()
continuous-integration/drone/push Build is passing
2026-05-24 14:57:16 +09:00
hyung-hwan 0b900e7d0d minor fix for a picky compiler
continuous-integration/drone/push Build is passing
2026-05-24 14:55:59 +09:00
hyung-hwan fe643c1c48 added some text for ENVIRON, PIPECLOEXEC, etc
continuous-integration/drone/push Build is passing
2026-05-23 14:32:19 +09:00
hyung-hwan d36d1a8675 tweaked code for win32
continuous-integration/drone/push Build is passing
2026-05-23 13:11:26 +09:00
hyung-hwan edea38a631 refactoring code to support non-unix oses 2026-05-22 20:05:09 +09:00
37 changed files with 1253 additions and 363 deletions
+24
View File
@@ -723,6 +723,9 @@ Common built-ins:
- `NR`, `FNR`, `NF` - `NR`, `FNR`, `NF`
- `FS`, `RS`, `OFS`, `ORS` - `FS`, `RS`, `OFS`, `ORS`
- `FILENAME`, `OFILENAME` - `FILENAME`, `OFILENAME`
- `ARGC`, `ARGV`
- `ENVIRON`
- `PIPECLOEXEC`
Example: Example:
@@ -730,6 +733,27 @@ Example:
{ print NR, NF, $0 } { print NR, NF, $0 }
``` ```
Runtime-specific predefined variables:
| Name | Type | Description |
|------|------|-------------|
| `ARGC` | int | number of command-line arguments available via `ARGV` |
| `ARGV` | array | command-line argument vector. `ARGV[0]` is usually the program name |
| `ENVIRON` | map | process environment as a map. Values imported from the host environment may become `int`, `flt`, or `str` depending on content |
| `PIPECLOEXEC` | int/bool-like | controls whether file descriptors are opened with `CLOEXEC` when Hawk runs an external command for piping. `0` keeps the default inheritance behavior, `1` enables close-on-exec. This corresponds to `@pragma pipecloexec` |
`ENVIRON` affects child processes started by piping and `sys::system()`. Modifying it changes the environment passed to those children without changing the process-global environment of the embedding application.
Examples:
```awk
BEGIN {
print ARGC, ARGV[0]
print ENVIRON["HOME"]
PIPECLOEXEC = 1
}
```
## Built-in Functions ## Built-in Functions
Hawk includes awk built-ins (e.g., `length`, `substr`, `split`, `index`) plus extensions in modules (see below). Hawk includes awk built-ins (e.g., `length`, `substr`, `split`, `index`) plus extensions in modules (see below).
+9 -9
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: hawk 1.0.0\n" "Project-Id-Version: hawk 1.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-05-14 23:00+0900\n" "POT-Creation-Date: 2026-05-23 12:01+0900\n"
"PO-Revision-Date: 2026-03-28 16:29+0800\n" "PO-Revision-Date: 2026-03-28 16:29+0800\n"
"Last-Translator: <author@hawk>\n" "Last-Translator: <author@hawk>\n"
"Language-Team: Korean <translation-team-ko@hawk>\n" "Language-Team: Korean <translation-team-ko@hawk>\n"
@@ -101,7 +101,7 @@ msgstr "오류 허용성을 높임"
msgid "enable the extended call syntax" msgid "enable the extended call syntax"
msgstr "확장 호출 문법을 활성화" msgstr "확장 호출 문법을 활성화"
#: ../../bin/hawk.c:409 ../../bin/main.c:414 #: ../../bin/hawk.c:409 ../../bin/main.c:416
msgid "USAGE" msgid "USAGE"
msgstr "사용법" msgstr "사용법"
@@ -117,7 +117,7 @@ msgstr " "
msgid "[options] [ -- ] sourcestring [datafile]*" msgid "[options] [ -- ] sourcestring [datafile]*"
msgstr "[옵션] [ -- ] 소스문자열 [자료파일]*" msgstr "[옵션] [ -- ] 소스문자열 [자료파일]*"
#: ../../bin/hawk.c:411 ../../bin/main.c:415 #: ../../bin/hawk.c:411 ../../bin/main.c:417
msgid "Options as follows:" msgid "Options as follows:"
msgstr "옵션은 다음과 같습니다:" msgstr "옵션은 다음과 같습니다:"
@@ -214,15 +214,15 @@ msgstr " --classic 고전 모드로 실행"
msgid "Special mode switching options(must be specified first to take effect):" msgid "Special mode switching options(must be specified first to take effect):"
msgstr "모드 전환 옵션(처음에 지정해야 적용됨):" msgstr "모드 전환 옵션(처음에 지정해야 적용됨):"
#: ../../bin/hawk.c:446 ../../bin/main.c:418 #: ../../bin/hawk.c:446 ../../bin/main.c:420
msgid " --awk/--hawk switch to the awk mode(default)" msgid " --awk/--hawk switch to the awk mode(default)"
msgstr " --awk/--hawk awk 모드로 전환(기본값)" msgstr " --awk/--hawk awk 모드로 전환(기본값)"
#: ../../bin/hawk.c:447 ../../bin/main.c:419 #: ../../bin/hawk.c:447 ../../bin/main.c:421
msgid " --cut switch to the cut mode" msgid " --cut switch to the cut mode"
msgstr " --cut cut 모드로 전환" msgstr " --cut cut 모드로 전환"
#: ../../bin/hawk.c:448 ../../bin/main.c:420 #: ../../bin/hawk.c:448 ../../bin/main.c:422
msgid " --sed switch to the sed mode" msgid " --sed switch to the sed mode"
msgstr " --sed sed 모드로 전환" msgstr " --sed sed 모드로 전환"
@@ -246,15 +246,15 @@ msgstr "코드"
msgid "File " msgid "File "
msgstr "파일 " msgstr "파일 "
#: ../../bin/main.c:414 #: ../../bin/main.c:416
msgid "[options] [mode specific options and parameters]" msgid "[options] [mode specific options and parameters]"
msgstr "[옵션] [모드별 옵션과 인자]" msgstr "[옵션] [모드별 옵션과 인자]"
#: ../../bin/main.c:416 #: ../../bin/main.c:418
msgid " --usage print this message" msgid " --usage print this message"
msgstr " --usage 이 메시지를 출력" msgstr " --usage 이 메시지를 출력"
#: ../../bin/main.c:417 #: ../../bin/main.c:419
msgid " --version print version" msgid " --version print version"
msgstr " --version 버전을 출력" msgstr " --version 버전을 출력"
+9 -9
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: hawk 1.0.0\n" "Project-Id-Version: hawk 1.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-05-14 23:00+0900\n" "POT-Creation-Date: 2026-05-23 12:01+0900\n"
"PO-Revision-Date: 2026-03-28 17:00+0800\n" "PO-Revision-Date: 2026-03-28 17:00+0800\n"
"Last-Translator: <author@hawk>\n" "Last-Translator: <author@hawk>\n"
"Language-Team: Chinese (Simplified) <translation-team-zh_CN@hawk>\n" "Language-Team: Chinese (Simplified) <translation-team-zh_CN@hawk>\n"
@@ -101,7 +101,7 @@ msgstr "提高容错性"
msgid "enable the extended call syntax" msgid "enable the extended call syntax"
msgstr "启用扩展调用语法" msgstr "启用扩展调用语法"
#: ../../bin/hawk.c:409 ../../bin/main.c:414 #: ../../bin/hawk.c:409 ../../bin/main.c:416
msgid "USAGE" msgid "USAGE"
msgstr "用法" msgstr "用法"
@@ -117,7 +117,7 @@ msgstr " "
msgid "[options] [ -- ] sourcestring [datafile]*" msgid "[options] [ -- ] sourcestring [datafile]*"
msgstr "[选项] [ -- ] 源字符串 [数据文件]*" msgstr "[选项] [ -- ] 源字符串 [数据文件]*"
#: ../../bin/hawk.c:411 ../../bin/main.c:415 #: ../../bin/hawk.c:411 ../../bin/main.c:417
msgid "Options as follows:" msgid "Options as follows:"
msgstr "选项如下:" msgstr "选项如下:"
@@ -213,15 +213,15 @@ msgstr " --classic 以经典模式运行"
msgid "Special mode switching options(must be specified first to take effect):" msgid "Special mode switching options(must be specified first to take effect):"
msgstr "特殊模式切换选项(必须先指定才能生效):" msgstr "特殊模式切换选项(必须先指定才能生效):"
#: ../../bin/hawk.c:446 ../../bin/main.c:418 #: ../../bin/hawk.c:446 ../../bin/main.c:420
msgid " --awk/--hawk switch to the awk mode(default)" msgid " --awk/--hawk switch to the awk mode(default)"
msgstr " --awk/--hawk 切换到 awk 模式(默认)" msgstr " --awk/--hawk 切换到 awk 模式(默认)"
#: ../../bin/hawk.c:447 ../../bin/main.c:419 #: ../../bin/hawk.c:447 ../../bin/main.c:421
msgid " --cut switch to the cut mode" msgid " --cut switch to the cut mode"
msgstr " --cut 切换到 cut 模式" msgstr " --cut 切换到 cut 模式"
#: ../../bin/hawk.c:448 ../../bin/main.c:420 #: ../../bin/hawk.c:448 ../../bin/main.c:422
msgid " --sed switch to the sed mode" msgid " --sed switch to the sed mode"
msgstr " --sed 切换到 sed 模式" msgstr " --sed 切换到 sed 模式"
@@ -245,15 +245,15 @@ msgstr "代码"
msgid "File " msgid "File "
msgstr "文件 " msgstr "文件 "
#: ../../bin/main.c:414 #: ../../bin/main.c:416
msgid "[options] [mode specific options and parameters]" msgid "[options] [mode specific options and parameters]"
msgstr "[选项] [模式特定选项与参数]" msgstr "[选项] [模式特定选项与参数]"
#: ../../bin/main.c:416 #: ../../bin/main.c:418
msgid " --usage print this message" msgid " --usage print this message"
msgstr " --usage 显示此信息" msgstr " --usage 显示此信息"
#: ../../bin/main.c:417 #: ../../bin/main.c:419
msgid " --version print version" msgid " --version print version"
msgstr " --version 显示版本" msgstr " --version 显示版本"
+9 -9
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-05-14 23:00+0900\n" "POT-Creation-Date: 2026-05-23 12:01+0900\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -101,7 +101,7 @@ msgstr ""
msgid "enable the extended call syntax" msgid "enable the extended call syntax"
msgstr "" msgstr ""
#: ../../bin/hawk.c:409 ../../bin/main.c:414 #: ../../bin/hawk.c:409 ../../bin/main.c:416
msgid "USAGE" msgid "USAGE"
msgstr "" msgstr ""
@@ -117,7 +117,7 @@ msgstr ""
msgid "[options] [ -- ] sourcestring [datafile]*" msgid "[options] [ -- ] sourcestring [datafile]*"
msgstr "" msgstr ""
#: ../../bin/hawk.c:411 ../../bin/main.c:415 #: ../../bin/hawk.c:411 ../../bin/main.c:417
msgid "Options as follows:" msgid "Options as follows:"
msgstr "" msgstr ""
@@ -211,15 +211,15 @@ msgstr ""
msgid "Special mode switching options(must be specified first to take effect):" msgid "Special mode switching options(must be specified first to take effect):"
msgstr "" msgstr ""
#: ../../bin/hawk.c:446 ../../bin/main.c:418 #: ../../bin/hawk.c:446 ../../bin/main.c:420
msgid " --awk/--hawk switch to the awk mode(default)" msgid " --awk/--hawk switch to the awk mode(default)"
msgstr "" msgstr ""
#: ../../bin/hawk.c:447 ../../bin/main.c:419 #: ../../bin/hawk.c:447 ../../bin/main.c:421
msgid " --cut switch to the cut mode" msgid " --cut switch to the cut mode"
msgstr "" msgstr ""
#: ../../bin/hawk.c:448 ../../bin/main.c:420 #: ../../bin/hawk.c:448 ../../bin/main.c:422
msgid " --sed switch to the sed mode" msgid " --sed switch to the sed mode"
msgstr "" msgstr ""
@@ -243,15 +243,15 @@ msgstr ""
msgid "File " msgid "File "
msgstr "" msgstr ""
#: ../../bin/main.c:414 #: ../../bin/main.c:416
msgid "[options] [mode specific options and parameters]" msgid "[options] [mode specific options and parameters]"
msgstr "" msgstr ""
#: ../../bin/main.c:416 #: ../../bin/main.c:418
msgid " --usage print this message" msgid " --usage print this message"
msgstr "" msgstr ""
#: ../../bin/main.c:417 #: ../../bin/main.c:419
msgid " --version print version" msgid " --version print version"
msgstr "" msgstr ""
+2
View File
@@ -26,6 +26,7 @@
#include "main.h" #include "main.h"
#include <hawk.h> #include <hawk.h>
#include <hawk-fmt.h>
#include <hawk-glob.h> #include <hawk-glob.h>
#include <hawk-po.h> #include <hawk-po.h>
#include <hawk-xma.h> #include <hawk-xma.h>
@@ -36,6 +37,7 @@
#if defined(_WIN32) #if defined(_WIN32)
# include <windows.h> # include <windows.h>
# include <signal.h>
#elif defined(__OS2__) #elif defined(__OS2__)
# define INCL_ERRORS # define INCL_ERRORS
# include <os2.h> # include <os2.h>
+3 -2
View File
@@ -1456,11 +1456,11 @@ Hawk::Value::IndexIterator Hawk::Value::getNextIndex (Index* idx, const IndexIte
// Hawk::Run // Hawk::Run
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
Hawk::Run::Run (Hawk* hawk): hawk(hawk), rtx(HAWK_NULL), envp(HAWK_NULL), env_map(HAWK_NULL), env_map_rev(0) Hawk::Run::Run (Hawk* hawk): hawk(hawk), rtx(HAWK_NULL), envp(HAWK_NULL), env_map(HAWK_NULL), env_map_rev(0), env_type(HAWK_RTX_ENV_MK_BPP)
{ {
} }
Hawk::Run::Run (Hawk* hawk, hawk_rtx_t* rtx): hawk(hawk), rtx(rtx), envp(HAWK_NULL), env_map(HAWK_NULL), env_map_rev(0) Hawk::Run::Run (Hawk* hawk, hawk_rtx_t* rtx): hawk(hawk), rtx(rtx), envp(HAWK_NULL), env_map(HAWK_NULL), env_map_rev(0), env_type(HAWK_RTX_ENV_MK_BPP)
{ {
HAWK_ASSERT(this->rtx != HAWK_NULL); HAWK_ASSERT(this->rtx != HAWK_NULL);
} }
@@ -2159,6 +2159,7 @@ void Hawk::fini_runctx ()
this->runctx.envp = HAWK_NULL; this->runctx.envp = HAWK_NULL;
this->runctx.env_map = HAWK_NULL; this->runctx.env_map = HAWK_NULL;
this->runctx.env_map_rev = 0; this->runctx.env_map_rev = 0;
this->runctx.env_type = HAWK_RTX_ENV_MK_BPP;
} }
hawk_rtx_close(this->runctx.rtx); hawk_rtx_close(this->runctx.rtx);
+8 -1
View File
@@ -1342,11 +1342,17 @@ public:
return this->env_map_rev; return this->env_map_rev;
} }
void setEnvCache (void* envp, hawk_map_t* env_map, hawk_oow_t env_map_rev) hawk_rtx_env_mk_type_t getEnvType () const
{
return this->env_type;
}
void setEnvCache (void* envp, hawk_map_t* env_map, hawk_oow_t env_map_rev, hawk_rtx_env_mk_type_t env_type)
{ {
this->envp = envp; this->envp = envp;
this->env_map = env_map; this->env_map = env_map;
this->env_map_rev = env_map_rev; this->env_map_rev = env_map_rev;
this->env_type = env_type;
} }
protected: protected:
@@ -1356,6 +1362,7 @@ public:
void* envp; void* envp;
hawk_map_t* env_map; hawk_map_t* env_map;
hawk_oow_t env_map_rev; hawk_oow_t env_map_rev;
hawk_rtx_env_mk_type_t env_type;
}; };
/// ///
+32 -12
View File
@@ -34,21 +34,42 @@
#define IO_UFLAG_PIPE_IS_NWIO (((hawk_uint16_t)1) << 0) #define IO_UFLAG_PIPE_IS_NWIO (((hawk_uint16_t)1) << 0)
#define IO_UFLAG_CONSOLE_PENDING_NEXT (((hawk_uint16_t)1) << 1) #define IO_UFLAG_CONSOLE_PENDING_NEXT (((hawk_uint16_t)1) << 1)
// TODO: remove the following definitions and find a way to share the similar definitions in std.c #if defined(_WIN32)
#if defined(HAWK_ENABLE_LIBLTDL) # include <windows.h>
# include <tchar.h>
# if defined(HAWK_HAVE_CFG_H) && defined(HAWK_ENABLE_LIBLTDL)
# include <ltdl.h>
# define USE_LTDL # define USE_LTDL
#elif defined(HAVE_DLFCN_H) # endif
# define USE_DLFCN # include <io.h>
#elif defined(__OS2__)
# define INCL_DOSMODULEMGR
# define INCL_DOSPROCESS
# define INCL_DOSERRORS
# include <os2.h>
#elif defined(__DOS__)
/* nothing to include */
#else #else
# include "syscall.h"
# if defined(HAWK_ENABLE_LIBLTDL)
# include <ltdl.h>
# define USE_LTDL
# elif defined(HAVE_DLFCN_H)
# include <dlfcn.h>
# define USE_DLFCN
# else
# error UNSUPPORTED DYNAMIC LINKER # error UNSUPPORTED DYNAMIC LINKER
# endif
#endif #endif
#if defined(HAVE_CRT_EXTERNS_H) #if defined(_WIN32)
# define SYSTEM_ENVIRON _environ
#elif defined(HAVE_CRT_EXTERNS_H)
# include <crt_externs.h> /* MacOSX/darwin. _NSGetEnviron() */ # include <crt_externs.h> /* MacOSX/darwin. _NSGetEnviron() */
# define SYSTEM_ENVIRON (*(_NSGetEnviron())) # define SYSTEM_ENVIRON (*(_NSGetEnviron()))
#else #else
extern char** environ; extern char** environ;
# define SYSTEM_ENVIRON ::environ # define SYSTEM_ENVIRON environ
#endif #endif
///////////////////////////////// /////////////////////////////////
@@ -78,8 +99,6 @@ static void* rtx_env_maker (hawk_rtx_t* rtx, hawk_rtx_env_mk_type_t env_mk_type)
hawk_oow_t env_map_rev; hawk_oow_t env_map_rev;
int gbl_id; int gbl_id;
if (env_mk_type != HAWK_RTX_ENV_MK_BPP) return HAWK_NULL;
run = GET_STD_RXTN(rtx)->run; run = GET_STD_RXTN(rtx)->run;
if (HAWK_UNLIKELY(run == HAWK_NULL)) return HAWK_NULL; if (HAWK_UNLIKELY(run == HAWK_NULL)) return HAWK_NULL;
hawk = (HawkStd*)(Hawk*)*run; hawk = (HawkStd*)(Hawk*)*run;
@@ -103,16 +122,17 @@ static void* rtx_env_maker (hawk_rtx_t* rtx, hawk_rtx_env_mk_type_t env_mk_type)
env_map_rev = 0; env_map_rev = 0;
} }
if (!run->getEnvp() || run->getEnvMap() != env_map || if (!run->getEnvp() || run->getEnvType() != env_mk_type ||
run->getEnvMap() != env_map ||
(env_map && run->getEnvMapRev() != env_map_rev)) (env_map && run->getEnvMapRev() != env_map_rev))
{ {
hawk_bch_t** envp; void* envp;
envp = hawk_rtx_commit_environ(rtx, gbl_id); envp = hawk_rtx_commit_environ(rtx, gbl_id, env_mk_type);
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL; if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
if (run->getEnvp()) hawk_rtx_freemem(rtx, run->getEnvp()); if (run->getEnvp()) hawk_rtx_freemem(rtx, run->getEnvp());
run->setEnvCache(envp, env_map, env_map_rev); run->setEnvCache(envp, env_map, env_map_rev, env_mk_type);
} }
return run->getEnvp(); return run->getEnvp();
+25 -25
View File
@@ -255,9 +255,9 @@ static hawk_bch_t* mbs_to_mbuf (hawk_dir_t* dir, const hawk_bch_t* mbs, hawk_bec
} }
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) #if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
static hawk_bch_t* make_mbsdos_path (hawk_dir_t* dir, const hawk_bch_t* mpath) static hawk_bch_t* make_bcstr_path (hawk_dir_t* dir, const hawk_bch_t* mpath)
{ {
if (mpath[0] == '\0') if (mpath[0] == '\0') /* blank */
{ {
if (hawk_becs_cpy(&dir->mbuf, "*.*") == (hawk_oow_t)-1) return HAWK_NULL; if (hawk_becs_cpy(&dir->mbuf, "*.*") == (hawk_oow_t)-1) return HAWK_NULL;
} }
@@ -265,29 +265,29 @@ static hawk_bch_t* make_mbsdos_path (hawk_dir_t* dir, const hawk_bch_t* mpath)
{ {
hawk_oow_t len; hawk_oow_t len;
if ((len = hawk_becs_cpy(&dir->mbuf, mpath)) == (hawk_oow_t)-1 || if ((len = hawk_becs_cpy(&dir->mbuf, mpath)) == (hawk_oow_t)-1 ||
(!HAWK_ISPATHMBSEP(mpath[len - 1]) && (!HAWK_IS_PATH_SEP(mpath[len - 1]) && /* last letter is not a path sepearator */
!hawk_ismbsdrivecurpath(mpath) && !(len == 2 && HAWK_IS_PATH_DRIVE(mpath)) && /* isn't just a driver letter and colon (e.g. A:) */
hawk_becs_ccat(&dir->mbuf, '\\') == (hawk_oow_t)-1) || hawk_becs_ccat(&dir->mbuf, '\\') == (hawk_oow_t)-1 /* append a path separator */ ) ||
hawk_becs_cat(&dir->mbuf, "*.*") == (hawk_oow_t)-1) return HAWK_NULL; hawk_becs_cat(&dir->mbuf, "*.*") == (hawk_oow_t)-1) return HAWK_NULL;
} }
return HAWK_BECS_PTR(&dir->mbuf); return HAWK_BECS_PTR(&dir->mbuf);
} }
static hawk_uch_t* make_wcsdos_path (hawk_dir_t* dir, const hawk_uch_t* wpath) static hawk_uch_t* make_ucstr_path (hawk_dir_t* dir, const hawk_uch_t* wpath)
{ {
if (wpath[0] == HAWK_UT('\0')) if (wpath[0] == '\0')
{ {
if (hawk_uecs_cpy (&dir->wbuf, HAWK_UT("*.*")) == (hawk_oow_t)-1) return HAWK_NULL; if (hawk_uecs_cpy(&dir->wbuf, HAWK_UT("*.*")) == (hawk_oow_t)-1) return HAWK_NULL;
} }
else else
{ {
hawk_oow_t len; hawk_oow_t len;
if ((len = hawk_uecs_cpy (&dir->wbuf, wpath)) == (hawk_oow_t)-1 || if ((len = hawk_uecs_cpy(&dir->wbuf, wpath)) == (hawk_oow_t)-1 ||
(!HAWK_ISPATHWCSEP(wpath[len - 1]) && (!HAWK_IS_PATH_SEP(wpath[len - 1]) && /* last letter is not a path sepearator */
!hawk_iswcsdrivecurpath(wpath) && !(len == 2 && HAWK_IS_PATH_DRIVE(wpath)) && /* isn't just a driver letter and colon (e.g. A:) */
hawk_uecs_ccat (&dir->wbuf, HAWK_UT('\\')) == (hawk_oow_t)-1) || hawk_uecs_ccat(&dir->wbuf, HAWK_UT('\\')) == (hawk_oow_t)-1 /* append a path separator */ ) ||
hawk_uecs_cat (&dir->wbuf, HAWK_UT("*.*")) == (hawk_oow_t)-1) return HAWK_NULL; hawk_uecs_cat(&dir->wbuf, HAWK_UT("*.*")) == (hawk_oow_t)-1) return HAWK_NULL;
} }
return HAWK_UECS_PTR(&dir->wbuf); return HAWK_UECS_PTR(&dir->wbuf);
@@ -309,7 +309,7 @@ static int reset_to_path (hawk_dir_t* dir, const hawk_ooch_t* path)
{ {
hawk_bch_t* mptr; hawk_bch_t* mptr;
mptr = make_mbsdos_path(dir, (const hawk_bch_t*)path); mptr = make_bcstr_path(dir, (const hawk_bch_t*)path);
if (mptr == HAWK_NULL) return -1; if (mptr == HAWK_NULL) return -1;
#if defined(HAWK_OOCH_IS_BCH) #if defined(HAWK_OOCH_IS_BCH)
@@ -323,7 +323,7 @@ static int reset_to_path (hawk_dir_t* dir, const hawk_ooch_t* path)
hawk_uch_t* wptr; hawk_uch_t* wptr;
HAWK_ASSERT (dir->flags & HAWK_DIR_UPATH); HAWK_ASSERT (dir->flags & HAWK_DIR_UPATH);
wptr = make_wcsdos_path(dir, (const hawk_uch_t*)path); wptr = make_ucstr_path(dir, (const hawk_uch_t*)path);
if (wptr == HAWK_NULL) return -1; if (wptr == HAWK_NULL) return -1;
#if defined(HAWK_OOCH_IS_BCH) #if defined(HAWK_OOCH_IS_BCH)
@@ -363,14 +363,14 @@ static int reset_to_path (hawk_dir_t* dir, const hawk_ooch_t* path)
if (dir->flags & HAWK_DIR_BPATH) if (dir->flags & HAWK_DIR_BPATH)
{ {
mptr = make_mbsdos_path (dir, (const hawk_bch_t*)path); mptr = make_bcstr_path (dir, (const hawk_bch_t*)path);
} }
else else
{ {
hawk_uch_t* wptr; hawk_uch_t* wptr;
HAWK_ASSERT (dir->flags & HAWK_DIR_UPATH); HAWK_ASSERT (dir->flags & HAWK_DIR_UPATH);
wptr = make_wcsdos_path(dir, (const hawk_uch_t*)path); wptr = make_ucstr_path(dir, (const hawk_uch_t*)path);
if (wptr == HAWK_NULL) return -1; if (wptr == HAWK_NULL) return -1;
mptr = wcs_to_mbuf(dir, wptr, &dir->mbuf); mptr = wcs_to_mbuf(dir, wptr, &dir->mbuf);
} }
@@ -417,15 +417,15 @@ static int reset_to_path (hawk_dir_t* dir, const hawk_ooch_t* path)
if (dir->flags & HAWK_DIR_BPATH) if (dir->flags & HAWK_DIR_BPATH)
{ {
mptr = make_mbsdos_path(dir, (const hawk_bch_t*)path); mptr = make_bcstr_path(dir, (const hawk_bch_t*)path);
} }
else else
{ {
hawk_uch_t* wptr; hawk_uch_t* wptr;
HAWK_ASSERT (dir->flags & HAWK_DIR_UPATH); HAWK_ASSERT(dir->flags & HAWK_DIR_UPATH);
wptr = make_wcsdos_path(dir, (const hawk_uch_t*)path); wptr = make_ucstr_path(dir, (const hawk_uch_t*)path);
if (wptr == HAWK_NULL) return -1; if (wptr == HAWK_NULL) return -1;
mptr = wcs_to_mbuf(dir, wptr, &dir->mbuf); mptr = wcs_to_mbuf(dir, wptr, &dir->mbuf);
} }
@@ -456,7 +456,7 @@ static int reset_to_path (hawk_dir_t* dir, const hawk_ooch_t* path)
else else
{ {
const hawk_uch_t* wpath; const hawk_uch_t* wpath;
/*HAWK_ASSERT (dir->flags & HAWK_DIR_UPATH);*/ /*HAWK_ASSERT(dir->flags & HAWK_DIR_UPATH);*/
wpath = (const hawk_uch_t*)path; wpath = (const hawk_uch_t*)path;
if (wpath[0] == '\0') if (wpath[0] == '\0')
@@ -550,7 +550,7 @@ static int read_dir_to_buf (hawk_dir_t* dir, void** name)
} }
else else
{ {
HAWK_ASSERT (dir->flags & HAWK_DIR_UPATH); HAWK_ASSERT(dir->flags & HAWK_DIR_UPATH);
#if defined(HAWK_OOCH_IS_BCH) #if defined(HAWK_OOCH_IS_BCH)
if (mbs_to_wbuf(dir, dir->wfd.cFileName, &dir->wbuf) == HAWK_NULL) return -1; if (mbs_to_wbuf(dir, dir->wfd.cFileName, &dir->wbuf) == HAWK_NULL) return -1;
#else #else
@@ -607,7 +607,7 @@ static int read_dir_to_buf (hawk_dir_t* dir, void** name)
} }
else else
{ {
HAWK_ASSERT (dir->flags & HAWK_DIR_UPATH); HAWK_ASSERT(dir->flags & HAWK_DIR_UPATH);
if (mbs_to_wbuf (dir, dir->ffb.achName, &dir->wbuf) == HAWK_NULL) return -1; if (mbs_to_wbuf (dir, dir->ffb.achName, &dir->wbuf) == HAWK_NULL) return -1;
*name = HAWK_UECS_PTR(&dir->wbuf); *name = HAWK_UECS_PTR(&dir->wbuf);
} }
@@ -660,7 +660,7 @@ static int read_dir_to_buf (hawk_dir_t* dir, void** name)
} }
else else
{ {
HAWK_ASSERT (dir->flags & HAWK_DIR_UPATH); HAWK_ASSERT(dir->flags & HAWK_DIR_UPATH);
if (mbs_to_wbuf (dir, dir->f.name, &dir->wbuf) == HAWK_NULL) return -1; if (mbs_to_wbuf (dir, dir->f.name, &dir->wbuf) == HAWK_NULL) return -1;
*name = HAWK_UECS_PTR(&dir->wbuf); *name = HAWK_UECS_PTR(&dir->wbuf);
@@ -708,7 +708,7 @@ read:
} }
else else
{ {
/*HAWK_ASSERT (dir->flags & HAWK_DIR_UPATH);*/ /*HAWK_ASSERT(dir->flags & HAWK_DIR_UPATH);*/
if (mbs_to_wbuf(dir, de->d_name, &dir->wbuf) == HAWK_NULL) return -1; if (mbs_to_wbuf(dir, de->d_name, &dir->wbuf) == HAWK_NULL) return -1;
*name = HAWK_UECS_PTR(&dir->wbuf); *name = HAWK_UECS_PTR(&dir->wbuf);
} }
+15 -2
View File
@@ -34,8 +34,20 @@
#include <hawk-ecs.h> #include <hawk-ecs.h>
#include <hawk-dir.h> #include <hawk-dir.h>
#include <hawk-glob.h> #include <hawk-glob.h>
#include <hawk-utl.h>
#include "syscall.h" #if defined(_WIN32)
# include <windows.h>
#elif defined(__OS2__)
# define INCL_DOSERRORS
# define INCL_DOSFILEMGR
# include <os2.h>
#elif defined(__DOS__)
# include <errno.h>
# include <io.h>
#else
# include "syscall.h"
#endif
#define NO_RECURSION 1 #define NO_RECURSION 1
@@ -49,9 +61,10 @@ typedef enum segment_type_t segment_type_t;
#define IS_ESC(c) HAWK_FNMAT_IS_ESC(c) #define IS_ESC(c) HAWK_FNMAT_IS_ESC(c)
#define IS_SEP(c) HAWK_FNMAT_IS_SEP(c) #define IS_SEP(c) HAWK_IS_PATH_SEP(c)
#define IS_NIL(c) ((c) == '\0') #define IS_NIL(c) ((c) == '\0')
#define IS_SEP_OR_NIL(c) (IS_SEP(c) || IS_NIL(c)) #define IS_SEP_OR_NIL(c) (IS_SEP(c) || IS_NIL(c))
#define IS_DRIVE(c) HAWK_IS_PATH_DRIVE(c)
/* this macro only checks for top-level wild-cards among these. /* this macro only checks for top-level wild-cards among these.
* *, ?, [], !, - * *, ?, [], !, -
+15 -2
View File
@@ -34,8 +34,20 @@
#include <hawk-ecs.h> #include <hawk-ecs.h>
#include <hawk-dir.h> #include <hawk-dir.h>
#include <hawk-glob.h> #include <hawk-glob.h>
#include <hawk-utl.h>
#include "syscall.h" #if defined(_WIN32)
# include <windows.h>
#elif defined(__OS2__)
# define INCL_DOSERRORS
# define INCL_DOSFILEMGR
# include <os2.h>
#elif defined(__DOS__)
# include <errno.h>
# include <io.h>
#else
# include "syscall.h"
#endif
#define NO_RECURSION 1 #define NO_RECURSION 1
@@ -49,9 +61,10 @@ typedef enum segment_type_t segment_type_t;
#define IS_ESC(c) HAWK_FNMAT_IS_ESC(c) #define IS_ESC(c) HAWK_FNMAT_IS_ESC(c)
#define IS_SEP(c) HAWK_FNMAT_IS_SEP(c) #define IS_SEP(c) HAWK_IS_PATH_SEP(c)
#define IS_NIL(c) ((c) == '\0') #define IS_NIL(c) ((c) == '\0')
#define IS_SEP_OR_NIL(c) (IS_SEP(c) || IS_NIL(c)) #define IS_SEP_OR_NIL(c) (IS_SEP(c) || IS_NIL(c))
#define IS_DRIVE(c) HAWK_IS_PATH_DRIVE(c)
/* this macro only checks for top-level wild-cards among these. /* this macro only checks for top-level wild-cards among these.
* *, ?, [], !, - * *, ?, [], !, -
+2 -2
View File
@@ -510,7 +510,7 @@ HAWK_EXPORT hawk_htb_pair_t* hawk_htb_update (
* if (pair == HAWK_NULL) * if (pair == HAWK_NULL)
* { * {
* // no existing key for the key * // no existing key for the key
* return hawk_htb_allocpair (htb, kptr, klen, v->ptr, v->len); * return hawk_htb_allocpair(htb, kptr, klen, v->ptr, v->len);
* } * }
* else * else
* { * {
@@ -523,7 +523,7 @@ HAWK_EXPORT hawk_htb_pair_t* hawk_htb_update (
* *
* // allocate a new pair, but without filling the actual value. * // allocate a new pair, but without filling the actual value.
* // note vptr is given HAWK_NULL for that purpose * // note vptr is given HAWK_NULL for that purpose
* new_pair = hawk_htb_allocpair ( * new_pair = hawk_htb_allocpair(
* htb, kptr, klen, HAWK_NULL, HAWK_HTB_VLEN(pair) + 1 + v->len); * htb, kptr, klen, HAWK_NULL, HAWK_HTB_VLEN(pair) + 1 + v->len);
* if (new_pair == HAWK_NULL) return HAWK_NULL; * if (new_pair == HAWK_NULL) return HAWK_NULL;
* *
+1 -1
View File
@@ -124,7 +124,7 @@ enum hawk_pio_env_mk_type_t
{ {
HAWK_PIO_ENV_MK_BPP, /* P1 ... PN HAWK_NUL where P1 .. PN points to K=V */ HAWK_PIO_ENV_MK_BPP, /* P1 ... PN HAWK_NUL where P1 .. PN points to K=V */
HAWK_PIO_ENV_MK_BPN, /* K1=V\0K2=V\0\0 */ HAWK_PIO_ENV_MK_BPN, /* K1=V\0K2=V\0\0 */
HAWK_PIO_ENV_MK_UPP, HAWK_PIO_ENV_MK_UPN, /* K1=V\0K2=V\0\0 using hawk_uch_t */
}; };
typedef enum hawk_pio_env_mk_type_t hawk_pio_env_mk_type_t; typedef enum hawk_pio_env_mk_type_t hawk_pio_env_mk_type_t;
+3 -2
View File
@@ -724,9 +724,10 @@ void hawk_fini (hawk_t* hawk);
hawk_rbt_walk_t hawk_modtab_unload_module (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair, void* ctx); hawk_rbt_walk_t hawk_modtab_unload_module (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair, void* ctx);
int hawk_rtx_setnamedval (hawk_rtx_t* rtx, hawk_oow_t id, hawk_val_t* val); int hawk_rtx_setnamedval (hawk_rtx_t* rtx, hawk_oow_t id, hawk_val_t* val);
hawk_bch_t** hawk_rtx_commit_environ ( void* hawk_rtx_commit_environ (
hawk_rtx_t* rtx, hawk_rtx_t* rtx,
int gbl_id int gbl_id,
hawk_rtx_env_mk_type_t env_mk_type
); );
#if defined(__cplusplus) #if defined(__cplusplus)
-2
View File
@@ -72,10 +72,8 @@ enum hawk_fnmat_flag_t
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) #if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
/* i don't support escaping in these systems */ /* i don't support escaping in these systems */
# define HAWK_FNMAT_IS_ESC(c) (0) # define HAWK_FNMAT_IS_ESC(c) (0)
# define HAWK_FNMAT_IS_SEP(c) ((c) == '/' || (c) == '\\')
#else #else
# define HAWK_FNMAT_IS_ESC(c) ((c) == '\\') # define HAWK_FNMAT_IS_ESC(c) ((c) == '\\')
# define HAWK_FNMAT_IS_SEP(c) ((c) == '/')
#endif #endif
#if defined(__cplusplus) #if defined(__cplusplus)
-2
View File
@@ -72,10 +72,8 @@ enum hawk_fnmat_flag_t
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) #if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
/* i don't support escaping in these systems */ /* i don't support escaping in these systems */
# define HAWK_FNMAT_IS_ESC(c) (0) # define HAWK_FNMAT_IS_ESC(c) (0)
# define HAWK_FNMAT_IS_SEP(c) ((c) == '/' || (c) == '\\')
#else #else
# define HAWK_FNMAT_IS_ESC(c) ((c) == '\\') # define HAWK_FNMAT_IS_ESC(c) ((c) == '\\')
# define HAWK_FNMAT_IS_SEP(c) ((c) == '/')
#endif #endif
#if defined(__cplusplus) #if defined(__cplusplus)
+17
View File
@@ -320,6 +320,23 @@ typedef hawk_bch_t* (*hawk_subst_for_bcs_t) (
# define hawk_subst_for_oocs_t hawk_subst_for_bcs_t # define hawk_subst_for_oocs_t hawk_subst_for_bcs_t
#endif #endif
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
# define HAWK_IS_PATH_SEP(c) ((c) == '/' || (c) == '\\')
#else
# define HAWK_IS_PATH_SEP(c) ((c) == '/')
#endif
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
/* check if the first two letter is a drive specifier.
* useful on DOS/WIN/OS2 like system */
#define HAWK_IS_PATH_DRIVE(s) \
(((s[0] >= 'A' && s[0] <= 'Z') || \
(s[0] >= 'a' && s[0] <= 'z')) && \
s[1] == ':')
#endif
#if defined(__cplusplus) #if defined(__cplusplus)
extern "C" { extern "C" {
#endif #endif
+1 -1
View File
@@ -912,7 +912,7 @@ enum hawk_rtx_env_mk_type_t
{ {
HAWK_RTX_ENV_MK_BPP = HAWK_PIO_ENV_MK_BPP, HAWK_RTX_ENV_MK_BPP = HAWK_PIO_ENV_MK_BPP,
HAWK_RTX_ENV_MK_BPN = HAWK_PIO_ENV_MK_BPN, HAWK_RTX_ENV_MK_BPN = HAWK_PIO_ENV_MK_BPN,
HAWK_RTX_ENV_MK_UPP = HAWK_PIO_ENV_MK_UPP, HAWK_RTX_ENV_MK_UPN = HAWK_PIO_ENV_MK_UPN,
}; };
typedef enum hawk_rtx_env_mk_type_t hawk_rtx_env_mk_type_t; typedef enum hawk_rtx_env_mk_type_t hawk_rtx_env_mk_type_t;
+19 -9
View File
@@ -46,7 +46,7 @@
#define KTOB(htb,len) ((len) * (htb)->scale[HAWK_HTB_KEY]) #define KTOB(htb,len) ((len) * (htb)->scale[HAWK_HTB_KEY])
#define VTOB(htb,len) ((len) * (htb)->scale[HAWK_HTB_VAL]) #define VTOB(htb,len) ((len) * (htb)->scale[HAWK_HTB_VAL])
HAWK_INLINE pair_t* hawk_htb_allocpair (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen) static HAWK_INLINE_ALWAYS pair_t* alloc_pair (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen)
{ {
pair_t* n; pair_t* n;
copier_t kcop, vcop; copier_t kcop, vcop;
@@ -115,7 +115,7 @@ HAWK_INLINE pair_t* hawk_htb_allocpair (hawk_htb_t* htb, void* kptr, hawk_oow_t
return n; return n;
} }
HAWK_INLINE void hawk_htb_freepair (hawk_htb_t* htb, pair_t* pair) static HAWK_INLINE_ALWAYS void free_pair (hawk_htb_t* htb, pair_t* pair)
{ {
if (htb->style->freeer[HAWK_HTB_KEY] != HAWK_NULL) if (htb->style->freeer[HAWK_HTB_KEY] != HAWK_NULL)
htb->style->freeer[HAWK_HTB_KEY](htb, KPTR(pair), KLEN(pair)); htb->style->freeer[HAWK_HTB_KEY](htb, KPTR(pair), KLEN(pair));
@@ -124,7 +124,17 @@ HAWK_INLINE void hawk_htb_freepair (hawk_htb_t* htb, pair_t* pair)
hawk_gem_freemem(htb->gem, pair); hawk_gem_freemem(htb->gem, pair);
} }
static HAWK_INLINE pair_t* change_pair_val (hawk_htb_t* htb, pair_t* pair, void* vptr, hawk_oow_t vlen) pair_t* hawk_htb_allocpair (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen)
{
return alloc_pair(htb, kptr, klen, vptr, vlen);
}
void hawk_htb_freepair (hawk_htb_t* htb, pair_t* pair)
{
free_pair(htb, pair);
}
static HAWK_INLINE_ALWAYS pair_t* change_pair_val (hawk_htb_t* htb, pair_t* pair, void* vptr, hawk_oow_t vlen)
{ {
if (VPTR(pair) == vptr && VLEN(pair) == vlen) if (VPTR(pair) == vptr && VLEN(pair) == vlen)
{ {
@@ -157,9 +167,9 @@ static HAWK_INLINE pair_t* change_pair_val (hawk_htb_t* htb, pair_t* pair, void*
else else
{ {
/* need to reconstruct the pair */ /* need to reconstruct the pair */
pair_t* p = hawk_htb_allocpair(htb, KPTR(pair), KLEN(pair), vptr, vlen); pair_t* p = alloc_pair(htb, KPTR(pair), KLEN(pair), vptr, vlen);
if (HAWK_UNLIKELY(!p)) return HAWK_NULL; if (HAWK_UNLIKELY(!p)) return HAWK_NULL;
hawk_htb_freepair(htb, pair); free_pair(htb, pair);
return p; return p;
} }
} }
@@ -436,7 +446,7 @@ static HAWK_INLINE int reorganize (hawk_htb_t* htb)
#define ENSERT 3 #define ENSERT 3
#define INSERT 4 #define INSERT 4
static HAWK_INLINE pair_t* insert (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen, int opt) static HAWK_INLINE_ALWAYS pair_t* insert (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen, int opt)
{ {
pair_t* pair, * p, * prev, * next; pair_t* pair, * p, * prev, * next;
hawk_oow_t hc; hawk_oow_t hc;
@@ -507,7 +517,7 @@ static HAWK_INLINE pair_t* insert (hawk_htb_t* htb, void* kptr, hawk_oow_t klen,
HAWK_ASSERT(pair == HAWK_NULL); HAWK_ASSERT(pair == HAWK_NULL);
pair = hawk_htb_allocpair(htb, kptr, klen, vptr, vlen); pair = alloc_pair(htb, kptr, klen, vptr, vlen);
if (HAWK_UNLIKELY(!pair)) return HAWK_NULL; /* error */ if (HAWK_UNLIKELY(!pair)) return HAWK_NULL; /* error */
NEXT(pair) = htb->bucket[hc]; NEXT(pair) = htb->bucket[hc];
@@ -617,7 +627,7 @@ int hawk_htb_delete (hawk_htb_t* htb, const void* kptr, hawk_oow_t klen)
htb->bucket[hc] = NEXT(pair); htb->bucket[hc] = NEXT(pair);
else NEXT(prev) = NEXT(pair); else NEXT(prev) = NEXT(pair);
hawk_htb_freepair(htb, pair); free_pair(htb, pair);
htb->size--; htb->size--;
htb->rev++; htb->rev++;
@@ -645,7 +655,7 @@ void hawk_htb_clear (hawk_htb_t* htb)
while (pair) while (pair)
{ {
next = NEXT(pair); next = NEXT(pair);
hawk_htb_freepair(htb, pair); free_pair(htb, pair);
htb->size--; htb->size--;
pair = next; pair = next;
} }
+451 -22
View File
@@ -29,7 +29,10 @@
#if defined(_WIN32) #if defined(_WIN32)
# include <windows.h> # include <windows.h>
# include <io.h>
# include <fcntl.h>
# include <process.h> # include <process.h>
# include <tlhelp32.h>
# include <tchar.h> # include <tchar.h>
#elif defined(__OS2__) #elif defined(__OS2__)
# define INCL_DOSPROCESS # define INCL_DOSPROCESS
@@ -44,6 +47,7 @@
# endif # endif
# include "syscall.h" # include "syscall.h"
# include <sys/utsname.h>
# if defined(HAVE_SYS_EPOLL_H) # if defined(HAVE_SYS_EPOLL_H)
# include <sys/epoll.h> # include <sys/epoll.h>
# if defined(HAVE_EPOLL_CREATE) # if defined(HAVE_EPOLL_CREATE)
@@ -51,10 +55,12 @@
# endif # endif
# endif # endif
# include <termios.h>
# include <sys/socket.h> # include <sys/socket.h>
# define ENABLE_SYSLOG # define ENABLE_TERMIOS
# include <termios.h>
# define ENABLE_SYSLOG /* enable libc's openlog, closelog, syslog */
# include <syslog.h> # include <syslog.h>
#endif #endif
@@ -332,6 +338,42 @@ static void set_errmsg_on_sys_list (hawk_rtx_t* rtx, sys_list_t* sys_list, const
} }
} }
static const hawk_bch_t* get_machine_name_for_build (void)
{
#if defined(__x86_64__) || defined(_M_X64)
return "x86_64";
#elif defined(__i386__) || defined(_M_IX86)
return "x86";
#elif defined(__aarch64__) || defined(_M_ARM64)
return "aarch64";
#elif defined(__arm__) || defined(_M_ARM)
return "arm";
#elif defined(__powerpc64__) || defined(__ppc64__)
return "ppc64";
#elif defined(__powerpc__) || defined(__ppc__) || defined(_M_PPC)
return "ppc";
#elif defined(__mips64)
return "mips64";
#elif defined(__mips__)
return "mips";
#elif defined(__riscv) && (__riscv_xlen == 64)
return "riscv64";
#elif defined(__riscv) && (__riscv_xlen == 32)
return "riscv32";
#elif defined(__sparc64__)
return "sparc64";
#elif defined(__sparc__)
return "sparc";
#else
return "unknown";
#endif
}
static void copy_bcstr_to_oocstr (hawk_rtx_t* rtx, hawk_ooch_t* buf, hawk_oow_t capa, const hawk_bch_t* str)
{
hawk_rtx_fmttooocstr(rtx, buf, capa, HAWK_T("%hs"), str);
}
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
static sys_node_t* new_sys_node_fd (hawk_rtx_t* rtx, sys_list_t* list, int fd) static sys_node_t* new_sys_node_fd (hawk_rtx_t* rtx, sys_list_t* list, int fd)
@@ -1027,6 +1069,7 @@ static int fnc_fcntl (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
sys_node = get_sys_list_node_with_arg(rtx, sys_list, hawk_rtx_getarg(rtx, 0), SYS_NODE_DATA_TYPE_FILE | SYS_NODE_DATA_TYPE_SCK, &rx); sys_node = get_sys_list_node_with_arg(rtx, sys_list, hawk_rtx_getarg(rtx, 0), SYS_NODE_DATA_TYPE_FILE | SYS_NODE_DATA_TYPE_SCK, &rx);
if (sys_node) if (sys_node)
{ {
#if defined(F_GETFD) && defined(F_GETFL) && defined(F_SETFD) && defined(F_SETFL)
hawk_int_t cmd; hawk_int_t cmd;
if (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 1), &cmd) <= -1) if (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 1), &cmd) <= -1)
@@ -1068,6 +1111,9 @@ static int fnc_fcntl (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
rx = set_error_on_sys_list(rtx, sys_list, HAWK_EINVAL, HAWK_NULL); rx = set_error_on_sys_list(rtx, sys_list, HAWK_EINVAL, HAWK_NULL);
break; break;
} }
#else
rx = set_error_on_sys_list(rtx, sys_list, HAWK_ENOSUP, HAWK_NULL);
#endif
} }
done: done:
@@ -1096,6 +1142,7 @@ static int fnc_flock (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_int_t rx; hawk_int_t rx;
hawk_val_t* retv; hawk_val_t* retv;
#if defined(F_RDLCK) && defined(F_WRLCK) && defined(F_UNLCK) && defined(F_GETLK) && defined(F_SETLKW) && defined(F_SETLK)
HAWK_STATIC_ASSERT(FLOCK_GET != F_RDLCK); HAWK_STATIC_ASSERT(FLOCK_GET != F_RDLCK);
HAWK_STATIC_ASSERT(FLOCK_GET != F_WRLCK); HAWK_STATIC_ASSERT(FLOCK_GET != F_WRLCK);
HAWK_STATIC_ASSERT(FLOCK_GET != F_UNLCK); HAWK_STATIC_ASSERT(FLOCK_GET != F_UNLCK);
@@ -1154,6 +1201,10 @@ static int fnc_flock (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
rx = fl.l_type; /* for get, it returns the lock type */ rx = fl.l_type; /* for get, it returns the lock type */
} }
} }
#else
sys_list = rtx_to_sys_list(rtx, fi);
rx = set_error_on_sys_list(rtx, sys_list, HAWK_ENOSUP, HAWK_NULL);
#endif
done: done:
retv = hawk_rtx_makeintval_inline(rtx, rx); retv = hawk_rtx_makeintval_inline(rtx, rx);
@@ -1217,6 +1268,7 @@ static int fnc_tcgetattr (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) /* this is
sys_node = get_sys_list_node_with_arg(rtx, sys_list, hawk_rtx_getarg(rtx, 0), SYS_NODE_DATA_TYPE_FILE, &rx); sys_node = get_sys_list_node_with_arg(rtx, sys_list, hawk_rtx_getarg(rtx, 0), SYS_NODE_DATA_TYPE_FILE, &rx);
if (sys_node) if (sys_node)
{ {
#if defined(ENABLE_TERMIOS)
struct termios t; struct termios t;
hawk_val_map_data_t md[5]; hawk_val_map_data_t md[5];
hawk_bcs_t c_cc; hawk_bcs_t c_cc;
@@ -1275,6 +1327,9 @@ static int fnc_tcgetattr (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) /* this is
fail: fail:
rx = copy_error_to_sys_list(rtx, sys_list); rx = copy_error_to_sys_list(rtx, sys_list);
} }
#else
rx = set_error_on_sys_list(rtx, sys_list, HAWK_ENOSUP, HAWK_NULL);
#endif
} }
done: done:
@@ -1311,6 +1366,7 @@ static int fnc_tcsetattr (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) /* this is
sys_node = get_sys_list_node_with_arg(rtx, sys_list, hawk_rtx_getarg(rtx, 0), SYS_NODE_DATA_TYPE_FILE, &rx); sys_node = get_sys_list_node_with_arg(rtx, sys_list, hawk_rtx_getarg(rtx, 0), SYS_NODE_DATA_TYPE_FILE, &rx);
if (sys_node) if (sys_node)
{ {
#if defined(ENABLE_TERMIOS)
struct termios t; struct termios t;
hawk_map_itr_t itr; hawk_map_itr_t itr;
hawk_map_pair_t* pair; hawk_map_pair_t* pair;
@@ -1391,6 +1447,9 @@ static int fnc_tcsetattr (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) /* this is
set_error_on_sys_list_with_errno(rtx, sys_list, HAWK_NULL); set_error_on_sys_list_with_errno(rtx, sys_list, HAWK_NULL);
goto done; goto done;
} }
#else
rx = set_error_on_sys_list(rtx, sys_list, HAWK_ENOSUP, HAWK_NULL);
#endif
} }
done: done:
@@ -1423,6 +1482,7 @@ static int fnc_tcsetraw (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
sys_node = get_sys_list_node_with_arg(rtx, sys_list, hawk_rtx_getarg(rtx, 0), SYS_NODE_DATA_TYPE_FILE, &rx); sys_node = get_sys_list_node_with_arg(rtx, sys_list, hawk_rtx_getarg(rtx, 0), SYS_NODE_DATA_TYPE_FILE, &rx);
if (sys_node) if (sys_node)
{ {
#if defined(ENABLE_TERMIOS)
struct termios t; struct termios t;
rx = tcgetattr(sys_node->ctx.u.file.fd, &t); rx = tcgetattr(sys_node->ctx.u.file.fd, &t);
@@ -1441,6 +1501,9 @@ static int fnc_tcsetraw (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
set_error_on_sys_list_with_errno(rtx, sys_list, HAWK_NULL); set_error_on_sys_list_with_errno(rtx, sys_list, HAWK_NULL);
goto done; goto done;
} }
#else
rx = set_error_on_sys_list(rtx, sys_list, HAWK_ENOSUP, HAWK_NULL);
#endif
} }
done: done:
@@ -1462,6 +1525,7 @@ static int fnc_tcflush (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
sys_node = get_sys_list_node_with_arg(rtx, sys_list, hawk_rtx_getarg(rtx, 0), SYS_NODE_DATA_TYPE_FILE, &rx); sys_node = get_sys_list_node_with_arg(rtx, sys_list, hawk_rtx_getarg(rtx, 0), SYS_NODE_DATA_TYPE_FILE, &rx);
if (sys_node) if (sys_node)
{ {
#if defined(ENABLE_TERMIOS)
hawk_int_t qs; hawk_int_t qs;
if (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 1), &qs) <= -1) qs = TCIOFLUSH; if (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 1), &qs) <= -1) qs = TCIOFLUSH;
@@ -1472,6 +1536,9 @@ static int fnc_tcflush (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
set_error_on_sys_list_with_errno(rtx, sys_list, HAWK_NULL); set_error_on_sys_list_with_errno(rtx, sys_list, HAWK_NULL);
goto done; goto done;
} }
#else
rx = set_error_on_sys_list(rtx, sys_list, HAWK_ENOSUP, HAWK_NULL);
#endif
} }
done: done:
@@ -1580,6 +1647,9 @@ static int fnc_pipe (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
if (hawk_rtx_getnargs(rtx) >= 3 && (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 2), &flags) <= -1 || flags < 0)) flags = 0; if (hawk_rtx_getnargs(rtx) >= 3 && (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 2), &flags) <= -1 || flags < 0)) flags = 0;
#if defined(_WIN32)
rx = set_error_on_sys_list(rtx, sys_list, HAWK_ENOSUP, HAWK_NULL);
#else
#if defined(HAVE_PIPE2) #if defined(HAVE_PIPE2)
if (pipe2(fds, flags) >= 0) if (pipe2(fds, flags) >= 0)
#else #else
@@ -1655,6 +1725,7 @@ static int fnc_pipe (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{ {
rx = set_error_on_sys_list_with_errno(rtx, sys_list, HAWK_NULL); rx = set_error_on_sys_list_with_errno(rtx, sys_list, HAWK_NULL);
} }
#endif
hawk_rtx_setretval(rtx, hawk_rtx_makeintval_inline(rtx, rx)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval_inline(rtx, rx));
return 0; return 0;
@@ -1681,9 +1752,13 @@ static int fnc_fchown (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
} }
else else
{ {
#if defined(_WIN32)
rx = set_error_on_sys_list(rtx, sys_list, HAWK_ENOSUP, HAWK_NULL);
#else
rx = fchown(sys_node->ctx.u.file.fd, uid, gid) <= -1? rx = fchown(sys_node->ctx.u.file.fd, uid, gid) <= -1?
set_error_on_sys_list_with_errno(rtx, sys_list, HAWK_NULL): set_error_on_sys_list_with_errno(rtx, sys_list, HAWK_NULL):
ERRNUM_TO_RC(HAWK_ENOERR); ERRNUM_TO_RC(HAWK_ENOERR);
#endif
} }
} }
@@ -1709,9 +1784,13 @@ static int fnc_fchmod (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
} }
else else
{ {
#if defined(_WIN32)
rx = set_error_on_sys_list(rtx, sys_list, HAWK_ENOSUP, HAWK_NULL);
#else
rx = fchmod(sys_node->ctx.u.file.fd, mode) <= -1? rx = fchmod(sys_node->ctx.u.file.fd, mode) <= -1?
set_error_on_sys_list_with_errno(rtx, sys_list, HAWK_NULL): set_error_on_sys_list_with_errno(rtx, sys_list, HAWK_NULL):
ERRNUM_TO_RC(HAWK_ENOERR); ERRNUM_TO_RC(HAWK_ENOERR);
#endif
} }
} }
@@ -1922,8 +2001,8 @@ static int fnc_wait (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
sys_list_t* sys_list = rtx_to_sys_list(rtx, fi); sys_list_t* sys_list = rtx_to_sys_list(rtx, fi);
nargs = hawk_rtx_getnargs(rtx); nargs = hawk_rtx_getnargs(rtx);
if (nargs >= 3 && hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 2), &opts) <= -1) goto fail; if (nargs >= 3 && hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 2), &opts) <= -1) goto oops;
if (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 0), &pid) <= -1) goto fail; if (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 0), &pid) <= -1) goto oops;
#if defined(_WIN32) #if defined(_WIN32)
/* TOOD: implement this*/ /* TOOD: implement this*/
@@ -1951,16 +2030,12 @@ static int fnc_wait (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
int x; int x;
sv = hawk_rtx_makeintval_inline(rtx, status); sv = hawk_rtx_makeintval_inline(rtx, status);
if (!sv) goto fail; if (!sv) goto oops;
hawk_rtx_refupval_inline(rtx, sv); hawk_rtx_refupval_inline(rtx, sv);
x = hawk_rtx_setrefval(rtx, (hawk_val_ref_t*)hawk_rtx_getarg(rtx, 1), sv); x = hawk_rtx_setrefval(rtx, (hawk_val_ref_t*)hawk_rtx_getarg(rtx, 1), sv);
hawk_rtx_refdownval_inline(rtx, sv); hawk_rtx_refdownval_inline(rtx, sv);
if (x <= -1) if (x <= -1) goto oops;
{
fail:
rx = copy_error_to_sys_list(rtx, sys_list);
}
} }
} }
#endif #endif
@@ -1970,13 +2045,24 @@ static int fnc_wait (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
hawk_rtx_setretval(rtx, retv); hawk_rtx_setretval(rtx, retv);
return 0; return 0;
oops:
rx = copy_error_to_sys_list(rtx, sys_list);
retv = hawk_rtx_makeintval_inline(rtx, rx);
if (!retv) return -1;
hawk_rtx_setretval(rtx, retv);
return 0;
} }
static int fnc_wifexited (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) static int fnc_wifexited (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{ {
hawk_int_t wstatus; hawk_int_t wstatus;
int rv; int rv;
#if defined(WIFEXITED)
rv = (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 0), &wstatus) <= -1)? 0: !!WIFEXITED(wstatus); rv = (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 0), &wstatus) <= -1)? 0: !!WIFEXITED(wstatus);
#else
rv = 0;
#endif
hawk_rtx_setretval(rtx, hawk_rtx_makeintval_inline(rtx, rv)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval_inline(rtx, rv));
return 0; return 0;
} }
@@ -1987,7 +2073,11 @@ static int fnc_wexitstatus (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
int rv; int rv;
hawk_val_t* retv; hawk_val_t* retv;
#if defined(WEXITSTATUS)
rv = (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 0), &wstatus) <= -1)? -1: WEXITSTATUS(wstatus); rv = (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 0), &wstatus) <= -1)? -1: WEXITSTATUS(wstatus);
#else
rv = -1;
#endif
retv = hawk_rtx_makeintval_inline(rtx, rv); retv = hawk_rtx_makeintval_inline(rtx, rv);
if (!retv) return -1; if (!retv) return -1;
@@ -2000,7 +2090,11 @@ static int fnc_wifsignaled (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{ {
hawk_int_t wstatus; hawk_int_t wstatus;
int rv; int rv;
#if defined(WIFSIGNALED)
rv = (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 0), &wstatus) <= -1)? 0: !!WIFSIGNALED(wstatus); rv = (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 0), &wstatus) <= -1)? 0: !!WIFSIGNALED(wstatus);
#else
rv = 0;
#endif
hawk_rtx_setretval(rtx, hawk_rtx_makeintval_inline(rtx, rv)); hawk_rtx_setretval(rtx, hawk_rtx_makeintval_inline(rtx, rv));
return 0; return 0;
} }
@@ -2011,7 +2105,11 @@ static int fnc_wtermsig (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
int rv; int rv;
hawk_val_t* retv; hawk_val_t* retv;
#if defined(WTERMSIG)
rv = (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 0), &wstatus) <= -1)? -1: WTERMSIG(wstatus); rv = (hawk_rtx_valtoint_inline(rtx, hawk_rtx_getarg(rtx, 0), &wstatus) <= -1)? -1: WTERMSIG(wstatus);
#else
rv = -1;
#endif
retv = hawk_rtx_makeintval_inline(rtx, rv); retv = hawk_rtx_makeintval_inline(rtx, rv);
if (!retv) return -1; if (!retv) return -1;
@@ -2271,6 +2369,147 @@ static int fnc_gettid (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
return 0; return 0;
} }
static int fnc_uname (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{
sys_list_t* sys_list = rtx_to_sys_list(rtx, fi);
hawk_val_t* retv;
hawk_ooch_t sysname[64], nodename[256], release[64], version[128], machine[64];
#if defined(_WIN32)
OSVERSIONINFOEXA vi;
SYSTEM_INFO si;
DWORD nsz;
hawk_copy_oocstr(sysname, HAWK_COUNTOF(sysname), HAWK_T("Windows"));
hawk_copy_oocstr(nodename, HAWK_COUNTOF(nodename), HAWK_T("unknown"));
hawk_copy_oocstr(release, HAWK_COUNTOF(release), HAWK_T("unknown"));
hawk_copy_oocstr(version, HAWK_COUNTOF(version), HAWK_T("unknown"));
hawk_copy_oocstr(machine, HAWK_COUNTOF(machine), HAWK_T("unknown"));
nsz = HAWK_COUNTOF(nodename);
#if defined(HAWK_OOCH_IS_UCH)
GetComputerNameW((LPWSTR)nodename, &nsz);
#else
GetComputerNameA((LPSTR)nodename, &nsz);
#endif
HAWK_MEMSET(&vi, 0, HAWK_SIZEOF(vi));
vi.dwOSVersionInfoSize = HAWK_SIZEOF(vi);
if (GetVersionExA((OSVERSIONINFOA*)&vi))
{
hawk_rtx_fmttooocstr(rtx, release, HAWK_COUNTOF(release), HAWK_T("%u.%u.%u"),
(unsigned)vi.dwMajorVersion, (unsigned)vi.dwMinorVersion, (unsigned)vi.dwBuildNumber);
if (vi.szCSDVersion[0] != '\0')
{
hawk_rtx_fmttooocstr(rtx, version, HAWK_COUNTOF(version), HAWK_T("build %u %hs"),
(unsigned)vi.dwBuildNumber, vi.szCSDVersion);
}
else
{
hawk_rtx_fmttooocstr(rtx, version, HAWK_COUNTOF(version), HAWK_T("build %u"),
(unsigned)vi.dwBuildNumber);
}
}
GetSystemInfo(&si);
switch (si.wProcessorArchitecture)
{
case PROCESSOR_ARCHITECTURE_AMD64:
hawk_copy_oocstr(machine, HAWK_COUNTOF(machine), HAWK_T("x86_64"));
break;
case PROCESSOR_ARCHITECTURE_INTEL:
hawk_copy_oocstr(machine, HAWK_COUNTOF(machine), HAWK_T("x86"));
break;
case PROCESSOR_ARCHITECTURE_ARM:
hawk_copy_oocstr(machine, HAWK_COUNTOF(machine), HAWK_T("arm"));
break;
case PROCESSOR_ARCHITECTURE_ARM64:
hawk_copy_oocstr(machine, HAWK_COUNTOF(machine), HAWK_T("aarch64"));
break;
case PROCESSOR_ARCHITECTURE_IA64:
hawk_copy_oocstr(machine, HAWK_COUNTOF(machine), HAWK_T("ia64"));
break;
default:
copy_bcstr_to_oocstr(rtx, machine, HAWK_COUNTOF(machine), get_machine_name_for_build());
break;
}
#elif defined(__OS2__)
hawk_copy_oocstr(sysname, HAWK_COUNTOF(sysname), HAWK_T("OS/2"));
hawk_copy_oocstr(nodename, HAWK_COUNTOF(nodename), HAWK_T("unknown"));
hawk_copy_oocstr(release, HAWK_COUNTOF(release), HAWK_T("unknown"));
hawk_copy_oocstr(version, HAWK_COUNTOF(version), HAWK_T("unknown"));
copy_bcstr_to_oocstr(rtx, machine, HAWK_COUNTOF(machine), get_machine_name_for_build());
#elif defined(__DOS__)
hawk_copy_oocstr(sysname, HAWK_COUNTOF(sysname), HAWK_T("DOS"));
hawk_copy_oocstr(nodename, HAWK_COUNTOF(nodename), HAWK_T("unknown"));
hawk_copy_oocstr(release, HAWK_COUNTOF(release), HAWK_T("unknown"));
hawk_copy_oocstr(version, HAWK_COUNTOF(version), HAWK_T("unknown"));
copy_bcstr_to_oocstr(rtx, machine, HAWK_COUNTOF(machine), get_machine_name_for_build());
#else
struct utsname u;
if (uname(&u) <= -1)
{
hawk_copy_oocstr(sysname, HAWK_COUNTOF(sysname), HAWK_T("Linux/Unix"));
hawk_copy_oocstr(nodename, HAWK_COUNTOF(nodename), HAWK_T("unknown"));
hawk_copy_oocstr(release, HAWK_COUNTOF(release), HAWK_T("unknown"));
hawk_copy_oocstr(version, HAWK_COUNTOF(version), HAWK_T("unknown"));
copy_bcstr_to_oocstr(rtx, machine, HAWK_COUNTOF(machine), get_machine_name_for_build());
}
else
{
copy_bcstr_to_oocstr(rtx, sysname, HAWK_COUNTOF(sysname), (const hawk_bch_t*)u.sysname);
copy_bcstr_to_oocstr(rtx, nodename, HAWK_COUNTOF(nodename), (const hawk_bch_t*)u.nodename);
copy_bcstr_to_oocstr(rtx, release, HAWK_COUNTOF(release), (const hawk_bch_t*)u.release);
copy_bcstr_to_oocstr(rtx, version, HAWK_COUNTOF(version), (const hawk_bch_t*)u.version);
copy_bcstr_to_oocstr(rtx, machine, HAWK_COUNTOF(machine), (const hawk_bch_t*)u.machine);
}
#endif
{
hawk_val_map_data_t md[5];
HAWK_MEMSET(md, 0, HAWK_SIZEOF(md));
md[0].key.ptr = HAWK_T("sysname");
md[0].key.len = 7;
md[0].type = HAWK_VAL_MAP_DATA_OOCSTR;
md[0].vptr = sysname;
md[1].key.ptr = HAWK_T("nodename");
md[1].key.len = 8;
md[1].type = HAWK_VAL_MAP_DATA_OOCSTR;
md[1].vptr = nodename;
md[2].key.ptr = HAWK_T("release");
md[2].key.len = 7;
md[2].type = HAWK_VAL_MAP_DATA_OOCSTR;
md[2].vptr = release;
md[3].key.ptr = HAWK_T("version");
md[3].key.len = 7;
md[3].type = HAWK_VAL_MAP_DATA_OOCSTR;
md[3].vptr = version;
md[4].key.ptr = HAWK_T("machine");
md[4].key.len = 7;
md[4].type = HAWK_VAL_MAP_DATA_OOCSTR;
md[4].vptr = machine;
retv = hawk_rtx_makemapvalwithdata(rtx, md, HAWK_COUNTOF(md));
if (HAWK_UNLIKELY(!retv))
{
copy_error_to_sys_list(rtx, sys_list);
return -1;
}
}
hawk_rtx_setretval(rtx, retv);
return 0;
}
static int fnc_getppid (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi) static int fnc_getppid (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{ {
hawk_int_t rx; hawk_int_t rx;
@@ -2282,7 +2521,7 @@ static int fnc_getppid (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
HANDLE ps; HANDLE ps;
PROCESSENTRY32 p; PROCESSENTRY32 p;
pid = GetCurrentPorcessId(); pid = GetCurrentProcessId();
ps = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); ps = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (ps == INVALID_HANDLE_VALUE) if (ps == INVALID_HANDLE_VALUE)
{ {
@@ -2292,7 +2531,7 @@ static int fnc_getppid (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{ {
rx = set_error_on_sys_list(rtx, sys_list, HAWK_ENOENT, HAWK_NULL); rx = set_error_on_sys_list(rtx, sys_list, HAWK_ENOENT, HAWK_NULL);
p.dwSize = HAWK_SZIEOF(p); p.dwSize = HAWK_SIZEOF(p);
if (Process32First(ps, &p)) if (Process32First(ps, &p))
{ {
do do
@@ -2705,7 +2944,7 @@ static int fnc_strftime (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
#if defined(HAVE_GMTIME_R) #if defined(HAVE_GMTIME_R)
tmx = gmtime_r(&t, &tm); tmx = gmtime_r(&t, &tm);
#else #else
tmx = gmtime(&t.sec); tmx = gmtime(&t);
#endif #endif
} }
else else
@@ -2714,7 +2953,7 @@ static int fnc_strftime (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
#if defined(HAVE_LOCALTIME_R) #if defined(HAVE_LOCALTIME_R)
tmx = localtime_r(&t, &tm); tmx = localtime_r(&t, &tm);
#else #else
tmx = localtime(&t.sec); tmx = localtime(&t);
#endif #endif
} }
@@ -3035,7 +3274,7 @@ static int fnc_system (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
0, 0,
str, str,
HAWK_PIO_SHELL | HAWK_PIO_NOCLOEXEC, HAWK_PIO_SHELL | HAWK_PIO_NOCLOEXEC,
(rtx->rio.env_mk? pio_env_maker: HAWK_NULL), (rtx->rio.env_mk? pio_env_maker: (hawk_pio_env_mk_t)HAWK_NULL),
rtx rtx
); );
@@ -4412,17 +4651,25 @@ static int fnc_accept (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
#if defined(HAVE_ACCEPT4) #if defined(HAVE_ACCEPT4)
/* nothing to do */ /* nothing to do */
#else #else
#if defined(F_GETFD)
fd_flags = fcntl(fd, F_GETFD, 0); fd_flags = fcntl(fd, F_GETFD, 0);
if (fd_flags >= 0) if (fd_flags >= 0)
{ {
#if defined(FD_CLOEXEC) && defined(SOCK_CLOEXEC) #if defined(FD_CLOEXEC) && defined(SOCK_CLOEXEC)
if (flags & SOCK_CLOEXEC) fd_flags |= FD_CLOEXEC; if (flags & SOCK_CLOEXEC) fd_flags |= FD_CLOEXEC;
#endif #endif
#if defined(O_NONBLOCK) && defined(SOCK_NONBLOCK) #if defined(F_SETFD)
if (flags & SOCK_NONBLOCK) fd_flags |= O_NONBLOCK;
#endif
fcntl(fd, F_SETFD, fd_flags); fcntl(fd, F_SETFD, fd_flags);
#endif
} }
#endif
#if defined(F_GETFL) && defined(F_SETFL) && defined(O_NONBLOCK) && defined(SOCK_NONBLOCK)
if (flags & SOCK_NONBLOCK)
{
fd_flags = fcntl(fd, F_GETFL, 0);
if (fd_flags >= 0) fcntl(fd, F_SETFL, fd_flags | O_NONBLOCK);
}
#endif
#endif #endif
if (hawk_rtx_getnargs(rtx) >= 3) if (hawk_rtx_getnargs(rtx) >= 3)
@@ -4556,7 +4803,7 @@ you can specify the remote:// with /dev/log or @/dev/log.
*/ */
static void open_remote_log_socket (hawk_rtx_t* rtx, rtx_data_t* rdp) static void open_remote_log_socket (hawk_rtx_t* rtx, rtx_data_t* rdp)
{ {
int sck, flags; int sck;
int domain = hawk_skad_get_family(&rdp->log.skad); int domain = hawk_skad_get_family(&rdp->log.skad);
int type = SOCK_DGRAM; int type = SOCK_DGRAM;
@@ -4586,15 +4833,32 @@ open_socket:
#endif #endif
} }
#if defined(F_GETFD)
{
int flags;
flags = fcntl(sck, F_GETFD, 0); flags = fcntl(sck, F_GETFD, 0);
if (flags <= -1) return; if (flags <= -1) return;
#if defined(FD_CLOEXEC) #if defined(FD_CLOEXEC)
flags |= FD_CLOEXEC; flags |= FD_CLOEXEC;
#endif #endif
#if defined(F_SETFD)
if (fcntl(sck, F_SETFD, flags) <= -1) return;
#endif
}
#endif
#if defined(F_GETFL) && defined(F_SETFL) && defined(O_NONBLOCK)
{
int flags;
flags = fcntl(sck, F_GETFL, 0);
if (flags <= -1) return;
#if defined(O_NONBLOCK) #if defined(O_NONBLOCK)
flags |= O_NONBLOCK; flags |= O_NONBLOCK;
#endif #endif
if (fcntl(sck, F_SETFD, flags) <= -1) return; if (fcntl(sck, F_SETFL, flags) <= -1) return;
}
#endif
done: done:
rdp->log.sck = sck; rdp->log.sck = sck;
@@ -4682,7 +4946,7 @@ static int fnc_openlog (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
#if defined(ENABLE_SYSLOG) #if defined(ENABLE_SYSLOG)
if (rdp->log.syslog_opened) if (rdp->log.syslog_opened)
{ {
closelog (); closelog();
rdp->log.syslog_opened = 0; rdp->log.syslog_opened = 0;
} }
#endif #endif
@@ -4709,7 +4973,9 @@ static int fnc_openlog (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
else if (rdp->log.type == SYSLOG_REMOTE) else if (rdp->log.type == SYSLOG_REMOTE)
{ {
rdp->log.skad = skad; rdp->log.skad = skad;
#if defined(LOG_NDELAY)
if ((opt & LOG_NDELAY) && rdp->log.sck <= -1) open_remote_log_socket(rtx, rdp); if ((opt & LOG_NDELAY) && rdp->log.sck <= -1) open_remote_log_socket(rtx, rdp);
#endif
} }
rx = ERRNUM_TO_RC(HAWK_ENOERR); rx = ERRNUM_TO_RC(HAWK_ENOERR);
@@ -4730,7 +4996,7 @@ static int fnc_closelog (hawk_rtx_t* rtx, const hawk_fnc_info_t* fi)
{ {
case SYSLOG_LOCAL: case SYSLOG_LOCAL:
#if defined(ENABLE_SYSLOG) #if defined(ENABLE_SYSLOG)
closelog (); closelog();
/* closelog() might be called without openlog(). so there is no /* closelog() might be called without openlog(). so there is no
* check if syslog_opened is true. * check if syslog_opened is true.
* it is just used as an indicator to decide wheter closelog() * it is just used as an indicator to decide wheter closelog()
@@ -6036,6 +6302,7 @@ static hawk_mod_fnc_tab_t fnctab[] =
{ HAWK_T("tcgetattr"), { { 2, 2, HAWK_T("vr") }, fnc_tcgetattr, 0 } }, { HAWK_T("tcgetattr"), { { 2, 2, HAWK_T("vr") }, fnc_tcgetattr, 0 } },
{ HAWK_T("tcsetattr"), { { 3, 3, HAWK_NULL }, fnc_tcsetattr, 0 } }, { HAWK_T("tcsetattr"), { { 3, 3, HAWK_NULL }, fnc_tcsetattr, 0 } },
{ HAWK_T("tcsetraw"), { { 1, 1, HAWK_NULL }, fnc_tcsetraw, 0 } }, { HAWK_T("tcsetraw"), { { 1, 1, HAWK_NULL }, fnc_tcsetraw, 0 } },
{ HAWK_T("uname"), { { 0, 0, HAWK_NULL }, fnc_uname, 0 } },
{ HAWK_T("unlink"), { { 1, 1, HAWK_NULL }, fnc_unlink, 0 } }, { HAWK_T("unlink"), { { 1, 1, HAWK_NULL }, fnc_unlink, 0 } },
{ HAWK_T("unpack"), { { 2, A_MAX, HAWK_T("vvr") }, fnc_unpack, 0 } }, { HAWK_T("unpack"), { { 2, A_MAX, HAWK_T("vvr") }, fnc_unpack, 0 } },
{ HAWK_T("wait"), { { 1, 3, HAWK_T("vrv") }, fnc_wait, 0 } }, { HAWK_T("wait"), { { 1, 3, HAWK_T("vrv") }, fnc_wait, 0 } },
@@ -6082,18 +6349,30 @@ static hawk_mod_int_tab_t inttab[] =
{ HAWK_T("DIR_SORT"), { HAWK_DIR_SORT } }, { HAWK_T("DIR_SORT"), { HAWK_DIR_SORT } },
#if defined(FD_CLOEXEC)
{ HAWK_T("FD_CLOEXEC"), { FD_CLOEXEC } }, { HAWK_T("FD_CLOEXEC"), { FD_CLOEXEC } },
#endif
#if defined(F_RDLCK) && defined(F_UNLCK) && defined(F_WRLCK)
{ HAWK_T("FLOCK_GET"), { FLOCK_GET } }, /* bitwise-OR with another FLOCK_READ/WRITE/WAIT value */ { HAWK_T("FLOCK_GET"), { FLOCK_GET } }, /* bitwise-OR with another FLOCK_READ/WRITE/WAIT value */
{ HAWK_T("FLOCK_READ"), { F_RDLCK } }, { HAWK_T("FLOCK_READ"), { F_RDLCK } },
{ HAWK_T("FLOCK_UNLOCK"), { F_UNLCK } }, { HAWK_T("FLOCK_UNLOCK"), { F_UNLCK } },
{ HAWK_T("FLOCK_WAIT"), { FLOCK_WAIT } }, /* bitwise-OR with another FLOCK_READ/WRITE/WAIT value */ { HAWK_T("FLOCK_WAIT"), { FLOCK_WAIT } }, /* bitwise-OR with another FLOCK_READ/WRITE/WAIT value */
{ HAWK_T("FLOCK_WRITE"), { F_WRLCK } }, { HAWK_T("FLOCK_WRITE"), { F_WRLCK } },
#endif
#if defined(F_GETFD)
{ HAWK_T("F_GETFD"), { F_GETFD } }, { HAWK_T("F_GETFD"), { F_GETFD } },
#endif
#if defined(F_GETFL)
{ HAWK_T("F_GETFL"), { F_GETFL } }, { HAWK_T("F_GETFL"), { F_GETFL } },
#endif
#if defined(F_SETFD)
{ HAWK_T("F_SETFD"), { F_SETFD } }, { HAWK_T("F_SETFD"), { F_SETFD } },
#endif
#if defined(F_SETFL)
{ HAWK_T("F_SETFL"), { F_SETFL } }, { HAWK_T("F_SETFL"), { F_SETFL } },
#endif
{ HAWK_T("IFCFG_IN4"), { HAWK_IFCFG_IN4 } }, { HAWK_T("IFCFG_IN4"), { HAWK_IFCFG_IN4 } },
{ HAWK_T("IFCFG_IN6"), { HAWK_IFCFG_IN6 } }, { HAWK_T("IFCFG_IN6"), { HAWK_IFCFG_IN6 } },
@@ -6125,7 +6404,9 @@ static hawk_mod_int_tab_t inttab[] =
{ HAWK_T("LOG_FAC_UUCP"), { LOG_UUCP } }, { HAWK_T("LOG_FAC_UUCP"), { LOG_UUCP } },
{ HAWK_T("LOG_OPT_CONS"), { LOG_CONS } }, { HAWK_T("LOG_OPT_CONS"), { LOG_CONS } },
#if defined(LOG_NDELAY)
{ HAWK_T("LOG_OPT_NDELAY"), { LOG_NDELAY } }, { HAWK_T("LOG_OPT_NDELAY"), { LOG_NDELAY } },
#endif
{ HAWK_T("LOG_OPT_NOWAIT"), { LOG_NOWAIT } }, { HAWK_T("LOG_OPT_NOWAIT"), { LOG_NOWAIT } },
{ HAWK_T("LOG_OPT_PID"), { LOG_PID } }, { HAWK_T("LOG_OPT_PID"), { LOG_PID } },
@@ -6281,116 +6562,264 @@ static hawk_mod_int_tab_t inttab[] =
#if defined(VDISCARD) #if defined(VDISCARD)
{ HAWK_T("TC_CC_VDISCARD"), { VDISCARD } }, { HAWK_T("TC_CC_VDISCARD"), { VDISCARD } },
#endif #endif
#if defined(VEOF)
{ HAWK_T("TC_CC_VEOF"), { VEOF } }, { HAWK_T("TC_CC_VEOF"), { VEOF } },
#endif
#if defined(VEOL)
{ HAWK_T("TC_CC_VEOL"), { VEOL } }, { HAWK_T("TC_CC_VEOL"), { VEOL } },
#endif
#if defined(VEOL2)
{ HAWK_T("TC_CC_VEOL2"), { VEOL2 } }, { HAWK_T("TC_CC_VEOL2"), { VEOL2 } },
#endif
#if defined(VERASE)
{ HAWK_T("TC_CC_VERASE"), { VERASE } }, { HAWK_T("TC_CC_VERASE"), { VERASE } },
#endif
#if defined(VINTR)
{ HAWK_T("TC_CC_VINTR"), { VINTR } }, { HAWK_T("TC_CC_VINTR"), { VINTR } },
#endif
#if defined(VKILL)
{ HAWK_T("TC_CC_VKILL"), { VKILL } }, { HAWK_T("TC_CC_VKILL"), { VKILL } },
#endif
#if defined(VLNEXT) #if defined(VLNEXT)
{ HAWK_T("TC_CC_VLNEXT"), { VLNEXT } }, { HAWK_T("TC_CC_VLNEXT"), { VLNEXT } },
#endif #endif
#if defined(VMIN)
{ HAWK_T("TC_CC_VMIN"), { VMIN } }, { HAWK_T("TC_CC_VMIN"), { VMIN } },
#endif
#if defined(VQUIT)
{ HAWK_T("TC_CC_VQUIT"), { VQUIT } }, { HAWK_T("TC_CC_VQUIT"), { VQUIT } },
#endif
#if defined(VREPRINT) #if defined(VREPRINT)
{ HAWK_T("TC_CC_VREPRINT"), { VREPRINT } }, { HAWK_T("TC_CC_VREPRINT"), { VREPRINT } },
#endif #endif
#if defined(VSTART)
{ HAWK_T("TC_CC_VSTART"), { VSTART } }, { HAWK_T("TC_CC_VSTART"), { VSTART } },
#endif
#if defined(VSTOP)
{ HAWK_T("TC_CC_VSTOP"), { VSTOP } }, { HAWK_T("TC_CC_VSTOP"), { VSTOP } },
#endif
#if defined(VSUSP)
{ HAWK_T("TC_CC_VSUSP"), { VSUSP } }, { HAWK_T("TC_CC_VSUSP"), { VSUSP } },
#endif
#if defined(VSWTC) #if defined(VSWTC)
{ HAWK_T("TC_CC_VSWTC"), { VSWTC } }, /* hard to define with an alternative value when it's not available */ { HAWK_T("TC_CC_VSWTC"), { VSWTC } }, /* hard to define with an alternative value when it's not available */
#endif #endif
#if defined(VTIME)
{ HAWK_T("TC_CC_VTIME"), { VTIME } }, { HAWK_T("TC_CC_VTIME"), { VTIME } },
#endif
#if defined(VWERASE) #if defined(VWERASE)
{ HAWK_T("TC_CC_VWERASE"), { VWERASE } }, { HAWK_T("TC_CC_VWERASE"), { VWERASE } },
#endif #endif
#if defined(B0)
{ HAWK_T("TC_CFLAG_B0"), { B0 } }, { HAWK_T("TC_CFLAG_B0"), { B0 } },
#endif
#if defined(B110)
{ HAWK_T("TC_CFLAG_B110"), { B110 } }, { HAWK_T("TC_CFLAG_B110"), { B110 } },
#endif
#if defined(B115200)
{ HAWK_T("TC_CFLAG_B115200"), { B115200 } }, { HAWK_T("TC_CFLAG_B115200"), { B115200 } },
#endif
#if defined(B1200)
{ HAWK_T("TC_CFLAG_B1200"), { B1200 } }, { HAWK_T("TC_CFLAG_B1200"), { B1200 } },
#endif
#if defined(B134)
{ HAWK_T("TC_CFLAG_B134"), { B134 } }, { HAWK_T("TC_CFLAG_B134"), { B134 } },
#endif
#if defined(B150)
{ HAWK_T("TC_CFLAG_B150"), { B150 } }, { HAWK_T("TC_CFLAG_B150"), { B150 } },
#endif
#if defined(B1800)
{ HAWK_T("TC_CFLAG_B1800"), { B1800 } }, { HAWK_T("TC_CFLAG_B1800"), { B1800 } },
#endif
#if defined(B19200)
{ HAWK_T("TC_CFLAG_B19200"), { B19200 } }, { HAWK_T("TC_CFLAG_B19200"), { B19200 } },
#endif
#if defined(B200)
{ HAWK_T("TC_CFLAG_B200"), { B200 } }, { HAWK_T("TC_CFLAG_B200"), { B200 } },
#endif
#if defined(B230400)
{ HAWK_T("TC_CFLAG_B230400"), { B230400 } }, { HAWK_T("TC_CFLAG_B230400"), { B230400 } },
#endif
#if defined(B2400)
{ HAWK_T("TC_CFLAG_B2400"), { B2400 } }, { HAWK_T("TC_CFLAG_B2400"), { B2400 } },
#endif
#if defined(B300)
{ HAWK_T("TC_CFLAG_B300"), { B300 } }, { HAWK_T("TC_CFLAG_B300"), { B300 } },
#endif
#if defined(B38400)
{ HAWK_T("TC_CFLAG_B38400"), { B38400 } }, { HAWK_T("TC_CFLAG_B38400"), { B38400 } },
#endif
#if defined(B460800) #if defined(B460800)
{ HAWK_T("TC_CFLAG_B460800"), { B460800 } }, { HAWK_T("TC_CFLAG_B460800"), { B460800 } },
#endif #endif
#if defined(B4800)
{ HAWK_T("TC_CFLAG_B4800"), { B4800 } }, { HAWK_T("TC_CFLAG_B4800"), { B4800 } },
#endif
#if defined(B50)
{ HAWK_T("TC_CFLAG_B50"), { B50 } }, { HAWK_T("TC_CFLAG_B50"), { B50 } },
#endif
#if defined(B57600)
{ HAWK_T("TC_CFLAG_B57600"), { B57600 } }, { HAWK_T("TC_CFLAG_B57600"), { B57600 } },
#endif
#if defined(B600)
{ HAWK_T("TC_CFLAG_B600"), { B600 } }, { HAWK_T("TC_CFLAG_B600"), { B600 } },
#endif
#if defined(B75)
{ HAWK_T("TC_CFLAG_B75"), { B75 } }, { HAWK_T("TC_CFLAG_B75"), { B75 } },
#endif
#if defined(B921600) #if defined(B921600)
{ HAWK_T("TC_CFLAG_B921600"), { B921600 } }, { HAWK_T("TC_CFLAG_B921600"), { B921600 } },
#endif #endif
#if defined(B9600)
{ HAWK_T("TC_CFLAG_B9600"), { B9600 } }, { HAWK_T("TC_CFLAG_B9600"), { B9600 } },
#endif
#if defined(CLOCAL)
{ HAWK_T("TC_CFLAG_CLOCAL"), { CLOCAL } }, { HAWK_T("TC_CFLAG_CLOCAL"), { CLOCAL } },
#endif
#if defined(CREAD)
{ HAWK_T("TC_CFLAG_CREAD"), { CREAD } }, { HAWK_T("TC_CFLAG_CREAD"), { CREAD } },
#endif
#if defined(CRTSCTS) #if defined(CRTSCTS)
{ HAWK_T("TC_CFLAG_CRTSCTS"), { CRTSCTS } }, { HAWK_T("TC_CFLAG_CRTSCTS"), { CRTSCTS } },
#endif #endif
#if defined(CS5)
{ HAWK_T("TC_CFLAG_CS5"), { CS5 } }, { HAWK_T("TC_CFLAG_CS5"), { CS5 } },
#endif
#if defined(CS6)
{ HAWK_T("TC_CFLAG_CS6"), { CS6 } }, { HAWK_T("TC_CFLAG_CS6"), { CS6 } },
#endif
#if defined(CS7)
{ HAWK_T("TC_CFLAG_CS7"), { CS7 } }, { HAWK_T("TC_CFLAG_CS7"), { CS7 } },
#endif
#if defined(CS8)
{ HAWK_T("TC_CFLAG_CS8"), { CS8 } }, { HAWK_T("TC_CFLAG_CS8"), { CS8 } },
#endif
#if defined(CSIZE)
{ HAWK_T("TC_CFLAG_CSIZE"), { CSIZE } }, { HAWK_T("TC_CFLAG_CSIZE"), { CSIZE } },
#endif
#if defined(CSTOPB)
{ HAWK_T("TC_CFLAG_CSTOPB"), { CSTOPB } }, { HAWK_T("TC_CFLAG_CSTOPB"), { CSTOPB } },
#endif
#if defined(HUPCL)
{ HAWK_T("TC_CFLAG_HUPCL"), { HUPCL } }, { HAWK_T("TC_CFLAG_HUPCL"), { HUPCL } },
#endif
#if defined(PARENB)
{ HAWK_T("TC_CFLAG_PARENB"), { PARENB } }, { HAWK_T("TC_CFLAG_PARENB"), { PARENB } },
#endif
#if defined(PARODD)
{ HAWK_T("TC_CFLAG_PARODD"), { PARODD } }, { HAWK_T("TC_CFLAG_PARODD"), { PARODD } },
#endif
#if defined(BRKINT)
{ HAWK_T("TC_IFLAG_BRKINT"), { BRKINT } }, { HAWK_T("TC_IFLAG_BRKINT"), { BRKINT } },
#endif
#if defined(ICRNL)
{ HAWK_T("TC_IFLAG_ICRNL"), { ICRNL } }, { HAWK_T("TC_IFLAG_ICRNL"), { ICRNL } },
#endif
#if defined(IGNBRK)
{ HAWK_T("TC_IFLAG_IGNBRK"), { IGNBRK } }, { HAWK_T("TC_IFLAG_IGNBRK"), { IGNBRK } },
#endif
#if defined(IGNCR)
{ HAWK_T("TC_IFLAG_IGNCR"), { IGNCR } }, { HAWK_T("TC_IFLAG_IGNCR"), { IGNCR } },
#endif
#if defined(IGNPAR)
{ HAWK_T("TC_IFLAG_IGNPAR"), { IGNPAR } }, { HAWK_T("TC_IFLAG_IGNPAR"), { IGNPAR } },
#endif
#if defined(IMAXBEL) #if defined(IMAXBEL)
{ HAWK_T("TC_IFLAG_IMAXBEL"),{ IMAXBEL } }, { HAWK_T("TC_IFLAG_IMAXBEL"),{ IMAXBEL } },
#endif #endif
#if defined(INLCR)
{ HAWK_T("TC_IFLAG_INLCR"), { INLCR } }, { HAWK_T("TC_IFLAG_INLCR"), { INLCR } },
#endif
#if defined(INPCK)
{ HAWK_T("TC_IFLAG_INPCK"), { INPCK } }, { HAWK_T("TC_IFLAG_INPCK"), { INPCK } },
#endif
#if defined(ISTRIP)
{ HAWK_T("TC_IFLAG_ISTRIP"), { ISTRIP } }, { HAWK_T("TC_IFLAG_ISTRIP"), { ISTRIP } },
#endif
{ HAWK_T("TC_IFLAG_IUCLC"), { X_IUCLC } }, { HAWK_T("TC_IFLAG_IUCLC"), { X_IUCLC } },
{ HAWK_T("TC_IFLAG_IUTF8"), { X_IUTF8 } }, { HAWK_T("TC_IFLAG_IUTF8"), { X_IUTF8 } },
#if defined(IXANY)
{ HAWK_T("TC_IFLAG_IXANY"), { IXANY } }, { HAWK_T("TC_IFLAG_IXANY"), { IXANY } },
#endif
#if defined(IXOFF)
{ HAWK_T("TC_IFLAG_IXOFF"), { IXOFF } }, { HAWK_T("TC_IFLAG_IXOFF"), { IXOFF } },
#endif
#if defined(IXON)
{ HAWK_T("TC_IFLAG_IXON"), { IXON } }, { HAWK_T("TC_IFLAG_IXON"), { IXON } },
#endif
#if defined(PARMRK)
{ HAWK_T("TC_IFLAG_PARMRK"), { PARMRK } }, { HAWK_T("TC_IFLAG_PARMRK"), { PARMRK } },
#endif
#if defined(TCIFLUSH)
{ HAWK_T("TC_IFLUSH"), { TCIFLUSH } }, { HAWK_T("TC_IFLUSH"), { TCIFLUSH } },
#endif
#if defined(TCIOFLUSH)
{ HAWK_T("TC_IOFLUSH"), { TCIOFLUSH } }, { HAWK_T("TC_IOFLUSH"), { TCIOFLUSH } },
#endif
#if defined(TCOFLUSH)
{ HAWK_T("TC_OFLUSH"), { TCOFLUSH } }, { HAWK_T("TC_OFLUSH"), { TCOFLUSH } },
#endif
#if defined(ECHO)
{ HAWK_T("TC_LFLAG_ECHO"), { ECHO } }, { HAWK_T("TC_LFLAG_ECHO"), { ECHO } },
#endif
#if defined(ECHOE)
{ HAWK_T("TC_LFLAG_ECHOE"), { ECHOE } }, { HAWK_T("TC_LFLAG_ECHOE"), { ECHOE } },
#endif
#if defined(ECHOK)
{ HAWK_T("TC_LFLAG_ECHOK"), { ECHOK } }, { HAWK_T("TC_LFLAG_ECHOK"), { ECHOK } },
#endif
#if defined(ECHONL)
{ HAWK_T("TC_LFLAG_ECHONL"), { ECHONL } }, { HAWK_T("TC_LFLAG_ECHONL"), { ECHONL } },
#endif
#if defined(ICANON)
{ HAWK_T("TC_LFLAG_ICANON"), { ICANON } }, { HAWK_T("TC_LFLAG_ICANON"), { ICANON } },
#endif
#if defined(ISIG)
{ HAWK_T("TC_LFLAG_ISIG"), { ISIG } }, { HAWK_T("TC_LFLAG_ISIG"), { ISIG } },
#endif
#if defined(NOFLSH)
{ HAWK_T("TC_LFLAG_NOFLSH"), { NOFLSH } }, { HAWK_T("TC_LFLAG_NOFLSH"), { NOFLSH } },
#endif
#if defined(TOSTOP)
{ HAWK_T("TC_LFLAG_TOSTOP"), { TOSTOP } }, { HAWK_T("TC_LFLAG_TOSTOP"), { TOSTOP } },
#endif
#if defined(OCRNL)
{ HAWK_T("TC_OFLAG_OCRNL"), { OCRNL } }, { HAWK_T("TC_OFLAG_OCRNL"), { OCRNL } },
#endif
#if defined(ONLCR)
{ HAWK_T("TC_OFLAG_ONLCR"), { ONLCR } }, { HAWK_T("TC_OFLAG_ONLCR"), { ONLCR } },
#endif
#if defined(ONLRET)
{ HAWK_T("TC_OFLAG_ONLRET"), { ONLRET } }, { HAWK_T("TC_OFLAG_ONLRET"), { ONLRET } },
#endif
#if defined(ONOCR)
{ HAWK_T("TC_OFLAG_ONOCR"), { ONOCR } }, { HAWK_T("TC_OFLAG_ONOCR"), { ONOCR } },
#endif
{ HAWK_T("TC_OFLAG_ONOEOT"), { X_ONOEOT } }, { HAWK_T("TC_OFLAG_ONOEOT"), { X_ONOEOT } },
#if defined(OPOST)
{ HAWK_T("TC_OFLAG_OPOST"), { OPOST } }, { HAWK_T("TC_OFLAG_OPOST"), { OPOST } },
#endif
{ HAWK_T("TC_OFLAG_OXTABS"), { X_OXTABS } }, { HAWK_T("TC_OFLAG_OXTABS"), { X_OXTABS } },
#if defined(TCSADRAIN)
{ HAWK_T("TC_SADRAIN"), { TCSADRAIN } }, { HAWK_T("TC_SADRAIN"), { TCSADRAIN } },
#endif
#if defined(TCSAFLUSH)
{ HAWK_T("TC_SAFLUSH"), { TCSAFLUSH } }, { HAWK_T("TC_SAFLUSH"), { TCSAFLUSH } },
#endif
#if defined(TCSANOW)
{ HAWK_T("TC_SANOW"), { TCSANOW } }, { HAWK_T("TC_SANOW"), { TCSANOW } },
#endif
#if defined(WNOHANG)
{ HAWK_T("WNOHANG"), { WNOHANG } } { HAWK_T("WNOHANG"), { WNOHANG } }
#endif
}; };
static int query (hawk_mod_t* mod, hawk_t* hawk, const hawk_ooch_t* name, hawk_mod_sym_t* sym) static int query (hawk_mod_t* mod, hawk_t* hawk, const hawk_ooch_t* name, hawk_mod_sym_t* sym)
+20 -6
View File
@@ -643,6 +643,8 @@ int hawk_pio_init (hawk_pio_t* pio, hawk_gem_t* gem, const hawk_ooch_t* cmd, int
HANDLE windevnul = INVALID_HANDLE_VALUE; HANDLE windevnul = INVALID_HANDLE_VALUE;
BOOL apiret; BOOL apiret;
hawk_ooch_t* dupcmd; hawk_ooch_t* dupcmd;
void* envblk = HAWK_NULL;
DWORD create_flags;
int create_retried; int create_retried;
#elif defined(__OS2__) #elif defined(__OS2__)
@@ -904,18 +906,30 @@ create_process:
if (HAWK_UNLIKELY(!dupcmd)) goto oops; if (HAWK_UNLIKELY(!dupcmd)) goto oops;
if (env_mk)
{
#if defined(HAWK_OOCH_IS_BCH)
envblk = env_mk(HAWK_PIO_ENV_MK_BPN, env_ctx);
#else
envblk = env_mk(HAWK_PIO_ENV_MK_UPN, env_ctx);
#endif
if (HAWK_UNLIKELY(!envblk)) goto oops;
}
#if defined(HAWK_OOCH_IS_BCH)
create_flags = 0;
#else
create_flags = CREATE_UNICODE_ENVIRONMENT;
#endif
apiret = CreateProcess( apiret = CreateProcess(
HAWK_NULL, /* LPCTSTR lpApplicationName */ HAWK_NULL, /* LPCTSTR lpApplicationName */
dupcmd, /* LPTSTR lpCommandLine */ dupcmd, /* LPTSTR lpCommandLine */
HAWK_NULL, /* LPSECURITY_ATTRIBUTES lpProcessAttributes */ HAWK_NULL, /* LPSECURITY_ATTRIBUTES lpProcessAttributes */
HAWK_NULL, /* LPSECURITY_ATTRIBUTES lpThreadAttributes */ HAWK_NULL, /* LPSECURITY_ATTRIBUTES lpThreadAttributes */
TRUE, /* BOOL bInheritHandles */ TRUE, /* BOOL bInheritHandles */
#if defined(HAWK_OOCH_IS_BCH) create_flags, /* DWORD dwCreationFlags */
0, /* DWORD dwCreationFlags */ envblk, /* LPVOID lpEnvironment */
#else
CREATE_UNICODE_ENVIRONMENT, /* DWORD dwCreationFlags */
#endif
HAWK_NULL, /* LPVOID lpEnvironment */
HAWK_NULL, /* LPCTSTR lpCurrentDirectory */ HAWK_NULL, /* LPCTSTR lpCurrentDirectory */
&startup, /* LPSTARTUPINFO lpStartupInfo */ &startup, /* LPSTARTUPINFO lpStartupInfo */
&procinfo /* LPPROCESS_INFORMATION lpProcessInformation */ &procinfo /* LPPROCESS_INFORMATION lpProcessInformation */
+17 -7
View File
@@ -53,7 +53,7 @@
#define rotate_left(rbt,pivot) rotate(rbt,pivot,1); #define rotate_left(rbt,pivot) rotate(rbt,pivot,1);
#define rotate_right(rbt,pivot) rotate(rbt,pivot,0); #define rotate_right(rbt,pivot) rotate(rbt,pivot,0);
HAWK_INLINE hawk_rbt_pair_t* hawk_rbt_allocpair ( static HAWK_INLINE_ALWAYS hawk_rbt_pair_t* alloc_pair (
hawk_rbt_t* rbt, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen) hawk_rbt_t* rbt, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen)
{ {
hawk_rbt_pair_t* pair; hawk_rbt_pair_t* pair;
@@ -120,7 +120,7 @@ HAWK_INLINE hawk_rbt_pair_t* hawk_rbt_allocpair (
return pair; return pair;
} }
HAWK_INLINE void hawk_rbt_freepair (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair) static HAWK_INLINE_ALWAYS void free_pair (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair)
{ {
if (rbt->style->freeer[HAWK_RBT_KEY]) if (rbt->style->freeer[HAWK_RBT_KEY])
rbt->style->freeer[HAWK_RBT_KEY](rbt, KPTR(pair), KLEN(pair)); rbt->style->freeer[HAWK_RBT_KEY](rbt, KPTR(pair), KLEN(pair));
@@ -129,6 +129,16 @@ HAWK_INLINE void hawk_rbt_freepair (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair)
hawk_gem_freemem(rbt->gem, pair); hawk_gem_freemem(rbt->gem, pair);
} }
hawk_rbt_pair_t* hawk_rbt_allocpair (hawk_rbt_t* rbt, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen)
{
return alloc_pair(rbt, kptr, klen, vptr, vlen);
}
void hawk_rbt_freepair (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair)
{
free_pair(rbt, pair);
}
static hawk_rbt_style_t style[] = static hawk_rbt_style_t style[] =
{ {
{ {
@@ -450,7 +460,7 @@ static hawk_rbt_pair_t* change_pair_val (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair,
else else
{ {
/* need to reconstruct the pair */ /* need to reconstruct the pair */
hawk_rbt_pair_t* p = hawk_rbt_allocpair(rbt, KPTR(pair), KLEN(pair), vptr, vlen); hawk_rbt_pair_t* p = alloc_pair(rbt, KPTR(pair), KLEN(pair), vptr, vlen);
if (HAWK_UNLIKELY(!p)) return HAWK_NULL; if (HAWK_UNLIKELY(!p)) return HAWK_NULL;
p->color = pair->color; p->color = pair->color;
@@ -475,7 +485,7 @@ static hawk_rbt_pair_t* change_pair_val (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair,
if (pair == rbt->root) rbt->root = p; if (pair == rbt->root) rbt->root = p;
hawk_rbt_freepair(rbt, pair); free_pair(rbt, pair);
return p; return p;
} }
} }
@@ -539,7 +549,7 @@ static hawk_rbt_pair_t* insert (hawk_rbt_t* rbt, void* kptr, hawk_oow_t klen, vo
return HAWK_NULL; return HAWK_NULL;
} }
x_new = hawk_rbt_allocpair(rbt, kptr, klen, vptr, vlen); x_new = alloc_pair(rbt, kptr, klen, vptr, vlen);
if (HAWK_UNLIKELY(!x_new)) return HAWK_NULL; if (HAWK_UNLIKELY(!x_new)) return HAWK_NULL;
if (x_par == HAWK_NULL) if (x_par == HAWK_NULL)
@@ -819,7 +829,7 @@ static void delete_pair (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair)
if (y->color == HAWK_RBT_BLACK && !IS_NIL(rbt,x)) if (y->color == HAWK_RBT_BLACK && !IS_NIL(rbt,x))
adjust_for_delete(rbt, x, parent); adjust_for_delete(rbt, x, parent);
hawk_rbt_freepair(rbt, y); free_pair(rbt, y);
} }
else else
{ {
@@ -844,7 +854,7 @@ static void delete_pair (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair)
if (pair->left->parent == pair) pair->left->parent = y; if (pair->left->parent == pair) pair->left->parent = y;
if (pair->right->parent == pair) pair->right->parent = y; if (pair->right->parent == pair) pair->right->parent = y;
hawk_rbt_freepair(rbt, pair); free_pair(rbt, pair);
} }
rbt->size--; rbt->size--;
+33 -9
View File
@@ -25,19 +25,43 @@
#ifndef _HAWK_SKAD_PRV_H_ #ifndef _HAWK_SKAD_PRV_H_
#define _HAWK_SKAD_PRV_H_ #define _HAWK_SKAD_PRV_H_
#include <sys/types.h> #if defined(_WIN32)
#include <sys/socket.h> # include <winsock2.h>
#if defined(HAVE_NETINET_IN_H) # include <ws2tcpip.h>
/*# include <iphlpapi.h> */
#elif defined(__OS2__)
# if defined(TCPV40HDRS)
# define BSD_SELECT
# endif
# include <types.h>
# include <sys/socket.h>
# include <netinet/in.h> # include <netinet/in.h>
#endif # include <sys/ioctl.h>
#if defined(HAVE_SYS_UN_H) # include <nerrno.h>
# if defined(TCPV40HDRS)
# define USE_SELECT
# include <sys/select.h>
# else
# include <unistd.h>
# endif
#elif defined(__DOS__)
/* TODO: */
#else
# include <sys/types.h>
# include <sys/socket.h>
# if defined(HAVE_NETINET_IN_H)
# include <netinet/in.h>
# endif
# if defined(HAVE_SYS_UN_H)
# include <sys/un.h> # include <sys/un.h>
#endif # endif
#if defined(HAVE_NETPACKET_PACKET_H) # if defined(HAVE_NETPACKET_PACKET_H)
# include <netpacket/packet.h> # include <netpacket/packet.h>
#endif # endif
#if defined(HAVE_NET_IF_DL_H) # if defined(HAVE_NET_IF_DL_H)
# include <net/if_dl.h> # include <net/if_dl.h>
# endif
#endif #endif
union hawk_skad_alt_t union hawk_skad_alt_t
+24 -20
View File
@@ -902,7 +902,7 @@ static hawk_oow_t ip6ad_to_ucstr (const struct in6_addr* ipad, hawk_uch_t* buf,
if (i == 6 && best.base == 0 && (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) if (i == 6 && best.base == 0 && (best.len == 6 || (best.len == 5 && words[5] == 0xffff)))
{ {
struct in_addr ip4ad; struct in_addr ip4ad;
HAWK_MEMCPY (&ip4ad.s_addr, ipad->s6_addr + 12, HAWK_SIZEOF(ip4ad.s_addr)); HAWK_MEMCPY(&ip4ad.s_addr, ipad->s6_addr + 12, HAWK_SIZEOF(ip4ad.s_addr));
tp += ip4ad_to_ucstr(&ip4ad, tp, HAWK_COUNTOF(tmp) - (tp - tmp)); tp += ip4ad_to_ucstr(&ip4ad, tp, HAWK_COUNTOF(tmp) - (tp - tmp));
break; break;
} }
@@ -1011,6 +1011,7 @@ hawk_oow_t hawk_gem_skadtoucstr (hawk_gem_t* gem, const hawk_skad_t* _skad, hawk
break; break;
#endif #endif
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_UN > 0)
case HAWK_AF_UNIX: case HAWK_AF_UNIX:
if (flags & HAWK_SKAD_TO_BCSTR_ADDR) if (flags & HAWK_SKAD_TO_BCSTR_ADDR)
{ {
@@ -1021,13 +1022,14 @@ hawk_oow_t hawk_gem_skadtoucstr (hawk_gem_t* gem, const hawk_skad_t* _skad, hawk
else else
{ {
hawk_oow_t mbslen, wcslen = len - xlen; hawk_oow_t mbslen, wcslen = len - xlen;
hawk_gem_convbtoucstr (gem, skad->un.sun_path, &mbslen, &buf[xlen], &wcslen, 1); hawk_gem_convbtoucstr(gem, skad->un.sun_path, &mbslen, &buf[xlen], &wcslen, 1);
/* i don't care about conversion errors */ /* i don't care about conversion errors */
xlen += wcslen; xlen += wcslen;
} }
} }
break; break;
#endif
} }
done: done:
@@ -1151,7 +1153,7 @@ static hawk_oow_t ip6ad_to_bcstr (const struct in6_addr* ipad, hawk_bch_t* buf,
if (i == 6 && best.base == 0 && (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) if (i == 6 && best.base == 0 && (best.len == 6 || (best.len == 5 && words[5] == 0xffff)))
{ {
struct in_addr ip4ad; struct in_addr ip4ad;
HAWK_MEMCPY (&ip4ad.s_addr, ipad->s6_addr + 12, HAWK_SIZEOF(ip4ad.s_addr)); HAWK_MEMCPY(&ip4ad.s_addr, ipad->s6_addr + 12, HAWK_SIZEOF(ip4ad.s_addr));
tp += ip4ad_to_bcstr(&ip4ad, tp, HAWK_COUNTOF(tmp) - (tp - tmp)); tp += ip4ad_to_bcstr(&ip4ad, tp, HAWK_COUNTOF(tmp) - (tp - tmp));
break; break;
} }
@@ -1261,6 +1263,7 @@ hawk_oow_t hawk_gem_skadtobcstr (hawk_gem_t* gem, const hawk_skad_t* _skad, hawk
break; break;
#endif #endif
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_UN > 0)
case HAWK_AF_UNIX: case HAWK_AF_UNIX:
if (flags & HAWK_SKAD_TO_BCSTR_ADDR) if (flags & HAWK_SKAD_TO_BCSTR_ADDR)
{ {
@@ -1282,6 +1285,7 @@ hawk_oow_t hawk_gem_skadtobcstr (hawk_gem_t* gem, const hawk_skad_t* _skad, hawk
} }
break; break;
#endif
} }
done: done:
@@ -1387,13 +1391,13 @@ hawk_oow_t hawk_skad_get_ipad_bytes (hawk_skad_t* _skad, void* buf, hawk_oow_t l
#if defined(AF_INET) && (HAWK_SIZEOF_STRUCT_SOCKADDR_IN > 0) #if defined(AF_INET) && (HAWK_SIZEOF_STRUCT_SOCKADDR_IN > 0)
case AF_INET: case AF_INET:
outlen = len < HAWK_SIZEOF(skad->in4.sin_addr)? len: HAWK_SIZEOF(skad->in4.sin_addr); outlen = len < HAWK_SIZEOF(skad->in4.sin_addr)? len: HAWK_SIZEOF(skad->in4.sin_addr);
HAWK_MEMCPY (buf, &skad->in4.sin_addr, outlen); HAWK_MEMCPY(buf, &skad->in4.sin_addr, outlen);
break; break;
#endif #endif
#if defined(AF_INET6) && (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0) #if defined(AF_INET6) && (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
case AF_INET6: case AF_INET6:
outlen = len < HAWK_SIZEOF(skad->in6.sin6_addr)? len: HAWK_SIZEOF(skad->in6.sin6_addr); outlen = len < HAWK_SIZEOF(skad->in6.sin6_addr)? len: HAWK_SIZEOF(skad->in6.sin6_addr);
HAWK_MEMCPY (buf, &skad->in6.sin6_addr, outlen); HAWK_MEMCPY(buf, &skad->in6.sin6_addr, outlen);
break; break;
#endif #endif
} }
@@ -1408,7 +1412,7 @@ void hawk_skad_init_for_ip4 (hawk_skad_t* skad, hawk_uint16_t port, hawk_ip4ad_t
HAWK_MEMSET (sin, 0, HAWK_SIZEOF(*sin)); HAWK_MEMSET (sin, 0, HAWK_SIZEOF(*sin));
sin->sin_family = AF_INET; sin->sin_family = AF_INET;
sin->sin_port = hawk_hton16(port); sin->sin_port = hawk_hton16(port);
if (ip4ad) HAWK_MEMCPY (&sin->sin_addr, ip4ad->v, HAWK_IP4AD_LEN); if (ip4ad) HAWK_MEMCPY(&sin->sin_addr, ip4ad->v, HAWK_IP4AD_LEN);
#endif #endif
} }
@@ -1420,7 +1424,7 @@ void hawk_skad_init_for_ip6 (hawk_skad_t* skad, hawk_uint16_t port, hawk_ip6ad_t
sin->sin6_family = AF_INET6; sin->sin6_family = AF_INET6;
sin->sin6_port = hawk_hton16(port); sin->sin6_port = hawk_hton16(port);
sin->sin6_scope_id = scope_id; sin->sin6_scope_id = scope_id;
if (ip6ad) HAWK_MEMCPY (&sin->sin6_addr, ip6ad->v, HAWK_IP6AD_LEN); if (ip6ad) HAWK_MEMCPY(&sin->sin6_addr, ip6ad->v, HAWK_IP6AD_LEN);
#endif #endif
} }
@@ -1435,7 +1439,7 @@ void hawk_skad_init_for_ip_with_bytes (hawk_skad_t* skad, hawk_uint16_t port, co
HAWK_MEMSET (sin, 0, HAWK_SIZEOF(*sin)); HAWK_MEMSET (sin, 0, HAWK_SIZEOF(*sin));
sin->sin_family = AF_INET; sin->sin_family = AF_INET;
sin->sin_port = hawk_hton16(port); sin->sin_port = hawk_hton16(port);
HAWK_MEMCPY (&sin->sin_addr, bytes, len); HAWK_MEMCPY(&sin->sin_addr, bytes, len);
break; break;
} }
#endif #endif
@@ -1446,7 +1450,7 @@ void hawk_skad_init_for_ip_with_bytes (hawk_skad_t* skad, hawk_uint16_t port, co
HAWK_MEMSET (sin, 0, HAWK_SIZEOF(*sin)); HAWK_MEMSET (sin, 0, HAWK_SIZEOF(*sin));
sin->sin6_family = AF_INET6; sin->sin6_family = AF_INET6;
sin->sin6_port = hawk_hton16(port); sin->sin6_port = hawk_hton16(port);
HAWK_MEMCPY (&sin->sin6_addr, bytes, len); HAWK_MEMCPY(&sin->sin6_addr, bytes, len);
break; break;
} }
#endif #endif
@@ -1466,7 +1470,7 @@ void hawk_skad_init_for_eth (hawk_skad_t* skad, int ifindex, hawk_ethad_t* ethad
if (ethad) if (ethad)
{ {
sll->sll_halen = HAWK_ETHAD_LEN; sll->sll_halen = HAWK_ETHAD_LEN;
HAWK_MEMCPY (sll->sll_addr, ethad, HAWK_ETHAD_LEN); HAWK_MEMCPY(sll->sll_addr, ethad, HAWK_ETHAD_LEN);
} }
#elif defined(AF_LINK) && (HAWK_SIZEOF_STRUCT_SOCKADDR_DL > 0) #elif defined(AF_LINK) && (HAWK_SIZEOF_STRUCT_SOCKADDR_DL > 0)
@@ -1477,10 +1481,10 @@ void hawk_skad_init_for_eth (hawk_skad_t* skad, int ifindex, hawk_ethad_t* ethad
if (ethad) if (ethad)
{ {
sll->sdl_alen = HAWK_ETHAD_LEN; sll->sdl_alen = HAWK_ETHAD_LEN;
HAWK_MEMCPY (sll->sdl_data, ethad, HAWK_ETHAD_LEN); HAWK_MEMCPY(sll->sdl_data, ethad, HAWK_ETHAD_LEN);
} }
#else #else
# error UNSUPPORTED DATALINK SOCKET ADDRESS /* UNSUPPORTED, do nothing */
#endif #endif
} }
@@ -1542,7 +1546,7 @@ hawk_oow_t hawk_ipad_bytes_to_ucstr (const hawk_uint8_t* iptr, hawk_oow_t ilen,
case HAWK_IP4AD_LEN: case HAWK_IP4AD_LEN:
{ {
struct in_addr ip4ad; struct in_addr ip4ad;
HAWK_MEMCPY (&ip4ad.s_addr, iptr, ilen); HAWK_MEMCPY(&ip4ad.s_addr, iptr, ilen);
return ip4ad_to_ucstr(&ip4ad, buf, blen); return ip4ad_to_ucstr(&ip4ad, buf, blen);
} }
@@ -1550,7 +1554,7 @@ hawk_oow_t hawk_ipad_bytes_to_ucstr (const hawk_uint8_t* iptr, hawk_oow_t ilen,
case HAWK_IP6AD_LEN: case HAWK_IP6AD_LEN:
{ {
struct in6_addr ip6ad; struct in6_addr ip6ad;
HAWK_MEMCPY (&ip6ad.s6_addr, iptr, ilen); HAWK_MEMCPY(&ip6ad.s6_addr, iptr, ilen);
return ip6ad_to_ucstr(&ip6ad, buf, blen); return ip6ad_to_ucstr(&ip6ad, buf, blen);
} }
#endif #endif
@@ -1568,7 +1572,7 @@ hawk_oow_t hawk_ipad_bytes_to_bcstr (const hawk_uint8_t* iptr, hawk_oow_t ilen,
case HAWK_IP4AD_LEN: case HAWK_IP4AD_LEN:
{ {
struct in_addr ip4ad; struct in_addr ip4ad;
HAWK_MEMCPY (&ip4ad.s_addr, iptr, ilen); HAWK_MEMCPY(&ip4ad.s_addr, iptr, ilen);
return ip4ad_to_bcstr(&ip4ad, buf, blen); return ip4ad_to_bcstr(&ip4ad, buf, blen);
} }
@@ -1576,7 +1580,7 @@ hawk_oow_t hawk_ipad_bytes_to_bcstr (const hawk_uint8_t* iptr, hawk_oow_t ilen,
case HAWK_IP6AD_LEN: case HAWK_IP6AD_LEN:
{ {
struct in6_addr ip6ad; struct in6_addr ip6ad;
HAWK_MEMCPY (&ip6ad.s6_addr, iptr, ilen); HAWK_MEMCPY(&ip6ad.s6_addr, iptr, ilen);
return ip6ad_to_bcstr(&ip6ad, buf, blen); return ip6ad_to_bcstr(&ip6ad, buf, blen);
} }
#endif #endif
@@ -1594,7 +1598,7 @@ int hawk_uchars_to_ipad_bytes (const hawk_uch_t* str, hawk_oow_t slen, hawk_uint
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0) #if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
struct in6_addr i6; struct in6_addr i6;
if (uchars_to_ipv6(str, slen, &i6) <= -1) goto ipv4; if (uchars_to_ipv6(str, slen, &i6) <= -1) goto ipv4;
HAWK_MEMCPY (buf, i6.s6_addr, 16); HAWK_MEMCPY(buf, i6.s6_addr, 16);
return HAWK_IP6AD_LEN; return HAWK_IP6AD_LEN;
#endif #endif
} }
@@ -1603,7 +1607,7 @@ int hawk_uchars_to_ipad_bytes (const hawk_uch_t* str, hawk_oow_t slen, hawk_uint
struct in_addr i4; struct in_addr i4;
ipv4: ipv4:
if (uchars_to_ipv4(str, slen, &i4) <= -1) return -1; if (uchars_to_ipv4(str, slen, &i4) <= -1) return -1;
HAWK_MEMCPY (buf, &i4.s_addr, 4); HAWK_MEMCPY(buf, &i4.s_addr, 4);
return HAWK_IP4AD_LEN; return HAWK_IP4AD_LEN;
} }
@@ -1617,7 +1621,7 @@ int hawk_bchars_to_ipad_bytes (const hawk_bch_t* str, hawk_oow_t slen, hawk_uint
#if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0) #if (HAWK_SIZEOF_STRUCT_SOCKADDR_IN6 > 0)
struct in6_addr i6; struct in6_addr i6;
if (bchars_to_ipv6(str, slen, &i6) <= -1) goto ipv4; if (bchars_to_ipv6(str, slen, &i6) <= -1) goto ipv4;
HAWK_MEMCPY (buf, i6.s6_addr, 16); HAWK_MEMCPY(buf, i6.s6_addr, 16);
return HAWK_IP6AD_LEN; return HAWK_IP6AD_LEN;
#endif #endif
} }
@@ -1626,7 +1630,7 @@ int hawk_bchars_to_ipad_bytes (const hawk_bch_t* str, hawk_oow_t slen, hawk_uint
struct in_addr i4; struct in_addr i4;
ipv4: ipv4:
if (bchars_to_ipv4(str, slen, &i4) <= -1) return -1; if (bchars_to_ipv4(str, slen, &i4) <= -1) return -1;
HAWK_MEMCPY (buf, &i4.s_addr, 4); HAWK_MEMCPY(buf, &i4.s_addr, 4);
return HAWK_IP4AD_LEN; return HAWK_IP4AD_LEN;
} }
+181 -57
View File
@@ -193,6 +193,7 @@ typedef struct rxtn_t
void* envp; /* cached environment value */ void* envp; /* cached environment value */
hawk_map_t* env_map; hawk_map_t* env_map;
hawk_oow_t env_map_rev; hawk_oow_t env_map_rev;
hawk_rtx_env_mk_type_t env_type;
} rxtn_t; } rxtn_t;
typedef struct ioattr_t typedef struct ioattr_t
@@ -446,7 +447,7 @@ void* hawk_stdmodopen (hawk_t* hawk, const hawk_mod_spec_t* spec)
if (!modpath) return HAWK_NULL; if (!modpath) return HAWK_NULL;
h = LoadLibrary(modpath); h = LoadLibrary(modpath);
if (!h) hawk_seterrnum(hawk, HAWK_NULL, hawk_syserr_to_errnum(GetLastError()); if (!h) hawk_seterrnum(hawk, HAWK_NULL, hawk_syserr_to_errnum(GetLastError()));
hawk_freemem(hawk, modpath); hawk_freemem(hawk, modpath);
@@ -457,7 +458,7 @@ void* hawk_stdmodopen (hawk_t* hawk, const hawk_mod_spec_t* spec)
{ {
HMODULE h; HMODULE h;
h = GetModuleHandle(HAWK_NULL); h = GetModuleHandle(HAWK_NULL);
if (!h) hawk_seterrnum(hawk, HAWK_NULL, hawk_syserr_to_errnum(GetLastError()); if (!h) hawk_seterrnum(hawk, HAWK_NULL, hawk_syserr_to_errnum(GetLastError()));
return h; return h;
} }
@@ -649,7 +650,7 @@ void* hawk_stdmodgetsym (hawk_t* hawk, void* handle, const hawk_ooch_t* name)
#elif defined(_WIN32) #elif defined(_WIN32)
s = GetProcAddress((HMODULE)handle, mname); s = GetProcAddress((HMODULE)handle, mname);
if (!s) hawk_seterrnum(hawk, HAWK_NULL, hawk_syserr_to_errnum(GetLastError()); if (!s) hawk_seterrnum(hawk, HAWK_NULL, hawk_syserr_to_errnum(GetLastError()));
#elif defined(__OS2__) #elif defined(__OS2__)
{ {
@@ -2043,13 +2044,10 @@ static int parse_rwpipe_uri (const hawk_ooch_t* uri, int* flags, hawk_nwad_t* nw
static void* rtx_env_maker (hawk_rtx_t* rtx, hawk_rtx_env_mk_type_t env_mk_type) static void* rtx_env_maker (hawk_rtx_t* rtx, hawk_rtx_env_mk_type_t env_mk_type)
{ {
hawk_t* hawk = hawk_rtx_gethawk(rtx); hawk_t* hawk = hawk_rtx_gethawk(rtx);
if (env_mk_type == HAWK_RTX_ENV_MK_BPP)
{
hawk_val_t* v_env; hawk_val_t* v_env;
hawk_map_t* env_map; hawk_map_t* env_map;
hawk_oow_t env_map_rev; hawk_oow_t env_map_rev;
hawk_env_char_t** envp; void* envp;
xtn_t* xtn; xtn_t* xtn;
rxtn_t* rxtn; rxtn_t* rxtn;
@@ -2070,24 +2068,21 @@ static void* rtx_env_maker (hawk_rtx_t* rtx, hawk_rtx_env_mk_type_t env_mk_type)
env_map_rev = 0; env_map_rev = 0;
} }
if (!rxtn->envp || rxtn->env_map != env_map || if (!rxtn->envp || rxtn->env_type != env_mk_type ||
rxtn->env_map != env_map ||
(env_map && rxtn->env_map_rev != env_map_rev)) (env_map && rxtn->env_map_rev != env_map_rev))
{ {
envp = hawk_rtx_commit_environ(rtx, xtn->gbl_environ); envp = hawk_rtx_commit_environ(rtx, xtn->gbl_environ, env_mk_type);
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL; if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
if (rxtn->envp) hawk_rtx_freemem(rtx, rxtn->envp); if (rxtn->envp) hawk_rtx_freemem(rtx, rxtn->envp);
rxtn->envp = envp; rxtn->envp = envp;
rxtn->env_map = env_map; rxtn->env_map = env_map;
rxtn->env_map_rev = env_map_rev; rxtn->env_map_rev = env_map_rev;
rxtn->env_type = env_mk_type;
} }
return rxtn->envp; return rxtn->envp;
}
/* TODO: support more types */
/* unsupported env_mk_type */
return HAWK_NULL;
} }
static void* pio_env_maker (hawk_pio_env_mk_type_t env_mk_type, void* ctx) static void* pio_env_maker (hawk_pio_env_mk_type_t env_mk_type, void* ctx)
@@ -2138,7 +2133,7 @@ static hawk_ooi_t pio_handler_open (hawk_rtx_t* rtx, hawk_rio_arg_t* riod)
0, 0,
riod->name, riod->name,
flags | HAWK_PIO_SHELL | HAWK_PIO_TEXT | HAWK_PIO_IGNOREECERR, flags | HAWK_PIO_SHELL | HAWK_PIO_TEXT | HAWK_PIO_IGNOREECERR,
(rtx->rio.env_mk? pio_env_maker: HAWK_NULL), (rtx->rio.env_mk? pio_env_maker: (hawk_pio_env_mk_t)HAWK_NULL),
rtx rtx
); );
if (!handle) return -1; if (!handle) return -1;
@@ -2849,6 +2844,7 @@ static void fini_rxtn (hawk_rtx_t* rtx, void* ctx)
} }
rxtn->env_map = HAWK_NULL; rxtn->env_map = HAWK_NULL;
rxtn->env_map_rev = 0; rxtn->env_map_rev = 0;
rxtn->env_type = HAWK_RTX_ENV_MK_BPP;
} }
static int build_argcv (hawk_rtx_t* rtx, int argc_id, int argv_id, const hawk_ooch_t* id, hawk_ooch_t* icf[]) static int build_argcv (hawk_rtx_t* rtx, int argc_id, int argv_id, const hawk_ooch_t* id, hawk_ooch_t* icf[])
@@ -3078,14 +3074,12 @@ static int build_environ (hawk_rtx_t* rtx, int gbl_id, hawk_env_char_t* envarr[]
return 0; return 0;
} }
hawk_bch_t** hawk_rtx_commit_environ (hawk_rtx_t* rtx, int gbl_id) void* hawk_rtx_commit_environ (hawk_rtx_t* rtx, int gbl_id, hawk_rtx_env_mk_type_t env_mk_type)
{ {
hawk_val_t* v_env; hawk_val_t* v_env;
hawk_map_t* map; hawk_map_t* map;
hawk_map_itr_t itr; hawk_map_itr_t itr;
hawk_map_pair_t* pair; hawk_map_pair_t* pair;
hawk_env_char_t** envp;
hawk_env_char_t* ptr;
hawk_oow_t count, ptr_bytes, str_bytes; hawk_oow_t count, ptr_bytes, str_bytes;
v_env = hawk_rtx_getgbl(rtx, gbl_id); v_env = hawk_rtx_getgbl(rtx, gbl_id);
@@ -3095,12 +3089,44 @@ hawk_bch_t** hawk_rtx_commit_environ (hawk_rtx_t* rtx, int gbl_id)
{ {
/* it may be nil. but we can't prevent ENVIRON from being set to /* it may be nil. but we can't prevent ENVIRON from being set to
* other scalar types, we should handle this case gracefully */ * other scalar types, we should handle this case gracefully */
envp = (hawk_env_char_t**)hawk_rtx_allocmem(rtx, HAWK_SIZEOF(*envp) * 1); switch (env_mk_type)
{
case HAWK_RTX_ENV_MK_BPP:
{
hawk_bch_t** envp;
envp = (hawk_bch_t**)hawk_rtx_allocmem(rtx, HAWK_SIZEOF(*envp) * 1);
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL; if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
envp[0] = HAWK_NULL; envp[0] = HAWK_NULL;
return envp; return envp;
} }
case HAWK_RTX_ENV_MK_BPN:
{
hawk_bch_t* envp;
envp = (hawk_bch_t*)hawk_rtx_allocmem(rtx, HAWK_SIZEOF(*envp) * 2);
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
envp[0] = '\0';
envp[1] = '\0';
return envp;
}
case HAWK_RTX_ENV_MK_UPN:
{
hawk_uch_t* envp;
envp = (hawk_uch_t*)hawk_rtx_allocmem(rtx, HAWK_SIZEOF(*envp) * 2);
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
envp[0] = '\0';
envp[1] = '\0';
return envp;
}
}
return HAWK_NULL;
}
map = ((hawk_val_map_t*)v_env)->map; map = ((hawk_val_map_t*)v_env)->map;
HAWK_ASSERT(map != HAWK_NULL); HAWK_ASSERT(map != HAWK_NULL);
@@ -3130,32 +3156,38 @@ hawk_bch_t** hawk_rtx_commit_environ (hawk_rtx_t* rtx, int gbl_id)
} }
#endif #endif
#if defined(HAWK_ENV_CHAR_IS_BCH) if (env_mk_type == HAWK_RTX_ENV_MK_UPN)
{
{
hawk_uch_t* vptr;
vptr = hawk_rtx_valtoucstrdup(rtx, HAWK_MAP_VPTR(pair), &vlen);
if (HAWK_UNLIKELY(!vptr)) return HAWK_NULL;
hawk_rtx_freemem(rtx, vptr);
}
}
else
{ {
hawk_bch_t* vptr; hawk_bch_t* vptr;
vptr = hawk_rtx_getvalbcstr(rtx, HAWK_MAP_VPTR(pair), &vlen); vptr = hawk_rtx_getvalbcstr(rtx, HAWK_MAP_VPTR(pair), &vlen);
if (HAWK_UNLIKELY(!vptr)) return HAWK_NULL; if (HAWK_UNLIKELY(!vptr)) return HAWK_NULL;
hawk_rtx_freevalbcstr(rtx, HAWK_MAP_VPTR(pair), vptr); hawk_rtx_freevalbcstr(rtx, HAWK_MAP_VPTR(pair), vptr);
} }
#else
{
hawk_uch_t* vptr;
vptr = hawk_rtx_getvalucstr(rtx, HAWK_MAP_VPTR(pair), &vlen);
if (HAWK_UNLIKELY(!vptr)) return HAWK_NULL;
hawk_rtx_freevalucstr(rtx, HAWK_MAP_VPTR(pair), vptr);
}
#endif
str_bytes += klen + 1 + vlen + 1; str_bytes += klen + 1 + vlen + 1;
count++; count++;
pair = hawk_map_getnextpair(map, &itr); pair = hawk_map_getnextpair(map, &itr);
} }
if (env_mk_type == HAWK_RTX_ENV_MK_BPP)
{
hawk_bch_t** envp;
hawk_bch_t* ptr;
ptr_bytes = HAWK_SIZEOF(*envp) * (count + 1); ptr_bytes = HAWK_SIZEOF(*envp) * (count + 1);
envp = (hawk_env_char_t**)hawk_rtx_allocmem(rtx, ptr_bytes + (str_bytes * HAWK_SIZEOF(*ptr))); envp = (hawk_bch_t**)hawk_rtx_allocmem(rtx, ptr_bytes + (str_bytes * HAWK_SIZEOF(*ptr)));
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL; if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
ptr = (hawk_env_char_t*)((hawk_uint8_t*)envp + ptr_bytes); ptr = (hawk_bch_t*)((hawk_uint8_t*)envp + ptr_bytes);
count = 0; count = 0;
hawk_init_map_itr(&itr, 0); hawk_init_map_itr(&itr, 0);
@@ -3167,11 +3199,10 @@ hawk_bch_t** hawk_rtx_commit_environ (hawk_rtx_t* rtx, int gbl_id)
envp[count++] = ptr; envp[count++] = ptr;
klen = HAWK_MAP_KLEN(pair); klen = HAWK_MAP_KLEN(pair);
#if ((defined(HAWK_ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \ #if defined(HAWK_OOCH_IS_BCH)
(defined(HAWK_ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
HAWK_MEMCPY(ptr, HAWK_MAP_KPTR(pair), klen); HAWK_MEMCPY(ptr, HAWK_MAP_KPTR(pair), klen);
ptr += klen; ptr += klen;
#elif defined(HAWK_ENV_CHAR_IS_BCH) #else
{ {
hawk_oow_t tmp_ulen, tmp_blen; hawk_oow_t tmp_ulen, tmp_blen;
@@ -3183,8 +3214,112 @@ hawk_bch_t** hawk_rtx_commit_environ (hawk_rtx_t* rtx, int gbl_id)
return HAWK_NULL; return HAWK_NULL;
} }
ptr += tmp_blen; ptr += tmp_blen;
klen = tmp_blen;
} }
#endif
*ptr++ = '=';
{
hawk_bch_t* vptr;
vptr = hawk_rtx_getvalbcstr(rtx, HAWK_MAP_VPTR(pair), &vlen);
if (HAWK_UNLIKELY(!vptr))
{
hawk_rtx_freemem(rtx, envp);
return HAWK_NULL;
}
HAWK_MEMCPY(ptr, vptr, vlen);
ptr += vlen;
hawk_rtx_freevalbcstr(rtx, HAWK_MAP_VPTR(pair), vptr);
}
*ptr++ = '\0';
pair = hawk_map_getnextpair(map, &itr);
}
envp[count] = HAWK_NULL;
return envp;
}
else if (env_mk_type == HAWK_RTX_ENV_MK_BPN)
{
hawk_bch_t* envp;
hawk_bch_t* ptr;
envp = (hawk_bch_t*)hawk_rtx_allocmem(rtx, (str_bytes + 1) * HAWK_SIZEOF(*envp));
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
ptr = envp;
hawk_init_map_itr(&itr, 0);
pair = hawk_map_getfirstpair(map, &itr);
while (pair)
{
hawk_oow_t klen, vlen;
klen = HAWK_MAP_KLEN(pair);
#if defined(HAWK_OOCH_IS_BCH)
HAWK_MEMCPY(ptr, HAWK_MAP_KPTR(pair), klen);
ptr += klen;
#else
{
hawk_oow_t tmp_ulen, tmp_blen;
tmp_ulen = klen;
tmp_blen = str_bytes;
if (hawk_rtx_convutobchars(rtx, HAWK_MAP_KPTR(pair), &tmp_ulen, ptr, &tmp_blen) <= -1)
{
hawk_rtx_freemem(rtx, envp);
return HAWK_NULL;
}
ptr += tmp_blen;
}
#endif
*ptr++ = '=';
{
hawk_bch_t* vptr;
vptr = hawk_rtx_getvalbcstr(rtx, HAWK_MAP_VPTR(pair), &vlen);
if (HAWK_UNLIKELY(!vptr))
{
hawk_rtx_freemem(rtx, envp);
return HAWK_NULL;
}
HAWK_MEMCPY(ptr, vptr, vlen);
ptr += vlen;
hawk_rtx_freevalbcstr(rtx, HAWK_MAP_VPTR(pair), vptr);
}
*ptr++ = '\0';
pair = hawk_map_getnextpair(map, &itr);
}
*ptr++ = '\0';
return envp;
}
else if (env_mk_type == HAWK_RTX_ENV_MK_UPN)
{
hawk_uch_t* envp;
hawk_uch_t* ptr;
envp = (hawk_uch_t*)hawk_rtx_allocmem(rtx, (str_bytes + 1) * HAWK_SIZEOF(*envp));
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
ptr = envp;
hawk_init_map_itr(&itr, 0);
pair = hawk_map_getfirstpair(map, &itr);
while (pair)
{
hawk_oow_t klen, vlen;
klen = HAWK_MAP_KLEN(pair);
#if defined(HAWK_OOCH_IS_UCH)
HAWK_MEMCPY(ptr, HAWK_MAP_KPTR(pair), klen);
ptr += klen;
#else #else
{ {
hawk_oow_t tmp_blen, tmp_ulen; hawk_oow_t tmp_blen, tmp_ulen;
@@ -3197,32 +3332,15 @@ hawk_bch_t** hawk_rtx_commit_environ (hawk_rtx_t* rtx, int gbl_id)
return HAWK_NULL; return HAWK_NULL;
} }
ptr += tmp_ulen; ptr += tmp_ulen;
klen = tmp_ulen;
} }
#endif #endif
*ptr++ = '='; *ptr++ = '=';
#if defined(HAWK_ENV_CHAR_IS_BCH)
{
hawk_bch_t* vptr;
vptr = hawk_rtx_getvalbcstr(rtx, HAWK_MAP_VPTR(pair), &vlen);
if (HAWK_UNLIKELY(!vptr))
{
hawk_rtx_freemem(rtx, envp);
return HAWK_NULL;
}
HAWK_MEMCPY(ptr, vptr, vlen);
ptr += vlen;
hawk_rtx_freevalbcstr(rtx, HAWK_MAP_VPTR(pair), vptr);
}
#else
{ {
hawk_uch_t* vptr; hawk_uch_t* vptr;
vptr = hawk_rtx_getvalucstr(rtx, HAWK_MAP_VPTR(pair), &vlen); vptr = hawk_rtx_valtoucstrdup(rtx, HAWK_MAP_VPTR(pair), &vlen);
if (HAWK_UNLIKELY(!vptr)) if (HAWK_UNLIKELY(!vptr))
{ {
hawk_rtx_freemem(rtx, envp); hawk_rtx_freemem(rtx, envp);
@@ -3231,27 +3349,33 @@ hawk_bch_t** hawk_rtx_commit_environ (hawk_rtx_t* rtx, int gbl_id)
HAWK_MEMCPY(ptr, vptr, vlen); HAWK_MEMCPY(ptr, vptr, vlen);
ptr += vlen; ptr += vlen;
hawk_rtx_freevalucstr(rtx, HAWK_MAP_VPTR(pair), vptr); hawk_rtx_freemem(rtx, vptr);
} }
#endif
*ptr++ = '\0'; *ptr++ = '\0';
pair = hawk_map_getnextpair(map, &itr); pair = hawk_map_getnextpair(map, &itr);
} }
envp[count] = HAWK_NULL; *ptr++ = '\0';
return envp; return envp;
}
return HAWK_NULL;
} }
static int make_additional_globals (hawk_rtx_t* rtx, xtn_t* xtn, const hawk_ooch_t* id, hawk_ooch_t* icf[]) static int make_additional_globals (hawk_rtx_t* rtx, xtn_t* xtn, const hawk_ooch_t* id, hawk_ooch_t* icf[])
{ {
#if defined(HAVE_CRT_EXTERNS_H) #if defined(_WIN32)
#define SYSTEM_ENVIRON _environ
#elif defined(HAVE_CRT_EXTERNS_H)
#define environ (*(_NSGetEnviron())) #define environ (*(_NSGetEnviron()))
#define SYSTEM_ENVIRON environ
#else #else
extern char** environ; extern char** environ;
#define SYSTEM_ENVIRON environ
#endif #endif
if (build_argcv(rtx, xtn->gbl_argc, xtn->gbl_argv, id, icf) <= -1 || if (build_argcv(rtx, xtn->gbl_argc, xtn->gbl_argv, id, icf) <= -1 ||
build_environ(rtx, xtn->gbl_environ, environ) <= -1) return -1; build_environ(rtx, xtn->gbl_environ, SYSTEM_ENVIRON) <= -1) return -1;
return 0; return 0;
} }
+10 -10
View File
@@ -3261,14 +3261,14 @@ int hawk_fnmat_uchars_i (const hawk_uch_t* str, hawk_oow_t slen, const hawk_uch_
* a period in the pattern explicitly * a period in the pattern explicitly
*/ */
if ((!no_first_period && sp == str) || if ((!no_first_period && sp == str) ||
(HAWK_FNMAT_IS_SEP(sp[-1]) && (flags & HAWK_FNMAT_PATHNAME))) (HAWK_IS_PATH_SEP(sp[-1]) && (flags & HAWK_FNMAT_PATHNAME)))
{ {
if (pc != '.') return 0; if (pc != '.') return 0;
sp++; pp++; sp++; pp++;
continue; continue;
} }
} }
else if (HAWK_FNMAT_IS_SEP(sc) && (flags & HAWK_FNMAT_PATHNAME)) else if (HAWK_IS_PATH_SEP(sc) && (flags & HAWK_FNMAT_PATHNAME))
{ {
while (pc == '*') while (pc == '*')
{ {
@@ -3277,7 +3277,7 @@ int hawk_fnmat_uchars_i (const hawk_uch_t* str, hawk_oow_t slen, const hawk_uch_
} }
/* a path separator must be matched explicitly */ /* a path separator must be matched explicitly */
if (!HAWK_FNMAT_IS_SEP(pc)) return 0; if (!HAWK_IS_PATH_SEP(pc)) return 0;
sp++; pp++; sp++; pp++;
continue; continue;
} }
@@ -3307,7 +3307,7 @@ int hawk_fnmat_uchars_i (const hawk_uch_t* str, hawk_oow_t slen, const hawk_uch_
const hawk_uch_t* s = sp; const hawk_uch_t* s = sp;
for (s = sp; s < se; s++) for (s = sp; s < se; s++)
{ {
if (HAWK_FNMAT_IS_SEP(*s)) return 0; if (HAWK_IS_PATH_SEP(*s)) return 0;
} }
} }
return 1; return 1;
@@ -3317,7 +3317,7 @@ int hawk_fnmat_uchars_i (const hawk_uch_t* str, hawk_oow_t slen, const hawk_uch_
do do
{ {
if (hawk_fnmat_uchars_i(sp, se - sp, pp, pe - pp, flags, 1)) return 1; if (hawk_fnmat_uchars_i(sp, se - sp, pp, pe - pp, flags, 1)) return 1;
if (HAWK_FNMAT_IS_SEP(*sp) && (flags & HAWK_FNMAT_PATHNAME)) break; if (HAWK_IS_PATH_SEP(*sp) && (flags & HAWK_FNMAT_PATHNAME)) break;
sp++; sp++;
} }
while (sp < se); while (sp < se);
@@ -3492,14 +3492,14 @@ int hawk_fnmat_bchars_i (const hawk_bch_t* str, hawk_oow_t slen, const hawk_bch_
* a period in the pattern explicitly * a period in the pattern explicitly
*/ */
if ((!no_first_period && sp == str) || if ((!no_first_period && sp == str) ||
(HAWK_FNMAT_IS_SEP(sp[-1]) && (flags & HAWK_FNMAT_PATHNAME))) (HAWK_IS_PATH_SEP(sp[-1]) && (flags & HAWK_FNMAT_PATHNAME)))
{ {
if (pc != '.') return 0; if (pc != '.') return 0;
sp++; pp++; sp++; pp++;
continue; continue;
} }
} }
else if (HAWK_FNMAT_IS_SEP(sc) && (flags & HAWK_FNMAT_PATHNAME)) else if (HAWK_IS_PATH_SEP(sc) && (flags & HAWK_FNMAT_PATHNAME))
{ {
while (pc == '*') while (pc == '*')
{ {
@@ -3508,7 +3508,7 @@ int hawk_fnmat_bchars_i (const hawk_bch_t* str, hawk_oow_t slen, const hawk_bch_
} }
/* a path separator must be matched explicitly */ /* a path separator must be matched explicitly */
if (!HAWK_FNMAT_IS_SEP(pc)) return 0; if (!HAWK_IS_PATH_SEP(pc)) return 0;
sp++; pp++; sp++; pp++;
continue; continue;
} }
@@ -3538,7 +3538,7 @@ int hawk_fnmat_bchars_i (const hawk_bch_t* str, hawk_oow_t slen, const hawk_bch_
const hawk_bch_t* s = sp; const hawk_bch_t* s = sp;
for (s = sp; s < se; s++) for (s = sp; s < se; s++)
{ {
if (HAWK_FNMAT_IS_SEP(*s)) return 0; if (HAWK_IS_PATH_SEP(*s)) return 0;
} }
} }
return 1; return 1;
@@ -3548,7 +3548,7 @@ int hawk_fnmat_bchars_i (const hawk_bch_t* str, hawk_oow_t slen, const hawk_bch_
do do
{ {
if (hawk_fnmat_bchars_i(sp, se - sp, pp, pe - pp, flags, 1)) return 1; if (hawk_fnmat_bchars_i(sp, se - sp, pp, pe - pp, flags, 1)) return 1;
if (HAWK_FNMAT_IS_SEP(*sp) && (flags & HAWK_FNMAT_PATHNAME)) break; if (HAWK_IS_PATH_SEP(*sp) && (flags & HAWK_FNMAT_PATHNAME)) break;
sp++; sp++;
} }
while (sp < se); while (sp < se);
+5 -5
View File
@@ -1621,14 +1621,14 @@ int _fn_name_ (const _char_type_* str, hawk_oow_t slen, const _char_type_* ptn,
* a period in the pattern explicitly * a period in the pattern explicitly
*/ */
if ((!no_first_period && sp == str) || if ((!no_first_period && sp == str) ||
(HAWK_FNMAT_IS_SEP(sp[-1]) && (flags & HAWK_FNMAT_PATHNAME))) (HAWK_IS_PATH_SEP(sp[-1]) && (flags & HAWK_FNMAT_PATHNAME)))
{ {
if (pc != '.') return 0; if (pc != '.') return 0;
sp++; pp++; sp++; pp++;
continue; continue;
} }
} }
else if (HAWK_FNMAT_IS_SEP(sc) && (flags & HAWK_FNMAT_PATHNAME)) else if (HAWK_IS_PATH_SEP(sc) && (flags & HAWK_FNMAT_PATHNAME))
{ {
while (pc == '*') while (pc == '*')
{ {
@@ -1637,7 +1637,7 @@ int _fn_name_ (const _char_type_* str, hawk_oow_t slen, const _char_type_* ptn,
} }
/* a path separator must be matched explicitly */ /* a path separator must be matched explicitly */
if (!HAWK_FNMAT_IS_SEP(pc)) return 0; if (!HAWK_IS_PATH_SEP(pc)) return 0;
sp++; pp++; sp++; pp++;
continue; continue;
} }
@@ -1667,7 +1667,7 @@ int _fn_name_ (const _char_type_* str, hawk_oow_t slen, const _char_type_* ptn,
const _char_type_* s = sp; const _char_type_* s = sp;
for (s = sp; s < se; s++) for (s = sp; s < se; s++)
{ {
if (HAWK_FNMAT_IS_SEP(*s)) return 0; if (HAWK_IS_PATH_SEP(*s)) return 0;
} }
} }
return 1; return 1;
@@ -1677,7 +1677,7 @@ int _fn_name_ (const _char_type_* str, hawk_oow_t slen, const _char_type_* ptn,
do do
{ {
if (_fn_name_()(sp, se - sp, pp, pe - pp, flags, 1)) return 1; if (_fn_name_()(sp, se - sp, pp, pe - pp, flags, 1)) return 1;
if (HAWK_FNMAT_IS_SEP(*sp) && (flags & HAWK_FNMAT_PATHNAME)) break; if (HAWK_IS_PATH_SEP(*sp) && (flags & HAWK_FNMAT_PATHNAME)) break;
sp++; sp++;
} }
while (sp < se); while (sp < se);
+4 -10
View File
@@ -509,19 +509,13 @@ int hawk_conv_bchars_to_uchars_upto_stopper_with_cmgr (
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
# define IS_PATH_SEP(c) ((c) == '/' || (c) == '\\')
#else
# define IS_PATH_SEP(c) ((c) == '/')
#endif
const hawk_uch_t* hawk_get_base_name_ucstr (const hawk_uch_t* path) const hawk_uch_t* hawk_get_base_name_ucstr (const hawk_uch_t* path)
{ {
const hawk_uch_t* p, * last = HAWK_NULL; const hawk_uch_t* p, * last = HAWK_NULL;
for (p = path; *p != '\0'; p++) for (p = path; *p != '\0'; p++)
{ {
if (IS_PATH_SEP(*p)) last = p; if (HAWK_IS_PATH_SEP(*p)) last = p;
} }
return last? (last + 1): path; return last? (last + 1): path;
@@ -533,7 +527,7 @@ const hawk_bch_t* hawk_get_base_name_bcstr (const hawk_bch_t* path)
for (p = path; *p != '\0'; p++) for (p = path; *p != '\0'; p++)
{ {
if (IS_PATH_SEP(*p)) last = p; if (HAWK_IS_PATH_SEP(*p)) last = p;
} }
return last? (last + 1): path; return last? (last + 1): path;
@@ -546,7 +540,7 @@ const hawk_uch_t* hawk_get_base_name_uchars (const hawk_uch_t* path, hawk_oow_t
for (p = path; p < end; p++) for (p = path; p < end; p++)
{ {
if (IS_PATH_SEP(*p)) last = p; if (HAWK_IS_PATH_SEP(*p)) last = p;
} }
return last? (last + 1): path; return last? (last + 1): path;
@@ -559,7 +553,7 @@ const hawk_bch_t* hawk_get_base_name_bchars (const hawk_bch_t* path, hawk_oow_t
for (p = path; p < end; p++) for (p = path; p < end; p++)
{ {
if (IS_PATH_SEP(*p)) last = p; if (HAWK_IS_PATH_SEP(*p)) last = p;
} }
return last? (last + 1): path; return last? (last + 1): path;
+51 -30
View File
@@ -40,9 +40,11 @@
#if defined(_WIN32) #if defined(_WIN32)
# include <windows.h> # include <windows.h>
# include <signal.h>
#elif defined(__OS2__) #elif defined(__OS2__)
# define INCL_DOSPROCESS # define INCL_DOSPROCESS
# include <os2.h> # include <os2.h>
# include <signal.h>
#else #else
# include <unistd.h> # include <unistd.h>
# include <signal.h> # include <signal.h>
@@ -54,12 +56,12 @@ typedef HAWK::HawkStd HawkStd;
typedef HAWK::HawkStd::Run Run; typedef HAWK::HawkStd::Run Run;
typedef HAWK::HawkStd::Value Value; typedef HAWK::HawkStd::Value Value;
#ifdef _WIN32 /*#ifdef _WIN32
static BOOL WINAPI stop_run (DWORD ctrl_type); static BOOL WINAPI stop_run (DWORD ctrl_type);
#else #else */
static void stop_run (int sig); static void stop_run (int sig);
static void do_nothing (int sig); static void do_nothing (int sig);
#endif /*#endif*/
static void relay_signal (int sig); static void relay_signal (int sig);
static int setsignal (int sig, void(*handler)(int), int restart); static int setsignal (int sig, void(*handler)(int), int restart);
static void print_debug_return (hawk_rtx_t* rtx, hawk_val_t* ret); static void print_debug_return (hawk_rtx_t* rtx, hawk_val_t* ret);
@@ -215,6 +217,15 @@ static void print_error (const hawk_bch_t* fmt, ...)
va_end (va); va_end (va);
} }
static void print_warning (const hawk_bch_t* fmt, ...)
{
va_list va;
fprintf (stderr, "WARNING: ");
va_start (va, fmt);
vfprintf (stderr, fmt, va);
va_end (va);
}
static void print_error(MyHawk& hawk) static void print_error(MyHawk& hawk)
{ {
hawk_errnum_t code = hawk.getErrorNumber(); hawk_errnum_t code = hawk.getErrorNumber();
@@ -239,7 +250,8 @@ static void print_error(MyHawk& hawk)
} }
} }
#ifdef _WIN32 /*
#if defined(_WIN32)
static BOOL WINAPI stop_run (DWORD ctrl_type) static BOOL WINAPI stop_run (DWORD ctrl_type)
{ {
if (ctrl_type == CTRL_C_EVENT || if (ctrl_type == CTRL_C_EVENT ||
@@ -251,10 +263,11 @@ static BOOL WINAPI stop_run (DWORD ctrl_type)
return FALSE; return FALSE;
} }
#else #else */
static int setsignal (int sig, void(*handler)(int), int restart) static int setsignal (int sig, void(*handler)(int), int restart)
{ {
#if defined(HAVE_SIGACTION)
struct sigaction sa_int; struct sigaction sa_int;
sa_int.sa_handler = handler; sa_int.sa_handler = handler;
@@ -264,17 +277,20 @@ static int setsignal (int sig, void(*handler)(int), int restart)
if (restart) if (restart)
{ {
#ifdef SA_RESTART #if defined(SA_RESTART)
sa_int.sa_flags |= SA_RESTART; sa_int.sa_flags |= SA_RESTART;
#endif #endif
} }
else else
{ {
#ifdef SA_INTERRUPT #if defined(SA_INTERRUPT)
sa_int.sa_flags |= SA_INTERRUPT; sa_int.sa_flags |= SA_INTERRUPT;
#endif #endif
} }
return sigaction(sig, &sa_int, NULL); return sigaction(sig, &sa_int, NULL);
#else
return (signal(sig, handler) == SIG_ERR)? -1: 0;
#endif
} }
static void stop_run (int sig) static void stop_run (int sig)
@@ -288,27 +304,32 @@ static void do_nothing (int sig)
{ {
} }
#endif /*#endif*/
static void set_signal (void) static void set_signal (void)
{ {
#ifdef _WIN32 /*#ifdef _WIN32
SetConsoleCtrlHandler(stop_run, TRUE); SetConsoleCtrlHandler(stop_run, TRUE);
#else #else*/
/*setsignal(SIGINT, stop_run, 1); TO BE MORE COMPATIBLE WITH WIN32*/ /*setsignal(SIGINT, stop_run, 1); TO BE MORE COMPATIBLE WITH WIN32*/
setsignal(SIGINT, stop_run, 0); setsignal(SIGINT, stop_run, 0);
#if defined(SIGPIPE)
setsignal(SIGPIPE, do_nothing, 0); setsignal(SIGPIPE, do_nothing, 0);
#endif #endif
/*#endif*/
} }
static void unset_signal(void) static void unset_signal(void)
{ {
/*
#ifdef _WIN32 #ifdef _WIN32
SetConsoleCtrlHandler(stop_run, FALSE); SetConsoleCtrlHandler(stop_run, FALSE);
#else #else*/
setsignal(SIGINT, SIG_DFL, 1); setsignal(SIGINT, SIG_DFL, 1);
#if defined(SIGPIPE)
setsignal(SIGPIPE, SIG_DFL, 1); setsignal(SIGPIPE, SIG_DFL, 1);
#endif #endif
/*#endif*/
} }
static void print_usage (FILE* out, const hawk_bch_t* argv0) static void print_usage (FILE* out, const hawk_bch_t* argv0)
@@ -505,7 +526,7 @@ static int handle_cmdline (MyHawk& hawk, int argc, hawk_bch_t* argv[], cmdline_t
}; };
hawk_bci_t c; hawk_bci_t c;
std::memset (cmdline, 0, HAWK_SIZEOF(*cmdline)); std::memset(cmdline, 0, HAWK_SIZEOF(*cmdline));
while ((c = hawk_get_bcli(argc, argv, &opt)) != HAWK_BCI_EOF) while ((c = hawk_get_bcli(argc, argv, &opt)) != HAWK_BCI_EOF)
{ {
switch (c) switch (c)
@@ -626,7 +647,7 @@ static int make_args_for_exec (cmdline_t* cmdline, MyHawk& hawk, MyHawk::Run* ru
{ {
if (cmdline->argv[i - 1].setStr(run, hawk.getArgument(i)) <= -1) if (cmdline->argv[i - 1].setStr(run, hawk.getArgument(i)) <= -1)
{ {
free_args_for_exec (cmdline); free_args_for_exec(cmdline);
return -1; return -1;
} }
cmdline->argc++; cmdline->argc++;
@@ -634,8 +655,8 @@ static int make_args_for_exec (cmdline_t* cmdline, MyHawk& hawk, MyHawk::Run* ru
} }
catch (...) catch (...)
{ {
free_args_for_exec (cmdline); free_args_for_exec(cmdline);
hawk.setError (HAWK_ENOMEM); hawk.setError(HAWK_ENOMEM);
return -1; return -1;
} }
@@ -716,7 +737,7 @@ static int hawk_main (MyHawk& hawk, int argc, hawk_bch_t* argv[])
if (cmdline.fs) if (cmdline.fs)
{ {
MyHawk::Value fs (run); MyHawk::Value fs(run);
if (fs.setStr(cmdline.fs) <= -1) if (fs.setStr(cmdline.fs) <= -1)
{ {
print_error(hawk); print_error(hawk);
@@ -769,7 +790,7 @@ static int hawk_main (MyHawk& hawk, int argc, hawk_bch_t* argv[])
static HAWK_INLINE int execute_hawk (int argc, hawk_bch_t* argv[]) static HAWK_INLINE int execute_hawk (int argc, hawk_bch_t* argv[])
{ {
//HAWK::HeapMmgr hm (1000000); //HAWK::HeapMmgr hm (1000000);
//MyHawk awk (&hm); //MyHawk awk(&hm);
MyHawk hawk; MyHawk hawk;
if (hawk.open() <= -1) if (hawk.open() <= -1)
@@ -779,9 +800,9 @@ static HAWK_INLINE int execute_hawk (int argc, hawk_bch_t* argv[])
} }
app_hawk = &hawk; app_hawk = &hawk;
set_signal (); set_signal();
int n = hawk_main(hawk, argc, argv); int n = hawk_main(hawk, argc, argv);
unset_signal (); unset_signal();
app_hawk = HAWK_NULL; app_hawk = HAWK_NULL;
hawk.close(); hawk.close();
@@ -810,39 +831,39 @@ int main (int argc, hawk_bch_t* argv[])
codepage = GetConsoleOutputCP(); codepage = GetConsoleOutputCP();
if (codepage == CP_UTF8) if (codepage == CP_UTF8)
{ {
/*SetConsoleOUtputCP (CP_UTF8);*/ /*SetConsoleOUtputCP(CP_UTF8);*/
/*hawk_setdflcmgrbyid (HAWK_CMGR_UTF8);*/ /*hawk_setdflcmgrbyid(HAWK_CMGR_UTF8);*/
} }
else else
{ {
/* .codepage */ /* .codepage */
hawk_fmt_uintmax_to_bcstr (locale, HAWK_COUNTOF(locale), codepage, 10, -1, '\0', "."); hawk_fmt_uintmax_to_bcstr(locale, HAWK_COUNTOF(locale), codepage, 10, -1, '\0', ".");
setlocale (LC_ALL, locale); setlocale(LC_ALL, locale);
/* hawk_setdflcmgrbyid (HAWK_CMGR_SLMB); */ /* hawk_setdflcmgrbyid(HAWK_CMGR_SLMB); */
} }
#else #else
setlocale (LC_ALL, ""); setlocale(LC_ALL, "");
/* hawk_setdflcmgrbyid (HAWK_CMGR_SLMB); */ /* hawk_setdflcmgrbyid(HAWK_CMGR_SLMB); */
#endif #endif
#if defined(_WIN32) #if defined(_WIN32)
if (WSAStartup(MAKEWORD(2,0), &wsadata) != 0) if (WSAStartup(MAKEWORD(2,0), &wsadata) != 0)
print_warning ("Failed to start up winsock\n"); print_warning("Failed to start up winsock\n");
else sock_inited = 1; else sock_inited = 1;
#elif defined(__DOS__) #elif defined(__DOS__)
/* TODO: add an option to skip watt-32 */ /* TODO: add an option to skip watt-32 */
_watt_do_exit = 0; /* prevent sock_init from exiting upon failure */ _watt_do_exit = 0; /* prevent sock_init from exiting upon failure */
if (sock_init() != 0) print_warning ("Failed to initialize watt-32\n"); if (sock_init() != 0) print_warning("Failed to initialize watt-32\n");
else sock_inited = 1; else sock_inited = 1;
#endif #endif
ret = execute_hawk(argc, argv); ret = execute_hawk(argc, argv);
#if defined(_WIN32) #if defined(_WIN32)
if (sock_inited) WSACleanup (); if (sock_inited) WSACleanup();
#elif defined(__DOS__) #elif defined(__DOS__)
if (sock_inited) sock_exit (); if (sock_inited) sock_exit();
#endif #endif
return ret; return ret;
+14 -9
View File
@@ -1,15 +1,20 @@
#include <Hawk-Sed.hpp> #include <Hawk-Sed.hpp>
#include <hawk-fmt.h>
#include <stdio.h> #include <stdio.h>
#include <stdarg.h> #include <stdarg.h>
#include <locale.h> #include <locale.h>
#if defined(_WIN32)
# include <windows.h>
#endif
static void print_error (const hawk_bch_t* fmt, ...) static void print_error (const hawk_bch_t* fmt, ...)
{ {
va_list va; va_list va;
fprintf (stderr, "ERROR: "); fprintf(stderr, "ERROR: ");
va_start (va, fmt); va_start(va, fmt);
vfprintf (stderr, fmt, va); vfprintf(stderr, fmt, va);
va_end (va); va_end(va);
} }
static void print_error (HAWK::SedStd& sed) static void print_error (HAWK::SedStd& sed)
@@ -105,20 +110,20 @@ int main (int argc, hawk_bch_t* argv[])
codepage = GetConsoleOutputCP(); codepage = GetConsoleOutputCP();
if (codepage == CP_UTF8) if (codepage == CP_UTF8)
{ {
/*SetConsoleOUtputCP (CP_UTF8);*/ /*SetConsoleOUtputCP(CP_UTF8);*/
/*hawk_setdflcmgrbyid (HAWK_CMGR_UTF8);*/ /*hawk_setdflcmgrbyid(HAWK_CMGR_UTF8);*/
} }
else else
{ {
/* .codepage */ /* .codepage */
hawk_fmt_uintmax_to_bcstr (locale, HAWK_COUNTOF(locale), codepage, 10, -1, '\0', "."); hawk_fmt_uintmax_to_bcstr(locale, HAWK_COUNTOF(locale), codepage, 10, -1, '\0', ".");
setlocale (LC_ALL, locale); setlocale(LC_ALL, locale);
/* hawk_setdflcmgrbyid (HAWK_CMGR_SLMB); */ /* hawk_setdflcmgrbyid (HAWK_CMGR_SLMB); */
} }
#else #else
setlocale (LC_ALL, ""); setlocale (LC_ALL, "");
/* hawk_setdflcmgrbyid (HAWK_CMGR_SLMB); */ /* hawk_setdflcmgrbyid(HAWK_CMGR_SLMB); */
#endif #endif
ret = execute_sed(argc, argv); ret = execute_sed(argc, argv);
+88
View File
@@ -0,0 +1,88 @@
@echo off
REM if you are two directories down from the top source directory,
REM you may run the command like this:
REM ..\..\t\cmd-tap-driver.cmd -- ..\..\t\run-hawk-test.cmd -f ..\..\t\h-001.hawk
REM -------------------------------------------------------------------------------
REM set HAWK_TEST_COMPILER=Z:\path\to\hawk\bld-mingw64\bin\.libs\hawk.exe
REM Z:\path\to\hawk\t\cmd-tap-driver.cmd --test-name h-011 --log-file h-011.log --trs-file h-011.trs -- Z:\path\to\hawk\t\t\run-hawk-test.cmd -f ..\..\t\h-011.hawk
REM
setlocal EnableExtensions DisableDelayedExpansion
set "test_name="
set "log_file="
set "trs_file="
:parse
if "%~1"=="" goto usage
if "%~1"=="--" goto seen_separator
if "%~1"=="--test-name" goto set_test_name
if "%~1"=="--log-file" goto set_log_file
if "%~1"=="--trs-file" goto set_trs_file
echo ERROR: unknown option %~1 1>&2
goto usage_exit
:set_test_name
if "%~2"=="" goto usage
set "test_name=%~2"
shift
shift
goto parse
:set_log_file
if "%~2"=="" goto usage
set "log_file=%~2"
shift
shift
goto parse
:set_trs_file
if "%~2"=="" goto usage
set "trs_file=%~2"
shift
shift
goto parse
:seen_separator
shift
:run
if "%~1"=="" goto usage
if not defined test_name set "test_name=cmd-test"
if not defined log_file set "log_file=%test_name%.log"
if not defined trs_file set "trs_file=%test_name%.trs"
call %1 %2 %3 %4 %5 %6 %7 %8 %9 >"%log_file%" 2>&1
set "cmd_status=%errorlevel%"
type "%log_file%"
set "result=PASS"
if not "%cmd_status%"=="0" set "result=FAIL"
findstr /b /c:"not ok " "%log_file%" >nul 2>&1
if not errorlevel 1 set "result=FAIL"
findstr /b /c:"1..0 # SKIP" "%log_file%" >nul 2>&1
if not errorlevel 1 set "result=SKIP"
(
echo :test-result: %result%
echo :global-test-result: %result%
echo :recheck: no
echo :copy-in-global-log: no
) >"%trs_file%"
echo %result%: %test_name%
if /i "%result%"=="PASS" exit /b 0
if /i "%result%"=="SKIP" exit /b 0
exit /b 1
:usage
echo Usage: %~nx0 --test-name NAME [--log-file FILE] [--trs-file FILE] -- COMMAND [ARGS...] 1>&2
:usage_exit
exit /b 2
+14 -1
View File
@@ -13,7 +13,7 @@ function on_sig (sig)
function main () function main ()
{ {
@local r; @local r, u;
@local badpid; @local badpid;
g_seen = 0; g_seen = 0;
@@ -84,5 +84,18 @@ function main ()
r = sys::kill(badpid, sys::SIGINT); r = sys::kill(badpid, sys::SIGINT);
tap_ensure (r, sys::RC_ESYSERR, @SCRIPTNAME, @SCRIPTLINE); tap_ensure (r, sys::RC_ESYSERR, @SCRIPTNAME, @SCRIPTLINE);
u = sys::uname();
tap_ensure (hawk::type(u), hawk::VAL_MAP, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (hawk::typename(u.sysname), "str", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (hawk::typename(u.nodename), "str", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (hawk::typename(u.release), "str", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (hawk::typename(u.version), "str", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (hawk::typename(u.machine), "str", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (length(u.sysname) > 0, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (length(u.nodename) > 0, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (length(u.release) > 0, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (length(u.version) > 0, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (length(u.machine) > 0, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_end (); tap_end ();
} }
+10 -2
View File
@@ -3,7 +3,7 @@
@include "tap.inc"; @include "tap.inc";
BEGIN { BEGIN {
@local v, v2, m, m2, js; @local v, v2, v3, m, m2, js;
v = json::parse("{\"a\":1,\"b\":true,\"c\":null,\"d\":[2,3],\"e\":{\"x\":\"y\"}}"); v = json::parse("{\"a\":1,\"b\":true,\"c\":null,\"d\":[2,3],\"e\":{\"x\":\"y\"}}");
@@ -26,7 +26,6 @@ BEGIN {
m["nested"] = hawk::map(); m["nested"] = hawk::map();
m["nested"]["ok"] = 1; m["nested"]["ok"] = 1;
m["nested"]["note"] = "hello\n\"world\""; m["nested"]["note"] = "hello\n\"world\"";
js = json::stringify(m); js = json::stringify(m);
m2 = json::parse(js); m2 = json::parse(js);
@@ -41,5 +40,14 @@ BEGIN {
tap_ensure(v2.a.b.c, 1, @SCRIPTNAME, @SCRIPTLINE); tap_ensure(v2.a.b.c, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(v2["a"].b["c"], 1, @SCRIPTNAME, @SCRIPTLINE); tap_ensure(v2["a"].b["c"], 1, @SCRIPTNAME, @SCRIPTLINE);
v3 = json::parse("[false,true,null,\"a\\tb\",-12.5]");
tap_ensure(hawk::type(v3), hawk::VAL_ARRAY, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(hawk::type(v3[1]), hawk::VAL_BOOL, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(v3[1], @false, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(v3[2], @true, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(hawk::isnil(v3[3]), 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(v3[4], "a\tb", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(v3[5], -12.5, @SCRIPTNAME, @SCRIPTLINE);
tap_end(); tap_end();
} }
+7
View File
@@ -44,10 +44,17 @@ function main()
{ {
## if PIPCLOEXEC is turned on, the file descriptor created by the shell (3> in run_pipe_test) ## if PIPCLOEXEC is turned on, the file descriptor created by the shell (3> in run_pipe_test)
## doesn't get inherited to the 'cat' commands in the following text ## doesn't get inherited to the 'cat' commands in the following text
@local uname;
uname = sys::uname()
if (uname["sysname"] ~ /Linux|Unix/) {
run_pipe_test("inherit-default", "BEGIN { print \"hello\" | \"cat >&3\" }", "hello\n"); run_pipe_test("inherit-default", "BEGIN { print \"hello\" | \"cat >&3\" }", "hello\n");
run_pipe_test("cloexec-global", "BEGIN { PIPECLOEXEC = 1; print \"hello\" | \"cat >&3\" }", ""); run_pipe_test("cloexec-global", "BEGIN { PIPECLOEXEC = 1; print \"hello\" | \"cat >&3\" }", "");
run_pipe_test("inherit-global-off", "BEGIN { PIPECLOEXEC = 0; print \"hello\" | \"cat >&3\" }", "hello\n");
run_pipe_test("cloexec-pragma", "@pragma pipecloexec on\nBEGIN { print \"hello\" | \"cat >&3\" }", ""); run_pipe_test("cloexec-pragma", "@pragma pipecloexec on\nBEGIN { print \"hello\" | \"cat >&3\" }", "");
} else {
tap_skip("PIPECLOEXEC not relevant");
}
tap_end(); tap_end();
} }
+12
View File
@@ -139,6 +139,18 @@ function main()
tap_ensure(!!@[1], @true, @SCRIPTNAME, @SCRIPTLINE); tap_ensure(!!@[1], @true, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(!dummy, @false, @SCRIPTNAME, @SCRIPTLINE); tap_ensure(!dummy, @false, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(!!dummy, @true, @SCRIPTNAME, @SCRIPTLINE); tap_ensure(!!dummy, @true, @SCRIPTNAME, @SCRIPTLINE);
tmp = 0;
tap_ensure(!tmp && 0, 0, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(!tmp && 1, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(!tmp || 0, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(!tmp || 1, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(1 && !tmp, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(0 || !tmp, 1, @SCRIPTNAME, @SCRIPTLINE);
tmp = 1;
tap_ensure(!tmp && 0, 0, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(!tmp && 1, 0, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(!tmp || 0, 0, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(!tmp || 1, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(sprintf("%d", @true), "1", @SCRIPTNAME, @SCRIPTLINE); tap_ensure(sprintf("%d", @true), "1", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(sprintf("%d", @false), "0", @SCRIPTNAME, @SCRIPTLINE); tap_ensure(sprintf("%d", @false), "0", @SCRIPTNAME, @SCRIPTLINE);
+4
View File
@@ -53,5 +53,9 @@ func main() {
a["k"].fn = mul; a["k"].fn = mul;
tap_ensure(a["k"].fn(4, 4), 16, @SCRIPTNAME, @SCRIPTLINE); tap_ensure(a["k"].fn(4, 4), 16, @SCRIPTNAME, @SCRIPTLINE);
a = @[ @{} ];
a[1].sum = add;
tap_ensure(a[1].sum(8, 9), 17, @SCRIPTNAME, @SCRIPTLINE);
tap_end(); tap_end();
} }
+29
View File
@@ -0,0 +1,29 @@
@echo off
setlocal EnableExtensions EnableDelayedExpansion
if defined HAWK_TEST_COMPILER (
set "hawk_bin=%HAWK_TEST_COMPILER%"
) else (
set "hawk_bin=..\bin\hawk.exe"
)
if defined HAWK_LOG_COMPILER set "hawk_bin=%HAWK_LOG_COMPILER%"
for %%I in ("%hawk_bin%") do (
set "hawk_bin=%%~fI"
set "hawk_dir=%%~dpI"
)
if not "!hawk_dir:\.libs\=!"=="!hawk_dir!" (
for %%I in ("!hawk_dir!..\..\lib\.libs") do (
if exist "%%~fI" set "PATH=%%~fI;!PATH!"
)
)
if defined HAWK_TEST_OPTS (
call "!hawk_bin!" %HAWK_TEST_OPTS% %*
) else (
call "!hawk_bin!" %*
)
exit /b %errorlevel%