14#ifndef UTILS_GP_STRING_H
15#define UTILS_GP_STRING_H
22#define GP_XXTOA_ADD(dst, pos, val) \
29#define GP_XXTOA_SWAP(dst, pos) \
33 for (i = 0; i < pos/2; i++) \
34 GP_SWAP(dst[i], dst[pos-1-i]); \
53static inline size_t gp_u32toa(
char *dst, uint32_t val,
bool null_terminate)
58 GP_XXTOA_ADD(dst, pos,
'0');
63 GP_XXTOA_ADD(dst, pos,
'0' + (val % 10));
67 GP_XXTOA_SWAP(dst, pos);
71 GP_XXTOA_ADD(dst, pos, 0);
91static inline size_t gp_u64toa(
char *dst, uint64_t val,
bool null_terminate)
96 GP_XXTOA_ADD(dst, pos,
'0');
101 GP_XXTOA_ADD(dst, pos,
'0' + (val % 10));
105 GP_XXTOA_SWAP(dst, pos);
109 GP_XXTOA_ADD(dst, pos, 0);
125static inline size_t gp_utoa(
char *dst,
unsigned int val,
bool null_terminate)
127#if UINT_MAX == UINT32_MAX
128 return gp_u32toa(dst, val, null_terminate);
129#elif UINT_MAX == UINT64_MAX
130 return gp_u64toa(dst, val, null_terminate);
132# error Unexpected unsigned int size
147static inline size_t gp_lutoa(
char *dst,
unsigned long val,
bool null_terminate)
149#if ULONG_MAX == UINT32_MAX
150 return gp_u32toa(dst, val, null_terminate);
151#elif ULONG_MAX == UINT64_MAX
152 return gp_u64toa(dst, val, null_terminate);
154# error Unexpected unsigned long size
169static inline size_t gp_llutoa(
char *dst,
unsigned long long val,
bool null_terminate)
171#if ULLONG_MAX == UINT32_MAX
172 return gp_u32toa(dst, val, null_terminate);
173#elif ULLONG_MAX == UINT64_MAX
174 return gp_u64toa(dst, val, null_terminate);
176# error Unexpected unsigned long long size
180#define GP_ATOXX_OVERFLOW(cur_val, digit, max) \
181 ((cur_val > max/10) || (cur_val == max/10 && digit > max%10))
196static inline ssize_t
gp_atou32(
const char *src,
size_t src_len, uint32_t *dst)
203 while (src[pos] && (!src_len || pos < src_len)) {
206 digit = src[pos++] -
'0';
208 if (GP_ATOXX_OVERFLOW(*dst, digit, UINT32_MAX))
211 *dst = 10 * (*dst) + digit;
234static inline ssize_t
gp_atou64(
const char *src,
size_t src_len, uint64_t *dst)
241 while (src[pos] && (!src_len || pos < src_len)) {
244 digit = src[pos++] -
'0';
246 if (GP_ATOXX_OVERFLOW(*dst, digit, UINT64_MAX))
249 *dst = 10 * (*dst) + digit;
272static inline ssize_t
gp_atou(
const char *src,
size_t src_len,
unsigned int *dst)
274#if UINT_MAX == UINT32_MAX
275 return gp_atou32(src, src_len, (uint32_t*)dst);
276#elif UINT_MAX == UINT64_MAX
277 return gp_atou64(src, src_len, (uint64_t*)dst);
279# error Unexpected unsigned int size
296static inline ssize_t
gp_atolu(
const char *src,
size_t src_len,
unsigned long *dst)
298#if ULONG_MAX == UINT32_MAX
299 return gp_atou32(src, src_len, (uint32_t*)dst);
300#elif ULONG_MAX == UINT64_MAX
301 return gp_atou64(src, src_len, (uint64_t*)dst);
303# error Unexpected unsigned long size
320static inline ssize_t
gp_atollu(
const char *src,
size_t src_len,
unsigned long long *dst)
322#if ULLONG_MAX == UINT32_MAX
323 return gp_atou32(src, src_len, (uint32_t*)dst);
324#elif ULLONG_MAX == UINT64_MAX
325 return gp_atou64(src, src_len, (uint64_t*)dst);
327# error Unexpected unsigned long long size
static size_t gp_utoa(char *dst, unsigned int val, bool null_terminate)
Converts an unsigned integer into an ascii representation.
static ssize_t gp_atou(const char *src, size_t src_len, unsigned int *dst)
Converts an ASCII string into an unsigned integer.
static size_t gp_lutoa(char *dst, unsigned long val, bool null_terminate)
Converts an unsigned long into an ascii representation.
static ssize_t gp_atolu(const char *src, size_t src_len, unsigned long *dst)
Converts an ASCII string into an unsigned long.
static ssize_t gp_atollu(const char *src, size_t src_len, unsigned long long *dst)
Converts an ASCII string into an unsigned long long.
static size_t gp_llutoa(char *dst, unsigned long long val, bool null_terminate)
Converts an unsigned long long into an ascii representation.
static size_t gp_u32toa(char *dst, uint32_t val, bool null_terminate)
Converts an unsigned 32bit integer into an ascii representation.
static ssize_t gp_atou64(const char *src, size_t src_len, uint64_t *dst)
Converts an ASCII string into an unsigned 64bit integer.
static ssize_t gp_atou32(const char *src, size_t src_len, uint32_t *dst)
Converts an ASCII string into an unsigned 32bit integer.
static size_t gp_u64toa(char *dst, uint64_t val, bool null_terminate)
Converts an unsigned 64bit integer into an ascii representation.