+EXPORT int setvbuf(FILE *fp, char *buffer, int mode, size_t size)\r
+{\r
+ if( !fp ) {\r
+ errno = EINVAL;\r
+ return 1;\r
+ }\r
+\r
+ // Check for memory files\r
+ if( fp->FD == -2 ) {\r
+ errno = EINVAL;\r
+ return 2;\r
+ } \r
+\r
+ // Not strictly needed, as this should only be called before any IO\r
+ fflush(fp);\r
+\r
+ // Eliminate any pre-existing buffer\r
+ if( fp->Buffer ) {\r
+ free( fp->Buffer );\r
+ fp->Buffer = NULL;\r
+ fp->BufferSpace = 0;\r
+ fp->BufferPos = 0;\r
+ }\r
+\r
+ if( mode == _IONBF ) {\r
+ // Do nothing, buffering was disabled above\r
+ }\r
+ else\r
+ {\r
+ // Sanity check buffering mode before allocating\r
+ if( mode != _IOLBF && mode != _IOFBF ) {\r
+ errno = EINVAL;\r
+ return 1;\r
+ }\r
+ // Allocate a buffer if one was not provided\r
+ if( !buffer ) {\r
+ buffer = malloc(size);\r
+ assert(buffer);\r
+ }\r
+ \r
+ // Set buffer pointer and size\r
+ fp->Buffer = buffer;\r
+ fp->BufferSpace = size;\r
+ \r
+ // Set mode flag\r
+ if( mode == _IOLBF )\r
+ fp->Flags |= FILE_FLAG_LINEBUFFERED;\r
+ else\r
+ fp->Flags &= ~FILE_FLAG_LINEBUFFERED;\r
+ }\r
+ \r
+ return 0;\r
+}\r
+\r
+int _fflush_int(FILE *fp)\r
+{\r
+ int ret = 0;\r
+ size_t len;\r
+ \r
+ // Check the buffer contains data\r
+ if( fp->BufferPos == 0 )\r
+ return 0;\r
+ \r
+ switch(fp->Flags & FILE_FLAG_MODE_MASK)\r
+ {\r
+ // Read - Flush input buffer\r
+ case FILE_FLAG_MODE_READ:\r
+ fp->BufferPos = 0;\r
+ break;\r
+ \r
+ // Append - Seek to end and write\r
+ case FILE_FLAG_MODE_APPEND:\r
+ _SysSeek(fp->FD, fp->BufferOfs, SEEK_SET);\r
+ len = _SysWrite(fp->FD, fp->Buffer, fp->BufferPos);\r
+ if( len < fp->BufferPos )\r
+ ret = 1;\r
+ fp->BufferPos -= len;\r
+ fp->BufferOfs = _SysTell(fp->FD);\r
+ break;\r
+ \r
+ // Write - Write buffer\r
+ case FILE_FLAG_MODE_WRITE:\r
+ _SysDebug("Flushing to %i '%.*s'", fp->FD, fp->BufferPos, fp->Buffer);\r
+ len = _SysWrite(fp->FD, fp->Buffer, fp->BufferPos);\r
+ if( len != fp->BufferPos )\r
+ ret = 1;\r
+ fp->BufferPos -= len;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ return ret;\r
+}\r
+\r