summaryrefslogblamecommitdiff
path: root/test.c
blob: b638deddfff27a90bdb115b035e2753647491f38 (plain) (tree)
1
2
3
4
5
6
7
8




                      
                        
                     
                     



                      

















































































































































































































































































                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        


                                           

                                                                                                                                                                                                                     



                                 
                           


                                                                           
                                              



                                                      
                                                 
                                              
                                                           
                                                          
                                                               

                                              
         


                                                     
                 
         

                           
 
# include <inttypes.h>
# include <stdarg.h>
# include <stdint.h>
# include <stdio.h>
# include <stdlib.h>
# include <u8c/SIZE_C.h>
# include <u8c/err.h>
# include <u8c/fmt.h>
# include <u8c/is.h>
# include <u8c/main.h>
# include <u8c/u32.h>
# include <u8c/u8.h>
static void errhandl(enum u8c_errtyp errtyp);
static void test(    int n);
static void testmsg( char const * fmt,...);
static void testmsgdone( void);
static void errhandl(enum u8c_errtyp errtyp) {
	printf(":: Error handler called with type %d.\n",(int)errtyp);
}
static void test(int n) {
	switch(n) {
	case 0x0:
		testmsg("(0) Error messages");
		{
			char32_t const * err = NULL;
			u8c_geterr(NULL,&err);
			printf("default error message: ");
			u8c_println(stdout,err);
			u8c_seterr(U"Gluchwein!",u8c_errtyp_deferr);
			u8c_geterr(NULL,&err);
			printf("set error message:     ");
			u8c_println(stdout,err);
			u8c_u32free(&err);
		}
		testmsgdone();
		break;
	case 0x1:
		testmsg("(1) UTF-8 encoding/decoding");
		{
			char32_t const * msg0 = U"¢,ह,𐍈,€,↊,👋";
			unsigned char const *  msg1 = NULL;
			u8c_u8enc(NULL,&msg1,msg0);
			msg0 = NULL;
			printf("Encoded:                       %s\n",msg1);
			u8c_u8dec(NULL,&msg0,msg1);
			u8c_u8enc(NULL,&msg1,msg0);
			printf("Encoded -> Decoded -> Encoded: %s\n",msg1);
			u8c_u32free(&msg0);
			u8c_u8free(&msg1);
		}
		testmsgdone();
		break;
	case 0x2:
		testmsg("Printing (u8c_print)");
		{
			u8c_print(stdout,U"Hello");
			u8c_print(stdout,U" ðere!");
		}
		testmsgdone();
		break;
	case 0x3:
		testmsg("(3) Printing (u8c_println)");
		{
			u8c_println(stdout,U"Hello");
			u8c_println(stdout,U" ðere!");
		}
		testmsgdone();
		break;
	case 0x4:
		testmsg("(4) Text formatting");
		{
			u8c_println(stdout,U"The \uFFFCnumber\uFFFC is \uFFFC.",u8c_fmttyp_fgcol,u8c_col_mint,u8c_fmttyp_fgcol0,u8c_fmttyp_int,(int_least64_t){-0x10});
		}
		testmsgdone();
		break;
	case 0x5:
		testmsg("(5) Colour text");
		{
			u8c_println(stdout,U"\uFFFCred\uFFFCorange\uFFFCyellow\uFFFCchartreuse\uFFFCgreen\uFFFCmint\uFFFCcyan\uFFFCazure\uFFFCblue\uFFFCviolet\uFFFCmagenta\uFFFCrose\uFFFC",u8c_fmttyp_fgcol,u8c_col_red,u8c_fmttyp_fgcol,u8c_col_orange,u8c_fmttyp_fgcol,u8c_col_yellow,u8c_fmttyp_fgcol,u8c_col_chartreuse,u8c_fmttyp_fgcol,u8c_col_green,u8c_fmttyp_fgcol,u8c_col_mint,u8c_fmttyp_fgcol,u8c_col_cyan,u8c_fmttyp_fgcol,u8c_col_azure,u8c_fmttyp_fgcol,u8c_col_blue,u8c_fmttyp_fgcol,u8c_col_violet,u8c_fmttyp_fgcol,u8c_col_magenta,u8c_fmttyp_fgcol,u8c_col_rose,u8c_fmttyp_fgcol0);
		}
		testmsgdone();
		break;
	case 0x6:
		testmsg("(6) Combining characters");
		{
			for(register uint_least32_t n = UINT32_C(0x300);n <= UINT32_C(0x36F);n += UINT32_C(0x1)) {
				u8c_print(stdout,(uint_least32_t[]){UINT32_C(0x61),n,UINT32_C(0x20),UINT32_C(0x0),});
				fflush(stdout);
			}
			u8c_print(stdout,U"\n");
		}
		testmsgdone();
		break;
	case 0x7:
		testmsg("(7) String comparison");
		{
			char32_t const * str0 = U"Hello";
			char32_t const * str1 = U"Hello";
			char32_t const * str2 = U"Goodbye";
			printf("str0: ");
			u8c_println(stdout,str0);
			printf("str1: ");
			u8c_println(stdout,str1);
			printf("str2: ");
			u8c_println(stdout,str2);
			uint_least8_t res = UINT8_C(0x0);
			u8c_u32cmp(&res,str0,str1);
			printf("str0,str1: %" PRIXLEAST8 ".\n",res);
			u8c_u32cmp(&res,str1,str2);
			printf("str0,str2: %" PRIXLEAST8 ".\n",res);
			u8c_u32cmp(&res,str2,str1);
			printf("str2,str1: %" PRIXLEAST8 ".\n",res);
		}
		testmsgdone();
		break;
	case 0x8:
		testmsg("(8) u8c_isalnum");
		{
			for(register uint_least32_t n = UINT32_C(0x1);n <= UINT32_C(0x10FFFF);n += UINT32_C(0x1)) {
				uint_least8_t res = UINT8_C(0x0);
				u8c_isalnum(&res,n);
				if(res) {
					u8c_print(stdout,(uint_least32_t[]){n,UINT32_C(0x20),UINT32_C(0x0),});
				}
			}
			u8c_println(stdout,U"");
		}
		testmsgdone();
		break;
	case 0x9:
		testmsg("(9) u8c_isalpha");
		{
			for(register uint_least32_t n = UINT32_C(0x1);n <= UINT32_C(0x10FFFF);n += UINT32_C(0x1)) {
				uint_least8_t res = UINT8_C(0x0);
				u8c_isalpha(&res,n);
				if(res) {
					u8c_print(stdout,(uint_least32_t[]){n,UINT32_C(0x20),UINT32_C(0x0),});
				}
			}
			u8c_println(stdout,U"");
		}
		testmsgdone();
		break;
	case 0xA:
		testmsg("(10) u8c_isdigit");
		{
			for(register uint_least32_t n = UINT32_C(0x1);n <= UINT32_C(0x10FFFF);n += UINT32_C(0x1)) {
				uint_least8_t res = UINT8_C(0x0);
				u8c_isdigit(&res,n);
				if(res) {
					u8c_print(stdout,(uint_least32_t[]){n,UINT32_C(0x20),UINT32_C(0x0),});
				}
			}
			u8c_println(stdout,U"");
		}
		testmsgdone();
		break;
	case 0xB:
		testmsg("(11) u8c_ispunct"); /* This test appears broken on some incomplete fonts, altough it is not. */
		{
			for(register uint_least32_t n = UINT32_C(0x1);n <= UINT32_C(0x10FFFF);n += UINT32_C(0x1)) {
				uint_least8_t res = UINT8_C(0x0);
				u8c_ispunct(&res,n);
				if(res) {
					u8c_print(stdout,(uint_least32_t[]){n,UINT32_C(0x20),UINT32_C(0x0),});
				}
			}
			u8c_println(stdout,U"");
		}
		testmsgdone();
		break;
	case 0xC:
		testmsg("(12) UTF-32 string literals");
		{
			u8c_println(stdout,U"Can you see ðis?");
		}
		testmsgdone();
		break;
	case 0xD:
		testmsg("(13) string concatenation");
		{
			char32_t const * str0 = U"Free_as_in";
			char32_t const * str1 = U"_freedom!";
			char32_t const * str2 = NULL;
			u8c_u32cat(NULL,&str2,str0,str1);
			printf("string #0: ");
			u8c_println(stdout,str0);
			printf("string #1: ");
			u8c_println(stdout,str1);
			printf("string #2: ");
			u8c_println(stdout,str2);
			u8c_u32free(&str2);

		}
		testmsgdone();
		break;
	case 0xE:
		testmsg("(14) sub-strings");
		{
			char32_t const * str0 = U"I_wish_to_suck_big_duck.";
			char32_t const * str1 = NULL;
			u8c_u32substr(&str1,SIZE_C(0x0),SIZE_C(0xE),str0);
			char32_t const * str2 = NULL;
			u8c_u32substr(&str2,SIZE_C(0xF),SIZE_C(0x0),str0);
			printf("string #0: ");
			u8c_println(stdout,str0);
			printf("string #1: ");
			u8c_println(stdout,str1);
			printf("string #2: ");
			u8c_println(stdout,str2);
			u8c_u32free(&str1);
			u8c_u32free(&str2);
		}
		testmsgdone();
		break;
	case 0xF:
		testmsg("(15) u8c_isxdigit");
		{
			for(register uint_least32_t n = UINT32_C(0x1);n <= UINT32_C(0x10FFFF);n += UINT32_C(0x1)) {
				uint_least8_t res = UINT8_C(0x0);
				u8c_isxdigit(&res,n);
				if(res) {
					u8c_print(stdout,(uint_least32_t[]){n,UINT32_C(0x20),UINT32_C(0x0),});
				}
			}
			u8c_println(stdout,(uint_least32_t[]){UINT32_C(0x0),});
		}
		testmsgdone();
		break;
	case 0x10:
		testmsg("(16) Printing (u8c_dbgprint)");
		{
			u8c_dbgprint(U"Hello");
			u8c_dbgprint(U" ðere!");
		}
		testmsgdone();
		break;
	case 0x11:
		testmsg("(17) u8c_u32fndchr");
		{
			char32_t const * str  = U"Proprietary as in Micro$oft.";
			size_t                 pos0 = SIZE_C(0x0);
			size_t                 pos1 = SIZE_C(0x0);
			u8c_u32fndchr(&pos0,str,U'M');
			u8c_u32fndchr(&pos1,str,U'ŋ');
			printf("string: ");
			u8c_println(stdout,str);
			printf("Position of 'M': %zu\n",pos0);
			printf("Position of 'ŋ': %zu\n",pos1);
		}
		testmsgdone();
		break;
	case 0x12:
		testmsg("(18) u8c_u32fndpat");
		{
			char32_t const * str  = U"Proprietary as in Micro$oft.";
			size_t                 pos0 = SIZE_C(0x0);
			size_t                 pos1 = SIZE_C(0x0);
			u8c_u32fndpat(&pos0,str,U"as in");
			u8c_u32fndpat(&pos1,str,U"forever");
			printf("string: ");
			u8c_println(stdout,str);
			printf("Position of \"as in\": %zu\n",pos0);
			printf("Position of \"forever\": %zu\n",pos1);
		}
		testmsgdone();
		break;
	case 0x13:
		testmsg("(19) string insertion");
		{
			char32_t const * str0 = U"There_is_I_love.";
			char32_t const * str1 = U"just_somebody_that_";
			char32_t const * str2 = NULL;
			u8c_u32ins(NULL,&str2,SIZE_C(0x9),str0,str1);
			printf("String #0: ");
			u8c_println(stdout,str0);
			printf("String #1: ");
			u8c_println(stdout,str1);
			printf("String #2: ");
			u8c_println(stdout,str2);
			u8c_u32free(&str2);
		}
		testmsgdone();
		break;
	}
}
static void testmsg(char const * fmt,...) {
	va_list args;
	va_start(args,fmt);
	/* printf("\n+->\n| \x1b[38:2:169:225:61mTesting\x1b[0m \""); */  /* This command works in all of the terminals I tested, except Konsole (whic is funny, because it's xterm-based, and xterm supports it). */
	printf("\n+->\n| \x1b[38;2;169;225;61mTesting\x1b[0m \"");
	vprintf(fmt,args);
	printf("\"...\n+->\n\n");
	va_end(args);
}
static void testmsgdone() {
	/* printf("\n+->\n| \x1b[38:2::61:225:169mDone\x1b[0m!\n+->\n"); */
	printf("\n+->\n| \x1b[38;2;61;225;169mDone\x1b[0m!\n+->\n");
}
int main(int const argc,char const * * argv) {
	if(u8c_init()) {
		printf("Unable to initialise u8c!\n");
		exit(EXIT_FAILURE);
	}
	u8c_regerrhandl(u8c_errtyp_all,errhandl);
	u8c_setfmt(UINT8_C(0xC),UINT8_C(0x1));
	printf("u8c version: %" PRIXLEAST64 ".\n",u8c_ver);
	printf("Debug build: %" PRIXLEAST8 ".\n",u8c_dbg);
	printf("Thread safe: %" PRIXLEAST8 ".\n",u8c_thrdsafe);
	if(argc == 0x2) {
		test(atoi(argv[SIZE_C(0x1)]));
	}
	else {
		for(int n = 0x0;n <= 0x13;n += 0x1) {
			test(n);
		}
	}
	u8c_end();
	exit(EXIT_SUCCESS);
}