#include <iostream>
using namespace std;
#include <stdio.h>
#include <stdlib.h>
struct buffer
{
int begin, end, size;
char *buf;
};
typedef struct buffer buffer;
buffer* create_buffer(int size)
{
buffer *b = calloc(1, sizeof(*b));
b->begin = b->end = 0;
b->size = size;
b->buf = calloc(size, sizeof(b->buf[0]));
return b;
}
int write_buffer(buffer *b, void *data, int size)
{
char *d = (char *)data;
int i;
for (i = 0; i < size && b->begin != (b->end + 1) % b->size; ++i)
{
b->buf[b->end] = d[i];
b->end = (b->end + 1) % b->size;
}
return i;
}
int read_buffer(buffer *b, void *data, int size)
{
char *d = (char *)data;
int i;
for (i = 0; i < size && b->begin != b->end; ++i)
{
d[i] = b->buf[b->begin];
b->begin = (b->begin + 1) % b->size;
}
return i;
}
int main(void)
{
buffer* b = create_buffer(100);
for (int i = 0; i < 10; ++i)
write_buffer(b, &i, sizeof(i));
long long p;
while (read_buffer(b, &p, sizeof(p)) == sizeof(p))
{
printf("%d ", (int)p);
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4Kc3RydWN0IGJ1ZmZlcgp7CiAgICBpbnQgYmVnaW4sIGVuZCwgc2l6ZTsKICAgIGNoYXIgKmJ1ZjsKfTsKdHlwZWRlZiBzdHJ1Y3QgYnVmZmVyIGJ1ZmZlcjsKYnVmZmVyKiBjcmVhdGVfYnVmZmVyKGludCBzaXplKQp7CiAgICBidWZmZXIgKmIgPSBjYWxsb2MoMSwgc2l6ZW9mKCpiKSk7CiAgICBiLT5iZWdpbiA9IGItPmVuZCA9IDA7CiAgICBiLT5zaXplID0gc2l6ZTsKICAgIGItPmJ1ZiA9IGNhbGxvYyhzaXplLCBzaXplb2YoYi0+YnVmWzBdKSk7CiAgICByZXR1cm4gYjsKfQppbnQgd3JpdGVfYnVmZmVyKGJ1ZmZlciAqYiwgdm9pZCAqZGF0YSwgaW50IHNpemUpCnsKICAgIGNoYXIgKmQgPSAoY2hhciAqKWRhdGE7CiAgICBpbnQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCBzaXplICYmIGItPmJlZ2luICE9IChiLT5lbmQgKyAxKSAlIGItPnNpemU7ICsraSkKICAgIHsKICAgICAgICBiLT5idWZbYi0+ZW5kXSA9IGRbaV07CiAgICAgICAgYi0+ZW5kID0gKGItPmVuZCArIDEpICUgYi0+c2l6ZTsKICAgIH0KICAgIHJldHVybiBpOwp9CmludCByZWFkX2J1ZmZlcihidWZmZXIgKmIsIHZvaWQgKmRhdGEsIGludCBzaXplKQp7CiAgICBjaGFyICpkID0gKGNoYXIgKilkYXRhOwogICAgaW50IGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZSAmJiBiLT5iZWdpbiAhPSBiLT5lbmQ7ICsraSkKICAgIHsKICAgICAgICBkW2ldID0gYi0+YnVmW2ItPmJlZ2luXTsKICAgICAgICBiLT5iZWdpbiA9IChiLT5iZWdpbiArIDEpICUgYi0+c2l6ZTsKICAgIH0KICAgIHJldHVybiBpOwp9CmludCBtYWluKHZvaWQpCnsKICAgIGJ1ZmZlciogYiA9IGNyZWF0ZV9idWZmZXIoMTAwKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkKICAgICAgICB3cml0ZV9idWZmZXIoYiwgJmksIHNpemVvZihpKSk7CiAgICBsb25nIGxvbmcgcDsKICAgIHdoaWxlIChyZWFkX2J1ZmZlcihiLCAmcCwgc2l6ZW9mKHApKSA9PSBzaXplb2YocCkpCiAgICB7CiAgICAgICAgcHJpbnRmKCIlZCAiLCAoaW50KXApOyAgCiAgICB9CiAgICByZXR1cm4gMDsKfQ==
prog.cpp: In function ‘buffer* create_buffer(int)’:
prog.cpp:14:23: error: invalid conversion from ‘void*’ to ‘buffer*’ [-fpermissive]
buffer *b = calloc(1, sizeof(*b));
~~~~~~^~~~~~~~~~~~~~~
prog.cpp:17:20: error: invalid conversion from ‘void*’ to ‘char*’ [-fpermissive]
b->buf = calloc(size, sizeof(b->buf[0]));
~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~