lnk commit front code
This commit is contained in:
187
include/oss_sdk/aos_buf.c
Normal file
187
include/oss_sdk/aos_buf.c
Normal file
@@ -0,0 +1,187 @@
|
||||
#include "aos_buf.h"
|
||||
#include "aos_log.h"
|
||||
#include <apr_file_io.h>
|
||||
|
||||
aos_buf_t *aos_create_buf(aos_pool_t *p, int size)
|
||||
{
|
||||
aos_buf_t* b;
|
||||
|
||||
b = aos_palloc(p, sizeof(aos_buf_t) + size);
|
||||
if (b == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
b->pos = (uint8_t *)b + sizeof(aos_buf_t);
|
||||
b->start = b->pos;
|
||||
b->last = b->start;
|
||||
b->end = b->last + size;
|
||||
aos_list_init(&b->node);
|
||||
|
||||
return b;
|
||||
}
|
||||
|
||||
aos_buf_t *aos_buf_pack(aos_pool_t *p, const void *data, int size)
|
||||
{
|
||||
aos_buf_t* b;
|
||||
|
||||
b = aos_palloc(p, sizeof(aos_buf_t));
|
||||
if (b == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
b->pos = (uint8_t *)data;
|
||||
b->start = b->pos;
|
||||
b->last = b->start + size;
|
||||
b->end = b->last;
|
||||
aos_list_init(&b->node);
|
||||
|
||||
return b;
|
||||
}
|
||||
|
||||
int64_t aos_buf_list_len(aos_list_t *list)
|
||||
{
|
||||
aos_buf_t *b;
|
||||
int64_t len = 0;
|
||||
|
||||
aos_list_for_each_entry(aos_buf_t, b, list, node) {
|
||||
len += aos_buf_size(b);
|
||||
}
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
char *aos_buf_list_content(aos_pool_t *p, aos_list_t *list)
|
||||
{
|
||||
int64_t body_len;
|
||||
char *buf;
|
||||
int64_t pos = 0;
|
||||
int64_t size = 0;
|
||||
aos_buf_t *content;
|
||||
|
||||
body_len = aos_buf_list_len(list);
|
||||
buf = aos_pcalloc(p, (size_t)(body_len + 1));
|
||||
buf[body_len] = '\0';
|
||||
aos_list_for_each_entry(aos_buf_t, content, list, node) {
|
||||
size = aos_buf_size(content);
|
||||
memcpy(buf + pos, content->pos, (size_t)(size));
|
||||
pos += size;
|
||||
}
|
||||
return buf;
|
||||
}
|
||||
|
||||
aos_file_buf_t *aos_create_file_buf(aos_pool_t *p)
|
||||
{
|
||||
return (aos_file_buf_t*)aos_pcalloc(p, sizeof(aos_file_buf_t));
|
||||
}
|
||||
|
||||
int aos_open_file_for_read(aos_pool_t *p, const char *path, aos_file_buf_t *fb)
|
||||
{
|
||||
int s;
|
||||
char buf[256];
|
||||
apr_finfo_t finfo;
|
||||
|
||||
if ((s = apr_file_open(&fb->file, path, APR_READ, APR_UREAD | APR_GREAD, p)) != APR_SUCCESS) {
|
||||
aos_error_log("apr_file_open failure, code:%d %s.", s, apr_strerror(s, buf, sizeof(buf)));
|
||||
assert(fb->file == NULL);
|
||||
return AOSE_OPEN_FILE_ERROR;
|
||||
}
|
||||
|
||||
if ((s = apr_file_info_get(&finfo, APR_FINFO_NORM, fb->file)) != APR_SUCCESS) {
|
||||
apr_file_close(fb->file);
|
||||
aos_error_log("apr_file_open failure, code:%d %s.", s, apr_strerror(s, buf, sizeof(buf)));
|
||||
return AOSE_FILE_INFO_ERROR;
|
||||
}
|
||||
fb->file_pos = 0;
|
||||
fb->file_last = finfo.size;
|
||||
fb->owner = 1;
|
||||
|
||||
return AOSE_OK;
|
||||
}
|
||||
|
||||
int aos_open_file_for_all_read(aos_pool_t *p, const char *path, aos_file_buf_t *fb)
|
||||
{
|
||||
return aos_open_file_for_read(p, path, fb);
|
||||
}
|
||||
|
||||
int aos_open_file_for_range_read(aos_pool_t *p, const char *path,
|
||||
int64_t file_pos, int64_t file_last, aos_file_buf_t *fb)
|
||||
{
|
||||
int s;
|
||||
|
||||
s = aos_open_file_for_read(p, path, fb);
|
||||
if (s == AOSE_OK) {
|
||||
if (file_pos > fb->file_pos) {
|
||||
if (file_pos > fb->file_last) {
|
||||
aos_warn_log("read range beyond file size, read start:%" APR_INT64_T_FMT ", file size:%" APR_INT64_T_FMT "\n",
|
||||
file_pos, fb->file_last);
|
||||
file_pos = fb->file_last;
|
||||
}
|
||||
fb->file_pos = file_pos;
|
||||
}
|
||||
if (file_last < fb->file_last) {
|
||||
fb->file_last = file_last;
|
||||
}
|
||||
apr_file_seek(fb->file, APR_SET, (apr_off_t *)&fb->file_pos);
|
||||
}
|
||||
|
||||
return s;
|
||||
}
|
||||
|
||||
int aos_open_file_for_write(aos_pool_t *p, const char *path, aos_file_buf_t *fb)
|
||||
{
|
||||
int s;
|
||||
char buf[256];
|
||||
|
||||
if ((s = apr_file_open(&fb->file, path, APR_CREATE | APR_WRITE | APR_TRUNCATE,
|
||||
APR_UREAD | APR_UWRITE | APR_GREAD, p)) != APR_SUCCESS) {
|
||||
aos_error_log("apr_file_open failure, code:%d %s.", s, apr_strerror(s, buf, sizeof(buf)));
|
||||
assert(fb->file == NULL);
|
||||
return AOSE_OPEN_FILE_ERROR;
|
||||
}
|
||||
fb->owner = 1;
|
||||
|
||||
return AOSE_OK;
|
||||
}
|
||||
|
||||
int aos_open_file_for_write_notrunc(aos_pool_t *p, const char *path, aos_file_buf_t *fb)
|
||||
{
|
||||
int s;
|
||||
char buf[256];
|
||||
|
||||
if ((s = apr_file_open(&fb->file, path, APR_CREATE | APR_WRITE,
|
||||
APR_UREAD | APR_UWRITE | APR_GREAD, p)) != APR_SUCCESS) {
|
||||
aos_error_log("apr_file_open failure, code:%d %s.", s, apr_strerror(s, buf, sizeof(buf)));
|
||||
assert(fb->file == NULL);
|
||||
return AOSE_OPEN_FILE_ERROR;
|
||||
}
|
||||
fb->owner = 1;
|
||||
|
||||
return AOSE_OK;
|
||||
}
|
||||
|
||||
void aos_buf_append_string(aos_pool_t *p, aos_buf_t *b, const char *str, int len)
|
||||
{
|
||||
int size;
|
||||
int nsize;
|
||||
int remain;
|
||||
char *buf;
|
||||
|
||||
if (len <= 0) return;
|
||||
|
||||
remain = b->end - b->last;
|
||||
|
||||
if (remain > len + 128) {
|
||||
memcpy(b->last, str, len);
|
||||
b->last += len;
|
||||
} else {
|
||||
size = aos_buf_size(b);
|
||||
nsize = (size + len) * 2;
|
||||
buf = aos_palloc(p, nsize);
|
||||
memcpy(buf, b->pos, size);
|
||||
memcpy(buf+size, str, len);
|
||||
b->start = (uint8_t *)buf;
|
||||
b->end = (uint8_t *)buf + nsize;
|
||||
b->pos = (uint8_t *)buf;
|
||||
b->last = (uint8_t *)buf + size + len;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user