diff options
author | wtc%netscape.com <devnull@localhost> | 2003-04-18 14:00:56 +0000 |
---|---|---|
committer | wtc%netscape.com <devnull@localhost> | 2003-04-18 14:00:56 +0000 |
commit | 3deb8e51e920b3aa0b9c071f08b4ad8aee0bdc47 (patch) | |
tree | 2355b2b6a63b6bd5aa47b388d4595c5414e4e7f4 | |
parent | aedbdbbddc010cb576375e6eebdde8c4cfa1211f (diff) | |
download | nspr-hg-3deb8e51e920b3aa0b9c071f08b4ad8aee0bdc47.tar.gz |
Bug 104529: on OS/2, when writing to the command-line console, we must
write \r\n to go to a new line. So we need to translate \n to \r\n. The
patch is contributed by Julien Pierre.
Tag: NSPRPUB_PRE_4_2_CLIENT_BRANCH
-rw-r--r-- | pr/src/io/prstdio.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/pr/src/io/prstdio.c b/pr/src/io/prstdio.c index 4ae2f267..de4c39de 100644 --- a/pr/src/io/prstdio.c +++ b/pr/src/io/prstdio.c @@ -56,7 +56,45 @@ PR_IMPLEMENT(PRUint32) PR_vfprintf(PRFileDesc* fd, const char *fmt, va_list ap) PRUint32 rv, len; char* msg = PR_vsmprintf(fmt, ap); len = strlen(msg); +#ifdef XP_OS2 + /* + * OS/2 really needs a \r for every \n. + * In the future we should try to use scatter-gather instead of a + * succession of PR_Write. + */ + if (isatty(PR_FileDesc2NativeHandle(fd))) { + PRUint32 last = 0, idx; + PRInt32 tmp; + rv = 0; + for (idx = 0; idx < len+1; idx++) { + if ((idx - last > 0) && (('\n' == msg[idx]) || (idx == len))) { + tmp = PR_Write(fd, msg + last, idx - last); + if (tmp >= 0) { + rv += tmp; + } + last = idx; + } + /* + * if current character is \n, and + * previous character isn't \r, and + * next character isn't \r + */ + if (('\n' == msg[idx]) && + ((0 == idx) || ('\r' != msg[idx-1])) && + ('\r' != msg[idx+1])) { + /* add extra \r */ + tmp = PR_Write(fd, "\r", 1); + if (tmp >= 0) { + rv += tmp; + } + } + } + } else { + rv = PR_Write(fd, msg, len); + } +#else rv = PR_Write(fd, msg, len); +#endif PR_DELETE(msg); return rv; } |