intc: Change slice to data/size pair, fix intc_u128_init_cstring using wrong hi/lo pair
This commit is contained in:
		
							parent
							
								
									c80788ff66
								
							
						
					
					
						commit
						7495153d9e
					
				
							
								
								
									
										42
									
								
								intc.h
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								intc.h
									
									
									
									
									
								
							| @ -100,14 +100,14 @@ | |||||||
|         if (value == 64) |         if (value == 64) | ||||||
|             value *= 1'000'000'000'000; |             value *= 1'000'000'000'000; | ||||||
|         intc_u256_string string = intc_u256_readable_int_str(value); |         intc_u256_string string = intc_u256_readable_int_str(value); | ||||||
|         printf("%.*s\n", string.size, string.str); // 64,000,000,000,000
 |         printf("%.*s\n", string.size, string.data); // 64,000,000,000,000
 | ||||||
|     #else |     #else | ||||||
|         intc_u256 value = INTC_U64_TO_U256(32); |         intc_u256 value = INTC_U64_TO_U256(32); | ||||||
|         value = intc_u256_add_u64(value, 32); |         value = intc_u256_add_u64(value, 32); | ||||||
|         if (intc_u256_eq_u64(value, 64)) |         if (intc_u256_eq_u64(value, 64)) | ||||||
|             value = intc_u256_mul(value, INTC_U64_TO_U256(1'000'000'000'000)); |             value = intc_u256_mul(value, INTC_U64_TO_U256(1'000'000'000'000)); | ||||||
|         intc_u256_string string = intc_u256_readable_int_str(value); |         intc_u256_string string = intc_u256_readable_int_str(value); | ||||||
|         printf("%.*s\n", string.size, string.str); // 64,000,000,000,000
 |         printf("%.*s\n", string.size, string.data); // 64,000,000,000,000
 | ||||||
|     #endif |     #endif | ||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
| @ -197,7 +197,7 @@ struct intc_u128_divmod_result | |||||||
| struct intc_u128_string | struct intc_u128_string | ||||||
| { | { | ||||||
|     // NOTE: Max value 340,282,366,920,938,463,463,374,607,431,768,211,455
 |     // NOTE: Max value 340,282,366,920,938,463,463,374,607,431,768,211,455
 | ||||||
|     char  str[256 + 1]; |     char  data[256 + 1]; | ||||||
|     int   size; |     int   size; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -230,8 +230,8 @@ INTC_BEGIN_EXTERN_C | |||||||
| // -----------------------------------------------------------------------------
 | // -----------------------------------------------------------------------------
 | ||||||
| // Reminder: If INTC_API_PREFIX is not defined, example API looks like: intc_u128_init_cstring(...)
 | // Reminder: If INTC_API_PREFIX is not defined, example API looks like: intc_u128_init_cstring(...)
 | ||||||
| // Construct a 128 unsigned integer from a string. This function supports
 | // Construct a 128 unsigned integer from a string. This function supports
 | ||||||
| // hexadecimal strings with and without the 0x prefix and integer numbers, i.e.
 | // hexadecimal strings with and without the 0x prefix i.e. "0xafc8a" or "afc8a"
 | ||||||
| // "0xafc8a" or "afc8a" or "0xAFC8A" or "xafc8a" or "720010" etc
 | // or "0xAFC8A" or "xafc8a" .
 | ||||||
| INTC_API bool                           INTC_API_PREFIX(128_init_cstring)(const char *string, int size, struct intc_u128 *dest); | INTC_API bool                           INTC_API_PREFIX(128_init_cstring)(const char *string, int size, struct intc_u128 *dest); | ||||||
| 
 | 
 | ||||||
| // Interpret the 128 bit integer as a lower bit-type by using the lo bits of the
 | // Interpret the 128 bit integer as a lower bit-type by using the lo bits of the
 | ||||||
| @ -425,7 +425,7 @@ struct intc_u256_divmod_result | |||||||
| struct intc_u256_string | struct intc_u256_string | ||||||
| { | { | ||||||
|     // NOTE: Max value 115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,935
 |     // NOTE: Max value 115,792,089,237,316,195,423,570,985,008,687,907,853,269,984,665,640,564,039,457,584,007,913,129,639,935
 | ||||||
|     char  str[512 + 1]; |     char  data[512 + 1]; | ||||||
|     int   size; |     int   size; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| @ -462,8 +462,8 @@ INTC_BEGIN_EXTERN_C | |||||||
| // -----------------------------------------------------------------------------
 | // -----------------------------------------------------------------------------
 | ||||||
| // Reminder: If INTC_API_PREFIX is not defined, example API looks like: intc_u256_init_cstring(...)
 | // Reminder: If INTC_API_PREFIX is not defined, example API looks like: intc_u256_init_cstring(...)
 | ||||||
| // Construct a 128 unsigned integer from a string. This function supports
 | // Construct a 128 unsigned integer from a string. This function supports
 | ||||||
| // hexadecimal strings with and without the 0x prefix and integer numbers, i.e.
 | // hexadecimal strings with and without the 0x prefix i.e. "0xafc8a" or "afc8a"
 | ||||||
| // "0xafc8a" or "afc8a" or "0xAFC8A" or "xafc8a" or "720010" etc
 | // or "0xAFC8A" or "xafc8a".
 | ||||||
| INTC_API bool                           INTC_API_PREFIX(256_init_cstring)(char const *string, int size, struct intc_u256 *dest); | INTC_API bool                           INTC_API_PREFIX(256_init_cstring)(char const *string, int size, struct intc_u256 *dest); | ||||||
| 
 | 
 | ||||||
| // TODO(dqn): We should support all the bases that the printing functions work
 | // TODO(dqn): We should support all the bases that the printing functions work
 | ||||||
| @ -684,7 +684,7 @@ INTC_API bool INTC_API_PREFIX(128_init_cstring)(char const *string, int size, st | |||||||
|         if (bits4 == 0xFF) |         if (bits4 == 0xFF) | ||||||
|             return false; |             return false; | ||||||
| 
 | 
 | ||||||
|         intc_u64 *word = (bits_written >= (int)(sizeof(dest->lo) * 8)) ? &dest->lo : &dest->hi; |         intc_u64 *word = (bits_written >= (int)(sizeof(dest->lo) * 8)) ? &dest->hi : &dest->lo; | ||||||
|         *word = (*word << 4) | bits4; |         *word = (*word << 4) | bits4; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -1060,7 +1060,7 @@ INTC_API struct intc_u128_string INTC_API_PREFIX(128_str)(struct intc_u128 in, u | |||||||
| 
 | 
 | ||||||
|     if (INTC_API_PREFIX(128_eq)(in, INTC_U128_ZERO)) |     if (INTC_API_PREFIX(128_eq)(in, INTC_U128_ZERO)) | ||||||
|     { |     { | ||||||
|         val.str[val.size++] = '0'; |         val.data[val.size++] = '0'; | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
| @ -1072,25 +1072,25 @@ INTC_API struct intc_u128_string INTC_API_PREFIX(128_str)(struct intc_u128 in, u | |||||||
|         do |         do | ||||||
|         { |         { | ||||||
|             div_result          = INTC_API_PREFIX(128_divmod)(div_result.quot, INTC_U64_TO_U128(base)); |             div_result          = INTC_API_PREFIX(128_divmod)(div_result.quot, INTC_U64_TO_U128(base)); | ||||||
|             val.str[val.size++] = "0123456789abcdefghijklmnopqrstuvwxyz"[div_result.rem.lo]; |             val.data[val.size++] = "0123456789abcdefghijklmnopqrstuvwxyz"[div_result.rem.lo]; | ||||||
| 
 | 
 | ||||||
|             if (separate_every_n_chars > 0 && INTC_API_PREFIX(128_as_bool)(div_result.quot)) |             if (separate_every_n_chars > 0 && INTC_API_PREFIX(128_as_bool)(div_result.quot)) | ||||||
|             { |             { | ||||||
|                 insert_count++; |                 insert_count++; | ||||||
|                 if (insert_count % separate_every_n_chars == 0) |                 if (insert_count % separate_every_n_chars == 0) | ||||||
|                     val.str[val.size++] = separate_ch; |                     val.data[val.size++] = separate_ch; | ||||||
|             } |             } | ||||||
|         } while (INTC_API_PREFIX(128_as_bool)(div_result.quot)); |         } while (INTC_API_PREFIX(128_as_bool)(div_result.quot)); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     INTC_ASSERT(val.size < (int)sizeof(val.str) - 1); |     INTC_ASSERT(val.size < (int)sizeof(val.data) - 1); | ||||||
| 
 | 
 | ||||||
|     struct intc_u128_string result; |     struct intc_u128_string result; | ||||||
|     result.size = 0; |     result.size = 0; | ||||||
| 
 | 
 | ||||||
|     for (int i = val.size - 1; i >= 0; i--) |     for (int i = val.size - 1; i >= 0; i--) | ||||||
|         result.str[result.size++] = val.str[i]; |         result.data[result.size++] = val.data[i]; | ||||||
|     result.str[result.size] = 0; |     result.data[result.size] = 0; | ||||||
| 
 | 
 | ||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
| @ -1821,7 +1821,7 @@ INTC_API struct intc_u256_string INTC_API_PREFIX(256_str)(struct intc_u256 in, u | |||||||
| 
 | 
 | ||||||
|     if (INTC_API_PREFIX(256_eq)(in, INTC_U256_ZERO)) |     if (INTC_API_PREFIX(256_eq)(in, INTC_U256_ZERO)) | ||||||
|     { |     { | ||||||
|         val.str[val.size++] = '0'; |         val.data[val.size++] = '0'; | ||||||
|     } |     } | ||||||
|     else |     else | ||||||
|     { |     { | ||||||
| @ -1832,25 +1832,25 @@ INTC_API struct intc_u256_string INTC_API_PREFIX(256_str)(struct intc_u256 in, u | |||||||
|         do |         do | ||||||
|         { |         { | ||||||
|             div_result          = INTC_API_PREFIX(256_divmod)(div_result.quot, INTC_U64_TO_U256(base)); |             div_result          = INTC_API_PREFIX(256_divmod)(div_result.quot, INTC_U64_TO_U256(base)); | ||||||
|             val.str[val.size++] = "0123456789abcdefghijklmnopqrstuvwxyz"[INTC_API_PREFIX(128_as_u32)(div_result.rem.lo)]; |             val.data[val.size++] = "0123456789abcdefghijklmnopqrstuvwxyz"[INTC_API_PREFIX(128_as_u32)(div_result.rem.lo)]; | ||||||
| 
 | 
 | ||||||
|             if (separate_every_n_chars > 0 && INTC_API_PREFIX(256_as_bool)(div_result.quot)) |             if (separate_every_n_chars > 0 && INTC_API_PREFIX(256_as_bool)(div_result.quot)) | ||||||
|             { |             { | ||||||
|                 insert_count++; |                 insert_count++; | ||||||
|                 if (insert_count % separate_every_n_chars == 0) |                 if (insert_count % separate_every_n_chars == 0) | ||||||
|                     val.str[val.size++] = separate_ch; |                     val.data[val.size++] = separate_ch; | ||||||
|             } |             } | ||||||
|         } while (INTC_API_PREFIX(256_as_bool)(div_result.quot)); |         } while (INTC_API_PREFIX(256_as_bool)(div_result.quot)); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     INTC_ASSERT(val.size <= (int)(sizeof(val.str) - 1)); |     INTC_ASSERT(val.size <= (int)(sizeof(val.data) - 1)); | ||||||
| 
 | 
 | ||||||
|     struct intc_u256_string result; |     struct intc_u256_string result; | ||||||
|     result.size = 0; |     result.size = 0; | ||||||
| 
 | 
 | ||||||
|     for (int i = val.size - 1; i >= 0; i--) |     for (int i = val.size - 1; i >= 0; i--) | ||||||
|         result.str[result.size++] = val.str[i]; |         result.data[result.size++] = val.data[i]; | ||||||
|     result.str[result.size] = 0; |     result.data[result.size] = 0; | ||||||
| 
 | 
 | ||||||
|     return result; |     return result; | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user