aboutsummaryrefslogtreecommitdiff
path: root/libbb/get_line_from_file.c
diff options
context:
space:
mode:
authorRob Landley <rob@landley.net>2006-02-24 02:30:39 +0000
committerRob Landley <rob@landley.net>2006-02-24 02:30:39 +0000
commit2b26fd5570ebd6efb395aac4773051a5f3ed4dcd (patch)
tree432c38fd4819faa22fb61c5f5a7114774a97493b /libbb/get_line_from_file.c
parent5c22c11de2dacac3c024a70ae01ee7afb64dddb8 (diff)
downloadbusybox-w32-2b26fd5570ebd6efb395aac4773051a5f3ed4dcd.tar.gz
busybox-w32-2b26fd5570ebd6efb395aac4773051a5f3ed4dcd.tar.bz2
busybox-w32-2b26fd5570ebd6efb395aac4773051a5f3ed4dcd.zip
A few changes falling out from the effort to make sed handle embedded NUL bytes.
Checking in to reduce the diff between my tree and svn...
Diffstat (limited to 'libbb/get_line_from_file.c')
-rw-r--r--libbb/get_line_from_file.c66
1 files changed, 20 insertions, 46 deletions
diff --git a/libbb/get_line_from_file.c b/libbb/get_line_from_file.c
index a27edc3bd..5ad497ffa 100644
--- a/libbb/get_line_from_file.c
+++ b/libbb/get_line_from_file.c
@@ -2,22 +2,11 @@
2/* 2/*
3 * Utility routines. 3 * Utility routines.
4 * 4 *
5 * Copyright (C) many different people. 5 * Copyright (C) 2005, 2006 Rob Landley <rob@landley.net>
6 * If you wrote this, please acknowledge your work. 6 * Copyright (C) 2004 Erik Andersen <andersen@codepoet.org>
7 * Copyright (C) 2001 Matt Krai
7 * 8 *
8 * This program is free software; you can redistribute it and/or modify 9 * Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; either version 2 of the License, or
11 * (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License
19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
21 */ 10 */
22 11
23#include <stdio.h> 12#include <stdio.h>
@@ -25,14 +14,12 @@
25#include "libbb.h" 14#include "libbb.h"
26 15
27/* get_line_from_file() - This function reads an entire line from a text file, 16/* get_line_from_file() - This function reads an entire line from a text file,
28 * up to a newline. It returns a malloc'ed char * which must be stored and 17 * up to a newline or NUL byte. It returns a malloc'ed char * which must be
29 * free'ed by the caller. If 'c' is nonzero, the trailing '\n' (if any) 18 * stored and free'ed by the caller. If end is null '\n' isn't considered
30 * is removed. In event of a read error or EOF, NULL is returned. */ 19 * and of line. If end isn't null, length of the chunk read is stored in it. */
31 20
32static char *private_get_line_from_file(FILE *file, int c) 21char *bb_get_chunk_from_file(FILE *file, int *end)
33{ 22{
34#define GROWBY (80) /* how large we will grow strings by */
35
36 int ch; 23 int ch;
37 int idx = 0; 24 int idx = 0;
38 char *linebuf = NULL; 25 char *linebuf = NULL;
@@ -41,17 +28,12 @@ static char *private_get_line_from_file(FILE *file, int c)
41 while ((ch = getc(file)) != EOF) { 28 while ((ch = getc(file)) != EOF) {
42 /* grow the line buffer as necessary */ 29 /* grow the line buffer as necessary */
43 if (idx > linebufsz - 2) { 30 if (idx > linebufsz - 2) {
44 linebuf = xrealloc(linebuf, linebufsz += GROWBY); 31 linebuf = xrealloc(linebuf, linebufsz += 80);
45 } 32 }
46 linebuf[idx++] = (char)ch; 33 linebuf[idx++] = (char)ch;
47 if (!ch) return linebuf; 34 if (!ch || (end && ch == '\n')) break;
48 if (c<2 && ch == '\n') {
49 if (c) {
50 --idx;
51 }
52 break;
53 }
54 } 35 }
36 if (end) *end = idx;
55 if (linebuf) { 37 if (linebuf) {
56 if (ferror(file)) { 38 if (ferror(file)) {
57 free(linebuf); 39 free(linebuf);
@@ -62,27 +44,19 @@ static char *private_get_line_from_file(FILE *file, int c)
62 return linebuf; 44 return linebuf;
63} 45}
64 46
47/* Get line, including trailing /n if any */
65extern char *bb_get_line_from_file(FILE *file) 48extern char *bb_get_line_from_file(FILE *file)
66{ 49{
67 return private_get_line_from_file(file, 0); 50 int i;
51 return bb_get_chunk_from_file(file, &i);
68} 52}
69 53
54/* Get line. Remove trailing /n */
70extern char *bb_get_chomped_line_from_file(FILE *file) 55extern char *bb_get_chomped_line_from_file(FILE *file)
71{ 56{
72 return private_get_line_from_file(file, 1); 57 int i;
73} 58 char *c=bb_get_chunk_from_file(file, &i);
74 59 if(i) c[--i]=0;
75extern char *bb_get_chunk_from_file(FILE *file) 60
76{ 61 return c;
77 return private_get_line_from_file(file, 2);
78} 62}
79
80
81/* END CODE */
82/*
83Local Variables:
84c-file-style: "linux"
85c-basic-offset: 4
86tab-width: 4
87End:
88*/