This is Unofficial EPICS BASE Doxygen Site
epicsStdlib.h File Reference
#include <stdlib.h>
#include <limits.h>
#include "libComAPI.h"
#include "osdStrtod.h"
#include "epicsTypes.h"
#include "errMdef.h"
+ Include dependency graph for epicsStdlib.h:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Macros

#define S_stdlib_noConversion   (M_stdlib | 1) /* No digits to convert */
 
#define S_stdlib_extraneous   (M_stdlib | 2) /* Extraneous characters */
 
#define S_stdlib_underflow   (M_stdlib | 3) /* Too small to represent */
 
#define S_stdlib_overflow   (M_stdlib | 4) /* Too large to represent */
 
#define S_stdlib_badBase   (M_stdlib | 5) /* Number base not supported */
 
#define epicsParseFloat32(str, to, units)   epicsParseFloat(str, to, units)
 
#define epicsParseFloat64(str, to, units)   epicsParseDouble(str, to, units)
 
#define epicsScanLong(str, to, base)   (!epicsParseLong(str, to, base, NULL))
 
#define epicsScanULong(str, to, base)   (!epicsParseULong(str, to, base, NULL))
 
#define epicsScanLLong(str, to, base)   (!epicsParseLLong(str, to, base, NULL))
 
#define epicsScanULLong(str, to, base)   (!epicsParseULLong(str, to, base, NULL))
 
#define epicsScanFloat(str, to)   (!epicsParseFloat(str, to, NULL))
 
#define epicsScanDouble(str, to)   (!epicsParseDouble(str, to, NULL))
 

Functions

LIBCOM_API int epicsParseLong (const char *str, long *to, int base, char **units)
 
LIBCOM_API int epicsParseULong (const char *str, unsigned long *to, int base, char **units)
 
LIBCOM_API int epicsParseLLong (const char *str, long long *to, int base, char **units)
 
LIBCOM_API int epicsParseULLong (const char *str, unsigned long long *to, int base, char **units)
 
LIBCOM_API int epicsParseDouble (const char *str, double *to, char **units)
 
LIBCOM_API int epicsParseFloat (const char *str, float *to, char **units)
 
LIBCOM_API int epicsParseInt8 (const char *str, epicsInt8 *to, int base, char **units)
 
LIBCOM_API int epicsParseUInt8 (const char *str, epicsUInt8 *to, int base, char **units)
 
LIBCOM_API int epicsParseInt16 (const char *str, epicsInt16 *to, int base, char **units)
 
LIBCOM_API int epicsParseUInt16 (const char *str, epicsUInt16 *to, int base, char **units)
 
LIBCOM_API int epicsParseInt32 (const char *str, epicsInt32 *to, int base, char **units)
 
LIBCOM_API int epicsParseUInt32 (const char *str, epicsUInt32 *to, int base, char **units)
 
LIBCOM_API int epicsParseInt64 (const char *str, epicsInt64 *to, int base, char **units)
 
LIBCOM_API int epicsParseUInt64 (const char *str, epicsUInt64 *to, int base, char **units)
 

Macro Definition Documentation

#define epicsParseFloat32 (   str,
  to,
  units 
)    epicsParseFloat(str, to, units)

Definition at line 67 of file epicsStdlib.h.

#define epicsParseFloat64 (   str,
  to,
  units 
)    epicsParseDouble(str, to, units)

Definition at line 68 of file epicsStdlib.h.

#define epicsScanDouble (   str,
  to 
)    (!epicsParseDouble(str, to, NULL))

Definition at line 78 of file epicsStdlib.h.

#define epicsScanFloat (   str,
  to 
)    (!epicsParseFloat(str, to, NULL))

Definition at line 77 of file epicsStdlib.h.

#define epicsScanLLong (   str,
  to,
  base 
)    (!epicsParseLLong(str, to, base, NULL))

Definition at line 75 of file epicsStdlib.h.

#define epicsScanLong (   str,
  to,
  base 
)    (!epicsParseLong(str, to, base, NULL))

Definition at line 73 of file epicsStdlib.h.

#define epicsScanULLong (   str,
  to,
  base 
)    (!epicsParseULLong(str, to, base, NULL))

Definition at line 76 of file epicsStdlib.h.

#define epicsScanULong (   str,
  to,
  base 
)    (!epicsParseULong(str, to, base, NULL))

Definition at line 74 of file epicsStdlib.h.

#define S_stdlib_badBase   (M_stdlib | 5) /* Number base not supported */

Definition at line 31 of file epicsStdlib.h.

#define S_stdlib_extraneous   (M_stdlib | 2) /* Extraneous characters */

Definition at line 28 of file epicsStdlib.h.

#define S_stdlib_noConversion   (M_stdlib | 1) /* No digits to convert */

Definition at line 27 of file epicsStdlib.h.

#define S_stdlib_overflow   (M_stdlib | 4) /* Too large to represent */

Definition at line 30 of file epicsStdlib.h.

#define S_stdlib_underflow   (M_stdlib | 3) /* Too small to represent */

Definition at line 29 of file epicsStdlib.h.

Function Documentation

LIBCOM_API int epicsParseDouble ( const char *  str,
double *  to,
char **  units 
)

Definition at line 149 of file epicsStdlib.c.

150 {
151  int c;
152  char *endp;
153  double value;
154 
155  while ((c = *str) && isspace(c))
156  ++str;
157 
158  errno = 0;
159  value = epicsStrtod(str, &endp);
160 
161  if (endp == str)
162  return S_stdlib_noConversion;
163  if (errno == ERANGE)
164  return (value == 0) ? S_stdlib_underflow : S_stdlib_overflow;
165 
166  while ((c = *endp) && isspace(c))
167  ++endp;
168  if (c && !units)
169  return S_stdlib_extraneous;
170 
171  *to = value;
172  if (units)
173  *units = endp;
174  return 0;
175 }
Definition: link.h:174
#define S_stdlib_underflow
Definition: epicsStdlib.h:29
#define S_stdlib_noConversion
Definition: epicsStdlib.h:27
#define str(v)
#define S_stdlib_extraneous
Definition: epicsStdlib.h:28
#define S_stdlib_overflow
Definition: epicsStdlib.h:30
LIBCOM_API double epicsStrtod(const char *str, char **endp)
Definition: epicsStdlib.c:346
LIBCOM_API int epicsParseFloat ( const char *  str,
float *  to,
char **  units 
)

Definition at line 318 of file epicsStdlib.c.

319 {
320  double value, abs;
321  int status = epicsParseDouble(str, &value, units);
322 
323  if (status)
324  return status;
325 
326  abs = fabs(value);
327  if (value > 0 && abs <= FLT_MIN)
328  return S_stdlib_underflow;
329  if (finite(value) && abs >= FLT_MAX)
330  return S_stdlib_overflow;
331 
332  *to = (float) value;
333  return 0;
334 }
Definition: link.h:174
pvd::Status status
#define S_stdlib_underflow
Definition: epicsStdlib.h:29
#define str(v)
LIBCOM_API int epicsParseDouble(const char *str, double *to, char **units)
Definition: epicsStdlib.c:149
#define S_stdlib_overflow
Definition: epicsStdlib.h:30
#define finite(x)
Definition: epicsMath.h:16
LIBCOM_API int epicsParseInt16 ( const char *  str,
epicsInt16 to,
int  base,
char **  units 
)

Definition at line 213 of file epicsStdlib.c.

214 {
215  long value;
216  int status = epicsParseLong(str, &value, base, units);
217 
218  if (status)
219  return status;
220 
221  if (value < -0x8000 || value > 0x7fff)
222  return S_stdlib_overflow;
223 
224  *to = (epicsInt16) value;
225  return 0;
226 }
Definition: link.h:174
pvd::Status status
#define str(v)
LIBCOM_API int epicsParseLong(const char *str, long *to, int base, char **units)
Definition: epicsStdlib.c:25
#define S_stdlib_overflow
Definition: epicsStdlib.h:30
int * base
Definition: flex.c:92
short epicsInt16
Definition: epicsTypes.h:40
LIBCOM_API int epicsParseInt32 ( const char *  str,
epicsInt32 to,
int  base,
char **  units 
)

Definition at line 245 of file epicsStdlib.c.

246 {
247  long value;
248  int status = epicsParseLong(str, &value, base, units);
249 
250  if (status)
251  return status;
252 
253 #if (LONG_MAX > 0x7fffffffLL)
254  if (value < -0x80000000L || value > 0x7fffffffL)
255  return S_stdlib_overflow;
256 #endif
257 
258  *to = (epicsInt32) value;
259  return 0;
260 }
Definition: link.h:174
pvd::Status status
#define str(v)
LIBCOM_API int epicsParseLong(const char *str, long *to, int base, char **units)
Definition: epicsStdlib.c:25
#define S_stdlib_overflow
Definition: epicsStdlib.h:30
int * base
Definition: flex.c:92
int epicsInt32
Definition: epicsTypes.h:42
LIBCOM_API int epicsParseInt64 ( const char *  str,
epicsInt64 to,
int  base,
char **  units 
)

Definition at line 281 of file epicsStdlib.c.

282 {
283 #if (LONG_MAX == 0x7fffffffffffffffLL)
284  long value;
285  int status = epicsParseLong(str, &value, base, units);
286 #else
287  long long value;
288  int status = epicsParseLLong(str, &value, base, units);
289 #endif
290 
291  if (status)
292  return status;
293 
294  *to = (epicsInt64) value;
295  return 0;
296 }
Definition: link.h:174
pvd::Status status
#define str(v)
LIBCOM_API int epicsParseLong(const char *str, long *to, int base, char **units)
Definition: epicsStdlib.c:25
LIBCOM_API int epicsParseLLong(const char *str, long long *to, int base, char **units)
Definition: epicsStdlib.c:87
int * base
Definition: flex.c:92
long long epicsInt64
Definition: epicsTypes.h:44
LIBCOM_API int epicsParseInt8 ( const char *  str,
epicsInt8 to,
int  base,
char **  units 
)

Definition at line 181 of file epicsStdlib.c.

182 {
183  long value;
184  int status = epicsParseLong(str, &value, base, units);
185 
186  if (status)
187  return status;
188 
189  if (value < -0x80 || value > 0x7f)
190  return S_stdlib_overflow;
191 
192  *to = (epicsInt8) value;
193  return 0;
194 }
Definition: link.h:174
pvd::Status status
#define str(v)
char epicsInt8
Definition: epicsTypes.h:38
LIBCOM_API int epicsParseLong(const char *str, long *to, int base, char **units)
Definition: epicsStdlib.c:25
#define S_stdlib_overflow
Definition: epicsStdlib.h:30
int * base
Definition: flex.c:92
LIBCOM_API int epicsParseLLong ( const char *  str,
long long *  to,
int  base,
char **  units 
)

Definition at line 87 of file epicsStdlib.c.

88 {
89  int c;
90  char *endp;
91  long long value;
92 
93  while ((c = *str) && isspace(c))
94  ++str;
95 
96  errno = 0;
97  value = strtoll(str, &endp, base);
98 
99  if (endp == str)
100  return S_stdlib_noConversion;
101  if (errno == EINVAL) /* Not universally supported */
102  return S_stdlib_badBase;
103  if (errno == ERANGE)
104  return S_stdlib_overflow;
105 
106  while ((c = *endp) && isspace(c))
107  ++endp;
108  if (c && !units)
109  return S_stdlib_extraneous;
110 
111  *to = value;
112  if (units)
113  *units = endp;
114  return 0;
115 }
Definition: link.h:174
#define S_stdlib_badBase
Definition: epicsStdlib.h:31
#define S_stdlib_noConversion
Definition: epicsStdlib.h:27
#define str(v)
#define S_stdlib_extraneous
Definition: epicsStdlib.h:28
#define strtoll
Definition: osdStrtod.h:27
#define S_stdlib_overflow
Definition: epicsStdlib.h:30
int * base
Definition: flex.c:92
LIBCOM_API int epicsParseLong ( const char *  str,
long *  to,
int  base,
char **  units 
)

Definition at line 25 of file epicsStdlib.c.

26 {
27  int c;
28  char *endp;
29  long value;
30 
31  while ((c = *str) && isspace(c))
32  ++str;
33 
34  errno = 0;
35  value = strtol(str, &endp, base);
36 
37  if (endp == str)
38  return S_stdlib_noConversion;
39  if (errno == EINVAL) /* Not universally supported */
40  return S_stdlib_badBase;
41  if (errno == ERANGE)
42  return S_stdlib_overflow;
43 
44  while ((c = *endp) && isspace(c))
45  ++endp;
46  if (c && !units)
47  return S_stdlib_extraneous;
48 
49  *to = value;
50  if (units)
51  *units = endp;
52  return 0;
53 }
Definition: link.h:174
#define S_stdlib_badBase
Definition: epicsStdlib.h:31
#define S_stdlib_noConversion
Definition: epicsStdlib.h:27
#define str(v)
#define S_stdlib_extraneous
Definition: epicsStdlib.h:28
#define S_stdlib_overflow
Definition: epicsStdlib.h:30
int * base
Definition: flex.c:92
LIBCOM_API int epicsParseUInt16 ( const char *  str,
epicsUInt16 to,
int  base,
char **  units 
)

Definition at line 229 of file epicsStdlib.c.

230 {
231  unsigned long value;
232  int status = epicsParseULong(str, &value, base, units);
233 
234  if (status)
235  return status;
236 
237  if (value > 0xffff && value <= ~0xffffUL)
238  return S_stdlib_overflow;
239 
240  *to = (epicsUInt16) value;
241  return 0;
242 }
Definition: link.h:174
pvd::Status status
unsigned short epicsUInt16
Definition: epicsTypes.h:41
#define str(v)
LIBCOM_API int epicsParseULong(const char *str, unsigned long *to, int base, char **units)
Definition: epicsStdlib.c:56
#define S_stdlib_overflow
Definition: epicsStdlib.h:30
int * base
Definition: flex.c:92
LIBCOM_API int epicsParseUInt32 ( const char *  str,
epicsUInt32 to,
int  base,
char **  units 
)

Definition at line 263 of file epicsStdlib.c.

264 {
265  unsigned long value;
266  int status = epicsParseULong(str, &value, base, units);
267 
268  if (status)
269  return status;
270 
271 #if (ULONG_MAX > 0xffffffffULL)
272  if (value > 0xffffffffUL && value <= ~0xffffffffUL)
273  return S_stdlib_overflow;
274 #endif
275 
276  *to = (epicsUInt32) value;
277  return 0;
278 }
Definition: link.h:174
pvd::Status status
#define str(v)
unsigned int epicsUInt32
Definition: epicsTypes.h:43
LIBCOM_API int epicsParseULong(const char *str, unsigned long *to, int base, char **units)
Definition: epicsStdlib.c:56
#define S_stdlib_overflow
Definition: epicsStdlib.h:30
int * base
Definition: flex.c:92
LIBCOM_API int epicsParseUInt64 ( const char *  str,
epicsUInt64 to,
int  base,
char **  units 
)

Definition at line 299 of file epicsStdlib.c.

300 {
301 #if (ULONG_MAX == 0xffffffffffffffffULL)
302  unsigned long value;
303  int status = epicsParseULong(str, &value, base, units);
304 #else
305  unsigned long long value;
306  int status = epicsParseULLong(str, &value, base, units);
307 #endif
308 
309  if (status)
310  return status;
311 
312  *to = (epicsUInt64) value;
313  return 0;
314 }
Definition: link.h:174
pvd::Status status
#define str(v)
unsigned long long epicsUInt64
Definition: epicsTypes.h:45
LIBCOM_API int epicsParseULong(const char *str, unsigned long *to, int base, char **units)
Definition: epicsStdlib.c:56
LIBCOM_API int epicsParseULLong(const char *str, unsigned long long *to, int base, char **units)
Definition: epicsStdlib.c:118
int * base
Definition: flex.c:92
LIBCOM_API int epicsParseUInt8 ( const char *  str,
epicsUInt8 to,
int  base,
char **  units 
)

Definition at line 197 of file epicsStdlib.c.

198 {
199  unsigned long value;
200  int status = epicsParseULong(str, &value, base, units);
201 
202  if (status)
203  return status;
204 
205  if (value > 0xff && value <= ~0xffUL)
206  return S_stdlib_overflow;
207 
208  *to = (epicsUInt8) value;
209  return 0;
210 }
Definition: link.h:174
pvd::Status status
unsigned char epicsUInt8
Definition: epicsTypes.h:39
#define str(v)
LIBCOM_API int epicsParseULong(const char *str, unsigned long *to, int base, char **units)
Definition: epicsStdlib.c:56
#define S_stdlib_overflow
Definition: epicsStdlib.h:30
int * base
Definition: flex.c:92
LIBCOM_API int epicsParseULLong ( const char *  str,
unsigned long long *  to,
int  base,
char **  units 
)

Definition at line 118 of file epicsStdlib.c.

119 {
120  int c;
121  char *endp;
122  unsigned long long value;
123 
124  while ((c = *str) && isspace(c))
125  ++str;
126 
127  errno = 0;
128  value = strtoull(str, &endp, base);
129 
130  if (endp == str)
131  return S_stdlib_noConversion;
132  if (errno == EINVAL) /* Not universally supported */
133  return S_stdlib_badBase;
134  if (errno == ERANGE)
135  return S_stdlib_overflow;
136 
137  while ((c = *endp) && isspace(c))
138  ++endp;
139  if (c && !units)
140  return S_stdlib_extraneous;
141 
142  *to = value;
143  if (units)
144  *units = endp;
145  return 0;
146 }
Definition: link.h:174
#define S_stdlib_badBase
Definition: epicsStdlib.h:31
#define S_stdlib_noConversion
Definition: epicsStdlib.h:27
#define str(v)
#define S_stdlib_extraneous
Definition: epicsStdlib.h:28
#define S_stdlib_overflow
Definition: epicsStdlib.h:30
#define strtoull
Definition: osdStrtod.h:28
int * base
Definition: flex.c:92
LIBCOM_API int epicsParseULong ( const char *  str,
unsigned long *  to,
int  base,
char **  units 
)

Definition at line 56 of file epicsStdlib.c.

57 {
58  int c;
59  char *endp;
60  unsigned long value;
61 
62  while ((c = *str) && isspace(c))
63  ++str;
64 
65  errno = 0;
66  value = strtoul(str, &endp, base);
67 
68  if (endp == str)
69  return S_stdlib_noConversion;
70  if (errno == EINVAL) /* Not universally supported */
71  return S_stdlib_badBase;
72  if (errno == ERANGE)
73  return S_stdlib_overflow;
74 
75  while ((c = *endp) && isspace(c))
76  ++endp;
77  if (c && !units)
78  return S_stdlib_extraneous;
79 
80  *to = value;
81  if (units)
82  *units = endp;
83  return 0;
84 }
Definition: link.h:174
#define S_stdlib_badBase
Definition: epicsStdlib.h:31
#define S_stdlib_noConversion
Definition: epicsStdlib.h:27
#define str(v)
#define S_stdlib_extraneous
Definition: epicsStdlib.h:28
#define S_stdlib_overflow
Definition: epicsStdlib.h:30
int * base
Definition: flex.c:92