NeoMutt  2024-11-14-138-ge5ca67
Teaching an old dog new tricks
DOXYGEN
Loading...
Searching...
No Matches
atoi.c
Go to the documentation of this file.
1
30#include "config.h"
31#include <errno.h>
32#include <limits.h>
33#include <stdio.h>
34#include <stdlib.h>
35#include "atoi.h"
36
54static const char *str_atol_clamp(const char *str, long *dst, long lmin, long lmax)
55{
56 if (dst)
57 {
58 *dst = 0;
59 }
60
61 if (!str || (*str == '\0'))
62 {
63 return NULL;
64 }
65
66 char *e = NULL;
67 errno = 0;
68 long res = strtol(str, &e, 10);
69 if ((e == str) || (((res == LONG_MIN) || (res == LONG_MAX)) && (errno == ERANGE)) ||
70 (res < lmin) || (res > lmax))
71 {
72 return NULL;
73 }
74
75 if (dst)
76 {
77 *dst = res;
78 }
79
80 return e;
81}
82
99static const char *str_atoull_clamp(const char *str, unsigned long long *dst,
100 unsigned long long ullmax)
101{
102 if (dst)
103 {
104 *dst = 0;
105 }
106
107 if (!str || (*str == '\0'))
108 {
109 return str;
110 }
111
112 char *e = NULL;
113 errno = 0;
114 unsigned long long res = strtoull(str, &e, 10);
115 if ((e == str) || ((res == ULLONG_MAX) && (errno == ERANGE)) || (res > ullmax))
116 {
117 return NULL;
118 }
119
120 if (dst)
121 {
122 *dst = res;
123 }
124
125 return e;
126}
127
143const char *mutt_str_atol(const char *str, long *dst)
144{
145 return str_atol_clamp(str, dst, LONG_MIN, LONG_MAX);
146}
147
165const char *mutt_str_atos(const char *str, short *dst)
166{
167 long l = 0;
168 const char *res = str_atol_clamp(str, &l, SHRT_MIN, SHRT_MAX);
169 if (dst)
170 {
171 *dst = res ? l : 0;
172 }
173 return res;
174}
175
192const char *mutt_str_atoi(const char *str, int *dst)
193{
194 long l = 0;
195 const char *res = str_atol_clamp(str, &l, INT_MIN, INT_MAX);
196 if (dst)
197 {
198 *dst = res ? l : 0;
199 }
200 return res;
201}
202
218const char *mutt_str_atoui(const char *str, unsigned int *dst)
219{
220 unsigned long long l = 0;
221 const char *res = str_atoull_clamp(str, &l, UINT_MAX);
222 if (dst)
223 {
224 *dst = res ? l : 0;
225 }
226 return res;
227}
228
244const char *mutt_str_atoul(const char *str, unsigned long *dst)
245{
246 unsigned long long l = 0;
247 const char *res = str_atoull_clamp(str, &l, ULONG_MAX);
248 if (dst)
249 {
250 *dst = res ? l : 0;
251 }
252 return res;
253}
254
270const char *mutt_str_atous(const char *str, unsigned short *dst)
271{
272 unsigned long long l = 0;
273 const char *res = str_atoull_clamp(str, &l, USHRT_MAX);
274 if (dst)
275 {
276 *dst = res ? l : 0;
277 }
278 return res;
279}
280
296const char *mutt_str_atoull(const char *str, unsigned long long *dst)
297{
298 return str_atoull_clamp(str, dst, ULLONG_MAX);
299}
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:54
const char * mutt_str_atoull(const char *str, unsigned long long *dst)
Convert ASCII string to an unsigned long long.
Definition: atoi.c:296
const char * mutt_str_atous(const char *str, unsigned short *dst)
Convert ASCII string to an unsigned short.
Definition: atoi.c:270
const char * mutt_str_atol(const char *str, long *dst)
Convert ASCII string to a long.
Definition: atoi.c:143
const char * mutt_str_atoul(const char *str, unsigned long *dst)
Convert ASCII string to an unsigned long.
Definition: atoi.c:244
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:99
const char * mutt_str_atos(const char *str, short *dst)
Convert ASCII string to a short.
Definition: atoi.c:165
const char * mutt_str_atoui(const char *str, unsigned int *dst)
Convert ASCII string to an unsigned integer.
Definition: atoi.c:218
const char * mutt_str_atoi(const char *str, int *dst)
Convert ASCII string to an integer.
Definition: atoi.c:192
Parse a number in a string.