buffer.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include <types/buffer.h>
  2. #include <types/stdint.h>
  3. int32_t
  4. ring_buffer_empty(struct ring_buffer* buf)
  5. {
  6. return (buf->count == 0);
  7. }
  8. int32_t
  9. ring_buffer_full(struct ring_buffer* buf)
  10. {
  11. return (buf->count == (size_t)(buf->buf_end_pos - buf->buf_start_pos + 1));
  12. }
  13. static inline void
  14. ring_buffer_move_base_ptr_forward(struct ring_buffer* buf)
  15. {
  16. if (buf->base == buf->buf_end_pos) {
  17. buf->base = buf->buf_start_pos;
  18. } else {
  19. ++buf->base;
  20. }
  21. }
  22. static inline void
  23. ring_buffer_move_head_ptr_forward(struct ring_buffer* buf)
  24. {
  25. if (buf->head == buf->buf_end_pos) {
  26. buf->head = buf->buf_start_pos;
  27. } else {
  28. ++buf->head;
  29. }
  30. }
  31. static inline char
  32. ring_buffer_get_data(struct ring_buffer* buf)
  33. {
  34. --buf->count;
  35. return *buf->base;
  36. }
  37. static inline void
  38. ring_buffer_put_data(struct ring_buffer* buf, char c)
  39. {
  40. *buf->head = c;
  41. ++buf->count;
  42. }
  43. char ring_buffer_read(struct ring_buffer* buf)
  44. {
  45. if (ring_buffer_empty(buf)) {
  46. // TODO: set error flag
  47. return 0xff;
  48. }
  49. char c = ring_buffer_get_data(buf);
  50. ring_buffer_move_base_ptr_forward(buf);
  51. return c;
  52. }
  53. int32_t
  54. ring_buffer_write(struct ring_buffer* buf, char c)
  55. {
  56. if (ring_buffer_full(buf)) {
  57. // TODO: set error flag
  58. return 1;
  59. }
  60. ring_buffer_put_data(buf, c);
  61. ring_buffer_move_head_ptr_forward(buf);
  62. return 0;
  63. }