summaryrefslogtreecommitdiff
path: root/newlib/libc/sys/go32/crlf2nl.c
diff options
context:
space:
mode:
Diffstat (limited to 'newlib/libc/sys/go32/crlf2nl.c')
-rw-r--r--newlib/libc/sys/go32/crlf2nl.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/newlib/libc/sys/go32/crlf2nl.c b/newlib/libc/sys/go32/crlf2nl.c
new file mode 100644
index 00000000000..18b7061cce6
--- /dev/null
+++ b/newlib/libc/sys/go32/crlf2nl.c
@@ -0,0 +1,69 @@
+/* This is file CRLF2NL.C */
+/*
+** Copyright (C) 1991 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
+**
+** This file is distributed under the terms listed in the document
+** "copying.dj", available from DJ Delorie at the address above.
+** A copy of "copying.dj" should accompany this file; if not, a copy
+** should be available from where this file was obtained. This file
+** may not be distributed without a verbatim copy of "copying.dj".
+**
+** This file is distributed WITHOUT ANY WARRANTY; without even the implied
+** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+unsigned crlf2nl(char *buf, unsigned len)
+{
+ char *bp = buf;
+ int i=0;
+ while (len--)
+ {
+ if (*bp != 13)
+ {
+ *buf++ = *bp;
+ i++;
+ }
+ bp++;
+ }
+ return i;
+}
+
+unsigned readcr(int fd, char *buf, unsigned len)
+{
+ unsigned i;
+ i = read(fd, buf, len);
+ if (i <= 0)
+ return i;
+ return crlf2nl(buf, i);
+}
+
+static char *sbuf = 0;
+#define BUFSIZE 4096
+
+unsigned writecr(int fd, char *buf, unsigned len)
+{
+ unsigned bufp=0, sbufp=0, crcnt=0, rlen=0;
+ int rv;
+ if (sbuf == 0)
+ sbuf = (char *)malloc(BUFSIZE+1);
+ while (len--)
+ {
+ if (buf[bufp] == 10)
+ {
+ crcnt++;
+ sbuf[sbufp++] = 13;
+ }
+ sbuf[sbufp++] = buf[bufp++];
+ if ((sbufp >= BUFSIZE) || (len == 0))
+ {
+ rv = write(fd, sbuf, sbufp);
+ if (rv < 0)
+ return rv;
+ rlen += rv - crcnt;
+ crcnt = 0;
+ sbufp = 0;
+ }
+ }
+ return rlen;
+}
+