tadd compatibility for non-bsd systems - stopwatch - simple timer for console or x root window
 (HTM) git clone git://src.adamsgaard.dk/stopwatch
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit ee1e1c68dbfe3d6db034e8c6e06c8d260e169350
 (DIR) parent a29ecda577a623fa15841d77c519fe08465e0637
 (HTM) Author: Anders Damsgaard <anders@adamsgaard.dk>
       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(-)
       ---
 (DIR) 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}-${VERSION}"
       +        cp -f ${MAN1} ${DOC} ${SRC} ${LIBTIMEUTILSRC} ${COMPATSRC} Makefile "${NAME}-${VERSION}"
                tar cf - "${NAME}-${VERSION}" | gzip -c > "${NAME}-${VERSION}.tar.gz"
                rm -rf "${NAME}-${VERSION}"
        
 (DIR) 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 <Todd.Miller@courtesan.com>
       + *
       + * 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 */
       +}
 (DIR) 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);
 (DIR) 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 *postfix)
       +format_time(char *out, size_t outsiz, size_t t_elapsed, char *prefix, char *postfix)
        {
       -        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;
 (DIR) 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, char *postfix);
       +
       +#undef strlcpy
       +size_t strlcpy(char *, const char *, size_t);
       +
       +#undef strtonum
       +long long strtonum(const char *, long long, long long, const char **);