Compare commits
10 Commits
5b47ec6b07
..
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 3d8ce4dbcd | |||
| 0d313cf474 | |||
| 1ca8160e07 | |||
| 6e05998bc9 | |||
| 0b900e7d0d | |||
| fe643c1c48 | |||
| d36d1a8675 | |||
| edea38a631 | |||
| c15ba6aa15 | |||
| 178cb49e5b |
@@ -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).
|
||||||
@@ -1111,7 +1135,6 @@ The `sys` module provides various functions concerning the underlying operation
|
|||||||
|
|
||||||
- sys::basename
|
- sys::basename
|
||||||
- sys::chmod
|
- sys::chmod
|
||||||
- sys::clearenv
|
|
||||||
- sys::close
|
- sys::close
|
||||||
- sys::closedir
|
- sys::closedir
|
||||||
- sys::dirname
|
- sys::dirname
|
||||||
@@ -1137,14 +1160,12 @@ The `sys` module provides various functions concerning the underlying operation
|
|||||||
- sys::raise
|
- sys::raise
|
||||||
- sys::read
|
- sys::read
|
||||||
- sys::readdir
|
- sys::readdir
|
||||||
- sys::setenv
|
|
||||||
- sys::setttime
|
- sys::setttime
|
||||||
- sys::signal
|
- sys::signal
|
||||||
- sys::sleep
|
- sys::sleep
|
||||||
- sys::strftime
|
- sys::strftime
|
||||||
- sys::system
|
- sys::system
|
||||||
- sys::unlink
|
- sys::unlink
|
||||||
- sys::unsetenv
|
|
||||||
- sys::wait
|
- sys::wait
|
||||||
- sys::write
|
- sys::write
|
||||||
|
|
||||||
|
|||||||
+9
-9
@@ -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
@@ -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
@@ -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 ""
|
||||||
|
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
+13
-2
@@ -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)
|
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)
|
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);
|
||||||
}
|
}
|
||||||
@@ -2123,10 +2123,12 @@ int Hawk::init_runctx ()
|
|||||||
if (this->runctx.rtx) return 0;
|
if (this->runctx.rtx) return 0;
|
||||||
|
|
||||||
hawk_rio_cbs_t rio;
|
hawk_rio_cbs_t rio;
|
||||||
|
HAWK_MEMSET(&rio, 0, HAWK_SIZEOF(rio));
|
||||||
|
|
||||||
rio.pipe = pipeHandler;
|
rio.pipe = pipeHandler;
|
||||||
rio.file = fileHandler;
|
rio.file = fileHandler;
|
||||||
rio.console = consoleHandler;
|
rio.console = consoleHandler;
|
||||||
|
rio.env_mk = HAWK_NULL;
|
||||||
|
|
||||||
hawk_rtx_t* rtx = hawk_rtx_open(this->hawk, HAWK_SIZEOF(rxtn_t), &rio);
|
hawk_rtx_t* rtx = hawk_rtx_open(this->hawk, HAWK_SIZEOF(rxtn_t), &rio);
|
||||||
if (HAWK_UNLIKELY(!rtx))
|
if (HAWK_UNLIKELY(!rtx))
|
||||||
@@ -2151,6 +2153,15 @@ void Hawk::fini_runctx ()
|
|||||||
{
|
{
|
||||||
if (this->runctx.rtx)
|
if (this->runctx.rtx)
|
||||||
{
|
{
|
||||||
|
if (this->runctx.envp)
|
||||||
|
{
|
||||||
|
hawk_rtx_freemem(this->runctx.rtx, this->runctx.envp);
|
||||||
|
this->runctx.envp = HAWK_NULL;
|
||||||
|
this->runctx.env_map = HAWK_NULL;
|
||||||
|
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);
|
||||||
this->runctx.rtx = HAWK_NULL;
|
this->runctx.rtx = HAWK_NULL;
|
||||||
}
|
}
|
||||||
|
|||||||
+35
-4
@@ -1327,10 +1327,42 @@ public:
|
|||||||
///
|
///
|
||||||
int getGlobal (int id, Value& v) const;
|
int getGlobal (int id, Value& v) const;
|
||||||
|
|
||||||
|
void* getEnvp () const
|
||||||
|
{
|
||||||
|
return this->envp;
|
||||||
|
}
|
||||||
|
|
||||||
|
hawk_map_t* getEnvMap () const
|
||||||
|
{
|
||||||
|
return this->env_map;
|
||||||
|
}
|
||||||
|
|
||||||
|
hawk_oow_t getEnvMapRev () const
|
||||||
|
{
|
||||||
|
return this->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->env_map = env_map;
|
||||||
|
this->env_map_rev = env_map_rev;
|
||||||
|
this->env_type = env_type;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Hawk* hawk;
|
Hawk* hawk;
|
||||||
hawk_rtx_t* rtx;
|
hawk_rtx_t* rtx;
|
||||||
hawk_rtx_ecb_t rtx_ecb;
|
hawk_rtx_ecb_t rtx_ecb;
|
||||||
|
void* envp;
|
||||||
|
hawk_map_t* env_map;
|
||||||
|
hawk_oow_t env_map_rev;
|
||||||
|
hawk_rtx_env_mk_type_t env_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
///
|
///
|
||||||
@@ -2026,13 +2058,12 @@ public:
|
|||||||
|
|
||||||
void clearConsoleOutputs ();
|
void clearConsoleOutputs ();
|
||||||
|
|
||||||
protected:
|
int getEnvironGlobalId () const { return this->gbl_environ; }
|
||||||
#define HAWK_STD_ENV_CHAR_IS_BCH
|
|
||||||
typedef hawk_bch_t env_char_t;
|
|
||||||
|
|
||||||
|
protected:
|
||||||
int make_additional_globals (Run* run);
|
int make_additional_globals (Run* run);
|
||||||
int build_argcv (Run* run);
|
int build_argcv (Run* run);
|
||||||
int build_environ (Run* run, env_char_t* envarr[]);
|
int build_environ (Run* run, hawk_env_char_t* envarr[]);
|
||||||
|
|
||||||
// intrinsic functions
|
// intrinsic functions
|
||||||
hawk_cmgr_t* getiocmgr (const hawk_ooch_t* ioname);
|
hawk_cmgr_t* getiocmgr (const hawk_ooch_t* ioname);
|
||||||
|
|||||||
+151
-25
@@ -34,27 +34,120 @@
|
|||||||
#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>
|
||||||
# define USE_LTDL
|
# include <tchar.h>
|
||||||
#elif defined(HAVE_DLFCN_H)
|
# if defined(HAWK_HAVE_CFG_H) && defined(HAWK_ENABLE_LIBLTDL)
|
||||||
# define USE_DLFCN
|
# include <ltdl.h>
|
||||||
|
# define USE_LTDL
|
||||||
|
# endif
|
||||||
|
# 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
|
||||||
# error UNSUPPORTED DYNAMIC LINKER
|
# 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
|
||||||
|
# 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
|
||||||
|
|
||||||
/////////////////////////////////
|
/////////////////////////////////
|
||||||
HAWK_BEGIN_NAMESPACE(HAWK)
|
HAWK_BEGIN_NAMESPACE(HAWK)
|
||||||
/////////////////////////////////
|
/////////////////////////////////
|
||||||
|
|
||||||
|
struct std_rxtn_t
|
||||||
|
{
|
||||||
|
Hawk::Run* run;
|
||||||
|
};
|
||||||
|
|
||||||
|
#if defined(HAWK_HAVE_INLINE)
|
||||||
|
static HAWK_INLINE std_rxtn_t* GET_STD_RXTN(hawk_rtx_t* rtx)
|
||||||
|
{
|
||||||
|
return (std_rxtn_t*)((hawk_uint8_t*)hawk_rtx_getxtn(rtx) - HAWK_SIZEOF(std_rxtn_t));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
# define GET_STD_RXTN(rtx) ((std_rxtn_t*)((hawk_uint8_t*)hawk_rtx_getxtn(rtx) - HAWK_SIZEOF(std_rxtn_t)))
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static void* rtx_env_maker (hawk_rtx_t* rtx, hawk_rtx_env_mk_type_t env_mk_type)
|
||||||
|
{
|
||||||
|
HawkStd* hawk;
|
||||||
|
Hawk::Run* run;
|
||||||
|
hawk_val_t* v_env;
|
||||||
|
hawk_map_t* env_map;
|
||||||
|
hawk_oow_t env_map_rev;
|
||||||
|
int gbl_id;
|
||||||
|
|
||||||
|
run = GET_STD_RXTN(rtx)->run;
|
||||||
|
if (HAWK_UNLIKELY(run == HAWK_NULL)) return HAWK_NULL;
|
||||||
|
hawk = (HawkStd*)(Hawk*)*run;
|
||||||
|
HAWK_ASSERT(hawk != HAWK_NULL);
|
||||||
|
|
||||||
|
gbl_id = hawk->getEnvironGlobalId();
|
||||||
|
if (HAWK_UNLIKELY(gbl_id <= -1)) return HAWK_NULL;
|
||||||
|
|
||||||
|
v_env = hawk_rtx_getgbl(rtx, gbl_id);
|
||||||
|
HAWK_ASSERT(v_env != HAWK_NULL);
|
||||||
|
|
||||||
|
if (HAWK_RTX_GETVALTYPE(rtx, v_env) == HAWK_VAL_MAP)
|
||||||
|
{
|
||||||
|
env_map = ((hawk_val_map_t*)v_env)->map;
|
||||||
|
HAWK_ASSERT(env_map != HAWK_NULL);
|
||||||
|
env_map_rev = HAWK_MAP_REV(env_map);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
env_map = HAWK_NULL;
|
||||||
|
env_map_rev = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!run->getEnvp() || run->getEnvType() != env_mk_type ||
|
||||||
|
run->getEnvMap() != env_map ||
|
||||||
|
(env_map && run->getEnvMapRev() != env_map_rev))
|
||||||
|
{
|
||||||
|
void* envp;
|
||||||
|
|
||||||
|
envp = hawk_rtx_commit_environ(rtx, gbl_id, env_mk_type);
|
||||||
|
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
|
||||||
|
|
||||||
|
if (run->getEnvp()) hawk_rtx_freemem(rtx, run->getEnvp());
|
||||||
|
run->setEnvCache(envp, env_map, env_map_rev, env_mk_type);
|
||||||
|
}
|
||||||
|
|
||||||
|
return run->getEnvp();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void* pio_env_maker (hawk_pio_env_mk_type_t env_mk_type, void* ctx)
|
||||||
|
{
|
||||||
|
hawk_rtx_t* rtx = (hawk_rtx_t*)ctx;
|
||||||
|
hawk_rio_cbs_t rio;
|
||||||
|
|
||||||
|
hawk_rtx_getrio(rtx, &rio);
|
||||||
|
HAWK_ASSERT(rio.env_mk != HAWK_NULL);
|
||||||
|
return rio.env_mk(rtx, (hawk_rtx_env_mk_type_t)env_mk_type);
|
||||||
|
}
|
||||||
|
|
||||||
static int set_pending_console_state (HawkStd::Console& io)
|
static int set_pending_console_state (HawkStd::Console& io)
|
||||||
{
|
{
|
||||||
hawk_uint16_t uflags = io.getUflags();
|
hawk_uint16_t uflags = io.getUflags();
|
||||||
@@ -249,6 +342,13 @@ void HawkStd::uponClosing ()
|
|||||||
HawkStd::Run* HawkStd::parse (Source& in, Source& out)
|
HawkStd::Run* HawkStd::parse (Source& in, Source& out)
|
||||||
{
|
{
|
||||||
Run* run = Hawk::parse(in, out);
|
Run* run = Hawk::parse(in, out);
|
||||||
|
if (run)
|
||||||
|
{
|
||||||
|
hawk_rio_cbs_t rio;
|
||||||
|
hawk_rtx_getrio(*run, &rio);
|
||||||
|
rio.env_mk = rtx_env_maker;
|
||||||
|
hawk_rtx_setrio(*run, &rio);
|
||||||
|
}
|
||||||
|
|
||||||
if (this->cmgrtab_inited)
|
if (this->cmgrtab_inited)
|
||||||
{
|
{
|
||||||
@@ -292,39 +392,40 @@ int HawkStd::build_argcv (Run* run)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int HawkStd::build_environ (Run* run, env_char_t* envarr[])
|
int HawkStd::build_environ (Run* run, hawk_env_char_t* envarr[])
|
||||||
{
|
{
|
||||||
Value v_env (run);
|
Value v_env (run);
|
||||||
|
hawk_rtx_t* rtx = *run;
|
||||||
|
|
||||||
if (envarr)
|
if (envarr)
|
||||||
{
|
{
|
||||||
env_char_t* eq;
|
hawk_env_char_t* eq;
|
||||||
hawk_ooch_t* kptr, * vptr;
|
hawk_ooch_t* kptr, * vptr;
|
||||||
hawk_oow_t klen, count;
|
hawk_oow_t klen, vlen, count;
|
||||||
hawk_rtx_t* rtx = *run;
|
|
||||||
|
|
||||||
for (count = 0; envarr[count]; count++)
|
for (count = 0; envarr[count]; count++)
|
||||||
{
|
{
|
||||||
#if ((defined(HAWK_STD_ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
#if ((defined(HAWK_ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
||||||
(defined(HAWK_STD_ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
(defined(HAWK_ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
||||||
eq = hawk_find_oochar_in_oocstr(envarr[count], HAWK_T('='));
|
eq = hawk_find_oochar_in_oocstr(envarr[count], HAWK_T('='));
|
||||||
if (eq == HAWK_NULL || eq == envarr[count]) continue;
|
if (eq == HAWK_NULL || eq == envarr[count]) continue;
|
||||||
|
|
||||||
kptr = envarr[count];
|
kptr = envarr[count];
|
||||||
klen = eq - envarr[count];
|
klen = eq - envarr[count];
|
||||||
vptr = eq + 1;
|
vptr = eq + 1;
|
||||||
#elif defined(HAWK_STD_ENV_CHAR_IS_BCH)
|
vlen = hawk_count_oocstr(vptr);
|
||||||
|
#elif defined(HAWK_ENV_CHAR_IS_BCH)
|
||||||
eq = hawk_find_bchar_in_bcstr(envarr[count], HAWK_BT('='));
|
eq = hawk_find_bchar_in_bcstr(envarr[count], HAWK_BT('='));
|
||||||
if (eq == HAWK_NULL || eq == envarr[count]) continue;
|
if (eq == HAWK_NULL || eq == envarr[count]) continue;
|
||||||
|
|
||||||
*eq = HAWK_BT('\0');
|
*eq = HAWK_BT('\0');
|
||||||
|
|
||||||
kptr = hawk_rtx_dupbtoucstr(rtx, envarr[count], &klen, 1);
|
kptr = hawk_rtx_dupbtoucstr(rtx, envarr[count], &klen, 1);
|
||||||
vptr = hawk_rtx_dupbtoucstr(rtx, eq + 1, HAWK_NULL, 1);
|
vptr = hawk_rtx_dupbtoucstr(rtx, eq + 1, &vlen, 1);
|
||||||
if (kptr == HAWK_NULL || vptr == HAWK_NULL)
|
if (kptr == HAWK_NULL || vptr == HAWK_NULL)
|
||||||
{
|
{
|
||||||
if (kptr) hawk_rtx_freemem(rtx, kptr);
|
if (kptr) hawk_rtx_freemem(rtx, kptr);
|
||||||
if (vptr) hawk_rtx_freemem(rtx, kptr);
|
if (vptr) hawk_rtx_freemem(rtx, vptr);
|
||||||
|
|
||||||
/* mbstowcsdup() may fail for invalid encoding.
|
/* mbstowcsdup() may fail for invalid encoding.
|
||||||
* so setting the error code to ENOMEM may not
|
* so setting the error code to ENOMEM may not
|
||||||
@@ -341,11 +442,11 @@ int HawkStd::build_environ (Run* run, env_char_t* envarr[])
|
|||||||
*eq = HAWK_UT('\0');
|
*eq = HAWK_UT('\0');
|
||||||
|
|
||||||
kptr = hawk_rtx_duputobcstr(rtx, envarr[count], &klen);
|
kptr = hawk_rtx_duputobcstr(rtx, envarr[count], &klen);
|
||||||
vptr = hawk_rtx_duputobcstr(rtx, eq + 1, HAWK_NULL);
|
vptr = hawk_rtx_duputobcstr(rtx, eq + 1, &vlen);
|
||||||
if (kptr == HAWK_NULL || vptr == HAWK_NULL)
|
if (kptr == HAWK_NULL || vptr == HAWK_NULL)
|
||||||
{
|
{
|
||||||
#if ((defined(HAWK_STD_ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
#if ((defined(HAWK_ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
||||||
(defined(HAWK_STD_ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
(defined(HAWK_ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
||||||
/* nothing to do */
|
/* nothing to do */
|
||||||
#else
|
#else
|
||||||
if (vptr) hawk_rtx_freemem(rtx, vptr);
|
if (vptr) hawk_rtx_freemem(rtx, vptr);
|
||||||
@@ -359,11 +460,33 @@ int HawkStd::build_environ (Run* run, env_char_t* envarr[])
|
|||||||
*eq = HAWK_UT('=');
|
*eq = HAWK_UT('=');
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// numeric string
|
hawk_val_t* tmp = hawk_rtx_makenumorstrvalwithoochars(rtx, vptr, vlen, 1);
|
||||||
v_env.setIndexedStr (Value::Index(kptr, klen), vptr, true);
|
if (tmp == HAWK_NULL)
|
||||||
|
{
|
||||||
|
#if ((defined(HAWK_ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
||||||
|
(defined(HAWK_ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
||||||
|
/* nothing to do */
|
||||||
|
#else
|
||||||
|
if (vptr) hawk_rtx_freemem(rtx, vptr);
|
||||||
|
if (kptr) hawk_rtx_freemem(rtx, kptr);
|
||||||
|
#endif
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
#if ((defined(HAWK_STD_ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
if (v_env.setIndexedVal(Value::Index(kptr, klen), tmp) <= -1)
|
||||||
(defined(HAWK_STD_ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
{
|
||||||
|
#if ((defined(HAWK_ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
||||||
|
(defined(HAWK_ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
||||||
|
/* nothing to do */
|
||||||
|
#else
|
||||||
|
if (vptr) hawk_rtx_freemem(rtx, vptr);
|
||||||
|
if (kptr) hawk_rtx_freemem(rtx, kptr);
|
||||||
|
#endif
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if ((defined(HAWK_ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
||||||
|
(defined(HAWK_ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
||||||
/* nothing to do */
|
/* nothing to do */
|
||||||
#else
|
#else
|
||||||
if (vptr) hawk_rtx_freemem(rtx, vptr);
|
if (vptr) hawk_rtx_freemem(rtx, vptr);
|
||||||
@@ -592,6 +715,7 @@ int HawkStd::open_pio (Pipe& io)
|
|||||||
{
|
{
|
||||||
Hawk::Pipe::Mode mode = io.getMode();
|
Hawk::Pipe::Mode mode = io.getMode();
|
||||||
hawk_pio_t* pio = HAWK_NULL;
|
hawk_pio_t* pio = HAWK_NULL;
|
||||||
|
hawk_rio_cbs_t rio;
|
||||||
int flags = HAWK_PIO_TEXT | HAWK_PIO_SHELL | HAWK_PIO_IGNOREECERR;
|
int flags = HAWK_PIO_TEXT | HAWK_PIO_SHELL | HAWK_PIO_IGNOREECERR;
|
||||||
|
|
||||||
switch (mode)
|
switch (mode)
|
||||||
@@ -610,7 +734,9 @@ int HawkStd::open_pio (Pipe& io)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
pio = hawk_pio_open((hawk_gem_t*)*this, 0, io.getName(), flags, HAWK_NULL, HAWK_NULL);
|
if (!HAWK_RTX_IS_PIPECLOEXEC_ON((hawk_rtx_t*)io)) flags |= HAWK_PIO_NOCLOEXEC;
|
||||||
|
hawk_rtx_getrio((hawk_rtx_t*)io, &rio);
|
||||||
|
pio = hawk_pio_open((hawk_gem_t*)*this, 0, io.getName(), flags, (rio.env_mk? pio_env_maker: HAWK_NULL), (hawk_rtx_t*)io);
|
||||||
if (!pio) return -1;
|
if (!pio) return -1;
|
||||||
|
|
||||||
#if defined(HAWK_OOCH_IS_UCH)
|
#if defined(HAWK_OOCH_IS_UCH)
|
||||||
|
|||||||
@@ -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
@@ -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
@@ -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
@@ -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;
|
||||||
*
|
*
|
||||||
|
|||||||
+3
-3
@@ -122,9 +122,9 @@ typedef enum hawk_pio_hid_t hawk_pio_hid_t;
|
|||||||
|
|
||||||
enum hawk_pio_env_mk_type_t
|
enum hawk_pio_env_mk_type_t
|
||||||
{
|
{
|
||||||
HAWK_PIO_ENV_MK_BCH_PP, /* 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_BCH_PN, /* K1=V\0K2=V\0\0 */
|
HAWK_PIO_ENV_MK_BPN, /* K1=V\0K2=V\0\0 */
|
||||||
HAWK_PIO_ENV_MK_UCH_PP,
|
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;
|
||||||
|
|||||||
+8
-1
@@ -81,6 +81,7 @@ typedef struct hawk_tree_t hawk_tree_t;
|
|||||||
#include "err-prv.h"
|
#include "err-prv.h"
|
||||||
#include "misc-prv.h"
|
#include "misc-prv.h"
|
||||||
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
/* gc configuration */
|
/* gc configuration */
|
||||||
@@ -559,6 +560,7 @@ struct hawk_rtx_t
|
|||||||
struct
|
struct
|
||||||
{
|
{
|
||||||
hawk_rio_impl_t handler[HAWK_RIO_NUM];
|
hawk_rio_impl_t handler[HAWK_RIO_NUM];
|
||||||
|
hawk_rtx_env_mk_t env_mk;
|
||||||
hawk_rio_arg_t* chain;
|
hawk_rio_arg_t* chain;
|
||||||
} rio;
|
} rio;
|
||||||
|
|
||||||
@@ -712,7 +714,6 @@ static HAWK_INLINE void HAWK_RTX_STACK_POP (hawk_rtx_t* rtx)
|
|||||||
# define HAWK_DEFAULT_MODPOSTFIX ""
|
# define HAWK_DEFAULT_MODPOSTFIX ""
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
@@ -723,6 +724,12 @@ 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);
|
||||||
|
|
||||||
|
void* hawk_rtx_commit_environ (
|
||||||
|
hawk_rtx_t* rtx,
|
||||||
|
int gbl_id,
|
||||||
|
hawk_rtx_env_mk_type_t env_mk_type
|
||||||
|
);
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
+21
@@ -28,6 +28,7 @@
|
|||||||
#include <hawk-cmn.h>
|
#include <hawk-cmn.h>
|
||||||
#include <hawk-ecs.h>
|
#include <hawk-ecs.h>
|
||||||
#include <hawk-gem.h>
|
#include <hawk-gem.h>
|
||||||
|
#include <hawk-pio.h>
|
||||||
#include <hawk-tre.h>
|
#include <hawk-tre.h>
|
||||||
#include <hawk-utl.h>
|
#include <hawk-utl.h>
|
||||||
|
|
||||||
@@ -906,6 +907,20 @@ typedef struct hawk_sio_cbs_t hawk_sio_cbs_t;
|
|||||||
|
|
||||||
/* ------------------------------------------------------------------------ */
|
/* ------------------------------------------------------------------------ */
|
||||||
|
|
||||||
|
/* these enumerators must be kept in sync with hawk_pio_env_mk_type_t enumerators */
|
||||||
|
enum hawk_rtx_env_mk_type_t
|
||||||
|
{
|
||||||
|
HAWK_RTX_ENV_MK_BPP = HAWK_PIO_ENV_MK_BPP,
|
||||||
|
HAWK_RTX_ENV_MK_BPN = HAWK_PIO_ENV_MK_BPN,
|
||||||
|
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 void* (*hawk_rtx_env_mk_t) (
|
||||||
|
hawk_rtx_t* rtx,
|
||||||
|
hawk_rtx_env_mk_type_t type
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The hawk_rio_t type defines a runtime I/O handler set.
|
* The hawk_rio_t type defines a runtime I/O handler set.
|
||||||
* \sa hawk_rtx_t
|
* \sa hawk_rtx_t
|
||||||
@@ -915,6 +930,7 @@ struct hawk_rio_cbs_t
|
|||||||
hawk_rio_impl_t pipe; /**< pipe handler */
|
hawk_rio_impl_t pipe; /**< pipe handler */
|
||||||
hawk_rio_impl_t file; /**< file handler */
|
hawk_rio_impl_t file; /**< file handler */
|
||||||
hawk_rio_impl_t console; /**< console handler */
|
hawk_rio_impl_t console; /**< console handler */
|
||||||
|
hawk_rtx_env_mk_t env_mk; /**< environment maker - optional */
|
||||||
};
|
};
|
||||||
typedef struct hawk_rio_cbs_t hawk_rio_cbs_t;
|
typedef struct hawk_rio_cbs_t hawk_rio_cbs_t;
|
||||||
|
|
||||||
@@ -1710,6 +1726,11 @@ struct hawk_rtx_nv_itr_t
|
|||||||
};
|
};
|
||||||
typedef struct hawk_rtx_nv_itr_t hawk_rtx_nv_itr_t;
|
typedef struct hawk_rtx_nv_itr_t hawk_rtx_nv_itr_t;
|
||||||
|
|
||||||
|
|
||||||
|
/* TODO: use wenviron where it's available */
|
||||||
|
#define HAWK_ENV_CHAR_IS_BCH
|
||||||
|
typedef hawk_bch_t hawk_env_char_t;
|
||||||
|
|
||||||
/* ----------------------------------------------------------------------- */
|
/* ----------------------------------------------------------------------- */
|
||||||
|
|
||||||
#if defined(__cplusplus)
|
#if defined(__cplusplus)
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
+488
-236
File diff suppressed because it is too large
Load Diff
@@ -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__)
|
||||||
@@ -778,11 +780,9 @@ int hawk_pio_init (hawk_pio_t* pio, hawk_gem_t* gem, const hawk_ooch_t* cmd, int
|
|||||||
maxidx = 5;
|
maxidx = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxidx == -1)
|
/* allow a pure spawn/wait use case with no dedicated pipes.
|
||||||
{
|
* a system()-style caller may still want shell execution and
|
||||||
hawk_gem_seterrnum(pio->gem, HAWK_NULL, HAWK_EINVAL);
|
* custom environment handling without redirecting stdin/out/err. */
|
||||||
goto oops;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((flags & HAWK_PIO_INTONUL) ||
|
if ((flags & HAWK_PIO_INTONUL) ||
|
||||||
(flags & HAWK_PIO_OUTTONUL) ||
|
(flags & HAWK_PIO_OUTTONUL) ||
|
||||||
@@ -906,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 */
|
||||||
@@ -1050,11 +1062,7 @@ create_process:
|
|||||||
maxidx = 5;
|
maxidx = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxidx == -1)
|
/* allow a pure spawn/wait use case with no dedicated pipes. */
|
||||||
{
|
|
||||||
hawk_gem_seterrnum(pio->gem, HAWK_NULL, HAWK_EINVAL);
|
|
||||||
goto oops;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((flags & HAWK_PIO_INTONUL) ||
|
if ((flags & HAWK_PIO_INTONUL) ||
|
||||||
(flags & HAWK_PIO_OUTTONUL) ||
|
(flags & HAWK_PIO_OUTTONUL) ||
|
||||||
@@ -1320,11 +1328,7 @@ create_process:
|
|||||||
maxidx = 5;
|
maxidx = 5;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (maxidx == -1)
|
/* allow a pure spawn/wait use case with no dedicated pipes. */
|
||||||
{
|
|
||||||
hawk_gem_seterrnum(pio->gem, HAWK_NULL, HAWK_EINVAL);
|
|
||||||
goto oops;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pio->flags & HAWK_PIO_FNCCMD)
|
if (pio->flags & HAWK_PIO_FNCCMD)
|
||||||
{
|
{
|
||||||
@@ -1340,7 +1344,7 @@ create_process:
|
|||||||
|
|
||||||
if (env_mk)
|
if (env_mk)
|
||||||
{
|
{
|
||||||
envp = (char*const*)env_mk(HAWK_PIO_ENV_MK_BCH_PP, env_ctx);
|
envp = (char*const*)env_mk(HAWK_PIO_ENV_MK_BPP, env_ctx);
|
||||||
if (HAWK_UNLIKELY(!envp)) goto oops;
|
if (HAWK_UNLIKELY(!envp)) goto oops;
|
||||||
/* pio doesn't free the memory block returned by the callback function.
|
/* pio doesn't free the memory block returned by the callback function.
|
||||||
* there is no callback triggered for dealloction either.
|
* there is no callback triggered for dealloction either.
|
||||||
|
|||||||
@@ -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--;
|
||||||
|
|||||||
@@ -1264,6 +1264,7 @@ void hawk_rtx_getrio (hawk_rtx_t* rtx, hawk_rio_cbs_t* rio)
|
|||||||
rio->pipe = rtx->rio.handler[HAWK_RIO_PIPE];
|
rio->pipe = rtx->rio.handler[HAWK_RIO_PIPE];
|
||||||
rio->file = rtx->rio.handler[HAWK_RIO_FILE];
|
rio->file = rtx->rio.handler[HAWK_RIO_FILE];
|
||||||
rio->console = rtx->rio.handler[HAWK_RIO_CONSOLE];
|
rio->console = rtx->rio.handler[HAWK_RIO_CONSOLE];
|
||||||
|
rio->env_mk = rtx->rio.env_mk;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hawk_rtx_setrio (hawk_rtx_t* rtx, const hawk_rio_cbs_t* rio)
|
void hawk_rtx_setrio (hawk_rtx_t* rtx, const hawk_rio_cbs_t* rio)
|
||||||
@@ -1271,6 +1272,7 @@ void hawk_rtx_setrio (hawk_rtx_t* rtx, const hawk_rio_cbs_t* rio)
|
|||||||
rtx->rio.handler[HAWK_RIO_PIPE] = rio->pipe;
|
rtx->rio.handler[HAWK_RIO_PIPE] = rio->pipe;
|
||||||
rtx->rio.handler[HAWK_RIO_FILE] = rio->file;
|
rtx->rio.handler[HAWK_RIO_FILE] = rio->file;
|
||||||
rtx->rio.handler[HAWK_RIO_CONSOLE] = rio->console;
|
rtx->rio.handler[HAWK_RIO_CONSOLE] = rio->console;
|
||||||
|
rtx->rio.env_mk = rio->env_mk;
|
||||||
}
|
}
|
||||||
|
|
||||||
void hawk_rtx_killecb (hawk_rtx_t* rtx, hawk_rtx_ecb_t* ecb)
|
void hawk_rtx_killecb (hawk_rtx_t* rtx, hawk_rtx_ecb_t* ecb)
|
||||||
@@ -1415,6 +1417,7 @@ static int init_rtx (hawk_rtx_t* rtx, hawk_t* hawk, hawk_rio_cbs_t* rio)
|
|||||||
rtx->rio.handler[HAWK_RIO_PIPE] = rio->pipe;
|
rtx->rio.handler[HAWK_RIO_PIPE] = rio->pipe;
|
||||||
rtx->rio.handler[HAWK_RIO_FILE] = rio->file;
|
rtx->rio.handler[HAWK_RIO_FILE] = rio->file;
|
||||||
rtx->rio.handler[HAWK_RIO_CONSOLE] = rio->console;
|
rtx->rio.handler[HAWK_RIO_CONSOLE] = rio->console;
|
||||||
|
rtx->rio.env_mk = rio->env_mk;
|
||||||
rtx->rio.chain = HAWK_NULL;
|
rtx->rio.chain = HAWK_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+36
-12
@@ -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>
|
||||||
# include <sys/un.h>
|
# if defined(TCPV40HDRS)
|
||||||
#endif
|
# define USE_SELECT
|
||||||
#if defined(HAVE_NETPACKET_PACKET_H)
|
# include <sys/select.h>
|
||||||
# include <netpacket/packet.h>
|
# else
|
||||||
#endif
|
# include <unistd.h>
|
||||||
#if defined(HAVE_NET_IF_DL_H)
|
# endif
|
||||||
# include <net/if_dl.h>
|
#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>
|
||||||
|
# endif
|
||||||
|
# if defined(HAVE_NETPACKET_PACKET_H)
|
||||||
|
# include <netpacket/packet.h>
|
||||||
|
# endif
|
||||||
|
# if defined(HAVE_NET_IF_DL_H)
|
||||||
|
# include <net/if_dl.h>
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
union hawk_skad_alt_t
|
union hawk_skad_alt_t
|
||||||
|
|||||||
+24
-20
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -212,14 +213,6 @@ static HAWK_INLINE rxtn_t* GET_RXTN(hawk_rtx_t* rtx) { return (rxtn_t*)((hawk_ui
|
|||||||
|
|
||||||
/* ========================================================================= */
|
/* ========================================================================= */
|
||||||
|
|
||||||
/* TODO: use wenviron where it's available */
|
|
||||||
typedef hawk_bch_t env_char_t;
|
|
||||||
#define ENV_CHAR_IS_BCH
|
|
||||||
|
|
||||||
|
|
||||||
static env_char_t** commit_environ (hawk_rtx_t* rtx, int gbl_id);
|
|
||||||
/* ========================================================================= */
|
|
||||||
|
|
||||||
static void* sys_alloc (hawk_mmgr_t* mmgr, hawk_oow_t size)
|
static void* sys_alloc (hawk_mmgr_t* mmgr, hawk_oow_t size)
|
||||||
{
|
{
|
||||||
return malloc(size);
|
return malloc(size);
|
||||||
@@ -454,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);
|
||||||
|
|
||||||
@@ -465,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -657,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__)
|
||||||
{
|
{
|
||||||
@@ -2048,56 +2041,57 @@ static int parse_rwpipe_uri (const hawk_ooch_t* uri, int* flags, hawk_nwad_t* nw
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void* envp_maker (hawk_pio_env_mk_type_t env_mk_type, void* ctx)
|
static void* rtx_env_maker (hawk_rtx_t* rtx, hawk_rtx_env_mk_type_t env_mk_type)
|
||||||
{
|
{
|
||||||
hawk_rtx_t* rtx = ctx;
|
|
||||||
hawk_t* hawk = hawk_rtx_gethawk(rtx);
|
hawk_t* hawk = hawk_rtx_gethawk(rtx);
|
||||||
|
hawk_val_t* v_env;
|
||||||
|
hawk_map_t* env_map;
|
||||||
|
hawk_oow_t env_map_rev;
|
||||||
|
void* envp;
|
||||||
|
xtn_t* xtn;
|
||||||
|
rxtn_t* rxtn;
|
||||||
|
|
||||||
if (env_mk_type == HAWK_PIO_ENV_MK_BCH_PP)
|
xtn = GET_XTN(hawk);
|
||||||
|
rxtn = GET_RXTN(rtx);
|
||||||
|
v_env = hawk_rtx_getgbl(rtx, xtn->gbl_environ);
|
||||||
|
HAWK_ASSERT(v_env != HAWK_NULL);
|
||||||
|
|
||||||
|
if (HAWK_RTX_GETVALTYPE(rtx, v_env) == HAWK_VAL_MAP)
|
||||||
{
|
{
|
||||||
hawk_val_t* v_env;
|
env_map = ((hawk_val_map_t*)v_env)->map;
|
||||||
hawk_map_t* env_map;
|
HAWK_ASSERT(env_map != HAWK_NULL);
|
||||||
hawk_oow_t env_map_rev;
|
env_map_rev = HAWK_MAP_REV(env_map);
|
||||||
env_char_t** envp;
|
}
|
||||||
xtn_t* xtn;
|
else
|
||||||
rxtn_t* rxtn;
|
{
|
||||||
|
env_map = HAWK_NULL;
|
||||||
xtn = GET_XTN(hawk);
|
env_map_rev = 0;
|
||||||
rxtn = GET_RXTN(rtx);
|
|
||||||
v_env = hawk_rtx_getgbl(rtx, xtn->gbl_environ);
|
|
||||||
HAWK_ASSERT(v_env != HAWK_NULL);
|
|
||||||
|
|
||||||
if (HAWK_RTX_GETVALTYPE(rtx, v_env) == HAWK_VAL_MAP)
|
|
||||||
{
|
|
||||||
env_map = ((hawk_val_map_t*)v_env)->map;
|
|
||||||
HAWK_ASSERT(env_map != HAWK_NULL);
|
|
||||||
env_map_rev = HAWK_MAP_REV(env_map);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
env_map = HAWK_NULL;
|
|
||||||
env_map_rev = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!rxtn->envp ||
|
|
||||||
rxtn->env_map != env_map ||
|
|
||||||
(env_map && rxtn->env_map_rev != env_map_rev))
|
|
||||||
{
|
|
||||||
envp = commit_environ(rtx, xtn->gbl_environ);
|
|
||||||
if (!envp) return HAWK_NULL;
|
|
||||||
|
|
||||||
if (rxtn->envp) hawk_rtx_freemem(rtx, rxtn->envp);
|
|
||||||
rxtn->envp = envp;
|
|
||||||
rxtn->env_map = env_map;
|
|
||||||
rxtn->env_map_rev = env_map_rev;
|
|
||||||
}
|
|
||||||
|
|
||||||
return rxtn->envp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* TODO: support more types */
|
if (!rxtn->envp || rxtn->env_type != env_mk_type ||
|
||||||
/* unsupported env_mk_type */
|
rxtn->env_map != env_map ||
|
||||||
return HAWK_NULL;
|
(env_map && rxtn->env_map_rev != env_map_rev))
|
||||||
|
{
|
||||||
|
envp = hawk_rtx_commit_environ(rtx, xtn->gbl_environ, env_mk_type);
|
||||||
|
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
|
||||||
|
|
||||||
|
if (rxtn->envp) hawk_rtx_freemem(rtx, rxtn->envp);
|
||||||
|
rxtn->envp = envp;
|
||||||
|
rxtn->env_map = env_map;
|
||||||
|
rxtn->env_map_rev = env_map_rev;
|
||||||
|
rxtn->env_type = env_mk_type;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rxtn->envp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void* pio_env_maker (hawk_pio_env_mk_type_t env_mk_type, void* ctx)
|
||||||
|
{
|
||||||
|
hawk_rtx_t* rtx = (hawk_rtx_t*)ctx;
|
||||||
|
/* pio_handler_open passes pio_env_maker to hawk_pio_open
|
||||||
|
* only if rtx->rio.env_make is not HAWK_NULL */
|
||||||
|
HAWK_ASSERT(rtx->rio.env_mk != HAWK_NULL);
|
||||||
|
return rtx->rio.env_mk(rtx, env_mk_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
static hawk_ooi_t pio_handler_open (hawk_rtx_t* rtx, hawk_rio_arg_t* riod)
|
static hawk_ooi_t pio_handler_open (hawk_rtx_t* rtx, hawk_rio_arg_t* riod)
|
||||||
@@ -2139,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,
|
||||||
envp_maker,
|
(rtx->rio.env_mk? pio_env_maker: (hawk_pio_env_mk_t)HAWK_NULL),
|
||||||
rtx
|
rtx
|
||||||
);
|
);
|
||||||
if (!handle) return -1;
|
if (!handle) return -1;
|
||||||
@@ -2850,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[])
|
||||||
@@ -2950,7 +2945,7 @@ static int build_argcv (hawk_rtx_t* rtx, int argc_id, int argv_id, const hawk_oo
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int build_environ (hawk_rtx_t* rtx, int gbl_id, env_char_t* envarr[])
|
static int build_environ (hawk_rtx_t* rtx, int gbl_id, hawk_env_char_t* envarr[])
|
||||||
{
|
{
|
||||||
hawk_val_t* v_env;
|
hawk_val_t* v_env;
|
||||||
hawk_val_t* v_tmp;
|
hawk_val_t* v_tmp;
|
||||||
@@ -2962,14 +2957,14 @@ static int build_environ (hawk_rtx_t* rtx, int gbl_id, env_char_t* envarr[])
|
|||||||
|
|
||||||
if (envarr)
|
if (envarr)
|
||||||
{
|
{
|
||||||
env_char_t* eq;
|
hawk_env_char_t* eq;
|
||||||
hawk_ooch_t* kptr, * vptr;
|
hawk_ooch_t* kptr, * vptr;
|
||||||
hawk_oow_t klen, vlen, count;
|
hawk_oow_t klen, vlen, count;
|
||||||
|
|
||||||
for (count = 0; envarr[count]; count++)
|
for (count = 0; envarr[count]; count++)
|
||||||
{
|
{
|
||||||
#if ((defined(ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
#if ((defined(HAWK_ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
||||||
(defined(ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
(defined(HAWK_ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
||||||
eq = hawk_find_oochar_in_oocstr(envarr[count], '=');
|
eq = hawk_find_oochar_in_oocstr(envarr[count], '=');
|
||||||
if (HAWK_UNLIKELY(!eq || eq == envarr[count])) continue;
|
if (HAWK_UNLIKELY(!eq || eq == envarr[count])) continue;
|
||||||
|
|
||||||
@@ -2977,7 +2972,7 @@ static int build_environ (hawk_rtx_t* rtx, int gbl_id, env_char_t* envarr[])
|
|||||||
klen = eq - envarr[count];
|
klen = eq - envarr[count];
|
||||||
vptr = eq + 1;
|
vptr = eq + 1;
|
||||||
vlen = hawk_count_oocstr(vptr);
|
vlen = hawk_count_oocstr(vptr);
|
||||||
#elif defined(ENV_CHAR_IS_BCH)
|
#elif defined(HAWK_ENV_CHAR_IS_BCH)
|
||||||
eq = hawk_find_bchar_in_bcstr(envarr[count], '=');
|
eq = hawk_find_bchar_in_bcstr(envarr[count], '=');
|
||||||
if (HAWK_UNLIKELY(!eq || eq == envarr[count])) continue;
|
if (HAWK_UNLIKELY(!eq || eq == envarr[count])) continue;
|
||||||
|
|
||||||
@@ -3023,8 +3018,8 @@ static int build_environ (hawk_rtx_t* rtx, int gbl_id, env_char_t* envarr[])
|
|||||||
v_tmp = hawk_rtx_makenumorstrvalwithoochars(rtx, vptr, vlen, 1);
|
v_tmp = hawk_rtx_makenumorstrvalwithoochars(rtx, vptr, vlen, 1);
|
||||||
if (HAWK_UNLIKELY(!v_tmp))
|
if (HAWK_UNLIKELY(!v_tmp))
|
||||||
{
|
{
|
||||||
#if ((defined(ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
#if ((defined(HAWK_ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
||||||
(defined(ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
(defined(HAWK_ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
||||||
/* nothing to do */
|
/* nothing to do */
|
||||||
#else
|
#else
|
||||||
if (vptr) hawk_rtx_freemem(rtx, vptr);
|
if (vptr) hawk_rtx_freemem(rtx, vptr);
|
||||||
@@ -3044,8 +3039,8 @@ static int build_environ (hawk_rtx_t* rtx, int gbl_id, env_char_t* envarr[])
|
|||||||
* the reference of v_tmp to free it */
|
* the reference of v_tmp to free it */
|
||||||
hawk_rtx_refdownval_inline(rtx, v_tmp);
|
hawk_rtx_refdownval_inline(rtx, v_tmp);
|
||||||
|
|
||||||
#if ((defined(ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
#if ((defined(HAWK_ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
||||||
(defined(ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
(defined(HAWK_ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
||||||
/* nothing to do */
|
/* nothing to do */
|
||||||
#else
|
#else
|
||||||
if (vptr) hawk_rtx_freemem(rtx, vptr);
|
if (vptr) hawk_rtx_freemem(rtx, vptr);
|
||||||
@@ -3059,8 +3054,8 @@ static int build_environ (hawk_rtx_t* rtx, int gbl_id, env_char_t* envarr[])
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if ((defined(ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
#if ((defined(HAWK_ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
||||||
(defined(ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
(defined(HAWK_ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
||||||
/* nothing to do */
|
/* nothing to do */
|
||||||
#else
|
#else
|
||||||
if (vptr) hawk_rtx_freemem(rtx, vptr);
|
if (vptr) hawk_rtx_freemem(rtx, vptr);
|
||||||
@@ -3079,14 +3074,12 @@ static int build_environ (hawk_rtx_t* rtx, int gbl_id, env_char_t* envarr[])
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static env_char_t** 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;
|
||||||
env_char_t** envp;
|
|
||||||
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);
|
||||||
@@ -3096,10 +3089,42 @@ static env_char_t** 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 = (env_char_t**)hawk_rtx_allocmem(rtx, HAWK_SIZEOF(*envp) * 1);
|
switch (env_mk_type)
|
||||||
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
|
{
|
||||||
envp[0] = HAWK_NULL;
|
case HAWK_RTX_ENV_MK_BPP:
|
||||||
return envp;
|
{
|
||||||
|
hawk_bch_t** envp;
|
||||||
|
|
||||||
|
envp = (hawk_bch_t**)hawk_rtx_allocmem(rtx, HAWK_SIZEOF(*envp) * 1);
|
||||||
|
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
|
||||||
|
envp[0] = HAWK_NULL;
|
||||||
|
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;
|
||||||
@@ -3115,14 +3140,14 @@ static env_char_t** commit_environ (hawk_rtx_t* rtx, int gbl_id)
|
|||||||
hawk_oow_t klen, vlen;
|
hawk_oow_t klen, vlen;
|
||||||
|
|
||||||
klen = HAWK_MAP_KLEN(pair);
|
klen = HAWK_MAP_KLEN(pair);
|
||||||
#if defined(ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_UCH)
|
#if defined(HAWK_ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_UCH)
|
||||||
{
|
{
|
||||||
hawk_oow_t tmp_ulen, tmp_blen;
|
hawk_oow_t tmp_ulen, tmp_blen;
|
||||||
tmp_ulen = klen;
|
tmp_ulen = klen;
|
||||||
if (hawk_rtx_convutobchars(rtx, HAWK_MAP_KPTR(pair), &tmp_ulen, HAWK_NULL, &tmp_blen) <= -1) return HAWK_NULL;
|
if (hawk_rtx_convutobchars(rtx, HAWK_MAP_KPTR(pair), &tmp_ulen, HAWK_NULL, &tmp_blen) <= -1) return HAWK_NULL;
|
||||||
klen = tmp_blen;
|
klen = tmp_blen;
|
||||||
}
|
}
|
||||||
#elif defined(ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_BCH)
|
#elif defined(HAWK_ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_BCH)
|
||||||
{
|
{
|
||||||
hawk_oow_t tmp_blen, tmp_ulen;
|
hawk_oow_t tmp_blen, tmp_ulen;
|
||||||
tmp_blen = klen;
|
tmp_blen = klen;
|
||||||
@@ -3131,129 +3156,226 @@ static env_char_t** commit_environ (hawk_rtx_t* rtx, int gbl_id)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(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);
|
||||||
}
|
}
|
||||||
|
|
||||||
ptr_bytes = HAWK_SIZEOF(*envp) * (count + 1);
|
if (env_mk_type == HAWK_RTX_ENV_MK_BPP)
|
||||||
envp = (env_char_t**)hawk_rtx_allocmem(rtx, ptr_bytes + (str_bytes * HAWK_SIZEOF(*ptr)));
|
|
||||||
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
|
|
||||||
|
|
||||||
ptr = (env_char_t*)((hawk_uint8_t*)envp + ptr_bytes);
|
|
||||||
count = 0;
|
|
||||||
|
|
||||||
hawk_init_map_itr(&itr, 0);
|
|
||||||
pair = hawk_map_getfirstpair(map, &itr);
|
|
||||||
while (pair)
|
|
||||||
{
|
{
|
||||||
hawk_oow_t klen, vlen;
|
hawk_bch_t** envp;
|
||||||
|
hawk_bch_t* ptr;
|
||||||
|
|
||||||
envp[count++] = ptr;
|
ptr_bytes = HAWK_SIZEOF(*envp) * (count + 1);
|
||||||
klen = HAWK_MAP_KLEN(pair);
|
envp = (hawk_bch_t**)hawk_rtx_allocmem(rtx, ptr_bytes + (str_bytes * HAWK_SIZEOF(*ptr)));
|
||||||
|
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
|
||||||
|
|
||||||
#if ((defined(ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_BCH)) || \
|
ptr = (hawk_bch_t*)((hawk_uint8_t*)envp + ptr_bytes);
|
||||||
(defined(ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_UCH)))
|
count = 0;
|
||||||
HAWK_MEMCPY(ptr, HAWK_MAP_KPTR(pair), klen);
|
|
||||||
ptr += klen;
|
hawk_init_map_itr(&itr, 0);
|
||||||
#elif defined(ENV_CHAR_IS_BCH)
|
pair = hawk_map_getfirstpair(map, &itr);
|
||||||
|
while (pair)
|
||||||
{
|
{
|
||||||
hawk_oow_t tmp_ulen, tmp_blen;
|
hawk_oow_t klen, vlen;
|
||||||
|
|
||||||
tmp_ulen = klen;
|
envp[count++] = ptr;
|
||||||
tmp_blen = str_bytes;
|
klen = HAWK_MAP_KLEN(pair);
|
||||||
if (hawk_rtx_convutobchars(rtx, HAWK_MAP_KPTR(pair), &tmp_ulen, ptr, &tmp_blen) <= -1)
|
|
||||||
{
|
#if defined(HAWK_OOCH_IS_BCH)
|
||||||
hawk_rtx_freemem(rtx, envp);
|
HAWK_MEMCPY(ptr, HAWK_MAP_KPTR(pair), klen);
|
||||||
return HAWK_NULL;
|
ptr += klen;
|
||||||
}
|
|
||||||
ptr += tmp_blen;
|
|
||||||
klen = tmp_blen;
|
|
||||||
}
|
|
||||||
#else
|
#else
|
||||||
{
|
|
||||||
hawk_oow_t tmp_blen, tmp_ulen;
|
|
||||||
|
|
||||||
tmp_blen = klen;
|
|
||||||
tmp_ulen = str_bytes;
|
|
||||||
if (hawk_rtx_convbtouchars(rtx, HAWK_MAP_KPTR(pair), &tmp_blen, ptr, &tmp_ulen, 1) <= -1)
|
|
||||||
{
|
{
|
||||||
hawk_rtx_freemem(rtx, envp);
|
hawk_oow_t tmp_ulen, tmp_blen;
|
||||||
return HAWK_NULL;
|
|
||||||
|
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;
|
||||||
}
|
}
|
||||||
ptr += tmp_ulen;
|
|
||||||
klen = tmp_ulen;
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
*ptr++ = '=';
|
*ptr++ = '=';
|
||||||
|
|
||||||
#if defined(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);
|
hawk_bch_t* vptr;
|
||||||
return HAWK_NULL;
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
HAWK_MEMCPY(ptr, vptr, vlen);
|
*ptr++ = '\0';
|
||||||
ptr += vlen;
|
pair = hawk_map_getnextpair(map, &itr);
|
||||||
hawk_rtx_freevalbcstr(rtx, HAWK_MAP_VPTR(pair), vptr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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
|
#else
|
||||||
{
|
|
||||||
hawk_uch_t* vptr;
|
|
||||||
|
|
||||||
vptr = hawk_rtx_getvalucstr(rtx, HAWK_MAP_VPTR(pair), &vlen);
|
|
||||||
if (HAWK_UNLIKELY(!vptr))
|
|
||||||
{
|
{
|
||||||
hawk_rtx_freemem(rtx, envp);
|
hawk_oow_t tmp_ulen, tmp_blen;
|
||||||
return HAWK_NULL;
|
|
||||||
|
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);
|
||||||
}
|
}
|
||||||
|
|
||||||
HAWK_MEMCPY(ptr, vptr, vlen);
|
*ptr++ = '\0';
|
||||||
ptr += vlen;
|
pair = hawk_map_getnextpair(map, &itr);
|
||||||
hawk_rtx_freevalucstr(rtx, HAWK_MAP_VPTR(pair), vptr);
|
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
*ptr++ = '\0';
|
*ptr++ = '\0';
|
||||||
pair = hawk_map_getnextpair(map, &itr);
|
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
|
||||||
|
{
|
||||||
|
hawk_oow_t tmp_blen, tmp_ulen;
|
||||||
|
|
||||||
|
tmp_blen = klen;
|
||||||
|
tmp_ulen = str_bytes;
|
||||||
|
if (hawk_rtx_convbtouchars(rtx, HAWK_MAP_KPTR(pair), &tmp_blen, ptr, &tmp_ulen, 1) <= -1)
|
||||||
|
{
|
||||||
|
hawk_rtx_freemem(rtx, envp);
|
||||||
|
return HAWK_NULL;
|
||||||
|
}
|
||||||
|
ptr += tmp_ulen;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
*ptr++ = '=';
|
||||||
|
|
||||||
|
{
|
||||||
|
hawk_uch_t* vptr;
|
||||||
|
|
||||||
|
vptr = hawk_rtx_valtoucstrdup(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_freemem(rtx, vptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
*ptr++ = '\0';
|
||||||
|
pair = hawk_map_getnextpair(map, &itr);
|
||||||
|
}
|
||||||
|
|
||||||
|
*ptr++ = '\0';
|
||||||
|
return envp;
|
||||||
}
|
}
|
||||||
|
|
||||||
envp[count] = HAWK_NULL;
|
return HAWK_NULL;
|
||||||
return envp;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3276,6 +3398,7 @@ static hawk_rtx_t* open_rtx_std (
|
|||||||
rio.pipe = hawk_rio_pipe;
|
rio.pipe = hawk_rio_pipe;
|
||||||
rio.file = hawk_rio_file;
|
rio.file = hawk_rio_file;
|
||||||
rio.console = hawk_rio_console;
|
rio.console = hawk_rio_console;
|
||||||
|
rio.env_mk = rtx_env_maker;
|
||||||
|
|
||||||
rtx = hawk_rtx_open(hawk, HAWK_SIZEOF(rxtn_t) + xtnsize, &rio);
|
rtx = hawk_rtx_open(hawk, HAWK_SIZEOF(rxtn_t) + xtnsize, &rio);
|
||||||
if (HAWK_UNLIKELY(!rtx)) return HAWK_NULL;
|
if (HAWK_UNLIKELY(!rtx)) return HAWK_NULL;
|
||||||
@@ -3528,6 +3651,8 @@ done:
|
|||||||
return rtx;
|
return rtx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ------------------------------------------------------- */
|
||||||
|
|
||||||
static int timeout_code (const hawk_ooch_t* name)
|
static int timeout_code (const hawk_ooch_t* name)
|
||||||
{
|
{
|
||||||
if (hawk_comp_oocstr(name, HAWK_T("rtimeout"), 1) == 0) return 0;
|
if (hawk_comp_oocstr(name, HAWK_T("rtimeout"), 1) == 0) return 0;
|
||||||
|
|||||||
+10
-10
@@ -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
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
+163
-34
@@ -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,14 +56,15 @@ 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);
|
||||||
|
|
||||||
class MyHawk: public HawkStd
|
class MyHawk: public HawkStd
|
||||||
{
|
{
|
||||||
@@ -214,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();
|
||||||
@@ -221,15 +233,25 @@ static void print_error(MyHawk& hawk)
|
|||||||
|
|
||||||
if (loc.file)
|
if (loc.file)
|
||||||
{
|
{
|
||||||
print_error("code %d line %lu at %s - %s\n", (int)code, (unsigned long int)loc.line, hawk.getErrorLocationFileB(), hawk.getErrorMessageB());
|
print_error("Line %lu Column %lu Code %d File %s - %s\n",
|
||||||
|
(unsigned long int)loc.line,
|
||||||
|
(unsigned long int)loc.colm,
|
||||||
|
(int)code,
|
||||||
|
hawk.getErrorLocationFileB(),
|
||||||
|
hawk.getErrorMessageB());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
print_error("code %d line %lu - %s\n", (int)code, (unsigned long int)loc.line, hawk.getErrorMessageB());
|
print_error("Line %lu Column %lu Code %d - %s\n",
|
||||||
|
(unsigned long int)loc.line,
|
||||||
|
(unsigned long int)loc.colm,
|
||||||
|
(int)code,
|
||||||
|
hawk.getErrorMessageB());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#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 ||
|
||||||
@@ -241,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;
|
||||||
@@ -254,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)
|
||||||
@@ -278,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)
|
||||||
@@ -307,6 +338,7 @@ static void print_usage (FILE* out, const hawk_bch_t* argv0)
|
|||||||
fprintf(out, " %s [options] [ -- ] sourcestring [datafile]*\n", argv0);
|
fprintf(out, " %s [options] [ -- ] sourcestring [datafile]*\n", argv0);
|
||||||
fprintf(out, "Where options are:\n");
|
fprintf(out, "Where options are:\n");
|
||||||
fprintf(out, " -h print this message\n");
|
fprintf(out, " -h print this message\n");
|
||||||
|
fprintf(out, " -D show extra information\n");
|
||||||
fprintf(out, " -f sourcefile set the source script file\n");
|
fprintf(out, " -f sourcefile set the source script file\n");
|
||||||
fprintf(out, " -d deparsedfile set the deparsing output file\n");
|
fprintf(out, " -d deparsedfile set the deparsing output file\n");
|
||||||
fprintf(out, " -o outputfile set the console output file\n");
|
fprintf(out, " -o outputfile set the console output file\n");
|
||||||
@@ -339,8 +371,99 @@ struct cmdline_t
|
|||||||
|
|
||||||
HAWK::Hawk::Value* argv;
|
HAWK::Hawk::Value* argv;
|
||||||
int argc;
|
int argc;
|
||||||
|
int debug;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void print_awk_value (hawk_rtx_t* rtx, const hawk_oocs_t* name, hawk_val_t* val)
|
||||||
|
{
|
||||||
|
hawk_t* hawk = hawk_rtx_gethawk(rtx);
|
||||||
|
hawk_bch_t* str;
|
||||||
|
hawk_oow_t len;
|
||||||
|
hawk_errinf_t oerrinf;
|
||||||
|
#if defined(HAWK_OOCH_IS_UCH)
|
||||||
|
hawk_bch_t* bcname = HAWK_NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
hawk_rtx_geterrinf(rtx, &oerrinf);
|
||||||
|
|
||||||
|
str = hawk_rtx_valtobcstrdup(rtx, val, &len);
|
||||||
|
if (!str)
|
||||||
|
{
|
||||||
|
if (hawk_rtx_geterrnum(rtx) == HAWK_EVALTOSTR)
|
||||||
|
{
|
||||||
|
#if defined(HAWK_OOCH_IS_UCH)
|
||||||
|
bcname = hawk_rtx_duputobchars(rtx, name->ptr, name->len, HAWK_NULL);
|
||||||
|
if (bcname)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "%s = [not printable]\n", bcname);
|
||||||
|
hawk_rtx_freemem(rtx, bcname);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "***OUT OF MEMORY***\n");
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
fprintf(stderr, "%.*s = [not printable]\n", (int)name->len, name->ptr);
|
||||||
|
#endif
|
||||||
|
hawk_rtx_seterrinf(rtx, &oerrinf);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "***OUT OF MEMORY***\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#if defined(HAWK_OOCH_IS_UCH)
|
||||||
|
bcname = hawk_rtx_duputobchars(rtx, name->ptr, name->len, HAWK_NULL);
|
||||||
|
if (!bcname)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "***OUT OF MEMORY***\n");
|
||||||
|
hawk_freemem(hawk, str);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fprintf(stderr, "%s = %.*s\n", bcname, (int)len, str);
|
||||||
|
hawk_rtx_freemem(rtx, bcname);
|
||||||
|
#else
|
||||||
|
fprintf(stderr, "%.*s = %.*s\n", (int)name->len, name->ptr, (int)len, str);
|
||||||
|
#endif
|
||||||
|
hawk_freemem(hawk, str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void print_debug_return (hawk_rtx_t* rtx, hawk_val_t* ret)
|
||||||
|
{
|
||||||
|
hawk_oow_t len;
|
||||||
|
hawk_bch_t* str;
|
||||||
|
hawk_rtx_nv_itr_t itr;
|
||||||
|
hawk_val_t* nv;
|
||||||
|
|
||||||
|
if (hawk_rtx_isnilval(rtx, ret))
|
||||||
|
{
|
||||||
|
fprintf(stderr, "[RETURN] - ***nil***\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
str = hawk_rtx_valtobcstrdup(rtx, ret, &len);
|
||||||
|
if (!str)
|
||||||
|
{
|
||||||
|
fprintf(stderr, "[RETURN] - ***OUT OF MEMORY***\n");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
fprintf(stderr, "[RETURN] - [%.*s]\n", (int)len, str);
|
||||||
|
hawk_freemem(hawk_rtx_gethawk(rtx), str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fprintf(stderr, "[NAMED VARIABLES]\n");
|
||||||
|
for (nv = hawk_rtx_getfirstnv(rtx, &itr); nv; nv = hawk_rtx_getnextnv(rtx, &itr))
|
||||||
|
{
|
||||||
|
print_awk_value(rtx, &itr.name, nv);
|
||||||
|
}
|
||||||
|
fprintf(stderr, "[END OF NAMED VARIABLES]\n");
|
||||||
|
}
|
||||||
|
|
||||||
static void free_cmdline (cmdline_t* cmdline)
|
static void free_cmdline (cmdline_t* cmdline)
|
||||||
{
|
{
|
||||||
if (cmdline->gvm)
|
if (cmdline->gvm)
|
||||||
@@ -398,12 +521,12 @@ static int handle_cmdline (MyHawk& hawk, int argc, hawk_bch_t* argv[], cmdline_t
|
|||||||
|
|
||||||
static hawk_bcli_t opt =
|
static hawk_bcli_t opt =
|
||||||
{
|
{
|
||||||
"hF:f:d:o:I:v:",
|
"hDF:f:d:o:I:v:",
|
||||||
lng
|
lng
|
||||||
};
|
};
|
||||||
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)
|
||||||
@@ -412,6 +535,10 @@ static int handle_cmdline (MyHawk& hawk, int argc, hawk_bch_t* argv[], cmdline_t
|
|||||||
print_usage(stdout, argv[0]);
|
print_usage(stdout, argv[0]);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
case 'D':
|
||||||
|
cmdline->debug = 1;
|
||||||
|
break;
|
||||||
|
|
||||||
case 'F':
|
case 'F':
|
||||||
cmdline->fs = opt.arg;
|
cmdline->fs = opt.arg;
|
||||||
break;
|
break;
|
||||||
@@ -520,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++;
|
||||||
@@ -528,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;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -546,7 +673,7 @@ static int hawk_main (MyHawk& hawk, int argc, hawk_bch_t* argv[])
|
|||||||
hawk.setTrait(hawk.getTrait() | HAWK_FLEXMAP | HAWK_RWPIPE | HAWK_NEXTOFILE);
|
hawk.setTrait(hawk.getTrait() | HAWK_FLEXMAP | HAWK_RWPIPE | HAWK_NEXTOFILE);
|
||||||
|
|
||||||
// ARGV[0]
|
// ARGV[0]
|
||||||
if (hawk.addArgument(HAWK_T("hawk51")) <= -1)
|
if (hawk.addArgument(argv[0]) <= -1)
|
||||||
{
|
{
|
||||||
print_error(hawk);
|
print_error(hawk);
|
||||||
return -1;
|
return -1;
|
||||||
@@ -610,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);
|
||||||
@@ -653,6 +780,8 @@ static int hawk_main (MyHawk& hawk, int argc, hawk_bch_t* argv[])
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cmdline.debug) print_debug_return(*run, ret);
|
||||||
|
|
||||||
free_args_for_exec(&cmdline);
|
free_args_for_exec(&cmdline);
|
||||||
free_cmdline(&cmdline);
|
free_cmdline(&cmdline);
|
||||||
return 0;
|
return 0;
|
||||||
@@ -661,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)
|
||||||
@@ -671,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();
|
||||||
@@ -702,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
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -1,5 +1,26 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
|
hawk_bin="$1"
|
||||||
|
shift
|
||||||
|
|
||||||
|
hawk_lib_path="${LD_LIBRARY_PATH-}"
|
||||||
|
case "$hawk_bin" in
|
||||||
|
*/.libs/*)
|
||||||
|
libdir=$(cd "$(dirname "$hawk_bin")/../../lib/.libs" 2>/dev/null && pwd)
|
||||||
|
if [ -n "${libdir-}" ]
|
||||||
|
then
|
||||||
|
if [ -n "$hawk_lib_path" ]
|
||||||
|
then
|
||||||
|
hawk_lib_path="$libdir:$hawk_lib_path"
|
||||||
|
else
|
||||||
|
hawk_lib_path="$libdir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
export LD_LIBRARY_PATH="$hawk_lib_path"
|
||||||
|
set -- "$hawk_bin" "$@"
|
||||||
|
|
||||||
for i in $@; do :; done
|
for i in $@; do :; done
|
||||||
script="$i"
|
script="$i"
|
||||||
|
|
||||||
@@ -89,4 +110,3 @@ done < "$script"
|
|||||||
|
|
||||||
rm -f "$partfile"
|
rm -f "$partfile"
|
||||||
exit $ever_failed
|
exit $ever_failed
|
||||||
|
|
||||||
|
|||||||
+14
-1
@@ -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
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
+10
-3
@@ -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;
|
||||||
|
|
||||||
run_pipe_test("inherit-default", "BEGIN { print \"hello\" | \"cat >&3\" }", "hello\n");
|
uname = sys::uname()
|
||||||
run_pipe_test("cloexec-global", "BEGIN { PIPECLOEXEC = 1; print \"hello\" | \"cat >&3\" }", "");
|
if (uname["sysname"] ~ /Linux|Unix/) {
|
||||||
run_pipe_test("cloexec-pragma", "@pragma pipecloexec on\nBEGIN { print \"hello\" | \"cat >&3\" }", "");
|
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("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\" }", "");
|
||||||
|
} else {
|
||||||
|
tap_skip("PIPECLOEXEC not relevant");
|
||||||
|
}
|
||||||
|
|
||||||
tap_end();
|
tap_end();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
+71
-4
@@ -5,18 +5,47 @@
|
|||||||
|
|
||||||
set -u
|
set -u
|
||||||
|
|
||||||
|
hawk_lib_path="${LD_LIBRARY_PATH-}"
|
||||||
|
case "$HAWK_BIN" in
|
||||||
|
*/.libs/*)
|
||||||
|
libdir=$(cd "$(dirname "$HAWK_BIN")/../../lib/.libs" 2>/dev/null && pwd)
|
||||||
|
if [ -n "${libdir-}" ]
|
||||||
|
then
|
||||||
|
if [ -n "$hawk_lib_path" ]
|
||||||
|
then
|
||||||
|
hawk_lib_path="$libdir:$hawk_lib_path"
|
||||||
|
else
|
||||||
|
hawk_lib_path="$libdir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
tmp_prog="/tmp/hawk-regress-environ-$$.hawk"
|
tmp_prog="/tmp/hawk-regress-environ-$$.hawk"
|
||||||
tmp_pipe="/tmp/hawk-regress-environ-$$.pipe"
|
tmp_pipe="/tmp/hawk-regress-environ-$$.pipe"
|
||||||
trap 'rm -f "$tmp_prog" "$tmp_pipe"' EXIT
|
tmp_sys="/tmp/hawk-regress-environ-$$.sys"
|
||||||
|
trap 'rm -f "$tmp_prog" "$tmp_pipe" "$tmp_sys"' EXIT
|
||||||
|
|
||||||
cat > "$tmp_prog" <<'EOF'
|
cat > "$tmp_prog" <<EOF
|
||||||
function emit_env(tag, cmd)
|
function emit_env(tag, cmd)
|
||||||
{
|
{
|
||||||
cmd = "sh -c 'printf \"" tag ":%s\\n\" \"${HAWK_TEST_ENV_PIPE-unset}\" >&3'"
|
cmd = "sh -c 'printf \"" tag ":%s\\n\" \"\${HAWK_TEST_ENV_PIPE-unset}\" >&3'"
|
||||||
print "" | cmd
|
print "" | cmd
|
||||||
close(cmd)
|
close(cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function emit_env_system(tag, cmd)
|
||||||
|
{
|
||||||
|
cmd = "sh -c 'printf \"" tag ":%s\\n\" \"\${HAWK_TEST_ENV_SYS-unset}\" >> $tmp_sys'"
|
||||||
|
return sys::system(cmd)
|
||||||
|
}
|
||||||
|
|
||||||
|
function emit_env_system_fd3(tag, cmd)
|
||||||
|
{
|
||||||
|
cmd = "sh -c 'printf \"" tag ":%s\\n\" \"\${HAWK_TEST_ENV_SYS-unset}\" >&3'"
|
||||||
|
return sys::system(cmd)
|
||||||
|
}
|
||||||
|
|
||||||
BEGIN {
|
BEGIN {
|
||||||
print hawk::typename(ENVIRON["HAWK_TEST_ENV_INT"]) ":" ENVIRON["HAWK_TEST_ENV_INT"];
|
print hawk::typename(ENVIRON["HAWK_TEST_ENV_INT"]) ":" ENVIRON["HAWK_TEST_ENV_INT"];
|
||||||
print hawk::typename(ENVIRON["HAWK_TEST_ENV_NEG"]) ":" ENVIRON["HAWK_TEST_ENV_NEG"];
|
print hawk::typename(ENVIRON["HAWK_TEST_ENV_NEG"]) ":" ENVIRON["HAWK_TEST_ENV_NEG"];
|
||||||
@@ -38,15 +67,24 @@ BEGIN {
|
|||||||
print hawk::typename(ENVIRON["HAWK_TEST_ENV_STR"]) ":" hawk::isnil(ENVIRON["HAWK_TEST_ENV_STR"]);
|
print hawk::typename(ENVIRON["HAWK_TEST_ENV_STR"]) ":" hawk::isnil(ENVIRON["HAWK_TEST_ENV_STR"]);
|
||||||
|
|
||||||
emit_env("initial");
|
emit_env("initial");
|
||||||
|
print emit_env_system("initial");
|
||||||
ENVIRON["HAWK_TEST_ENV_PIPE"] = "changed";
|
ENVIRON["HAWK_TEST_ENV_PIPE"] = "changed";
|
||||||
|
ENVIRON["HAWK_TEST_ENV_SYS"] = "changed";
|
||||||
emit_env("changed");
|
emit_env("changed");
|
||||||
|
print emit_env_system("changed");
|
||||||
delete ENVIRON["HAWK_TEST_ENV_PIPE"];
|
delete ENVIRON["HAWK_TEST_ENV_PIPE"];
|
||||||
|
delete ENVIRON["HAWK_TEST_ENV_SYS"];
|
||||||
emit_env("deleted");
|
emit_env("deleted");
|
||||||
|
print emit_env_system("deleted");
|
||||||
ENVIRON = @{};
|
ENVIRON = @{};
|
||||||
ENVIRON["HAWK_TEST_ENV_PIPE"] = "replaced";
|
ENVIRON["HAWK_TEST_ENV_PIPE"] = "replaced";
|
||||||
|
ENVIRON["HAWK_TEST_ENV_SYS"] = "replaced";
|
||||||
emit_env("replaced");
|
emit_env("replaced");
|
||||||
|
print emit_env_system("replaced");
|
||||||
ENVIRON = 123;
|
ENVIRON = 123;
|
||||||
emit_env("scalar");
|
emit_env("scalar");
|
||||||
|
print emit_env_system("scalar");
|
||||||
|
print emit_env_system_fd3("fd3");
|
||||||
}
|
}
|
||||||
EOF
|
EOF
|
||||||
|
|
||||||
@@ -78,15 +116,20 @@ check_eq() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
echo "1..16"
|
echo "1..28"
|
||||||
|
|
||||||
if out=$(env -i \
|
if out=$(env -i \
|
||||||
|
LD_LIBRARY_PATH="${hawk_lib_path-}" \
|
||||||
|
DYLD_LIBRARY_PATH="${DYLD_LIBRARY_PATH-}" \
|
||||||
|
SHLIB_PATH="${SHLIB_PATH-}" \
|
||||||
|
LIBPATH="${LIBPATH-}" \
|
||||||
HAWK_TEST_ENV_INT=123 \
|
HAWK_TEST_ENV_INT=123 \
|
||||||
HAWK_TEST_ENV_NEG=-7 \
|
HAWK_TEST_ENV_NEG=-7 \
|
||||||
HAWK_TEST_ENV_FLT=1.25 \
|
HAWK_TEST_ENV_FLT=1.25 \
|
||||||
HAWK_TEST_ENV_STR=abc123 \
|
HAWK_TEST_ENV_STR=abc123 \
|
||||||
HAWK_TEST_ENV_EMPTY= \
|
HAWK_TEST_ENV_EMPTY= \
|
||||||
HAWK_TEST_ENV_PIPE=initial \
|
HAWK_TEST_ENV_PIPE=initial \
|
||||||
|
HAWK_TEST_ENV_SYS=initial \
|
||||||
"$HAWK_BIN" -f "$tmp_prog" 3>"$tmp_pipe" 2>&1)
|
"$HAWK_BIN" -f "$tmp_prog" 3>"$tmp_pipe" 2>&1)
|
||||||
then
|
then
|
||||||
ok "run environ regression"
|
ok "run environ regression"
|
||||||
@@ -105,11 +148,23 @@ line7=$(printf '%s\n' "$out" | sed -n '7p')
|
|||||||
line8=$(printf '%s\n' "$out" | sed -n '8p')
|
line8=$(printf '%s\n' "$out" | sed -n '8p')
|
||||||
line9=$(printf '%s\n' "$out" | sed -n '9p')
|
line9=$(printf '%s\n' "$out" | sed -n '9p')
|
||||||
line10=$(printf '%s\n' "$out" | sed -n '10p')
|
line10=$(printf '%s\n' "$out" | sed -n '10p')
|
||||||
|
line11=$(printf '%s\n' "$out" | sed -n '11p')
|
||||||
|
line12=$(printf '%s\n' "$out" | sed -n '12p')
|
||||||
|
line13=$(printf '%s\n' "$out" | sed -n '13p')
|
||||||
|
line14=$(printf '%s\n' "$out" | sed -n '14p')
|
||||||
|
line15=$(printf '%s\n' "$out" | sed -n '15p')
|
||||||
|
line16=$(printf '%s\n' "$out" | sed -n '16p')
|
||||||
pipe1=$(sed -n '1p' "$tmp_pipe")
|
pipe1=$(sed -n '1p' "$tmp_pipe")
|
||||||
pipe2=$(sed -n '2p' "$tmp_pipe")
|
pipe2=$(sed -n '2p' "$tmp_pipe")
|
||||||
pipe3=$(sed -n '3p' "$tmp_pipe")
|
pipe3=$(sed -n '3p' "$tmp_pipe")
|
||||||
pipe4=$(sed -n '4p' "$tmp_pipe")
|
pipe4=$(sed -n '4p' "$tmp_pipe")
|
||||||
pipe5=$(sed -n '5p' "$tmp_pipe")
|
pipe5=$(sed -n '5p' "$tmp_pipe")
|
||||||
|
pipe6=$(sed -n '6p' "$tmp_pipe")
|
||||||
|
sys1=$(sed -n '1p' "$tmp_sys")
|
||||||
|
sys2=$(sed -n '2p' "$tmp_sys")
|
||||||
|
sys3=$(sed -n '3p' "$tmp_sys")
|
||||||
|
sys4=$(sed -n '4p' "$tmp_sys")
|
||||||
|
sys5=$(sed -n '5p' "$tmp_sys")
|
||||||
|
|
||||||
check_eq "int env imported as int" "int:123" "$line1"
|
check_eq "int env imported as int" "int:123" "$line1"
|
||||||
check_eq "negative int env imported as int" "int:-7" "$line2"
|
check_eq "negative int env imported as int" "int:-7" "$line2"
|
||||||
@@ -121,10 +176,22 @@ check_eq "assigned int remains int" "int:456" "$line7"
|
|||||||
check_eq "assigned float remains flt" "flt:7.5" "$line8"
|
check_eq "assigned float remains flt" "flt:7.5" "$line8"
|
||||||
check_eq "assigned string remains str" "str:xyz" "$line9"
|
check_eq "assigned string remains str" "str:xyz" "$line9"
|
||||||
check_eq "deleted env entry becomes nil" "nil:1" "$line10"
|
check_eq "deleted env entry becomes nil" "nil:1" "$line10"
|
||||||
|
check_eq "system initial returned success" "0" "$line11"
|
||||||
|
check_eq "system changed returned success" "0" "$line12"
|
||||||
|
check_eq "system deleted returned success" "0" "$line13"
|
||||||
|
check_eq "system replaced returned success" "0" "$line14"
|
||||||
|
check_eq "system scalar returned success" "0" "$line15"
|
||||||
|
check_eq "system fd3 returned success" "0" "$line16"
|
||||||
check_eq "pipe sees initial imported env" "initial:initial" "$pipe1"
|
check_eq "pipe sees initial imported env" "initial:initial" "$pipe1"
|
||||||
check_eq "pipe sees in-place env update" "changed:changed" "$pipe2"
|
check_eq "pipe sees in-place env update" "changed:changed" "$pipe2"
|
||||||
check_eq "pipe sees deleted env entry" "deleted:unset" "$pipe3"
|
check_eq "pipe sees deleted env entry" "deleted:unset" "$pipe3"
|
||||||
check_eq "pipe sees replaced environ map" "replaced:replaced" "$pipe4"
|
check_eq "pipe sees replaced environ map" "replaced:replaced" "$pipe4"
|
||||||
check_eq "pipe sees scalar environ as empty" "scalar:unset" "$pipe5"
|
check_eq "pipe sees scalar environ as empty" "scalar:unset" "$pipe5"
|
||||||
|
check_eq "system preserves fd3 inheritance" "fd3:unset" "$pipe6"
|
||||||
|
check_eq "system sees initial imported env" "initial:initial" "$sys1"
|
||||||
|
check_eq "system sees in-place env update" "changed:changed" "$sys2"
|
||||||
|
check_eq "system sees deleted env entry" "deleted:unset" "$sys3"
|
||||||
|
check_eq "system sees replaced environ map" "replaced:replaced" "$sys4"
|
||||||
|
check_eq "system sees scalar environ as empty" "scalar:unset" "$sys5"
|
||||||
|
|
||||||
exit "$failed"
|
exit "$failed"
|
||||||
|
|||||||
@@ -5,6 +5,23 @@
|
|||||||
|
|
||||||
set -u
|
set -u
|
||||||
|
|
||||||
|
hawk_lib_path="${LD_LIBRARY_PATH-}"
|
||||||
|
case "$HAWK_BIN" in
|
||||||
|
*/.libs/*)
|
||||||
|
libdir=$(cd "$(dirname "$HAWK_BIN")/../../lib/.libs" 2>/dev/null && pwd)
|
||||||
|
if [ -n "${libdir-}" ]
|
||||||
|
then
|
||||||
|
if [ -n "$hawk_lib_path" ]
|
||||||
|
then
|
||||||
|
hawk_lib_path="$libdir:$hawk_lib_path"
|
||||||
|
else
|
||||||
|
hawk_lib_path="$libdir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
export LD_LIBRARY_PATH="$hawk_lib_path"
|
||||||
|
|
||||||
test_no=0
|
test_no=0
|
||||||
failed=0
|
failed=0
|
||||||
|
|
||||||
|
|||||||
@@ -7,6 +7,23 @@
|
|||||||
## make referecing an unset variable an error
|
## make referecing an unset variable an error
|
||||||
set -u
|
set -u
|
||||||
|
|
||||||
|
hawk_lib_path="${LD_LIBRARY_PATH-}"
|
||||||
|
case "$HAWK_BIN" in
|
||||||
|
*/.libs/*)
|
||||||
|
libdir=$(cd "$(dirname "$HAWK_BIN")/../../lib/.libs" 2>/dev/null && pwd)
|
||||||
|
if [ -n "${libdir-}" ]
|
||||||
|
then
|
||||||
|
if [ -n "$hawk_lib_path" ]
|
||||||
|
then
|
||||||
|
hawk_lib_path="$libdir:$hawk_lib_path"
|
||||||
|
else
|
||||||
|
hawk_lib_path="$libdir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
export LD_LIBRARY_PATH="$hawk_lib_path"
|
||||||
|
|
||||||
tmp_in="/tmp/hawk-regress-stdin-$$.txt"
|
tmp_in="/tmp/hawk-regress-stdin-$$.txt"
|
||||||
tmp_f1="/tmp/hawk-regress-file-1-$$.txt"
|
tmp_f1="/tmp/hawk-regress-file-1-$$.txt"
|
||||||
tmp_f2="/tmp/hawk regress file 2-$$.txt"
|
tmp_f2="/tmp/hawk regress file 2-$$.txt"
|
||||||
|
|||||||
@@ -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%
|
||||||
+22
-2
@@ -1,12 +1,32 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
|
hawk_bin="${HAWK_TEST_COMPILER:-../bin/hawk}"
|
||||||
|
hawk_lib_path="${LD_LIBRARY_PATH-}"
|
||||||
|
|
||||||
|
case "$hawk_bin" in
|
||||||
|
*/.libs/*)
|
||||||
|
libdir=$(cd "$(dirname "$hawk_bin")/../../lib/.libs" 2>/dev/null && pwd)
|
||||||
|
if [ -n "${libdir-}" ]
|
||||||
|
then
|
||||||
|
if [ -n "$hawk_lib_path" ]
|
||||||
|
then
|
||||||
|
hawk_lib_path="$libdir:$hawk_lib_path"
|
||||||
|
else
|
||||||
|
hawk_lib_path="$libdir"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
export LD_LIBRARY_PATH="$hawk_lib_path"
|
||||||
|
|
||||||
if [ "${VALGRIND:-0}" = "1" ]
|
if [ "${VALGRIND:-0}" = "1" ]
|
||||||
then
|
then
|
||||||
vglog="/tmp/hawk-valgrind-$$.log"
|
vglog="/tmp/hawk-valgrind-$$.log"
|
||||||
vgerr="${VALGRIND_ERROR_EXITCODE:-99}"
|
vgerr="${VALGRIND_ERROR_EXITCODE:-99}"
|
||||||
trap 'rm -f "$vglog"' EXIT
|
trap 'rm -f "$vglog"' EXIT
|
||||||
|
|
||||||
${VALGRIND_CMD:-valgrind} ${VALGRIND_FLAGS:-} --log-file="$vglog" "${HAWK_TEST_COMPILER:-../bin/hawk}" "$@"
|
${VALGRIND_CMD:-valgrind} ${VALGRIND_FLAGS:-} --log-file="$vglog" "$hawk_bin" "$@"
|
||||||
status=$?
|
status=$?
|
||||||
|
|
||||||
if [ -f "$vglog" ]
|
if [ -f "$vglog" ]
|
||||||
@@ -31,5 +51,5 @@ then
|
|||||||
|
|
||||||
exit "$status"
|
exit "$status"
|
||||||
else
|
else
|
||||||
exec "${HAWK_TEST_COMPILER:-../bin/hawk}" "$@"
|
exec "$hawk_bin" "$@"
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user