summaryrefslogtreecommitdiff
path: root/libgfortran/io/write.c
diff options
context:
space:
mode:
authorjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>2006-10-18 23:13:33 +0000
committerjvdelisle <jvdelisle@138bc75d-0d04-0410-961f-82ee72b054a4>2006-10-18 23:13:33 +0000
commitdf45db482c1b39f2c39dce63ffabab82e8a68c5c (patch)
treebbdfab311ddfa41a621df118efe7d19a03ba516a /libgfortran/io/write.c
parent9aba3cd46009060bae6749ee0b43c9adced5a61c (diff)
2006-10-18 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/29277 * io/write.c (write_a): Add conversion of LF to CR-LF for systems with #define HAVE_CRLF. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@117866 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libgfortran/io/write.c')
-rw-r--r--libgfortran/io/write.c75
1 files changed, 68 insertions, 7 deletions
diff --git a/libgfortran/io/write.c b/libgfortran/io/write.c
index 121d62907f37..9ff48049dac1 100644
--- a/libgfortran/io/write.c
+++ b/libgfortran/io/write.c
@@ -54,17 +54,78 @@ write_a (st_parameter_dt *dtp, const fnode *f, const char *source, int len)
wlen = f->u.string.length < 0 ? len : f->u.string.length;
- p = write_block (dtp, wlen);
- if (p == NULL)
- return;
+#ifdef HAVE_CRLF
+ /* If this is formatted STREAM IO convert any embedded line feed characters
+ to CR_LF on systems that use that sequence for newlines. See F2003
+ Standard sections 10.6.3 and 9.9 for further information. */
+ if (is_stream_io (dtp))
+ {
+ const char crlf[] = "\r\n";
+ int i, q, bytes;
+ q = bytes = 0;
+
+ /* Write out any padding if needed. */
+ if (len < wlen)
+ {
+ p = write_block (dtp, wlen - len);
+ if (p == NULL)
+ return;
+ memset (p, ' ', wlen - len);
+ }
- if (wlen < len)
- memcpy (p, source, wlen);
+ /* Scan the source string looking for '\n' and convert it if found. */
+ for (i = 0; i < wlen; i++)
+ {
+ if (source[i] == '\n')
+ {
+ /* Write out the previously scanned characters in the string. */
+ if (bytes > 0)
+ {
+ p = write_block (dtp, bytes);
+ if (p == NULL)
+ return;
+ memcpy (p, &source[q], bytes);
+ q += bytes;
+ bytes = 0;
+ }
+
+ /* Write out the CR_LF sequence. */
+ q++;
+ p = write_block (dtp, 2);
+ if (p == NULL)
+ return;
+ memcpy (p, crlf, 2);
+ }
+ else
+ bytes++;
+ }
+
+ /* Write out any remaining bytes if no LF was found. */
+ if (bytes > 0)
+ {
+ p = write_block (dtp, bytes);
+ if (p == NULL)
+ return;
+ memcpy (p, &source[q], bytes);
+ }
+ }
else
{
- memset (p, ' ', wlen - len);
- memcpy (p + wlen - len, source, len);
+#endif
+ p = write_block (dtp, wlen);
+ if (p == NULL)
+ return;
+
+ if (wlen < len)
+ memcpy (p, source, wlen);
+ else
+ {
+ memset (p, ' ', wlen - len);
+ memcpy (p + wlen - len, source, len);
+ }
+#ifdef HAVE_CRLF
}
+#endif
}
static GFC_INTEGER_LARGEST