chiark / gitweb /
Add __oop-read-copy.c
[innduct.git] / include / inn / qio.h
1 /*  $Id: qio.h 3653 2000-07-29 02:57:50Z rra $
2 **
3 **  Quick I/O package.
4 **
5 **  The interface to the Quick I/O package, optimized for reading through
6 **  files line by line.  This package uses internal buffering like stdio,
7 **  but is even more aggressive about its buffering.
8 */
9
10 #ifndef INN_QIO_H
11 #define INN_QIO_H 1
12
13 #include <inn/defines.h>
14
15 BEGIN_DECLS
16
17 /*
18 **  State for a quick open file, equivalent to FILE for stdio.  All callers
19 **  should treat this structure as opaque and instead use the functions and
20 **  macros defined below.
21 */
22 enum QIOflag { QIO_ok, QIO_error, QIO_long };
23
24 typedef struct {
25     int         _fd;
26     size_t      _length;        /* Length of the current string. */
27     size_t      _size;          /* Size of the internal buffer. */
28     char *      _buffer;
29     char *      _start;         /* Start of the unread data. */
30     char *      _end;           /* End of the available data. */
31     off_t       _count;         /* Number of bytes read so far. */
32     enum QIOflag _flag;
33 } QIOSTATE;
34
35 #define QIOerror(qp)    ((qp)->_flag != QIO_ok)
36 #define QIOtoolong(qp)  ((qp)->_flag == QIO_long)
37 #define QIOfileno(qp)   ((qp)->_fd)
38 #define QIOlength(qp)   ((qp)->_length)
39 #define QIOtell(qp)     ((qp)->_count - ((qp)->_end - (qp)->_start))
40
41 extern QIOSTATE *       QIOopen(const char *name);
42 extern QIOSTATE *       QIOfdopen(int fd);
43 extern char *           QIOread(QIOSTATE *qp);
44 extern void             QIOclose(QIOSTATE *qp);
45 extern int              QIOrewind(QIOSTATE *qp);
46
47 END_DECLS
48
49 #endif /* !INN_QIO_H */