2929 * This file is part of LwRB - Lightweight ring buffer library.
3030 *
3131 * Author: Tilen MAJERLE <tilen@majerle.eu>
32- * Version: v3.0.0-rc1
32+ * Version: v3.3.0
3333 */
3434#ifndef LWRB_HDR_H
3535#define LWRB_HDR_H
3636
37+ #include <stddef.h>
3738#include <stdint.h>
3839#include <string.h>
3940
@@ -47,11 +48,30 @@ extern "C" {
4748 * \{
4849 */
4950
50- #ifdef LWRB_DISABLE_ATOMIC
51- typedef unsigned long lwrb_ulong_t ;
52- #else
51+ #if !defined(LWRB_DISABLE_ATOMIC ) || __DOXYGEN__
5352#include <stdatomic.h>
54- typedef atomic_ulong lwrb_ulong_t ;
53+
54+ /**
55+ * \brief Atomic type for size variable.
56+ * Default value is set to be `unsigned 32-bits` type
57+ */
58+ typedef atomic_ulong lwrb_sz_atomic_t ;
59+
60+ /**
61+ * \brief Size variable for all library operations.
62+ * Default value is set to be `unsigned 32-bits` type
63+ */
64+ typedef unsigned long lwrb_sz_t ;
65+ #else
66+ /*
67+ * LWRB_DISABLE_ATOMIC is defined, so the atomic type is dropped in favor of a
68+ * plain one. This is not "atomicity off, everything else still guaranteed" -
69+ * there is no ordering or visibility guarantee between the write and read
70+ * side left in the library at all. If you define this, it is entirely up to
71+ * the application to make sure the target handles concurrent access safely.
72+ */
73+ typedef unsigned long lwrb_sz_atomic_t ;
74+ typedef unsigned long lwrb_sz_t ;
5575#endif
5676
5777/**
@@ -74,46 +94,61 @@ struct lwrb;
7494 * \param[in] evt: Event type
7595 * \param[in] bp: Number of bytes written or read (when used), depends on event type
7696 */
77- typedef void (* lwrb_evt_fn )(struct lwrb * buff , lwrb_evt_type_t evt , size_t bp );
97+ typedef void (* lwrb_evt_fn )(struct lwrb * buff , lwrb_evt_type_t evt , lwrb_sz_t bp );
98+
99+ /* List of flags */
100+ #define LWRB_FLAG_READ_ALL ((uint16_t)0x0001)
101+ #define LWRB_FLAG_WRITE_ALL ((uint16_t)0x0001)
78102
79103/**
80104 * \brief Buffer structure
81105 */
82106typedef struct lwrb {
83107 uint8_t * buff ; /*!< Pointer to buffer data. Buffer is considered initialized when `buff != NULL` and `size > 0` */
84- size_t size ; /*!< Size of buffer data. Size of actual buffer is `1` byte less than value holds */
85- lwrb_ulong_t r ; /*!< Next read pointer. Buffer is considered empty when `r == w` and full when `w == r - 1` */
86- lwrb_ulong_t w ; /*!< Next write pointer. Buffer is considered empty when `r == w` and full when `w == r - 1` */
87- lwrb_evt_fn evt_fn ; /*!< Pointer to event callback function */
108+ lwrb_sz_t size ; /*!< Size of buffer data. Size of actual buffer is `1` byte less than value holds */
109+ lwrb_sz_atomic_t r_ptr ; /*!< Next read pointer.
110+ Buffer is considered empty when `r == w` and full when `w == r - 1` */
111+ lwrb_sz_atomic_t w_ptr ; /*!< Next write pointer.
112+ Buffer is considered empty when `r == w` and full when `w == r - 1` */
113+ lwrb_evt_fn evt_fn ; /*!< Pointer to event callback function */
114+ void * arg ; /*!< Event custom user argument */
88115} lwrb_t ;
89116
90- uint8_t lwrb_init (lwrb_t * buff , void * buffdata , size_t size );
117+ uint8_t lwrb_init (lwrb_t * buff , void * buffdata , lwrb_sz_t size );
91118uint8_t lwrb_is_ready (lwrb_t * buff );
92119void lwrb_free (lwrb_t * buff );
93120void lwrb_reset (lwrb_t * buff );
94121void lwrb_set_evt_fn (lwrb_t * buff , lwrb_evt_fn fn );
122+ void lwrb_set_arg (lwrb_t * buff , void * arg );
123+ void * lwrb_get_arg (lwrb_t * buff );
95124
96125/* Read/Write functions */
97- size_t lwrb_write (lwrb_t * buff , const void * data , size_t btw );
98- size_t lwrb_read (lwrb_t * buff , void * data , size_t btr );
99- size_t lwrb_peek (const lwrb_t * buff , size_t skip_count , void * data , size_t btp );
126+ lwrb_sz_t lwrb_write (lwrb_t * buff , const void * data , lwrb_sz_t btw );
127+ lwrb_sz_t lwrb_read (lwrb_t * buff , void * data , lwrb_sz_t btr );
128+ lwrb_sz_t lwrb_peek (const lwrb_t * buff , lwrb_sz_t skip_count , void * data , lwrb_sz_t btp );
129+
130+ /* Extended read/write functions */
131+ uint8_t lwrb_write_ex (lwrb_t * buff , const void * data , lwrb_sz_t btw , lwrb_sz_t * bwritten , uint16_t flags );
132+ uint8_t lwrb_read_ex (lwrb_t * buff , void * data , lwrb_sz_t btr , lwrb_sz_t * bread , uint16_t flags );
100133
101134/* Buffer size information */
102- size_t lwrb_get_free (const lwrb_t * buff );
103- size_t lwrb_get_full (const lwrb_t * buff );
135+ lwrb_sz_t lwrb_get_free (const lwrb_t * buff );
136+ lwrb_sz_t lwrb_get_full (const lwrb_t * buff );
104137
105138/* Read data block management */
106139void * lwrb_get_linear_block_read_address (const lwrb_t * buff );
107- size_t lwrb_get_linear_block_read_length (const lwrb_t * buff );
108- size_t lwrb_skip (lwrb_t * buff , size_t len );
140+ lwrb_sz_t lwrb_get_linear_block_read_length (const lwrb_t * buff );
141+ lwrb_sz_t lwrb_skip (lwrb_t * buff , lwrb_sz_t len );
109142
110143/* Write data block management */
111144void * lwrb_get_linear_block_write_address (const lwrb_t * buff );
112- size_t lwrb_get_linear_block_write_length (const lwrb_t * buff );
113- size_t lwrb_advance (lwrb_t * buff , size_t len );
145+ lwrb_sz_t lwrb_get_linear_block_write_length (const lwrb_t * buff );
146+ lwrb_sz_t lwrb_advance (lwrb_t * buff , lwrb_sz_t len );
114147
115148/* Search in buffer */
116- uint8_t lwrb_find (const lwrb_t * buff , const void * bts , size_t len , size_t start_offset , size_t * found_idx );
149+ uint8_t lwrb_find (const lwrb_t * buff , const void * bts , lwrb_sz_t len , lwrb_sz_t start_offset , lwrb_sz_t * found_idx );
150+ lwrb_sz_t lwrb_overwrite (lwrb_t * buff , const void * data , lwrb_sz_t btw );
151+ lwrb_sz_t lwrb_move (lwrb_t * dest , lwrb_t * src );
117152
118153/**
119154 * \}
0 commit comments