/* * Copyright (c) 2017, ARM Limited, All Rights Reserved * SPDX-License-Identifier: Apache-2.0 * * Licensed under the Apache License, Version 2.0 (the "License"); you may * not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * \file buffer.c * \copyright Copyright (c) ARM Ltd 2013 * \author Donatien Garnier * \desc Module to ease ac_buffers' management */ #include "string.h" #include "acore/buffer.h" #include "acore/buffer_reader.h" #include "acore/macros.h" #include "acore/debug.h" void ac_buffer_init(ac_buffer_t* pBuf, const uint8_t* data, size_t size) { pBuf->data = data; pBuf->size = size; pBuf->pNext = NULL; } void ac_buffer_dup(ac_buffer_t* pBuf, const ac_buffer_t* pBufIn) { if(pBuf != pBufIn) { memcpy(pBuf, pBufIn, sizeof(ac_buffer_t)); } } void ac_buffer_append(ac_buffer_t* pBuf, ac_buffer_t* pAppBuf) { while(pBuf->pNext != NULL) { pBuf = pBuf->pNext; } pBuf->pNext = pAppBuf; } void ac_buffer_split(ac_buffer_t* pStartBuf, ac_buffer_t* pEndBuf, ac_buffer_t* pBuf, size_t length) { ac_buffer_dup(pStartBuf, pBuf); ac_buffer_dup(pEndBuf, pBuf); ac_buffer_read_n_skip(pEndBuf, length); while( length > ac_buffer_size(pStartBuf) ) { length -= pStartBuf->size; pStartBuf = pStartBuf->pNext; } pStartBuf->size = length; pStartBuf->pNext = NULL; } /** Dump a ac_buffer's content to stdout (useful for debugging) * \param pBuf pointer to ac_buffer_t structure */ void ac_buffer_dump(ac_buffer_t* pBuf) { #if !defined(NDEBUG) ACORE_STDIO_LOCK(); while(pBuf != NULL) { size_t r = ac_buffer_size(pBuf); size_t i = 0; size_t j = 0; while(i < r) { for(j = i; j < MIN(i + 16, r); j++) { ACORE_STDIO_PRINT("%02x ", ac_buffer_data(pBuf)[j]); } ACORE_STDIO_PRINT("\r\n"); i = j; } pBuf = ac_buffer_next(pBuf); if(pBuf != NULL) { ACORE_STDIO_PRINT("->\r\n"); } } ACORE_STDIO_UNLOCK(); #else (void)pBuf; #endif }