Adaptive Framework  0.9.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
afw_stream.h
Go to the documentation of this file.
1 // See the 'COPYING' file in the project root for licensing information.
2 /*
3  * Adaptive Framework Stream Implementation Header
4  *
5  * Copyright (c) 2010-2023 Clemson University
6  *
7  */
8 
9 #ifndef __AFW_STREAM_H__
10 #define __AFW_STREAM_H__
11 
12 #include "afw_interface.h"
13 
29 
31 typedef enum {
32  afw_stream_number_raw_response_body,
33  afw_stream_number_response_body,
34  afw_stream_number_console,
35  afw_stream_number_stderr,
36  afw_stream_number_stdout,
37  afw_stream_number_count /* Count is also max enum value + 1 */
39 
40 
43  afw_size_t maximum_number_of_streams;
44  const afw_stream_t * const *streams;
45  const afw_utf8_t *last_stream_error;
46 };
47 
48 
49 
57 AFW_DECLARE(void)
59  const afw_utf8_t *streamId,
60  const afw_stream_t **stream,
61  afw_size_t *streamNumber,
62  afw_xctx_t *xctx);
63 
64 
65 
74  const afw_integer_t streamNumber,
75  afw_xctx_t *xctx);
76 
77 
78 
87  const afw_utf8_t *streamId,
88  afw_xctx_t *xctx);
89 
90 
91 
100  const afw_stream_t *stream,
101  afw_xctx_t *xctx);
102 
103 
104 
112 AFW_DECLARE(const afw_stream_t *)
114 
115 
116 
122 #define afw_stream_standard(enum_suffix, xctx) \
123 (((xctx)->stream_anchor->streams[afw_stream_number_ ## enum_suffix]) \
124 ? (xctx)->stream_anchor->streams[afw_stream_number_ ## enum_suffix] \
125 : afw_stream_standard_impl(afw_stream_number_ ## enum_suffix, xctx) )
126 
127 
128 
134 #define afw_stream_standard_is_set(enum_suffix, xctx) \
135 ((xctx)->stream_anchor->streams[afw_stream_number_ ## enum_suffix] != NULL )
136 
137 
138 
146 #define afw_stream_standard_set(enum_suffix, stream, xctx) \
147 if ((xctx)->stream_anchor->streams[afw_stream_number_ ## enum_suffix]) { \
148  AFW_THROW_ERROR(general, "Stream already set", xctx); \
149 } \
150 (xctx)->stream_anchor->streams[afw_stream_number_ ## enum_suffix] = stream
151 
152 
153 
161 #define afw_stream_standard_release(enum_suffix, xctx) \
162 if ((xctx)->stream_anchor->streams[afw_stream_number_ ## enum_suffix]) { \
163  afw_stream_release( \
164  (xctx)->stream_anchor->streams[afw_stream_number_ ## enum_suffix], \
165  xctx); \
166  *(afw_stream_t **)&(xctx)->stream_anchor-> \
167  streams[afw_stream_number_ ## enum_suffix] = NULL; \
168 }
169 
170 
171 
178 #define afw_stream_write_z(writer, s_z, xctx) \
179 afw_stream_write(writer, s_z, strlen(s_z), xctx)
180 
181 
182 
188 #define afw_stream_write_eol(writer, xctx) \
189 afw_stream_write(writer, "\n", strlen("\n"), xctx)
190 
191 
192 
199 #define afw_stream_write_utf8(writer, S, xctx) \
200 afw_stream_write(writer, (S)->s, (S)->len, xctx)
201 
202 
203 
210 AFW_DECLARE(void)
212  const afw_stream_t *writer,
213  afw_integer_t integer,
214  afw_xctx_t *xctx);
215 
216 
217 
224 AFW_DECLARE(void)
226  const afw_stream_t *writer,
227  afw_size_t size,
228  afw_xctx_t *xctx);
229 
230 
231 
243 AFW_DECLARE(const afw_stream_t *)
245  FILE *fd,
246  const afw_utf8_t *streamId,
247  afw_boolean_t allow_read,
248  afw_boolean_t allow_write,
249  afw_boolean_t auto_flush,
250  afw_boolean_t close_on_release,
251  const afw_pool_t * p,
252  afw_xctx_t *xctx);
253 
254 
255 
266 AFW_DECLARE(const afw_stream_t *)
268  const afw_utf8_t *streamId,
269  const afw_utf8_t *path,
270  const afw_utf8_t *mode,
271  afw_boolean_t auto_flush,
272  const afw_pool_t *p,
273  afw_xctx_t *xctx);
274 
275 
276 
283 afw_stream_internal_stream_anchor_create(afw_xctx_t *xctx);
284 
285 
286 
293 afw_stream_internal_release_all_streams(afw_xctx_t *xctx);
294 
295 
296 AFW_END_DECLARES
297 
300 #endif /* __AFW_STREAM_H__ */
#define AFW_DEFINE_INTERNAL(type)
Define an internal function for /src/afw/ source*.c files.
#define AFW_BEGIN_DECLARES
#define AFW_DECLARE(type)
Declare a public afw function.
Interfaceafw_interface header.
_Bool afw_boolean_t
Definition: afw_common.h:373
apr_size_t afw_size_t
size_t.
Definition: afw_common.h:151
apr_int64_t afw_integer_t
typedef for big signed int.
Definition: afw_common.h:321
const afw_stream_t * afw_stream_standard_impl(afw_stream_number_t n, afw_xctx_t *xctx)
Implementation for get xctx standard stream instance.
Definition: afw_stream.c:150
const afw_stream_t * afw_stream_get_by_streamNumber(const afw_integer_t streamNumber, afw_xctx_t *xctx)
Get stream by streamNumber.
Definition: afw_stream.c:68
afw_size_t afw_stream_set(const afw_stream_t *stream, afw_xctx_t *xctx)
Set an opening stream and get its streamNumber.
Definition: afw_stream.c:114
afw_size_t afw_stream_get_streamNumber_for_streamId(const afw_utf8_t *streamId, afw_xctx_t *xctx)
Get streamNumber for streamId.
Definition: afw_stream.c:97
const afw_stream_t * afw_stream_fd_create(FILE *fd, const afw_utf8_t *streamId, afw_boolean_t allow_read, afw_boolean_t allow_write, afw_boolean_t auto_flush, afw_boolean_t close_on_release, const afw_pool_t *p, afw_xctx_t *xctx)
Create a stream to a file descriptor.
const afw_stream_t * afw_stream_fd_open_and_create(const afw_utf8_t *streamId, const afw_utf8_t *path, const afw_utf8_t *mode, afw_boolean_t auto_flush, const afw_pool_t *p, afw_xctx_t *xctx)
Open a file and create a stream for it.
void afw_stream_get_by_streamId(const afw_utf8_t *streamId, const afw_stream_t **stream, afw_size_t *streamNumber, afw_xctx_t *xctx)
Get stream by streamId and streamNumber.
Definition: afw_stream.c:19
afw_stream_number_t
enum for common xctx streams
Definition: afw_stream.h:31
void afw_stream_write_integer(const afw_stream_t *writer, afw_integer_t integer, afw_xctx_t *xctx)
Call afw_stream_write() with an integer.
Definition: afw_stream.c:341
void afw_stream_write_size(const afw_stream_t *writer, afw_size_t size, afw_xctx_t *xctx)
Call afw_stream_write() with an size.
Definition: afw_stream.c:357
Interface afw_pool public struct.
struct for common xctx streams
Definition: afw_stream.h:42
Interface afw_stream public struct.
NFC normalized UTF-8 string.
Definition: afw_common.h:545
Interface afw_xctx public struct.