/* Copyright (C) 2024 Aiden Gall This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . */ #include #include #include #include #include void warn(const char *fmt, ...); void die(const char *fmt, ...); void efwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream); long argtonum(const char *arg, long minval, long maxval); void warn(const char *const fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); } void die(const char *const fmt, ...) { va_list ap; va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); exit(EXIT_FAILURE); } void efwrite(const void *const ptr, const size_t size, const size_t nmemb, FILE *const stream) { if (fwrite(ptr, size, nmemb, stream) != nmemb) die("fwrite: Write failed\n"); } long argtonum(const char *const arg, const long minval, const long maxval) { long ret; char *endptr; if (minval > maxval) die("argtonum: Invalid range\n"); if (!arg) die("argtonum: Missing argument\n"); errno = 0; ret = strtol(arg, &endptr, 10); if (errno) die("strtol: %s\n", strerror(errno)); if (arg == endptr || *endptr) die("strtol: Invalid integer\n"); if (ret < minval || ret > maxval) die("argtonum: Argument out of range\n"); return ret; }