version 1.1, 2003/06/22 22:20:07 |
version 1.2, 2003/06/22 22:24:13 |
|
|
|
|
static char fname[MAXPATHLEN]; |
static char fname[MAXPATHLEN]; |
static char *lnbuf; |
static char *lnbuf; |
static int lnbuflen; |
static size_t lnbuflen; |
|
|
#define FILE_STDIO 0 |
#define FILE_STDIO 0 |
#define FILE_MMAP 1 |
#define FILE_MMAP 1 |
|
|
gzFile *gzf; |
gzFile *gzf; |
}; |
}; |
|
|
|
#ifndef NOZ |
static char * |
static char * |
gzfgetln(gzFile *f, size_t *len) |
gzfgetln(gzFile *f, size_t *len) |
{ |
{ |
|
|
|
|
if (gzeof(f)) |
if (gzeof(f)) |
break; |
break; |
|
|
gzerrstr = gzerror(f, &gzerr); |
gzerrstr = gzerror(f, &gzerr); |
if (gzerr == Z_ERRNO) |
if (gzerr == Z_ERRNO) |
err(1, "%s", fname); |
err(1, "%s", fname); |
|
|
*len = n; |
*len = n; |
return lnbuf; |
return lnbuf; |
} |
} |
|
#endif |
|
|
file_t * |
file_t * |
grep_fdopen(int fd, char *mode) |
grep_fdopen(int fd, char *mode) |
|
|
file_t *f; |
file_t *f; |
|
|
if (fd == 0) |
if (fd == 0) |
sprintf(fname, "(standard input)"); |
snprintf(fname, sizeof fname, "(standard input)"); |
else |
else |
sprintf(fname, "(fd %d)", fd); |
snprintf(fname, sizeof fname, "(fd %d)", fd); |
|
|
f = grep_malloc(sizeof *f); |
f = grep_malloc(sizeof *f); |
|
|
|
#ifndef NOZ |
if (Zflag) { |
if (Zflag) { |
f->type = FILE_GZIP; |
f->type = FILE_GZIP; |
if ((f->gzf = gzdopen(fd, mode)) != NULL) |
if ((f->gzf = gzdopen(fd, mode)) != NULL) |
return f; |
return f; |
} else { |
} else |
|
#endif |
|
{ |
f->type = FILE_STDIO; |
f->type = FILE_STDIO; |
if ((f->f = fdopen(fd, mode)) != NULL) |
if ((f->f = fdopen(fd, mode)) != NULL) |
return f; |
return f; |
} |
} |
|
|
free(f); |
free(f); |
return NULL; |
return NULL; |
} |
} |
|
|
{ |
{ |
file_t *f; |
file_t *f; |
|
|
snprintf(fname, MAXPATHLEN, "%s", path); |
snprintf(fname, sizeof fname, "%s", path); |
|
|
f = grep_malloc(sizeof *f); |
f = grep_malloc(sizeof *f); |
|
|
|
#ifndef NOZ |
if (Zflag) { |
if (Zflag) { |
f->type = FILE_GZIP; |
f->type = FILE_GZIP; |
if ((f->gzf = gzopen(fname, mode)) != NULL) |
if ((f->gzf = gzopen(fname, mode)) != NULL) |
return f; |
return f; |
} else { |
} else |
|
#endif |
|
{ |
/* try mmap first; if it fails, try stdio */ |
/* try mmap first; if it fails, try stdio */ |
if ((f->mmf = mmopen(fname, mode)) != NULL) { |
if ((f->mmf = mmopen(fname, mode)) != NULL) { |
f->type = FILE_MMAP; |
f->type = FILE_MMAP; |
|
|
if ((f->f = fopen(path, mode)) != NULL) |
if ((f->f = fopen(path, mode)) != NULL) |
return f; |
return f; |
} |
} |
|
|
free(f); |
free(f); |
return NULL; |
return NULL; |
} |
} |
|
|
return bin_file(f->f); |
return bin_file(f->f); |
case FILE_MMAP: |
case FILE_MMAP: |
return mmbin_file(f->mmf); |
return mmbin_file(f->mmf); |
|
#ifndef NOZ |
case FILE_GZIP: |
case FILE_GZIP: |
return gzbin_file(f->gzf); |
return gzbin_file(f->gzf); |
|
#endif |
default: |
default: |
/* can't happen */ |
/* can't happen */ |
errx(1, "invalid file type"); |
errx(1, "invalid file type"); |
|
|
return ftell(f->f); |
return ftell(f->f); |
case FILE_MMAP: |
case FILE_MMAP: |
return mmtell(f->mmf); |
return mmtell(f->mmf); |
|
#ifndef NOZ |
case FILE_GZIP: |
case FILE_GZIP: |
return gztell(f->gzf); |
return gztell(f->gzf); |
|
#endif |
default: |
default: |
/* can't happen */ |
/* can't happen */ |
errx(1, "invalid file type"); |
errx(1, "invalid file type"); |
|
|
return fgetln(f->f, l); |
return fgetln(f->f, l); |
case FILE_MMAP: |
case FILE_MMAP: |
return mmfgetln(f->mmf, l); |
return mmfgetln(f->mmf, l); |
|
#ifndef NOZ |
case FILE_GZIP: |
case FILE_GZIP: |
return gzfgetln(f->gzf, l); |
return gzfgetln(f->gzf, l); |
|
#endif |
default: |
default: |
/* can't happen */ |
/* can't happen */ |
errx(1, "invalid file type"); |
errx(1, "invalid file type"); |
|
|
case FILE_MMAP: |
case FILE_MMAP: |
mmclose(f->mmf); |
mmclose(f->mmf); |
break; |
break; |
|
#ifndef NOZ |
case FILE_GZIP: |
case FILE_GZIP: |
gzclose(f->gzf); |
gzclose(f->gzf); |
break; |
break; |
|
#endif |
default: |
default: |
/* can't happen */ |
/* can't happen */ |
errx(1, "invalid file type"); |
errx(1, "invalid file type"); |