diff --git a/.ic3_history b/.ic3_history
index b157a03..7921e2a 100644
--- a/.ic3_history
+++ b/.ic3_history
@@ -1,4 +1,3 @@
-Plop.a
defmodule Plop do def a = 1 end
Plop.a
Plop
@@ -97,3 +96,4 @@ Plop.m()
module()
List.reverse([1, 2, 3])
List.reverse([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
+(List) {1, 2}
diff --git a/README.md b/README.md
index b28ab1f..0784c4f 100644
--- a/README.md
+++ b/README.md
@@ -1,8 +1,5 @@
# C3 v0.1.11
-This is a development branch, please see
-[C3 v0.1.10](/c3-lang/c3/_tree/v0.1.10) for a stable release.
-
C3 is a programming language with meta-programmation and a graph
database embedded into the language. It aims to be the language
for semantic programming, and programming the semantic web.
@@ -435,6 +432,7 @@ Script interpreter. Works the same as ic3 but is not interactive.
## TODO
- libc3
+ - base-specific big floats
- macro cast `(Macro) fn (x) { x }`
- pretty printer
- indent
@@ -445,13 +443,13 @@ Script interpreter. Works the same as ic3 but is not interactive.
- has_ident
- collect_idents
- modules
- - defmodule
+ - DONE defmodule
- DONE def
- DONE def double = 4
- DONE def double = fn (x) do x * 2 end
- DONE def double = macro (x) do {x, x} end
- - DONE defoperator
- - defspecial_operator
+ - DONE def %C3.Operator{}
+ - def %C3.SpecialOperator{}
- defstruct
- facts
- negative facts : 4 + 2n = not 3 + 2n
diff --git a/doc/variable.md b/doc/variable.md
new file mode 100644
index 0000000..5d12c8d
--- /dev/null
+++ b/doc/variable.md
@@ -0,0 +1,68 @@
+# Variables
+
+Variables in C3 can be defined using the litteral value for a variable
+which is always `?`. You can cast this litteral value and it will not
+really be casted but it will give you a typed variable litteral value.
+E.g. `(List) ?`.
+The typed variable litteral value will only accept to be set once to
+one value of the variable's type (in this example the type of a linked
+list).
+
+It's actually a syntax so you cannot rename `?` by mistake and
+so is an easy task to do static analysis of variable creation.
+
+The default type for a variable which you can also specify explicitly
+is `Tag` which is an enum-tagged union type of any other C3 types
+currently defined in the environment. So `?` is exactly equivalent to
+`(Tag) ?` and they will both accept to be set once to one value of any
+type.
+
+Actually all variables are allocated as tags and in the end the typing
+is dynamic but it could be made static through JIT compilation of
+functions.
+
+A variable is settable once and cannot be changed afterwards (there is
+an exception if you write C code and link to it but it is not easy nor
+silent).
+
+This way you do not need to lock or trust any behaviour, once your
+variable is set to a value the value of the variable will never change,
+it really is read-only.
+
+
+## Init and C interoperatbility
+
+To set the value of a variable in the end you need to call a C function
+that should accept this C function definition :
+`quote cfn unquote(type) unquote("init_#{variable_type}#{init_suffix}") (Result, ...)`.
+There are many functions for this, here is a quick list :
+ - `tag_init_1` takes a C string as an argument and returns a value of
+ any type currently defined in the C3 environment.
+ - `#{type}_init_1` C functions take a C string as an argument and return
+ a value of type `type`.
+ - `tag_init_copy` takes a tag as an argument and returns a deep copy
+ of it.
+
+You can also use the assignment operator which is `<-` which in turn calls
+`tag_init_copy`. It works like the C assignment operator (`=`).
+
+Examples :
+```
+# Declare a unsigned byte 8 bits variable "x".
+x = (U8) ?
+# Set the variable "x" to zero.
+x <- 0
+# Allocate again for the same binding name "x"
+x = (U8) ?
+# Also set the new variable "x" to zero with just one Unicode symbol
+# that is AltGr+Y on my keyboard.
+x ← 0
+```
+
+
+## So how do I change anything if it is read-only ?
+
+You can always reset an existing binding at will to another variable
+litteral and another variable will be created for the same name and it
+will be in a different memory location, settable once and then
+read-only again so you can use it without locking.
diff --git a/lib/c3/0.1/array.c3 b/lib/c3/0.1/array.c3
new file mode 100644
index 0000000..d635438
--- /dev/null
+++ b/lib/c3/0.1/array.c3
@@ -0,0 +1,4 @@
+defmodule Array do
+
+ def cast = cfn Array "array_init_cast" (Result, Sym, Tag)
+end
diff --git a/lib/c3/0.1/c3/operator.facts b/lib/c3/0.1/c3/operator.facts
index 38e879f..7f878c8 100644
--- a/lib/c3/0.1/c3/operator.facts
+++ b/lib/c3/0.1/c3/operator.facts
@@ -1,4 +1,4 @@
%{module: C3.Facts.Dump,
version: 1}
replace {C3.Operator, :is_a, :module}
-replace {C3.Operator, :defstruct, [sym: :+, symbol_value: (Tag) ?, operator_precedence: 0, operator_associativity: :left]}
+replace {C3.Operator, :defstruct, [sym: :+, symbol_value: ?, operator_precedence: 0, operator_associativity: :left]}
diff --git a/lib/c3/0.1/cow.c3 b/lib/c3/0.1/cow.c3
new file mode 100644
index 0000000..ddcddf1
--- /dev/null
+++ b/lib/c3/0.1/cow.c3
@@ -0,0 +1,5 @@
+defmodule Cow do
+
+ def cast = cfn Cow "cow_init_cast" (Result, Tag)
+
+end
diff --git a/libc3/bool.c b/libc3/bool.c
index 3b5834e..6eea312 100644
--- a/libc3/bool.c
+++ b/libc3/bool.c
@@ -15,6 +15,7 @@
#include "buf.h"
#include "buf_inspect.h"
#include "complex.h"
+#include "cow.h"
#include "integer.h"
#include "io.h"
#include "ratio.h"
@@ -32,6 +33,7 @@ bool * bool_init_cast (bool *b, const s_sym * const *type,
case TAG_CHARACTER: *b = (bool) tag->data.character; return b;
case TAG_COMPLEX: *b = ! complex_is_zero(tag->data.complex);
return b;
+ case TAG_COW: return bool_init_cast(b, type, cow_rw(tag->data.cow));
case TAG_F32: *b = (bool) tag->data.f32; return b;
case TAG_F64: *b = (bool) tag->data.f64; return b;
case TAG_F128: *b = (bool) tag->data.f128; return b;
diff --git a/libc3/buf_inspect.c b/libc3/buf_inspect.c
index 7f7b568..3b08e8c 100644
--- a/libc3/buf_inspect.c
+++ b/libc3/buf_inspect.c
@@ -21,6 +21,7 @@
#include "buf_inspect.h"
#include "buf_save.h"
#include "character.h"
+#include "cow.h"
#include "data.h"
#include "ident.h"
#include "integer.h"
@@ -908,6 +909,37 @@ sw buf_inspect_complex_size (const s_complex *c)
return result;
}
+sw buf_inspect_cow (s_buf *buf, const s_cow *cow)
+{
+ sw r;
+ sw result = 0;
+ s_buf_save save;
+ buf_save_init(buf, &save);
+ if ((r = buf_write_1(buf, "cow ")) < 0)
+ goto restore;
+ if ((r = buf_inspect_tag(buf, cow_ro(cow))) < 0)
+ goto restore;
+ result += r;
+ r = result;
+ goto clean;
+ restore:
+ buf_save_restore_wpos(buf, &save);
+ clean:
+ buf_save_clean(buf, &save);
+ return r;
+}
+
+sw buf_inspect_cow_size (const s_cow *cow)
+{
+ sw r;
+ sw result;
+ result = strlen("cow ");
+ if ((r = buf_inspect_tag_size(cow_ro(cow))) < 0)
+ return r;
+ result += r;
+ return result;
+}
+
sw buf_inspect_f32 (s_buf *buf, const f32 *f)
{
s32 exp;
@@ -2410,6 +2442,7 @@ sw buf_inspect_tag (s_buf *buf, const s_tag *tag)
case TAG_CHARACTER:
return buf_inspect_character(buf, &tag->data.character);
case TAG_COMPLEX: return buf_inspect_complex(buf, tag->data.complex);
+ case TAG_COW: return buf_inspect_cow(buf, tag->data.cow);
case TAG_F32: return buf_inspect_f32(buf, &tag->data.f32);
case TAG_F64: return buf_inspect_f64(buf, &tag->data.f64);
case TAG_F128: return buf_inspect_f128(buf, &tag->data.f128);
@@ -2463,6 +2496,7 @@ sw buf_inspect_tag_size (const s_tag *tag)
case TAG_CHARACTER:
return buf_inspect_character_size(&tag->data.character);
case TAG_COMPLEX: return buf_inspect_complex_size(tag->data.complex);
+ case TAG_COW: return buf_inspect_cow_size(tag->data.cow);
case TAG_F32: return buf_inspect_f32_size(&tag->data.f32);
case TAG_F64: return buf_inspect_f64_size(&tag->data.f64);
case TAG_F128: return buf_inspect_f128_size(&tag->data.f128);
diff --git a/libc3/buf_inspect.h b/libc3/buf_inspect.h
index f2db3d0..4a9b36c 100644
--- a/libc3/buf_inspect.h
+++ b/libc3/buf_inspect.h
@@ -84,6 +84,8 @@ sw buf_inspect_character (s_buf *buf, const character *c);
sw buf_inspect_character_size (const character *c);
sw buf_inspect_complex (s_buf *buf, const s_complex *c);
sw buf_inspect_complex_size (const s_complex *c);
+sw buf_inspect_cow (s_buf *buf, const s_cow *cow);
+sw buf_inspect_cow_size (const s_cow *cow);
sw buf_inspect_error_handler (s_buf *buf,
const s_error_handler *error_handler);
sw buf_inspect_f32 (s_buf *buf, const f32 *x);
diff --git a/libc3/compare.c b/libc3/compare.c
index 35f17a0..16a2eea 100644
--- a/libc3/compare.c
+++ b/libc3/compare.c
@@ -148,6 +148,16 @@ s8 compare_complex (const s_complex *a, const s_complex *b)
return r;
}
+u8 compare_cow (const s_cow *a, const s_cow *b)
+{
+ u8 r;
+ if ((r = compare_tag(&a->r, &b->r)) ||
+ (r = compare_bool(a->w_is_set, b->w_is_set)) ||
+ (r = compare_tag(&a->w, &b->w)))
+ return r;
+ return 0;
+}
+
COMPARE_DEF(f32)
COMPARE_DEF(f64)
COMPARE_DEF(f128)
@@ -972,6 +982,7 @@ s8 compare_tag (const s_tag *a, const s_tag *b) {
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_COW: return compare_cow(a->data.cow, b->data.cow);
case TAG_FACT: return compare_fact(&a->data.fact,
&b->data.fact);
case TAG_FN: return compare_fn(&a->data.fn, &b->data.fn);
diff --git a/libc3/complex.c b/libc3/complex.c
index 90808a0..6ed242c 100644
--- a/libc3/complex.c
+++ b/libc3/complex.c
@@ -158,16 +158,14 @@ s_complex * complex_init_cast (s_complex *c, const s_sym * const *type,
}
err_write_1("complex_init_cast: cannot cast ");
err_write_1(tag_type_to_string(src->type));
- if (*type == &g_sym_F64)
- err_puts(" to F64");
+ if (*type == &g_sym_Complex)
+ err_puts(" to Complex");
else {
err_write_1(" to ");
err_inspect_sym(type);
- err_puts(" aka F64");
+ err_puts(" aka Complex");
}
- assert(! "f64_init_cast: cannot cast to F64");
- err_puts("complex_init_cast: invalid tag type");
- assert(! "complex_init_cast: invalid tag type");
+ assert(! "complex_init_cast: cannot cast to Complex");
return NULL;
}
@@ -245,16 +243,15 @@ s_complex * complex_new_add (const s_complex *a, const s_complex *b)
return c;
}
-s_complex * complex_new_cast (const s_tag *src)
+s_complex * complex_new_cast (const s_sym * const *type,
+ const s_tag *src)
{
s_complex *c;
- const s_sym *type;
assert(src);
c = alloc(sizeof(s_complex));
if (! c)
return NULL;
- type = &g_sym_Complex;
- if (! complex_init_cast(c, &type, src)) {
+ if (! complex_init_cast(c, type, src)) {
free(c);
return NULL;
}
diff --git a/libc3/complex.h b/libc3/complex.h
index 0c9ce3a..9a89ebf 100644
--- a/libc3/complex.h
+++ b/libc3/complex.h
@@ -56,7 +56,8 @@ s_complex * complex_sub (const s_complex *a, const s_complex *b,
void complex_delete (s_complex *c);
s_complex * complex_new (void);
s_complex * complex_new_add (const s_complex *a, const s_complex *b);
-s_complex * complex_new_cast (const s_tag *src);
+s_complex * complex_new_cast (const s_sym * const *type,
+ const s_tag *src);
s_complex * complex_new_div (const s_complex *a, const s_complex *b);
s_complex * complex_new_mul (const s_complex *a, const s_complex *b);
s_complex * complex_new_sub (const s_complex *a, const s_complex *b);
diff --git a/libc3/cow.c b/libc3/cow.c
new file mode 100644
index 0000000..f66edb6
--- /dev/null
+++ b/libc3/cow.c
@@ -0,0 +1,193 @@
+/* c3
+ * Copyright 2022-2024 kmx.io <contact@kmx.io>
+ *
+ * Permission is hereby granted to use this software granted the above
+ * copyright notice and this permission paragraph are included in all
+ * copies and substantial portions of this software.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+ * PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+ * AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+#include "assert.h"
+#include "alloc.h"
+#include "cow.h"
+#include "tag.h"
+
+void cow_clean (s_cow *cow)
+{
+ assert(cow);
+ tag_clean(&cow->r);
+ tag_clean(&cow->w);
+}
+
+void cow_delete (s_cow *cow)
+{
+ assert(cow);
+ cow_clean(cow);
+ free(cow);
+}
+
+s_cow * cow_freeze (s_cow *cow)
+{
+ assert(cow);
+ if (cow->w_is_set) {
+ tag_clean(&cow->r);
+ tag_init_copy(&cow->r, &cow->w);
+ cow->w_is_set = false;
+ tag_clean(&cow->w);
+ }
+ return cow;
+}
+
+s_cow * cow_freeze_tag (s_cow *cow, const s_tag *src)
+{
+ assert(cow);
+ assert(src);
+ cow->w_is_set = false;
+ tag_clean(&cow->w);
+ tag_clean(&cow->r);
+ if (! tag_init_copy(&cow->r, src))
+ return NULL;
+ return cow;
+}
+
+s_cow * cow_init (s_cow *cow)
+{
+ s_cow tmp = {0};
+ assert(cow);
+ *cow = tmp;
+ return cow;
+}
+
+s_cow * cow_init_1 (s_cow *cow, const char *utf8)
+{
+ assert(cow);
+ assert(utf8);
+ (void) cow;
+ (void) utf8;
+ err_puts("cow_init_1: FIXME: not implemented");
+ assert(! "cow_init_1: FIXME: not implemented");
+ return NULL;
+}
+
+s_cow * cow_init_cast (s_cow *cow, const s_sym * const *type,
+ const s_tag *tag)
+{
+ assert(cow);
+ assert(type);
+ assert(tag);
+ (void) type;
+ if (tag->type == TAG_COW)
+ return cow_init_copy(cow, tag->data.cow);
+ return cow_freeze_tag(cow, tag);
+}
+
+s_cow * cow_init_copy (s_cow *cow, const s_cow *src)
+{
+ assert(cow);
+ assert(src);
+ if (! tag_init_copy(&cow->r, &src->r) ||
+ ! tag_init_copy(&cow->w, &src->w))
+ return NULL;
+ return cow;
+}
+
+s_cow * cow_init_tag_copy (s_cow *cow, const s_tag *src)
+{
+ s_cow tmp = {0};
+ assert(cow);
+ assert(src);
+ if (! tag_init_copy(&tmp.r, src))
+ return NULL;
+ *cow = tmp;
+ return cow;
+}
+
+s_str * cow_inspect (const s_cow *cow, s_str *dest)
+{
+ assert(cow);
+ assert(dest);
+ (void) cow;
+ (void) dest;
+ err_puts("cow_inspect: FIXME: not implemented");
+ assert(! "cow_inspect: FIXME: not implemented");
+ return NULL;
+}
+
+s_cow * cow_new (void)
+{
+ s_cow *cow;
+ cow = alloc(sizeof(s_cow));
+ if (! cow)
+ return NULL;
+ cow_init(cow);
+ return cow;
+}
+
+s_cow * cow_new_cast (const s_sym * const *type, const s_tag *tag)
+{
+ s_cow *cow;
+ assert(type);
+ assert(tag);
+ cow = alloc(sizeof(s_cow));
+ if (! cow)
+ return NULL;
+ if (! cow_init_cast(cow, type, tag)) {
+ free(cow);
+ return NULL;
+ }
+ return cow;
+}
+
+s_cow * cow_new_copy (const s_cow *src)
+{
+ s_cow *cow;
+ assert(src);
+ cow = alloc(sizeof(s_cow));
+ if (! cow)
+ return NULL;
+ if (! cow_init_copy(cow, src)) {
+ free(cow);
+ return NULL;
+ }
+ return cow;
+}
+
+const s_tag * cow_ro (const s_cow *cow)
+{
+ assert(cow);
+ if (cow->w_is_set)
+ return &cow->w;
+ return &cow->r;
+}
+
+s_tag * cow_rw (s_cow *cow)
+{
+ if (! cow->w_is_set &&
+ ! cow_thaw(cow))
+ return NULL;
+ return &cow->w;
+}
+
+s_cow * cow_thaw (s_cow *cow)
+{
+ assert(cow);
+ tag_clean(&cow->w);
+ if (! tag_init_copy(&cow->w, &cow->r))
+ return NULL;
+ cow->w_is_set = true;
+ return cow;
+}
+
+s_cow * cow_thaw_tag (s_cow *cow, const s_tag *src)
+{
+ assert(cow);
+ assert(src);
+ tag_clean(&cow->w);
+ if (! tag_init_copy(&cow->w, src))
+ return NULL;
+ cow->w_is_set = true;
+ return cow;
+}
diff --git a/libc3/cow.h b/libc3/cow.h
new file mode 100644
index 0000000..173b9ba
--- /dev/null
+++ b/libc3/cow.h
@@ -0,0 +1,58 @@
+/* c3
+ * Copyright 2022-2024 kmx.io <contact@kmx.io>
+ *
+ * Permission is hereby granted to use this software granted the above
+ * copyright notice and this permission paragraph are included in all
+ * copies and substantial portions of this software.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+ * PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+ * AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+/**
+ * @file cow.h
+ * @brief Copy on write is a software technique that allows you to have
+ * read-only access to some memory but still be able to modify it. The
+ * read-only data is copied to newly allocated memory when modified.
+ *
+ * You can cow_freeze the writable version into read-only memory which
+ * cleans the previous read-only value and you must be sure to not
+ * access it anymore.
+ *
+ * Call cow_thaw to restore the writable memory to a copy of the
+ * read-only version.
+ *
+ * Call cow_rw to get a writable s_tag pointer.
+ */
+#ifndef LIBC3_COW_H
+#define LIBC3_COW_H
+
+#include "types.h"
+
+/* Stack-allocation compatible functions. Call cow_clean after use. */
+void cow_clean (s_cow *cow);
+s_cow * cow_init (s_cow *cow);
+s_cow * cow_init_1 (s_cow *cow, const char *utf8);
+s_cow * cow_init_cast (s_cow *cow, const s_sym * const *type,
+ const s_tag *tag);
+s_cow * cow_init_copy (s_cow *cow, const s_cow *src);
+s_cow * cow_init_tag_copy (s_cow *cow, const s_tag *src);
+
+/* Heap-allocation functions. Call cow_delete after use. */
+void cow_delete (s_cow *cow);
+s_cow * cow_new (void);
+s_cow * cow_new_cast (const s_sym * const *type, const s_tag *tag);
+s_cow * cow_new_copy (const s_cow *src);
+
+/* Observers. */
+s_str * cow_inspect (const s_cow *cow, s_str *dest);
+const s_tag * cow_ro (const s_cow *cow);
+
+/* Operators. */
+s_cow * cow_freeze (s_cow *cow);
+s_cow * cow_freeze_copy (s_cow *cow, const s_tag *src);
+s_tag * cow_rw (s_cow *cow);
+s_cow * cow_thaw (s_cow *cow);
+
+#endif /* LIBC3_COW_H */
diff --git a/libc3/env.c b/libc3/env.c
index 3dfef2f..bdc1f5a 100644
--- a/libc3/env.c
+++ b/libc3/env.c
@@ -27,6 +27,7 @@
#include "cfn.h"
#include "compare.h"
#include "complex.h"
+#include "cow.h"
#include "data.h"
#include "env.h"
#include "error.h"
@@ -733,6 +734,10 @@ bool env_eval_equal_tag (s_env *env, bool macro, const s_tag *a,
tag_clean(&tmp_b);
return true;
}
+ while (a->type == TAG_COW)
+ a = cow_ro(a->data.cow);
+ while (b->type == TAG_COW)
+ b = cow_ro(b->data.cow);
switch (a->type) {
case TAG_COMPLEX:
case TAG_F32:
@@ -812,7 +817,6 @@ bool env_eval_equal_tag (s_env *env, bool macro, const s_tag *a,
case TAG_FACT:
case TAG_FN:
case TAG_IDENT:
- case TAG_INTEGER:
case TAG_PTAG:
case TAG_PTR:
case TAG_PTR_FREE:
@@ -828,7 +832,24 @@ bool env_eval_equal_tag (s_env *env, bool macro, const s_tag *a,
}
tag_init_copy(dest, a);
return true;
- default:
+ case TAG_COMPLEX:
+ case TAG_COW:
+ case TAG_F32:
+ case TAG_F64:
+ case TAG_F128:
+ case TAG_INTEGER:
+ case TAG_RATIO:
+ case TAG_S8:
+ case TAG_S16:
+ case TAG_S32:
+ case TAG_S64:
+ case TAG_SW:
+ case TAG_U8:
+ case TAG_U16:
+ case TAG_U32:
+ case TAG_U64:
+ case TAG_UNQUOTE:
+ case TAG_UW:
break;
}
error("env_eval_equal_tag: invalid tag");
@@ -1408,6 +1429,8 @@ bool env_eval_quote_complex (s_env *env, const s_complex *c,
assert(dest);
tmp.type = TAG_COMPLEX;
tmp.data.complex = complex_new();
+ if (! tmp.data.complex)
+ return false;
if (! env_eval_quote_tag(env, &c->x, &tmp.data.complex->x) ||
! env_eval_quote_tag(env, &c->y, &tmp.data.complex->y)) {
complex_delete(tmp.data.complex);
@@ -1417,6 +1440,25 @@ bool env_eval_quote_complex (s_env *env, const s_complex *c,
return true;
}
+bool env_eval_quote_cow (s_env *env, const s_cow *cow,
+ s_tag *dest)
+{
+ s_tag tmp = {0};
+ assert(env);
+ assert(cow);
+ assert(dest);
+ tmp.type = TAG_COW;
+ tmp.data.cow = cow_new();
+ if (! tmp.data.cow)
+ return false;
+ if (! env_eval_quote_tag(env, cow_ro(cow), &tmp.data.cow->r)) {
+ cow_delete(tmp.data.cow);
+ return false;
+ }
+ *dest = tmp;
+ return true;
+}
+
bool env_eval_quote_list (s_env *env, const s_list *list, s_tag *dest)
{
s_list *next;
@@ -1536,6 +1578,8 @@ bool env_eval_quote_tag (s_env *env, const s_tag *tag, s_tag *dest)
return env_eval_quote_call(env, &tag->data.call, dest);
case TAG_COMPLEX:
return env_eval_quote_complex(env, tag->data.complex, dest);
+ case TAG_COW:
+ return env_eval_quote_cow(env, tag->data.cow, dest);
case TAG_LIST:
return env_eval_quote_list(env, tag->data.list, dest);
case TAG_MAP:
@@ -1730,6 +1774,8 @@ bool env_eval_tag (s_env *env, const s_tag *tag, s_tag *dest)
return env_eval_call(env, &tag->data.call, dest);
case TAG_COMPLEX:
return env_eval_complex(env, tag->data.complex, dest);
+ case TAG_COW:
+ return env_eval_tag(env, cow_ro(tag->data.cow), dest);
case TAG_FN:
return env_eval_fn(env, &tag->data.fn, dest);
case TAG_IDENT:
diff --git a/libc3/env.h b/libc3/env.h
index ea96846..53ea7ca 100644
--- a/libc3/env.h
+++ b/libc3/env.h
@@ -133,6 +133,8 @@ bool env_eval_quote_call (s_env *env, const s_call *call,
s_tag *dest);
bool env_eval_quote_complex (s_env *env, const s_complex *c,
s_tag *dest);
+bool env_eval_quote_cow (s_env *env, const s_cow *cow,
+ s_tag *dest);
bool env_eval_quote_list (s_env *env, const s_list *list,
s_tag *dest);
bool env_eval_quote_map (s_env *env, const s_map *map,
diff --git a/libc3/hash.c b/libc3/hash.c
index 94592e1..d699047 100644
--- a/libc3/hash.c
+++ b/libc3/hash.c
@@ -175,6 +175,19 @@ bool hash_update_complex (t_hash *hash, const s_complex *c)
return true;
}
+bool hash_update_cow (t_hash *hash, const s_cow *cow)
+{
+ const s8 type[] = "cow";
+ assert(hash);
+ assert(cow);
+ if (! hash_update(hash, type, sizeof(type)) ||
+ ! hash_update_tag(hash, &cow->r) ||
+ ! hash_update_bool(hash, &cow->w_is_set) ||
+ ! hash_update_tag(hash, &cow->w))
+ return false;
+ return true;
+}
+
HASH_UPDATE_DEF(f32)
HASH_UPDATE_DEF(f64)
HASH_UPDATE_DEF(f128)
@@ -466,6 +479,7 @@ bool hash_update_tag (t_hash *hash, const s_tag *tag)
case TAG_CHARACTER:
return hash_update_character(hash, &tag->data.character);
case TAG_COMPLEX: return hash_update_complex(hash, tag->data.complex);
+ case TAG_COW: return hash_update_cow(hash, tag->data.cow);
case TAG_F32: return hash_update_f32(hash, &tag->data.f32);
case TAG_F64: return hash_update_f64(hash, &tag->data.f64);
case TAG_F128: return hash_update_f128(hash, &tag->data.f128);
diff --git a/libc3/hash.h b/libc3/hash.h
index 1e189ef..97ce023 100644
--- a/libc3/hash.h
+++ b/libc3/hash.h
@@ -32,6 +32,7 @@ bool hash_update_cfn (t_hash *hash, const s_cfn *cfn);
HASH_UPDATE_PROTOTYPE(char);
HASH_UPDATE_PROTOTYPE(character);
bool hash_update_complex (t_hash *hash, const s_complex *c);
+bool hash_update_cow (t_hash *hash, const s_cow *cow);
HASH_UPDATE_PROTOTYPE(f32);
HASH_UPDATE_PROTOTYPE(f64);
HASH_UPDATE_PROTOTYPE(f128);
diff --git a/libc3/pcomplex.c b/libc3/pcomplex.c
index f677199..94aa326 100644
--- a/libc3/pcomplex.c
+++ b/libc3/pcomplex.c
@@ -31,12 +31,15 @@ s_complex ** pcomplex_init (s_complex **p)
return p;
}
-s_complex ** pcomplex_init_cast (s_complex **p, const s_tag *src)
+s_complex ** pcomplex_init_cast (s_complex **p,
+ const s_sym * const *type,
+ const s_tag *src)
{
s_complex *tmp = NULL;
assert(p);
+ assert(type);
assert(src);
- tmp = complex_new_cast(src);
+ tmp = complex_new_cast(type, src);
if (! tmp)
return NULL;
*p = tmp;
diff --git a/libc3/pcomplex.h b/libc3/pcomplex.h
index 9797078..2475926 100644
--- a/libc3/pcomplex.h
+++ b/libc3/pcomplex.h
@@ -19,8 +19,10 @@
after use. */
void pcomplex_clean (s_complex **p);
s_complex ** pcomplex_init (s_complex **p);
-s_complex ** pcomplex_init_cast (s_complex **p, const s_tag *src);
+s_complex ** pcomplex_init_cast (s_complex **p,
+ const s_sym * const *type,
+ const s_tag *src);
s_complex ** pcomplex_init_copy (s_complex **p,
const s_complex * const *src);
-#endif /* LIBC3_COMPLEX_H */
+#endif /* LIBC3_PCOMPLEX_H */
diff --git a/libc3/pcow.c b/libc3/pcow.c
new file mode 100644
index 0000000..0ea48b7
--- /dev/null
+++ b/libc3/pcow.c
@@ -0,0 +1,58 @@
+/* c3
+ * Copyright 2022-2024 kmx.io <contact@kmx.io>
+ *
+ * Permission is hereby granted to use this software granted the above
+ * copyright notice and this permission paragraph are included in all
+ * copies and substantial portions of this software.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+ * PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+ * AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+#include "assert.h"
+#include "cow.h"
+#include "pcow.h"
+
+void pcow_clean (s_cow **p)
+{
+ assert(p);
+ cow_delete(*p);
+}
+
+s_cow ** pcow_init (s_cow **p)
+{
+ s_cow *tmp = NULL;
+ assert(p);
+ tmp = cow_new();
+ if (! tmp)
+ return NULL;
+ *p = tmp;
+ return p;
+}
+
+s_cow ** pcow_init_cast (s_cow **p, const s_sym * const *type,
+ const s_tag *src)
+{
+ s_cow *tmp = NULL;
+ assert(p);
+ assert(src);
+ tmp = cow_new_cast(type, src);
+ if (! tmp)
+ return NULL;
+ *p = tmp;
+ return p;
+}
+
+s_cow ** pcow_init_copy (s_cow **p,
+ const s_cow * const *src)
+{
+ s_cow *tmp = NULL;
+ assert(p);
+ assert(src);
+ tmp = cow_new_copy(*src);
+ if (! tmp)
+ return NULL;
+ *p = tmp;
+ return p;
+}
diff --git a/libc3/pcow.h b/libc3/pcow.h
new file mode 100644
index 0000000..0b722a9
--- /dev/null
+++ b/libc3/pcow.h
@@ -0,0 +1,26 @@
+/* c3
+ * Copyright 2022-2024 kmx.io <contact@kmx.io>
+ *
+ * Permission is hereby granted to use this software granted the above
+ * copyright notice and this permission paragraph are included in all
+ * copies and substantial portions of this software.
+ *
+ * THIS SOFTWARE IS PROVIDED "AS-IS" WITHOUT ANY GUARANTEE OF
+ * PURPOSE AND PERFORMANCE. IN NO EVENT WHATSOEVER SHALL THE
+ * AUTHOR BE CONSIDERED LIABLE FOR THE USE AND PERFORMANCE OF
+ * THIS SOFTWARE.
+ */
+#ifndef LIBC3_PCOW_H
+#define LIBC3_PCOW_H
+
+#include "types.h"
+
+/* Stack-allocation compatible functions, call pcow_clean after use. */
+void pcow_clean (s_cow **p);
+s_cow ** pcow_init (s_cow **p);
+s_cow ** pcow_init_cast (s_cow **p, const s_sym * const *type,
+ const s_tag *src);
+s_cow ** pcow_init_copy (s_cow **p,
+ const s_cow * const *src);
+
+#endif /* LIBC3_PCOW_H */
diff --git a/libc3/sources.mk b/libc3/sources.mk
index 5acbc25..ec01e8e 100644
--- a/libc3/sources.mk
+++ b/libc3/sources.mk
@@ -84,6 +84,7 @@ HEADERS = \
"compare.h" \
"complex.h" \
"config.h" \
+ "cow.h" \
"data.h" \
"env.h" \
"error.h" \
@@ -116,6 +117,7 @@ HEADERS = \
"module.h" \
"operator.h" \
"pcomplex.h" \
+ "pcow.h" \
"ptag.h" \
"ptr.h" \
"ptr_free.h" \
@@ -241,6 +243,7 @@ SOURCES = \
"character.c" \
"compare.c" \
"complex.c" \
+ "cow.c" \
"data.c" \
"env.c" \
"error.c" \
@@ -273,6 +276,7 @@ SOURCES = \
"module.c" \
"operator.c" \
"pcomplex.c" \
+ "pcow.c" \
"ptag.c" \
"ptr.c" \
"ptr_free.c" \
@@ -507,6 +511,7 @@ LO_SOURCES = \
"character.c" \
"compare.c" \
"complex.c" \
+ "cow.c" \
"data.c" \
"env.c" \
"error.c" \
@@ -539,6 +544,7 @@ LO_SOURCES = \
"module.c" \
"operator.c" \
"pcomplex.c" \
+ "pcow.c" \
"ptag.c" \
"ptr.c" \
"ptr_free.c" \
diff --git a/libc3/sources.sh b/libc3/sources.sh
index 4c72635..a72c7e7 100644
--- a/libc3/sources.sh
+++ b/libc3/sources.sh
@@ -1,4 +1,4 @@
# sources.sh generated by update_sources
-HEADERS='abs.h alloc.h arg.h array.h assert.h binding.h block.h bool.h buf.h buf_file.h buf_getc.h buf_getchar.h buf_inspect.h buf_inspect_s16.h buf_inspect_s16_binary.h buf_inspect_s16_decimal.h buf_inspect_s16_hexadecimal.h buf_inspect_s16_octal.h buf_inspect_s32.h buf_inspect_s32_binary.h buf_inspect_s32_decimal.h buf_inspect_s32_hexadecimal.h buf_inspect_s32_octal.h buf_inspect_s64.h buf_inspect_s64_binary.h buf_inspect_s64_decimal.h buf_inspect_s64_hexadecimal.h buf_inspect_s64_octal.h buf_inspect_s8.h buf_inspect_s8_binary.h buf_inspect_s8_decimal.h buf_inspect_s8_hexadecimal.h buf_inspect_s8_octal.h buf_inspect_sw.h buf_inspect_sw_binary.h buf_inspect_sw_decimal.h buf_inspect_sw_hexadecimal.h buf_inspect_sw_octal.h buf_inspect_u16.h buf_inspect_u16_binary.h buf_inspect_u16_decimal.h buf_inspect_u16_hexadecimal.h buf_inspect_u16_octal.h buf_inspect_u32.h buf_inspect_u32_binary.h buf_inspect_u32_decimal.h buf_inspect_u32_hexadecimal.h buf_inspect_u32_octal.h buf_inspect_u64.h buf_inspect_u64_binary.h buf_inspect_u64_decimal.h buf_inspect_u64_hexadecimal.h buf_inspect_u64_octal.h buf_inspect_u8.h buf_inspect_u8_binary.h buf_inspect_u8_decimal.h buf_inspect_u8_hexadecimal.h buf_inspect_u8_octal.h buf_inspect_uw.h buf_inspect_uw_binary.h buf_inspect_uw_decimal.h buf_inspect_uw_hexadecimal.h buf_inspect_uw_octal.h buf_parse.h buf_parse_s16.h buf_parse_s32.h buf_parse_s64.h buf_parse_s8.h buf_parse_sw.h buf_parse_u16.h buf_parse_u32.h buf_parse_u64.h buf_parse_u8.h buf_parse_uw.h buf_save.h c3.h c3_main.h call.h ceiling.h cfn.h character.h compare.h complex.h config.h data.h env.h error.h error_handler.h eval.h f128.h f32.h f64.h fact.h fact_list.h facts.h facts_cursor.h facts_spec.h facts_spec_cursor.h facts_with.h facts_with_cursor.h file.h float.h fn.h fn_clause.h frame.h hash.h ident.h integer.h io.h list.h list_init.h log.h map.h module.h operator.h pcomplex.h ptag.h ptr.h ptr_free.h queue.h quote.h ratio.h s16.h s32.h s64.h s8.h sequence.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 special_operator.h str.h struct.h struct_type.h sw.h sym.h tag.h tag_init.h tag_type.h time.h tuple.h types.h u16.h u32.h u64.h u8.h ucd.h unquote.h uw.h var.h void.h '
-SOURCES='abs.c alloc.c arg.c array.c binding.c block.c bool.c buf.c buf_file.c buf_getc.c buf_getchar.c buf_inspect.c buf_inspect_s16.c buf_inspect_s16_binary.c buf_inspect_s16_decimal.c buf_inspect_s16_hexadecimal.c buf_inspect_s16_octal.c buf_inspect_s32.c buf_inspect_s32_binary.c buf_inspect_s32_decimal.c buf_inspect_s32_hexadecimal.c buf_inspect_s32_octal.c buf_inspect_s64.c buf_inspect_s64_binary.c buf_inspect_s64_decimal.c buf_inspect_s64_hexadecimal.c buf_inspect_s64_octal.c buf_inspect_s8.c buf_inspect_s8_binary.c buf_inspect_s8_decimal.c buf_inspect_s8_hexadecimal.c buf_inspect_s8_octal.c buf_inspect_sw.c buf_inspect_sw_binary.c buf_inspect_sw_decimal.c buf_inspect_sw_hexadecimal.c buf_inspect_sw_octal.c buf_inspect_u16.c buf_inspect_u16_binary.c buf_inspect_u16_decimal.c buf_inspect_u16_hexadecimal.c buf_inspect_u16_octal.c buf_inspect_u32.c buf_inspect_u32_binary.c buf_inspect_u32_decimal.c buf_inspect_u32_hexadecimal.c buf_inspect_u32_octal.c buf_inspect_u64.c buf_inspect_u64_binary.c buf_inspect_u64_decimal.c buf_inspect_u64_hexadecimal.c buf_inspect_u64_octal.c buf_inspect_u8.c buf_inspect_u8_binary.c buf_inspect_u8_decimal.c buf_inspect_u8_hexadecimal.c buf_inspect_u8_octal.c buf_inspect_uw.c buf_inspect_uw_binary.c buf_inspect_uw_decimal.c buf_inspect_uw_hexadecimal.c buf_inspect_uw_octal.c buf_parse.c buf_parse_s16.c buf_parse_s32.c buf_parse_s64.c buf_parse_s8.c buf_parse_sw.c buf_parse_u16.c buf_parse_u32.c buf_parse_u64.c buf_parse_u8.c buf_parse_uw.c buf_save.c c3.c call.c ceiling.c cfn.c character.c compare.c complex.c data.c env.c error.c error_handler.c eval.c f128.c f32.c f64.c fact.c fact_list.c facts.c facts_cursor.c facts_spec.c facts_spec_cursor.c facts_with.c facts_with_cursor.c file.c fn.c fn_clause.c frame.c hash.c ident.c integer.c io.c license.c list.c list_init.c log.c map.c module.c operator.c pcomplex.c ptag.c ptr.c ptr_free.c queue.c quote.c ratio.c s16.c s32.c s64.c s8.c sequence.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 special_operator.c str.c struct.c struct_type.c sw.c sym.c tag.c tag_add.c tag_addi.c tag_band.c tag_bnot.c tag_bor.c tag_bxor.c tag_div.c tag_init.c tag_mod.c tag_mul.c tag_neg.c tag_shift_left.c tag_shift_right.c tag_sqrt.c tag_sub.c tag_type.c time.c tuple.c u16.c u32.c u64.c u8.c ucd.c unquote.c uw.c var.c void.c '
-LO_SOURCES=' ../libtommath/bn_cutoffs.c ../libtommath/bn_mp_2expt.c ../libtommath/bn_mp_abs.c ../libtommath/bn_mp_add.c ../libtommath/bn_mp_add_d.c ../libtommath/bn_mp_and.c ../libtommath/bn_mp_clamp.c ../libtommath/bn_mp_clear.c ../libtommath/bn_mp_clear_multi.c ../libtommath/bn_mp_cmp.c ../libtommath/bn_mp_cmp_d.c ../libtommath/bn_mp_cmp_mag.c ../libtommath/bn_mp_cnt_lsb.c ../libtommath/bn_mp_complement.c ../libtommath/bn_mp_copy.c ../libtommath/bn_mp_count_bits.c ../libtommath/bn_mp_div.c ../libtommath/bn_mp_div_2.c ../libtommath/bn_mp_div_2d.c ../libtommath/bn_mp_div_3.c ../libtommath/bn_mp_div_d.c ../libtommath/bn_mp_dr_is_modulus.c ../libtommath/bn_mp_dr_reduce.c ../libtommath/bn_mp_dr_setup.c ../libtommath/bn_mp_error_to_string.c ../libtommath/bn_mp_exch.c ../libtommath/bn_mp_exptmod.c ../libtommath/bn_mp_gcd.c ../libtommath/bn_mp_get_double.c ../libtommath/bn_mp_get_i32.c ../libtommath/bn_mp_get_i64.c ../libtommath/bn_mp_get_mag_u32.c ../libtommath/bn_mp_get_mag_u64.c ../libtommath/bn_mp_grow.c ../libtommath/bn_mp_init.c ../libtommath/bn_mp_init_copy.c ../libtommath/bn_mp_init_multi.c ../libtommath/bn_mp_init_size.c ../libtommath/bn_mp_invmod.c ../libtommath/bn_mp_lcm.c ../libtommath/bn_mp_lshd.c ../libtommath/bn_mp_mod.c ../libtommath/bn_mp_mod_2d.c ../libtommath/bn_mp_montgomery_calc_normalization.c ../libtommath/bn_mp_montgomery_reduce.c ../libtommath/bn_mp_montgomery_setup.c ../libtommath/bn_mp_mul.c ../libtommath/bn_mp_mul_2.c ../libtommath/bn_mp_mul_2d.c ../libtommath/bn_mp_mul_d.c ../libtommath/bn_mp_mulmod.c ../libtommath/bn_mp_neg.c ../libtommath/bn_mp_or.c ../libtommath/bn_mp_radix_size.c ../libtommath/bn_mp_reduce.c ../libtommath/bn_mp_reduce_2k.c ../libtommath/bn_mp_reduce_2k_l.c ../libtommath/bn_mp_reduce_2k_setup.c ../libtommath/bn_mp_reduce_2k_setup_l.c ../libtommath/bn_mp_reduce_is_2k.c ../libtommath/bn_mp_reduce_is_2k_l.c ../libtommath/bn_mp_reduce_setup.c ../libtommath/bn_mp_rshd.c ../libtommath/bn_mp_set.c ../libtommath/bn_mp_set_double.c ../libtommath/bn_mp_set_i32.c ../libtommath/bn_mp_set_i64.c ../libtommath/bn_mp_set_l.c ../libtommath/bn_mp_set_u32.c ../libtommath/bn_mp_set_u64.c ../libtommath/bn_mp_set_ul.c ../libtommath/bn_mp_sqr.c ../libtommath/bn_mp_sqrt.c ../libtommath/bn_mp_sub.c ../libtommath/bn_mp_sub_d.c ../libtommath/bn_mp_xor.c ../libtommath/bn_mp_zero.c ../libtommath/bn_s_mp_add.c ../libtommath/bn_s_mp_balance_mul.c ../libtommath/bn_s_mp_exptmod.c ../libtommath/bn_s_mp_exptmod_fast.c ../libtommath/bn_s_mp_invmod_fast.c ../libtommath/bn_s_mp_invmod_slow.c ../libtommath/bn_s_mp_karatsuba_mul.c ../libtommath/bn_s_mp_karatsuba_sqr.c ../libtommath/bn_s_mp_montgomery_reduce_fast.c ../libtommath/bn_s_mp_mul_digs.c ../libtommath/bn_s_mp_mul_digs_fast.c ../libtommath/bn_s_mp_mul_high_digs.c ../libtommath/bn_s_mp_mul_high_digs_fast.c ../libtommath/bn_s_mp_rand_platform.c ../libtommath/bn_s_mp_sqr.c ../libtommath/bn_s_mp_sqr_fast.c ../libtommath/bn_s_mp_sub.c ../libtommath/bn_s_mp_toom_mul.c ../libtommath/bn_s_mp_toom_sqr.c abs.c alloc.c arg.c array.c binding.c block.c bool.c buf.c buf_file.c buf_getc.c buf_getchar.c buf_inspect.c buf_inspect_s16.c buf_inspect_s16_binary.c buf_inspect_s16_decimal.c buf_inspect_s16_hexadecimal.c buf_inspect_s16_octal.c buf_inspect_s32.c buf_inspect_s32_binary.c buf_inspect_s32_decimal.c buf_inspect_s32_hexadecimal.c buf_inspect_s32_octal.c buf_inspect_s64.c buf_inspect_s64_binary.c buf_inspect_s64_decimal.c buf_inspect_s64_hexadecimal.c buf_inspect_s64_octal.c buf_inspect_s8.c buf_inspect_s8_binary.c buf_inspect_s8_decimal.c buf_inspect_s8_hexadecimal.c buf_inspect_s8_octal.c buf_inspect_sw.c buf_inspect_sw_binary.c buf_inspect_sw_decimal.c buf_inspect_sw_hexadecimal.c buf_inspect_sw_octal.c buf_inspect_u16.c buf_inspect_u16_binary.c buf_inspect_u16_decimal.c buf_inspect_u16_hexadecimal.c buf_inspect_u16_octal.c buf_inspect_u32.c buf_inspect_u32_binary.c buf_inspect_u32_decimal.c buf_inspect_u32_hexadecimal.c buf_inspect_u32_octal.c buf_inspect_u64.c buf_inspect_u64_binary.c buf_inspect_u64_decimal.c buf_inspect_u64_hexadecimal.c buf_inspect_u64_octal.c buf_inspect_u8.c buf_inspect_u8_binary.c buf_inspect_u8_decimal.c buf_inspect_u8_hexadecimal.c buf_inspect_u8_octal.c buf_inspect_uw.c buf_inspect_uw_binary.c buf_inspect_uw_decimal.c buf_inspect_uw_hexadecimal.c buf_inspect_uw_octal.c buf_parse.c buf_parse_s16.c buf_parse_s32.c buf_parse_s64.c buf_parse_s8.c buf_parse_sw.c buf_parse_u16.c buf_parse_u32.c buf_parse_u64.c buf_parse_u8.c buf_parse_uw.c buf_save.c c3.c call.c ceiling.c cfn.c character.c compare.c complex.c data.c env.c error.c error_handler.c eval.c f128.c f32.c f64.c fact.c fact_list.c facts.c facts_cursor.c facts_spec.c facts_spec_cursor.c facts_with.c facts_with_cursor.c file.c fn.c fn_clause.c frame.c hash.c ident.c integer.c io.c license.c list.c list_init.c log.c map.c module.c operator.c pcomplex.c ptag.c ptr.c ptr_free.c queue.c quote.c ratio.c s16.c s32.c s64.c s8.c sequence.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 special_operator.c str.c struct.c struct_type.c sw.c sym.c tag.c tag_add.c tag_addi.c tag_band.c tag_bnot.c tag_bor.c tag_bxor.c tag_div.c tag_init.c tag_mod.c tag_mul.c tag_neg.c tag_shift_left.c tag_shift_right.c tag_sqrt.c tag_sub.c tag_type.c time.c tuple.c u16.c u32.c u64.c u8.c ucd.c unquote.c uw.c var.c void.c '
+HEADERS='abs.h alloc.h arg.h array.h assert.h binding.h block.h bool.h buf.h buf_file.h buf_getc.h buf_getchar.h buf_inspect.h buf_inspect_s16.h buf_inspect_s16_binary.h buf_inspect_s16_decimal.h buf_inspect_s16_hexadecimal.h buf_inspect_s16_octal.h buf_inspect_s32.h buf_inspect_s32_binary.h buf_inspect_s32_decimal.h buf_inspect_s32_hexadecimal.h buf_inspect_s32_octal.h buf_inspect_s64.h buf_inspect_s64_binary.h buf_inspect_s64_decimal.h buf_inspect_s64_hexadecimal.h buf_inspect_s64_octal.h buf_inspect_s8.h buf_inspect_s8_binary.h buf_inspect_s8_decimal.h buf_inspect_s8_hexadecimal.h buf_inspect_s8_octal.h buf_inspect_sw.h buf_inspect_sw_binary.h buf_inspect_sw_decimal.h buf_inspect_sw_hexadecimal.h buf_inspect_sw_octal.h buf_inspect_u16.h buf_inspect_u16_binary.h buf_inspect_u16_decimal.h buf_inspect_u16_hexadecimal.h buf_inspect_u16_octal.h buf_inspect_u32.h buf_inspect_u32_binary.h buf_inspect_u32_decimal.h buf_inspect_u32_hexadecimal.h buf_inspect_u32_octal.h buf_inspect_u64.h buf_inspect_u64_binary.h buf_inspect_u64_decimal.h buf_inspect_u64_hexadecimal.h buf_inspect_u64_octal.h buf_inspect_u8.h buf_inspect_u8_binary.h buf_inspect_u8_decimal.h buf_inspect_u8_hexadecimal.h buf_inspect_u8_octal.h buf_inspect_uw.h buf_inspect_uw_binary.h buf_inspect_uw_decimal.h buf_inspect_uw_hexadecimal.h buf_inspect_uw_octal.h buf_parse.h buf_parse_s16.h buf_parse_s32.h buf_parse_s64.h buf_parse_s8.h buf_parse_sw.h buf_parse_u16.h buf_parse_u32.h buf_parse_u64.h buf_parse_u8.h buf_parse_uw.h buf_save.h c3.h c3_main.h call.h ceiling.h cfn.h character.h compare.h complex.h config.h cow.h data.h env.h error.h error_handler.h eval.h f128.h f32.h f64.h fact.h fact_list.h facts.h facts_cursor.h facts_spec.h facts_spec_cursor.h facts_with.h facts_with_cursor.h file.h float.h fn.h fn_clause.h frame.h hash.h ident.h integer.h io.h list.h list_init.h log.h map.h module.h operator.h pcomplex.h pcow.h ptag.h ptr.h ptr_free.h queue.h quote.h ratio.h s16.h s32.h s64.h s8.h sequence.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 special_operator.h str.h struct.h struct_type.h sw.h sym.h tag.h tag_init.h tag_type.h time.h tuple.h types.h u16.h u32.h u64.h u8.h ucd.h unquote.h uw.h var.h void.h '
+SOURCES='abs.c alloc.c arg.c array.c binding.c block.c bool.c buf.c buf_file.c buf_getc.c buf_getchar.c buf_inspect.c buf_inspect_s16.c buf_inspect_s16_binary.c buf_inspect_s16_decimal.c buf_inspect_s16_hexadecimal.c buf_inspect_s16_octal.c buf_inspect_s32.c buf_inspect_s32_binary.c buf_inspect_s32_decimal.c buf_inspect_s32_hexadecimal.c buf_inspect_s32_octal.c buf_inspect_s64.c buf_inspect_s64_binary.c buf_inspect_s64_decimal.c buf_inspect_s64_hexadecimal.c buf_inspect_s64_octal.c buf_inspect_s8.c buf_inspect_s8_binary.c buf_inspect_s8_decimal.c buf_inspect_s8_hexadecimal.c buf_inspect_s8_octal.c buf_inspect_sw.c buf_inspect_sw_binary.c buf_inspect_sw_decimal.c buf_inspect_sw_hexadecimal.c buf_inspect_sw_octal.c buf_inspect_u16.c buf_inspect_u16_binary.c buf_inspect_u16_decimal.c buf_inspect_u16_hexadecimal.c buf_inspect_u16_octal.c buf_inspect_u32.c buf_inspect_u32_binary.c buf_inspect_u32_decimal.c buf_inspect_u32_hexadecimal.c buf_inspect_u32_octal.c buf_inspect_u64.c buf_inspect_u64_binary.c buf_inspect_u64_decimal.c buf_inspect_u64_hexadecimal.c buf_inspect_u64_octal.c buf_inspect_u8.c buf_inspect_u8_binary.c buf_inspect_u8_decimal.c buf_inspect_u8_hexadecimal.c buf_inspect_u8_octal.c buf_inspect_uw.c buf_inspect_uw_binary.c buf_inspect_uw_decimal.c buf_inspect_uw_hexadecimal.c buf_inspect_uw_octal.c buf_parse.c buf_parse_s16.c buf_parse_s32.c buf_parse_s64.c buf_parse_s8.c buf_parse_sw.c buf_parse_u16.c buf_parse_u32.c buf_parse_u64.c buf_parse_u8.c buf_parse_uw.c buf_save.c c3.c call.c ceiling.c cfn.c character.c compare.c complex.c cow.c data.c env.c error.c error_handler.c eval.c f128.c f32.c f64.c fact.c fact_list.c facts.c facts_cursor.c facts_spec.c facts_spec_cursor.c facts_with.c facts_with_cursor.c file.c fn.c fn_clause.c frame.c hash.c ident.c integer.c io.c license.c list.c list_init.c log.c map.c module.c operator.c pcomplex.c pcow.c ptag.c ptr.c ptr_free.c queue.c quote.c ratio.c s16.c s32.c s64.c s8.c sequence.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 special_operator.c str.c struct.c struct_type.c sw.c sym.c tag.c tag_add.c tag_addi.c tag_band.c tag_bnot.c tag_bor.c tag_bxor.c tag_div.c tag_init.c tag_mod.c tag_mul.c tag_neg.c tag_shift_left.c tag_shift_right.c tag_sqrt.c tag_sub.c tag_type.c time.c tuple.c u16.c u32.c u64.c u8.c ucd.c unquote.c uw.c var.c void.c '
+LO_SOURCES=' ../libtommath/bn_cutoffs.c ../libtommath/bn_mp_2expt.c ../libtommath/bn_mp_abs.c ../libtommath/bn_mp_add.c ../libtommath/bn_mp_add_d.c ../libtommath/bn_mp_and.c ../libtommath/bn_mp_clamp.c ../libtommath/bn_mp_clear.c ../libtommath/bn_mp_clear_multi.c ../libtommath/bn_mp_cmp.c ../libtommath/bn_mp_cmp_d.c ../libtommath/bn_mp_cmp_mag.c ../libtommath/bn_mp_cnt_lsb.c ../libtommath/bn_mp_complement.c ../libtommath/bn_mp_copy.c ../libtommath/bn_mp_count_bits.c ../libtommath/bn_mp_div.c ../libtommath/bn_mp_div_2.c ../libtommath/bn_mp_div_2d.c ../libtommath/bn_mp_div_3.c ../libtommath/bn_mp_div_d.c ../libtommath/bn_mp_dr_is_modulus.c ../libtommath/bn_mp_dr_reduce.c ../libtommath/bn_mp_dr_setup.c ../libtommath/bn_mp_error_to_string.c ../libtommath/bn_mp_exch.c ../libtommath/bn_mp_exptmod.c ../libtommath/bn_mp_gcd.c ../libtommath/bn_mp_get_double.c ../libtommath/bn_mp_get_i32.c ../libtommath/bn_mp_get_i64.c ../libtommath/bn_mp_get_mag_u32.c ../libtommath/bn_mp_get_mag_u64.c ../libtommath/bn_mp_grow.c ../libtommath/bn_mp_init.c ../libtommath/bn_mp_init_copy.c ../libtommath/bn_mp_init_multi.c ../libtommath/bn_mp_init_size.c ../libtommath/bn_mp_invmod.c ../libtommath/bn_mp_lcm.c ../libtommath/bn_mp_lshd.c ../libtommath/bn_mp_mod.c ../libtommath/bn_mp_mod_2d.c ../libtommath/bn_mp_montgomery_calc_normalization.c ../libtommath/bn_mp_montgomery_reduce.c ../libtommath/bn_mp_montgomery_setup.c ../libtommath/bn_mp_mul.c ../libtommath/bn_mp_mul_2.c ../libtommath/bn_mp_mul_2d.c ../libtommath/bn_mp_mul_d.c ../libtommath/bn_mp_mulmod.c ../libtommath/bn_mp_neg.c ../libtommath/bn_mp_or.c ../libtommath/bn_mp_radix_size.c ../libtommath/bn_mp_reduce.c ../libtommath/bn_mp_reduce_2k.c ../libtommath/bn_mp_reduce_2k_l.c ../libtommath/bn_mp_reduce_2k_setup.c ../libtommath/bn_mp_reduce_2k_setup_l.c ../libtommath/bn_mp_reduce_is_2k.c ../libtommath/bn_mp_reduce_is_2k_l.c ../libtommath/bn_mp_reduce_setup.c ../libtommath/bn_mp_rshd.c ../libtommath/bn_mp_set.c ../libtommath/bn_mp_set_double.c ../libtommath/bn_mp_set_i32.c ../libtommath/bn_mp_set_i64.c ../libtommath/bn_mp_set_l.c ../libtommath/bn_mp_set_u32.c ../libtommath/bn_mp_set_u64.c ../libtommath/bn_mp_set_ul.c ../libtommath/bn_mp_sqr.c ../libtommath/bn_mp_sqrt.c ../libtommath/bn_mp_sub.c ../libtommath/bn_mp_sub_d.c ../libtommath/bn_mp_xor.c ../libtommath/bn_mp_zero.c ../libtommath/bn_s_mp_add.c ../libtommath/bn_s_mp_balance_mul.c ../libtommath/bn_s_mp_exptmod.c ../libtommath/bn_s_mp_exptmod_fast.c ../libtommath/bn_s_mp_invmod_fast.c ../libtommath/bn_s_mp_invmod_slow.c ../libtommath/bn_s_mp_karatsuba_mul.c ../libtommath/bn_s_mp_karatsuba_sqr.c ../libtommath/bn_s_mp_montgomery_reduce_fast.c ../libtommath/bn_s_mp_mul_digs.c ../libtommath/bn_s_mp_mul_digs_fast.c ../libtommath/bn_s_mp_mul_high_digs.c ../libtommath/bn_s_mp_mul_high_digs_fast.c ../libtommath/bn_s_mp_rand_platform.c ../libtommath/bn_s_mp_sqr.c ../libtommath/bn_s_mp_sqr_fast.c ../libtommath/bn_s_mp_sub.c ../libtommath/bn_s_mp_toom_mul.c ../libtommath/bn_s_mp_toom_sqr.c abs.c alloc.c arg.c array.c binding.c block.c bool.c buf.c buf_file.c buf_getc.c buf_getchar.c buf_inspect.c buf_inspect_s16.c buf_inspect_s16_binary.c buf_inspect_s16_decimal.c buf_inspect_s16_hexadecimal.c buf_inspect_s16_octal.c buf_inspect_s32.c buf_inspect_s32_binary.c buf_inspect_s32_decimal.c buf_inspect_s32_hexadecimal.c buf_inspect_s32_octal.c buf_inspect_s64.c buf_inspect_s64_binary.c buf_inspect_s64_decimal.c buf_inspect_s64_hexadecimal.c buf_inspect_s64_octal.c buf_inspect_s8.c buf_inspect_s8_binary.c buf_inspect_s8_decimal.c buf_inspect_s8_hexadecimal.c buf_inspect_s8_octal.c buf_inspect_sw.c buf_inspect_sw_binary.c buf_inspect_sw_decimal.c buf_inspect_sw_hexadecimal.c buf_inspect_sw_octal.c buf_inspect_u16.c buf_inspect_u16_binary.c buf_inspect_u16_decimal.c buf_inspect_u16_hexadecimal.c buf_inspect_u16_octal.c buf_inspect_u32.c buf_inspect_u32_binary.c buf_inspect_u32_decimal.c buf_inspect_u32_hexadecimal.c buf_inspect_u32_octal.c buf_inspect_u64.c buf_inspect_u64_binary.c buf_inspect_u64_decimal.c buf_inspect_u64_hexadecimal.c buf_inspect_u64_octal.c buf_inspect_u8.c buf_inspect_u8_binary.c buf_inspect_u8_decimal.c buf_inspect_u8_hexadecimal.c buf_inspect_u8_octal.c buf_inspect_uw.c buf_inspect_uw_binary.c buf_inspect_uw_decimal.c buf_inspect_uw_hexadecimal.c buf_inspect_uw_octal.c buf_parse.c buf_parse_s16.c buf_parse_s32.c buf_parse_s64.c buf_parse_s8.c buf_parse_sw.c buf_parse_u16.c buf_parse_u32.c buf_parse_u64.c buf_parse_u8.c buf_parse_uw.c buf_save.c c3.c call.c ceiling.c cfn.c character.c compare.c complex.c cow.c data.c env.c error.c error_handler.c eval.c f128.c f32.c f64.c fact.c fact_list.c facts.c facts_cursor.c facts_spec.c facts_spec_cursor.c facts_with.c facts_with_cursor.c file.c fn.c fn_clause.c frame.c hash.c ident.c integer.c io.c license.c list.c list_init.c log.c map.c module.c operator.c pcomplex.c pcow.c ptag.c ptr.c ptr_free.c queue.c quote.c ratio.c s16.c s32.c s64.c s8.c sequence.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 special_operator.c str.c struct.c struct_type.c sw.c sym.c tag.c tag_add.c tag_addi.c tag_band.c tag_bnot.c tag_bor.c tag_bxor.c tag_div.c tag_init.c tag_mod.c tag_mul.c tag_neg.c tag_shift_left.c tag_shift_right.c tag_sqrt.c tag_sub.c tag_type.c time.c tuple.c u16.c u32.c u64.c u8.c ucd.c unquote.c uw.c var.c void.c '
diff --git a/libc3/sym.c b/libc3/sym.c
index e48e7d7..258d6bc 100644
--- a/libc3/sym.c
+++ b/libc3/sym.c
@@ -35,6 +35,7 @@ const s_sym g_sym_Cfn = {{{NULL}, 3, {"Cfn"}}};
const s_sym g_sym_Character = {{{NULL}, 9, {"Character"}}};
const s_sym g_sym_Char__star = {{{NULL}, 5, {"Char*"}}};
const s_sym g_sym_Complex = {{{NULL}, 7, {"Complex"}}};
+const s_sym g_sym_Cow = {{{NULL}, 3, {"Cow"}}};
const s_sym g_sym_F32 = {{{NULL}, 3, {"F32"}}};
const s_sym g_sym_F64 = {{{NULL}, 3, {"F64"}}};
const s_sym g_sym_F128 = {{{NULL}, 3, {"F128"}}};
@@ -307,6 +308,7 @@ void sym_init_g_sym (void)
sym_register(&g_sym_Character, NULL);
sym_register(&g_sym_Char__star, NULL);
sym_register(&g_sym_Complex, NULL);
+ sym_register(&g_sym_Cow, NULL);
sym_register(&g_sym_F32, NULL);
sym_register(&g_sym_F64, NULL);
sym_register(&g_sym_F128, NULL);
diff --git a/libc3/sym.h b/libc3/sym.h
index fbc8613..f3cd727 100644
--- a/libc3/sym.h
+++ b/libc3/sym.h
@@ -40,6 +40,7 @@ extern const s_sym g_sym_Cfn;
extern const s_sym g_sym_Character;
extern const s_sym g_sym_Char__star;
extern const s_sym g_sym_Complex;
+extern const s_sym g_sym_Cow;
extern const s_sym g_sym_F32;
extern const s_sym g_sym_F64;
extern const s_sym g_sym_F128;
diff --git a/libc3/tag.c b/libc3/tag.c
index 56f870a..2840dfc 100644
--- a/libc3/tag.c
+++ b/libc3/tag.c
@@ -21,6 +21,7 @@
#include "call.h"
#include "cfn.h"
#include "compare.h"
+#include "cow.h"
#include "env.h"
#include "fn.h"
#include "frame.h"
@@ -30,6 +31,7 @@
#include "list.h"
#include "map.h"
#include "pcomplex.h"
+#include "pcow.h"
#include "ptr.h"
#include "ptr_free.h"
#include "quote.h"
@@ -157,6 +159,7 @@ void tag_clean (s_tag *tag)
case TAG_CALL: call_clean(&tag->data.call); break;
case TAG_CFN: cfn_clean(&tag->data.cfn); break;
case TAG_COMPLEX: pcomplex_clean(&tag->data.complex); break;
+ case TAG_COW: pcow_clean(&tag->data.cow); 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;
@@ -370,6 +373,12 @@ s_tag * tag_init_copy (s_tag *tag, const s_tag *src)
&src->data.complex))
return NULL;
return tag;
+ case TAG_COW:
+ tag->type = src->type;
+ if (! pcow_init_copy(&tag->data.cow,
+ (const s_cow * const *) &src->data.cow))
+ return NULL;
+ return tag;
case TAG_FN:
tag->type = src->type;
if (! fn_init_copy(&tag->data.fn, &src->data.fn))
@@ -591,6 +600,8 @@ bool tag_is_bound_var (const s_tag *tag)
bool tag_is_number (const s_tag *tag)
{
assert(tag);
+ while (tag->type == TAG_COW)
+ tag = cow_ro(tag->data.cow);
switch (tag->type) {
case TAG_VOID:
case TAG_ARRAY:
@@ -633,6 +644,8 @@ bool tag_is_number (const s_tag *tag)
case TAG_U64:
case TAG_UW:
return true;
+ case TAG_COW:
+ break;
}
err_puts("tag_is_number: invalid tag type");
assert(! "tag_is_number: invalid tag type");
@@ -827,6 +840,7 @@ bool tag_to_const_pointer (const s_tag *tag, const s_sym *type,
case TAG_CFN: *dest = &tag->data.cfn; return true;
case TAG_CHARACTER: *dest = &tag->data.character; return true;
case TAG_COMPLEX: *dest = &tag->data.complex; return true;
+ case TAG_COW: *dest = &tag->data.cow; return true;
case TAG_F32: *dest = &tag->data.f32; return true;
case TAG_F64: *dest = &tag->data.f64; return true;
case TAG_F128: *dest = &tag->data.f128; return true;
@@ -921,6 +935,13 @@ bool tag_to_ffi_pointer (s_tag *tag, const s_sym *type, void **dest)
return true;
}
goto invalid_cast;
+ case TAG_COW:
+ if (type == &g_sym_Cow) {
+ *dest = &tag->data.cow;
+ return true;
+ }
+ // FIXME: other types
+ goto invalid_cast;
case TAG_F32:
if (type == &g_sym_F32) {
*dest = &tag->data.f32;
@@ -1159,6 +1180,7 @@ bool tag_to_pointer (s_tag *tag, const s_sym *type, void **dest)
case TAG_CFN: *dest = &tag->data.cfn; return true;
case TAG_CHARACTER: *dest = &tag->data.character; return true;
case TAG_COMPLEX: *dest = &tag->data.complex; return true;
+ case TAG_COW: *dest = &tag->data.cow; return true;
case TAG_F32: *dest = &tag->data.f32; return true;
case TAG_F64: *dest = &tag->data.f64; return true;
case TAG_F128: *dest = &tag->data.f128; return true;
@@ -1211,6 +1233,7 @@ const s_sym ** tag_type (const s_tag *tag, const s_sym **dest)
case TAG_CFN: *dest = &g_sym_Cfn; return dest;
case TAG_CHARACTER: *dest = &g_sym_Character; return dest;
case TAG_COMPLEX: *dest = &g_sym_Complex; return dest;
+ case TAG_COW: *dest = &g_sym_Cow; return dest;
case TAG_F32: *dest = &g_sym_F32; return dest;
case TAG_F64: *dest = &g_sym_F64; return dest;
case TAG_F128: *dest = &g_sym_F128; return dest;
diff --git a/libc3/tag_type.c b/libc3/tag_type.c
index dae77d0..c66ab33 100644
--- a/libc3/tag_type.c
+++ b/libc3/tag_type.c
@@ -28,6 +28,7 @@ bool tag_type_size (e_tag_type type, uw *dest)
case TAG_CFN: *dest = sizeof(s_cfn); return true;
case TAG_CHARACTER: *dest = sizeof(character); return true;
case TAG_COMPLEX: *dest = sizeof(s_complex *); return true;
+ case TAG_COW: *dest = sizeof(s_cow *); return true;
case TAG_F32: *dest = sizeof(f32); return true;
case TAG_F64: *dest = sizeof(f64); return true;
case TAG_F128: *dest = sizeof(f128); return true;
@@ -75,6 +76,7 @@ bool tag_type_to_ffi_type (e_tag_type type, ffi_type **dest)
case TAG_CFN: *dest = &ffi_type_pointer; return true;
case TAG_CHARACTER: *dest = &ffi_type_uint32; return true;
case TAG_COMPLEX: *dest = &ffi_type_pointer; return true;
+ case TAG_COW: *dest = &ffi_type_pointer; return true;
case TAG_F32: *dest = &ffi_type_float; return true;
case TAG_F64: *dest = &ffi_type_double; return true;
case TAG_F128: *dest = &ffi_type_longdouble; return true;
@@ -124,6 +126,7 @@ const char * tag_type_to_string (e_tag_type tag_type)
case TAG_CFN: return "Cfn";
case TAG_CHARACTER: return "Character";
case TAG_COMPLEX: return "Complex";
+ case TAG_COW: return "Cow";
case TAG_F32: return "F32";
case TAG_F64: return "F64";
case TAG_F128: return "F128";
diff --git a/libc3/types.h b/libc3/types.h
index 387c07a..5b8bc11 100644
--- a/libc3/types.h
+++ b/libc3/types.h
@@ -97,6 +97,7 @@ typedef enum {
TAG_CFN,
TAG_CHARACTER,
TAG_COMPLEX,
+ TAG_COW,
TAG_F32,
TAG_F64,
TAG_F128,
@@ -141,6 +142,7 @@ typedef struct buf_save s_buf_save;
typedef struct call s_call;
typedef struct cfn s_cfn;
typedef struct complex s_complex;
+typedef struct cow s_cow;
typedef struct env s_env;
typedef struct error_handler s_error_handler;
typedef struct fact s_fact;
@@ -443,6 +445,7 @@ union tag_data {
s_cfn cfn;
character character;
s_complex *complex;
+ s_cow *cow;
f32 f32;
f64 f64;
f128 f128;
@@ -502,6 +505,12 @@ struct complex {
s_tag y;
};
+struct cow {
+ s_tag r;
+ s_tag w;
+ bool w_is_set;
+};
+
struct error_handler
{
s_list *backtrace;
diff --git a/sources.mk b/sources.mk
index afd69aa..b28a499 100644
--- a/sources.mk
+++ b/sources.mk
@@ -221,6 +221,8 @@ C3_C_SOURCES = \
"libc3/compare.h" \
"libc3/complex.c" \
"libc3/complex.h" \
+ "libc3/cow.c" \
+ "libc3/cow.h" \
"libc3/data.c" \
"libc3/data.h" \
"libc3/env.c" \
@@ -285,6 +287,8 @@ C3_C_SOURCES = \
"libc3/operator.h" \
"libc3/pcomplex.c" \
"libc3/pcomplex.h" \
+ "libc3/pcow.c" \
+ "libc3/pcow.h" \
"libc3/point.h.in" \
"libc3/ptag.c" \
"libc3/ptag.h" \
@@ -918,7 +922,6 @@ C3_EXTERNAL_SOURCES = \
"ucd2c/UCD/NameAliases.txt" \
"ucd2c/UCD/NamedSequences.txt" \
"ucd2c/UCD/NamedSequencesProv.txt" \
- "ucd2c/UCD/NamesList.html" \
"ucd2c/UCD/NamesList.txt" \
"ucd2c/UCD/NormalizationCorrections.txt" \
"ucd2c/UCD/NormalizationTest.txt" \
@@ -938,15 +941,11 @@ C3_EXTERNAL_SOURCES = \
"ucd2c/UCD/UnicodeData.txt" \
"ucd2c/UCD/VerticalOrientation.txt" \
"ucd2c/UCD/auxiliary/GraphemeBreakProperty.txt" \
- "ucd2c/UCD/auxiliary/GraphemeBreakTest.html" \
"ucd2c/UCD/auxiliary/GraphemeBreakTest.txt" \
- "ucd2c/UCD/auxiliary/LineBreakTest.html" \
"ucd2c/UCD/auxiliary/LineBreakTest.txt" \
"ucd2c/UCD/auxiliary/SentenceBreakProperty.txt" \
- "ucd2c/UCD/auxiliary/SentenceBreakTest.html" \
"ucd2c/UCD/auxiliary/SentenceBreakTest.txt" \
"ucd2c/UCD/auxiliary/WordBreakProperty.txt" \
- "ucd2c/UCD/auxiliary/WordBreakTest.html" \
"ucd2c/UCD/auxiliary/WordBreakTest.txt" \
"ucd2c/UCD/emoji/ReadMe.txt" \
"ucd2c/UCD/emoji/emoji-data.txt" \
diff --git a/sources.sh b/sources.sh
index d588947..1f48e76 100644
--- a/sources.sh
+++ b/sources.sh
@@ -1,7 +1,7 @@
# sources.sh generated by update_sources
C3_CONFIGURES='c3c/configure c3s/configure c3s/sources.sh c3s/update_sources ic3/configure ic3/sources.sh ic3/update_sources libc3/configure libc3/sources.sh libc3/update_sources libtommath/configure libtommath/sources.sh libtommath/update_sources test/configure test/sources.sh test/update_sources ucd2c/configure '
C3_MAKEFILES='c3c/Makefile c3s/Makefile c3s/sources.mk ic3/Makefile ic3/sources.mk libc3/Makefile libc3/gen.mk libc3/sources.mk libtommath/Makefile libtommath/sources.mk test/Makefile test/sources.mk ucd2c/Makefile '
-C3_C_SOURCES='c3c/c3c.c c3s/buf_readline.c c3s/buf_readline.h c3s/c3s.c ic3/buf_linenoise.c ic3/buf_linenoise.h ic3/buf_wineditline.c ic3/buf_wineditline.h ic3/config.h ic3/ic3.c ic3/linenoise.c libc3/abs.c libc3/abs.h libc3/alloc.c libc3/alloc.h libc3/arg.c libc3/arg.h libc3/array.c libc3/array.h libc3/assert.h libc3/binding.c libc3/binding.h libc3/block.c libc3/block.h libc3/bool.c libc3/bool.h libc3/buf.c libc3/buf.h libc3/buf_file.c libc3/buf_file.h libc3/buf_getc.c libc3/buf_getc.h libc3/buf_getchar.c libc3/buf_getchar.h libc3/buf_inspect.c libc3/buf_inspect.h libc3/buf_inspect_s.c.in libc3/buf_inspect_s.h.in libc3/buf_inspect_s16.c libc3/buf_inspect_s16.h libc3/buf_inspect_s16_binary.c libc3/buf_inspect_s16_binary.h libc3/buf_inspect_s16_decimal.c libc3/buf_inspect_s16_decimal.h libc3/buf_inspect_s16_hexadecimal.c libc3/buf_inspect_s16_hexadecimal.h libc3/buf_inspect_s16_octal.c libc3/buf_inspect_s16_octal.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_decimal.c libc3/buf_inspect_s32_decimal.h libc3/buf_inspect_s32_hexadecimal.c libc3/buf_inspect_s32_hexadecimal.h libc3/buf_inspect_s32_octal.c libc3/buf_inspect_s32_octal.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_decimal.c libc3/buf_inspect_s64_decimal.h libc3/buf_inspect_s64_hexadecimal.c libc3/buf_inspect_s64_hexadecimal.h libc3/buf_inspect_s64_octal.c libc3/buf_inspect_s64_octal.h 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_decimal.c libc3/buf_inspect_s8_decimal.h libc3/buf_inspect_s8_hexadecimal.c libc3/buf_inspect_s8_hexadecimal.h libc3/buf_inspect_s8_octal.c libc3/buf_inspect_s8_octal.h libc3/buf_inspect_s_base.c.in libc3/buf_inspect_s_base.h.in 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_decimal.c libc3/buf_inspect_sw_decimal.h libc3/buf_inspect_sw_hexadecimal.c libc3/buf_inspect_sw_hexadecimal.h libc3/buf_inspect_sw_octal.c libc3/buf_inspect_sw_octal.h libc3/buf_inspect_u.c.in libc3/buf_inspect_u.h.in 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_decimal.c libc3/buf_inspect_u16_decimal.h libc3/buf_inspect_u16_hexadecimal.c libc3/buf_inspect_u16_hexadecimal.h libc3/buf_inspect_u16_octal.c libc3/buf_inspect_u16_octal.h libc3/buf_inspect_u32.c libc3/buf_inspect_u32.h libc3/buf_inspect_u32_binary.c libc3/buf_inspect_u32_binary.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_u32_octal.c libc3/buf_inspect_u32_octal.h libc3/buf_inspect_u64.c libc3/buf_inspect_u64.h libc3/buf_inspect_u64_binary.c libc3/buf_inspect_u64_binary.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_u64_octal.c libc3/buf_inspect_u64_octal.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_decimal.c libc3/buf_inspect_u8_decimal.h libc3/buf_inspect_u8_hexadecimal.c libc3/buf_inspect_u8_hexadecimal.h libc3/buf_inspect_u8_octal.c libc3/buf_inspect_u8_octal.h libc3/buf_inspect_u_base.c.in libc3/buf_inspect_u_base.h.in 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_decimal.c libc3/buf_inspect_uw_decimal.h libc3/buf_inspect_uw_hexadecimal.c libc3/buf_inspect_uw_hexadecimal.h libc3/buf_inspect_uw_octal.c libc3/buf_inspect_uw_octal.h libc3/buf_parse.c libc3/buf_parse.h libc3/buf_parse_s.c.in libc3/buf_parse_s.h.in 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_s8.c libc3/buf_parse_s8.h libc3/buf_parse_sw.c libc3/buf_parse_sw.h libc3/buf_parse_u.c.in libc3/buf_parse_u.h.in 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_u8.c libc3/buf_parse_u8.h libc3/buf_parse_uw.c libc3/buf_parse_uw.h libc3/buf_save.c libc3/buf_save.h libc3/c3.c libc3/c3.h libc3/c3_main.h libc3/call.c libc3/call.h libc3/ceiling.c libc3/ceiling.h libc3/cfn.c libc3/cfn.h libc3/character.c libc3/character.h libc3/compare.c libc3/compare.h libc3/complex.c libc3/complex.h libc3/data.c libc3/data.h libc3/env.c libc3/env.h libc3/error.c libc3/error.h libc3/error_handler.c libc3/error_handler.h libc3/eval.c libc3/eval.h libc3/f128.c libc3/f128.h libc3/f32.c libc3/f32.h libc3/f64.c libc3/f64.h libc3/fact.c libc3/fact.h libc3/fact_list.c libc3/fact_list.h libc3/facts.c libc3/facts.h libc3/facts_cursor.c libc3/facts_cursor.h libc3/facts_spec.c libc3/facts_spec.h libc3/facts_spec_cursor.c libc3/facts_spec_cursor.h libc3/facts_with.c libc3/facts_with.h libc3/facts_with_cursor.c libc3/facts_with_cursor.h libc3/file.c libc3/file.h libc3/float.h libc3/fn.c libc3/fn.h libc3/fn_clause.c libc3/fn_clause.h libc3/frame.c libc3/frame.h libc3/hash.c libc3/hash.h libc3/ident.c libc3/ident.h libc3/integer.c libc3/integer.h libc3/io.c libc3/io.h libc3/license.c libc3/list.c libc3/list.h libc3/list_init.c libc3/list_init.h libc3/log.c libc3/log.h libc3/map.c libc3/map.h libc3/module.c libc3/module.h libc3/operator.c libc3/operator.h libc3/pcomplex.c libc3/pcomplex.h libc3/point.h.in libc3/ptag.c libc3/ptag.h libc3/ptr.c libc3/ptr.h libc3/ptr_free.c libc3/ptr_free.h libc3/queue.c libc3/queue.h libc3/quote.c libc3/quote.h libc3/ratio.c libc3/ratio.h libc3/s.c.in libc3/s.h.in libc3/s16.c libc3/s16.h libc3/s32.c libc3/s32.h libc3/s64.c libc3/s64.h libc3/s8.c libc3/s8.h libc3/sequence.c libc3/sequence.h libc3/set.c.in libc3/set.h.in libc3/set__fact.c libc3/set__fact.h libc3/set__tag.c libc3/set__tag.h libc3/set_cursor.c.in libc3/set_cursor.h.in libc3/set_cursor__fact.c libc3/set_cursor__fact.h libc3/set_cursor__tag.c libc3/set_cursor__tag.h libc3/set_item.c.in libc3/set_item.h.in libc3/set_item__fact.c libc3/set_item__fact.h libc3/set_item__tag.c libc3/set_item__tag.h libc3/sha1.h libc3/sign.c libc3/sign.h libc3/skiplist.c.in libc3/skiplist.h.in libc3/skiplist__fact.c libc3/skiplist__fact.h libc3/skiplist_node.c.in libc3/skiplist_node.h.in libc3/skiplist_node__fact.c libc3/skiplist_node__fact.h libc3/special_operator.c libc3/special_operator.h libc3/str.c libc3/str.h libc3/struct.c libc3/struct.h libc3/struct_type.c libc3/struct_type.h libc3/sw.c libc3/sw.h libc3/sym.c libc3/sym.h libc3/tag.c libc3/tag.h libc3/tag_add.c libc3/tag_addi.c libc3/tag_band.c libc3/tag_bnot.c libc3/tag_bor.c libc3/tag_bxor.c libc3/tag_div.c libc3/tag_init.c libc3/tag_init.h libc3/tag_mod.c libc3/tag_mul.c libc3/tag_neg.c libc3/tag_shift_left.c libc3/tag_shift_right.c libc3/tag_sqrt.c libc3/tag_sub.c libc3/tag_type.c libc3/tag_type.h libc3/time.c libc3/time.h libc3/tuple.c libc3/tuple.h libc3/types.h libc3/u.c.in libc3/u.h.in libc3/u16.c libc3/u16.h libc3/u32.c libc3/u32.h libc3/u64.c libc3/u64.h libc3/u8.c libc3/u8.h libc3/ucd.c libc3/ucd.h libc3/unquote.c libc3/unquote.h libc3/uw.c libc3/uw.h libc3/var.c libc3/var.h libc3/void.c libc3/void.h test/array_test.c test/bool_test.c test/buf_file_test.c test/buf_inspect_test.c test/buf_parse_test.c test/buf_parse_test.h test/buf_parse_test_s16.c test/buf_parse_test_s32.c test/buf_parse_test_s64.c test/buf_parse_test_s8.c test/buf_parse_test_su.h test/buf_parse_test_u16.c test/buf_parse_test_u32.c test/buf_parse_test_u64.c test/buf_parse_test_u8.c test/buf_test.c test/call_test.c test/cfn_test.c test/character_test.c test/compare_test.c test/compare_test.h test/env_test.c test/fact_test.c test/fact_test.h test/facts_cursor_test.c test/facts_test.c test/facts_with_test.c test/fn_test.c test/hash_test.c test/ident_test.c test/libc3_test.c test/list_test.c test/ratio_test.c test/set__fact_test.c test/set__tag_test.c test/skiplist__fact_test.c test/str_test.c test/sym_test.c test/tag_test.c test/tag_test.h test/test.c test/test.h test/tuple_test.c test/types_test.c ucd2c/ucd.h ucd2c/ucd2c.c '
+C3_C_SOURCES='c3c/c3c.c c3s/buf_readline.c c3s/buf_readline.h c3s/c3s.c ic3/buf_linenoise.c ic3/buf_linenoise.h ic3/buf_wineditline.c ic3/buf_wineditline.h ic3/config.h ic3/ic3.c ic3/linenoise.c libc3/abs.c libc3/abs.h libc3/alloc.c libc3/alloc.h libc3/arg.c libc3/arg.h libc3/array.c libc3/array.h libc3/assert.h libc3/binding.c libc3/binding.h libc3/block.c libc3/block.h libc3/bool.c libc3/bool.h libc3/buf.c libc3/buf.h libc3/buf_file.c libc3/buf_file.h libc3/buf_getc.c libc3/buf_getc.h libc3/buf_getchar.c libc3/buf_getchar.h libc3/buf_inspect.c libc3/buf_inspect.h libc3/buf_inspect_s.c.in libc3/buf_inspect_s.h.in libc3/buf_inspect_s16.c libc3/buf_inspect_s16.h libc3/buf_inspect_s16_binary.c libc3/buf_inspect_s16_binary.h libc3/buf_inspect_s16_decimal.c libc3/buf_inspect_s16_decimal.h libc3/buf_inspect_s16_hexadecimal.c libc3/buf_inspect_s16_hexadecimal.h libc3/buf_inspect_s16_octal.c libc3/buf_inspect_s16_octal.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_decimal.c libc3/buf_inspect_s32_decimal.h libc3/buf_inspect_s32_hexadecimal.c libc3/buf_inspect_s32_hexadecimal.h libc3/buf_inspect_s32_octal.c libc3/buf_inspect_s32_octal.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_decimal.c libc3/buf_inspect_s64_decimal.h libc3/buf_inspect_s64_hexadecimal.c libc3/buf_inspect_s64_hexadecimal.h libc3/buf_inspect_s64_octal.c libc3/buf_inspect_s64_octal.h 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_decimal.c libc3/buf_inspect_s8_decimal.h libc3/buf_inspect_s8_hexadecimal.c libc3/buf_inspect_s8_hexadecimal.h libc3/buf_inspect_s8_octal.c libc3/buf_inspect_s8_octal.h libc3/buf_inspect_s_base.c.in libc3/buf_inspect_s_base.h.in 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_decimal.c libc3/buf_inspect_sw_decimal.h libc3/buf_inspect_sw_hexadecimal.c libc3/buf_inspect_sw_hexadecimal.h libc3/buf_inspect_sw_octal.c libc3/buf_inspect_sw_octal.h libc3/buf_inspect_u.c.in libc3/buf_inspect_u.h.in 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_decimal.c libc3/buf_inspect_u16_decimal.h libc3/buf_inspect_u16_hexadecimal.c libc3/buf_inspect_u16_hexadecimal.h libc3/buf_inspect_u16_octal.c libc3/buf_inspect_u16_octal.h libc3/buf_inspect_u32.c libc3/buf_inspect_u32.h libc3/buf_inspect_u32_binary.c libc3/buf_inspect_u32_binary.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_u32_octal.c libc3/buf_inspect_u32_octal.h libc3/buf_inspect_u64.c libc3/buf_inspect_u64.h libc3/buf_inspect_u64_binary.c libc3/buf_inspect_u64_binary.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_u64_octal.c libc3/buf_inspect_u64_octal.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_decimal.c libc3/buf_inspect_u8_decimal.h libc3/buf_inspect_u8_hexadecimal.c libc3/buf_inspect_u8_hexadecimal.h libc3/buf_inspect_u8_octal.c libc3/buf_inspect_u8_octal.h libc3/buf_inspect_u_base.c.in libc3/buf_inspect_u_base.h.in 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_decimal.c libc3/buf_inspect_uw_decimal.h libc3/buf_inspect_uw_hexadecimal.c libc3/buf_inspect_uw_hexadecimal.h libc3/buf_inspect_uw_octal.c libc3/buf_inspect_uw_octal.h libc3/buf_parse.c libc3/buf_parse.h libc3/buf_parse_s.c.in libc3/buf_parse_s.h.in 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_s8.c libc3/buf_parse_s8.h libc3/buf_parse_sw.c libc3/buf_parse_sw.h libc3/buf_parse_u.c.in libc3/buf_parse_u.h.in 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_u8.c libc3/buf_parse_u8.h libc3/buf_parse_uw.c libc3/buf_parse_uw.h libc3/buf_save.c libc3/buf_save.h libc3/c3.c libc3/c3.h libc3/c3_main.h libc3/call.c libc3/call.h libc3/ceiling.c libc3/ceiling.h libc3/cfn.c libc3/cfn.h libc3/character.c libc3/character.h libc3/compare.c libc3/compare.h libc3/complex.c libc3/complex.h libc3/cow.c libc3/cow.h libc3/data.c libc3/data.h libc3/env.c libc3/env.h libc3/error.c libc3/error.h libc3/error_handler.c libc3/error_handler.h libc3/eval.c libc3/eval.h libc3/f128.c libc3/f128.h libc3/f32.c libc3/f32.h libc3/f64.c libc3/f64.h libc3/fact.c libc3/fact.h libc3/fact_list.c libc3/fact_list.h libc3/facts.c libc3/facts.h libc3/facts_cursor.c libc3/facts_cursor.h libc3/facts_spec.c libc3/facts_spec.h libc3/facts_spec_cursor.c libc3/facts_spec_cursor.h libc3/facts_with.c libc3/facts_with.h libc3/facts_with_cursor.c libc3/facts_with_cursor.h libc3/file.c libc3/file.h libc3/float.h libc3/fn.c libc3/fn.h libc3/fn_clause.c libc3/fn_clause.h libc3/frame.c libc3/frame.h libc3/hash.c libc3/hash.h libc3/ident.c libc3/ident.h libc3/integer.c libc3/integer.h libc3/io.c libc3/io.h libc3/license.c libc3/list.c libc3/list.h libc3/list_init.c libc3/list_init.h libc3/log.c libc3/log.h libc3/map.c libc3/map.h libc3/module.c libc3/module.h libc3/operator.c libc3/operator.h libc3/pcomplex.c libc3/pcomplex.h libc3/pcow.c libc3/pcow.h libc3/point.h.in libc3/ptag.c libc3/ptag.h libc3/ptr.c libc3/ptr.h libc3/ptr_free.c libc3/ptr_free.h libc3/queue.c libc3/queue.h libc3/quote.c libc3/quote.h libc3/ratio.c libc3/ratio.h libc3/s.c.in libc3/s.h.in libc3/s16.c libc3/s16.h libc3/s32.c libc3/s32.h libc3/s64.c libc3/s64.h libc3/s8.c libc3/s8.h libc3/sequence.c libc3/sequence.h libc3/set.c.in libc3/set.h.in libc3/set__fact.c libc3/set__fact.h libc3/set__tag.c libc3/set__tag.h libc3/set_cursor.c.in libc3/set_cursor.h.in libc3/set_cursor__fact.c libc3/set_cursor__fact.h libc3/set_cursor__tag.c libc3/set_cursor__tag.h libc3/set_item.c.in libc3/set_item.h.in libc3/set_item__fact.c libc3/set_item__fact.h libc3/set_item__tag.c libc3/set_item__tag.h libc3/sha1.h libc3/sign.c libc3/sign.h libc3/skiplist.c.in libc3/skiplist.h.in libc3/skiplist__fact.c libc3/skiplist__fact.h libc3/skiplist_node.c.in libc3/skiplist_node.h.in libc3/skiplist_node__fact.c libc3/skiplist_node__fact.h libc3/special_operator.c libc3/special_operator.h libc3/str.c libc3/str.h libc3/struct.c libc3/struct.h libc3/struct_type.c libc3/struct_type.h libc3/sw.c libc3/sw.h libc3/sym.c libc3/sym.h libc3/tag.c libc3/tag.h libc3/tag_add.c libc3/tag_addi.c libc3/tag_band.c libc3/tag_bnot.c libc3/tag_bor.c libc3/tag_bxor.c libc3/tag_div.c libc3/tag_init.c libc3/tag_init.h libc3/tag_mod.c libc3/tag_mul.c libc3/tag_neg.c libc3/tag_shift_left.c libc3/tag_shift_right.c libc3/tag_sqrt.c libc3/tag_sub.c libc3/tag_type.c libc3/tag_type.h libc3/time.c libc3/time.h libc3/tuple.c libc3/tuple.h libc3/types.h libc3/u.c.in libc3/u.h.in libc3/u16.c libc3/u16.h libc3/u32.c libc3/u32.h libc3/u64.c libc3/u64.h libc3/u8.c libc3/u8.h libc3/ucd.c libc3/ucd.h libc3/unquote.c libc3/unquote.h libc3/uw.c libc3/uw.h libc3/var.c libc3/var.h libc3/void.c libc3/void.h test/array_test.c test/bool_test.c test/buf_file_test.c test/buf_inspect_test.c test/buf_parse_test.c test/buf_parse_test.h test/buf_parse_test_s16.c test/buf_parse_test_s32.c test/buf_parse_test_s64.c test/buf_parse_test_s8.c test/buf_parse_test_su.h test/buf_parse_test_u16.c test/buf_parse_test_u32.c test/buf_parse_test_u64.c test/buf_parse_test_u8.c test/buf_test.c test/call_test.c test/cfn_test.c test/character_test.c test/compare_test.c test/compare_test.h test/env_test.c test/fact_test.c test/fact_test.h test/facts_cursor_test.c test/facts_test.c test/facts_with_test.c test/fn_test.c test/hash_test.c test/ident_test.c test/libc3_test.c test/list_test.c test/ratio_test.c test/set__fact_test.c test/set__tag_test.c test/skiplist__fact_test.c test/str_test.c test/sym_test.c test/tag_test.c test/tag_test.h test/test.c test/test.h test/tuple_test.c test/types_test.c ucd2c/ucd.h ucd2c/ucd2c.c '
C3_OBJC_SOURCES=' '
C3_OTHER_SOURCES='AUTHORS Makefile README.md c3.index c3.version config.subr configure fonts/Courier New/Courier New.ttf fonts/NotoSans-Regular.ttf img/c3.1.xcf img/c3.1080.jpg img/c3.1080.png img/c3.128.jpg img/c3.128.png img/c3.16.png img/c3.256.jpg img/c3.256.png img/c3.32.jpg img/c3.32.png img/c3.48.jpg img/c3.48.png img/c3.512.jpg img/c3.512.png img/c3.64.jpg img/c3.64.png img/c3.640.jpg img/c3.640.png img/c3.720.jpg img/c3.720.png img/c3.iconset/icon_128x128.png img/c3.iconset/icon_16x16.png img/c3.iconset/icon_256x256.png img/c3.iconset/icon_32x32.png img/c3.iconset/icon_512x512.png img/c3.iconset/icon_64x64.png img/c3.xcf img/earth.jpg img/earth.png img/flaps.256.png img/flaps.png img/fly-dead.png img/fly-noto.png img/iris-c3-004.jpeg img/iris-c3-004.png img/mandelbrot_f128_limit.1.png img/mandelbrot_f128_limit.2.png img/mandelbrot_f128_limit.3.png img/mandelbrot_f128_limit.png img/matrix_shade.png img/thodg_No_Prompt_073261d5-2c81-4b6e-9572-e0b840c55f1f.jpeg img/toast.128.png img/toast.png lib/c3/0.1/array.facts lib/c3/0.1/c3.facts lib/c3/0.1/c3/operator.facts lib/c3/0.1/complex.facts lib/c3/0.1/f128.facts lib/c3/0.1/f32.facts lib/c3/0.1/f64.facts lib/c3/0.1/gl/dvec2.facts lib/c3/0.1/gl/dvec3.facts lib/c3/0.1/gl/object.facts lib/c3/0.1/gl/sphere.facts lib/c3/0.1/gl/triangle.facts lib/c3/0.1/gl/vec2.facts lib/c3/0.1/gl/vec3.facts lib/c3/0.1/gl/vertex.facts lib/c3/0.1/integer.facts lib/c3/0.1/list.facts lib/c3/0.1/map.facts lib/c3/0.1/ptr.facts lib/c3/0.1/ptr_free.facts lib/c3/0.1/ratio.facts lib/c3/0.1/s16.facts lib/c3/0.1/s32.facts lib/c3/0.1/s64.facts lib/c3/0.1/s8.facts lib/c3/0.1/str.facts lib/c3/0.1/sw.facts lib/c3/0.1/sym.facts lib/c3/0.1/u16.facts lib/c3/0.1/u32.facts lib/c3/0.1/u64.facts lib/c3/0.1/u8.facts lib/c3/0.1/uw.facts lib/c3/0.1/var.facts lib/c3/0.1/void.facts libc3/tag_init.rb license.h sources.mk sources.sh test/buf_parse_test_su.rb test/facts_test_dump_file.expected.facts test/facts_test_load_file.facts test/facts_test_log_add.expected.facts test/facts_test_log_remove.expected.facts test/facts_test_open_file.1.expected.facts test/facts_test_open_file.1.in.facts test/facts_test_open_file.2.expected.facts test/facts_test_open_file.2.in.facts test/facts_test_open_file.3.expected.facts test/facts_test_open_file.3.in.facts test/facts_test_save.expected.facts test/ic3/array.err.expected test/ic3/array.in test/ic3/array.out.expected test/ic3/array.ret.expected test/ic3/block.in test/ic3/block.out.expected test/ic3/block.ret.expected test/ic3/bool.err.expected test/ic3/bool.in test/ic3/bool.out.expected test/ic3/bool.ret.expected test/ic3/call.err.expected test/ic3/call.in test/ic3/call.out.expected test/ic3/call.ret.expected test/ic3/cast.in test/ic3/cast.out.expected test/ic3/cast.ret.expected test/ic3/character.err.expected test/ic3/character.in test/ic3/character.out.expected test/ic3/character.ret.expected test/ic3/comment.err.expected test/ic3/comment.in test/ic3/comment.out.expected test/ic3/comment.ret.expected test/ic3/complex.in test/ic3/complex.out.expected test/ic3/complex.ret.expected test/ic3/def.in test/ic3/def.out.expected test/ic3/def.ret.expected test/ic3/defmodule.in test/ic3/defmodule.out.expected test/ic3/defmodule.ret.expected test/ic3/defoperator.in test/ic3/defoperator.out.expected test/ic3/defoperator.ret.expected test/ic3/equal.err.expected test/ic3/equal.in test/ic3/equal.out.expected test/ic3/equal.ret.expected test/ic3/fn.err.expected test/ic3/fn.in test/ic3/fn.out.expected test/ic3/fn.ret.expected test/ic3/function_call.err.expected test/ic3/function_call.out.expected test/ic3/function_call.ret.expected test/ic3/hello.err.expected test/ic3/hello.in test/ic3/hello.out.expected test/ic3/hello.ret.expected test/ic3/ident.err.expected test/ic3/ident.in test/ic3/ident.out.expected test/ic3/ident.ret.expected test/ic3/if.in test/ic3/if.out.expected test/ic3/if.ret.expected test/ic3/integer.in test/ic3/integer.lisp test/ic3/integer.out.expected test/ic3/integer.ret.expected test/ic3/integer_add.in test/ic3/integer_add.out.expected test/ic3/integer_add.ret.expected test/ic3/integer_band.in test/ic3/integer_band.out.expected test/ic3/integer_band.ret.expected test/ic3/integer_bnot.in test/ic3/integer_bnot.out.expected test/ic3/integer_bnot.ret.expected test/ic3/integer_bor-2.in test/ic3/integer_bor-2.out.expected test/ic3/integer_bor-2.ret.expected test/ic3/integer_bxor.in test/ic3/integer_bxor.out.expected test/ic3/integer_bxor.ret.expected test/ic3/integer_div.in test/ic3/integer_div.out.expected test/ic3/integer_div.ret.expected test/ic3/integer_eq.in test/ic3/integer_eq.out.expected test/ic3/integer_eq.ret.expected test/ic3/integer_gt.in test/ic3/integer_gt.out.expected test/ic3/integer_gt.ret.expected test/ic3/integer_lt.in test/ic3/integer_lt.out.expected test/ic3/integer_lt.ret.expected test/ic3/integer_mod-2.in test/ic3/integer_mod-2.out.expected test/ic3/integer_mod-2.ret.expected test/ic3/integer_mul.in test/ic3/integer_mul.out.expected test/ic3/integer_mul.ret.expected test/ic3/integer_neg.in test/ic3/integer_neg.out.expected test/ic3/integer_neg.ret.expected test/ic3/integer_sub.in test/ic3/integer_sub.out.expected test/ic3/integer_sub.ret.expected test/ic3/list.err.expected test/ic3/list.in test/ic3/list.out.expected test/ic3/list.ret.expected test/ic3/macro.in test/ic3/macro.out.expected test/ic3/macro.ret.expected test/ic3/map.in test/ic3/map.out.expected test/ic3/map.ret.expected test/ic3/op.err.expected test/ic3/op.in test/ic3/op.out.expected test/ic3/op.ret.expected test/ic3/plist.err.expected test/ic3/plist.in test/ic3/plist.out.expected test/ic3/plist.ret.expected test/ic3/quote.in test/ic3/quote.out.expected test/ic3/quote.ret.expected test/ic3/ratio.in test/ic3/ratio.out.expected test/ic3/ratio.ret.expected test/ic3/str.err.expected test/ic3/str.in test/ic3/str.out.expected test/ic3/str.ret.expected test/ic3/struct.in test/ic3/struct.out.expected test/ic3/struct.ret.expected test/ic3/sym.err.expected test/ic3/sym.in test/ic3/sym.out.expected test/ic3/sym.ret.expected test/ic3/tuple.err.expected test/ic3/tuple.in test/ic3/tuple.out.expected test/ic3/tuple.ret.expected test/ic3/var.in test/ic3/var.out.expected test/ic3/var.ret.expected test/ic3/void.in test/ic3/void.out.expected test/ic3/void.ret.expected test/ic3_test test/replace_lines.rb test/test.rb test/test_case_end.rb test/zero '
-C3_EXTERNAL_SOURCES='libtommath/LICENSE libtommath/README.md libtommath/bn_cutoffs.c libtommath/bn_deprecated.c libtommath/bn_mp_2expt.c libtommath/bn_mp_abs.c libtommath/bn_mp_add.c libtommath/bn_mp_add_d.c libtommath/bn_mp_addmod.c libtommath/bn_mp_and.c libtommath/bn_mp_clamp.c libtommath/bn_mp_clear.c libtommath/bn_mp_clear_multi.c libtommath/bn_mp_cmp.c libtommath/bn_mp_cmp_d.c libtommath/bn_mp_cmp_mag.c libtommath/bn_mp_cnt_lsb.c libtommath/bn_mp_complement.c libtommath/bn_mp_copy.c libtommath/bn_mp_count_bits.c libtommath/bn_mp_decr.c libtommath/bn_mp_div.c libtommath/bn_mp_div_2.c libtommath/bn_mp_div_2d.c libtommath/bn_mp_div_3.c libtommath/bn_mp_div_d.c libtommath/bn_mp_dr_is_modulus.c libtommath/bn_mp_dr_reduce.c libtommath/bn_mp_dr_setup.c libtommath/bn_mp_error_to_string.c libtommath/bn_mp_exch.c libtommath/bn_mp_expt_u32.c libtommath/bn_mp_exptmod.c libtommath/bn_mp_exteuclid.c libtommath/bn_mp_fread.c libtommath/bn_mp_from_sbin.c libtommath/bn_mp_from_ubin.c libtommath/bn_mp_fwrite.c libtommath/bn_mp_gcd.c libtommath/bn_mp_get_double.c libtommath/bn_mp_get_i32.c libtommath/bn_mp_get_i64.c libtommath/bn_mp_get_l.c libtommath/bn_mp_get_ll.c libtommath/bn_mp_get_mag_u32.c libtommath/bn_mp_get_mag_u64.c libtommath/bn_mp_get_mag_ul.c libtommath/bn_mp_get_mag_ull.c libtommath/bn_mp_grow.c libtommath/bn_mp_incr.c libtommath/bn_mp_init.c libtommath/bn_mp_init_copy.c libtommath/bn_mp_init_i32.c libtommath/bn_mp_init_i64.c libtommath/bn_mp_init_l.c libtommath/bn_mp_init_ll.c libtommath/bn_mp_init_multi.c libtommath/bn_mp_init_set.c libtommath/bn_mp_init_size.c libtommath/bn_mp_init_u32.c libtommath/bn_mp_init_u64.c libtommath/bn_mp_init_ul.c libtommath/bn_mp_init_ull.c libtommath/bn_mp_invmod.c libtommath/bn_mp_is_square.c libtommath/bn_mp_iseven.c libtommath/bn_mp_isodd.c libtommath/bn_mp_kronecker.c libtommath/bn_mp_lcm.c libtommath/bn_mp_log_u32.c libtommath/bn_mp_lshd.c libtommath/bn_mp_mod.c libtommath/bn_mp_mod_2d.c libtommath/bn_mp_mod_d.c libtommath/bn_mp_montgomery_calc_normalization.c libtommath/bn_mp_montgomery_reduce.c libtommath/bn_mp_montgomery_setup.c libtommath/bn_mp_mul.c libtommath/bn_mp_mul_2.c libtommath/bn_mp_mul_2d.c libtommath/bn_mp_mul_d.c libtommath/bn_mp_mulmod.c libtommath/bn_mp_neg.c libtommath/bn_mp_or.c libtommath/bn_mp_pack.c libtommath/bn_mp_pack_count.c libtommath/bn_mp_prime_fermat.c libtommath/bn_mp_prime_frobenius_underwood.c libtommath/bn_mp_prime_is_prime.c libtommath/bn_mp_prime_miller_rabin.c libtommath/bn_mp_prime_next_prime.c libtommath/bn_mp_prime_rabin_miller_trials.c libtommath/bn_mp_prime_rand.c libtommath/bn_mp_prime_strong_lucas_selfridge.c libtommath/bn_mp_radix_size.c libtommath/bn_mp_radix_smap.c libtommath/bn_mp_rand.c libtommath/bn_mp_read_radix.c libtommath/bn_mp_reduce.c libtommath/bn_mp_reduce_2k.c libtommath/bn_mp_reduce_2k_l.c libtommath/bn_mp_reduce_2k_setup.c libtommath/bn_mp_reduce_2k_setup_l.c libtommath/bn_mp_reduce_is_2k.c libtommath/bn_mp_reduce_is_2k_l.c libtommath/bn_mp_reduce_setup.c libtommath/bn_mp_root_u32.c libtommath/bn_mp_rshd.c libtommath/bn_mp_sbin_size.c libtommath/bn_mp_set.c libtommath/bn_mp_set_double.c libtommath/bn_mp_set_i32.c libtommath/bn_mp_set_i64.c libtommath/bn_mp_set_l.c libtommath/bn_mp_set_ll.c libtommath/bn_mp_set_u32.c libtommath/bn_mp_set_u64.c libtommath/bn_mp_set_ul.c libtommath/bn_mp_set_ull.c libtommath/bn_mp_shrink.c libtommath/bn_mp_signed_rsh.c libtommath/bn_mp_sqr.c libtommath/bn_mp_sqrmod.c libtommath/bn_mp_sqrt.c libtommath/bn_mp_sqrtmod_prime.c libtommath/bn_mp_sub.c libtommath/bn_mp_sub_d.c libtommath/bn_mp_submod.c libtommath/bn_mp_to_radix.c libtommath/bn_mp_to_sbin.c libtommath/bn_mp_to_ubin.c libtommath/bn_mp_ubin_size.c libtommath/bn_mp_unpack.c libtommath/bn_mp_xor.c libtommath/bn_mp_zero.c libtommath/bn_prime_tab.c libtommath/bn_s_mp_add.c libtommath/bn_s_mp_balance_mul.c libtommath/bn_s_mp_exptmod.c libtommath/bn_s_mp_exptmod_fast.c libtommath/bn_s_mp_get_bit.c libtommath/bn_s_mp_invmod_fast.c libtommath/bn_s_mp_invmod_slow.c libtommath/bn_s_mp_karatsuba_mul.c libtommath/bn_s_mp_karatsuba_sqr.c libtommath/bn_s_mp_montgomery_reduce_fast.c libtommath/bn_s_mp_mul_digs.c libtommath/bn_s_mp_mul_digs_fast.c libtommath/bn_s_mp_mul_high_digs.c libtommath/bn_s_mp_mul_high_digs_fast.c libtommath/bn_s_mp_prime_is_divisible.c libtommath/bn_s_mp_rand_jenkins.c libtommath/bn_s_mp_rand_platform.c libtommath/bn_s_mp_reverse.c libtommath/bn_s_mp_sqr.c libtommath/bn_s_mp_sqr_fast.c libtommath/bn_s_mp_sub.c libtommath/bn_s_mp_toom_mul.c libtommath/bn_s_mp_toom_sqr.c libtommath/demo/mtest_opponent.c libtommath/demo/shared.c libtommath/demo/shared.h libtommath/demo/test.c libtommath/demo/timing.c libtommath/etc/2kprime.c libtommath/etc/drprime.c libtommath/etc/mersenne.c libtommath/etc/mont.c libtommath/etc/pprime.c libtommath/etc/tune.c libtommath/mtest/logtab.h libtommath/mtest/mpi-config.h libtommath/mtest/mpi-types.h libtommath/mtest/mpi.c libtommath/mtest/mpi.h libtommath/mtest/mtest.c libtommath/tommath.h libtommath/tommath_class.h libtommath/tommath_cutoffs.h libtommath/tommath_private.h libtommath/tommath_superclass.h linenoise/LICENSE linenoise/Makefile linenoise/README.markdown linenoise/example.c linenoise/linenoise.c linenoise/linenoise.h ucd2c/Makefile ucd2c/UCD.zip ucd2c/UCD/ArabicShaping.txt ucd2c/UCD/BidiBrackets.txt ucd2c/UCD/BidiCharacterTest.txt ucd2c/UCD/BidiMirroring.txt ucd2c/UCD/BidiTest.txt ucd2c/UCD/Blocks.txt ucd2c/UCD/CJKRadicals.txt ucd2c/UCD/CaseFolding.txt ucd2c/UCD/CompositionExclusions.txt ucd2c/UCD/DerivedAge.txt ucd2c/UCD/DerivedCoreProperties.txt ucd2c/UCD/DerivedNormalizationProps.txt ucd2c/UCD/EastAsianWidth.txt ucd2c/UCD/EmojiSources.txt ucd2c/UCD/EquivalentUnifiedIdeograph.txt ucd2c/UCD/HangulSyllableType.txt ucd2c/UCD/Index.txt ucd2c/UCD/IndicPositionalCategory.txt ucd2c/UCD/IndicSyllabicCategory.txt ucd2c/UCD/Jamo.txt ucd2c/UCD/LineBreak.txt ucd2c/UCD/NameAliases.txt ucd2c/UCD/NamedSequences.txt ucd2c/UCD/NamedSequencesProv.txt ucd2c/UCD/NamesList.html ucd2c/UCD/NamesList.txt ucd2c/UCD/NormalizationCorrections.txt ucd2c/UCD/NormalizationTest.txt ucd2c/UCD/NushuSources.txt ucd2c/UCD/PropList.txt ucd2c/UCD/PropertyAliases.txt ucd2c/UCD/PropertyValueAliases.txt ucd2c/UCD/ReadMe.txt ucd2c/UCD/ScriptExtensions.txt ucd2c/UCD/Scripts.txt ucd2c/UCD/SpecialCasing.txt ucd2c/UCD/StandardizedVariants.txt ucd2c/UCD/TangutSources.txt ucd2c/UCD/USourceData.txt ucd2c/UCD/USourceGlyphs.pdf ucd2c/UCD/USourceRSChart.pdf ucd2c/UCD/UnicodeData.txt ucd2c/UCD/VerticalOrientation.txt ucd2c/UCD/auxiliary/GraphemeBreakProperty.txt ucd2c/UCD/auxiliary/GraphemeBreakTest.html ucd2c/UCD/auxiliary/GraphemeBreakTest.txt ucd2c/UCD/auxiliary/LineBreakTest.html ucd2c/UCD/auxiliary/LineBreakTest.txt ucd2c/UCD/auxiliary/SentenceBreakProperty.txt ucd2c/UCD/auxiliary/SentenceBreakTest.html ucd2c/UCD/auxiliary/SentenceBreakTest.txt ucd2c/UCD/auxiliary/WordBreakProperty.txt ucd2c/UCD/auxiliary/WordBreakTest.html ucd2c/UCD/auxiliary/WordBreakTest.txt ucd2c/UCD/emoji/ReadMe.txt ucd2c/UCD/emoji/emoji-data.txt ucd2c/UCD/emoji/emoji-variation-sequences.txt ucd2c/UCD/extracted/DerivedBidiClass.txt ucd2c/UCD/extracted/DerivedBinaryProperties.txt ucd2c/UCD/extracted/DerivedCombiningClass.txt ucd2c/UCD/extracted/DerivedDecompositionType.txt ucd2c/UCD/extracted/DerivedEastAsianWidth.txt ucd2c/UCD/extracted/DerivedGeneralCategory.txt ucd2c/UCD/extracted/DerivedJoiningGroup.txt ucd2c/UCD/extracted/DerivedJoiningType.txt ucd2c/UCD/extracted/DerivedLineBreak.txt ucd2c/UCD/extracted/DerivedName.txt ucd2c/UCD/extracted/DerivedNumericType.txt ucd2c/UCD/extracted/DerivedNumericValues.txt ucd2c/config.mk ucd2c/configure ucd2c/license.txt ucd2c/ucd.c ucd2c/ucd.h ucd2c/ucd2c ucd2c/ucd2c.c ucd2c/ucd2c.main.lo ucd2c/ucd2c.main.o '
+C3_EXTERNAL_SOURCES='libtommath/LICENSE libtommath/README.md libtommath/bn_cutoffs.c libtommath/bn_deprecated.c libtommath/bn_mp_2expt.c libtommath/bn_mp_abs.c libtommath/bn_mp_add.c libtommath/bn_mp_add_d.c libtommath/bn_mp_addmod.c libtommath/bn_mp_and.c libtommath/bn_mp_clamp.c libtommath/bn_mp_clear.c libtommath/bn_mp_clear_multi.c libtommath/bn_mp_cmp.c libtommath/bn_mp_cmp_d.c libtommath/bn_mp_cmp_mag.c libtommath/bn_mp_cnt_lsb.c libtommath/bn_mp_complement.c libtommath/bn_mp_copy.c libtommath/bn_mp_count_bits.c libtommath/bn_mp_decr.c libtommath/bn_mp_div.c libtommath/bn_mp_div_2.c libtommath/bn_mp_div_2d.c libtommath/bn_mp_div_3.c libtommath/bn_mp_div_d.c libtommath/bn_mp_dr_is_modulus.c libtommath/bn_mp_dr_reduce.c libtommath/bn_mp_dr_setup.c libtommath/bn_mp_error_to_string.c libtommath/bn_mp_exch.c libtommath/bn_mp_expt_u32.c libtommath/bn_mp_exptmod.c libtommath/bn_mp_exteuclid.c libtommath/bn_mp_fread.c libtommath/bn_mp_from_sbin.c libtommath/bn_mp_from_ubin.c libtommath/bn_mp_fwrite.c libtommath/bn_mp_gcd.c libtommath/bn_mp_get_double.c libtommath/bn_mp_get_i32.c libtommath/bn_mp_get_i64.c libtommath/bn_mp_get_l.c libtommath/bn_mp_get_ll.c libtommath/bn_mp_get_mag_u32.c libtommath/bn_mp_get_mag_u64.c libtommath/bn_mp_get_mag_ul.c libtommath/bn_mp_get_mag_ull.c libtommath/bn_mp_grow.c libtommath/bn_mp_incr.c libtommath/bn_mp_init.c libtommath/bn_mp_init_copy.c libtommath/bn_mp_init_i32.c libtommath/bn_mp_init_i64.c libtommath/bn_mp_init_l.c libtommath/bn_mp_init_ll.c libtommath/bn_mp_init_multi.c libtommath/bn_mp_init_set.c libtommath/bn_mp_init_size.c libtommath/bn_mp_init_u32.c libtommath/bn_mp_init_u64.c libtommath/bn_mp_init_ul.c libtommath/bn_mp_init_ull.c libtommath/bn_mp_invmod.c libtommath/bn_mp_is_square.c libtommath/bn_mp_iseven.c libtommath/bn_mp_isodd.c libtommath/bn_mp_kronecker.c libtommath/bn_mp_lcm.c libtommath/bn_mp_log_u32.c libtommath/bn_mp_lshd.c libtommath/bn_mp_mod.c libtommath/bn_mp_mod_2d.c libtommath/bn_mp_mod_d.c libtommath/bn_mp_montgomery_calc_normalization.c libtommath/bn_mp_montgomery_reduce.c libtommath/bn_mp_montgomery_setup.c libtommath/bn_mp_mul.c libtommath/bn_mp_mul_2.c libtommath/bn_mp_mul_2d.c libtommath/bn_mp_mul_d.c libtommath/bn_mp_mulmod.c libtommath/bn_mp_neg.c libtommath/bn_mp_or.c libtommath/bn_mp_pack.c libtommath/bn_mp_pack_count.c libtommath/bn_mp_prime_fermat.c libtommath/bn_mp_prime_frobenius_underwood.c libtommath/bn_mp_prime_is_prime.c libtommath/bn_mp_prime_miller_rabin.c libtommath/bn_mp_prime_next_prime.c libtommath/bn_mp_prime_rabin_miller_trials.c libtommath/bn_mp_prime_rand.c libtommath/bn_mp_prime_strong_lucas_selfridge.c libtommath/bn_mp_radix_size.c libtommath/bn_mp_radix_smap.c libtommath/bn_mp_rand.c libtommath/bn_mp_read_radix.c libtommath/bn_mp_reduce.c libtommath/bn_mp_reduce_2k.c libtommath/bn_mp_reduce_2k_l.c libtommath/bn_mp_reduce_2k_setup.c libtommath/bn_mp_reduce_2k_setup_l.c libtommath/bn_mp_reduce_is_2k.c libtommath/bn_mp_reduce_is_2k_l.c libtommath/bn_mp_reduce_setup.c libtommath/bn_mp_root_u32.c libtommath/bn_mp_rshd.c libtommath/bn_mp_sbin_size.c libtommath/bn_mp_set.c libtommath/bn_mp_set_double.c libtommath/bn_mp_set_i32.c libtommath/bn_mp_set_i64.c libtommath/bn_mp_set_l.c libtommath/bn_mp_set_ll.c libtommath/bn_mp_set_u32.c libtommath/bn_mp_set_u64.c libtommath/bn_mp_set_ul.c libtommath/bn_mp_set_ull.c libtommath/bn_mp_shrink.c libtommath/bn_mp_signed_rsh.c libtommath/bn_mp_sqr.c libtommath/bn_mp_sqrmod.c libtommath/bn_mp_sqrt.c libtommath/bn_mp_sqrtmod_prime.c libtommath/bn_mp_sub.c libtommath/bn_mp_sub_d.c libtommath/bn_mp_submod.c libtommath/bn_mp_to_radix.c libtommath/bn_mp_to_sbin.c libtommath/bn_mp_to_ubin.c libtommath/bn_mp_ubin_size.c libtommath/bn_mp_unpack.c libtommath/bn_mp_xor.c libtommath/bn_mp_zero.c libtommath/bn_prime_tab.c libtommath/bn_s_mp_add.c libtommath/bn_s_mp_balance_mul.c libtommath/bn_s_mp_exptmod.c libtommath/bn_s_mp_exptmod_fast.c libtommath/bn_s_mp_get_bit.c libtommath/bn_s_mp_invmod_fast.c libtommath/bn_s_mp_invmod_slow.c libtommath/bn_s_mp_karatsuba_mul.c libtommath/bn_s_mp_karatsuba_sqr.c libtommath/bn_s_mp_montgomery_reduce_fast.c libtommath/bn_s_mp_mul_digs.c libtommath/bn_s_mp_mul_digs_fast.c libtommath/bn_s_mp_mul_high_digs.c libtommath/bn_s_mp_mul_high_digs_fast.c libtommath/bn_s_mp_prime_is_divisible.c libtommath/bn_s_mp_rand_jenkins.c libtommath/bn_s_mp_rand_platform.c libtommath/bn_s_mp_reverse.c libtommath/bn_s_mp_sqr.c libtommath/bn_s_mp_sqr_fast.c libtommath/bn_s_mp_sub.c libtommath/bn_s_mp_toom_mul.c libtommath/bn_s_mp_toom_sqr.c libtommath/demo/mtest_opponent.c libtommath/demo/shared.c libtommath/demo/shared.h libtommath/demo/test.c libtommath/demo/timing.c libtommath/etc/2kprime.c libtommath/etc/drprime.c libtommath/etc/mersenne.c libtommath/etc/mont.c libtommath/etc/pprime.c libtommath/etc/tune.c libtommath/mtest/logtab.h libtommath/mtest/mpi-config.h libtommath/mtest/mpi-types.h libtommath/mtest/mpi.c libtommath/mtest/mpi.h libtommath/mtest/mtest.c libtommath/tommath.h libtommath/tommath_class.h libtommath/tommath_cutoffs.h libtommath/tommath_private.h libtommath/tommath_superclass.h linenoise/LICENSE linenoise/Makefile linenoise/README.markdown linenoise/example.c linenoise/linenoise.c linenoise/linenoise.h ucd2c/Makefile ucd2c/UCD.zip ucd2c/UCD/ArabicShaping.txt ucd2c/UCD/BidiBrackets.txt ucd2c/UCD/BidiCharacterTest.txt ucd2c/UCD/BidiMirroring.txt ucd2c/UCD/BidiTest.txt ucd2c/UCD/Blocks.txt ucd2c/UCD/CJKRadicals.txt ucd2c/UCD/CaseFolding.txt ucd2c/UCD/CompositionExclusions.txt ucd2c/UCD/DerivedAge.txt ucd2c/UCD/DerivedCoreProperties.txt ucd2c/UCD/DerivedNormalizationProps.txt ucd2c/UCD/EastAsianWidth.txt ucd2c/UCD/EmojiSources.txt ucd2c/UCD/EquivalentUnifiedIdeograph.txt ucd2c/UCD/HangulSyllableType.txt ucd2c/UCD/Index.txt ucd2c/UCD/IndicPositionalCategory.txt ucd2c/UCD/IndicSyllabicCategory.txt ucd2c/UCD/Jamo.txt ucd2c/UCD/LineBreak.txt ucd2c/UCD/NameAliases.txt ucd2c/UCD/NamedSequences.txt ucd2c/UCD/NamedSequencesProv.txt ucd2c/UCD/NamesList.txt ucd2c/UCD/NormalizationCorrections.txt ucd2c/UCD/NormalizationTest.txt ucd2c/UCD/NushuSources.txt ucd2c/UCD/PropList.txt ucd2c/UCD/PropertyAliases.txt ucd2c/UCD/PropertyValueAliases.txt ucd2c/UCD/ReadMe.txt ucd2c/UCD/ScriptExtensions.txt ucd2c/UCD/Scripts.txt ucd2c/UCD/SpecialCasing.txt ucd2c/UCD/StandardizedVariants.txt ucd2c/UCD/TangutSources.txt ucd2c/UCD/USourceData.txt ucd2c/UCD/USourceGlyphs.pdf ucd2c/UCD/USourceRSChart.pdf ucd2c/UCD/UnicodeData.txt ucd2c/UCD/VerticalOrientation.txt ucd2c/UCD/auxiliary/GraphemeBreakProperty.txt ucd2c/UCD/auxiliary/GraphemeBreakTest.txt ucd2c/UCD/auxiliary/LineBreakTest.txt ucd2c/UCD/auxiliary/SentenceBreakProperty.txt ucd2c/UCD/auxiliary/SentenceBreakTest.txt ucd2c/UCD/auxiliary/WordBreakProperty.txt ucd2c/UCD/auxiliary/WordBreakTest.txt ucd2c/UCD/emoji/ReadMe.txt ucd2c/UCD/emoji/emoji-data.txt ucd2c/UCD/emoji/emoji-variation-sequences.txt ucd2c/UCD/extracted/DerivedBidiClass.txt ucd2c/UCD/extracted/DerivedBinaryProperties.txt ucd2c/UCD/extracted/DerivedCombiningClass.txt ucd2c/UCD/extracted/DerivedDecompositionType.txt ucd2c/UCD/extracted/DerivedEastAsianWidth.txt ucd2c/UCD/extracted/DerivedGeneralCategory.txt ucd2c/UCD/extracted/DerivedJoiningGroup.txt ucd2c/UCD/extracted/DerivedJoiningType.txt ucd2c/UCD/extracted/DerivedLineBreak.txt ucd2c/UCD/extracted/DerivedName.txt ucd2c/UCD/extracted/DerivedNumericType.txt ucd2c/UCD/extracted/DerivedNumericValues.txt ucd2c/config.mk ucd2c/configure ucd2c/license.txt ucd2c/ucd.c ucd2c/ucd.h ucd2c/ucd2c ucd2c/ucd2c.c ucd2c/ucd2c.main.lo ucd2c/ucd2c.main.o '