From: Kazu Hirata Date: Fri, 3 Oct 2008 20:21:33 +0000 (+0000) Subject: * listing.c (buffer_line): Open the source file with FOPEN_RB. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=7e66d8acd2b8ed427ae11d18d249c42ffc2a16d7;p=binutils-gdb.git * listing.c (buffer_line): Open the source file with FOPEN_RB. Manually process line ends. --- diff --git a/gas/ChangeLog b/gas/ChangeLog index 1054ef3e8db..73b158a8c78 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,8 @@ +2008-10-03 Kazu Hirata + + * listing.c (buffer_line): Open the source file with FOPEN_RB. + Manually process line ends. + 2008-09-30 Wesley W. Terpstra Nick Clifton diff --git a/gas/listing.c b/gas/listing.c index d0e20429db6..025a2ca6742 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;