⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 buffer.c

📁 这是基于C语言开发的分布式搜索源代码
💻 C
字号:
#include "buffer.h"/* Initialize buffer */BUFFER *buffer_init(){	BUFFER *buf = (BUFFER *)calloc(1, sizeof(BUFFER));	if(buf)        {                buf->recalloc   = buf_recalloc;                buf->remalloc   = buf_remalloc;                buf->push       = buf_push;                buf->del        = buf_del;                buf->reset      = buf_reset;                buf->clean      = buf_clean;		pthread_mutex_init(&(buf->mutex), NULL);	        }	return buf;}/* calloc memory at end of buffer */void* buf_calloc(BUFFER *buf, size_t size){	void *ret  = NULL;		if(buf)	{		pthread_mutex_lock(&(buf->mutex));		if(buf->data)		{			buf->data = realloc(buf->data, buf->size + size);			}		else		{			buf->data = calloc(1, size);		}		if(buf->data)		{			ret = ((char *)buf->data) + buf->size;			memset(ret, 0, size);			buf->size += size;			buf->end = (char *)(buf->data) + buf->size;		}		else		{			buf->size = 0;                        buf->data = NULL;			buf->end = NULL;		}		pthread_mutex_unlock(&(buf->mutex));	}	return 	ret;}/* malloc memory at end of buffer */void* buf_malloc(BUFFER *buf, size_t size){	void *ret = NULL;	if(buf)        {                pthread_mutex_lock(&(buf->mutex));                if(buf->data)                {                        buf->data = realloc(buf->data, buf->size + size);                 }                else                {                        buf->data = malloc(size);                } 		if(buf->data)                {			ret = ((char *)buf->data) + buf->size;                        buf->size += size;                        buf->end = (char *)(buf->data) + buf->size;                }                else                {                        buf->size = 0;                        buf->data = NULL;                        buf->end = NULL;                }                pthread_mutex_unlock(&(buf->mutex));        }        return  ret;	}/* recalloc memory */void* buf_recalloc(BUFFER *buf, size_t size){	void *ret  = NULL;		if(buf)	{		pthread_mutex_lock(&(buf->mutex));		if(buf->data)		{			buf->data = realloc(buf->data, size);				if(buf->data) memset(buf->data, 0, size);		}		else		{			buf->data = calloc(1, size);		}		if(buf->data)		{			buf->size = size;			buf->end = (char *)(buf->data) + size;			ret = buf->data;		}		else		{			buf->size = 0;                        buf->data = NULL;			buf->end = NULL;		}		pthread_mutex_unlock(&(buf->mutex));	}	return 	ret;}/* remalloc memory */void* buf_remalloc(BUFFER *buf, size_t size){	void *ret = NULL;	if(buf)        {                pthread_mutex_lock(&(buf->mutex));                if(buf->data)                {                        buf->data = realloc(buf->data, size);                 }                else                {                        buf->data = malloc(size);                } 		if(buf->data)                {                        buf->size = size;                        buf->end = (char *)(buf->data) + size;                        ret = buf->data;                }                else                {                        buf->size = 0;                        buf->data = NULL;                        buf->end = NULL;                }                pthread_mutex_unlock(&(buf->mutex));        }        return  ret;	}/* push data to buffer tail */int  buf_push(BUFFER *buf, void *data, size_t size){	char *p = NULL;	int ret = -1;	if(buf)	{		pthread_mutex_lock(&(buf->mutex));		buf->data = realloc(buf->data, (buf->size + size));		buf->size += size;		buf->end  =  buf->data + buf->size;		if(buf->end && memcpy(((char *)(buf->end) - size), data, size) != NULL )		{			ret = 0;		}		pthread_mutex_unlock(&(buf->mutex));	}	return ret;}/* delete data from buffer head */int buf_del(BUFFER *buf, size_t size){	int ret = -1;	if(buf)	{                pthread_mutex_lock(&(buf->mutex));			if(buf->data)		{			if(buf->size > size )			{				if(memmove(buf->data, (char *)(buf->data) + size,					 buf->size - size) == buf->data)				{					buf->data =  realloc(buf->data, (buf->size - size));					buf->size -= size;					buf->end  =  buf->data + buf->size;					ret = 0;				}								else				{					ret = -1;				}			}			else			{				if(buf->data) free(buf->data);				buf->data = NULL;				buf->size = 0;				buf->end = NULL;			}		}                pthread_mutex_unlock(&(buf->mutex));	}	return ret;}/* reset buffer */void buf_reset(BUFFER *buf){	if(buf)	{                       		pthread_mutex_lock(&(buf->mutex));		if(buf->data) free(buf->data);		buf->data = NULL;		buf->size = 0;		buf->end = NULL;		pthread_mutex_unlock(&(buf->mutex));	}}/* clean and free */void buf_clean(BUFFER **buf){	if((*buf))	{		pthread_mutex_destroy(&((*buf)->mutex));		if((*buf)->data) free((*buf)->data);			free((*buf));		(*buf) = NULL;		}			}#ifdef _DEBUG_BUFFERint main(){	BUFFER *buf = NULL;	char *s = "dsfadfdsffd";		int n = 0;	buf = buffer_init();		if(buf)	{		BUFFER_VIEW(buf);		fprintf(stdout, "buf->push\n");		buf->push(buf, s, strlen(s) + 1);			fprintf(stdout, "data:%s\n", buf->data);			BUFFER_VIEW(buf);		fprintf(stdout, "buf->remalloc\n");		buf->remalloc(buf, 1024);			BUFFER_VIEW(buf);		sprintf((char *)buf->data, "akdladsjfkldjflkdfkdjflkdsfjsdk");		fprintf(stdout, "data:%s\n", buf->data);			fprintf(stdout, "buf->recalloc\n");		buf->recalloc(buf, 1024);			sprintf((char *)buf->data, "test", 4);		fprintf(stdout, "data:%s\n", buf->data);			BUFFER_VIEW(buf);		n = buf->del(buf, 2);			fprintf(stdout, "buf->del(buf, 2) = %d\n", n);		fprintf(stdout, "data:%s\n", buf->data);			BUFFER_VIEW(buf);		fprintf(stdout, "buf->reset(buf)\n");		buf->reset(buf);		fprintf(stdout, "data:%s\n", buf->data);			BUFFER_VIEW(buf);		fprintf(stdout, "buf->clean(buf, 2)\n");		buf->clean(&buf);		//BUFFER_VIEW(buf);	}}#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -