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 443e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#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> 563e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#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 653e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#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; 813e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey int bzerr; 823e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 833e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufpos = buffer; 843e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufrem = 0; 853e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 863e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#ifndef ANDROID 873e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (filebehave == FILE_GZIP) 883e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey nr = gzread(gzbufdesc, buffer, MAXBUFSIZ); 893e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey else if (filebehave == FILE_BZIP && bzbufdesc != NULL) { 903e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey nr = BZ2_bzRead(&bzerr, bzbufdesc, buffer, MAXBUFSIZ); 913e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey switch (bzerr) { 923e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey case BZ_OK: 933e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey case BZ_STREAM_END: 943e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* No problem, nr will be okay */ 953e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey break; 963e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey case BZ_DATA_ERROR_MAGIC: 973e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* 983e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * As opposed to gzread(), which simply returns the 993e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * plain file data, if it is not in the correct 1003e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * compressed format, BZ2_bzRead() instead aborts. 1013e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * 1023e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * So, just restart at the beginning of the file again, 1033e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * and use plain reads from now on. 1043e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey */ 1053e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey BZ2_bzReadClose(&bzerr, bzbufdesc); 1063e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bzbufdesc = NULL; 1073e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (lseek(f->fd, 0, SEEK_SET) == -1) 1083e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (-1); 1093e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey nr = read(f->fd, buffer, MAXBUFSIZ); 1103e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey break; 1113e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey default: 1123e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Make sure we exit with an error */ 1133e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey nr = -1; 1143e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey } 1153e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey } else 1163e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#endif 1173e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey nr = read(f->fd, buffer, MAXBUFSIZ); 1183e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1193e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (nr < 0) 1203e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (-1); 1213e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1223e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufrem = nr; 1233e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (0); 1243e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey} 1253e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1263e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystatic inline int 1273e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeygrep_lnbufgrow(size_t newlen) 1283e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey{ 1293e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1303e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (lnbuflen < newlen) { 1313e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey lnbuf = grep_realloc(lnbuf, newlen); 1323e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey lnbuflen = newlen; 1333e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey } 1343e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1353e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (0); 1363e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey} 1373e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1383e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeychar * 1393e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeygrep_fgetln(struct file *f, size_t *lenp) 1403e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey{ 1413e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey unsigned char *p; 1423e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey char *ret; 1433e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey size_t len; 1443e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey size_t off; 1453e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey ptrdiff_t diff; 1463e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1473e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Fill the buffer, if necessary */ 1483e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (bufrem == 0 && grep_refill(f) != 0) 1493e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey goto error; 1503e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1513e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (bufrem == 0) { 1523e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Return zero length to indicate EOF */ 1533e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey *lenp = 0; 1543e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return ((char *)bufpos); 1553e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey } 1563e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1573e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Look for a newline in the remaining part of the buffer */ 1583e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if ((p = memchr(bufpos, line_sep, bufrem)) != NULL) { 1593e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey ++p; /* advance over newline */ 1603e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey ret = (char *)bufpos; 1613e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey len = p - bufpos; 1623e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufrem -= len; 1633e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufpos = p; 1643e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey *lenp = len; 1653e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (ret); 1663e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey } 1673e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1683e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* We have to copy the current buffered data to the line buffer */ 1693e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey for (len = bufrem, off = 0; ; len += bufrem) { 1703e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Make sure there is room for more data */ 1713e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (grep_lnbufgrow(len + LNBUFBUMP)) 1723e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey goto error; 1733e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey memcpy(lnbuf + off, bufpos, len - off); 1743e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey off = len; 1753e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (grep_refill(f) != 0) 1763e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey goto error; 1773e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (bufrem == 0) 1783e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* EOF: return partial line */ 1793e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey break; 1803e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if ((p = memchr(bufpos, line_sep, bufrem)) == NULL) 1813e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey continue; 1823e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* got it: finish up the line (like code above) */ 1833e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey ++p; 1843e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey diff = p - bufpos; 1853e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey len += diff; 1863e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (grep_lnbufgrow(len)) 1873e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey goto error; 1883e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey memcpy(lnbuf + off, bufpos, diff); 1893e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufrem -= diff; 1903e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufpos = p; 1913e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey break; 1923e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey } 1933e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey *lenp = len; 1943e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return ((char *)lnbuf); 1953e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 1963e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyerror: 1973e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey *lenp = 0; 1983e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (NULL); 1993e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey} 2003e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2013e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystatic inline struct file * 2023e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeygrep_file_init(struct file *f) 2033e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey{ 2043e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2053e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#ifndef ANDROID 2063e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (filebehave == FILE_GZIP && 2073e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey (gzbufdesc = gzdopen(f->fd, "r")) == NULL) 2083e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey goto error; 2093e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2103e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (filebehave == FILE_BZIP && 2113e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey (bzbufdesc = BZ2_bzdopen(f->fd, "r")) == NULL) 2123e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey goto error; 2133e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey#endif 2143e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2153e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Fill read buffer, also catches errors early */ 2163e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (grep_refill(f) != 0) 2173e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey goto error; 2183e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2193e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Check for binary stuff, if necessary */ 2203e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (!nulldataflag && binbehave != BINFILE_TEXT && 2213e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey memchr(bufpos, '\0', bufrem) != NULL) 2223e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey f->binary = true; 2233e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2243e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (f); 2253e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyerror: 2263e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey close(f->fd); 2273e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey free(f); 2283e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (NULL); 2293e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey} 2303e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2313e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* 2323e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * Opens a file for processing. 2333e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey */ 2343e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeystruct file * 2353e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeygrep_open(const char *path) 2363e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey{ 2373e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey struct file *f; 2383e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2393e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey f = grep_malloc(sizeof *f); 2403e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey memset(f, 0, sizeof *f); 2413e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey if (path == NULL) { 2423e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Processing stdin implies --line-buffered. */ 2433e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey lbflag = true; 2443e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey f->fd = STDIN_FILENO; 2453e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey } else if ((f->fd = open(path, O_RDONLY)) == -1) { 2463e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey free(f); 2473e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (NULL); 2483e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey } 2493e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2503e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey return (grep_file_init(f)); 2513e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey} 2523e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2533e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey/* 2543e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey * Closes a file. 2553e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey */ 2563e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeyvoid 2573e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkeygrep_close(struct file *f) 2583e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey{ 2593e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2603e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey close(f->fd); 2613e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2623e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey /* Reset read buffer and line buffer */ 2633e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufpos = buffer; 2643e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey bufrem = 0; 2653e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey 2663e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey free(lnbuf); 2673e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey lnbuf = NULL; 2683e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey lnbuflen = 0; 2693e8b1581ff0f2daa934eb9d6362dfe4e2b4fa8c9Jeff Sharkey} 270