LINUX.ORG.RU

История изменений

Исправление 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) );
}