X-Git-Url: https://git.distorted.org.uk/~mdw/dvdrip/blobdiff_plain/1b77f6d36a296a5e6c69d535e6bc13b9ec32b2a4..844bf71b76ddf9f73cab289066b195691559bc6b:/lib.c diff --git a/lib.c b/lib.c index 6772eec..2147228 100644 --- 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 . + */ + +/*----- Header files ------------------------------------------------------*/ + #include "lib.h" +/*----- Diagnostics -------------------------------------------------------*/ + const char *prog = ""; 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 -------------------------------------------------*/