+typedef union _PDCLIB_fd\r
+{\r
+#if defined(_PDCLIB_OSFD_T)\r
+ _PDCLIB_OSFD_T osfd;\r
+#endif\r
+ void * pointer;\r
+ _PDCLIB_uintptr_t uval;\r
+ _PDCLIB_intptr_t sval; \r
+} _PDCLIB_fd_t;\r
+\r
+/* Internal functions */\r
+/* Writes a stream's buffer.\r
+ Returns 0 on success, EOF on write error.\r
+ Sets stream error flags and errno appropriately on error.\r
+*/\r
+int _PDCLIB_flushbuffer( struct _PDCLIB_file_t * stream );\r
+\r
+/* Fills a stream's buffer.\r
+ Returns 0 on success, EOF on read error / EOF.\r
+ Sets stream EOF / error flags and errno appropriately on error.\r
+*/\r
+int _PDCLIB_fillbuffer( struct _PDCLIB_file_t * stream );\r
+\r
+/* Repositions within a file. Returns new offset on success,\r
+ -1 / errno on error.\r
+*/\r
+_PDCLIB_int_fast64_t _PDCLIB_seek( struct _PDCLIB_file_t * stream, \r
+ _PDCLIB_int_fast64_t offset, int whence );\r
+\r
+/* File backend I/O operations\r
+ *\r
+ * PDCLib will call through to these methods as needed to implement the stdio\r
+ * functions.\r
+ */\r
+typedef struct _PDCLIB_fileops\r
+{\r
+ /*! Read length bytes from the file into buf; returning the number of bytes\r
+ * actually read in *numBytesRead.\r
+ *\r
+ * Returns true if bytes were read successfully; on end of file, returns\r
+ * true with *numBytesRead == 0.\r
+ *\r
+ * On error, returns false and sets errno appropriately. *numBytesRead is\r
+ * ignored in this situation.\r
+ */\r
+ _PDCLIB_bool (*read)( _PDCLIB_fd_t self, \r
+ void * buf, \r
+ _PDCLIB_size_t length, \r
+ _PDCLIB_size_t * numBytesRead );\r
+\r
+ /*! Write length bytes to the file from buf; returning the number of bytes\r
+ * actually written in *numBytesWritten\r
+ *\r
+ * Returns true if bytes were written successfully. On error, returns false\r
+ * and setss errno appropriately (as with read, *numBytesWritten is \r
+ * ignored)\r
+ */\r
+ _PDCLIB_bool (*write)( _PDCLIB_fd_t self, const void * buf, \r
+ _PDCLIB_size_t length, _PDCLIB_size_t * numBytesWritten );\r
+\r
+ /* Seek to the file offset specified by offset, from location whence, which\r
+ * may be one of the standard constants SEEK_SET/SEEK_CUR/SEEK_END\r
+ */\r
+ _PDCLIB_bool (*seek)( _PDCLIB_fd_t self, _PDCLIB_int_fast64_t offset, \r
+ int whence, _PDCLIB_int_fast64_t *newPos );\r
+\r
+ void (*close)( _PDCLIB_fd_t self );\r
+\r
+ /*! Behaves as read does, except for wide characters. Both length and \r
+ * *numCharsRead represent counts of characters, not bytes.\r
+ *\r
+ * This function is optional; if missing, PDCLib will buffer the character\r
+ * data as bytes and perform translation directly into the user's buffers.\r
+ * It is useful if your backend can directly take wide characters (for \r
+ * example, the Windows console)\r
+ */\r
+ _PDCLIB_bool (*wread)( _PDCLIB_fd_t self, _PDCLIB_wchar_t * buf, \r
+ _PDCLIB_size_t length, _PDCLIB_size_t * numCharsRead );\r
+\r
+ /* Behaves as write does, except for wide characters. As with wread, both\r
+ * length and *numCharsWritten are character counts.\r
+ *\r
+ * This function is also optional; if missing, PDCLib will buffer the \r
+ * character data as bytes and do translation directly from the user's \r
+ * buffers. You only need to implement this if your backend can directly \r
+ * take wide characters (for example, the Windows console)\r
+ */\r
+ _PDCLIB_bool (*wwrite)( _PDCLIB_fd_t self, const _PDCLIB_wchar_t * buf, \r
+ _PDCLIB_size_t length, _PDCLIB_size_t * numCharsWritten );\r
+} _PDCLIB_fileops_t;\r
+\r