Bring some more utility functions
This commit is contained in:
parent
6627e3f08e
commit
b13f35e0e6
84
util.c
84
util.c
@ -10,7 +10,91 @@
|
|||||||
* Dedication along with this software. If not, see
|
* Dedication along with this software. If not, see
|
||||||
* <http://creativecommons.org/publicdomain/zero/1.0/>.
|
* <http://creativecommons.org/publicdomain/zero/1.0/>.
|
||||||
*/
|
*/
|
||||||
|
/* srand48 visibility for GLIBC */
|
||||||
|
#if !defined(__OpenBSD__)
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include "util.h"
|
||||||
|
|
||||||
|
void
|
||||||
|
err(int eval, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
int saved_errno;
|
||||||
|
|
||||||
|
saved_errno = errno;
|
||||||
|
va_start(ap, fmt);
|
||||||
|
fprintf(stderr, "%s: ", xgetprogname());
|
||||||
|
if (fmt != NULL) {
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
fprintf(stderr, ": ");
|
||||||
|
}
|
||||||
|
fprintf(stderr, "%s\n", strerror(saved_errno));
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
exit(eval);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
errx(int eval, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
int saved_errno;
|
||||||
|
|
||||||
|
saved_errno = errno;
|
||||||
|
va_start(ap, fmt);
|
||||||
|
if (fmt != NULL) {
|
||||||
|
fprintf(stderr, "%s: ", xgetprogname());
|
||||||
|
vfprintf(stderr, fmt, ap);
|
||||||
|
fprintf(stderr, "\n");
|
||||||
|
}
|
||||||
|
va_end(ap);
|
||||||
|
|
||||||
|
exit(eval);
|
||||||
|
}
|
||||||
|
|
||||||
|
long double
|
||||||
|
parse_double(const char *nptr)
|
||||||
|
{
|
||||||
|
char *end;
|
||||||
|
long double v;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
v = strtold(nptr, &end);
|
||||||
|
if (nptr == end || *end != '\0' || (v == 0 && errno == EINVAL))
|
||||||
|
errx(1, "invalid number: %s", nptr);
|
||||||
|
if (errno == ERANGE)
|
||||||
|
errx(1, "number out of range: %s", nptr);
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
long long
|
||||||
|
parse_integer(const char *nptr, long long minval, long long maxval)
|
||||||
|
{
|
||||||
|
char *end;
|
||||||
|
long long v;
|
||||||
|
|
||||||
|
errno = 0;
|
||||||
|
v = strtoll(nptr, &end, 10);
|
||||||
|
if (nptr == end || *end != '\0' || (v == 0 && errno == EINVAL))
|
||||||
|
errx(1, "invalid number: %s", nptr);
|
||||||
|
if (v == 0 && errno == ERANGE)
|
||||||
|
errx(1, "number out of range: %s", nptr);
|
||||||
|
if (v < minval)
|
||||||
|
errx(1, "number too low: %s", nptr);
|
||||||
|
if (v > maxval)
|
||||||
|
errx(1, "number too high: %s", nptr);
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
xgetprogname(void)
|
xgetprogname(void)
|
||||||
|
4
util.h
4
util.h
@ -12,5 +12,9 @@
|
|||||||
*/
|
*/
|
||||||
#define nelems(_a) (sizeof((_a)) / sizeof((_a)[0]))
|
#define nelems(_a) (sizeof((_a)) / sizeof((_a)[0]))
|
||||||
|
|
||||||
|
void err(int, const char *, ...);
|
||||||
|
void errx(int, const char *, ...);
|
||||||
|
long double parse_double(const char *);
|
||||||
|
long long parse_integer(const char *, long long, long long);
|
||||||
const char * xgetprogname(void);
|
const char * xgetprogname(void);
|
||||||
void xsrand48(long);
|
void xsrand48(long);
|
||||||
|
Loading…
Reference in New Issue
Block a user