LexLeo 0.0.0-dev+f8e5087-dirty
Technical documentation
Loading...
Searching...
No Matches
stream.c
Go to the documentation of this file.
1/* SPDX-License-Identifier: GPL-3.0-or-later
2 * Copyright (C) 2026 Sylvain Labopin
3 */
4
12
16
18
19size_t stream_read(stream_t *s, void *buf, size_t n, stream_status_t *st) {
20 if (n == 0) {
21 if (st) *st = STREAM_STATUS_OK;
22 return (size_t)0;
23 }
24
25 if (!s || !buf) {
26 if (st) *st = STREAM_STATUS_INVALID;
27 return (size_t)0;
28 }
29
30 if (!s->backend) {
31 if (st) *st = STREAM_STATUS_NO_BACKEND;
32 return (size_t)0;
33 }
34
35 return s->vtbl.read(s->backend, buf, n, st);
36}
37
39 stream_t *s,
40 const void *buf,
41 size_t n,
42 stream_status_t *st )
43{
44 if (n == 0) {
45 if (st) *st = STREAM_STATUS_OK;
46 return (size_t)0;
47 }
48
49 if (!s || !buf) {
50 if (st) *st = STREAM_STATUS_INVALID;
51 return (size_t)0;
52 }
53
54 if (!s->backend) {
55 if (st) *st = STREAM_STATUS_NO_BACKEND;
56 return (size_t)0;
57 }
58
59 return s->vtbl.write(s->backend, buf, n, st);
60}
61
63 if (!s || !s->vtbl.flush) return STREAM_STATUS_INVALID;
64 if (!s->backend) return STREAM_STATUS_NO_BACKEND;
65
66 return s->vtbl.flush(s->backend);
67}
68
70 stream_t **out,
71 const stream_vtbl_t *vtbl,
72 void *backend,
73 const stream_env_t *env )
74{
75 if (
76 !out
77 || !vtbl
78 || !vtbl->read
79 || !vtbl->write
80 || !vtbl->flush
81 || !vtbl->close
82 || !env
83 || !env->mem )
85
86 stream_t *tmp = env->mem->calloc(1, sizeof(*tmp));
87 if (!tmp)
88 return STREAM_STATUS_OOM;
89
90 tmp->vtbl = *vtbl;
91 tmp->backend = backend;
92 tmp->mem = env->mem;
93
94 *out = tmp;
95 return STREAM_STATUS_OK;
96}
97
99{
100 if (!s || !*s) {
101 return;
102 }
103
104 stream_t *stream = *s;
105 *s = NULL;
106
107 const osal_mem_ops_t *mem = stream->mem;
108 stream_close_fn_t close_fn = stream->vtbl.close;
109 void *backend = stream->backend;
110
111 if (close_fn) {
112 stream_status_t st = close_fn(backend);
114 st == STREAM_STATUS_OK ||
117 }
118
119 LEXLEO_ASSERT(mem && mem->free);
120 mem->free(stream);
121}
122
124 static const stream_ops_t OPS = {
125 .read = stream_read,
126 .write = stream_write,
127 .flush = stream_flush
128 };
129 return &OPS;
130}
131
133 return (stream_env_t) { .mem = mem_ops };
134}
#define LEXLEO_ASSERT(expr)
void stream_destroy(stream_t **s)
Destroy a stream handle.
Definition stream.c:98
stream_status_t stream_flush(stream_t *s)
Flush a stream.
Definition stream.c:62
size_t stream_write(stream_t *s, const void *buf, size_t n, stream_status_t *st)
Write bytes to a stream.
Definition stream.c:38
stream_status_t stream_create(stream_t **out, const stream_vtbl_t *vtbl, void *backend, const stream_env_t *env)
Create a generic stream handle from adapter-provided backend bindings.
Definition stream.c:69
const stream_ops_t * stream_default_ops(void)
Return the default borrower-facing ops table for the stream port.
Definition stream.c:123
stream_env_t stream_default_env(const osal_mem_ops_t *mem_ops)
Build a default stream_env_t from injected memory operations.
Definition stream.c:132
size_t stream_read(stream_t *s, void *buf, size_t n, stream_status_t *st)
Read bytes from a stream.
Definition stream.c:19
Borrower-facing runtime operations for the stream port.
Adapter-side API for constructing and binding stream_t objects.
stream_status_t(* stream_close_fn_t)(void *backend)
Backend close operation for a stream adapter.
Private stream handle definition for the stream port.
Lifecycle services for stream_t handles.
stream_status_t
Public status codes used by the stream port.
@ STREAM_STATUS_INVALID
@ STREAM_STATUS_IO_ERROR
@ STREAM_STATUS_OK
@ STREAM_STATUS_OOM
@ STREAM_STATUS_NO_BACKEND
void *(* calloc)(size_t nmemb, size_t size)
void(* free)(void *ptr)
Runtime environment for the stream port.
Definition stream_env.h:35
const osal_mem_ops_t * mem
Memory operations used by the stream port.
Definition stream_env.h:43
Borrower-facing operation table for the stream port.
size_t(* read)(stream_t *s, void *buf, size_t n, stream_status_t *st)
Read bytes from a stream.
Private handle structure for a stream_t.
stream_vtbl_t vtbl
void * backend
const osal_mem_ops_t * mem
Adapter dispatch table bound to a stream_t instance.
stream_read_fn_t read
stream_write_fn_t write
stream_close_fn_t close
stream_flush_fn_t flush