kfifo.c
来自「LInux BootLoader的说明文档」· C语言 代码 · 共 85 行
C
85 行
#include "kfifo.h"
#include <errno.h>
#include <unistd.h>
#include <stdlib.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size)
{
struct kfifo *fifo;
fifo = malloc(sizeof(struct kfifo));
if (!fifo)
return (void*)(-ENOMEM);
fifo->buffer = buffer;
fifo->size = size;
fifo->in = fifo->out = 0;
return fifo;
}
struct kfifo *kfifo_alloc(unsigned int size)
{
unsigned char *buffer;
struct kfifo *ret;
if (size & (size - 1)) {
fprintf(stderr,"size > 0x80000000\n");
size = roundup_pow_of_two(size);
}
buffer = malloc(size);
if (!buffer)
return (void *)(-ENOMEM);
ret = kfifo_init(buffer, size);
if ((unsigned long)ret<=0)
{
free(buffer);
}
return ret;
}
void kfifo_free(struct kfifo *fifo)
{
free(fifo->buffer);
free(fifo);
}
unsigned int __kfifo_put(struct kfifo *fifo, unsigned char *buffer, unsigned int len)
{
unsigned int l;
len = min(len, fifo->size - fifo->in + fifo->out);
l = min(len, fifo->size - (fifo->in & (fifo->size - 1)));
memcpy(fifo->buffer + (fifo->in & (fifo->size - 1)), buffer, l);
memcpy(fifo->buffer, buffer + l, len - l);
fifo->in += len;
return len;
}
unsigned int __kfifo_get(struct kfifo *fifo,
unsigned char *buffer, unsigned int len)
{
unsigned int l;
len = min(len, fifo->in - fifo->out);
l = min(len, fifo->size - (fifo->out & (fifo->size - 1)));
memcpy(buffer, fifo->buffer + (fifo->out & (fifo->size - 1)), l);
fifo->out += len;
return len;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?