/*
* リングバッファ(FIFO)を表現するCソース
* これは文字列(char)用。
*
* @author fenrir (M.Naruoka)
* @since 04/05/30
* @version 1.0
*/
#include <stdio.h>
#include <common.h>
#include "fifo_char.h"
/**
* リングバッファを初期化します。
*
* @param buffer 初期化するリングバッファ
* @param c 実際にバッファとして機能する領域
* @param size 実際のバッファサイズ、cの大きさ
* @return (fifo_char_t) 初期化されたリングバッファ
*/
fifo_char_t *fifo_char_init(fifo_char_t *buffer, char *c, fifo_char_size_t size){
if(size > 0){
buffer->buffer = c;
buffer->size = size;
buffer->prius = buffer->buffer;
buffer->follower = buffer->buffer + size -1;
return buffer;
}else{return NULL;}
}
/**
* リングバッファにデータを書き込みます。
*
* @param buffer 書き込む対象リングバッファ
* @param data 書き込むデータ
* @param size 書き込むデータのサイズ(byte)
* @return int 正常に書き込まれたデータのサイズ(byte)
*/
fifo_char_size_t fifo_char_write(fifo_char_t *buffer, char *data, fifo_char_size_t size){
fifo_char_size_t _size = 0;
if(data != NULL){
/* バッファに書き込み */
while(_size < size){
if(buffer->prius == buffer->buffer + buffer->size){buffer->prius = buffer->buffer;}
if(buffer->prius == buffer->follower){break;}
*((buffer->prius)++) = *(data + (_size++));
}
}
return _size;
}
/**
* リングバッファからデータを読み取ります。
*
* @param buffer 読み込み元となるリングバッファ
* @param c 読み取ったデータを格納するバッファ
* @param size 最大読み込みサイズ(byte)
* @return int 読み取ったデータの大きさ(byte)
*/
fifo_char_size_t fifo_char_read(fifo_char_t *buffer, char *c, fifo_char_size_t size){
fifo_char_size_t _size = 0;
if(c != NULL){
/* 読込先に書き込み */
while(_size < size){
if((buffer->follower + 1 -buffer->prius) % buffer->size == 0){break;}
if(++buffer->follower == buffer->buffer + buffer->size){buffer->follower = buffer->buffer;}
*(c + (_size++)) = *(buffer->follower);
}
}
return _size;
}
/**
* リングバッファ上にあるデータサイズを求めます。
*
* @param buffer リングバッファ
* @return int バッファ上のデータの大きさ(byte)
*/
fifo_char_size_t fifo_char_size(fifo_char_t *buffer){
return (buffer->prius > buffer->follower ?
buffer->prius -buffer->follower -1:
buffer->prius + buffer->size -buffer->follower -1);
}