diff --git a/c3s/configure b/c3s/configure
index 052cc3e..a6b159b 100755
--- a/c3s/configure
+++ b/c3s/configure
@@ -55,8 +55,8 @@ config_asan
config_gnu
pkg_config libbsd-overlay
pkg_config libmd
-config_lib libmd -lmd
-config_lib dl -ldl
+config_lib libmd -lmd 2>/dev/null
+config_lib dl -ldl 2>/dev/null
LIBS="$LIBS ../libffi/.libs/libffi.la -pthread"
# Asan config
diff --git a/ic3/configure b/ic3/configure
index 30f4fa5..338d290 100755
--- a/ic3/configure
+++ b/ic3/configure
@@ -52,8 +52,8 @@ config_asan
config_gnu
pkg_config libbsd-overlay
pkg_config libmd
-config_lib libmd -lmd
-config_lib dl -ldl
+config_lib libmd -lmd 2>/dev/null
+config_lib dl -ldl 2>/dev/null
LIBS="$LIBS ../libffi/libffi.la -pthread"
# Asan config
diff --git a/lib/c3/0.1/list.facts b/lib/c3/0.1/list.facts
new file mode 100644
index 0000000..dd5d118
--- /dev/null
+++ b/lib/c3/0.1/list.facts
@@ -0,0 +1,14 @@
+%{module: C3.Facts.Dump,
+ version: 1}
+add {List, :is_a, :module}
+add {List, :name, "List"}
+add {List, :path, "list.facts"}
+add {List, :symbol, List.map}
+add {List.map, :fn, fn {
+ (_, ()) {
+ ()
+ }
+ (f, (a | b)) {
+ (f(a) | List.map(b))
+ }
+}}
diff --git a/libc3/buf_inspect.c b/libc3/buf_inspect.c
index 8235e6a..51c6220 100644
--- a/libc3/buf_inspect.c
+++ b/libc3/buf_inspect.c
@@ -14,7 +14,16 @@
#include <stdlib.h>
#include <string.h>
#include "../libtommath/tommath.h"
-#include "c3.h"
+#include "buf.h"
+#include "buf_inspect.h"
+#include "buf_save.h"
+#include "character.h"
+#include "ident.h"
+#include "integer.h"
+#include "list.h"
+#include "operator.h"
+#include "str.h"
+#include "tag.h"
sw buf_inspect_array_data (s_buf *buf, const s_array *array);
sw buf_inspect_array_data_rec (s_buf *buf, const s_array *array,
@@ -620,12 +629,17 @@ sw buf_inspect_fact_spec (s_buf *buf, p_facts_spec spec)
sw buf_inspect_fn (s_buf *buf, const s_fn *fn)
{
+ const s_fn_clause *clause;
sw r;
sw result = 0;
+ assert(buf);
+ assert(fn);
if ((r = buf_write_1(buf, "fn ")) < 0)
return r;
result += r;
- if (fn->next_clause) {
+ clause = fn->clauses;
+ assert(clause);
+ if (clause->next_clause) {
if ((r = buf_write_1(buf, "{\n")) < 0)
return r;
result += r;
@@ -633,20 +647,20 @@ sw buf_inspect_fn (s_buf *buf, const s_fn *fn)
if ((r = buf_write_1(buf, " ")) < 0)
return r;
result += r;
- if ((r = buf_inspect_fn_clause(buf, fn)) < 0)
+ if ((r = buf_inspect_fn_clause(buf, clause)) < 0)
return r;
result += r;
if ((r = buf_write_1(buf, "\n")) < 0)
return r;
result += r;
- fn = fn->next_clause;
+ clause = clause->next_clause;
}
if ((r = buf_write_1(buf, "}")) < 0)
return r;
result += r;
}
else {
- if ((r = buf_inspect_fn_clause(buf, fn)) < 0)
+ if ((r = buf_inspect_fn_clause(buf, clause)) < 0)
return r;
result += r;
}
@@ -732,35 +746,35 @@ sw buf_inspect_fn_algo_size (const s_list *algo)
return result;
}
-sw buf_inspect_fn_clause (s_buf *buf, const s_fn *fn)
+sw buf_inspect_fn_clause (s_buf *buf, const s_fn_clause *clause)
{
sw r;
sw result = 0;
assert(buf);
- assert(fn);
- if ((r = buf_inspect_fn_pattern(buf, fn->pattern)) < 0)
+ assert(clause);
+ if ((r = buf_inspect_fn_pattern(buf, clause->pattern)) < 0)
return r;
result += r;
if ((r = buf_write_1(buf, " ")) < 0)
return r;
result += r;
- if ((r = buf_inspect_fn_algo(buf, fn->algo)) < 0)
+ if ((r = buf_inspect_fn_algo(buf, clause->algo)) < 0)
return r;
result += r;
return result;
}
-sw buf_inspect_fn_clause_size (const s_fn *fn)
+sw buf_inspect_fn_clause_size (const s_fn_clause *clause)
{
sw r;
sw result = 0;
- assert(fn);
- if ((r = buf_inspect_fn_pattern_size(fn->pattern)) < 0)
+ assert(clause);
+ if ((r = buf_inspect_fn_pattern_size(clause->pattern)) < 0)
return r;
result += r;
r = strlen(" ");
result += r;
- if ((r = buf_inspect_fn_algo_size(fn->algo)) < 0)
+ if ((r = buf_inspect_fn_algo_size(clause->algo)) < 0)
return r;
result += r;
return result;
@@ -814,27 +828,31 @@ sw buf_inspect_fn_pattern_size (const s_list *pattern)
sw buf_inspect_fn_size (const s_fn *fn)
{
+ const s_fn_clause *clause;
sw r;
sw result = 0;
+ assert(fn);
r = strlen("fn ");
result += r;
- if (fn->next_clause) {
+ clause = fn->clauses;
+ assert(clause);
+ if (clause->next_clause) {
r = strlen("{\n");
result += r;
while (fn) {
r = strlen(" ");
result += r;
- r = buf_inspect_fn_clause_size(fn);
+ r = buf_inspect_fn_clause_size(clause);
result += r;
r = strlen("\n");
result += r;
- fn = fn->next_clause;
+ clause = clause->next_clause;
}
r = strlen("}");
result += r;
}
else {
- r = buf_inspect_fn_clause_size(fn);
+ r = buf_inspect_fn_clause_size(clause);
result += r;
}
return result;
@@ -1411,16 +1429,13 @@ sw buf_inspect_tag (s_buf *buf, const s_tag *tag)
case TAG_VOID: return buf_inspect_void(buf, &tag);
case TAG_ARRAY: return buf_inspect_array(buf, &tag->data.array);
case TAG_BOOL: return buf_inspect_bool(buf, &tag->data.bool);
- case TAG_CALL:
- case TAG_CALL_FN:
- case TAG_CALL_MACRO:
- return buf_inspect_call(buf, &tag->data.call);
+ case TAG_CALL: return buf_inspect_call(buf, &tag->data.call);
case TAG_CFN: return buf_inspect_cfn(buf, &tag->data.cfn);
case TAG_CHARACTER:
return buf_inspect_character(buf, &tag->data.character);
case TAG_F32: return buf_inspect_f32(buf, &tag->data.f32);
case TAG_F64: return buf_inspect_f64(buf, &tag->data.f64);
- case TAG_FN: return buf_inspect_fn(buf, tag->data.fn);
+ case TAG_FN: return buf_inspect_fn(buf, &tag->data.fn);
case TAG_IDENT: return buf_inspect_ident(buf, &tag->data.ident);
case TAG_INTEGER: return buf_inspect_integer(buf, &tag->data.integer);
case TAG_LIST: return buf_inspect_list(buf, tag->data.list);
@@ -1453,16 +1468,13 @@ sw buf_inspect_tag_size (const s_tag *tag)
case TAG_VOID: return buf_inspect_void_size(tag);
case TAG_ARRAY: return buf_inspect_array_size(&tag->data.array);
case TAG_BOOL: return buf_inspect_bool_size(&tag->data.bool);
- case TAG_CALL:
- case TAG_CALL_FN:
- case TAG_CALL_MACRO:
- return buf_inspect_call_size(&tag->data.call);
+ case TAG_CALL: return buf_inspect_call_size(&tag->data.call);
case TAG_CFN: return buf_inspect_cfn_size(&tag->data.cfn);
case TAG_CHARACTER:
return buf_inspect_character_size(&tag->data.character);
case TAG_F32: return buf_inspect_f32_size(&tag->data.f32);
case TAG_F64: return buf_inspect_f64_size(&tag->data.f64);
- case TAG_FN: return buf_inspect_fn_size(tag->data.fn);
+ case TAG_FN: return buf_inspect_fn_size(&tag->data.fn);
case TAG_IDENT: return buf_inspect_ident_size(&tag->data.ident);
case TAG_INTEGER:
return buf_inspect_integer_size(&tag->data.integer);
@@ -1499,8 +1511,6 @@ sw buf_inspect_tag_type (s_buf *buf, e_tag_type type)
case TAG_BOOL:
return buf_write_1(buf, "bool");
case TAG_CALL:
- case TAG_CALL_FN:
- case TAG_CALL_MACRO:
return buf_write_1(buf, "call");
case TAG_CFN:
return buf_write_1(buf, "cfn");
@@ -1566,8 +1576,6 @@ sw buf_inspect_tag_type_size (e_tag_type type)
case TAG_BOOL:
return strlen("bool");
case TAG_CALL:
- case TAG_CALL_FN:
- case TAG_CALL_MACRO:
return strlen("call");
case TAG_CFN:
return strlen("cfn");
diff --git a/libc3/buf_inspect.h b/libc3/buf_inspect.h
index 5252961..c2115ab 100644
--- a/libc3/buf_inspect.h
+++ b/libc3/buf_inspect.h
@@ -79,8 +79,8 @@ sw buf_inspect_fact_spec (s_buf *buf, p_facts_spec spec);
sw buf_inspect_fn (s_buf *buf, const s_fn *fn);
sw buf_inspect_fn_algo (s_buf *buf, const s_list *algo);
sw buf_inspect_fn_algo_size (const s_list *algo);
-sw buf_inspect_fn_clause (s_buf *buf, const s_fn *fn);
-sw buf_inspect_fn_clause_size (const s_fn *fn);
+sw buf_inspect_fn_clause (s_buf *buf, const s_fn_clause *clause);
+sw buf_inspect_fn_clause_size (const s_fn_clause *clause);
sw buf_inspect_fn_pattern (s_buf *buf, const s_list *pattern);
sw buf_inspect_fn_pattern_size (const s_list *pattern);
sw buf_inspect_fn_size (const s_fn *fn);
diff --git a/libc3/buf_inspect_s.h.in b/libc3/buf_inspect_s.h.in
index c0df839..86a7fb7 100644
--- a/libc3/buf_inspect_s.h.in
+++ b/libc3/buf_inspect_s.h.in
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_s.h.in BITS=_BITS$ bits=_bits$ */
+#ifndef BUF_INSPECT_S_BITS$_H
+#define BUF_INSPECT_S_BITS$_H
+
+#include "types.h"
sw buf_inspect_s_bits$ (s_buf *buf, const s_bits$ *s);
sw buf_inspect_s_bits$_size (const s_bits$ *s);
+#endif /* ndef BUF_INSPECT_S_BITS$_H */
diff --git a/libc3/buf_inspect_s16.h b/libc3/buf_inspect_s16.h
index 0d802e8..4488532 100644
--- a/libc3/buf_inspect_s16.h
+++ b/libc3/buf_inspect_s16.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_s.h.in BITS=16 bits=16 */
+#ifndef BUF_INSPECT_S16_H
+#define BUF_INSPECT_S16_H
+
+#include "types.h"
sw buf_inspect_s16 (s_buf *buf, const s16 *s);
sw buf_inspect_s16_size (const s16 *s);
+#endif /* ndef BUF_INSPECT_S16_H */
diff --git a/libc3/buf_inspect_s32.h b/libc3/buf_inspect_s32.h
index 91823d7..d32c738 100644
--- a/libc3/buf_inspect_s32.h
+++ b/libc3/buf_inspect_s32.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_s.h.in BITS=32 bits=32 */
+#ifndef BUF_INSPECT_S32_H
+#define BUF_INSPECT_S32_H
+
+#include "types.h"
sw buf_inspect_s32 (s_buf *buf, const s32 *s);
sw buf_inspect_s32_size (const s32 *s);
+#endif /* ndef BUF_INSPECT_S32_H */
diff --git a/libc3/buf_inspect_s64.h b/libc3/buf_inspect_s64.h
index 43dcde8..f5651e5 100644
--- a/libc3/buf_inspect_s64.h
+++ b/libc3/buf_inspect_s64.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_s.h.in BITS=64 bits=64 */
+#ifndef BUF_INSPECT_S64_H
+#define BUF_INSPECT_S64_H
+
+#include "types.h"
sw buf_inspect_s64 (s_buf *buf, const s64 *s);
sw buf_inspect_s64_size (const s64 *s);
+#endif /* ndef BUF_INSPECT_S64_H */
diff --git a/libc3/buf_inspect_s8.h b/libc3/buf_inspect_s8.h
index 641566a..3354ea7 100644
--- a/libc3/buf_inspect_s8.h
+++ b/libc3/buf_inspect_s8.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_s.h.in BITS=8 bits=8 */
+#ifndef BUF_INSPECT_S8_H
+#define BUF_INSPECT_S8_H
+
+#include "types.h"
sw buf_inspect_s8 (s_buf *buf, const s8 *s);
sw buf_inspect_s8_size (const s8 *s);
+#endif /* ndef BUF_INSPECT_S8_H */
diff --git a/libc3/buf_inspect_sw.h b/libc3/buf_inspect_sw.h
index 39c2209..e90641c 100644
--- a/libc3/buf_inspect_sw.h
+++ b/libc3/buf_inspect_sw.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_s.h.in BITS=W bits=w */
+#ifndef BUF_INSPECT_SW_H
+#define BUF_INSPECT_SW_H
+
+#include "types.h"
sw buf_inspect_sw (s_buf *buf, const sw *s);
sw buf_inspect_sw_size (const sw *s);
+#endif /* ndef BUF_INSPECT_SW_H */
diff --git a/libc3/buf_inspect_u.c.in b/libc3/buf_inspect_u.c.in
index 166ea35..bbf9bfc 100644
--- a/libc3/buf_inspect_u.c.in
+++ b/libc3/buf_inspect_u.c.in
@@ -11,8 +11,11 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u.c.in BITS=_BITS$ bits=_bits$ */
-#include "c3.h"
-#include "buf_inspect_u_bits$.h"
+#include "buf.h"
+#include "buf_inspect.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "str.h"
sw buf_inspect_u_bits$ (s_buf *buf, const u_bits$ *u)
{
diff --git a/libc3/buf_inspect_u.h.in b/libc3/buf_inspect_u.h.in
index bc25914..172ce85 100644
--- a/libc3/buf_inspect_u.h.in
+++ b/libc3/buf_inspect_u.h.in
@@ -11,6 +11,10 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u.h.in BITS=_BITS$ bits=_bits$ */
+#ifndef BUF_INSPECT_U_BITS$_H
+#define BUF_INSPECT_U_BITS$_H
+
+#include "types.h"
sw buf_inspect_u_bits$ (s_buf *buf, const u_bits$ *u);
sw buf_inspect_u_bits$_base (s_buf *buf,
@@ -19,3 +23,5 @@ sw buf_inspect_u_bits$_base (s_buf *buf,
sw buf_inspect_u_bits$_base_size (const s_str *base,
const u_bits$ *u);
sw buf_inspect_u_bits$_size (const u_bits$ *u);
+
+#endif /* ndef BUF_INSPECT_U_BITS$_H */
diff --git a/libc3/buf_inspect_u16.c b/libc3/buf_inspect_u16.c
index 736765e..6045307 100644
--- a/libc3/buf_inspect_u16.c
+++ b/libc3/buf_inspect_u16.c
@@ -11,8 +11,11 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u.c.in BITS=16 bits=16 */
-#include "c3.h"
-#include "buf_inspect_u16.h"
+#include "buf.h"
+#include "buf_inspect.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "str.h"
sw buf_inspect_u16 (s_buf *buf, const u16 *u)
{
diff --git a/libc3/buf_inspect_u16.h b/libc3/buf_inspect_u16.h
index 567dacf..f425cca 100644
--- a/libc3/buf_inspect_u16.h
+++ b/libc3/buf_inspect_u16.h
@@ -11,6 +11,10 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u.h.in BITS=16 bits=16 */
+#ifndef BUF_INSPECT_U16_H
+#define BUF_INSPECT_U16_H
+
+#include "types.h"
sw buf_inspect_u16 (s_buf *buf, const u16 *u);
sw buf_inspect_u16_base (s_buf *buf,
@@ -19,3 +23,5 @@ sw buf_inspect_u16_base (s_buf *buf,
sw buf_inspect_u16_base_size (const s_str *base,
const u16 *u);
sw buf_inspect_u16_size (const u16 *u);
+
+#endif /* ndef BUF_INSPECT_U16_H */
diff --git a/libc3/buf_inspect_u16_binary.c b/libc3/buf_inspect_u16_binary.c
index da9bea9..2521eeb 100644
--- a/libc3/buf_inspect_u16_binary.c
+++ b/libc3/buf_inspect_u16_binary.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=16 bits=16 BASE=binary */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u16_binary (s_buf *buf, const u16 *u)
{
diff --git a/libc3/buf_inspect_u16_binary.h b/libc3/buf_inspect_u16_binary.h
index 47fb25e..0cee3c4 100644
--- a/libc3/buf_inspect_u16_binary.h
+++ b/libc3/buf_inspect_u16_binary.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=16 bits=16 BASE=binary */
+#ifndef BUF_INSPECT_U16_binary_H
+#define BUF_INSPECT_U16_binary_H
+
#include "types.h"
sw buf_inspect_u16_binary (s_buf *buf, const u16 *u);
sw buf_inspect_u16_binary_size (const u16 *u);
+
+#endif /* ndef BUF_INSPECT_U16_binary_H */
diff --git a/libc3/buf_inspect_u16_decimal.c b/libc3/buf_inspect_u16_decimal.c
index c4d8536..467b513 100644
--- a/libc3/buf_inspect_u16_decimal.c
+++ b/libc3/buf_inspect_u16_decimal.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=16 bits=16 BASE=decimal */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u16_decimal (s_buf *buf, const u16 *u)
{
diff --git a/libc3/buf_inspect_u16_decimal.h b/libc3/buf_inspect_u16_decimal.h
index 0f2b5b5..1b88cda 100644
--- a/libc3/buf_inspect_u16_decimal.h
+++ b/libc3/buf_inspect_u16_decimal.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=16 bits=16 BASE=decimal */
+#ifndef BUF_INSPECT_U16_decimal_H
+#define BUF_INSPECT_U16_decimal_H
+
#include "types.h"
sw buf_inspect_u16_decimal (s_buf *buf, const u16 *u);
sw buf_inspect_u16_decimal_size (const u16 *u);
+
+#endif /* ndef BUF_INSPECT_U16_decimal_H */
diff --git a/libc3/buf_inspect_u16_hexadecimal.c b/libc3/buf_inspect_u16_hexadecimal.c
index 0895db1..0d3e614 100644
--- a/libc3/buf_inspect_u16_hexadecimal.c
+++ b/libc3/buf_inspect_u16_hexadecimal.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=16 bits=16 BASE=hexadecimal */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u16_hexadecimal (s_buf *buf, const u16 *u)
{
diff --git a/libc3/buf_inspect_u16_hexadecimal.h b/libc3/buf_inspect_u16_hexadecimal.h
index 5ee45c0..61ac291 100644
--- a/libc3/buf_inspect_u16_hexadecimal.h
+++ b/libc3/buf_inspect_u16_hexadecimal.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=16 bits=16 BASE=hexadecimal */
+#ifndef BUF_INSPECT_U16_hexadecimal_H
+#define BUF_INSPECT_U16_hexadecimal_H
+
#include "types.h"
sw buf_inspect_u16_hexadecimal (s_buf *buf, const u16 *u);
sw buf_inspect_u16_hexadecimal_size (const u16 *u);
+
+#endif /* ndef BUF_INSPECT_U16_hexadecimal_H */
diff --git a/libc3/buf_inspect_u16_octal.c b/libc3/buf_inspect_u16_octal.c
index 3800b8b..1708fb6 100644
--- a/libc3/buf_inspect_u16_octal.c
+++ b/libc3/buf_inspect_u16_octal.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=16 bits=16 BASE=octal */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u16_octal (s_buf *buf, const u16 *u)
{
diff --git a/libc3/buf_inspect_u16_octal.h b/libc3/buf_inspect_u16_octal.h
index ac7bfdf..b8040a0 100644
--- a/libc3/buf_inspect_u16_octal.h
+++ b/libc3/buf_inspect_u16_octal.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=16 bits=16 BASE=octal */
+#ifndef BUF_INSPECT_U16_octal_H
+#define BUF_INSPECT_U16_octal_H
+
#include "types.h"
sw buf_inspect_u16_octal (s_buf *buf, const u16 *u);
sw buf_inspect_u16_octal_size (const u16 *u);
+
+#endif /* ndef BUF_INSPECT_U16_octal_H */
diff --git a/libc3/buf_inspect_u32.c b/libc3/buf_inspect_u32.c
index 17accb4..52184d3 100644
--- a/libc3/buf_inspect_u32.c
+++ b/libc3/buf_inspect_u32.c
@@ -11,8 +11,11 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u.c.in BITS=32 bits=32 */
-#include "c3.h"
-#include "buf_inspect_u32.h"
+#include "buf.h"
+#include "buf_inspect.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "str.h"
sw buf_inspect_u32 (s_buf *buf, const u32 *u)
{
diff --git a/libc3/buf_inspect_u32.h b/libc3/buf_inspect_u32.h
index 8438261..42599b3 100644
--- a/libc3/buf_inspect_u32.h
+++ b/libc3/buf_inspect_u32.h
@@ -11,6 +11,10 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u.h.in BITS=32 bits=32 */
+#ifndef BUF_INSPECT_U32_H
+#define BUF_INSPECT_U32_H
+
+#include "types.h"
sw buf_inspect_u32 (s_buf *buf, const u32 *u);
sw buf_inspect_u32_base (s_buf *buf,
@@ -19,3 +23,5 @@ sw buf_inspect_u32_base (s_buf *buf,
sw buf_inspect_u32_base_size (const s_str *base,
const u32 *u);
sw buf_inspect_u32_size (const u32 *u);
+
+#endif /* ndef BUF_INSPECT_U32_H */
diff --git a/libc3/buf_inspect_u32_binary.c b/libc3/buf_inspect_u32_binary.c
index 6fcab7c..75a45c9 100644
--- a/libc3/buf_inspect_u32_binary.c
+++ b/libc3/buf_inspect_u32_binary.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=32 bits=32 BASE=binary */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u32_binary (s_buf *buf, const u32 *u)
{
diff --git a/libc3/buf_inspect_u32_binary.h b/libc3/buf_inspect_u32_binary.h
index 72318e6..2540eb2 100644
--- a/libc3/buf_inspect_u32_binary.h
+++ b/libc3/buf_inspect_u32_binary.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=32 bits=32 BASE=binary */
+#ifndef BUF_INSPECT_U32_binary_H
+#define BUF_INSPECT_U32_binary_H
+
#include "types.h"
sw buf_inspect_u32_binary (s_buf *buf, const u32 *u);
sw buf_inspect_u32_binary_size (const u32 *u);
+
+#endif /* ndef BUF_INSPECT_U32_binary_H */
diff --git a/libc3/buf_inspect_u32_decimal.c b/libc3/buf_inspect_u32_decimal.c
index 7e0c84f..cee55d2 100644
--- a/libc3/buf_inspect_u32_decimal.c
+++ b/libc3/buf_inspect_u32_decimal.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=32 bits=32 BASE=decimal */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u32_decimal (s_buf *buf, const u32 *u)
{
diff --git a/libc3/buf_inspect_u32_decimal.h b/libc3/buf_inspect_u32_decimal.h
index 2598a84..9fc1331 100644
--- a/libc3/buf_inspect_u32_decimal.h
+++ b/libc3/buf_inspect_u32_decimal.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=32 bits=32 BASE=decimal */
+#ifndef BUF_INSPECT_U32_decimal_H
+#define BUF_INSPECT_U32_decimal_H
+
#include "types.h"
sw buf_inspect_u32_decimal (s_buf *buf, const u32 *u);
sw buf_inspect_u32_decimal_size (const u32 *u);
+
+#endif /* ndef BUF_INSPECT_U32_decimal_H */
diff --git a/libc3/buf_inspect_u32_hexadecimal.c b/libc3/buf_inspect_u32_hexadecimal.c
index 8e7e4be..06b46d2 100644
--- a/libc3/buf_inspect_u32_hexadecimal.c
+++ b/libc3/buf_inspect_u32_hexadecimal.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=32 bits=32 BASE=hexadecimal */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u32_hexadecimal (s_buf *buf, const u32 *u)
{
diff --git a/libc3/buf_inspect_u32_hexadecimal.h b/libc3/buf_inspect_u32_hexadecimal.h
index 095743b..3d71ba0 100644
--- a/libc3/buf_inspect_u32_hexadecimal.h
+++ b/libc3/buf_inspect_u32_hexadecimal.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=32 bits=32 BASE=hexadecimal */
+#ifndef BUF_INSPECT_U32_hexadecimal_H
+#define BUF_INSPECT_U32_hexadecimal_H
+
#include "types.h"
sw buf_inspect_u32_hexadecimal (s_buf *buf, const u32 *u);
sw buf_inspect_u32_hexadecimal_size (const u32 *u);
+
+#endif /* ndef BUF_INSPECT_U32_hexadecimal_H */
diff --git a/libc3/buf_inspect_u32_octal.c b/libc3/buf_inspect_u32_octal.c
index 97edeec..6f03f9e 100644
--- a/libc3/buf_inspect_u32_octal.c
+++ b/libc3/buf_inspect_u32_octal.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=32 bits=32 BASE=octal */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u32_octal (s_buf *buf, const u32 *u)
{
diff --git a/libc3/buf_inspect_u32_octal.h b/libc3/buf_inspect_u32_octal.h
index c32ebb7..3aba0a9 100644
--- a/libc3/buf_inspect_u32_octal.h
+++ b/libc3/buf_inspect_u32_octal.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=32 bits=32 BASE=octal */
+#ifndef BUF_INSPECT_U32_octal_H
+#define BUF_INSPECT_U32_octal_H
+
#include "types.h"
sw buf_inspect_u32_octal (s_buf *buf, const u32 *u);
sw buf_inspect_u32_octal_size (const u32 *u);
+
+#endif /* ndef BUF_INSPECT_U32_octal_H */
diff --git a/libc3/buf_inspect_u64.c b/libc3/buf_inspect_u64.c
index bd092ad..b26b681 100644
--- a/libc3/buf_inspect_u64.c
+++ b/libc3/buf_inspect_u64.c
@@ -11,8 +11,11 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u.c.in BITS=64 bits=64 */
-#include "c3.h"
-#include "buf_inspect_u64.h"
+#include "buf.h"
+#include "buf_inspect.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "str.h"
sw buf_inspect_u64 (s_buf *buf, const u64 *u)
{
diff --git a/libc3/buf_inspect_u64.h b/libc3/buf_inspect_u64.h
index df837e3..eb29120 100644
--- a/libc3/buf_inspect_u64.h
+++ b/libc3/buf_inspect_u64.h
@@ -11,6 +11,10 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u.h.in BITS=64 bits=64 */
+#ifndef BUF_INSPECT_U64_H
+#define BUF_INSPECT_U64_H
+
+#include "types.h"
sw buf_inspect_u64 (s_buf *buf, const u64 *u);
sw buf_inspect_u64_base (s_buf *buf,
@@ -19,3 +23,5 @@ sw buf_inspect_u64_base (s_buf *buf,
sw buf_inspect_u64_base_size (const s_str *base,
const u64 *u);
sw buf_inspect_u64_size (const u64 *u);
+
+#endif /* ndef BUF_INSPECT_U64_H */
diff --git a/libc3/buf_inspect_u64_binary.c b/libc3/buf_inspect_u64_binary.c
index d051184..3a303c9 100644
--- a/libc3/buf_inspect_u64_binary.c
+++ b/libc3/buf_inspect_u64_binary.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=64 bits=64 BASE=binary */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u64_binary (s_buf *buf, const u64 *u)
{
diff --git a/libc3/buf_inspect_u64_binary.h b/libc3/buf_inspect_u64_binary.h
index 50a6ecf..4509c1e 100644
--- a/libc3/buf_inspect_u64_binary.h
+++ b/libc3/buf_inspect_u64_binary.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=64 bits=64 BASE=binary */
+#ifndef BUF_INSPECT_U64_binary_H
+#define BUF_INSPECT_U64_binary_H
+
#include "types.h"
sw buf_inspect_u64_binary (s_buf *buf, const u64 *u);
sw buf_inspect_u64_binary_size (const u64 *u);
+
+#endif /* ndef BUF_INSPECT_U64_binary_H */
diff --git a/libc3/buf_inspect_u64_decimal.c b/libc3/buf_inspect_u64_decimal.c
index 9d091b2..05c7ce3 100644
--- a/libc3/buf_inspect_u64_decimal.c
+++ b/libc3/buf_inspect_u64_decimal.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=64 bits=64 BASE=decimal */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u64_decimal (s_buf *buf, const u64 *u)
{
diff --git a/libc3/buf_inspect_u64_decimal.h b/libc3/buf_inspect_u64_decimal.h
index f746121..6a2db0f 100644
--- a/libc3/buf_inspect_u64_decimal.h
+++ b/libc3/buf_inspect_u64_decimal.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=64 bits=64 BASE=decimal */
+#ifndef BUF_INSPECT_U64_decimal_H
+#define BUF_INSPECT_U64_decimal_H
+
#include "types.h"
sw buf_inspect_u64_decimal (s_buf *buf, const u64 *u);
sw buf_inspect_u64_decimal_size (const u64 *u);
+
+#endif /* ndef BUF_INSPECT_U64_decimal_H */
diff --git a/libc3/buf_inspect_u64_hexadecimal.c b/libc3/buf_inspect_u64_hexadecimal.c
index 3b8199a..fc344fc 100644
--- a/libc3/buf_inspect_u64_hexadecimal.c
+++ b/libc3/buf_inspect_u64_hexadecimal.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=64 bits=64 BASE=hexadecimal */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u64_hexadecimal (s_buf *buf, const u64 *u)
{
diff --git a/libc3/buf_inspect_u64_hexadecimal.h b/libc3/buf_inspect_u64_hexadecimal.h
index e496bc1..17091d9 100644
--- a/libc3/buf_inspect_u64_hexadecimal.h
+++ b/libc3/buf_inspect_u64_hexadecimal.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=64 bits=64 BASE=hexadecimal */
+#ifndef BUF_INSPECT_U64_hexadecimal_H
+#define BUF_INSPECT_U64_hexadecimal_H
+
#include "types.h"
sw buf_inspect_u64_hexadecimal (s_buf *buf, const u64 *u);
sw buf_inspect_u64_hexadecimal_size (const u64 *u);
+
+#endif /* ndef BUF_INSPECT_U64_hexadecimal_H */
diff --git a/libc3/buf_inspect_u64_octal.c b/libc3/buf_inspect_u64_octal.c
index 3dd203c..ae109c8 100644
--- a/libc3/buf_inspect_u64_octal.c
+++ b/libc3/buf_inspect_u64_octal.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=64 bits=64 BASE=octal */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u64_octal (s_buf *buf, const u64 *u)
{
diff --git a/libc3/buf_inspect_u64_octal.h b/libc3/buf_inspect_u64_octal.h
index 74dd756..c83698f 100644
--- a/libc3/buf_inspect_u64_octal.h
+++ b/libc3/buf_inspect_u64_octal.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=64 bits=64 BASE=octal */
+#ifndef BUF_INSPECT_U64_octal_H
+#define BUF_INSPECT_U64_octal_H
+
#include "types.h"
sw buf_inspect_u64_octal (s_buf *buf, const u64 *u);
sw buf_inspect_u64_octal_size (const u64 *u);
+
+#endif /* ndef BUF_INSPECT_U64_octal_H */
diff --git a/libc3/buf_inspect_u8.c b/libc3/buf_inspect_u8.c
index 37bd276..a78da62 100644
--- a/libc3/buf_inspect_u8.c
+++ b/libc3/buf_inspect_u8.c
@@ -11,8 +11,11 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u.c.in BITS=8 bits=8 */
-#include "c3.h"
-#include "buf_inspect_u8.h"
+#include "buf.h"
+#include "buf_inspect.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "str.h"
sw buf_inspect_u8 (s_buf *buf, const u8 *u)
{
diff --git a/libc3/buf_inspect_u8.h b/libc3/buf_inspect_u8.h
index cc13eb4..f477fed 100644
--- a/libc3/buf_inspect_u8.h
+++ b/libc3/buf_inspect_u8.h
@@ -11,6 +11,10 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u.h.in BITS=8 bits=8 */
+#ifndef BUF_INSPECT_U8_H
+#define BUF_INSPECT_U8_H
+
+#include "types.h"
sw buf_inspect_u8 (s_buf *buf, const u8 *u);
sw buf_inspect_u8_base (s_buf *buf,
@@ -19,3 +23,5 @@ sw buf_inspect_u8_base (s_buf *buf,
sw buf_inspect_u8_base_size (const s_str *base,
const u8 *u);
sw buf_inspect_u8_size (const u8 *u);
+
+#endif /* ndef BUF_INSPECT_U8_H */
diff --git a/libc3/buf_inspect_u8_binary.c b/libc3/buf_inspect_u8_binary.c
index 1fd2a25..c00e7ef 100644
--- a/libc3/buf_inspect_u8_binary.c
+++ b/libc3/buf_inspect_u8_binary.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=8 bits=8 BASE=binary */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u8_binary (s_buf *buf, const u8 *u)
{
diff --git a/libc3/buf_inspect_u8_binary.h b/libc3/buf_inspect_u8_binary.h
index 9bd8bc1..8aeb815 100644
--- a/libc3/buf_inspect_u8_binary.h
+++ b/libc3/buf_inspect_u8_binary.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=8 bits=8 BASE=binary */
+#ifndef BUF_INSPECT_U8_binary_H
+#define BUF_INSPECT_U8_binary_H
+
#include "types.h"
sw buf_inspect_u8_binary (s_buf *buf, const u8 *u);
sw buf_inspect_u8_binary_size (const u8 *u);
+
+#endif /* ndef BUF_INSPECT_U8_binary_H */
diff --git a/libc3/buf_inspect_u8_decimal.c b/libc3/buf_inspect_u8_decimal.c
index 258015d..00eac39 100644
--- a/libc3/buf_inspect_u8_decimal.c
+++ b/libc3/buf_inspect_u8_decimal.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=8 bits=8 BASE=decimal */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u8_decimal (s_buf *buf, const u8 *u)
{
diff --git a/libc3/buf_inspect_u8_decimal.h b/libc3/buf_inspect_u8_decimal.h
index 6ccdf5e..2526c8d 100644
--- a/libc3/buf_inspect_u8_decimal.h
+++ b/libc3/buf_inspect_u8_decimal.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=8 bits=8 BASE=decimal */
+#ifndef BUF_INSPECT_U8_decimal_H
+#define BUF_INSPECT_U8_decimal_H
+
#include "types.h"
sw buf_inspect_u8_decimal (s_buf *buf, const u8 *u);
sw buf_inspect_u8_decimal_size (const u8 *u);
+
+#endif /* ndef BUF_INSPECT_U8_decimal_H */
diff --git a/libc3/buf_inspect_u8_hexadecimal.c b/libc3/buf_inspect_u8_hexadecimal.c
index b0cc24a..c54f25a 100644
--- a/libc3/buf_inspect_u8_hexadecimal.c
+++ b/libc3/buf_inspect_u8_hexadecimal.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=8 bits=8 BASE=hexadecimal */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u8_hexadecimal (s_buf *buf, const u8 *u)
{
diff --git a/libc3/buf_inspect_u8_hexadecimal.h b/libc3/buf_inspect_u8_hexadecimal.h
index b1e7e9c..370cbcf 100644
--- a/libc3/buf_inspect_u8_hexadecimal.h
+++ b/libc3/buf_inspect_u8_hexadecimal.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=8 bits=8 BASE=hexadecimal */
+#ifndef BUF_INSPECT_U8_hexadecimal_H
+#define BUF_INSPECT_U8_hexadecimal_H
+
#include "types.h"
sw buf_inspect_u8_hexadecimal (s_buf *buf, const u8 *u);
sw buf_inspect_u8_hexadecimal_size (const u8 *u);
+
+#endif /* ndef BUF_INSPECT_U8_hexadecimal_H */
diff --git a/libc3/buf_inspect_u8_octal.c b/libc3/buf_inspect_u8_octal.c
index a6e4045..cde4cc6 100644
--- a/libc3/buf_inspect_u8_octal.c
+++ b/libc3/buf_inspect_u8_octal.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=8 bits=8 BASE=octal */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u8_octal (s_buf *buf, const u8 *u)
{
diff --git a/libc3/buf_inspect_u8_octal.h b/libc3/buf_inspect_u8_octal.h
index 1e561c2..980f342 100644
--- a/libc3/buf_inspect_u8_octal.h
+++ b/libc3/buf_inspect_u8_octal.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=8 bits=8 BASE=octal */
+#ifndef BUF_INSPECT_U8_octal_H
+#define BUF_INSPECT_U8_octal_H
+
#include "types.h"
sw buf_inspect_u8_octal (s_buf *buf, const u8 *u);
sw buf_inspect_u8_octal_size (const u8 *u);
+
+#endif /* ndef BUF_INSPECT_U8_octal_H */
diff --git a/libc3/buf_inspect_u_base.c.in b/libc3/buf_inspect_u_base.c.in
index 0c36cd1..0c28982 100644
--- a/libc3/buf_inspect_u_base.c.in
+++ b/libc3/buf_inspect_u_base.c.in
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=_BITS$ bits=_bits$ BASE=_BASE$ */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_u_bits$__BASE$ (s_buf *buf, const u_bits$ *u)
{
diff --git a/libc3/buf_inspect_u_base.h.in b/libc3/buf_inspect_u_base.h.in
index afc914f..8c75c6d 100644
--- a/libc3/buf_inspect_u_base.h.in
+++ b/libc3/buf_inspect_u_base.h.in
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=_BITS$ bits=_bits$ BASE=_BASE$ */
+#ifndef BUF_INSPECT_U_BITS$__BASE$_H
+#define BUF_INSPECT_U_BITS$__BASE$_H
+
#include "types.h"
sw buf_inspect_u_bits$__BASE$ (s_buf *buf, const u_bits$ *u);
sw buf_inspect_u_bits$__BASE$_size (const u_bits$ *u);
+
+#endif /* ndef BUF_INSPECT_U_BITS$__BASE$_H */
diff --git a/libc3/buf_inspect_uw.c b/libc3/buf_inspect_uw.c
index 211baaa..586fa71 100644
--- a/libc3/buf_inspect_uw.c
+++ b/libc3/buf_inspect_uw.c
@@ -11,8 +11,11 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u.c.in BITS=W bits=w */
-#include "c3.h"
-#include "buf_inspect_uw.h"
+#include "buf.h"
+#include "buf_inspect.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "str.h"
sw buf_inspect_uw (s_buf *buf, const uw *u)
{
diff --git a/libc3/buf_inspect_uw.h b/libc3/buf_inspect_uw.h
index 94a9906..062e279 100644
--- a/libc3/buf_inspect_uw.h
+++ b/libc3/buf_inspect_uw.h
@@ -11,6 +11,10 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u.h.in BITS=W bits=w */
+#ifndef BUF_INSPECT_UW_H
+#define BUF_INSPECT_UW_H
+
+#include "types.h"
sw buf_inspect_uw (s_buf *buf, const uw *u);
sw buf_inspect_uw_base (s_buf *buf,
@@ -19,3 +23,5 @@ sw buf_inspect_uw_base (s_buf *buf,
sw buf_inspect_uw_base_size (const s_str *base,
const uw *u);
sw buf_inspect_uw_size (const uw *u);
+
+#endif /* ndef BUF_INSPECT_UW_H */
diff --git a/libc3/buf_inspect_uw_binary.c b/libc3/buf_inspect_uw_binary.c
index 570f7f8..849600e 100644
--- a/libc3/buf_inspect_uw_binary.c
+++ b/libc3/buf_inspect_uw_binary.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=W bits=w BASE=binary */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_uw_binary (s_buf *buf, const uw *u)
{
diff --git a/libc3/buf_inspect_uw_binary.h b/libc3/buf_inspect_uw_binary.h
index 93df1e6..bcb25aa 100644
--- a/libc3/buf_inspect_uw_binary.h
+++ b/libc3/buf_inspect_uw_binary.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=W bits=w BASE=binary */
+#ifndef BUF_INSPECT_UW_binary_H
+#define BUF_INSPECT_UW_binary_H
+
#include "types.h"
sw buf_inspect_uw_binary (s_buf *buf, const uw *u);
sw buf_inspect_uw_binary_size (const uw *u);
+
+#endif /* ndef BUF_INSPECT_UW_binary_H */
diff --git a/libc3/buf_inspect_uw_decimal.c b/libc3/buf_inspect_uw_decimal.c
index 0a801cb..720d72f 100644
--- a/libc3/buf_inspect_uw_decimal.c
+++ b/libc3/buf_inspect_uw_decimal.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=W bits=w BASE=decimal */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_uw_decimal (s_buf *buf, const uw *u)
{
diff --git a/libc3/buf_inspect_uw_decimal.h b/libc3/buf_inspect_uw_decimal.h
index ac2aebf..43fa824 100644
--- a/libc3/buf_inspect_uw_decimal.h
+++ b/libc3/buf_inspect_uw_decimal.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=W bits=w BASE=decimal */
+#ifndef BUF_INSPECT_UW_decimal_H
+#define BUF_INSPECT_UW_decimal_H
+
#include "types.h"
sw buf_inspect_uw_decimal (s_buf *buf, const uw *u);
sw buf_inspect_uw_decimal_size (const uw *u);
+
+#endif /* ndef BUF_INSPECT_UW_decimal_H */
diff --git a/libc3/buf_inspect_uw_hexadecimal.c b/libc3/buf_inspect_uw_hexadecimal.c
index a45a05b..914b0db 100644
--- a/libc3/buf_inspect_uw_hexadecimal.c
+++ b/libc3/buf_inspect_uw_hexadecimal.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=W bits=w BASE=hexadecimal */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_uw_hexadecimal (s_buf *buf, const uw *u)
{
diff --git a/libc3/buf_inspect_uw_hexadecimal.h b/libc3/buf_inspect_uw_hexadecimal.h
index 94729dd..78c34fb 100644
--- a/libc3/buf_inspect_uw_hexadecimal.h
+++ b/libc3/buf_inspect_uw_hexadecimal.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=W bits=w BASE=hexadecimal */
+#ifndef BUF_INSPECT_UW_hexadecimal_H
+#define BUF_INSPECT_UW_hexadecimal_H
+
#include "types.h"
sw buf_inspect_uw_hexadecimal (s_buf *buf, const uw *u);
sw buf_inspect_uw_hexadecimal_size (const uw *u);
+
+#endif /* ndef BUF_INSPECT_UW_hexadecimal_H */
diff --git a/libc3/buf_inspect_uw_octal.c b/libc3/buf_inspect_uw_octal.c
index df9d20c..87997d0 100644
--- a/libc3/buf_inspect_uw_octal.c
+++ b/libc3/buf_inspect_uw_octal.c
@@ -11,7 +11,8 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.c.in BITS=W bits=w BASE=octal */
-#include "c3.h"
+#include "buf_inspect.h"
+#include "c3_main.h"
sw buf_inspect_uw_octal (s_buf *buf, const uw *u)
{
diff --git a/libc3/buf_inspect_uw_octal.h b/libc3/buf_inspect_uw_octal.h
index 00baa53..c157c76 100644
--- a/libc3/buf_inspect_uw_octal.h
+++ b/libc3/buf_inspect_uw_octal.h
@@ -11,7 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_inspect_u_base.h.in BITS=W bits=w BASE=octal */
+#ifndef BUF_INSPECT_UW_octal_H
+#define BUF_INSPECT_UW_octal_H
+
#include "types.h"
sw buf_inspect_uw_octal (s_buf *buf, const uw *u);
sw buf_inspect_uw_octal_size (const uw *u);
+
+#endif /* ndef BUF_INSPECT_UW_octal_H */
diff --git a/libc3/buf_parse.c b/libc3/buf_parse.c
index b322699..79cd2b9 100644
--- a/libc3/buf_parse.c
+++ b/libc3/buf_parse.c
@@ -15,7 +15,24 @@
#include <string.h>
#include <math.h>
#include "../libtommath/tommath.h"
-#include "c3.h"
+#include "buf.h"
+#include "buf_inspect.h"
+#include "buf_parse.h"
+#include "buf_save.h"
+#include "call.h"
+#include "cfn.h"
+#include "character.h"
+#include "env.h"
+#include "fn.h"
+#include "fn_clause.h"
+#include "ident.h"
+#include "integer.h"
+#include "list.h"
+#include "operator.h"
+#include "str.h"
+#include "sym.h"
+#include "tag.h"
+#include "tuple.h"
sw buf_parse_array_data_rec (s_buf *buf, s_array *dest,
uw dimension, uw *address,
@@ -1121,19 +1138,21 @@ sw buf_parse_fact (s_buf *buf, s_fact_w *dest)
return r;
}
-sw buf_parse_fn (s_buf *buf, s_fn **dest)
+sw buf_parse_fn (s_buf *buf, s_fn *dest)
{
sw r;
sw result = 0;
s_buf_save save;
- s_fn *tmp = NULL;
- s_fn **tail = &tmp;
+ s_fn tmp;
+ s_fn_clause **tail;
assert(buf);
assert(dest);
buf_save_init(buf, &save);
if ((r = buf_read_1(buf, "fn")) <= 0)
goto clean;
result += r;
+ fn_init(&tmp);
+ tail = &tmp.clauses;
if ((r = buf_ignore_spaces(buf)) <= 0)
goto restore;
result += r;
@@ -1145,7 +1164,7 @@ sw buf_parse_fn (s_buf *buf, s_fn **dest)
goto restore;
result += r;
while (1) {
- *tail = fn_new(NULL);
+ *tail = fn_clause_new(NULL);
if ((r = buf_parse_fn_clause(buf, *tail)) <= 0)
goto restore;
tail = &(*tail)->next_clause;
@@ -1161,8 +1180,8 @@ sw buf_parse_fn (s_buf *buf, s_fn **dest)
}
}
else {
- tmp = fn_new(NULL);
- if ((r = buf_parse_fn_clause(buf, tmp)) <= 0)
+ tmp.clauses = fn_clause_new(NULL);
+ if ((r = buf_parse_fn_clause(buf, tmp.clauses)) <= 0)
goto restore;
result += r;
}
@@ -1171,23 +1190,23 @@ sw buf_parse_fn (s_buf *buf, s_fn **dest)
r = result;
goto clean;
restore:
- fn_delete_all(tmp);
+ fn_clean(&tmp);
buf_save_restore_rpos(buf, &save);
clean:
buf_save_clean(buf, &save);
return r;
}
-sw buf_parse_fn_clause (s_buf *buf, s_fn *dest)
+sw buf_parse_fn_clause (s_buf *buf, s_fn_clause *dest)
{
sw r;
sw result = 0;
s_buf_save save;
- s_fn tmp;
+ s_fn_clause tmp;
assert(buf);
assert(dest);
buf_save_init(buf, &save);
- fn_init(&tmp, NULL);
+ fn_clause_init(&tmp, NULL);
if ((r = buf_parse_fn_pattern(buf, &tmp.pattern)) <= 0) {
warnx("buf_parse_fn: invalid pattern");
goto restore;
@@ -1198,7 +1217,7 @@ sw buf_parse_fn_clause (s_buf *buf, s_fn *dest)
goto restore;
result += r;
if ((r = buf_parse_fn_algo(buf, &tmp.algo)) <= 0) {
- buf_inspect_fn(&g_c3_env.err, &tmp);
+ buf_inspect_fn_clause(&g_c3_env.err, &tmp);
buf_flush(&g_c3_env.err);
warnx("buf_parse_fn: invalid program");
goto restore;
@@ -1208,7 +1227,7 @@ sw buf_parse_fn_clause (s_buf *buf, s_fn *dest)
r = result;
goto clean;
restore:
- fn_clean(&tmp);
+ fn_clause_clean(&tmp);
buf_save_restore_rpos(buf, &save);
clean:
buf_save_clean(buf, &save);
diff --git a/libc3/buf_parse.h b/libc3/buf_parse.h
index 81291e6..92bd99b 100644
--- a/libc3/buf_parse.h
+++ b/libc3/buf_parse.h
@@ -65,8 +65,8 @@ sw buf_parse_digit_dec (s_buf *buf, u8 *dest);
sw buf_parse_f32 (s_buf *buf, f32 *dest);
sw buf_parse_f64 (s_buf *buf, f64 *dest);
sw buf_parse_fact (s_buf *buf, s_fact_w *dest);
-sw buf_parse_fn (s_buf *buf, s_fn **dest);
-sw buf_parse_fn_clause (s_buf *buf, s_fn *dest);
+sw buf_parse_fn (s_buf *buf, s_fn *dest);
+sw buf_parse_fn_clause (s_buf *buf, s_fn_clause *dest);
sw buf_parse_fn_algo (s_buf *buf, s_list **dest);
sw buf_parse_fn_pattern (s_buf *buf, s_list **dest);
sw buf_parse_integer (s_buf *buf, s_integer *dest);
diff --git a/libc3/buf_parse_s.c.in b/libc3/buf_parse_s.c.in
index 7adc0e5..9f5017d 100644
--- a/libc3/buf_parse_s.c.in
+++ b/libc3/buf_parse_s.c.in
@@ -11,8 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_parse_s.c.in BITS=_BITS$ bits=_bits$ */
-
-#include "c3.h"
+#include "buf.h"
+#include "buf_parse.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "ceiling.h"
+#include "str.h"
sw buf_parse_s_bits$ (s_buf *buf, s_bits$ *dest)
{
diff --git a/libc3/buf_parse_s16.c b/libc3/buf_parse_s16.c
index 33ae189..fcd28a4 100644
--- a/libc3/buf_parse_s16.c
+++ b/libc3/buf_parse_s16.c
@@ -11,8 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_parse_s.c.in BITS=16 bits=16 */
-
-#include "c3.h"
+#include "buf.h"
+#include "buf_parse.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "ceiling.h"
+#include "str.h"
sw buf_parse_s16 (s_buf *buf, s16 *dest)
{
diff --git a/libc3/buf_parse_s32.c b/libc3/buf_parse_s32.c
index b74ba69..d1e3cad 100644
--- a/libc3/buf_parse_s32.c
+++ b/libc3/buf_parse_s32.c
@@ -11,8 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_parse_s.c.in BITS=32 bits=32 */
-
-#include "c3.h"
+#include "buf.h"
+#include "buf_parse.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "ceiling.h"
+#include "str.h"
sw buf_parse_s32 (s_buf *buf, s32 *dest)
{
diff --git a/libc3/buf_parse_s64.c b/libc3/buf_parse_s64.c
index 1aea045..d9f0310 100644
--- a/libc3/buf_parse_s64.c
+++ b/libc3/buf_parse_s64.c
@@ -11,8 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_parse_s.c.in BITS=64 bits=64 */
-
-#include "c3.h"
+#include "buf.h"
+#include "buf_parse.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "ceiling.h"
+#include "str.h"
sw buf_parse_s64 (s_buf *buf, s64 *dest)
{
diff --git a/libc3/buf_parse_s8.c b/libc3/buf_parse_s8.c
index 12abfec..ed0640e 100644
--- a/libc3/buf_parse_s8.c
+++ b/libc3/buf_parse_s8.c
@@ -11,8 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_parse_s.c.in BITS=8 bits=8 */
-
-#include "c3.h"
+#include "buf.h"
+#include "buf_parse.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "ceiling.h"
+#include "str.h"
sw buf_parse_s8 (s_buf *buf, s8 *dest)
{
diff --git a/libc3/buf_parse_sw.c b/libc3/buf_parse_sw.c
index 1ed5e07..cc9d603 100644
--- a/libc3/buf_parse_sw.c
+++ b/libc3/buf_parse_sw.c
@@ -11,8 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_parse_s.c.in BITS=W bits=w */
-
-#include "c3.h"
+#include "buf.h"
+#include "buf_parse.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "ceiling.h"
+#include "str.h"
sw buf_parse_sw (s_buf *buf, sw *dest)
{
diff --git a/libc3/buf_parse_u.c.in b/libc3/buf_parse_u.c.in
index 1ef087e..31d6b1e 100644
--- a/libc3/buf_parse_u.c.in
+++ b/libc3/buf_parse_u.c.in
@@ -11,8 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_parse_u.c.in BITS=_BITS$ bits=_bits$ */
-
-#include "c3.h"
+#include "buf.h"
+#include "buf_parse.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "ceiling.h"
+#include "str.h"
sw buf_parse_u_bits$ (s_buf *buf, u_bits$ *dest)
{
diff --git a/libc3/buf_parse_u16.c b/libc3/buf_parse_u16.c
index b7dece7..cd08c1e 100644
--- a/libc3/buf_parse_u16.c
+++ b/libc3/buf_parse_u16.c
@@ -11,8 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_parse_u.c.in BITS=16 bits=16 */
-
-#include "c3.h"
+#include "buf.h"
+#include "buf_parse.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "ceiling.h"
+#include "str.h"
sw buf_parse_u16 (s_buf *buf, u16 *dest)
{
diff --git a/libc3/buf_parse_u32.c b/libc3/buf_parse_u32.c
index 5b517e9..5ef7c01 100644
--- a/libc3/buf_parse_u32.c
+++ b/libc3/buf_parse_u32.c
@@ -11,8 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_parse_u.c.in BITS=32 bits=32 */
-
-#include "c3.h"
+#include "buf.h"
+#include "buf_parse.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "ceiling.h"
+#include "str.h"
sw buf_parse_u32 (s_buf *buf, u32 *dest)
{
diff --git a/libc3/buf_parse_u64.c b/libc3/buf_parse_u64.c
index 24cf580..1b1eabb 100644
--- a/libc3/buf_parse_u64.c
+++ b/libc3/buf_parse_u64.c
@@ -11,8 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_parse_u.c.in BITS=64 bits=64 */
-
-#include "c3.h"
+#include "buf.h"
+#include "buf_parse.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "ceiling.h"
+#include "str.h"
sw buf_parse_u64 (s_buf *buf, u64 *dest)
{
diff --git a/libc3/buf_parse_u8.c b/libc3/buf_parse_u8.c
index 96d45d6..5374eff 100644
--- a/libc3/buf_parse_u8.c
+++ b/libc3/buf_parse_u8.c
@@ -11,8 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_parse_u.c.in BITS=8 bits=8 */
-
-#include "c3.h"
+#include "buf.h"
+#include "buf_parse.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "ceiling.h"
+#include "str.h"
sw buf_parse_u8 (s_buf *buf, u8 *dest)
{
diff --git a/libc3/buf_parse_uw.c b/libc3/buf_parse_uw.c
index 791353f..23415da 100644
--- a/libc3/buf_parse_uw.c
+++ b/libc3/buf_parse_uw.c
@@ -11,8 +11,12 @@
* THIS SOFTWARE.
*/
/* Gen from buf_parse_u.c.in BITS=W bits=w */
-
-#include "c3.h"
+#include "buf.h"
+#include "buf_parse.h"
+#include "buf_save.h"
+#include "c3_main.h"
+#include "ceiling.h"
+#include "str.h"
sw buf_parse_uw (s_buf *buf, uw *dest)
{
diff --git a/libc3/c3.c b/libc3/c3.c
index 932f5e2..cfb2dd3 100644
--- a/libc3/c3.c
+++ b/libc3/c3.c
@@ -14,7 +14,9 @@
#include <err.h>
#include <stdio.h>
#include <stdlib.h>
-#include "c3.h"
+#include "c3_main.h"
+#include "env.h"
+#include "sym.h"
const s_str g_c3_base_binary = {{NULL}, 2, {"01"}};
const s_str g_c3_base_octal = {{NULL}, 8, {"01234567"}};
diff --git a/libc3/c3.h b/libc3/c3.h
index fedfb7b..7aab9cb 100644
--- a/libc3/c3.h
+++ b/libc3/c3.h
@@ -42,6 +42,7 @@
#include "buf_parse_u64.h"
#include "buf_parse_uw.h"
#include "buf_save.h"
+#include "c3_main.h"
#include "call.h"
#include "ceiling.h"
#include "cfn.h"
@@ -56,6 +57,7 @@
#include "facts_with.h"
#include "facts_with_cursor.h"
#include "fn.h"
+#include "fn_clause.h"
#include "hash.h"
#include "ident.h"
#include "integer.h"
@@ -70,19 +72,4 @@
#include "type.h"
#include "ucd.h"
-#define C3_EXT ".c3"
-
-extern const s_str g_c3_base_binary;
-extern const s_str g_c3_base_octal;
-extern const s_str g_c3_base_decimal;
-extern const s_str g_c3_base_hexadecimal;
-extern const s_str g_c3_bases_hexadecimal[2];
-
-/* stack-allocation compatible functions */
-void c3_init (s_env *env);
-void c3_clean (s_env *env);
-
-/* debug */
-void c3_break ();
-
#endif /* C3_H */
diff --git a/libc3/c3_main.h b/libc3/c3_main.h
new file mode 100644
index 0000000..d0f696e
--- /dev/null
+++ b/libc3/c3_main.h
@@ -0,0 +1,33 @@
+/* c3
+ * Copyright 2022,2023 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 C3_MAIN_H
+#define C3_MAIN_H
+
+#include "types.h"
+
+#define C3_EXT ".c3"
+
+extern const s_str g_c3_base_binary;
+extern const s_str g_c3_base_octal;
+extern const s_str g_c3_base_decimal;
+extern const s_str g_c3_base_hexadecimal;
+extern const s_str g_c3_bases_hexadecimal[2];
+
+/* stack-allocation compatible functions */
+void c3_init (s_env *env);
+void c3_clean (s_env *env);
+
+/* debug */
+void c3_break ();
+
+#endif /* C3_MAIN_H */
diff --git a/libc3/call.c b/libc3/call.c
index 9478e8a..90255aa 100644
--- a/libc3/call.c
+++ b/libc3/call.c
@@ -17,8 +17,12 @@
#include "buf_parse.h"
#include "call.h"
#include "cfn.h"
+#include "facts_with.h"
+#include "facts_with_cursor.h"
+#include "fn.h"
#include "ident.h"
#include "list.h"
+#include "tag.h"
void call_clean (s_call *call)
{
@@ -26,6 +30,8 @@ void call_clean (s_call *call)
list_delete_all(call->arguments);
if (call->cfn)
cfn_delete(call->cfn);
+ if (call->fn)
+ fn_delete(call->fn);
}
s_call * call_copy (const s_call *src, s_call *dest)
@@ -36,11 +42,88 @@ s_call * call_copy (const s_call *src, s_call *dest)
list_copy(src->arguments, &dest->arguments);
dest->cfn = src->cfn;
dest->fn = src->fn;
- dest->macro = src->macro;
- dest->special_operator = src->special_operator;
return dest;
}
+bool call_get (s_call *call, s_facts *facts)
+{
+ s_facts_with_cursor cursor;
+ s_tag tag_cfn;
+ s_tag tag_fn;
+ s_tag tag_ident;
+ s_tag tag_is_a;
+ s_tag tag_macro;
+ s_tag tag_module_name;
+ s_tag tag_special_operator;
+ s_tag tag_sym;
+ s_tag tag_symbol;
+ s_tag tag_var;
+ tag_init_1( &tag_cfn, ":cfn");
+ tag_init_1( &tag_fn, ":fn");
+ tag_init_ident(&tag_ident, &call->ident);
+ tag_init_1( &tag_is_a, ":is_a");
+ tag_init_1( &tag_macro, ":macro");
+ tag_init_sym( &tag_module_name, call->ident.module_name);
+ tag_init_1( &tag_special_operator, ":special_operator");
+ tag_init_sym( &tag_sym, call->ident.sym);
+ tag_init_1( &tag_symbol, ":symbol");
+ tag_init_var( &tag_var);
+ facts_with_cursor_clean(&cursor);
+ facts_with(facts, &cursor, (t_facts_spec) {
+ &tag_module_name,
+ &tag_symbol, &tag_ident, /* module exports symbol */
+ NULL, NULL });
+ if (! facts_with_cursor_next(&cursor)) {
+ warnx("symbol %s not found in module %s",
+ call->ident.sym->str.ptr.ps8,
+ call->ident.module_name->str.ptr.ps8);
+ facts_with_cursor_clean(&cursor);
+ return false;
+ }
+ facts_with_cursor_clean(&cursor);
+ facts_with(facts, &cursor, (t_facts_spec) {
+ &tag_ident, &tag_fn, &tag_var,
+ NULL, NULL });
+ if (facts_with_cursor_next(&cursor)) {
+ if (tag_var.type != TAG_FN)
+ errx(1, "%s.%s is not a function",
+ call->ident.module_name->str.ptr.ps8,
+ call->ident.sym->str.ptr.ps8);
+ call->fn = fn_new_copy(&tag_var.data.fn);
+ }
+ facts_with_cursor_clean(&cursor);
+ facts_with(facts, &cursor, (t_facts_spec) {
+ &tag_ident, &tag_cfn, &tag_var,
+ NULL, NULL });
+ if (facts_with_cursor_next(&cursor)) {
+ if (tag_var.type != TAG_CFN)
+ errx(1, "%s.%s is not a C function",
+ call->ident.module_name->str.ptr.ps8,
+ call->ident.sym->str.ptr.ps8);
+ call->cfn = cfn_new_copy(&tag_var.data.cfn);
+ }
+ facts_with_cursor_clean(&cursor);
+ facts_with(facts, &cursor, (t_facts_spec) {
+ &tag_ident, &tag_is_a, &tag_macro, NULL, NULL });
+ if (facts_with_cursor_next(&cursor)) {
+ if (call->fn)
+ call->fn->macro = true;
+ if (call->cfn)
+ call->cfn->macro = true;
+ }
+ facts_with_cursor_clean(&cursor);
+ facts_with(facts, &cursor, (t_facts_spec) {
+ &tag_ident, &tag_is_a, &tag_special_operator, NULL, NULL});
+ if (facts_with_cursor_next(&cursor)) {
+ if (call->fn)
+ call->fn->special_operator = true;
+ if (call->cfn)
+ call->cfn->special_operator = true;
+ }
+ facts_with_cursor_clean(&cursor);
+ return true;
+}
+
s_call * call_init (s_call *call)
{
assert(call);
diff --git a/libc3/call.h b/libc3/call.h
index aefa9e4..13eabeb 100644
--- a/libc3/call.h
+++ b/libc3/call.h
@@ -15,11 +15,17 @@
#include "types.h"
+/* Stack-allocation compatible functions */
void call_clean (s_call *call);
s_call * call_init (s_call *call);
s_call * call_init_1 (s_call *call, const s8 *p);
s_call * call_init_op (s_call *call);
s_call * call_init_op_unary (s_call *call);
+
+/* Modifiers */
+bool call_get (s_call *call, s_facts *facts);
+
+/* Observers */
s_call * call_copy (const s_call *src, s_call *dest);
s_str * call_inspect (const s_call *call, s_str *dest);
diff --git a/libc3/cfn.c b/libc3/cfn.c
index 7b92042..3dab138 100644
--- a/libc3/cfn.c
+++ b/libc3/cfn.c
@@ -123,6 +123,8 @@ s_cfn * cfn_copy (const s_cfn *cfn, s_cfn *dest)
}
dest->result_type = cfn->result_type;
dest->ptr = cfn->ptr;
+ dest->macro = cfn->macro;
+ dest->special_operator = cfn->special_operator;
return dest;
}
@@ -155,7 +157,7 @@ s_cfn * cfn_init (s_cfn *cfn, const s_sym *name, s_list *arg_types,
s_cfn * cfn_link (s_cfn *cfn)
{
assert(cfn);
- if (! (cfn->ptr.p = dlsym(RTLD_DEFAULT, cfn->name->str.ptr.ps8))) {
+ if (! (cfn->ptr.p = dlsym(NULL, cfn->name->str.ptr.ps8))) {
warnx("cfn_link: %s: %s", cfn->name->str.ptr.ps8, dlerror());
return NULL;
}
diff --git a/libc3/compare.c b/libc3/compare.c
index 5a5b34f..c3fd876 100644
--- a/libc3/compare.c
+++ b/libc3/compare.c
@@ -182,6 +182,26 @@ s8 compare_fn (const s_fn *a, const s_fn *b)
s8 r;
assert(a);
assert(b);
+ if (a == b)
+ return 0;
+ if (!a)
+ return -1;
+ if (!b)
+ return 1;
+ if ((r = compare_bool(a->special_operator, b->special_operator)))
+ return r;
+ if ((r = compare_bool(a->macro, b->macro)))
+ return r;
+ if ((r = compare_fn_clause(a->clauses, b->clauses)))
+ return r;
+ return 0;
+}
+
+s8 compare_fn_clause (const s_fn_clause *a, const s_fn_clause *b)
+{
+ s8 r;
+ assert(a);
+ assert(b);
while (1) {
if (a == b)
return 0;
@@ -749,14 +769,11 @@ s8 compare_tag (const s_tag *a, const s_tag *b) {
case TAG_VOID: return 0;
case TAG_ARRAY: return compare_array(&a->data.array, &b->data.array);
case TAG_BOOL: return compare_bool(a->data.bool, b->data.bool);
- case TAG_CALL:
- case TAG_CALL_FN:
- case TAG_CALL_MACRO:
- return compare_call(&a->data.call, &b->data.call);
+ case TAG_CALL: return compare_call(&a->data.call, &b->data.call);
case TAG_CFN: return compare_cfn(&a->data.cfn, &b->data.cfn);
case TAG_CHARACTER: return compare_character(a->data.character,
b->data.character);
- case TAG_FN: return compare_fn(a->data.fn, b->data.fn);
+ case TAG_FN: return compare_fn(&a->data.fn, &b->data.fn);
case TAG_IDENT: return compare_ident(&a->data.ident, &b->data.ident);
case TAG_LIST: return compare_list(a->data.list, b->data.list);
case TAG_PTAG: return compare_ptag(a->data.ptag, b->data.ptag);
diff --git a/libc3/compare.h b/libc3/compare.h
index 49a5d7a..e1ba82b 100644
--- a/libc3/compare.h
+++ b/libc3/compare.h
@@ -30,6 +30,7 @@ s8 compare_fact_osp (const s_fact *a, const s_fact *b);
s8 compare_fact_unbound_var_count (const s_fact *a,
const s_fact *b);
s8 compare_fn (const s_fn *a, const s_fn *b);
+s8 compare_fn_clause (const s_fn_clause *a, const s_fn_clause *b);
s8 compare_ident (const s_ident *a, const s_ident *b);
s8 compare_integer (const s_integer *a, const s_integer *b);
s8 compare_integer_s64 (const s_integer *a, s64 b);
diff --git a/libc3/configure b/libc3/configure
index 1d3d309..a42c417 100755
--- a/libc3/configure
+++ b/libc3/configure
@@ -34,8 +34,11 @@ OBJECTS_DEBUG="$(c2ext .debug.lo "$LO_SOURCES")"
CPPFLAGS="${CPPFLAGS:=}"
ENV_CFLAGS="${CFLAGS:=}"
DEFAULT_CFLAGS="-O2 -pipe"
-LDFLAGS="-shared ${LDFLAGS:-}"
-LIBS="${LIBS} -lm -pthread -rpath ${PREFIX}/lib"
+LDFLAGS="${LDFLAGS:-}"
+if [ "x$CC" != "xtcc" ]; then
+ LDFLAGS="-Wl,--allow-shlib-undefined ${LDFLAGS}"
+fi
+LIBS="${LIBS} -lm -pthread"
# Common config for all targets
CFLAGS="$CFLAGS -W -Wall -Werror -std=c99 -pedantic -fPIC"
@@ -44,8 +47,8 @@ config_asan
config_gnu
pkg_config libbsd-overlay
pkg_config libmd
-config_lib libmd -lmd
-config_lib dl -ldl
+config_lib libmd -lmd 2>/dev/null
+config_lib dl -ldl 2>/dev/null
config_include sha_h sys/types.h sha.h HAVE_SHA_H
config_include sha1_h sys/types.h sha1.h HAVE_SHA1_H
config_define PREFIX "\"${PREFIX}\""
@@ -104,19 +107,19 @@ echo "LIBS_DEBUG = $LIBS_DEBUG" >> ${CONFIG_MK}
echo >> ${CONFIG_MK}
echo "$LIB: $LIBTOMMATH $OBJECTS" >> ${CONFIG_MK}
-echo " ${LIBTOOL} --tag=CC --mode=link \${CC} \${LDFLAGS} ${OBJECTS} \${LIBS} -o ${LIB} -rpath ${LIBDIR}" >> ${CONFIG_MK}
+echo " ${LIBTOOL} --tag=CC --mode=link \${CC} -shared \${LDFLAGS} ${OBJECTS} \${LIBS} --rpath ${LIBDIR} -o ${LIB}" >> ${CONFIG_MK}
echo >> ${CONFIG_MK}
echo "$LIB_ASAN: $LIBTOMMATH_ASAN $OBJECTS_ASAN" >> ${CONFIG_MK}
-echo " ${LIBTOOL} --tag=CC --mode=link \${CC} \${LDFLAGS_ASAN} ${OBJECTS_ASAN} \${LIBS_ASAN} -o ${LIB_ASAN} -rpath ${LIBDIR}" >> ${CONFIG_MK}
+echo " ${LIBTOOL} --tag=CC --mode=link \${CC} -shared \${LDFLAGS_ASAN} ${OBJECTS_ASAN} \${LIBS_ASAN} --rpath ${LIBDIR} -o ${LIB_ASAN}" >> ${CONFIG_MK}
echo >> ${CONFIG_MK}
echo "$LIB_COV: $LIBTOMMATH_COV $OBJECTS_COV" >> ${CONFIG_MK}
-echo " ${LIBTOOL} --tag=CC --mode=link \${CC} \${LDFLAGS_COV} ${OBJECTS_COV} \${LIBS_COV} -o ${LIB_COV} -rpath ${LIBDIR}" >> ${CONFIG_MK}
+echo " ${LIBTOOL} --tag=CC --mode=link \${CC} -shared \${LDFLAGS_COV} ${OBJECTS_COV} \${LIBS_COV} --rpath ${LIBDIR} -o ${LIB_COV}" >> ${CONFIG_MK}
echo >> ${CONFIG_MK}
echo "$LIB_DEBUG: $LIBTOMMATH_DEBUG $OBJECTS_DEBUG" >> ${CONFIG_MK}
-echo " ${LIBTOOL} --tag=CC --mode=link \${CC} \${LDFLAGS_DEBUG} ${OBJECTS_DEBUG} \${LIBS_DEBUG} -o ${LIB_DEBUG} -rpath ${LIBDIR}" >> ${CONFIG_MK}
+echo " ${LIBTOOL} --tag=CC --mode=link \${CC} -shared \${LDFLAGS_DEBUG} ${OBJECTS_DEBUG} \${LIBS_DEBUG} --rpath ${LIBDIR} -o ${LIB_DEBUG}" >> ${CONFIG_MK}
for SRC in $SOURCES; do
echo >> ${CONFIG_MK}
diff --git a/libc3/env.c b/libc3/env.c
index db15993..02e2a54 100644
--- a/libc3/env.c
+++ b/libc3/env.c
@@ -80,11 +80,7 @@ bool env_eval_call (s_env *env, const s_call *call, s_tag *dest)
assert(dest);
call_copy(call, &c);
env_eval_call_resolve(env, &c);
- if (c.macro)
- result = env_eval_call_macro(env, &c, dest);
- else if (c.special_operator)
- result = env_eval_call_special_operator(env, &c, dest);
- else if (c.cfn)
+ if (c.cfn)
result = env_eval_call_cfn(env, &c, dest);
else if (c.fn)
result = env_eval_call_fn(env, &c, dest);
@@ -122,6 +118,7 @@ bool env_eval_call_arguments (s_env *env, s_list *args, s_list **dest)
bool env_eval_call_cfn (s_env *env, const s_call *call, s_tag *dest)
{
s_list *args = NULL;
+ s_list *args_final = NULL;
s_cfn *cfn;
s_tag tag;
assert(env);
@@ -130,11 +127,15 @@ bool env_eval_call_cfn (s_env *env, const s_call *call, s_tag *dest)
cfn = call->cfn;
assert(cfn);
if (call->arguments) {
- if (! env_eval_call_arguments(env, call->arguments, &args)) {
- return false;
+ if (cfn->macro || cfn->special_operator)
+ args_final = call->arguments;
+ else {
+ if (! env_eval_call_arguments(env, call->arguments, &args))
+ return false;
+ args_final = args;
}
}
- if (! cfn_apply(cfn, args, &tag)) {
+ if (! cfn_apply(cfn, args_final, &tag)) {
list_delete_all(args);
return false;
}
@@ -146,9 +147,10 @@ bool env_eval_call_cfn (s_env *env, const s_call *call, s_tag *dest)
bool env_eval_call_fn (s_env *env, const s_call *call, s_tag *dest)
{
s_list *args = NULL;
+ s_list *args_final = NULL;
s_frame frame;
s_fn *fn;
- s_fn *fn2;
+ s_fn_clause *clause;
s_tag tag;
s_list *tmp = NULL;
assert(env);
@@ -158,20 +160,26 @@ bool env_eval_call_fn (s_env *env, const s_call *call, s_tag *dest)
assert(fn);
frame_init(&frame, env->frame);
env->frame = &frame;
- fn2 = fn;
+ clause = fn->clauses;
if (call->arguments) {
- if (! env_eval_call_arguments(env, call->arguments, &args)) {
- env->frame = frame_clean(&frame);
- return false;
+ if (fn->macro || fn->special_operator)
+ args_final = call->arguments;
+ else {
+ if (! env_eval_call_arguments(env, call->arguments, &args)) {
+ env->frame = frame_clean(&frame);
+ return false;
+ }
+ args_final = args;
}
- while (fn2 && ! env_eval_equal_list(env, fn2->pattern, args, &tmp))
- fn2 = fn2->next_clause;
- if (! fn2) {
+ while (clause && ! env_eval_equal_list(env, clause->pattern,
+ args_final, &tmp))
+ clause = clause->next_clause;
+ if (! clause) {
err_puts("env_eval_call_fn: no clause matching.\nTried clauses :\n");
- fn2 = fn;
- while (fn2) {
- err_inspect_fn_pattern(fn2->pattern);
- fn2 = fn2->next_clause;
+ clause = fn->clauses;
+ while (clause) {
+ err_inspect_fn_pattern(clause->pattern);
+ clause = clause->next_clause;
}
err_puts("\nArguments :\n");
err_inspect_fn_pattern(args);
@@ -181,7 +189,7 @@ bool env_eval_call_fn (s_env *env, const s_call *call, s_tag *dest)
return false;
}
}
- if (! env_eval_progn(env, fn2->algo, &tag)) {
+ if (! env_eval_progn(env, clause->algo, &tag)) {
list_delete_all(args);
list_delete_all(tmp);
env->frame = frame_clean(&frame);
@@ -194,34 +202,8 @@ bool env_eval_call_fn (s_env *env, const s_call *call, s_tag *dest)
return true;
}
-bool env_eval_call_macro (s_env *env, const s_call *call, s_tag *dest)
-{
- s_tag *expanded;
- assert(env);
- assert(call);
- assert(dest);
- (void) env;
- (void) call;
- (void) expanded;
- (void) dest;
- return false;
-}
-
bool env_eval_call_resolve (s_env *env, s_call *call)
{
- s_facts_with_cursor cursor;
- s_module module;
- s_tag tag_cfn;
- s_tag tag_fn;
- s_tag tag_ident;
- s_tag tag_is_a;
- s_tag tag_macro;
- s_tag tag_module;
- s_tag tag_module_name;
- s_tag tag_special_operator;
- s_tag tag_sym;
- s_tag tag_symbol;
- s_tag tag_var;
const s_tag *value;
assert(env);
assert(call);
@@ -231,116 +213,14 @@ bool env_eval_call_resolve (s_env *env, s_call *call)
return true;
}
else if (value->type == TAG_FN) {
- call->fn = value->data.fn;
+ call->fn = fn_new_copy(&value->data.fn);
return true;
}
}
ident_resolve_module(&call->ident, env);
- tag_init_1( &tag_cfn, ":cfn");
- tag_init_1( &tag_fn, ":fn");
- tag_init_ident(&tag_ident, &call->ident);
- tag_init_1( &tag_is_a, ":is_a");
- tag_init_1( &tag_macro, ":macro");
- tag_init_1( &tag_module, ":module");
- tag_init_sym( &tag_module_name, call->ident.module_name);
- tag_init_1( &tag_special_operator, ":special_operator");
- tag_init_sym( &tag_sym, call->ident.sym);
- tag_init_1( &tag_symbol, ":symbol");
- tag_init_var( &tag_var);
- facts_with(&env->facts, &cursor, (t_facts_spec) {
- &tag_module_name,
- &tag_is_a, &tag_module, /* module exists */
- NULL, NULL });
- if (! facts_with_cursor_next(&cursor)) {
- if (! module_load(&module, call->ident.module_name, &env->facts)) {
- warnx("module not found: %s",
- call->ident.module_name->str.ptr.ps8);
- facts_with_cursor_clean(&cursor);
- return false;
- }
- }
- facts_with_cursor_clean(&cursor);
- facts_with(&env->facts, &cursor, (t_facts_spec) {
- &tag_module_name,
- &tag_symbol, &tag_ident, /* module exports symbol */
- NULL, NULL });
- if (! facts_with_cursor_next(&cursor)) {
- warnx("symbol %s not found in module %s",
- call->ident.sym->str.ptr.ps8,
- call->ident.module_name->str.ptr.ps8);
- facts_with_cursor_clean(&cursor);
+ if (! module_ensure_loaded(call->ident.module_name, &env->facts))
return false;
- }
- facts_with_cursor_clean(&cursor);
- facts_with(&env->facts, &cursor, (t_facts_spec) {
- &tag_ident, &tag_fn, &tag_var,
- NULL, NULL });
- if (facts_with_cursor_next(&cursor)) {
- if (tag_var.type != TAG_FN)
- errx(1, "%s.%s is not a function",
- call->ident.module_name->str.ptr.ps8,
- call->ident.sym->str.ptr.ps8);
- call->fn = tag_var.data.fn;
- }
- facts_with_cursor_clean(&cursor);
- facts_with(&env->facts, &cursor, (t_facts_spec) {
- &tag_ident, &tag_cfn, &tag_var,
- NULL, NULL });
- if (facts_with_cursor_next(&cursor)) {
- if (tag_var.type != TAG_CFN)
- errx(1, "%s.%s is not a C function",
- call->ident.module_name->str.ptr.ps8,
- call->ident.sym->str.ptr.ps8);
- call->cfn = cfn_new_copy(&tag_var.data.cfn);
- }
- facts_with_cursor_clean(&cursor);
- facts_with(&env->facts, &cursor, (t_facts_spec) {
- &tag_ident, &tag_is_a, &tag_macro, NULL, NULL });
- if (facts_with_cursor_next(&cursor))
- call->macro = true;
- facts_with_cursor_clean(&cursor);
- facts_with(&env->facts, &cursor, (t_facts_spec) {
- &tag_ident, &tag_is_a, &tag_special_operator, NULL, NULL});
- if (facts_with_cursor_next(&cursor))
- call->special_operator = true;
- facts_with_cursor_clean(&cursor);
- return true;
-}
-
-bool env_eval_call_special_operator (s_env *env, const s_call *call,
- s_tag *dest)
-{
- s_frame frame;
- s_fn *fn;
- s_tag tag;
- s_list *tmp = NULL;
- assert(env);
- assert(call);
- assert(dest);
- if (call->cfn)
- return cfn_apply(call->cfn, call->arguments, dest) != NULL;
- fn = call->fn;
- assert(fn);
- frame_init(&frame, env->frame);
- env->frame = &frame;
- if (! env_eval_equal_list(env, fn->pattern, call->arguments, &tmp)) {
- err_puts("env_eval_call_fn: no clause matching.\nTried clauses :\n");
- err_inspect_fn_pattern(fn->pattern);
- err_puts("\nArguments :\n");
- err_inspect_fn_pattern(call->arguments);
- err_puts("\n");
- env->frame = frame_clean(&frame);
- return false;
- }
- if (! env_eval_progn(env, fn->algo, &tag)) {
- list_delete_all(tmp);
- env->frame = frame_clean(&frame);
- return false;
- }
- *dest = tag;
- list_delete_all(tmp);
- env->frame = frame_clean(&frame);
- return true;
+ return call_get(call, &env->facts);
}
bool env_eval_equal_list (s_env *env, const s_list *a, const s_list *b,
@@ -488,8 +368,6 @@ bool env_eval_equal_tag (s_env *env, const s_tag *a, const s_tag *b,
return env_eval_equal_tuple(env, &a->data.tuple, &b->data.tuple,
&dest->data.tuple);
case TAG_CALL:
- case TAG_CALL_FN:
- case TAG_CALL_MACRO:
case TAG_QUOTE:
case TAG_ARRAY:
case TAG_BOOL:
@@ -543,13 +421,16 @@ bool env_eval_ident (s_env *env, const s_ident *ident, s_tag *dest)
{
const s_tag *tag;
s_tag tmp;
+ s_ident tmp_ident;
assert(env);
assert(ident);
- if (! ((tag = frame_get(env->frame, ident->sym)) ||
- (tag = module_get(env->current_module, ident->sym, &tmp)))) {
+ ident_copy(ident, &tmp_ident);
+ ident_resolve_module(&tmp_ident, env);
+ if (! ((tag = frame_get(env->frame, tmp_ident.sym)) ||
+ (tag = ident_get(&tmp_ident, &env->facts, &tmp)))) {
warnx("unbound ident: %s.%s",
- ident->module_name->str.ptr.ps8,
- ident->sym->str.ptr.ps8);
+ tmp_ident.module_name->str.ptr.ps8,
+ tmp_ident.sym->str.ptr.ps8);
return false;
}
tag_copy(tag, dest);
@@ -594,10 +475,6 @@ bool env_eval_tag (s_env *env, const s_tag *tag, s_tag *dest)
return true;
case TAG_CALL:
return env_eval_call(env, &tag->data.call, dest);
- case TAG_CALL_FN:
- return env_eval_call_fn(env, &tag->data.call, dest);
- case TAG_CALL_MACRO:
- return env_eval_call_macro(env, &tag->data.call, dest);
case TAG_IDENT:
return env_eval_ident(env, &tag->data.ident, dest);
case TAG_QUOTE:
@@ -659,9 +536,9 @@ s_env * env_init (s_env *env)
assert(! "env_init: module path not found");
err(1, "env_init: module_path not found");
}
- env->current_module = &env->c3_module;
- env->c3_module.name = sym_1("C3");
- if (! module_load(&env->c3_module, sym_1("C3"), &env->facts)) {
+ env->current_module = sym_1("C3");
+ if (! module_load(sym_1("C3"), &env->facts)) {
+ env_clean(env);
return NULL;
}
return env;
@@ -681,20 +558,17 @@ void env_longjmp (s_env *env, jmp_buf *jmp_buf)
longjmp(*jmp_buf, 1);
}
-s_module * env_module_load (s_env *env, s_module *module,
- const s_sym *name, s_facts *facts)
+bool env_module_load (s_env *env, const s_sym *name,
+ s_facts *facts)
{
s_str path;
assert(env);
- assert(module);
assert(name);
assert(facts);
- module->name = name;
- module->facts = facts;
if (! module_name_path(&env->module_path, name, &path)) {
warnx("env_module_load: %s: module_name_path",
name->str.ptr.ps8);
- return 0;
+ return false;
}
/*
buf_write_1(&env->out, "module_load ");
@@ -708,10 +582,10 @@ s_module * env_module_load (s_env *env, s_module *module,
warnx("env_module_load: %s: facts_load_file",
path.ptr.ps8);
str_clean(&path);
- return 0;
+ return false;
}
str_clean(&path);
- return module;
+ return true;
}
bool env_operator_is_binary (s_env *env, const s_ident *op)
@@ -851,6 +725,17 @@ void env_push_unwind_protect (s_env *env,
env->unwind_protect = unwind_protect;
}
+bool env_tag_ident_is_bound (const s_env *env, const s_tag *tag,
+ s_facts *facts)
+{
+ s_tag tmp;
+ assert(tag);
+ assert(tag->type == TAG_IDENT);
+ return tag->type == TAG_IDENT &&
+ (frame_get(env->frame, tag->data.ident.sym) ||
+ ident_get(&tag->data.ident, facts, &tmp));
+}
+
s_tag * env_unwind_protect (s_env *env, s_tag *protected, s_list *cleanup,
s_tag *dest)
{
diff --git a/libc3/env.h b/libc3/env.h
index c9fdb59..4e9ab73 100644
--- a/libc3/env.h
+++ b/libc3/env.h
@@ -30,12 +30,7 @@ bool env_eval_call_cfn (s_env *env, const s_call *call,
s_tag *dest);
bool env_eval_call_fn (s_env *env, const s_call *call,
s_tag *dest);
-bool env_eval_call_macro (s_env *env, const s_call *call,
- s_tag *dest);
bool env_eval_call_resolve (s_env *env, s_call *call);
-bool env_eval_call_special_operator (s_env *env,
- const s_call *call,
- s_tag *dest);
bool env_eval_equal_list (s_env *env, const s_list *a,
const s_list *b, s_list **dest);
bool env_eval_equal_tag (s_env *env, const s_tag *a,
@@ -50,14 +45,16 @@ bool env_eval_progn (s_env *env, const s_list *program,
bool env_eval_quote(s_env *env, const s_quote *quote,
s_tag *dest);
bool env_eval_tag (s_env *env, const s_tag *tag, s_tag *dest);
-s_module * env_module_load (s_env *env, s_module *module,
- const s_sym *name, s_facts *facts);
+bool env_module_load (s_env *env, const s_sym *name,
+ s_facts *facts);
bool env_operator_is_binary (s_env *env, const s_ident *op);
bool env_operator_is_right_associative (s_env *env,
const s_ident *op);
bool env_operator_is_unary (s_env *env, const s_ident *op);
s8 env_operator_precedence (s_env *env,
const s_ident *op);
+bool env_tag_ident_is_bound (const s_env *env, const s_tag *tag,
+ s_facts *facts);
/* Control structures. */
void env_error_f (s_env *env, const char *fmt, ...);
diff --git a/libc3/fn.c b/libc3/fn.c
index 1172b65..abe9257 100644
--- a/libc3/fn.c
+++ b/libc3/fn.c
@@ -17,60 +17,50 @@
#include "arg.h"
#include "binding.h"
#include "fn.h"
+#include "fn_clause.h"
#include "list.h"
void fn_clean (s_fn *fn)
{
assert(fn);
- list_delete_all(fn->pattern);
- list_delete_all(fn->algo);
+ fn_clause_delete_all(fn->clauses);
}
-s_fn * fn_copy (const s_fn *src, s_fn **dest)
+s_fn * fn_copy (const s_fn *src, s_fn *dest)
{
- s_fn *tmp = NULL;
- s_fn **tail = &tmp;
- while (src) {
- *tail = fn_new(NULL);
- (*tail)->arity = src->arity;
- list_copy(src->pattern, &(*tail)->pattern);
- list_copy(src->algo, &(*tail)->algo);
- src = src->next_clause;
- tail = &(*tail)->next_clause;
- }
- *dest = tmp;
- return tmp;
+ fn_clause_copy(src->clauses, &dest->clauses);
+ dest->macro = src->macro;
+ dest->special_operator = src->special_operator;
+ return dest;
}
-s_fn * fn_delete (s_fn *fn)
+void fn_delete (s_fn *fn)
{
- s_fn *next_clause;
- assert(fn);
- next_clause = fn->next_clause;
fn_clean(fn);
free(fn);
- return next_clause;
-}
-
-void fn_delete_all (s_fn *fn)
-{
- while (fn)
- fn = fn_delete(fn);
}
-s_fn * fn_init (s_fn *fn, s_fn *next_clause)
+s_fn * fn_init (s_fn *fn)
{
assert(fn);
bzero(fn, sizeof(s_fn));
- fn->next_clause = next_clause;
return fn;
}
-s_fn * fn_new (s_fn *next_clause)
+s_fn * fn_new ()
{
s_fn *fn;
- if (! (fn = malloc(sizeof(s_fn))))
- err(1, "out of memory");
- fn_init(fn, next_clause);
+ if (! (fn = calloc(1, sizeof(s_fn))))
+ err(1, "fn_new: calloc");
+ fn_init(fn);
return fn;
}
+
+s_fn * fn_new_copy (const s_fn *fn)
+{
+ s_fn *tmp;
+ assert(fn);
+ tmp = fn_new();
+ fn_copy(fn, tmp);
+ return tmp;
+}
diff --git a/libc3/fn.h b/libc3/fn.h
index 802550c..5ce397a 100644
--- a/libc3/fn.h
+++ b/libc3/fn.h
@@ -23,16 +23,16 @@
/* stack-allocation compatible functions */
void fn_clean (s_fn *fn);
-s_fn * fn_init (s_fn *fn, s_fn *next_clause);
+s_fn * fn_init (s_fn *fn);
/* constructors */
-s_fn * fn_new (s_fn *next_clause);
+s_fn * fn_new ();
+s_fn * fn_new_copy (const s_fn *fn);
/* destructors */
-s_fn * fn_delete (s_fn *fn);
-void fn_delete_all (s_fn *fn);
+void fn_delete (s_fn *fn);
-/* modifiers */
-s_fn * fn_copy (const s_fn *src, s_fn **dest);
+/* observers */
+s_fn * fn_copy (const s_fn *src, s_fn *dest);
#endif /* FN_H */
diff --git a/libc3/fn_clause.c b/libc3/fn_clause.c
new file mode 100644
index 0000000..7de9208
--- /dev/null
+++ b/libc3/fn_clause.c
@@ -0,0 +1,76 @@
+/* c3
+ * Copyright 2022,2023 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 <assert.h>
+#include <err.h>
+#include <stdlib.h>
+#include <strings.h>
+#include "arg.h"
+#include "binding.h"
+#include "fn_clause.h"
+#include "list.h"
+
+void fn_clause_clean (s_fn_clause *fn_clause)
+{
+ assert(fn_clause);
+ list_delete_all(fn_clause->pattern);
+ list_delete_all(fn_clause->algo);
+}
+
+s_fn_clause * fn_clause_copy (const s_fn_clause *src, s_fn_clause **dest)
+{
+ s_fn_clause *tmp = NULL;
+ s_fn_clause **tail = &tmp;
+ while (src) {
+ *tail = fn_clause_new(NULL);
+ (*tail)->arity = src->arity;
+ list_copy(src->pattern, &(*tail)->pattern);
+ list_copy(src->algo, &(*tail)->algo);
+ src = src->next_clause;
+ tail = &(*tail)->next_clause;
+ }
+ *dest = tmp;
+ return tmp;
+}
+
+s_fn_clause * fn_clause_delete (s_fn_clause *fn_clause)
+{
+ s_fn_clause *next_clause;
+ assert(fn_clause);
+ next_clause = fn_clause->next_clause;
+ fn_clause_clean(fn_clause);
+ free(fn_clause);
+ return next_clause;
+}
+
+void fn_clause_delete_all (s_fn_clause *fn_clause)
+{
+ while (fn_clause)
+ fn_clause = fn_clause_delete(fn_clause);
+}
+
+s_fn_clause * fn_clause_init (s_fn_clause *fn_clause, s_fn_clause *next_clause)
+{
+ assert(fn_clause);
+ bzero(fn_clause, sizeof(s_fn_clause));
+ fn_clause->next_clause = next_clause;
+ return fn_clause;
+}
+
+s_fn_clause * fn_clause_new (s_fn_clause *next_clause)
+{
+ s_fn_clause *fn_clause;
+ if (! (fn_clause = calloc(1, sizeof(s_fn_clause))))
+ err(1, "fn_clause_new: calloc");
+ fn_clause_init(fn_clause, next_clause);
+ return fn_clause;
+}
diff --git a/libc3/fn_clause.h b/libc3/fn_clause.h
new file mode 100644
index 0000000..32d4df1
--- /dev/null
+++ b/libc3/fn_clause.h
@@ -0,0 +1,38 @@
+/* c3
+ * Copyright 2022,2023 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.
+ */
+/**
+ * @file fn_clause.h
+ * Function clause type.
+ *
+ * Syntax : "fn" (type? "(" ((type space)? sym ","?)* ")" "{" prog "}")+
+ */
+#ifndef FN_CLAUSE_H
+#define FN_CLAUSE_H
+
+#include "types.h"
+
+/* stack-allocation compatible functions */
+void fn_clause_clean (s_fn_clause *clause);
+s_fn_clause * fn_clause_init (s_fn_clause *clause, s_fn_clause *next_clause);
+
+/* constructors */
+s_fn_clause * fn_clause_new (s_fn_clause *next_clause);
+
+/* destructors */
+s_fn_clause * fn_clause_delete (s_fn_clause *clause);
+void fn_clause_delete_all (s_fn_clause *clause);
+
+/* modifiers */
+s_fn_clause * fn_clause_copy (const s_fn_clause *src, s_fn_clause **dest);
+
+#endif /* FN_H */
diff --git a/libc3/hash.c b/libc3/hash.c
index 2455720..0feb005 100644
--- a/libc3/hash.c
+++ b/libc3/hash.c
@@ -137,22 +137,34 @@ void hash_update_fact (t_hash *hash, const s_fact *fact)
void hash_update_fn (t_hash *hash, const s_fn *fn)
{
- uw count = 0;
- const s_fn *f;
const s8 type[] = "fn";
assert(hash);
assert(fn);
hash_update(hash, type, sizeof(type));
- f = fn;
+ hash_update_bool(hash, fn->macro);
+ hash_update_bool(hash, fn->macro);
+ hash_update_fn_clauses(hash, fn->clauses);
+}
+
+void hash_update_fn_clauses (t_hash *hash, const s_fn_clause *clauses)
+{
+ uw count = 0;
+ const s_fn_clause *f;
+ const s8 type[] = "fn_clauses";
+ assert(hash);
+ assert(clauses);
+ hash_update(hash, type, sizeof(type));
+ f = clauses;
while (f) {
count++;
f = f->next_clause;
}
hash_update_uw(hash, count);
- while (fn) {
- hash_update_list(hash, fn->pattern);
- hash_update_list(hash, fn->algo);
- fn = fn->next_clause;
+ f = clauses;
+ while (f) {
+ hash_update_list(hash, f->pattern);
+ hash_update_list(hash, f->algo);
+ f = f->next_clause;
}
}
@@ -255,16 +267,13 @@ void hash_update_tag (t_hash *hash, const s_tag *tag)
case TAG_VOID: break;
case TAG_ARRAY: hash_update_array(hash, &tag->data.array); break;
case TAG_BOOL: hash_update_bool(hash, tag->data.bool); break;
- case TAG_CALL:
- case TAG_CALL_FN:
- case TAG_CALL_MACRO:
- hash_update_call(hash, &tag->data.call); break;
+ case TAG_CALL: hash_update_call(hash, &tag->data.call); break;
case TAG_CFN: hash_update_cfn(hash, &tag->data.cfn); break;
case TAG_CHARACTER:
hash_update_character(hash, tag->data.character); break;
case TAG_F32: hash_update_f32(hash, tag->data.f32); break;
case TAG_F64: hash_update_f64(hash, tag->data.f64); break;
- case TAG_FN: hash_update_fn(hash, tag->data.fn); break;
+ case TAG_FN: hash_update_fn(hash, &tag->data.fn); break;
case TAG_IDENT: hash_update_ident(hash, &tag->data.ident); break;
case TAG_INTEGER:
hash_update_integer(hash, &tag->data.integer); break;
diff --git a/libc3/hash.h b/libc3/hash.h
index e8ebbfa..abd0ebc 100644
--- a/libc3/hash.h
+++ b/libc3/hash.h
@@ -32,6 +32,7 @@ HASH_UPDATE_PROTOTYPE(f32);
HASH_UPDATE_PROTOTYPE(f64);
void hash_update_fact (t_hash *hash, const s_fact *fact);
void hash_update_fn (t_hash *hash, const s_fn *fn);
+void hash_update_fn_clauses (t_hash *hash, const s_fn_clause *clauses);
void hash_update_ident (t_hash *hash, const s_ident *ident);
void hash_update_integer (t_hash *hash, const s_integer *i);
void hash_update_list (t_hash *hash, const s_list *list);
diff --git a/libc3/ident.c b/libc3/ident.c
index 7059c26..2959628 100644
--- a/libc3/ident.c
+++ b/libc3/ident.c
@@ -14,8 +14,12 @@
#include "buf.h"
#include "buf_inspect.h"
#include "character.h"
+#include "facts_with.h"
+#include "facts_with_cursor.h"
+#include "module.h"
#include "str.h"
#include "sym.h"
+#include "tag.h"
bool ident_character_is_reserved (character c)
{
@@ -54,6 +58,95 @@ bool ident_first_character_is_reserved (character c)
c == '}');
}
+s_tag * ident_get (const s_ident *ident, s_facts *facts, s_tag *dest)
+{
+ s_facts_with_cursor cursor;
+ s_tag tag_cfn;
+ s_tag tag_fn;
+ s_tag tag_ident;
+ s_tag tag_is_a;
+ s_tag tag_macro;
+ s_tag tag_module_name;
+ s_tag tag_special_operator;
+ s_tag tag_sym;
+ s_tag tag_symbol;
+ s_tag tag_var;
+ if (! module_ensure_loaded(ident->module_name, facts))
+ return NULL;
+ tag_init_1( &tag_cfn, ":cfn");
+ tag_init_1( &tag_fn, ":fn");
+ tag_init_ident(&tag_ident, ident);
+ tag_init_1( &tag_is_a, ":is_a");
+ tag_init_1( &tag_macro, ":macro");
+ tag_init_1( &tag_special_operator, ":special_operator");
+ tag_init_sym( &tag_sym, ident->sym);
+ tag_init_1( &tag_symbol, ":symbol");
+ tag_init_var( &tag_var);
+ facts_with_cursor_clean(&cursor);
+ facts_with(facts, &cursor, (t_facts_spec) {
+ &tag_module_name,
+ &tag_symbol, &tag_ident, /* module exports symbol */
+ NULL, NULL });
+ if (! facts_with_cursor_next(&cursor)) {
+ warnx("symbol %s not found in module %s",
+ ident->sym->str.ptr.ps8,
+ ident->module_name->str.ptr.ps8);
+ facts_with_cursor_clean(&cursor);
+ return NULL;
+ }
+ facts_with_cursor_clean(&cursor);
+ facts_with(facts, &cursor, (t_facts_spec) {
+ &tag_ident, &tag_cfn, &tag_var,
+ NULL, NULL });
+ if (facts_with_cursor_next(&cursor)) {
+ if (tag_var.type != TAG_CFN) {
+ warnx("%s.%s is not a C function",
+ ident->module_name->str.ptr.ps8,
+ ident->sym->str.ptr.ps8);
+ facts_with_cursor_clean(&cursor);
+ return NULL;
+ }
+ }
+ facts_with_cursor_clean(&cursor);
+ if (tag_var.type == TAG_VAR) {
+ facts_with(facts, &cursor, (t_facts_spec) {
+ &tag_ident, &tag_fn, &tag_var,
+ NULL, NULL });
+ if (facts_with_cursor_next(&cursor)) {
+ if (tag_var.type != TAG_FN) {
+ warnx("%s.%s is not a function",
+ ident->module_name->str.ptr.ps8,
+ ident->sym->str.ptr.ps8);
+ facts_with_cursor_clean(&cursor);
+ return NULL;
+ }
+ facts_with_cursor_clean(&cursor);
+ }
+ }
+ if (tag_var.type == TAG_VAR)
+ return NULL;
+ facts_with(facts, &cursor, (t_facts_spec) {
+ &tag_ident, &tag_is_a, &tag_macro, NULL, NULL });
+ if (facts_with_cursor_next(&cursor)) {
+ if (tag_var.type == TAG_CFN)
+ tag_var.data.cfn.macro = true;
+ else if (tag_var.type == TAG_FN)
+ tag_var.data.fn.macro = true;
+ }
+ facts_with_cursor_clean(&cursor);
+ facts_with(facts, &cursor, (t_facts_spec) {
+ &tag_ident, &tag_is_a, &tag_special_operator, NULL, NULL});
+ if (facts_with_cursor_next(&cursor)) {
+ if (tag_var.type == TAG_CFN)
+ tag_var.data.cfn.special_operator = true;
+ else if (tag_var.type == TAG_FN)
+ tag_var.data.fn.special_operator = true;
+ }
+ facts_with_cursor_clean(&cursor);
+ *dest = tag_var;
+ return dest;
+}
+
bool ident_has_reserved_characters (const s_ident *ident)
{
character c;
@@ -114,7 +207,7 @@ void ident_resolve_module (s_ident *ident, const s_env *env)
assert(ident);
if (! ident->module_name) {
assert(env->current_module);
- ident->module_name = env->current_module->name;
+ ident->module_name = env->current_module;
}
}
diff --git a/libc3/ident.h b/libc3/ident.h
index 17242a8..49085ce 100644
--- a/libc3/ident.h
+++ b/libc3/ident.h
@@ -37,6 +37,8 @@ s_ident * ident_copy (const s_ident *src, s_ident *dest);
/* Returns true iff c is an ident reserved character as first. */
bool ident_first_character_is_reserved (character c);
+s_tag * ident_get (const s_ident *ident, s_facts *facts, s_tag *dest);
+
/* Returns true iff ident contains reserved characters. */
bool ident_has_reserved_characters (const s_ident *ident);
diff --git a/libc3/module.c b/libc3/module.c
index a674b6f..431709a 100644
--- a/libc3/module.c
+++ b/libc3/module.c
@@ -11,59 +11,45 @@
* THIS SOFTWARE.
*/
#include <assert.h>
+#include <err.h>
#include <string.h>
-#include "c3.h"
+#include "buf.h"
+#include "character.h"
+#include "env.h"
+#include "facts.h"
+#include "facts_with.h"
+#include "facts_with_cursor.h"
+#include "module.h"
+#include "tag.h"
-s_tag * module_get (const s_module *module, const s_sym *sym,
- s_tag *dest)
+bool module_ensure_loaded (const s_sym *name, s_facts *facts)
{
- s_ident ident;
- s_tag tag_cfn;
- s_tag tag_fn;
- s_tag tag_ident;
+ s_facts_with_cursor cursor;
+ s_tag tag_module_name;
s_tag tag_is_a;
s_tag tag_module;
- s_tag tag_name;
- s_tag tag_symbol;
- s_tag tag_tmp;
- assert(module);
- assert(sym);
- s_facts_with_cursor cursor;
- tag_init_sym(&tag_name, module->name);
- tag_init_1( &tag_is_a, ":is_a");
- tag_init_1( &tag_module, ":module");
- tag_init_1( &tag_symbol, ":symbol");
- ident_init(&ident, module->name, sym);
- tag_init_ident(&tag_ident, &ident);
- facts_with(module->facts, &cursor, (t_facts_spec) {
- &tag_name, &tag_is_a, &tag_module,
- &tag_symbol, &tag_ident, NULL, NULL});
- if (! facts_with_cursor_next(&cursor)) {
- facts_with_cursor_clean(&cursor);
- return NULL;
- }
- facts_with_cursor_clean(&cursor);
- tag_init_1(&tag_cfn, ":cfn");
- tag_init_1(&tag_fn, ":fn");
- tag_init_var(&tag_tmp);
- facts_with(module->facts, &cursor, (t_facts_spec) {
- &tag_ident, &tag_cfn, &tag_tmp, NULL, NULL});
+ tag_init_sym(&tag_module_name, name);
+ tag_init_1( &tag_is_a, ":is_a");
+ tag_init_1( &tag_module, ":module");
+ facts_with(facts, &cursor, (t_facts_spec) {
+ &tag_module_name,
+ &tag_is_a, &tag_module, /* module exists */
+ NULL, NULL });
if (! facts_with_cursor_next(&cursor)) {
- facts_with_cursor_clean(&cursor);
- facts_with(module->facts, &cursor, (t_facts_spec) {
- &tag_ident, &tag_fn, &tag_tmp, NULL, NULL});
- if (! facts_with_cursor_next(&cursor))
- tag_init_void(&tag_tmp);
+ if (! module_load(name, facts)) {
+ warnx("module not found: %s",
+ name->str.ptr.ps8);
+ facts_with_cursor_clean(&cursor);
+ return false;
+ }
}
facts_with_cursor_clean(&cursor);
- *dest = tag_tmp;
- return dest;
+ return true;
}
-s_module * module_load (s_module *module, const s_sym *name,
- s_facts *facts)
+bool module_load (const s_sym *name, s_facts *facts)
{
- return env_module_load(&g_c3_env, module, name, facts);
+ return env_module_load(&g_c3_env, name, facts);
}
s_str * module_name_path (const s_str *prefix, const s_sym *name,
diff --git a/libc3/module.h b/libc3/module.h
index 228d65b..d1f1c01 100644
--- a/libc3/module.h
+++ b/libc3/module.h
@@ -22,17 +22,15 @@
#include "types.h"
-s_module * module_load (s_module *module, const s_sym *name,
- s_facts *facts);
-s_str * module_name_path (const s_str *prefix, const s_sym *name,
- s_str *dest);
-sw module_name_path_size (const s_str *prefix,
- const s_sym *name);
+/* Modifiers */
+bool module_ensure_loaded (const s_sym *name, s_facts *facts);
+bool module_load (const s_sym *name, s_facts *facts);
/* Observers */
-s_tag * module_get (const s_module *module, const s_sym *sym,
- s_tag *dest);
-s_tag * module_is_bound (const s_module *module, const s_sym *sym,
- s_tag *dest);
+s_str * module_name_path (const s_str *prefix, const s_sym *name,
+ s_str *dest);
+sw module_name_path_size (const s_str *prefix,
+ const s_sym *name);
+
#endif /* MODULE_H */
diff --git a/libc3/sources.mk b/libc3/sources.mk
index 4b76558..419a65b 100644
--- a/libc3/sources.mk
+++ b/libc3/sources.mk
@@ -72,6 +72,7 @@ HEADERS = \
buf_parse_uw.h \
buf_save.h \
c3.h \
+ c3_main.h \
c_types.h \
call.h \
ceiling.h \
@@ -92,6 +93,7 @@ HEADERS = \
facts_with_cursor.h \
float.h \
fn.h \
+ fn_clause.h \
frame.h \
hash.h \
ident.h \
@@ -210,6 +212,7 @@ SOURCES = \
facts_with.c \
facts_with_cursor.c \
fn.c \
+ fn_clause.c \
frame.c \
hash.c \
ident.c \
@@ -326,6 +329,7 @@ LO_SOURCES = \
facts_with.c \
facts_with_cursor.c \
fn.c \
+ fn_clause.c \
frame.c \
hash.c \
ident.c \
diff --git a/libc3/sources.sh b/libc3/sources.sh
index c27c8ce..ae481f0 100644
--- a/libc3/sources.sh
+++ b/libc3/sources.sh
@@ -1,4 +1,4 @@
# sources.sh generated by update_sources
-HEADERS='abs.h arg.h array.h binding.h bool.h buf.h buf_file.h buf_inspect.h buf_inspect_s16.h buf_inspect_s16_binary.h buf_inspect_s16_decimal.h buf_inspect_s16_hexadecimal.h buf_inspect_s16_octal.h buf_inspect_s32.h buf_inspect_s32_binary.h buf_inspect_s32_decimal.h buf_inspect_s32_hexadecimal.h buf_inspect_s32_octal.h buf_inspect_s64.h buf_inspect_s64_binary.h buf_inspect_s64_decimal.h buf_inspect_s64_hexadecimal.h buf_inspect_s64_octal.h buf_inspect_s8.h buf_inspect_s8_binary.h buf_inspect_s8_decimal.h buf_inspect_s8_hexadecimal.h buf_inspect_s8_octal.h buf_inspect_sw.h buf_inspect_sw_binary.h buf_inspect_sw_decimal.h buf_inspect_sw_hexadecimal.h buf_inspect_sw_octal.h buf_inspect_u16.h buf_inspect_u16_binary.h buf_inspect_u16_decimal.h buf_inspect_u16_hexadecimal.h buf_inspect_u16_octal.h buf_inspect_u32.h buf_inspect_u32_binary.h buf_inspect_u32_decimal.h buf_inspect_u32_hexadecimal.h buf_inspect_u32_octal.h buf_inspect_u64.h buf_inspect_u64_binary.h buf_inspect_u64_decimal.h buf_inspect_u64_hexadecimal.h buf_inspect_u64_octal.h buf_inspect_u8.h buf_inspect_u8_binary.h buf_inspect_u8_decimal.h buf_inspect_u8_hexadecimal.h buf_inspect_u8_octal.h buf_inspect_uw.h buf_inspect_uw_binary.h buf_inspect_uw_decimal.h buf_inspect_uw_hexadecimal.h buf_inspect_uw_octal.h buf_parse.h buf_parse_c.h buf_parse_s16.h buf_parse_s32.h buf_parse_s64.h buf_parse_s8.h buf_parse_sw.h buf_parse_u16.h buf_parse_u32.h buf_parse_u64.h buf_parse_u8.h buf_parse_uw.h buf_save.h c3.h c_types.h call.h ceiling.h cfn.h character.h compare.h config.h env.h error.h error_handler.h eval.h fact.h facts.h facts_cursor.h facts_spec.h facts_spec_cursor.h facts_with.h facts_with_cursor.h float.h fn.h frame.h hash.h ident.h integer.h io.h list.h log.h module.h operator.h quote.h set__fact.h set__tag.h set_cursor__fact.h set_cursor__tag.h set_item__fact.h set_item__tag.h sha1.h sign.h skiplist__fact.h skiplist_node__fact.h str.h sym.h tag.h tuple.h type.h types.h ucd.h '
-SOURCES='abs.c arg.c array.c binding.c bool.c buf.c buf_file.c buf_inspect.c buf_inspect_s16.c buf_inspect_s16_binary.c buf_inspect_s16_decimal.c buf_inspect_s16_hexadecimal.c buf_inspect_s16_octal.c buf_inspect_s32.c buf_inspect_s32_binary.c buf_inspect_s32_decimal.c buf_inspect_s32_hexadecimal.c buf_inspect_s32_octal.c buf_inspect_s64.c buf_inspect_s64_binary.c buf_inspect_s64_decimal.c buf_inspect_s64_hexadecimal.c buf_inspect_s64_octal.c buf_inspect_s8.c buf_inspect_s8_binary.c buf_inspect_s8_decimal.c buf_inspect_s8_hexadecimal.c buf_inspect_s8_octal.c buf_inspect_sw.c buf_inspect_sw_binary.c buf_inspect_sw_decimal.c buf_inspect_sw_hexadecimal.c buf_inspect_sw_octal.c buf_inspect_u16.c buf_inspect_u16_binary.c buf_inspect_u16_decimal.c buf_inspect_u16_hexadecimal.c buf_inspect_u16_octal.c buf_inspect_u32.c buf_inspect_u32_binary.c buf_inspect_u32_decimal.c buf_inspect_u32_hexadecimal.c buf_inspect_u32_octal.c buf_inspect_u64.c buf_inspect_u64_binary.c buf_inspect_u64_decimal.c buf_inspect_u64_hexadecimal.c buf_inspect_u64_octal.c buf_inspect_u8.c buf_inspect_u8_binary.c buf_inspect_u8_decimal.c buf_inspect_u8_hexadecimal.c buf_inspect_u8_octal.c buf_inspect_uw.c buf_inspect_uw_binary.c buf_inspect_uw_decimal.c buf_inspect_uw_hexadecimal.c buf_inspect_uw_octal.c buf_parse.c buf_parse_c.c buf_parse_s16.c buf_parse_s32.c buf_parse_s64.c buf_parse_s8.c buf_parse_sw.c buf_parse_u16.c buf_parse_u32.c buf_parse_u64.c buf_parse_u8.c buf_parse_uw.c buf_save.c c3.c call.c ceiling.c cfn.c character.c compare.c env.c error.c error_handler.c eval.c fact.c facts.c facts_cursor.c facts_spec.c facts_spec_cursor.c facts_with.c facts_with_cursor.c fn.c frame.c hash.c ident.c integer.c io.c list.c log.c module.c operator.c quote.c set__fact.c set__tag.c set_cursor__fact.c set_cursor__tag.c set_item__fact.c set_item__tag.c sign.c skiplist__fact.c skiplist_node__fact.c str.c sym.c tag.c tuple.c type.c ucd.c '
-LO_SOURCES='abs.c arg.c array.c binding.c bool.c buf.c buf_file.c buf_inspect.c buf_inspect_s16.c buf_inspect_s16_binary.c buf_inspect_s16_decimal.c buf_inspect_s16_hexadecimal.c buf_inspect_s16_octal.c buf_inspect_s32.c buf_inspect_s32_binary.c buf_inspect_s32_decimal.c buf_inspect_s32_hexadecimal.c buf_inspect_s32_octal.c buf_inspect_s64.c buf_inspect_s64_binary.c buf_inspect_s64_decimal.c buf_inspect_s64_hexadecimal.c buf_inspect_s64_octal.c buf_inspect_s8.c buf_inspect_s8_binary.c buf_inspect_s8_decimal.c buf_inspect_s8_hexadecimal.c buf_inspect_s8_octal.c buf_inspect_sw.c buf_inspect_sw_binary.c buf_inspect_sw_decimal.c buf_inspect_sw_hexadecimal.c buf_inspect_sw_octal.c buf_inspect_u16.c buf_inspect_u16_binary.c buf_inspect_u16_decimal.c buf_inspect_u16_hexadecimal.c buf_inspect_u16_octal.c buf_inspect_u32.c buf_inspect_u32_binary.c buf_inspect_u32_decimal.c buf_inspect_u32_hexadecimal.c buf_inspect_u32_octal.c buf_inspect_u64.c buf_inspect_u64_binary.c buf_inspect_u64_decimal.c buf_inspect_u64_hexadecimal.c buf_inspect_u64_octal.c buf_inspect_u8.c buf_inspect_u8_binary.c buf_inspect_u8_decimal.c buf_inspect_u8_hexadecimal.c buf_inspect_u8_octal.c buf_inspect_uw.c buf_inspect_uw_binary.c buf_inspect_uw_decimal.c buf_inspect_uw_hexadecimal.c buf_inspect_uw_octal.c buf_parse.c buf_parse_c.c buf_parse_s16.c buf_parse_s32.c buf_parse_s64.c buf_parse_s8.c buf_parse_sw.c buf_parse_u16.c buf_parse_u32.c buf_parse_u64.c buf_parse_u8.c buf_parse_uw.c buf_save.c c3.c call.c ceiling.c cfn.c character.c compare.c env.c error.c error_handler.c eval.c fact.c facts.c facts_cursor.c facts_spec.c facts_spec_cursor.c facts_with.c facts_with_cursor.c fn.c frame.c hash.c ident.c integer.c io.c list.c log.c module.c operator.c quote.c set__fact.c set__tag.c set_cursor__fact.c set_cursor__tag.c set_item__fact.c set_item__tag.c sign.c skiplist__fact.c skiplist_node__fact.c str.c sym.c tag.c tuple.c type.c ucd.c ../libtommath/bn_cutoffs.c ../libtommath/bn_mp_2expt.c ../libtommath/bn_mp_abs.c ../libtommath/bn_mp_add.c ../libtommath/bn_mp_add_d.c ../libtommath/bn_mp_and.c ../libtommath/bn_mp_clamp.c ../libtommath/bn_mp_clear.c ../libtommath/bn_mp_clear_multi.c ../libtommath/bn_mp_cmp.c ../libtommath/bn_mp_cmp_d.c ../libtommath/bn_mp_cmp_mag.c ../libtommath/bn_mp_cnt_lsb.c ../libtommath/bn_mp_complement.c ../libtommath/bn_mp_copy.c ../libtommath/bn_mp_count_bits.c ../libtommath/bn_mp_div.c ../libtommath/bn_mp_div_2.c ../libtommath/bn_mp_div_2d.c ../libtommath/bn_mp_div_3.c ../libtommath/bn_mp_div_d.c ../libtommath/bn_mp_dr_is_modulus.c ../libtommath/bn_mp_dr_reduce.c ../libtommath/bn_mp_dr_setup.c ../libtommath/bn_mp_error_to_string.c ../libtommath/bn_mp_exch.c ../libtommath/bn_mp_exptmod.c ../libtommath/bn_mp_gcd.c ../libtommath/bn_mp_get_double.c ../libtommath/bn_mp_get_i32.c ../libtommath/bn_mp_get_i64.c ../libtommath/bn_mp_get_mag_u32.c ../libtommath/bn_mp_get_mag_u64.c ../libtommath/bn_mp_grow.c ../libtommath/bn_mp_init.c ../libtommath/bn_mp_init_copy.c ../libtommath/bn_mp_init_multi.c ../libtommath/bn_mp_init_size.c ../libtommath/bn_mp_invmod.c ../libtommath/bn_mp_lcm.c ../libtommath/bn_mp_lshd.c ../libtommath/bn_mp_mod.c ../libtommath/bn_mp_mod_2d.c ../libtommath/bn_mp_montgomery_calc_normalization.c ../libtommath/bn_mp_montgomery_reduce.c ../libtommath/bn_mp_montgomery_setup.c ../libtommath/bn_mp_mul.c ../libtommath/bn_mp_mul_2.c ../libtommath/bn_mp_mul_2d.c ../libtommath/bn_mp_mul_d.c ../libtommath/bn_mp_mulmod.c ../libtommath/bn_mp_neg.c ../libtommath/bn_mp_or.c ../libtommath/bn_mp_radix_size.c ../libtommath/bn_mp_reduce.c ../libtommath/bn_mp_reduce_2k.c ../libtommath/bn_mp_reduce_2k_l.c ../libtommath/bn_mp_reduce_2k_setup.c ../libtommath/bn_mp_reduce_2k_setup_l.c ../libtommath/bn_mp_reduce_is_2k.c ../libtommath/bn_mp_reduce_is_2k_l.c ../libtommath/bn_mp_reduce_setup.c ../libtommath/bn_mp_rshd.c ../libtommath/bn_mp_set.c ../libtommath/bn_mp_set_double.c ../libtommath/bn_mp_set_i32.c ../libtommath/bn_mp_set_i64.c ../libtommath/bn_mp_set_l.c ../libtommath/bn_mp_set_u32.c ../libtommath/bn_mp_set_u64.c ../libtommath/bn_mp_set_ul.c ../libtommath/bn_mp_sqr.c ../libtommath/bn_mp_sqrt.c ../libtommath/bn_mp_sub.c ../libtommath/bn_mp_sub_d.c ../libtommath/bn_mp_xor.c ../libtommath/bn_mp_zero.c ../libtommath/bn_s_mp_add.c ../libtommath/bn_s_mp_balance_mul.c ../libtommath/bn_s_mp_exptmod.c ../libtommath/bn_s_mp_exptmod_fast.c ../libtommath/bn_s_mp_invmod_fast.c ../libtommath/bn_s_mp_invmod_slow.c ../libtommath/bn_s_mp_karatsuba_mul.c ../libtommath/bn_s_mp_karatsuba_sqr.c ../libtommath/bn_s_mp_montgomery_reduce_fast.c ../libtommath/bn_s_mp_mul_digs.c ../libtommath/bn_s_mp_mul_digs_fast.c ../libtommath/bn_s_mp_mul_high_digs.c ../libtommath/bn_s_mp_mul_high_digs_fast.c ../libtommath/bn_s_mp_rand_platform.c ../libtommath/bn_s_mp_sqr.c ../libtommath/bn_s_mp_sqr_fast.c ../libtommath/bn_s_mp_sub.c ../libtommath/bn_s_mp_toom_mul.c ../libtommath/bn_s_mp_toom_sqr.c '
+HEADERS='abs.h arg.h array.h binding.h bool.h buf.h buf_file.h buf_inspect.h buf_inspect_s16.h buf_inspect_s16_binary.h buf_inspect_s16_decimal.h buf_inspect_s16_hexadecimal.h buf_inspect_s16_octal.h buf_inspect_s32.h buf_inspect_s32_binary.h buf_inspect_s32_decimal.h buf_inspect_s32_hexadecimal.h buf_inspect_s32_octal.h buf_inspect_s64.h buf_inspect_s64_binary.h buf_inspect_s64_decimal.h buf_inspect_s64_hexadecimal.h buf_inspect_s64_octal.h buf_inspect_s8.h buf_inspect_s8_binary.h buf_inspect_s8_decimal.h buf_inspect_s8_hexadecimal.h buf_inspect_s8_octal.h buf_inspect_sw.h buf_inspect_sw_binary.h buf_inspect_sw_decimal.h buf_inspect_sw_hexadecimal.h buf_inspect_sw_octal.h buf_inspect_u16.h buf_inspect_u16_binary.h buf_inspect_u16_decimal.h buf_inspect_u16_hexadecimal.h buf_inspect_u16_octal.h buf_inspect_u32.h buf_inspect_u32_binary.h buf_inspect_u32_decimal.h buf_inspect_u32_hexadecimal.h buf_inspect_u32_octal.h buf_inspect_u64.h buf_inspect_u64_binary.h buf_inspect_u64_decimal.h buf_inspect_u64_hexadecimal.h buf_inspect_u64_octal.h buf_inspect_u8.h buf_inspect_u8_binary.h buf_inspect_u8_decimal.h buf_inspect_u8_hexadecimal.h buf_inspect_u8_octal.h buf_inspect_uw.h buf_inspect_uw_binary.h buf_inspect_uw_decimal.h buf_inspect_uw_hexadecimal.h buf_inspect_uw_octal.h buf_parse.h buf_parse_c.h buf_parse_s16.h buf_parse_s32.h buf_parse_s64.h buf_parse_s8.h buf_parse_sw.h buf_parse_u16.h buf_parse_u32.h buf_parse_u64.h buf_parse_u8.h buf_parse_uw.h buf_save.h c3.h c3_main.h c_types.h call.h ceiling.h cfn.h character.h compare.h config.h env.h error.h error_handler.h eval.h fact.h facts.h facts_cursor.h facts_spec.h facts_spec_cursor.h facts_with.h facts_with_cursor.h float.h fn.h fn_clause.h frame.h hash.h ident.h integer.h io.h list.h log.h module.h operator.h quote.h set__fact.h set__tag.h set_cursor__fact.h set_cursor__tag.h set_item__fact.h set_item__tag.h sha1.h sign.h skiplist__fact.h skiplist_node__fact.h str.h sym.h tag.h tuple.h type.h types.h ucd.h '
+SOURCES='abs.c arg.c array.c binding.c bool.c buf.c buf_file.c buf_inspect.c buf_inspect_s16.c buf_inspect_s16_binary.c buf_inspect_s16_decimal.c buf_inspect_s16_hexadecimal.c buf_inspect_s16_octal.c buf_inspect_s32.c buf_inspect_s32_binary.c buf_inspect_s32_decimal.c buf_inspect_s32_hexadecimal.c buf_inspect_s32_octal.c buf_inspect_s64.c buf_inspect_s64_binary.c buf_inspect_s64_decimal.c buf_inspect_s64_hexadecimal.c buf_inspect_s64_octal.c buf_inspect_s8.c buf_inspect_s8_binary.c buf_inspect_s8_decimal.c buf_inspect_s8_hexadecimal.c buf_inspect_s8_octal.c buf_inspect_sw.c buf_inspect_sw_binary.c buf_inspect_sw_decimal.c buf_inspect_sw_hexadecimal.c buf_inspect_sw_octal.c buf_inspect_u16.c buf_inspect_u16_binary.c buf_inspect_u16_decimal.c buf_inspect_u16_hexadecimal.c buf_inspect_u16_octal.c buf_inspect_u32.c buf_inspect_u32_binary.c buf_inspect_u32_decimal.c buf_inspect_u32_hexadecimal.c buf_inspect_u32_octal.c buf_inspect_u64.c buf_inspect_u64_binary.c buf_inspect_u64_decimal.c buf_inspect_u64_hexadecimal.c buf_inspect_u64_octal.c buf_inspect_u8.c buf_inspect_u8_binary.c buf_inspect_u8_decimal.c buf_inspect_u8_hexadecimal.c buf_inspect_u8_octal.c buf_inspect_uw.c buf_inspect_uw_binary.c buf_inspect_uw_decimal.c buf_inspect_uw_hexadecimal.c buf_inspect_uw_octal.c buf_parse.c buf_parse_c.c buf_parse_s16.c buf_parse_s32.c buf_parse_s64.c buf_parse_s8.c buf_parse_sw.c buf_parse_u16.c buf_parse_u32.c buf_parse_u64.c buf_parse_u8.c buf_parse_uw.c buf_save.c c3.c call.c ceiling.c cfn.c character.c compare.c env.c error.c error_handler.c eval.c fact.c facts.c facts_cursor.c facts_spec.c facts_spec_cursor.c facts_with.c facts_with_cursor.c fn.c fn_clause.c frame.c hash.c ident.c integer.c io.c list.c log.c module.c operator.c quote.c set__fact.c set__tag.c set_cursor__fact.c set_cursor__tag.c set_item__fact.c set_item__tag.c sign.c skiplist__fact.c skiplist_node__fact.c str.c sym.c tag.c tuple.c type.c ucd.c '
+LO_SOURCES='abs.c arg.c array.c binding.c bool.c buf.c buf_file.c buf_inspect.c buf_inspect_s16.c buf_inspect_s16_binary.c buf_inspect_s16_decimal.c buf_inspect_s16_hexadecimal.c buf_inspect_s16_octal.c buf_inspect_s32.c buf_inspect_s32_binary.c buf_inspect_s32_decimal.c buf_inspect_s32_hexadecimal.c buf_inspect_s32_octal.c buf_inspect_s64.c buf_inspect_s64_binary.c buf_inspect_s64_decimal.c buf_inspect_s64_hexadecimal.c buf_inspect_s64_octal.c buf_inspect_s8.c buf_inspect_s8_binary.c buf_inspect_s8_decimal.c buf_inspect_s8_hexadecimal.c buf_inspect_s8_octal.c buf_inspect_sw.c buf_inspect_sw_binary.c buf_inspect_sw_decimal.c buf_inspect_sw_hexadecimal.c buf_inspect_sw_octal.c buf_inspect_u16.c buf_inspect_u16_binary.c buf_inspect_u16_decimal.c buf_inspect_u16_hexadecimal.c buf_inspect_u16_octal.c buf_inspect_u32.c buf_inspect_u32_binary.c buf_inspect_u32_decimal.c buf_inspect_u32_hexadecimal.c buf_inspect_u32_octal.c buf_inspect_u64.c buf_inspect_u64_binary.c buf_inspect_u64_decimal.c buf_inspect_u64_hexadecimal.c buf_inspect_u64_octal.c buf_inspect_u8.c buf_inspect_u8_binary.c buf_inspect_u8_decimal.c buf_inspect_u8_hexadecimal.c buf_inspect_u8_octal.c buf_inspect_uw.c buf_inspect_uw_binary.c buf_inspect_uw_decimal.c buf_inspect_uw_hexadecimal.c buf_inspect_uw_octal.c buf_parse.c buf_parse_c.c buf_parse_s16.c buf_parse_s32.c buf_parse_s64.c buf_parse_s8.c buf_parse_sw.c buf_parse_u16.c buf_parse_u32.c buf_parse_u64.c buf_parse_u8.c buf_parse_uw.c buf_save.c c3.c call.c ceiling.c cfn.c character.c compare.c env.c error.c error_handler.c eval.c fact.c facts.c facts_cursor.c facts_spec.c facts_spec_cursor.c facts_with.c facts_with_cursor.c fn.c fn_clause.c frame.c hash.c ident.c integer.c io.c list.c log.c module.c operator.c quote.c set__fact.c set__tag.c set_cursor__fact.c set_cursor__tag.c set_item__fact.c set_item__tag.c sign.c skiplist__fact.c skiplist_node__fact.c str.c sym.c tag.c tuple.c type.c ucd.c ../libtommath/bn_cutoffs.c ../libtommath/bn_mp_2expt.c ../libtommath/bn_mp_abs.c ../libtommath/bn_mp_add.c ../libtommath/bn_mp_add_d.c ../libtommath/bn_mp_and.c ../libtommath/bn_mp_clamp.c ../libtommath/bn_mp_clear.c ../libtommath/bn_mp_clear_multi.c ../libtommath/bn_mp_cmp.c ../libtommath/bn_mp_cmp_d.c ../libtommath/bn_mp_cmp_mag.c ../libtommath/bn_mp_cnt_lsb.c ../libtommath/bn_mp_complement.c ../libtommath/bn_mp_copy.c ../libtommath/bn_mp_count_bits.c ../libtommath/bn_mp_div.c ../libtommath/bn_mp_div_2.c ../libtommath/bn_mp_div_2d.c ../libtommath/bn_mp_div_3.c ../libtommath/bn_mp_div_d.c ../libtommath/bn_mp_dr_is_modulus.c ../libtommath/bn_mp_dr_reduce.c ../libtommath/bn_mp_dr_setup.c ../libtommath/bn_mp_error_to_string.c ../libtommath/bn_mp_exch.c ../libtommath/bn_mp_exptmod.c ../libtommath/bn_mp_gcd.c ../libtommath/bn_mp_get_double.c ../libtommath/bn_mp_get_i32.c ../libtommath/bn_mp_get_i64.c ../libtommath/bn_mp_get_mag_u32.c ../libtommath/bn_mp_get_mag_u64.c ../libtommath/bn_mp_grow.c ../libtommath/bn_mp_init.c ../libtommath/bn_mp_init_copy.c ../libtommath/bn_mp_init_multi.c ../libtommath/bn_mp_init_size.c ../libtommath/bn_mp_invmod.c ../libtommath/bn_mp_lcm.c ../libtommath/bn_mp_lshd.c ../libtommath/bn_mp_mod.c ../libtommath/bn_mp_mod_2d.c ../libtommath/bn_mp_montgomery_calc_normalization.c ../libtommath/bn_mp_montgomery_reduce.c ../libtommath/bn_mp_montgomery_setup.c ../libtommath/bn_mp_mul.c ../libtommath/bn_mp_mul_2.c ../libtommath/bn_mp_mul_2d.c ../libtommath/bn_mp_mul_d.c ../libtommath/bn_mp_mulmod.c ../libtommath/bn_mp_neg.c ../libtommath/bn_mp_or.c ../libtommath/bn_mp_radix_size.c ../libtommath/bn_mp_reduce.c ../libtommath/bn_mp_reduce_2k.c ../libtommath/bn_mp_reduce_2k_l.c ../libtommath/bn_mp_reduce_2k_setup.c ../libtommath/bn_mp_reduce_2k_setup_l.c ../libtommath/bn_mp_reduce_is_2k.c ../libtommath/bn_mp_reduce_is_2k_l.c ../libtommath/bn_mp_reduce_setup.c ../libtommath/bn_mp_rshd.c ../libtommath/bn_mp_set.c ../libtommath/bn_mp_set_double.c ../libtommath/bn_mp_set_i32.c ../libtommath/bn_mp_set_i64.c ../libtommath/bn_mp_set_l.c ../libtommath/bn_mp_set_u32.c ../libtommath/bn_mp_set_u64.c ../libtommath/bn_mp_set_ul.c ../libtommath/bn_mp_sqr.c ../libtommath/bn_mp_sqrt.c ../libtommath/bn_mp_sub.c ../libtommath/bn_mp_sub_d.c ../libtommath/bn_mp_xor.c ../libtommath/bn_mp_zero.c ../libtommath/bn_s_mp_add.c ../libtommath/bn_s_mp_balance_mul.c ../libtommath/bn_s_mp_exptmod.c ../libtommath/bn_s_mp_exptmod_fast.c ../libtommath/bn_s_mp_invmod_fast.c ../libtommath/bn_s_mp_invmod_slow.c ../libtommath/bn_s_mp_karatsuba_mul.c ../libtommath/bn_s_mp_karatsuba_sqr.c ../libtommath/bn_s_mp_montgomery_reduce_fast.c ../libtommath/bn_s_mp_mul_digs.c ../libtommath/bn_s_mp_mul_digs_fast.c ../libtommath/bn_s_mp_mul_high_digs.c ../libtommath/bn_s_mp_mul_high_digs_fast.c ../libtommath/bn_s_mp_rand_platform.c ../libtommath/bn_s_mp_sqr.c ../libtommath/bn_s_mp_sqr_fast.c ../libtommath/bn_s_mp_sub.c ../libtommath/bn_s_mp_toom_mul.c ../libtommath/bn_s_mp_toom_sqr.c '
diff --git a/libc3/sym.c b/libc3/sym.c
index 799b952..8c5361d 100644
--- a/libc3/sym.c
+++ b/libc3/sym.c
@@ -194,14 +194,6 @@ bool sym_to_tag_type (const s_sym *sym, e_tag_type *dest)
*dest = TAG_CALL;
return true;
}
- if (sym == sym_1("call_fn")) {
- *dest = TAG_CALL_FN;
- return true;
- }
- if (sym == sym_1("call_macro")) {
- *dest = TAG_CALL_MACRO;
- return true;
- }
if (sym == sym_1("cfn")) {
*dest = TAG_CFN;
return true;
diff --git a/libc3/tag.c b/libc3/tag.c
index 5aac834..6ee5eea 100644
--- a/libc3/tag.c
+++ b/libc3/tag.c
@@ -1332,17 +1332,15 @@ void tag_clean (s_tag *tag)
{
assert(tag);
switch (tag->type) {
- case TAG_ARRAY: array_clean(&tag->data.array); break;
- case TAG_CALL:
- case TAG_CALL_FN:
- case TAG_CALL_MACRO: call_clean(&tag->data.call); break;
- case TAG_CFN: cfn_clean(&tag->data.cfn); break;
- case TAG_FN: fn_delete_all(tag->data.fn); break;
- case TAG_INTEGER: integer_clean(&tag->data.integer); break;
- case TAG_LIST: list_delete_all(tag->data.list); break;
- case TAG_QUOTE: quote_clean(&tag->data.quote); break;
- case TAG_STR: str_clean(&tag->data.str); break;
- case TAG_TUPLE: tuple_clean(&tag->data.tuple); break;
+ case TAG_ARRAY: array_clean(&tag->data.array); break;
+ case TAG_CALL: call_clean(&tag->data.call); break;
+ case TAG_CFN: cfn_clean(&tag->data.cfn); break;
+ case TAG_FN: fn_clean(&tag->data.fn); break;
+ case TAG_INTEGER: integer_clean(&tag->data.integer); break;
+ case TAG_LIST: list_delete_all(tag->data.list); break;
+ case TAG_QUOTE: quote_clean(&tag->data.quote); break;
+ case TAG_STR: str_clean(&tag->data.str); break;
+ case TAG_TUPLE: tuple_clean(&tag->data.tuple); break;
case TAG_BOOL:
case TAG_CHARACTER:
case TAG_F32:
@@ -1380,15 +1378,13 @@ s_tag * tag_copy (const s_tag *src, s_tag *dest)
array_copy(&src->data.array, &dest->data.array);
break;
case TAG_CALL:
- case TAG_CALL_FN:
- case TAG_CALL_MACRO:
call_copy(&src->data.call, &dest->data.call);
break;
case TAG_CFN:
cfn_copy(&src->data.cfn, &dest->data.cfn);
break;
case TAG_FN:
- fn_copy(src->data.fn, &dest->data.fn);
+ fn_copy(&src->data.fn, &dest->data.fn);
break;
case TAG_INTEGER:
integer_init(&dest->data.integer);
@@ -1954,13 +1950,7 @@ s_tag * tag_ident_1 (s_tag *tag, const s8 *p)
bool tag_ident_is_bound (const s_tag *tag)
{
- s_tag tmp;
- assert(tag);
- assert(tag->type == TAG_IDENT);
- return tag->type == TAG_IDENT &&
- (frame_get(g_c3_env.frame, tag->data.ident.sym) ||
- module_get(g_c3_env.current_module, tag->data.ident.sym,
- &tmp));
+ return env_tag_ident_is_bound(&g_c3_env, tag, &g_c3_env.facts);
}
s_tag * tag_init (s_tag *tag)
@@ -3641,14 +3631,6 @@ void * tag_to_ffi_pointer (s_tag *tag, const s_sym *type)
if (type == sym_1("call"))
return &tag->data.call;
goto invalid_type;
- case TAG_CALL_FN:
- if (type == sym_1("call_fn"))
- return &tag->data.call;
- goto invalid_type;
- case TAG_CALL_MACRO:
- if (type == sym_1("call_macro"))
- return &tag->data.call;
- goto invalid_type;
case TAG_CFN:
if (type == sym_1("cfn"))
return &tag->data.cfn;
@@ -3667,7 +3649,7 @@ void * tag_to_ffi_pointer (s_tag *tag, const s_sym *type)
goto invalid_type;
case TAG_FN:
if (type == sym_1("fn"))
- return tag->data.fn;
+ return &tag->data.fn;
goto invalid_type;
case TAG_IDENT:
if (type == sym_1("ident"))
@@ -3777,10 +3759,6 @@ void * tag_to_pointer (s_tag *tag, e_tag_type type)
return &tag->data.bool;
case TAG_CALL:
return &tag->data.call;
- case TAG_CALL_FN:
- return &tag->data.call;
- case TAG_CALL_MACRO:
- return &tag->data.call;
case TAG_CFN:
return &tag->data.cfn;
case TAG_CHARACTER:
@@ -3790,7 +3768,7 @@ void * tag_to_pointer (s_tag *tag, e_tag_type type)
case TAG_F64:
return &tag->data.f64;
case TAG_FN:
- return tag->data.fn;
+ return &tag->data.fn;
case TAG_IDENT:
return &tag->data.ident;
case TAG_INTEGER:
@@ -3853,8 +3831,6 @@ sw tag_type_size (e_tag_type type)
case TAG_BOOL:
return sizeof(bool);
case TAG_CALL:
- case TAG_CALL_FN:
- case TAG_CALL_MACRO:
return sizeof(s_call);
case TAG_CFN:
return sizeof(s_cfn);
@@ -3919,8 +3895,6 @@ f_buf_inspect tag_type_to_buf_inspect (e_tag_type type)
case TAG_BOOL:
return (f_buf_inspect) buf_inspect_bool;
case TAG_CALL:
- case TAG_CALL_FN:
- case TAG_CALL_MACRO:
return (f_buf_inspect) buf_inspect_call;
case TAG_CFN:
return (f_buf_inspect) buf_inspect_cfn;
@@ -3985,8 +3959,6 @@ f_buf_inspect_size tag_type_to_buf_inspect_size (e_tag_type type)
case TAG_BOOL:
return (f_buf_inspect_size) buf_inspect_bool_size;
case TAG_CALL:
- case TAG_CALL_FN:
- case TAG_CALL_MACRO:
return (f_buf_inspect_size) buf_inspect_call_size;
case TAG_CFN:
return (f_buf_inspect_size) buf_inspect_cfn_size;
@@ -4052,8 +4024,6 @@ f_buf_parse tag_type_to_buf_parse (e_tag_type type)
case TAG_BOOL:
return (f_buf_parse) buf_parse_bool;
case TAG_CALL:
- case TAG_CALL_FN:
- case TAG_CALL_MACRO:
return (f_buf_parse) buf_parse_call;
case TAG_CFN:
return (f_buf_parse) buf_parse_cfn;
@@ -4117,8 +4087,6 @@ ffi_type * tag_type_to_ffi_type (e_tag_type type)
case TAG_BOOL:
return &ffi_type_uint8;
case TAG_CALL:
- case TAG_CALL_FN:
- case TAG_CALL_MACRO:
return &ffi_type_pointer;
case TAG_CFN:
return &ffi_type_pointer;
@@ -4183,8 +4151,6 @@ s8 * tag_type_to_string (e_tag_type type)
case TAG_ARRAY: return "array";
case TAG_BOOL: return "bool";
case TAG_CALL: return "call";
- case TAG_CALL_FN: return "call_fn";
- case TAG_CALL_MACRO: return "call_macro";
case TAG_CFN: return "cfn";
case TAG_CHARACTER: return "character";
case TAG_F32: return "f32";
@@ -4222,8 +4188,6 @@ const s_sym * tag_type_to_sym (e_tag_type tag_type)
case TAG_ARRAY: return sym_1("array");
case TAG_BOOL: return sym_1("bool");
case TAG_CALL: return sym_1("call");
- case TAG_CALL_FN: return sym_1("call_fn");
- case TAG_CALL_MACRO: return sym_1("call_macro");
case TAG_CFN: return sym_1("cfn");
case TAG_CHARACTER: return sym_1("character");
case TAG_F32: return sym_1("f32");
diff --git a/libc3/types.h b/libc3/types.h
index 6770af1..8d90dbf 100644
--- a/libc3/types.h
+++ b/libc3/types.h
@@ -71,8 +71,6 @@ typedef enum {
TAG_ARRAY,
TAG_BOOL,
TAG_CALL,
- TAG_CALL_FN,
- TAG_CALL_MACRO,
TAG_CFN,
TAG_CHARACTER,
TAG_F32,
@@ -119,13 +117,13 @@ typedef struct facts_with_cursor s_facts_with_cursor;
typedef struct facts_with_cursor_level s_facts_with_cursor_level;
typedef struct float_ s_float;
typedef struct fn s_fn;
+typedef struct fn_clause s_fn_clause;
typedef struct frame s_frame;
typedef struct ident s_ident;
typedef struct integer s_integer;
typedef struct list s_list;
typedef struct list s_list_map;
typedef struct log s_log;
-typedef struct module s_module;
typedef struct quote s_quote;
typedef struct str s_str;
typedef struct struct_ s_struct;
@@ -188,21 +186,16 @@ struct float_ {
sw bit_shift;
};
-struct frame {
- s_binding *bindings;
- s_frame *next;
-};
-
-struct fn {
+struct fn_clause {
uw arity;
s_list *pattern;
s_list *algo;
- s_fn *next_clause;
+ s_fn_clause *next_clause;
};
-struct module {
- const s_sym *name;
- s_facts *facts;
+struct frame {
+ s_binding *bindings;
+ s_frame *next;
};
union ptr {
@@ -224,7 +217,6 @@ struct quote {
struct struct_ {
void *data;
uw count;
- s_module *module;
e_tag_type type;
};
@@ -271,8 +263,13 @@ struct facts_spec_cursor {
uw pos;
};
+struct fn {
+ s_fn_clause *clauses;
+ bool macro;
+ bool special_operator;
+};
+
struct ident {
- /*const s_module *module;*/
const s_sym *module_name;
const s_sym *sym;
};
@@ -296,8 +293,6 @@ struct call {
/* value */
s_cfn *cfn;
s_fn *fn;
- bool macro;
- bool special_operator;
};
struct cfn {
@@ -311,6 +306,8 @@ struct cfn {
bool arg_result;
s_list *arg_types;
ffi_cif cif;
+ bool macro;
+ bool special_operator;
};
struct log {
@@ -346,7 +343,7 @@ union tag_data {
character character;
f32 f32;
f64 f64;
- s_fn *fn;
+ s_fn fn;
s_ident ident;
s_integer integer;
s_list *list;
@@ -481,8 +478,7 @@ struct facts_cursor {
/* 9 */
struct env {
s_list *backtrace;
- const s_module *current_module;
- s_module c3_module;
+ const s_sym *current_module;
s_buf err;
s_error_handler *error_handler;
s_facts facts;
diff --git a/sources.mk b/sources.mk
index fea7e1f..4104b29 100644
--- a/sources.mk
+++ b/sources.mk
@@ -36,13 +36,13 @@ C3_C_SOURCES = \
libc3/abs.h \
libc3/buf.c \
libc3/buf.h \
- libc3/buf_inspect_s8_decimal.c \
libc3/buf_inspect_s8_decimal.h \
libc3/buf_inspect_s8_hexadecimal.c \
libc3/buf_inspect_s8_hexadecimal.h \
libc3/buf_inspect_s16.c \
libc3/buf_inspect_s16.h \
libc3/buf_inspect_s16_binary.c \
+ libc3/buf_inspect_s16_binary.h \
libc3/buf_parse_s8.c \
libc3/call.c \
libc3/arg.c \
@@ -51,23 +51,22 @@ C3_C_SOURCES = \
libc3/array.h \
libc3/binding.c \
libc3/c3.c \
- libc3/buf_inspect_s16_binary.h \
libc3/buf_inspect_s16_octal.c \
libc3/buf_inspect_s16_octal.h \
libc3/buf_inspect_s16_decimal.c \
- libc3/binding.h \
libc3/buf_inspect_s16_decimal.h \
+ libc3/binding.h \
libc3/buf_inspect_s16_hexadecimal.c \
libc3/buf_inspect_s16_hexadecimal.h \
libc3/buf_inspect_s32.c \
libc3/buf_inspect_s32.h \
libc3/buf_inspect_s32_binary.c \
libc3/buf_inspect_s32_binary.h \
+ libc3/buf_inspect_s32_octal.c \
libc3/bool.c \
libc3/bool.h \
libc3/buf_file.c \
libc3/buf_file.h \
- libc3/buf_inspect_s32_octal.c \
libc3/buf_inspect_s32_octal.h \
libc3/buf_inspect_s32_decimal.c \
libc3/buf_inspect_s32_decimal.h \
@@ -79,12 +78,12 @@ C3_C_SOURCES = \
libc3/buf_inspect_s64_binary.h \
libc3/buf_inspect_s64_octal.c \
libc3/buf_inspect_s64_octal.h \
+ libc3/buf_inspect_s64_decimal.c \
libc3/buf_parse.h \
libc3/buf_parse_c.c \
libc3/buf_save.c \
- libc3/buf_inspect_s64_decimal.c \
- libc3/facts_spec_cursor.c \
libc3/buf_inspect_s64_decimal.h \
+ libc3/facts_spec_cursor.c \
libc3/buf_inspect_s64_hexadecimal.c \
libc3/buf_inspect_s64_hexadecimal.h \
libc3/buf_inspect_sw.c \
@@ -95,12 +94,12 @@ C3_C_SOURCES = \
libc3/buf_inspect_sw_octal.h \
libc3/buf_inspect_sw_decimal.c \
libc3/buf_inspect_sw_decimal.h \
+ libc3/buf_inspect_sw_hexadecimal.c \
libc3/buf_parse_c.h \
libc3/buf_save.h \
libc3/c3.h \
libc3/c_types.h \
libc3/call.h \
- libc3/buf_inspect_sw_hexadecimal.c \
libc3/buf_inspect_sw_hexadecimal.h \
libc3/buf_inspect_u8.c \
libc3/buf_inspect_u8.h \
@@ -112,13 +111,13 @@ C3_C_SOURCES = \
libc3/buf_inspect_u8_decimal.h \
libc3/buf_inspect_u8_hexadecimal.c \
libc3/buf_inspect_u8_hexadecimal.h \
+ libc3/buf_inspect_u16.c \
libc3/ceiling.c \
libc3/ceiling.h \
libc3/cfn.c \
libc3/cfn.h \
libc3/character.c \
libc3/character.h \
- libc3/buf_inspect_u16.c \
libc3/buf_inspect_u16.h \
libc3/buf_inspect_u16_binary.c \
libc3/buf_inspect_u16_binary.h \
@@ -130,6 +129,7 @@ C3_C_SOURCES = \
libc3/buf_inspect_u16_hexadecimal.h \
libc3/buf_inspect_u32.c \
libc3/buf_inspect_u32.h \
+ libc3/buf_inspect_u64.c \
libc3/compare.c \
libc3/buf_inspect.c \
libc3/compare.h \
@@ -149,6 +149,7 @@ C3_C_SOURCES = \
libc3/buf_inspect_s8_binary.h \
libc3/buf_inspect_s8_octal.c \
libc3/buf_inspect_s8_octal.h \
+ libc3/buf_inspect_s8_decimal.c \
libc3/error.c \
libc3/error.h \
libc3/error_handler.c \
@@ -163,14 +164,12 @@ C3_C_SOURCES = \
libc3/buf_inspect_u32_decimal.h \
libc3/buf_inspect_u32_hexadecimal.c \
libc3/buf_inspect_u32_hexadecimal.h \
- libc3/buf_inspect_u64.c \
libc3/buf_inspect_u64.h \
libc3/buf_inspect_u64_binary.c \
- libc3/set__fact.c \
+ libc3/buf_inspect_u64_binary.h \
libc3/fact.c \
libc3/fact.h \
libc3/facts_cursor.c \
- libc3/buf_inspect_u64_binary.h \
libc3/buf_inspect_u64_octal.c \
libc3/buf_inspect_u64_octal.h \
libc3/buf_inspect_u64_decimal.c \
@@ -183,12 +182,12 @@ C3_C_SOURCES = \
libc3/buf_inspect_uw_binary.h \
libc3/buf_inspect_uw_octal.c \
libc3/buf_inspect_uw_octal.h \
- libc3/set__fact.h \
+ libc3/buf_inspect_uw_decimal.c \
+ libc3/set__fact.c \
libc3/facts_cursor.h \
libc3/facts_spec.c \
libc3/facts_spec.h \
libc3/facts_spec_cursor.h \
- libc3/buf_inspect_uw_decimal.c \
libc3/buf_inspect_uw_decimal.h \
libc3/buf_inspect_uw_hexadecimal.c \
libc3/buf_inspect_uw_hexadecimal.h \
@@ -202,12 +201,11 @@ C3_C_SOURCES = \
libc3/buf_parse_sw.c \
libc3/buf_parse_sw.h \
libc3/buf_parse_u8.c \
- libc3/set__tag.c \
+ libc3/buf_parse_u8.h \
+ libc3/buf_parse_u16.c \
libc3/facts_with.c \
libc3/facts_with.h \
libc3/facts_with_cursor.c \
- libc3/buf_parse_u8.h \
- libc3/buf_parse_u16.c \
libc3/buf_parse_u16.h \
libc3/buf_parse_u32.c \
libc3/buf_parse_u32.h \
@@ -215,6 +213,8 @@ C3_C_SOURCES = \
libc3/buf_parse_u64.h \
libc3/buf_parse_uw.c \
libc3/buf_parse_uw.h \
+ libc3/set__fact.h \
+ libc3/set__tag.c \
libc3/set__tag.h \
libc3/set_cursor__fact.c \
libc3/set_cursor__fact.h \
@@ -286,6 +286,9 @@ C3_C_SOURCES = \
libc3/buf_inspect_u_base.h.in \
libc3/tag.h \
libc3/tag.c \
+ libc3/fn_clause.h \
+ libc3/fn_clause.c \
+ libc3/c3_main.h \
test/buf_inspect_test.c \
test/bool_test.c \
test/buf_parse_test.c \
diff --git a/sources.sh b/sources.sh
index b2e1c06..306d817 100644
--- a/sources.sh
+++ b/sources.sh
@@ -1,4 +1,4 @@
# sources.sh generated by update_sources
C3_CONFIGURES='c3c/configure c3s/configure c3s/update_sources ic3/configure ic3/update_sources libc3/configure libc3/update_sources libtommath/update_sources libtommath/configure test/configure test/update_sources ucd2c/configure '
C3_MAKEFILES='c3c/Makefile c3s/Makefile ic3/Makefile libc3/Makefile libc3/gen.mk libtommath/Makefile test/Makefile ucd2c/Makefile '
-C3_C_SOURCES='c3c/c3c.c c3s/buf_readline.c c3s/c3s.c c3s/buf_readline.h ic3/ic3.c ic3/buf_linenoise.c ic3/buf_linenoise.h ic3/linenoise.c libc3/abs.c libc3/abs.h libc3/buf.c libc3/buf.h libc3/buf_inspect_s8_decimal.c libc3/buf_inspect_s8_decimal.h libc3/buf_inspect_s8_hexadecimal.c libc3/buf_inspect_s8_hexadecimal.h libc3/buf_inspect_s16.c libc3/buf_inspect_s16.h libc3/buf_inspect_s16_binary.c libc3/buf_parse_s8.c libc3/call.c libc3/arg.c libc3/arg.h libc3/array.c libc3/array.h libc3/binding.c libc3/c3.c libc3/buf_inspect_s16_binary.h libc3/buf_inspect_s16_octal.c libc3/buf_inspect_s16_octal.h libc3/buf_inspect_s16_decimal.c libc3/binding.h libc3/buf_inspect_s16_decimal.h libc3/buf_inspect_s16_hexadecimal.c libc3/buf_inspect_s16_hexadecimal.h libc3/buf_inspect_s32.c libc3/buf_inspect_s32.h libc3/buf_inspect_s32_binary.c libc3/buf_inspect_s32_binary.h libc3/bool.c libc3/bool.h libc3/buf_file.c libc3/buf_file.h libc3/buf_inspect_s32_octal.c libc3/buf_inspect_s32_octal.h libc3/buf_inspect_s32_decimal.c libc3/buf_inspect_s32_decimal.h libc3/buf_inspect_s32_hexadecimal.c libc3/buf_inspect_s32_hexadecimal.h libc3/buf_inspect_s64.c libc3/buf_inspect_s64.h libc3/buf_inspect_s64_binary.c libc3/buf_inspect_s64_binary.h libc3/buf_inspect_s64_octal.c libc3/buf_inspect_s64_octal.h libc3/buf_parse.h libc3/buf_parse_c.c libc3/buf_save.c libc3/buf_inspect_s64_decimal.c libc3/facts_spec_cursor.c libc3/buf_inspect_s64_decimal.h libc3/buf_inspect_s64_hexadecimal.c libc3/buf_inspect_s64_hexadecimal.h libc3/buf_inspect_sw.c libc3/buf_inspect_sw.h libc3/buf_inspect_sw_binary.c libc3/buf_inspect_sw_binary.h libc3/buf_inspect_sw_octal.c libc3/buf_inspect_sw_octal.h libc3/buf_inspect_sw_decimal.c libc3/buf_inspect_sw_decimal.h libc3/buf_parse_c.h libc3/buf_save.h libc3/c3.h libc3/c_types.h libc3/call.h libc3/buf_inspect_sw_hexadecimal.c libc3/buf_inspect_sw_hexadecimal.h libc3/buf_inspect_u8.c libc3/buf_inspect_u8.h libc3/buf_inspect_u8_binary.c libc3/buf_inspect_u8_binary.h libc3/buf_inspect_u8_octal.c libc3/buf_inspect_u8_octal.h libc3/buf_inspect_u8_decimal.c libc3/buf_inspect_u8_decimal.h libc3/buf_inspect_u8_hexadecimal.c libc3/buf_inspect_u8_hexadecimal.h libc3/ceiling.c libc3/ceiling.h libc3/cfn.c libc3/cfn.h libc3/character.c libc3/character.h libc3/buf_inspect_u16.c libc3/buf_inspect_u16.h libc3/buf_inspect_u16_binary.c libc3/buf_inspect_u16_binary.h libc3/buf_inspect_u16_octal.c libc3/buf_inspect_u16_octal.h libc3/buf_inspect_u16_decimal.c libc3/buf_inspect_u16_decimal.h libc3/buf_inspect_u16_hexadecimal.c libc3/buf_inspect_u16_hexadecimal.h libc3/buf_inspect_u32.c libc3/buf_inspect_u32.h libc3/compare.c libc3/buf_inspect.c libc3/compare.h libc3/buf_parse.c libc3/env.c libc3/env.h libc3/facts.c libc3/facts.h libc3/hash.c libc3/ident.c libc3/operator.c libc3/operator.h libc3/sym.c libc3/buf_inspect_s8.c libc3/buf_inspect_s8.h libc3/buf_inspect_s8_binary.c libc3/buf_inspect_s8_binary.h libc3/buf_inspect_s8_octal.c libc3/buf_inspect_s8_octal.h libc3/error.c libc3/error.h libc3/error_handler.c libc3/error_handler.h libc3/eval.c libc3/eval.h libc3/buf_inspect_u32_binary.c libc3/buf_inspect_u32_binary.h libc3/buf_inspect_u32_octal.c libc3/buf_inspect_u32_octal.h libc3/buf_inspect_u32_decimal.c libc3/buf_inspect_u32_decimal.h libc3/buf_inspect_u32_hexadecimal.c libc3/buf_inspect_u32_hexadecimal.h libc3/buf_inspect_u64.c libc3/buf_inspect_u64.h libc3/buf_inspect_u64_binary.c libc3/set__fact.c libc3/fact.c libc3/fact.h libc3/facts_cursor.c libc3/buf_inspect_u64_binary.h libc3/buf_inspect_u64_octal.c libc3/buf_inspect_u64_octal.h libc3/buf_inspect_u64_decimal.c libc3/buf_inspect_u64_decimal.h libc3/buf_inspect_u64_hexadecimal.c libc3/buf_inspect_u64_hexadecimal.h libc3/buf_inspect_uw.c libc3/buf_inspect_uw.h libc3/buf_inspect_uw_binary.c libc3/buf_inspect_uw_binary.h libc3/buf_inspect_uw_octal.c libc3/buf_inspect_uw_octal.h libc3/set__fact.h libc3/facts_cursor.h libc3/facts_spec.c libc3/facts_spec.h libc3/facts_spec_cursor.h libc3/buf_inspect_uw_decimal.c libc3/buf_inspect_uw_decimal.h libc3/buf_inspect_uw_hexadecimal.c libc3/buf_inspect_uw_hexadecimal.h libc3/buf_parse_s8.h libc3/buf_parse_s16.c libc3/buf_parse_s16.h libc3/buf_parse_s32.c libc3/buf_parse_s32.h libc3/buf_parse_s64.c libc3/buf_parse_s64.h libc3/buf_parse_sw.c libc3/buf_parse_sw.h libc3/buf_parse_u8.c libc3/set__tag.c libc3/facts_with.c libc3/facts_with.h libc3/facts_with_cursor.c libc3/buf_parse_u8.h libc3/buf_parse_u16.c libc3/buf_parse_u16.h libc3/buf_parse_u32.c libc3/buf_parse_u32.h libc3/buf_parse_u64.c libc3/buf_parse_u64.h libc3/buf_parse_uw.c libc3/buf_parse_uw.h libc3/set__tag.h libc3/set_cursor__fact.c libc3/set_cursor__fact.h libc3/set_cursor__tag.c libc3/set_cursor__tag.h libc3/set_item__fact.c libc3/set_item__fact.h libc3/set_item__tag.c libc3/facts_with_cursor.h libc3/float.h libc3/fn.c libc3/fn.h libc3/frame.c libc3/frame.h libc3/set_item__tag.h libc3/skiplist__fact.c libc3/skiplist__fact.h libc3/skiplist_node__fact.c libc3/skiplist_node__fact.h libc3/types.h libc3/hash.h libc3/ident.h libc3/integer.c libc3/integer.h libc3/io.c libc3/io.h libc3/list.c libc3/list.h libc3/log.c libc3/log.h libc3/buf_inspect_s.h.in libc3/module.c libc3/str.c libc3/module.h libc3/buf_parse_u.c.in libc3/quote.c libc3/quote.h libc3/set.c.in libc3/set.h.in libc3/buf_inspect_s_base.h.in libc3/sha1.h libc3/set_cursor.c.in libc3/set_cursor.h.in libc3/buf_inspect.h libc3/set_item.c.in libc3/set_item.h.in libc3/sign.c libc3/sign.h libc3/skiplist.c.in libc3/skiplist.h.in libc3/type.h libc3/skiplist_node.c.in libc3/skiplist_node.h.in libc3/str.h libc3/ucd.c libc3/sym.h libc3/tuple.c libc3/tuple.h libc3/type.c libc3/ucd.h libc3/buf_parse_s.c.in libc3/buf_parse_s.h.in libc3/buf_inspect_s.c.in libc3/buf_parse_u.h.in libc3/buf_inspect_s_base.c.in libc3/buf_inspect_u.c.in libc3/buf_inspect_u.h.in libc3/buf_inspect_u_base.c.in libc3/buf_inspect_u_base.h.in libc3/tag.h libc3/tag.c test/buf_inspect_test.c test/bool_test.c test/buf_parse_test.c test/facts_test.c test/buf_file_test.c test/libc3_test.c test/list_test.c test/test.c test/test.h test/buf_parse_test_u8.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_test.c test/buf_parse_test_u64.c test/call_test.c test/facts_cursor_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_with_test.c test/hash_test.c test/ident_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/array_test.c test/tuple_test.c test/types_test.c ucd2c/ucd.h ucd2c/ucd2c.c '
+C3_C_SOURCES='c3c/c3c.c c3s/buf_readline.c c3s/c3s.c c3s/buf_readline.h ic3/ic3.c ic3/buf_linenoise.c ic3/buf_linenoise.h ic3/linenoise.c libc3/abs.c libc3/abs.h libc3/buf.c libc3/buf.h libc3/buf_inspect_s8_decimal.h libc3/buf_inspect_s8_hexadecimal.c libc3/buf_inspect_s8_hexadecimal.h libc3/buf_inspect_s16.c libc3/buf_inspect_s16.h libc3/buf_inspect_s16_binary.c libc3/buf_inspect_s16_binary.h libc3/buf_parse_s8.c libc3/call.c libc3/arg.c libc3/arg.h libc3/array.c libc3/array.h libc3/binding.c libc3/c3.c libc3/buf_inspect_s16_octal.c libc3/buf_inspect_s16_octal.h libc3/buf_inspect_s16_decimal.c libc3/buf_inspect_s16_decimal.h libc3/binding.h libc3/buf_inspect_s16_hexadecimal.c libc3/buf_inspect_s16_hexadecimal.h libc3/buf_inspect_s32.c libc3/buf_inspect_s32.h libc3/buf_inspect_s32_binary.c libc3/buf_inspect_s32_binary.h libc3/buf_inspect_s32_octal.c libc3/bool.c libc3/bool.h libc3/buf_file.c libc3/buf_file.h libc3/buf_inspect_s32_octal.h libc3/buf_inspect_s32_decimal.c libc3/buf_inspect_s32_decimal.h libc3/buf_inspect_s32_hexadecimal.c libc3/buf_inspect_s32_hexadecimal.h libc3/buf_inspect_s64.c libc3/buf_inspect_s64.h libc3/buf_inspect_s64_binary.c libc3/buf_inspect_s64_binary.h libc3/buf_inspect_s64_octal.c libc3/buf_inspect_s64_octal.h libc3/buf_inspect_s64_decimal.c libc3/buf_parse.h libc3/buf_parse_c.c libc3/buf_save.c libc3/buf_inspect_s64_decimal.h libc3/facts_spec_cursor.c libc3/buf_inspect_s64_hexadecimal.c libc3/buf_inspect_s64_hexadecimal.h libc3/buf_inspect_sw.c libc3/buf_inspect_sw.h libc3/buf_inspect_sw_binary.c libc3/buf_inspect_sw_binary.h libc3/buf_inspect_sw_octal.c libc3/buf_inspect_sw_octal.h libc3/buf_inspect_sw_decimal.c libc3/buf_inspect_sw_decimal.h libc3/buf_inspect_sw_hexadecimal.c libc3/buf_parse_c.h libc3/buf_save.h libc3/c3.h libc3/c_types.h libc3/call.h libc3/buf_inspect_sw_hexadecimal.h libc3/buf_inspect_u8.c libc3/buf_inspect_u8.h libc3/buf_inspect_u8_binary.c libc3/buf_inspect_u8_binary.h libc3/buf_inspect_u8_octal.c libc3/buf_inspect_u8_octal.h libc3/buf_inspect_u8_decimal.c libc3/buf_inspect_u8_decimal.h libc3/buf_inspect_u8_hexadecimal.c libc3/buf_inspect_u8_hexadecimal.h libc3/buf_inspect_u16.c libc3/ceiling.c libc3/ceiling.h libc3/cfn.c libc3/cfn.h libc3/character.c libc3/character.h libc3/buf_inspect_u16.h libc3/buf_inspect_u16_binary.c libc3/buf_inspect_u16_binary.h libc3/buf_inspect_u16_octal.c libc3/buf_inspect_u16_octal.h libc3/buf_inspect_u16_decimal.c libc3/buf_inspect_u16_decimal.h libc3/buf_inspect_u16_hexadecimal.c libc3/buf_inspect_u16_hexadecimal.h libc3/buf_inspect_u32.c libc3/buf_inspect_u32.h libc3/buf_inspect_u64.c libc3/compare.c libc3/buf_inspect.c libc3/compare.h libc3/buf_parse.c libc3/env.c libc3/env.h libc3/facts.c libc3/facts.h libc3/hash.c libc3/ident.c libc3/operator.c libc3/operator.h libc3/sym.c libc3/buf_inspect_s8.c libc3/buf_inspect_s8.h libc3/buf_inspect_s8_binary.c libc3/buf_inspect_s8_binary.h libc3/buf_inspect_s8_octal.c libc3/buf_inspect_s8_octal.h libc3/buf_inspect_s8_decimal.c libc3/error.c libc3/error.h libc3/error_handler.c libc3/error_handler.h libc3/eval.c libc3/eval.h libc3/buf_inspect_u32_binary.c libc3/buf_inspect_u32_binary.h libc3/buf_inspect_u32_octal.c libc3/buf_inspect_u32_octal.h libc3/buf_inspect_u32_decimal.c libc3/buf_inspect_u32_decimal.h libc3/buf_inspect_u32_hexadecimal.c libc3/buf_inspect_u32_hexadecimal.h libc3/buf_inspect_u64.h libc3/buf_inspect_u64_binary.c libc3/buf_inspect_u64_binary.h libc3/fact.c libc3/fact.h libc3/facts_cursor.c libc3/buf_inspect_u64_octal.c libc3/buf_inspect_u64_octal.h libc3/buf_inspect_u64_decimal.c libc3/buf_inspect_u64_decimal.h libc3/buf_inspect_u64_hexadecimal.c libc3/buf_inspect_u64_hexadecimal.h libc3/buf_inspect_uw.c libc3/buf_inspect_uw.h libc3/buf_inspect_uw_binary.c libc3/buf_inspect_uw_binary.h libc3/buf_inspect_uw_octal.c libc3/buf_inspect_uw_octal.h libc3/buf_inspect_uw_decimal.c libc3/set__fact.c libc3/facts_cursor.h libc3/facts_spec.c libc3/facts_spec.h libc3/facts_spec_cursor.h libc3/buf_inspect_uw_decimal.h libc3/buf_inspect_uw_hexadecimal.c libc3/buf_inspect_uw_hexadecimal.h libc3/buf_parse_s8.h libc3/buf_parse_s16.c libc3/buf_parse_s16.h libc3/buf_parse_s32.c libc3/buf_parse_s32.h libc3/buf_parse_s64.c libc3/buf_parse_s64.h libc3/buf_parse_sw.c libc3/buf_parse_sw.h libc3/buf_parse_u8.c libc3/buf_parse_u8.h libc3/buf_parse_u16.c libc3/facts_with.c libc3/facts_with.h libc3/facts_with_cursor.c libc3/buf_parse_u16.h libc3/buf_parse_u32.c libc3/buf_parse_u32.h libc3/buf_parse_u64.c libc3/buf_parse_u64.h libc3/buf_parse_uw.c libc3/buf_parse_uw.h libc3/set__fact.h libc3/set__tag.c libc3/set__tag.h libc3/set_cursor__fact.c libc3/set_cursor__fact.h libc3/set_cursor__tag.c libc3/set_cursor__tag.h libc3/set_item__fact.c libc3/set_item__fact.h libc3/set_item__tag.c libc3/facts_with_cursor.h libc3/float.h libc3/fn.c libc3/fn.h libc3/frame.c libc3/frame.h libc3/set_item__tag.h libc3/skiplist__fact.c libc3/skiplist__fact.h libc3/skiplist_node__fact.c libc3/skiplist_node__fact.h libc3/types.h libc3/hash.h libc3/ident.h libc3/integer.c libc3/integer.h libc3/io.c libc3/io.h libc3/list.c libc3/list.h libc3/log.c libc3/log.h libc3/buf_inspect_s.h.in libc3/module.c libc3/str.c libc3/module.h libc3/buf_parse_u.c.in libc3/quote.c libc3/quote.h libc3/set.c.in libc3/set.h.in libc3/buf_inspect_s_base.h.in libc3/sha1.h libc3/set_cursor.c.in libc3/set_cursor.h.in libc3/buf_inspect.h libc3/set_item.c.in libc3/set_item.h.in libc3/sign.c libc3/sign.h libc3/skiplist.c.in libc3/skiplist.h.in libc3/type.h libc3/skiplist_node.c.in libc3/skiplist_node.h.in libc3/str.h libc3/ucd.c libc3/sym.h libc3/tuple.c libc3/tuple.h libc3/type.c libc3/ucd.h libc3/buf_parse_s.c.in libc3/buf_parse_s.h.in libc3/buf_inspect_s.c.in libc3/buf_parse_u.h.in libc3/buf_inspect_s_base.c.in libc3/buf_inspect_u.c.in libc3/buf_inspect_u.h.in libc3/buf_inspect_u_base.c.in libc3/buf_inspect_u_base.h.in libc3/tag.h libc3/tag.c libc3/fn_clause.h libc3/fn_clause.c libc3/c3_main.h test/buf_inspect_test.c test/bool_test.c test/buf_parse_test.c test/facts_test.c test/buf_file_test.c test/libc3_test.c test/list_test.c test/test.c test/test.h test/buf_parse_test_u8.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_test.c test/buf_parse_test_u64.c test/call_test.c test/facts_cursor_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_with_test.c test/hash_test.c test/ident_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/array_test.c test/tuple_test.c test/types_test.c ucd2c/ucd.h ucd2c/ucd2c.c '
diff --git a/test/buf_parse_test.c b/test/buf_parse_test.c
index e27a163..ad3c190 100644
--- a/test/buf_parse_test.c
+++ b/test/buf_parse_test.c
@@ -185,12 +185,11 @@
#define BUF_PARSE_TEST_FN(test) \
do { \
s_buf buf; \
- s_fn *dest = NULL; \
+ s_fn dest; \
test_context("buf_parse_fn(" # test ")"); \
buf_init_1(&buf, (test)); \
TEST_EQ(buf_parse_fn(&buf, &dest), strlen(test)); \
- TEST_ASSERT(dest); \
- fn_delete_all(dest); \
+ fn_clean(&dest); \
buf_clean(&buf); \
test_context(NULL); \
} while (0)
diff --git a/test/configure b/test/configure
index 5ad3968..db2b3c8 100755
--- a/test/configure
+++ b/test/configure
@@ -43,9 +43,6 @@ CPPFLAGS="${CPPFLAGS:=}"
ENV_CFLAGS="${CFLAGS:=}"
DEFAULT_CFLAGS="-O2 -pipe"
LDFLAGS="${LDFLAGS}"
-if [ "x$CC" != "xtcc" ]; then
- LDFLAGS="-Wl,--allow-shlib-undefined ${LDFLAGS}"
-fi
LIBS="${LIBS:=} -lm"
# Common config for all targets
@@ -55,8 +52,8 @@ config_asan
config_gnu
pkg_config libbsd-overlay
pkg_config libmd
-config_lib libmd -lmd
-config_lib dl -ldl
+config_lib libmd -lmd 2>/dev/null
+config_lib dl -ldl 2>/dev/null
LIBS="$LIBS ../libffi/libffi.la -pthread"
# Asan config
@@ -82,7 +79,7 @@ if [ "x$ENV_CFLAGS" = "x" ]; then
CFLAGS="$CFLAGS $DEFAULT_CFLAGS"
fi
CFLAGS="$CFLAGS -DNDEBUG"
-LIBC3=../libc3/libc3.la
+LIBC3=../libc3/.libs/libc3.so
LIBS="$LIBC3 $LIBS"
echo "HAVE_ASAN = $HAVE_ASAN" >> ${CONFIG_MK}