lib.h: Disable magic attributes if the compiler doesn't understand them.
[dvdrip] / lib.c
diff --git a/lib.c b/lib.c
index 2529f24..55c4b48 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,8 @@ long parse_int(const char **p_inout, unsigned f,
   return (x);
 }
 
+/*----- System utilities --------------------------------------------------*/
+
 void sit(double t)
 {
   struct timeval tv;
@@ -138,80 +171,7 @@ off_t device_size(int fd, const char *file, int *blksz_out)
   return ((off_t)volsz);
 }
 
-void store_filename(char *buf, ident id)
-{
-  switch (id_kind(id)) {
-    case RAW:
-      sprintf(buf, "#<raw device>");
-      break;
-    case IFO:
-      if (!id_title(id)) sprintf(buf, "/VIDEO_TS/VIDEO_TS.IFO");
-      else sprintf(buf, "/VIDEO_TS/VTS_%02u_0.IFO", id_title(id));
-      break;
-    case BUP:
-      if (!id_title(id)) sprintf(buf, "/VIDEO_TS/VIDEO_TS.BUP");
-      else sprintf(buf, "/VIDEO_TS/VTS_%02u_0.BUP", id_title(id));
-      break;
-    case VOB:
-      if (!id_title(id)) sprintf(buf, "/VIDEO_TS/VIDEO_TS.VOB");
-      else
-       sprintf(buf, "/VIDEO_TS/VTS_%02u_%u.VOB", id_title(id), id_part(id));
-      break;
-    default:
-      abort();
-  }
-}
-
-static char *copy_string(char *p, const char *q)
-{
-  while (*q) *p++ = *q++;
-  *p = 0; return (p);
-}
-
-static char *copy_hex(char *p, const unsigned char *q, size_t sz)
-{
-  while (sz) {
-    sprintf(p, "%02x", *q);
-    p += 2; q++; sz--;
-  }
-  return (p);
-}
-
-int dvd_id(char *p, dvd_reader_t *dvd, unsigned f, const char *file)
-{
-  char volid[33];
-  unsigned char volsetid[16], discid[16];
-  int rc;
-  size_t n;
-
-  rc = DVDUDFVolumeInfo(dvd,
-                       volid, sizeof(volid),
-                       volsetid, sizeof(volsetid));
-  if (!rc) {
-    p = copy_string(p, volid);
-    *p++ = '-';
-    for (n = sizeof(volsetid); n && !volsetid[n - 1]; n--);
-    p = copy_hex(p, volsetid, n);
-  } else if (f&DIF_MUSTVOLINF) {
-    if (file) moan("failed to read volume info for `%s'", file);
-    else moan("failed to read volume info");
-    return (-1);
-  } else
-    p = copy_string(p, "<error reading volume info>");
-
-  *p++ = ':';
-  rc = DVDDiscID(dvd, discid);
-  if (!rc)
-    p = copy_hex(p, discid, sizeof(discid));
-  else if (f&DIF_MUSTIFOHASH) {
-    if (file) moan("failed to determine disc id of `%s'", file);
-    else moan("failed to determine disc id");
-    return (-1);
-  } else
-    p = copy_string(p, "<error reading disc-id>");
-
-  return (0);
-}
+/*----- Progress utilities ------------------------------------------------*/
 
 struct progress_state progress = PROGRESS_STATE_INIT;
 static struct banner_progress_item banner_progress;
@@ -239,6 +199,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 +251,80 @@ void open_dvd(const char *device, int mode,
   if (fd_out) *fd_out = fd;
   else close(fd);
 }
+
+void store_filename(char *buf, ident id)
+{
+  switch (id_kind(id)) {
+    case RAW:
+      sprintf(buf, "#<raw device>");
+      break;
+    case IFO:
+      if (!id_title(id)) sprintf(buf, "/VIDEO_TS/VIDEO_TS.IFO");
+      else sprintf(buf, "/VIDEO_TS/VTS_%02u_0.IFO", id_title(id));
+      break;
+    case BUP:
+      if (!id_title(id)) sprintf(buf, "/VIDEO_TS/VIDEO_TS.BUP");
+      else sprintf(buf, "/VIDEO_TS/VTS_%02u_0.BUP", id_title(id));
+      break;
+    case VOB:
+      if (!id_title(id)) sprintf(buf, "/VIDEO_TS/VIDEO_TS.VOB");
+      else
+       sprintf(buf, "/VIDEO_TS/VTS_%02u_%u.VOB", id_title(id), id_part(id));
+      break;
+    default:
+      abort();
+  }
+}
+
+static char *copy_string(char *p, const char *q)
+{
+  while (*q) *p++ = *q++;
+  *p = 0; return (p);
+}
+
+static char *copy_hex(char *p, const unsigned char *q, size_t sz)
+{
+  while (sz) {
+    sprintf(p, "%02x", *q);
+    p += 2; q++; sz--;
+  }
+  return (p);
+}
+
+int dvd_id(char *p, dvd_reader_t *dvd, unsigned f, const char *file)
+{
+  char volid[33];
+  unsigned char volsetid[16], discid[16];
+  int rc;
+  size_t n;
+
+  rc = DVDUDFVolumeInfo(dvd,
+                       volid, sizeof(volid),
+                       volsetid, sizeof(volsetid));
+  if (!rc) {
+    p = copy_string(p, volid);
+    *p++ = '-';
+    for (n = sizeof(volsetid); n && !volsetid[n - 1]; n--);
+    p = copy_hex(p, volsetid, n);
+  } else if (f&DIF_MUSTVOLINF) {
+    if (file) moan("failed to read volume info for `%s'", file);
+    else moan("failed to read volume info");
+    return (-1);
+  } else
+    p = copy_string(p, "<error reading volume info>");
+
+  *p++ = ':';
+  rc = DVDDiscID(dvd, discid);
+  if (!rc)
+    p = copy_hex(p, discid, sizeof(discid));
+  else if (f&DIF_MUSTIFOHASH) {
+    if (file) moan("failed to determine disc id of `%s'", file);
+    else moan("failed to determine disc id");
+    return (-1);
+  } else
+    p = copy_string(p, "<error reading disc-id>");
+
+  return (0);
+}
+
+/*----- That's all, folks -------------------------------------------------*/