This is Unofficial EPICS BASE Doxygen Site
epicsStdlib.c File Reference
#include <ctype.h>
#include <stdio.h>
#include <errno.h>
#include <float.h>
#include "epicsMath.h"
#include "epicsStdlib.h"
#include "epicsString.h"
#include "epicsConvert.h"
+ Include dependency graph for epicsStdlib.c:

Go to the source code of this file.

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 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)
 
LIBCOM_API int epicsParseFloat (const char *str, float *to, char **units)
 
LIBCOM_API double epicsStrtod (const char *str, char **endp)
 

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
LIBCOM_API double epicsStrtod ( const char *  str,
char **  endp 
)

Definition at line 346 of file epicsStdlib.c.

347 {
348  const char *cp = str;
349  int negative = 0;
350  double res;
351 
352  while (isspace((int)*cp))
353  cp++;
354 
355  if (*cp == '+') {
356  cp++;
357  } else if (*cp == '-') {
358  negative = 1;
359  cp++;
360  }
361 
362  if (epicsStrnCaseCmp("0x", cp, 2) == 0) {
363  if (negative)
364  return strtol(str, endp, 16);
365  else
366  return strtoul(str, endp, 16);
367  }
368  if (!isalpha((int)*cp)) {
369  res = strtod(str, endp);
370  if (isinf(res))
371  errno = ERANGE;
372  return res;
373  }
374 
375  if (epicsStrnCaseCmp("NAN", cp, 3) == 0) {
376  res = epicsNAN;
377  cp += 3;
378  if (*cp == '(') {
379  cp++;
380  while (*cp && (*cp++ != ')'))
381  continue;
382  }
383  }
384  else if (epicsStrnCaseCmp("INF", cp, 3) == 0) {
385  res = negative ? -epicsINF : epicsINF;
386  cp += 3;
387  if (epicsStrnCaseCmp("INITY", cp, 5) == 0) {
388  cp += 5;
389  }
390  } else {
391  cp = str;
392  res = 0;
393  }
394 
395  if (endp)
396  *endp = (char *)cp;
397 
398  return res;
399 }
#define isinf(x)
Definition: epicsMath.h:16
#define str(v)
float epicsNAN
Definition: epicsMath.cpp:35
int epicsStrnCaseCmp(const char *s1, const char *s2, size_t len)
Definition: epicsString.c:206
float epicsINF
Definition: epicsMath.cpp:36