Commit 906702e5c35aa4304b791c479da9d2bf38548e48

Thomas de Grivel 2025-03-23T13:11:36

wip kc3s

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=""
+TEST_COLOR_OK=""
+TEST_COLOR_RESET=""
+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