3333
3434RETRO_BEGIN_DECLS
3535
36- /**
37- * Returns the available data in \c buffer for reading.
38- *
39- * @param buffer <tt>fifo_buffer_t *</tt>. The FIFO queue to check.
40- * @return The number of bytes available for reading from \c buffer.
41- */
42- #define FIFO_READ_AVAIL (buffer ) (((buffer)->end + (((buffer)->end < (buffer)->first) ? (buffer)->size : 0)) - (buffer)->first)
43-
44- /**
45- * Returns the available space in \c buffer for writing.
46- *
47- * @param buffer <tt>fifo_buffer_t *</tt>. The FIFO queue to check.
48- * @return The number of bytes that \c buffer can accept.
49- */
50- #define FIFO_WRITE_AVAIL (buffer ) (((buffer)->size - 1) - (((buffer)->end + (((buffer)->end < (buffer)->first) ? (buffer)->size : 0)) - (buffer)->first))
51-
52- /**
53- * Returns the available data in \c buffer for reading.
54- *
55- * @param buffer \c fifo_buffer_t. The FIFO queue to check.
56- * @return The number of bytes available for reading from \c buffer.
57- */
58- #define FIFO_READ_AVAIL_NONPTR (buffer ) (((buffer).end + (((buffer).end < (buffer).first) ? (buffer).size : 0)) - (buffer).first)
59-
60- /**
61- * Returns the available space in \c buffer for writing.
62- *
63- * @param buffer \c fifo_buffer_t. The FIFO queue to check.
64- * @return The number of bytes that \c buffer can accept.
65- */
66- #define FIFO_WRITE_AVAIL_NONPTR (buffer ) (((buffer).size - 1) - (((buffer).end + (((buffer).end < (buffer).first) ? (buffer).size : 0)) - (buffer).first))
36+ #ifdef __GNUC__
37+ /* GCC / Clang: use statement-expression to evaluate end_adj once. */
38+
39+ #define FIFO_READ_AVAIL (buffer ) \
40+ __extension__({ \
41+ const size_t _end_adj_ = (buffer)->end + \
42+ (((buffer)->end < (buffer)->first) ? (buffer)->size : 0u); \
43+ _end_adj_ - (buffer)->first; \
44+ })
45+
46+ #define FIFO_WRITE_AVAIL (buffer ) \
47+ __extension__({ \
48+ const size_t _end_adj_ = (buffer)->end + \
49+ (((buffer)->end < (buffer)->first) ? (buffer)->size : 0u); \
50+ ((buffer)->size - 1u) - (_end_adj_ - (buffer)->first); \
51+ })
52+
53+ #define FIFO_READ_AVAIL_NONPTR (buffer ) \
54+ __extension__({ \
55+ const size_t _end_adj_ = (buffer).end + \
56+ (((buffer).end < (buffer).first) ? (buffer).size : 0u); \
57+ _end_adj_ - (buffer).first; \
58+ })
59+
60+ #define FIFO_WRITE_AVAIL_NONPTR (buffer ) \
61+ __extension__({ \
62+ const size_t _end_adj_ = (buffer).end + \
63+ (((buffer).end < (buffer).first) ? (buffer).size : 0u); \
64+ ((buffer).size - 1u) - (_end_adj_ - (buffer).first); \
65+ })
66+
67+ #else
68+ /* Strict C89 fallback: double-evaluation is safe because the macro
69+ * arguments are plain struct-member accesses with no side effects. */
70+
71+ #define FIFO_READ_AVAIL (buffer ) \
72+ (((buffer)->end + (((buffer)->end < (buffer)->first) ? (buffer)->size : 0)) - (buffer)->first)
73+
74+ #define FIFO_WRITE_AVAIL (buffer ) \
75+ (((buffer)->size - 1) - (((buffer)->end + (((buffer)->end < (buffer)->first) ? (buffer)->size : 0)) - (buffer)->first))
76+
77+ #define FIFO_READ_AVAIL_NONPTR (buffer ) \
78+ (((buffer).end + (((buffer).end < (buffer).first) ? (buffer).size : 0)) - (buffer).first)
79+
80+ #define FIFO_WRITE_AVAIL_NONPTR (buffer ) \
81+ (((buffer).size - 1) - (((buffer).end + (((buffer).end < (buffer).first) ? (buffer).size : 0)) - (buffer).first))
82+
83+ #endif /* __GNUC__ */
6784
6885/** @copydoc fifo_buffer_t */
6986struct fifo_buffer
7087{
7188 uint8_t * buffer ;
72- size_t size ;
73- size_t first ;
74- size_t end ;
89+ size_t size ;
90+ size_t first ;
91+ size_t end ;
7592};
7693
7794/**
@@ -108,12 +125,11 @@ fifo_buffer_t *fifo_new(size_t len);
108125bool fifo_initialize (fifo_buffer_t * buf , size_t len );
109126
110127/**
111- * Resets the bounds of \c buffer,
112- * effectively clearing it.
128+ * Resets the bounds of \c buffer, effectively clearing it.
129+ *
130+ * No memory will actually be freed, but the contents of \c buffer
131+ * will be overwritten with the next call to \c fifo_write.
113132 *
114- * No memory will actually be freed,
115- * but the contents of \c buffer will be overwritten
116- * with the next call to \c fifo_write.
117133 * @param buffer The FIFO queue to clear.
118134 * Behavior is undefined if \c NULL.
119135 */
@@ -153,8 +169,7 @@ void fifo_read(fifo_buffer_t *buffer, void *in_buf, size_t len);
153169void fifo_free (fifo_buffer_t * buffer );
154170
155171/**
156- * Deallocates the contents of \c buffer,
157- * but not \c buffer itself.
172+ * Deallocates the contents of \c buffer, but not \c buffer itself.
158173 *
159174 * Suitable for use with static or automatic \c fifo_buffer_t instances.
160175 *
@@ -164,7 +179,6 @@ void fifo_free(fifo_buffer_t *buffer);
164179 */
165180bool fifo_deinitialize (fifo_buffer_t * buffer );
166181
167-
168182RETRO_END_DECLS
169183
170- #endif
184+ #endif /* __LIBRETRO_SDK_FIFO_BUFFER_H */
0 commit comments