diff --git a/Makefile b/Makefile
index 19d773b..59f1317 100644
--- a/Makefile
+++ b/Makefile
@@ -19,6 +19,7 @@ all:
${MAKE} -C kc3s all
${MAKE} -C ekc3 all
-${MAKE} -C json all
+ ${MAKE} -C socket all
${MAKE} -C http all
${MAKE} -C httpd all
${MAKE} -C test all
@@ -32,6 +33,7 @@ asan:
${MAKE} -C kc3s asan
${MAKE} -C ekc3 asan
-${MAKE} -C json asan
+ ${MAKE} -C socket asan
${MAKE} -C http asan
${MAKE} -C httpd asan
${MAKE} -C test asan
@@ -46,6 +48,7 @@ build:
${MAKE} -C kc3s build
${MAKE} -C ekc3 build
-${MAKE} -C json build
+ ${MAKE} -C socket build
${MAKE} -C http build
${MAKE} -C httpd build
${MAKE} -C test build
@@ -59,6 +62,7 @@ clean:
${MAKE} -C kc3s clean
${MAKE} -C ekc3 clean
-${MAKE} -C json clean
+ ${MAKE} -C socket clean
${MAKE} -C http clean
${MAKE} -C httpd clean
${MAKE} -C test clean
@@ -71,6 +75,7 @@ clean_cov:
${MAKE} -C kc3s clean_cov
${MAKE} -C ekc3 clean_cov
-${MAKE} -C json clean_cov
+ ${MAKE} -C socket clean_cov
${MAKE} -C http clean_cov
${MAKE} -C httpd clean_cov
${MAKE} -C test clean_cov
@@ -84,6 +89,7 @@ cov:
${MAKE} -C kc3s cov
${MAKE} -C ekc3 cov
-${MAKE} -C json cov
+ ${MAKE} -C socket cov
${MAKE} -C http cov
${MAKE} -C httpd cov
${MAKE} -C test cov
@@ -97,6 +103,7 @@ debug:
${MAKE} -C kc3s debug
${MAKE} -C ekc3 debug
-${MAKE} -C json debug
+ ${MAKE} -C socket debug
${MAKE} -C http debug
${MAKE} -C httpd debug
${MAKE} -C test debug
@@ -136,6 +143,7 @@ distclean:
${MAKE} -C kc3s distclean
${MAKE} -C ekc3 distclean
-${MAKE} -C json distclean
+ ${MAKE} -C socket distclean
${MAKE} -C http distclean
${MAKE} -C httpd distclean
${MAKE} -C test distclean
@@ -147,6 +155,7 @@ gcovr:
${MAKE} -C kc3s gcovr
${MAKE} -C ekc3 gcovr
-${MAKE} -C json gcovr
+ ${MAKE} -C socket gcovr
${MAKE} -C http gcovr
${MAKE} -C httpd gcovr
${MAKE} -C test gcovr
@@ -188,6 +197,7 @@ gdb_test_http:
${MAKE} -C ikc3 debug
${MAKE} -C kc3s debug
-${MAKE} -C json debug
+ ${MAKE} -C socket debug
${MAKE} -C http debug
${MAKE} -C test gdb_test_http
@@ -198,6 +208,7 @@ gdb_test_http_asan:
${MAKE} -C ikc3 asan
${MAKE} -C kc3s asan
-${MAKE} -C json asan
+ ${MAKE} -C socket asan
${MAKE} -C http asan
${MAKE} -C test gdb_test_http_asan
@@ -208,6 +219,7 @@ gdb_test_httpd:
${MAKE} -C ikc3 debug
${MAKE} -C kc3s debug
-${MAKE} -C json debug
+ ${MAKE} -C socket debug
${MAKE} -C http debug
${MAKE} -C httpd debug
${MAKE} -C test gdb_test_httpd
@@ -219,6 +231,7 @@ gdb_test_httpd_asan:
${MAKE} -C ikc3 asan
${MAKE} -C kc3s asan
-${MAKE} -C json asan
+ ${MAKE} -C socket asan
${MAKE} -C http asan
${MAKE} -C httpd asan
${MAKE} -C test gdb_test_httpd_asan
@@ -248,6 +261,7 @@ http:
${MAKE} -C kc3s build
${MAKE} -C ekc3 build
-${MAKE} -C json build
+ ${MAKE} -C socket build
${MAKE} -C http build
httpd:
@@ -258,6 +272,7 @@ httpd:
${MAKE} -C kc3s build
${MAKE} -C ekc3 build
-${MAKE} -C json build
+ ${MAKE} -C socket build
${MAKE} -C http build
${MAKE} -C httpd build
@@ -328,6 +343,7 @@ install:
${MAKE} -C kc3s install
${MAKE} -C ekc3 install
-${MAKE} -C json install
+ ${MAKE} -C socket install
${MAKE} -C http install
${MAKE} -C httpd install
-${MAKE} -C json install
@@ -372,26 +388,31 @@ lib_links_bsd:
ln -sf ../../../ekc3/.libs/libekc3.so.0.0 lib/kc3/0.1/ekc3.so
ln -sf ../../../http/.libs/libkc3_http.so.0.0 lib/kc3/0.1/http.so
ln -sf ../../../json/.libs/libkc3_json.so.0.0 lib/kc3/0.1/json.so
+ ln -sf ../../../socket/.libs/libkc3_socket.so.0.0 lib/kc3/0.1/socket.so
lib_links_bsd_debug:
ln -sf ../../../ekc3/.libs/libekc3_debug.so.0.0 lib/kc3/0.1/ekc3.so
ln -sf ../../../http/.libs/libkc3_http_debug.so.0.0 lib/kc3/0.1/http.so
ln -sf ../../../json/.libs/libkc3_json_debug.so.0.0 lib/kc3/0.1/json.so
+ ln -sf ../../../socket/.libs/libkc3_socket_debug.so.0.0 lib/kc3/0.1/socket.so
lib_links_linux:
ln -sf ../../../ekc3/.libs/libekc3.so lib/kc3/0.1/ekc3.so
ln -sf ../../../http/.libs/libkc3_http.so lib/kc3/0.1/http.so
ln -sf ../../../json/.libs/libkc3_json.so lib/kc3/0.1/json.so
+ ln -sf ../../../socket/.libs/libkc3_socket.so lib/kc3/0.1/socket.so
lib_links_linux_asan:
ln -sf ../../../ekc3/.libs/libekc3_asan.so lib/kc3/0.1/ekc3.so
ln -sf ../../../http/.libs/libkc3_http_asan.so lib/kc3/0.1/http.so
ln -sf ../../../json/.libs/libkc3_json_asan.so lib/kc3/0.1/json.so
+ ln -sf ../../../socket/.libs/libkc3_socket_asan.so lib/kc3/0.1/socket.so
lib_links_linux_debug:
ln -sf ../../../ekc3/.libs/libekc3_debug.so lib/kc3/0.1/ekc3.so
ln -sf ../../../http/.libs/libkc3_http_debug.so lib/kc3/0.1/http.so
ln -sf ../../../json/.libs/libkc3_json_debug.so lib/kc3/0.1/json.so
+ ln -sf ../../../socket/.libs/libkc3_socket_debug.so lib/kc3/0.1/socket.so
libkc3_gcovr:
${MAKE} clean_cov
@@ -427,6 +448,7 @@ test:
${MAKE} -C kc3s build
${MAKE} -C ekc3 build
-${MAKE} -C json build
+ ${MAKE} -C socket build
${MAKE} -C http build
${MAKE} -C httpd build
${MAKE} -C test test
@@ -440,6 +462,7 @@ test_asan:
${MAKE} -C kc3s asan
${MAKE} -C ekc3 asan
-${MAKE} -C json asan
+ ${MAKE} -C socket asan
${MAKE} -C http asan
${MAKE} -C httpd asan
${MAKE} -C test test_asan
@@ -452,6 +475,7 @@ test_cov:
${MAKE} -C kc3s cov clean_cov
${MAKE} -C ekc3 cov clean_cov
-${MAKE} -C json cov clean_cov
+ ${MAKE} -C socket cov clean_cov
${MAKE} -C http cov clean_cov
${MAKE} -C httpd cov clean_cov
${MAKE} -C test test_cov
@@ -464,6 +488,7 @@ test_debug:
${MAKE} -C kc3s debug
${MAKE} -C ekc3 debug
-${MAKE} -C json debug
+ ${MAKE} -C socket debug
${MAKE} -C http debug
${MAKE} -C httpd debug
${MAKE} -C test test_debug
@@ -518,6 +543,7 @@ test_http:
${MAKE} -C ikc3 build
${MAKE} -C kc3s build
-${MAKE} -C json build
+ ${MAKE} -C socket build
${MAKE} -C http build
${MAKE} -C test test_http
@@ -528,6 +554,7 @@ test_http_asan:
${MAKE} -C ikc3 asan
${MAKE} -C kc3s asan
-${MAKE} -C json asan
+ ${MAKE} -C socket asan
${MAKE} -C http asan
${MAKE} -C test test_http_asan
@@ -538,6 +565,7 @@ test_http_cov:
${MAKE} -C ikc3 cov
${MAKE} -C kc3s cov
-${MAKE} -C json cov
+ ${MAKE} -C socket cov
${MAKE} -C http cov
${MAKE} -C test test_http_cov
@@ -548,6 +576,7 @@ test_http_debug:
${MAKE} -C ikc3 debug
${MAKE} -C kc3s debug
-${MAKE} -C json debug
+ ${MAKE} -C socket debug
${MAKE} -C http debug
${MAKE} -C test test_http_debug
@@ -558,6 +587,7 @@ test_httpd:
${MAKE} -C ikc3 build
${MAKE} -C kc3s build
-${MAKE} -C json build
+ ${MAKE} -C socket build
${MAKE} -C http build
${MAKE} -C httpd build
${MAKE} -C test test_httpd
@@ -569,6 +599,7 @@ test_httpd_asan:
${MAKE} -C ikc3 asan
${MAKE} -C kc3s asan
-${MAKE} -C json asan
+ ${MAKE} -C socket asan
${MAKE} -C http asan
${MAKE} -C httpd asan
${MAKE} -C test test_httpd_asan
@@ -580,6 +611,7 @@ test_httpd_cov:
${MAKE} -C ikc3 cov
${MAKE} -C kc3s cov
-${MAKE} -C json cov
+ ${MAKE} -C socket cov
${MAKE} -C http cov
${MAKE} -C httpd cov
${MAKE} -C test test_httpd_cov
@@ -591,6 +623,7 @@ test_httpd_debug:
${MAKE} -C ikc3 debug
${MAKE} -C kc3s debug
-${MAKE} -C json debug
+ ${MAKE} -C socket debug
${MAKE} -C http debug
${MAKE} -C httpd debug
${MAKE} -C test test_httpd_debug
@@ -673,6 +706,42 @@ test_libkc3_debug:
${MAKE} -C libkc3 debug
${MAKE} -C test test_libkc3_debug
+test_socket:
+ ${MAKE} -C libtommath build
+ ${MAKE} -C ucd2c
+ ${MAKE} -C libkc3 build
+ ${MAKE} -C ikc3 build
+ ${MAKE} -C kc3s build
+ ${MAKE} -C socket build
+ ${MAKE} -C test test_socket
+
+test_socket_asan:
+ ${MAKE} -C libtommath asan
+ ${MAKE} -C ucd2c
+ ${MAKE} -C libkc3 asan
+ ${MAKE} -C ikc3 asan
+ ${MAKE} -C kc3s asan
+ ${MAKE} -C socket asan
+ ${MAKE} -C test test_socket_asan
+
+test_socket_cov:
+ ${MAKE} -C libtommath cov
+ ${MAKE} -C ucd2c
+ ${MAKE} -C libkc3 cov
+ ${MAKE} -C ikc3 cov
+ ${MAKE} -C kc3s cov
+ ${MAKE} -C socket cov
+ ${MAKE} -C test test_socket_cov
+
+test_socket_debug:
+ ${MAKE} -C libtommath debug
+ ${MAKE} -C ucd2c
+ ${MAKE} -C libkc3 debug
+ ${MAKE} -C ikc3 debug
+ ${MAKE} -C kc3s debug
+ ${MAKE} -C socket debug
+ ${MAKE} -C test test_socket_debug
+
.PHONY: all \
asan \
build \
@@ -717,9 +786,21 @@ test_libkc3_debug:
gdb_test_libkc3 \
gdb_test_libkc3_asan \
gdb_test_libkc3_debug \
+ gdb_test_socket \
+ gdb_test_socket_asan \
+ gdb_test_socket_debug \
http \
+ http_asan \
+ http_cov \
+ http_debug \
httpd \
+ httpd_asan \
+ httpd_cov \
+ httpd_debug \
ikc3 \
+ ikc3_asan \
+ ikc3_cov \
+ ikc3_debug \
install \
json \
json_asan \
@@ -769,7 +850,11 @@ test_libkc3_debug:
test_libkc3 \
test_libkc3_asan \
test_libkc3_cov \
- test_libkc3_debug
+ test_libkc3_debug \
+ test_socket \
+ test_socket_asan \
+ test_socket_cov \
+ test_socket_debug
include config.mk
include sources.mk
diff --git a/configure b/configure
index 4f5b180..4425379 100755
--- a/configure
+++ b/configure
@@ -57,6 +57,7 @@ config_subdirs \
kc3s \
ekc3 \
json \
+ socket \
http \
httpd \
test \
diff --git a/http/http.c b/http/http.c
index 60312c5..56bb692 100644
--- a/http/http.c
+++ b/http/http.c
@@ -12,7 +12,6 @@
*/
#include <libkc3/kc3.h>
#include "http.h"
-#include "socket.h"
s_tag * http_header_split (s_str *header, s_tag *dest)
{
diff --git a/http/http_request.c b/http/http_request.c
index 2da7057..0ae36c7 100644
--- a/http/http_request.c
+++ b/http/http_request.c
@@ -13,7 +13,6 @@
#include <libkc3/kc3.h>
#include "http.h"
#include <string.h>
-#include "socket.h"
s_tag * http_request_buf_parse (s_tag *req, s_buf *buf)
{
diff --git a/http/http_response.c b/http/http_response.c
index ad71208..f7d15f5 100644
--- a/http/http_response.c
+++ b/http/http_response.c
@@ -13,7 +13,6 @@
#include <string.h>
#include <libkc3/kc3.h>
#include "http_response.h"
-#include "socket.h"
sw http_response_buf_write (const s_http_response *response,
s_buf *buf, bool send_body)
diff --git a/http/socket.c b/http/socket.c
deleted file mode 100644
index 2e47430..0000000
--- a/http/socket.c
+++ /dev/null
@@ -1,113 +0,0 @@
-/* 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 <string.h>
-#include <netdb.h>
-#include <netinet/in.h>
-#include <unistd.h>
-#include <libkc3/kc3.h>
-#include "socket.h"
-#include "socket_buf.h"
-
-void socket_close (p_socket s)
-{
- assert(s);
- close(*s);
- *s = -1;
-}
-
-p_socket socket_init_accept (p_socket s, p_socket listening)
-{
- struct sockaddr *addr;
- struct sockaddr_in addr_in = {0};
- socklen_t addr_len;
- sw e;
- t_socket tmp;
- assert(s);
- assert(listening);
- addr = (struct sockaddr *) &addr_in;
- addr_len = sizeof(addr_in);
- tmp = accept(*listening, addr, &addr_len);
- if (tmp < 0) {
- e = errno;
- err_write_1("socket_init_accept: ");
- err_inspect_s32(listening);
- err_write_1(": accept: ");
- err_puts(strerror(e));
- assert(! "socket_init_accept: accept");
- return NULL;
- }
- *s = tmp;
- return s;
-}
-
-p_socket socket_init_listen (p_socket s, const s_str *host,
- const s_str *service)
-{
- struct addrinfo hints = {0};
- struct addrinfo *res;
- struct addrinfo *res0;
- s32 e;
- const char *error_reason = "error";
- t_socket sockfd;
- assert(s);
- assert(host);
- hints.ai_family = AF_INET;
- e = getaddrinfo(host->ptr.pchar, service->ptr.pchar, &hints, &res0);
- if (e) {
- err_write_1("socket_init_listen(");
- err_write_1(host->ptr.pchar);
- err_write_1(", ");
- err_write_1(service->ptr.pchar);
- err_write_1("): getaddrinfo: ");
- err_puts(gai_strerror(e));
- assert(! "socket_init_listen: getaddrinfo");
- return NULL;
- }
- e = 0;
- sockfd = -1;
- res = res0;
- while (res) {
- sockfd = socket(res->ai_family, SOCK_STREAM, res->ai_protocol);
- if (sockfd < 0) {
- e = errno;
- error_reason = "socket_init_listen: socket: ";
- goto next;
- }
- if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &(int) {1},
- sizeof(int)) < 0) {
- error_reason = "setsockopt(SO_REUSEADDR)";
- goto next;
- }
- if (bind(sockfd, res->ai_addr, res->ai_addrlen) < 0) {
- e = errno;
- error_reason = "socket_init_listen: bind: ";
- goto next;
- }
- if (listen(sockfd, SOMAXCONN) < 0) {
- e = errno;
- error_reason = "socket_init_listen: listen: ";
- goto next;
- }
- freeaddrinfo(res0);
- *s = sockfd;
- return s;
- next:
- res = res->ai_next;
- }
- freeaddrinfo(res0);
- err_write_1(error_reason);
- err_puts(strerror(e));
- assert(! "socket_init_listen");
- return NULL;
-}
diff --git a/http/socket.h b/http/socket.h
deleted file mode 100644
index 09b7311..0000000
--- a/http/socket.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* 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 SOCKET_H
-#define SOCKET_H
-
-#include "types.h"
-
-/* Stack-allocation compatible functions. */
-p_socket socket_init_accept (p_socket s, p_socket listening);
-p_socket socket_init_listen (p_socket s, const s_str *host,
- const s_str *service);
-
-/* Operators. */
-void socket_close (p_socket s);
-
-#endif /* SOCKET_H */
diff --git a/http/socket_addr.c b/http/socket_addr.c
deleted file mode 100644
index 031a4ba..0000000
--- a/http/socket_addr.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/* 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 <string.h>
-#include <netdb.h>
-#include <netinet/in.h>
-#include <unistd.h>
-#include <libkc3/kc3.h>
-#include <arpa/inet.h>
-#include "socket.h"
-#include "socket_buf.h"
-
-s_str * socket_addr_to_str(s_str *str, const struct sockaddr *addr,
- s32 addr_len)
-{
- char ip[INET6_ADDRSTRLEN];
- assert(addr);
- assert(addr_len);
- if (!inet_ntop(addr->sa_family, &addr->sa_data[2], ip, addr_len)) {
- err_puts("socket_addr_to_str: inet_ntop");
- return str;
- }
- return str_init_1_alloc(str, ip);
-}
-
-void socket_addr_delete (struct sockaddr *sa)
-{
- assert(sa);
- free(sa);
-}
-
-struct sockaddr * socket_addr_new (u32 len)
-{
- struct sockaddr *sa;
- assert(len);
- sa = alloc(len);
- if (! sa)
- return NULL;
- return sa;
-}
-
-struct sockaddr * socket_addr_new_copy (const struct sockaddr *addr,
- u32 len)
-{
- struct sockaddr *sa;
- assert(len);
- sa = alloc(len);
- if (! sa)
- return NULL;
- memcpy(sa, addr, len);
- return sa;
-}
diff --git a/http/socket_addr.h b/http/socket_addr.h
deleted file mode 100644
index b7ed654..0000000
--- a/http/socket_addr.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/* 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 SOCKET_ADDR_H
-#define SOCKET_ADDR_H
-
-#include "types.h"
-
-/* Heap-allocation functions. */
-s_str * socket_addr_to_str(s_str *str, const struct sockaddr *addr,
- s32 addr_len);
-void socket_addr_delete (struct sockaddr *sa);
-struct sockaddr * socket_addr_new (u32 len);
-struct sockaddr * socket_addr_new_copy (const struct sockaddr *addr,
- u32 len);
-
-#endif /* SOCKET_H */
diff --git a/http/socket_buf.c b/http/socket_buf.c
deleted file mode 100644
index bc2fc8b..0000000
--- a/http/socket_buf.c
+++ /dev/null
@@ -1,167 +0,0 @@
-/* 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 <string.h>
-#include <netdb.h>
-#include <netinet/in.h>
-#include <unistd.h>
-#include <libkc3/kc3.h>
-#include "socket_addr.h"
-#include "socket_buf.h"
-
-void socket_buf_clean (s_socket_buf *sb)
-{
- assert(sb);
- buf_rw_clean(&sb->buf_rw);
- if (sb->addr)
- socket_addr_delete(sb->addr);
-}
-
-void socket_buf_close (s_socket_buf *sb)
-{
- assert(sb);
- buf_rw_fd_close(&sb->buf_rw);
- close(sb->sockfd);
- buf_rw_clean(&sb->buf_rw);
- if (sb->addr)
- socket_addr_delete(sb->addr);
-}
-
-s_socket_buf * socket_buf_init (s_socket_buf *sb, t_socket sockfd,
- struct sockaddr *addr,
- u32 addr_len)
-{
- s_socket_buf tmp = {0};
- assert(sb);
- assert(sockfd >= 0);
- assert(addr);
- assert(addr_len);
- if (! buf_rw_init_alloc(&tmp.buf_rw, BUF_SIZE)) {
- err_puts("socket_buf_init: buf_rw_init_alloc");
- assert(! "socket_buf_init: buf_rw_init_alloc");
- return NULL;
- }
- tmp.buf_rw.r->user_ptr = sb;
- tmp.buf_rw.w->user_ptr = sb;
- if (! buf_rw_fd_open(&tmp.buf_rw, sockfd)) {
- err_puts("socket_buf_init: buf_rw_fd_open");
- assert(! "socket_buf_init: buf_rw_fd_open");
- close(sockfd);
- buf_rw_clean(&tmp.buf_rw);
- return NULL;
- }
- tmp.sockfd = sockfd;
- tmp.addr = socket_addr_new_copy(addr, addr_len);
- if (! tmp.addr) {
- err_puts("socket_buf_init: socket_addr_new_copy");
- assert(! "socket_buf_init: socket_addr_new_copy");
- return NULL;
- }
- socket_addr_to_str(&tmp.addr_str, addr, addr_len);
- tmp.addr_len = addr_len;
- *sb = tmp;
- return sb;
-}
-
-s_socket_buf * socket_buf_init_accept (s_socket_buf *sb, p_socket listening)
-{
- struct sockaddr *addr;
- struct sockaddr_storage addr_storage = {0};
- socklen_t addr_len;
- sw e;
- t_socket sockfd;
- s_socket_buf tmp = {0};
- assert(sb);
- assert(listening);
- addr = (struct sockaddr *) &addr_storage;
- addr_len = sizeof(addr_storage);
- sockfd = accept(*listening, addr, &addr_len);
- if (sockfd < 0) {
- e = errno;
- err_write_1("socket_buf_init_accept: ");
- err_inspect_s32(listening);
- err_write_1(": accept: ");
- err_puts(strerror(e));
- assert(! "socket_buf_init_accept: accept");
- return NULL;
- }
- if (! socket_buf_init(&tmp, sockfd, addr, addr_len)) {
- err_puts("socket_buf_init_accept: socket_buf_init");
- assert(! "socket_buf_init_accept: socket_buf_init");
- close(sockfd);
- return NULL;
- }
- *sb = tmp;
- return sb;
-}
-
-s_socket_buf * socket_buf_init_connect (s_socket_buf *sb,
- const s_str *host,
- const s_str *service)
-{
- struct addrinfo hints = {0};
- struct addrinfo *res;
- struct addrinfo *res0;
- s32 e;
- const char *error_reason = "error";
- t_socket sockfd;
- s_socket_buf tmp;
- assert(sb);
- assert(host);
- assert(service);
- hints.ai_family = AF_INET;
- e = getaddrinfo(host->ptr.pchar, service->ptr.pchar, &hints, &res0);
- if (e) {
- err_write_1("socket_buf_init_connect(");
- err_write_1(host->ptr.pchar);
- err_write_1(", ");
- err_write_1(service->ptr.pchar);
- err_write_1("): getaddrinfo: ");
- err_puts(gai_strerror(e));
- assert(! "socket_buf_init_connect: getaddrinfo");
- return NULL;
- }
- e = 0;
- sockfd = -1;
- res = res0;
- while (res) {
- sockfd = socket(res->ai_family, SOCK_STREAM, res->ai_protocol);
- if (sockfd < 0) {
- e = errno;
- error_reason = "socket_buf_init_connect: socket: ";
- goto next;
- }
- if (connect(sockfd, res->ai_addr, res->ai_addrlen) < 0) {
- e = errno;
- error_reason = "socket_buf_init_connect: connect: ";
- goto next;
- }
- break;
- next:
- res = res->ai_next;
- }
- if (sockfd < 0) {
- err_write_1(error_reason);
- err_puts(strerror(e));
- assert(! "socket_buf_init_connect");
- return NULL;
- }
- if (! socket_buf_init(&tmp, sockfd, res->ai_addr, res->ai_addrlen)) {
- err_puts("socket_buf_init_connect: socket_buf_init");
- assert(! "socket_buf_init_connect: socket_buf_init");
- return NULL;
- }
- freeaddrinfo(res0);
- *sb = tmp;
- return sb;
-}
diff --git a/http/socket_buf.h b/http/socket_buf.h
deleted file mode 100644
index 91f4027..0000000
--- a/http/socket_buf.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/* 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 SOCKET_BUF_H
-#define SOCKET_BUF_H
-
-#include "types.h"
-
-/* Stack-allocation compatible functions, call socket_buf_clean after
- use. */
-void socket_buf_clean (s_socket_buf *sb);
-void socket_buf_close (s_socket_buf *sb);
-s_socket_buf * socket_buf_init (s_socket_buf *sb, t_socket sockfd,
- struct sockaddr *addr, u32 addr_len);
-s_socket_buf * socket_buf_init_connect (s_socket_buf *sb,
- const s_str *host,
- const s_str *service);
-
-#endif /* SOCKET_BUF_H */
diff --git a/http/sources.mk b/http/sources.mk
index b76bcba..16a5407 100644
--- a/http/sources.mk
+++ b/http/sources.mk
@@ -5,9 +5,6 @@ HEADERS = \
"http_request.h" \
"http_response.h" \
"mime_type.h" \
- "socket.h" \
- "socket_addr.h" \
- "socket_buf.h" \
"types.h" \
SOURCES = \
@@ -16,7 +13,4 @@ SOURCES = \
"http_request.c" \
"http_response.c" \
"mime_type.c" \
- "socket.c" \
- "socket_addr.c" \
- "socket_buf.c" \
diff --git a/http/sources.sh b/http/sources.sh
index 51b5a8a..de0709c 100644
--- a/http/sources.sh
+++ b/http/sources.sh
@@ -1,3 +1,3 @@
# sources.sh generated by update_sources
-HEADERS='http.h http_event.h http_request.h http_response.h mime_type.h socket.h socket_addr.h socket_buf.h types.h '
-SOURCES='http.c http_event.c http_request.c http_response.c mime_type.c socket.c socket_addr.c socket_buf.c '
+HEADERS='http.h http_event.h http_request.h http_response.h mime_type.h types.h '
+SOURCES='http.c http_event.c http_request.c http_response.c mime_type.c '
diff --git a/lib/kc3/0.1/socket.kc3 b/lib/kc3/0.1/socket.kc3
index 8004844..2887651 100644
--- a/lib/kc3/0.1/socket.kc3
+++ b/lib/kc3/0.1/socket.kc3
@@ -2,7 +2,7 @@ defmodule Socket do
defstruct [fd: (S32) -1]
- dlopen(__DIR__ + "http.so")
+ dlopen(__DIR__ + "socket.so")
def close = cfn Void "socket_close" (Socket)
diff --git a/lib/kc3/0.1/socket/buf.kc3 b/lib/kc3/0.1/socket/buf.kc3
index 381582c..f3984a2 100644
--- a/lib/kc3/0.1/socket/buf.kc3
+++ b/lib/kc3/0.1/socket/buf.kc3
@@ -6,7 +6,7 @@ defmodule Socket.Buf do
sockfd: (S32) -1,
buf_rw: %BufRW{}]
- dlopen(__DIR__ + "../http.so")
+ dlopen(__DIR__ + "../socket.so")
def accept = cfn Socket.Buf "socket_buf_init_accept" (Result, Socket)
diff --git a/socket/Makefile b/socket/Makefile
new file mode 100644
index 0000000..a4db491
--- /dev/null
+++ b/socket/Makefile
@@ -0,0 +1,78 @@
+## 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 *.gcno *.la .libs *.lo *.o
+
+CLEANFILES_COV = *.css *.gcda *.html .libs/*.gcda
+
+CLEANFILES += ${CLEANFILES_COV}
+
+DISTCLEANFILES = .build ${CLEANFILES} config.h config.mk
+
+all:
+ ${MAKE} build
+ ${MAKE} debug
+ if ${HAVE_ASAN}; then ${MAKE} asan; fi
+ if ${HAVE_GCOV}; then ${MAKE} cov; fi
+
+asan:
+ ${MAKE} ${LIB_ASAN}
+
+build:
+ ${MAKE} ${LIB}
+
+clean:
+ rm -rf ${CLEANFILES}
+
+clean_cov:
+ rm -rf ${CLEANFILES_COV}
+
+cov:
+ ${MAKE} ${LIB_COV}
+
+debug:
+ ${MAKE} ${LIB_DEBUG}
+
+distclean:
+ rm -rf ${DISTCLEANFILES}
+
+gcovr:
+ gcovr --gcov-executable ${GCOV} --html-details libkc3_web.html
+
+install:
+ ${INSTALL} -o ${OWNER} -g ${GROUP} -m 0755 -d ${prefix}/include/libkc3/ekc3
+ ${LIBTOOL} --tag=CC --mode=install ${INSTALL} -o ${OWNER} -g ${GROUP} -m 0644 ${HEADERS} ${prefix}/include/libkc3/ekc3
+ ${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
+ ${LIBTOOL} --finish ${prefix}/lib
+
+test:
+
+update_sources:
+ ./update_sources
+
+.PHONY: \
+ all \
+ asan \
+ build \
+ clean \
+ cov \
+ debug \
+ distclean \
+ gen \
+ install \
+ test \
+ update_sources \
+
+include config.mk
+include sources.mk
diff --git a/socket/configure b/socket/configure
new file mode 100755
index 0000000..89da0a0
--- /dev/null
+++ b/socket/configure
@@ -0,0 +1,119 @@
+#!/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_H_PREFIX=KC3_SOCKET_
+
+. ../config.subr
+
+LIB=libkc3_socket.la
+LIB_ASAN=libkc3_socket_asan.la
+LIB_COV=libkc3_socket_cov.la
+LIB_DEBUG=libkc3_socket_debug.la
+
+echo "LIB = $LIB" >> ${CONFIG_MK}
+echo "LIB_ASAN = $LIB_ASAN" >> ${CONFIG_MK}
+echo "LIB_COV = $LIB_COV" >> ${CONFIG_MK}
+echo "LIB_DEBUG = $LIB_DEBUG" >> ${CONFIG_MK}
+
+. ./sources.sh
+
+OBJECTS="$(c2ext .main.lo "$SOURCES")"
+echo "OBJECTS = $OBJECTS" >> ${CONFIG_MK}
+OBJECTS_ASAN="$(c2ext .asan.lo "$SOURCES")"
+OBJECTS_COV="$(c2ext .cov.lo "$SOURCES")"
+OBJECTS_DEBUG="$(c2ext .debug.lo "$SOURCES")"
+
+# Common config for all targets
+CPPFLAGS="-I.. $CPPFLAGS"
+CFLAGS="$CFLAGS -W -Wall -Werror -std=c11 -pedantic -pipe"
+LDFLAGS="-export-dynamic $LDFLAGS -rdynamic"
+config_asan
+config_gnu
+config_i386
+pkg_config libbsd-overlay
+pkg_config libevent
+pkg_config libffi
+pkg_config libmd
+config_define PREFIX "\"${PREFIX}\""
+update_config_h
+LIBS="$LIBS -lm -rpath ${PREFIX}/lib"
+
+# Address Sanitizer config
+CPPFLAGS_ASAN="$CPPFLAGS"
+CFLAGS_ASAN="$CFLAGS -DDEBUG -O1 -g"
+CFLAGS_ASAN="$CFLAGS_ASAN -fsanitize=address -fno-omit-frame-pointer"
+LDFLAGS_ASAN="$LDFLAGS"
+LIBS_LOCAL_ASAN="../libkc3/libkc3_asan.la"
+LIBS_ASAN="$LIBS $LIBS_LOCAL_ASAN"
+
+# Coverage config
+CPPFLAGS_COV="$CPPFLAGS"
+CFLAGS_COV="$CFLAGS -fprofile-arcs -ftest-coverage"
+LDFLAGS_COV="$LDFLAGS --coverage"
+LIBS_LOCAL_COV="../libkc3/libkc3_cov.la"
+LIBS_COV="$LIBS $LIBS_LOCAL_COV -lgcov"
+
+# Debug config
+CPPFLAGS_DEBUG="$CPPFLAGS"
+CFLAGS_DEBUG="$CFLAGS -DDEBUG -O0 -g"
+LDFLAGS_DEBUG="$LDFLAGS"
+LIBS_LOCAL_DEBUG="../libkc3/libkc3_debug.la"
+LIBS_DEBUG="$LIBS $LIBS_LOCAL_DEBUG"
+
+# Main config
+DEFAULT_CFLAGS="-O2 -fPIC"
+if [ "x$ENV_CFLAGS" = "x" ]; then
+ CFLAGS="$CFLAGS $DEFAULT_CFLAGS"
+fi
+CFLAGS="$CFLAGS -DNDEBUG"
+LIBS_LOCAL="../libkc3/libkc3.la"
+LIBS="$LIBS $LIBS_LOCAL"
+
+echo "LIB = $LIB" >> ${CONFIG_MK}
+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 "LIB_ASAN = $LIB_ASAN" >> ${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 "LIB_COV = $LIB_COV" >> ${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 "LIB_DEBUG = $LIB_DEBUG" >> ${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_lib
+
+build_lo
+build_lib
+
+update_config_mk
diff --git a/socket/socket.c b/socket/socket.c
new file mode 100644
index 0000000..2e47430
--- /dev/null
+++ b/socket/socket.c
@@ -0,0 +1,113 @@
+/* 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 <string.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <unistd.h>
+#include <libkc3/kc3.h>
+#include "socket.h"
+#include "socket_buf.h"
+
+void socket_close (p_socket s)
+{
+ assert(s);
+ close(*s);
+ *s = -1;
+}
+
+p_socket socket_init_accept (p_socket s, p_socket listening)
+{
+ struct sockaddr *addr;
+ struct sockaddr_in addr_in = {0};
+ socklen_t addr_len;
+ sw e;
+ t_socket tmp;
+ assert(s);
+ assert(listening);
+ addr = (struct sockaddr *) &addr_in;
+ addr_len = sizeof(addr_in);
+ tmp = accept(*listening, addr, &addr_len);
+ if (tmp < 0) {
+ e = errno;
+ err_write_1("socket_init_accept: ");
+ err_inspect_s32(listening);
+ err_write_1(": accept: ");
+ err_puts(strerror(e));
+ assert(! "socket_init_accept: accept");
+ return NULL;
+ }
+ *s = tmp;
+ return s;
+}
+
+p_socket socket_init_listen (p_socket s, const s_str *host,
+ const s_str *service)
+{
+ struct addrinfo hints = {0};
+ struct addrinfo *res;
+ struct addrinfo *res0;
+ s32 e;
+ const char *error_reason = "error";
+ t_socket sockfd;
+ assert(s);
+ assert(host);
+ hints.ai_family = AF_INET;
+ e = getaddrinfo(host->ptr.pchar, service->ptr.pchar, &hints, &res0);
+ if (e) {
+ err_write_1("socket_init_listen(");
+ err_write_1(host->ptr.pchar);
+ err_write_1(", ");
+ err_write_1(service->ptr.pchar);
+ err_write_1("): getaddrinfo: ");
+ err_puts(gai_strerror(e));
+ assert(! "socket_init_listen: getaddrinfo");
+ return NULL;
+ }
+ e = 0;
+ sockfd = -1;
+ res = res0;
+ while (res) {
+ sockfd = socket(res->ai_family, SOCK_STREAM, res->ai_protocol);
+ if (sockfd < 0) {
+ e = errno;
+ error_reason = "socket_init_listen: socket: ";
+ goto next;
+ }
+ if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &(int) {1},
+ sizeof(int)) < 0) {
+ error_reason = "setsockopt(SO_REUSEADDR)";
+ goto next;
+ }
+ if (bind(sockfd, res->ai_addr, res->ai_addrlen) < 0) {
+ e = errno;
+ error_reason = "socket_init_listen: bind: ";
+ goto next;
+ }
+ if (listen(sockfd, SOMAXCONN) < 0) {
+ e = errno;
+ error_reason = "socket_init_listen: listen: ";
+ goto next;
+ }
+ freeaddrinfo(res0);
+ *s = sockfd;
+ return s;
+ next:
+ res = res->ai_next;
+ }
+ freeaddrinfo(res0);
+ err_write_1(error_reason);
+ err_puts(strerror(e));
+ assert(! "socket_init_listen");
+ return NULL;
+}
diff --git a/socket/socket.h b/socket/socket.h
new file mode 100644
index 0000000..09b7311
--- /dev/null
+++ b/socket/socket.h
@@ -0,0 +1,26 @@
+/* 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 SOCKET_H
+#define SOCKET_H
+
+#include "types.h"
+
+/* Stack-allocation compatible functions. */
+p_socket socket_init_accept (p_socket s, p_socket listening);
+p_socket socket_init_listen (p_socket s, const s_str *host,
+ const s_str *service);
+
+/* Operators. */
+void socket_close (p_socket s);
+
+#endif /* SOCKET_H */
diff --git a/socket/socket_addr.c b/socket/socket_addr.c
new file mode 100644
index 0000000..031a4ba
--- /dev/null
+++ b/socket/socket_addr.c
@@ -0,0 +1,62 @@
+/* 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 <string.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <unistd.h>
+#include <libkc3/kc3.h>
+#include <arpa/inet.h>
+#include "socket.h"
+#include "socket_buf.h"
+
+s_str * socket_addr_to_str(s_str *str, const struct sockaddr *addr,
+ s32 addr_len)
+{
+ char ip[INET6_ADDRSTRLEN];
+ assert(addr);
+ assert(addr_len);
+ if (!inet_ntop(addr->sa_family, &addr->sa_data[2], ip, addr_len)) {
+ err_puts("socket_addr_to_str: inet_ntop");
+ return str;
+ }
+ return str_init_1_alloc(str, ip);
+}
+
+void socket_addr_delete (struct sockaddr *sa)
+{
+ assert(sa);
+ free(sa);
+}
+
+struct sockaddr * socket_addr_new (u32 len)
+{
+ struct sockaddr *sa;
+ assert(len);
+ sa = alloc(len);
+ if (! sa)
+ return NULL;
+ return sa;
+}
+
+struct sockaddr * socket_addr_new_copy (const struct sockaddr *addr,
+ u32 len)
+{
+ struct sockaddr *sa;
+ assert(len);
+ sa = alloc(len);
+ if (! sa)
+ return NULL;
+ memcpy(sa, addr, len);
+ return sa;
+}
diff --git a/socket/socket_addr.h b/socket/socket_addr.h
new file mode 100644
index 0000000..b7ed654
--- /dev/null
+++ b/socket/socket_addr.h
@@ -0,0 +1,26 @@
+/* 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 SOCKET_ADDR_H
+#define SOCKET_ADDR_H
+
+#include "types.h"
+
+/* Heap-allocation functions. */
+s_str * socket_addr_to_str(s_str *str, const struct sockaddr *addr,
+ s32 addr_len);
+void socket_addr_delete (struct sockaddr *sa);
+struct sockaddr * socket_addr_new (u32 len);
+struct sockaddr * socket_addr_new_copy (const struct sockaddr *addr,
+ u32 len);
+
+#endif /* SOCKET_H */
diff --git a/socket/socket_buf.c b/socket/socket_buf.c
new file mode 100644
index 0000000..bc2fc8b
--- /dev/null
+++ b/socket/socket_buf.c
@@ -0,0 +1,167 @@
+/* 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 <string.h>
+#include <netdb.h>
+#include <netinet/in.h>
+#include <unistd.h>
+#include <libkc3/kc3.h>
+#include "socket_addr.h"
+#include "socket_buf.h"
+
+void socket_buf_clean (s_socket_buf *sb)
+{
+ assert(sb);
+ buf_rw_clean(&sb->buf_rw);
+ if (sb->addr)
+ socket_addr_delete(sb->addr);
+}
+
+void socket_buf_close (s_socket_buf *sb)
+{
+ assert(sb);
+ buf_rw_fd_close(&sb->buf_rw);
+ close(sb->sockfd);
+ buf_rw_clean(&sb->buf_rw);
+ if (sb->addr)
+ socket_addr_delete(sb->addr);
+}
+
+s_socket_buf * socket_buf_init (s_socket_buf *sb, t_socket sockfd,
+ struct sockaddr *addr,
+ u32 addr_len)
+{
+ s_socket_buf tmp = {0};
+ assert(sb);
+ assert(sockfd >= 0);
+ assert(addr);
+ assert(addr_len);
+ if (! buf_rw_init_alloc(&tmp.buf_rw, BUF_SIZE)) {
+ err_puts("socket_buf_init: buf_rw_init_alloc");
+ assert(! "socket_buf_init: buf_rw_init_alloc");
+ return NULL;
+ }
+ tmp.buf_rw.r->user_ptr = sb;
+ tmp.buf_rw.w->user_ptr = sb;
+ if (! buf_rw_fd_open(&tmp.buf_rw, sockfd)) {
+ err_puts("socket_buf_init: buf_rw_fd_open");
+ assert(! "socket_buf_init: buf_rw_fd_open");
+ close(sockfd);
+ buf_rw_clean(&tmp.buf_rw);
+ return NULL;
+ }
+ tmp.sockfd = sockfd;
+ tmp.addr = socket_addr_new_copy(addr, addr_len);
+ if (! tmp.addr) {
+ err_puts("socket_buf_init: socket_addr_new_copy");
+ assert(! "socket_buf_init: socket_addr_new_copy");
+ return NULL;
+ }
+ socket_addr_to_str(&tmp.addr_str, addr, addr_len);
+ tmp.addr_len = addr_len;
+ *sb = tmp;
+ return sb;
+}
+
+s_socket_buf * socket_buf_init_accept (s_socket_buf *sb, p_socket listening)
+{
+ struct sockaddr *addr;
+ struct sockaddr_storage addr_storage = {0};
+ socklen_t addr_len;
+ sw e;
+ t_socket sockfd;
+ s_socket_buf tmp = {0};
+ assert(sb);
+ assert(listening);
+ addr = (struct sockaddr *) &addr_storage;
+ addr_len = sizeof(addr_storage);
+ sockfd = accept(*listening, addr, &addr_len);
+ if (sockfd < 0) {
+ e = errno;
+ err_write_1("socket_buf_init_accept: ");
+ err_inspect_s32(listening);
+ err_write_1(": accept: ");
+ err_puts(strerror(e));
+ assert(! "socket_buf_init_accept: accept");
+ return NULL;
+ }
+ if (! socket_buf_init(&tmp, sockfd, addr, addr_len)) {
+ err_puts("socket_buf_init_accept: socket_buf_init");
+ assert(! "socket_buf_init_accept: socket_buf_init");
+ close(sockfd);
+ return NULL;
+ }
+ *sb = tmp;
+ return sb;
+}
+
+s_socket_buf * socket_buf_init_connect (s_socket_buf *sb,
+ const s_str *host,
+ const s_str *service)
+{
+ struct addrinfo hints = {0};
+ struct addrinfo *res;
+ struct addrinfo *res0;
+ s32 e;
+ const char *error_reason = "error";
+ t_socket sockfd;
+ s_socket_buf tmp;
+ assert(sb);
+ assert(host);
+ assert(service);
+ hints.ai_family = AF_INET;
+ e = getaddrinfo(host->ptr.pchar, service->ptr.pchar, &hints, &res0);
+ if (e) {
+ err_write_1("socket_buf_init_connect(");
+ err_write_1(host->ptr.pchar);
+ err_write_1(", ");
+ err_write_1(service->ptr.pchar);
+ err_write_1("): getaddrinfo: ");
+ err_puts(gai_strerror(e));
+ assert(! "socket_buf_init_connect: getaddrinfo");
+ return NULL;
+ }
+ e = 0;
+ sockfd = -1;
+ res = res0;
+ while (res) {
+ sockfd = socket(res->ai_family, SOCK_STREAM, res->ai_protocol);
+ if (sockfd < 0) {
+ e = errno;
+ error_reason = "socket_buf_init_connect: socket: ";
+ goto next;
+ }
+ if (connect(sockfd, res->ai_addr, res->ai_addrlen) < 0) {
+ e = errno;
+ error_reason = "socket_buf_init_connect: connect: ";
+ goto next;
+ }
+ break;
+ next:
+ res = res->ai_next;
+ }
+ if (sockfd < 0) {
+ err_write_1(error_reason);
+ err_puts(strerror(e));
+ assert(! "socket_buf_init_connect");
+ return NULL;
+ }
+ if (! socket_buf_init(&tmp, sockfd, res->ai_addr, res->ai_addrlen)) {
+ err_puts("socket_buf_init_connect: socket_buf_init");
+ assert(! "socket_buf_init_connect: socket_buf_init");
+ return NULL;
+ }
+ freeaddrinfo(res0);
+ *sb = tmp;
+ return sb;
+}
diff --git a/socket/socket_buf.h b/socket/socket_buf.h
new file mode 100644
index 0000000..91f4027
--- /dev/null
+++ b/socket/socket_buf.h
@@ -0,0 +1,28 @@
+/* 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 SOCKET_BUF_H
+#define SOCKET_BUF_H
+
+#include "types.h"
+
+/* Stack-allocation compatible functions, call socket_buf_clean after
+ use. */
+void socket_buf_clean (s_socket_buf *sb);
+void socket_buf_close (s_socket_buf *sb);
+s_socket_buf * socket_buf_init (s_socket_buf *sb, t_socket sockfd,
+ struct sockaddr *addr, u32 addr_len);
+s_socket_buf * socket_buf_init_connect (s_socket_buf *sb,
+ const s_str *host,
+ const s_str *service);
+
+#endif /* SOCKET_BUF_H */
diff --git a/socket/sources.mk b/socket/sources.mk
new file mode 100644
index 0000000..e54659f
--- /dev/null
+++ b/socket/sources.mk
@@ -0,0 +1,12 @@
+# sources.mk generated by update_sources
+HEADERS = \
+ "socket.h" \
+ "socket_addr.h" \
+ "socket_buf.h" \
+ "types.h" \
+
+SOURCES = \
+ "socket.c" \
+ "socket_addr.c" \
+ "socket_buf.c" \
+
diff --git a/socket/sources.sh b/socket/sources.sh
new file mode 100644
index 0000000..6875ff3
--- /dev/null
+++ b/socket/sources.sh
@@ -0,0 +1,3 @@
+# sources.sh generated by update_sources
+HEADERS='socket.h socket_addr.h socket_buf.h types.h '
+SOURCES='socket.c socket_addr.c socket_buf.c '
diff --git a/socket/types.h b/socket/types.h
new file mode 100644
index 0000000..c2460f0
--- /dev/null
+++ b/socket/types.h
@@ -0,0 +1,52 @@
+/* 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 HTTP_TYPES_H
+#define HTTP_TYPES_H
+
+#include <sys/socket.h>
+#include <libkc3/types.h>
+
+/* 1 */
+typedef s32 t_socket;
+typedef struct socket_buf s_socket_buf;
+typedef struct http_request s_http_request;
+typedef struct http_response s_http_response;
+
+/* 2 */
+typedef t_socket *p_socket;
+
+/* Struct 1 */
+struct socket_buf {
+ struct sockaddr *addr;
+ u32 addr_len;
+ s_str addr_str;
+ t_socket sockfd;
+ s_buf_rw buf_rw;
+};
+
+struct http_request {
+ const s_sym *method;
+ s_str url;
+ s_str protocol;
+ s_list *headers;
+};
+
+struct http_response {
+ s_str protocol;
+ u16 code;
+ s_str message;
+ s_list *headers;
+ s_str body;
+};
+
+#endif /* HTTP_TYPES_H */
diff --git a/socket/update_sources b/socket/update_sources
new file mode 100755
index 0000000..a4101fe
--- /dev/null
+++ b/socket/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/sources.mk b/sources.mk
index 1d15427..b8129a6 100644
--- a/sources.mk
+++ b/sources.mk
@@ -12,6 +12,9 @@ KC3_CONFIGURES = \
"ikc3/configure" \
"ikc3/sources.sh" \
"ikc3/update_sources" \
+ "json/configure" \
+ "json/sources.sh" \
+ "json/update_sources" \
"kc3c/configure" \
"kc3s/configure" \
"kc3s/sources.sh" \
@@ -22,6 +25,9 @@ KC3_CONFIGURES = \
"libtommath/configure" \
"libtommath/sources.sh" \
"libtommath/update_sources" \
+ "socket/configure" \
+ "socket/sources.sh" \
+ "socket/update_sources" \
"test/configure" \
"test/sources.sh" \
"test/update_sources" \
@@ -70,6 +76,8 @@ KC3_MAKEFILES = \
"httpd/sources.mk" \
"ikc3/Makefile" \
"ikc3/sources.mk" \
+ "json/Makefile" \
+ "json/sources.mk" \
"kc3c/Makefile" \
"kc3s/Makefile" \
"kc3s/sources.mk" \
@@ -78,6 +86,8 @@ KC3_MAKEFILES = \
"libkc3/sources.mk" \
"libtommath/Makefile" \
"libtommath/sources.mk" \
+ "socket/Makefile" \
+ "socket/sources.mk" \
"test/Makefile" \
"test/sources.mk" \
"ucd2c/Makefile" \
@@ -121,12 +131,6 @@ KC3_C_SOURCES = \
"http/http_response.h" \
"http/mime_type.c" \
"http/mime_type.h" \
- "http/socket.c" \
- "http/socket.h" \
- "http/socket_addr.c" \
- "http/socket_addr.h" \
- "http/socket_buf.c" \
- "http/socket_buf.h" \
"http/types.h" \
"httpd/httpd.c" \
"httpd/httpd.h" \
@@ -136,6 +140,8 @@ KC3_C_SOURCES = \
"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" \
@@ -510,6 +516,13 @@ KC3_C_SOURCES = \
"libkc3/var.h" \
"libkc3/void.c" \
"libkc3/void.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" \
@@ -905,6 +918,7 @@ KC3_IMG_SOURCES = \
"img/toast.png" \
KC3_LIB_SOURCES = \
+ "lib/kc3/0.1/.#kc3.facts" \
"lib/kc3/0.1/array.kc3" \
"lib/kc3/0.1/bool.facts" \
"lib/kc3/0.1/buf.kc3" \
@@ -915,6 +929,9 @@ KC3_LIB_SOURCES = \
"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/facts.kc3" \
+ "lib/kc3/0.1/facts/cursor.kc3" \
"lib/kc3/0.1/file.kc3" \
"lib/kc3/0.1/file/stat.kc3" \
"lib/kc3/0.1/gl/dvec2.kc3" \
@@ -931,6 +948,7 @@ KC3_LIB_SOURCES = \
"lib/kc3/0.1/http/response.kc3" \
"lib/kc3/0.1/httpd.kc3" \
"lib/kc3/0.1/integer.facts" \
+ "lib/kc3/0.1/json/parser.kc3" \
"lib/kc3/0.1/kc3.facts" \
"lib/kc3/0.1/kc3/operator.kc3" \
"lib/kc3/0.1/list.kc3" \
@@ -942,6 +960,11 @@ KC3_LIB_SOURCES = \
"lib/kc3/0.1/s32.facts" \
"lib/kc3/0.1/s64.facts" \
"lib/kc3/0.1/s8.facts" \
+ "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/socket.kc3" \
"lib/kc3/0.1/socket/addr.kc3" \
"lib/kc3/0.1/socket/buf.kc3" \
@@ -949,6 +972,7 @@ KC3_LIB_SOURCES = \
"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/time.kc3" \
"lib/kc3/0.1/u16.facts" \
"lib/kc3/0.1/u32.facts" \
@@ -1037,13 +1061,13 @@ KC3_TEST_IKC3_SOURCES = \
"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/fn.err.expected" \
"test/ikc3/fn.kc3" \
"test/ikc3/fn.out.expected" \
"test/ikc3/fn.ret.expected" \
- "test/ikc3/function_call.err.expected" \
- "test/ikc3/function_call.out.expected" \
- "test/ikc3/function_call.ret.expected" \
"test/ikc3/gl.kc3" \
"test/ikc3/gl.out.expected" \
"test/ikc3/gl.ret.expected" \
@@ -1183,9 +1207,6 @@ KC3_TEST_HTTP_SOURCES = \
"test/http/06_mime_types.kc3" \
"test/http/06_mime_types.out.expected" \
"test/http/06_mime_types.ret.expected" \
- "test/http/07_event_echo.kc3" \
- "test/http/07_event_echo.out.expected" \
- "test/http/07_event_echo.ret.expected" \
"test/http_test" \
KC3_TEST_HTTPD_SOURCES = \
diff --git a/sources.sh b/sources.sh
index f5baa15..91eb3ab 100644
--- a/sources.sh
+++ b/sources.sh
@@ -1,15 +1,15 @@
# sources.sh generated by update_sources
-KC3_CONFIGURES='ekc3/configure ekc3/sources.sh ekc3/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 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 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 http/Makefile http/sources.mk httpd/Makefile httpd/sources.mk ikc3/Makefile ikc3/sources.mk kc3c/Makefile kc3s/Makefile kc3s/sources.mk libkc3/Makefile libkc3/gen.mk libkc3/sources.mk libtommath/Makefile libtommath/sources.mk test/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 http/http.c http/http.h http/http_event.c http/http_event.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/socket.c http/socket.h http/socket_addr.c http/socket_addr.h http/socket_buf.c http/socket_buf.h http/types.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 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/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/data.c libkc3/data.h libkc3/env.c libkc3/env.h libkc3/error.c libkc3/error.h libkc3/error_handler.c libkc3/error_handler.h libkc3/eval.c libkc3/eval.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/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/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/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/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/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/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 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/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 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 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 http/Makefile http/sources.mk httpd/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 socket/Makefile socket/sources.mk test/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 http/http.c http/http.h http/http_event.c http/http_event.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 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/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/data.c libkc3/data.h libkc3/env.c libkc3/env.h libkc3/error.c libkc3/error.h libkc3/error_handler.c libkc3/error_handler.h libkc3/eval.c libkc3/eval.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/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/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/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/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/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/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 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/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_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 '
KC3_IMG_SOURCES='img/c3.1.xcf img/c3.1080.jpg img/c3.1080.png img/c3.128.jpg img/c3.128.png img/c3.16.png img/c3.256.jpg img/c3.256.png img/c3.32.jpg img/c3.32.png img/c3.48.jpg img/c3.48.png img/c3.512.jpg img/c3.512.png img/c3.64.jpg img/c3.64.png img/c3.640.jpg img/c3.640.png img/c3.720.jpg img/c3.720.png img/c3.iconset/icon_128x128.png img/c3.iconset/icon_16x16.png img/c3.iconset/icon_256x256.png img/c3.iconset/icon_32x32.png img/c3.iconset/icon_512x512.png img/c3.iconset/icon_64x64.png img/c3.xcf img/earth.jpg img/earth.png img/flaps.256.png img/flaps.png img/fly-dead.png img/fly-noto.png img/iris-c3-004.jpeg 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/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/complex.facts lib/kc3/0.1/cow.kc3 lib/kc3/0.1/ekc3.kc3 lib/kc3/0.1/f128.facts lib/kc3/0.1/f32.facts lib/kc3/0.1/f64.facts 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/http.kc3 lib/kc3/0.1/http/event.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/integer.facts 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/ptr.facts lib/kc3/0.1/ptr_free.facts lib/kc3/0.1/ratio.facts 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/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/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/uw.facts lib/kc3/0.1/var.facts lib/kc3/0.1/void.facts '
+KC3_LIB_SOURCES='lib/kc3/0.1/.#kc3.facts 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/complex.facts lib/kc3/0.1/cow.kc3 lib/kc3/0.1/ekc3.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/facts.kc3 lib/kc3/0.1/facts/cursor.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/http.kc3 lib/kc3/0.1/http/event.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/integer.facts lib/kc3/0.1/json/parser.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/ptr.facts lib/kc3/0.1/ptr_free.facts lib/kc3/0.1/ratio.facts 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/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/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/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/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/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/fn.err.expected test/ikc3/fn.kc3 test/ikc3/fn.out.expected test/ikc3/fn.ret.expected test/ikc3/function_call.err.expected test/ikc3/function_call.out.expected test/ikc3/function_call.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/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/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 '
+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/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/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/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/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 '
KC3_TEST_EKC3_SOURCES='test/ekc3/title.html.ekc3 test/ekc3/title.kc3 test/ekc3/title.out.expected test/ekc3/title.ret.expected test/ekc3_test '
-KC3_TEST_HTTP_SOURCES='test/http/01_socket_buf.kc3 test/http/01_socket_buf.out.expected test/http/01_socket_buf.ret.expected test/http/02_socket.kc3 test/http/02_socket.out.expected test/http/02_socket.ret.expected test/http/03_client_server.kc3 test/http/03_client_server.out.expected test/http/03_client_server.ret.expected test/http/04_server_request.kc3 test/http/04_server_request.out.expected test/http/04_server_request.ret.expected test/http/05_response.kc3 test/http/05_response.out.expected test/http/05_response.ret.expected test/http/06_mime_types.kc3 test/http/06_mime_types.out.expected test/http/06_mime_types.ret.expected test/http/07_event_echo.kc3 test/http/07_event_echo.out.expected test/http/07_event_echo.ret.expected test/http_test '
+KC3_TEST_HTTP_SOURCES='test/http/01_socket_buf.kc3 test/http/01_socket_buf.out.expected test/http/01_socket_buf.ret.expected test/http/02_socket.kc3 test/http/02_socket.out.expected test/http/02_socket.ret.expected test/http/03_client_server.kc3 test/http/03_client_server.out.expected test/http/03_client_server.ret.expected test/http/04_server_request.kc3 test/http/04_server_request.out.expected test/http/04_server_request.ret.expected test/http/05_response.kc3 test/http/05_response.out.expected test/http/05_response.ret.expected test/http/06_mime_types.kc3 test/http/06_mime_types.out.expected test/http/06_mime_types.ret.expected test/http_test '
KC3_TEST_HTTPD_SOURCES='test/httpd/.keep '
KC3_OTHER_SOURCES='AUTHORS Makefile README.md config.subr configure env kc3.index kc3.version libkc3/tag_init.rb license.h sources.mk sources.sh '
KC3_EXTERNAL_SOURCES='libtommath/LICENSE libtommath/README.md libtommath/bn_cutoffs.c libtommath/bn_deprecated.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_addmod.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_decr.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_expt_u32.c libtommath/bn_mp_exptmod.c libtommath/bn_mp_exteuclid.c libtommath/bn_mp_fread.c libtommath/bn_mp_from_sbin.c libtommath/bn_mp_from_ubin.c libtommath/bn_mp_fwrite.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_l.c libtommath/bn_mp_get_ll.c libtommath/bn_mp_get_mag_u32.c libtommath/bn_mp_get_mag_u64.c libtommath/bn_mp_get_mag_ul.c libtommath/bn_mp_get_mag_ull.c libtommath/bn_mp_grow.c libtommath/bn_mp_incr.c libtommath/bn_mp_init.c libtommath/bn_mp_init_copy.c libtommath/bn_mp_init_i32.c libtommath/bn_mp_init_i64.c libtommath/bn_mp_init_l.c libtommath/bn_mp_init_ll.c libtommath/bn_mp_init_multi.c libtommath/bn_mp_init_set.c libtommath/bn_mp_init_size.c libtommath/bn_mp_init_u32.c libtommath/bn_mp_init_u64.c libtommath/bn_mp_init_ul.c libtommath/bn_mp_init_ull.c libtommath/bn_mp_invmod.c libtommath/bn_mp_is_square.c libtommath/bn_mp_iseven.c libtommath/bn_mp_isodd.c libtommath/bn_mp_kronecker.c libtommath/bn_mp_lcm.c libtommath/bn_mp_log_u32.c libtommath/bn_mp_lshd.c libtommath/bn_mp_mod.c libtommath/bn_mp_mod_2d.c libtommath/bn_mp_mod_d.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_pack.c libtommath/bn_mp_pack_count.c libtommath/bn_mp_prime_fermat.c libtommath/bn_mp_prime_frobenius_underwood.c libtommath/bn_mp_prime_is_prime.c libtommath/bn_mp_prime_miller_rabin.c libtommath/bn_mp_prime_next_prime.c libtommath/bn_mp_prime_rabin_miller_trials.c libtommath/bn_mp_prime_rand.c libtommath/bn_mp_prime_strong_lucas_selfridge.c libtommath/bn_mp_radix_size.c libtommath/bn_mp_radix_smap.c libtommath/bn_mp_rand.c libtommath/bn_mp_read_radix.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_root_u32.c libtommath/bn_mp_rshd.c libtommath/bn_mp_sbin_size.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_ll.c libtommath/bn_mp_set_u32.c libtommath/bn_mp_set_u64.c libtommath/bn_mp_set_ul.c libtommath/bn_mp_set_ull.c libtommath/bn_mp_shrink.c libtommath/bn_mp_signed_rsh.c libtommath/bn_mp_sqr.c libtommath/bn_mp_sqrmod.c libtommath/bn_mp_sqrt.c libtommath/bn_mp_sqrtmod_prime.c libtommath/bn_mp_sub.c libtommath/bn_mp_sub_d.c libtommath/bn_mp_submod.c libtommath/bn_mp_to_radix.c libtommath/bn_mp_to_sbin.c libtommath/bn_mp_to_ubin.c libtommath/bn_mp_ubin_size.c libtommath/bn_mp_unpack.c libtommath/bn_mp_xor.c libtommath/bn_mp_zero.c libtommath/bn_prime_tab.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_get_bit.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_prime_is_divisible.c libtommath/bn_s_mp_rand_jenkins.c libtommath/bn_s_mp_rand_platform.c libtommath/bn_s_mp_reverse.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 libtommath/demo/mtest_opponent.c libtommath/demo/shared.c libtommath/demo/shared.h libtommath/demo/test.c libtommath/demo/timing.c libtommath/etc/2kprime.c libtommath/etc/drprime.c libtommath/etc/mersenne.c libtommath/etc/mont.c libtommath/etc/pprime.c libtommath/etc/tune.c libtommath/mtest/logtab.h libtommath/mtest/mpi-config.h libtommath/mtest/mpi-types.h libtommath/mtest/mpi.c libtommath/mtest/mpi.h libtommath/mtest/mtest.c libtommath/tommath.h libtommath/tommath_class.h libtommath/tommath_cutoffs.h libtommath/tommath_private.h libtommath/tommath_superclass.h linenoise/LICENSE linenoise/README.markdown linenoise/example.c linenoise/linenoise.c linenoise/linenoise.h ucd2c/UCD.zip ucd2c/UCD/ArabicShaping.txt ucd2c/UCD/BidiBrackets.txt ucd2c/UCD/BidiCharacterTest.txt ucd2c/UCD/BidiMirroring.txt ucd2c/UCD/BidiTest.txt ucd2c/UCD/Blocks.txt ucd2c/UCD/CJKRadicals.txt ucd2c/UCD/CaseFolding.txt ucd2c/UCD/CompositionExclusions.txt ucd2c/UCD/DerivedAge.txt ucd2c/UCD/DerivedCoreProperties.txt ucd2c/UCD/DerivedNormalizationProps.txt ucd2c/UCD/EastAsianWidth.txt ucd2c/UCD/EmojiSources.txt ucd2c/UCD/EquivalentUnifiedIdeograph.txt ucd2c/UCD/HangulSyllableType.txt ucd2c/UCD/Index.txt ucd2c/UCD/IndicPositionalCategory.txt ucd2c/UCD/IndicSyllabicCategory.txt ucd2c/UCD/Jamo.txt ucd2c/UCD/LineBreak.txt ucd2c/UCD/NameAliases.txt ucd2c/UCD/NamedSequences.txt ucd2c/UCD/NamedSequencesProv.txt ucd2c/UCD/NamesList.txt ucd2c/UCD/NormalizationCorrections.txt ucd2c/UCD/NormalizationTest.txt ucd2c/UCD/NushuSources.txt ucd2c/UCD/PropList.txt ucd2c/UCD/PropertyAliases.txt ucd2c/UCD/PropertyValueAliases.txt ucd2c/UCD/ReadMe.txt ucd2c/UCD/ScriptExtensions.txt ucd2c/UCD/Scripts.txt ucd2c/UCD/SpecialCasing.txt ucd2c/UCD/StandardizedVariants.txt ucd2c/UCD/TangutSources.txt ucd2c/UCD/USourceData.txt ucd2c/UCD/USourceGlyphs.pdf ucd2c/UCD/USourceRSChart.pdf ucd2c/UCD/UnicodeData.txt ucd2c/UCD/VerticalOrientation.txt ucd2c/UCD/auxiliary/GraphemeBreakProperty.txt ucd2c/UCD/auxiliary/GraphemeBreakTest.txt ucd2c/UCD/auxiliary/LineBreakTest.txt ucd2c/UCD/auxiliary/SentenceBreakProperty.txt ucd2c/UCD/auxiliary/SentenceBreakTest.txt ucd2c/UCD/auxiliary/WordBreakProperty.txt ucd2c/UCD/auxiliary/WordBreakTest.txt ucd2c/UCD/emoji/ReadMe.txt ucd2c/UCD/emoji/emoji-data.txt ucd2c/UCD/emoji/emoji-variation-sequences.txt ucd2c/UCD/extracted/DerivedBidiClass.txt ucd2c/UCD/extracted/DerivedBinaryProperties.txt ucd2c/UCD/extracted/DerivedCombiningClass.txt ucd2c/UCD/extracted/DerivedDecompositionType.txt ucd2c/UCD/extracted/DerivedEastAsianWidth.txt ucd2c/UCD/extracted/DerivedGeneralCategory.txt ucd2c/UCD/extracted/DerivedJoiningGroup.txt ucd2c/UCD/extracted/DerivedJoiningType.txt ucd2c/UCD/extracted/DerivedLineBreak.txt ucd2c/UCD/extracted/DerivedName.txt ucd2c/UCD/extracted/DerivedNumericType.txt ucd2c/UCD/extracted/DerivedNumericValues.txt '
diff --git a/update_sources b/update_sources
index fea9748..3df8d41 100755
--- a/update_sources
+++ b/update_sources
@@ -8,14 +8,14 @@ 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 http httpd ikc3 kc3c kc3s libkc3 window libtommath test ucd2c -name configure -or -name update_sources -or -name sources.sh)"
+KC3_CONFIGURES="$(find ekc3 http httpd ikc3 json kc3c kc3s libkc3 socket window libtommath test ucd2c -name configure -or -name update_sources -or -name sources.sh)"
sources KC3_CONFIGURES "$KC3_CONFIGURES"
-KC3_MAKEFILES="$(find ekc3 http httpd ikc3 kc3c kc3s libkc3 window libtommath test ucd2c -name Makefile -or -name gen.mk -or -name sources.mk)"
+KC3_MAKEFILES="$(find ekc3 http httpd ikc3 json kc3c kc3s libkc3 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 http httpd ikc3 kc3c kc3s libkc3 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 http httpd ikc3 json kc3c kc3s libkc3 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
@@ -85,6 +85,7 @@ update_sources_sh
( cd kc3s && ./update_sources; )
( cd ekc3 && ./update_sources; )
( cd json && ./update_sources; )
+( cd socket && ./update_sources; )
( cd http && ./update_sources; )
( cd httpd && ./update_sources; )
( cd test && ./update_sources; )