added more code to stix_strtoint()
This commit is contained in:
		| @ -31,6 +31,56 @@ | |||||||
| /*#define IS_POWER_OF_2(ui) (((ui) > 0) && (((ui) & (~(ui)+ 1)) == (ui)))*/ | /*#define IS_POWER_OF_2(ui) (((ui) > 0) && (((ui) & (~(ui)+ 1)) == (ui)))*/ | ||||||
| #define IS_POWER_OF_2(ui) (((ui) > 0) && ((ui) & ((ui) - 1)) == 0) /* unsigned integer only */ | #define IS_POWER_OF_2(ui) (((ui) > 0) && ((ui) & ((ui) - 1)) == 0) /* unsigned integer only */ | ||||||
|  |  | ||||||
|  | #if (STIX_SIZEOF_OOW_T == STIX_SIZEOF_INT) && defined(STIX_HAVE_BUILTIN_UADD_OVERFLOW) | ||||||
|  | #	define oow_add_overflow(a,b,c)  __builtin_uadd_overflow(a,b,c) | ||||||
|  | #elif (STIX_SIZEOF_OOW_T == STIX_SIZEOF_LONG) && defined(STIX_HAVE_BUILTIN_UADDL_OVERFLOW) | ||||||
|  | #	define oow_add_overflow(a,b,c)  __builtin_uaddl_overflow(a,b,c) | ||||||
|  | #elif (STIX_SIZEOF_OOW_T == STIX_SIZEOF_LONG_LONG) && defined(STIX_HAVE_BUILTIN_UADDLL_OVERFLOW) | ||||||
|  | #	define oow_add_overflow(a,b,c)  __builtin_uaddll_overflow(a,b,c) | ||||||
|  | #else | ||||||
|  | static STIX_INLINE int oow_add_overflow (stix_oow_t a, stix_oow_t b, stix_oow_t* c) | ||||||
|  | { | ||||||
|  | 	*c = a + b; | ||||||
|  | 	return b > STIX_TYPE_MAX(stix_oow_t) - a; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if (STIX_SIZEOF_OOHW_T == STIX_SIZEOF_INT) && defined(STIX_HAVE_BUILTIN_UADD_OVERFLOW) | ||||||
|  | #	define oohw_add_overflow(a,b,c)  __builtin_uadd_overflow(a,b,c) | ||||||
|  | #elif (STIX_SIZEOF_OOHW_T == STIX_SIZEOF_LONG) && defined(STIX_HAVE_BUILTIN_UADDL_OVERFLOW) | ||||||
|  | #	define oohw_add_overflow(a,b,c)  __builtin_uaddl_overflow(a,b,c) | ||||||
|  | #elif (STIX_SIZEOF_OOHW_T == STIX_SIZEOF_LONG_LONG) && defined(STIX_HAVE_BUILTIN_UADDLL_OVERFLOW) | ||||||
|  | #	define oohw_add_overflow(a,b,c)  __builtin_uaddll_overflow(a,b,c) | ||||||
|  | #else | ||||||
|  | static STIX_INLINE int oohw_add_overflow (stix_oohw_t a, stix_oohw_t b, stix_oohw_t* c) | ||||||
|  | { | ||||||
|  | 	*c = a + b; | ||||||
|  | 	return b > STIX_TYPE_MAX(stix_oohw_t) - a; | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if (STIX_SIZEOF_OOW_T == STIX_SIZEOF_INT) && defined(STIX_HAVE_BUILTIN_UMUL_OVERFLOW) | ||||||
|  | #	define oow_mul_overflow(a,b,c)  __builtin_umul_overflow(a,b,c) | ||||||
|  | #elif (STIX_SIZEOF_OOW_T == STIX_SIZEOF_LONG) && defined(STIX_HAVE_BUILTIN_UMULL_OVERFLOW) | ||||||
|  | #	define oow_mul_overflow(a,b,c)  __builtin_umull_overflow(a,b,c) | ||||||
|  | #elif (STIX_SIZEOF_OOW_T == STIX_SIZEOF_LONG_LONG) && defined(STIX_HAVE_BUILTIN_UMULLL_OVERFLOW) | ||||||
|  | #	define oow_mul_overflow(a,b,c)  __builtin_umulll_overflow(a,b,c) | ||||||
|  | #else | ||||||
|  | static STIX_INLINE int oow_mul_overflow (stix_oow_t a, stix_oow_t b, stix_oow_t* c) | ||||||
|  | { | ||||||
|  | #if (STIX_SIZEOF_UINTMAX_T > STIX_SIZEOF_OOW_T) | ||||||
|  | 	stix_uintmax_t k; | ||||||
|  | 	k = (stix_uintmax_t)a * (stix_uintmax_t)b; | ||||||
|  | 	*c = (stix_oow_t)k; | ||||||
|  | 	return (k >> STIX_OOW_BITS) > 0; | ||||||
|  | 	/*return k > STIX_TYPE_MAX(stix_oow_t);*/ | ||||||
|  | #else | ||||||
|  | 	*c = a * b; | ||||||
|  | 	return b > 0 && a > STIX_TYPE_MAX(stix_oow_t) / b; /* works for unsigned types only */ | ||||||
|  | #endif | ||||||
|  | } | ||||||
|  | #endif | ||||||
|  |  | ||||||
| static STIX_INLINE int is_integer (stix_t* stix, stix_oop_t oop) | static STIX_INLINE int is_integer (stix_t* stix, stix_oop_t oop) | ||||||
| { | { | ||||||
| 	stix_oop_t c; | 	stix_oop_t c; | ||||||
| @ -468,13 +518,23 @@ oops_einval: | |||||||
| 	return STIX_NULL; | 	return STIX_NULL; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static stix_uint8_t ooch_val_tab[] = | ||||||
|  | { | ||||||
|  | 	99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, | ||||||
|  | 	99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, | ||||||
|  | 	99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, | ||||||
|  | 	 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 99, 99, 99, 99, 99, 99, | ||||||
|  | 	99, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, | ||||||
|  | 	25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 99, 99, 99, 99, 99, | ||||||
|  | 	99, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, | ||||||
|  | 	25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 99, 99, 99, 99, 99 | ||||||
|  | }; | ||||||
|  |  | ||||||
| stix_oop_t stix_strtoint (stix_t* stix, const stix_ooch_t* str, stix_oow_t len, unsigned int radix) | stix_oop_t stix_strtoint (stix_t* stix, const stix_ooch_t* str, stix_oow_t len, unsigned int radix) | ||||||
| { | { | ||||||
| 	int neg = 0; | 	int neg = 0; | ||||||
| 	const stix_ooch_t* ptr, * start, * end; | 	const stix_ooch_t* ptr, * start, * end; | ||||||
| 	stix_oow_t w, v, r; | 	stix_oow_t w, v; | ||||||
| 	stix_oohw_t hw[64]; | 	stix_oohw_t hw[64]; | ||||||
| 	stix_oow_t hwlen; | 	stix_oow_t hwlen; | ||||||
|  |  | ||||||
| @ -506,14 +566,21 @@ stix_oop_t stix_strtoint (stix_t* stix, const stix_ooch_t* str, stix_oow_t len, | |||||||
| 		return STIX_OOP_FROM_SMINT(0); | 		return STIX_OOP_FROM_SMINT(0); | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	hwlen = 0; | ||||||
|  | 	start = ptr; /* this is the real start */ | ||||||
|  |  | ||||||
| 	if (IS_POWER_OF_2(radix)) | 	if (IS_POWER_OF_2(radix)) | ||||||
| 	{ | 	{ | ||||||
| 		unsigned int exp; | 		unsigned int exp; | ||||||
|  | 		unsigned int bitcnt; | ||||||
|  |  | ||||||
| 		/* get log2(radix) in a fast way under the fact that | 		/* get log2(radix) in a fast way under the fact that | ||||||
| 		 * radix is a power of 2. */ | 		 * radix is a power of 2. the exponent acquired is | ||||||
| 	#if defined(__GNUC__) && (defined(__x86_64) || defined(__amd64) || defined(__i386) || defined(i386)) | 		 * the number of bits that a digit of the given radix takes up */ | ||||||
|  | 	#if defined(STIX_HAVE_BUILTIN_CTZ) | ||||||
|  | 		exp = __builtin_ctz(radix); | ||||||
|  |  | ||||||
|  | 	#elif defined(__GNUC__) && (defined(__x86_64) || defined(__amd64) || defined(__i386) || defined(i386)) | ||||||
| 		/* use the Bit Scan Forward instruction */ | 		/* use the Bit Scan Forward instruction */ | ||||||
| 		__asm__ volatile ( | 		__asm__ volatile ( | ||||||
| 			"bsf %1,%0\n\t" | 			"bsf %1,%0\n\t" | ||||||
| @ -521,24 +588,22 @@ stix_oop_t stix_strtoint (stix_t* stix, const stix_ooch_t* str, stix_oow_t len, | |||||||
| 			: "r"(radix) /* input */ | 			: "r"(radix) /* input */ | ||||||
| 		); | 		); | ||||||
|  |  | ||||||
|  | 	#elif defined(USE_UGLY_CODE) && defined(__GNUC__) && defined(__arm__) && (defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_8__)) | ||||||
|  |  | ||||||
| 	#elif defined(USE_THIS_UGLY_CODE) && defined(__GNUC__) && defined(__arm__) && (defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_8__)) | 		/* CLZ is available in ARMv5T and above. there is no instruction to | ||||||
|  | 		 * count trailing zeros or something similar. using RBIT with CLZ | ||||||
| 		/* clz is available in ARMv5T and above */ | 		 * would be good in ARMv6T2 and above to avoid further calculation | ||||||
|  | 		 * afte CLZ */ | ||||||
| 		__asm__ volatile ( | 		__asm__ volatile ( | ||||||
| 			"clz %0,%1\n\t" | 			"clz %0,%1\n\t" | ||||||
| 			: "=r"(exp) /* output */ | 			: "=r"(exp) /* output */ | ||||||
| 			: "r"(radix) /* input */ | 			: "r"(radix) /* input */ | ||||||
| 		); | 		); | ||||||
|  |  | ||||||
| 		/* TODO: in ARMv6T2 and above, RBIT can be used before clz to avoid this calculation  */ |  | ||||||
| 		exp = (STIX_SIZEOF(exp) * 8) - exp - 1;  | 		exp = (STIX_SIZEOF(exp) * 8) - exp - 1;  | ||||||
|  |  | ||||||
|  |  | ||||||
| 		/* TODO: PPC - use cntlz, cntlzw, cntlzd, SPARC - use lzcnt, MIPS clz */ | 		/* TODO: PPC - use cntlz, cntlzw, cntlzd, SPARC - use lzcnt, MIPS clz */ | ||||||
| 	#else | 	#else | ||||||
|  | 		static stix_uint8_t exp_tab[] =  | ||||||
| 		static unsigned int exp_tab[] =  |  | ||||||
| 		{ | 		{ | ||||||
| 			0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4,  | 			0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 4,  | ||||||
| 			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0 | 			0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0 | ||||||
| @ -546,49 +611,102 @@ stix_oop_t stix_strtoint (stix_t* stix, const stix_ooch_t* str, stix_oow_t len, | |||||||
| 		exp = exp_tab[radix]; | 		exp = exp_tab[radix]; | ||||||
| 	#endif | 	#endif | ||||||
|  |  | ||||||
| printf ("<<%d>>>>>>\n",exp); | 		w = 0; | ||||||
| 		start = ptr; /* this is the real start */ | 		bitcnt = 0; | ||||||
| 		ptr = end - 1; | 		ptr = end - 1; | ||||||
|  |  | ||||||
| 		hwlen = 0; |  | ||||||
| 		w = 0; |  | ||||||
| 		r = 1; |  | ||||||
| 		while (ptr >= start) | 		while (ptr >= start) | ||||||
| 		{ | 		{ | ||||||
| 			if (*ptr >= '0' && *ptr <= '9') v = *ptr - '0'; | 			if (*ptr < 0 || *ptr >= STIX_COUNTOF(ooch_val_tab)) goto oops_einval; | ||||||
| 			else if (*ptr >= 'A' && *ptr <= 'Z') v = *ptr - 'A' + 10; | 			v = ooch_val_tab[*ptr]; | ||||||
| 			else if (*ptr >= 'a' && *ptr <= 'z') v = *ptr - 'a' + 10; |  | ||||||
| 			else goto oops_einval; |  | ||||||
|  |  | ||||||
| 			if (v >= radix) goto oops_einval; | 			if (v >= radix) goto oops_einval; | ||||||
|  |  | ||||||
| 	printf ("wwww=<<%lx>>", (long int)w); | 			w |= (v << bitcnt); | ||||||
| 			w += v * r; | 			bitcnt += exp; | ||||||
| 	printf ("r=><<%lX>> v<<%lX>> w<<%lX>>\n", (long int)r, (long int)v, (long int)w); | 			if (bitcnt >= STIX_OOHW_BITS) | ||||||
| 			if (w > STIX_TYPE_MAX(stix_oohw_t)) |  | ||||||
| 			{ | 			{ | ||||||
|  | 				bitcnt -= STIX_OOHW_BITS; | ||||||
|  | /* TODO: grow hw if it's full OR | ||||||
|  |  * i can estimate how much will be needed based on ext. so preallocate the buffer for these bases */ | ||||||
| 				hw[hwlen++] = (stix_oohw_t)(w & STIX_LBMASK(stix_oow_t, STIX_OOHW_BITS)); | 				hw[hwlen++] = (stix_oohw_t)(w & STIX_LBMASK(stix_oow_t, STIX_OOHW_BITS)); | ||||||
| 				w = w >> STIX_OOHW_BITS; | 				w >>= STIX_OOHW_BITS; | ||||||
| 				if (w == 0) r = 1; |  | ||||||
| 				else r = radix; |  | ||||||
| 			} |  | ||||||
| 			else  |  | ||||||
| 			{ |  | ||||||
| 				r = r * radix; |  | ||||||
| 			} | 			} | ||||||
|  |  | ||||||
| 			ptr--; | 			ptr--; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
| 		STIX_ASSERT (w <= STIX_TYPE_MAX(stix_oohw_t)); | 		STIX_ASSERT (w <= STIX_TYPE_MAX(stix_oohw_t)); | ||||||
| 		hw[hwlen++] = w; | 		if (hwlen == 0 || w > 0) hw[hwlen++] = w; | ||||||
| 	} | 	} | ||||||
| 	else | 	else | ||||||
| 	{ | 	{ | ||||||
| 		/*  TODO: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX */ | 		stix_oow_t r1, r2; | ||||||
|  | 		stix_oohw_t multiplier; | ||||||
|  | 		int dg, i, max_ndigits; | ||||||
|  |  | ||||||
|  | 		w = 0; | ||||||
|  | 		ptr = start; | ||||||
|  |  | ||||||
|  | max_ndigits = 9; /* GET THIS */ | ||||||
|  | reqsize = (end - str) / max_ndigits + 1; | ||||||
|  | if (reqsize > STIX_COUNTF(hw)) hwp = malloc (reqsize * STIX_SIZEOF(stix_oohw_t)); | ||||||
|  |  | ||||||
|  | 		multiplier = 1; | ||||||
|  | 		for (i = 0; i < max_ndigits; i++) multiplier *= radix; | ||||||
|  |  | ||||||
|  | 		do | ||||||
|  | 		{ | ||||||
|  | 			r1 = 0; | ||||||
|  | 			for (dg = 0; dg < max_ndigits; dg++) | ||||||
|  | 			{ | ||||||
|  | 				if (ptr >= end)  | ||||||
|  | 				{ | ||||||
|  | 					multiplier = 1; | ||||||
|  | 					for (i = 0; i < dg; i++) multiplier *= radix; | ||||||
|  | 					break; | ||||||
|  | 				} | ||||||
|  |  | ||||||
|  | 				if (*ptr < 0 || *ptr >= STIX_COUNTOF(ooch_val_tab)) goto oops_einval; | ||||||
|  | 				v = ooch_val_tab[*ptr]; | ||||||
|  | 				if (v >= radix) goto oops_einval; | ||||||
|  |  | ||||||
|  | 				r1 = r1 * radix + (stix_oohw_t)v; | ||||||
|  | 				ptr++; | ||||||
|  | 			} | ||||||
|  |  | ||||||
|  | 			r2 = r1; | ||||||
|  | 			for (i = 0; i < hwlen; i++) | ||||||
|  | 			{ | ||||||
|  | 				stix_oohw_t high, low; | ||||||
|  |  | ||||||
|  | 				v = (stix_oow_t)hw[i] * multiplier; | ||||||
|  | 				high = (stix_oohw_t)(v >> STIX_OOHW_BITS); | ||||||
|  | 				low = (stix_oohw_t)(v /*& STIX_LBMASK(stix_oow_t, STIX_OOHW_BITS)*/); | ||||||
|  |  | ||||||
|  | 			#if defined(oohw_add_overflow) | ||||||
|  | 				/* use oohw_add_overflow() only if it's compiler-builtin. */ | ||||||
|  | 				r2 = high + oohw_add_overflow(low, r2, &low); | ||||||
|  | 			#else | ||||||
|  | 				/* don't use the fall-back version of oohw_add_overflow() */ | ||||||
|  | 				low += r2; | ||||||
|  | 				r2 = high + (low < r2); | ||||||
|  | 			#endif | ||||||
|  |  | ||||||
|  | 				hw[i] = low; | ||||||
|  | 			} | ||||||
|  | 			if (r2) hw[hwlen++] = r2; | ||||||
|  | 		} | ||||||
|  | 		while (dg >= max_ndigits); | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | { int i; | ||||||
|  | for (i = hwlen; i > 0;) | ||||||
|  | { | ||||||
|  | printf ("%08x ", hw[--i]); | ||||||
|  | } | ||||||
|  | printf ("\n"); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* |  | ||||||
| 	if (hwlen == 1) return STIX_OOP_FROM_SMINT((stix_ooi_t)hw[0] * -neg); | 	if (hwlen == 1) return STIX_OOP_FROM_SMINT((stix_ooi_t)hw[0] * -neg); | ||||||
| 	else if (hwlen == 2) | 	else if (hwlen == 2) | ||||||
| 	{ | 	{ | ||||||
| @ -602,15 +720,7 @@ printf ("<<%d>>>>>>\n",exp); | |||||||
| 			if (w <= STIX_SMINT_MAX) return STIX_OOP_FROM_SMINT(w); | 			if (w <= STIX_SMINT_MAX) return STIX_OOP_FROM_SMINT(w); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| */ |  | ||||||
|  |  | ||||||
| { int i; |  | ||||||
| for (i = hwlen; i > 0;) |  | ||||||
| { |  | ||||||
| printf ("%x ", hw[--i]); |  | ||||||
| } |  | ||||||
| printf ("\n"); |  | ||||||
| } |  | ||||||
| 	return stix_instantiate (stix, (neg? stix->_large_negative_integer: stix->_large_positive_integer), hw, hwlen); | 	return stix_instantiate (stix, (neg? stix->_large_negative_integer: stix->_large_positive_integer), hw, hwlen); | ||||||
|  |  | ||||||
| oops_einval: | oops_einval: | ||||||
|  | |||||||
| @ -465,7 +465,10 @@ int main (int argc, char* argv[]) | |||||||
| { | { | ||||||
|  |  | ||||||
| /*const stix_bch_t* xxx = "9999999999999999999999999999999999999999999999999999999999999999999999999999999999";*/ | /*const stix_bch_t* xxx = "9999999999999999999999999999999999999999999999999999999999999999999999999999999999";*/ | ||||||
| const stix_bch_t* xxx = "7777777777777777777777777"; |  | ||||||
|  | //const stix_bch_t* xxx = "2305843009213693953"; | ||||||
|  | const stix_bch_t* xxx = "184467440737095516161111"; | ||||||
|  |  | ||||||
| stix_ooch_t buf[10240]; | stix_ooch_t buf[10240]; | ||||||
| stix_oow_t xxxlen; | stix_oow_t xxxlen; | ||||||
| stix_oow_t buflen; | stix_oow_t buflen; | ||||||
| @ -473,7 +476,7 @@ stix_oow_t buflen; | |||||||
| xxxlen = stix_countbcstr(xxx); | xxxlen = stix_countbcstr(xxx); | ||||||
| buflen = STIX_COUNTOF(buf); | buflen = STIX_COUNTOF(buf); | ||||||
| stix_utf8toucs (xxx, &xxxlen, buf, &buflen); | stix_utf8toucs (xxx, &xxxlen, buf, &buflen); | ||||||
| stix_strtoint (stix, buf, buflen, 16); | dump_object (stix, stix_strtoint (stix, buf, buflen, 10), "STRINT"); | ||||||
| } | } | ||||||
| { | { | ||||||
| stix_ooch_t x[] = { 'X', 't', 'r', 'i', 'n', 'g', '\0' }; | stix_ooch_t x[] = { 'X', 't', 'r', 'i', 'n', 'g', '\0' }; | ||||||
|  | |||||||
| @ -49,9 +49,13 @@ | |||||||
| #	endif | #	endif | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| /* ========================================================================= | /* ========================================================================= | ||||||
|  * PRIMITIVE TYPE DEFINTIONS |  * PRIMITIVE TYPE DEFINTIONS | ||||||
|  * ========================================================================= */ |  * ========================================================================= */ | ||||||
|  |  | ||||||
|  | /* stix_int8_t */ | ||||||
| #if defined(STIX_SIZEOF_CHAR) && (STIX_SIZEOF_CHAR == 1) | #if defined(STIX_SIZEOF_CHAR) && (STIX_SIZEOF_CHAR == 1) | ||||||
| #	define STIX_HAVE_UINT8_T | #	define STIX_HAVE_UINT8_T | ||||||
| #	define STIX_HAVE_INT8_T | #	define STIX_HAVE_INT8_T | ||||||
| @ -74,6 +78,8 @@ | |||||||
| 	typedef signed char        stix_int8_t; | 	typedef signed char        stix_int8_t; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* stix_int16_t */ | ||||||
| #if defined(STIX_SIZEOF_SHORT) && (STIX_SIZEOF_SHORT == 2) | #if defined(STIX_SIZEOF_SHORT) && (STIX_SIZEOF_SHORT == 2) | ||||||
| #	define STIX_HAVE_UINT16_T | #	define STIX_HAVE_UINT16_T | ||||||
| #	define STIX_HAVE_INT16_T | #	define STIX_HAVE_INT16_T | ||||||
| @ -97,6 +103,7 @@ | |||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* stix_int32_t */ | ||||||
| #if defined(STIX_SIZEOF_INT) && (STIX_SIZEOF_INT == 4) | #if defined(STIX_SIZEOF_INT) && (STIX_SIZEOF_INT == 4) | ||||||
| #	define STIX_HAVE_UINT32_T | #	define STIX_HAVE_UINT32_T | ||||||
| #	define STIX_HAVE_INT32_T | #	define STIX_HAVE_INT32_T | ||||||
| @ -129,7 +136,7 @@ | |||||||
| 	typedef signed int          stix_int32_t; | 	typedef signed int          stix_int32_t; | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | /* stix_int64_t */ | ||||||
| #if defined(STIX_SIZEOF_INT) && (STIX_SIZEOF_INT == 8) | #if defined(STIX_SIZEOF_INT) && (STIX_SIZEOF_INT == 8) | ||||||
| #	define STIX_HAVE_UINT64_T | #	define STIX_HAVE_UINT64_T | ||||||
| #	define STIX_HAVE_INT64_T | #	define STIX_HAVE_INT64_T | ||||||
| @ -164,6 +171,7 @@ | |||||||
| 	/* no 64-bit integer */ | 	/* no 64-bit integer */ | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | /* stix_int128_t */ | ||||||
| #if defined(STIX_SIZEOF_INT) && (STIX_SIZEOF_INT == 16) | #if defined(STIX_SIZEOF_INT) && (STIX_SIZEOF_INT == 16) | ||||||
| #	define STIX_HAVE_UINT128_T | #	define STIX_HAVE_UINT128_T | ||||||
| #	define STIX_HAVE_INT128_T | #	define STIX_HAVE_INT128_T | ||||||
| @ -216,7 +224,7 @@ | |||||||
| 	typedef stix_uint64_t stix_ushortptr_t; | 	typedef stix_uint64_t stix_ushortptr_t; | ||||||
| 	typedef stix_int64_t stix_shortptr_t; | 	typedef stix_int64_t stix_shortptr_t; | ||||||
| #else | #else | ||||||
| #	error UNSUPPORTED POINTER SIZE | #	error UNKNOWN POINTER SIZE | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
| #define STIX_SIZEOF_INTPTR_T STIX_SIZEOF_VOID_P | #define STIX_SIZEOF_INTPTR_T STIX_SIZEOF_VOID_P | ||||||
| @ -224,6 +232,36 @@ | |||||||
| #define STIX_SIZEOF_SHORTPTR_T (STIX_SIZEOF_VOID_P / 2) | #define STIX_SIZEOF_SHORTPTR_T (STIX_SIZEOF_VOID_P / 2) | ||||||
| #define STIX_SIZEOF_USHORTPTR_T (STIX_SIZEOF_VOID_P / 2) | #define STIX_SIZEOF_USHORTPTR_T (STIX_SIZEOF_VOID_P / 2) | ||||||
|  |  | ||||||
|  | #if defined(STIX_HAVE_INT128_T) | ||||||
|  | #	define STIX_SIZEOF_INTMAX_T 16 | ||||||
|  | #	define STIX_SIZEOF_UINTMAX_T 16 | ||||||
|  | 	typedef stix_int128_t stix_intmax_t; | ||||||
|  | 	typedef stix_uint128_t stix_uintmax_t; | ||||||
|  | #elif defined(STIX_HAVE_INT64_T) | ||||||
|  | #	define STIX_SIZEOF_INTMAX_T 8 | ||||||
|  | #	define STIX_SIZEOF_UINTMAX_T 8 | ||||||
|  | 	typedef stix_int64_t stix_intmax_t; | ||||||
|  | 	typedef stix_uint64_t stix_uintmax_t; | ||||||
|  | #elif defined(STIX_HAVE_INT32_T) | ||||||
|  | #	define STIX_SIZEOF_INTMAX_T 4 | ||||||
|  | #	define STIX_SIZEOF_UINTMAX_T 4 | ||||||
|  | 	typedef stix_int32_t stix_intmax_t; | ||||||
|  | 	typedef stix_uint32_t stix_uintmax_t; | ||||||
|  | #elif defined(STIX_HAVE_INT16_T) | ||||||
|  | #	define STIX_SIZEOF_INTMAX_T 2 | ||||||
|  | #	define STIX_SIZEOF_UINTMAX_T 2 | ||||||
|  | 	typedef stix_int16_t stix_intmax_t; | ||||||
|  | 	typedef stix_uint16_t stix_uintmax_t; | ||||||
|  | #elif defined(STIX_HAVE_INT8_T) | ||||||
|  | #	define STIX_SIZEOF_INTMAX_T 1 | ||||||
|  | #	define STIX_SIZEOF_UINTMAX_T 1 | ||||||
|  | 	typedef stix_int8_t stix_intmax_t; | ||||||
|  | 	typedef stix_uint8_t stix_uintmax_t; | ||||||
|  | #else | ||||||
|  | #	error UNKNOWN INTMAX SIZE | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
| typedef stix_uintptr_t stix_size_t; | typedef stix_uintptr_t stix_size_t; | ||||||
| typedef stix_intptr_t stix_ssize_t; | typedef stix_intptr_t stix_ssize_t; | ||||||
|  |  | ||||||
| @ -476,12 +514,17 @@ struct stix_cmgr_t | |||||||
|  * =========================================================================*/ |  * =========================================================================*/ | ||||||
|  |  | ||||||
| typedef stix_uint8_t             stix_oob_t; | typedef stix_uint8_t             stix_oob_t; | ||||||
|  |  | ||||||
| /* NOTE: sizeof(stix_oop_t) must be equal to sizeof(stix_oow_t) */ | /* NOTE: sizeof(stix_oop_t) must be equal to sizeof(stix_oow_t) */ | ||||||
| typedef stix_uintptr_t           stix_oow_t; | typedef stix_uintptr_t           stix_oow_t; | ||||||
| typedef stix_intptr_t            stix_ooi_t; | typedef stix_intptr_t            stix_ooi_t; | ||||||
|  | #define STIX_SIZEOF_OOW_T STIX_SIZEOF_UINTPTR_T | ||||||
|  | #define STIX_SIZEOF_OOI_T STIX_SIZEOF_INTPTR_T | ||||||
|  |  | ||||||
| typedef stix_ushortptr_t         stix_oohw_t; /* half word - half word */ | typedef stix_ushortptr_t         stix_oohw_t; /* half word - half word */ | ||||||
| typedef stix_shortptr_t          stix_oohi_t; /* signed half word */ | typedef stix_shortptr_t          stix_oohi_t; /* signed half word */ | ||||||
|  | #define STIX_SIZEOF_OOHW_T STIX_SIZEOF_USHORTPTR_T | ||||||
|  | #define STIX_SIZEOF_OOHI_T STIX_SIZEOF_SHORTPTR_T | ||||||
|  |  | ||||||
| typedef stix_uch_t               stix_ooch_t; | typedef stix_uch_t               stix_ooch_t; | ||||||
| typedef stix_uci_t               stix_ooci_t; | typedef stix_uci_t               stix_ooci_t; | ||||||
| @ -489,4 +532,63 @@ typedef stix_ucs_t               stix_oocs_t; | |||||||
| #define STIX_OOCH_IS_UCH | #define STIX_OOCH_IS_UCH | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* ========================================================================= | ||||||
|  |  * COMPILER FEATURE TEST MACROS | ||||||
|  |  * =========================================================================*/ | ||||||
|  | #if defined(__has_builtin) | ||||||
|  | 	#if __has_builtin(__builtin_ctz) | ||||||
|  | 		#define STIX_HAVE_BUILTIN_CTZ | ||||||
|  | 	#endif | ||||||
|  | 	#if __has_builtin(__builtin_uadd_overflow) | ||||||
|  | 		#define STIX_HAVE_BUILTIN_UADD_OVERFLOW  | ||||||
|  | 	#endif | ||||||
|  | 	#if __has_builtin(__builtin_uaddl_overflow) | ||||||
|  | 		#define STIX_HAVE_BUILTIN_UADDL_OVERFLOW  | ||||||
|  | 	#endif | ||||||
|  | 	#if __has_builtin(__builtin_uaddll_overflow) | ||||||
|  | 		#define STIX_HAVE_BUILTIN_UADDLL_OVERFLOW  | ||||||
|  | 	#endif | ||||||
|  | 	#if __has_builtin(__builtin_umul_overflow) | ||||||
|  | 		#define STIX_HAVE_BUILTIN_UMUL_OVERFLOW  | ||||||
|  | 	#endif | ||||||
|  | 	#if __has_builtin(__builtin_umull_overflow) | ||||||
|  | 		#define STIX_HAVE_BUILTIN_UMULL_OVERFLOW  | ||||||
|  | 	#endif | ||||||
|  | 	#if __has_builtin(__builtin_umulll_overflow) | ||||||
|  | 		#define STIX_HAVE_BUILTIN_UMULLL_OVERFLOW  | ||||||
|  | 	#endif | ||||||
|  | 	 | ||||||
|  | #elif defined(__GNUC__) && defined(__GNUC_MINOR__) | ||||||
|  |  | ||||||
|  | 	#if (__GNUC__ >= 5) | ||||||
|  | 		#define STIX_HAVE_BUILTIN_UADD_OVERFLOW | ||||||
|  | 		#define STIX_HAVE_BUILTIN_UADDL_OVERFLOW | ||||||
|  | 		#define STIX_HAVE_BUILTIN_UADDLL_OVERFLOW | ||||||
|  | 		#define STIX_HAVE_BUILTIN_UMUL_OVERFLOW | ||||||
|  | 		#define STIX_HAVE_BUILTIN_UMULL_OVERFLOW | ||||||
|  | 		#define STIX_HAVE_BUILTIN_UMULLL_OVERFLOW | ||||||
|  | 	#endif | ||||||
|  |  | ||||||
|  | 	#if (__GNUC__ >= 4) || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) | ||||||
|  | 		#define STIX_HAVE_BUILTIN_CTZ | ||||||
|  | 	#endif | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | /* | ||||||
|  | #if !defined(__has_builtin) | ||||||
|  | 	#define __has_builtin(x) 0 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #if !defined(__is_identifier) | ||||||
|  | 	#define __is_identifier(x) 0 | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #if !defined(__has_attribute) | ||||||
|  | 	#define __has_attribute(x) 0 | ||||||
|  | #endif | ||||||
|  | */ | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| #endif | #endif | ||||||
|  | |||||||
| @ -1050,6 +1050,12 @@ stix_oop_t stix_subints ( | |||||||
| 	stix_oop_t y | 	stix_oop_t y | ||||||
| ); | ); | ||||||
|  |  | ||||||
|  | stix_oop_t stix_strtoint ( | ||||||
|  | 	stix_t*            stix, | ||||||
|  | 	const stix_ooch_t* str, | ||||||
|  | 	stix_oow_t         len, | ||||||
|  | 	unsigned int       radix | ||||||
|  | ); | ||||||
| /* ========================================================================= */ | /* ========================================================================= */ | ||||||
| /* comp.c                                                                    */ | /* comp.c                                                                    */ | ||||||
| /* ========================================================================= */ | /* ========================================================================= */ | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user