-
Notifications
You must be signed in to change notification settings - Fork 0
/
circular_buffer.c
134 lines (122 loc) · 4.37 KB
/
circular_buffer.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/**
* @file circular_buffer.c
* @author Joe Krachey ([email protected])
* @brief
* @version 0.1
* @date 2023-09-27
*
* @copyright Copyright (c) 2023
*
*/
#include "circular_buffer.h"
//*****************************************************************************
// Initializes a circular buffer.
//
// Parameters
// max_size: Number of entries in the circular buffer.
//*****************************************************************************
Circular_Buffer * circular_buffer_init(uint16_t max_size)
{
/* Allocate memory from the heap fro the circular buffer struct */
Circular_Buffer *buffer = malloc(sizeof(Circular_Buffer));
/* Allocate memory from the heap that will be used to store the characters/data
* in the circular buffer
*/
buffer->data = malloc(max_size);
/* Initialize the max_size, produce count, and consume count*/
buffer->max_size = max_size;
buffer->produce_count = 0;
buffer->consume_count = 0;
/* Return a pointer to the circular buffer data structure */
return buffer;
}
//*****************************************************************************
// Returns a circular buffer to the heap
//
// Parameters
// buffer : The address of the circular buffer.
//*****************************************************************************
void circular_buffer_delete(Circular_Buffer * buffer)
{
free((void *)buffer->data);
free(buffer);
}
//*****************************************************************************
// Returns true if the circular buffer is empty. Returns false if it is not.
//
// Parameters
// buffer : The address of the circular buffer.
//*****************************************************************************
bool circular_buffer_empty(Circular_Buffer *buffer)
{
/* Use the buffer->produce_count and buffer->consume count to determine if
* the circular buffer is empty
*/
if(buffer->produce_count == buffer->consume_count){
return true;
}else{
return false;
}
}
//*****************************************************************************
// Returns true if the circular buffer is full. Returns false if it is not.
//
// Parameters
// buffer : The address of the circular buffer.
//*****************************************************************************
bool circular_buffer_full(Circular_Buffer *buffer)
{
/* Use the buffer->produce_count and buffer->consume count to determine if
* the circular buffer is full
*/
if((buffer->produce_count - buffer->consume_count) == buffer->max_size){
return true;
}else{
return false;
}
}
//*****************************************************************************
// Adds a character to the circular buffer.
//
// Parameters
// buffer : The address of the circular buffer.
// c : Character to add.
//*******************************************************************************
bool circular_buffer_add(Circular_Buffer *buffer, char c)
{
// Use the function defined above to determine if the circular buffer is full
// If the circular buffer is full, return false.
if( circular_buffer_full(buffer) ){
return false;
}
// Add the data to the circular buffer.
(buffer->data)[buffer->produce_count % buffer->max_size] = c;
(buffer->produce_count)++;
// Return true to indicate that the data was added to the
// circular buffer.
return true;
}
//*****************************************************************************
// Removes the oldest character from the circular buffer.
//
// Parameters
// buffer : The address of the circular buffer.
//
// Returns
// The character removed from the circular buffer. If the circular buffer
// is empty, the value of the character returned is set to 0.
//*****************************************************************************
char circular_buffer_remove(Circular_Buffer *buffer)
{
char return_char;
// If the circular buffer is empty, return 0.
// Use the function defined above to determine if the circular buffer is empty
if( circular_buffer_empty(buffer) ){
return 0;
}
// remove the character from the circular buffer
return_char = (buffer->data)[buffer->consume_count % buffer->max_size];
buffer->consume_count++;
// return the character
return return_char;
}