34 #ifndef ION_INT_INITTO
35 #define ION_INT_INITTO
41 #define ION_INT_INIT init
45 #ifndef ION_INT_GLOBAL
46 #define ION_INT_GLOBAL extern
60typedef uint32_t II_DIGIT;
61typedef uint64_t II_LONG_DIGIT;
66#define II_BASE ((uint32_t)0x80000000)
67#define II_MASK ((uint32_t)0x7FFFFFFF)
68#define II_SHIFT ((uint32_t)31)
70#define II_BITS_PER_II_DIGIT II_SHIFT
71#define II_DIGIT_COUNT_FROM_BITS(bits) (((bits) == 0) ? 1 : (((((int)bits) - 1) / II_BITS_PER_II_DIGIT) + 1))
73#define II_STRING_BASE 10
74#define II_BITS_PER_DEC_DIGIT 3.35
75#define II_DEC_DIGIT_PER_BITS 3.32191780821918
76#define II_II_DIGITS_PER_DEC_DIGIT 0.108064516
77#define II_DEC_DIGITS_PER_II_DIGIT 9.253731343
79#define DECIMAL_DIGIT_COUNT_FROM_BITS(bits) (((bits) == 0) ? 1 : ((SIZE)(((double)(bits) / II_DEC_DIGIT_PER_BITS) + 1)))
81#define II_BITS_PER_HEX_DIGIT 4
83#define II_HEX_RADIX_CHARS "xX"
84#define II_BITS_PER_BINARY_DIGIT 1
85#define II_BINARY_BASE 2
86#define II_BINARY_RADIX_CHARS "bB"
88#define II_MAX_DIGIT (II_MASK)
89#define II_BITS_PER_BYTE 8
90#define II_BYTE_BASE 256
91#define II_BYTE_MASK 0xFF
92#define II_BYTE_SIGN_BIT 0x80
93#define II_BYTE_NEG_OVERFLOW_LIMIT 0xFE
95#define II_INT64_BIT_THRESHOLD (sizeof(int64_t)*8-2)
97#define II_SMALL_DIGIT_ARRAY_LENGTH ((256 / II_BITS_PER_II_DIGIT)+1)
107ION_INT_GLOBAL II_DIGIT g_int_zero_bytes[]
112ION_INT_GLOBAL
ION_INT g_Int_Zero
121ION_INT_GLOBAL
ION_INT g_Int_Null
131ION_INT_GLOBAL THREAD_LOCAL_STORAGE BOOL g_ion_int_globals_initialized;
132ION_INT_GLOBAL THREAD_LOCAL_STORAGE decQuad g_digit_base_quad;
133ION_INT_GLOBAL THREAD_LOCAL_STORAGE decNumber g_digit_base_number;
139ION_API_EXPORT iERR ion_int_alloc (
void *owner,
ION_INT **piint);
140ION_API_EXPORT
void ion_int_free (
ION_INT *iint);
141ION_API_EXPORT iERR ion_int_init (
ION_INT *iint,
void *owner);
142ION_API_EXPORT iERR ion_int_copy (
ION_INT *dst,
ION_INT *src,
void *owner);
144ION_API_EXPORT iERR ion_int_is_null (
ION_INT *iint, BOOL *p_is_null);
145ION_API_EXPORT iERR ion_int_is_zero (
ION_INT *iint, BOOL *p_bool);
146ION_API_EXPORT iERR ion_int_compare (
ION_INT *left,
ION_INT *right,
int *p_result);
147ION_API_EXPORT iERR ion_int_signum (
ION_INT *iint, int32_t *p_signum);
148ION_API_EXPORT iERR ion_int_highest_bit_set (
ION_INT *iint, SIZE *p_pos);
150ION_API_EXPORT iERR ion_int_from_string (
ION_INT *iint,
const iSTRING p_str);
151ION_API_EXPORT iERR ion_int_from_hex_string (
ION_INT *iint,
const iSTRING p_str);
152ION_API_EXPORT iERR ion_int_from_binary_string(
ION_INT *iint,
const iSTRING p_str);
153ION_API_EXPORT iERR ion_int_from_chars (
ION_INT *iint,
const char *p_chars, SIZE char_limit);
154ION_API_EXPORT iERR ion_int_from_hex_chars (
ION_INT *iint,
const char *p_chars, SIZE char_limit);
155ION_API_EXPORT iERR ion_int_from_binary_chars(
ION_INT *iint,
const char *p_chars, SIZE char_limit);
156ION_API_EXPORT iERR ion_int_from_bytes (
ION_INT *iint, BYTE *buf, SIZE limit);
157ION_API_EXPORT iERR ion_int_from_abs_bytes (
ION_INT *iint, BYTE *buf, SIZE limit, BOOL is_negative);
158ION_API_EXPORT iERR ion_int_from_long (
ION_INT *iint, int64_t value);
165ION_API_EXPORT iERR ion_int_char_length (
ION_INT *iint, SIZE *p_len);
166ION_API_EXPORT iERR ion_int_to_char (
ION_INT *iint, BYTE *p_str, SIZE len, SIZE *p_written);
167ION_API_EXPORT iERR ion_int_to_string (
ION_INT *iint, hOWNER owner,
iSTRING p_str);
169ION_API_EXPORT iERR ion_int_byte_length (
ION_INT *iint, SIZE *p_byte_length);
170ION_API_EXPORT iERR ion_int_to_bytes (
ION_INT *iint, SIZE starting_int_byte_offset, BYTE *buffer, SIZE buffer_length, SIZE *bytes_written);
171ION_API_EXPORT iERR ion_int_abs_bytes_length(
ION_INT *iint, SIZE *p_byte_length);
172ION_API_EXPORT iERR ion_int_to_abs_bytes (
ION_INT *iint, SIZE starting_int_byte_offset, BYTE *buffer, SIZE buffer_length, SIZE *bytes_written);
173ION_API_EXPORT iERR ion_int_to_int64 (
ION_INT *iint, int64_t *p_int64);
174ION_API_EXPORT iERR ion_int_to_int32 (
ION_INT *iint, int32_t *p_int32);
184void _ion_int_dump_quad(decQuad *quad, int64_t expected);
185int _ion_int_init_globals(
void);
187iERR _ion_int_from_decimal_number(
ION_INT *iint,
const decNumber *p_value, decContext *context);
188iERR _ion_int_to_decimal_number(
ION_INT *iint, decNumber *p_value, decContext *context);
190iERR _ion_int_validate_arg(
const ION_INT *iint);
191iERR _ion_int_validate_arg_with_ptr(
const ION_INT *iint,
const void *ptr);
192iERR _ion_int_validate_non_null_arg_with_ptr(
const ION_INT *iint,
const void *ptr);
194void _ion_int_init(
ION_INT *iint,
void *owner);
195iERR _ion_int_zero(
ION_INT *iint);
196void * _ion_int_realloc_helper(
void *value, SIZE old_len,
void *owner, SIZE new_len);
197iERR _ion_int_extend_digits(
ION_INT *iint, SIZE digits_needed, BOOL zero_fill);
198II_DIGIT *_ion_int_buffer_temp_copy( II_DIGIT *orig_digits, SIZE len, II_DIGIT *cache_buffer, SIZE cache_len);
199II_DIGIT *_ion_int_buffer_temp_copy( II_DIGIT *orig_digits, SIZE len, II_DIGIT *cache_buffer, SIZE cache_len);
200void _ion_int_free_temp(II_DIGIT *temp_buffer, II_DIGIT *cache_buffer);
202BOOL _ion_int_from_bytes_helper(
ION_INT *iint, BYTE *buf, SIZE byte_idx, SIZE limit, BOOL invert, BOOL includes_sign_byte);
203iERR _ion_int_from_chars_helper(
ION_INT *iint,
const char *str, SIZE len);
204iERR _ion_int_from_radix_chars_helper(
ION_INT *iint,
const char *str, SIZE len,
unsigned int *digit_values,
unsigned int base,
unsigned int bits_per_digit,
const char *radix_chars);
205iERR _ion_int_from_hex_chars_helper(
ION_INT *iint,
const char *str, SIZE len);
206iERR _ion_int_from_binary_chars_helper(
ION_INT *iint,
const char *str, SIZE len);
208BOOL _ion_int_is_null_helper(
const ION_INT *iint);
209BOOL _ion_int_is_zero(
const ION_INT *iint);
210BOOL _ion_int_is_zero_bytes(
const II_DIGIT *digits, SIZE len);
212SIZE _ion_int_highest_bit_set_helper(
const ION_INT *iint);
214SIZE _ion_int_get_char_len_helper(
const ION_INT *iint);
215iERR _ion_int_to_string_helper(
ION_INT *iint,
char *strbuf, SIZE buflen, SIZE *p_written);
217BOOL _ion_int_is_high_bytes_high_bit_set_helper(
const ION_INT *iint, SIZE abs_byte_count);
218SIZE _ion_int_bytes_length_helper(
const ION_INT *iint);
219iERR _ion_int_to_bytes_helper(
ION_INT *iint, SIZE bytes_in_int, SIZE starting_int_byte_offset, BOOL is_neg, BYTE *buffer, SIZE buffer_length, SIZE *bytes_written);
221SIZE _ion_int_abs_bytes_length_helper(
const ION_INT *iint);
222SIZE _ion_int_abs_bytes_signed_length_helper(
const ION_INT *iint);
225iERR _ion_int_to_int64_helper(
ION_INT *iint, int64_t *p_int64);
227iERR _ion_int_add_digit(II_DIGIT *digits, SIZE digit_count, II_DIGIT value);
228iERR _ion_int_sub_digit(II_DIGIT *digits, SIZE digit_count, II_DIGIT value);
232iERR _ion_int_multiply_and_add(II_DIGIT *digits, SIZE digit_count, II_DIGIT mult_value, II_DIGIT add_value);
233iERR _ion_int_divide_by_digit(II_DIGIT *digits, SIZE digit_count, II_DIGIT value, II_DIGIT *p_remainder);
ION_API_EXPORT iERR ion_int_from_decimal(ION_INT *iint, const decQuad *p_value, decContext *context)
ION_API_EXPORT iERR ion_int_to_decimal(ION_INT *iint, decQuad *p_quad, decContext *context)
Definition ion_string.h:40