libbsd: add strtonum(), nitems(), timespec operation functions from FreeBSD
Change-Id: I56b677b382d17a27d243b615de19bec10f3a2810 Reviewed-on: https://review.haiku-os.org/c/haiku/+/7426 Tested-by: Commit checker robot <[email protected]> Reviewed-by: waddlesplash <[email protected]>
This commit is contained in:
committed by
waddlesplash
parent
b8caef6915
commit
01dc1ea4cf
@@ -27,6 +27,9 @@ uint32_t arc4random_uniform(uint32_t upper_bound);
|
|||||||
|
|
||||||
int mkstemps(char *templat, int slen);
|
int mkstemps(char *templat, int slen);
|
||||||
|
|
||||||
|
long long strtonum(const char *numstr, long long minval,
|
||||||
|
long long maxval, const char **errstrp);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -37,6 +37,8 @@
|
|||||||
|
|
||||||
#define NBBY 8
|
#define NBBY 8
|
||||||
|
|
||||||
|
#define nitems(x) (sizeof((x)) / sizeof((x)[0]))
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,33 @@
|
|||||||
#ifdef _DEFAULT_SOURCE
|
#ifdef _DEFAULT_SOURCE
|
||||||
|
|
||||||
|
|
||||||
|
/* BSDish macros operating on timespec structs */
|
||||||
|
#define timespecadd(a, b, res) \
|
||||||
|
do { \
|
||||||
|
(res)->tv_sec = (a)->tv_sec + (b)->tv_sec; \
|
||||||
|
(res)->tv_nsec = (a)->tv_nsec + (b)->tv_nsec; \
|
||||||
|
if ((res)->tv_nsec >= 1000000000L) { \
|
||||||
|
(res)->tv_nsec -= 1000000000L; \
|
||||||
|
(res)->tv_sec++; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
#define timespecsub(a, b, res) \
|
||||||
|
do { \
|
||||||
|
(res)->tv_sec = (a)->tv_sec - (b)->tv_sec; \
|
||||||
|
(res)->tv_nsec = (a)->tv_nsec - (b)->tv_nsec; \
|
||||||
|
if ((res)->tv_nsec < 0) { \
|
||||||
|
(res)->tv_nsec += 1000000000L; \
|
||||||
|
(res)->tv_sec--; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
#define timespecclear(a) ((a)->tv_sec = (a)->tv_nsec = 0)
|
||||||
|
#define timespecisset(a) ((a)->tv_sec != 0 || (a)->tv_nsec != 0)
|
||||||
|
#define timespeccmp(a, b, cmp) (((a)->tv_sec == (b)->tv_sec) \
|
||||||
|
? (a)->tv_nsec cmp (b)->tv_nsec : (a)->tv_sec cmp (b)->tv_sec))
|
||||||
|
#define timespecvalid_interval(a) ((a)->tv_sec >= 0 \
|
||||||
|
&& (a)->tv_nsec >= 0 && (&)->tv_nsec < 1000000000L)
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ for architectureObject in [ MultiArchSubDirSetup ] {
|
|||||||
signal.c
|
signal.c
|
||||||
string.cpp
|
string.cpp
|
||||||
stringlist.c
|
stringlist.c
|
||||||
|
strtonum.c
|
||||||
termios.c
|
termios.c
|
||||||
unvis.c
|
unvis.c
|
||||||
usershell.c
|
usershell.c
|
||||||
|
|||||||
@@ -0,0 +1,65 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 2004 Ted Unangst and Todd Miller
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Permission to use, copy, modify, and distribute this software for any
|
||||||
|
* purpose with or without fee is hereby granted, provided that the above
|
||||||
|
* copyright notice and this permission notice appear in all copies.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||||
|
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||||
|
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||||
|
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||||
|
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||||
|
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
*
|
||||||
|
* $OpenBSD: strtonum.c,v 1.7 2013/04/17 18:40:58 tedu Exp $
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#define INVALID 1
|
||||||
|
#define TOOSMALL 2
|
||||||
|
#define TOOLARGE 3
|
||||||
|
|
||||||
|
long long
|
||||||
|
strtonum(const char *numstr, long long minval, long long maxval,
|
||||||
|
const char **errstrp)
|
||||||
|
{
|
||||||
|
long long ll = 0;
|
||||||
|
int error = 0;
|
||||||
|
char *ep;
|
||||||
|
struct errval {
|
||||||
|
const char *errstr;
|
||||||
|
int err;
|
||||||
|
} ev[4] = {
|
||||||
|
{ NULL, 0 },
|
||||||
|
{ "invalid", EINVAL },
|
||||||
|
{ "too small", ERANGE },
|
||||||
|
{ "too large", ERANGE },
|
||||||
|
};
|
||||||
|
|
||||||
|
ev[0].err = errno;
|
||||||
|
errno = 0;
|
||||||
|
if (minval > maxval) {
|
||||||
|
error = INVALID;
|
||||||
|
} else {
|
||||||
|
ll = strtoll(numstr, &ep, 10);
|
||||||
|
if (errno == EINVAL || numstr == ep || *ep != '\0')
|
||||||
|
error = INVALID;
|
||||||
|
else if ((ll == LLONG_MIN && errno == ERANGE) || ll < minval)
|
||||||
|
error = TOOSMALL;
|
||||||
|
else if ((ll == LLONG_MAX && errno == ERANGE) || ll > maxval)
|
||||||
|
error = TOOLARGE;
|
||||||
|
}
|
||||||
|
if (errstrp != NULL)
|
||||||
|
*errstrp = ev[error].errstr;
|
||||||
|
errno = ev[error].err;
|
||||||
|
if (error)
|
||||||
|
ll = 0;
|
||||||
|
|
||||||
|
return (ll);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user