equal
deleted
inserted
replaced
95 u8 *data; |
95 u8 *data; |
96 int data_size; /* size of the *data buffer */ |
96 int data_size; /* size of the *data buffer */ |
97 int data_start; /* offset within *data were valid data starts */ |
97 int data_start; /* offset within *data were valid data starts */ |
98 int data_end; /* offset within *data were valid data ends */ |
98 int data_end; /* offset within *data were valid data ends */ |
99 int max_data_start; /* optimization parameter! When should it be normalised? */ |
99 int max_data_start; /* optimization parameter! When should it be normalised? */ |
|
100 int marked_for_purge; /* Number of bytes to be deleted in next call to lb_data_purge() */ |
100 } lb_buf_t; |
101 } lb_buf_t; |
101 |
102 |
102 /* NOTE: lb = Linear Buffer */ |
103 /* NOTE: lb = Linear Buffer */ |
103 |
104 |
104 static inline u8 *lb_init(lb_buf_t *buf, int size, int max_data_start) { |
105 static inline u8 *lb_init(lb_buf_t *buf, int size, int max_data_start) { |
109 max_data_start = size - 1; |
110 max_data_start = size - 1; |
110 |
111 |
111 buf->data_size = size; |
112 buf->data_size = size; |
112 buf->data_start = 0; |
113 buf->data_start = 0; |
113 buf->data_end = 0; |
114 buf->data_end = 0; |
|
115 buf->marked_for_purge = 0; |
114 buf->max_data_start = max_data_start; |
116 buf->max_data_start = max_data_start; |
115 buf->data = (u8 *)malloc(size); |
117 buf->data = (u8 *)malloc(size); |
116 return buf->data; |
118 return buf->data; |
117 } |
119 } |
118 |
120 |
141 static inline void lb_data_add(lb_buf_t *buf, int count) { |
143 static inline void lb_data_add(lb_buf_t *buf, int count) { |
142 if ((buf->data_end += count) >= buf->data_size) |
144 if ((buf->data_end += count) >= buf->data_size) |
143 buf->data_end = buf->data_size - 1; |
145 buf->data_end = buf->data_size - 1; |
144 } |
146 } |
145 |
147 |
|
148 static inline void lb_data_mark_for_purge(lb_buf_t *buf, int count) { |
|
149 buf->marked_for_purge += count; |
|
150 } |
|
151 |
146 static inline u8 *lb_data_purge(lb_buf_t *buf, int count) { |
152 static inline u8 *lb_data_purge(lb_buf_t *buf, int count) { |
147 buf->data_start += count; |
153 buf->data_start += count + buf->marked_for_purge; |
|
154 buf->marked_for_purge = 0; |
148 if (buf->data_start > buf->data_end) |
155 if (buf->data_start > buf->data_end) |
149 buf->data_start = buf->data_end; |
156 buf->data_start = buf->data_end; |
150 |
157 |
151 if ((buf->data_end == buf->data_size) || (buf->data_start >= buf->max_data_start)) |
158 if ((buf->data_end == buf->data_size) || (buf->data_start >= buf->max_data_start)) |
152 return lb_normalize(buf); |
159 return lb_normalize(buf); |
154 return buf->data + buf->data_start; |
161 return buf->data + buf->data_start; |
155 } |
162 } |
156 |
163 |
157 static inline void lb_data_purge_all(lb_buf_t *buf) { |
164 static inline void lb_data_purge_all(lb_buf_t *buf) { |
158 buf->data_start = buf->data_end = 0; |
165 buf->data_start = buf->data_end = 0; |
|
166 buf->marked_for_purge = 0; |
159 } |
167 } |
160 |
168 |
161 static inline u8 *lb_free(lb_buf_t *buf) { |
169 static inline u8 *lb_free(lb_buf_t *buf) { |
162 return buf->data + buf->data_end; |
170 return buf->data + buf->data_end; |
163 } |
171 } |