diff options
Diffstat (limited to 'pr/src/io/prstdio.c')
-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; } |