aboutsummaryrefslogtreecommitdiffstats
path: root/libnormalform_ref.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2024-07-19 01:29:42 +0200
committerMattias Andrée <maandree@kth.se>2024-07-19 01:29:42 +0200
commit4294ec0ed06ee34920c9edaeebaeb8b65c720791 (patch)
treee0cded59452597c04fb38f403745a384675cb5f9 /libnormalform_ref.c
downloadlibnormalform-4294ec0ed06ee34920c9edaeebaeb8b65c720791.tar.gz
libnormalform-4294ec0ed06ee34920c9edaeebaeb8b65c720791.tar.bz2
libnormalform-4294ec0ed06ee34920c9edaeebaeb8b65c720791.tar.xz
First commit
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to '')
-rw-r--r--libnormalform_ref.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/libnormalform_ref.c b/libnormalform_ref.c
new file mode 100644
index 0000000..6d703eb
--- /dev/null
+++ b/libnormalform_ref.c
@@ -0,0 +1,57 @@
+/* See LICENSE file for copyright and license details. */
+#include "common.h"
+#ifndef TEST
+
+
+LIBNORMALFORM_SENTENCE *
+(libnormalform_ref)(LIBNORMALFORM_SENTENCE *this)
+{
+ if (this) {
+ if (this->refcount == SIZE_MAX) {
+ errno = ENOMEM;
+ return NULL;
+ }
+ this->refcount += 1;
+ }
+ return this;
+}
+
+
+#else
+
+
+int
+main(void)
+{
+ TEST_BEGIN;
+
+ LIBNORMALFORM_SENTENCE *a;
+
+ errno = 0;
+ ASSERT(!libnormalform_ref(NULL) && errno == 0);
+ errno = 1;
+ ASSERT(!libnormalform_ref(NULL) && errno == 1);
+
+ ASSUME(a = libnormalform_true());
+
+ a->refcount = SIZE_MAX;
+ errno = 0;
+ ASSERT(!libnormalform_ref(a) && errno == ENOMEM);
+ a->refcount -= 1;
+ ASSERT(libnormalform_ref(a) == a);
+ ASSERT(a->refcount == SIZE_MAX);
+
+ a->refcount = 1;
+ ASSERT(libnormalform_ref(a) == a);
+ ASSERT(a->refcount == 2);
+ ASSERT(libnormalform_ref(a) == a);
+ ASSERT(a->refcount == 3);
+
+ a->refcount = 1;
+ libnormalform_free(a);
+
+ TEST_END;
+}
+
+
+#endif