diff --git a/.gitignore b/.gitignore
index 90524b6..b2010eb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -25,6 +25,10 @@ current_test
*.dll
.DS_Store
*.exe
+fs/fuse/mount_kc3fs
+fs/fuse/mount_kc3fs_asan
+fs/fuse/mount_kc3fs_cov
+fs/fuse/mount_kc3fs_debug
*.gcno
*.html
httpd.log
diff --git a/.ikc3_history b/.ikc3_history
index 3e43f5c..b28e400 100644
--- a/.ikc3_history
+++ b/.ikc3_history
@@ -1,12 +1,3 @@
-points[0]
-points[1]
-points[2]
-points[3]
-points
-points = [{(F128) 0, (F128) 1}, {(F128) 0.5, (F128) 0.6}]
-points
-points[3]
-points[0]
points[1]
points[2]
"#{(F128) 0.0}"
@@ -97,3 +88,12 @@ w = Gtk4.Window.new()
Gtk4.Window.present(w)
Gtk4.main()
ncpu
+100000000000000000000000000000000000 + 200000000000000000000000000000000
+type(100000000000000000000000000000000000)
+type(10)
+git log | grep jeremy
+9 +i 2
+9 +i 2 + 3
+9 +i 2 + 3 +i 5
+Parse.tag("%Time{}")
+Parse.tag("%Time{tv_sec: 1, tv_nsec: 2}")
diff --git a/Makefile b/Makefile
index 057df48..6d4a63a 100644
--- a/Makefile
+++ b/Makefile
@@ -27,6 +27,7 @@ all:
${MAKE} -C test all
${MAKE} -C window all
${MAKE} -C gtk4 all
+ ${MAKE} -C fs all
include config.mk
include sources.mk
@@ -47,6 +48,7 @@ asan:
${MAKE} -C test asan
${MAKE} -C window asan
${MAKE} -C gtk4 asan
+ ${MAKE} -C fs asan
assets:
make -C test/httpd/assets
@@ -68,6 +70,7 @@ build:
${MAKE} -C test build
${MAKE} -C window build
${MAKE} -C gtk4 build
+ ${MAKE} -C fs build
clean:
${MAKE} -C libtommath clean
@@ -85,6 +88,7 @@ clean:
${MAKE} -C test clean
${MAKE} -C window clean
${MAKE} -C gtk4 clean
+ ${MAKE} -C fs clean
clean_cov:
${MAKE} -C libtommath clean_cov
@@ -101,6 +105,7 @@ clean_cov:
${MAKE} -C test clean_cov
${MAKE} -C window clean_cov
${MAKE} -C gtk4 clean_cov
+ ${MAKE} -C fs clean_cov
cov:
${MAKE} gen
@@ -118,6 +123,7 @@ cov:
${MAKE} -C test cov
${MAKE} -C window cov
${MAKE} -C gtk4 cov
+ ${MAKE} -C fs cov
debug:
${MAKE} -C libtommath debug
@@ -135,6 +141,7 @@ debug:
${MAKE} -C test debug
${MAKE} -C window debug
${MAKE} -C gtk4 debug
+ ${MAKE} -C fs debug
demo: build
${MAKE} -C window demo
@@ -178,6 +185,7 @@ distclean:
${MAKE} -C test distclean
${MAKE} -C window distclean
${MAKE} -C gtk4 distclean
+ ${MAKE} -C fs distclean
ekc3:
${MAKE} -C libtommath build
@@ -271,6 +279,8 @@ gcovr:
${MAKE} -C httpd gcovr
${MAKE} -C test gcovr
${MAKE} -C window gcovr
+ ${MAKE} -C gtk4 gcovr
+ ${MAKE} -C fs gcovr
if [ -d "$$HOME/Downloads/kc3_gcovr" ]; then bin/gcovr-to-downloads; fi
gdb_demo:
@@ -548,6 +558,8 @@ install:
${MAKE} -C http install
${MAKE} -C httpd install
${MAKE} -C window install
+ ${MAKE} -C gtk4 install
+ ${MAKE} -C fs install
json:
${MAKE} -C libtommath build
diff --git a/fs/Makefile b/fs/Makefile
new file mode 100644
index 0000000..22bcc82
--- /dev/null
+++ b/fs/Makefile
@@ -0,0 +1,55 @@
+## kc3
+## Copyright 2022-2024 kmx.io <contact@kmx.io>
+##
+## Permission is hereby granted to use this software granted the above
+## copyright notice and this permission paragraph are included in all
+## copies and substantial portions of this software.
+##
+## THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+## PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+## AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+## THIS SOFTWARE.
+
+build: fuse
+
+all:
+ ${MAKE} build
+ ${MAKE} debug
+
+fuse:
+ ${MAKE} -C fuse
+
+fuse_asan:
+ ${MAKE} -C fuse asan
+
+clean:
+ ${MAKE} -C fuse clean
+
+clean_cov:
+ ${MAKE} -C fuse clean_cov
+
+cov:
+ ${MAKE} -C fuse cov
+
+debug:
+ ${MAKE} -C fuse debug
+
+distclean:
+ ${MAKE} -C fuse distclean
+
+gcovr:
+ ${MAKE} -C fuse gcovr
+
+install:
+ ${MAKE} -C fuse install
+
+.PHONY: \
+ all \
+ asan \
+ clean \
+ clean_cov \
+ cov \
+ debug \
+ distclean \
+ fuse \
+ install
diff --git a/fs/configure b/fs/configure
new file mode 100755
index 0000000..007fc97
--- /dev/null
+++ b/fs/configure
@@ -0,0 +1,23 @@
+#!/bin/sh
+## kc3
+## Copyright 2022-2024 kmx.io <contact@kmx.io>
+##
+## Permission is hereby granted to use this software granted the above
+## copyright notice and this permission paragraph are included in all
+## copies and substantial portions of this software.
+##
+## THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+## PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+## AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+## THIS SOFTWARE.
+
+set -e
+
+echo "$PWD/configure"
+
+export SRC_TOP="$(dirname "$PWD")"
+
+. ../config.subr
+
+config_subdirs \
+ fuse
diff --git a/fs/fuse/Makefile b/fs/fuse/Makefile
new file mode 100644
index 0000000..1bb38b7
--- /dev/null
+++ b/fs/fuse/Makefile
@@ -0,0 +1,73 @@
+## kc3
+## Copyright 2022-2024 kmx.io <contact@kmx.io>
+##
+## Permission is hereby granted to use this software granted the above
+## copyright notice and this permission paragraph are included in all
+## copies and substantial portions of this software.
+##
+## THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+## PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+## AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+## THIS SOFTWARE.
+
+CLEANFILES = *.a mount_kc3fs mount_kc3fs_asan mount_kc3fs_cov mount_kc3fs_debug *.css *.gcno *.html *.o .libs *.lo
+
+CLEANFILES_COV = *.css *.gcda *.html .libs/*.gcda
+CLEANFILES += ${CLEANFILES_COV}
+
+DISTCLEANFILES = ${CLEANFILES} config.mk
+
+all:
+ ${MAKE} build
+ if ${HAVE_GCOV}; then ${MAKE} cov; fi
+ ${MAKE} debug
+ if ${HAVE_ASAN}; then ${MAKE} asan; fi
+
+build: mount_kc3fs
+
+asan: mount_kc3fs_asan
+
+clean:
+ rm -rf ${CLEANFILES}
+
+clean_cov:
+ rm -rf ${CLEANFILES_COV}
+
+cov: mount_kc3fs_cov
+
+debug: mount_kc3fs_debug
+
+distclean:
+ rm -rf ${DISTCLEANFILES}
+
+gcovr:
+ gcovr --gcov-executable ${GCOV} --html-details kc3fs.html
+
+gdb_kc3fs: debug
+ if [ -f kc3fs_debug.core ]; then gdb .libs/kc3fs_debug kc3fs_debug.core; else gdb .libs/kc3fs_debug; fi
+
+gdb_kc3fs_asan: asan
+ if [ -f kc3fs_debug.core ]; then gdb .libs/kc3fs_asan kc3fs_asan.core; else gdb .libs/kc3fs_asan; fi
+
+install:
+ mkdir -p ${prefix}/bin
+ install -m 755 .libs/mount_kc3fs ${prefix}/bin/mount_kc3fs
+
+lldb_kc3fs: debug
+ if [ -f kc3fs_debug.core ]; then lldb .libs/kc3fs_debug kc3fs_debug.core; else lldb .libs/kc3fs_debug; fi
+
+.PHONY: \
+ all \
+ asan \
+ clean \
+ clean_cov \
+ cov \
+ debug \
+ distclean \
+ gdb_kc3fs \
+ install \
+ lldb_kc3fs \
+ update_sources \
+
+include config.mk
+include sources.mk
diff --git a/fs/fuse/configure b/fs/fuse/configure
new file mode 100755
index 0000000..82b4ea7
--- /dev/null
+++ b/fs/fuse/configure
@@ -0,0 +1,123 @@
+#!/bin/sh
+## kc3
+## Copyright 2022-2024 kmx.io <contact@kmx.io>
+##
+## Permission is hereby granted to use this software granted the above
+## copyright notice and this permission paragraph are included in all
+## copies and substantial portions of this software.
+##
+## THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+## PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+## AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+## THIS SOFTWARE.
+
+set -e
+
+echo "$PWD/configure"
+
+export SRC_TOP="$(dirname "$(dirname "$PWD")")"
+
+CONFIG_H_PREFIX=KC3_FS_
+
+. ../../config.subr
+
+PROG=mount_kc3fs
+PROG_ASAN=mount_kc3fs_asan
+PROG_COV=mount_kc3fs_cov
+PROG_DEBUG=mount_kc3fs_debug
+
+. ./sources.sh
+
+# Common config for all targets
+CPPFLAGS="-I../.. $CPPFLAGS"
+CFLAGS="$CFLAGS -W -Wall -Werror -std=c11 -pedantic -fPIC -pthread"
+config_asan
+config_gnu
+config_i386
+config_win32
+pkg_config libbsd-overlay
+pkg_config libffi
+pkg_config libmd
+pkg_config fuse
+config_lib libmd -lmd 2>/dev/null
+config_lib dl -ldl 2>/dev/null
+if ! $HAVE_WIN32; then
+ LDFLAGS="$LDFLAGS -rdynamic"
+fi
+LIBS="$LIBS"
+
+update_config_h
+
+# Sources
+OBJECTS="$(c2ext .main.lo "$SOURCES")"
+echo "OBJECTS = $OBJECTS" >> ${CONFIG_MK}
+
+OBJECTS_ASAN="$(c2ext .asan.lo "$SOURCES")"
+echo "OBJECTS_ASAN = $OBJECTS_ASAN" >> ${CONFIG_MK}
+
+OBJECTS_COV="$(c2ext .cov.lo "$SOURCES")"
+echo "OBJECTS_COV = $OBJECTS_COV" >> ${CONFIG_MK}
+
+OBJECTS_DEBUG="$(c2ext .debug.lo "$SOURCES")"
+echo "OBJECTS_DEBUG = $OBJECTS_DEBUG" >> ${CONFIG_MK}
+
+# Asan config
+CPPFLAGS_ASAN="$CPPFLAGS"
+CFLAGS_ASAN="$CFLAGS -DDEBUG -O1 -g"
+CFLAGS_ASAN="$CFLAGS_ASAN -fsanitize=address -fno-omit-frame-pointer"
+LDFLAGS_ASAN="$LDFLAGS"
+LIBKC3_ASAN=../../libkc3/libkc3_asan.la
+LOCAL_LIBS_ASAN="$LIBKC3_ASAN"
+LIBS_ASAN="$LOCAL_LIBS_ASAN $LIBS"
+
+# Coverage config
+CPPFLAGS_COV="$CPPFLAGS"
+FLAGS_COV="$CFLAGS -fprofile-arcs -ftest-coverage"
+LDFLAGS_COV="$LDFLAGS --coverage"
+LIBKC3_COV=../../libkc3/libkc3_cov.la
+LOCAL_LIBS_COV="$LIBKC3_COV"
+LIBS_COV="$LOCAL_LIBS_COV $LIBS -lgcov"
+
+# Debug config
+CPPFLAGS_DEBUG="$CPPFLAGS"
+CFLAGS_DEBUG="$CFLAGS -DDEBUG -O0 -g"
+LDFLAGS_DEBUG="$LDFLAGS"
+LIBKC3_DEBUG=../../libkc3/libkc3_debug.la
+LOCAL_LIBS_DEBUG="$LIBKC3_DEBUG"
+LIBS_DEBUG="$LOCAL_LIBS_DEBUG $LIBS"
+
+# Main config
+DEFAULT_CFLAGS="-O2 -fPIC"
+if [ "x$ENV_CFLAGS" = "x" ]; then
+ CFLAGS="$CFLAGS $DEFAULT_CFLAGS"
+fi
+CFLAGS="$CFLAGS -DNDEBUG"
+LIBKC3=../../libkc3/libkc3.la
+LOCAL_LIBS="$LIBKC3"
+LIBS="$LOCAL_LIBS $LIBS"
+
+echo "HAVE_ASAN = $HAVE_ASAN" >> ${CONFIG_MK}
+echo "CPPFLAGS = $CPPFLAGS" >> ${CONFIG_MK}
+echo "CFLAGS = $CFLAGS" >> ${CONFIG_MK}
+echo "LDFLAGS = $LDFLAGS" >> ${CONFIG_MK}
+echo "LIBS = $LIBS" >> ${CONFIG_MK}
+echo >> ${CONFIG_MK}
+echo "CFLAGS_ASAN = $CFLAGS_ASAN" >> ${CONFIG_MK}
+echo "LDFLAGS_ASAN = $LDFLAGS_ASAN" >> ${CONFIG_MK}
+echo "LIBS_ASAN = $LIBS_ASAN" >> ${CONFIG_MK}
+echo >> ${CONFIG_MK}
+echo "CFLAGS_COV = $CFLAGS_COV" >> ${CONFIG_MK}
+echo "LDFLAGS_COV = $LDFLAGS_COV" >> ${CONFIG_MK}
+echo "LIBS_COV = $LIBS_COV" >> ${CONFIG_MK}
+echo >> ${CONFIG_MK}
+echo "CFLAGS_DEBUG = $CFLAGS_DEBUG" >> ${CONFIG_MK}
+echo "LDFLAGS_DEBUG = $LDFLAGS_DEBUG" >> ${CONFIG_MK}
+echo "LIBS_DEBUG = $LIBS_DEBUG" >> ${CONFIG_MK}
+
+update_build
+update_build_prog
+
+build_lo
+build_prog
+
+update_config_mk
diff --git a/fs/fuse/mount_kc3fs.c b/fs/fuse/mount_kc3fs.c
new file mode 100644
index 0000000..e562dba
--- /dev/null
+++ b/fs/fuse/mount_kc3fs.c
@@ -0,0 +1,237 @@
+/* kc3
+ * Copyright 2022,2023,2024 kmx.io <contact@kmx.io>
+ *
+ * Permission is hereby granted to use this software granted the above
+ * copyright notice and this permission paragraph are included in all
+ * copies and substantial portions of this software.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+ * PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+ * AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+#include <errno.h>
+#include <fuse.h>
+#include <string.h>
+#include <libkc3/kc3.h>
+#include "types.h"
+
+static int fs_readdir (const char *path, void *data,
+ fuse_fill_dir_t fill_dir, off_t offset,
+ struct fuse_file_info *file_info);
+static int fs_read (const char *path, char *buf, size_t size,
+ off_t offset, struct fuse_file_info *file_info);
+static int fs_open (const char *path, struct fuse_file_info *ffi);
+static int fs_getattr (const char *path, struct stat *st);
+
+static s_facts *g_facts = NULL;
+
+static const struct fuse_operations g_fsops = {
+ .readdir = fs_readdir,
+ .read = fs_read,
+ .open = fs_open,
+ .getattr = fs_getattr,
+};
+
+static const char g_readme_md[] =
+ "# KC3 FUSE filesystem example\n"
+ "\n"
+ "This is an example of filesystem implementation in C11\n"
+ "using FUSE from OpenBSD 7.6 and libkc3 v0.1.14\n"
+ "\n"
+ "There is a small memory filesystem containing this file.\n"
+ "\n"
+ "## License\n"
+ "kc3\n"
+ "Copyright 2022,2023,2024 kmx.io <contact@kmx.io>\n"
+ "\n"
+ "Permission is hereby granted to use this software granted the\n"
+ "above copyright notice and this permission paragraph are\n"
+ "included in all copies and substantial portions of this\n"
+ "software.\n"
+ "\n"
+ "THIS SOFTWARE IS PROVIDED \"AS-IS\" WITHOUT ANY GUARANTEE OF\n"
+ "PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE\n"
+ "AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF\n"
+ "THIS SOFTWARE.\n";
+
+static const s_sym *g_sym_FileStat = NULL;
+static const s_sym *g_sym_kc3fs_file_stat = NULL;
+
+static int fs_readdir (const char *path, void *data, fuse_fill_dir_t fill_dir,
+ off_t offset, struct fuse_file_info *file_info)
+{
+ (void) offset;
+ (void) file_info;
+ if (strcmp(path, "/"))
+ return -ENOENT;
+ fill_dir(data, ".", NULL, 0);
+ fill_dir(data, "..", NULL, 0);
+ fill_dir(data, "README.md", NULL, 0);
+ return 0;
+}
+
+static int fs_read (const char *path, char *buf, size_t size,
+ off_t offset, struct fuse_file_info *file_info)
+{
+ int len;
+ s_str path_str;
+ (void) file_info;
+ str_init_1(&path_str, NULL, path);
+ if (true) {
+ err_write_1("fs_read: ");
+ err_inspect_str(&path_str);
+ err_write_1("\n");
+ }
+ if (strncmp(path, "/README.md", path_str.size))
+ return -ENOENT;
+ len = strlen(g_readme_md);
+ if (offset < len) {
+ if (offset + size > (uw) len)
+ size = len - offset;
+ memcpy(buf, g_readme_md + offset, size);
+ }
+ else
+ size = 0;
+ return size;
+}
+
+static int fs_open (const char *path, struct fuse_file_info *ffi)
+{
+ if (strcmp(path, "/README.md"))
+ return -ENOENT;
+ if ((ffi->flags & 3) != O_RDONLY)
+ return -EACCES;
+ return 0;
+}
+
+static int fs_getattr (const char *path, struct stat *dest)
+{
+ s_facts_with_cursor cursor = {0};
+ s_fact *fact = NULL;
+ s_tag tag_path;
+ s_tag tag_sym_kc3fs_file_stat;
+ s_tag tag_file_stat;
+ tag_init_str_1(&tag_path, NULL, path);
+ tag_init_sym(&tag_sym_kc3fs_file_stat, g_sym_kc3fs_file_stat);
+ tag_init_var(&tag_file_stat, g_sym_FileStat);
+ if (! facts_with(g_facts, &cursor, (t_facts_spec) {
+ &tag_path, &tag_sym_kc3fs_file_stat, &tag_file_stat,
+ NULL, NULL})) {
+ err_puts("fs_getattr: facts_with");
+ abort();
+ }
+ if (! facts_with_cursor_next(&cursor, &fact)) {
+ err_puts("fs_getattr: facts_with_cursor_next");
+ abort();
+ }
+ if (! fact)
+ return -ENOENT;
+ if (file_stat_to_struct_stat(tag_file_stat.data.struct_.data,
+ dest)) {
+ err_puts("fs_getattr: file_stat_to_struct_stat");
+ abort();
+ }
+ facts_with_cursor_clean(&cursor);
+ return 0;
+}
+
+static int fs_init (void)
+{
+ uw *blocks = NULL;
+ uw *size = NULL;
+ s_tag tag_file_stat;
+ s_tag tag_file_stat2;
+ s_tag tag_path;
+ s_tag tag_sym_kc3fs_file_stat;
+ g_facts = g_kc3_env->facts;
+ g_sym_FileStat = sym_1("FileStat");
+ g_sym_kc3fs_file_stat = sym_1("kc3fs_file_stat");
+ tag_init_sym(&tag_sym_kc3fs_file_stat, g_sym_kc3fs_file_stat);
+ tag_init_str_1(&tag_path, NULL, "/");
+ tag_init_1(&tag_file_stat,
+ "%FileStat{st_dev: (Uw) 1,"
+ " st_ino: (Uw) 1,"
+ " st_mode: [:r, :w, :x],"
+ " st_nlink: (Uw) 2,"
+ " st_uid: (Uw) 0,"
+ " st_gid: (Uw) 0,"
+ " st_rdev: (Uw) 0,"
+ " st_size: (Uw) 512,"
+ " st_blksize: (Uw) 512,"
+ " st_blocks: (Uw) 1,"
+ " st_atim: Time.now(),"
+ " st_ctim: %Time{tv_sec: 1735058914, tv_nsec: 4},"
+ " st_mtim: %Time{tv_sec: 1735058914, tv_nsec: 4}}");
+ eval_tag(&tag_file_stat, &tag_file_stat2);
+ tag_clean(&tag_file_stat);
+ if (! facts_add_tags(g_facts, &tag_path, &tag_sym_kc3fs_file_stat,
+ &tag_file_stat2)) {
+ err_puts("fs_getattr: facts_add_tags \"/\" :kc3fs_file_stat");
+ return 1;
+ }
+ tag_clean(&tag_file_stat2);
+ tag_init_str_1(&tag_path, NULL, "/README.md");
+ tag_init_1(&tag_file_stat,
+ "%FileStat{st_dev: (Uw) 1,"
+ " st_ino: (Uw) 2,"
+ " st_mode: [:r, :w],"
+ " st_nlink: (Uw) 1,"
+ " st_uid: (Uw) 0,"
+ " st_gid: (Uw) 0,"
+ " st_rdev: (Uw) 0,"
+ " st_size: (Uw) 0,"
+ " st_blksize: (Uw) 512,"
+ " st_blocks: (Uw) 1,"
+ " st_atim: Time.now(),"
+ " st_ctim: %Time{tv_sec: 1735058914, tv_nsec: 4},"
+ " st_mtim: %Time{tv_sec: 1735058914, tv_nsec: 4}}");
+ eval_tag(&tag_file_stat, &tag_file_stat2);
+ tag_clean(&tag_file_stat);
+ if (! (size = struct_get_w(&tag_file_stat2.data.struct_,
+ sym_1("st_size")))) {
+ err_puts("fs_getattr: struct_get_w(:st_size)");
+ return 1;
+ }
+ *size = strlen(g_readme_md);
+ if (! (blocks = struct_get_w(&tag_file_stat2.data.struct_,
+ sym_1("st_blocks")))) {
+ err_puts("fs_getattr: struct_get_w(:st_blocks)");
+ return 1;
+ }
+ *blocks = *size / 512;
+ if (! facts_add_tags(g_facts, &tag_path, &tag_sym_kc3fs_file_stat,
+ &tag_file_stat2)) {
+ err_puts("fs_getattr: facts_add_tags \"/README.md\""
+ " :kc3fs_file_stat");
+ return 1;
+ }
+ tag_clean(&tag_file_stat2);
+ return 0;
+}
+
+int main (int argc, char **argv)
+{
+ int argc1;
+ char **argv1;
+ int argc2;
+ char *argv2[3] = {0};
+ int r = 1;
+ argc1 = argc;
+ argv1 = argv;
+ kc3_init(NULL, &argc1, &argv1);
+ if (argc1 > 0 && argv1[0] && ! strcmp(argv1[0], "--trace")) {
+ g_kc3_env->trace = true;
+ argc1--;
+ argv1++;
+ }
+ if ((r = fs_init()))
+ goto clean;
+ argc2 = 1;
+ argv2[0] = argv[0];
+ argv2[1] = argv[argc];
+ r = fuse_main(argc2, argv2, &g_fsops, NULL);
+ clean:
+ kc3_clean(NULL);
+ return r;
+}
diff --git a/fs/fuse/sources.mk b/fs/fuse/sources.mk
new file mode 100644
index 0000000..5f19f55
--- /dev/null
+++ b/fs/fuse/sources.mk
@@ -0,0 +1,7 @@
+# sources.mk generated by update_sources
+HEADERS = \
+ "types.h" \
+
+SOURCES = \
+ "mount_kc3fs.c" \
+
diff --git a/fs/fuse/sources.sh b/fs/fuse/sources.sh
new file mode 100644
index 0000000..18c895a
--- /dev/null
+++ b/fs/fuse/sources.sh
@@ -0,0 +1,3 @@
+# sources.sh generated by update_sources
+HEADERS='types.h '
+SOURCES='mount_kc3fs.c '
diff --git a/fs/fuse/types.h b/fs/fuse/types.h
new file mode 100644
index 0000000..5a8f162
--- /dev/null
+++ b/fs/fuse/types.h
@@ -0,0 +1,37 @@
+/* kc3
+ * Copyright 2022,2023,2024 kmx.io <contact@kmx.io>
+ *
+ * Permission is hereby granted to use this software granted the above
+ * copyright notice and this permission paragraph are included in all
+ * copies and substantial portions of this software.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+ * PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+ * AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+#ifndef KC3_FS_TYPES_H
+#define KC3_FS_TYPES_H
+
+#include <libkc3/types.h>
+
+/* Type definitions. */
+
+typedef struct mfs s_mfs;
+
+/* Enums. */
+
+typedef enum fs_node_type {
+ FS_NODE_VOID = 0,
+ FS_NODE_MFS = 1
+} e_fs_node_type;
+
+/* 1 */
+
+struct mfs_node {
+ e_fs_node_type type;
+ s_str path;
+ s_str content;
+};
+
+#endif /* KC3_FS_TYPES_H */
diff --git a/fs/fuse/update_sources b/fs/fuse/update_sources
new file mode 100755
index 0000000..245ca86
--- /dev/null
+++ b/fs/fuse/update_sources
@@ -0,0 +1,28 @@
+#!/bin/sh
+## kc3
+## Copyright 2022-2024 kmx.io <contact@kmx.io>
+##
+## Permission is hereby granted to use this software granted the above
+## copyright notice and this permission paragraph are included in all
+## copies and substantial portions of this software.
+##
+## THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+## PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+## AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+## THIS SOFTWARE.
+
+. ../../config.subr
+
+echo "$PWD/update_sources"
+
+echo "# sources.mk generated by update_sources" > ${SOURCES_MK}
+echo "# sources.sh generated by update_sources" > ${SOURCES_SH}
+
+HEADERS="$(ls *.h | grep -v '^config.h$')"
+sources HEADERS "$HEADERS"
+
+SOURCES="$(ls *.c)"
+sources SOURCES "$SOURCES"
+
+update_sources_mk
+update_sources_sh
diff --git a/fs/update_sources b/fs/update_sources
new file mode 100755
index 0000000..45e7185
--- /dev/null
+++ b/fs/update_sources
@@ -0,0 +1,8 @@
+#!/bin/sh
+set -e
+
+. ../config.subr
+
+echo "$PWD/update_sources"
+
+( cd fuse && ./update_sources; )
diff --git a/ikc3/Makefile b/ikc3/Makefile
index e2b51ec..0c01284 100644
--- a/ikc3/Makefile
+++ b/ikc3/Makefile
@@ -51,7 +51,7 @@ gdb_ikc3_asan: asan
install:
mkdir -p ${prefix}/bin
- install -m 755 ikc3 ${prefix}/bin/ikc3
+ install -m 755 .libs/ikc3 ${prefix}/bin/ikc3
lldb_ikc3: debug
if [ -f ikc3_debug.core ]; then lldb .libs/ikc3_debug ikc3_debug.core; else lldb .libs/ikc3_debug; fi
@@ -59,6 +59,7 @@ lldb_ikc3: debug
.PHONY: \
all \
asan \
+ build \
clean \
clean_cov \
cov \
diff --git a/ikc3/buf_linenoise.c b/ikc3/buf_linenoise.c
index 12f60ec..b89558f 100644
--- a/ikc3/buf_linenoise.c
+++ b/ikc3/buf_linenoise.c
@@ -14,7 +14,7 @@
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
-#include "../libkc3/kc3.h"
+#include <libkc3/kc3.h>
#include "../linenoise/linenoise.h"
typedef struct buf_linenoise {
diff --git a/ikc3/buf_wineditline.c b/ikc3/buf_wineditline.c
index 13eb06e..daa9d83 100644
--- a/ikc3/buf_wineditline.c
+++ b/ikc3/buf_wineditline.c
@@ -15,7 +15,7 @@
#include <string.h>
#include <unistd.h>
#include <readline.h>
-#include "../libkc3/kc3.h"
+#include <libkc3/kc3.h>
typedef struct buf_wineditline {
s_buf buf;
diff --git a/ikc3/configure b/ikc3/configure
index 4ccf27d..1eaa923 100755
--- a/ikc3/configure
+++ b/ikc3/configure
@@ -29,6 +29,7 @@ PROG_DEBUG=ikc3_debug
. ./sources.sh
# Common config for all targets
+CPPFLAGS="-I.. $CPPFLAGS"
CFLAGS="$CFLAGS -W -Wall -Werror -std=c11 -pedantic -fPIC -pthread"
config_asan
config_gnu
@@ -71,6 +72,7 @@ OBJECTS_DEBUG="$(c2ext .debug.lo "$SOURCES")"
echo "OBJECTS_DEBUG = $OBJECTS_DEBUG" >> ${CONFIG_MK}
# Asan config
+CPPFLAGS_ASAN="$CPPFLAGS"
CFLAGS_ASAN="$CFLAGS -DDEBUG -O1 -g"
CFLAGS_ASAN="$CFLAGS_ASAN -fsanitize=address -fno-omit-frame-pointer"
LDFLAGS_ASAN="$LDFLAGS"
@@ -79,6 +81,7 @@ LOCAL_LIBS_ASAN="$LIBKC3_ASAN"
LIBS_ASAN="$LOCAL_LIBS_ASAN $LIBS"
# Coverage config
+CPPFLAGS_COV="$CPPFLAGS"
CFLAGS_COV="$CFLAGS -fprofile-arcs -ftest-coverage"
LDFLAGS_COV="$LDFLAGS --coverage"
LIBKC3_COV=../libkc3/libkc3_cov.la
@@ -86,6 +89,7 @@ LOCAL_LIBS_COV="$LIBKC3_COV"
LIBS_COV="$LOCAL_LIBS_COV $LIBS -lgcov"
# Debug config
+CPPFLAGS_DEBUG="$CPPFLAGS"
CFLAGS_DEBUG="$CFLAGS -DDEBUG -O0 -g"
LDFLAGS_DEBUG="$LDFLAGS"
LIBKC3_DEBUG=../libkc3/libkc3_debug.la
@@ -108,22 +112,25 @@ echo "CFLAGS = $CFLAGS" >> ${CONFIG_MK}
echo "LDFLAGS = $LDFLAGS" >> ${CONFIG_MK}
echo "LIBS = $LIBS" >> ${CONFIG_MK}
echo >> ${CONFIG_MK}
+echo "CPPFLAGS_ASAN = $CPPFLAGS_ASAN" >> ${CONFIG_MK}
echo "CFLAGS_ASAN = $CFLAGS_ASAN" >> ${CONFIG_MK}
echo "LDFLAGS_ASAN = $LDFLAGS_ASAN" >> ${CONFIG_MK}
echo "LIBS_ASAN = $LIBS_ASAN" >> ${CONFIG_MK}
echo >> ${CONFIG_MK}
+echo "CPPFLAGS_COV = $CPPFLAGS_COV" >> ${CONFIG_MK}
echo "CFLAGS_COV = $CFLAGS_COV" >> ${CONFIG_MK}
echo "LDFLAGS_COV = $LDFLAGS_COV" >> ${CONFIG_MK}
echo "LIBS_COV = $LIBS_COV" >> ${CONFIG_MK}
echo >> ${CONFIG_MK}
+echo "CPPFLAGS_DEBUG = $CPPFLAGS_DEBUG" >> ${CONFIG_MK}
echo "CFLAGS_DEBUG = $CFLAGS_DEBUG" >> ${CONFIG_MK}
echo "LDFLAGS_DEBUG = $LDFLAGS_DEBUG" >> ${CONFIG_MK}
echo "LIBS_DEBUG = $LIBS_DEBUG" >> ${CONFIG_MK}
-update_build
+update_build_c
update_build_prog
-build_lo
+build_lo_c
build_prog
update_config_mk
diff --git a/ikc3/ikc3.c b/ikc3/ikc3.c
index 76d2179..1424e28 100644
--- a/ikc3/ikc3.c
+++ b/ikc3/ikc3.c
@@ -12,7 +12,7 @@
*/
#include <errno.h>
#include <string.h>
-#include "../libkc3/kc3.h"
+#include <libkc3/kc3.h>
#include "config.h"
#if HAVE_WINEDITLINE
diff --git a/kc3s/Makefile b/kc3s/Makefile
index ad5656d..7e0d19f 100644
--- a/kc3s/Makefile
+++ b/kc3s/Makefile
@@ -48,7 +48,7 @@ gdb_kc3s: debug
install:
mkdir -p ${prefix}/bin
- install -m 755 kc3s ${prefix}/bin/kc3s
+ install -m 755 .libs/kc3s ${prefix}/bin/kc3s
.PHONY: all asan cov debug clean clean_cov distclean
diff --git a/lib/kc3/0.1/file_stat.kc3 b/lib/kc3/0.1/file_stat.kc3
new file mode 100644
index 0000000..eea8bff
--- /dev/null
+++ b/lib/kc3/0.1/file_stat.kc3
@@ -0,0 +1,17 @@
+defmodule FileStat do
+
+ defstruct [st_dev: (Uw) 0,
+ st_ino: (Uw) 0,
+ st_mode: [],
+ st_nlink: (Uw) 0,
+ st_uid: (Uw) 0,
+ st_gid: (Uw) 0,
+ st_rdev: (Uw) 0,
+ st_size: (Uw) 0,
+ st_blksize: (Uw) 0,
+ st_blocks: (Uw) 0,
+ st_atim: %Time{},
+ st_ctim: %Time{},
+ st_mtim: %Time{}]
+
+end
diff --git a/lib/kc3/0.1/parse.kc3 b/lib/kc3/0.1/parse.kc3
new file mode 100644
index 0000000..7d83906
--- /dev/null
+++ b/lib/kc3/0.1/parse.kc3
@@ -0,0 +1,5 @@
+defmodule Parse do
+
+ def tag = cfn Tag "kc3_parse_tag" (Result, Str)
+
+end
diff --git a/libkc3/Makefile b/libkc3/Makefile
index 3d56016..d5bc16d 100644
--- a/libkc3/Makefile
+++ b/libkc3/Makefile
@@ -53,7 +53,7 @@ CLEANFILES += ${GENERATED_FILES}
install:
${INSTALL} -o ${OWNER} -g ${GROUP} -m 0755 -d ${prefix}/include/libkc3
- ${LIBTOOL} --tag=CC --mode=install ${INSTALL} -o ${OWNER} -g ${GROUP} -m 0644 ${HEADERS} ${prefix}/include/libkc3
+ ${LIBTOOL} --tag=CC --mode=install ${INSTALL} -o ${OWNER} -g ${GROUP} -m 0644 ${HEADERS} config.h ${prefix}/include/libkc3
${INSTALL} -o ${OWNER} -g ${GROUP} -m 0755 -d ${prefix}/lib
${LIBTOOL} --tag=CC --mode=install ${INSTALL} -o ${OWNER} -g ${GROUP} -m 0644 ${LIB} ${prefix}/lib
${LIBTOOL} --tag=CC --mode=install ${INSTALL} -o ${OWNER} -g ${GROUP} -m 0644 ${LIB_DEBUG} ${prefix}/lib
diff --git a/libkc3/buf_parse.c b/libkc3/buf_parse.c
index c297a7b..a591d66 100644
--- a/libkc3/buf_parse.c
+++ b/libkc3/buf_parse.c
@@ -4530,6 +4530,7 @@ sw buf_parse_time_as_sw (s_buf *buf, s_time *dest)
result += r;
if ((r = buf_parse_sw(buf, &tmp.tv_sec)) <= 0)
goto restore;
+ result += r;
if ((r = buf_parse_comments(buf)) < 0)
goto restore;
result += r;
@@ -4568,6 +4569,7 @@ sw buf_parse_time_as_sw (s_buf *buf, s_time *dest)
result += r;
if ((r = buf_parse_sw(buf, &tmp.tv_nsec)) <= 0)
goto restore;
+ result += r;
if ((r = buf_parse_comments(buf)) < 0)
goto restore;
result += r;
diff --git a/libkc3/configure b/libkc3/configure
index 5698a14..cf89913 100755
--- a/libkc3/configure
+++ b/libkc3/configure
@@ -116,18 +116,21 @@ echo "LDFLAGS = $LDFLAGS" >> ${CONFIG_MK}
echo "LIBS = $LIBS" >> ${CONFIG_MK}
echo >> ${CONFIG_MK}
echo "LIB_ASAN = $LIB_ASAN" >> ${CONFIG_MK}
+echo "CPPFLAGS_ASAN = $CPPFLAGS_ASAN" >> ${CONFIG_MK}
echo "CFLAGS_ASAN = $CFLAGS_ASAN" >> ${CONFIG_MK}
echo "CXXFLAGS_ASAN = $CXXFLAGS_ASAN" >> ${CONFIG_MK}
echo "LDFLAGS_ASAN = $LDFLAGS_ASAN" >> ${CONFIG_MK}
echo "LIBS_ASAN = $LIBS_ASAN" >> ${CONFIG_MK}
echo >> ${CONFIG_MK}
echo "LIB_COV = $LIB_COV" >> ${CONFIG_MK}
+echo "CPPFLAGS_COV = $CPPFLAGS_COV" >> ${CONFIG_MK}
echo "CFLAGS_COV = $CFLAGS_COV" >> ${CONFIG_MK}
echo "CXXFLAGS_COV = $CXXFLAGS_COV" >> ${CONFIG_MK}
echo "LDFLAGS_COV = $LDFLAGS_COV" >> ${CONFIG_MK}
echo "LIBS_COV = $LIBS_COV" >> ${CONFIG_MK}
echo >> ${CONFIG_MK}
echo "LIB_DEBUG = $LIB_DEBUG" >> ${CONFIG_MK}
+echo "CPPFLAGS_DEBUG = $CPPFLAGS_DEBUG" >> ${CONFIG_MK}
echo "CFLAGS_DEBUG = $CFLAGS_DEBUG" >> ${CONFIG_MK}
echo "CXXFLAGS_DEBUG = $CXXFLAGS_DEBUG" >> ${CONFIG_MK}
echo "LDFLAGS_DEBUG = $LDFLAGS_DEBUG" >> ${CONFIG_MK}
diff --git a/libkc3/env.c b/libkc3/env.c
index 817264e..20844bb 100644
--- a/libkc3/env.c
+++ b/libkc3/env.c
@@ -2726,15 +2726,26 @@ s_env * env_init (s_env *env, int *argc, char ***argv)
s_env * env_init_args (s_env *env, int *argc, char ***argv)
{
+ s32 argc_prev = 0;
s_str argv0;
assert(env);
if (argc && argv && *argc && *argv) {
- env->argc = (*argc)--;
- env->argv = (*argv)++;
+ (*argc)--;
+ (*argv)++;
str_init_1(&argv0, NULL, env->argv[0]);
if (! (env->argv0_dir = alloc(sizeof(s_str))))
return NULL;
file_dirname(&argv0, env->argv0_dir);
+ while (*argc > 0 && *argc != argc_prev) {
+ argc_prev = *argc;
+ if (**argv && ! strcmp(**argv, "--trace")) {
+ env->trace = true;
+ (*argc)--;
+ (*argv)++;
+ }
+ }
+ env->argc = *argc;
+ env->argv = *argv;
return env;
}
env->argc = 0;
diff --git a/libkc3/facts.c b/libkc3/facts.c
index 1cdae8a..8baa8c6 100644
--- a/libkc3/facts.c
+++ b/libkc3/facts.c
@@ -350,6 +350,11 @@ sw facts_load (s_facts *facts, s_buf *buf, const s_str *path)
sw result = 0;
assert(facts);
assert(buf);
+ if (g_kc3_env->trace) {
+ err_write_1("facts_load: ");
+ err_inspect_str(path);
+ err_write_1("\n");
+ }
if ((r = buf_read_1(buf,
"%{module: KC3.Facts.Dump,\n"
" version: 1}\n")) <= 0) {
diff --git a/libkc3/file.c b/libkc3/file.c
index 0abfaba..860e4a5 100644
--- a/libkc3/file.c
+++ b/libkc3/file.c
@@ -469,7 +469,6 @@ s_file_stat * file_stat (const s_str *path, s_file_stat *dest)
{
s32 e;
struct stat sb;
- s_file_stat tmp = {0};
assert(path);
assert(dest);
if (stat(path->ptr.pchar, &sb)) {
@@ -480,45 +479,118 @@ s_file_stat * file_stat (const s_str *path, s_file_stat *dest)
err_puts(path->ptr.pchar);
return NULL;
}
- tmp.st_dev = sb.st_dev;
- tmp.st_ino = sb.st_ino;
- tmp.st_mode = NULL;
- if (sb.st_mode & S_IFREG)
+ return file_stat_init_struct_stat(dest, &sb);
+}
+
+s_file_stat * file_stat_init_struct_stat (s_file_stat *dest,
+ const struct stat *sb)
+{
+ s_file_stat tmp = {0};
+ assert(dest);
+ assert(sb);
+ tmp.st_dev = sb->st_dev;
+ tmp.st_ino = sb->st_ino;
+ tmp.st_mode = 0;
+ if (sb->st_mode & S_IFREG)
tmp.st_mode = list_new_sym(&g_sym_file, tmp.st_mode);
- else if (sb.st_mode & S_IFDIR)
+ else if (sb->st_mode & S_IFDIR)
tmp.st_mode = list_new_sym(&g_sym_directory, tmp.st_mode);
- tmp.st_nlink = sb.st_nlink;
- tmp.st_uid = sb.st_uid;
- tmp.st_gid = sb.st_gid;
- tmp.st_rdev = sb.st_rdev;
- tmp.st_size = sb.st_size;
+ tmp.st_nlink = sb->st_nlink;
+ tmp.st_uid = sb->st_uid;
+ tmp.st_gid = sb->st_gid;
+ tmp.st_rdev = sb->st_rdev;
+ tmp.st_size = sb->st_size;
#ifdef WIN32
tmp.st_blksize = 0;
tmp.st_blocks = 0;
#else
- tmp.st_blksize = sb.st_blksize;
- tmp.st_blocks = sb.st_blocks;
+ tmp.st_blksize = sb->st_blksize;
+ tmp.st_blocks = sb->st_blocks;
#endif
#if HAVE_STAT_MTIM
# ifdef __APPLE__
- tmp.st_atim.tv_sec = sb.st_mtimespec.tv_sec;
- tmp.st_atim.tv_nsec = sb.st_mtimespec.tv_nsec;
+ tmp.st_atim.tv_sec = sb->st_mtimespec.tv_sec;
+ tmp.st_atim.tv_nsec = sb->st_mtimespec.tv_nsec;
# else
- tmp.st_atim.tv_sec = sb.st_atim.tv_sec;
- tmp.st_atim.tv_nsec = sb.st_atim.tv_nsec;
- tmp.st_mtim.tv_sec = sb.st_mtim.tv_sec;
- tmp.st_mtim.tv_nsec = sb.st_mtim.tv_nsec;
- tmp.st_ctim.tv_sec = sb.st_ctim.tv_sec;
- tmp.st_ctim.tv_nsec = sb.st_ctim.tv_nsec;
+ tmp.st_atim.tv_sec = sb->st_atim.tv_sec;
+ tmp.st_atim.tv_nsec = sb->st_atim.tv_nsec;
+ tmp.st_mtim.tv_sec = sb->st_mtim.tv_sec;
+ tmp.st_mtim.tv_nsec = sb->st_mtim.tv_nsec;
+ tmp.st_ctim.tv_sec = sb->st_ctim.tv_sec;
+ tmp.st_ctim.tv_nsec = sb->st_ctim.tv_nsec;
# endif
#else
- tmp.st_atim.tv_sec = sb.st_atime;
+ tmp.st_atim.tv_sec = sb->st_atime;
tmp.st_atim.tv_nsec = 0;
- tmp.st_mtim.tv_sec = sb.st_mtime;
+ tmp.st_mtim.tv_sec = sb->st_mtime;
tmp.st_mtim.tv_nsec = 0;
- tmp.st_ctim.tv_sec = sb.st_ctime;
+ tmp.st_ctim.tv_sec = sb->st_ctime;
tmp.st_ctim.tv_nsec = 0;
#endif
*dest = tmp;
return dest;
}
+
+struct stat * file_stat_to_struct_stat (const s_file_stat *file_stat,
+ struct stat *dest)
+{
+ bool b;
+ s_tag tag_sym_directory;
+ s_tag tag_sym_file;
+ struct stat tmp = {0};
+ assert(file_stat);
+ assert(dest);
+ tmp.st_dev = file_stat->st_dev;
+ tmp.st_ino = file_stat->st_ino;
+ tmp.st_mode = 0;
+ tag_init_sym(&tag_sym_file, &g_sym_file);
+ if (! list_has((const s_list * const *) &file_stat->st_mode,
+ &tag_sym_file, &b)) {
+ err_puts("file_stat_to_struct_stat: list_has(:file)");
+ err_puts("file_stat_to_struct_stat: list_has(:file)");
+ }
+ if (b)
+ tmp.st_mode |= S_IFREG;
+ else {
+ tag_init_sym(&tag_sym_directory, &g_sym_directory);
+ if (! list_has((const s_list * const *) &file_stat->st_mode,
+ &tag_sym_directory, &b)) {
+ err_puts("file_stat_to_struct_stat: list_has(:directory)");
+ err_puts("file_stat_to_struct_stat: list_has(:directory)");
+ }
+ if (b)
+ tmp.st_mode |= S_IFDIR;
+ }
+ tmp.st_nlink = file_stat->st_nlink;
+ tmp.st_uid = file_stat->st_uid;
+ tmp.st_gid = file_stat->st_gid;
+ tmp.st_rdev = file_stat->st_rdev;
+ tmp.st_size = file_stat->st_size;
+#ifndef WIN32
+ tmp.st_blksize = file_stat->st_blksize;
+ tmp.st_blocks = file_stat->st_blocks;
+#endif
+#if HAVE_STAT_MTIM
+# ifdef __APPLE__
+ tmp.st_atimespec.tv_sec = file_stat->st_atim.tv_sec;
+ tmp.st_atimespec.tv_nsec = file_stat->st_atim.tv_nsec;
+ tmp.st_ctimespec.tv_sec = file_stat->st_ctim.tv_sec;
+ tmp.st_ctimespec.tv_nsec = file_stat->st_ctim.tv_nsec;
+ tmp.st_mtimespec.tv_sec = file_stat->st_mtim.tv_sec;
+ tmp.st_mtimespec.tv_nsec = file_stat->st_mtim.tv_nsec;
+# else
+ tmp.st_atim.tv_sec = file_stat->st_atim.tv_sec;
+ tmp.st_atim.tv_nsec = file_stat->st_atim.tv_nsec;
+ tmp.st_ctim.tv_sec = file_stat->st_ctim.tv_sec;
+ tmp.st_ctim.tv_nsec = file_stat->st_ctim.tv_nsec;
+ tmp.st_mtim.tv_sec = file_stat->st_mtim.tv_sec;
+ tmp.st_mtim.tv_nsec = file_stat->st_mtim.tv_nsec;
+# endif
+#else
+ tmp.st_atime = file_stat->st_atim.tv_sec;
+ tmp.st_ctime = file_stat->st_ctim.tv_sec;
+ tmp.st_mtime = file_stat->st_mtim.tv_sec;
+#endif
+ *dest = tmp;
+ return dest;
+}
diff --git a/libkc3/file.h b/libkc3/file.h
index ce64143..5a81bd4 100644
--- a/libkc3/file.h
+++ b/libkc3/file.h
@@ -22,8 +22,13 @@
#ifndef LIBKC3_FILE_H
#define LIBKC3_FILE_H
+#include <sys/stat.h>
#include "types.h"
+/* Stack-allocation compatible functions. */
+s_file_stat * file_stat_init_struct_stat (s_file_stat *dest,
+ const struct stat *sb);
+
/* Observers */
bool file_access (const s_str *path, const s_sym *mode);
sw file_copy (const char *from, const char *to);
@@ -38,9 +43,11 @@ s_str * file_search (const s_str *suffix, const s_sym *mode,
s_file_stat * file_stat (const s_str *path, s_file_stat *dest);
/* Operators. */
-s_str * file_pwd (s_str *dest);
-FILE * file_open (const char *path, const char *mode);
-s32 * file_open_r (const s_str *path, s32 *dest);
-s32 * file_open_w (const s_str *path, s32 *dest);
+s_str * file_pwd (s_str *dest);
+FILE * file_open (const char *path, const char *mode);
+s32 * file_open_r (const s_str *path, s32 *dest);
+s32 * file_open_w (const s_str *path, s32 *dest);
+struct stat * file_stat_to_struct_stat (const s_file_stat *file_stat,
+ struct stat *dest);
#endif /* LIBKC3_FILE_H */
diff --git a/libkc3/gen.mk b/libkc3/gen.mk
index 854ca6f..557a2f0 100644
--- a/libkc3/gen.mk
+++ b/libkc3/gen.mk
@@ -78,6 +78,8 @@ GENERATED_FILES = \
set_cursor__tag.c set_cursor__tag.h \
set_item__fact.c set_item__fact.h \
set_item__tag.c set_item__tag.h \
+ skiplist__alloc.c skiplist__alloc.h \
+ skiplist_node__alloc.c skiplist_node__alloc.h \
skiplist__fact.c skiplist__fact.h \
skiplist_node__fact.c skiplist_node__fact.h \
s8.c s8.h s16.c s16.h s32.c s32.h s64.c s64.h sw.c sw.h \
@@ -612,6 +614,22 @@ set_item__fact.h: set_item.h.in gen.mk
set_item__fact.c: set_item.c.in gen.mk
${SED_FACT} < set_item.c.in > set_item__fact.c
+SED_ALLOC = sed \
+ -e 's/_NAME[$$]/alloc/g' \
+ -e 's/_TYPE[$$]/s_alloc */g'
+
+skiplist__alloc.h: skiplist.h.in gen.mk
+ ${SED_ALLOC} < skiplist.h.in > skiplist__alloc.h
+
+skiplist__alloc.c: skiplist.c.in gen.mk
+ ${SED_ALLOC} < skiplist.c.in > skiplist__alloc.c
+
+skiplist_node__alloc.h: skiplist_node.h.in gen.mk
+ ${SED_ALLOC} < skiplist_node.h.in > skiplist_node__alloc.h
+
+skiplist_node__alloc.c: skiplist_node.c.in gen.mk
+ ${SED_ALLOC} < skiplist_node.c.in > skiplist_node__alloc.c
+
SED_FACT_P = sed \
-e 's/_NAME[$$]/fact/g' \
-e 's/_TYPE[$$]/s_fact */g'
diff --git a/libkc3/kc3.c b/libkc3/kc3.c
index 0c7645f..e079a76 100644
--- a/libkc3/kc3.c
+++ b/libkc3/kc3.c
@@ -520,6 +520,24 @@ bool * kc3_or (s_tag *a, s_tag *b, bool *dest)
return env_or(g_kc3_env, a, b, dest);
}
+s_tag * kc3_parse_tag (s_tag *tag, const s_str *src)
+{
+ s_buf buf;
+ sw r;
+ buf_init_str_const(&buf, src);
+ r = buf_parse_tag(&buf, tag);
+ if (r < 0 || (uw) r != src->size) {
+ err_write_1("kc3_parse_tag: invalid tag: ");
+ err_inspect_sw_decimal(&r);
+ err_write_1(" != ");
+ err_inspect_u32_decimal(&src->size);
+ err_write_1("\n");
+ assert(! "kc3_parse_tag: invalid tag");
+ return NULL;
+ }
+ return tag;
+}
+
sw kc3_puts (const s_tag *tag)
{
sw r;
diff --git a/libkc3/kc3_main.h b/libkc3/kc3_main.h
index 905afb8..d2ba40e 100644
--- a/libkc3/kc3_main.h
+++ b/libkc3/kc3_main.h
@@ -119,6 +119,7 @@ bool kc3_maybe_reload (const s_str *path);
s_tag * kc3_operator_find_by_sym (const s_sym * const *sym,
s_tag *dest);
bool * kc3_or (s_tag *a, s_tag *b, bool *dest);
+s_tag * kc3_parse_tag (s_tag *tag, const s_str *src);
bool kc3_require (const s_sym * const *module);
s_str * kc3_strerror (sw err_no, s_str *dest);
s_tag * kc3_struct_put (s_tag *s, const s_sym * const *key,
diff --git a/libkc3/skiplist__alloc.c b/libkc3/skiplist__alloc.c
new file mode 100644
index 0000000..74f1b95
--- /dev/null
+++ b/libkc3/skiplist__alloc.c
@@ -0,0 +1,236 @@
+/* kc3
+ * Copyright 2022,2023,2024 kmx.io <contact@kmx.io>
+ *
+ * Permission is hereby granted to use this software granted the above
+ * copyright notice and this permission paragraph are included in all
+ * copies and substantial portions of this software.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+ * PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+ * AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+#include "alloc.h"
+#include "assert.h"
+#include "compare.h"
+#include "alloc.h"
+#include "skiplist_node__alloc.h"
+#include "skiplist__alloc.h"
+#include "u32.h"
+#include "u64.h"
+
+/*
+ Random height
+ -------------
+
+ ∀ U ∈ ℕ : 1 < U
+ ∀ n ∈ ℕ*
+ ∀ r ∈ ℕ : r ≤ n
+ ∀ random : ℕ* ⟶ ℕ
+ random(n) ∈ [0..n-1]
+ ∀ i ∈ [0..n-1], P(random(n) = i) = n⁻¹ (i)
+ Qᵣ := random(Uⁿ) < Uⁿ⁻ʳ
+
+ (i) ⇒ P(random(n) < v) = ∑ᵢ₌₀ᵛ⁻¹ P(random(n) = i)
+ ⇒ P(random(n) < v) = v . n⁻¹ (ii)
+
+ ⇒ P(random(Uⁿ) < Uⁿ⁻ʳ) = Uⁿ⁻ʳ . (Uⁿ)⁻¹
+ ⇔ P(Qᵣ) = U⁻ʳ (iii)
+
+ P(Qₙ) = P(random(Uⁿ) < U⁰)
+ = P(random(Uⁿ) < 1)
+ = P(random(Uⁿ) = 0)
+ = U⁻ⁿ
+
+ R := maxᵣ(Qᵣ)
+ = maxᵣ(random(Uⁿ) < Uⁿ⁻ʳ)
+ = maxᵣ(random(Uⁿ) + 1 ≤ Uⁿ⁻ʳ)
+ = maxᵣ(logᵤ(random(Uⁿ) + 1) ≤ n - r)
+ = maxᵣ(⌈logᵤ(random(Uⁿ) + 1)⌉ ≤ n - r)
+ = maxᵣ(r ≤ n - ⌈logᵤ(random(Uⁿ) + 1)⌉)
+ = n - ⌈logᵤ(random(Uⁿ) + 1)⌉ (iv)
+
+ 0 ≤ random(Uⁿ) < Uⁿ
+ ⇔ 1 ≤ random(Uⁿ)+1 ≤ Uⁿ
+ ⇔ logᵤ(1) ≤ logᵤ(random(Uⁿ)+1) ≤ logᵤ(Uⁿ)
+ ⇔ 0 ≤ ⌈logᵤ(random(Uⁿ)+1)⌉ ≤ n
+ ⇔ -n ≤ -⌈logᵤ(random(Uⁿ)+1)⌉ ≤ 0
+ ⇔ 0 ≤ n - ⌈logᵤ(random(Uⁿ)+1)⌉ ≤ n
+ ⇔ 0 ≤ R ≤ n (v)
+*/
+
+void
+skiplist_clean__alloc (s_skiplist__alloc *skiplist)
+{
+ s_skiplist_node__alloc *node;
+ assert(skiplist);
+ assert(skiplist->head);
+ while ((node = SKIPLIST_NODE_NEXT__alloc(skiplist->head, 0)))
+ skiplist_remove__alloc(skiplist, node->alloc);
+ skiplist_node_delete__alloc(skiplist->head);
+}
+
+void
+skiplist_delete__alloc (s_skiplist__alloc *skiplist)
+{
+ assert(skiplist);
+ skiplist_clean__alloc(skiplist);
+ free(skiplist);
+}
+
+s_skiplist_node__alloc *
+skiplist_find__alloc (s_skiplist__alloc *skiplist, const s_alloc * alloc)
+{
+ s_skiplist_node__alloc *node = skiplist->head;
+ u8 level = node->height;
+ while (level--) {
+ s_skiplist_node__alloc *n = node;
+ s8 c = -1;
+ while (n && (c = skiplist->compare(alloc, n->alloc)) > 0)
+ n = SKIPLIST_NODE_NEXT__alloc(n, level);
+ if (c == 0)
+ return n;
+ }
+ return NULL;
+}
+
+static s_skiplist__alloc *
+skiplist_height_table_init__alloc (s_skiplist__alloc *skiplist, f64 spacing)
+{
+ t_skiplist_height *height_table;
+ u8 h;
+ f128 w = spacing;
+ f128 end = w;
+ height_table = SKIPLIST_HEIGHT_TABLE__alloc(skiplist);
+ for (h = 0; h < skiplist->max_height; h++) {
+ w *= spacing;
+ end += w;
+ if (end > (f128) SKIPLIST_HEIGHT_MAX)
+ return NULL;
+ height_table[h] = end;
+ }
+ return skiplist;
+}
+
+s_skiplist__alloc *
+skiplist_init__alloc (s_skiplist__alloc *skiplist, u8 max_height, f64 spacing)
+{
+ assert(skiplist);
+ skiplist->max_height = max_height;
+ skiplist_height_table_init__alloc(skiplist, spacing);
+ skiplist->head = skiplist_node_new__alloc(NULL, max_height);
+ if (! skiplist->head)
+ return NULL;
+ skiplist->compare = compare_alloc;
+ skiplist->length = 0;
+ return skiplist;
+}
+
+s_skiplist_node__alloc *
+skiplist_insert__alloc (s_skiplist__alloc *skiplist, s_alloc * alloc)
+{
+ s_skiplist_node__alloc *pred;
+ s_skiplist_node__alloc *next;
+ uw height;
+ s_skiplist_node__alloc *node;
+ pred = skiplist_pred__alloc(skiplist, alloc);
+ next = SKIPLIST_NODE_NEXT__alloc(pred, 0);
+ next = SKIPLIST_NODE_NEXT__alloc(next, 0);
+ if (next && skiplist->compare(alloc, next->alloc) == 0)
+ return next;
+ height = skiplist_random_height__alloc(skiplist);
+ node = skiplist_node_new__alloc(alloc, height);
+ skiplist_node_insert__alloc(node, pred);
+ skiplist->length++;
+ skiplist_node_delete__alloc(pred);
+ return node;
+}
+
+s_skiplist__alloc *
+skiplist_new__alloc (u8 max_height, f64 spacing)
+{
+ s_skiplist__alloc *skiplist;
+ skiplist = alloc(SKIPLIST_SIZE__alloc(max_height));
+ if (! skiplist)
+ return NULL;
+ if (! skiplist_init__alloc(skiplist, max_height, spacing)) {
+ free(skiplist);
+ return NULL;
+ }
+ return skiplist;
+}
+
+s_skiplist_node__alloc *
+skiplist_pred__alloc (s_skiplist__alloc *skiplist, const s_alloc * alloc)
+{
+ int level;
+ s_skiplist_node__alloc *pred;
+ s_skiplist_node__alloc *n;
+ s_skiplist_node__alloc *node;
+ assert(skiplist);
+ level = skiplist->max_height;
+ pred = skiplist_node_new__alloc(NULL, skiplist->max_height);
+ if (! pred)
+ return NULL;
+ node = skiplist->head;
+ while (level--) {
+ n = node;
+ while (n && skiplist->compare(alloc, n->alloc) > 0) {
+ node = n;
+ n = SKIPLIST_NODE_NEXT__alloc(node, level);
+ }
+ SKIPLIST_NODE_NEXT__alloc(pred, level) = node;
+ }
+ return pred;
+}
+
+u8
+skiplist_random_height__alloc (s_skiplist__alloc *skiplist)
+{
+ u16 height;
+ const t_skiplist_height *height_table;
+ sw i;
+ u64 j;
+ sw max;
+ t_skiplist_height k;
+ assert(skiplist);
+ assert(skiplist->max_height);
+ height_table = SKIPLIST_HEIGHT_TABLE__alloc(skiplist);
+ max = height_table[skiplist->max_height - 1];
+ u64_random_uniform(&j, max);
+ k = j;
+ i = 0;
+ while (i < skiplist->max_height - 1 &&
+ k > height_table[i])
+ i++;
+ height = skiplist->max_height - i;
+ assert(height);
+ return height;
+}
+
+bool
+skiplist_remove__alloc (s_skiplist__alloc *skiplist, const s_alloc * alloc)
+{
+ uw level;
+ s_skiplist_node__alloc *pred;
+ s_skiplist_node__alloc *next;
+ pred = skiplist_pred__alloc(skiplist, alloc);
+ assert(pred);
+ next = SKIPLIST_NODE_NEXT__alloc(pred, 0);
+ assert(next);
+ next = SKIPLIST_NODE_NEXT__alloc(next, 0);
+ if (!next || skiplist->compare(alloc, next->alloc) != 0) {
+ skiplist_node_delete__alloc(pred);
+ return false;
+ }
+ for (level = 0; level < next->height; level++) {
+ s_skiplist_node__alloc *p =
+ SKIPLIST_NODE_NEXT__alloc(pred, level);
+ SKIPLIST_NODE_NEXT__alloc(p, level) =
+ SKIPLIST_NODE_NEXT__alloc(next, level);
+ }
+ skiplist->length--;
+ skiplist_node_delete__alloc(pred);
+ skiplist_node_delete__alloc(next);
+ return true;
+}
diff --git a/libkc3/skiplist__alloc.h b/libkc3/skiplist__alloc.h
new file mode 100644
index 0000000..bb1cb54
--- /dev/null
+++ b/libkc3/skiplist__alloc.h
@@ -0,0 +1,59 @@
+/* kc3
+ * Copyright 2022,2023,2024 kmx.io <contact@kmx.io>
+ *
+ * Permission is hereby granted to use this software granted the above
+ * copyright notice and this permission paragraph are included in all
+ * copies and substantial portions of this software.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+ * PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+ * AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+/* Gen from skiplist.h.in NAME=alloc TYPE=s_alloc * */
+/**
+ * @file skiplist__alloc.h
+ * @brief Skiplist of allocs.
+ *
+ * Skiplist containing s_alloc *.
+ */
+#ifndef LIBKC3_SKIPLIST__alloc_H
+#define LIBKC3_SKIPLIST__alloc_H
+
+#include "types.h"
+
+#define SKIPLIST_HEIGHT_TABLE__alloc(skiplist) \
+ ((t_skiplist_height *) (((s_skiplist__alloc *) skiplist) + 1))
+
+#define SKIPLIST_SIZE__alloc(max_height) \
+ (sizeof(s_skiplist__alloc) + (max_height) * sizeof(t_skiplist_height))
+
+void
+skiplist_clean__alloc (s_skiplist__alloc *skiplist);
+
+void
+skiplist_delete__alloc (s_skiplist__alloc *skiplist);
+
+s_skiplist_node__alloc *
+skiplist_find__alloc (s_skiplist__alloc *skiplist, const s_alloc * value);
+
+/* do not call directly */
+s_skiplist__alloc *
+skiplist_init__alloc (s_skiplist__alloc *skiplist, u8 max_height, f64 spacing);
+
+s_skiplist_node__alloc *
+skiplist_insert__alloc (s_skiplist__alloc *skiplist, s_alloc * value);
+
+s_skiplist__alloc *
+skiplist_new__alloc (u8 max_height, f64 spacing);
+
+s_skiplist_node__alloc *
+skiplist_pred__alloc (s_skiplist__alloc *skiplist, const s_alloc * value);
+
+u8
+skiplist_random_height__alloc (s_skiplist__alloc *skiplist);
+
+bool
+skiplist_remove__alloc (s_skiplist__alloc *skiplist, const s_alloc * value);
+
+#endif /* LIBKC3_SKIPLIST__alloc_H */
diff --git a/libkc3/skiplist_node__alloc.c b/libkc3/skiplist_node__alloc.c
new file mode 100644
index 0000000..65f2489
--- /dev/null
+++ b/libkc3/skiplist_node__alloc.c
@@ -0,0 +1,55 @@
+/* kc3
+ * Copyright 2022,2023,2024 kmx.io <contact@kmx.io>
+ *
+ * Permission is hereby granted to use this software granted the above
+ * copyright notice and this permission paragraph are included in all
+ * copies and substantial portions of this software.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+ * PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+ * AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+/* Gen from skiplist_node.c.in NAME=alloc TYPE=s_alloc * */
+#include <string.h>
+#include "alloc.h"
+#include "skiplist_node__alloc.h"
+
+s_skiplist_node__alloc *
+skiplist_node_init (s_skiplist_node__alloc *node, s_alloc * alloc, u8 height)
+{
+ node->alloc = alloc;
+ node->height = height;
+ memset(SKIPLIST_NODE_LINKS__alloc(node), 0,
+ height * sizeof(s_skiplist_node__alloc *));
+ return node;
+}
+
+s_skiplist_node__alloc *
+skiplist_node_new__alloc (s_alloc * alloc, u8 height)
+{
+ s_skiplist_node__alloc *node;
+ node = alloc(SKIPLIST_NODE_SIZE__alloc(height));
+ if (! node)
+ return NULL;
+ skiplist_node_init(node, alloc, height);
+ return node;
+}
+
+void
+skiplist_node_delete__alloc (s_skiplist_node__alloc *node)
+{
+ free(node);
+}
+
+void
+skiplist_node_insert__alloc (s_skiplist_node__alloc *node, s_skiplist_node__alloc *pred)
+{
+ uw level;
+ for (level = 0; level < node->height; level++) {
+ s_skiplist_node__alloc *p = SKIPLIST_NODE_NEXT__alloc(pred, level);
+ SKIPLIST_NODE_NEXT__alloc(node, level) =
+ SKIPLIST_NODE_NEXT__alloc(p, level);
+ SKIPLIST_NODE_NEXT__alloc(p, level) = node;
+ }
+}
diff --git a/libkc3/skiplist_node__alloc.h b/libkc3/skiplist_node__alloc.h
new file mode 100644
index 0000000..4cdff88
--- /dev/null
+++ b/libkc3/skiplist_node__alloc.h
@@ -0,0 +1,46 @@
+/* kc3
+ * Copyright 2022,2023,2024 kmx.io <contact@kmx.io>
+ *
+ * Permission is hereby granted to use this software granted the above
+ * copyright notice and this permission paragraph are included in all
+ * copies and substantial portions of this software.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+ * PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+ * AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+/* Gen from skiplist_node.h.in NAME=alloc TYPE=s_alloc * */
+/**
+ * @file skiplist_node__alloc.h
+ * @brief Element of a skiplist of allocs.
+ *
+ * Data structure for skiplist nodes containing s_alloc *.
+ */
+#ifndef LIBKC3_SKIPLIST_NODE__alloc_H
+#define LIBKC3_SKIPLIST_NODE__alloc_H
+
+#include "types.h"
+
+#define SKIPLIST_NODE_LINKS__alloc(node) \
+ ((s_skiplist_node__alloc **) (((s_skiplist_node__alloc *) node) + 1))
+
+#define SKIPLIST_NODE_NEXT__alloc(node, height) \
+ (SKIPLIST_NODE_LINKS__alloc(node)[height])
+
+#define SKIPLIST_NODE_SIZE__alloc(height) \
+ (sizeof(s_skiplist_node__alloc) + (height) * sizeof(s_alloc *))
+
+s_skiplist_node__alloc *
+skiplist_node_init (s_skiplist_node__alloc *node, s_alloc * value, u8 height);
+
+s_skiplist_node__alloc *
+skiplist_node_new__alloc (s_alloc * value, u8 height);
+
+void
+skiplist_node_delete__alloc (s_skiplist_node__alloc *node);
+
+void
+skiplist_node_insert__alloc (s_skiplist_node__alloc *node, s_skiplist_node__alloc *pred);
+
+#endif /* LIBKC3_SKIPLIST_NODE__alloc_H */
diff --git a/libkc3/sources.mk b/libkc3/sources.mk
index e75642d..33a97fe 100644
--- a/libkc3/sources.mk
+++ b/libkc3/sources.mk
@@ -154,7 +154,9 @@ HEADERS = \
"sh.h" \
"sha1.h" \
"sign.h" \
+ "skiplist__alloc.h" \
"skiplist__fact.h" \
+ "skiplist_node__alloc.h" \
"skiplist_node__fact.h" \
"special_operator.h" \
"str.h" \
@@ -333,7 +335,9 @@ SOURCES = \
"sh.c" \
"sha1.c" \
"sign.c" \
+ "skiplist__alloc.c" \
"skiplist__fact.c" \
+ "skiplist_node__alloc.c" \
"skiplist_node__fact.c" \
"special_operator.c" \
"str.c" \
@@ -622,7 +626,9 @@ LO_SOURCES = \
"sh.c" \
"sha1.c" \
"sign.c" \
+ "skiplist__alloc.c" \
"skiplist__fact.c" \
+ "skiplist_node__alloc.c" \
"skiplist_node__fact.c" \
"special_operator.c" \
"str.c" \
diff --git a/libkc3/sources.sh b/libkc3/sources.sh
index 0dd0903..3e3fe1b 100644
--- a/libkc3/sources.sh
+++ b/libkc3/sources.sh
@@ -1,4 +1,4 @@
# sources.sh generated by update_sources
-HEADERS='abs.h alist.h alloc.h arg.h array.h assert.h binding.h block.h bool.h buf.h buf_fd.h buf_file.h buf_getc.h buf_getchar.h buf_inspect.h buf_inspect_s16.h buf_inspect_s16_binary.h buf_inspect_s16_decimal.h buf_inspect_s16_hexadecimal.h buf_inspect_s16_octal.h buf_inspect_s32.h buf_inspect_s32_binary.h buf_inspect_s32_decimal.h buf_inspect_s32_hexadecimal.h buf_inspect_s32_octal.h buf_inspect_s64.h buf_inspect_s64_binary.h buf_inspect_s64_decimal.h buf_inspect_s64_hexadecimal.h buf_inspect_s64_octal.h buf_inspect_s8.h buf_inspect_s8_binary.h buf_inspect_s8_decimal.h buf_inspect_s8_hexadecimal.h buf_inspect_s8_octal.h buf_inspect_sw.h buf_inspect_sw_binary.h buf_inspect_sw_decimal.h buf_inspect_sw_hexadecimal.h buf_inspect_sw_octal.h buf_inspect_u16.h buf_inspect_u16_binary.h buf_inspect_u16_decimal.h buf_inspect_u16_hexadecimal.h buf_inspect_u16_octal.h buf_inspect_u32.h buf_inspect_u32_binary.h buf_inspect_u32_decimal.h buf_inspect_u32_hexadecimal.h buf_inspect_u32_octal.h buf_inspect_u64.h buf_inspect_u64_binary.h buf_inspect_u64_decimal.h buf_inspect_u64_hexadecimal.h buf_inspect_u64_octal.h buf_inspect_u8.h buf_inspect_u8_binary.h buf_inspect_u8_decimal.h buf_inspect_u8_hexadecimal.h buf_inspect_u8_octal.h buf_inspect_uw.h buf_inspect_uw_binary.h buf_inspect_uw_decimal.h buf_inspect_uw_hexadecimal.h buf_inspect_uw_octal.h buf_parse.h buf_parse_s16.h buf_parse_s32.h buf_parse_s64.h buf_parse_s8.h buf_parse_sw.h buf_parse_u16.h buf_parse_u32.h buf_parse_u64.h buf_parse_u8.h buf_parse_uw.h buf_rw.h buf_save.h call.h callable.h cast.h ceiling.h cfn.h character.h compare.h complex.h cow.h crypt.h data.h deserialize.h env.h env_fork.h error.h error_handler.h eval.h explicit_bzero.h f128.h f32.h f64.h fact.h fact_action.h fact_list.h facts.h facts_cursor.h facts_spec.h facts_spec_cursor.h facts_transaction.h facts_with.h facts_with_cursor.h fd.h file.h float.h fn.h fn_clause.h frame.h hash.h ident.h inspect.h integer.h io.h kc3.h kc3_main.h list.h list_init.h log.h map.h module.h mutex.h operator.h pcomplex.h pcow.h pretty.h ptag.h ptr.h ptr_free.h queue.h quote.h ratio.h rwlock.h s16.h s32.h s64.h s8.h sequence.h serialize.h set__fact.h set__tag.h set_cursor__fact.h set_cursor__tag.h set_item__fact.h set_item__tag.h sh.h sha1.h sign.h skiplist__fact.h skiplist_node__fact.h special_operator.h str.h struct.h struct_type.h sw.h sym.h tag.h tag_init.h tag_type.h time.h to_lisp.h tuple.h types.h u16.h u32.h u64.h u8.h ucd.h unquote.h uw.h var.h void.h wait.h '
-SOURCES='abs.c alist.c alloc.c arg.c array.c binding.c block.c bool.c buf.c buf_fd.c buf_file.c buf_getc.c buf_getchar.c buf_inspect.c buf_inspect_s16.c buf_inspect_s16_binary.c buf_inspect_s16_decimal.c buf_inspect_s16_hexadecimal.c buf_inspect_s16_octal.c buf_inspect_s32.c buf_inspect_s32_binary.c buf_inspect_s32_decimal.c buf_inspect_s32_hexadecimal.c buf_inspect_s32_octal.c buf_inspect_s64.c buf_inspect_s64_binary.c buf_inspect_s64_decimal.c buf_inspect_s64_hexadecimal.c buf_inspect_s64_octal.c buf_inspect_s8.c buf_inspect_s8_binary.c buf_inspect_s8_decimal.c buf_inspect_s8_hexadecimal.c buf_inspect_s8_octal.c buf_inspect_sw.c buf_inspect_sw_binary.c buf_inspect_sw_decimal.c buf_inspect_sw_hexadecimal.c buf_inspect_sw_octal.c buf_inspect_u16.c buf_inspect_u16_binary.c buf_inspect_u16_decimal.c buf_inspect_u16_hexadecimal.c buf_inspect_u16_octal.c buf_inspect_u32.c buf_inspect_u32_binary.c buf_inspect_u32_decimal.c buf_inspect_u32_hexadecimal.c buf_inspect_u32_octal.c buf_inspect_u64.c buf_inspect_u64_binary.c buf_inspect_u64_decimal.c buf_inspect_u64_hexadecimal.c buf_inspect_u64_octal.c buf_inspect_u8.c buf_inspect_u8_binary.c buf_inspect_u8_decimal.c buf_inspect_u8_hexadecimal.c buf_inspect_u8_octal.c buf_inspect_uw.c buf_inspect_uw_binary.c buf_inspect_uw_decimal.c buf_inspect_uw_hexadecimal.c buf_inspect_uw_octal.c buf_parse.c buf_parse_s16.c buf_parse_s32.c buf_parse_s64.c buf_parse_s8.c buf_parse_sw.c buf_parse_u16.c buf_parse_u32.c buf_parse_u64.c buf_parse_u8.c buf_parse_uw.c buf_rw.c buf_save.c call.c callable.c cast.c ceiling.c cfn.c character.c compare.c complex.c cow.c crypt.c crypt_sha512.c data.c deserialize.c env.c env_fork.c error.c error_handler.c eval.c f128.c f32.c f64.c fact.c fact_action.c fact_list.c facts.c facts_cursor.c facts_spec.c facts_spec_cursor.c facts_transaction.c facts_with.c facts_with_cursor.c fd.c file.c fn.c fn_clause.c frame.c hash.c ident.c inspect.c integer.c io.c kc3.c license.c list.c list_init.c log.c map.c module.c mutex.c operator.c pcomplex.c pcow.c pretty.c ptag.c ptr.c ptr_free.c queue.c quote.c ratio.c rwlock.c s16.c s32.c s64.c s8.c sequence.c serialize.c set__fact.c set__tag.c set_cursor__fact.c set_cursor__tag.c set_item__fact.c set_item__tag.c sh.c sha1.c sign.c skiplist__fact.c skiplist_node__fact.c special_operator.c str.c struct.c struct_type.c sw.c sym.c tag.c tag_add.c tag_addi.c tag_band.c tag_bnot.c tag_bor.c tag_bxor.c tag_div.c tag_init.c tag_mod.c tag_mul.c tag_neg.c tag_shift_left.c tag_shift_right.c tag_sqrt.c tag_sub.c tag_type.c time.c to_lisp.c tuple.c u16.c u32.c u64.c u8.c ucd.c unquote.c uw.c var.c void.c wait.c '
-LO_SOURCES=' ../libtommath/bn_cutoffs.c ../libtommath/bn_mp_2expt.c ../libtommath/bn_mp_abs.c ../libtommath/bn_mp_add.c ../libtommath/bn_mp_add_d.c ../libtommath/bn_mp_and.c ../libtommath/bn_mp_clamp.c ../libtommath/bn_mp_clear.c ../libtommath/bn_mp_clear_multi.c ../libtommath/bn_mp_cmp.c ../libtommath/bn_mp_cmp_d.c ../libtommath/bn_mp_cmp_mag.c ../libtommath/bn_mp_cnt_lsb.c ../libtommath/bn_mp_complement.c ../libtommath/bn_mp_copy.c ../libtommath/bn_mp_count_bits.c ../libtommath/bn_mp_div.c ../libtommath/bn_mp_div_2.c ../libtommath/bn_mp_div_2d.c ../libtommath/bn_mp_div_3.c ../libtommath/bn_mp_div_d.c ../libtommath/bn_mp_dr_is_modulus.c ../libtommath/bn_mp_dr_reduce.c ../libtommath/bn_mp_dr_setup.c ../libtommath/bn_mp_error_to_string.c ../libtommath/bn_mp_exch.c ../libtommath/bn_mp_exptmod.c ../libtommath/bn_mp_gcd.c ../libtommath/bn_mp_get_double.c ../libtommath/bn_mp_get_i32.c ../libtommath/bn_mp_get_i64.c ../libtommath/bn_mp_get_mag_u32.c ../libtommath/bn_mp_get_mag_u64.c ../libtommath/bn_mp_grow.c ../libtommath/bn_mp_init.c ../libtommath/bn_mp_init_copy.c ../libtommath/bn_mp_init_multi.c ../libtommath/bn_mp_init_size.c ../libtommath/bn_mp_invmod.c ../libtommath/bn_mp_lcm.c ../libtommath/bn_mp_lshd.c ../libtommath/bn_mp_mod.c ../libtommath/bn_mp_mod_2d.c ../libtommath/bn_mp_montgomery_calc_normalization.c ../libtommath/bn_mp_montgomery_reduce.c ../libtommath/bn_mp_montgomery_setup.c ../libtommath/bn_mp_mul.c ../libtommath/bn_mp_mul_2.c ../libtommath/bn_mp_mul_2d.c ../libtommath/bn_mp_mul_d.c ../libtommath/bn_mp_mulmod.c ../libtommath/bn_mp_neg.c ../libtommath/bn_mp_or.c ../libtommath/bn_mp_radix_size.c ../libtommath/bn_mp_reduce.c ../libtommath/bn_mp_reduce_2k.c ../libtommath/bn_mp_reduce_2k_l.c ../libtommath/bn_mp_reduce_2k_setup.c ../libtommath/bn_mp_reduce_2k_setup_l.c ../libtommath/bn_mp_reduce_is_2k.c ../libtommath/bn_mp_reduce_is_2k_l.c ../libtommath/bn_mp_reduce_setup.c ../libtommath/bn_mp_rshd.c ../libtommath/bn_mp_set.c ../libtommath/bn_mp_set_double.c ../libtommath/bn_mp_set_i32.c ../libtommath/bn_mp_set_i64.c ../libtommath/bn_mp_set_l.c ../libtommath/bn_mp_set_u32.c ../libtommath/bn_mp_set_u64.c ../libtommath/bn_mp_set_ul.c ../libtommath/bn_mp_sqr.c ../libtommath/bn_mp_sqrt.c ../libtommath/bn_mp_sub.c ../libtommath/bn_mp_sub_d.c ../libtommath/bn_mp_xor.c ../libtommath/bn_mp_zero.c ../libtommath/bn_s_mp_add.c ../libtommath/bn_s_mp_balance_mul.c ../libtommath/bn_s_mp_exptmod.c ../libtommath/bn_s_mp_exptmod_fast.c ../libtommath/bn_s_mp_invmod_fast.c ../libtommath/bn_s_mp_invmod_slow.c ../libtommath/bn_s_mp_karatsuba_mul.c ../libtommath/bn_s_mp_karatsuba_sqr.c ../libtommath/bn_s_mp_montgomery_reduce_fast.c ../libtommath/bn_s_mp_mul_digs.c ../libtommath/bn_s_mp_mul_digs_fast.c ../libtommath/bn_s_mp_mul_high_digs.c ../libtommath/bn_s_mp_mul_high_digs_fast.c ../libtommath/bn_s_mp_rand_platform.c ../libtommath/bn_s_mp_sqr.c ../libtommath/bn_s_mp_sqr_fast.c ../libtommath/bn_s_mp_sub.c ../libtommath/bn_s_mp_toom_mul.c ../libtommath/bn_s_mp_toom_sqr.c abs.c alist.c alloc.c arg.c array.c binding.c block.c bool.c buf.c buf_fd.c buf_file.c buf_getc.c buf_getchar.c buf_inspect.c buf_inspect_s16.c buf_inspect_s16_binary.c buf_inspect_s16_decimal.c buf_inspect_s16_hexadecimal.c buf_inspect_s16_octal.c buf_inspect_s32.c buf_inspect_s32_binary.c buf_inspect_s32_decimal.c buf_inspect_s32_hexadecimal.c buf_inspect_s32_octal.c buf_inspect_s64.c buf_inspect_s64_binary.c buf_inspect_s64_decimal.c buf_inspect_s64_hexadecimal.c buf_inspect_s64_octal.c buf_inspect_s8.c buf_inspect_s8_binary.c buf_inspect_s8_decimal.c buf_inspect_s8_hexadecimal.c buf_inspect_s8_octal.c buf_inspect_sw.c buf_inspect_sw_binary.c buf_inspect_sw_decimal.c buf_inspect_sw_hexadecimal.c buf_inspect_sw_octal.c buf_inspect_u16.c buf_inspect_u16_binary.c buf_inspect_u16_decimal.c buf_inspect_u16_hexadecimal.c buf_inspect_u16_octal.c buf_inspect_u32.c buf_inspect_u32_binary.c buf_inspect_u32_decimal.c buf_inspect_u32_hexadecimal.c buf_inspect_u32_octal.c buf_inspect_u64.c buf_inspect_u64_binary.c buf_inspect_u64_decimal.c buf_inspect_u64_hexadecimal.c buf_inspect_u64_octal.c buf_inspect_u8.c buf_inspect_u8_binary.c buf_inspect_u8_decimal.c buf_inspect_u8_hexadecimal.c buf_inspect_u8_octal.c buf_inspect_uw.c buf_inspect_uw_binary.c buf_inspect_uw_decimal.c buf_inspect_uw_hexadecimal.c buf_inspect_uw_octal.c buf_parse.c buf_parse_s16.c buf_parse_s32.c buf_parse_s64.c buf_parse_s8.c buf_parse_sw.c buf_parse_u16.c buf_parse_u32.c buf_parse_u64.c buf_parse_u8.c buf_parse_uw.c buf_rw.c buf_save.c call.c callable.c cast.c ceiling.c cfn.c character.c compare.c complex.c cow.c crypt.c crypt_sha512.c data.c deserialize.c env.c env_fork.c error.c error_handler.c eval.c f128.c f32.c f64.c fact.c fact_action.c fact_list.c facts.c facts_cursor.c facts_spec.c facts_spec_cursor.c facts_transaction.c facts_with.c facts_with_cursor.c fd.c file.c fn.c fn_clause.c frame.c hash.c ident.c inspect.c integer.c io.c kc3.c license.c list.c list_init.c log.c map.c module.c mutex.c operator.c pcomplex.c pcow.c pretty.c ptag.c ptr.c ptr_free.c queue.c quote.c ratio.c rwlock.c s16.c s32.c s64.c s8.c sequence.c serialize.c set__fact.c set__tag.c set_cursor__fact.c set_cursor__tag.c set_item__fact.c set_item__tag.c sh.c sha1.c sign.c skiplist__fact.c skiplist_node__fact.c special_operator.c str.c struct.c struct_type.c sw.c sym.c tag.c tag_add.c tag_addi.c tag_band.c tag_bnot.c tag_bor.c tag_bxor.c tag_div.c tag_init.c tag_mod.c tag_mul.c tag_neg.c tag_shift_left.c tag_shift_right.c tag_sqrt.c tag_sub.c tag_type.c time.c to_lisp.c tuple.c u16.c u32.c u64.c u8.c ucd.c unquote.c uw.c var.c void.c wait.c '
+HEADERS='abs.h alist.h alloc.h arg.h array.h assert.h binding.h block.h bool.h buf.h buf_fd.h buf_file.h buf_getc.h buf_getchar.h buf_inspect.h buf_inspect_s16.h buf_inspect_s16_binary.h buf_inspect_s16_decimal.h buf_inspect_s16_hexadecimal.h buf_inspect_s16_octal.h buf_inspect_s32.h buf_inspect_s32_binary.h buf_inspect_s32_decimal.h buf_inspect_s32_hexadecimal.h buf_inspect_s32_octal.h buf_inspect_s64.h buf_inspect_s64_binary.h buf_inspect_s64_decimal.h buf_inspect_s64_hexadecimal.h buf_inspect_s64_octal.h buf_inspect_s8.h buf_inspect_s8_binary.h buf_inspect_s8_decimal.h buf_inspect_s8_hexadecimal.h buf_inspect_s8_octal.h buf_inspect_sw.h buf_inspect_sw_binary.h buf_inspect_sw_decimal.h buf_inspect_sw_hexadecimal.h buf_inspect_sw_octal.h buf_inspect_u16.h buf_inspect_u16_binary.h buf_inspect_u16_decimal.h buf_inspect_u16_hexadecimal.h buf_inspect_u16_octal.h buf_inspect_u32.h buf_inspect_u32_binary.h buf_inspect_u32_decimal.h buf_inspect_u32_hexadecimal.h buf_inspect_u32_octal.h buf_inspect_u64.h buf_inspect_u64_binary.h buf_inspect_u64_decimal.h buf_inspect_u64_hexadecimal.h buf_inspect_u64_octal.h buf_inspect_u8.h buf_inspect_u8_binary.h buf_inspect_u8_decimal.h buf_inspect_u8_hexadecimal.h buf_inspect_u8_octal.h buf_inspect_uw.h buf_inspect_uw_binary.h buf_inspect_uw_decimal.h buf_inspect_uw_hexadecimal.h buf_inspect_uw_octal.h buf_parse.h buf_parse_s16.h buf_parse_s32.h buf_parse_s64.h buf_parse_s8.h buf_parse_sw.h buf_parse_u16.h buf_parse_u32.h buf_parse_u64.h buf_parse_u8.h buf_parse_uw.h buf_rw.h buf_save.h call.h callable.h cast.h ceiling.h cfn.h character.h compare.h complex.h cow.h crypt.h data.h deserialize.h env.h env_fork.h error.h error_handler.h eval.h explicit_bzero.h f128.h f32.h f64.h fact.h fact_action.h fact_list.h facts.h facts_cursor.h facts_spec.h facts_spec_cursor.h facts_transaction.h facts_with.h facts_with_cursor.h fd.h file.h float.h fn.h fn_clause.h frame.h hash.h ident.h inspect.h integer.h io.h kc3.h kc3_main.h list.h list_init.h log.h map.h module.h mutex.h operator.h pcomplex.h pcow.h pretty.h ptag.h ptr.h ptr_free.h queue.h quote.h ratio.h rwlock.h s16.h s32.h s64.h s8.h sequence.h serialize.h set__fact.h set__tag.h set_cursor__fact.h set_cursor__tag.h set_item__fact.h set_item__tag.h sh.h sha1.h sign.h skiplist__alloc.h skiplist__fact.h skiplist_node__alloc.h skiplist_node__fact.h special_operator.h str.h struct.h struct_type.h sw.h sym.h tag.h tag_init.h tag_type.h time.h to_lisp.h tuple.h types.h u16.h u32.h u64.h u8.h ucd.h unquote.h uw.h var.h void.h wait.h '
+SOURCES='abs.c alist.c alloc.c arg.c array.c binding.c block.c bool.c buf.c buf_fd.c buf_file.c buf_getc.c buf_getchar.c buf_inspect.c buf_inspect_s16.c buf_inspect_s16_binary.c buf_inspect_s16_decimal.c buf_inspect_s16_hexadecimal.c buf_inspect_s16_octal.c buf_inspect_s32.c buf_inspect_s32_binary.c buf_inspect_s32_decimal.c buf_inspect_s32_hexadecimal.c buf_inspect_s32_octal.c buf_inspect_s64.c buf_inspect_s64_binary.c buf_inspect_s64_decimal.c buf_inspect_s64_hexadecimal.c buf_inspect_s64_octal.c buf_inspect_s8.c buf_inspect_s8_binary.c buf_inspect_s8_decimal.c buf_inspect_s8_hexadecimal.c buf_inspect_s8_octal.c buf_inspect_sw.c buf_inspect_sw_binary.c buf_inspect_sw_decimal.c buf_inspect_sw_hexadecimal.c buf_inspect_sw_octal.c buf_inspect_u16.c buf_inspect_u16_binary.c buf_inspect_u16_decimal.c buf_inspect_u16_hexadecimal.c buf_inspect_u16_octal.c buf_inspect_u32.c buf_inspect_u32_binary.c buf_inspect_u32_decimal.c buf_inspect_u32_hexadecimal.c buf_inspect_u32_octal.c buf_inspect_u64.c buf_inspect_u64_binary.c buf_inspect_u64_decimal.c buf_inspect_u64_hexadecimal.c buf_inspect_u64_octal.c buf_inspect_u8.c buf_inspect_u8_binary.c buf_inspect_u8_decimal.c buf_inspect_u8_hexadecimal.c buf_inspect_u8_octal.c buf_inspect_uw.c buf_inspect_uw_binary.c buf_inspect_uw_decimal.c buf_inspect_uw_hexadecimal.c buf_inspect_uw_octal.c buf_parse.c buf_parse_s16.c buf_parse_s32.c buf_parse_s64.c buf_parse_s8.c buf_parse_sw.c buf_parse_u16.c buf_parse_u32.c buf_parse_u64.c buf_parse_u8.c buf_parse_uw.c buf_rw.c buf_save.c call.c callable.c cast.c ceiling.c cfn.c character.c compare.c complex.c cow.c crypt.c crypt_sha512.c data.c deserialize.c env.c env_fork.c error.c error_handler.c eval.c f128.c f32.c f64.c fact.c fact_action.c fact_list.c facts.c facts_cursor.c facts_spec.c facts_spec_cursor.c facts_transaction.c facts_with.c facts_with_cursor.c fd.c file.c fn.c fn_clause.c frame.c hash.c ident.c inspect.c integer.c io.c kc3.c license.c list.c list_init.c log.c map.c module.c mutex.c operator.c pcomplex.c pcow.c pretty.c ptag.c ptr.c ptr_free.c queue.c quote.c ratio.c rwlock.c s16.c s32.c s64.c s8.c sequence.c serialize.c set__fact.c set__tag.c set_cursor__fact.c set_cursor__tag.c set_item__fact.c set_item__tag.c sh.c sha1.c sign.c skiplist__alloc.c skiplist__fact.c skiplist_node__alloc.c skiplist_node__fact.c special_operator.c str.c struct.c struct_type.c sw.c sym.c tag.c tag_add.c tag_addi.c tag_band.c tag_bnot.c tag_bor.c tag_bxor.c tag_div.c tag_init.c tag_mod.c tag_mul.c tag_neg.c tag_shift_left.c tag_shift_right.c tag_sqrt.c tag_sub.c tag_type.c time.c to_lisp.c tuple.c u16.c u32.c u64.c u8.c ucd.c unquote.c uw.c var.c void.c wait.c '
+LO_SOURCES=' ../libtommath/bn_cutoffs.c ../libtommath/bn_mp_2expt.c ../libtommath/bn_mp_abs.c ../libtommath/bn_mp_add.c ../libtommath/bn_mp_add_d.c ../libtommath/bn_mp_and.c ../libtommath/bn_mp_clamp.c ../libtommath/bn_mp_clear.c ../libtommath/bn_mp_clear_multi.c ../libtommath/bn_mp_cmp.c ../libtommath/bn_mp_cmp_d.c ../libtommath/bn_mp_cmp_mag.c ../libtommath/bn_mp_cnt_lsb.c ../libtommath/bn_mp_complement.c ../libtommath/bn_mp_copy.c ../libtommath/bn_mp_count_bits.c ../libtommath/bn_mp_div.c ../libtommath/bn_mp_div_2.c ../libtommath/bn_mp_div_2d.c ../libtommath/bn_mp_div_3.c ../libtommath/bn_mp_div_d.c ../libtommath/bn_mp_dr_is_modulus.c ../libtommath/bn_mp_dr_reduce.c ../libtommath/bn_mp_dr_setup.c ../libtommath/bn_mp_error_to_string.c ../libtommath/bn_mp_exch.c ../libtommath/bn_mp_exptmod.c ../libtommath/bn_mp_gcd.c ../libtommath/bn_mp_get_double.c ../libtommath/bn_mp_get_i32.c ../libtommath/bn_mp_get_i64.c ../libtommath/bn_mp_get_mag_u32.c ../libtommath/bn_mp_get_mag_u64.c ../libtommath/bn_mp_grow.c ../libtommath/bn_mp_init.c ../libtommath/bn_mp_init_copy.c ../libtommath/bn_mp_init_multi.c ../libtommath/bn_mp_init_size.c ../libtommath/bn_mp_invmod.c ../libtommath/bn_mp_lcm.c ../libtommath/bn_mp_lshd.c ../libtommath/bn_mp_mod.c ../libtommath/bn_mp_mod_2d.c ../libtommath/bn_mp_montgomery_calc_normalization.c ../libtommath/bn_mp_montgomery_reduce.c ../libtommath/bn_mp_montgomery_setup.c ../libtommath/bn_mp_mul.c ../libtommath/bn_mp_mul_2.c ../libtommath/bn_mp_mul_2d.c ../libtommath/bn_mp_mul_d.c ../libtommath/bn_mp_mulmod.c ../libtommath/bn_mp_neg.c ../libtommath/bn_mp_or.c ../libtommath/bn_mp_radix_size.c ../libtommath/bn_mp_reduce.c ../libtommath/bn_mp_reduce_2k.c ../libtommath/bn_mp_reduce_2k_l.c ../libtommath/bn_mp_reduce_2k_setup.c ../libtommath/bn_mp_reduce_2k_setup_l.c ../libtommath/bn_mp_reduce_is_2k.c ../libtommath/bn_mp_reduce_is_2k_l.c ../libtommath/bn_mp_reduce_setup.c ../libtommath/bn_mp_rshd.c ../libtommath/bn_mp_set.c ../libtommath/bn_mp_set_double.c ../libtommath/bn_mp_set_i32.c ../libtommath/bn_mp_set_i64.c ../libtommath/bn_mp_set_l.c ../libtommath/bn_mp_set_u32.c ../libtommath/bn_mp_set_u64.c ../libtommath/bn_mp_set_ul.c ../libtommath/bn_mp_sqr.c ../libtommath/bn_mp_sqrt.c ../libtommath/bn_mp_sub.c ../libtommath/bn_mp_sub_d.c ../libtommath/bn_mp_xor.c ../libtommath/bn_mp_zero.c ../libtommath/bn_s_mp_add.c ../libtommath/bn_s_mp_balance_mul.c ../libtommath/bn_s_mp_exptmod.c ../libtommath/bn_s_mp_exptmod_fast.c ../libtommath/bn_s_mp_invmod_fast.c ../libtommath/bn_s_mp_invmod_slow.c ../libtommath/bn_s_mp_karatsuba_mul.c ../libtommath/bn_s_mp_karatsuba_sqr.c ../libtommath/bn_s_mp_montgomery_reduce_fast.c ../libtommath/bn_s_mp_mul_digs.c ../libtommath/bn_s_mp_mul_digs_fast.c ../libtommath/bn_s_mp_mul_high_digs.c ../libtommath/bn_s_mp_mul_high_digs_fast.c ../libtommath/bn_s_mp_rand_platform.c ../libtommath/bn_s_mp_sqr.c ../libtommath/bn_s_mp_sqr_fast.c ../libtommath/bn_s_mp_sub.c ../libtommath/bn_s_mp_toom_mul.c ../libtommath/bn_s_mp_toom_sqr.c abs.c alist.c alloc.c arg.c array.c binding.c block.c bool.c buf.c buf_fd.c buf_file.c buf_getc.c buf_getchar.c buf_inspect.c buf_inspect_s16.c buf_inspect_s16_binary.c buf_inspect_s16_decimal.c buf_inspect_s16_hexadecimal.c buf_inspect_s16_octal.c buf_inspect_s32.c buf_inspect_s32_binary.c buf_inspect_s32_decimal.c buf_inspect_s32_hexadecimal.c buf_inspect_s32_octal.c buf_inspect_s64.c buf_inspect_s64_binary.c buf_inspect_s64_decimal.c buf_inspect_s64_hexadecimal.c buf_inspect_s64_octal.c buf_inspect_s8.c buf_inspect_s8_binary.c buf_inspect_s8_decimal.c buf_inspect_s8_hexadecimal.c buf_inspect_s8_octal.c buf_inspect_sw.c buf_inspect_sw_binary.c buf_inspect_sw_decimal.c buf_inspect_sw_hexadecimal.c buf_inspect_sw_octal.c buf_inspect_u16.c buf_inspect_u16_binary.c buf_inspect_u16_decimal.c buf_inspect_u16_hexadecimal.c buf_inspect_u16_octal.c buf_inspect_u32.c buf_inspect_u32_binary.c buf_inspect_u32_decimal.c buf_inspect_u32_hexadecimal.c buf_inspect_u32_octal.c buf_inspect_u64.c buf_inspect_u64_binary.c buf_inspect_u64_decimal.c buf_inspect_u64_hexadecimal.c buf_inspect_u64_octal.c buf_inspect_u8.c buf_inspect_u8_binary.c buf_inspect_u8_decimal.c buf_inspect_u8_hexadecimal.c buf_inspect_u8_octal.c buf_inspect_uw.c buf_inspect_uw_binary.c buf_inspect_uw_decimal.c buf_inspect_uw_hexadecimal.c buf_inspect_uw_octal.c buf_parse.c buf_parse_s16.c buf_parse_s32.c buf_parse_s64.c buf_parse_s8.c buf_parse_sw.c buf_parse_u16.c buf_parse_u32.c buf_parse_u64.c buf_parse_u8.c buf_parse_uw.c buf_rw.c buf_save.c call.c callable.c cast.c ceiling.c cfn.c character.c compare.c complex.c cow.c crypt.c crypt_sha512.c data.c deserialize.c env.c env_fork.c error.c error_handler.c eval.c f128.c f32.c f64.c fact.c fact_action.c fact_list.c facts.c facts_cursor.c facts_spec.c facts_spec_cursor.c facts_transaction.c facts_with.c facts_with_cursor.c fd.c file.c fn.c fn_clause.c frame.c hash.c ident.c inspect.c integer.c io.c kc3.c license.c list.c list_init.c log.c map.c module.c mutex.c operator.c pcomplex.c pcow.c pretty.c ptag.c ptr.c ptr_free.c queue.c quote.c ratio.c rwlock.c s16.c s32.c s64.c s8.c sequence.c serialize.c set__fact.c set__tag.c set_cursor__fact.c set_cursor__tag.c set_item__fact.c set_item__tag.c sh.c sha1.c sign.c skiplist__alloc.c skiplist__fact.c skiplist_node__alloc.c skiplist_node__fact.c special_operator.c str.c struct.c struct_type.c sw.c sym.c tag.c tag_add.c tag_addi.c tag_band.c tag_bnot.c tag_bor.c tag_bxor.c tag_div.c tag_init.c tag_mod.c tag_mul.c tag_neg.c tag_shift_left.c tag_shift_right.c tag_sqrt.c tag_sub.c tag_type.c time.c to_lisp.c tuple.c u16.c u32.c u64.c u8.c ucd.c unquote.c uw.c var.c void.c wait.c '
diff --git a/libkc3/struct.c b/libkc3/struct.c
index a908f22..a4d1c4f 100644
--- a/libkc3/struct.c
+++ b/libkc3/struct.c
@@ -191,6 +191,11 @@ u8 struct_get_u8 (const s_struct *s, const s_sym *key)
return *(u8 *) struct_get(s, key);
}
+uw struct_get_uw (const s_struct *s, const s_sym *key)
+{
+ return *(uw *) struct_get(s, key);
+}
+
const s_sym ** struct_get_var_type (const s_struct *s, const s_sym *key,
const s_sym **dest)
{
@@ -204,6 +209,11 @@ void * struct_get_w (s_struct *s, const s_sym *key)
uw i = 0;
assert(s);
assert(key);
+ if (! s->data) {
+ err_puts("struct_get_w: struct is not allocated");
+ assert(! "struct_get_w: struct is not allocated");
+ return NULL;
+ }
if (! struct_find_key_index(s, key, &i))
return NULL;
assert(i < s->type->map.count);
diff --git a/libkc3/types.h b/libkc3/types.h
index 792593a..41d7955 100644
--- a/libkc3/types.h
+++ b/libkc3/types.h
@@ -174,6 +174,7 @@ typedef enum {
} e_tag_type;
/* structs */
+typedef struct alloc s_alloc;
typedef struct arg s_arg;
typedef struct array s_array;
typedef struct array_dimension s_array_dimension;
@@ -264,7 +265,12 @@ typedef bool (* f_sequence_button) (s_sequence *seq, u8 button, sw x,
#define SKIPLIST_HEIGHT_MAX U64_MAX
/* 1 */
-
+
+struct alloc {
+ uw size;
+ void *start;
+};
+
struct array_dimension {
uw count;
uw item_size;
@@ -454,8 +460,8 @@ struct file_stat {
uw st_blksize; /* Block size for filesystem I/O */
uw st_blocks; /* Number of 512B blocks allocated */
s_time st_atim; /* Time of last access */
- s_time st_mtim; /* Time of last modification */
s_time st_ctim; /* Time of last status change */
+ s_time st_mtim; /* Time of last modification */
};
struct ident {
@@ -737,6 +743,7 @@ TYPEDEF_SET_CURSOR(fact);
u8 height; \
} s_skiplist_node__##name
+TYPEDEF_SKIPLIST_NODE(alloc, s_alloc *);
TYPEDEF_SKIPLIST_NODE(fact, s_fact *);
#define TYPEDEF_SKIPLIST(name, type) \
@@ -747,6 +754,7 @@ TYPEDEF_SKIPLIST_NODE(fact, s_fact *);
u8 max_height; \
} s_skiplist__##name
+TYPEDEF_SKIPLIST(alloc, s_alloc *);
TYPEDEF_SKIPLIST(fact, s_fact *);
/* 8 */
diff --git a/sources.mk b/sources.mk
index 4ef6053..88bb3d3 100644
--- a/sources.mk
+++ b/sources.mk
@@ -6,6 +6,11 @@ KC3_CONFIGURES = \
"event/configure" \
"event/sources.sh" \
"event/update_sources" \
+ "fs/configure" \
+ "fs/fuse/configure" \
+ "fs/fuse/sources.sh" \
+ "fs/fuse/update_sources" \
+ "fs/update_sources" \
"gtk4/configure" \
"gtk4/sources.sh" \
"gtk4/update_sources" \
@@ -81,6 +86,9 @@ KC3_MAKEFILES = \
"ekc3/sources.mk" \
"event/Makefile" \
"event/sources.mk" \
+ "fs/Makefile" \
+ "fs/fuse/Makefile" \
+ "fs/fuse/sources.mk" \
"gtk4/Makefile" \
"gtk4/sources.mk" \
"http/Makefile" \
@@ -141,6 +149,9 @@ KC3_C_SOURCES = \
"ekc3/types.h" \
"event/event.c" \
"event/event.h" \
+ "fs/OpenBSD/kc3fs.h" \
+ "fs/fuse/mount_kc3fs.c" \
+ "fs/fuse/types.h" \
"gtk4/action_map.c" \
"gtk4/action_map.h" \
"gtk4/application.c" \
@@ -542,10 +553,14 @@ KC3_C_SOURCES = \
"libkc3/sign.h" \
"libkc3/skiplist.c.in" \
"libkc3/skiplist.h.in" \
+ "libkc3/skiplist__alloc.c" \
+ "libkc3/skiplist__alloc.h" \
"libkc3/skiplist__fact.c" \
"libkc3/skiplist__fact.h" \
"libkc3/skiplist_node.c.in" \
"libkc3/skiplist_node.h.in" \
+ "libkc3/skiplist_node__alloc.c" \
+ "libkc3/skiplist_node__alloc.h" \
"libkc3/skiplist_node__fact.c" \
"libkc3/skiplist_node__fact.h" \
"libkc3/special_operator.c" \
@@ -1113,6 +1128,7 @@ KC3_LIB_SOURCES = \
"lib/kc3/0.1/fd.kc3" \
"lib/kc3/0.1/file.kc3" \
"lib/kc3/0.1/file/stat.kc3" \
+ "lib/kc3/0.1/file_stat.kc3" \
"lib/kc3/0.1/gl/dvec2.kc3" \
"lib/kc3/0.1/gl/dvec3.kc3" \
"lib/kc3/0.1/gl/object.kc3" \
@@ -1156,6 +1172,7 @@ KC3_LIB_SOURCES = \
"lib/kc3/0.1/list.kc3" \
"lib/kc3/0.1/map.facts" \
"lib/kc3/0.1/markdown.kc3" \
+ "lib/kc3/0.1/parse.kc3" \
"lib/kc3/0.1/ptr.facts" \
"lib/kc3/0.1/ptr_free.facts" \
"lib/kc3/0.1/ratio.facts" \
diff --git a/sources.sh b/sources.sh
index 659df00..81c82d2 100644
--- a/sources.sh
+++ b/sources.sh
@@ -1,11 +1,11 @@
# sources.sh generated by update_sources
-KC3_CONFIGURES='ekc3/configure ekc3/sources.sh ekc3/update_sources event/configure event/sources.sh event/update_sources gtk4/configure gtk4/sources.sh gtk4/update_sources http/configure http/sources.sh http/update_sources httpd/configure httpd/sources.sh httpd/update_sources ikc3/configure ikc3/sources.sh ikc3/update_sources json/configure json/sources.sh json/update_sources kc3c/configure kc3s/configure kc3s/sources.sh kc3s/update_sources libkc3/configure libkc3/sources.sh libkc3/update_sources libtommath/configure libtommath/sources.sh libtommath/update_sources markdown/configure markdown/sources.sh markdown/update_sources socket/configure socket/sources.sh socket/update_sources test/configure test/sources.sh test/update_sources ucd2c/configure window/cairo/configure window/cairo/demo/configure window/cairo/demo/sources.sh window/cairo/demo/update_sources window/cairo/quartz/configure window/cairo/quartz/demo/configure window/cairo/quartz/demo/sources.sh window/cairo/quartz/demo/update_sources window/cairo/quartz/sources.sh window/cairo/quartz/update_sources window/cairo/sources.sh window/cairo/update_sources window/cairo/win32/configure window/cairo/win32/demo/configure window/cairo/win32/demo/sources.sh window/cairo/win32/demo/update_sources window/cairo/win32/sources.sh window/cairo/win32/update_sources window/cairo/xcb/configure window/cairo/xcb/demo/configure window/cairo/xcb/demo/sources.sh window/cairo/xcb/demo/update_sources window/cairo/xcb/sources.sh window/cairo/xcb/update_sources window/configure window/sdl2/configure window/sdl2/demo/configure window/sdl2/demo/macos/configure window/sdl2/demo/sources.sh window/sdl2/demo/update_sources window/sdl2/sources.sh window/sdl2/update_sources window/sources.sh window/update_sources '
-KC3_MAKEFILES='ekc3/Makefile ekc3/sources.mk event/Makefile event/sources.mk gtk4/Makefile gtk4/sources.mk http/Makefile http/sources.mk httpd/Makefile httpd/fx/assets/Makefile httpd/sources.mk ikc3/Makefile ikc3/sources.mk json/Makefile json/sources.mk kc3c/Makefile kc3s/Makefile kc3s/sources.mk libkc3/Makefile libkc3/gen.mk libkc3/sources.mk libtommath/Makefile libtommath/sources.mk markdown/Makefile markdown/sources.mk socket/Makefile socket/sources.mk test/Makefile test/httpd/Makefile test/httpd/assets/Makefile test/sources.mk ucd2c/Makefile window/Makefile window/cairo/Makefile window/cairo/demo/Makefile window/cairo/demo/sources.mk window/cairo/quartz/Makefile window/cairo/quartz/demo/Makefile window/cairo/quartz/demo/sources.mk window/cairo/quartz/sources.mk window/cairo/sources.mk window/cairo/win32/Makefile window/cairo/win32/demo/Makefile window/cairo/win32/demo/sources.mk window/cairo/win32/sources.mk window/cairo/xcb/Makefile window/cairo/xcb/demo/Makefile window/cairo/xcb/demo/sources.mk window/cairo/xcb/sources.mk window/sdl2/Makefile window/sdl2/demo/Makefile window/sdl2/demo/macos/Makefile window/sdl2/demo/sources.mk window/sdl2/sources.mk window/sources.mk '
-KC3_C_SOURCES='ekc3/ekc3.c ekc3/ekc3.h ekc3/html.c ekc3/html.h ekc3/types.h event/event.c event/event.h gtk4/action_map.c gtk4/action_map.h gtk4/application.c gtk4/application.h gtk4/application_window.c gtk4/application_window.h gtk4/box.c gtk4/box.h gtk4/button.c gtk4/button.h gtk4/entry.c gtk4/entry.h gtk4/entry_buffer.c gtk4/entry_buffer.h gtk4/file.c gtk4/file.h gtk4/frame.c gtk4/frame.h gtk4/kc3_glib.c gtk4/kc3_glib.h gtk4/kc3_gtk4.h gtk4/label.c gtk4/label.h gtk4/list_box.c gtk4/list_box.h gtk4/menu.c gtk4/menu.h gtk4/menu_item.c gtk4/menu_item.h gtk4/object.c gtk4/object.h gtk4/paned.c gtk4/paned.h gtk4/scrolled_window.c gtk4/scrolled_window.h gtk4/signal.c gtk4/signal.h gtk4/simple_action.c gtk4/simple_action.h gtk4/text.c gtk4/text.h gtk4/text_view.c gtk4/text_view.h gtk4/types.h gtk4/widget.c gtk4/widget.h gtk4/window.c gtk4/window.h http/http.c http/http.h http/http_request.c http/http_request.h http/http_response.c http/http_response.h http/mime_type.c http/mime_type.h http/types.h http/url.c http/url.h httpd/httpd.c httpd/httpd.h ikc3/buf_linenoise.c ikc3/buf_linenoise.h ikc3/buf_wineditline.c ikc3/buf_wineditline.h ikc3/ikc3.c ikc3/linenoise.c json/json.c json/json.h kc3c/c3c.c kc3s/buf_readline.c kc3s/buf_readline.h kc3s/kc3s.c libkc3/abs.c libkc3/abs.h libkc3/alist.c libkc3/alist.h libkc3/alloc.c libkc3/alloc.h libkc3/arg.c libkc3/arg.h libkc3/array.c libkc3/array.h libkc3/assert.h libkc3/binding.c libkc3/binding.h libkc3/block.c libkc3/block.h libkc3/bool.c libkc3/bool.h libkc3/buf.c libkc3/buf.h libkc3/buf_fd.c libkc3/buf_fd.h libkc3/buf_file.c libkc3/buf_file.h libkc3/buf_getc.c libkc3/buf_getc.h libkc3/buf_getchar.c libkc3/buf_getchar.h libkc3/buf_inspect.c libkc3/buf_inspect.h libkc3/buf_inspect_s.c.in libkc3/buf_inspect_s.h.in libkc3/buf_inspect_s16.c libkc3/buf_inspect_s16.h libkc3/buf_inspect_s16_binary.c libkc3/buf_inspect_s16_binary.h libkc3/buf_inspect_s16_decimal.c libkc3/buf_inspect_s16_decimal.h libkc3/buf_inspect_s16_hexadecimal.c libkc3/buf_inspect_s16_hexadecimal.h libkc3/buf_inspect_s16_octal.c libkc3/buf_inspect_s16_octal.h libkc3/buf_inspect_s32.c libkc3/buf_inspect_s32.h libkc3/buf_inspect_s32_binary.c libkc3/buf_inspect_s32_binary.h libkc3/buf_inspect_s32_decimal.c libkc3/buf_inspect_s32_decimal.h libkc3/buf_inspect_s32_hexadecimal.c libkc3/buf_inspect_s32_hexadecimal.h libkc3/buf_inspect_s32_octal.c libkc3/buf_inspect_s32_octal.h libkc3/buf_inspect_s64.c libkc3/buf_inspect_s64.h libkc3/buf_inspect_s64_binary.c libkc3/buf_inspect_s64_binary.h libkc3/buf_inspect_s64_decimal.c libkc3/buf_inspect_s64_decimal.h libkc3/buf_inspect_s64_hexadecimal.c libkc3/buf_inspect_s64_hexadecimal.h libkc3/buf_inspect_s64_octal.c libkc3/buf_inspect_s64_octal.h libkc3/buf_inspect_s8.c libkc3/buf_inspect_s8.h libkc3/buf_inspect_s8_binary.c libkc3/buf_inspect_s8_binary.h libkc3/buf_inspect_s8_decimal.c libkc3/buf_inspect_s8_decimal.h libkc3/buf_inspect_s8_hexadecimal.c libkc3/buf_inspect_s8_hexadecimal.h libkc3/buf_inspect_s8_octal.c libkc3/buf_inspect_s8_octal.h libkc3/buf_inspect_s_base.c.in libkc3/buf_inspect_s_base.h.in libkc3/buf_inspect_sw.c libkc3/buf_inspect_sw.h libkc3/buf_inspect_sw_binary.c libkc3/buf_inspect_sw_binary.h libkc3/buf_inspect_sw_decimal.c libkc3/buf_inspect_sw_decimal.h libkc3/buf_inspect_sw_hexadecimal.c libkc3/buf_inspect_sw_hexadecimal.h libkc3/buf_inspect_sw_octal.c libkc3/buf_inspect_sw_octal.h libkc3/buf_inspect_u.c.in libkc3/buf_inspect_u.h.in libkc3/buf_inspect_u16.c libkc3/buf_inspect_u16.h libkc3/buf_inspect_u16_binary.c libkc3/buf_inspect_u16_binary.h libkc3/buf_inspect_u16_decimal.c libkc3/buf_inspect_u16_decimal.h libkc3/buf_inspect_u16_hexadecimal.c libkc3/buf_inspect_u16_hexadecimal.h libkc3/buf_inspect_u16_octal.c libkc3/buf_inspect_u16_octal.h libkc3/buf_inspect_u32.c libkc3/buf_inspect_u32.h libkc3/buf_inspect_u32_binary.c libkc3/buf_inspect_u32_binary.h libkc3/buf_inspect_u32_decimal.c libkc3/buf_inspect_u32_decimal.h libkc3/buf_inspect_u32_hexadecimal.c libkc3/buf_inspect_u32_hexadecimal.h libkc3/buf_inspect_u32_octal.c libkc3/buf_inspect_u32_octal.h libkc3/buf_inspect_u64.c libkc3/buf_inspect_u64.h libkc3/buf_inspect_u64_binary.c libkc3/buf_inspect_u64_binary.h libkc3/buf_inspect_u64_decimal.c libkc3/buf_inspect_u64_decimal.h libkc3/buf_inspect_u64_hexadecimal.c libkc3/buf_inspect_u64_hexadecimal.h libkc3/buf_inspect_u64_octal.c libkc3/buf_inspect_u64_octal.h libkc3/buf_inspect_u8.c libkc3/buf_inspect_u8.h libkc3/buf_inspect_u8_binary.c libkc3/buf_inspect_u8_binary.h libkc3/buf_inspect_u8_decimal.c libkc3/buf_inspect_u8_decimal.h libkc3/buf_inspect_u8_hexadecimal.c libkc3/buf_inspect_u8_hexadecimal.h libkc3/buf_inspect_u8_octal.c libkc3/buf_inspect_u8_octal.h libkc3/buf_inspect_u_base.c.in libkc3/buf_inspect_u_base.h.in libkc3/buf_inspect_uw.c libkc3/buf_inspect_uw.h libkc3/buf_inspect_uw_binary.c libkc3/buf_inspect_uw_binary.h libkc3/buf_inspect_uw_decimal.c libkc3/buf_inspect_uw_decimal.h libkc3/buf_inspect_uw_hexadecimal.c libkc3/buf_inspect_uw_hexadecimal.h libkc3/buf_inspect_uw_octal.c libkc3/buf_inspect_uw_octal.h libkc3/buf_parse.c libkc3/buf_parse.h libkc3/buf_parse_s.c.in libkc3/buf_parse_s.h.in libkc3/buf_parse_s16.c libkc3/buf_parse_s16.h libkc3/buf_parse_s32.c libkc3/buf_parse_s32.h libkc3/buf_parse_s64.c libkc3/buf_parse_s64.h libkc3/buf_parse_s8.c libkc3/buf_parse_s8.h libkc3/buf_parse_sw.c libkc3/buf_parse_sw.h libkc3/buf_parse_u.c.in libkc3/buf_parse_u.h.in libkc3/buf_parse_u16.c libkc3/buf_parse_u16.h libkc3/buf_parse_u32.c libkc3/buf_parse_u32.h libkc3/buf_parse_u64.c libkc3/buf_parse_u64.h libkc3/buf_parse_u8.c libkc3/buf_parse_u8.h libkc3/buf_parse_uw.c libkc3/buf_parse_uw.h libkc3/buf_rw.c libkc3/buf_rw.h libkc3/buf_save.c libkc3/buf_save.h libkc3/call.c libkc3/call.h libkc3/callable.c libkc3/callable.h libkc3/cast.c libkc3/cast.h libkc3/ceiling.c libkc3/ceiling.h libkc3/cfn.c libkc3/cfn.h libkc3/character.c libkc3/character.h libkc3/compare.c libkc3/compare.h libkc3/complex.c libkc3/complex.h libkc3/cow.c libkc3/cow.h libkc3/crypt.c libkc3/crypt.h libkc3/crypt_sha512.c libkc3/data.c libkc3/data.h libkc3/deserialize.c libkc3/deserialize.h libkc3/env.c libkc3/env.h libkc3/env_fork.c libkc3/env_fork.h libkc3/error.c libkc3/error.h libkc3/error_handler.c libkc3/error_handler.h libkc3/eval.c libkc3/eval.h libkc3/explicit_bzero.h libkc3/f128.c libkc3/f128.h libkc3/f32.c libkc3/f32.h libkc3/f64.c libkc3/f64.h libkc3/fact.c libkc3/fact.h libkc3/fact_action.c libkc3/fact_action.h libkc3/fact_list.c libkc3/fact_list.h libkc3/facts.c libkc3/facts.h libkc3/facts_cursor.c libkc3/facts_cursor.h libkc3/facts_spec.c libkc3/facts_spec.h libkc3/facts_spec_cursor.c libkc3/facts_spec_cursor.h libkc3/facts_transaction.c libkc3/facts_transaction.h libkc3/facts_with.c libkc3/facts_with.h libkc3/facts_with_cursor.c libkc3/facts_with_cursor.h libkc3/fd.c libkc3/fd.h libkc3/file.c libkc3/file.h libkc3/float.h libkc3/fn.c libkc3/fn.h libkc3/fn_clause.c libkc3/fn_clause.h libkc3/frame.c libkc3/frame.h libkc3/hash.c libkc3/hash.h libkc3/ident.c libkc3/ident.h libkc3/inspect.c libkc3/inspect.h libkc3/integer.c libkc3/integer.h libkc3/io.c libkc3/io.h libkc3/kc3.c libkc3/kc3.h libkc3/kc3_main.h libkc3/license.c libkc3/list.c libkc3/list.h libkc3/list_init.c libkc3/list_init.h libkc3/log.c libkc3/log.h libkc3/map.c libkc3/map.h libkc3/module.c libkc3/module.h libkc3/mutex.c libkc3/mutex.h libkc3/operator.c libkc3/operator.h libkc3/pcomplex.c libkc3/pcomplex.h libkc3/pcow.c libkc3/pcow.h libkc3/pretty.c libkc3/pretty.h libkc3/ptag.c libkc3/ptag.h libkc3/ptr.c libkc3/ptr.h libkc3/ptr_free.c libkc3/ptr_free.h libkc3/queue.c libkc3/queue.h libkc3/quote.c libkc3/quote.h libkc3/ratio.c libkc3/ratio.h libkc3/rwlock.c libkc3/rwlock.h libkc3/s.c.in libkc3/s.h.in libkc3/s16.c libkc3/s16.h libkc3/s32.c libkc3/s32.h libkc3/s64.c libkc3/s64.h libkc3/s8.c libkc3/s8.h libkc3/sequence.c libkc3/sequence.h libkc3/serialize.c libkc3/serialize.h libkc3/set.c.in libkc3/set.h.in libkc3/set__fact.c libkc3/set__fact.h libkc3/set__tag.c libkc3/set__tag.h libkc3/set_cursor.c.in libkc3/set_cursor.h.in libkc3/set_cursor__fact.c libkc3/set_cursor__fact.h libkc3/set_cursor__tag.c libkc3/set_cursor__tag.h libkc3/set_item.c.in libkc3/set_item.h.in libkc3/set_item__fact.c libkc3/set_item__fact.h libkc3/set_item__tag.c libkc3/set_item__tag.h libkc3/sh.c libkc3/sh.h libkc3/sha1.c libkc3/sha1.h libkc3/sign.c libkc3/sign.h libkc3/skiplist.c.in libkc3/skiplist.h.in libkc3/skiplist__fact.c libkc3/skiplist__fact.h libkc3/skiplist_node.c.in libkc3/skiplist_node.h.in libkc3/skiplist_node__fact.c libkc3/skiplist_node__fact.h libkc3/special_operator.c libkc3/special_operator.h libkc3/str.c libkc3/str.h libkc3/struct.c libkc3/struct.h libkc3/struct_type.c libkc3/struct_type.h libkc3/sw.c libkc3/sw.h libkc3/sym.c libkc3/sym.h libkc3/tag.c libkc3/tag.h libkc3/tag_add.c libkc3/tag_addi.c libkc3/tag_band.c libkc3/tag_bnot.c libkc3/tag_bor.c libkc3/tag_bxor.c libkc3/tag_div.c libkc3/tag_init.c libkc3/tag_init.h libkc3/tag_mod.c libkc3/tag_mul.c libkc3/tag_neg.c libkc3/tag_shift_left.c libkc3/tag_shift_right.c libkc3/tag_sqrt.c libkc3/tag_sub.c libkc3/tag_type.c libkc3/tag_type.h libkc3/time.c libkc3/time.h libkc3/to_lisp.c libkc3/to_lisp.h libkc3/tuple.c libkc3/tuple.h libkc3/types.h libkc3/u.c.in libkc3/u.h.in libkc3/u16.c libkc3/u16.h libkc3/u32.c libkc3/u32.h libkc3/u64.c libkc3/u64.h libkc3/u8.c libkc3/u8.h libkc3/ucd.c libkc3/ucd.h libkc3/unquote.c libkc3/unquote.h libkc3/uw.c libkc3/uw.h libkc3/var.c libkc3/var.h libkc3/void.c libkc3/void.h libkc3/wait.c libkc3/wait.h markdown/entity.c markdown/entity.h markdown/markdown.c markdown/markdown.h markdown/md4c-html.c markdown/md4c-html.h markdown/md4c.c markdown/md4c.h socket/socket.c socket/socket.h socket/socket_addr.c socket/socket_addr.h socket/socket_buf.c socket/socket_buf.h socket/types.h test/array_test.c test/bool_test.c test/buf_file_test.c test/buf_inspect_test.c test/buf_parse_test.c test/buf_parse_test.h test/buf_parse_test_s16.c test/buf_parse_test_s32.c test/buf_parse_test_s64.c test/buf_parse_test_s8.c test/buf_parse_test_su.h test/buf_parse_test_u16.c test/buf_parse_test_u32.c test/buf_parse_test_u64.c test/buf_parse_test_u8.c test/buf_test.c test/call_test.c test/cfn_test.c test/character_test.c test/compare_test.c test/compare_test.h test/env_test.c test/fact_test.c test/fact_test.h test/facts_cursor_test.c test/facts_test.c test/facts_with_test.c test/fn_test.c test/hash_test.c test/ident_test.c test/inspect_test.c test/libkc3_test.c test/list_test.c test/ratio_test.c test/set__fact_test.c test/set__tag_test.c test/skiplist__fact_test.c test/str_test.c test/struct_test.c test/sym_test.c test/tag_test.c test/tag_test.h test/test.c test/test.h test/tuple_test.c test/types_test.c ucd2c/ucd.h ucd2c/ucd2c.c window/cairo/cairo_font.c window/cairo/cairo_font.h window/cairo/cairo_sprite.c window/cairo/cairo_sprite.h window/cairo/cairo_text.c window/cairo/cairo_text.h window/cairo/demo/bg_rect.c window/cairo/demo/bg_rect.h window/cairo/demo/flies.c window/cairo/demo/flies.h window/cairo/demo/lightspeed.c window/cairo/demo/lightspeed.h window/cairo/demo/mandelbrot_f128.c window/cairo/demo/mandelbrot_f128.h window/cairo/demo/toasters.c window/cairo/demo/toasters.h window/cairo/demo/window_cairo_demo.c window/cairo/demo/window_cairo_demo.h window/cairo/quartz/demo/window_cairo_quartz_demo.c window/cairo/quartz/quartz_to_xkbcommon.c window/cairo/quartz/quartz_to_xkbcommon.h window/cairo/quartz/window_cairo_quartz.h window/cairo/quartz/window_cairo_quartz_app_delegate.h window/cairo/quartz/window_cairo_quartz_view.h window/cairo/quartz/window_cairo_quartz_view_controller.h window/cairo/quartz/xkbquartz.h window/cairo/types.h window/cairo/win32/demo/window_cairo_win32_demo.c window/cairo/win32/vk_to_xkbcommon.c window/cairo/win32/vk_to_xkbcommon.h window/cairo/win32/window_cairo_win32.c window/cairo/win32/window_cairo_win32.h window/cairo/window_cairo.c window/cairo/window_cairo.h window/cairo/xcb/demo/window_cairo_xcb_demo.c window/cairo/xcb/window_cairo_xcb.c window/cairo/xcb/window_cairo_xcb.h window/sdl2/demo/bg_rect.c window/sdl2/demo/bg_rect.h window/sdl2/demo/earth.c window/sdl2/demo/earth.h window/sdl2/demo/flies.c window/sdl2/demo/flies.h window/sdl2/demo/lightspeed.c window/sdl2/demo/lightspeed.h window/sdl2/demo/mandelbrot_f128.c window/sdl2/demo/mandelbrot_f128.h window/sdl2/demo/matrix.c window/sdl2/demo/matrix.h window/sdl2/demo/toasters.c window/sdl2/demo/toasters.h window/sdl2/demo/window_sdl2_demo.c window/sdl2/demo/window_sdl2_demo.h window/sdl2/disabled/mandelbrot.c window/sdl2/disabled/mandelbrot.h window/sdl2/disabled/sdl2_font.c window/sdl2/disabled/sdl2_font.h window/sdl2/disabled/sdl2_sprite.c window/sdl2/disabled/sdl2_sprite.h window/sdl2/dmat3.h window/sdl2/dmat4.c window/sdl2/dmat4.h window/sdl2/dvec2.c window/sdl2/dvec2.h window/sdl2/dvec3.c window/sdl2/dvec3.h window/sdl2/gl_camera.c window/sdl2/gl_camera.h window/sdl2/gl_cylinder.c window/sdl2/gl_cylinder.h window/sdl2/gl_deprecated.c window/sdl2/gl_deprecated.h window/sdl2/gl_font.c window/sdl2/gl_font.h window/sdl2/gl_lines.c window/sdl2/gl_lines.h window/sdl2/gl_object.c window/sdl2/gl_object.h window/sdl2/gl_ortho.c window/sdl2/gl_ortho.h window/sdl2/gl_sphere.c window/sdl2/gl_sphere.h window/sdl2/gl_sprite.c window/sdl2/gl_sprite.h window/sdl2/gl_square.c window/sdl2/gl_square.h window/sdl2/gl_text.c window/sdl2/gl_text.h window/sdl2/gl_triangle.c window/sdl2/gl_triangle.h window/sdl2/gl_vertex.c window/sdl2/gl_vertex.h window/sdl2/gl_vtext.c window/sdl2/gl_vtext.h window/sdl2/mat3.h window/sdl2/mat4.c window/sdl2/mat4.h window/sdl2/types.h window/sdl2/vec2.c window/sdl2/vec2.h window/sdl2/vec3.c window/sdl2/vec3.h window/sdl2/window_sdl2.c window/sdl2/window_sdl2.h window/types.h window/window.c window/window.h '
+KC3_CONFIGURES='ekc3/configure ekc3/sources.sh ekc3/update_sources event/configure event/sources.sh event/update_sources fs/configure fs/fuse/configure fs/fuse/sources.sh fs/fuse/update_sources fs/update_sources gtk4/configure gtk4/sources.sh gtk4/update_sources http/configure http/sources.sh http/update_sources httpd/configure httpd/sources.sh httpd/update_sources ikc3/configure ikc3/sources.sh ikc3/update_sources json/configure json/sources.sh json/update_sources kc3c/configure kc3s/configure kc3s/sources.sh kc3s/update_sources libkc3/configure libkc3/sources.sh libkc3/update_sources libtommath/configure libtommath/sources.sh libtommath/update_sources markdown/configure markdown/sources.sh markdown/update_sources socket/configure socket/sources.sh socket/update_sources test/configure test/sources.sh test/update_sources ucd2c/configure window/cairo/configure window/cairo/demo/configure window/cairo/demo/sources.sh window/cairo/demo/update_sources window/cairo/quartz/configure window/cairo/quartz/demo/configure window/cairo/quartz/demo/sources.sh window/cairo/quartz/demo/update_sources window/cairo/quartz/sources.sh window/cairo/quartz/update_sources window/cairo/sources.sh window/cairo/update_sources window/cairo/win32/configure window/cairo/win32/demo/configure window/cairo/win32/demo/sources.sh window/cairo/win32/demo/update_sources window/cairo/win32/sources.sh window/cairo/win32/update_sources window/cairo/xcb/configure window/cairo/xcb/demo/configure window/cairo/xcb/demo/sources.sh window/cairo/xcb/demo/update_sources window/cairo/xcb/sources.sh window/cairo/xcb/update_sources window/configure window/sdl2/configure window/sdl2/demo/configure window/sdl2/demo/macos/configure window/sdl2/demo/sources.sh window/sdl2/demo/update_sources window/sdl2/sources.sh window/sdl2/update_sources window/sources.sh window/update_sources '
+KC3_MAKEFILES='ekc3/Makefile ekc3/sources.mk event/Makefile event/sources.mk fs/Makefile fs/fuse/Makefile fs/fuse/sources.mk gtk4/Makefile gtk4/sources.mk http/Makefile http/sources.mk httpd/Makefile httpd/fx/assets/Makefile httpd/sources.mk ikc3/Makefile ikc3/sources.mk json/Makefile json/sources.mk kc3c/Makefile kc3s/Makefile kc3s/sources.mk libkc3/Makefile libkc3/gen.mk libkc3/sources.mk libtommath/Makefile libtommath/sources.mk markdown/Makefile markdown/sources.mk socket/Makefile socket/sources.mk test/Makefile test/httpd/Makefile test/httpd/assets/Makefile test/sources.mk ucd2c/Makefile window/Makefile window/cairo/Makefile window/cairo/demo/Makefile window/cairo/demo/sources.mk window/cairo/quartz/Makefile window/cairo/quartz/demo/Makefile window/cairo/quartz/demo/sources.mk window/cairo/quartz/sources.mk window/cairo/sources.mk window/cairo/win32/Makefile window/cairo/win32/demo/Makefile window/cairo/win32/demo/sources.mk window/cairo/win32/sources.mk window/cairo/xcb/Makefile window/cairo/xcb/demo/Makefile window/cairo/xcb/demo/sources.mk window/cairo/xcb/sources.mk window/sdl2/Makefile window/sdl2/demo/Makefile window/sdl2/demo/macos/Makefile window/sdl2/demo/sources.mk window/sdl2/sources.mk window/sources.mk '
+KC3_C_SOURCES='ekc3/ekc3.c ekc3/ekc3.h ekc3/html.c ekc3/html.h ekc3/types.h event/event.c event/event.h fs/OpenBSD/kc3fs.h fs/fuse/mount_kc3fs.c fs/fuse/types.h gtk4/action_map.c gtk4/action_map.h gtk4/application.c gtk4/application.h gtk4/application_window.c gtk4/application_window.h gtk4/box.c gtk4/box.h gtk4/button.c gtk4/button.h gtk4/entry.c gtk4/entry.h gtk4/entry_buffer.c gtk4/entry_buffer.h gtk4/file.c gtk4/file.h gtk4/frame.c gtk4/frame.h gtk4/kc3_glib.c gtk4/kc3_glib.h gtk4/kc3_gtk4.h gtk4/label.c gtk4/label.h gtk4/list_box.c gtk4/list_box.h gtk4/menu.c gtk4/menu.h gtk4/menu_item.c gtk4/menu_item.h gtk4/object.c gtk4/object.h gtk4/paned.c gtk4/paned.h gtk4/scrolled_window.c gtk4/scrolled_window.h gtk4/signal.c gtk4/signal.h gtk4/simple_action.c gtk4/simple_action.h gtk4/text.c gtk4/text.h gtk4/text_view.c gtk4/text_view.h gtk4/types.h gtk4/widget.c gtk4/widget.h gtk4/window.c gtk4/window.h http/http.c http/http.h http/http_request.c http/http_request.h http/http_response.c http/http_response.h http/mime_type.c http/mime_type.h http/types.h http/url.c http/url.h httpd/httpd.c httpd/httpd.h ikc3/buf_linenoise.c ikc3/buf_linenoise.h ikc3/buf_wineditline.c ikc3/buf_wineditline.h ikc3/ikc3.c ikc3/linenoise.c json/json.c json/json.h kc3c/c3c.c kc3s/buf_readline.c kc3s/buf_readline.h kc3s/kc3s.c libkc3/abs.c libkc3/abs.h libkc3/alist.c libkc3/alist.h libkc3/alloc.c libkc3/alloc.h libkc3/arg.c libkc3/arg.h libkc3/array.c libkc3/array.h libkc3/assert.h libkc3/binding.c libkc3/binding.h libkc3/block.c libkc3/block.h libkc3/bool.c libkc3/bool.h libkc3/buf.c libkc3/buf.h libkc3/buf_fd.c libkc3/buf_fd.h libkc3/buf_file.c libkc3/buf_file.h libkc3/buf_getc.c libkc3/buf_getc.h libkc3/buf_getchar.c libkc3/buf_getchar.h libkc3/buf_inspect.c libkc3/buf_inspect.h libkc3/buf_inspect_s.c.in libkc3/buf_inspect_s.h.in libkc3/buf_inspect_s16.c libkc3/buf_inspect_s16.h libkc3/buf_inspect_s16_binary.c libkc3/buf_inspect_s16_binary.h libkc3/buf_inspect_s16_decimal.c libkc3/buf_inspect_s16_decimal.h libkc3/buf_inspect_s16_hexadecimal.c libkc3/buf_inspect_s16_hexadecimal.h libkc3/buf_inspect_s16_octal.c libkc3/buf_inspect_s16_octal.h libkc3/buf_inspect_s32.c libkc3/buf_inspect_s32.h libkc3/buf_inspect_s32_binary.c libkc3/buf_inspect_s32_binary.h libkc3/buf_inspect_s32_decimal.c libkc3/buf_inspect_s32_decimal.h libkc3/buf_inspect_s32_hexadecimal.c libkc3/buf_inspect_s32_hexadecimal.h libkc3/buf_inspect_s32_octal.c libkc3/buf_inspect_s32_octal.h libkc3/buf_inspect_s64.c libkc3/buf_inspect_s64.h libkc3/buf_inspect_s64_binary.c libkc3/buf_inspect_s64_binary.h libkc3/buf_inspect_s64_decimal.c libkc3/buf_inspect_s64_decimal.h libkc3/buf_inspect_s64_hexadecimal.c libkc3/buf_inspect_s64_hexadecimal.h libkc3/buf_inspect_s64_octal.c libkc3/buf_inspect_s64_octal.h libkc3/buf_inspect_s8.c libkc3/buf_inspect_s8.h libkc3/buf_inspect_s8_binary.c libkc3/buf_inspect_s8_binary.h libkc3/buf_inspect_s8_decimal.c libkc3/buf_inspect_s8_decimal.h libkc3/buf_inspect_s8_hexadecimal.c libkc3/buf_inspect_s8_hexadecimal.h libkc3/buf_inspect_s8_octal.c libkc3/buf_inspect_s8_octal.h libkc3/buf_inspect_s_base.c.in libkc3/buf_inspect_s_base.h.in libkc3/buf_inspect_sw.c libkc3/buf_inspect_sw.h libkc3/buf_inspect_sw_binary.c libkc3/buf_inspect_sw_binary.h libkc3/buf_inspect_sw_decimal.c libkc3/buf_inspect_sw_decimal.h libkc3/buf_inspect_sw_hexadecimal.c libkc3/buf_inspect_sw_hexadecimal.h libkc3/buf_inspect_sw_octal.c libkc3/buf_inspect_sw_octal.h libkc3/buf_inspect_u.c.in libkc3/buf_inspect_u.h.in libkc3/buf_inspect_u16.c libkc3/buf_inspect_u16.h libkc3/buf_inspect_u16_binary.c libkc3/buf_inspect_u16_binary.h libkc3/buf_inspect_u16_decimal.c libkc3/buf_inspect_u16_decimal.h libkc3/buf_inspect_u16_hexadecimal.c libkc3/buf_inspect_u16_hexadecimal.h libkc3/buf_inspect_u16_octal.c libkc3/buf_inspect_u16_octal.h libkc3/buf_inspect_u32.c libkc3/buf_inspect_u32.h libkc3/buf_inspect_u32_binary.c libkc3/buf_inspect_u32_binary.h libkc3/buf_inspect_u32_decimal.c libkc3/buf_inspect_u32_decimal.h libkc3/buf_inspect_u32_hexadecimal.c libkc3/buf_inspect_u32_hexadecimal.h libkc3/buf_inspect_u32_octal.c libkc3/buf_inspect_u32_octal.h libkc3/buf_inspect_u64.c libkc3/buf_inspect_u64.h libkc3/buf_inspect_u64_binary.c libkc3/buf_inspect_u64_binary.h libkc3/buf_inspect_u64_decimal.c libkc3/buf_inspect_u64_decimal.h libkc3/buf_inspect_u64_hexadecimal.c libkc3/buf_inspect_u64_hexadecimal.h libkc3/buf_inspect_u64_octal.c libkc3/buf_inspect_u64_octal.h libkc3/buf_inspect_u8.c libkc3/buf_inspect_u8.h libkc3/buf_inspect_u8_binary.c libkc3/buf_inspect_u8_binary.h libkc3/buf_inspect_u8_decimal.c libkc3/buf_inspect_u8_decimal.h libkc3/buf_inspect_u8_hexadecimal.c libkc3/buf_inspect_u8_hexadecimal.h libkc3/buf_inspect_u8_octal.c libkc3/buf_inspect_u8_octal.h libkc3/buf_inspect_u_base.c.in libkc3/buf_inspect_u_base.h.in libkc3/buf_inspect_uw.c libkc3/buf_inspect_uw.h libkc3/buf_inspect_uw_binary.c libkc3/buf_inspect_uw_binary.h libkc3/buf_inspect_uw_decimal.c libkc3/buf_inspect_uw_decimal.h libkc3/buf_inspect_uw_hexadecimal.c libkc3/buf_inspect_uw_hexadecimal.h libkc3/buf_inspect_uw_octal.c libkc3/buf_inspect_uw_octal.h libkc3/buf_parse.c libkc3/buf_parse.h libkc3/buf_parse_s.c.in libkc3/buf_parse_s.h.in libkc3/buf_parse_s16.c libkc3/buf_parse_s16.h libkc3/buf_parse_s32.c libkc3/buf_parse_s32.h libkc3/buf_parse_s64.c libkc3/buf_parse_s64.h libkc3/buf_parse_s8.c libkc3/buf_parse_s8.h libkc3/buf_parse_sw.c libkc3/buf_parse_sw.h libkc3/buf_parse_u.c.in libkc3/buf_parse_u.h.in libkc3/buf_parse_u16.c libkc3/buf_parse_u16.h libkc3/buf_parse_u32.c libkc3/buf_parse_u32.h libkc3/buf_parse_u64.c libkc3/buf_parse_u64.h libkc3/buf_parse_u8.c libkc3/buf_parse_u8.h libkc3/buf_parse_uw.c libkc3/buf_parse_uw.h libkc3/buf_rw.c libkc3/buf_rw.h libkc3/buf_save.c libkc3/buf_save.h libkc3/call.c libkc3/call.h libkc3/callable.c libkc3/callable.h libkc3/cast.c libkc3/cast.h libkc3/ceiling.c libkc3/ceiling.h libkc3/cfn.c libkc3/cfn.h libkc3/character.c libkc3/character.h libkc3/compare.c libkc3/compare.h libkc3/complex.c libkc3/complex.h libkc3/cow.c libkc3/cow.h libkc3/crypt.c libkc3/crypt.h libkc3/crypt_sha512.c libkc3/data.c libkc3/data.h libkc3/deserialize.c libkc3/deserialize.h libkc3/env.c libkc3/env.h libkc3/env_fork.c libkc3/env_fork.h libkc3/error.c libkc3/error.h libkc3/error_handler.c libkc3/error_handler.h libkc3/eval.c libkc3/eval.h libkc3/explicit_bzero.h libkc3/f128.c libkc3/f128.h libkc3/f32.c libkc3/f32.h libkc3/f64.c libkc3/f64.h libkc3/fact.c libkc3/fact.h libkc3/fact_action.c libkc3/fact_action.h libkc3/fact_list.c libkc3/fact_list.h libkc3/facts.c libkc3/facts.h libkc3/facts_cursor.c libkc3/facts_cursor.h libkc3/facts_spec.c libkc3/facts_spec.h libkc3/facts_spec_cursor.c libkc3/facts_spec_cursor.h libkc3/facts_transaction.c libkc3/facts_transaction.h libkc3/facts_with.c libkc3/facts_with.h libkc3/facts_with_cursor.c libkc3/facts_with_cursor.h libkc3/fd.c libkc3/fd.h libkc3/file.c libkc3/file.h libkc3/float.h libkc3/fn.c libkc3/fn.h libkc3/fn_clause.c libkc3/fn_clause.h libkc3/frame.c libkc3/frame.h libkc3/hash.c libkc3/hash.h libkc3/ident.c libkc3/ident.h libkc3/inspect.c libkc3/inspect.h libkc3/integer.c libkc3/integer.h libkc3/io.c libkc3/io.h libkc3/kc3.c libkc3/kc3.h libkc3/kc3_main.h libkc3/license.c libkc3/list.c libkc3/list.h libkc3/list_init.c libkc3/list_init.h libkc3/log.c libkc3/log.h libkc3/map.c libkc3/map.h libkc3/module.c libkc3/module.h libkc3/mutex.c libkc3/mutex.h libkc3/operator.c libkc3/operator.h libkc3/pcomplex.c libkc3/pcomplex.h libkc3/pcow.c libkc3/pcow.h libkc3/pretty.c libkc3/pretty.h libkc3/ptag.c libkc3/ptag.h libkc3/ptr.c libkc3/ptr.h libkc3/ptr_free.c libkc3/ptr_free.h libkc3/queue.c libkc3/queue.h libkc3/quote.c libkc3/quote.h libkc3/ratio.c libkc3/ratio.h libkc3/rwlock.c libkc3/rwlock.h libkc3/s.c.in libkc3/s.h.in libkc3/s16.c libkc3/s16.h libkc3/s32.c libkc3/s32.h libkc3/s64.c libkc3/s64.h libkc3/s8.c libkc3/s8.h libkc3/sequence.c libkc3/sequence.h libkc3/serialize.c libkc3/serialize.h libkc3/set.c.in libkc3/set.h.in libkc3/set__fact.c libkc3/set__fact.h libkc3/set__tag.c libkc3/set__tag.h libkc3/set_cursor.c.in libkc3/set_cursor.h.in libkc3/set_cursor__fact.c libkc3/set_cursor__fact.h libkc3/set_cursor__tag.c libkc3/set_cursor__tag.h libkc3/set_item.c.in libkc3/set_item.h.in libkc3/set_item__fact.c libkc3/set_item__fact.h libkc3/set_item__tag.c libkc3/set_item__tag.h libkc3/sh.c libkc3/sh.h libkc3/sha1.c libkc3/sha1.h libkc3/sign.c libkc3/sign.h libkc3/skiplist.c.in libkc3/skiplist.h.in libkc3/skiplist__alloc.c libkc3/skiplist__alloc.h libkc3/skiplist__fact.c libkc3/skiplist__fact.h libkc3/skiplist_node.c.in libkc3/skiplist_node.h.in libkc3/skiplist_node__alloc.c libkc3/skiplist_node__alloc.h libkc3/skiplist_node__fact.c libkc3/skiplist_node__fact.h libkc3/special_operator.c libkc3/special_operator.h libkc3/str.c libkc3/str.h libkc3/struct.c libkc3/struct.h libkc3/struct_type.c libkc3/struct_type.h libkc3/sw.c libkc3/sw.h libkc3/sym.c libkc3/sym.h libkc3/tag.c libkc3/tag.h libkc3/tag_add.c libkc3/tag_addi.c libkc3/tag_band.c libkc3/tag_bnot.c libkc3/tag_bor.c libkc3/tag_bxor.c libkc3/tag_div.c libkc3/tag_init.c libkc3/tag_init.h libkc3/tag_mod.c libkc3/tag_mul.c libkc3/tag_neg.c libkc3/tag_shift_left.c libkc3/tag_shift_right.c libkc3/tag_sqrt.c libkc3/tag_sub.c libkc3/tag_type.c libkc3/tag_type.h libkc3/time.c libkc3/time.h libkc3/to_lisp.c libkc3/to_lisp.h libkc3/tuple.c libkc3/tuple.h libkc3/types.h libkc3/u.c.in libkc3/u.h.in libkc3/u16.c libkc3/u16.h libkc3/u32.c libkc3/u32.h libkc3/u64.c libkc3/u64.h libkc3/u8.c libkc3/u8.h libkc3/ucd.c libkc3/ucd.h libkc3/unquote.c libkc3/unquote.h libkc3/uw.c libkc3/uw.h libkc3/var.c libkc3/var.h libkc3/void.c libkc3/void.h libkc3/wait.c libkc3/wait.h markdown/entity.c markdown/entity.h markdown/markdown.c markdown/markdown.h markdown/md4c-html.c markdown/md4c-html.h markdown/md4c.c markdown/md4c.h socket/socket.c socket/socket.h socket/socket_addr.c socket/socket_addr.h socket/socket_buf.c socket/socket_buf.h socket/types.h test/array_test.c test/bool_test.c test/buf_file_test.c test/buf_inspect_test.c test/buf_parse_test.c test/buf_parse_test.h test/buf_parse_test_s16.c test/buf_parse_test_s32.c test/buf_parse_test_s64.c test/buf_parse_test_s8.c test/buf_parse_test_su.h test/buf_parse_test_u16.c test/buf_parse_test_u32.c test/buf_parse_test_u64.c test/buf_parse_test_u8.c test/buf_test.c test/call_test.c test/cfn_test.c test/character_test.c test/compare_test.c test/compare_test.h test/env_test.c test/fact_test.c test/fact_test.h test/facts_cursor_test.c test/facts_test.c test/facts_with_test.c test/fn_test.c test/hash_test.c test/ident_test.c test/inspect_test.c test/libkc3_test.c test/list_test.c test/ratio_test.c test/set__fact_test.c test/set__tag_test.c test/skiplist__fact_test.c test/str_test.c test/struct_test.c test/sym_test.c test/tag_test.c test/tag_test.h test/test.c test/test.h test/tuple_test.c test/types_test.c ucd2c/ucd.h ucd2c/ucd2c.c window/cairo/cairo_font.c window/cairo/cairo_font.h window/cairo/cairo_sprite.c window/cairo/cairo_sprite.h window/cairo/cairo_text.c window/cairo/cairo_text.h window/cairo/demo/bg_rect.c window/cairo/demo/bg_rect.h window/cairo/demo/flies.c window/cairo/demo/flies.h window/cairo/demo/lightspeed.c window/cairo/demo/lightspeed.h window/cairo/demo/mandelbrot_f128.c window/cairo/demo/mandelbrot_f128.h window/cairo/demo/toasters.c window/cairo/demo/toasters.h window/cairo/demo/window_cairo_demo.c window/cairo/demo/window_cairo_demo.h window/cairo/quartz/demo/window_cairo_quartz_demo.c window/cairo/quartz/quartz_to_xkbcommon.c window/cairo/quartz/quartz_to_xkbcommon.h window/cairo/quartz/window_cairo_quartz.h window/cairo/quartz/window_cairo_quartz_app_delegate.h window/cairo/quartz/window_cairo_quartz_view.h window/cairo/quartz/window_cairo_quartz_view_controller.h window/cairo/quartz/xkbquartz.h window/cairo/types.h window/cairo/win32/demo/window_cairo_win32_demo.c window/cairo/win32/vk_to_xkbcommon.c window/cairo/win32/vk_to_xkbcommon.h window/cairo/win32/window_cairo_win32.c window/cairo/win32/window_cairo_win32.h window/cairo/window_cairo.c window/cairo/window_cairo.h window/cairo/xcb/demo/window_cairo_xcb_demo.c window/cairo/xcb/window_cairo_xcb.c window/cairo/xcb/window_cairo_xcb.h window/sdl2/demo/bg_rect.c window/sdl2/demo/bg_rect.h window/sdl2/demo/earth.c window/sdl2/demo/earth.h window/sdl2/demo/flies.c window/sdl2/demo/flies.h window/sdl2/demo/lightspeed.c window/sdl2/demo/lightspeed.h window/sdl2/demo/mandelbrot_f128.c window/sdl2/demo/mandelbrot_f128.h window/sdl2/demo/matrix.c window/sdl2/demo/matrix.h window/sdl2/demo/toasters.c window/sdl2/demo/toasters.h window/sdl2/demo/window_sdl2_demo.c window/sdl2/demo/window_sdl2_demo.h window/sdl2/disabled/mandelbrot.c window/sdl2/disabled/mandelbrot.h window/sdl2/disabled/sdl2_font.c window/sdl2/disabled/sdl2_font.h window/sdl2/disabled/sdl2_sprite.c window/sdl2/disabled/sdl2_sprite.h window/sdl2/dmat3.h window/sdl2/dmat4.c window/sdl2/dmat4.h window/sdl2/dvec2.c window/sdl2/dvec2.h window/sdl2/dvec3.c window/sdl2/dvec3.h window/sdl2/gl_camera.c window/sdl2/gl_camera.h window/sdl2/gl_cylinder.c window/sdl2/gl_cylinder.h window/sdl2/gl_deprecated.c window/sdl2/gl_deprecated.h window/sdl2/gl_font.c window/sdl2/gl_font.h window/sdl2/gl_lines.c window/sdl2/gl_lines.h window/sdl2/gl_object.c window/sdl2/gl_object.h window/sdl2/gl_ortho.c window/sdl2/gl_ortho.h window/sdl2/gl_sphere.c window/sdl2/gl_sphere.h window/sdl2/gl_sprite.c window/sdl2/gl_sprite.h window/sdl2/gl_square.c window/sdl2/gl_square.h window/sdl2/gl_text.c window/sdl2/gl_text.h window/sdl2/gl_triangle.c window/sdl2/gl_triangle.h window/sdl2/gl_vertex.c window/sdl2/gl_vertex.h window/sdl2/gl_vtext.c window/sdl2/gl_vtext.h window/sdl2/mat3.h window/sdl2/mat4.c window/sdl2/mat4.h window/sdl2/types.h window/sdl2/vec2.c window/sdl2/vec2.h window/sdl2/vec3.c window/sdl2/vec3.h window/sdl2/window_sdl2.c window/sdl2/window_sdl2.h window/types.h window/window.c window/window.h '
KC3_CXX_SOURCES='libkc3/std.cxx libkc3/std.hxx '
KC3_FONT_SOURCES='fonts/Computer Modern/cmunbl-webfont.ttf fonts/Computer Modern/cmunbl.otf fonts/Computer Modern/cmunbx-webfont.ttf fonts/Computer Modern/cmunbx.otf fonts/Computer Modern/cmunbxo-webfont.ttf fonts/Computer Modern/cmunbxo.otf fonts/Computer Modern/cmunrm-webfont.ttf fonts/Computer Modern/cmunrm.otf fonts/Computer Modern/cmunsi-webfont.ttf fonts/Computer Modern/cmunsi.otf fonts/Computer Modern/cmunsl-webfont.ttf fonts/Computer Modern/cmunsl.otf fonts/Computer Modern/cmunss-webfont.ttf fonts/Computer Modern/cmunss.otf fonts/Computer Modern/cmunsx-webfont.ttf fonts/Computer Modern/cmunsx.otf fonts/Courier New/Courier New.ttf fonts/Courier/fonts/OGCourier-Bold.otf fonts/Courier/fonts/OGCourier-Bold.ttf fonts/Courier/fonts/OGCourier-BoldItalic.otf fonts/Courier/fonts/OGCourier-BoldItalic.ttf fonts/Courier/fonts/OGCourier-Italic.otf fonts/Courier/fonts/OGCourier-Italic.ttf fonts/Courier/fonts/OGCourier.otf fonts/Courier/fonts/OGCourier.ttf fonts/Courier/fonts/zero-dot/OGCourierZeroDot-Bold.otf fonts/Courier/fonts/zero-dot/OGCourierZeroDot-Bold.ttf fonts/Courier/fonts/zero-dot/OGCourierZeroDot-BoldItalic.otf fonts/Courier/fonts/zero-dot/OGCourierZeroDot-BoldItalic.ttf fonts/Courier/fonts/zero-dot/OGCourierZeroDot-Italic.otf fonts/Courier/fonts/zero-dot/OGCourierZeroDot-Italic.ttf fonts/Courier/fonts/zero-dot/OGCourierZeroDot.otf fonts/Courier/fonts/zero-dot/OGCourierZeroDot.ttf fonts/Courier/fonts/zero-slash/OGCourierZeroSlash-Bold.otf fonts/Courier/fonts/zero-slash/OGCourierZeroSlash-Bold.ttf fonts/Courier/fonts/zero-slash/OGCourierZeroSlash-BoldItalic.otf fonts/Courier/fonts/zero-slash/OGCourierZeroSlash-BoldItalic.ttf fonts/Courier/fonts/zero-slash/OGCourierZeroSlash-Italic.otf fonts/Courier/fonts/zero-slash/OGCourierZeroSlash-Italic.ttf fonts/Courier/fonts/zero-slash/OGCourierZeroSlash.otf fonts/Courier/fonts/zero-slash/OGCourierZeroSlash.ttf fonts/Courier/sfd/OGCourier-Bold.sfd.ttf fonts/Courier/sfd/OGCourier-BoldItalic.sfd.ttf fonts/Courier/sfd/OGCourier-Italic.sfd.ttf fonts/Courier/sfd/OGCourier.sfd.ttf fonts/Inter/InterVariable-Italic.ttf fonts/Inter/InterVariable.ttf fonts/Inter/extras/otf/Inter-Black.otf fonts/Inter/extras/otf/Inter-BlackItalic.otf fonts/Inter/extras/otf/Inter-Bold.otf fonts/Inter/extras/otf/Inter-BoldItalic.otf fonts/Inter/extras/otf/Inter-ExtraBold.otf fonts/Inter/extras/otf/Inter-ExtraBoldItalic.otf fonts/Inter/extras/otf/Inter-ExtraLight.otf fonts/Inter/extras/otf/Inter-ExtraLightItalic.otf fonts/Inter/extras/otf/Inter-Italic.otf fonts/Inter/extras/otf/Inter-Light.otf fonts/Inter/extras/otf/Inter-LightItalic.otf fonts/Inter/extras/otf/Inter-Medium.otf fonts/Inter/extras/otf/Inter-MediumItalic.otf fonts/Inter/extras/otf/Inter-Regular.otf fonts/Inter/extras/otf/Inter-SemiBold.otf fonts/Inter/extras/otf/Inter-SemiBoldItalic.otf fonts/Inter/extras/otf/Inter-Thin.otf fonts/Inter/extras/otf/Inter-ThinItalic.otf fonts/Inter/extras/otf/InterDisplay-Black.otf fonts/Inter/extras/otf/InterDisplay-BlackItalic.otf fonts/Inter/extras/otf/InterDisplay-Bold.otf fonts/Inter/extras/otf/InterDisplay-BoldItalic.otf fonts/Inter/extras/otf/InterDisplay-ExtraBold.otf fonts/Inter/extras/otf/InterDisplay-ExtraBoldItalic.otf fonts/Inter/extras/otf/InterDisplay-ExtraLight.otf fonts/Inter/extras/otf/InterDisplay-ExtraLightItalic.otf fonts/Inter/extras/otf/InterDisplay-Italic.otf fonts/Inter/extras/otf/InterDisplay-Light.otf fonts/Inter/extras/otf/InterDisplay-LightItalic.otf fonts/Inter/extras/otf/InterDisplay-Medium.otf fonts/Inter/extras/otf/InterDisplay-MediumItalic.otf fonts/Inter/extras/otf/InterDisplay-Regular.otf fonts/Inter/extras/otf/InterDisplay-SemiBold.otf fonts/Inter/extras/otf/InterDisplay-SemiBoldItalic.otf fonts/Inter/extras/otf/InterDisplay-Thin.otf fonts/Inter/extras/otf/InterDisplay-ThinItalic.otf fonts/Inter/extras/ttf/Inter-Black.ttf fonts/Inter/extras/ttf/Inter-BlackItalic.ttf fonts/Inter/extras/ttf/Inter-Bold.ttf fonts/Inter/extras/ttf/Inter-BoldItalic.ttf fonts/Inter/extras/ttf/Inter-ExtraBold.ttf fonts/Inter/extras/ttf/Inter-ExtraBoldItalic.ttf fonts/Inter/extras/ttf/Inter-ExtraLight.ttf fonts/Inter/extras/ttf/Inter-ExtraLightItalic.ttf fonts/Inter/extras/ttf/Inter-Italic.ttf fonts/Inter/extras/ttf/Inter-Light.ttf fonts/Inter/extras/ttf/Inter-LightItalic.ttf fonts/Inter/extras/ttf/Inter-Medium.ttf fonts/Inter/extras/ttf/Inter-MediumItalic.ttf fonts/Inter/extras/ttf/Inter-Regular.ttf fonts/Inter/extras/ttf/Inter-SemiBold.ttf fonts/Inter/extras/ttf/Inter-SemiBoldItalic.ttf fonts/Inter/extras/ttf/Inter-Thin.ttf fonts/Inter/extras/ttf/Inter-ThinItalic.ttf fonts/Inter/extras/ttf/InterDisplay-Black.ttf fonts/Inter/extras/ttf/InterDisplay-BlackItalic.ttf fonts/Inter/extras/ttf/InterDisplay-Bold.ttf fonts/Inter/extras/ttf/InterDisplay-BoldItalic.ttf fonts/Inter/extras/ttf/InterDisplay-ExtraBold.ttf fonts/Inter/extras/ttf/InterDisplay-ExtraBoldItalic.ttf fonts/Inter/extras/ttf/InterDisplay-ExtraLight.ttf fonts/Inter/extras/ttf/InterDisplay-ExtraLightItalic.ttf fonts/Inter/extras/ttf/InterDisplay-Italic.ttf fonts/Inter/extras/ttf/InterDisplay-Light.ttf fonts/Inter/extras/ttf/InterDisplay-LightItalic.ttf fonts/Inter/extras/ttf/InterDisplay-Medium.ttf fonts/Inter/extras/ttf/InterDisplay-MediumItalic.ttf fonts/Inter/extras/ttf/InterDisplay-Regular.ttf fonts/Inter/extras/ttf/InterDisplay-SemiBold.ttf fonts/Inter/extras/ttf/InterDisplay-SemiBoldItalic.ttf fonts/Inter/extras/ttf/InterDisplay-Thin.ttf fonts/Inter/extras/ttf/InterDisplay-ThinItalic.ttf fonts/Noto Sans/NotoSans-Black.ttf fonts/Noto Sans/NotoSans-BlackItalic.ttf fonts/Noto Sans/NotoSans-Bold.ttf fonts/Noto Sans/NotoSans-BoldItalic.ttf fonts/Noto Sans/NotoSans-ExtraBold.ttf fonts/Noto Sans/NotoSans-ExtraBoldItalic.ttf fonts/Noto Sans/NotoSans-ExtraLight.ttf fonts/Noto Sans/NotoSans-ExtraLightItalic.ttf fonts/Noto Sans/NotoSans-Italic-VariableFont_wdth,wght.ttf fonts/Noto Sans/NotoSans-Italic.ttf fonts/Noto Sans/NotoSans-Light.ttf fonts/Noto Sans/NotoSans-LightItalic.ttf fonts/Noto Sans/NotoSans-Medium.ttf fonts/Noto Sans/NotoSans-MediumItalic.ttf fonts/Noto Sans/NotoSans-Regular.ttf fonts/Noto Sans/NotoSans-SemiBold.ttf fonts/Noto Sans/NotoSans-SemiBoldItalic.ttf fonts/Noto Sans/NotoSans-Thin.ttf fonts/Noto Sans/NotoSans-ThinItalic.ttf fonts/Noto Sans/NotoSans-VariableFont_wdth,wght.ttf fonts/Noto Sans/NotoSans_Condensed-Black.ttf fonts/Noto Sans/NotoSans_Condensed-BlackItalic.ttf fonts/Noto Sans/NotoSans_Condensed-Bold.ttf fonts/Noto Sans/NotoSans_Condensed-BoldItalic.ttf fonts/Noto Sans/NotoSans_Condensed-ExtraBold.ttf fonts/Noto Sans/NotoSans_Condensed-ExtraBoldItalic.ttf fonts/Noto Sans/NotoSans_Condensed-ExtraLight.ttf fonts/Noto Sans/NotoSans_Condensed-ExtraLightItalic.ttf fonts/Noto Sans/NotoSans_Condensed-Italic.ttf fonts/Noto Sans/NotoSans_Condensed-Light.ttf fonts/Noto Sans/NotoSans_Condensed-LightItalic.ttf fonts/Noto Sans/NotoSans_Condensed-Medium.ttf fonts/Noto Sans/NotoSans_Condensed-MediumItalic.ttf fonts/Noto Sans/NotoSans_Condensed-Regular.ttf fonts/Noto Sans/NotoSans_Condensed-SemiBold.ttf fonts/Noto Sans/NotoSans_Condensed-SemiBoldItalic.ttf fonts/Noto Sans/NotoSans_Condensed-Thin.ttf fonts/Noto Sans/NotoSans_Condensed-ThinItalic.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-Black.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-BlackItalic.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-Bold.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-BoldItalic.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-ExtraBold.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-ExtraBoldItalic.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-ExtraLight.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-ExtraLightItalic.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-Italic.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-Light.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-LightItalic.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-Medium.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-MediumItalic.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-Regular.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-SemiBold.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-SemiBoldItalic.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-Thin.ttf fonts/Noto Sans/NotoSans_ExtraCondensed-ThinItalic.ttf fonts/Noto Sans/NotoSans_SemiCondensed-Black.ttf fonts/Noto Sans/NotoSans_SemiCondensed-BlackItalic.ttf fonts/Noto Sans/NotoSans_SemiCondensed-Bold.ttf fonts/Noto Sans/NotoSans_SemiCondensed-BoldItalic.ttf fonts/Noto Sans/NotoSans_SemiCondensed-ExtraBold.ttf fonts/Noto Sans/NotoSans_SemiCondensed-ExtraBoldItalic.ttf fonts/Noto Sans/NotoSans_SemiCondensed-ExtraLight.ttf fonts/Noto Sans/NotoSans_SemiCondensed-ExtraLightItalic.ttf fonts/Noto Sans/NotoSans_SemiCondensed-Italic.ttf fonts/Noto Sans/NotoSans_SemiCondensed-Light.ttf fonts/Noto Sans/NotoSans_SemiCondensed-LightItalic.ttf fonts/Noto Sans/NotoSans_SemiCondensed-Medium.ttf fonts/Noto Sans/NotoSans_SemiCondensed-MediumItalic.ttf fonts/Noto Sans/NotoSans_SemiCondensed-Regular.ttf fonts/Noto Sans/NotoSans_SemiCondensed-SemiBold.ttf fonts/Noto Sans/NotoSans_SemiCondensed-SemiBoldItalic.ttf fonts/Noto Sans/NotoSans_SemiCondensed-Thin.ttf fonts/Noto Sans/NotoSans_SemiCondensed-ThinItalic.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-Bold.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-BoldItalic.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-CondensedBold.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-CondensedBoldItalic.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-CondensedExtraBold.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-CondensedExtraBoldItalic.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-CondensedItalic.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-CondensedLight.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-CondensedLightItalic.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-CondensedRegular.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-CondensedSemiBold.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-CondensedSemiBoldItalic.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-ExtraBold.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-ExtraBoldItalic.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-Italic.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-Light.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-LightItalic.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-Regular.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-SemiBold.ttf fonts/opensans/fonts/noto-set/ttf/OpenSans-SemiBoldItalic.ttf fonts/opensans/fonts/noto-set/variable/OpenSans-Italic[wdth,wght].ttf fonts/opensans/fonts/noto-set/variable/OpenSans[wdth,wght].ttf fonts/opensans/fonts/ttf/OpenSans-Bold.ttf fonts/opensans/fonts/ttf/OpenSans-BoldItalic.ttf fonts/opensans/fonts/ttf/OpenSans-CondensedBold.ttf fonts/opensans/fonts/ttf/OpenSans-CondensedBoldItalic.ttf fonts/opensans/fonts/ttf/OpenSans-CondensedExtraBold.ttf fonts/opensans/fonts/ttf/OpenSans-CondensedExtraBoldItalic.ttf fonts/opensans/fonts/ttf/OpenSans-CondensedItalic.ttf fonts/opensans/fonts/ttf/OpenSans-CondensedLight.ttf fonts/opensans/fonts/ttf/OpenSans-CondensedLightItalic.ttf fonts/opensans/fonts/ttf/OpenSans-CondensedRegular.ttf fonts/opensans/fonts/ttf/OpenSans-CondensedSemiBold.ttf fonts/opensans/fonts/ttf/OpenSans-CondensedSemiBoldItalic.ttf fonts/opensans/fonts/ttf/OpenSans-ExtraBold.ttf fonts/opensans/fonts/ttf/OpenSans-ExtraBoldItalic.ttf fonts/opensans/fonts/ttf/OpenSans-Italic.ttf fonts/opensans/fonts/ttf/OpenSans-Light.ttf fonts/opensans/fonts/ttf/OpenSans-LightItalic.ttf fonts/opensans/fonts/ttf/OpenSans-Regular.ttf fonts/opensans/fonts/ttf/OpenSans-SemiBold.ttf fonts/opensans/fonts/ttf/OpenSans-SemiBoldItalic.ttf fonts/opensans/fonts/variable/OpenSans-Italic[wdth,wght].ttf fonts/opensans/fonts/variable/OpenSans[wdth,wght].ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Italic-wg300wd100.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Italic-wg300wd75.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Italic-wg400wd100.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Italic-wg400wd75.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Italic-wg600wd100.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Italic-wg600wd75.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Italic-wg700wd100.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Italic-wg700wd75.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Italic-wg800wd100.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Italic-wg800wd75.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Italic.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Roman-wg300wd100.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Roman-wg300wd75.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Roman-wg400wd100.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Roman-wg400wd75.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Roman-wg600wd100.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Roman-wg600wd75.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Roman-wg700wd100.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Roman-wg700wd75.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Roman-wg800wd100.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Roman-wg800wd75.ttf fonts/opensans/original source/TTF_VTT_source/OpenSans-Roman.ttf '
KC3_IMG_SOURCES='img/earth.jpg img/earth.png img/flaps.256.png img/flaps.png img/fly-dead.png img/fly-noto.png img/iris-kc3-004.jpeg img/kc3.1.xcf img/kc3.1080.jpg img/kc3.1080.png img/kc3.128.jpg img/kc3.128.png img/kc3.16.jpg img/kc3.16.png img/kc3.256.jpg img/kc3.256.png img/kc3.32.jpg img/kc3.32.png img/kc3.512.jpg img/kc3.512.png img/kc3.64.jpg img/kc3.64.png img/kc3.640.jpg img/kc3.640.png img/kc3.720.jpg img/kc3.720.png img/kc3.96.jpg img/kc3.96.png img/kc3.iconset/icon_128x128.png img/kc3.iconset/icon_16x16.png img/kc3.iconset/icon_256x256.png img/kc3.iconset/icon_32x32.png img/kc3.iconset/icon_512x512.png img/kc3.iconset/icon_64x64.png img/kc3.xcf img/mandelbrot_f128_limit.1.png img/mandelbrot_f128_limit.2.png img/mandelbrot_f128_limit.3.png img/mandelbrot_f128_limit.png img/matrix_shade.png img/thodg_No_Prompt_073261d5-2c81-4b6e-9572-e0b840c55f1f.jpeg img/toast.128.png img/toast.png '
-KC3_LIB_SOURCES='lib/kc3/0.1/alist.kc3 lib/kc3/0.1/array.kc3 lib/kc3/0.1/bool.facts lib/kc3/0.1/buf.kc3 lib/kc3/0.1/buf_rw.kc3 lib/kc3/0.1/compare.kc3 lib/kc3/0.1/complex.facts lib/kc3/0.1/cow.kc3 lib/kc3/0.1/crypt.kc3 lib/kc3/0.1/deserialize.kc3 lib/kc3/0.1/ekc3.kc3 lib/kc3/0.1/event.kc3 lib/kc3/0.1/f128.facts lib/kc3/0.1/f32.facts lib/kc3/0.1/f64.facts lib/kc3/0.1/fact.kc3 lib/kc3/0.1/fact_w.kc3 lib/kc3/0.1/facts.kc3 lib/kc3/0.1/facts/cursor.kc3 lib/kc3/0.1/fd.kc3 lib/kc3/0.1/file.kc3 lib/kc3/0.1/file/stat.kc3 lib/kc3/0.1/gl/dvec2.kc3 lib/kc3/0.1/gl/dvec3.kc3 lib/kc3/0.1/gl/object.kc3 lib/kc3/0.1/gl/sphere.kc3 lib/kc3/0.1/gl/triangle.kc3 lib/kc3/0.1/gl/vec2.kc3 lib/kc3/0.1/gl/vec3.kc3 lib/kc3/0.1/gl/vertex.kc3 lib/kc3/0.1/gtk4.kc3 lib/kc3/0.1/gtk4/action_map.kc3 lib/kc3/0.1/gtk4/application.kc3 lib/kc3/0.1/gtk4/application_window.kc3 lib/kc3/0.1/gtk4/box.kc3 lib/kc3/0.1/gtk4/button.kc3 lib/kc3/0.1/gtk4/entry.kc3 lib/kc3/0.1/gtk4/entry_buffer.kc3 lib/kc3/0.1/gtk4/file.kc3 lib/kc3/0.1/gtk4/frame.kc3 lib/kc3/0.1/gtk4/label.kc3 lib/kc3/0.1/gtk4/list_box.kc3 lib/kc3/0.1/gtk4/menu.kc3 lib/kc3/0.1/gtk4/menu_item.kc3 lib/kc3/0.1/gtk4/object.kc3 lib/kc3/0.1/gtk4/paned.kc3 lib/kc3/0.1/gtk4/scrolled_window.kc3 lib/kc3/0.1/gtk4/simple_action.kc3 lib/kc3/0.1/gtk4/text.kc3 lib/kc3/0.1/gtk4/text_view.kc3 lib/kc3/0.1/gtk4/widget.kc3 lib/kc3/0.1/gtk4/window.kc3 lib/kc3/0.1/html.kc3 lib/kc3/0.1/http.kc3 lib/kc3/0.1/http/request.kc3 lib/kc3/0.1/http/response.kc3 lib/kc3/0.1/httpd.kc3 lib/kc3/0.1/httpd/route.kc3 lib/kc3/0.1/integer.facts lib/kc3/0.1/json.kc3 lib/kc3/0.1/kc3.facts lib/kc3/0.1/kc3/operator.kc3 lib/kc3/0.1/list.kc3 lib/kc3/0.1/map.facts lib/kc3/0.1/markdown.kc3 lib/kc3/0.1/ptr.facts lib/kc3/0.1/ptr_free.facts lib/kc3/0.1/ratio.facts lib/kc3/0.1/rwlock.kc3 lib/kc3/0.1/s16.facts lib/kc3/0.1/s32.facts lib/kc3/0.1/s64.facts lib/kc3/0.1/s8.facts lib/kc3/0.1/serialize.kc3 lib/kc3/0.1/set.kc3 lib/kc3/0.1/set/fact.kc3 lib/kc3/0.1/set/item/fact.kc3 lib/kc3/0.1/set/item/tag.kc3 lib/kc3/0.1/set/tag.kc3 lib/kc3/0.1/sh.kc3 lib/kc3/0.1/socket.kc3 lib/kc3/0.1/socket/addr.kc3 lib/kc3/0.1/socket/buf.kc3 lib/kc3/0.1/str.facts lib/kc3/0.1/struct.kc3 lib/kc3/0.1/sw.facts lib/kc3/0.1/sym.facts lib/kc3/0.1/tag.kc3 lib/kc3/0.1/thread.kc3 lib/kc3/0.1/time.kc3 lib/kc3/0.1/u16.facts lib/kc3/0.1/u32.facts lib/kc3/0.1/u64.facts lib/kc3/0.1/u8.facts lib/kc3/0.1/url.kc3 lib/kc3/0.1/uw.facts lib/kc3/0.1/var.facts lib/kc3/0.1/void.facts '
+KC3_LIB_SOURCES='lib/kc3/0.1/alist.kc3 lib/kc3/0.1/array.kc3 lib/kc3/0.1/bool.facts lib/kc3/0.1/buf.kc3 lib/kc3/0.1/buf_rw.kc3 lib/kc3/0.1/compare.kc3 lib/kc3/0.1/complex.facts lib/kc3/0.1/cow.kc3 lib/kc3/0.1/crypt.kc3 lib/kc3/0.1/deserialize.kc3 lib/kc3/0.1/ekc3.kc3 lib/kc3/0.1/event.kc3 lib/kc3/0.1/f128.facts lib/kc3/0.1/f32.facts lib/kc3/0.1/f64.facts lib/kc3/0.1/fact.kc3 lib/kc3/0.1/fact_w.kc3 lib/kc3/0.1/facts.kc3 lib/kc3/0.1/facts/cursor.kc3 lib/kc3/0.1/fd.kc3 lib/kc3/0.1/file.kc3 lib/kc3/0.1/file/stat.kc3 lib/kc3/0.1/file_stat.kc3 lib/kc3/0.1/gl/dvec2.kc3 lib/kc3/0.1/gl/dvec3.kc3 lib/kc3/0.1/gl/object.kc3 lib/kc3/0.1/gl/sphere.kc3 lib/kc3/0.1/gl/triangle.kc3 lib/kc3/0.1/gl/vec2.kc3 lib/kc3/0.1/gl/vec3.kc3 lib/kc3/0.1/gl/vertex.kc3 lib/kc3/0.1/gtk4.kc3 lib/kc3/0.1/gtk4/action_map.kc3 lib/kc3/0.1/gtk4/application.kc3 lib/kc3/0.1/gtk4/application_window.kc3 lib/kc3/0.1/gtk4/box.kc3 lib/kc3/0.1/gtk4/button.kc3 lib/kc3/0.1/gtk4/entry.kc3 lib/kc3/0.1/gtk4/entry_buffer.kc3 lib/kc3/0.1/gtk4/file.kc3 lib/kc3/0.1/gtk4/frame.kc3 lib/kc3/0.1/gtk4/label.kc3 lib/kc3/0.1/gtk4/list_box.kc3 lib/kc3/0.1/gtk4/menu.kc3 lib/kc3/0.1/gtk4/menu_item.kc3 lib/kc3/0.1/gtk4/object.kc3 lib/kc3/0.1/gtk4/paned.kc3 lib/kc3/0.1/gtk4/scrolled_window.kc3 lib/kc3/0.1/gtk4/simple_action.kc3 lib/kc3/0.1/gtk4/text.kc3 lib/kc3/0.1/gtk4/text_view.kc3 lib/kc3/0.1/gtk4/widget.kc3 lib/kc3/0.1/gtk4/window.kc3 lib/kc3/0.1/html.kc3 lib/kc3/0.1/http.kc3 lib/kc3/0.1/http/request.kc3 lib/kc3/0.1/http/response.kc3 lib/kc3/0.1/httpd.kc3 lib/kc3/0.1/httpd/route.kc3 lib/kc3/0.1/integer.facts lib/kc3/0.1/json.kc3 lib/kc3/0.1/kc3.facts lib/kc3/0.1/kc3/operator.kc3 lib/kc3/0.1/list.kc3 lib/kc3/0.1/map.facts lib/kc3/0.1/markdown.kc3 lib/kc3/0.1/parse.kc3 lib/kc3/0.1/ptr.facts lib/kc3/0.1/ptr_free.facts lib/kc3/0.1/ratio.facts lib/kc3/0.1/rwlock.kc3 lib/kc3/0.1/s16.facts lib/kc3/0.1/s32.facts lib/kc3/0.1/s64.facts lib/kc3/0.1/s8.facts lib/kc3/0.1/serialize.kc3 lib/kc3/0.1/set.kc3 lib/kc3/0.1/set/fact.kc3 lib/kc3/0.1/set/item/fact.kc3 lib/kc3/0.1/set/item/tag.kc3 lib/kc3/0.1/set/tag.kc3 lib/kc3/0.1/sh.kc3 lib/kc3/0.1/socket.kc3 lib/kc3/0.1/socket/addr.kc3 lib/kc3/0.1/socket/buf.kc3 lib/kc3/0.1/str.facts lib/kc3/0.1/struct.kc3 lib/kc3/0.1/sw.facts lib/kc3/0.1/sym.facts lib/kc3/0.1/tag.kc3 lib/kc3/0.1/thread.kc3 lib/kc3/0.1/time.kc3 lib/kc3/0.1/u16.facts lib/kc3/0.1/u32.facts lib/kc3/0.1/u64.facts lib/kc3/0.1/u8.facts lib/kc3/0.1/url.kc3 lib/kc3/0.1/uw.facts lib/kc3/0.1/var.facts lib/kc3/0.1/void.facts '
KC3_OBJC_SOURCES='window/cairo/quartz/window_cairo_quartz.m window/cairo/quartz/window_cairo_quartz_app_delegate.m window/cairo/quartz/window_cairo_quartz_view.m window/cairo/quartz/window_cairo_quartz_view_controller.m '
KC3_TEST_SOURCES='test/buf_parse_test_su.rb test/facts_test_dump_file.expected.facts test/facts_test_load_file.facts test/facts_test_log_add.expected.facts test/facts_test_log_remove.expected.facts test/facts_test_open_file.1.expected.facts test/facts_test_open_file.1.in.facts test/facts_test_open_file.2.expected.facts test/facts_test_open_file.2.in.facts test/facts_test_open_file.3.expected.facts test/facts_test_open_file.3.in.facts test/facts_test_save.expected.facts test/replace_lines.rb test/test.rb test/test_case_end.rb test/zero '
KC3_TEST_IKC3_SOURCES='test/ikc3/access.kc3 test/ikc3/access.out.expected test/ikc3/access.ret.expected test/ikc3/array.err.expected test/ikc3/array.kc3 test/ikc3/array.out.expected test/ikc3/array.ret.expected test/ikc3/block.kc3 test/ikc3/block.out.expected test/ikc3/block.ret.expected test/ikc3/bool.err.expected test/ikc3/bool.kc3 test/ikc3/bool.out.expected test/ikc3/bool.ret.expected test/ikc3/buf.kc3 test/ikc3/buf.out.expected test/ikc3/buf.ret.expected test/ikc3/buf_rw.kc3 test/ikc3/buf_rw.out.expected test/ikc3/buf_rw.ret.expected test/ikc3/call.err.expected test/ikc3/call.kc3 test/ikc3/call.out.expected test/ikc3/call.ret.expected test/ikc3/cast.kc3 test/ikc3/cast.out.expected test/ikc3/cast.ret.expected test/ikc3/character.err.expected test/ikc3/character.kc3 test/ikc3/character.out.expected test/ikc3/character.ret.expected test/ikc3/comment.err.expected test/ikc3/comment.kc3 test/ikc3/comment.out.expected test/ikc3/comment.ret.expected test/ikc3/complex.kc3 test/ikc3/complex.out.expected test/ikc3/complex.ret.expected test/ikc3/cow.kc3 test/ikc3/cow.out.expected test/ikc3/cow.ret.expected test/ikc3/def.kc3 test/ikc3/def.out.expected test/ikc3/def.ret.expected test/ikc3/defmodule.kc3 test/ikc3/defmodule.out.expected test/ikc3/defmodule.ret.expected test/ikc3/defoperator.kc3 test/ikc3/defoperator.out.expected test/ikc3/defoperator.ret.expected test/ikc3/defstruct.kc3 test/ikc3/defstruct.out.expected test/ikc3/defstruct.ret.expected test/ikc3/equal.err.expected test/ikc3/equal.kc3 test/ikc3/equal.out.expected test/ikc3/equal.ret.expected test/ikc3/facts.kc3 test/ikc3/facts.out.expected test/ikc3/facts.ret.expected test/ikc3/facts_with.kc3 test/ikc3/facts_with.out.expected test/ikc3/facts_with.ret.expected test/ikc3/facts_with_tags.kc3 test/ikc3/facts_with_tags.out.expected test/ikc3/facts_with_tags.ret.expected test/ikc3/facts_with_tuple.kc3 test/ikc3/facts_with_tuple.out.expected test/ikc3/facts_with_tuple.ret.expected test/ikc3/fn.err.expected test/ikc3/fn.kc3 test/ikc3/fn.out.expected test/ikc3/fn.ret.expected test/ikc3/gl.kc3 test/ikc3/gl.out.expected test/ikc3/gl.ret.expected test/ikc3/globals.kc3 test/ikc3/globals.out.expected test/ikc3/globals.ret.expected test/ikc3/hello.err.expected test/ikc3/hello.kc3 test/ikc3/hello.out.expected test/ikc3/hello.ret.expected test/ikc3/ident.err.expected test/ikc3/ident.kc3 test/ikc3/ident.out.expected test/ikc3/ident.ret.expected test/ikc3/if.kc3 test/ikc3/if.out.expected test/ikc3/if.ret.expected test/ikc3/integer.kc3 test/ikc3/integer.lisp test/ikc3/integer.out.expected test/ikc3/integer.ret.expected test/ikc3/integer_add.kc3 test/ikc3/integer_add.out.expected test/ikc3/integer_add.ret.expected test/ikc3/integer_band.kc3 test/ikc3/integer_band.out.expected test/ikc3/integer_band.ret.expected test/ikc3/integer_bnot.kc3 test/ikc3/integer_bnot.out.expected test/ikc3/integer_bnot.ret.expected test/ikc3/integer_bor-2.kc3 test/ikc3/integer_bor-2.out.expected test/ikc3/integer_bor-2.ret.expected test/ikc3/integer_bxor.kc3 test/ikc3/integer_bxor.out.expected test/ikc3/integer_bxor.ret.expected test/ikc3/integer_div.kc3 test/ikc3/integer_div.out.expected test/ikc3/integer_div.ret.expected test/ikc3/integer_eq.kc3 test/ikc3/integer_eq.out.expected test/ikc3/integer_eq.ret.expected test/ikc3/integer_gt.kc3 test/ikc3/integer_gt.out.expected test/ikc3/integer_gt.ret.expected test/ikc3/integer_lt.kc3 test/ikc3/integer_lt.out.expected test/ikc3/integer_lt.ret.expected test/ikc3/integer_mod-2.kc3 test/ikc3/integer_mod-2.out.expected test/ikc3/integer_mod-2.ret.expected test/ikc3/integer_mul.kc3 test/ikc3/integer_mul.out.expected test/ikc3/integer_mul.ret.expected test/ikc3/integer_neg.kc3 test/ikc3/integer_neg.out.expected test/ikc3/integer_neg.ret.expected test/ikc3/integer_sub.kc3 test/ikc3/integer_sub.out.expected test/ikc3/integer_sub.ret.expected test/ikc3/let.kc3 test/ikc3/let.out.expected test/ikc3/let.ret.expected test/ikc3/list.err.expected test/ikc3/list.kc3 test/ikc3/list.out.expected test/ikc3/list.ret.expected test/ikc3/macro.kc3 test/ikc3/macro.out.expected test/ikc3/macro.ret.expected test/ikc3/map.kc3 test/ikc3/map.out.expected test/ikc3/map.ret.expected test/ikc3/op.err.expected test/ikc3/op.kc3 test/ikc3/op.out.expected test/ikc3/op.ret.expected test/ikc3/plist.err.expected test/ikc3/plist.kc3 test/ikc3/plist.out.expected test/ikc3/plist.ret.expected test/ikc3/puts.kc3 test/ikc3/puts.out.expected test/ikc3/puts.ret.expected test/ikc3/quote.kc3 test/ikc3/quote.out.expected test/ikc3/quote.ret.expected test/ikc3/ratio.kc3 test/ikc3/ratio.out.expected test/ikc3/ratio.ret.expected test/ikc3/sh.kc3 test/ikc3/sh.out.expected test/ikc3/sh.ret.expected test/ikc3/str.err.expected test/ikc3/str.kc3 test/ikc3/str.out.expected test/ikc3/str.ret.expected test/ikc3/struct.kc3 test/ikc3/struct.out.expected test/ikc3/struct.ret.expected test/ikc3/sym.err.expected test/ikc3/sym.kc3 test/ikc3/sym.out.expected test/ikc3/sym.ret.expected test/ikc3/thread.kc3 test/ikc3/thread.out.expected test/ikc3/thread.ret.expected test/ikc3/time.kc3 test/ikc3/time.out.expected test/ikc3/time.ret.expected test/ikc3/to_lisp.kc3 test/ikc3/to_lisp.out.expected test/ikc3/to_lisp.ret.expected test/ikc3/tuple.err.expected test/ikc3/tuple.kc3 test/ikc3/tuple.out.expected test/ikc3/tuple.ret.expected test/ikc3/var.kc3 test/ikc3/var.out.expected test/ikc3/var.ret.expected test/ikc3/void.kc3 test/ikc3/void.out.expected test/ikc3/void.ret.expected test/ikc3_test '
diff --git a/update_sources b/update_sources
index 89a7f79..767c6b8 100755
--- a/update_sources
+++ b/update_sources
@@ -8,21 +8,21 @@ echo "$PWD/update_sources"
echo "# sources.mk generated by update_sources" > ${SOURCES_MK}
echo "# sources.sh generated by update_sources" > ${SOURCES_SH}
-KC3_CONFIGURES="$(find ekc3 event gtk4 http httpd ikc3 json kc3c kc3s libkc3 markdown socket window libtommath test ucd2c -name configure -or -name update_sources -or -name sources.sh)"
+KC3_CONFIGURES="$(find ekc3 event fs gtk4 http httpd ikc3 json kc3c kc3s libkc3 markdown socket window libtommath test ucd2c -name configure -or -name update_sources -or -name sources.sh)"
sources KC3_CONFIGURES "$KC3_CONFIGURES"
-KC3_MAKEFILES="$(find ekc3 event gtk4 http httpd ikc3 json kc3c kc3s libkc3 markdown socket window libtommath test ucd2c -name Makefile -or -name gen.mk -or -name sources.mk)"
+KC3_MAKEFILES="$(find ekc3 event fs gtk4 http httpd ikc3 json kc3c kc3s libkc3 markdown socket window libtommath test ucd2c -name Makefile -or -name gen.mk -or -name sources.mk)"
KC3_MAKEFILES="$(echo "$KC3_MAKEFILES" | grep -v 'libtommath/logs/Makefile')"
sources KC3_MAKEFILES "$KC3_MAKEFILES"
-KC3_C_SOURCES="$(find ekc3 event gtk4 http httpd ikc3 json kc3c kc3s libkc3 markdown socket window test -name "[a-z]*.c" -or -name "[a-z]*.h" -or -name "[a-z]*.c.in" -or -name "[a-z]*.h.in")"
+KC3_C_SOURCES="$(find ekc3 event fs gtk4 http httpd ikc3 json kc3c kc3s libkc3 markdown socket window test -name "[a-z]*.c" -or -name "[a-z]*.h" -or -name "[a-z]*.c.in" -or -name "[a-z]*.h.in")"
KC3_C_SOURCES="$(echo "${KC3_C_SOURCES}" | grep -Ev '/config[.]h$')"
KC3_C_SOURCES="$KC3_C_SOURCES
ucd2c/ucd.h
ucd2c/ucd2c.c"
sources KC3_C_SOURCES "$KC3_C_SOURCES"
-KC3_CXX_SOURCES="$(find ekc3 event gtk4 http httpd ikc3 json kc3c kc3s libkc3 markdown socket window test -name "[a-z]*.cxx" -or -name "[a-z]*.hxx" -or -name "[a-z]*.cxx.in" -or -name "[a-z]*.hxx.in")"
+KC3_CXX_SOURCES="$(find ekc3 event fs gtk4 http httpd ikc3 json kc3c kc3s libkc3 markdown socket window test -name "[a-z]*.cxx" -or -name "[a-z]*.hxx" -or -name "[a-z]*.cxx.in" -or -name "[a-z]*.hxx.in")"
sources KC3_CXX_SOURCES "$KC3_CXX_SOURCES"
KC3_FONT_SOURCES="$(find fonts -name '*.otf' -or -name '*.ttf')"
@@ -98,3 +98,4 @@ update_sources_sh
( cd test && ./update_sources; )
( cd window && ./update_sources; )
( cd gtk4 && ./update_sources; )
+( cd fs && ./update_sources; )