NeoMutt
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
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
53static const char *str_atol_clamp(const char *str, long *dst, long lmin, long lmax)
54{
55 if (dst)
56 {
57 *dst = 0;
58 }
59
60 if (!str || (*str == '\0'))
61 {
62 return NULL;
63 }
64
65 char *e = NULL;
66 errno = 0;
67 long res = strtol(str, &e, 10);
68 if ((e == str) || (((res == LONG_MIN) || (res == LONG_MAX)) && (errno == ERANGE)) ||
69 (res < lmin) || (res > lmax))
70 {
71 return NULL;
72 }
73
74 if (dst)
75 {
76 *dst = res;
77 }
78
79 return e;
80}
81
98static const char *str_atoull_clamp(const char *str, unsigned long long *dst,
99 unsigned long long ullmax)
100{
101 if (dst)
102 {
103 *dst = 0;
104 }
105
106 if (!str || (*str == '\0'))
107 {
108 return str;
109 }
110
111 char *e = NULL;
112 errno = 0;
113 unsigned long long res = strtoull(str, &e, 10);
114 if ((e == str) || ((res == ULLONG_MAX) && (errno == ERANGE)) || (res > ullmax))
115 {
116 return NULL;
117 }
118
119 if (dst)
120 {
121 *dst = res;
122 }
123
124 return e;
125}
126
142const char *mutt_str_atol(const char *str, long *dst)
143{
144 return str_atol_clamp(str, dst, LONG_MIN, LONG_MAX);
145}
146
160const char *mutt_str_atos(const char *str, short *dst)
161{
162 long l;
163 const char *res = str_atol_clamp(str, &l, SHRT_MIN, SHRT_MAX);
164 if (dst)
165 {
166 *dst = res ? l : 0;
167 }
168 return res;
169}
170
187const char *mutt_str_atoi(const char *str, int *dst)
188{
189 long l;
190 const char *res = str_atol_clamp(str, &l, INT_MIN, INT_MAX);
191 if (dst)
192 {
193 *dst = res ? l : 0;
194 }
195 return res;
196}
197
213const char *mutt_str_atoui(const char *str, unsigned int *dst)
214{
215 unsigned long long l;
216 const char *res = str_atoull_clamp(str, &l, UINT_MAX);
217 if (dst)
218 {
219 *dst = res ? l : 0;
220 }
221 return res;
222}
223
239const char *mutt_str_atoul(const char *str, unsigned long *dst)
240{
241 unsigned long long l;
242 const char *res = str_atoull_clamp(str, &l, ULONG_MAX);
243 if (dst)
244 {
245 *dst = res ? l : 0;
246 }
247 return res;
248}
249
265const char *mutt_str_atous(const char *str, unsigned short *dst)
266{
267 unsigned long long l;
268 const char *res = str_atoull_clamp(str, &l, USHRT_MAX);
269 if (dst)
270 {
271 *dst = res ? l : 0;
272 }
273 return res;
274}
275
291const char *mutt_str_atoull(const char *str, unsigned long long *dst)
292{
293 return str_atoull_clamp(str, dst, ULLONG_MAX);
294}
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:53
const char * mutt_str_atoull(const char *str, unsigned long long *dst)
Convert ASCII string to an unsigned long long.
Definition: atoi.c:291
const char * mutt_str_atous(const char *str, unsigned short *dst)
Convert ASCII string to an unsigned short.
Definition: atoi.c:265
const char * mutt_str_atol(const char *str, long *dst)
Convert ASCII string to a long.
Definition: atoi.c:142
const char * mutt_str_atoul(const char *str, unsigned long *dst)
Convert ASCII string to an unsigned long.
Definition: atoi.c:239
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:98
const char * mutt_str_atos(const char *str, short *dst)
Convert ASCII string to a short.
Definition: atoi.c:160
const char * mutt_str_atoui(const char *str, unsigned int *dst)
Convert ASCII string to an unsigned integer.
Definition: atoi.c:213
const char * mutt_str_atoi(const char *str, int *dst)
Convert ASCII string to an integer.
Definition: atoi.c:187
Parse a number in a string.