1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
|
/*
* compression.c: code to find decompressor / compression extension
*
* Copyright (C) 1994, 1995 Graeme W. Wilford. (Wilf.)
* Copyright (C) 2001, 2002 Colin Watson.
*
* This file is part of man-db.
*
* man-db 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 2 of the License, or
* (at your option) any later version.
*
* man-db 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 man-db; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*
* Sat Aug 20 15:01:02 BST 1994 Wilf. (G.Wilford@ee.surrey.ac.uk)
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif /* HAVE_CONFIG_H */
#include <stdio.h>
#include <errno.h>
#include <signal.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "xvasprintf.h"
#include "manconfig.h"
#include "error.h"
#include "pipeline.h"
/* Take filename as arg, return structure containing decompressor
and extension, or NULL if no comp extension found.
If want_stem, set comp->stem to the filename without extension, which
the caller should free.
eg.
filename = /usr/man/man1/foo.1.gz
comp->prog = "/usr/bin/gzip -dc";
comp->ext = "gz";
comp->stem = "/usr/man/man1/foo.1";
*/
struct compression *comp_info (const char *filename, int want_stem)
{
const char *ext;
static struct compression hpux_comp = {GUNZIP " -S \"\"", "", NULL};
ext = strrchr (filename, '.');
if (ext) {
struct compression *comp;
for (comp = comp_list; comp->ext; comp++) {
if (strcmp (comp->ext, ext + 1) == 0) {
if (want_stem)
comp->stem = xstrndup (filename,
ext - filename);
else
comp->stem = NULL;
return comp;
}
}
}
if (*GUNZIP) {
ext = strstr (filename, ".Z/");
if (ext) {
if (want_stem)
hpux_comp.stem = xstrndup (filename,
ext - filename);
else
hpux_comp.stem = NULL;
return &hpux_comp;
}
}
return NULL;
}
/* take filename w/o comp ext. as arg, return comp->stem as a relative
compressed file or NULL if none found */
struct compression *comp_file (const char *filename)
{
size_t len;
char *compfile;
struct compression *comp;
compfile = xasprintf ("%s.", filename);
len = strlen (compfile);
for (comp = comp_list; comp->ext; comp++) {
struct stat buf;
compfile = appendstr (compfile, comp->ext, (void *) 0);
if (stat (compfile, &buf) == 0) {
comp->stem = compfile;
return comp;
}
*(compfile + len) = '\0';
}
free (compfile);
return NULL;
}
|