X-Git-Url: https://git.distorted.org.uk/~mdw/dvdrip/blobdiff_plain/4bd4876f5135f4dffd180d7e969dfd89151f4864..refs/heads/master:/lib.c diff --git a/lib.c b/lib.c index 521af8d..2529f24 100644 --- a/lib.c +++ b/lib.c @@ -33,6 +33,40 @@ void bail_syserr(int err, const char *fmt, ...) exit(2); } +double parse_float(const char **p_inout, unsigned f, + double min, double max, const char *what) +{ + const char *p; + char *q; + double x; + int err; + + err = errno; errno = 0; + p = *p_inout; + x = strtod(p, &q); + if (errno || x < min || x > max || (!(f&PNF_JUNK) && *q)) + bail("bad %s `%s'", what, p); + *p_inout = q; errno = err; + return (x); +} + +long parse_int(const char **p_inout, unsigned f, + long min, long max, const char *what) +{ + const char *p; + char *q; + long x; + int err; + + err = errno; errno = 0; + p = *p_inout; + x = strtoul(p, &q, 0); + if (errno || x < min || x > max || (!(f&PNF_JUNK) && *q)) + bail("bad %s `%s'", what, p); + *p_inout = q; errno = err; + return (x); +} + void sit(double t) { struct timeval tv; @@ -225,14 +259,15 @@ static void logfn(void *p, dvd_logger_level_t lev, static const dvd_logger_cb logger = { logfn }; #endif -void open_dvd(const char *device, int *fd_out, dvd_reader_t **dvd_out) +void open_dvd(const char *device, int mode, + int *fd_out, dvd_reader_t **dvd_out) { int fd; dvd_reader_t *dvd; int bannerp = 0; for (;;) { - fd = open(device, O_RDONLY); + fd = open(device, mode); if (fd >= 0 || errno != ENOMEDIUM) break; if (!bannerp) { show_banner("Waiting for disc to be inserted...");