diff options
Diffstat (limited to 'gas')
-rw-r--r-- | gas/ChangeLog | 5 | ||||
-rw-r--r-- | gas/listing.c | 17 |
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; |