| tadd compatibility for non-bsd systems - stopwatch - simple timer for console o… | |
| git clone git://src.adamsgaard.dk/stopwatch | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| commit ee1e1c68dbfe3d6db034e8c6e06c8d260e169350 | |
| parent a29ecda577a623fa15841d77c519fe08465e0637 | |
| Author: Anders Damsgaard <[email protected]> | |
| Date: Thu, 28 Jan 2021 14:10:26 +0100 | |
| add compatibility for non-bsd systems | |
| Diffstat: | |
| M Makefile | 11 ++++++++--- | |
| A strlcpy.c | 49 +++++++++++++++++++++++++++++… | |
| A strtonum.c | 66 +++++++++++++++++++++++++++++… | |
| M timeutil.c | 4 ++-- | |
| M timeutil.h | 11 +++++++++++ | |
| 5 files changed, 136 insertions(+), 5 deletions(-) | |
| --- | |
| diff --git a/Makefile b/Makefile | |
| t@@ -20,7 +20,12 @@ LIBTIMEUTIL = libtimeutil.a | |
| LIBTIMEUTILSRC = timeutil.c | |
| LIBTIMEUTILOBJ = ${LIBTIMEUTILSRC:.c=.o} | |
| -LIB = ${LIBTIMEUTIL} | |
| +COMPATSRC =\ | |
| + strlcpy.c\ | |
| + strtonum.c | |
| +COMPATOBJ = ${COMPATSRC:.c=.o} | |
| + | |
| +LIB = ${LIBTIMEUTIL} ${COMPATOBJ} | |
| X11INC = /usr/X11R6/include | |
| X11LIB = /usr/X11R6/lib | |
| t@@ -40,7 +45,7 @@ all: ${BIN} | |
| ${BIN}: ${LIB} ${@:=.o} | |
| -OBJ = ${SRC:.c=.o} ${LIBTIMEUTILOBJ} | |
| +OBJ = ${SRC:.c=.o} ${LIBTIMEUTILOBJ} ${COMPATOBJ} | |
| ${OBJ}: ${HDR} | |
| t@@ -57,7 +62,7 @@ ${LIBTIMEUTIL}: ${LIBTIMEUTILOBJ} | |
| dist: | |
| rm -rf "${NAME}-${VERSION}" | |
| mkdir -p "${NAME}-${VERSION}" | |
| - cp -f ${MAN1} ${DOC} ${SRC} ${LIBTIMEUTILSRC} Makefile "${NAME}-${VERS… | |
| + cp -f ${MAN1} ${DOC} ${SRC} ${LIBTIMEUTILSRC} ${COMPATSRC} Makefile "$… | |
| tar cf - "${NAME}-${VERSION}" | gzip -c > "${NAME}-${VERSION}.tar.gz" | |
| rm -rf "${NAME}-${VERSION}" | |
| diff --git a/strlcpy.c b/strlcpy.c | |
| t@@ -0,0 +1,49 @@ | |
| +/* $OpenBSD: strlcpy.c,v 1.12 2015/01/15 03:54:12 millert Exp $ … | |
| + | |
| +/* | |
| + * Copyright (c) 1998, 2015 Todd C. Miller <[email protected]> | |
| + * | |
| + * 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. | |
| + */ | |
| + | |
| +#include <string.h> | |
| + | |
| +/* | |
| + * Copy string src to buffer dst of size dsize. At most dsize-1 | |
| + * chars will be copied. Always NUL terminates (unless dsize == 0). | |
| + * Returns strlen(src); if retval >= dsize, truncation occurred. | |
| + */ | |
| +size_t | |
| +strlcpy(char *dst, const char *src, size_t dsize) | |
| +{ | |
| + const char *osrc = src; | |
| + size_t nleft = dsize; | |
| + | |
| + /* Copy as many bytes as will fit. */ | |
| + if (nleft != 0) { | |
| + while (--nleft != 0) { | |
| + if ((*dst++ = *src++) == '\0') | |
| + break; | |
| + } | |
| + } | |
| + | |
| + /* Not enough room in dst, add NUL and traverse rest of src. */ | |
| + if (nleft == 0) { | |
| + if (dsize != 0) | |
| + *dst = '\0'; /* NUL-terminate dst */ | |
| + while (*src++) | |
| + ; | |
| + } | |
| + | |
| + return(src - osrc - 1); /* count does not include NUL */ | |
| +} | |
| diff --git a/strtonum.c b/strtonum.c | |
| t@@ -0,0 +1,66 @@ | |
| +/* $OpenBSD: strtonum.c,v 1.8 2015/09/13 08:31:48 guenther Exp $ … | |
| + | |
| +/* | |
| + * 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. | |
| + */ | |
| + | |
| +#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 (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); | |
| +} | |
| +DEF_WEAK(strtonum); | |
| diff --git a/timeutil.c b/timeutil.c | |
| t@@ -2,9 +2,9 @@ | |
| #include <string.h> | |
| void | |
| -format_time(char *out, size_t outsiz, time_t t_elapsed, char *prefix, char *po… | |
| +format_time(char *out, size_t outsiz, size_t t_elapsed, char *prefix, char *po… | |
| { | |
| - time_t h = 0, m = 0, s = 0; | |
| + size_t h = 0, m = 0, s = 0; | |
| h = t_elapsed / 3600; | |
| m = (t_elapsed % 3600) / 60; | |
| diff --git a/timeutil.h b/timeutil.h | |
| t@@ -1 +1,12 @@ | |
| +#ifndef __OpenBSD__ | |
| +#include <getopt.h> | |
| +#define LINE_MAX 2048 | |
| +#endif | |
| + | |
| void format_time(char *out, size_t outsiz, time_t t_elapsed, char *prefix, cha… | |
| + | |
| +#undef strlcpy | |
| +size_t strlcpy(char *, const char *, size_t); | |
| + | |
| +#undef strtonum | |
| +long long strtonum(const char *, long long, long long, const char **); |