util: ship a clean-room version of strtonum for convenience - ics2txt - convert icalendar .ics file to plain text
(HTM) git clone git://bitreich.org/ics2txt git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/ics2txt
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) Tags
(DIR) README
---
(DIR) commit 94173d57d064a613633e0cdd0b1a6da35d28fee8
(DIR) parent 599d47ef952d535e775263772cfbbbe9a2704971
(HTM) Author: Josuah Demangeon <me@josuah.net>
Date: Thu, 24 Jun 2021 23:48:52 +0200
util: ship a clean-room version of strtonum for convenience
Diffstat:
M Makefile | 2 +-
D strtonum.c | 65 -------------------------------
M util.c | 37 +++++++++++++++++++++++++------
M util.h | 8 +-------
4 files changed, 32 insertions(+), 80 deletions(-)
---
(DIR) diff --git a/Makefile b/Makefile
@@ -7,7 +7,7 @@ CFLAGS = $D $W -g
PREFIX = /usr/local
MANPREFIX = ${PREFIX}/man
-SRC = ical.c base64.c util.c strtonum.c
+SRC = ical.c base64.c util.c
HDR = ical.h base64.h util.h
OBJ = ${SRC:.c=.o}
AWK = tsv2ics.awk
(DIR) diff --git a/strtonum.c b/strtonum.c
@@ -1,65 +0,0 @@
-/* $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);
-}
(DIR) diff --git a/util.c b/util.c
@@ -2,6 +2,7 @@
#include <assert.h>
#include <errno.h>
#include <stdint.h>
+#include <limits.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
@@ -9,8 +10,6 @@
char *arg0;
-/** logging **/
-
static void
_log(char const *fmt, va_list va)
{
@@ -54,8 +53,6 @@ debug(char const *fmt, ...)
_log(fmt, va);
}
-/** strings **/
-
size_t
strlcpy(char *d, char const *s, size_t sz)
{
@@ -137,7 +134,35 @@ strsplit(char *s, char **array, size_t len, char const *sep)
return i;
}
-/** memory **/
+long long
+strtonum(char const *s, long long min, long long max, char const **errstr)
+{
+ long long ll = 0;
+ char *end;
+
+ assert(min < max);
+ errno = 0;
+ ll = strtoll(s, &end, 10);
+ if ((errno == ERANGE && ll == LLONG_MIN) || ll < min) {
+ if (errstr != NULL)
+ *errstr = "too small";
+ return 0;
+ }
+ if ((errno == ERANGE && ll == LLONG_MAX) || ll > max) {
+ if (errstr != NULL)
+ *errstr = "too large";
+ return 0;
+ }
+ if (errno == EINVAL || *end != '\0') {
+ if (errstr != NULL)
+ *errstr = "invalid";
+ return 0;
+ }
+ assert(errno == 0);
+ if (errstr != NULL)
+ *errstr = NULL;
+ return ll;
+}
void *
reallocarray(void *mem, size_t n, size_t sz)
@@ -147,8 +172,6 @@ reallocarray(void *mem, size_t n, size_t sz)
return realloc(mem, n * sz);
}
-/** time **/
-
time_t
tztime(struct tm *tm, char const *tz)
{
(DIR) diff --git a/util.h b/util.h
@@ -8,13 +8,11 @@
#define LEN(x) (sizeof (x) / sizeof *(x))
-/** logging **/
extern char *arg0;
+
void err(int, char const *fmt, ...);
void warn(char const *fmt, ...);
void debug(char const *fmt, ...);
-
-/** strings **/
size_t strlcpy(char *, char const *, size_t);
char *strsep(char **, char const *);
void strchomp(char *);
@@ -22,11 +20,7 @@ char *strappend(char **, char const *);
size_t strlcat(char *, char const *, size_t);
long long strtonum(const char *, long long, long long, const char **);
size_t strsplit(char *, char **, size_t, char const *);
-
-/** memory **/
void *reallocarray(void *, size_t, size_t);
-
-/** time **/
time_t tztime(struct tm *, char const *);
#endif