1 | /* $NetBSD: _strtoi.h,v 1.2 2015/01/18 17:55:22 christos Exp $ */ |
2 | |
3 | /*- |
4 | * Copyright (c) 1990, 1993 |
5 | * The Regents of the University of California. All rights reserved. |
6 | * |
7 | * Redistribution and use in source and binary forms, with or without |
8 | * modification, are permitted provided that the following conditions |
9 | * are met: |
10 | * 1. Redistributions of source code must retain the above copyright |
11 | * notice, this list of conditions and the following disclaimer. |
12 | * 2. Redistributions in binary form must reproduce the above copyright |
13 | * notice, this list of conditions and the following disclaimer in the |
14 | * documentation and/or other materials provided with the distribution. |
15 | * 3. Neither the name of the University nor the names of its contributors |
16 | * may be used to endorse or promote products derived from this software |
17 | * without specific prior written permission. |
18 | * |
19 | * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
20 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
21 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
22 | * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
23 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
24 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
25 | * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
26 | * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
27 | * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
28 | * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
29 | * SUCH DAMAGE. |
30 | * |
31 | * Original version ID: |
32 | * NetBSD: src/lib/libc/locale/_wcstoul.h,v 1.2 2003/08/07 16:43:03 agc Exp |
33 | * |
34 | * Created by Kamil Rytarowski, based on ID: |
35 | * NetBSD: src/common/lib/libc/stdlib/_strtoul.h,v 1.7 2013/05/17 12:55:56 joerg Exp |
36 | */ |
37 | |
38 | /* |
39 | * function template for strtoi and strtou |
40 | * |
41 | * parameters: |
42 | * _FUNCNAME : function name |
43 | * __TYPE : return and range limits type |
44 | * __WRAPPED : wrapped function, strtoimax or strtoumax |
45 | */ |
46 | |
47 | #define __WRAPPED_L_(x) x ## _l |
48 | #define __WRAPPED_L__(x) __WRAPPED_L_(x) |
49 | #define __WRAPPED_L __WRAPPED_L__(__WRAPPED) |
50 | |
51 | #if defined(_KERNEL) || defined(_STANDALONE) || \ |
52 | defined(HAVE_NBTOOL_CONFIG_H) || defined(BCS_ONLY) |
53 | __TYPE |
54 | _FUNCNAME(const char * __restrict nptr, char ** __restrict endptr, int base, |
55 | __TYPE lo, __TYPE hi, int * rstatus) |
56 | #else |
57 | #include <locale.h> |
58 | #include "setlocale_local.h" |
59 | #define INT_FUNCNAME_(pre, name, post) pre ## name ## post |
60 | #define INT_FUNCNAME(pre, name, post) INT_FUNCNAME_(pre, name, post) |
61 | |
62 | static __TYPE |
63 | INT_FUNCNAME(_int_, _FUNCNAME, _l)(const char * __restrict nptr, |
64 | char ** __restrict endptr, int base, |
65 | __TYPE lo, __TYPE hi, int * rstatus, locale_t loc) |
66 | #endif |
67 | { |
68 | #if !defined(_KERNEL) && !defined(_STANDALONE) |
69 | int serrno; |
70 | #endif |
71 | __TYPE im; |
72 | char *ep; |
73 | int rep; |
74 | |
75 | _DIAGASSERT(hi >= lo); |
76 | |
77 | _DIAGASSERT(nptr != NULL); |
78 | /* endptr may be NULL */ |
79 | |
80 | if (endptr == NULL) |
81 | endptr = &ep; |
82 | |
83 | if (rstatus == NULL) |
84 | rstatus = &rep; |
85 | |
86 | #if !defined(_KERNEL) && !defined(_STANDALONE) |
87 | serrno = errno; |
88 | errno = 0; |
89 | #endif |
90 | |
91 | #if defined(_KERNEL) || defined(_STANDALONE) || \ |
92 | defined(HAVE_NBTOOL_CONFIG_H) || defined(BCS_ONLY) |
93 | im = __WRAPPED(nptr, endptr, base); |
94 | #else |
95 | im = __WRAPPED_L(nptr, endptr, base, loc); |
96 | #endif |
97 | |
98 | #if !defined(_KERNEL) && !defined(_STANDALONE) |
99 | *rstatus = errno; |
100 | errno = serrno; |
101 | #endif |
102 | |
103 | if (*rstatus == 0) { |
104 | /* No digits were found */ |
105 | if (nptr == *endptr) |
106 | *rstatus = ECANCELED; |
107 | /* There are further characters after number */ |
108 | else if (**endptr != '\0') |
109 | *rstatus = ENOTSUP; |
110 | } |
111 | |
112 | if (im < lo) { |
113 | if (*rstatus == 0) |
114 | *rstatus = ERANGE; |
115 | return lo; |
116 | } |
117 | if (im > hi) { |
118 | if (*rstatus == 0) |
119 | *rstatus = ERANGE; |
120 | return hi; |
121 | } |
122 | |
123 | return im; |
124 | } |
125 | |
126 | #if !defined(_KERNEL) && !defined(_STANDALONE) && \ |
127 | !defined(HAVE_NBTOOL_CONFIG_H) && !defined(BCS_ONLY) |
128 | __TYPE |
129 | _FUNCNAME(const char * __restrict nptr, char ** __restrict endptr, int base, |
130 | __TYPE lo, __TYPE hi, int * rstatus) |
131 | { |
132 | return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base, lo, hi, |
133 | rstatus, _current_locale()); |
134 | } |
135 | |
136 | __TYPE |
137 | INT_FUNCNAME(, _FUNCNAME, _l)(const char * __restrict nptr, |
138 | char ** __restrict endptr, int base, |
139 | __TYPE lo, __TYPE hi, int * rstatus, locale_t loc) |
140 | { |
141 | return INT_FUNCNAME(_int_, _FUNCNAME, _l)(nptr, endptr, base, lo, hi, |
142 | rstatus, loc); |
143 | } |
144 | #endif |
145 | |