aboutsummaryrefslogtreecommitdiff
path: root/gas
diff options
context:
space:
mode:
authorKazu Hirata <kazu@codesourcery.com>2008-10-03 20:21:33 +0000
committerKazu Hirata <kazu@codesourcery.com>2008-10-03 20:21:33 +0000
commit7e66d8acd2b8ed427ae11d18d249c42ffc2a16d7 (patch)
tree3803bf1595bc90c4334d22b3c4b261c89350f458 /gas
parent352efb280dcf48e6b4801b7c8104ff0c5ee3cef6 (diff)
downloadgdb-7e66d8acd2b8ed427ae11d18d249c42ffc2a16d7.zip
gdb-7e66d8acd2b8ed427ae11d18d249c42ffc2a16d7.tar.gz
gdb-7e66d8acd2b8ed427ae11d18d249c42ffc2a16d7.tar.bz2
* listing.c (buffer_line): Open the source file with FOPEN_RB.
Manually process line ends.
Diffstat (limited to 'gas')
-rw-r--r--gas/ChangeLog5
-rw-r--r--gas/listing.c17
2 files changed, 20 insertions, 2 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog
index 1054ef3..73b158a 100644
--- a/gas/ChangeLog
+++ b/gas/ChangeLog
@@ -1,3 +1,8 @@
+2008-10-03 Kazu Hirata <kazu@codesourcery.com>
+
+ * listing.c (buffer_line): Open the source file with FOPEN_RB.
+ Manually process line ends.
+
2008-09-30 Wesley W. Terpstra <wesley@terpstra.ca>
Nick Clifton <nickc@redhat.com>
diff --git a/gas/listing.c b/gas/listing.c
index d0e2042..025a2ca 100644
--- a/gas/listing.c
+++ b/gas/listing.c
@@ -471,8 +471,10 @@ buffer_line (file_info_type *file, char *line, unsigned int size)
fclose (last_open_file);
}
+ /* Open the file in the binary mode so that ftell above can
+ return a reliable value that we can feed to fseek below. */
last_open_file_info = file;
- last_open_file = fopen (file->filename, FOPEN_RT);
+ last_open_file = fopen (file->filename, FOPEN_RB);
if (last_open_file == NULL)
{
file->at_end = 1;
@@ -489,7 +491,7 @@ buffer_line (file_info_type *file, char *line, unsigned int size)
/* Leave room for null. */
size -= 1;
- while (c != EOF && c != '\n')
+ while (c != EOF && c != '\n' && c != '\r')
{
if (count < size)
*p++ = c;
@@ -498,6 +500,17 @@ buffer_line (file_info_type *file, char *line, unsigned int size)
c = fgetc (last_open_file);
}
+
+ /* If '\r' is followed by '\n', swallow that. Likewise, if '\n'
+ is followed by '\r', swallow that as well. */
+ if (c == '\r' || c == '\n')
+ {
+ int next = fgetc (last_open_file);
+ if ((c == '\r' && next != '\n')
+ || (c == '\n' && next != '\r'))
+ ungetc (next, last_open_file);
+ }
+
if (c == EOF)
{
file->at_end = 1;