diff options
| author | Mattias Andrée <maandree@kth.se> | 2024-07-19 01:29:42 +0200 |
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2024-07-19 01:29:42 +0200 |
| commit | 4294ec0ed06ee34920c9edaeebaeb8b65c720791 (patch) | |
| tree | e0cded59452597c04fb38f403745a384675cb5f9 /libnormalform_ref.c | |
| download | libnormalform-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 'libnormalform_ref.c')
| -rw-r--r-- | libnormalform_ref.c | 57 |
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 |
