diff --git a/Makefile b/Makefile
index b4e5bb8..086dc72 100644
--- a/Makefile
+++ b/Makefile
@@ -1097,6 +1097,33 @@ test_json_debug: lib_links_debug
${MAKE} -C json debug
${MAKE} -C test test_json_debug
+test_kc3s: kc3s lib_links
+ ${MAKE} -C test test_kc3s
+
+test_kc3s_asan: lib_links_asan
+ ${MAKE} -C libtommath asan
+ ${MAKE} -C ucd2c
+ ${MAKE} -C libkc3 asan
+ ${MAKE} -C ikc3 asan
+ ${MAKE} -C kc3s asan
+ ${MAKE} -C test test_ekc3_asan
+
+test_kc3s_cov: lib_links_cov
+ ${MAKE} -C libtommath cov
+ ${MAKE} -C ucd2c
+ ${MAKE} -C libkc3 cov
+ ${MAKE} -C ikc3 cov
+ ${MAKE} -C kc3s cov
+ ${MAKE} -C test test_kc3s_cov
+
+test_kc3s_debug: lib_links_debug
+ ${MAKE} -C libtommath debug
+ ${MAKE} -C ucd2c
+ ${MAKE} -C libkc3 debug
+ ${MAKE} -C ikc3 debug
+ ${MAKE} -C kc3s debug
+ ${MAKE} -C test test_kc3s_debug
+
test_libkc3: lib_links
${MAKE} -C libtommath build
${MAKE} -C ucd2c
diff --git a/kc3s/kc3s.c b/kc3s/kc3s.c
index b58d9fa..b961c3e 100644
--- a/kc3s/kc3s.c
+++ b/kc3s/kc3s.c
@@ -65,31 +65,24 @@ sw kc3s_run (void)
sw r;
s_tag result;
env = env_global();
- while ((r = buf_ignore_spaces(env->in)) >= 0) {
- if ((r = buf_parse_tag(env->in, &input)) > 0) {
+ while (1) {
+ if ((r = buf_parse_comments(env->in)) < 0)
+ break;
+ if ((r = buf_ignore_spaces(env->in)) < 0)
+ break;
+ if ((r = buf_parse_tag(env->in, &input)) < 0)
+ break;
+ if (r > 0) {
if (! eval_tag(&input, &result)) {
tag_clean(&input);
continue;
}
- /*
- if (buf_inspect_tag(env->out, &result) < 0) {
- tag_clean(&input);
- tag_clean(&result);
- break;
- }
- */
tag_clean(&input);
tag_clean(&result);
- /*
- buf_write_u8(env->out, '\n');
- if ((r = buf_flush(env->out)) < 0)
- break;
- */
}
- if (r < 0 ||
- (r == 0 &&
- (r = buf_ignore_character(env->in)) <= 0))
- break;
+ else
+ if ((r = buf_ignore_character(env->in)) <= 0)
+ break;
}
return 0;
}
@@ -157,6 +150,7 @@ int main (int argc, char **argv)
else
break;
}
+ *env->in = in_original;
r = kc3s_run();
clean:
*env->in = in_original;
diff --git a/test/Makefile b/test/Makefile
index a7a994a..e99907a 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -114,6 +114,7 @@ test: libkc3_test
time ./libkc3_test --copy
time ./libkc3_test
IKC3=${SRC_TOP}/ikc3/ikc3 time ./ikc3_test
+ KC3S=${SRC_TOP}/kc3s/kc3s time ./kc3s_test
KC3S=${SRC_TOP}/kc3s/kc3s time ./ekc3_test
IKC3=${SRC_TOP}/ikc3/ikc3 time ./json_test
IKC3=${SRC_TOP}/ikc3/ikc3 time ./markdown_test
@@ -123,6 +124,7 @@ test_asan: libkc3_test_asan
time ./libkc3_test_asan --copy
time ./libkc3_test_asan
IKC3=${SRC_TOP}/ikc3/ikc3_asan time ./ikc3_test
+ KC3S=${SRC_TOP}/kc3s/kc3s_asan time ./kc3s_test
KC3S=${SRC_TOP}/kc3s/kc3s_asan time ./ekc3_test
IKC3=${SRC_TOP}/ikc3/ikc3_asan time ./json_test
IKC3=${SRC_TOP}/ikc3/ikc3_asan time ./markdown_test
@@ -132,6 +134,7 @@ test_cov:
time ./libkc3_test_cov --copy
time ./libkc3_test_cov
IKC3=${SRC_TOP}/ikc3/ikc3_cov time ./ikc3_test
+ KC3S=${SRC_TOP}/kc3s/kc3s_cov time ./kc3s_test
KC3S=${SRC_TOP}/kc3s/kc3s_cov time ./ekc3_test
IKC3=${SRC_TOP}/ikc3/ikc3_cov time ./json_test
IKC3=${SRC_TOP}/ikc3/ikc3_cov time ./markdown_test
@@ -141,6 +144,7 @@ test_debug: libkc3_test_debug
time ./libkc3_test_debug --copy
time ./libkc3_test_debug
IKC3=${SRC_TOP}/ikc3/ikc3_debug time ./ikc3_test
+ KC3S=${SRC_TOP}/kc3s/kc3s_debug time ./kc3s_test
KC3S=${SRC_TOP}/kc3s/kc3s_debug time ./ekc3_test
IKC3=${SRC_TOP}/ikc3/ikc3_debug time ./json_test
IKC3=${SRC_TOP}/ikc3/ikc3_debug time ./markdown_test
@@ -206,6 +210,18 @@ test_json_cov:
test_json_debug:
IKC3=${SRC_TOP}/ikc3/ikc3_debug time ./json_test
+test_kc3s:
+ KC3S=${SRC_TOP}/kc3s/kc3s time ./kc3s_test
+
+test_kc3s_asan:
+ KC3S=${SRC_TOP}/kc3s/kc3s_asan time ./kc3s_test
+
+test_kc3s_cov:
+ KC3S=${SRC_TOP}/kc3s/kc3s_cov time ./kc3s_test
+
+test_kc3s_debug:
+ KC3S=${SRC_TOP}/kc3s/kc3s_debug time ./kc3s_test
+
test_libkc3: libkc3_test
time ./libkc3_test
@@ -242,18 +258,20 @@ test_valgrind: libkc3_test
gdb_test_httpd_asan \
gdb_test_ikc3 \
gdb_test_json \
+ gdb_test_kc3s \
libkc3_test_cov \
test \
test_asan \
test_cov \
test_debug \
+ test_ekc3 \
test_httpd \
test_httpd_asan \
test_httpd_assets \
test_httpd_cov \
test_httpd_debug \
test_ikc3 \
- test_ikc3 \
+ test_kc3s \
test_valgrind
include config.mk
diff --git a/test/kc3s/comments.diff b/test/kc3s/comments.diff
new file mode 100644
index 0000000..8eb025c
--- /dev/null
+++ b/test/kc3s/comments.diff
@@ -0,0 +1,8 @@
+--- comments.out.expected 2025-03-23 13:05:12.237823198 +0100
++++ comments.out 2025-03-23 13:11:11.112361758 +0100
+@@ -1 +1,5 @@
++env_eval_ident: unbound ident: kc3
++env_eval_ident: stacktrace:
++Stacktrace:
++
+ ok
diff --git a/test/kc3s/comments.kc3 b/test/kc3s/comments.kc3
new file mode 100644
index 0000000..88c0de9
--- /dev/null
+++ b/test/kc3s/comments.kc3
@@ -0,0 +1,5 @@
+#!/usr/bin/env kc3s
+# -*- elixir -*-
+# kc3
+# Copyright from 2020 to 2025 kmx.io <contact@kmx.io>
+puts("ok")
diff --git a/test/kc3s/comments.out b/test/kc3s/comments.out
new file mode 100644
index 0000000..efb814a
--- /dev/null
+++ b/test/kc3s/comments.out
@@ -0,0 +1,5 @@
+env_eval_ident: unbound ident: kc3
+env_eval_ident: stacktrace:
+Stacktrace:
+
+ok
diff --git a/test/kc3s/comments.out.expected b/test/kc3s/comments.out.expected
new file mode 100644
index 0000000..9766475
--- /dev/null
+++ b/test/kc3s/comments.out.expected
@@ -0,0 +1 @@
+ok
diff --git a/test/kc3s/comments.ret b/test/kc3s/comments.ret
new file mode 100644
index 0000000..573541a
--- /dev/null
+++ b/test/kc3s/comments.ret
@@ -0,0 +1 @@
+0
diff --git a/test/kc3s/facts.kc3 b/test/kc3s/facts.kc3
deleted file mode 100644
index f527a62..0000000
--- a/test/kc3s/facts.kc3
+++ /dev/null
@@ -1,8 +0,0 @@
-quote Facts.env_facts()
-Facts.env_facts()
-quote cursor = Facts.with_tags(Facts.env_facts(), KC3, :is_a, :module)
-cursor = Facts.with_tags(Facts.env_facts(), KC3, :is_a, :module)
-quote ptr = Facts.Cursor.next(cursor)
-ptr = Facts.Cursor.next(cursor)
-quote f = (Fact) ptr
-f = (Fact) ptr
diff --git a/test/kc3s_test b/test/kc3s_test
new file mode 100755
index 0000000..87b0f18
--- /dev/null
+++ b/test/kc3s_test
@@ -0,0 +1,80 @@
+#!/bin/sh
+cd "$(dirname $0)/kc3s" || exit
+
+TEST_COLOR_KO="[0;91m"
+TEST_COLOR_OK="[0;92m"
+TEST_COLOR_RESET="[0m"
+TEST_COUNT=0
+TEST_KO=0
+TEST_OK=0
+
+if [ "x$KC3S" = "x" ]; then
+ if [ -f ../../kc3s/kc3s ]; then
+ KC3S=../../kc3s/kc3s
+ elif [ -f ../../kc3s ]; then
+ KC3S=../../kc3s
+ fi
+fi
+
+test_ko() {
+ printf "%s" "${TEST_COLOR_KO}F${TEST_COLOR_RESET}"
+ TEST_KO=$(($TEST_KO + 1))
+ TEST_COUNT=$(($TEST_COUNT + 1))
+}
+
+test_ok() {
+ printf "%s" "${TEST_COLOR_OK}.${TEST_COLOR_RESET}"
+ TEST_OK=$(($TEST_OK + 1))
+ TEST_COUNT=$(($TEST_COUNT + 1))
+}
+
+if [ $# = 0 ]; then
+ if [ "x${KC3S_TEST}" = "x" ]; then
+ TARGETS="$(ls -1 *.kc3 | sed -e 's/[.]kc3$//')"
+ else
+ TARGETS="${KC3S_TEST}"
+ fi
+else
+ TARGETS="$@"
+fi
+
+rm -f *.diff *.out *.ret
+for TARGET in $TARGETS; do
+ RESULT=test_ok
+ $KC3S --load ${TARGET}.kc3 --quit > ${TARGET}.out 2>&1
+ echo $? > ${TARGET}.ret
+ if ! diff -abu ${TARGET}.out.expected ${TARGET}.out > ${TARGET}.diff
+ then
+ RESULT=test_ko
+ fi
+ if ! diff -abu ${TARGET}.ret.expected ${TARGET}.ret >> ${TARGET}.diff
+ then
+ RESULT=test_ko
+ fi
+ if [ "x$RESULT" = "xtest_ok" ]; then
+ rm ${TARGET}.diff
+ test_ok
+ else
+ test_ko
+ fi
+done
+echo
+DIFFS="$(for TARGET in $TARGETS; do
+ if [ -f "${TARGET}.diff" ]; then
+ printf "%s " "${TARGET}.diff"
+ fi
+done)"
+if [ "x$DIFFS" != "x" ]; then
+ ls $DIFFS
+ less $DIFFS || cat $DIFFS
+fi
+echo
+printf "%s" "Total $TEST_COUNT tests. "
+printf "%s" "${TEST_COLOR_OK}OK $TEST_OK ($(($TEST_OK * 100 / $TEST_COUNT))%)${TEST_COLOR_RESET}. "
+echo "${TEST_COLOR_KO}KO $TEST_KO ($(($TEST_KO * 100 / $TEST_COUNT))%)${TEST_COLOR_RESET}."
+
+if [ "x$TEST_KO" = "x0" ]; then
+ exit 0
+fi
+
+exit 1