summaryrefslogblamecommitdiffstats
path: root/nserver/src/ringbuffer.h
blob: 154abc3fcef56a87b8dfdac81bccb0a73279cac1 (plain) (tree)




























































                                                                  
#ifndef _RingBuffer_h
#define _RingBuffer_h

#include <bstrlib.h>

typedef struct {
    char *buffer;
    int length;
    int start;
    int end;
} RingBuffer;

RingBuffer *RingBuffer_create(int length);

void RingBuffer_destroy(RingBuffer *buffer);

int RingBuffer_read(RingBuffer *buffer, char *target, int amount);

int RingBuffer_write(RingBuffer *buffer, char *data, int length);

int RingBuffer_empty(RingBuffer *buffer);

int RingBuffer_full(RingBuffer *buffer);

int RingBuffer_available_data(RingBuffer *buffer);

int RingBuffer_available_space(RingBuffer *buffer);

bstring RingBuffer_gets(RingBuffer *buffer, int amount);

#define RingBuffer_available_data(B) (\
        ((B)->end + 1) % (B)->length - (B)->start - 1)

#define RingBuffer_available_space(B) (\
        (B)->length - (B)->end - 1)

#define RingBuffer_full(B) (RingBuffer_available_data((B))\
                            - (B)->length == 0)

#define RingBuffer_empty(B) (\
        RingBuffer_available_data((B)) == 0)

#define RingBuffer_puts(B, D) RingBuffer_write(\
        (B), bdata((D)), blength((D)))

#define RingBuffer_get_all(B) RingBuffer_gets(\
        (B), RingBuffer_available_data((B)))

#define RingBuffer_starts_at(B) (\
        (B)->buffer + (B)->start)

#define RingBuffer_ends_at(B) (\
        (B)->buffer + (B)->end)

#define RingBuffer_commit_read(B,A) (\
        (B)->start = ((B)->start  + (A)) % (B)->length)

#define RingBuffer_commit_write(B, A) (\
    (B)->end  = ((B)->end + (A)) % (B)->length)

#endif