summaryrefslogtreecommitdiff
path: root/src/u8c
diff options
context:
space:
mode:
Diffstat (limited to 'src/u8c')
-rw-r--r--src/u8c/abrt.c35
-rw-r--r--src/u8c/dat.c (renamed from src/u8c/stat.h)15
-rw-r--r--src/u8c/dat.h (renamed from src/u8c/err.h)9
-rw-r--r--src/u8c/dattyp.h (renamed from src/u8c/errlock.h)21
-rw-r--r--src/u8c/debug.c9
-rw-r--r--src/u8c/end.c27
-rw-r--r--src/u8c/fmt.c4
-rw-r--r--src/u8c/geterr.c23
-rw-r--r--src/u8c/init.c22
-rw-r--r--src/u8c/isalnum.c7
-rw-r--r--src/u8c/isalpha.c48
-rw-r--r--src/u8c/iscntrl.c5
-rw-r--r--src/u8c/isdigit.c5
-rw-r--r--src/u8c/ispunct.c43
-rw-r--r--src/u8c/isspace.c5
-rw-r--r--src/u8c/isxdigit.c47
-rw-r--r--src/u8c/print.c3
-rw-r--r--src/u8c/println.c9
-rw-r--r--src/u8c/seterr.c18
-rw-r--r--src/u8c/setfmt.c42
-rw-r--r--src/u8c/thrdsafe.c7
-rw-r--r--src/u8c/u32alloc.c29
-rw-r--r--src/u8c/u32cat.c53
-rw-r--r--src/u8c/u32cmp.c15
-rw-r--r--src/u8c/u32cp.c22
-rw-r--r--src/u8c/u32fndchr.c40
-rw-r--r--src/u8c/u32fndpat.c51
-rw-r--r--src/u8c/u32free.c (renamed from src/u8c/err.c)11
-rw-r--r--src/u8c/u32substr.c48
-rw-r--r--src/u8c/u32sz.c20
-rw-r--r--src/u8c/u8alloc.c (renamed from src/u8c/errlock.c)18
-rw-r--r--src/u8c/u8dec.c31
-rw-r--r--src/u8c/u8enc.c35
-rw-r--r--src/u8c/u8free.c (renamed from src/u8c/stat.c)14
-rw-r--r--src/u8c/vfmt.c9
-rw-r--r--src/u8c/vprint.c22
36 files changed, 666 insertions, 156 deletions
diff --git a/src/u8c/abrt.c b/src/u8c/abrt.c
new file mode 100644
index 0000000..28361ec
--- /dev/null
+++ b/src/u8c/abrt.c
@@ -0,0 +1,35 @@
+/*
+ Copyright 2021 Gabriel Jensen
+
+ This file is part of u8c.
+
+ u8c is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+ u8c is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ See the GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License along with u8c.
+
+ If not, see <https://www.gnu.org/licenses/>.
+*/
+# include "dat.h"
+# include <inttypes.h>
+# include <stdbool.h>
+# include <stdint.h>
+# include <stdio.h>
+# include <stdlib.h>
+# include <stdnoreturn.h>
+# include <time.h>
+# include <u8c/abrt.h>
+# include <u8c/dbg.h>
+# include <u8c/end.h>
+# include <u8c/thrdsafe.h>
+# include <u8c/ver.h>
+noreturn bool u8c_abrt(char const * const _fl,long long const _ln,char const * const _fn,char const * const _why) {
+ fprintf(stderr,"u8c: *** Aborted (\"%s\":%lld in function \"%s\": \"%s\" @ %" PRIuMAX ") ***\nLibrary diagnostics:\n debug:%s\n status:%" PRIuLEAST8 "\n thread-safe:%s\n version:%" PRIuLEAST64 "\n",_fl,_ln,_fn,_why,(intmax_t)time(NULL),u8c_dbg ? "true" : "false",u8c_dat.stat,u8c_thrdsafe ? "true" : "false",u8c_ver);
+ fprintf(stderr,"Trying to clean up...\n");
+ u8c_end();
+ fprintf(stderr,"Aborting...\n");
+ abort();
+}
diff --git a/src/u8c/stat.h b/src/u8c/dat.c
index 8ca005e..0fcf492 100644
--- a/src/u8c/stat.h
+++ b/src/u8c/dat.c
@@ -13,9 +13,14 @@
If not, see <https://www.gnu.org/licenses/>.
*/
-/* Status */
-# if !defined(u8c_sym_stat)
-# define u8c_sym_stat
+# include "dat.h"
+# include "dattyp.h"
+# include <stdbool.h>
+# include <stddef.h>
# include <stdint.h>
-extern uint_least8_t u8c_stat;
-# endif
+# include <u8c/SIZE_C.h>
+struct u8c_dattyp u8c_dat = (struct u8c_dattyp){
+ .err = NULL,
+ .fmtendian = false,
+ .stat = UINT8_C(0x0),
+};
diff --git a/src/u8c/err.h b/src/u8c/dat.h
index 1537701..fdda8c7 100644
--- a/src/u8c/err.h
+++ b/src/u8c/dat.h
@@ -13,8 +13,9 @@
If not, see <https://www.gnu.org/licenses/>.
*/
-# if !defined(u8c_sym_err)
-# define u8c_sym_err
-# include <stdint.h>
-extern uint_least32_t const * u8c_err;
+/* Data */
+# if !defined(u8c_sym_dat)
+# define u8c_sym_dat
+# include "dattyp.h"
+extern struct u8c_dattyp u8c_dat;
# endif
diff --git a/src/u8c/errlock.h b/src/u8c/dattyp.h
index a77ade5..d094151 100644
--- a/src/u8c/errlock.h
+++ b/src/u8c/dattyp.h
@@ -13,11 +13,24 @@
If not, see <https://www.gnu.org/licenses/>.
*/
-/* Error lock */
-# if !defined(u8c_sym_errlock)
-# define u8c_sym_errlock
+# if !defined(u8c_sym_dattyp)
+# define u8c_sym_dattyp
+# include <stdbool.h>
+# include <stdint.h>
+# include <u8c/SIZE_C.h>
+# include <uchar.h>
# if defined(u8c_bethrdsafe)
# include <threads.h>
-extern mtx_t u8c_errlock;
# endif
+struct u8c_dattyp {
+ bool fmtendian;
+ char32_t const * err;
+ unsigned char pad0[sizeof(void(*)(void)) - SIZE_C(0x1)];
+ uint_least8_t fmtbase;
+ uint_least8_t stat;
+# if defined(u8c_bethrdsafe)
+ mtx_t errlock;
+ mtx_t fmtlock;
+# endif
+};
# endif
diff --git a/src/u8c/debug.c b/src/u8c/debug.c
index eb926eb..faa668e 100644
--- a/src/u8c/debug.c
+++ b/src/u8c/debug.c
@@ -13,11 +13,12 @@
If not, see <https://www.gnu.org/licenses/>.
*/
+# include <stdbool.h>
# include <stdint.h>
-# include <u8c/debug.h>
-uint_least8_t const u8c_debug =
+# include <u8c/dbg.h>
+bool const u8c_dbg =
# if defined(NDEBUG)
- UINT8_C(0x0);
+ false;
# else
- UINT8_C(0x1);
+ true;
# endif
diff --git a/src/u8c/end.c b/src/u8c/end.c
index af9661c..633ced7 100644
--- a/src/u8c/end.c
+++ b/src/u8c/end.c
@@ -13,24 +13,31 @@
If not, see <https://www.gnu.org/licenses/>.
*/
-# include "err.h"
-# include "errlock.h"
-# include "stat.h"
+# include "dat.h"
+# include <stdbool.h>
# include <stdint.h>
# include <stdlib.h>
# include <u8c/end.h>
+# include <u8c/SIZE_C.h>
# include <u8c/u32free.h>
# if defined(u8c_bethrdsafe)
# include <threads.h>
# endif
-uint_least8_t u8c_end(void) {
- if(u8c_stat) {
- return UINT8_C(0x0);
+bool u8c_end(void) {
+ if(u8c_dat.stat) {
+ return false;
}
# if defined(u8c_bethrdsafe)
- mtx_destroy(&u8c_errlock);
+ /* Destroy mutexes */
+ mtx_destroy(&u8c_dat.errlock);
+ mtx_destroy(&u8c_dat.fmtlock);
# endif
- u8c_u32free(u8c_err);
- u8c_stat = UINT8_C(0x1);
- return UINT8_C(0x0);
+ /* Free error message: */
+ u8c_u32free(&u8c_dat.err);
+ /* Set default formatting options: */
+ u8c_dat.fmtbase = UINT8_C(0xC);
+ u8c_dat.fmtendian = UINT8_C(0x0);
+ /* Set status: */
+ u8c_dat.stat = UINT8_C(0x1);
+ return false;
}
diff --git a/src/u8c/fmt.c b/src/u8c/fmt.c
index 67015da..7ea690b 100644
--- a/src/u8c/fmt.c
+++ b/src/u8c/fmt.c
@@ -14,11 +14,13 @@
If not, see <https://www.gnu.org/licenses/>.
*/
# include <stdarg.h>
+# include <stdbool.h>
# include <stddef.h>
# include <stdint.h>
# include <u8c/fmt.h>
+# include <u8c/u32cp.h>
# include <u8c/vfmt.h>
-uint_least8_t u8c_fmt(size_t * const _outsz,uint_least32_t const * * const _out,uint_least32_t const * const _in,...) {
+bool u8c_fmt(size_t * const _outsz,char32_t const * * const _out,char32_t const * const _in,...) {
va_list args;
va_start(args,_in);
uint_least8_t val = u8c_vfmt(_outsz,_out,_in,args);
diff --git a/src/u8c/geterr.c b/src/u8c/geterr.c
index 9f09327..a63ae20 100644
--- a/src/u8c/geterr.c
+++ b/src/u8c/geterr.c
@@ -13,26 +13,23 @@
If not, see <https://www.gnu.org/licenses/>.
*/
-# include "err.h"
-# include "errlock.h"
+# include "dat.h"
+# include <stdbool.h>
# include <stddef.h>
# include <stdint.h>
# include <u8c/geterr.h>
# include <u8c/seterr.h>
# include <u8c/u32cp.h>
-# include <u8c/u8free.h>
-uint_least8_t u8c_geterr(size_t * const _sz,uint_least32_t const * * const _out) {
- if(u8c_err == NULL) {
- u8c_seterr((uint_least32_t[]){UINT32_C(0x0)});
- }
+# include <u8c/u32free.h>
+bool u8c_geterr(size_t * const _sz,char32_t const * * const _out) {
# if defined(u8c_bethrdsafe)
- mtx_lock(&u8c_errlock);
+ mtx_lock(&u8c_dat.errlock);
# endif
- u8c_u32cp(_sz,_out,u8c_err);
- u8c_u8free(u8c_err);
- u8c_err = NULL;
+ u8c_u32cp(_sz,_out,u8c_dat.err);
+ u8c_u32free(&u8c_dat.err);
# if defined(u8c_bethrdsafe)
- mtx_unlock(&u8c_errlock);
+ mtx_unlock(&u8c_dat.errlock);
# endif
- return UINT8_C(0x0);
+ u8c_seterr((uint_least32_t[]){UINT32_C(0x0),});
+ return false;
}
diff --git a/src/u8c/init.c b/src/u8c/init.c
index e13f15a..3c15a1d 100644
--- a/src/u8c/init.c
+++ b/src/u8c/init.c
@@ -13,23 +13,29 @@
If not, see <https://www.gnu.org/licenses/>.
*/
-# include "err.h"
-# include "errlock.h"
-# include "stat.h"
+# include "dat.h"
+# include <stdbool.h>
# include <stddef.h>
# include <stdint.h>
# include <u8c/init.h>
+# include <u8c/seterr.h>
# include <u8c/u32cp.h>
# if defined(u8c_bethrdsafe)
# include <threads.h>
# endif
-uint_least8_t u8c_init(void) {
+bool u8c_init(void) {
# if defined(u8c_bethrdsafe)
- if(mtx_init(&u8c_errlock,mtx_plain) == thrd_error) {
- return UINT8_C(0x2);
+ if(mtx_init(&u8c_dat.errlock,mtx_plain) == thrd_error) {
+ return true;
+ }
+ if(mtx_init(&u8c_dat.fmtlock,mtx_plain) == thrd_error) {
+ return true;
}
# endif
+ /* Set default error message: */
+ u8c_dat.err = NULL;
+ u8c_seterr((uint_least32_t[]){UINT32_C(0x0),});
/* Set status: */
- u8c_stat = UINT8_C(0x0);
- return UINT8_C(0x0);
+ u8c_dat.stat = UINT8_C(0x0);
+ return false;
}
diff --git a/src/u8c/isalnum.c b/src/u8c/isalnum.c
index ae2e4c8..f8b5686 100644
--- a/src/u8c/isalnum.c
+++ b/src/u8c/isalnum.c
@@ -14,20 +14,21 @@
If not, see <https://www.gnu.org/licenses/>.
*/
# include <assert.h>
+# include <stdbool.h>
# include <stddef.h>
# include <stdint.h>
# include <u8c/isalnum.h>
# include <u8c/isalpha.h>
# include <u8c/isdigit.h>
-uint_least8_t u8c_isalnum(uint_least8_t * const _res,uint_least32_t const _chr) {
+bool u8c_isalnum(uint_least8_t * const _res,char32_t const _chr) {
assert(_res != NULL);
uint_least8_t res = UINT8_C(0x0);
u8c_isalpha(&res,_chr);
if(res) {
*_res = res;
- return UINT8_C(0x0);
+ return false;
}
u8c_isdigit(&res,_chr);
*_res = res;
- return UINT8_C(0x0);
+ return false;
}
diff --git a/src/u8c/isalpha.c b/src/u8c/isalpha.c
index bc6d5c0..b960bf5 100644
--- a/src/u8c/isalpha.c
+++ b/src/u8c/isalpha.c
@@ -14,10 +14,11 @@
If not, see <https://www.gnu.org/licenses/>.
*/
# include <assert.h>
+# include <stdbool.h>
# include <stddef.h>
# include <stdint.h>
# include <u8c/isalpha.h>
-uint_least8_t u8c_isalpha(uint_least8_t * const _res,uint_least32_t const _chr) {
+bool u8c_isalpha(uint_least8_t * const _res,char32_t const _chr) {
assert(_res != NULL);
switch(_chr) {
default:
@@ -65,13 +66,30 @@ uint_least8_t u8c_isalpha(uint_least8_t * const _res,uint_least32_t const _chr)
case UINT32_C(0xFC): /* U WITH TWO DOTS */
case UINT32_C(0xFD): /* LATIN SMALL LETTER Y WITH ACUTE */
case UINT32_C(0xFE): /* LATIN SMALL LETTER THORN */
+ case UINT32_C(0x105): /* LATIN SMALL LETTER A WITH OGONEK */
+ case UINT32_C(0x107): /* LATIN SMALL LETTER C WITH ACUTE */
+ case UINT32_C(0x10D): /* LATIN SMALL LETTER C WITH CARON */
+ case UINT32_C(0x10F): /* LATIN SMALL LETTER D WITH CARON */
+ case UINT32_C(0x119): /* LATIN SMALL LETTER E WITH OGONEK */
+ case UINT32_C(0x11B): /* LATIN SMALL LETTER E WITH CARON */
case UINT32_C(0x11F): /* LATIN SMALL LETTER G WITH BREVE */
case UINT32_C(0x131): /* LATIN SMALL LETTER DOTLESS I */
case UINT32_C(0x133): /* LATIN SMALL LIGATURE LJ */
case UINT32_C(0x138): /* LATIN SMALL LETTER KRA */
+ case UINT32_C(0x142): /* LATIN SMALL LETTER L WITH STROKE */
+ case UINT32_C(0x144): /* LATIN SMALL LETTER N WITH ACUTE */
+ case UINT32_C(0x148): /* LATIN SMALL LETTER N WITH CARON */
case UINT32_C(0x14B): /* LATIN SMALL LETTER ENG */
case UINT32_C(0x153): /* LATIN SMALL LIGATURE OE */
+ case UINT32_C(0x159): /* LATIN SMALL LETTER R WITH CARON */
+ case UINT32_C(0x15B): /* LATIN SMALL LETTER S WITH ACUTE */
case UINT32_C(0x15F): /* LATIN SMALL LETTER S WITH CEDILLA */
+ case UINT32_C(0x161): /* LATIN SMALL LETTER S WITH CARON */
+ case UINT32_C(0x165): /* LATIN SMALL LETTER T WITH CARON */
+ case UINT32_C(0x16F): /* LATIN SMALL LETTER U WITH RING ABOVE */
+ case UINT32_C(0x17A): /* LATIN SMALL LETTER Z WITH ACUTE */
+ case UINT32_C(0x17C): /* LATIN SMALL LETTER Z WITH DOT ABOVE */
+ case UINT32_C(0x17E): /* LATIN SMALL LETTER Z WITH CARON */
case UINT32_C(0x1BF): /* LATIN LETTER WYNN */
case UINT32_C(0x1DD): /* LATIN SMALL LETTER TURNED E */
case UINT32_C(0x21D): /* LATIN SMALL LETTER YOGH */
@@ -86,10 +104,36 @@ uint_least8_t u8c_isalpha(uint_least8_t * const _res,uint_least32_t const _chr)
case UINT32_C(0x28B): /* LATIN SMALL LETTER V WITH HOOK */
case UINT32_C(0x292): /* LATIN SMALL LETTER EZH */
case UINT32_C(0x294): /* LATIN SMALL LETTER GLOTTAL STOP */
+ case UINT32_C(0x3B1): /* GREEK SMALL LETTER ALPHA */
+ case UINT32_C(0x3B2): /* GREEK SMALL LETTER BETA */
+ case UINT32_C(0x3B3): /* GREEK SMALL LETTER GAMMA */
+ case UINT32_C(0x3B4): /* GREEK SMALL LETTER DELTA */
+ case UINT32_C(0x3B5): /* GREEK SMALL LETTER EPSILON */
+ case UINT32_C(0x3B6): /* GREEK SMALL LETTER ZETA */
+ case UINT32_C(0x3B7): /* GREEK SMALL LETTER ETA */
+ case UINT32_C(0x3B8): /* GREEK SMALL LETTER THETA */
+ case UINT32_C(0x3B9): /* GREEK SMALL LETTER IOTA */
+ case UINT32_C(0x3BA): /* GREEK SMALL LETTER KAPPA */
+ case UINT32_C(0x3BB): /* GREEK SMALL LETTER LAMBDA */
+ case UINT32_C(0x3BC): /* GREEK SMALL LETTER MU */
+ case UINT32_C(0x3BD): /* GREEK SMALL LETTER NU */
+ case UINT32_C(0x3BE): /* GREEK SMALL LETTER XI */
+ case UINT32_C(0x3BF): /* GREEK SMALL LETTER OMICRON */
+ case UINT32_C(0x3C0): /* GREEK SMALL LETTER PI */
+ case UINT32_C(0x3C1): /* GREEK SMALL LETTER RHO */
+ case UINT32_C(0x3C2): /* GREEK SMALL LETTER FINAL SIGMA */
+ case UINT32_C(0x3C3): /* GREEK SMALL LETTER SIGMA */
+ case UINT32_C(0x3C4): /* GREEK SMALL LETTER TAU */
+ case UINT32_C(0x3C5): /* GREEK SMALL LETTER UPSILON */
+ case UINT32_C(0x3C6): /* GREEK SMALL LETTER PHI */
+ case UINT32_C(0x3C7): /* GREEK SMALL LETTER CHI */
+ case UINT32_C(0x3C8): /* GREEK SMALL LETTER PSI */
+ case UINT32_C(0x3C9): /* GREEK SMALL LETTER OMEGA */
case UINT32_C(0x1D79): /* LATIN SMALL LETTER INSULAR G */
case UINT32_C(0xA7B7): /* LATIN SMALL LETTER OMEGA */
+ case UINT32_C(0xFB00): /* LATIN SMALL LIGATURE FF */
*_res = UINT8_C(0x1);
break;
}
- return UINT8_C(0x0);
+ return false;
}
diff --git a/src/u8c/iscntrl.c b/src/u8c/iscntrl.c
index 75d3fa5..4d698b2 100644
--- a/src/u8c/iscntrl.c
+++ b/src/u8c/iscntrl.c
@@ -14,10 +14,11 @@
If not, see <https://www.gnu.org/licenses/>.
*/
# include <assert.h>
+# include <stdbool.h>
# include <stddef.h>
# include <stdint.h>
# include <u8c/iscntrl.h>
-uint_least8_t u8c_iscntrl(uint_least8_t * const _res,uint_least32_t const _chr) {
+bool u8c_iscntrl(uint_least8_t * const _res,char32_t const _chr) {
assert(_res != NULL);
switch(_chr) {
default:
@@ -58,5 +59,5 @@ uint_least8_t u8c_iscntrl(uint_least8_t * const _res,uint_least32_t const _chr)
*_res = UINT8_C(0x1);
break;
}
- return UINT8_C(0x0);
+ return false;
}
diff --git a/src/u8c/isdigit.c b/src/u8c/isdigit.c
index ebfd7c2..e4c6f78 100644
--- a/src/u8c/isdigit.c
+++ b/src/u8c/isdigit.c
@@ -14,10 +14,11 @@
If not, see <https://www.gnu.org/licenses/>.
*/
# include <assert.h>
+# include <stdbool.h>
# include <stddef.h>
# include <stdint.h>
# include <u8c/isdigit.h>
-uint_least8_t u8c_isdigit(uint_least8_t * const _res,uint_least32_t const _chr) {
+bool u8c_isdigit(uint_least8_t * const _res,char32_t const _chr) {
assert(_res != NULL);
switch(_chr) {
default:
@@ -38,5 +39,5 @@ uint_least8_t u8c_isdigit(uint_least8_t * const _res,uint_least32_t const _chr)
*_res = UINT8_C(0x1);
break;
}
- return UINT8_C(0x0);
+ return false;
}
diff --git a/src/u8c/ispunct.c b/src/u8c/ispunct.c
index abdd72b..0298518 100644
--- a/src/u8c/ispunct.c
+++ b/src/u8c/ispunct.c
@@ -14,10 +14,11 @@
If not, see <https://www.gnu.org/licenses/>.
*/
# include <assert.h>
+# include <stdbool.h>
# include <stddef.h>
# include <stdint.h>
# include <u8c/ispunct.h>
-uint_least8_t u8c_ispunct(uint_least8_t * const _res,uint_least32_t const _chr) {
+bool u8c_ispunct(uint_least8_t * const _res,char32_t const _chr) {
assert(_res != NULL);
switch(_chr) {
default:
@@ -89,13 +90,51 @@ uint_least8_t u8c_ispunct(uint_least8_t * const _res,uint_least32_t const _chr)
case UINT32_C(0x20AC): /* EURO SIGN */
case UINT32_C(0x20B9): /* INDIAN RUPEE SIGN */
case UINT32_C(0x20BF): /* BITCOIN SIGN */
+ case UINT32_C(0x2103): /* DEGREE CELSIUS */
+ case UINT32_C(0x2107): /* EULER CONSTANT */
+ case UINT32_C(0x2109): /* DEGREE FAHRENHEIT */
+ case UINT32_C(0x210E): /* PLANCK CONSTANT */
+ case UINT32_C(0x2117): /* SOUND RECORDING COPYRIGHT */
+ case UINT32_C(0x2122): /* TRADE MARK SIGN */
+ case UINT32_C(0x2125): /* OUNCE SIGN */
+ case UINT32_C(0x2126): /* OHM SIGN */
+ case UINT32_C(0x212A): /* KELVIN SIGN */
+ case UINT32_C(0x214D): /* AKTIESELSKAB */
case UINT32_C(0x2205): /* EMPTY SET */
case UINT32_C(0x2212): /* MINUS SIGN */
+ case UINT32_C(0x221A): /* SQUARE ROOT */
+ case UINT32_C(0x221B): /* CUBE ROOT */
+ case UINT32_C(0x221C): /* FOURTH ROOT */
case UINT32_C(0x221E): /* INFINITY */
case UINT32_C(0x2248): /* ALMOST EQUAL TO */
case UINT32_C(0x2260): /* NOT EQUAL TO */
case UINT32_C(0x2264): /* LESS-THAN OR EQUAL TO */
case UINT32_C(0x2265): /* GREATER-THAN OR EQUAL TO */
+ case UINT32_C(0x2609): /* SUN */
+ case UINT32_C(0x263F): /* MERCURY */
+ case UINT32_C(0x2640): /* FEMALE SIGN */
+ case UINT32_C(0x2641): /* EARTH */
+ case UINT32_C(0x2642): /* MALE SIGN */
+ case UINT32_C(0x2643): /* JUPITER */
+ case UINT32_C(0x2644): /* SATURN */
+ case UINT32_C(0x2645): /* URANUS */
+ case UINT32_C(0x2646): /* NEPTUNE */
+ case UINT32_C(0x2647): /* PLUTO */
+ case UINT32_C(0x26A2): /* DOUBLED FEMALE SIGN */
+ case UINT32_C(0x26A3): /* DOUBLED MALE SIGN */
+ case UINT32_C(0x26A4): /* INTERLOCKED FEMALE AND MALE SIGN */
+ case UINT32_C(0x26A5): /* MALE AND FEMALE SIGN */
+ case UINT32_C(0x26B3): /* CERES */
+ case UINT32_C(0x26B4): /* PALLAS */
+ case UINT32_C(0x26B5): /* JUNO */
+ case UINT32_C(0x26B6): /* VESTA */
+ case UINT32_C(0x26B7): /* CHIRON */
+ case UINT32_C(0x2BD8): /* PROSERPINA */
+ case UINT32_C(0x2BD9): /* ASTRAEA */
+ case UINT32_C(0x2BDA): /* HYGIEA */
+ case UINT32_C(0x2BDB): /* PHOLOS */
+ case UINT32_C(0x2BDC): /* NESSUS */
+ case UINT32_C(0x33D7): /* SQUARE PH */
case UINT32_C(0xFDFC): /* RIAL SIGN */
case UINT32_C(0x1F10D): /* CIRCLED ZERO WITH SLASH */
case UINT32_C(0x1F10E): /* CIRCLED ANTICKLOCKWISE ARROW */
@@ -107,5 +146,5 @@ uint_least8_t u8c_ispunct(uint_least8_t * const _res,uint_least32_t const _chr)
*_res = UINT8_C(0x1);
break;
}
- return UINT8_C(0x0);
+ return false;
}
diff --git a/src/u8c/isspace.c b/src/u8c/isspace.c
index 8b1ad9b..deca03c 100644
--- a/src/u8c/isspace.c
+++ b/src/u8c/isspace.c
@@ -14,10 +14,11 @@
If not, see <https://www.gnu.org/licenses/>.
*/
# include <assert.h>
+# include <stdbool.h>
# include <stddef.h>
# include <stdint.h>
# include <u8c/isspace.h>
-uint_least8_t u8c_isspace(uint_least8_t * const _res,uint_least32_t const _chr) {
+bool u8c_isspace(uint_least8_t * const _res,char32_t const _chr) {
assert(_res != NULL);
switch(_chr) {
default:
@@ -32,5 +33,5 @@ uint_least8_t u8c_isspace(uint_least8_t * const _res,uint_least32_t const _chr)
*_res = UINT8_C(0x1);
break;
}
- return UINT8_C(0x0);
+ return false;
}
diff --git a/src/u8c/isxdigit.c b/src/u8c/isxdigit.c
new file mode 100644
index 0000000..ae12ae3
--- /dev/null
+++ b/src/u8c/isxdigit.c
@@ -0,0 +1,47 @@
+/*
+ Copyright 2021 Gabriel Jensen
+
+ This file is part of u8c.
+
+ u8c is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+ u8c is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ See the GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License along with u8c.
+
+ If not, see <https://www.gnu.org/licenses/>.
+*/
+# include <assert.h>
+# include <stdbool.h>
+# include <stddef.h>
+# include <stdint.h>
+# include <u8c/isxdigit.h>
+bool u8c_isxdigit(uint_least8_t * const _res,char32_t const _chr) {
+ assert(_res != NULL);
+ switch(_chr) {
+ default:
+ *_res = UINT8_C(0x0);
+ break;
+ case UINT32_C(0x30): /* DIGIT ZERO */
+ case UINT32_C(0x31): /* DIGIT ONE */
+ case UINT32_C(0x32): /* DIGIT TWO */
+ case UINT32_C(0x33): /* DIGIT THREE */
+ case UINT32_C(0x34): /* DIGIT FOUR */
+ case UINT32_C(0x35): /* DIGIT FIVE */
+ case UINT32_C(0x36): /* DIGIT SIX */
+ case UINT32_C(0x37): /* DIGIT SEVEN */
+ case UINT32_C(0x38): /* DIGIT EIGHT */
+ case UINT32_C(0x39): /* DIGIT NINE */
+ case UINT32_C(0x41): /* LATIN CAPITAL LETTER A */
+ case UINT32_C(0x42): /* LATIN CAPITAL LETTER B */
+ case UINT32_C(0x43): /* LATIN CAPITAL LETTER C */
+ case UINT32_C(0x44): /* LATIN CAPITAL LETTER D */
+ case UINT32_C(0x45): /* LATIN CAPITAL LETTER E */
+ case UINT32_C(0x46): /* LATIN CAPITAL LETTER F */
+ *_res = UINT8_C(0x1);
+ break;
+ }
+ return false;
+}
diff --git a/src/u8c/print.c b/src/u8c/print.c
index d8fb7d7..5c34749 100644
--- a/src/u8c/print.c
+++ b/src/u8c/print.c
@@ -14,10 +14,11 @@
If not, see <https://www.gnu.org/licenses/>.
*/
# include <stdarg.h>
+# include <stdbool.h>
# include <stdint.h>
# include <u8c/print.h>
# include <u8c/vprint.h>
-uint_least8_t u8c_print(FILE * _fp,uint_least32_t const * const _msg,...) {
+bool u8c_print(FILE * _fp,char32_t const * const _msg,...) {
va_list args;
va_start(args,_msg);
uint_least8_t val = u8c_vprint(_fp,_msg,args);
diff --git a/src/u8c/println.c b/src/u8c/println.c
index dcf592d..fbfd046 100644
--- a/src/u8c/println.c
+++ b/src/u8c/println.c
@@ -15,22 +15,23 @@
*/
# include <assert.h>
# include <stdarg.h>
+# include <stdbool.h>
# include <stdint.h>
# include <stdio.h>
# include <u8c/println.h>
# include <u8c/seterr.h>
# include <u8c/vprint.h>
-uint_least8_t u8c_println(FILE * _fp,uint_least32_t const * const _msg,...) {
+bool u8c_println(FILE * _fp,char32_t const * const _msg,...) {
assert(_fp != NULL);
va_list args;
va_start(args,_msg);
if(u8c_vprint(_fp,_msg,args)) {
- return UINT8_C(0x1);
+ return true;
}
if(fputc(0xA,stdout) == EOF) {
u8c_seterr((uint_least32_t[]){UINT32_C(0x75),UINT32_C(0x38),UINT32_C(0x63),UINT32_C(0x5F),UINT32_C(0x70),UINT32_C(0x72),UINT32_C(0x69),UINT32_C(0x6E),UINT32_C(0x74),UINT32_C(0x6C),UINT32_C(0x6E),UINT32_C(0x3A),UINT32_C(0x20),UINT32_C(0x66),UINT32_C(0x70),UINT32_C(0x75),UINT32_C(0x74),UINT32_C(0x63),UINT32_C(0x3A),UINT32_C(0x20),UINT32_C(0x55),UINT32_C(0x6E),UINT32_C(0x61),UINT32_C(0x62),UINT32_C(0x6C),UINT32_C(0x65),UINT32_C(0x20),UINT32_C(0x74),UINT32_C(0x6F),UINT32_C(0x20),UINT32_C(0x77),UINT32_C(0x72),UINT32_C(0x69),UINT32_C(0x74),UINT32_C(0x65),UINT32_C(0x20),UINT32_C(0x74),UINT32_C(0x6F),UINT32_C(0x20),UINT32_C(0x73),UINT32_C(0x74),UINT32_C(0x64),UINT32_C(0x6F),UINT32_C(0x75),UINT32_C(0x74),UINT32_C(0x2E),UINT32_C(0x0),}); /* u8c_println: fputc: Unable to write to stdout. */
- return UINT8_C(0x0);
+ return false;
}
va_end(args);
- return UINT8_C(0x0);
+ return false;
}
diff --git a/src/u8c/seterr.c b/src/u8c/seterr.c
index c500ff4..7c7fb12 100644
--- a/src/u8c/seterr.c
+++ b/src/u8c/seterr.c
@@ -13,9 +13,9 @@
If not, see <https://www.gnu.org/licenses/>.
*/
-# include "err.h"
-# include "errlock.h"
+# include "dat.h"
# include <assert.h>
+# include <stdbool.h>
# include <stdint.h>
# include <stdlib.h>
# include <u8c/dbgprint.h>
@@ -25,16 +25,16 @@
# if defined(u8c_bethrdsafe)
# include <threads.h>
# endif
-uint_least8_t u8c_seterr(uint_least32_t const * const _msg) {
+bool u8c_seterr(char32_t const * const _msg) {
assert(_msg != NULL);
- u8c_dbgprint(_msg);
+ //u8c_dbgprint(_msg);
# if defined(u8c_bethrdsafe)
- mtx_lock(&u8c_errlock);
+ mtx_lock(&u8c_dat.errlock);
# endif
- u8c_u32free(u8c_err);
- u8c_u32cp(NULL,&u8c_err,_msg);
+ u8c_u32free(&u8c_dat.err);
+ u8c_u32cp(NULL,&u8c_dat.err,_msg);
# if defined(u8c_bethrdsafe)
- mtx_unlock(&u8c_errlock);
+ mtx_unlock(&u8c_dat.errlock);
# endif
- return UINT8_C(0x0);
+ return false;
}
diff --git a/src/u8c/setfmt.c b/src/u8c/setfmt.c
new file mode 100644
index 0000000..70b5c93
--- /dev/null
+++ b/src/u8c/setfmt.c
@@ -0,0 +1,42 @@
+/*
+ Copyright 2021 Gabriel Jensen
+
+ This file is part of u8c.
+
+ u8c is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+ u8c is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ See the GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License along with u8c.
+
+ If not, see <https://www.gnu.org/licenses/>.
+*/
+# include "dat.h"
+# include <stdbool.h>
+# include <stdint.h>
+# include <u8c/seterr.h>
+# include <u8c/setfmt.h>
+# if defined(u8c_bethrdsafe)
+# include <threads.h>
+# endif
+bool u8c_setfmt(unsigned char const _base,unsigned char const _endian) {
+ uint_least8_t base = _base;
+ uint_least8_t endian = _endian;
+ if(_base > UINT8_C(0x20)) {
+ base = UINT8_C(0xC);
+ }
+ if(_endian > UINT8_C(0x1)) {
+ endian = UINT8_C(0x0);
+ }
+# if defined(u8c_bethrdsafe)
+ mtx_lock(&u8c_dat.fmtlock);
+# endif
+ u8c_dat.fmtbase = base;
+ u8c_dat.fmtendian = endian;
+# if defined(u8c_bethrdsafe)
+ mtx_unlock(&u8c_dat.fmtlock);
+# endif
+ return false;
+}
diff --git a/src/u8c/thrdsafe.c b/src/u8c/thrdsafe.c
index 3cb4c4d..c32a2e7 100644
--- a/src/u8c/thrdsafe.c
+++ b/src/u8c/thrdsafe.c
@@ -13,11 +13,12 @@
If not, see <https://www.gnu.org/licenses/>.
*/
+# include <stdbool.h>
# include <stdint.h>
# include <u8c/thrdsafe.h>
-uint_least8_t const u8c_thrdsafe =
+bool const u8c_thrdsafe =
# if defined(u8c_bethrdsafe)
- UINT8_C(0x1);
+ true;
# else
- UINT8_C(0x0);
+ false;
# endif
diff --git a/src/u8c/u32alloc.c b/src/u8c/u32alloc.c
new file mode 100644
index 0000000..804d564
--- /dev/null
+++ b/src/u8c/u32alloc.c
@@ -0,0 +1,29 @@
+/*
+ Copyright 2021 Gabriel Jensen
+
+ This file is part of u8c.
+
+ u8c is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+ u8c is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ See the GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License along with u8c.
+
+ If not, see <https://www.gnu.org/licenses/>.
+*/
+# include <stdbool.h>
+# include <stdlib.h>
+# include <u8c/seterr.h>
+# include <u8c/u32alloc.h>
+# include <uchar.h>
+bool u8c_u32alloc(char32_t * * const _u32,size_t const _sz) {
+ char32_t * arr = NULL;
+ if((arr = calloc(sizeof *arr,_sz)) == NULL) {
+ u8c_seterr(U"u8c_u32alloc: Unable to allocate resources (not enough memory?).");
+ return true;
+ }
+ *_u32 = arr;
+ return false;
+}
diff --git a/src/u8c/u32cat.c b/src/u8c/u32cat.c
new file mode 100644
index 0000000..409030e
--- /dev/null
+++ b/src/u8c/u32cat.c
@@ -0,0 +1,53 @@
+/*
+ Copyright 2021 Gabriel Jensen
+
+ This file is part of u8c.
+
+ u8c is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+ u8c is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ See the GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License along with u8c.
+
+ If not, see <https://www.gnu.org/licenses/>.
+*/
+# include <assert.h>
+# include <stdbool.h>
+# include <stdlib.h>
+# include <u8c/SIZE_C.h>
+# include <u8c/seterr.h>
+# include <u8c/u32alloc.h>
+# include <u8c/u32cat.h>
+# include <u8c/u32cp.h>
+# include <u8c/u32free.h>
+# include <u8c/u32sz.h>
+# include <uchar.h>
+bool u8c_u32cat(size_t * const _sz,char32_t const * * const _out,char32_t const * const _lstr,char32_t const * const _rstr) {
+ assert(_out != NULL);
+ assert(_lstr != NULL);
+ assert(_rstr != NULL);
+ size_t sz = SIZE_C(0x0);
+ size_t lsz = SIZE_C(0x0);
+ size_t rsz = SIZE_C(0x0);
+ u8c_u32sz(&lsz,_lstr);
+ u8c_u32sz(&rsz,_rstr);
+ sz = lsz + rsz - SIZE_C(0x1);
+ if(_sz != NULL) {
+ *_sz = sz;
+ }
+ char32_t * out = NULL;
+ if(u8c_u32alloc(&out,sz + SIZE_C(0x1))) {
+ return false;
+ }
+ for(register size_t n = SIZE_C(0x0);n < lsz - SIZE_C(0x1);n += SIZE_C(0x1)) {
+ out[n] = _lstr[n];
+ }
+ for(register size_t n = SIZE_C(0x0);n < rsz;n += SIZE_C(0x1)) {
+ out[n + lsz - SIZE_C(0x1)] = _rstr[n];
+ }
+ u8c_u32free(_out);
+ *_out = out;
+ return false;
+}
diff --git a/src/u8c/u32cmp.c b/src/u8c/u32cmp.c
index 3f8e405..1dabfef 100644
--- a/src/u8c/u32cmp.c
+++ b/src/u8c/u32cmp.c
@@ -14,31 +14,32 @@
If not, see <https://www.gnu.org/licenses/>.
*/
# include <assert.h>
+# include <stdbool.h>
# include <stddef.h>
# include <stdint.h>
# include <u8c/seterr.h>
# include <u8c/SIZE_C.h>
# include <u8c/u32cmp.h>
-uint_least8_t u8c_u32cmp(uint_least8_t * const _res,uint_least32_t const * const _lstr,uint_least32_t const * const _rstr) {
+bool u8c_u32cmp(uint_least8_t * const _res,char32_t const * const _lstr,char32_t const * const _rstr) {
assert(_res != NULL);
assert(_lstr != NULL);
assert(_rstr != NULL);
for(register size_t n = SIZE_C(0x0);n <= SIZE_MAX;n += SIZE_C(0x1)) {
- register uint_least32_t const lchr = _lstr[n];
- register uint_least32_t const rchr = _rstr[n];
+ register char32_t const lchr = _lstr[n];
+ register char32_t const rchr = _rstr[n];
if(lchr != rchr) {
if(lchr < rchr) {
*_res = UINT8_C(0x0);
- return UINT8_C(0x0);
+ return false;
}
*_res = UINT8_C(0x2);
- return UINT8_C(0x0);
+ return false;
}
if(lchr == UINT32_C(0x0)) {
*_res = UINT8_C(0x1);
- return UINT8_C(0x0);
+ return false;
}
}
u8c_seterr((uint_least32_t[]){UINT32_C(0x75),UINT32_C(0x38),UINT32_C(0x63),UINT32_C(0x5F),UINT32_C(0x75),UINT32_C(0x33),UINT32_C(0x32),UINT32_C(0x63),UINT32_C(0x6D),UINT32_C(0x70),UINT32_C(0x3A),UINT32_C(0x20),UINT32_C(0x55),UINT32_C(0x6E),UINT32_C(0x74),UINT32_C(0x65),UINT32_C(0x72),UINT32_C(0x6D),UINT32_C(0x69),UINT32_C(0x6E),UINT32_C(0x61),UINT32_C(0x74),UINT32_C(0x65),UINT32_C(0x64),UINT32_C(0x20),UINT32_C(0x69),UINT32_C(0x6E),UINT32_C(0x70),UINT32_C(0x75),UINT32_C(0x74),UINT32_C(0x2E),UINT32_C(0x0),}); /* u8c_u32cmp: Unterminated input. */
- return UINT8_C(0x1);
+ return true;
}
diff --git a/src/u8c/u32cp.c b/src/u8c/u32cp.c
index 35e8940..979686f 100644
--- a/src/u8c/u32cp.c
+++ b/src/u8c/u32cp.c
@@ -14,28 +14,32 @@
If not, see <https://www.gnu.org/licenses/>.
*/
# include <assert.h>
-# include <stdint.h>
+# include <stdbool.h>
# include <stdlib.h>
-# include <u8c/seterr.h>
# include <u8c/SIZE_C.h>
+# include <u8c/seterr.h>
+# include <u8c/u32alloc.h>
# include <u8c/u32cp.h>
+# include <u8c/u32free.h>
# include <u8c/u32sz.h>
-uint_least8_t u8c_u32cp(size_t * const _sz,uint_least32_t const * * const _out,uint_least32_t const * const _in) {
+bool u8c_u32cp(size_t * const _sz,char32_t const * * const _out,char32_t const * const _in) {
+ assert(_out != NULL);
assert(_in != NULL);
+ if(*_out != NULL) {
+ u8c_u32free(&*_out);
+ }
size_t insz = SIZE_C(0x0);
u8c_u32sz(&insz,_in);
- assert(insz > SIZE_C(0x0));
if(_sz != NULL) {
*_sz = insz;
}
- uint_least32_t * out;
- if((out = calloc(sizeof(uint_least32_t),insz)) == NULL) {
- u8c_seterr((uint_least32_t[]){UINT32_C(0x75),UINT32_C(0x38),UINT32_C(0x63),UINT32_C(0x5F),UINT32_C(0x75),UINT32_C(0x33),UINT32_C(0x32),UINT32_C(0x63),UINT32_C(0x70),UINT32_C(0x3A),UINT32_C(0x20),UINT32_C(0x55),UINT32_C(0x6E),UINT32_C(0x61),UINT32_C(0x62),UINT32_C(0x6C),UINT32_C(0x65),UINT32_C(0x20),UINT32_C(0x74),UINT32_C(0x6F),UINT32_C(0x20),UINT32_C(0x61),UINT32_C(0x6C),UINT32_C(0x6C),UINT32_C(0x6F),UINT32_C(0x63),UINT32_C(0x61),UINT32_C(0x74),UINT32_C(0x65),UINT32_C(0x20),UINT32_C(0x72),UINT32_C(0x65),UINT32_C(0x73),UINT32_C(0x6F),UINT32_C(0x75),UINT32_C(0x72),UINT32_C(0x63),UINT32_C(0x65),UINT32_C(0x73),UINT32_C(0x2E),UINT32_C(0x0),}); /* u8c_u32cp: Unable to allocate resources. */
- return UINT8_C(0x1);
+ uint_least32_t * out = NULL;
+ if(u8c_u32alloc(&out,insz + SIZE_C(0x1))) {
+ return false;
}
for(register size_t n = SIZE_C(0x0);n < insz;n += SIZE_C(0x1)) {
out[n] = _in[n];
}
*_out = out;
- return UINT8_C(0x0);
+ return false;
}
diff --git a/src/u8c/u32fndchr.c b/src/u8c/u32fndchr.c
new file mode 100644
index 0000000..ca83998
--- /dev/null
+++ b/src/u8c/u32fndchr.c
@@ -0,0 +1,40 @@
+/*
+ Copyright 2021 Gabriel Jensen
+
+ This file is part of u8c.
+
+ u8c is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+ u8c is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ See the GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License along with u8c.
+
+ If not, see <https://www.gnu.org/licenses/>.
+*/
+# include <assert.h>
+# include <stdbool.h>
+# include <stddef.h>
+# include <stdint.h>
+# include <u8c/SIZE_C.h>
+# include <u8c/seterr.h>
+# include <u8c/u32fndchr.h>
+# include <u8c/u32sz.h>
+bool u8c_u32fndchr(size_t * const _pos,char32_t const * const _in,char32_t const _chr) {
+ assert(_pos != NULL);
+ assert(_in != NULL);
+ for(register size_t n = SIZE_C(0x0);n <= SIZE_MAX;n += SIZE_C(0x1)) {
+ if(_in[n] == UINT32_C(0x0) && _chr != UINT32_C(0x0)) {
+ *_pos = SIZE_C(-0x1);
+ return true;
+ }
+ if(_in[n] == _chr) {
+ *_pos = n;
+ return false;
+ }
+ }
+ u8c_seterr(U"u8c_u32fndchr: Unterminated input.");
+ *_pos = SIZE_C(-0x1);
+ return true;
+}
diff --git a/src/u8c/u32fndpat.c b/src/u8c/u32fndpat.c
new file mode 100644
index 0000000..05071e5
--- /dev/null
+++ b/src/u8c/u32fndpat.c
@@ -0,0 +1,51 @@
+/*
+ Copyright 2021 Gabriel Jensen
+
+ This file is part of u8c.
+
+ u8c is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+ u8c is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ See the GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License along with u8c.
+
+ If not, see <https://www.gnu.org/licenses/>.
+*/
+# include <assert.h>
+# include <stdbool.h>
+# include <stddef.h>
+# include <stdint.h>
+# include <u8c/SIZE_C.h>
+# include <u8c/seterr.h>
+# include <u8c/u32cmp.h>
+# include <u8c/u32fndpat.h>
+# include <u8c/u32free.h>
+# include <u8c/u32substr.h>
+# include <u8c/u32sz.h>
+bool u8c_u32fndpat(size_t * const _pos,char32_t const * const _in,char32_t const * const _pat) {
+ assert(_pos != NULL);
+ assert(_in != NULL);
+ size_t insz = SIZE_C(0x0);
+ size_t patsz = SIZE_C(0x0);
+ u8c_u32sz(&insz,_in);
+ u8c_u32sz(&patsz,_pat);
+ if(insz == SIZE_C(0x1) || insz < patsz) {
+ *_pos = SIZE_C(-0x1);
+ return false;
+ }
+ for(register size_t n = SIZE_C(0x0);n < insz - patsz;n += SIZE_C(0x1)) {
+ char32_t const * str = NULL;
+ u8c_u32substr(&str,n,patsz - SIZE_C(0x1),_in);
+ uint_least8_t cmpres = UINT8_C(0x0);
+ u8c_u32cmp(&cmpres,str,_pat);
+ u8c_u32free(&str);
+ if(cmpres == UINT8_C(0x1)) {
+ *_pos = n;
+ return false;
+ }
+ }
+ *_pos = SIZE_C(-0x1);
+ return false;
+}
diff --git a/src/u8c/err.c b/src/u8c/u32free.c
index 77a8221..62b43ef 100644
--- a/src/u8c/err.c
+++ b/src/u8c/u32free.c
@@ -13,7 +13,12 @@
If not, see <https://www.gnu.org/licenses/>.
*/
-# include "err.h"
-# include <stddef.h>
+# include <stdbool.h>
# include <stdint.h>
-uint_least32_t const * u8c_err = NULL;
+# include <stdlib.h>
+# include <u8c/u32free.h>
+bool u8c_u32free(char32_t const * * const _u32) {
+ free((char32_t *)*_u32);
+ *_u32 = NULL;
+ return false;
+}
diff --git a/src/u8c/u32substr.c b/src/u8c/u32substr.c
new file mode 100644
index 0000000..2a30b3b
--- /dev/null
+++ b/src/u8c/u32substr.c
@@ -0,0 +1,48 @@
+/*
+ Copyright 2021 Gabriel Jensen
+
+ This file is part of u8c.
+
+ u8c is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
+
+ u8c is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+
+ See the GNU Affero General Public License for more details.
+
+ You should have received a copy of the GNU Affero General Public License along with u8c.
+
+ If not, see <https://www.gnu.org/licenses/>.
+*/
+# include <assert.h>
+# include <stdbool.h>
+# include <stdlib.h>
+# include <u8c/SIZE_C.h>
+# include <u8c/u32alloc.h>
+# include <u8c/u32free.h>
+# include <u8c/u32substr.h>
+# include <u8c/u32sz.h>
+# include <uchar.h>
+bool u8c_u32substr(char32_t const * * const _out,size_t const _start,size_t const _len,char32_t const * const _in) {
+ assert(_out != NULL);
+ assert(_in != NULL);
+ u8c_u32free(_out);
+ size_t insz = SIZE_C(0x0);
+ u8c_u32sz(&insz,_in);
+ size_t len = _len;
+ if(_len == SIZE_C(0x0)) {
+ len = insz - _start;
+ }
+ if(insz < _start + len) {
+ return false;
+ }
+ size_t const outsz = len + SIZE_C(0x2);
+ char32_t * out = NULL;
+ if(u8c_u32alloc(&out,outsz)) {
+ return false;
+ }
+ for(register size_t n = SIZE_C(0x0);n <= len;n += SIZE_C(0x1)) {
+ out[n] = _in[n + _start];
+ }
+ *_out = out;
+ return false;
+}
diff --git a/src/u8c/u32sz.c b/src/u8c/u32sz.c
index ca8b1be..9dc2108 100644
--- a/src/u8c/u32sz.c
+++ b/src/u8c/u32sz.c
@@ -14,20 +14,18 @@
If not, see <https://www.gnu.org/licenses/>.
*/
# include <assert.h>
+# include <stdbool.h>
# include <stddef.h>
-# include <stdint.h>
-# include <u8c/seterr.h>
# include <u8c/SIZE_C.h>
+# include <u8c/u32fndchr.h>
# include <u8c/u32sz.h>
-uint_least8_t u8c_u32sz(size_t * const _sz,uint_least32_t const * const _u32) {
+# include <uchar.h>
+bool u8c_u32sz(size_t * const _sz,char32_t const * const _in) {
assert(_sz != NULL);
- assert(_u32 != NULL);
- for(register size_t n = SIZE_C(0x0);n <= SIZE_MAX;n += SIZE_C(0x1)) {
- if(_u32[n] == UINT32_C(0x0)) {
- *_sz = n + SIZE_C(0x1);
- return UINT8_C(0x0);
- }
+ size_t sz = SIZE_C(0x0);
+ if(u8c_u32fndchr(&sz,_in,U'\0')) {
+ return true;
}
- u8c_seterr((uint_least32_t[]){UINT32_C(0x75),UINT32_C(0x38),UINT32_C(0x63),UINT32_C(0x5F),UINT32_C(0x75),UINT32_C(0x33),UINT32_C(0x32),UINT32_C(0x73),UINT32_C(0x7A),UINT32_C(0x3A),UINT32_C(0x20),UINT32_C(0x55),UINT32_C(0x6E),UINT32_C(0x74),UINT32_C(0x65),UINT32_C(0x72),UINT32_C(0x6D),UINT32_C(0x69),UINT32_C(0x6E),UINT32_C(0x61),UINT32_C(0x74),UINT32_C(0x65),UINT32_C(0x64),UINT32_C(0x20),UINT32_C(0x69),UINT32_C(0x6E),UINT32_C(0x70),UINT32_C(0x75),UINT32_C(0x74),UINT32_C(0x2E),UINT32_C(0x0),}); /* u8c_u32sz: Unterminated input. */
- return UINT8_C(0x1);
+ *_sz = sz;
+ return true;
}
diff --git a/src/u8c/errlock.c b/src/u8c/u8alloc.c
index b63a435..a364acf 100644
--- a/src/u8c/errlock.c
+++ b/src/u8c/u8alloc.c
@@ -13,8 +13,16 @@
If not, see <https://www.gnu.org/licenses/>.
*/
-# include "errlock.h"
-# if defined(u8c_bethrdsafe)
-# include <threads.h>
-mtx_t u8c_errlock;
-# endif
+# include <stdbool.h>
+# include <stdlib.h>
+# include <u8c/seterr.h>
+# include <u8c/u8alloc.h>
+bool u8c_u8alloc(unsigned char * * const _u8,size_t const _sz) {
+ unsigned char * arr = NULL;
+ if((arr = calloc(sizeof *arr,_sz)) == NULL) {
+ u8c_seterr(U"u8c_u8alloc: Unable to allocate resources (not enough memory?).");
+ return true;
+ }
+ *_u8 = arr;
+ return false;
+}
diff --git a/src/u8c/u8dec.c b/src/u8c/u8dec.c
index dfbfeaf..bbc6e94 100644
--- a/src/u8c/u8dec.c
+++ b/src/u8c/u8dec.c
@@ -14,24 +14,29 @@
If not, see <https://www.gnu.org/licenses/>.
*/
# include <assert.h>
+# include <stdbool.h>
+# include <stddef.h>
# include <stdint.h>
-# include <stdlib.h>
+# include <u8c/SIZE_C.h>
# include <u8c/seterr.h>
+# include <u8c/u32alloc.h>
+# include <u8c/u32free.h>
# include <u8c/u8dec.h>
-# include <u8c/SIZE_C.h>
-uint_least8_t u8c_u8dec(size_t * const _sz,uint_least32_t const * * const _out,uint_least8_t const * const _in) {
+# include <uchar.h>
+bool u8c_u8dec(size_t * const _sz,char32_t const * * const _out,unsigned char const * const _in) {
+ assert(_out != NULL);
assert(_in != NULL);
register size_t insz = SIZE_C(0x0);
register size_t outsz = SIZE_C(0x1);
for(register size_t n = SIZE_C(0x0);n <= SIZE_MAX;outsz += SIZE_C(0x1)) { /* First pass: get size of input array and determine size of output array. */
- register uint_least8_t const tmp = _in[n];
+ register unsigned char const tmp = _in[n];
if(tmp == UINT8_C(0x0)) { /* Null-terminator: end of string has been reached. */
- insz = n + SIZE_C(0x1);
+ insz = n;
goto nottoobig;
}
if(tmp >= UINT8_C(0xF8)) { /* Too big. */
- u8c_seterr((uint_least32_t[]){UINT32_C(0x75),UINT32_C(0x38),UINT32_C(0x63),UINT32_C(0x5F),UINT32_C(0x75),UINT32_C(0x38),UINT32_C(0x64),UINT32_C(0x65),UINT32_C(0x63),UINT32_C(0x3A),UINT32_C(0x20),UINT32_C(0x43),UINT32_C(0x68),UINT32_C(0x61),UINT32_C(0x72),UINT32_C(0x61),UINT32_C(0x63),UINT32_C(0x74),UINT32_C(0x65),UINT32_C(0x72),UINT32_C(0x20),UINT32_C(0x6F),UINT32_C(0x75),UINT32_C(0x74),UINT32_C(0x20),UINT32_C(0x6F),UINT32_C(0x66),UINT32_C(0x20),UINT32_C(0x72),UINT32_C(0x61),UINT32_C(0x6E),UINT32_C(0x67),UINT32_C(0x65),UINT32_C(0x20),UINT32_C(0x28),UINT32_C(0x74),UINT32_C(0x6F),UINT32_C(0x6F),UINT32_C(0x20),UINT32_C(0x62),UINT32_C(0x69),UINT32_C(0x67),UINT32_C(0x29),UINT32_C(0x2E),UINT32_C(0x0),}); /* u8c_u8dec: Character out of range (too big). */
- return UINT8_C(0x1);
+ u8c_seterr(U"u8c_u8dec: Character out of range (too big).");
+ return true;
}
if(tmp >= UINT8_C(0xF0)) { /* Four byte. */
n += SIZE_C(0x4);
@@ -49,13 +54,16 @@ uint_least8_t u8c_u8dec(size_t * const _sz,uint_least32_t const * * const _out,u
n += SIZE_C(0x1);
}
/* Input is not null-terminated. */
- u8c_seterr((uint_least32_t[]){UINT32_C(0x75),UINT32_C(0x38),UINT32_C(0x63),UINT32_C(0x5F),UINT32_C(0x75),UINT32_C(0x38),UINT32_C(0x64),UINT32_C(0x65),UINT32_C(0x63),UINT32_C(0x3A),UINT32_C(0x20),UINT32_C(0x55),UINT32_C(0x6E),UINT32_C(0x74),UINT32_C(0x65),UINT32_C(0x72),UINT32_C(0x6D),UINT32_C(0x69),UINT32_C(0x6E),UINT32_C(0x61),UINT32_C(0x74),UINT32_C(0x65),UINT32_C(0x64),UINT32_C(0x20),UINT32_C(0x69),UINT32_C(0x6E),UINT32_C(0x70),UINT32_C(0x75),UINT32_C(0x74),UINT32_C(0x2E),UINT32_C(0x0),}); /* u8c_u8dec: Unterminated input. */
- return UINT8_C(0x1);
+ u8c_seterr(U"u8c_u8dec: Unterminated input.");
+ return true;
nottoobig:;
if(_sz != NULL) {
*_sz = outsz;
}
- uint_least32_t * out = calloc(sizeof(uint_least32_t),outsz);
+ uint_least32_t * out = NULL;
+ if(u8c_u32alloc(&out,outsz + SIZE_C(0x1))) {
+ return false;
+ }
for(register size_t n = SIZE_C(0x0),outn = SIZE_C(0x0);n < insz;outn += SIZE_C(0x1)) { /* Second pass: decode UTF-8. */
if(_in[n] >= UINT8_C(0xF0)) { /* Four byte. */
uint_least32_t codep = (_in[n] ^ UINT32_C(0xF0)) << UINT32_C(0x12);
@@ -92,6 +100,7 @@ nottoobig:;
n += SIZE_C(0x1);
continue;
}
+ u8c_u32free(_out);
*_out = out;
- return UINT8_C(0x0);
+ return false;
}
diff --git a/src/u8c/u8enc.c b/src/u8c/u8enc.c
index dda62d3..60bc724 100644
--- a/src/u8c/u8enc.c
+++ b/src/u8c/u8enc.c
@@ -14,20 +14,26 @@
If not, see <https://www.gnu.org/licenses/>.
*/
# include <assert.h>
+# include <stdbool.h>
+# include <stddef.h>
# include <stdint.h>
-# include <stdlib.h>
+# include <u8c/SIZE_C.h>
# include <u8c/seterr.h>
+# include <u8c/u8alloc.h>
# include <u8c/u8enc.h>
-# include <u8c/SIZE_C.h>
-uint_least8_t u8c_u8enc(size_t * const _sz,uint_least8_t const * * const _out,uint_least32_t const * const _in) {
+# include <u8c/u8free.h>
+# include <u8c/unimax.h>
+# include <uchar.h>
+bool u8c_u8enc(size_t * const _sz,unsigned char const * * const _out,char32_t const * const _in) {
+ assert(_out != NULL);
assert(_in != NULL);
size_t insz = SIZE_C(0x0); /* Size of input array (bytes). */
size_t outsz = SIZE_C(0x0); /* Size of output array /bytes). */
for(register size_t n = SIZE_C(0x0);n <= SIZE_MAX;n += SIZE_C(0x1)) { /* First pass: get size of input array, and determine size of output array. */
- register uint_least32_t const tmp = _in[n];
- if(tmp >= UINT32_C(0x110000)) { /* Codepoint out of range. */
- u8c_seterr((uint_least32_t[]){UINT32_C(0x75),UINT32_C(0x38),UINT32_C(0x63),UINT32_C(0x5F),UINT32_C(0x75),UINT32_C(0x38),UINT32_C(0x65),UINT32_C(0x6E),UINT32_C(0x63),UINT32_C(0x3A),UINT32_C(0x20),UINT32_C(0x43),UINT32_C(0x6F),UINT32_C(0x64),UINT32_C(0x65),UINT32_C(0x70),UINT32_C(0x6F),UINT32_C(0x69),UINT32_C(0x6E),UINT32_C(0x74),UINT32_C(0x20),UINT32_C(0x6F),UINT32_C(0x75),UINT32_C(0x74),UINT32_C(0x20),UINT32_C(0x6F),UINT32_C(0x66),UINT32_C(0x20),UINT32_C(0x72),UINT32_C(0x61),UINT32_C(0x6E),UINT32_C(0x67),UINT32_C(0x65),UINT32_C(0x20),UINT32_C(0x28),UINT32_C(0x74),UINT32_C(0x6F),UINT32_C(0x6F),UINT32_C(0x20),UINT32_C(0x62),UINT32_C(0x69),UINT32_C(0x67),UINT32_C(0x29),UINT32_C(0x2E),UINT32_C(0x0),}); /* u8c_u8enc: Codepoint out of range (too big). */
- return UINT8_C(0x1);
+ register char32_t const tmp = _in[n];
+ if(tmp > u8c_unimax) { /* Codepoint out of range. */
+ u8c_seterr(U"u8c_u8enc: Codepoint out of range (too big).");
+ return true;
}
if(tmp >= UINT32_C(0x10000)) { /* 4 bytes. */
outsz += SIZE_C(0x4);
@@ -48,15 +54,19 @@ uint_least8_t u8c_u8enc(size_t * const _sz,uint_least8_t const * * const _out,ui
goto nottoobig;
}
}
- u8c_seterr((uint_least32_t[]){UINT32_C(0x75),UINT32_C(0x38),UINT32_C(0x63),UINT32_C(0x5F),UINT32_C(0x75),UINT32_C(0x38),UINT32_C(0x65),UINT32_C(0x6E),UINT32_C(0x63),UINT32_C(0x3A),UINT32_C(0x20),UINT32_C(0x55),UINT32_C(0x6E),UINT32_C(0x74),UINT32_C(0x65),UINT32_C(0x72),UINT32_C(0x6D),UINT32_C(0x69),UINT32_C(0x6E),UINT32_C(0x61),UINT32_C(0x74),UINT32_C(0x65),UINT32_C(0x64),UINT32_C(0x20),UINT32_C(0x69),UINT32_C(0x6E),UINT32_C(0x70),UINT32_C(0x75),UINT32_C(0x74),UINT32_C(0x2E),UINT32_C(0x0),}); /* u8c_u8enc: Unterminated input. */
- return UINT8_C(0x1);
+ u8c_seterr(U"u8c_u8enc: Unterminated input.");
+ return true;
nottoobig:;
if(_sz != NULL) {
*_sz = outsz;
}
- uint_least8_t * out = calloc(sizeof(uint_least8_t),outsz); /* Allocate space for output array. */
+ unsigned char * out = NULL;
+ if(u8c_u8alloc(&out,outsz + SIZE_C(0x1))) {
+ u8c_seterr(U"u8c_u32enc: Unable to allocate resources (not enough memory?).");
+ return true;
+ }
for(register size_t n = SIZE_C(0x0), outn = SIZE_C(0x0);n < insz;n += SIZE_C(0x1),outn += SIZE_C(0x1)) { /* Second pass: encode each codepoint into UTF-8. */
- register uint_least32_t const tmp = _in[n];
+ register char32_t const tmp = _in[n];
if(tmp >= UINT32_C(0x10000)) { // Four bytes.
out[outn] = UINT8_C(0xF0) + (uint_least8_t)(tmp >> UINT32_C(0x12));
outn += SIZE_C(0x1);
@@ -84,6 +94,7 @@ nottoobig:;
/* One byte. */
out[outn] = (uint_least8_t)tmp;
}
+ u8c_u8free(_out);
*_out = out;
- return UINT8_C(0x0);
+ return false;
}
diff --git a/src/u8c/stat.c b/src/u8c/u8free.c
index 63214ec..4e3a026 100644
--- a/src/u8c/stat.c
+++ b/src/u8c/u8free.c
@@ -13,10 +13,12 @@
If not, see <https://www.gnu.org/licenses/>.
*/
-# include "stat.h"
+# include <stdbool.h>
# include <stdint.h>
-/*
- 0x0 = Finished.
- 0x1 = Initialised.
-*/
-uint_least8_t u8c_stat = UINT8_C(0x0);
+# include <stdlib.h>
+# include <u8c/u8free.h>
+bool u8c_u8free(unsigned char const * * const _u8) {
+ free((unsigned char *)*_u8);
+ *_u8 = NULL;
+ return false;
+}
diff --git a/src/u8c/vfmt.c b/src/u8c/vfmt.c
index e32b6fa..292db80 100644
--- a/src/u8c/vfmt.c
+++ b/src/u8c/vfmt.c
@@ -14,10 +14,13 @@
If not, see <https://www.gnu.org/licenses/>.
*/
# include <stdarg.h>
-# include <stdint.h>
+# include <stdbool.h>
# include <u8c/u32cp.h>
# include <u8c/vfmt.h>
-uint_least8_t u8c_vfmt(size_t * const _sz,uint_least32_t const * * const _out,uint_least32_t const * const _in,va_list _args) {
- /* To be added. */
+# include <uchar.h>
+# if defined(u8c_bethrdsafe)
+# include <threads.h>
+# endif
+bool u8c_vfmt(size_t * const _sz,char32_t const * * const _out,char32_t const * const _in,va_list _args) {
return u8c_u32cp(_sz,_out,_in);
}
diff --git a/src/u8c/vprint.c b/src/u8c/vprint.c
index 503ca88..6dc30ae 100644
--- a/src/u8c/vprint.c
+++ b/src/u8c/vprint.c
@@ -15,29 +15,31 @@
*/
# include <assert.h>
# include <stdarg.h>
+# include <stdbool.h>
# include <stdint.h>
# include <stdio.h>
# include <stdlib.h>
+# include <u8c/SIZE_C.h>
# include <u8c/seterr.h>
# include <u8c/u32free.h>
# include <u8c/u8enc.h>
# include <u8c/u8free.h>
-# include <u8c/SIZE_C.h>
# include <u8c/vfmt.h>
# include <u8c/vprint.h>
-uint_least8_t u8c_vprint(FILE * _fp,uint_least32_t const * const _msg,va_list _args) {
+# include <uchar.h>
+bool u8c_vprint(FILE * _fp,char32_t const * const _msg,va_list _args) {
assert(_msg != NULL);
- uint_least32_t const * str0 = NULL;
+ char32_t const * str0 = NULL;
u8c_vfmt(NULL,&str0,_msg,_args);
- size_t str1sz = SIZE_C(0x0);
- uint_least8_t const * str1 = NULL;
+ size_t str1sz = SIZE_C(0x0);
+ unsigned char const * str1 = NULL;
u8c_u8enc(&str1sz,&str1,str0);
assert(str1sz > SIZE_C(0x0));
if(fwrite(str1,sizeof(uint_least8_t),str1sz - SIZE_C(0x1),_fp) < str1sz - SIZE_C(0x1)) {
- u8c_seterr((uint_least32_t[]){UINT32_C(0x75),UINT32_C(0x38),UINT32_C(0x63),UINT32_C(0x5F),UINT32_C(0x76),UINT32_C(0x70),UINT32_C(0x72),UINT32_C(0x69),UINT32_C(0x6E),UINT32_C(0x74),UINT32_C(0x3A),UINT32_C(0x20),UINT32_C(0x66),UINT32_C(0x77),UINT32_C(0x72),UINT32_C(0x69),UINT32_C(0x74),UINT32_C(0x65),UINT32_C(0x3A),UINT32_C(0x20),UINT32_C(0x55),UINT32_C(0x6E),UINT32_C(0x61),UINT32_C(0x62),UINT32_C(0x6C),UINT32_C(0x65),UINT32_C(0x20),UINT32_C(0x74),UINT32_C(0x6F),UINT32_C(0x20),UINT32_C(0x77),UINT32_C(0x72),UINT32_C(0x69),UINT32_C(0x74),UINT32_C(0x65),UINT32_C(0x20),UINT32_C(0x74),UINT32_C(0x6F),UINT32_C(0x20),UINT32_C(0x73),UINT32_C(0x74),UINT32_C(0x64),UINT32_C(0x6F),UINT32_C(0x75),UINT32_C(0x74),UINT32_C(0x2E),UINT32_C(0x0),}); /* u8c_vprint: fwrite: Unable to write to stdout. */
- return UINT8_C(0x1);
+ u8c_seterr(U"u8c_vprint: fwrite: Unable to write to stdout.");
+ return true;
}
- u8c_u32free(str0);
- u8c_u8free(str1);
- return UINT8_C(0x0);
+ u8c_u32free(&str0);
+ u8c_u8free(&str1);
+ return false;
}