-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbuffer.h
executable file
·149 lines (133 loc) · 3.13 KB
/
buffer.h
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
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
#ifndef BUFFER_H_VelRDAxzvnuFmwEaR0ftrkIinkT
#define BUFFER_H_VelRDAxzvnuFmwEaR0ftrkIinkT
#include <stdbool.h>
#include <unistd.h> // size_t, ssize_t
/**
* buffer.c - buffer con acceso directo (útil para I/O) que mantiene
* mantiene puntero de lectura y de escritura.
*
*
* Para esto se mantienen dos punteros, uno de lectura
* y otro de escritura, y se provee funciones para
* obtener puntero base y capacidad disponibles.
*
* R=0
* ↓
* +---+---+---+---+---+---+
* | | | | | | |
* +---+---+---+---+---+---+
* ↑ ↑
* W=0 limit=6
*
* Invariantes:
* R <= W <= limit
*
* Se quiere escribir en el bufer cuatro bytes.
*
* ptr + 0 <- buffer_write_ptr(b, &wbytes), wbytes=6
* n = read(fd, ptr, wbytes)
* buffer_write_adv(b, n = 4)
*
* R=0
* ↓
* +---+---+---+---+---+---+
* | H | O | L | A | | |
* +---+---+---+---+---+---+
* ↑ ↑
* W=4 limit=6
*
* Quiero leer 3 del buffer
* ptr + 0 <- buffer_read_ptr, wbytes=4
* buffer_read_adv(b, 3);
*
* R=3
* ↓
* +---+---+---+---+---+---+
* | H | O | L | A | | |
* +---+---+---+---+---+---+
* ↑ ↑
* W=4 limit=6
*
* Quiero escribir 2 bytes mas
* ptr + 4 <- buffer_write_ptr(b, &wbytes=2);
* buffer_write_adv(b, 2)
*
* R=3
* ↓
* +---+---+---+---+---+---+
* | H | O | L | A | | M |
* +---+---+---+---+---+---+
* ↑
* limit=6
* W=4
* Compactación a demanda
* R=0
* ↓
* +---+---+---+---+---+---+
* | A | | M | | | |
* +---+---+---+---+---+---+
* ↑ ↑
* W=3 limit=6
*
* Leo los tres bytes, como R == W, se auto compacta.
*
* R=0
* ↓
* +---+---+---+---+---+---+
* | | | | | | |
* +---+---+---+---+---+---+
* ↑ ↑
* W=0 limit=6
*/
typedef struct buffer buffer;
struct buffer {
uint8_t *data;
/** límite superior del buffer. inmutable */
uint8_t *limit;
/** puntero de lectura */
uint8_t *read;
/** puntero de escritura */
uint8_t *write;
};
/**
* inicializa el buffer sin utilizar el heap
*/
void
buffer_init(buffer *b, const size_t n, uint8_t *data);
/**
* Retorna un puntero donde se pueden escribir hasta `*nbytes`.
* Se debe notificar mediante la función `buffer_write_adv'
*/
uint8_t *
buffer_write_ptr(buffer *b, size_t *nbyte);
void
buffer_write_adv(buffer *b, const ssize_t bytes);
uint8_t *
buffer_read_ptr(buffer *b, size_t *nbyte);
void
buffer_read_adv(buffer *b, const ssize_t bytes);
/**
* obtiene un byte
*/
uint8_t
buffer_read(buffer *b);
/** escribe un byte */
void
buffer_write(buffer *b, uint8_t c);
/**
* compacta el buffer
*/
void
buffer_compact(buffer *b);
/**
* Reinicia todos los punteros
*/
void
buffer_reset(buffer *b);
/** retorna true si hay bytes para leer del buffer */
bool
buffer_can_read(buffer *b);
/** retorna true si se pueden escribir bytes en el buffer */
bool
buffer_can_write(buffer *b);
#endif