Merge branch 'master' of git.distorted.org.uk:~mdw/publish/public-git/dvdrip
[dvdrip] / lib.h
CommitLineData
dc53ebfa
MW
1#ifndef LIB_H
2#define LIB_H
3
4#define _GNU_SOURCE
5#define _FILE_OFFSET_BITS 64
6
7#include <assert.h>
8#include <ctype.h>
9#include <errno.h>
10#include <float.h>
11#include <inttypes.h>
12#include <limits.h>
13#include <locale.h>
14#include <math.h>
15#include <stdarg.h>
16#include <stdint.h>
17#include <stdio.h>
18#include <stdlib.h>
19#include <string.h>
20#include <time.h>
21
22#include <unistd.h>
23#include <fcntl.h>
24#include <sys/ioctl.h>
25#include <sys/select.h>
26#include <sys/stat.h>
27#include <sys/time.h>
28
29#include <getopt.h>
30
31#include <linux/fs.h>
32
33#include <dvdread/dvd_reader.h>
34#include <dvdread/dvd_udf.h>
35#include <dvdread/ifo_read.h>
36#include <dvdread/ifo_types.h>
37
38#include "multiprogress.h"
39
40#define CTYPE_HACK(fn, ch) fn((unsigned char)(ch))
41#define ISDIGIT(ch) CTYPE_HACK(isdigit, ch)
42#define ISSPACE(ch) CTYPE_HACK(isspace, ch)
43
44#define STRCMP(a, op, b) (strcmp((a), (b)) op 0)
45#define STRNCMP(a, op, b, n) (strncmp((a), (b), (n)) op 0)
2bbc0426 46#define MEMCMP(a, op, b, n) (memcmp((a), (b), (n)) op 0)
dc53ebfa
MW
47
48#ifdef DEBUG
49# define D(x) x
50#else
51# define D(x)
52#endif
53
54#define N(v) (sizeof(v)/sizeof((v)[0]))
55
56#define SECTORSZ 2048
57#define SECTORS(n) (((n) + (SECTORSZ - 1))/SECTORSZ)
58typedef uint_least32_t secaddr;
59#define PRIuSEC PRIuLEAST32
60#define SECLIMIT 0x00400000
61
62#define PRINTF_LIKE(fmt, dots) __attribute__((format(printf, fmt, dots)))
63#define NORETURN __attribute__((noreturn))
64
65extern const char *prog;
66
67extern void set_prog(const char *p);
68extern void vmoan(const char *fmt, va_list ap);
7ea9ce2b 69extern void vmoan_syserr(int err, const char *fmt, va_list ap);
dc53ebfa 70extern PRINTF_LIKE(1, 2) void moan(const char *fmt, ...);
7ea9ce2b 71extern PRINTF_LIKE(2, 3) void moan_syserr(int err, const char *fmt, ...);
dc53ebfa
MW
72extern PRINTF_LIKE(1, 2) NORETURN void bail(const char *fmt, ...);
73extern PRINTF_LIKE(2, 3) NORETURN
74 void bail_syserr(int err, const char *fmt, ...);
75
f82e4cd7
MW
76#define PNF_JUNK 1u
77extern double parse_float(const char **p_inout, unsigned f,
78 double min, double max, const char *what);
79extern long parse_int(const char **p_inout, unsigned f,
80 long min, long max, const char *what);
81
dc53ebfa
MW
82extern void sit(double t);
83
00a5be1d
MW
84extern void carefully_write(int fd, const void *buf, size_t sz);
85extern void open_file_on_demand(const char *file, FILE **fp_inout,
86 const char *what);
87extern void check_write(FILE *fp, const char *what);
88extern void carefully_fclose(FILE *fp, const char *what);
4bd4876f 89extern off_t device_size(int fd, const char *file, int *blksz_out);
00a5be1d 90
dc53ebfa
MW
91enum { RAW, IFO, VOB, BUP };
92typedef uint_least32_t ident;
93
94static inline ident mkident(unsigned kind, unsigned title, unsigned part)
95 { return (((ident)kind << 0) | ((ident)title << 8) | ((ident)part << 16)); }
96static inline unsigned id_kind(ident id) { return ((id >> 0)&0x0ff); }
97static inline unsigned id_title(ident id) { return ((id >> 8)&0x0ff); }
98static inline unsigned id_part(ident id) { return ((id >> 16)&0x0ff); }
99
100#define MAXFNSZ (1 + 8 + 1 + 12 + 1)
101extern void store_filename(char *buf, ident id);
102
9b86c33f
MW
103#define DIF_MUSTVOLINF 1u
104#define DIF_MUSTIFOHASH 2u
105#define MAXIDSZ 99
106extern int dvd_id(char *p, dvd_reader_t *dvd, unsigned f, const char *file);
107
dc53ebfa
MW
108struct banner_progress_item {
109 struct progress_item _base;
110 const char *msg;
111};
112
113extern struct progress_state progress;
114
115extern void show_banner(const char *msg);
116extern void hide_banner(void);
117
972381af 118extern void open_dvd(const char *device, int mode,
dc53ebfa
MW
119 int *fd_out, dvd_reader_t **dvd_out);
120
121#endif