1 /* $NetBSD: file.c,v 1.2 2006/05/15 21:12:21 rillig Exp $ */
4 * Copyright (c) 1999 James Howard and Dag-Erling Coïdan Smørgrav
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
17 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
20 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
22 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
23 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
24 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
25 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 #include <sys/cdefs.h>
32 __RCSID("$NetBSD: file.c,v 1.2 2006/05/15 21:12:21 rillig Exp $");
35 #include <sys/param.h>
44 static char fname
[MAXPATHLEN
];
46 static size_t lnbuflen
;
60 grepfgetln(FILE *f
, size_t *len
)
74 if (c
== line_endchar
)
78 lnbuf
= grep_realloc(lnbuf
, ++lnbuflen
);
82 if (feof(f
) && n
== 0)
89 gzfgetln(gzFile
*f
, size_t *len
)
103 gzerrstr
= gzerror(f
, &gzerr
);
104 if (gzerr
== Z_ERRNO
)
107 errx(2, "%s: %s", fname
, gzerrstr
);
109 if (c
== line_endchar
)
113 lnbuf
= grep_realloc(lnbuf
, ++lnbuflen
);
118 if (gzeof(f
) && n
== 0)
125 grep_fdopen(int fd
, const char *mode
)
130 sprintf(fname
, "(standard input)");
132 sprintf(fname
, "(fd %d)", fd
);
134 f
= grep_malloc(sizeof *f
);
138 if ((f
->gzf
= gzdopen(fd
, mode
)) != NULL
)
141 f
->type
= FILE_STDIO
;
142 if ((f
->f
= fdopen(fd
, mode
)) != NULL
)
151 grep_open(const char *path
, const char *mode
)
155 snprintf(fname
, MAXPATHLEN
, "%s", path
);
157 f
= grep_malloc(sizeof *f
);
161 if ((f
->gzf
= gzopen(fname
, mode
)) != NULL
)
164 /* try mmap first; if it fails, try stdio */
165 if ((f
->mmf
= mmopen(fname
, mode
)) != NULL
) {
169 f
->type
= FILE_STDIO
;
170 if ((f
->f
= fopen(path
, mode
)) != NULL
)
179 grep_bin_file(file_t
*f
)
183 return bin_file(f
->f
);
185 return mmbin_file(f
->mmf
);
187 return gzbin_file(f
->gzf
);
190 errx(2, "invalid file type");
195 grep_fgetln(file_t
*f
, size_t *l
)
199 if (line_endchar
== '\n')
200 return fgetln(f
->f
, l
);
202 return grepfgetln(f
->f
, l
);
204 return mmfgetln(f
->mmf
, l
);
206 return gzfgetln(f
->gzf
, l
);
209 errx(2, "invalid file type");
214 grep_close(file_t
*f
)
228 errx(2, "invalid file type");