Contents of /trunk/mkinitrd-magellan/busybox/libbb/get_line_from_file.c
Parent Directory | Revision Log
Revision 532 -
(show annotations)
(download)
Sat Sep 1 22:45:15 2007 UTC (17 years ago) by niro
File MIME type: text/plain
File size: 1588 byte(s)
Sat Sep 1 22:45:15 2007 UTC (17 years ago) by niro
File MIME type: text/plain
File size: 1588 byte(s)
-import if magellan mkinitrd; it is a fork of redhats mkinitrd-5.0.8 with all magellan patches and features; deprecates magellan-src/mkinitrd
1 | /* vi: set sw=4 ts=4: */ |
2 | /* |
3 | * Utility routines. |
4 | * |
5 | * Copyright (C) 2005, 2006 Rob Landley <rob@landley.net> |
6 | * Copyright (C) 2004 Erik Andersen <andersen@codepoet.org> |
7 | * Copyright (C) 2001 Matt Krai |
8 | * |
9 | * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. |
10 | */ |
11 | |
12 | #include "libbb.h" |
13 | |
14 | /* This function reads an entire line from a text file, up to a newline |
15 | * or NUL byte, inclusive. It returns a malloc'ed char * which must be |
16 | * stored and free'ed by the caller. If end is NULL '\n' isn't considered |
17 | * end of line. If end isn't NULL, length of the chunk read is stored in it. |
18 | * Return NULL if EOF/error */ |
19 | |
20 | char *bb_get_chunk_from_file(FILE * file, int *end) |
21 | { |
22 | int ch; |
23 | int idx = 0; |
24 | char *linebuf = NULL; |
25 | int linebufsz = 0; |
26 | |
27 | while ((ch = getc(file)) != EOF) { |
28 | /* grow the line buffer as necessary */ |
29 | if (idx >= linebufsz) { |
30 | linebuf = xrealloc(linebuf, linebufsz += 80); |
31 | } |
32 | linebuf[idx++] = (char) ch; |
33 | if (!ch || (end && ch == '\n')) |
34 | break; |
35 | } |
36 | if (end) |
37 | *end = idx; |
38 | if (linebuf) { |
39 | // huh, does fgets discard prior data on error like this? |
40 | // I don't think so.... |
41 | //if (ferror(file)) { |
42 | // free(linebuf); |
43 | // return NULL; |
44 | //} |
45 | linebuf = xrealloc(linebuf, idx+1); |
46 | linebuf[idx] = '\0'; |
47 | } |
48 | return linebuf; |
49 | } |
50 | |
51 | /* Get line, including trailing \n if any */ |
52 | char *xmalloc_fgets(FILE * file) |
53 | { |
54 | int i; |
55 | |
56 | return bb_get_chunk_from_file(file, &i); |
57 | } |
58 | |
59 | /* Get line. Remove trailing \n */ |
60 | char *xmalloc_getline(FILE * file) |
61 | { |
62 | int i; |
63 | char *c = bb_get_chunk_from_file(file, &i); |
64 | |
65 | if (i && c[--i] == '\n') |
66 | c[i] = '\0'; |
67 | |
68 | return c; |
69 | } |