]> pd.if.org Git - pdclib.old/blobdiff - internals/_PDCLIB_io.h
PDCLIB-8: First phase of intergation of new I/O backend system (with minimal
[pdclib.old] / internals / _PDCLIB_io.h
index 0dfdad258fc6356a107597cfc830080cd1ccf82a..829bb4586ed66781c2b2aca73f88f934651678a5 100644 (file)
 /* stream handle should not be free()d on close (stdin, stdout, stderr) */\r
 #define _PDCLIB_STATIC     32768u\r
 \r
+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
 /* Position / status structure for getpos() / fsetpos(). */\r
 struct _PDCLIB_fpos_t\r
 {\r
-    _PDCLIB_uint64_t offset; /* File position offset */\r
-    int              status; /* Multibyte parsing state (unused, reserved) */\r
+    _PDCLIB_int_fast64_t offset; /* File position offset */\r
+    int                  status; /* Multibyte parsing state (unused, reserved) */\r
 };\r
 \r
 /* FILE structure */\r
 struct _PDCLIB_file_t\r
 {\r
-    _PDCLIB_fd_t            handle;   /* OS file handle */\r
-    _PDCLIB_MTX_T           lock;     /* file lock */\r
-    char *                  buffer;   /* Pointer to buffer memory */\r
-    _PDCLIB_size_t          bufsize;  /* Size of buffer */\r
-    _PDCLIB_size_t          bufidx;   /* Index of current position in buffer */\r
-    _PDCLIB_size_t          bufend;   /* Index of last pre-read character in buffer */\r
-    struct _PDCLIB_fpos_t   pos;      /* Offset and multibyte parsing state */\r
-    _PDCLIB_size_t          ungetidx; /* Number of ungetc()'ed characters */\r
-    unsigned char *         ungetbuf; /* ungetc() buffer */\r
-    unsigned int            status;   /* Status flags; see above */\r
+    const _PDCLIB_fileops_t * ops;\r
+    _PDCLIB_fd_t              handle;   /* OS file handle */\r
+    _PDCLIB_MTX_T             lock;     /* file lock */\r
+    char *                    buffer;   /* Pointer to buffer memory */\r
+    _PDCLIB_size_t            bufsize;  /* Size of buffer */\r
+    _PDCLIB_size_t            bufidx;   /* Index of current position in buffer */\r
+    _PDCLIB_size_t            bufend;   /* Index of last pre-read character in buffer */\r
+    struct _PDCLIB_fpos_t     pos;      /* Offset and multibyte parsing state */\r
+    _PDCLIB_size_t            ungetidx; /* Number of ungetc()'ed characters */\r
+    unsigned char *           ungetbuf; /* ungetc() buffer */\r
+    unsigned int              status;   /* Status flags; see above */\r
     /* multibyte parsing status to be added later */\r
-    char *                  filename; /* Name the current stream has been opened with */\r
-    struct _PDCLIB_file_t * next;     /* Pointer to next struct (internal) */\r
+    char *                    filename; /* Name the current stream has been opened with */\r
+    struct _PDCLIB_file_t *   next;     /* Pointer to next struct (internal) */\r
 };\r
 \r
 \r