История изменений
Исправление Stanson, (текущая версия) :
Не надо никаких списков и malloc’ов
#define LEN 5 /* размер fifo */
#define TYPE int /* тип данных в fifo */
typedef struct {
TYPE d[LEN]; /* буфер для данных */
int ii; /* индекс "входа" */
int io; /* индекс "выхода" */
int cnt; /* количество значений */
int err; /* ошибка: переполнение, пустой буфер или неверный индекс */
} cbuf
/* запихать v на "вход" буфера a */
static inline void cbuf_put( cbuf * a, TYPE v )
{
if( a->cnt >= LEN )
{ /* буфер переполнен */
a->err = 1;
return;
}
a->d[a->ii] = v;
a->ii = ( a->ii + 1 ) % LEN;
a->cnt++;
a->err = 0;
}
/* прочитать значение с "выхода" буфера а */
static inline TYPE cbuf_get( cbuf * a )
{
if( a->cnt <= 0 )
{ /* буфер пуст */
a->err = 1;
return 0;
}
TYPE ret = a->d[a->io];
a->io = ( a->io + 1 ) % LEN;
a->cnt--
a->err = 0;
return ret;
}
/* прочитать i-тое значение от "входа" */
static inline TYPE cbuf_idx( cbuf * a, int i )
{
if( i < 0 || i >= a->cnt )
{
a->err = 1;
return 0;
}
a->err = 0;
i = a->ii - i + LEN;
return a->d[i % LEN];
}
/* инициализировать буфер */
static inline void cbuf_init( cbuf * a )
{
memset( a, 0, sizeof( cbuf) );
}
Исправление Stanson, :
Не надо никаких списков и malloc’ов
#define LEN 5 /* размер fifo */
#define TYPE int /* тип данных в fifo */
typedef struct {
TYPE d[LEN]; /* буфер для данных */
int ii; /* индекс "входа" */
int io; /* индекс "выхода" */
int cnt; /* количество значений */
int err; /* ошибка: переполнение, пустой буфер или неверный индекс */
} cbuf
/* запихать v на "вход" буфера a */
static inline void cbuf_put( cbuf * a, TYPE v )
{
if( a->cnt >= LEN )
{ /* буфер переполнен */
a->err = 1;
return;
}
a->d[a->ii] = v;
a->ii = ( a->ii + 1 ) % LEN;
a->cnt++;
a->err = 0;
}
/* прочитать значение с "выхода" буфера а */
static inline TYPE cbuf_get( cbuf * a )
{
if( a->cnt <= 0 )
{ /* буфер пуст */
a->err = 1;
return 0;
}
TYPE ret = a->d[a->io];
a->io = ( a->io + 1 ) % LEN;
a->cnt--
a->err = 0;
return ret;
}
/* прочитать i-тое значение от "входа" */
static inline TYPE cbuf_idx( cbuf * a, int i )
{
if( i < 0 || i >= a->cnt )
{
a->err = 1;
return 0;
}
a->err = 0;
i = a->ii - i + LEN;
return a->d[i];
}
/* инициализировать буфер */
static inline void cbuf_init( cbuf * a )
{
memset( a, 0, sizeof( cbuf) );
}
Исправление Stanson, :
Не надо никаких списков и malloc’ов
#define LEN 5 /* размер fifo */
#define TYPE int /* тип данных в fifo */
typedef struct {
TYPE d[LEN]; /* буфер для данных */
int ii; /* индекс "входа" */
int io; /* индекс "выхода" */
int cnt; /* количество значений */
int err; /* ошибка: переполнение, пустой буфер или неверный индекс */
} cbuf
/* запихать v на "вход" буфера a */
static inline void cbuf_put( cbuf * a, TYPE v )
{
if( a->cnt >= LEN )
{ /* буфер переполнен */
a->err = 1;
return;
}
a->d[a->ii] = v;
a->ii = ( a->ii + 1 ) % LEN;
a->cnt++;
a->err = 0;
}
/* прочитать значение с "выхода" буфера а */
static inline TYPE cbuf_get( cbuf * a )
{
if( a->cnt <= 0 )
{ /* буфер пуст */
a->err = 1;
return 0;
}
TYPE ret = a->d[a->io];
a->io = ( a->io + 1 ) % LEN;
a->cnt--
a->err = 0;
return ret;
}
/* прочитать i-тое значение от "входа" */
static inline TYPE cbuf_idx( cbuf * a, int i )
{
if( i < 0 || i >= a->cnt )
{
a->err = 1;
return 0;
}
a->err = 0;
i = a->ii - i;
if( i < 0 ) i += LEN;
return a->d[i];
}
/* инициализировать буфер */
static inline void cbuf_init( cbuf * a )
{
memset( a, 0, sizeof( cbuf) );
}
Исправление Stanson, :
Не надо никаких списков и malloc’ов
#define LEN 5 /* размер fifo */
#define TYPE int /* тип данных в fifo */
typedef struct {
TYPE d[LEN]; /* буфер для данных */
int ii; /* индекс "входа" */
int io; /* индекс "выхода" */
int cnt; /* количество значений */
int err; /* ошибка: переполнение, пустой буфер или неверный индекс */
} cbuf
/* запихать v на "вход" буфера a */
static inline void cbuf_put( cbuf * a, TYPE v )
{
if( a->cnt >= LEN )
{ /* буфер переполнен */
a->err = 1;
return;
}
a->d[a->ii] = v;
a->ii = ( a->ii + 1 ) % LEN;
a->cnt++;
a->err = 0;
}
/* прочитать значение с "выхода" буфера а */
static inline TYPE cbuf_get( cbuf * a )
{
if( a->cnt <= 0 )
{ /* буфер пуст */
a->err = 1;
return 0;
}
TYPE ret = a->d[a->io];
a->io = ( a->io + 1 ) % LEN;
a->cnt--
a->err = 0;
return ret;
}
/* прочитать i-тое значение от "входа" */
static inline TYPE cbuf_idx( cbuf * a, int i )
{
if( i < 0 || i >= a->cnt )
{
a->err = 1;
return 0;
}
a->err = 0;
i = a->ii - i;
if( i < 0 ) i += LEN;
return a->d[i % LEN];
}
/* инициализировать буфер */
static inline void cbuf_init( cbuf * a )
{
memset( a, 0, sizeof( cbuf) );
}
Исправление Stanson, :
Не надо никаких списков и malloc’ов
#define LEN 5 /* размер fifo */
#define TYPE int /* тип данных в fifo */
typedef struct {
TYPE d[LEN]; /* буфер для данных */
int ii; /* индекс "входа" */
int io; /* индекс "выхода" */
int cnt; /* количество значений */
int err; /* ошибка: переполнение, пустой буфер или неверный индекс */
} cbuf
/* запихать v на "вход" буфера a */
static inline void cbuf_put( cbuf * a, TYPE v )
{
if( a->cnt >= LEN )
{ /* буфер переполнен */
a->err = 1;
return;
}
a->d[a->ii] = v;
a->ii = ( a->ii + 1 ) % LEN;
a->cnt++;
a->err = 0;
}
/* прочитать значение с "выхода" буфера а */
static inline TYPE cbuf_get( cbuf * a )
{
if( a->cnt <= 0 )
{ /* буфер пуст */
a->err = 1;
return 0;
}
TYPE ret = a->d[a->io];
a->io = ( a->io + 1 ) % LEN;
a->cnt--
a->err = 0;
return ret;
}
/* прочитать i-тое значение от "входа" */
static inline TYPE cbuf_idx( cbuf * a, int i )
{
if( i < 0 || i >= a->cnt )
{
a->err = 1;
return 0;
}
a->err = 0;
return a->d[( a->ii - i ) % LEN];
}
/* инициализировать буфер */
static inline void cbuf_init( cbuf * a )
{
memset( a, 0, sizeof( cbuf) );
}
Исправление Stanson, :
Не надо никаких списков и malloc’ов
#define LEN 5
typedef struct {
int d[LEN]; /* буфер для данных */
int ii; /* индекс "входа" */
int io; /* индекс "выхода" */
int cnt; /* количество значений */
int err; /* ошибка: переполнение, пустой буфер или неверный индекс */
} cbuf
/* запихать v на "вход" буфера a */
static inline void cbuf_put( cbuf * a, int v )
{
if( a->cnt >= LEN )
{ /* буфер переполнен */
a->err = 1;
return;
}
a->d[a->ii] = v;
a->ii = ( a->ii + 1 ) % LEN;
a->cnt++;
a->err = 0;
}
/* прочитать значение с "выхода" буфера а */
static inline int cbuf_get( cbuf * a )
{
if( a->cnt <= 0 )
{ /* буфер пуст */
a->err = 1;
return 0;
}
int ret = a->d[a->io];
a->io = ( a->io + 1 ) % LEN;
a->cnt--
a->err = 0;
return ret;
}
/* прочитать i-тое значение от "входа" */
static inline int cbuf_idx( cbuf * a, int i )
{
if( i < 0 || i >= a->cnt )
{
a->err = 1;
return 0;
}
a->err = 0;
return a->d[( a->ii - i ) % LEN];
}
/* инициализировать буфер */
static inline void cbuf_init( cbuf * a )
{
memset( a, 0, sizeof( cbuf) );
}
Исходная версия Stanson, :
Не надо никаких списков и malloc’ов
#define LEN 5
typedef struct {
int d[LEN]; /* буфер для данных */
int ii; /* индекс "входа" */
int io; /* индекс "выхода" */
int cnt; /* количество значений */
int err; /* ошибка: переполнение, пустой буфер или неверный индекс */
} cbuf
/* запихать v на "вход" буфера a */
static inline void cbuf_put( cbuf * a, int v )
{
if( a->cnt >= LEN )
{ /* буфер переполнен */
a->err = 1;
return;
}
a->d[a->ii] = v;
a->ii = ( a->ii + 1 ) % LEN;
a->cnt++;
a->err = 0;
}
/* прочитать значение с "выхода" буфера а */
static inline int cbuf_get( cbuf * a )
{
if( a->cnt <= 0 )
{ /* буфер пуст */
a->err = 1;
return 0;
}
int ret = a->d[a->io];
a->io = ( a->io + 1 ) % LEN;
a->cnt--
a->err = 0;
return ret;
}
/* прочитать i-тое значение от "входа" */
static inline int cbuf_idx( cbuf * a, int i )
{
if( i < 0 || i >= a->cnt )
{
a->err = 1;
return 0;
}
a->err = 0;
return a->d[( a->ii + i ) % LEN];
}
/* инициализировать буфер */
static inline void cbuf_init( cbuf * a )
{
memset( a, 0, sizeof( cbuf) );
}