Compare commits

..

21 Commits

Author SHA1 Message Date
hyung-hwan 3d8ce4dbcd removed redundant return in a void function
continuous-integration/drone/push Build is passing
2026-05-26 12:25:49 +09:00
hyung-hwan 0d313cf474 added some test cases to cover unary with relational ops
continuous-integration/drone/push Build is passing
refactored htb and rbt a bit
2026-05-25 11:56:22 +09:00
hyung-hwan 1ca8160e07 removed HAWK_FNMAT_IS_SEP()
continuous-integration/drone/push Build is passing
2026-05-24 19:47:39 +09:00
hyung-hwan 6e05998bc9 added sys::uname()
continuous-integration/drone/push Build is passing
2026-05-24 14:57:16 +09:00
hyung-hwan 0b900e7d0d minor fix for a picky compiler
continuous-integration/drone/push Build is passing
2026-05-24 14:55:59 +09:00
hyung-hwan fe643c1c48 added some text for ENVIRON, PIPECLOEXEC, etc
continuous-integration/drone/push Build is passing
2026-05-23 14:32:19 +09:00
hyung-hwan d36d1a8675 tweaked code for win32
continuous-integration/drone/push Build is passing
2026-05-23 13:11:26 +09:00
hyung-hwan edea38a631 refactoring code to support non-unix oses 2026-05-22 20:05:09 +09:00
hyung-hwan c15ba6aa15 updated c++ classes for thread-safe ENVIRON handling
continuous-integration/drone/push Build is passing
2026-05-20 19:02:57 +09:00
hyung-hwan 178cb49e5b added a new callback env_mk to hawk_rio_cbs_t to improve environment variable handling 2026-05-20 17:58:00 +09:00
hyung-hwan 5b47ec6b07 updated ENVIRON handling code by introducing a revision number to a map
continuous-integration/drone/push Build is passing
2026-05-19 15:51:55 +09:00
hyung-hwan b8538fbc4d enhancing ENVIRON handling when interacting with external programs 2026-05-18 17:36:31 +09:00
hyung-hwan 06c5dc7fef simple code reformatting with a test script for ENVIRON 2026-05-17 11:02:26 +09:00
hyung-hwan e0fc631761 minor code refactoring. updated pio to accept an explicit envp pointer
continuous-integration/drone/push Build is passing
2026-05-16 19:33:58 +09:00
hyung-hwan afc195f34e some code touch up for sco
continuous-integration/drone/push Build is passing
2026-05-14 22:54:27 +09:00
hyung-hwan 6ddba562d6 optimization in handling reference arguments
continuous-integration/drone/push Build is passing
2026-04-25 17:36:33 +09:00
hyung-hwan 7888255a3a fixed the wrong asserting while refdowning named variable slots
continuous-integration/drone/push Build is passing
2026-04-25 16:46:24 +09:00
hyung-hwan 8ad6477b7c added more test cases
continuous-integration/drone/push Build is passing
2026-04-25 15:17:54 +09:00
hyung-hwan 5dd6934191 patches run_reset to reflect the change in named variable access implementation
continuous-integration/drone/push Build is passing
2026-04-25 15:07:08 +09:00
hyung-hwan 59bd31dd56 fixed the skipped error assignment in hawkgo.go.
continuous-integration/drone/push Build is passing
fixed the error output to use a single output function call
2026-04-25 14:52:45 +09:00
hyung-hwan fd0da9b046 updated the test harness to support VALGRIND=1
continuous-integration/drone/push Build is passing
updated hawkgo to print the error info in the same format at hawk
2026-04-25 14:12:25 +09:00
65 changed files with 3012 additions and 872 deletions
+24
View File
@@ -723,6 +723,9 @@ Common built-ins:
- `NR`, `FNR`, `NF` - `NR`, `FNR`, `NF`
- `FS`, `RS`, `OFS`, `ORS` - `FS`, `RS`, `OFS`, `ORS`
- `FILENAME`, `OFILENAME` - `FILENAME`, `OFILENAME`
- `ARGC`, `ARGV`
- `ENVIRON`
- `PIPECLOEXEC`
Example: Example:
@@ -730,6 +733,27 @@ Example:
{ print NR, NF, $0 } { print NR, NF, $0 }
``` ```
Runtime-specific predefined variables:
| Name | Type | Description |
|------|------|-------------|
| `ARGC` | int | number of command-line arguments available via `ARGV` |
| `ARGV` | array | command-line argument vector. `ARGV[0]` is usually the program name |
| `ENVIRON` | map | process environment as a map. Values imported from the host environment may become `int`, `flt`, or `str` depending on content |
| `PIPECLOEXEC` | int/bool-like | controls whether file descriptors are opened with `CLOEXEC` when Hawk runs an external command for piping. `0` keeps the default inheritance behavior, `1` enables close-on-exec. This corresponds to `@pragma pipecloexec` |
`ENVIRON` affects child processes started by piping and `sys::system()`. Modifying it changes the environment passed to those children without changing the process-global environment of the embedding application.
Examples:
```awk
BEGIN {
print ARGC, ARGV[0]
print ENVIRON["HOME"]
PIPECLOEXEC = 1
}
```
## Built-in Functions ## Built-in Functions
Hawk includes awk built-ins (e.g., `length`, `substr`, `split`, `index`) plus extensions in modules (see below). Hawk includes awk built-ins (e.g., `length`, `substr`, `split`, `index`) plus extensions in modules (see below).
+1 -1
View File
@@ -1,4 +1,4 @@
#! /usr/bin/env sh #!/bin/sh
## DO NOT EDIT - This file generated from ./build-aux/ltmain.in ## DO NOT EDIT - This file generated from ./build-aux/ltmain.in
## by inline-source v2019-02-19.15 ## by inline-source v2019-02-19.15
+9 -9
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: hawk 1.0.0\n" "Project-Id-Version: hawk 1.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-25 12:33+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:410 #: ../../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:411 #: ../../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:414 #: ../../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:415 #: ../../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:416 #: ../../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:410 #: ../../bin/main.c:416
msgid "[options] [mode specific options and parameters]" msgid "[options] [mode specific options and parameters]"
msgstr "[옵션] [모드별 옵션과 인자]" msgstr "[옵션] [모드별 옵션과 인자]"
#: ../../bin/main.c:412 #: ../../bin/main.c:418
msgid " --usage print this message" msgid " --usage print this message"
msgstr " --usage 이 메시지를 출력" msgstr " --usage 이 메시지를 출력"
#: ../../bin/main.c:413 #: ../../bin/main.c:419
msgid " --version print version" msgid " --version print version"
msgstr " --version 버전을 출력" msgstr " --version 버전을 출력"
+9 -9
View File
@@ -7,7 +7,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: hawk 1.0.0\n" "Project-Id-Version: hawk 1.0.0\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-25 12:33+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:410 #: ../../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:411 #: ../../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:414 #: ../../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:415 #: ../../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:416 #: ../../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:410 #: ../../bin/main.c:416
msgid "[options] [mode specific options and parameters]" msgid "[options] [mode specific options and parameters]"
msgstr "[选项] [模式特定选项与参数]" msgstr "[选项] [模式特定选项与参数]"
#: ../../bin/main.c:412 #: ../../bin/main.c:418
msgid " --usage print this message" msgid " --usage print this message"
msgstr " --usage 显示此信息" msgstr " --usage 显示此信息"
#: ../../bin/main.c:413 #: ../../bin/main.c:419
msgid " --version print version" msgid " --version print version"
msgstr " --version 显示版本" msgstr " --version 显示版本"
+9 -9
View File
@@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-25 12:33+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:410 #: ../../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:411 #: ../../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:414 #: ../../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:415 #: ../../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:416 #: ../../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:410 #: ../../bin/main.c:416
msgid "[options] [mode specific options and parameters]" msgid "[options] [mode specific options and parameters]"
msgstr "" msgstr ""
#: ../../bin/main.c:412 #: ../../bin/main.c:418
msgid " --usage print this message" msgid " --usage print this message"
msgstr "" msgstr ""
#: ../../bin/main.c:413 #: ../../bin/main.c:419
msgid " --version print version" msgid " --version print version"
msgstr "" msgstr ""
+43 -3
View File
@@ -95,6 +95,38 @@ func dprint_return(rtx *hawk.Rtx, retv *hawk.Val) {
fmt.Fprintf(os.Stderr, "[END OF NAMED VARIABLES]\n") fmt.Fprintf(os.Stderr, "[END OF NAMED VARIABLES]\n")
} }
func print_hawk_error(h *hawk.Hawk) {
var err *hawk.Err
err = h.GetErrInfo()
print_hawk_errinfo(err)
}
func print_hawk_rtx_error(rtx *hawk.Rtx) {
var err *hawk.Err
err = rtx.GetErrInfo()
print_hawk_errinfo(err)
}
func print_hawk_errinfo(err *hawk.Err) {
fmt.Fprintf(os.Stderr, "%s\n", format_hawk_errinfo(err))
}
func format_hawk_errinfo(err *hawk.Err) string {
if err == nil {
return "ERROR: unknown error"
}
if err.File != "" {
return fmt.Sprintf("ERROR: Line %d Column %d Code %d File %s - %s",
err.Line, err.Colm, err.Num, err.File, err.Msg)
} else {
return fmt.Sprintf("ERROR: Line %d Column %d Code %d - %s",
err.Line, err.Colm, err.Num, err.Msg)
}
}
func parse_args_to_config(cfg *Config) bool { func parse_args_to_config(cfg *Config) bool {
//var flgs *flag.FlagSet //var flgs *flag.FlagSet
var flgs *FlagSet var flgs *FlagSet
@@ -255,7 +287,7 @@ func run_script(h *hawk.Hawk, fs_idx int, data_idx int, cfg *Config, rtx_chan ch
goto oops goto oops
} }
rtx.SetGlobal(fs_idx, vv) err = rtx.SetGlobal(fs_idx, vv)
vv.Close() vv.Close()
if err != nil { if err != nil {
err = fmt.Errorf("failed to set field separator to '%s' - %s", cfg.fs, err.Error()) err = fmt.Errorf("failed to set field separator to '%s' - %s", cfg.fs, err.Error())
@@ -310,7 +342,7 @@ func run_script(h *hawk.Hawk, fs_idx int, data_idx int, cfg *Config, rtx_chan ch
retv, err = rtx.Exec(cfg.data_in_files) retv, err = rtx.Exec(cfg.data_in_files)
} }
if err != nil { if err != nil {
err = fmt.Errorf("failed to run - %s", err.Error()) err = rtx.GetErrInfo()
goto oops goto oops
} }
@@ -448,7 +480,7 @@ func main() {
err = h.ParseText(cfg.srcstr) err = h.ParseText(cfg.srcstr)
} }
if err != nil { if err != nil {
fmt.Fprintf(os.Stderr, "ERROR: failed to parse - %s\n", err.Error()) print_hawk_error(h)
goto oops goto oops
} }
@@ -470,15 +502,23 @@ func main() {
defer wg.Done() defer wg.Done()
err = run_script(h, fs_idx, idx, &cfg, rtx_chan, sig_chan) err = run_script(h, fs_idx, idx, &cfg, rtx_chan, sig_chan)
if err != nil { if err != nil {
if herr, ok := err.(*hawk.Err); ok {
fmt.Fprintf(os.Stderr, "[%d] %s\n", idx, format_hawk_errinfo(herr))
} else {
fmt.Fprintf(os.Stderr, "ERROR: [%d]%s\n", idx, err.Error()) fmt.Fprintf(os.Stderr, "ERROR: [%d]%s\n", idx, err.Error())
} }
}
}(i) }(i)
} }
wg.Wait() wg.Wait()
} else { } else {
err = run_script(h, fs_idx, -1, &cfg, rtx_chan, sig_chan) err = run_script(h, fs_idx, -1, &cfg, rtx_chan, sig_chan)
if err != nil { if err != nil {
if herr, ok := err.(*hawk.Err); ok {
print_hawk_errinfo(herr)
} else {
fmt.Fprintf(os.Stderr, "ERROR: %s\n", err.Error()) fmt.Fprintf(os.Stderr, "ERROR: %s\n", err.Error())
}
goto oops goto oops
} }
} }
+6
View File
@@ -26,6 +26,7 @@
#include "main.h" #include "main.h"
#include <hawk.h> #include <hawk.h>
#include <hawk-fmt.h>
#include <hawk-glob.h> #include <hawk-glob.h>
#include <hawk-po.h> #include <hawk-po.h>
#include <hawk-xma.h> #include <hawk-xma.h>
@@ -36,6 +37,7 @@
#if defined(_WIN32) #if defined(_WIN32)
# include <windows.h> # include <windows.h>
# include <signal.h>
#elif defined(__OS2__) #elif defined(__OS2__)
# define INCL_ERRORS # define INCL_ERRORS
# include <os2.h> # include <os2.h>
@@ -290,6 +292,10 @@ int hawk_main_expand_wildcard (int argc, hawk_bch_t* argv[], int do_glob, hawk_m
/* -------------------------------------------------------- */ /* -------------------------------------------------------- */
#if !defined(HAWK_PATH_MAX)
#define HAWK_PATH_MAX (4096)
#endif
int hawk_main_load_lang (hawk_pocat_t* pc, const char* basedir, const char* subbasedir, const char* prefix, const char* suffix, const char* locale) int hawk_main_load_lang (hawk_pocat_t* pc, const char* basedir, const char* subbasedir, const char* prefix, const char* suffix, const char* locale)
{ {
char path[HAWK_PATH_MAX]; char path[HAWK_PATH_MAX];
Vendored
+24 -2
View File
@@ -732,6 +732,8 @@ LANGDIR
ENABLE_WIDE_CHAR_FALSE ENABLE_WIDE_CHAR_FALSE
ENABLE_WIDE_CHAR_TRUE ENABLE_WIDE_CHAR_TRUE
LIBM LIBM
SCODS_FALSE
SCODS_TRUE
MACOSX_FALSE MACOSX_FALSE
MACOSX_TRUE MACOSX_TRUE
WIN32_FALSE WIN32_FALSE
@@ -21252,14 +21254,22 @@ case "$host" in
#CFLAGS="$CFLAGS -D_WIN32_WINNT=0x0400" #CFLAGS="$CFLAGS -D_WIN32_WINNT=0x0400"
platform_win32=yes platform_win32=yes
platform_macosx=no platform_macosx=no
platform_scods=no
;; ;;
*-*-darwin*) *-*-darwin*)
platform_win32=no platform_win32=no
platform_macosx=yes platform_macosx=yes
platform_scods=no
;;
*-*-sco3.2v*)
platform_win32=no
platform_macosx=no
platform_scods=yes
;; ;;
*) *)
platform_win32=no platform_win32=no
platform_macosx=no platform_macosx=no
platform_scods=no
;; ;;
esac esac
if test "x${platform_win32}" = "xyes" ; then if test "x${platform_win32}" = "xyes" ; then
@@ -21278,6 +21288,14 @@ else
MACOSX_FALSE= MACOSX_FALSE=
fi fi
if test "x${platform_scods}" = "xyes" ; then
SCODS_TRUE=
SCODS_FALSE='#'
else
SCODS_TRUE='#'
SCODS_FALSE=
fi
LIBM= LIBM=
case $host in case $host in
@@ -21448,7 +21466,7 @@ else case e in #(
esac esac
fi fi
if test "${enable_wide_char}" = "yes:4" -o "${enable_wide_char}" = "yes:4w" if test "${enable_wide_char}" = "yes:4" -o "${enable_wide_char}" = "yes:4w" -o \( "${enable_wide_char}" = "yes" -a "${platform_scods}" = "yes" \)
then then
printf "%s\n" "#define HAWK_WIDE_CHAR_SIZE 4" >>confdefs.h printf "%s\n" "#define HAWK_WIDE_CHAR_SIZE 4" >>confdefs.h
@@ -21467,7 +21485,7 @@ printf "%s\n" "#define HAWK_ENABLE_WIDE_CHAR 1" >>confdefs.h
CFLAGS="$CFLAGS -fno-short-wchar" CFLAGS="$CFLAGS -fno-short-wchar"
CXXFLAGS="$CXXFLAGS -fno-short-wchar" CXXFLAGS="$CXXFLAGS -fno-short-wchar"
fi fi
if test "${enable_wide_char}" = "yes:4w" if test "${enable_wide_char}" != "yes:4"
then then
printf "%s\n" "#define HAWK_PREFER_PREFIX_L 1" >>confdefs.h printf "%s\n" "#define HAWK_PREFER_PREFIX_L 1" >>confdefs.h
@@ -29643,6 +29661,10 @@ if test -z "${MACOSX_TRUE}" && test -z "${MACOSX_FALSE}"; then
as_fn_error $? "conditional \"MACOSX\" was never defined. as_fn_error $? "conditional \"MACOSX\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5 Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi fi
if test -z "${SCODS_TRUE}" && test -z "${SCODS_FALSE}"; then
as_fn_error $? "conditional \"SCODS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${ENABLE_WIDE_CHAR_TRUE}" && test -z "${ENABLE_WIDE_CHAR_FALSE}"; then if test -z "${ENABLE_WIDE_CHAR_TRUE}" && test -z "${ENABLE_WIDE_CHAR_FALSE}"; then
as_fn_error $? "conditional \"ENABLE_WIDE_CHAR\" was never defined. as_fn_error $? "conditional \"ENABLE_WIDE_CHAR\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5 Usually this means the macro was only invoked conditionally." "$LINENO" 5
+13 -2
View File
@@ -80,18 +80,27 @@ case "$host" in
#CFLAGS="$CFLAGS -D_WIN32_WINNT=0x0400" #CFLAGS="$CFLAGS -D_WIN32_WINNT=0x0400"
platform_win32=yes platform_win32=yes
platform_macosx=no platform_macosx=no
platform_scods=no
;; ;;
*-*-darwin*) *-*-darwin*)
platform_win32=no platform_win32=no
platform_macosx=yes platform_macosx=yes
platform_scods=no
;;
*-*-sco3.2v*)
platform_win32=no
platform_macosx=no
platform_scods=yes
;; ;;
*) *)
platform_win32=no platform_win32=no
platform_macosx=no platform_macosx=no
platform_scods=no
;; ;;
esac esac
AM_CONDITIONAL(WIN32, test "x${platform_win32}" = "xyes" ) AM_CONDITIONAL(WIN32, test "x${platform_win32}" = "xyes" )
AM_CONDITIONAL(MACOSX, test "x${platform_macosx}" = "xyes" ) AM_CONDITIONAL(MACOSX, test "x${platform_macosx}" = "xyes" )
AM_CONDITIONAL(SCODS, test "x${platform_scods}" = "xyes" )
dnl check the math library (check if -lm is needed) dnl check the math library (check if -lm is needed)
LT_LIB_M LT_LIB_M
@@ -105,7 +114,7 @@ AC_ARG_ENABLE([wide-char],
enable_wide_char=$enableval, enable_wide_char=$enableval,
enable_wide_char=yes enable_wide_char=yes
) )
if test "${enable_wide_char}" = "yes:4" -o "${enable_wide_char}" = "yes:4w" if test "${enable_wide_char}" = "yes:4" -o "${enable_wide_char}" = "yes:4w" -o \( "${enable_wide_char}" = "yes" -a "${platform_scods}" = "yes" \)
then then
AC_DEFINE([HAWK_WIDE_CHAR_SIZE],[4],[Wide-character type size]) AC_DEFINE([HAWK_WIDE_CHAR_SIZE],[4],[Wide-character type size])
AC_DEFINE([HAWK_ENABLE_WIDE_CHAR],[1],[Use the wide-character type as the default character type]) AC_DEFINE([HAWK_ENABLE_WIDE_CHAR],[1],[Use the wide-character type as the default character type])
@@ -120,7 +129,9 @@ then
[CFLAGS="$CFLAGS -fno-short-wchar"] [CFLAGS="$CFLAGS -fno-short-wchar"]
[CXXFLAGS="$CXXFLAGS -fno-short-wchar"] [CXXFLAGS="$CXXFLAGS -fno-short-wchar"]
fi fi
if test "${enable_wide_char}" = "yes:4w"
dnl prefer L if yes:4w is specified or just sco cc is used.
if test "${enable_wide_char}" != "yes:4"
then then
AC_DEFINE([HAWK_PREFER_PREFIX_L],[1],[Prefix wide-character literals with L]) AC_DEFINE([HAWK_PREFER_PREFIX_L],[1],[Prefix wide-character literals with L])
fi fi
+11
View File
@@ -188,6 +188,7 @@ import "unsafe"
type Func func(rtx *Rtx) error type Func func(rtx *Rtx) error
type Err struct { type Err struct {
Num uint
Line uint Line uint
Colm uint Colm uint
File string File string
@@ -319,6 +320,7 @@ func (hawk *Hawk) make_errinfo() *Err {
var loc *C.hawk_loc_t var loc *C.hawk_loc_t
var err Err var err Err
err.Num = uint(C.hawk_geterrnum(hawk.c))
err.Msg = hawk.get_errmsg() err.Msg = hawk.get_errmsg()
loc = C.hawk_geterrloc(hawk.c) loc = C.hawk_geterrloc(hawk.c)
@@ -332,6 +334,10 @@ func (hawk *Hawk) make_errinfo() *Err {
return &err return &err
} }
func (hawk *Hawk) GetErrInfo() *Err {
return hawk.make_errinfo()
}
func (hawk *Hawk) GetTrait() BitMask { func (hawk *Hawk) GetTrait() BitMask {
var x C.int var x C.int
var log_mask BitMask = 0 var log_mask BitMask = 0
@@ -629,6 +635,7 @@ func (rtx *Rtx) make_errinfo() *Err {
var loc *C.hawk_loc_t var loc *C.hawk_loc_t
var err Err var err Err
err.Num = uint(C.hawk_rtx_geterrnum(rtx.c))
err.Msg = rtx.get_errmsg() err.Msg = rtx.get_errmsg()
loc = C.hawk_rtx_geterrloc(rtx.c) loc = C.hawk_rtx_geterrloc(rtx.c)
@@ -642,6 +649,10 @@ func (rtx *Rtx) make_errinfo() *Err {
return &err return &err
} }
func (rtx *Rtx) GetErrInfo() *Err {
return rtx.make_errinfo()
}
func (rtx *Rtx) SetGlobal(idx int, val *Val) error { func (rtx *Rtx) SetGlobal(idx int, val *Val) error {
if C.hawk_rtx_setgbl(rtx.c, C.int(idx), val.c) <= -1 { if C.hawk_rtx_setgbl(rtx.c, C.int(idx), val.c) <= -1 {
return rtx.make_errinfo() return rtx.make_errinfo()
+13 -2
View File
@@ -1456,11 +1456,11 @@ Hawk::Value::IndexIterator Hawk::Value::getNextIndex (Index* idx, const IndexIte
// Hawk::Run // Hawk::Run
////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////
Hawk::Run::Run (Hawk* hawk): hawk(hawk), rtx (HAWK_NULL) 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
View File
@@ -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);
+54 -50
View File
@@ -262,24 +262,24 @@ am__libhawk_la_SOURCES_DIST = hawk.h hawk-arr.h hawk-chr.h hawk-cli.h \
cut.c dir.c ecs-imp.h ecs.c err-prv.h err.c err-sys.c \ cut.c dir.c ecs-imp.h ecs.c err-prv.h err.c err-sys.c \
fmt-imp.h fmt.c fnc-prv.h fnc.c gbk.c gbk.h gem.c gem-glob.c \ fmt-imp.h fmt.c fnc-prv.h fnc.c gbk.c gbk.h gem.c gem-glob.c \
gem-nwif.c gem-nwif2.c hawk-prv.h hawk.c htb.c idmap-imp.h \ gem-nwif.c gem-nwif2.c hawk-prv.h hawk.c htb.c idmap-imp.h \
jis0208.c jis0208.h json.c json-prv.h ksc5601.c ksc5601.h mb8.c misc-imp.h \ jis0208.c jis0208.h json.c json-prv.h ksc5601.c ksc5601.h \
misc-prv.h misc.c parse-prv.h parse.c po-cat.c rbt.c rec.c \ mb8.c misc-imp.h misc-prv.h misc.c parse-prv.h parse.c \
rio-prv.h rio.c run-prv.h run.c sed-prv.h sed.c skad-prv.h \ po-cat.c rbt.c rec.c rio-prv.h rio.c run-prv.h run.c sed-prv.h \
skad.c tre-prv.h tre-ast.c tre-ast.h tre-compile.c \ sed.c skad-prv.h skad.c tre-prv.h tre-ast.c tre-ast.h \
tre-compile.h tre-match-bt.c tre-match-pa.c tre-match-ut.h \ tre-compile.c tre-compile.h tre-match-bt.c tre-match-pa.c \
tre-mem.c tre-mem.h tre-parse.c tre-parse.h tre-stack.h \ tre-match-ut.h tre-mem.c tre-mem.h tre-parse.c tre-parse.h \
tre-stack.c tre.c tree-prv.h tree.c uch-prop.h uch-case.h \ tre-stack.h tre-stack.c tre.c tree-prv.h tree.c uch-prop.h \
utf16.c utf8.c utl-ass.c utl-cmgr.c utl-rnd.c utl-sort.c \ uch-case.h utf16.c utf8.c utl-ass.c utl-cmgr.c utl-rnd.c \
utl-str.c utl-sys.c utl-xstr.c utl.c val-prv.h val.c xma.c \ utl-sort.c utl-str.c utl-sys.c utl-xstr.c utl.c val-prv.h \
cli-imp.h cli.c fio.c mtx.c pio.c sio.c syscall.h tio.c std.c \ val.c xma.c cli-imp.h cli.c fio.c mtx.c pio.c sio.c syscall.h \
std-cut.c std-json.c std-sed.c Hawk.cpp Std.cpp Sed.cpp \ tio.c std.c std-cut.c std-json.c std-sed.c Hawk.cpp Std.cpp \
Std-Sed.cpp mod-hawk.c mod-hawk.h mod-math.c mod-math.h \ Sed.cpp Std-Sed.cpp mod-hawk.c mod-hawk.h mod-math.c \
mod-str.c mod-str.h mod-sys.c mod-sys.h ../mod/mod-ffi.c \ mod-math.h mod-str.c mod-str.h mod-sys.c mod-sys.h \
../mod/mod-ffi.h ../mod/mod-memc.c ../mod/mod-memc.h \ ../mod/mod-ffi.c ../mod/mod-ffi.h ../mod/mod-memc.c \
../mod/mod-mysql.c ../mod/mod-mysql.h ../mod/mod-json.c \ ../mod/mod-memc.h ../mod/mod-mysql.c ../mod/mod-mysql.h \
../mod/mod-json.h ../mod/mod-sqlite.c ../mod/mod-sqlite.h \ ../mod/mod-json.c ../mod/mod-json.h ../mod/mod-sqlite.c \
../mod/mod-sed.c ../mod/mod-sed.h ../mod/mod-uci.c \ ../mod/mod-sqlite.h ../mod/mod-sed.c ../mod/mod-sed.h \
../mod/mod-uci.h ../mod/mod-uci.c ../mod/mod-uci.h
am__objects_1 = am__objects_1 =
am__objects_2 = $(am__objects_1) am__objects_2 = $(am__objects_1)
@ENABLE_CXX_TRUE@am__objects_3 = libhawk_la-Hawk.lo libhawk_la-Std.lo \ @ENABLE_CXX_TRUE@am__objects_3 = libhawk_la-Hawk.lo libhawk_la-Std.lo \
@@ -309,16 +309,15 @@ am_libhawk_la_OBJECTS = $(am__objects_2) libhawk_la-arr.lo \
libhawk_la-gbk.lo libhawk_la-gem.lo libhawk_la-gem-glob.lo \ libhawk_la-gbk.lo libhawk_la-gem.lo libhawk_la-gem-glob.lo \
libhawk_la-gem-nwif.lo libhawk_la-gem-nwif2.lo \ libhawk_la-gem-nwif.lo libhawk_la-gem-nwif2.lo \
libhawk_la-hawk.lo libhawk_la-htb.lo libhawk_la-jis0208.lo \ libhawk_la-hawk.lo libhawk_la-htb.lo libhawk_la-jis0208.lo \
libhawk_la-json.lo \ libhawk_la-json.lo libhawk_la-ksc5601.lo libhawk_la-mb8.lo \
libhawk_la-ksc5601.lo libhawk_la-mb8.lo libhawk_la-misc.lo \ libhawk_la-misc.lo libhawk_la-parse.lo libhawk_la-po-cat.lo \
libhawk_la-parse.lo libhawk_la-po-cat.lo libhawk_la-rbt.lo \ libhawk_la-rbt.lo libhawk_la-rec.lo libhawk_la-rio.lo \
libhawk_la-rec.lo libhawk_la-rio.lo libhawk_la-run.lo \ libhawk_la-run.lo libhawk_la-sed.lo libhawk_la-skad.lo \
libhawk_la-sed.lo libhawk_la-skad.lo libhawk_la-tre-ast.lo \ libhawk_la-tre-ast.lo libhawk_la-tre-compile.lo \
libhawk_la-tre-compile.lo libhawk_la-tre-match-bt.lo \ libhawk_la-tre-match-bt.lo libhawk_la-tre-match-pa.lo \
libhawk_la-tre-match-pa.lo libhawk_la-tre-mem.lo \ libhawk_la-tre-mem.lo libhawk_la-tre-parse.lo \
libhawk_la-tre-parse.lo libhawk_la-tre-stack.lo \ libhawk_la-tre-stack.lo libhawk_la-tre.lo libhawk_la-tree.lo \
libhawk_la-tre.lo libhawk_la-tree.lo libhawk_la-utf16.lo \ libhawk_la-utf16.lo libhawk_la-utf8.lo libhawk_la-utl-ass.lo \
libhawk_la-utf8.lo libhawk_la-utl-ass.lo \
libhawk_la-utl-cmgr.lo libhawk_la-utl-rnd.lo \ libhawk_la-utl-cmgr.lo libhawk_la-utl-rnd.lo \
libhawk_la-utl-sort.lo libhawk_la-utl-str.lo \ libhawk_la-utl-sort.lo libhawk_la-utl-str.lo \
libhawk_la-utl-sys.lo libhawk_la-utl-xstr.lo libhawk_la-utl.lo \ libhawk_la-utl-sys.lo libhawk_la-utl-xstr.lo libhawk_la-utl.lo \
@@ -368,7 +367,9 @@ am__depfiles_remade = ../mod/$(DEPDIR)/libhawk_la-mod-ffi.Plo \
./$(DEPDIR)/libhawk_la-gem-nwif.Plo \ ./$(DEPDIR)/libhawk_la-gem-nwif.Plo \
./$(DEPDIR)/libhawk_la-gem-nwif2.Plo \ ./$(DEPDIR)/libhawk_la-gem-nwif2.Plo \
./$(DEPDIR)/libhawk_la-gem.Plo ./$(DEPDIR)/libhawk_la-hawk.Plo \ ./$(DEPDIR)/libhawk_la-gem.Plo ./$(DEPDIR)/libhawk_la-hawk.Plo \
./$(DEPDIR)/libhawk_la-htb.Plo ./$(DEPDIR)/libhawk_la-json.Plo \ ./$(DEPDIR)/libhawk_la-htb.Plo \
./$(DEPDIR)/libhawk_la-jis0208.Plo \
./$(DEPDIR)/libhawk_la-json.Plo \
./$(DEPDIR)/libhawk_la-ksc5601.Plo \ ./$(DEPDIR)/libhawk_la-ksc5601.Plo \
./$(DEPDIR)/libhawk_la-mb8.Plo ./$(DEPDIR)/libhawk_la-misc.Plo \ ./$(DEPDIR)/libhawk_la-mb8.Plo ./$(DEPDIR)/libhawk_la-misc.Plo \
./$(DEPDIR)/libhawk_la-mod-hawk.Plo \ ./$(DEPDIR)/libhawk_la-mod-hawk.Plo \
@@ -705,20 +706,20 @@ libhawk_la_SOURCES = $(pkginclude_HEADERS) arr.c big5.c big5.h chr.c \
cut-prv.h cut.c dir.c ecs-imp.h ecs.c err-prv.h err.c \ cut-prv.h cut.c dir.c ecs-imp.h ecs.c err-prv.h err.c \
err-sys.c fmt-imp.h fmt.c fnc-prv.h fnc.c gbk.c gbk.h gem.c \ err-sys.c fmt-imp.h fmt.c fnc-prv.h fnc.c gbk.c gbk.h gem.c \
gem-glob.c gem-nwif.c gem-nwif2.c hawk-prv.h hawk.c htb.c \ gem-glob.c gem-nwif.c gem-nwif2.c hawk-prv.h hawk.c htb.c \
idmap-imp.h jis0208.c jis0208.h json.c json-prv.h ksc5601.c ksc5601.h mb8.c \ idmap-imp.h jis0208.c jis0208.h json.c json-prv.h ksc5601.c \
misc-imp.h misc-prv.h misc.c parse-prv.h parse.c po-cat.c \ ksc5601.h mb8.c misc-imp.h misc-prv.h misc.c parse-prv.h \
rbt.c rec.c rio-prv.h rio.c run-prv.h run.c sed-prv.h sed.c \ parse.c po-cat.c rbt.c rec.c rio-prv.h rio.c run-prv.h run.c \
skad-prv.h skad.c tre-prv.h tre-ast.c tre-ast.h tre-compile.c \ sed-prv.h sed.c skad-prv.h skad.c tre-prv.h tre-ast.c \
tre-compile.h tre-match-bt.c tre-match-pa.c tre-match-ut.h \ tre-ast.h tre-compile.c tre-compile.h tre-match-bt.c \
tre-mem.c tre-mem.h tre-parse.c tre-parse.h tre-stack.h \ tre-match-pa.c tre-match-ut.h tre-mem.c tre-mem.h tre-parse.c \
tre-stack.c tre.c tree-prv.h tree.c uch-prop.h uch-case.h \ tre-parse.h tre-stack.h tre-stack.c tre.c tree-prv.h tree.c \
utf16.c utf8.c utl-ass.c utl-cmgr.c utl-rnd.c utl-sort.c \ uch-prop.h uch-case.h utf16.c utf8.c utl-ass.c utl-cmgr.c \
utl-str.c utl-sys.c utl-xstr.c utl.c val-prv.h val.c xma.c \ utl-rnd.c utl-sort.c utl-str.c utl-sys.c utl-xstr.c utl.c \
cli-imp.h cli.c fio.c mtx.c pio.c sio.c syscall.h tio.c std.c \ val-prv.h val.c xma.c cli-imp.h cli.c fio.c mtx.c pio.c sio.c \
std-cut.c std-json.c std-sed.c $(am__append_8) $(am__append_9) \ syscall.h tio.c std.c std-cut.c std-json.c std-sed.c \
$(am__append_12) $(am__append_14) $(am__append_16) \ $(am__append_8) $(am__append_9) $(am__append_12) \
$(am__append_19) $(am__append_20) $(am__append_22) \ $(am__append_14) $(am__append_16) $(am__append_19) \
$(am__append_23) $(am__append_20) $(am__append_22) $(am__append_23)
libhawk_la_CPPFLAGS = $(CPPFLAGS_ALL_COMMON) $(CPPFLAGS_PFMOD) \ libhawk_la_CPPFLAGS = $(CPPFLAGS_ALL_COMMON) $(CPPFLAGS_PFMOD) \
$(am__append_3) $(am__append_17) $(am__append_3) $(am__append_17)
libhawk_la_CFLAGS = $(CFLAGS_ALL_COMMON) libhawk_la_CFLAGS = $(CFLAGS_ALL_COMMON)
@@ -928,6 +929,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-gem.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-gem.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-hawk.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-hawk.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-htb.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-htb.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-jis0208.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-json.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-json.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-ksc5601.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-ksc5601.Plo@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-mb8.Plo@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libhawk_la-mb8.Plo@am__quote@ # am--include-marker
@@ -1147,13 +1149,6 @@ libhawk_la-hawk.lo: hawk.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(libhawk_la_CFLAGS) $(CFLAGS) -c -o libhawk_la-hawk.lo `test -f 'hawk.c' || echo '$(srcdir)/'`hawk.c @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(libhawk_la_CFLAGS) $(CFLAGS) -c -o libhawk_la-hawk.lo `test -f 'hawk.c' || echo '$(srcdir)/'`hawk.c
libhawk_la-jis0208.lo: jis0208.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(libhawk_la_CFLAGS) $(CFLAGS) -MT libhawk_la-jis0208.lo -MD -MP -MF $(DEPDIR)/libhawk_la-jis0208.Tpo -c -o libhawk_la-jis0208.lo `test -f 'jis0208.c' || echo '$(srcdir)/'`jis0208.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhawk_la-jis0208.Tpo $(DEPDIR)/libhawk_la-jis0208.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='jis0208.c' object='libhawk_la-jis0208.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(libhawk_la_CFLAGS) $(CFLAGS) -c -o libhawk_la-jis0208.lo `test -f 'jis0208.c' || echo '$(srcdir)/'`jis0208.c
libhawk_la-htb.lo: htb.c libhawk_la-htb.lo: htb.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(libhawk_la_CFLAGS) $(CFLAGS) -MT libhawk_la-htb.lo -MD -MP -MF $(DEPDIR)/libhawk_la-htb.Tpo -c -o libhawk_la-htb.lo `test -f 'htb.c' || echo '$(srcdir)/'`htb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(libhawk_la_CFLAGS) $(CFLAGS) -MT libhawk_la-htb.lo -MD -MP -MF $(DEPDIR)/libhawk_la-htb.Tpo -c -o libhawk_la-htb.lo `test -f 'htb.c' || echo '$(srcdir)/'`htb.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhawk_la-htb.Tpo $(DEPDIR)/libhawk_la-htb.Plo @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhawk_la-htb.Tpo $(DEPDIR)/libhawk_la-htb.Plo
@@ -1161,6 +1156,13 @@ libhawk_la-htb.lo: htb.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(libhawk_la_CFLAGS) $(CFLAGS) -c -o libhawk_la-htb.lo `test -f 'htb.c' || echo '$(srcdir)/'`htb.c @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(libhawk_la_CFLAGS) $(CFLAGS) -c -o libhawk_la-htb.lo `test -f 'htb.c' || echo '$(srcdir)/'`htb.c
libhawk_la-jis0208.lo: jis0208.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(libhawk_la_CFLAGS) $(CFLAGS) -MT libhawk_la-jis0208.lo -MD -MP -MF $(DEPDIR)/libhawk_la-jis0208.Tpo -c -o libhawk_la-jis0208.lo `test -f 'jis0208.c' || echo '$(srcdir)/'`jis0208.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhawk_la-jis0208.Tpo $(DEPDIR)/libhawk_la-jis0208.Plo
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='jis0208.c' object='libhawk_la-jis0208.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(libhawk_la_CFLAGS) $(CFLAGS) -c -o libhawk_la-jis0208.lo `test -f 'jis0208.c' || echo '$(srcdir)/'`jis0208.c
libhawk_la-json.lo: json.c libhawk_la-json.lo: json.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(libhawk_la_CFLAGS) $(CFLAGS) -MT libhawk_la-json.lo -MD -MP -MF $(DEPDIR)/libhawk_la-json.Tpo -c -o libhawk_la-json.lo `test -f 'json.c' || echo '$(srcdir)/'`json.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libhawk_la_CPPFLAGS) $(CPPFLAGS) $(libhawk_la_CFLAGS) $(CFLAGS) -MT libhawk_la-json.lo -MD -MP -MF $(DEPDIR)/libhawk_la-json.Tpo -c -o libhawk_la-json.lo `test -f 'json.c' || echo '$(srcdir)/'`json.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhawk_la-json.Tpo $(DEPDIR)/libhawk_la-json.Plo @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libhawk_la-json.Tpo $(DEPDIR)/libhawk_la-json.Plo
@@ -1784,6 +1786,7 @@ distclean: distclean-am
-rm -f ./$(DEPDIR)/libhawk_la-gem.Plo -rm -f ./$(DEPDIR)/libhawk_la-gem.Plo
-rm -f ./$(DEPDIR)/libhawk_la-hawk.Plo -rm -f ./$(DEPDIR)/libhawk_la-hawk.Plo
-rm -f ./$(DEPDIR)/libhawk_la-htb.Plo -rm -f ./$(DEPDIR)/libhawk_la-htb.Plo
-rm -f ./$(DEPDIR)/libhawk_la-jis0208.Plo
-rm -f ./$(DEPDIR)/libhawk_la-json.Plo -rm -f ./$(DEPDIR)/libhawk_la-json.Plo
-rm -f ./$(DEPDIR)/libhawk_la-ksc5601.Plo -rm -f ./$(DEPDIR)/libhawk_la-ksc5601.Plo
-rm -f ./$(DEPDIR)/libhawk_la-mb8.Plo -rm -f ./$(DEPDIR)/libhawk_la-mb8.Plo
@@ -1909,6 +1912,7 @@ maintainer-clean: maintainer-clean-am
-rm -f ./$(DEPDIR)/libhawk_la-gem.Plo -rm -f ./$(DEPDIR)/libhawk_la-gem.Plo
-rm -f ./$(DEPDIR)/libhawk_la-hawk.Plo -rm -f ./$(DEPDIR)/libhawk_la-hawk.Plo
-rm -f ./$(DEPDIR)/libhawk_la-htb.Plo -rm -f ./$(DEPDIR)/libhawk_la-htb.Plo
-rm -f ./$(DEPDIR)/libhawk_la-jis0208.Plo
-rm -f ./$(DEPDIR)/libhawk_la-json.Plo -rm -f ./$(DEPDIR)/libhawk_la-json.Plo
-rm -f ./$(DEPDIR)/libhawk_la-ksc5601.Plo -rm -f ./$(DEPDIR)/libhawk_la-ksc5601.Plo
-rm -f ./$(DEPDIR)/libhawk_la-mb8.Plo -rm -f ./$(DEPDIR)/libhawk_la-mb8.Plo
+146 -20
View File
@@ -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)
# include <windows.h>
# include <tchar.h>
# if defined(HAWK_HAVE_CFG_H) && defined(HAWK_ENABLE_LIBLTDL)
# 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
# include "syscall.h"
# if defined(HAWK_ENABLE_LIBLTDL) # if defined(HAWK_ENABLE_LIBLTDL)
# include <ltdl.h>
# define USE_LTDL # define USE_LTDL
# elif defined(HAVE_DLFCN_H) # elif defined(HAVE_DLFCN_H)
# include <dlfcn.h>
# define USE_DLFCN # define USE_DLFCN
# else # else
# error UNSUPPORTED DYNAMIC LINKER # error UNSUPPORTED DYNAMIC LINKER
# endif # endif
#endif
#if defined(HAVE_CRT_EXTERNS_H) #if defined(_WIN32)
# define SYSTEM_ENVIRON _environ
#elif defined(HAVE_CRT_EXTERNS_H)
# include <crt_externs.h> /* MacOSX/darwin. _NSGetEnviron() */ # include <crt_externs.h> /* MacOSX/darwin. _NSGetEnviron() */
# define SYSTEM_ENVIRON (*(_NSGetEnviron())) # define SYSTEM_ENVIRON (*(_NSGetEnviron()))
#else #else
extern char** environ; extern char** environ;
# define SYSTEM_ENVIRON ::environ # define SYSTEM_ENVIRON environ
#endif #endif
///////////////////////////////// /////////////////////////////////
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); 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)
+16 -16
View File
@@ -255,9 +255,9 @@ static hawk_bch_t* mbs_to_mbuf (hawk_dir_t* dir, const hawk_bch_t* mbs, hawk_bec
} }
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) #if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
static hawk_bch_t* make_mbsdos_path (hawk_dir_t* dir, const hawk_bch_t* mpath) static hawk_bch_t* make_bcstr_path (hawk_dir_t* dir, const hawk_bch_t* mpath)
{ {
if (mpath[0] == '\0') if (mpath[0] == '\0') /* blank */
{ {
if (hawk_becs_cpy(&dir->mbuf, "*.*") == (hawk_oow_t)-1) return HAWK_NULL; if (hawk_becs_cpy(&dir->mbuf, "*.*") == (hawk_oow_t)-1) return HAWK_NULL;
} }
@@ -265,18 +265,18 @@ 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;
} }
@@ -284,9 +284,9 @@ static hawk_uch_t* make_wcsdos_path (hawk_dir_t* dir, const hawk_uch_t* wpath)
{ {
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;
} }
@@ -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,7 +417,7 @@ 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
{ {
@@ -425,7 +425,7 @@ static int reset_to_path (hawk_dir_t* dir, const hawk_ooch_t* path)
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);
} }
+14 -1
View File
@@ -34,8 +34,20 @@
#include <hawk-ecs.h> #include <hawk-ecs.h>
#include <hawk-dir.h> #include <hawk-dir.h>
#include <hawk-glob.h> #include <hawk-glob.h>
#include <hawk-utl.h>
#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" # 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.
* *, ?, [], !, - * *, ?, [], !, -
+14 -1
View File
@@ -34,8 +34,20 @@
#include <hawk-ecs.h> #include <hawk-ecs.h>
#include <hawk-dir.h> #include <hawk-dir.h>
#include <hawk-glob.h> #include <hawk-glob.h>
#include <hawk-utl.h>
#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" # 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.
* *, ?, [], !, - * *, ?, [], !, -
+1 -1
View File
@@ -716,7 +716,7 @@ static int get_ifcfg (hawk_gem_t* gem, int s, hawk_ifcfg_t* cfg, struct ifreq* i
int strfd; int strfd;
hawk_bch_t devname[HAWK_COUNTOF(ifr->ifr_name) + 5 + 1]; hawk_bch_t devname[HAWK_COUNTOF(ifr->ifr_name) + 5 + 1];
hawk_copy_bcstr_unlimited(devname, HAWK_MT("/dev/")); hawk_copy_bcstr_unlimited(devname, HAWK_BT("/dev/"));
hawk_copy_bcstr_unlimited(&devname[5], ifr->ifr_name); hawk_copy_bcstr_unlimited(&devname[5], ifr->ifr_name);
if ((strfd = HAWK_OPEN(devname, O_RDONLY, 0)) >= 0) if ((strfd = HAWK_OPEN(devname, O_RDONLY, 0)) >= 0)
{ {
+17 -9
View File
@@ -120,10 +120,12 @@
# undef HAWK_HAVE_INLINE # undef HAWK_HAVE_INLINE
#endif #endif
#if defined(__has_attribute) && __has_attribute(always_inline) #if defined(__has_attribute)
# if __has_attribute(always_inline)
# define HAWK_INLINE_ALWAYS __inline__ __attribute__((always_inline)) # define HAWK_INLINE_ALWAYS __inline__ __attribute__((always_inline))
# define HAWK_HAVE_INLINE_ALWAYS # define HAWK_HAVE_INLINE_ALWAYS
# endif # endif
#endif
#if !defined(HAWK_HAVE_INLINE_ALWAYS) #if !defined(HAWK_HAVE_INLINE_ALWAYS)
# if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 0)) # if defined(__GNUC__) && (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ > 0))
@@ -508,7 +510,7 @@ typedef unsigned char hawk_bchu_t; /* unsigned version of hawk_bch_t f
#define HAWK_SIZEOF_BCI_T HAWK_SIZEOF_INT #define HAWK_SIZEOF_BCI_T HAWK_SIZEOF_INT
/* You may specify -DHAWK_USE_CXX_CHAR16_T in CXXFLAGS to force char16_t with c++. */ /* You may specify -DHAWK_USE_CXX_CHAR16_T in CXXFLAGS to force char16_t with c++. */
#if (defined(__cplusplus) && (defined(HAWK_USE_CXX_CHAR16_T) || (__cplusplus >= 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1900))) /* user chosen or C++11 or later */ #if defined(__cplusplus) && (defined(HAWK_USE_CXX_CHAR16_T) || (__cplusplus >= 201103L) || (defined(_MSC_VER) && _MSC_VER >= 1900)) /* user chosen or C++11 or later */
# if defined(HAWK_WIDE_CHAR_SIZE) && (HAWK_WIDE_CHAR_SIZE == 4) # if defined(HAWK_WIDE_CHAR_SIZE) && (HAWK_WIDE_CHAR_SIZE == 4)
typedef char32_t hawk_uch_t; /* char32_t is an unsigned integer type used for 32-bit wide characters */ typedef char32_t hawk_uch_t; /* char32_t is an unsigned integer type used for 32-bit wide characters */
typedef char32_t hawk_uchu_t; /* same as hawk_uch_t as it is already unsigned */ typedef char32_t hawk_uchu_t; /* same as hawk_uch_t as it is already unsigned */
@@ -525,8 +527,8 @@ typedef unsigned char hawk_bchu_t; /* unsigned version of hawk_bch_t f
typedef hawk_uint32_t hawk_uchu_t; typedef hawk_uint32_t hawk_uchu_t;
# define HAWK_SIZEOF_UCH_T 4 # define HAWK_SIZEOF_UCH_T 4
// if this assertion becomes false, you must check if the size of the wchar_t type is the same as the size used /* if this assertion becomes false, you must check if the size of the wchar_t type is the same as the size used
// for this library. * for this library. */
HAWK_STATIC_ASSERT (HAWK_WIDE_CHAR_SIZE == sizeof(hawk_uch_t)); HAWK_STATIC_ASSERT (HAWK_WIDE_CHAR_SIZE == sizeof(hawk_uch_t));
#elif defined(__cplusplus) && defined(HAWK_WIDE_CHAR_SIZE) && (HAWK_WIDE_CHAR_SIZE == 2) && (HAWK_WIDE_CHAR_SIZE == HAWK_SIZEOF_WCHAR_T) #elif defined(__cplusplus) && defined(HAWK_WIDE_CHAR_SIZE) && (HAWK_WIDE_CHAR_SIZE == 2) && (HAWK_WIDE_CHAR_SIZE == HAWK_SIZEOF_WCHAR_T)
@@ -534,11 +536,11 @@ typedef unsigned char hawk_bchu_t; /* unsigned version of hawk_bch_t f
typedef hawk_uint16_t hawk_uchu_t; typedef hawk_uint16_t hawk_uchu_t;
# define HAWK_SIZEOF_UCH_T 2 # define HAWK_SIZEOF_UCH_T 2
// if the library is compiled with 2-byte wchar_t, and the library user compiles a program with 4-byte wchar_t, /* if the library is compiled with 2-byte wchar_t, and the library user compiles a program with 4-byte wchar_t,
// there will be size disparity issue on the hawk_uch_t type. * there will be size disparity issue on the hawk_uch_t type.
// if this assertion becomes false, you must check if the size of the wchar_t type is the same as the size used * if this assertion becomes false, you must check if the size of the wchar_t type is the same as the size used
// for this library. * for this library.
// gcc/g++/clang/clang++: -fshort-wchar makes wchar_t to 2 bytes. * gcc/g++/clang/clang++: -fshort-wchar makes wchar_t to 2 bytes. */
HAWK_STATIC_ASSERT (HAWK_WIDE_CHAR_SIZE == sizeof(hawk_uch_t)); HAWK_STATIC_ASSERT (HAWK_WIDE_CHAR_SIZE == sizeof(hawk_uch_t));
#elif defined(HAWK_WIDE_CHAR_SIZE) && (HAWK_WIDE_CHAR_SIZE == 4) && (HAWK_WIDE_CHAR_SIZE == HAWK_SIZEOF_WCHAR_T) && defined(__WCHAR_TYPE__) && defined(HAWK_PREFER_PREFIX_L) #elif defined(HAWK_WIDE_CHAR_SIZE) && (HAWK_WIDE_CHAR_SIZE == 4) && (HAWK_WIDE_CHAR_SIZE == HAWK_SIZEOF_WCHAR_T) && defined(__WCHAR_TYPE__) && defined(HAWK_PREFER_PREFIX_L)
@@ -546,6 +548,12 @@ typedef unsigned char hawk_bchu_t; /* unsigned version of hawk_bch_t f
typedef hawk_uint32_t hawk_uchu_t; typedef hawk_uint32_t hawk_uchu_t;
# define HAWK_SIZEOF_UCH_T 4 # define HAWK_SIZEOF_UCH_T 4
#elif defined(HAWK_WIDE_CHAR_SIZE) && (HAWK_WIDE_CHAR_SIZE == 4) && (HAWK_WIDE_CHAR_SIZE == HAWK_SIZEOF_WCHAR_T) && defined(HAWK_PREFER_PREFIX_L) && defined(_SCO_DS)
/* to handle the picky old sco cc */
typedef long hawk_uch_t;
typedef hawk_uint32_t hawk_uchu_t;
# define HAWK_SIZEOF_UCH_T 4
#elif defined(HAWK_WIDE_CHAR_SIZE) && (HAWK_WIDE_CHAR_SIZE == 4) && defined(__CHAR32_TYPE__) && defined(HAWK_HAVE_PREFIX_BIG_U) #elif defined(HAWK_WIDE_CHAR_SIZE) && (HAWK_WIDE_CHAR_SIZE == 4) && defined(__CHAR32_TYPE__) && defined(HAWK_HAVE_PREFIX_BIG_U)
typedef __CHAR32_TYPE__ hawk_uch_t; typedef __CHAR32_TYPE__ hawk_uch_t;
typedef hawk_uint32_t hawk_uchu_t; typedef hawk_uint32_t hawk_uchu_t;
+9 -2
View File
@@ -250,6 +250,7 @@ struct hawk_htb_t
hawk_oow_t size; hawk_oow_t size;
hawk_oow_t capa; hawk_oow_t capa;
hawk_oow_t threshold; hawk_oow_t threshold;
hawk_oow_t rev;
hawk_htb_pair_t** bucket; hawk_htb_pair_t** bucket;
}; };
@@ -284,13 +285,15 @@ typedef struct hawk_htb_itr_t hawk_htb_itr_t;
/** /**
* The HAWK_HTB_SIZE() macro returns the number of pairs in a hash table. * The HAWK_HTB_SIZE() macro returns the number of pairs in a hash table.
*/ */
#define HAWK_HTB_SIZE(m) (*(const hawk_oow_t*)&(m)->size) #define HAWK_HTB_SIZE(m) ((const hawk_oow_t)(m)->size)
/** /**
* The HAWK_HTB_CAPA() macro returns the maximum number of pairs that can be * The HAWK_HTB_CAPA() macro returns the maximum number of pairs that can be
* stored in a hash table without further reorganization. * stored in a hash table without further reorganization.
*/ */
#define HAWK_HTB_CAPA(m) (*(const hawk_oow_t*)&(m)->capa) #define HAWK_HTB_CAPA(m) ((const hawk_oow_t)(m)->capa)
#define HAWK_HTB_REV(m) ((const hawk_oow_t)(m)->rev)
#define HAWK_HTB_FACTOR(m) (*(const int*)&(m)->factor) #define HAWK_HTB_FACTOR(m) (*(const int*)&(m)->factor)
#define HAWK_HTB_KSCALE(m) (*(const int*)&(m)->scale[HAWK_HTB_KEY]) #define HAWK_HTB_KSCALE(m) (*(const int*)&(m)->scale[HAWK_HTB_KEY])
@@ -406,6 +409,10 @@ HAWK_EXPORT hawk_oow_t hawk_htb_getcapa (
const hawk_htb_t* htb /**< hash table */ const hawk_htb_t* htb /**< hash table */
); );
HAWK_EXPORT hawk_oow_t hawk_htb_getrev (
const hawk_htb_t* htb /**< hash table */
);
/** /**
* The hawk_htb_search() function searches a hash table to find a pair with a * The hawk_htb_search() function searches a hash table to find a pair with a
* matching key. It returns the pointer to the pair found. If it fails * matching key. It returns the pointer to the pair found. If it fails
+4
View File
@@ -45,6 +45,7 @@
# define hawk_map_getxtn(map) hawk_htb_getxtn(map) # define hawk_map_getxtn(map) hawk_htb_getxtn(map)
# define hawk_map_getsize(map) hawk_htb_getsize(map) # define hawk_map_getsize(map) hawk_htb_getsize(map)
# define hawk_map_getcapa(map) hawk_htb_getcapa(map) # define hawk_map_getcapa(map) hawk_htb_getcapa(map)
# define hawk_map_getrev(map) hawk_htb_getrev(map)
# define hawk_map_getstyle(map) hawk_htb_getstyle(map) # define hawk_map_getstyle(map) hawk_htb_getstyle(map)
# define hawk_map_setstyle(map,cbs) hawk_htb_setstyle(map,cbs) # define hawk_map_setstyle(map,cbs) hawk_htb_setstyle(map,cbs)
# define hawk_map_search(map,kptr,klen) hawk_htb_search(map,kptr,klen) # define hawk_map_search(map,kptr,klen) hawk_htb_search(map,kptr,klen)
@@ -80,6 +81,7 @@
# define HAWK_MAP_SIZER_DEFAULT HAWK_HTB_SIZER_DEFAULT # define HAWK_MAP_SIZER_DEFAULT HAWK_HTB_SIZER_DEFAULT
# define HAWK_MAP_HASHER_DEFAULT HAWK_HTB_HASHER_DEFAULT # define HAWK_MAP_HASHER_DEFAULT HAWK_HTB_HASHER_DEFAULT
# define HAWK_MAP_SIZE(map) HAWK_HTB_SIZE(map) # define HAWK_MAP_SIZE(map) HAWK_HTB_SIZE(map)
# define HAWK_MAP_REV(map) HAWK_HTB_REV(map)
# define HAWK_MAP_KCOPIER(map) HAWK_HTB_KCOPIER(map) # define HAWK_MAP_KCOPIER(map) HAWK_HTB_KCOPIER(map)
# define HAWK_MAP_VCOPIER(map) HAWK_HTB_VCOPIER(map) # define HAWK_MAP_VCOPIER(map) HAWK_HTB_VCOPIER(map)
# define HAWK_MAP_KFREEER(map) HAWK_HTB_KFREEER(map) # define HAWK_MAP_KFREEER(map) HAWK_HTB_KFREEER(map)
@@ -108,6 +110,7 @@
# define hawk_map_getxtn(map) hawk_rbt_getxtn(map) # define hawk_map_getxtn(map) hawk_rbt_getxtn(map)
# define hawk_map_getsize(map) hawk_rbt_getsize(map) # define hawk_map_getsize(map) hawk_rbt_getsize(map)
# define hawk_map_getcapa(map) hawk_rbt_getsize(map) # define hawk_map_getcapa(map) hawk_rbt_getsize(map)
# define hawk_map_getrev(map) hawk_rbt_getrev(map)
# define hawk_map_getstyle(map) hawk_rbt_getstyle(map) # define hawk_map_getstyle(map) hawk_rbt_getstyle(map)
# define hawk_map_setstyle(map,cbs) hawk_rbt_setstyle(map,cbs) # define hawk_map_setstyle(map,cbs) hawk_rbt_setstyle(map,cbs)
# define hawk_map_search(map,kptr,klen) hawk_rbt_search(map,kptr,klen) # define hawk_map_search(map,kptr,klen) hawk_rbt_search(map,kptr,klen)
@@ -143,6 +146,7 @@
# define HAWK_MAP_SIZER_DEFAULT (HAWK_NULL) # define HAWK_MAP_SIZER_DEFAULT (HAWK_NULL)
# define HAWK_MAP_HASHER_DEFAULT (HAWK_NULL) # define HAWK_MAP_HASHER_DEFAULT (HAWK_NULL)
# define HAWK_MAP_SIZE(map) HAWK_RBT_SIZE(map) # define HAWK_MAP_SIZE(map) HAWK_RBT_SIZE(map)
# define HAWK_MAP_REV(map) HAWK_RBT_REV(map)
# define HAWK_MAP_KCOPIER(map) HAWK_RBT_KCOPIER(map) # define HAWK_MAP_KCOPIER(map) HAWK_RBT_KCOPIER(map)
# define HAWK_MAP_VCOPIER(map) HAWK_RBT_VCOPIER(map) # define HAWK_MAP_VCOPIER(map) HAWK_RBT_VCOPIER(map)
# define HAWK_MAP_KFREEER(map) HAWK_RBT_KFREEER(map) # define HAWK_MAP_KFREEER(map) HAWK_RBT_KFREEER(map)
+21 -8
View File
@@ -120,6 +120,19 @@ enum hawk_pio_hid_t
}; };
typedef enum hawk_pio_hid_t hawk_pio_hid_t; typedef enum hawk_pio_hid_t hawk_pio_hid_t;
enum hawk_pio_env_mk_type_t
{
HAWK_PIO_ENV_MK_BPP, /* P1 ... PN HAWK_NUL where P1 .. PN points to K=V */
HAWK_PIO_ENV_MK_BPN, /* K1=V\0K2=V\0\0 */
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 void* (*hawk_pio_env_mk_t) (
hawk_pio_env_mk_type_t type,
void* ctx
);
typedef int (*hawk_pio_fncptr_t) (void* ctx); typedef int (*hawk_pio_fncptr_t) (void* ctx);
@@ -170,7 +183,6 @@ struct hawk_pio_pin_t
hawk_pio_t* self; hawk_pio_t* self;
}; };
/** /**
* The hawk_pio_t type defines a structure to store status for piped I/O * The hawk_pio_t type defines a structure to store status for piped I/O
* to a child process. The hawk_pio_xxx() funtions are written around this * to a child process. The hawk_pio_xxx() funtions are written around this
@@ -198,18 +210,17 @@ extern "C" {
* pipes to it. #HAWK_PIO_SHELL causes the function to execute \a cmd via * pipes to it. #HAWK_PIO_SHELL causes the function to execute \a cmd via
* the default shell of an underlying system: /bin/sh on *nix, cmd.exe on win32. * the default shell of an underlying system: /bin/sh on *nix, cmd.exe on win32.
* On *nix systems, a full path to the command is needed if it is not specified. * On *nix systems, a full path to the command is needed if it is not specified.
* If \a env is #HAWK_NULL, the environment of \a cmd inherits that of the * If #HAWK_PIO_BCSTRCMD is specified in \a flags, \a cmd is treated as a
* calling process. If you want to pass an empty environment, you can pass * multi-byte string whose character type is #hawk_bch_t.
* an empty \a env object with no items inserted. If #HAWK_PIO_BCSTRCMD is
* specified in \a flags, \a cmd is treated as a multi-byte string whose
* character type is #hawk_bch_t.
* \return #hawk_pio_t object on success, #HAWK_NULL on failure * \return #hawk_pio_t object on success, #HAWK_NULL on failure
*/ */
HAWK_EXPORT hawk_pio_t* hawk_pio_open ( HAWK_EXPORT hawk_pio_t* hawk_pio_open (
hawk_gem_t* gem, /**< gem */ hawk_gem_t* gem, /**< gem */
hawk_oow_t ext, /**< extension size */ hawk_oow_t ext, /**< extension size */
const hawk_ooch_t* cmd, /**< command to execute */ const hawk_ooch_t* cmd, /**< command to execute */
int flags /**< 0 or a number OR'ed of the #hawk_pio_flag_t enumerators*/ int flags, /**< 0 or a number OR'ed of the #hawk_pio_flag_t enumerators*/
hawk_pio_env_mk_t env_mk,
void* env_cx
); );
/** /**
@@ -230,7 +241,9 @@ HAWK_EXPORT int hawk_pio_init (
hawk_pio_t* pio, /**< pio object */ hawk_pio_t* pio, /**< pio object */
hawk_gem_t* gem, /**< gem */ hawk_gem_t* gem, /**< gem */
const hawk_ooch_t* cmd, /**< command to execute */ const hawk_ooch_t* cmd, /**< command to execute */
int flags /**< 0 or a number OR'ed of the #hawk_pio_flag_t enumerators*/ int flags, /**< 0 or a number OR'ed of the #hawk_pio_flag_t enumerators*/
hawk_pio_env_mk_t env_mk,
void* env_cx
); );
/** /**
+9 -1
View File
@@ -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;
@@ -634,6 +636,7 @@ struct hawk_rtx_t
hawk_ooch_t errmsg_backup[HAWK_ERRMSG_CAPA]; hawk_ooch_t errmsg_backup[HAWK_ERRMSG_CAPA];
hawk_rtx_ecb_t* ecb; hawk_rtx_ecb_t* ecb;
hawk_oow_t ecb_stmt_count; hawk_oow_t ecb_stmt_count;
hawk_oow_t ecb_gblset_count;
hawk_rbt_t* modtab; /* rtx-specifi module table in addition to hawk->modtab */ hawk_rbt_t* modtab; /* rtx-specifi module table in addition to hawk->modtab */
}; };
@@ -711,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
@@ -722,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
+2
View File
@@ -254,6 +254,7 @@ struct hawk_rbt_t
hawk_rbt_pair_t xnil; /**< internal nil node */ hawk_rbt_pair_t xnil; /**< internal nil node */
hawk_oow_t size; /**< number of pairs */ hawk_oow_t size; /**< number of pairs */
hawk_rbt_pair_t* root; /**< root pair */ hawk_rbt_pair_t* root; /**< root pair */
hawk_oow_t rev; /**< revision */
#if defined(HAWK_ENABLE_RBT_ITR_PROTECTION) #if defined(HAWK_ENABLE_RBT_ITR_PROTECTION)
hawk_rbt_itr_t _prot_itr; /**< protected iterators */ hawk_rbt_itr_t _prot_itr; /**< protected iterators */
#endif #endif
@@ -280,6 +281,7 @@ struct hawk_rbt_t
* The HAWK_RBT_SIZE() macro returns the number of pairs in red-black tree. * The HAWK_RBT_SIZE() macro returns the number of pairs in red-black tree.
*/ */
#define HAWK_RBT_SIZE(m) ((const hawk_oow_t)(m)->size) #define HAWK_RBT_SIZE(m) ((const hawk_oow_t)(m)->size)
#define HAWK_RBT_REV(m) ((const hawk_oow_t)(m)->rev)
#define HAWK_RBT_KSCALE(m) ((const int)(m)->scale[HAWK_RBT_KEY]) #define HAWK_RBT_KSCALE(m) ((const int)(m)->scale[HAWK_RBT_KEY])
#define HAWK_RBT_VSCALE(m) ((const int)(m)->scale[HAWK_RBT_VAL]) #define HAWK_RBT_VSCALE(m) ((const int)(m)->scale[HAWK_RBT_VAL])
+17
View File
@@ -103,6 +103,23 @@ struct HAWK_PACKED hawk_ip6ad_t
typedef struct hawk_ip6ad_t hawk_ip6ad_t; typedef struct hawk_ip6ad_t hawk_ip6ad_t;
#include <hawk-upac.h> #include <hawk-upac.h>
#if defined(HAWK_SIZEOF_SOCKLEN_T) && (HAWK_SIZEOF_SOCKLEN_T == HAWK_SIZEOF_INT)
# if defined(HAWK_SOCKLEN_T_IS_SIGNED)
typedef int hawk_sklen_t;
# else
typedef unsigned int hawk_sklen_t;
# endif
#elif defined(HAWK_SIZEOF_SOCKLEN_T) && (HAWK_SIZEOF_SOCKLEN_T == HAWK_SIZEOF_LONG)
# if defined(HAWK_SOCKLEN_T_IS_SIGNED)
typedef long hawk_sklen_t;
# else
typedef unsigned long hawk_sklen_t;
# endif
#else
typedef int hawk_sklen_t;
#endif
#if defined(__cplusplus) #if defined(__cplusplus)
extern "C" { extern "C" {
#endif #endif
-2
View File
@@ -72,10 +72,8 @@ enum hawk_fnmat_flag_t
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) #if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
/* i don't support escaping in these systems */ /* i don't support escaping in these systems */
# define HAWK_FNMAT_IS_ESC(c) (0) # define HAWK_FNMAT_IS_ESC(c) (0)
# define HAWK_FNMAT_IS_SEP(c) ((c) == '/' || (c) == '\\')
#else #else
# define HAWK_FNMAT_IS_ESC(c) ((c) == '\\') # define HAWK_FNMAT_IS_ESC(c) ((c) == '\\')
# define HAWK_FNMAT_IS_SEP(c) ((c) == '/')
#endif #endif
#if defined(__cplusplus) #if defined(__cplusplus)
-2
View File
@@ -72,10 +72,8 @@ enum hawk_fnmat_flag_t
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__) #if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
/* i don't support escaping in these systems */ /* i don't support escaping in these systems */
# define HAWK_FNMAT_IS_ESC(c) (0) # define HAWK_FNMAT_IS_ESC(c) (0)
# define HAWK_FNMAT_IS_SEP(c) ((c) == '/' || (c) == '\\')
#else #else
# define HAWK_FNMAT_IS_ESC(c) ((c) == '\\') # define HAWK_FNMAT_IS_ESC(c) ((c) == '\\')
# define HAWK_FNMAT_IS_SEP(c) ((c) == '/')
#endif #endif
#if defined(__cplusplus) #if defined(__cplusplus)
+17
View File
@@ -320,6 +320,23 @@ typedef hawk_bch_t* (*hawk_subst_for_bcs_t) (
# define hawk_subst_for_oocs_t hawk_subst_for_bcs_t # define hawk_subst_for_oocs_t hawk_subst_for_bcs_t
#endif #endif
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
# define HAWK_IS_PATH_SEP(c) ((c) == '/' || (c) == '\\')
#else
# define HAWK_IS_PATH_SEP(c) ((c) == '/')
#endif
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
/* check if the first two letter is a drive specifier.
* useful on DOS/WIN/OS2 like system */
#define HAWK_IS_PATH_DRIVE(s) \
(((s[0] >= 'A' && s[0] <= 'Z') || \
(s[0] >= 'a' && s[0] <= 'z')) && \
s[1] == ':')
#endif
#if defined(__cplusplus) #if defined(__cplusplus)
extern "C" { extern "C" {
#endif #endif
+25 -3
View File
@@ -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>
@@ -532,7 +533,8 @@ struct hawk_fun_t
hawk_oow_t nargs; hawk_oow_t nargs;
hawk_ooch_t* argspec; /* similar to the argument spec of hawk_fnc_arg_t. supports v & r only. neither R nor x is set internally. */ hawk_ooch_t* argspec; /* similar to the argument spec of hawk_fnc_arg_t. supports v & r only. neither R nor x is set internally. */
hawk_oow_t argspeclen; /* the length of argspec. it can be different from nargs if there are call-by-value parameters after the last call-by-reference parameter or variadic arguments are supported */ hawk_oow_t argspeclen; /* the length of argspec. it can be different from nargs if there are call-by-value parameters after the last call-by-reference parameter or variadic arguments are supported */
int variadic; hawk_uint32_t variadic: 1;
hawk_uint32_t hasrefarg: 1;
hawk_nde_t* body; hawk_nde_t* body;
}; };
typedef struct hawk_fun_t hawk_fun_t; typedef struct hawk_fun_t hawk_fun_t;
@@ -905,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
@@ -914,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;
@@ -1709,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)
@@ -1790,7 +1812,7 @@ static HAWK_INLINE hawk_cmgr_t* hawk_getcmgr (hawk_t* hawk) { return ((hawk_alt_
static HAWK_INLINE void hawk_setcmgr (hawk_t* hawk, hawk_cmgr_t* cmgr) { ((hawk_alt_t*)hawk)->gem_.cmgr = cmgr; } static HAWK_INLINE void hawk_setcmgr (hawk_t* hawk, hawk_cmgr_t* cmgr) { ((hawk_alt_t*)hawk)->gem_.cmgr = cmgr; }
#else #else
#define hawk_getxtn(hawk) ((void*)((hawk_uint8_t*)hawk + ((hawk_alt_t*)hawk)->instsize_)) #define hawk_getxtn(hawk) ((void*)((hawk_uint8_t*)hawk + ((hawk_alt_t*)hawk)->instsize_))
#define hawk_getgem(hawk) (&((hawk_alt_t*)(hawk))->_gem) #define hawk_getgem(hawk) (&((hawk_alt_t*)(hawk))->gem_)
#define hawk_getmmgr(hawk) (((hawk_alt_t*)(hawk))->gem_.mmgr) #define hawk_getmmgr(hawk) (((hawk_alt_t*)(hawk))->gem_.mmgr)
#define hawk_getcmgr(hawk) (((hawk_alt_t*)(hawk))->gem_.cmgr) #define hawk_getcmgr(hawk) (((hawk_alt_t*)(hawk))->gem_.cmgr)
#define hawk_setcmgr(hawk,_cmgr) (((hawk_alt_t*)(hawk))->gem_.cmgr = (_cmgr)) #define hawk_setcmgr(hawk,_cmgr) (((hawk_alt_t*)(hawk))->gem_.cmgr = (_cmgr))
@@ -2602,7 +2624,7 @@ static HAWK_INLINE void hawk_rtx_setcmgr (hawk_rtx_t* rtx, hawk_cmgr_t* cmgr) {
#else #else
#define hawk_rtx_gethawk(rtx) (((hawk_rtx_alt_t*)(rtx))->hawk) #define hawk_rtx_gethawk(rtx) (((hawk_rtx_alt_t*)(rtx))->hawk)
#define hawk_rtx_getxtn(rtx) ((void*)((hawk_uint8_t*)rtx + ((hawk_rtx_alt_t*)rtx)->instsize_)) #define hawk_rtx_getxtn(rtx) ((void*)((hawk_uint8_t*)rtx + ((hawk_rtx_alt_t*)rtx)->instsize_))
#define hawk_rtx_getgem(rtx) (&((hawk_rtx_alt_t*)(rtx))->_gem) #define hawk_rtx_getgem(rtx) (&((hawk_rtx_alt_t*)(rtx))->gem_)
#define hawk_rtx_getmmgr(rtx) (((hawk_rtx_alt_t*)(rtx))->gem_.mmgr) #define hawk_rtx_getmmgr(rtx) (((hawk_rtx_alt_t*)(rtx))->gem_.mmgr)
#define hawk_rtx_getcmgr(rtx) (((hawk_rtx_alt_t*)(rtx))->gem_.cmgr) #define hawk_rtx_getcmgr(rtx) (((hawk_rtx_alt_t*)(rtx))->gem_.cmgr)
#define hawk_rtx_setcmgr(rtx,_cmgr) (((hawk_rtx_alt_t*)(rtx))->gem_.cmgr = (_cmgr)) #define hawk_rtx_setcmgr(rtx,_cmgr) (((hawk_rtx_alt_t*)(rtx))->gem_.cmgr = (_cmgr))
+38 -14
View File
@@ -46,7 +46,7 @@
#define KTOB(htb,len) ((len) * (htb)->scale[HAWK_HTB_KEY]) #define KTOB(htb,len) ((len) * (htb)->scale[HAWK_HTB_KEY])
#define VTOB(htb,len) ((len) * (htb)->scale[HAWK_HTB_VAL]) #define VTOB(htb,len) ((len) * (htb)->scale[HAWK_HTB_VAL])
HAWK_INLINE pair_t* hawk_htb_allocpair (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen) static HAWK_INLINE_ALWAYS pair_t* alloc_pair (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen)
{ {
pair_t* n; pair_t* n;
copier_t kcop, vcop; copier_t kcop, vcop;
@@ -115,7 +115,7 @@ HAWK_INLINE pair_t* hawk_htb_allocpair (hawk_htb_t* htb, void* kptr, hawk_oow_t
return n; return n;
} }
HAWK_INLINE void hawk_htb_freepair (hawk_htb_t* htb, pair_t* pair) static HAWK_INLINE_ALWAYS void free_pair (hawk_htb_t* htb, pair_t* pair)
{ {
if (htb->style->freeer[HAWK_HTB_KEY] != HAWK_NULL) if (htb->style->freeer[HAWK_HTB_KEY] != HAWK_NULL)
htb->style->freeer[HAWK_HTB_KEY](htb, KPTR(pair), KLEN(pair)); htb->style->freeer[HAWK_HTB_KEY](htb, KPTR(pair), KLEN(pair));
@@ -124,7 +124,17 @@ HAWK_INLINE void hawk_htb_freepair (hawk_htb_t* htb, pair_t* pair)
hawk_gem_freemem(htb->gem, pair); hawk_gem_freemem(htb->gem, pair);
} }
static HAWK_INLINE pair_t* change_pair_val (hawk_htb_t* htb, pair_t* pair, void* vptr, hawk_oow_t vlen) pair_t* hawk_htb_allocpair (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen)
{
return alloc_pair(htb, kptr, klen, vptr, vlen);
}
void hawk_htb_freepair (hawk_htb_t* htb, pair_t* pair)
{
free_pair(htb, pair);
}
static HAWK_INLINE_ALWAYS pair_t* change_pair_val (hawk_htb_t* htb, pair_t* pair, void* vptr, hawk_oow_t vlen)
{ {
if (VPTR(pair) == vptr && VLEN(pair) == vlen) if (VPTR(pair) == vptr && VLEN(pair) == vlen)
{ {
@@ -157,9 +167,9 @@ static HAWK_INLINE pair_t* change_pair_val (hawk_htb_t* htb, pair_t* pair, void*
else else
{ {
/* need to reconstruct the pair */ /* need to reconstruct the pair */
pair_t* p = hawk_htb_allocpair(htb, KPTR(pair), KLEN(pair), vptr, vlen); pair_t* p = alloc_pair(htb, KPTR(pair), KLEN(pair), vptr, vlen);
if (HAWK_UNLIKELY(!p)) return HAWK_NULL; if (HAWK_UNLIKELY(!p)) return HAWK_NULL;
hawk_htb_freepair(htb, pair); free_pair(htb, pair);
return p; return p;
} }
} }
@@ -311,6 +321,7 @@ int hawk_htb_init (hawk_htb_t* htb, hawk_gem_t* gem, hawk_oow_t capa, int factor
htb->capa = capa; htb->capa = capa;
htb->threshold = htb->capa * htb->factor / 100; htb->threshold = htb->capa * htb->factor / 100;
if (htb->capa > 0 && htb->threshold <= 0) htb->threshold = 1; if (htb->capa > 0 && htb->threshold <= 0) htb->threshold = 1;
htb->rev = 0;
htb->style = &style[0]; htb->style = &style[0];
return 0; return 0;
@@ -343,6 +354,11 @@ hawk_oow_t hawk_htb_getcapa (const hawk_htb_t* htb)
return htb->capa; return htb->capa;
} }
hawk_oow_t hawk_htb_getrev (const hawk_htb_t* htb)
{
return htb->rev;
}
pair_t* hawk_htb_search (const hawk_htb_t* htb, const void* kptr, hawk_oow_t klen) pair_t* hawk_htb_search (const hawk_htb_t* htb, const void* kptr, hawk_oow_t klen)
{ {
pair_t* pair; pair_t* pair;
@@ -430,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;
@@ -451,7 +467,7 @@ static HAWK_INLINE pair_t* insert (hawk_htb_t* htb, void* kptr, hawk_oow_t klen,
case UPSERT: case UPSERT:
case UPDATE: case UPDATE:
p = change_pair_val(htb, pair, vptr, vlen); p = change_pair_val(htb, pair, vptr, vlen);
if (p == HAWK_NULL) if (!p)
{ {
/* error in changing the value */ /* error in changing the value */
return HAWK_NULL; return HAWK_NULL;
@@ -465,6 +481,7 @@ static HAWK_INLINE pair_t* insert (hawk_htb_t* htb, void* kptr, hawk_oow_t klen,
else NEXT(prev) = p; else NEXT(prev) = p;
NEXT(p) = next; NEXT(p) = next;
} }
htb->rev++;
return p; return p;
case ENSERT: case ENSERT:
@@ -500,13 +517,14 @@ 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];
htb->bucket[hc] = pair; htb->bucket[hc] = pair;
htb->size++; htb->size++;
htb->rev++;
return pair; /* new key added */ return pair; /* new key added */
} }
@@ -525,7 +543,6 @@ pair_t* hawk_htb_insert (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, void* vpt
return insert(htb, kptr, klen, vptr, vlen, INSERT); return insert(htb, kptr, klen, vptr, vlen, INSERT);
} }
pair_t* hawk_htb_update (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen) pair_t* hawk_htb_update (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen)
{ {
return insert(htb, kptr, klen, vptr, vlen, UPDATE); return insert(htb, kptr, klen, vptr, vlen, UPDATE);
@@ -548,7 +565,7 @@ pair_t* hawk_htb_cbsert (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, cbserter_
{ {
/* found a pair with a matching key */ /* found a pair with a matching key */
p = cbserter(htb, pair, kptr, klen, ctx); p = cbserter(htb, pair, kptr, klen, ctx);
if (p == HAWK_NULL) if (!p)
{ {
/* error returned by the callback function */ /* error returned by the callback function */
return HAWK_NULL; return HAWK_NULL;
@@ -562,6 +579,7 @@ pair_t* hawk_htb_cbsert (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, cbserter_
else NEXT(prev) = p; else NEXT(prev) = p;
NEXT(p) = next; NEXT(p) = next;
} }
htb->rev++;
return p; return p;
} }
@@ -587,6 +605,7 @@ pair_t* hawk_htb_cbsert (hawk_htb_t* htb, void* kptr, hawk_oow_t klen, cbserter_
NEXT(pair) = htb->bucket[hc]; NEXT(pair) = htb->bucket[hc];
htb->bucket[hc] = pair; htb->bucket[hc] = pair;
htb->size++; htb->size++;
htb->rev++;
return pair; /* new key added */ return pair; /* new key added */
} }
@@ -608,8 +627,9 @@ 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++;
return 0; return 0;
} }
@@ -624,23 +644,27 @@ int hawk_htb_delete (hawk_htb_t* htb, const void* kptr, hawk_oow_t klen)
void hawk_htb_clear (hawk_htb_t* htb) void hawk_htb_clear (hawk_htb_t* htb)
{ {
hawk_oow_t i; hawk_oow_t i, sz;
pair_t* pair, * next; pair_t* pair, * next;
sz = htb->size;
for (i = 0; i < htb->capa; i++) for (i = 0; i < htb->capa; i++)
{ {
pair = htb->bucket[i]; pair = htb->bucket[i];
while (pair != HAWK_NULL) 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;
} }
htb->bucket[i] = HAWK_NULL; htb->bucket[i] = HAWK_NULL;
} }
HAWK_ASSERT(htb->size == 0);
if (sz) htb->rev++;
} }
void hawk_htb_walk (hawk_htb_t* htb, walker_t walker, void* ctx) void hawk_htb_walk (hawk_htb_t* htb, walker_t walker, void* ctx)
+530 -138
View File
File diff suppressed because it is too large Load Diff
+7 -10
View File
@@ -25,8 +25,6 @@
#include <hawk-mtx.h> #include <hawk-mtx.h>
#include "hawk-prv.h" #include "hawk-prv.h"
#if (!defined(__unix__) && !defined(__unix)) || defined(HAVE_PTHREAD)
#if defined(_WIN32) #if defined(_WIN32)
# include <windows.h> # include <windows.h>
# include <process.h> # include <process.h>
@@ -40,7 +38,7 @@
#elif defined(__DOS__) #elif defined(__DOS__)
/* implement this */ /* implement this */
#else #elif defined(HAVE_PTHREAD)
# if !defined(_GNU_SOURCE) # if !defined(_GNU_SOURCE)
# define _GNU_SOURCE # define _GNU_SOURCE
# endif # endif
@@ -113,7 +111,8 @@ int hawk_mtx_init (hawk_mtx_t* mtx, hawk_gem_t* gem, int flags)
#elif defined(__DOS__) #elif defined(__DOS__)
/* nothing to implement */ /* nothing to implement */
#else
#elif defined(HAVE_PTHREAD)
#if (HAWK_SIZEOF_PTHREAD_MUTEX_T <= 0) #if (HAWK_SIZEOF_PTHREAD_MUTEX_T <= 0)
/* nothing to initialize as there is no actual mutex support */ /* nothing to initialize as there is no actual mutex support */
@@ -153,7 +152,7 @@ void hawk_mtx_fini (hawk_mtx_t* mtx)
#elif defined(__DOS__) #elif defined(__DOS__)
/* nothing to destroy as there is no mutex support */ /* nothing to destroy as there is no mutex support */
#else #elif defined(HAVE_PTHREAD)
#if (HAWK_SIZEOF_PTHREAD_MUTEX_T <= 0) #if (HAWK_SIZEOF_PTHREAD_MUTEX_T <= 0)
/* nothing to destroy as there is no actual mutex support */ /* nothing to destroy as there is no actual mutex support */
#else #else
@@ -293,7 +292,7 @@ int hawk_mtx_lock (hawk_mtx_t* mtx, const hawk_ntime_t* waiting_time)
/* nothing to do */ /* nothing to do */
#else #elif defined(HAVE_PTHREAD)
#if (HAWK_SIZEOF_PTHREAD_MUTEX_T <= 0) #if (HAWK_SIZEOF_PTHREAD_MUTEX_T <= 0)
/* nothing to do as there is no actual mutex support */ /* nothing to do as there is no actual mutex support */
#else #else
@@ -390,7 +389,7 @@ int hawk_mtx_unlock (hawk_mtx_t* mtx)
/* nothing to do */ /* nothing to do */
#else #elif defined(HAVE_PTHREAD)
#if (HAWK_SIZEOF_PTHREAD_MUTEX_T <= 0) #if (HAWK_SIZEOF_PTHREAD_MUTEX_T <= 0)
/* nothing to do as there is no actual mutex support */ /* nothing to do as there is no actual mutex support */
#else #else
@@ -486,7 +485,7 @@ int hawk_mtx_trylock (hawk_mtx_t* mtx)
#elif defined(__DOS__) #elif defined(__DOS__)
/* nothing to do */ /* nothing to do */
#else #elif defined(HAVE_PTHREAD)
#if (HAWK_SIZEOF_PTHREAD_MUTEX_T <= 0) #if (HAWK_SIZEOF_PTHREAD_MUTEX_T <= 0)
/* nothing to do as there is no actual mutex support */ /* nothing to do as there is no actual mutex support */
@@ -517,5 +516,3 @@ int hawk_mtx_trylock (hawk_mtx_t* mtx)
#endif #endif
return 0; return 0;
} }
#endif
+3
View File
@@ -1675,6 +1675,7 @@ static hawk_nde_t* parse_function (hawk_t* hawk, int named)
hawk_oow_t argspeclen = 0; hawk_oow_t argspeclen = 0;
hawk_oow_t nargs, g; hawk_oow_t nargs, g;
int variadic = 0; int variadic = 0;
int has_ref_arg = 0;
hawk_htb_pair_t* pair; hawk_htb_pair_t* pair;
hawk_loc_t xloc; hawk_loc_t xloc;
int rederr; int rederr;
@@ -1810,6 +1811,7 @@ static hawk_nde_t* parse_function (hawk_t* hawk, int named)
} }
argspec[nargs] = 'r'; argspec[nargs] = 'r';
if (get_token(hawk) <= -1) goto oops; if (get_token(hawk) <= -1) goto oops;
has_ref_arg = 1;
} }
if (!MATCH(hawk,TOK_IDENT)) if (!MATCH(hawk,TOK_IDENT))
@@ -1956,6 +1958,7 @@ static hawk_nde_t* parse_function (hawk_t* hawk, int named)
fun->name.len = 0; fun->name.len = 0;
fun->nargs = nargs; fun->nargs = nargs;
fun->variadic = variadic; fun->variadic = variadic;
fun->hasrefarg = has_ref_arg;
fun->argspec = argspec; fun->argspec = argspec;
fun->argspeclen = argspeclen; fun->argspeclen = argspeclen;
fun->body = (hawk_nde_t*)body; fun->body = (hawk_nde_t*)body;
+58 -56
View File
@@ -191,14 +191,14 @@ static int close_open_fds_using_proc (hawk_pio_t* pio, int* excepts, hawk_oow_t
} }
#endif #endif
hawk_pio_t* hawk_pio_open (hawk_gem_t* gem, hawk_oow_t xtnsize, const hawk_ooch_t* cmd, int flags) hawk_pio_t* hawk_pio_open (hawk_gem_t* gem, hawk_oow_t xtnsize, const hawk_ooch_t* cmd, int flags, hawk_pio_env_mk_t env_mk, void* env_ctx)
{ {
hawk_pio_t* pio; hawk_pio_t* pio;
pio = (hawk_pio_t*)hawk_gem_allocmem(gem, HAWK_SIZEOF(hawk_pio_t) + xtnsize); pio = (hawk_pio_t*)hawk_gem_allocmem(gem, HAWK_SIZEOF(hawk_pio_t) + xtnsize);
if (pio) if (pio)
{ {
if (hawk_pio_init(pio, gem, cmd, flags) <= -1) if (hawk_pio_init(pio, gem, cmd, flags, env_mk, env_ctx) <= -1)
{ {
hawk_gem_freemem(gem, pio); hawk_gem_freemem(gem, pio);
pio = HAWK_NULL; pio = HAWK_NULL;
@@ -458,16 +458,10 @@ static HAWK_INLINE int is_fd_valid_and_nocloexec (int fd)
return !(flags & FD_CLOEXEC)? 1: 0; return !(flags & FD_CLOEXEC)? 1: 0;
} }
static hawk_pio_pid_t standard_fork_and_exec (hawk_pio_t* pio, int pipes[], param_t* param) static hawk_pio_pid_t standard_fork_and_exec (hawk_pio_t* pio, int pipes[], param_t* param, char*const* envp)
{ {
hawk_pio_pid_t pid; hawk_pio_pid_t pid;
#if defined(HAVE_CRT_EXTERNS_H)
# define environ (*(_NSGetEnviron()))
#else
extern char** environ;
#endif
pid = HAWK_FORK(); pid = HAWK_FORK();
if (pid <= -1) if (pid <= -1)
{ {
@@ -574,7 +568,6 @@ static hawk_pio_pid_t standard_fork_and_exec (hawk_pio_t* pio, int pipes[], para
if (pio->flags & HAWK_PIO_DROPOUT) HAWK_CLOSE(1); if (pio->flags & HAWK_PIO_DROPOUT) HAWK_CLOSE(1);
if (pio->flags & HAWK_PIO_DROPERR) HAWK_CLOSE(2); if (pio->flags & HAWK_PIO_DROPERR) HAWK_CLOSE(2);
if (pio->flags & HAWK_PIO_FNCCMD) if (pio->flags & HAWK_PIO_FNCCMD)
{ {
/* ----------------------------------------------- /* -----------------------------------------------
@@ -583,13 +576,16 @@ static hawk_pio_pid_t standard_fork_and_exec (hawk_pio_t* pio, int pipes[], para
hawk_pio_fnc_t* fnc = (hawk_pio_fnc_t*)param; hawk_pio_fnc_t* fnc = (hawk_pio_fnc_t*)param;
int retx; int retx;
/* when the function pointer is a worker function,
* the function must use the context(fnc->ctx) passed
* in as a paramter to find out actual environmen values (e.g. ENVIRON) */
retx = fnc->ptr(fnc->ctx); retx = fnc->ptr(fnc->ctx);
if (devnull >= 0) HAWK_CLOSE(devnull); if (devnull >= 0) HAWK_CLOSE(devnull);
HAWK_EXIT(retx); HAWK_EXIT(retx);
} }
else else
{ {
HAWK_EXECVE (param->argv[0], param->argv, environ); HAWK_EXECVE(param->argv[0], param->argv, envp);
/* if exec fails, free 'param' parameter which is an inherited pointer */ /* if exec fails, free 'param' parameter which is an inherited pointer */
free_param(pio, param); free_param(pio, param);
@@ -619,7 +615,7 @@ static int set_pipe_nonblock (hawk_pio_t* pio, hawk_pio_hnd_t fd, int enabled)
} }
int hawk_pio_init (hawk_pio_t* pio, hawk_gem_t* gem, const hawk_ooch_t* cmd, int flags) int hawk_pio_init (hawk_pio_t* pio, hawk_gem_t* gem, const hawk_ooch_t* cmd, int flags, hawk_pio_env_mk_t env_mk, void* env_ctx)
{ {
hawk_pio_hnd_t handle[6] /*= hawk_pio_hnd_t handle[6] /*=
{ {
@@ -647,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__)
@@ -673,29 +671,14 @@ int hawk_pio_init (hawk_pio_t* pio, hawk_gem_t* gem, const hawk_ooch_t* cmd, int
posix_spawnattr_t psattr; posix_spawnattr_t psattr;
hawk_pio_pid_t pid; hawk_pio_pid_t pid;
param_t param; param_t param;
#if defined(HAVE_CRT_EXTERNS_H)
#define environ (*(_NSGetEnviron()))
#else
extern char** environ;
#endif
#elif defined(HAWK_SYSCALL0) && defined(SYS_vfork) #elif defined(HAWK_SYSCALL0) && defined(SYS_vfork)
hawk_pio_pid_t pid; hawk_pio_pid_t pid;
param_t param; param_t param;
#if defined(HAVE_CRT_EXTERNS_H)
#define environ (*(_NSGetEnviron()))
#else
extern char** environ;
#endif
int highest_fd; int highest_fd;
int dummy; int dummy;
#else #else
hawk_pio_pid_t pid; hawk_pio_pid_t pid;
param_t param; param_t param;
#if defined(HAVE_CRT_EXTERNS_H)
#define environ (*(_NSGetEnviron()))
#else
extern char** environ;
#endif
#endif #endif
HAWK_MEMSET(pio, 0, HAWK_SIZEOF(*pio)); HAWK_MEMSET(pio, 0, HAWK_SIZEOF(*pio));
@@ -797,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) ||
@@ -925,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 */
@@ -1069,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) ||
@@ -1276,7 +1265,7 @@ create_process:
HAWK_SIZEOF(load_error), HAWK_SIZEOF(load_error),
EXEC_ASYNCRESULT, EXEC_ASYNCRESULT,
cmd_line, cmd_line,
HAWK_NULL, HAWK_NULL, /* environment - e.g. "PATH=/bin\0HOME=/tmp\0FOO=bar\0\0" */
&child_rc, &child_rc,
cmd_file cmd_file
); );
@@ -1307,7 +1296,6 @@ create_process:
return -1; return -1;
#else #else
if (flags & HAWK_PIO_WRITEIN) if (flags & HAWK_PIO_WRITEIN)
{ {
if (HAWK_PIPE(&handle[0]) <= -1) if (HAWK_PIPE(&handle[0]) <= -1)
@@ -1340,22 +1328,38 @@ 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)
{ {
/* i know i'm abusing typecasting here. /* i know i'm abusing typecasting here.
* cmd is supposed to be hawk_pio_fnc_t*, anyway */ * cmd is supposed to be hawk_pio_fnc_t*, anyway */
pid = standard_fork_and_exec(pio, handle, (param_t*)cmd); pid = standard_fork_and_exec(pio, handle, (param_t*)cmd, HAWK_NULL);
if (pid <= -1) goto oops; if (pid <= -1) goto oops;
pio->child = pid; pio->child = pid;
} }
else else
{ {
char*const* envp;
if (env_mk)
{
envp = (char*const*)env_mk(HAWK_PIO_ENV_MK_BPP, env_ctx);
if (HAWK_UNLIKELY(!envp)) goto oops;
/* pio doesn't free the memory block returned by the callback function.
* there is no callback triggered for dealloction either.
* the caller side must do track heap memory chunks allocated for this environment */
}
else
{
#if defined(HAVE_CRT_EXTERNS_H)
#define environ (*(_NSGetEnviron()))
#else
extern char** environ;
#endif
envp = environ;
}
#if defined(HAVE_POSIX_SPAWN) && !(defined(HAWK_SYSCALL0) && defined(SYS_vfork)) #if defined(HAVE_POSIX_SPAWN) && !(defined(HAWK_SYSCALL0) && defined(SYS_vfork))
if ((pserr = posix_spawn_file_actions_init(&fa)) != 0) if ((pserr = posix_spawn_file_actions_init(&fa)) != 0)
@@ -1531,7 +1535,7 @@ create_process:
posix_spawnattr_setflags (&psattr, POSIX_SPAWN_USEVFORK); posix_spawnattr_setflags (&psattr, POSIX_SPAWN_USEVFORK);
#endif #endif
pserr = posix_spawn(&pid, param.argv[0], &fa, &psattr, param.argv, environ); pserr = posix_spawn(&pid, param.argv[0], &fa, &psattr, param.argv, envp);
#if defined(__linux) #if defined(__linux)
posix_spawnattr_destroy (&psattr); posix_spawnattr_destroy (&psattr);
@@ -1683,7 +1687,7 @@ create_process:
if (flags & HAWK_PIO_DROPOUT) HAWK_SYSCALL1(dummy, SYS_close, 1); if (flags & HAWK_PIO_DROPOUT) HAWK_SYSCALL1(dummy, SYS_close, 1);
if (flags & HAWK_PIO_DROPERR) HAWK_SYSCALL1(dummy, SYS_close, 2); if (flags & HAWK_PIO_DROPERR) HAWK_SYSCALL1(dummy, SYS_close, 2);
HAWK_SYSCALL3 (dummy, SYS_execve, param.argv[0], param.argv, environ); HAWK_SYSCALL3(dummy, SYS_execve, param.argv[0], param.argv, envp);
/*free_param(pio, &param); don't free this in the vfork version */ /*free_param(pio, &param); don't free this in the vfork version */
child_oops: child_oops:
@@ -1696,7 +1700,6 @@ create_process:
pio->child = pid; pio->child = pid;
#else #else
if (make_param(pio, cmd, flags, &param) <= -1) goto oops; if (make_param(pio, cmd, flags, &param) <= -1) goto oops;
/* check if the command(the command requested or /bin/sh) is /* check if the command(the command requested or /bin/sh) is
@@ -1708,7 +1711,7 @@ create_process:
goto oops; goto oops;
} }
pid = standard_fork_and_exec(pio, handle, &param); pid = standard_fork_and_exec(pio, handle, &param, envp);
if (pid <= -1) if (pid <= -1)
{ {
free_param(pio, &param); free_param(pio, &param);
@@ -1719,7 +1722,6 @@ create_process:
free_param(pio, &param); free_param(pio, &param);
pio->child = pid; pio->child = pid;
#endif #endif
} }
if (flags & HAWK_PIO_WRITEIN) if (flags & HAWK_PIO_WRITEIN)
+30 -8
View File
@@ -53,7 +53,7 @@
#define rotate_left(rbt,pivot) rotate(rbt,pivot,1); #define rotate_left(rbt,pivot) rotate(rbt,pivot,1);
#define rotate_right(rbt,pivot) rotate(rbt,pivot,0); #define rotate_right(rbt,pivot) rotate(rbt,pivot,0);
HAWK_INLINE hawk_rbt_pair_t* hawk_rbt_allocpair ( static HAWK_INLINE_ALWAYS hawk_rbt_pair_t* alloc_pair (
hawk_rbt_t* rbt, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen) hawk_rbt_t* rbt, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen)
{ {
hawk_rbt_pair_t* pair; hawk_rbt_pair_t* pair;
@@ -120,7 +120,7 @@ HAWK_INLINE hawk_rbt_pair_t* hawk_rbt_allocpair (
return pair; return pair;
} }
HAWK_INLINE void hawk_rbt_freepair (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair) static HAWK_INLINE_ALWAYS void free_pair (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair)
{ {
if (rbt->style->freeer[HAWK_RBT_KEY]) if (rbt->style->freeer[HAWK_RBT_KEY])
rbt->style->freeer[HAWK_RBT_KEY](rbt, KPTR(pair), KLEN(pair)); rbt->style->freeer[HAWK_RBT_KEY](rbt, KPTR(pair), KLEN(pair));
@@ -129,6 +129,16 @@ HAWK_INLINE void hawk_rbt_freepair (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair)
hawk_gem_freemem(rbt->gem, pair); hawk_gem_freemem(rbt->gem, pair);
} }
hawk_rbt_pair_t* hawk_rbt_allocpair (hawk_rbt_t* rbt, void* kptr, hawk_oow_t klen, void* vptr, hawk_oow_t vlen)
{
return alloc_pair(rbt, kptr, klen, vptr, vlen);
}
void hawk_rbt_freepair (hawk_rbt_t* rbt, hawk_rbt_pair_t* pair)
{
free_pair(rbt, pair);
}
static hawk_rbt_style_t style[] = static hawk_rbt_style_t style[] =
{ {
{ {
@@ -221,6 +231,7 @@ int hawk_rbt_init (hawk_rbt_t* rbt, hawk_gem_t* gem, int kscale, int vscale)
rbt->scale[HAWK_RBT_KEY] = (kscale < 1)? 1: kscale; rbt->scale[HAWK_RBT_KEY] = (kscale < 1)? 1: kscale;
rbt->scale[HAWK_RBT_VAL] = (vscale < 1)? 1: vscale; rbt->scale[HAWK_RBT_VAL] = (vscale < 1)? 1: vscale;
rbt->size = 0; rbt->size = 0;
rbt->rev = 0;
rbt->style = &style[0]; rbt->style = &style[0];
@@ -262,6 +273,11 @@ hawk_oow_t hawk_rbt_getsize (const hawk_rbt_t* rbt)
return rbt->size; return rbt->size;
} }
hawk_oow_t hawk_rbt_getrev (const hawk_rbt_t* rbt)
{
return rbt->rev;
}
hawk_rbt_pair_t* hawk_rbt_search (const hawk_rbt_t* rbt, const void* kptr, hawk_oow_t klen) hawk_rbt_pair_t* hawk_rbt_search (const hawk_rbt_t* rbt, const void* kptr, hawk_oow_t klen)
{ {
hawk_rbt_pair_t* pair = rbt->root; hawk_rbt_pair_t* pair = rbt->root;
@@ -444,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;
@@ -469,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;
} }
} }
@@ -506,7 +522,9 @@ static hawk_rbt_pair_t* insert (hawk_rbt_t* rbt, void* kptr, hawk_oow_t klen, vo
{ {
case UPSERT: case UPSERT:
case UPDATE: case UPDATE:
return change_pair_val(rbt, x_cur, vptr, vlen); x_cur = change_pair_val(rbt, x_cur, vptr, vlen);
if (HAWK_LIKELY(x_cur)) rbt->rev++;
return x_cur;
case ENSERT: case ENSERT:
/* return existing pair */ /* return existing pair */
@@ -531,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)
@@ -561,6 +579,7 @@ static hawk_rbt_pair_t* insert (hawk_rbt_t* rbt, void* kptr, hawk_oow_t klen, vo
rbt->root->color = HAWK_RBT_BLACK; rbt->root->color = HAWK_RBT_BLACK;
rbt->size++; rbt->size++;
rbt->rev++;
return x_new; return x_new;
} }
@@ -639,6 +658,7 @@ hawk_rbt_pair_t* hawk_rbt_cbsert (hawk_rbt_t* rbt, void* kptr, hawk_oow_t klen,
if (x_cur == rbt->root) rbt->root = x_new; if (x_cur == rbt->root) rbt->root = x_new;
} }
rbt->rev++;
return x_new; return x_new;
} }
@@ -678,6 +698,7 @@ hawk_rbt_pair_t* hawk_rbt_cbsert (hawk_rbt_t* rbt, void* kptr, hawk_oow_t klen,
rbt->root->color = HAWK_RBT_BLACK; rbt->root->color = HAWK_RBT_BLACK;
rbt->size++; rbt->size++;
rbt->rev++;
return x_new; return x_new;
} }
@@ -808,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
{ {
@@ -833,10 +854,11 @@ 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--;
rbt->rev++;
#if defined(HAWK_ENABLE_RBT_ITR_PROTECTION) #if defined(HAWK_ENABLE_RBT_ITR_PROTECTION)
/* an iterator set by hawk_rbt_getfirstpair() or hawk_rbt_getnextpair(), if deleted, gets invalidated. /* an iterator set by hawk_rbt_getfirstpair() or hawk_rbt_getnextpair(), if deleted, gets invalidated.
+42 -14
View File
@@ -272,7 +272,7 @@ static int set_global (hawk_rtx_t* rtx, int idx, hawk_nde_var_t* var, hawk_val_t
{ {
if (old_vtype == HAWK_VAL_NIL) if (old_vtype == HAWK_VAL_NIL)
{ {
/* a nil valul can be overridden with any values */ /* a nil value can be overridden with any values */
/* ok. no error */ /* ok. no error */
} }
else if (!assign && old_vtype == vtype) else if (!assign && old_vtype == vtype)
@@ -682,11 +682,14 @@ static int set_global (hawk_rtx_t* rtx, int idx, hawk_nde_var_t* var, hawk_val_t
HAWK_RTX_STACK_GBL(rtx,idx) = val; HAWK_RTX_STACK_GBL(rtx,idx) = val;
hawk_rtx_refupval_inline(rtx, val); hawk_rtx_refupval_inline(rtx, val);
if (rtx->ecb_gblset_count > 0)
{
for (ecb = rtx->ecb; ecb != (hawk_rtx_ecb_t*)rtx; ecb = ecb_next) for (ecb = rtx->ecb; ecb != (hawk_rtx_ecb_t*)rtx; ecb = ecb_next)
{ {
ecb_next = ecb->next_; ecb_next = ecb->next_;
if (ecb->gblset) ecb->gblset(rtx, idx, val, ecb->ctx); if (ecb->gblset) ecb->gblset(rtx, idx, val, ecb->ctx);
} }
}
return 0; return 0;
} }
@@ -1123,6 +1126,7 @@ hawk_rtx_t* hawk_rtx_open (hawk_t* hawk, hawk_oow_t xtnsize, hawk_rio_cbs_t* rio
rtx->ecb = (hawk_rtx_ecb_t*)rtx; /* use this as a special sentinel node */ rtx->ecb = (hawk_rtx_ecb_t*)rtx; /* use this as a special sentinel node */
rtx->ecb_stmt_count = 0; rtx->ecb_stmt_count = 0;
rtx->ecb_gblset_count = 0;
/* initialize signal handling fields */ /* initialize signal handling fields */
rtx->sig_handling = 0; /* indicate call_signal_handlers() is not in progress */ rtx->sig_handling = 0; /* indicate call_signal_handlers() is not in progress */
@@ -1232,6 +1236,7 @@ void hawk_rtx_close (hawk_rtx_t* rtx)
do { ecb = hawk_rtx_popecb(rtx); } while (ecb); do { ecb = hawk_rtx_popecb(rtx); } while (ecb);
HAWK_ASSERT(rtx->ecb == (hawk_rtx_ecb_t*)rtx); HAWK_ASSERT(rtx->ecb == (hawk_rtx_ecb_t*)rtx);
HAWK_ASSERT(rtx->ecb_stmt_count == 0); HAWK_ASSERT(rtx->ecb_stmt_count == 0);
HAWK_ASSERT(rtx->ecb_gblset_count == 0);
/* NOTE: /* NOTE:
* the close callbacks are called before data in rtx * the close callbacks are called before data in rtx
@@ -1259,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)
@@ -1266,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)
@@ -1277,6 +1284,7 @@ void hawk_rtx_killecb (hawk_rtx_t* rtx, hawk_rtx_ecb_t* ecb)
if (cur == ecb) if (cur == ecb)
{ {
if (ecb->stmt) rtx->ecb_stmt_count--; if (ecb->stmt) rtx->ecb_stmt_count--;
if (ecb->gblset) rtx->ecb_gblset_count--;
if (prev) prev->next_ = cur->next_; if (prev) prev->next_ = cur->next_;
else rtx->ecb = cur->next_; else rtx->ecb = cur->next_;
cur->next_ = HAWK_NULL; cur->next_ = HAWK_NULL;
@@ -1290,6 +1298,7 @@ hawk_rtx_ecb_t* hawk_rtx_popecb (hawk_rtx_t* rtx)
hawk_rtx_ecb_t* top = rtx->ecb; hawk_rtx_ecb_t* top = rtx->ecb;
if (top == (hawk_rtx_ecb_t*)rtx) return HAWK_NULL; if (top == (hawk_rtx_ecb_t*)rtx) return HAWK_NULL;
if (top->stmt) rtx->ecb_stmt_count--; if (top->stmt) rtx->ecb_stmt_count--;
if (top->gblset) rtx->ecb_gblset_count--;
rtx->ecb = top->next_; rtx->ecb = top->next_;
top->next_ = HAWK_NULL; top->next_ = HAWK_NULL;
return top; return top;
@@ -1300,6 +1309,7 @@ void hawk_rtx_pushecb (hawk_rtx_t* rtx, hawk_rtx_ecb_t* ecb)
ecb->next_ = rtx->ecb; ecb->next_ = rtx->ecb;
rtx->ecb = ecb; rtx->ecb = ecb;
if (ecb->stmt) rtx->ecb_stmt_count++; if (ecb->stmt) rtx->ecb_stmt_count++;
if (ecb->gblset) rtx->ecb_gblset_count++;
} }
static int init_rtx (hawk_rtx_t* rtx, hawk_t* hawk, hawk_rio_cbs_t* rio) static int init_rtx (hawk_rtx_t* rtx, hawk_t* hawk, hawk_rio_cbs_t* rio)
@@ -1407,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;
} }
@@ -1600,19 +1611,14 @@ static void fini_rtx (hawk_rtx_t* rtx, int fini_globals)
{ {
hawk_oow_t i; hawk_oow_t i;
/* decrement refrence count of all names variable values */ /* refdown all named variables */
for (i = 0; i < rtx->named_slot_count; i++) for (i = 0; i < rtx->named_slot_count; i++)
{ hawk_rtx_refdownval_inline(rtx, rtx->named_slots[i]); /* TODO: it is better to disable caching as it's shutting down anyways? */
HAWK_ASSERT(
!HAWK_VTR_IS_POINTER(rtx->named_slots[i]) ||
HAWK_IS_STATICVAL(rtx->named_slots[i]) ||
rtx->named_slots[i]->v_refs == 1);
hawk_rtx_refdownval_inline(rtx, rtx->named_slots[i]);
}
hawk_rtx_freemem(rtx, rtx->named_slots); hawk_rtx_freemem(rtx, rtx->named_slots);
rtx->named_slots = HAWK_NULL; rtx->named_slots = HAWK_NULL;
rtx->named_slot_count = 0; rtx->named_slot_count = 0;
rtx->named_slot_capa = 0;
} }
#if defined(HAWK_ENABLE_GC) #if defined(HAWK_ENABLE_GC)
@@ -4060,10 +4066,11 @@ static int run_reset (hawk_rtx_t* rtx, hawk_nde_reset_t* nde)
HAWK_ASSERT(var->idx == HAWK_NULL); HAWK_ASSERT(var->idx == HAWK_NULL);
HAWK_ASSERT(var->id.idxa < rtx->named_slot_count); HAWK_ASSERT(var->id.idxa < rtx->named_slot_count);
#if defined(QQQQ) if (hawk_rtx_setnamedval(rtx, var->id.idxa, hawk_val_nil) <= -1)
hawk_htb_delete(rtx->named, var->id.name.ptr, var->id.name.len); {
#endif ADJERR_LOC(rtx, &var->loc);
HAWK_RTX_STACK_NAMED(rtx, var->id.idxa) = hawk_val_nil; return -1;
}
/* a named variable can be reset if removed from the internal map to manage it */ /* a named variable can be reset if removed from the internal map to manage it */
return 0; return 0;
@@ -8150,6 +8157,8 @@ hawk_val_t* hawk_rtx_evalcall (
hawk_oow_t prev_stack_base = (hawk_oow_t)rtx->stack[rtx->stack_base + 0]; hawk_oow_t prev_stack_base = (hawk_oow_t)rtx->stack[rtx->stack_base + 0];
hawk_nde_t* p = call->args; hawk_nde_t* p = call->args;
if (fun->hasrefarg) /* just for optimization */
{
for (; i < call->nargs; i++) for (; i < call->nargs; i++)
{ {
if (n >= 0 && i < fun->argspeclen && (fun->argspec[i] == 'r' || fun->argspec[i] == 'R')) if (n >= 0 && i < fun->argspeclen && (fun->argspec[i] == 'r' || fun->argspec[i] == 'R'))
@@ -8205,6 +8214,15 @@ hawk_val_t* hawk_rtx_evalcall (
p = p->next; p = p->next;
} }
} }
else
{
for (; i < call->nargs; i++)
{
hawk_rtx_refdownval_inline(rtx, HAWK_RTX_STACK_ARG(rtx,i));
p = p->next;
}
}
}
else if (call->arg_base > 0) /* special case. set by hawk::call() */ else if (call->arg_base > 0) /* special case. set by hawk::call() */
{ {
/* /*
@@ -8219,9 +8237,11 @@ hawk_val_t* hawk_rtx_evalcall (
* f1(1, 2) is an error as 2 is not referenceable. * f1(1, 2) is an error as 2 is not referenceable.
* hawk::call(r, "f1", 1, 2) is not an error but can't capture changes made inside f1. * hawk::call(r, "f1", 1, 2) is not an error but can't capture changes made inside f1.
*/ */
if (fun->hasrefarg) /* just for optimization */
{
for (; i < call->nargs; i++) for (; i < call->nargs; i++)
{ {
if (n >= 0 && (fun->argspec[i] == 'r' || fun->argspec[i] == 'R')) if (n >= 0 && i < fun->argspeclen && (fun->argspec[i] == 'r' || fun->argspec[i] == 'R'))
{ {
hawk_val_t* v, * av; hawk_val_t* v, * av;
@@ -8248,6 +8268,14 @@ hawk_val_t* hawk_rtx_evalcall (
hawk_rtx_refdownval_inline(rtx, HAWK_RTX_STACK_ARG(rtx,i)); hawk_rtx_refdownval_inline(rtx, HAWK_RTX_STACK_ARG(rtx,i));
} }
} }
else
{
for (; i < call->nargs; i++)
{
hawk_rtx_refdownval_inline(rtx, HAWK_RTX_STACK_ARG(rtx,i));
}
}
}
} }
for (; i < nargs; i++) for (; i < nargs; i++)
+24
View File
@@ -25,6 +25,29 @@
#ifndef _HAWK_SKAD_PRV_H_ #ifndef _HAWK_SKAD_PRV_H_
#define _HAWK_SKAD_PRV_H_ #define _HAWK_SKAD_PRV_H_
#if defined(_WIN32)
# include <winsock2.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 <sys/ioctl.h>
# include <nerrno.h>
# if defined(TCPV40HDRS)
# define USE_SELECT
# include <sys/select.h>
# else
# include <unistd.h>
# endif
#elif defined(__DOS__)
/* TODO: */
#else
# include <sys/types.h> # include <sys/types.h>
# include <sys/socket.h> # include <sys/socket.h>
# if defined(HAVE_NETINET_IN_H) # if defined(HAVE_NETINET_IN_H)
@@ -39,6 +62,7 @@
# if defined(HAVE_NET_IF_DL_H) # if defined(HAVE_NET_IF_DL_H)
# include <net/if_dl.h> # include <net/if_dl.h>
# endif # endif
#endif
union hawk_skad_alt_t union hawk_skad_alt_t
{ {
+5 -1
View File
@@ -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)
{ {
@@ -1028,6 +1029,7 @@ hawk_oow_t hawk_gem_skadtoucstr (hawk_gem_t* gem, const hawk_skad_t* _skad, hawk
} }
break; break;
#endif
} }
done: done:
@@ -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:
@@ -1480,7 +1484,7 @@ void hawk_skad_init_for_eth (hawk_skad_t* skad, int ifindex, hawk_ethad_t* ethad
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
} }
+1
View File
@@ -29,6 +29,7 @@ typedef struct xtn_t xtn_t;
struct xtn_t struct xtn_t
{ {
/* empty. nothing at the moment */ /* empty. nothing at the moment */
int reserved_;
}; };
#if defined(HAWK_HAVE_INLINE) #if defined(HAWK_HAVE_INLINE)
+387 -27
View File
@@ -189,6 +189,11 @@ typedef struct rxtn_t
hawk_htb_t cmgrtab; hawk_htb_t cmgrtab;
hawk_rtx_ecb_t ecb; hawk_rtx_ecb_t ecb;
void* envp; /* cached environment value */
hawk_map_t* env_map;
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
@@ -442,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);
@@ -453,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;
} }
@@ -645,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__)
{ {
@@ -2036,6 +2041,59 @@ static int parse_rwpipe_uri (const hawk_ooch_t* uri, int* flags, hawk_nwad_t* nw
} }
#endif #endif
static void* rtx_env_maker (hawk_rtx_t* rtx, hawk_rtx_env_mk_type_t env_mk_type)
{
hawk_t* hawk = hawk_rtx_gethawk(rtx);
hawk_val_t* v_env;
hawk_map_t* env_map;
hawk_oow_t env_map_rev;
void* envp;
xtn_t* xtn;
rxtn_t* rxtn;
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)
{
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_type != env_mk_type ||
rxtn->env_map != env_map ||
(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)
{ {
hawk_pio_t* handle; hawk_pio_t* handle;
@@ -2074,9 +2132,11 @@ static hawk_ooi_t pio_handler_open (hawk_rtx_t* rtx, hawk_rio_arg_t* riod)
hawk_rtx_getgem(rtx), hawk_rtx_getgem(rtx),
0, 0,
riod->name, riod->name,
flags | HAWK_PIO_SHELL | HAWK_PIO_TEXT | HAWK_PIO_IGNOREECERR flags | HAWK_PIO_SHELL | HAWK_PIO_TEXT | HAWK_PIO_IGNOREECERR,
(rtx->rio.env_mk? pio_env_maker: (hawk_pio_env_mk_t)HAWK_NULL),
rtx
); );
if (handle == HAWK_NULL) return -1; if (!handle) return -1;
#if defined(HAWK_OOCH_IS_UCH) #if defined(HAWK_OOCH_IS_UCH)
{ {
@@ -2776,6 +2836,15 @@ static void fini_rxtn (hawk_rtx_t* rtx, void* ctx)
hawk_htb_fini(&rxtn->cmgrtab); hawk_htb_fini(&rxtn->cmgrtab);
rxtn->cmgrtab_inited = 0; rxtn->cmgrtab_inited = 0;
} }
if (rxtn->envp)
{
hawk_rtx_freemem(rtx, rxtn->envp);
rxtn->envp = HAWK_NULL;
}
rxtn->env_map = HAWK_NULL;
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[])
@@ -2876,17 +2945,7 @@ static int build_argcv (hawk_rtx_t* rtx, int argc_id, int argv_id, const hawk_oo
return 0; return 0;
} }
/* TODO: use wenviron where it's available */ static int build_environ (hawk_rtx_t* rtx, int gbl_id, hawk_env_char_t* envarr[])
typedef hawk_bch_t env_char_t;
#define ENV_CHAR_IS_BCH
#if defined(HAVE_CRT_EXTERNS_H)
#define environ (*(_NSGetEnviron()))
#else
extern char** environ;
#endif
static int build_environ (hawk_rtx_t* rtx, int gbl_id, env_char_t* envarr[])
{ {
hawk_val_t* v_env; hawk_val_t* v_env;
hawk_val_t* v_tmp; hawk_val_t* v_tmp;
@@ -2898,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;
@@ -2913,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;
@@ -2959,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);
@@ -2980,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);
@@ -2995,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);
@@ -3015,10 +3074,308 @@ static int build_environ (hawk_rtx_t* rtx, int gbl_id, env_char_t* envarr[])
return 0; return 0;
} }
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_map_t* map;
hawk_map_itr_t itr;
hawk_map_pair_t* pair;
hawk_oow_t count, ptr_bytes, str_bytes;
v_env = hawk_rtx_getgbl(rtx, gbl_id);
HAWK_ASSERT(v_env != HAWK_NULL);
if (HAWK_RTX_GETVALTYPE(rtx, v_env) != HAWK_VAL_MAP)
{
/* it may be nil. but we can't prevent ENVIRON from being set to
* other scalar types, we should handle this case gracefully */
switch (env_mk_type)
{
case HAWK_RTX_ENV_MK_BPP:
{
hawk_bch_t** envp;
envp = (hawk_bch_t**)hawk_rtx_allocmem(rtx, HAWK_SIZEOF(*envp) * 1);
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
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;
HAWK_ASSERT(map != HAWK_NULL);
count = 0;
str_bytes = 0;
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_ENV_CHAR_IS_BCH) && defined(HAWK_OOCH_IS_UCH)
{
hawk_oow_t tmp_ulen, tmp_blen;
tmp_ulen = klen;
if (hawk_rtx_convutobchars(rtx, HAWK_MAP_KPTR(pair), &tmp_ulen, HAWK_NULL, &tmp_blen) <= -1) return HAWK_NULL;
klen = tmp_blen;
}
#elif defined(HAWK_ENV_CHAR_IS_UCH) && defined(HAWK_OOCH_IS_BCH)
{
hawk_oow_t tmp_blen, tmp_ulen;
tmp_blen = klen;
if (hawk_rtx_convbtouchars(rtx, HAWK_MAP_KPTR(pair), &tmp_blen, HAWK_NULL, &tmp_ulen, 1) <= -1) return HAWK_NULL;
klen = tmp_ulen;
}
#endif
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;
vptr = hawk_rtx_getvalbcstr(rtx, HAWK_MAP_VPTR(pair), &vlen);
if (HAWK_UNLIKELY(!vptr)) return HAWK_NULL;
hawk_rtx_freevalbcstr(rtx, HAWK_MAP_VPTR(pair), vptr);
}
str_bytes += klen + 1 + vlen + 1;
count++;
pair = hawk_map_getnextpair(map, &itr);
}
if (env_mk_type == HAWK_RTX_ENV_MK_BPP)
{
hawk_bch_t** envp;
hawk_bch_t* ptr;
ptr_bytes = HAWK_SIZEOF(*envp) * (count + 1);
envp = (hawk_bch_t**)hawk_rtx_allocmem(rtx, ptr_bytes + (str_bytes * HAWK_SIZEOF(*ptr)));
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
ptr = (hawk_bch_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;
envp[count++] = ptr;
klen = HAWK_MAP_KLEN(pair);
#if defined(HAWK_OOCH_IS_BCH)
HAWK_MEMCPY(ptr, HAWK_MAP_KPTR(pair), klen);
ptr += klen;
#else
{
hawk_oow_t tmp_ulen, tmp_blen;
tmp_ulen = klen;
tmp_blen = str_bytes;
if (hawk_rtx_convutobchars(rtx, HAWK_MAP_KPTR(pair), &tmp_ulen, ptr, &tmp_blen) <= -1)
{
hawk_rtx_freemem(rtx, envp);
return HAWK_NULL;
}
ptr += tmp_blen;
}
#endif
*ptr++ = '=';
{
hawk_bch_t* vptr;
vptr = hawk_rtx_getvalbcstr(rtx, HAWK_MAP_VPTR(pair), &vlen);
if (HAWK_UNLIKELY(!vptr))
{
hawk_rtx_freemem(rtx, envp);
return HAWK_NULL;
}
HAWK_MEMCPY(ptr, vptr, vlen);
ptr += vlen;
hawk_rtx_freevalbcstr(rtx, HAWK_MAP_VPTR(pair), vptr);
}
*ptr++ = '\0';
pair = hawk_map_getnextpair(map, &itr);
}
envp[count] = HAWK_NULL;
return envp;
}
else if (env_mk_type == HAWK_RTX_ENV_MK_BPN)
{
hawk_bch_t* envp;
hawk_bch_t* ptr;
envp = (hawk_bch_t*)hawk_rtx_allocmem(rtx, (str_bytes + 1) * HAWK_SIZEOF(*envp));
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
ptr = envp;
hawk_init_map_itr(&itr, 0);
pair = hawk_map_getfirstpair(map, &itr);
while (pair)
{
hawk_oow_t klen, vlen;
klen = HAWK_MAP_KLEN(pair);
#if defined(HAWK_OOCH_IS_BCH)
HAWK_MEMCPY(ptr, HAWK_MAP_KPTR(pair), klen);
ptr += klen;
#else
{
hawk_oow_t tmp_ulen, tmp_blen;
tmp_ulen = klen;
tmp_blen = str_bytes;
if (hawk_rtx_convutobchars(rtx, HAWK_MAP_KPTR(pair), &tmp_ulen, ptr, &tmp_blen) <= -1)
{
hawk_rtx_freemem(rtx, envp);
return HAWK_NULL;
}
ptr += tmp_blen;
}
#endif
*ptr++ = '=';
{
hawk_bch_t* vptr;
vptr = hawk_rtx_getvalbcstr(rtx, HAWK_MAP_VPTR(pair), &vlen);
if (HAWK_UNLIKELY(!vptr))
{
hawk_rtx_freemem(rtx, envp);
return HAWK_NULL;
}
HAWK_MEMCPY(ptr, vptr, vlen);
ptr += vlen;
hawk_rtx_freevalbcstr(rtx, HAWK_MAP_VPTR(pair), vptr);
}
*ptr++ = '\0';
pair = hawk_map_getnextpair(map, &itr);
}
*ptr++ = '\0';
return envp;
}
else if (env_mk_type == HAWK_RTX_ENV_MK_UPN)
{
hawk_uch_t* envp;
hawk_uch_t* ptr;
envp = (hawk_uch_t*)hawk_rtx_allocmem(rtx, (str_bytes + 1) * HAWK_SIZEOF(*envp));
if (HAWK_UNLIKELY(!envp)) return HAWK_NULL;
ptr = envp;
hawk_init_map_itr(&itr, 0);
pair = hawk_map_getfirstpair(map, &itr);
while (pair)
{
hawk_oow_t klen, vlen;
klen = HAWK_MAP_KLEN(pair);
#if defined(HAWK_OOCH_IS_UCH)
HAWK_MEMCPY(ptr, HAWK_MAP_KPTR(pair), klen);
ptr += klen;
#else
{
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;
}
return HAWK_NULL;
}
static int make_additional_globals (hawk_rtx_t* rtx, xtn_t* xtn, const hawk_ooch_t* id, hawk_ooch_t* icf[]) static int make_additional_globals (hawk_rtx_t* rtx, xtn_t* xtn, const hawk_ooch_t* id, hawk_ooch_t* icf[])
{ {
#if defined(_WIN32)
#define SYSTEM_ENVIRON _environ
#elif defined(HAVE_CRT_EXTERNS_H)
#define environ (*(_NSGetEnviron()))
#define SYSTEM_ENVIRON environ
#else
extern char** environ;
#define SYSTEM_ENVIRON environ
#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;
} }
@@ -3041,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;
@@ -3293,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
View File
@@ -3261,14 +3261,14 @@ int hawk_fnmat_uchars_i (const hawk_uch_t* str, hawk_oow_t slen, const hawk_uch_
* a period in the pattern explicitly * a period in the pattern explicitly
*/ */
if ((!no_first_period && sp == str) || if ((!no_first_period && sp == str) ||
(HAWK_FNMAT_IS_SEP(sp[-1]) && (flags & HAWK_FNMAT_PATHNAME))) (HAWK_IS_PATH_SEP(sp[-1]) && (flags & HAWK_FNMAT_PATHNAME)))
{ {
if (pc != '.') return 0; if (pc != '.') return 0;
sp++; pp++; sp++; pp++;
continue; continue;
} }
} }
else if (HAWK_FNMAT_IS_SEP(sc) && (flags & HAWK_FNMAT_PATHNAME)) else if (HAWK_IS_PATH_SEP(sc) && (flags & HAWK_FNMAT_PATHNAME))
{ {
while (pc == '*') while (pc == '*')
{ {
@@ -3277,7 +3277,7 @@ int hawk_fnmat_uchars_i (const hawk_uch_t* str, hawk_oow_t slen, const hawk_uch_
} }
/* a path separator must be matched explicitly */ /* a path separator must be matched explicitly */
if (!HAWK_FNMAT_IS_SEP(pc)) return 0; if (!HAWK_IS_PATH_SEP(pc)) return 0;
sp++; pp++; sp++; pp++;
continue; continue;
} }
@@ -3307,7 +3307,7 @@ int hawk_fnmat_uchars_i (const hawk_uch_t* str, hawk_oow_t slen, const hawk_uch_
const hawk_uch_t* s = sp; const hawk_uch_t* s = sp;
for (s = sp; s < se; s++) for (s = sp; s < se; s++)
{ {
if (HAWK_FNMAT_IS_SEP(*s)) return 0; if (HAWK_IS_PATH_SEP(*s)) return 0;
} }
} }
return 1; return 1;
@@ -3317,7 +3317,7 @@ int hawk_fnmat_uchars_i (const hawk_uch_t* str, hawk_oow_t slen, const hawk_uch_
do do
{ {
if (hawk_fnmat_uchars_i(sp, se - sp, pp, pe - pp, flags, 1)) return 1; if (hawk_fnmat_uchars_i(sp, se - sp, pp, pe - pp, flags, 1)) return 1;
if (HAWK_FNMAT_IS_SEP(*sp) && (flags & HAWK_FNMAT_PATHNAME)) break; if (HAWK_IS_PATH_SEP(*sp) && (flags & HAWK_FNMAT_PATHNAME)) break;
sp++; sp++;
} }
while (sp < se); while (sp < se);
@@ -3492,14 +3492,14 @@ int hawk_fnmat_bchars_i (const hawk_bch_t* str, hawk_oow_t slen, const hawk_bch_
* a period in the pattern explicitly * a period in the pattern explicitly
*/ */
if ((!no_first_period && sp == str) || if ((!no_first_period && sp == str) ||
(HAWK_FNMAT_IS_SEP(sp[-1]) && (flags & HAWK_FNMAT_PATHNAME))) (HAWK_IS_PATH_SEP(sp[-1]) && (flags & HAWK_FNMAT_PATHNAME)))
{ {
if (pc != '.') return 0; if (pc != '.') return 0;
sp++; pp++; sp++; pp++;
continue; continue;
} }
} }
else if (HAWK_FNMAT_IS_SEP(sc) && (flags & HAWK_FNMAT_PATHNAME)) else if (HAWK_IS_PATH_SEP(sc) && (flags & HAWK_FNMAT_PATHNAME))
{ {
while (pc == '*') while (pc == '*')
{ {
@@ -3508,7 +3508,7 @@ int hawk_fnmat_bchars_i (const hawk_bch_t* str, hawk_oow_t slen, const hawk_bch_
} }
/* a path separator must be matched explicitly */ /* a path separator must be matched explicitly */
if (!HAWK_FNMAT_IS_SEP(pc)) return 0; if (!HAWK_IS_PATH_SEP(pc)) return 0;
sp++; pp++; sp++; pp++;
continue; continue;
} }
@@ -3538,7 +3538,7 @@ int hawk_fnmat_bchars_i (const hawk_bch_t* str, hawk_oow_t slen, const hawk_bch_
const hawk_bch_t* s = sp; const hawk_bch_t* s = sp;
for (s = sp; s < se; s++) for (s = sp; s < se; s++)
{ {
if (HAWK_FNMAT_IS_SEP(*s)) return 0; if (HAWK_IS_PATH_SEP(*s)) return 0;
} }
} }
return 1; return 1;
@@ -3548,7 +3548,7 @@ int hawk_fnmat_bchars_i (const hawk_bch_t* str, hawk_oow_t slen, const hawk_bch_
do do
{ {
if (hawk_fnmat_bchars_i(sp, se - sp, pp, pe - pp, flags, 1)) return 1; if (hawk_fnmat_bchars_i(sp, se - sp, pp, pe - pp, flags, 1)) return 1;
if (HAWK_FNMAT_IS_SEP(*sp) && (flags & HAWK_FNMAT_PATHNAME)) break; if (HAWK_IS_PATH_SEP(*sp) && (flags & HAWK_FNMAT_PATHNAME)) break;
sp++; sp++;
} }
while (sp < se); while (sp < se);
+5 -5
View File
@@ -1621,14 +1621,14 @@ int _fn_name_ (const _char_type_* str, hawk_oow_t slen, const _char_type_* ptn,
* a period in the pattern explicitly * a period in the pattern explicitly
*/ */
if ((!no_first_period && sp == str) || if ((!no_first_period && sp == str) ||
(HAWK_FNMAT_IS_SEP(sp[-1]) && (flags & HAWK_FNMAT_PATHNAME))) (HAWK_IS_PATH_SEP(sp[-1]) && (flags & HAWK_FNMAT_PATHNAME)))
{ {
if (pc != '.') return 0; if (pc != '.') return 0;
sp++; pp++; sp++; pp++;
continue; continue;
} }
} }
else if (HAWK_FNMAT_IS_SEP(sc) && (flags & HAWK_FNMAT_PATHNAME)) else if (HAWK_IS_PATH_SEP(sc) && (flags & HAWK_FNMAT_PATHNAME))
{ {
while (pc == '*') while (pc == '*')
{ {
@@ -1637,7 +1637,7 @@ int _fn_name_ (const _char_type_* str, hawk_oow_t slen, const _char_type_* ptn,
} }
/* a path separator must be matched explicitly */ /* a path separator must be matched explicitly */
if (!HAWK_FNMAT_IS_SEP(pc)) return 0; if (!HAWK_IS_PATH_SEP(pc)) return 0;
sp++; pp++; sp++; pp++;
continue; continue;
} }
@@ -1667,7 +1667,7 @@ int _fn_name_ (const _char_type_* str, hawk_oow_t slen, const _char_type_* ptn,
const _char_type_* s = sp; const _char_type_* s = sp;
for (s = sp; s < se; s++) for (s = sp; s < se; s++)
{ {
if (HAWK_FNMAT_IS_SEP(*s)) return 0; if (HAWK_IS_PATH_SEP(*s)) return 0;
} }
} }
return 1; return 1;
@@ -1677,7 +1677,7 @@ int _fn_name_ (const _char_type_* str, hawk_oow_t slen, const _char_type_* ptn,
do do
{ {
if (_fn_name_()(sp, se - sp, pp, pe - pp, flags, 1)) return 1; if (_fn_name_()(sp, se - sp, pp, pe - pp, flags, 1)) return 1;
if (HAWK_FNMAT_IS_SEP(*sp) && (flags & HAWK_FNMAT_PATHNAME)) break; if (HAWK_IS_PATH_SEP(*sp) && (flags & HAWK_FNMAT_PATHNAME)) break;
sp++; sp++;
} }
while (sp < se); while (sp < se);
+4 -10
View File
@@ -509,19 +509,13 @@ int hawk_conv_bchars_to_uchars_upto_stopper_with_cmgr (
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
#if defined(_WIN32) || defined(__OS2__) || defined(__DOS__)
# define IS_PATH_SEP(c) ((c) == '/' || (c) == '\\')
#else
# define IS_PATH_SEP(c) ((c) == '/')
#endif
const hawk_uch_t* hawk_get_base_name_ucstr (const hawk_uch_t* path) const hawk_uch_t* hawk_get_base_name_ucstr (const hawk_uch_t* path)
{ {
const hawk_uch_t* p, * last = HAWK_NULL; const hawk_uch_t* p, * last = HAWK_NULL;
for (p = path; *p != '\0'; p++) for (p = path; *p != '\0'; p++)
{ {
if (IS_PATH_SEP(*p)) last = p; if (HAWK_IS_PATH_SEP(*p)) last = p;
} }
return last? (last + 1): path; return last? (last + 1): path;
@@ -533,7 +527,7 @@ const hawk_bch_t* hawk_get_base_name_bcstr (const hawk_bch_t* path)
for (p = path; *p != '\0'; p++) for (p = path; *p != '\0'; p++)
{ {
if (IS_PATH_SEP(*p)) last = p; if (HAWK_IS_PATH_SEP(*p)) last = p;
} }
return last? (last + 1): path; return last? (last + 1): path;
@@ -546,7 +540,7 @@ const hawk_uch_t* hawk_get_base_name_uchars (const hawk_uch_t* path, hawk_oow_t
for (p = path; p < end; p++) for (p = path; p < end; p++)
{ {
if (IS_PATH_SEP(*p)) last = p; if (HAWK_IS_PATH_SEP(*p)) last = p;
} }
return last? (last + 1): path; return last? (last + 1): path;
@@ -559,7 +553,7 @@ const hawk_bch_t* hawk_get_base_name_bchars (const hawk_bch_t* path, hawk_oow_t
for (p = path; p < end; p++) for (p = path; p < end; p++)
{ {
if (IS_PATH_SEP(*p)) last = p; if (HAWK_IS_PATH_SEP(*p)) last = p;
} }
return last? (last + 1): path; return last? (last + 1): path;
+14 -13
View File
@@ -71,8 +71,11 @@ struct hawk_val_rchunk_t
#define HAWK_IS_STATICVAL(val) ((val) == HAWK_NULL || (val) == hawk_val_nil || (val) == hawk_val_zls || (val) == hawk_val_zlbs) #define HAWK_IS_STATICVAL(val) ((val) == HAWK_NULL || (val) == hawk_val_nil || (val) == hawk_val_zls || (val) == hawk_val_zlbs)
*/ */
#define HAWK_IS_STATICVAL(val) ((val)->v_static) #if defined(HAWK_HAVE_INLINE)
static HAWK_INLINE_ALWAYS int HAWK_IS_STATICVAL (const hawk_val_t* val) { return val->v_static; }
#else
#define HAWK_IS_STATICVAL(val) (((hawk_val_t*)(val))->v_static)
#endif
/* hawk_val_t pointer encoding assumes the pointer is an even number. /* hawk_val_t pointer encoding assumes the pointer is an even number.
* i shift an integer within a certain range and set bit 0 to 1 to * i shift an integer within a certain range and set bit 0 to 1 to
@@ -254,8 +257,8 @@ static HAWK_INLINE_ALWAYS void hawk_rtx_refdownval_inline (hawk_rtx_t* rtx, hawk
#define hawk_rtx_refdownval_inline(rtx, val) do { \ #define hawk_rtx_refdownval_inline(rtx, val) do { \
if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val)) \ if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val)) \
{ \ { \
HAWK_ASSERT(val->v_refs > 0); \ HAWK_ASSERT(((hawk_val_t*)(val))->v_refs > 0); \
if (HAWK_ATOMIC_FETCH_SUB(&(val)->v_refs, 1, HAWK_ATOMIC_RELAXED) == 1) \ if (HAWK_ATOMIC_FETCH_SUB(&((hawk_val_t*)(val))->v_refs, 1, HAWK_ATOMIC_RELAXED) == 1) \
hawk_rtx_freeval(rtx, val, HAWK_RTX_FREEVAL_CACHE); \ hawk_rtx_freeval(rtx, val, HAWK_RTX_FREEVAL_CACHE); \
} \ } \
} while(0) } while(0)
@@ -263,9 +266,9 @@ static HAWK_INLINE_ALWAYS void hawk_rtx_refdownval_inline (hawk_rtx_t* rtx, hawk
#define hawk_rtx_refdownval_inline(rtx, val) do { \ #define hawk_rtx_refdownval_inline(rtx, val) do { \
if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val)) \ if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val)) \
{ \ { \
HAWK_ASSERT(val->v_refs > 0); \ HAWK_ASSERT(((hawk_val_t*)(val))->v_refs > 0); \
(val)->v_refs--; \ ((hawk_val_t*)(val))->v_refs--; \
if ((val)->v_refs <= 0) hawk_rtx_freeval(rtx, val, HAWK_RTX_FREEVAL_CACHE); \ if (((hawk_val_t*)(val))->v_refs <= 0) hawk_rtx_freeval(rtx, val, HAWK_RTX_FREEVAL_CACHE); \
} \ } \
} while(0) } while(0)
#endif #endif
@@ -287,22 +290,20 @@ static HAWK_INLINE_ALWAYS void hawk_rtx_refdownval_nofree_inline (hawk_rtx_t* rt
#define hawk_rtx_refdownval_nofree_inline(rtx, val) do { \ #define hawk_rtx_refdownval_nofree_inline(rtx, val) do { \
if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val)) \ if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val)) \
{ \ { \
HAWK_ASSERT(val->v_refs > 0); \ HAWK_ASSERT(((hawk_val_t*)(val))->v_refs > 0); \
HAWK_ATOMIC_FETCH_SUB(&(val)->v_refs, 1, HAWK_ATOMIC_RELAXED); HAWK_ATOMIC_FETCH_SUB(&((hawk_val_t*)(val))->v_refs, 1, HAWK_ATOMIC_RELAXED);
} \ } \
} while(0) } while(0)
#else #else
#define hawk_rtx_refdownval_nofree_inline(rtx, val) do { \ #define hawk_rtx_refdownval_nofree_inline(rtx, val) do { \
if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val)) \ if (HAWK_VTR_IS_POINTER(val) && !HAWK_IS_STATICVAL(val)) \
{ \ { \
HAWK_ASSERT(val->v_refs > 0); \ HAWK_ASSERT(((hawk_val_t*)(val))->v_refs > 0); \
(val)->v_refs--; \ ((hawk_val_t*)(val))->v_refs--; \
} \ } \
} while(0) } while(0)
#endif #endif
#if defined(HAWK_HAVE_INLINE) #if defined(HAWK_HAVE_INLINE)
static HAWK_INLINE int hawk_rtx_valtoint_inline (hawk_rtx_t* rtx, const hawk_val_t* v, hawk_int_t* l) static HAWK_INLINE int hawk_rtx_valtoint_inline (hawk_rtx_t* rtx, const hawk_val_t* v, hawk_int_t* l)
{ {
+2 -2
View File
@@ -1828,7 +1828,7 @@ int hawk_rtx_valtobool (hawk_rtx_t* rtx, const hawk_val_t* val)
{ {
hawk_val_type_t vtype; hawk_val_type_t vtype;
if (val == HAWK_NULL) return 0; HAWK_ASSERT(val != HAWK_NULL);
vtype = HAWK_RTX_GETVALTYPE(rtx, val); vtype = HAWK_RTX_GETVALTYPE(rtx, val);
switch (vtype) switch (vtype)
@@ -3111,7 +3111,7 @@ hawk_int_t hawk_rtx_hashval (hawk_rtx_t* rtx, hawk_val_t* v)
case HAWK_VAL_BOB: case HAWK_VAL_BOB:
{ {
hawk_val_bob_t* dv = (hawk_val_bob_t*)v; hawk_val_bob_t* dv = (hawk_val_bob_t*)v;
hv = (hawk_int_t)hash((hawk_uint8_t*)dv->val.ptr, dv->val.len * HAWK_SIZEOF(*dv->val.ptr)); hv = (hawk_int_t)hash((hawk_uint8_t*)dv->val.ptr, dv->val.len);
break; break;
} }
+144 -15
View File
@@ -40,9 +40,11 @@
#if defined(_WIN32) #if defined(_WIN32)
# include <windows.h> # include <windows.h>
# include <signal.h>
#elif defined(__OS2__) #elif defined(__OS2__)
# define INCL_DOSPROCESS # define INCL_DOSPROCESS
# include <os2.h> # include <os2.h>
# include <signal.h>
#else #else
# include <unistd.h> # include <unistd.h>
# include <signal.h> # include <signal.h>
@@ -54,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,7 +521,7 @@ 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;
@@ -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;
@@ -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;
@@ -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;
+5
View File
@@ -1,8 +1,13 @@
#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;
+23 -5
View File
@@ -22,7 +22,7 @@ check_SCRIPTS += h-003.hawk h-004.hawk h-009.hawk h-010.hawk \
h-016.hawk h-017.hawk h-018.hawk h-019.hawk h-020.hawk \ h-016.hawk h-017.hawk h-018.hawk h-019.hawk h-020.hawk \
h-021.hawk h-022.hawk h-023.hawk h-024.hawk h-021.hawk h-022.hawk h-023.hawk h-024.hawk
check_SCRIPTS += regress-filename.sh check_SCRIPTS += regress-filename.sh regress-extra-info.sh regress-environ.sh
check_ERRORS = e-001.err check_ERRORS = e-001.err
@@ -33,9 +33,10 @@ EXTRA_DIST = $(check_SCRIPTS) $(check_ERRORS) tap.inc err.sh \
fs-test.hawk fs-test.in fs-test.out \ fs-test.hawk fs-test.in fs-test.out \
JSON.awk.in JSON.awk.out \ JSON.awk.in JSON.awk.out \
h-024-child.hawk h-024.in \ h-024-child.hawk h-024.in \
run-hawk-test.sh regress-extra-info.sh \
two-way-pipe.hawk two-way-pipe.out two-way-pipe.hawk two-way-pipe.out
check_PROGRAMS = t-001 t-002 t-003 t-004 t-005 t-006 t-007 t-008 t-009 check_PROGRAMS = t-001 t-002 t-003 t-004 t-005 t-006 t-007 t-008 t-009 t-010
if ENABLE_CXX if ENABLE_CXX
check_PROGRAMS += t-101 check_PROGRAMS += t-101
@@ -92,6 +93,12 @@ t_009_CFLAGS = $(CFLAGS_COMMON)
t_009_LDFLAGS = $(LDFLAGS_COMMON) t_009_LDFLAGS = $(LDFLAGS_COMMON)
t_009_LDADD = $(LIBADD_COMMON) t_009_LDADD = $(LIBADD_COMMON)
t_010_SOURCES = t-010.c tap.h
t_010_CPPFLAGS = $(CPPFLAGS_COMMON)
t_010_CFLAGS = $(CFLAGS_COMMON)
t_010_LDFLAGS = $(LDFLAGS_COMMON)
t_010_LDADD = $(LIBADD_COMMON)
if ENABLE_CXX if ENABLE_CXX
t_101_SOURCES = t-101.cpp tap.h t_101_SOURCES = t-101.cpp tap.h
t_101_CPPFLAGS = $(CPPFLAGS_COMMON) t_101_CPPFLAGS = $(CPPFLAGS_COMMON)
@@ -108,18 +115,29 @@ TEST_EXTENSIONS = .hawk .err .sh
# override these from environment when needed. # override these from environment when needed.
# e.g. # e.g.
# make check HAWK_TEST_COMPILER=../samples/hawk51 HAWK_CHECK_OPTS= # make check HAWK_TEST_COMPILER=../samples/hawk51 HAWK_CHECK_OPTS=
# make check VALGRIND=1
HAWK_TEST_COMPILER ?= ../bin/hawk HAWK_TEST_COMPILER ?= ../bin/hawk
HAWK_TEST_MODLIBDIRS_OPT ?= --modlibdirs=../lib/.libs:../mod/.libs HAWK_TEST_MODLIBDIRS_OPT ?= --modlibdirs=../lib/.libs:../mod/.libs
HAWK_CHECK_OPTS ?= HAWK_CHECK_OPTS ?=
VALGRIND ?= 0
VALGRIND_CMD ?= valgrind
VALGRIND_ERROR_EXITCODE ?= 99
VALGRIND_FLAGS ?= --leak-check=full --show-leak-kinds=all --errors-for-leak-kinds=all --error-exitcode=99 --num-callers=20
HAWK_LOG_DRIVER = $(LOG_DRIVER) HAWK_LOG_DRIVER = $(LOG_DRIVER)
HAWK_LOG_COMPILER = $(HAWK_TEST_COMPILER) HAWK_LOG_COMPILER = env \
VALGRIND='$(VALGRIND)' \
VALGRIND_CMD='$(VALGRIND_CMD)' \
VALGRIND_ERROR_EXITCODE='$(VALGRIND_ERROR_EXITCODE)' \
VALGRIND_FLAGS='$(VALGRIND_FLAGS)' \
HAWK_TEST_COMPILER='$(HAWK_TEST_COMPILER)' \
$(SHELL) $(abs_srcdir)/run-hawk-test.sh
AM_HAWK_LOG_FLAGS = -vTDIR=${abs_srcdir} $(HAWK_TEST_MODLIBDIRS_OPT) $(HAWK_CHECK_OPTS) -f AM_HAWK_LOG_FLAGS = -vTDIR=${abs_srcdir} $(HAWK_TEST_MODLIBDIRS_OPT) $(HAWK_CHECK_OPTS) -f
ERR_LOG_DRIVER = $(SHELL) $(top_srcdir)/ac/test-driver ERR_LOG_DRIVER = $(SHELL) $(top_srcdir)/ac/test-driver
ERR_LOG_COMPILER = $(SHELL) $(abs_srcdir)/err.sh ../bin/hawk -vTDIR=${abs_srcdir} --modlibdirs=../lib/.libs:../mod/.libs -f ERR_LOG_COMPILER = $(SHELL) $(abs_srcdir)/err.sh $(HAWK_TEST_COMPILER) -vTDIR=${abs_srcdir} $(HAWK_TEST_MODLIBDIRS_OPT) -f
AM_ERR_LOG_FLAGS = AM_ERR_LOG_FLAGS =
SH_LOG_DRIVER = $(LOG_DRIVER) SH_LOG_DRIVER = $(LOG_DRIVER)
SH_LOG_COMPILER = env HAWK_BIN=$(HAWK_TEST_COMPILER) $(SHELL) SH_LOG_COMPILER = env HAWK_BIN='$(HAWK_TEST_COMPILER)' $(SHELL)
AM_SH_LOG_FLAGS = AM_SH_LOG_FLAGS =
+60 -8
View File
@@ -92,7 +92,7 @@ host_triplet = @host@
@ENABLE_WIDE_CHAR_TRUE@am__append_1 = h-001.hawk h-002.hawk @ENABLE_WIDE_CHAR_TRUE@am__append_1 = h-001.hawk h-002.hawk
check_PROGRAMS = t-001$(EXEEXT) t-002$(EXEEXT) t-003$(EXEEXT) \ check_PROGRAMS = t-001$(EXEEXT) t-002$(EXEEXT) t-003$(EXEEXT) \
t-004$(EXEEXT) t-005$(EXEEXT) t-006$(EXEEXT) t-007$(EXEEXT) \ t-004$(EXEEXT) t-005$(EXEEXT) t-006$(EXEEXT) t-007$(EXEEXT) \
t-008$(EXEEXT) t-009$(EXEEXT) $(am__EXEEXT_1) t-008$(EXEEXT) t-009$(EXEEXT) t-010$(EXEEXT) $(am__EXEEXT_1)
@ENABLE_CXX_TRUE@am__append_2 = t-101 @ENABLE_CXX_TRUE@am__append_2 = t-101
subdir = t subdir = t
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
@@ -170,6 +170,12 @@ t_009_DEPENDENCIES = $(am__DEPENDENCIES_2)
t_009_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ t_009_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(t_009_CFLAGS) $(CFLAGS) \ $(LIBTOOLFLAGS) --mode=link $(CCLD) $(t_009_CFLAGS) $(CFLAGS) \
$(t_009_LDFLAGS) $(LDFLAGS) -o $@ $(t_009_LDFLAGS) $(LDFLAGS) -o $@
am_t_010_OBJECTS = t_010-t-010.$(OBJEXT)
t_010_OBJECTS = $(am_t_010_OBJECTS)
t_010_DEPENDENCIES = $(am__DEPENDENCIES_2)
t_010_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(t_010_CFLAGS) $(CFLAGS) \
$(t_010_LDFLAGS) $(LDFLAGS) -o $@
am__t_101_SOURCES_DIST = t-101.cpp tap.h am__t_101_SOURCES_DIST = t-101.cpp tap.h
@ENABLE_CXX_TRUE@am_t_101_OBJECTS = t_101-t-101.$(OBJEXT) @ENABLE_CXX_TRUE@am_t_101_OBJECTS = t_101-t-101.$(OBJEXT)
t_101_OBJECTS = $(am_t_101_OBJECTS) t_101_OBJECTS = $(am_t_101_OBJECTS)
@@ -197,7 +203,7 @@ am__depfiles_remade = ./$(DEPDIR)/t_001-t-001.Po \
./$(DEPDIR)/t_004-t-004.Po ./$(DEPDIR)/t_005-t-005.Po \ ./$(DEPDIR)/t_004-t-004.Po ./$(DEPDIR)/t_005-t-005.Po \
./$(DEPDIR)/t_006-t-006.Po ./$(DEPDIR)/t_007-t-007.Po \ ./$(DEPDIR)/t_006-t-006.Po ./$(DEPDIR)/t_007-t-007.Po \
./$(DEPDIR)/t_008-t-008.Po ./$(DEPDIR)/t_009-t-009.Po \ ./$(DEPDIR)/t_008-t-008.Po ./$(DEPDIR)/t_009-t-009.Po \
./$(DEPDIR)/t_101-t-101.Po ./$(DEPDIR)/t_010-t-010.Po ./$(DEPDIR)/t_101-t-101.Po
am__mv = mv -f am__mv = mv -f
COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
@@ -238,11 +244,11 @@ am__v_CXXLD_1 =
SOURCES = $(t_001_SOURCES) $(t_002_SOURCES) $(t_003_SOURCES) \ SOURCES = $(t_001_SOURCES) $(t_002_SOURCES) $(t_003_SOURCES) \
$(t_004_SOURCES) $(t_005_SOURCES) $(t_006_SOURCES) \ $(t_004_SOURCES) $(t_005_SOURCES) $(t_006_SOURCES) \
$(t_007_SOURCES) $(t_008_SOURCES) $(t_009_SOURCES) \ $(t_007_SOURCES) $(t_008_SOURCES) $(t_009_SOURCES) \
$(t_101_SOURCES) $(t_010_SOURCES) $(t_101_SOURCES)
DIST_SOURCES = $(t_001_SOURCES) $(t_002_SOURCES) $(t_003_SOURCES) \ DIST_SOURCES = $(t_001_SOURCES) $(t_002_SOURCES) $(t_003_SOURCES) \
$(t_004_SOURCES) $(t_005_SOURCES) $(t_006_SOURCES) \ $(t_004_SOURCES) $(t_005_SOURCES) $(t_006_SOURCES) \
$(t_007_SOURCES) $(t_008_SOURCES) $(t_009_SOURCES) \ $(t_007_SOURCES) $(t_008_SOURCES) $(t_009_SOURCES) \
$(am__t_101_SOURCES_DIST) $(t_010_SOURCES) $(am__t_101_SOURCES_DIST)
am__can_run_installinfo = \ am__can_run_installinfo = \
case $$AM_UPDATE_INFO_DIR in \ case $$AM_UPDATE_INFO_DIR in \
n|no|NO) false;; \ n|no|NO) false;; \
@@ -653,7 +659,7 @@ check_SCRIPTS = $(am__append_1) h-003.hawk h-004.hawk h-009.hawk \
h-010.hawk h-011.hawk h-012.hawk h-013.hawk h-014.hawk \ h-010.hawk h-011.hawk h-012.hawk h-013.hawk h-014.hawk \
h-015.hawk h-016.hawk h-017.hawk h-018.hawk h-019.hawk \ h-015.hawk h-016.hawk h-017.hawk h-018.hawk h-019.hawk \
h-020.hawk h-021.hawk h-022.hawk h-023.hawk h-024.hawk \ h-020.hawk h-021.hawk h-022.hawk h-023.hawk h-024.hawk \
regress-filename.sh regress-filename.sh regress-extra-info.sh regress-environ.sh
check_ERRORS = e-001.err check_ERRORS = e-001.err
EXTRA_DIST = $(check_SCRIPTS) $(check_ERRORS) tap.inc err.sh \ EXTRA_DIST = $(check_SCRIPTS) $(check_ERRORS) tap.inc err.sh \
journal-toc.hawk journal-toc.in journal-toc.out journal-toc-html.out \ journal-toc.hawk journal-toc.in journal-toc.out journal-toc-html.out \
@@ -661,6 +667,7 @@ EXTRA_DIST = $(check_SCRIPTS) $(check_ERRORS) tap.inc err.sh \
fs-test.hawk fs-test.in fs-test.out \ fs-test.hawk fs-test.in fs-test.out \
JSON.awk.in JSON.awk.out \ JSON.awk.in JSON.awk.out \
h-024-child.hawk h-024.in \ h-024-child.hawk h-024.in \
run-hawk-test.sh regress-extra-info.sh \
two-way-pipe.hawk two-way-pipe.out two-way-pipe.hawk two-way-pipe.out
t_001_SOURCES = t-001.c tap.h t_001_SOURCES = t-001.c tap.h
@@ -705,6 +712,11 @@ t_009_CPPFLAGS = $(CPPFLAGS_COMMON)
t_009_CFLAGS = $(CFLAGS_COMMON) t_009_CFLAGS = $(CFLAGS_COMMON)
t_009_LDFLAGS = $(LDFLAGS_COMMON) t_009_LDFLAGS = $(LDFLAGS_COMMON)
t_009_LDADD = $(LIBADD_COMMON) t_009_LDADD = $(LIBADD_COMMON)
t_010_SOURCES = t-010.c tap.h
t_010_CPPFLAGS = $(CPPFLAGS_COMMON)
t_010_CFLAGS = $(CFLAGS_COMMON)
t_010_LDFLAGS = $(LDFLAGS_COMMON)
t_010_LDADD = $(LIBADD_COMMON)
@ENABLE_CXX_TRUE@t_101_SOURCES = t-101.cpp tap.h @ENABLE_CXX_TRUE@t_101_SOURCES = t-101.cpp tap.h
@ENABLE_CXX_TRUE@t_101_CPPFLAGS = $(CPPFLAGS_COMMON) @ENABLE_CXX_TRUE@t_101_CPPFLAGS = $(CPPFLAGS_COMMON)
@ENABLE_CXX_TRUE@t_101_CFLAGS = $(CFLAGS_COMMON) @ENABLE_CXX_TRUE@t_101_CFLAGS = $(CFLAGS_COMMON)
@@ -714,13 +726,20 @@ LOG_DRIVER = env AM_TAP_AWK='$(AWK)' $(SHELL) $(top_srcdir)/ac/tap-driver.sh
TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(check_ERRORS) TESTS = $(check_PROGRAMS) $(check_SCRIPTS) $(check_ERRORS)
TEST_EXTENSIONS = .hawk .err .sh TEST_EXTENSIONS = .hawk .err .sh
HAWK_LOG_DRIVER = $(LOG_DRIVER) HAWK_LOG_DRIVER = $(LOG_DRIVER)
HAWK_LOG_COMPILER = $(HAWK_TEST_COMPILER) HAWK_LOG_COMPILER = env \
VALGRIND='$(VALGRIND)' \
VALGRIND_CMD='$(VALGRIND_CMD)' \
VALGRIND_ERROR_EXITCODE='$(VALGRIND_ERROR_EXITCODE)' \
VALGRIND_FLAGS='$(VALGRIND_FLAGS)' \
HAWK_TEST_COMPILER='$(HAWK_TEST_COMPILER)' \
$(SHELL) $(abs_srcdir)/run-hawk-test.sh
AM_HAWK_LOG_FLAGS = -vTDIR=${abs_srcdir} $(HAWK_TEST_MODLIBDIRS_OPT) $(HAWK_CHECK_OPTS) -f AM_HAWK_LOG_FLAGS = -vTDIR=${abs_srcdir} $(HAWK_TEST_MODLIBDIRS_OPT) $(HAWK_CHECK_OPTS) -f
ERR_LOG_DRIVER = $(SHELL) $(top_srcdir)/ac/test-driver ERR_LOG_DRIVER = $(SHELL) $(top_srcdir)/ac/test-driver
ERR_LOG_COMPILER = $(SHELL) $(abs_srcdir)/err.sh ../bin/hawk -vTDIR=${abs_srcdir} --modlibdirs=../lib/.libs:../mod/.libs -f ERR_LOG_COMPILER = $(SHELL) $(abs_srcdir)/err.sh $(HAWK_TEST_COMPILER) -vTDIR=${abs_srcdir} $(HAWK_TEST_MODLIBDIRS_OPT) -f
AM_ERR_LOG_FLAGS = AM_ERR_LOG_FLAGS =
SH_LOG_DRIVER = $(LOG_DRIVER) SH_LOG_DRIVER = $(LOG_DRIVER)
SH_LOG_COMPILER = env HAWK_BIN=$(HAWK_TEST_COMPILER) $(SHELL) SH_LOG_COMPILER = env HAWK_BIN='$(HAWK_TEST_COMPILER)' $(SHELL)
AM_SH_LOG_FLAGS = AM_SH_LOG_FLAGS =
all: all-am all: all-am
@@ -796,6 +815,10 @@ t-009$(EXEEXT): $(t_009_OBJECTS) $(t_009_DEPENDENCIES) $(EXTRA_t_009_DEPENDENCIE
@rm -f t-009$(EXEEXT) @rm -f t-009$(EXEEXT)
$(AM_V_CCLD)$(t_009_LINK) $(t_009_OBJECTS) $(t_009_LDADD) $(LIBS) $(AM_V_CCLD)$(t_009_LINK) $(t_009_OBJECTS) $(t_009_LDADD) $(LIBS)
t-010$(EXEEXT): $(t_010_OBJECTS) $(t_010_DEPENDENCIES) $(EXTRA_t_010_DEPENDENCIES)
@rm -f t-010$(EXEEXT)
$(AM_V_CCLD)$(t_010_LINK) $(t_010_OBJECTS) $(t_010_LDADD) $(LIBS)
t-101$(EXEEXT): $(t_101_OBJECTS) $(t_101_DEPENDENCIES) $(EXTRA_t_101_DEPENDENCIES) t-101$(EXEEXT): $(t_101_OBJECTS) $(t_101_DEPENDENCIES) $(EXTRA_t_101_DEPENDENCIES)
@rm -f t-101$(EXEEXT) @rm -f t-101$(EXEEXT)
$(AM_V_CXXLD)$(t_101_LINK) $(t_101_OBJECTS) $(t_101_LDADD) $(LIBS) $(AM_V_CXXLD)$(t_101_LINK) $(t_101_OBJECTS) $(t_101_LDADD) $(LIBS)
@@ -815,6 +838,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_007-t-007.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_007-t-007.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_008-t-008.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_008-t-008.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_009-t-009.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_009-t-009.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_010-t-010.Po@am__quote@ # am--include-marker
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_101-t-101.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/t_101-t-101.Po@am__quote@ # am--include-marker
$(am__depfiles_remade): $(am__depfiles_remade):
@@ -973,6 +997,20 @@ t_009-t-009.obj: t-009.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(t_009_CPPFLAGS) $(CPPFLAGS) $(t_009_CFLAGS) $(CFLAGS) -c -o t_009-t-009.obj `if test -f 't-009.c'; then $(CYGPATH_W) 't-009.c'; else $(CYGPATH_W) '$(srcdir)/t-009.c'; fi` @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(t_009_CPPFLAGS) $(CPPFLAGS) $(t_009_CFLAGS) $(CFLAGS) -c -o t_009-t-009.obj `if test -f 't-009.c'; then $(CYGPATH_W) 't-009.c'; else $(CYGPATH_W) '$(srcdir)/t-009.c'; fi`
t_010-t-010.o: t-010.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(t_010_CPPFLAGS) $(CPPFLAGS) $(t_010_CFLAGS) $(CFLAGS) -MT t_010-t-010.o -MD -MP -MF $(DEPDIR)/t_010-t-010.Tpo -c -o t_010-t-010.o `test -f 't-010.c' || echo '$(srcdir)/'`t-010.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/t_010-t-010.Tpo $(DEPDIR)/t_010-t-010.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='t-010.c' object='t_010-t-010.o' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(t_010_CPPFLAGS) $(CPPFLAGS) $(t_010_CFLAGS) $(CFLAGS) -c -o t_010-t-010.o `test -f 't-010.c' || echo '$(srcdir)/'`t-010.c
t_010-t-010.obj: t-010.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(t_010_CPPFLAGS) $(CPPFLAGS) $(t_010_CFLAGS) $(CFLAGS) -MT t_010-t-010.obj -MD -MP -MF $(DEPDIR)/t_010-t-010.Tpo -c -o t_010-t-010.obj `if test -f 't-010.c'; then $(CYGPATH_W) 't-010.c'; else $(CYGPATH_W) '$(srcdir)/t-010.c'; fi`
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/t_010-t-010.Tpo $(DEPDIR)/t_010-t-010.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='t-010.c' object='t_010-t-010.obj' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(t_010_CPPFLAGS) $(CPPFLAGS) $(t_010_CFLAGS) $(CFLAGS) -c -o t_010-t-010.obj `if test -f 't-010.c'; then $(CYGPATH_W) 't-010.c'; else $(CYGPATH_W) '$(srcdir)/t-010.c'; fi`
.cpp.o: .cpp.o:
@am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ @am__fastdepCXX_TRUE@ $(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ @am__fastdepCXX_TRUE@ $(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
@@ -1298,6 +1336,13 @@ t-009.log: t-009$(EXEEXT)
--log-file $$b.log --trs-file $$b.trs \ --log-file $$b.log --trs-file $$b.trs \
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \ $(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
"$$tst" $(AM_TESTS_FD_REDIRECT) "$$tst" $(AM_TESTS_FD_REDIRECT)
t-010.log: t-010$(EXEEXT)
@p='t-010$(EXEEXT)'; \
b='t-010'; \
$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
--log-file $$b.log --trs-file $$b.trs \
$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
"$$tst" $(AM_TESTS_FD_REDIRECT)
t-101.log: t-101$(EXEEXT) t-101.log: t-101$(EXEEXT)
@p='t-101$(EXEEXT)'; \ @p='t-101$(EXEEXT)'; \
b='t-101'; \ b='t-101'; \
@@ -1435,6 +1480,7 @@ distclean: distclean-am
-rm -f ./$(DEPDIR)/t_007-t-007.Po -rm -f ./$(DEPDIR)/t_007-t-007.Po
-rm -f ./$(DEPDIR)/t_008-t-008.Po -rm -f ./$(DEPDIR)/t_008-t-008.Po
-rm -f ./$(DEPDIR)/t_009-t-009.Po -rm -f ./$(DEPDIR)/t_009-t-009.Po
-rm -f ./$(DEPDIR)/t_010-t-010.Po
-rm -f ./$(DEPDIR)/t_101-t-101.Po -rm -f ./$(DEPDIR)/t_101-t-101.Po
-rm -f Makefile -rm -f Makefile
distclean-am: clean-am distclean-compile distclean-generic \ distclean-am: clean-am distclean-compile distclean-generic \
@@ -1490,6 +1536,7 @@ maintainer-clean: maintainer-clean-am
-rm -f ./$(DEPDIR)/t_007-t-007.Po -rm -f ./$(DEPDIR)/t_007-t-007.Po
-rm -f ./$(DEPDIR)/t_008-t-008.Po -rm -f ./$(DEPDIR)/t_008-t-008.Po
-rm -f ./$(DEPDIR)/t_009-t-009.Po -rm -f ./$(DEPDIR)/t_009-t-009.Po
-rm -f ./$(DEPDIR)/t_010-t-010.Po
-rm -f ./$(DEPDIR)/t_101-t-101.Po -rm -f ./$(DEPDIR)/t_101-t-101.Po
-rm -f Makefile -rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic maintainer-clean-am: distclean-am maintainer-clean-generic
@@ -1531,9 +1578,14 @@ uninstall-am:
# override these from environment when needed. # override these from environment when needed.
# e.g. # e.g.
# make check HAWK_TEST_COMPILER=../samples/hawk51 HAWK_CHECK_OPTS= # make check HAWK_TEST_COMPILER=../samples/hawk51 HAWK_CHECK_OPTS=
# make check VALGRIND=1
HAWK_TEST_COMPILER ?= ../bin/hawk HAWK_TEST_COMPILER ?= ../bin/hawk
HAWK_TEST_MODLIBDIRS_OPT ?= --modlibdirs=../lib/.libs:../mod/.libs HAWK_TEST_MODLIBDIRS_OPT ?= --modlibdirs=../lib/.libs:../mod/.libs
HAWK_CHECK_OPTS ?= HAWK_CHECK_OPTS ?=
VALGRIND ?= 0
VALGRIND_CMD ?= valgrind
VALGRIND_ERROR_EXITCODE ?= 99
VALGRIND_FLAGS ?= --leak-check=full --show-leak-kinds=all --errors-for-leak-kinds=all --error-exitcode=99 --num-callers=20
# Tell versions [3.59,3.63) of GNU make to not export all variables. # Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded. # Otherwise a system limit (for SysV at least) may be exceeded.
+88
View File
@@ -0,0 +1,88 @@
@echo off
REM if you are two directories down from the top source directory,
REM you may run the command like this:
REM ..\..\t\cmd-tap-driver.cmd -- ..\..\t\run-hawk-test.cmd -f ..\..\t\h-001.hawk
REM -------------------------------------------------------------------------------
REM set HAWK_TEST_COMPILER=Z:\path\to\hawk\bld-mingw64\bin\.libs\hawk.exe
REM Z:\path\to\hawk\t\cmd-tap-driver.cmd --test-name h-011 --log-file h-011.log --trs-file h-011.trs -- Z:\path\to\hawk\t\t\run-hawk-test.cmd -f ..\..\t\h-011.hawk
REM
setlocal EnableExtensions DisableDelayedExpansion
set "test_name="
set "log_file="
set "trs_file="
:parse
if "%~1"=="" goto usage
if "%~1"=="--" goto seen_separator
if "%~1"=="--test-name" goto set_test_name
if "%~1"=="--log-file" goto set_log_file
if "%~1"=="--trs-file" goto set_trs_file
echo ERROR: unknown option %~1 1>&2
goto usage_exit
:set_test_name
if "%~2"=="" goto usage
set "test_name=%~2"
shift
shift
goto parse
:set_log_file
if "%~2"=="" goto usage
set "log_file=%~2"
shift
shift
goto parse
:set_trs_file
if "%~2"=="" goto usage
set "trs_file=%~2"
shift
shift
goto parse
:seen_separator
shift
:run
if "%~1"=="" goto usage
if not defined test_name set "test_name=cmd-test"
if not defined log_file set "log_file=%test_name%.log"
if not defined trs_file set "trs_file=%test_name%.trs"
call %1 %2 %3 %4 %5 %6 %7 %8 %9 >"%log_file%" 2>&1
set "cmd_status=%errorlevel%"
type "%log_file%"
set "result=PASS"
if not "%cmd_status%"=="0" set "result=FAIL"
findstr /b /c:"not ok " "%log_file%" >nul 2>&1
if not errorlevel 1 set "result=FAIL"
findstr /b /c:"1..0 # SKIP" "%log_file%" >nul 2>&1
if not errorlevel 1 set "result=SKIP"
(
echo :test-result: %result%
echo :global-test-result: %result%
echo :recheck: no
echo :copy-in-global-log: no
) >"%trs_file%"
echo %result%: %test_name%
if /i "%result%"=="PASS" exit /b 0
if /i "%result%"=="SKIP" exit /b 0
exit /b 1
:usage
echo Usage: %~nx0 --test-name NAME [--log-file FILE] [--trs-file FILE] -- COMMAND [ARGS...] 1>&2
:usage_exit
exit /b 2
+21 -1
View File
@@ -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
View File
@@ -13,7 +13,7 @@ function on_sig (sig)
function main () function main ()
{ {
@local r; @local r, u;
@local badpid; @local badpid;
g_seen = 0; g_seen = 0;
@@ -84,5 +84,18 @@ function main ()
r = sys::kill(badpid, sys::SIGINT); r = sys::kill(badpid, sys::SIGINT);
tap_ensure (r, sys::RC_ESYSERR, @SCRIPTNAME, @SCRIPTLINE); tap_ensure (r, sys::RC_ESYSERR, @SCRIPTNAME, @SCRIPTLINE);
u = sys::uname();
tap_ensure (hawk::type(u), hawk::VAL_MAP, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (hawk::typename(u.sysname), "str", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (hawk::typename(u.nodename), "str", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (hawk::typename(u.release), "str", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (hawk::typename(u.version), "str", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (hawk::typename(u.machine), "str", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (length(u.sysname) > 0, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (length(u.nodename) > 0, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (length(u.release) > 0, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (length(u.version) > 0, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure (length(u.machine) > 0, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_end (); tap_end ();
} }
+10 -2
View File
@@ -3,7 +3,7 @@
@include "tap.inc"; @include "tap.inc";
BEGIN { BEGIN {
@local v, v2, m, m2, js; @local v, v2, v3, m, m2, js;
v = json::parse("{\"a\":1,\"b\":true,\"c\":null,\"d\":[2,3],\"e\":{\"x\":\"y\"}}"); v = json::parse("{\"a\":1,\"b\":true,\"c\":null,\"d\":[2,3],\"e\":{\"x\":\"y\"}}");
@@ -26,7 +26,6 @@ BEGIN {
m["nested"] = hawk::map(); m["nested"] = hawk::map();
m["nested"]["ok"] = 1; m["nested"]["ok"] = 1;
m["nested"]["note"] = "hello\n\"world\""; m["nested"]["note"] = "hello\n\"world\"";
js = json::stringify(m); js = json::stringify(m);
m2 = json::parse(js); m2 = json::parse(js);
@@ -41,5 +40,14 @@ BEGIN {
tap_ensure(v2.a.b.c, 1, @SCRIPTNAME, @SCRIPTLINE); tap_ensure(v2.a.b.c, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(v2["a"].b["c"], 1, @SCRIPTNAME, @SCRIPTLINE); tap_ensure(v2["a"].b["c"], 1, @SCRIPTNAME, @SCRIPTLINE);
v3 = json::parse("[false,true,null,\"a\\tb\",-12.5]");
tap_ensure(hawk::type(v3), hawk::VAL_ARRAY, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(hawk::type(v3[1]), hawk::VAL_BOOL, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(v3[1], @false, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(v3[2], @true, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(hawk::isnil(v3[3]), 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(v3[4], "a\tb", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(v3[5], -12.5, @SCRIPTNAME, @SCRIPTLINE);
tap_end(); tap_end();
} }
+7
View File
@@ -44,10 +44,17 @@ function main()
{ {
## if PIPCLOEXEC is turned on, the file descriptor created by the shell (3> in run_pipe_test) ## if PIPCLOEXEC is turned on, the file descriptor created by the shell (3> in run_pipe_test)
## doesn't get inherited to the 'cat' commands in the following text ## doesn't get inherited to the 'cat' commands in the following text
@local uname;
uname = sys::uname()
if (uname["sysname"] ~ /Linux|Unix/) {
run_pipe_test("inherit-default", "BEGIN { print \"hello\" | \"cat >&3\" }", "hello\n"); run_pipe_test("inherit-default", "BEGIN { print \"hello\" | \"cat >&3\" }", "hello\n");
run_pipe_test("cloexec-global", "BEGIN { PIPECLOEXEC = 1; print \"hello\" | \"cat >&3\" }", ""); run_pipe_test("cloexec-global", "BEGIN { PIPECLOEXEC = 1; print \"hello\" | \"cat >&3\" }", "");
run_pipe_test("inherit-global-off", "BEGIN { PIPECLOEXEC = 0; print \"hello\" | \"cat >&3\" }", "hello\n");
run_pipe_test("cloexec-pragma", "@pragma pipecloexec on\nBEGIN { print \"hello\" | \"cat >&3\" }", ""); run_pipe_test("cloexec-pragma", "@pragma pipecloexec on\nBEGIN { print \"hello\" | \"cat >&3\" }", "");
} else {
tap_skip("PIPECLOEXEC not relevant");
}
tap_end(); tap_end();
} }
+12
View File
@@ -139,6 +139,18 @@ function main()
tap_ensure(!!@[1], @true, @SCRIPTNAME, @SCRIPTLINE); tap_ensure(!!@[1], @true, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(!dummy, @false, @SCRIPTNAME, @SCRIPTLINE); tap_ensure(!dummy, @false, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(!!dummy, @true, @SCRIPTNAME, @SCRIPTLINE); tap_ensure(!!dummy, @true, @SCRIPTNAME, @SCRIPTLINE);
tmp = 0;
tap_ensure(!tmp && 0, 0, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(!tmp && 1, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(!tmp || 0, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(!tmp || 1, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(1 && !tmp, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(0 || !tmp, 1, @SCRIPTNAME, @SCRIPTLINE);
tmp = 1;
tap_ensure(!tmp && 0, 0, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(!tmp && 1, 0, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(!tmp || 0, 0, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(!tmp || 1, 1, @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(sprintf("%d", @true), "1", @SCRIPTNAME, @SCRIPTLINE); tap_ensure(sprintf("%d", @true), "1", @SCRIPTNAME, @SCRIPTLINE);
tap_ensure(sprintf("%d", @false), "0", @SCRIPTNAME, @SCRIPTLINE); tap_ensure(sprintf("%d", @false), "0", @SCRIPTNAME, @SCRIPTLINE);
+4
View File
@@ -53,5 +53,9 @@ func main() {
a["k"].fn = mul; a["k"].fn = mul;
tap_ensure(a["k"].fn(4, 4), 16, @SCRIPTNAME, @SCRIPTLINE); tap_ensure(a["k"].fn(4, 4), 16, @SCRIPTNAME, @SCRIPTLINE);
a = @[ @{} ];
a[1].sum = add;
tap_ensure(a[1].sum(8, 9), 17, @SCRIPTNAME, @SCRIPTLINE);
tap_end(); tap_end();
} }
+22
View File
@@ -52,6 +52,28 @@ BEGIN {
ARGV[1] = "rrr=300"; ARGV[1] = "rrr=300";
ARGV[2] = "ttt=500"; ARGV[2] = "ttt=500";
} }
else if (CASE == 12)
{
x["abc"] = "donkey";
@reset x;
print (x === @nil);
exit;
}
else if (CASE == 13)
{
ARGV[1] = "x=20";
@reset x;
print (x === @nil);
exit;
}
else if (CASE == 14)
{
ARGV[1] = "x=20";
x["abc"] = "donkey";
@reset x;
print (x === @nil);
exit;
}
} }
{ {
+3
View File
@@ -46,5 +46,8 @@ function main()
run_case(9, "-va=11 -vbb=22 -vccc=33", "dummy", "11 22 33 44 alpha"); run_case(9, "-va=11 -vbb=22 -vccc=33", "dummy", "11 22 33 44 alpha");
run_case(10, "-vqqq=20 -va=11 -vbb=22", "dummy1 dummy2 dummy3", "20 20 30 40 alpha"); run_case(10, "-vqqq=20 -va=11 -vbb=22", "dummy1 dummy2 dummy3", "20 20 30 40 alpha");
run_case(11, "-vqqq=20 -vrrr=30 -vsss=40", "dummy1 dummy2", "20 300 40 500 alpha"); run_case(11, "-vqqq=20 -vrrr=30 -vsss=40", "dummy1 dummy2", "20 300 40 500 alpha");
run_case(12, "", "dummy", "1");
run_case(13, "", "dummy", "1");
run_case(14, "", "dummy", "1");
tap_end(); tap_end();
} }
+197
View File
@@ -0,0 +1,197 @@
#!/bin/sh
[ $# -ge 1 ] && HAWK_BIN="$1"
[ -z "$HAWK_BIN" ] && HAWK_BIN="hawk"
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_pipe="/tmp/hawk-regress-environ-$$.pipe"
tmp_sys="/tmp/hawk-regress-environ-$$.sys"
trap 'rm -f "$tmp_prog" "$tmp_pipe" "$tmp_sys"' EXIT
cat > "$tmp_prog" <<EOF
function emit_env(tag, cmd)
{
cmd = "sh -c 'printf \"" tag ":%s\\n\" \"\${HAWK_TEST_ENV_PIPE-unset}\" >&3'"
print "" | 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 {
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_FLT"]) ":" sprintf("%.2f", ENVIRON["HAWK_TEST_ENV_FLT"]);
print hawk::typename(ENVIRON["HAWK_TEST_ENV_STR"]) ":" ENVIRON["HAWK_TEST_ENV_STR"];
print hawk::typename(ENVIRON["HAWK_TEST_ENV_EMPTY"]) ":" length(ENVIRON["HAWK_TEST_ENV_EMPTY"]);
print hawk::typename(ENVIRON["HAWK_TEST_ENV_MISSING"]) ":" hawk::isnil(ENVIRON["HAWK_TEST_ENV_MISSING"]);
ENVIRON["HAWK_TEST_ENV_NEW"] = 456;
print hawk::typename(ENVIRON["HAWK_TEST_ENV_NEW"]) ":" ENVIRON["HAWK_TEST_ENV_NEW"];
ENVIRON["HAWK_TEST_ENV_NEW"] = 7.5;
print hawk::typename(ENVIRON["HAWK_TEST_ENV_NEW"]) ":" sprintf("%.1f", ENVIRON["HAWK_TEST_ENV_NEW"]);
ENVIRON["HAWK_TEST_ENV_NEW"] = "xyz";
print hawk::typename(ENVIRON["HAWK_TEST_ENV_NEW"]) ":" ENVIRON["HAWK_TEST_ENV_NEW"];
delete ENVIRON["HAWK_TEST_ENV_STR"];
print hawk::typename(ENVIRON["HAWK_TEST_ENV_STR"]) ":" hawk::isnil(ENVIRON["HAWK_TEST_ENV_STR"]);
emit_env("initial");
print emit_env_system("initial");
ENVIRON["HAWK_TEST_ENV_PIPE"] = "changed";
ENVIRON["HAWK_TEST_ENV_SYS"] = "changed";
emit_env("changed");
print emit_env_system("changed");
delete ENVIRON["HAWK_TEST_ENV_PIPE"];
delete ENVIRON["HAWK_TEST_ENV_SYS"];
emit_env("deleted");
print emit_env_system("deleted");
ENVIRON = @{};
ENVIRON["HAWK_TEST_ENV_PIPE"] = "replaced";
ENVIRON["HAWK_TEST_ENV_SYS"] = "replaced";
emit_env("replaced");
print emit_env_system("replaced");
ENVIRON = 123;
emit_env("scalar");
print emit_env_system("scalar");
print emit_env_system_fd3("fd3");
}
EOF
test_no=0
failed=0
ok() {
test_no=$((test_no + 1))
echo "ok $test_no - $1"
}
not_ok() {
test_no=$((test_no + 1))
failed=1
echo "not ok $test_no - $1"
echo "# expected: $2"
echo "# actual: $3"
}
check_eq() {
desc="$1"
expected="$2"
actual="$3"
if [ "x$actual" = "x$expected" ]
then
ok "$desc"
else
not_ok "$desc" "$expected" "$actual"
fi
}
echo "1..28"
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_NEG=-7 \
HAWK_TEST_ENV_FLT=1.25 \
HAWK_TEST_ENV_STR=abc123 \
HAWK_TEST_ENV_EMPTY= \
HAWK_TEST_ENV_PIPE=initial \
HAWK_TEST_ENV_SYS=initial \
"$HAWK_BIN" -f "$tmp_prog" 3>"$tmp_pipe" 2>&1)
then
ok "run environ regression"
else
not_ok "run environ regression" "exit code 0" "command failed: $out"
out=""
fi
line1=$(printf '%s\n' "$out" | sed -n '1p')
line2=$(printf '%s\n' "$out" | sed -n '2p')
line3=$(printf '%s\n' "$out" | sed -n '3p')
line4=$(printf '%s\n' "$out" | sed -n '4p')
line5=$(printf '%s\n' "$out" | sed -n '5p')
line6=$(printf '%s\n' "$out" | sed -n '6p')
line7=$(printf '%s\n' "$out" | sed -n '7p')
line8=$(printf '%s\n' "$out" | sed -n '8p')
line9=$(printf '%s\n' "$out" | sed -n '9p')
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")
pipe2=$(sed -n '2p' "$tmp_pipe")
pipe3=$(sed -n '3p' "$tmp_pipe")
pipe4=$(sed -n '4p' "$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 "negative int env imported as int" "int:-7" "$line2"
check_eq "float env imported as flt" "flt:1.25" "$line3"
check_eq "string env imported as str" "str:abc123" "$line4"
check_eq "empty env imported as empty string" "str:0" "$line5"
check_eq "missing env yields nil" "nil:1" "$line6"
check_eq "assigned int remains int" "int:456" "$line7"
check_eq "assigned float remains flt" "flt:7.5" "$line8"
check_eq "assigned string remains str" "str:xyz" "$line9"
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 in-place env update" "changed:changed" "$pipe2"
check_eq "pipe sees deleted env entry" "deleted:unset" "$pipe3"
check_eq "pipe sees replaced environ map" "replaced:replaced" "$pipe4"
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"
+71
View File
@@ -0,0 +1,71 @@
#!/bin/sh
[ $# -ge 1 ] && HAWK_BIN="$1"
[ -z "$HAWK_BIN" ] && HAWK_BIN="hawk"
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
failed=0
ok() {
test_no=$((test_no + 1))
echo "ok $test_no - $1"
}
not_ok() {
test_no=$((test_no + 1))
failed=1
echo "not ok $test_no - $1"
echo "# expected: $2"
echo "# actual: $3"
}
check_has_line() {
desc="$1"
needle="$2"
haystack="$3"
if printf '%s\n' "$haystack" | grep -F -x "$needle" >/dev/null 2>&1
then
ok "$desc"
else
not_ok "$desc" "$needle" "$haystack"
fi
}
echo "1..7"
if out=$("$HAWK_BIN" -D -vqqq=20 'BEGIN { aa = 10; bb = "hello"; zz = qqq; }' 2>&1 >/dev/null)
then
ok "run with -D"
else
not_ok "run with -D" "exit code 0" "command failed: $out"
out=""
fi
check_has_line "shows nil return" "[RETURN] - ***nil***" "$out"
check_has_line "shows named variable section start" "[NAMED VARIABLES]" "$out"
check_has_line "shows parser-known named variables" "aa = 10" "$out"
check_has_line "shows parser-known string variables" "bb = hello" "$out"
check_has_line "shows values originating from -v assignments" "zz = 20" "$out"
check_has_line "shows named variable section end" "[END OF NAMED VARIABLES]" "$out"
exit "$failed"
+17
View File
@@ -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"
+29
View File
@@ -0,0 +1,29 @@
@echo off
setlocal EnableExtensions EnableDelayedExpansion
if defined HAWK_TEST_COMPILER (
set "hawk_bin=%HAWK_TEST_COMPILER%"
) else (
set "hawk_bin=..\bin\hawk.exe"
)
if defined HAWK_LOG_COMPILER set "hawk_bin=%HAWK_LOG_COMPILER%"
for %%I in ("%hawk_bin%") do (
set "hawk_bin=%%~fI"
set "hawk_dir=%%~dpI"
)
if not "!hawk_dir:\.libs\=!"=="!hawk_dir!" (
for %%I in ("!hawk_dir!..\..\lib\.libs") do (
if exist "%%~fI" set "PATH=%%~fI;!PATH!"
)
)
if defined HAWK_TEST_OPTS (
call "!hawk_bin!" %HAWK_TEST_OPTS% %*
) else (
call "!hawk_bin!" %*
)
exit /b %errorlevel%
+55
View File
@@ -0,0 +1,55 @@
#!/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" ]
then
vglog="/tmp/hawk-valgrind-$$.log"
vgerr="${VALGRIND_ERROR_EXITCODE:-99}"
trap 'rm -f "$vglog"' EXIT
${VALGRIND_CMD:-valgrind} ${VALGRIND_FLAGS:-} --log-file="$vglog" "$hawk_bin" "$@"
status=$?
if [ -f "$vglog" ]
then
awk '
/^==[0-9]+== HEAP SUMMARY:/ { show = 1 }
show { print }
/^==[0-9]+== LEAK SUMMARY:/ { leak = 1; next }
leak && /^==[0-9]+==[[:space:]]*$/ { exit }
' "$vglog" >&2
if [ "$status" -eq 0 ]
then
echo "[VALGRIND] LEAK-FREE" >&2
elif [ "$status" -eq "$vgerr" ]
then
echo "[VALGRIND] LEAK DETECTED OR MEMORY ERROR" >&2
else
echo "[VALGRIND] TEST FAILED (NO VALGRIND LEAK EXIT)" >&2
fi
fi
exit "$status"
else
exec "$hawk_bin" "$@"
fi
+132
View File
@@ -0,0 +1,132 @@
#include <hawk.h>
#include <hawk-utl.h>
#include <stdio.h>
#include <string.h>
#include "tap.h"
#define OK_X(test) OK(test, #test)
static const hawk_bch_t* src =
"BEGIN {"
" aa = 10;"
" bb = 20;"
" @reset bb;"
" cc = 30;"
"}";
static void check_int_value (hawk_rtx_t* rtx, hawk_val_t* v, hawk_int_t expected, const char* name)
{
hawk_int_t lv;
if (!v)
{
OK(0, name);
return;
}
if (hawk_rtx_valtoint(rtx, v, &lv) <= -1)
{
OK(0, name);
return;
}
OK(lv == expected, name);
}
int main ()
{
hawk_t* hawk = HAWK_NULL;
hawk_rtx_t* rtx = HAWK_NULL;
hawk_val_t* retv;
hawk_parsestd_t psin[2];
hawk_rtx_nv_itr_t itr;
hawk_val_t* nv;
hawk_uch_t rt1_name[] = { 'r', 't', '1', '\0' };
int count = 0;
int aa_seen = 0, bb_seen = 0, cc_seen = 0, rt1_seen = 0, rt2_seen = 0;
int ret = -1;
no_plan ();
hawk = hawk_openstd(0, HAWK_NULL);
OK_X(hawk != HAWK_NULL);
if (!hawk) goto oops;
memset (psin, 0, HAWK_SIZEOF(psin));
psin[0].type = HAWK_PARSESTD_BCS;
psin[0].u.bcs.ptr = (hawk_bch_t*)src;
psin[0].u.bcs.len = hawk_count_bcstr(src);
psin[1].type = HAWK_PARSESTD_NULL;
OK_X(hawk_parsestd(hawk, psin, HAWK_NULL) >= 0);
rtx = hawk_rtx_openstd(hawk, 0, HAWK_T("t-010"), HAWK_NULL, HAWK_NULL, HAWK_NULL);
OK_X(rtx != HAWK_NULL);
if (!rtx) goto oops;
OK_X(hawk_rtx_setgbltostrbyname(rtx, HAWK_T("rt1"), HAWK_T("40")) >= 0);
OK_X(hawk_rtx_setgbltostrbyname(rtx, HAWK_T("rt2"), HAWK_T("50")) >= 0);
retv = hawk_rtx_loop(rtx);
OK_X(retv != HAWK_NULL);
if (!retv) goto oops;
hawk_rtx_refdownval(rtx, retv);
check_int_value(rtx, hawk_rtx_findnvbybcstr(rtx, "aa"), 10, "find aa by bcstr");
OK_X(hawk_rtx_findnvbybcstr(rtx, "bb") != HAWK_NULL);
OK_X(hawk_rtx_isnilval(rtx, hawk_rtx_findnvbybcstr(rtx, "bb")));
check_int_value(rtx, hawk_rtx_findnvbybcstr(rtx, "cc"), 30, "find cc by bcstr");
check_int_value(rtx, hawk_rtx_findnvbyucstr(rtx, rt1_name), 40, "find rt1 by ucstr");
check_int_value(rtx, hawk_rtx_findnvbybcstr(rtx, "rt2"), 50, "find rt2 by bcstr");
OK_X(hawk_rtx_findnvbybcstr(rtx, "missing") == HAWK_NULL);
hawk_init_rtx_nv_itr(&itr);
for (nv = hawk_rtx_getfirstnv(rtx, &itr); nv; nv = hawk_rtx_getnextnv(rtx, &itr))
{
count++;
if (hawk_comp_oochars_bcstr(itr.name.ptr, itr.name.len, "aa", 0) == 0)
{
aa_seen = 1;
check_int_value(rtx, nv, 10, "iterate aa");
}
else if (hawk_comp_oochars_bcstr(itr.name.ptr, itr.name.len, "bb", 0) == 0)
{
bb_seen = 1;
OK_X(hawk_rtx_isnilval(rtx, nv));
}
else if (hawk_comp_oochars_bcstr(itr.name.ptr, itr.name.len, "cc", 0) == 0)
{
cc_seen = 1;
check_int_value(rtx, nv, 30, "iterate cc");
}
else if (hawk_comp_oochars_bcstr(itr.name.ptr, itr.name.len, "rt1", 0) == 0)
{
rt1_seen = 1;
check_int_value(rtx, nv, 40, "iterate rt1");
}
else if (hawk_comp_oochars_bcstr(itr.name.ptr, itr.name.len, "rt2", 0) == 0)
{
rt2_seen = 1;
check_int_value(rtx, nv, 50, "iterate rt2");
}
else
{
OK(0, "unexpected named variable in iterator");
}
}
OK_X(count == 5);
OK_X(aa_seen == 1);
OK_X(bb_seen == 1);
OK_X(cc_seen == 1);
OK_X(rt1_seen == 1);
OK_X(rt2_seen == 1);
ret = 0;
oops:
if (rtx) hawk_rtx_close(rtx);
if (hawk) hawk_close(hawk);
return (ret == 0)? exit_status(): -1;
}