Merge branch 'master' of git.distorted.org.uk:~mdw/publish/public-git/dvdrip
[dvdrip] / lib.c
diff --git a/lib.c b/lib.c
index 521af8d..2529f24 100644 (file)
--- 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...");