chkdvdimg.c: Factor out `set_status' subroutine.
[dvdrip] / lib.c
diff --git a/lib.c b/lib.c
index 6772eec..2147228 100644 (file)
--- a/lib.c
+++ b/lib.c
@@ -1,5 +1,34 @@
+/* -*-c-*-
+ *
+ * Common functions for the DVDrip C utilities.
+ *
+ * (c) 2022 Mark Wooding
+ */
+
+/*----- Licensing notice --------------------------------------------------*
+ *
+ * This file is part of the DVD ripping toolset.
+ *
+ * DVDrip 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.
+ *
+ * DVDrip 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 DVDrip.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+/*----- Header files ------------------------------------------------------*/
+
 #include "lib.h"
 
+/*----- Diagnostics -------------------------------------------------------*/
+
 const char *prog = "<unset>";
 
 void set_prog(const char *p)
@@ -33,6 +62,8 @@ void bail_syserr(int err, const char *fmt, ...)
   exit(2);
 }
 
+/*----- Parsing utilities -------------------------------------------------*/
+
 double parse_float(const char **p_inout, unsigned f,
                   double min, double max, const char *what)
 {
@@ -67,6 +98,28 @@ long parse_int(const char **p_inout, unsigned f,
   return (x);
 }
 
+/*----- Resizing buffers and arrays ---------------------------------------*/
+
+void buf__grow(struct buf *b)
+{
+  b->sz = b->sz ? 2*b->sz : 32;
+  b->p = realloc(b->p, b->sz);
+  if (!b->p) bail("out of memory allocating %zu bytes", b->sz);
+}
+
+void *vec__grow(void *p, size_t esz, size_t *sz_inout)
+{
+  size_t sz = *sz_inout, want;
+
+  sz = sz ? 2*sz : 32;
+  want = sz*esz;
+  p = realloc(p, want);
+  if (!p) bail("out of memory allocating %zu bytes", want);
+  *sz_inout = sz; return (p);
+}
+
+/*----- System utilities --------------------------------------------------*/
+
 void sit(double t)
 {
   struct timeval tv;
@@ -78,6 +131,25 @@ void sit(double t)
   }
 }
 
+double tvdiff(const struct timeval *tv_lo, const struct timeval *tv_hi)
+{
+  return ((tv_hi->tv_sec - tv_lo->tv_sec) +
+         (tv_hi->tv_usec - tv_lo->tv_usec)/1.0e6);
+}
+
+int read_line(FILE *fp, struct buf *b)
+{
+  int ch;
+
+  ch = getc(fp);
+  if (ch == EOF)
+    return (-1);
+  else if (ch != '\n')
+    do { buf_putc(b, ch); ch = getc(fp); } while (ch != EOF && ch != '\n');
+  buf_putz(b);
+  return (0);
+}
+
 void carefully_write(int fd, const void *buf, size_t sz)
 {
   const unsigned char *p = buf;
@@ -138,6 +210,8 @@ off_t device_size(int fd, const char *file, int *blksz_out)
   return ((off_t)volsz);
 }
 
+/*----- Progress utilities ------------------------------------------------*/
+
 struct progress_state progress = PROGRESS_STATE_INIT;
 static struct banner_progress_item banner_progress;
 
@@ -164,6 +238,8 @@ void hide_banner(void)
     progress_update(&progress);
 }
 
+/*----- DVD utilities -----------------------------------------------------*/
+
 #ifdef notdef
 static void logfn(void *p, dvd_logger_level_t lev,
                  const char *fmt, va_list ap)
@@ -289,3 +365,5 @@ int dvd_id(char *p, dvd_reader_t *dvd, unsigned f, const char *file)
 
   return (0);
 }
+
+/*----- That's all, folks -------------------------------------------------*/