mb_ds_util.h
changeset 15 cadd89d14ca5
parent 13 6f6451e78531
child 16 4f584251c73d
equal deleted inserted replaced
14:5b6407edfe8e 15:cadd89d14ca5
    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 }