13e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* $NetBSD: file.c,v 1.7 2011/04/18 22:46:48 joerg Exp $ */ 23e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* $FreeBSD: head/usr.bin/grep/file.c 211496 2010-08-19 09:28:59Z des $ */ 33e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* $OpenBSD: file.c,v 1.11 2010/07/02 20:48:48 nicm Exp $ */ 43e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 53e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/*- 63e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * Copyright (c) 1999 James Howard and Dag-Erling Coïdan Smørgrav 73e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * Copyright (C) 2008-2010 Gabor Kovesdan <gabor@FreeBSD.org> 83e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * Copyright (C) 2010 Dimitry Andric <dimitry@andric.com> 93e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * All rights reserved. 103e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * 113e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * Redistribution and use in source and binary forms, with or without 123e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * modification, are permitted provided that the following conditions 133e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * are met: 143e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * 1. Redistributions of source code must retain the above copyright 153e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * notice, this list of conditions and the following disclaimer. 163e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * 2. Redistributions in binary form must reproduce the above copyright 173e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * notice, this list of conditions and the following disclaimer in the 183e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * documentation and/or other materials provided with the distribution. 193e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * 203e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 213e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 223e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 233e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 243e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 253e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 263e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 273e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 283e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 293e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 303e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * SUCH DAMAGE. 313e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey */ 323e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 333e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#if HAVE_NBTOOL_CONFIG_H 343e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include "nbtool_config.h" 353e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#endif 363e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 373e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <sys/cdefs.h> 383e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey__RCSID("$NetBSD: file.c,v 1.7 2011/04/18 22:46:48 joerg Exp $"); 393e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 403e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <sys/param.h> 413e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <sys/types.h> 423e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <sys/stat.h> 433e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 44fd4c6b0a3a25921a9fe24691a695d715aecb6afeElliott Hughes#ifndef __ANDROID__ 453e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <bzlib.h> 463e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#endif 473e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <err.h> 483e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <errno.h> 493e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <fcntl.h> 503e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <stddef.h> 513e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <stdlib.h> 523e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <string.h> 533e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <unistd.h> 543e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <wchar.h> 553e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <wctype.h> 56fd4c6b0a3a25921a9fe24691a695d715aecb6afeElliott Hughes#ifndef __ANDROID__ 573e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include <zlib.h> 583e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#endif 593e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 603e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#include "grep.h" 613e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 623e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define MAXBUFSIZ (32 * 1024) 633e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#define LNBUFBUMP 80 643e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 65fd4c6b0a3a25921a9fe24691a695d715aecb6afeElliott Hughes#ifndef __ANDROID__ 663e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystatic gzFile gzbufdesc; 673e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystatic BZFILE* bzbufdesc; 683e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#endif 693e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 703e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystatic unsigned char buffer[MAXBUFSIZ]; 713e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystatic unsigned char *bufpos; 723e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystatic size_t bufrem; 733e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 743e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystatic unsigned char *lnbuf; 753e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystatic size_t lnbuflen; 763e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 773e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystatic inline int 783e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeygrep_refill(struct file *f) 793e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey{ 803e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey ssize_t nr; 81d20218e05dfd54620999f1fd9cb7aaa91a296be5Elliott Hughes#ifndef __ANDROID__ 823e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey int bzerr; 83d20218e05dfd54620999f1fd9cb7aaa91a296be5Elliott Hughes#endif 843e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 853e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufpos = buffer; 863e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufrem = 0; 873e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 88fd4c6b0a3a25921a9fe24691a695d715aecb6afeElliott Hughes#ifndef __ANDROID__ 893e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (filebehave == FILE_GZIP) 903e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey nr = gzread(gzbufdesc, buffer, MAXBUFSIZ); 913e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey else if (filebehave == FILE_BZIP && bzbufdesc != NULL) { 923e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey nr = BZ2_bzRead(&bzerr, bzbufdesc, buffer, MAXBUFSIZ); 933e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey switch (bzerr) { 943e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey case BZ_OK: 953e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey case BZ_STREAM_END: 963e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* No problem, nr will be okay */ 973e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey break; 983e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey case BZ_DATA_ERROR_MAGIC: 993e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* 1003e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * As opposed to gzread(), which simply returns the 1013e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * plain file data, if it is not in the correct 1023e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * compressed format, BZ2_bzRead() instead aborts. 1033e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * 1043e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * So, just restart at the beginning of the file again, 1053e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * and use plain reads from now on. 1063e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey */ 1073e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey BZ2_bzReadClose(&bzerr, bzbufdesc); 1083e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bzbufdesc = NULL; 1093e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (lseek(f->fd, 0, SEEK_SET) == -1) 1103e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (-1); 1113e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey nr = read(f->fd, buffer, MAXBUFSIZ); 1123e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey break; 1133e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey default: 1143e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Make sure we exit with an error */ 1153e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey nr = -1; 1163e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey } 1173e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey } else 1183e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#endif 1193e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey nr = read(f->fd, buffer, MAXBUFSIZ); 1203e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1213e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (nr < 0) 1223e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (-1); 1233e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1243e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufrem = nr; 1253e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (0); 1263e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey} 1273e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1283e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystatic inline int 1293e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeygrep_lnbufgrow(size_t newlen) 1303e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey{ 1313e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1323e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (lnbuflen < newlen) { 1333e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey lnbuf = grep_realloc(lnbuf, newlen); 1343e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey lnbuflen = newlen; 1353e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey } 1363e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1373e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (0); 1383e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey} 1393e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1403e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeychar * 1413e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeygrep_fgetln(struct file *f, size_t *lenp) 1423e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey{ 1433e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey unsigned char *p; 1443e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey char *ret; 1453e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey size_t len; 1463e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey size_t off; 1473e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey ptrdiff_t diff; 1483e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1493e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Fill the buffer, if necessary */ 1503e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (bufrem == 0 && grep_refill(f) != 0) 1513e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey goto error; 1523e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1533e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (bufrem == 0) { 1543e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Return zero length to indicate EOF */ 1553e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey *lenp = 0; 1563e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return ((char *)bufpos); 1573e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey } 1583e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1593e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Look for a newline in the remaining part of the buffer */ 1603e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if ((p = memchr(bufpos, line_sep, bufrem)) != NULL) { 1613e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey ++p; /* advance over newline */ 1623e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey ret = (char *)bufpos; 1633e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey len = p - bufpos; 1643e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufrem -= len; 1653e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufpos = p; 1663e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey *lenp = len; 1673e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (ret); 1683e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey } 1693e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1703e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* We have to copy the current buffered data to the line buffer */ 1713e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey for (len = bufrem, off = 0; ; len += bufrem) { 1723e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Make sure there is room for more data */ 1733e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (grep_lnbufgrow(len + LNBUFBUMP)) 1743e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey goto error; 1753e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey memcpy(lnbuf + off, bufpos, len - off); 1763e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey off = len; 1773e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (grep_refill(f) != 0) 1783e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey goto error; 1793e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (bufrem == 0) 1803e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* EOF: return partial line */ 1813e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey break; 1823e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if ((p = memchr(bufpos, line_sep, bufrem)) == NULL) 1833e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey continue; 1843e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* got it: finish up the line (like code above) */ 1853e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey ++p; 1863e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey diff = p - bufpos; 1873e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey len += diff; 1883e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (grep_lnbufgrow(len)) 1893e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey goto error; 1903e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey memcpy(lnbuf + off, bufpos, diff); 1913e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufrem -= diff; 1923e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufpos = p; 1933e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey break; 1943e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey } 1953e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey *lenp = len; 1963e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return ((char *)lnbuf); 1973e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1983e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyerror: 1993e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey *lenp = 0; 2003e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (NULL); 2013e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey} 2023e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2033e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystatic inline struct file * 2043e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeygrep_file_init(struct file *f) 2053e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey{ 2063e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 207fd4c6b0a3a25921a9fe24691a695d715aecb6afeElliott Hughes#ifndef __ANDROID__ 2083e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (filebehave == FILE_GZIP && 2093e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey (gzbufdesc = gzdopen(f->fd, "r")) == NULL) 2103e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey goto error; 2113e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2123e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (filebehave == FILE_BZIP && 2133e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey (bzbufdesc = BZ2_bzdopen(f->fd, "r")) == NULL) 2143e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey goto error; 2153e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#endif 2163e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2173e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Fill read buffer, also catches errors early */ 2183e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (grep_refill(f) != 0) 2193e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey goto error; 2203e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2213e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Check for binary stuff, if necessary */ 2223e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (!nulldataflag && binbehave != BINFILE_TEXT && 2233e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey memchr(bufpos, '\0', bufrem) != NULL) 2243e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey f->binary = true; 2253e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2263e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (f); 2273e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyerror: 2283e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey close(f->fd); 2293e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey free(f); 2303e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (NULL); 2313e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey} 2323e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2333e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* 2343e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * Opens a file for processing. 2353e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey */ 2363e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystruct file * 2373e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeygrep_open(const char *path) 2383e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey{ 2393e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey struct file *f; 2403e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2413e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey f = grep_malloc(sizeof *f); 2423e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey memset(f, 0, sizeof *f); 2433e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (path == NULL) { 2443e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Processing stdin implies --line-buffered. */ 2453e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey lbflag = true; 2463e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey f->fd = STDIN_FILENO; 2473e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey } else if ((f->fd = open(path, O_RDONLY)) == -1) { 2483e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey free(f); 2493e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (NULL); 2503e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey } 2513e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2523e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (grep_file_init(f)); 2533e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey} 2543e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2553e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* 2563e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * Closes a file. 2573e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey */ 2583e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyvoid 2593e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeygrep_close(struct file *f) 2603e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey{ 2613e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2623e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey close(f->fd); 2633e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2643e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Reset read buffer and line buffer */ 2653e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufpos = buffer; 2663e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufrem = 0; 2673e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2683e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey free(lnbuf); 2693e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey lnbuf = NULL; 2703e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey lnbuflen = 0; 2713e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey} 272