1/*
2 * Australian Public Licence B (OZPLB)
3 *
4 * Version 1-0
5 *
6 * Copyright (c) 2004 National ICT Australia
7 *
8 * All rights reserved.
9 *
10 * Developed by: Embedded, Real-time and Operating Systems Program (ERTOS)
11 *               National ICT Australia
12 *               http://www.ertos.nicta.com.au
13 *
14 * Permission is granted by National ICT Australia, free of charge, to
15 * any person obtaining a copy of this software and any associated
16 * documentation files (the "Software") to deal with the Software without
17 * restriction, including (without limitation) the rights to use, copy,
18 * modify, adapt, merge, publish, distribute, communicate to the public,
19 * sublicense, and/or sell, lend or rent out copies of the Software, and
20 * to permit persons to whom the Software is furnished to do so, subject
21 * to the following conditions:
22 *
23 *     * Redistributions of source code must retain the above copyright
24 *       notice, this list of conditions and the following disclaimers.
25 *
26 *     * Redistributions in binary form must reproduce the above
27 *       copyright notice, this list of conditions and the following
28 *       disclaimers in the documentation and/or other materials provided
29 *       with the distribution.
30 *
31 *     * Neither the name of National ICT Australia, nor the names of its
32 *       contributors, may be used to endorse or promote products derived
33 *       from this Software without specific prior written permission.
34 *
35 * EXCEPT AS EXPRESSLY STATED IN THIS LICENCE AND TO THE FULL EXTENT
36 * PERMITTED BY APPLICABLE LAW, THE SOFTWARE IS PROVIDED "AS-IS", AND
37 * NATIONAL ICT AUSTRALIA AND ITS CONTRIBUTORS MAKE NO REPRESENTATIONS,
38 * WARRANTIES OR CONDITIONS OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
39 * BUT NOT LIMITED TO ANY REPRESENTATIONS, WARRANTIES OR CONDITIONS
40 * REGARDING THE CONTENTS OR ACCURACY OF THE SOFTWARE, OR OF TITLE,
41 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT,
42 * THE ABSENCE OF LATENT OR OTHER DEFECTS, OR THE PRESENCE OR ABSENCE OF
43 * ERRORS, WHETHER OR NOT DISCOVERABLE.
44 *
45 * TO THE FULL EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL
46 * NATIONAL ICT AUSTRALIA OR ITS CONTRIBUTORS BE LIABLE ON ANY LEGAL
47 * THEORY (INCLUDING, WITHOUT LIMITATION, IN AN ACTION OF CONTRACT,
48 * NEGLIGENCE OR OTHERWISE) FOR ANY CLAIM, LOSS, DAMAGES OR OTHER
49 * LIABILITY, INCLUDING (WITHOUT LIMITATION) LOSS OF PRODUCTION OR
50 * OPERATION TIME, LOSS, DAMAGE OR CORRUPTION OF DATA OR RECORDS; OR LOSS
51 * OF ANTICIPATED SAVINGS, OPPORTUNITY, REVENUE, PROFIT OR GOODWILL, OR
52 * OTHER ECONOMIC LOSS; OR ANY SPECIAL, INCIDENTAL, INDIRECT,
53 * CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES, ARISING OUT OF OR IN
54 * CONNECTION WITH THIS LICENCE, THE SOFTWARE OR THE USE OF OR OTHER
55 * DEALINGS WITH THE SOFTWARE, EVEN IF NATIONAL ICT AUSTRALIA OR ITS
56 * CONTRIBUTORS HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH CLAIM, LOSS,
57 * DAMAGES OR OTHER LIABILITY.
58 *
59 * If applicable legislation implies representations, warranties, or
60 * conditions, or imposes obligations or liability on National ICT
61 * Australia or one of its contributors in respect of the Software that
62 * cannot be wholly or partly excluded, restricted or modified, the
63 * liability of National ICT Australia or the contributor is limited, to
64 * the full extent permitted by the applicable legislation, at its
65 * option, to:
66 * a.  in the case of goods, any one or more of the following:
67 * i.  the replacement of the goods or the supply of equivalent goods;
68 * ii.  the repair of the goods;
69 * iii. the payment of the cost of replacing the goods or of acquiring
70 *  equivalent goods;
71 * iv.  the payment of the cost of having the goods repaired; or
72 * b.  in the case of services:
73 * i.  the supplying of the services again; or
74 * ii.  the payment of the cost of having the services supplied again.
75 *
76 * The construction, validity and performance of this licence is governed
77 * by the laws in force in New South Wales, Australia.
78 */
79
80/*
81Author: Ben Leslie
82*/
83
84#ifndef _STDIO_FILE_H_
85#define _STDIO_FILE_H_
86
87#include <stdio.h>
88#include <barrelfish/barrelfish.h> /* for struct thread_mutex */
89
90#define lock_stream(s) thread_mutex_lock_nested(&(s)->mutex)
91#define unlock_stream(s) thread_mutex_unlock(&(s)->mutex)
92
93#define __UNGET_SIZE 10
94
95struct __file {
96    void *handle;       // Handle to pass to file handling functions
97
98    size_t (*read_fn)(void *, long int, size_t, void *);
99    size_t (*write_fn)(void *, long int, size_t, void *);
100    int (*close_fn)(void *);
101    long int (*eof_fn)(void *);
102
103    // Output buffering
104    unsigned char buffering_mode;       // Buffer mode. Can be _IONBF, _IOLBF, _IOFBF
105    char *buffer;   // The output buffer
106    int buf_pos;    // Current position in output buffer
107    int buf_size;   // Allocated size of the buffer
108    int buf_allocated;      // Was the buffer malloc'd (=1) or is it static (=0)?
109
110    // Input buffering
111    char *rbuffer;              // The input buffer
112    char *rbuf_pos;             // Current position in buffer
113    int rbuf_size;              // Allocated size of the buffer
114    int rbuf_valid;             // Remaining valid characters in buffer
115
116    unsigned char unget_pos;    // Position in unget stack
117    size_t current_pos;         // Current position in file
118
119    struct thread_mutex mutex;  // Mutex to protect file access
120
121    int eof;
122    int error;
123
124    char unget_stack[__UNGET_SIZE];     // The unget stack
125};
126
127#endif // _STDIO_FILE_H_
128