Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ac_buffer_builder.c Source File

ac_buffer_builder.c

00001 /*
00002  * Copyright (c) 2017, ARM Limited, All Rights Reserved
00003  * SPDX-License-Identifier: Apache-2.0
00004  *
00005  * Licensed under the Apache License, Version 2.0 (the "License"); you may
00006  * not use this file except in compliance with the License.
00007  * You may obtain a copy of the License at
00008  *
00009  * http://www.apache.org/licenses/LICENSE-2.0
00010  *
00011  * Unless required by applicable law or agreed to in writing, software
00012  * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
00013  * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00014  * See the License for the specific language governing permissions and
00015  * limitations under the License.
00016  */
00017 /**
00018  * \file buffer_builder.c
00019  * \copyright Copyright (c) ARM Ltd 2015
00020  * \author Donatien Garnier
00021  */
00022 
00023 #include "acore/ac_buffer_builder.h"
00024 #include "acore/ac_buffer_reader.h"
00025 #include "acore/ac_macros.h"
00026 
00027 #include "string.h"
00028 
00029 #define VOID
00030 #define ENSURE_WRITE_LENGTH(pBuilder, n) do{ if( ac_buffer_builder_space(pBuilder) < n ) { return; } }while(0);
00031 
00032 void ac_buffer_builder_init(ac_buffer_builder_t *pBuilder, uint8_t *data, size_t size)
00033 {
00034     pBuilder->data = data;
00035     pBuilder->size = size;
00036     ac_buffer_init(&pBuilder->ac_buffer, data, 0);
00037 }
00038 
00039 void ac_buffer_builder_from_buffer(ac_buffer_builder_t *pBuilder)
00040 {
00041     pBuilder->data = (uint8_t *)pBuilder->ac_buffer.data;
00042     pBuilder->size = pBuilder->ac_buffer.size;
00043     pBuilder->ac_buffer.size = 0;
00044 }
00045 
00046 void ac_buffer_builder_reset(ac_buffer_builder_t *pBuilder)
00047 {
00048     ac_buffer_init(&pBuilder->ac_buffer, pBuilder->data, 0);
00049 }
00050 
00051 void ac_buffer_builder_set_full(ac_buffer_builder_t *pBuilder)
00052 {
00053     ac_buffer_init(&pBuilder->ac_buffer, pBuilder->data, pBuilder->size);
00054 }
00055 
00056 void ac_buffer_builder_write_be(ac_buffer_builder_t *pBuilder, const uint8_t *buf, size_t size)
00057 {
00058     ENSURE_WRITE_LENGTH(pBuilder, size);
00059     buf += size;
00060     while (size > 0) {
00061         buf--;
00062         *ac_buffer_builder_write_position(pBuilder) = *buf;
00063         pBuilder->ac_buffer.size++;
00064         size--;
00065     }
00066 }
00067 
00068 void ac_buffer_builder_write_le(ac_buffer_builder_t *pBuilder, const uint8_t *buf, size_t size)
00069 {
00070     ENSURE_WRITE_LENGTH(pBuilder, size);
00071     memcpy(ac_buffer_builder_write_position(pBuilder), buf, size);
00072     pBuilder->ac_buffer.size += size;
00073 }
00074 
00075 void ac_buffer_builder_write_be_at(ac_buffer_builder_t *pBuilder, size_t pos, const uint8_t *buf, size_t size)
00076 {
00077     size_t currentPos = pBuilder->ac_buffer.size;
00078     pBuilder->ac_buffer.size = pos;
00079     ac_buffer_builder_write_be(pBuilder, buf, size);
00080     pBuilder->ac_buffer.size = currentPos;
00081 }
00082 
00083 void ac_buffer_builder_write_le_at(ac_buffer_builder_t *pBuilder, size_t pos, const uint8_t *buf, size_t size)
00084 {
00085     size_t currentPos = pBuilder->ac_buffer.size;
00086     pBuilder->ac_buffer.size = pos;
00087     ac_buffer_builder_write_le(pBuilder, buf, size);
00088     pBuilder->ac_buffer.size = currentPos;
00089 }
00090 
00091 void ac_buffer_builder_write_n_skip(ac_buffer_builder_t *pBuilder, size_t size)
00092 {
00093     ENSURE_WRITE_LENGTH(pBuilder, size);
00094     pBuilder->ac_buffer.size += size;
00095 }
00096 
00097 void ac_buffer_builder_copy_n_bytes(ac_buffer_builder_t *pBuilderOut, ac_buffer_t *pBufIn, size_t size)
00098 {
00099     ENSURE_WRITE_LENGTH(pBuilderOut, size);
00100     if (ac_buffer_reader_readable(pBufIn) < size) {
00101         return;
00102     }
00103     while (size > 0) {
00104         size_t cpy = ac_buffer_reader_current_buffer_length(pBufIn);
00105         cpy = MIN(cpy, size);
00106         ac_buffer_builder_write_n_bytes(pBuilderOut, ac_buffer_reader_current_buffer_pointer(pBufIn), cpy);
00107         ac_buffer_read_n_skip(pBufIn, cpy);
00108         size -= cpy;
00109     }
00110 }
00111 
00112 void ac_buffer_builder_compact(ac_buffer_builder_t *pBuilder)
00113 {
00114     memmove(pBuilder->data, ac_buffer_data(&pBuilder->ac_buffer), ac_buffer_size(&pBuilder->ac_buffer));
00115     pBuilder->ac_buffer.data = pBuilder->data;
00116 }