sorcery.c: Sorcery enhancements for wizard management
[asterisk/asterisk.git] / main / conversions.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 2017, Digium, Inc.
5  *
6  * See http://www.asterisk.org for more information about
7  * the Asterisk project. Please do not directly contact
8  * any of the maintainers of this project for assistance;
9  * the project provides a web site, mailing lists and IRC
10  * channels for your use.
11  *
12  * This program is free software, distributed under the terms of
13  * the GNU General Public License Version 2. See the LICENSE file
14  * at the top of the source tree.
15  */
16
17 /*! \file
18  *
19  * \brief Conversion utility functions
20  */
21
22 /*** MODULEINFO
23         <support_level>core</support_level>
24  ***/
25
26 #include <ctype.h>
27 #include <errno.h>
28 #include <limits.h>
29 #include <stdlib.h>
30
31 #include "asterisk/conversions.h"
32
33 static int str_is_negative(const char *str)
34 {
35         /* Ignore any preceding white space */
36         while (isspace(*str) && *++str);
37         return *str == '-';
38 }
39
40 int ast_str_to_uint(const char *str, unsigned int *res)
41 {
42         unsigned long val;
43
44         if (ast_str_to_ulong(str, &val) || val > UINT_MAX) {
45                 return -1;
46         }
47
48         *res = val;
49         return 0;
50 }
51
52 int ast_str_to_ulong(const char *str, unsigned long *res)
53 {
54         char *end;
55         unsigned long val;
56
57         if (!str || str_is_negative(str)) {
58                 return -1;
59         }
60
61         errno = 0;
62         val = strtoul(str, &end, 0);
63
64         /*
65          * If str equals end then no digits were found. If end is not pointing to
66          * a null character then the string contained some numbers that could be
67          * converted, but some characters that could not, which we'll consider
68          * invalid.
69          */
70         if ((str == end || *end != '\0' || (errno == ERANGE && val == ULONG_MAX))) {
71                 return -1;
72         }
73
74         *res = val;
75         return 0;
76
77 }