diff options
author | bug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2001-06-13 07:34:03 +0000 |
---|---|---|
committer | bug1 <bug1@69ca8d6d-28ef-0310-b511-8ec308f3f277> | 2001-06-13 07:34:03 +0000 |
commit | 0206172be8940d86e81f52636d2dd9dbcd32388b (patch) | |
tree | 3bf667fdf5b78df26acfc662955d7e38f3c5c4d5 /libbb/fgets_str.c | |
parent | 534e65a38bad53ef1681872f872260330be9a636 (diff) | |
download | busybox-w32-0206172be8940d86e81f52636d2dd9dbcd32388b.tar.gz busybox-w32-0206172be8940d86e81f52636d2dd9dbcd32388b.tar.bz2 busybox-w32-0206172be8940d86e81f52636d2dd9dbcd32388b.zip |
Reorganise unarchive functions, new files, removed some
git-svn-id: svn://busybox.net/trunk/busybox@2825 69ca8d6d-28ef-0310-b511-8ec308f3f277
Diffstat (limited to 'libbb/fgets_str.c')
-rw-r--r-- | libbb/fgets_str.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/libbb/fgets_str.c b/libbb/fgets_str.c new file mode 100644 index 000000000..33d8d00cc --- /dev/null +++ b/libbb/fgets_str.c | |||
@@ -0,0 +1,64 @@ | |||
1 | /* | ||
2 | * This program is free software; you can redistribute it and/or modify | ||
3 | * it under the terms of the GNU General Public License as published by | ||
4 | * the Free Software Foundation; either version 2 of the License, or | ||
5 | * (at your option) any later version. | ||
6 | * | ||
7 | * This program is distributed in the hope that it will be useful, | ||
8 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
9 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
10 | * GNU Library General Public License for more details. | ||
11 | * | ||
12 | * You should have received a copy of the GNU General Public License | ||
13 | * along with this program; if not, write to the Free Software | ||
14 | * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | ||
15 | */ | ||
16 | |||
17 | |||
18 | #include <stdio.h> | ||
19 | #include <stdlib.h> | ||
20 | #include <string.h> | ||
21 | |||
22 | /* | ||
23 | * Continue reading from file until the terminating string is encountered. | ||
24 | * Return data as string. | ||
25 | * e.g. fgets_str(file, "\n"); will read till end of file | ||
26 | */ | ||
27 | |||
28 | char *fgets_str(FILE *file, const char *terminating_string) | ||
29 | { | ||
30 | char *linebuf = NULL; | ||
31 | const int term_length = strlen(terminating_string); | ||
32 | int end_string_offset; | ||
33 | int linebufsz = 0; | ||
34 | int idx = 0; | ||
35 | int ch; | ||
36 | |||
37 | while (1) { | ||
38 | ch = fgetc(file); | ||
39 | if (ch == EOF) { | ||
40 | break; | ||
41 | } | ||
42 | |||
43 | /* grow the line buffer as necessary */ | ||
44 | while (idx > linebufsz - 2) { | ||
45 | linebuf = realloc(linebuf, linebufsz += 1000); /* GROWBY */ | ||
46 | } | ||
47 | |||
48 | linebuf[idx] = ch; | ||
49 | idx++; | ||
50 | |||
51 | /* Check for terminating string */ | ||
52 | end_string_offset = idx - term_length; | ||
53 | if ((end_string_offset > 0) && (memcmp(&linebuf[end_string_offset], terminating_string, term_length) == 0)) { | ||
54 | idx -= term_length; | ||
55 | break; | ||
56 | } | ||
57 | } | ||
58 | if (idx == 0) { | ||
59 | return NULL; | ||
60 | } | ||
61 | linebuf[idx] = '\0'; | ||
62 | return(linebuf); | ||
63 | } | ||
64 | |||