]> pd.if.org Git - pdclib.old/blobdiff - functions/stdio/_PDCLIB_flushbuffer.c
Add newline translationwq
[pdclib.old] / functions / stdio / _PDCLIB_flushbuffer.c
index 7ee0d93c35730aa08b1baaa28128d2e735f23f16..44066d87dbd24099d40fe16ca657f25ef786c858 100644 (file)
 #include <_PDCLIB_glue.h>\r
 #include <_PDCLIB_io.h>\r
 \r
-int _PDCLIB_flushbuffer( FILE * stream )\r
+static int flushsubbuffer( FILE * stream, size_t length )\r
 {\r
-    if ( ! ( stream->status & _PDCLIB_FBIN ) )\r
-    {\r
-        /* TODO: Text stream conversion here */\r
-    }\r
-\r
     size_t written = 0;\r
+    int rv = 0;\r
 \r
-\r
-    while(written != stream->bufidx) {\r
+    while( written != length )\r
+    {\r
         size_t justWrote;\r
-        size_t toWrite = stream->bufidx - written;\r
-        bool res = stream->ops->write( stream->handle, stream->buffer + written, \r
+        size_t toWrite = length - written;\r
+        bool res = stream->ops->write( stream->handle, stream->buffer + written,\r
                               toWrite, &justWrote);\r
         written += justWrote;\r
         stream->pos.offset += justWrote;\r
 \r
-        if(!res) {\r
+        if (!res)\r
+        {\r
             stream->status |=_PDCLIB_ERRORFLAG;\r
-            stream->bufidx -= written;\r
-            memmove( stream->buffer, stream->buffer + written, stream->bufidx );\r
-            return EOF;\r
+            rv = EOF;\r
+            break;\r
+        }\r
+    }\r
+\r
+    stream->bufidx -= written;\r
+    memmove( stream->buffer, stream->buffer + written, stream->bufidx );\r
+\r
+    return rv;\r
+}\r
+\r
+#if defined(_PDCLIB_NEED_EOL_TRANSLATION)\r
+#undef  _PDCLIB_NEED_EOL_TRANSLATION\r
+#define _PDCLIB_NEED_EOL_TRANSLATION 1\r
+#else\r
+#define _PDCLIB_NEED_EOL_TRANSLATION 0\r
+#endif\r
+\r
+int _PDCLIB_flushbuffer( FILE * stream )\r
+{\r
+    // if a text stream, and this platform needs EOL translation, well...\r
+    if ( ! ( stream->status & _PDCLIB_FBIN ) && _PDCLIB_NEED_EOL_TRANSLATION )\r
+    {\r
+        size_t pos;\r
+        for ( pos = 0; pos < stream->bufidx; pos++ )\r
+        {\r
+            if (stream->buffer[pos] == '\n' ) {\r
+                if ( stream->bufidx == stream->bufend ) {\r
+                    // buffer is full. Need to print out everything up till now\r
+                    if( flushsubbuffer( stream, pos ) )\r
+                    {\r
+                        return EOF;\r
+                    }\r
+\r
+                    pos = 0;\r
+                }\r
+\r
+                // we have spare space in buffer. Shift everything 1char and\r
+                // insert \r\r
+                memmove( &stream->buffer[pos+1], &stream->buffer[pos], stream->bufidx - pos );\r
+                stream->buffer[pos] = '\r';\r
+\r
+                pos += 2;\r
+                stream->bufidx++;\r
+            }\r
         }\r
     }\r
 \r
-    stream->bufidx = 0;\r
-    return 0;\r
+    return flushsubbuffer( stream, stream->bufidx );\r
 }\r
 \r
 #endif\r