NeoMutt  2023-03-22
Teaching an old dog new tricks
DOXYGEN
atoi.c
Go to the documentation of this file.
1
29#include "config.h"
30#include <errno.h>
31#include <limits.h>
32#include <stdio.h>
33#include <stdlib.h>
34#include "atoi.h"
35
51static const char *str_atol_clamp(const char *str, long *dst, long lmin, long lmax)
52{
53 if (dst)
54 {
55 *dst = 0;
56 }
57
58 if (!str || (*str == '\0'))
59 {
60 return NULL;
61 }
62
63 char *e = NULL;
64 errno = 0;
65 long res = strtol(str, &e, 10);
66 if ((e == str) || (((res == LONG_MIN) || (res == LONG_MAX)) && (errno == ERANGE)) ||
67 (res < lmin) || (res > lmax))
68 {
69 return NULL;
70 }
71
72 if (dst)
73 {
74 *dst = res;
75 }
76
77 return e;
78}
79
94static const char *str_atoull_clamp(const char *str, unsigned long long *dst,
95 unsigned long long ullmax)
96{
97 if (dst)
98 {
99 *dst = 0;
100 }
101
102 if (!str || (*str == '\0'))
103 {
104 return str;
105 }
106
107 char *e = NULL;
108 errno = 0;
109 unsigned long long res = strtoull(str, &e, 10);
110 if ((e == str) || ((res == ULLONG_MAX) && (errno == ERANGE)) || (res > ullmax))
111 {
112 return NULL;
113 }
114
115 if (dst)
116 {
117 *dst = res;
118 }
119
120 return e;
121}
122
136const char *mutt_str_atol(const char *str, long *dst)
137{
138 return str_atol_clamp(str, dst, LONG_MIN, LONG_MAX);
139}
140
154const char *mutt_str_atos(const char *str, short *dst)
155{
156 long l;
157 const char *res = str_atol_clamp(str, &l, SHRT_MIN, SHRT_MAX);
158 if (dst)
159 {
160 *dst = res ? l : 0;
161 }
162 return res;
163}
164
179const char *mutt_str_atoi(const char *str, int *dst)
180{
181 long l;
182 const char *res = str_atol_clamp(str, &l, INT_MIN, INT_MAX);
183 if (dst)
184 {
185 *dst = res ? l : 0;
186 }
187 return res;
188}
189
203const char *mutt_str_atoui(const char *str, unsigned int *dst)
204{
205 unsigned long long l;
206 const char *res = str_atoull_clamp(str, &l, UINT_MAX);
207 if (dst)
208 {
209 *dst = res ? l : 0;
210 }
211 return res;
212}
213
227const char *mutt_str_atoul(const char *str, unsigned long *dst)
228{
229 unsigned long long l;
230 const char *res = str_atoull_clamp(str, &l, ULONG_MAX);
231 if (dst)
232 {
233 *dst = res ? l : 0;
234 }
235 return res;
236}
237
251const char *mutt_str_atous(const char *str, unsigned short *dst)
252{
253 unsigned long long l;
254 const char *res = str_atoull_clamp(str, &l, USHRT_MAX);
255 if (dst)
256 {
257 *dst = res ? l : 0;
258 }
259 return res;
260}
261
275const char *mutt_str_atoull(const char *str, unsigned long long *dst)
276{
277 return str_atoull_clamp(str, dst, ULLONG_MAX);
278}
static const char * str_atol_clamp(const char *str, long *dst, long lmin, long lmax)
Convert ASCII string to a long and clamp.
Definition: atoi.c:51
const char * mutt_str_atoull(const char *str, unsigned long long *dst)
Convert ASCII string to an unsigned long long.
Definition: atoi.c:275
const char * mutt_str_atous(const char *str, unsigned short *dst)
Convert ASCII string to an unsigned short.
Definition: atoi.c:251
const char * mutt_str_atol(const char *str, long *dst)
Convert ASCII string to a long.
Definition: atoi.c:136
const char * mutt_str_atoul(const char *str, unsigned long *dst)
Convert ASCII string to an unsigned long.
Definition: atoi.c:227
static const char * str_atoull_clamp(const char *str, unsigned long long *dst, unsigned long long ullmax)
Convert ASCII string to an unsigned long long and clamp.
Definition: atoi.c:94
const char * mutt_str_atos(const char *str, short *dst)
Convert ASCII string to a short.
Definition: atoi.c:154
const char * mutt_str_atoui(const char *str, unsigned int *dst)
Convert ASCII string to an unsigned integer.
Definition: atoi.c:203
const char * mutt_str_atoi(const char *str, int *dst)
Convert ASCII string to an integer.
Definition: atoi.c:179
Parse a number in a string.