Mercurial > hg > octave-nkf > gnulib-hg
annotate lib/linebuffer.c @ 2807:807294ed0f4f
back out Copyright date changes for files with no changes year
author | Jim Meyering <jim@meyering.net> |
---|---|
date | Mon, 07 Aug 2000 15:48:18 +0000 |
parents | 5994c6f939c5 |
children | 72422d1e9181 |
rev | line source |
---|---|
14 | 1 /* linebuffer.c -- read arbitrarily long lines |
2807
807294ed0f4f
back out Copyright date changes for files with no changes year
Jim Meyering <jim@meyering.net>
parents:
2718
diff
changeset
|
2 Copyright (C) 1986, 1991, 1998, 1999 Free Software Foundation, Inc. |
14 | 3 |
4 This program is free software; you can redistribute it and/or modify | |
5 it under the terms of the GNU General Public License as published by | |
6 the Free Software Foundation; either version 2, or (at your option) | |
7 any later version. | |
8 | |
9 This program is distributed in the hope that it will be useful, | |
10 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 GNU General Public License for more details. | |
13 | |
14 You should have received a copy of the GNU General Public License | |
1464 | 15 along with this program; if not, write to the Free Software Foundation, |
16 Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |
14 | 17 |
18 /* Written by Richard Stallman. */ | |
19 | |
1463
f8f00a1e2989
(readline): Return zero upon error as well as upon
Jim Meyering <jim@meyering.net>
parents:
14
diff
changeset
|
20 #ifdef HAVE_CONFIG_H |
f8f00a1e2989
(readline): Return zero upon error as well as upon
Jim Meyering <jim@meyering.net>
parents:
14
diff
changeset
|
21 # include <config.h> |
f8f00a1e2989
(readline): Return zero upon error as well as upon
Jim Meyering <jim@meyering.net>
parents:
14
diff
changeset
|
22 #endif |
f8f00a1e2989
(readline): Return zero upon error as well as upon
Jim Meyering <jim@meyering.net>
parents:
14
diff
changeset
|
23 |
14 | 24 #include <stdio.h> |
1888
7bcd093998ec
Include <sys/types.h> now that linebuffer.h uses
Jim Meyering <jim@meyering.net>
parents:
1868
diff
changeset
|
25 #include <sys/types.h> |
14 | 26 #include "linebuffer.h" |
27 | |
28 char *xmalloc (); | |
29 char *xrealloc (); | |
30 void free (); | |
31 | |
32 /* Initialize linebuffer LINEBUFFER for use. */ | |
33 | |
34 void | |
1465 | 35 initbuffer (struct linebuffer *linebuffer) |
14 | 36 { |
37 linebuffer->length = 0; | |
38 linebuffer->size = 200; | |
39 linebuffer->buffer = (char *) xmalloc (linebuffer->size); | |
40 } | |
41 | |
42 /* Read an arbitrarily long line of text from STREAM into LINEBUFFER. | |
1866
ac8a74ce72cd
(readline): Append trailing newline to line.
Jim Meyering <jim@meyering.net>
parents:
1465
diff
changeset
|
43 Keep the newline; append a newline if it's the last line of a file |
1991
e7ed29061994
(readline): Do not leave room for an extra
Jim Meyering <jim@meyering.net>
parents:
1888
diff
changeset
|
44 that ends in a non-newline character. Do not null terminate. |
1866
ac8a74ce72cd
(readline): Append trailing newline to line.
Jim Meyering <jim@meyering.net>
parents:
1465
diff
changeset
|
45 Return LINEBUFFER, except at end of file return 0. */ |
14 | 46 |
47 struct linebuffer * | |
1465 | 48 readline (struct linebuffer *linebuffer, FILE *stream) |
14 | 49 { |
50 int c; | |
51 char *buffer = linebuffer->buffer; | |
52 char *p = linebuffer->buffer; | |
1991
e7ed29061994
(readline): Do not leave room for an extra
Jim Meyering <jim@meyering.net>
parents:
1888
diff
changeset
|
53 char *end = buffer + linebuffer->size; /* Sentinel. */ |
14 | 54 |
1463
f8f00a1e2989
(readline): Return zero upon error as well as upon
Jim Meyering <jim@meyering.net>
parents:
14
diff
changeset
|
55 if (feof (stream) || ferror (stream)) |
1866
ac8a74ce72cd
(readline): Append trailing newline to line.
Jim Meyering <jim@meyering.net>
parents:
1465
diff
changeset
|
56 return 0; |
14 | 57 |
1866
ac8a74ce72cd
(readline): Append trailing newline to line.
Jim Meyering <jim@meyering.net>
parents:
1465
diff
changeset
|
58 do |
14 | 59 { |
60 c = getc (stream); | |
1866
ac8a74ce72cd
(readline): Append trailing newline to line.
Jim Meyering <jim@meyering.net>
parents:
1465
diff
changeset
|
61 if (c == EOF) |
ac8a74ce72cd
(readline): Append trailing newline to line.
Jim Meyering <jim@meyering.net>
parents:
1465
diff
changeset
|
62 { |
ac8a74ce72cd
(readline): Append trailing newline to line.
Jim Meyering <jim@meyering.net>
parents:
1465
diff
changeset
|
63 if (p == buffer) |
ac8a74ce72cd
(readline): Append trailing newline to line.
Jim Meyering <jim@meyering.net>
parents:
1465
diff
changeset
|
64 return 0; |
ac8a74ce72cd
(readline): Append trailing newline to line.
Jim Meyering <jim@meyering.net>
parents:
1465
diff
changeset
|
65 if (p[-1] == '\n') |
ac8a74ce72cd
(readline): Append trailing newline to line.
Jim Meyering <jim@meyering.net>
parents:
1465
diff
changeset
|
66 break; |
ac8a74ce72cd
(readline): Append trailing newline to line.
Jim Meyering <jim@meyering.net>
parents:
1465
diff
changeset
|
67 c = '\n'; |
ac8a74ce72cd
(readline): Append trailing newline to line.
Jim Meyering <jim@meyering.net>
parents:
1465
diff
changeset
|
68 } |
14 | 69 if (p == end) |
70 { | |
71 linebuffer->size *= 2; | |
72 buffer = (char *) xrealloc (buffer, linebuffer->size); | |
1866
ac8a74ce72cd
(readline): Append trailing newline to line.
Jim Meyering <jim@meyering.net>
parents:
1465
diff
changeset
|
73 p = p - linebuffer->buffer + buffer; |
14 | 74 linebuffer->buffer = buffer; |
1991
e7ed29061994
(readline): Do not leave room for an extra
Jim Meyering <jim@meyering.net>
parents:
1888
diff
changeset
|
75 end = buffer + linebuffer->size; |
14 | 76 } |
77 *p++ = c; | |
78 } | |
1866
ac8a74ce72cd
(readline): Append trailing newline to line.
Jim Meyering <jim@meyering.net>
parents:
1465
diff
changeset
|
79 while (c != '\n'); |
14 | 80 |
1866
ac8a74ce72cd
(readline): Append trailing newline to line.
Jim Meyering <jim@meyering.net>
parents:
1465
diff
changeset
|
81 linebuffer->length = p - buffer; |
14 | 82 return linebuffer; |
83 } | |
84 | |
85 /* Free linebuffer LINEBUFFER and its data, all allocated with malloc. */ | |
86 | |
87 void | |
1465 | 88 freebuffer (struct linebuffer *linebuffer) |
14 | 89 { |
90 free (linebuffer->buffer); | |
91 free (linebuffer); | |
92 } |