deeed59de0
function old new delta xrealloc_vector_helper - 51 +51 create_list 84 99 +15 getopt_main 690 695 +5 passwd_main 1049 1053 +4 get_cached 85 89 +4 msh_main 1377 1380 +3 add_match 42 41 -1 read_lines 720 718 -2 grave 1068 1066 -2 fill_match_lines 143 141 -2 add_to_dirlist 67 65 -2 add_input_file 49 47 -2 act 252 250 -2 fsck_main 2252 2246 -6 man_main 765 757 -8 bb_internal_initgroups 228 220 -8 cut_main 1052 1041 -11 add_edge_to_node 55 43 -12 dpkg_main 3851 3835 -16 ifupdown_main 2202 2178 -24 sort_main 838 812 -26 ------------------------------------------------------------------------------ (add/remove: 1/0 grow/shrink: 5/15 up/down: 82/-124) Total: -42 bytes
70 lines
1.6 KiB
C
70 lines
1.6 KiB
C
/* vi: set sw=4 ts=4: */
|
|
/*
|
|
* Utility routines.
|
|
*
|
|
* Copyright (C) 2005, 2006 Rob Landley <rob@landley.net>
|
|
* Copyright (C) 2004 Erik Andersen <andersen@codepoet.org>
|
|
* Copyright (C) 2001 Matt Krai
|
|
*
|
|
* Licensed under GPLv2 or later, see file LICENSE in this tarball for details.
|
|
*/
|
|
|
|
#include "libbb.h"
|
|
|
|
/* This function reads an entire line from a text file, up to a newline
|
|
* or NUL byte, inclusive. It returns a malloc'ed char * which
|
|
* must be free'ed by the caller. If end is NULL '\n' isn't considered
|
|
* end of line. If end isn't NULL, length of the chunk read is stored in it.
|
|
* Return NULL if EOF/error */
|
|
char* FAST_FUNC bb_get_chunk_from_file(FILE *file, int *end)
|
|
{
|
|
int ch;
|
|
int idx = 0;
|
|
char *linebuf = NULL;
|
|
int linebufsz = 0;
|
|
|
|
while ((ch = getc(file)) != EOF) {
|
|
/* grow the line buffer as necessary */
|
|
if (idx >= linebufsz) {
|
|
linebufsz += 80;
|
|
linebuf = xrealloc(linebuf, linebufsz);
|
|
}
|
|
linebuf[idx++] = (char) ch;
|
|
if (!ch || (end && ch == '\n'))
|
|
break;
|
|
}
|
|
if (end)
|
|
*end = idx;
|
|
if (linebuf) {
|
|
// huh, does fgets discard prior data on error like this?
|
|
// I don't think so....
|
|
//if (ferror(file)) {
|
|
// free(linebuf);
|
|
// return NULL;
|
|
//}
|
|
linebuf = xrealloc(linebuf, idx + 1);
|
|
linebuf[idx] = '\0';
|
|
}
|
|
return linebuf;
|
|
}
|
|
|
|
/* Get line, including trailing \n if any */
|
|
char* FAST_FUNC xmalloc_fgets(FILE *file)
|
|
{
|
|
int i;
|
|
|
|
return bb_get_chunk_from_file(file, &i);
|
|
}
|
|
|
|
/* Get line. Remove trailing \n */
|
|
char* FAST_FUNC xmalloc_fgetline(FILE *file)
|
|
{
|
|
int i;
|
|
char *c = bb_get_chunk_from_file(file, &i);
|
|
|
|
if (i && c[--i] == '\n')
|
|
c[i] = '\0';
|
|
|
|
return c;
|
|
}
|