change some parameters in the library to meet the needs of the website httpbin.org
Fork of MiniTLS-GPL by
core/buffer.c@5:95f70ebfe61f, 2015-02-06 (annotated)
- Committer:
- shiyilei
- Date:
- Fri Feb 06 06:17:33 2015 +0000
- Revision:
- 5:95f70ebfe61f
- Parent:
- 3:eb324ffffd2b
change some parameters in the library to meet the needs of httpbin.org
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MiniTLS | 3:eb324ffffd2b | 1 | /* |
MiniTLS | 3:eb324ffffd2b | 2 | MiniTLS - A super trimmed down TLS/SSL Library for embedded devices |
MiniTLS | 3:eb324ffffd2b | 3 | Author: Donatien Garnier |
MiniTLS | 3:eb324ffffd2b | 4 | Copyright (C) 2013-2014 AppNearMe Ltd |
MiniTLS | 3:eb324ffffd2b | 5 | |
MiniTLS | 3:eb324ffffd2b | 6 | This program is free software; you can redistribute it and/or |
MiniTLS | 3:eb324ffffd2b | 7 | modify it under the terms of the GNU General Public License |
MiniTLS | 3:eb324ffffd2b | 8 | as published by the Free Software Foundation; either version 2 |
MiniTLS | 3:eb324ffffd2b | 9 | of the License, or (at your option) any later version. |
MiniTLS | 3:eb324ffffd2b | 10 | |
MiniTLS | 3:eb324ffffd2b | 11 | This program is distributed in the hope that it will be useful, |
MiniTLS | 3:eb324ffffd2b | 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
MiniTLS | 3:eb324ffffd2b | 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
MiniTLS | 3:eb324ffffd2b | 14 | GNU General Public License for more details. |
MiniTLS | 3:eb324ffffd2b | 15 | |
MiniTLS | 3:eb324ffffd2b | 16 | You should have received a copy of the GNU General Public License |
MiniTLS | 3:eb324ffffd2b | 17 | along with this program; if not, write to the Free Software |
MiniTLS | 3:eb324ffffd2b | 18 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
MiniTLS | 3:eb324ffffd2b | 19 | *//** |
MiniTLS | 3:eb324ffffd2b | 20 | * \file buffer.c |
MiniTLS | 3:eb324ffffd2b | 21 | * \copyright Copyright (c) AppNearMe Ltd 2013 |
MiniTLS | 3:eb324ffffd2b | 22 | * \author Donatien Garnier |
MiniTLS | 3:eb324ffffd2b | 23 | * \desc Module to ease buffers' management |
MiniTLS | 3:eb324ffffd2b | 24 | */ |
MiniTLS | 3:eb324ffffd2b | 25 | |
MiniTLS | 3:eb324ffffd2b | 26 | /** \addtogroup Core |
MiniTLS | 3:eb324ffffd2b | 27 | * @{ |
MiniTLS | 3:eb324ffffd2b | 28 | * \name Buffers |
MiniTLS | 3:eb324ffffd2b | 29 | * @{ |
MiniTLS | 3:eb324ffffd2b | 30 | */ |
MiniTLS | 3:eb324ffffd2b | 31 | |
MiniTLS | 3:eb324ffffd2b | 32 | #include "core/fwk.h" |
MiniTLS | 3:eb324ffffd2b | 33 | #include "buffer.h" |
MiniTLS | 3:eb324ffffd2b | 34 | |
MiniTLS | 3:eb324ffffd2b | 35 | /** Initialize buffer using underlying byte array, set buffer's length to 0 (empty) |
MiniTLS | 3:eb324ffffd2b | 36 | * \param pBuf pointer to buffer_t structure to initialize |
MiniTLS | 3:eb324ffffd2b | 37 | * \param bufdata byte array to use |
MiniTLS | 3:eb324ffffd2b | 38 | * \param size size of byte array |
MiniTLS | 3:eb324ffffd2b | 39 | */ |
MiniTLS | 3:eb324ffffd2b | 40 | void buffer_init(buffer_t* pBuf, uint8_t* bufdata, size_t size) |
MiniTLS | 3:eb324ffffd2b | 41 | { |
MiniTLS | 3:eb324ffffd2b | 42 | pBuf->bufdata = (uint8_t*) bufdata; |
MiniTLS | 3:eb324ffffd2b | 43 | pBuf->size = size; |
MiniTLS | 3:eb324ffffd2b | 44 | |
MiniTLS | 3:eb324ffffd2b | 45 | pBuf->start = pBuf->bufdata; |
MiniTLS | 3:eb324ffffd2b | 46 | pBuf->first_byte_length = 0; |
MiniTLS | 3:eb324ffffd2b | 47 | |
MiniTLS | 3:eb324ffffd2b | 48 | pBuf->end = pBuf->start; |
MiniTLS | 3:eb324ffffd2b | 49 | pBuf->last_byte_length = 8; //In bits |
MiniTLS | 3:eb324ffffd2b | 50 | |
MiniTLS | 3:eb324ffffd2b | 51 | pBuf->next = NULL; |
MiniTLS | 3:eb324ffffd2b | 52 | } |
MiniTLS | 3:eb324ffffd2b | 53 | |
MiniTLS | 3:eb324ffffd2b | 54 | /** Initialize buffer using underlying byte array, set buffer's length to array's size (full) |
MiniTLS | 3:eb324ffffd2b | 55 | * \param pBuf pointer to buffer_t structure to initialize |
MiniTLS | 3:eb324ffffd2b | 56 | * \param bufdata byte array to use |
MiniTLS | 3:eb324ffffd2b | 57 | * \param size size of byte array |
MiniTLS | 3:eb324ffffd2b | 58 | */ |
MiniTLS | 3:eb324ffffd2b | 59 | void buffer_byref(buffer_t* pBuf, uint8_t* bufdata, size_t length) //New buffer_t by ref on a size_t array, no malloc (useful on PIC for instance) |
MiniTLS | 3:eb324ffffd2b | 60 | { |
MiniTLS | 3:eb324ffffd2b | 61 | buffer_init(pBuf, bufdata, length); |
MiniTLS | 3:eb324ffffd2b | 62 | buffer_set_length(pBuf, length); |
MiniTLS | 3:eb324ffffd2b | 63 | } |
MiniTLS | 3:eb324ffffd2b | 64 | |
MiniTLS | 3:eb324ffffd2b | 65 | #ifdef USE_MALLOC |
MiniTLS | 3:eb324ffffd2b | 66 | buffer_t* buffer_new(size_t size) //malloc |
MiniTLS | 3:eb324ffffd2b | 67 | { |
MiniTLS | 3:eb324ffffd2b | 68 | buffer_t* pBuf = (buffer_t*) malloc(sizeof(buffer_t)); |
MiniTLS | 3:eb324ffffd2b | 69 | buffer_init(pBuf, (uint8_t*) malloc(size), size); |
MiniTLS | 3:eb324ffffd2b | 70 | return pBuf; |
MiniTLS | 3:eb324ffffd2b | 71 | } |
MiniTLS | 3:eb324ffffd2b | 72 | #endif |
MiniTLS | 3:eb324ffffd2b | 73 | |
MiniTLS | 3:eb324ffffd2b | 74 | /** Get buffer's underlying byte array |
MiniTLS | 3:eb324ffffd2b | 75 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 76 | * \return underlying array |
MiniTLS | 3:eb324ffffd2b | 77 | */ |
MiniTLS | 3:eb324ffffd2b | 78 | uint8_t* buffer_data(buffer_t* pBuf) |
MiniTLS | 3:eb324ffffd2b | 79 | { |
MiniTLS | 3:eb324ffffd2b | 80 | return pBuf->bufdata; |
MiniTLS | 3:eb324ffffd2b | 81 | } |
MiniTLS | 3:eb324ffffd2b | 82 | |
MiniTLS | 3:eb324ffffd2b | 83 | /** Reset buffer (empty) |
MiniTLS | 3:eb324ffffd2b | 84 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 85 | */ |
MiniTLS | 3:eb324ffffd2b | 86 | void buffer_reset(buffer_t* pBuf) |
MiniTLS | 3:eb324ffffd2b | 87 | { |
MiniTLS | 3:eb324ffffd2b | 88 | buffer_init(pBuf, pBuf->bufdata, pBuf->size); |
MiniTLS | 3:eb324ffffd2b | 89 | } |
MiniTLS | 3:eb324ffffd2b | 90 | |
MiniTLS | 3:eb324ffffd2b | 91 | /** Get buffer's size |
MiniTLS | 3:eb324ffffd2b | 92 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 93 | * \return buffer's size |
MiniTLS | 3:eb324ffffd2b | 94 | */ |
MiniTLS | 3:eb324ffffd2b | 95 | size_t buffer_size(buffer_t* pBuf) |
MiniTLS | 3:eb324ffffd2b | 96 | { |
MiniTLS | 3:eb324ffffd2b | 97 | return pBuf->size; |
MiniTLS | 3:eb324ffffd2b | 98 | } |
MiniTLS | 3:eb324ffffd2b | 99 | |
MiniTLS | 3:eb324ffffd2b | 100 | /** Get buffer's length |
MiniTLS | 3:eb324ffffd2b | 101 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 102 | * \return number of valid bytes in buffer |
MiniTLS | 3:eb324ffffd2b | 103 | */ |
MiniTLS | 3:eb324ffffd2b | 104 | size_t buffer_length(buffer_t* pBuf) |
MiniTLS | 3:eb324ffffd2b | 105 | { |
MiniTLS | 3:eb324ffffd2b | 106 | return (pBuf->end - pBuf->start); |
MiniTLS | 3:eb324ffffd2b | 107 | } |
MiniTLS | 3:eb324ffffd2b | 108 | |
MiniTLS | 3:eb324ffffd2b | 109 | /** Get space in buffer |
MiniTLS | 3:eb324ffffd2b | 110 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 111 | * \return number of free bytes in buffer |
MiniTLS | 3:eb324ffffd2b | 112 | */ |
MiniTLS | 3:eb324ffffd2b | 113 | size_t buffer_space(buffer_t* pBuf) |
MiniTLS | 3:eb324ffffd2b | 114 | { |
MiniTLS | 3:eb324ffffd2b | 115 | return pBuf->bufdata + pBuf->size - pBuf->end; |
MiniTLS | 3:eb324ffffd2b | 116 | } |
MiniTLS | 3:eb324ffffd2b | 117 | |
MiniTLS | 3:eb324ffffd2b | 118 | /** Is buffer empty |
MiniTLS | 3:eb324ffffd2b | 119 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 120 | * \return true if buffer is empty |
MiniTLS | 3:eb324ffffd2b | 121 | */ |
MiniTLS | 3:eb324ffffd2b | 122 | bool buffer_empty(buffer_t* pBuf) |
MiniTLS | 3:eb324ffffd2b | 123 | { |
MiniTLS | 3:eb324ffffd2b | 124 | return !buffer_length(pBuf); |
MiniTLS | 3:eb324ffffd2b | 125 | } |
MiniTLS | 3:eb324ffffd2b | 126 | |
MiniTLS | 3:eb324ffffd2b | 127 | /** Set buffer's length |
MiniTLS | 3:eb324ffffd2b | 128 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 129 | * \param length number of valid bytes in buffer |
MiniTLS | 3:eb324ffffd2b | 130 | */ |
MiniTLS | 3:eb324ffffd2b | 131 | void buffer_set_length(buffer_t* pBuf, size_t length) |
MiniTLS | 3:eb324ffffd2b | 132 | { |
MiniTLS | 3:eb324ffffd2b | 133 | pBuf->end = pBuf->start + length; |
MiniTLS | 3:eb324ffffd2b | 134 | pBuf->first_byte_length = 0; |
MiniTLS | 3:eb324ffffd2b | 135 | pBuf->last_byte_length = 8; |
MiniTLS | 3:eb324ffffd2b | 136 | } |
MiniTLS | 3:eb324ffffd2b | 137 | |
MiniTLS | 3:eb324ffffd2b | 138 | /** Get buffer's last byte's length |
MiniTLS | 3:eb324ffffd2b | 139 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 140 | * \return number of valid bits in buffer's last byte |
MiniTLS | 3:eb324ffffd2b | 141 | */ |
MiniTLS | 3:eb324ffffd2b | 142 | size_t buffer_last_byte_length(buffer_t* pBuf) |
MiniTLS | 3:eb324ffffd2b | 143 | { |
MiniTLS | 3:eb324ffffd2b | 144 | return pBuf->last_byte_length; |
MiniTLS | 3:eb324ffffd2b | 145 | } |
MiniTLS | 3:eb324ffffd2b | 146 | |
MiniTLS | 3:eb324ffffd2b | 147 | /** Set buffer's last byte's length |
MiniTLS | 3:eb324ffffd2b | 148 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 149 | * \param length number of valid bits in buffer's last byte |
MiniTLS | 3:eb324ffffd2b | 150 | */ |
MiniTLS | 3:eb324ffffd2b | 151 | void buffer_set_last_byte_length(buffer_t* pBuf, size_t length) |
MiniTLS | 3:eb324ffffd2b | 152 | { |
MiniTLS | 3:eb324ffffd2b | 153 | pBuf->last_byte_length = length; |
MiniTLS | 3:eb324ffffd2b | 154 | } |
MiniTLS | 3:eb324ffffd2b | 155 | |
MiniTLS | 3:eb324ffffd2b | 156 | /** Get buffer's bits count |
MiniTLS | 3:eb324ffffd2b | 157 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 158 | * \return total number of valid bits in buffer |
MiniTLS | 3:eb324ffffd2b | 159 | */ |
MiniTLS | 3:eb324ffffd2b | 160 | size_t buffer_bits_count(buffer_t* pBuf) |
MiniTLS | 3:eb324ffffd2b | 161 | { |
MiniTLS | 3:eb324ffffd2b | 162 | size_t length; |
MiniTLS | 3:eb324ffffd2b | 163 | length = buffer_length(pBuf); |
MiniTLS | 3:eb324ffffd2b | 164 | if(length == 0) |
MiniTLS | 3:eb324ffffd2b | 165 | { |
MiniTLS | 3:eb324ffffd2b | 166 | return 0; |
MiniTLS | 3:eb324ffffd2b | 167 | } |
MiniTLS | 3:eb324ffffd2b | 168 | else if(length == 1) |
MiniTLS | 3:eb324ffffd2b | 169 | { |
MiniTLS | 3:eb324ffffd2b | 170 | return pBuf->first_byte_length; |
MiniTLS | 3:eb324ffffd2b | 171 | } |
MiniTLS | 3:eb324ffffd2b | 172 | else // > 2 |
MiniTLS | 3:eb324ffffd2b | 173 | { |
MiniTLS | 3:eb324ffffd2b | 174 | return pBuf->first_byte_length + 8*(length - 2) + pBuf->last_byte_length; |
MiniTLS | 3:eb324ffffd2b | 175 | } |
MiniTLS | 3:eb324ffffd2b | 176 | } |
MiniTLS | 3:eb324ffffd2b | 177 | |
MiniTLS | 3:eb324ffffd2b | 178 | /** Write one byte to buffer |
MiniTLS | 3:eb324ffffd2b | 179 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 180 | * \param b byte to append |
MiniTLS | 3:eb324ffffd2b | 181 | */ |
MiniTLS | 3:eb324ffffd2b | 182 | void buffer_write_byte(buffer_t* pBuf, uint8_t b) |
MiniTLS | 3:eb324ffffd2b | 183 | { |
MiniTLS | 3:eb324ffffd2b | 184 | size_t i; |
MiniTLS | 3:eb324ffffd2b | 185 | if(pBuf->end >= pBuf->start + pBuf->size) //buffer_t full |
MiniTLS | 3:eb324ffffd2b | 186 | return; |
MiniTLS | 3:eb324ffffd2b | 187 | if(pBuf->last_byte_length == 8) |
MiniTLS | 3:eb324ffffd2b | 188 | { |
MiniTLS | 3:eb324ffffd2b | 189 | *(pBuf->end) = b; |
MiniTLS | 3:eb324ffffd2b | 190 | pBuf->end++; |
MiniTLS | 3:eb324ffffd2b | 191 | } |
MiniTLS | 3:eb324ffffd2b | 192 | else |
MiniTLS | 3:eb324ffffd2b | 193 | { |
MiniTLS | 3:eb324ffffd2b | 194 | for(i = 0; i < 8; i++) |
MiniTLS | 3:eb324ffffd2b | 195 | { |
MiniTLS | 3:eb324ffffd2b | 196 | buffer_write_bit(pBuf, (b>>i)&1); |
MiniTLS | 3:eb324ffffd2b | 197 | } |
MiniTLS | 3:eb324ffffd2b | 198 | } |
MiniTLS | 3:eb324ffffd2b | 199 | |
MiniTLS | 3:eb324ffffd2b | 200 | } |
MiniTLS | 3:eb324ffffd2b | 201 | |
MiniTLS | 3:eb324ffffd2b | 202 | /** Write one bit to buffer |
MiniTLS | 3:eb324ffffd2b | 203 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 204 | * \param b bit to append |
MiniTLS | 3:eb324ffffd2b | 205 | */ |
MiniTLS | 3:eb324ffffd2b | 206 | void buffer_write_bit(buffer_t* pBuf, uint8_t b) |
MiniTLS | 3:eb324ffffd2b | 207 | { |
MiniTLS | 3:eb324ffffd2b | 208 | if(pBuf->end >= pBuf->start + pBuf->size) |
MiniTLS | 3:eb324ffffd2b | 209 | return; |
MiniTLS | 3:eb324ffffd2b | 210 | if(pBuf->last_byte_length == 8) |
MiniTLS | 3:eb324ffffd2b | 211 | { |
MiniTLS | 3:eb324ffffd2b | 212 | if( (pBuf->end + 1) >= pBuf->start + pBuf->size) |
MiniTLS | 3:eb324ffffd2b | 213 | return; |
MiniTLS | 3:eb324ffffd2b | 214 | pBuf->end++; |
MiniTLS | 3:eb324ffffd2b | 215 | pBuf->last_byte_length = 0; |
MiniTLS | 3:eb324ffffd2b | 216 | *(pBuf->end) = 0; |
MiniTLS | 3:eb324ffffd2b | 217 | } |
MiniTLS | 3:eb324ffffd2b | 218 | *(pBuf->end) = (*(pBuf->end) << pBuf->last_byte_length) | (b & 1); |
MiniTLS | 3:eb324ffffd2b | 219 | pBuf->last_byte_length++; |
MiniTLS | 3:eb324ffffd2b | 220 | } |
MiniTLS | 3:eb324ffffd2b | 221 | |
MiniTLS | 3:eb324ffffd2b | 222 | /** Get next buffer in chain |
MiniTLS | 3:eb324ffffd2b | 223 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 224 | * \return pointer to next buffer |
MiniTLS | 3:eb324ffffd2b | 225 | */ |
MiniTLS | 3:eb324ffffd2b | 226 | buffer_t* buffer_next(buffer_t* pBuf) |
MiniTLS | 3:eb324ffffd2b | 227 | { |
MiniTLS | 3:eb324ffffd2b | 228 | return pBuf->next; |
MiniTLS | 3:eb324ffffd2b | 229 | } |
MiniTLS | 3:eb324ffffd2b | 230 | |
MiniTLS | 3:eb324ffffd2b | 231 | /** Set next buffer in chain |
MiniTLS | 3:eb324ffffd2b | 232 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 233 | * \param pNextBuf pointer to next buffer (or NULL to break chain) |
MiniTLS | 3:eb324ffffd2b | 234 | */ |
MiniTLS | 3:eb324ffffd2b | 235 | void buffer_set_next(buffer_t* pBuf, buffer_t* pNextBuf) |
MiniTLS | 3:eb324ffffd2b | 236 | { |
MiniTLS | 3:eb324ffffd2b | 237 | pBuf->next = (buffer_t*) pNextBuf; |
MiniTLS | 3:eb324ffffd2b | 238 | } |
MiniTLS | 3:eb324ffffd2b | 239 | |
MiniTLS | 3:eb324ffffd2b | 240 | /** Append next buffer to the whole chain |
MiniTLS | 3:eb324ffffd2b | 241 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 242 | * \param pAppBuf pointer to buffer to append |
MiniTLS | 3:eb324ffffd2b | 243 | */ |
MiniTLS | 3:eb324ffffd2b | 244 | void buffer_append(buffer_t* pBuf, buffer_t* pAppBuf) |
MiniTLS | 3:eb324ffffd2b | 245 | { |
MiniTLS | 3:eb324ffffd2b | 246 | buffer_t* p; |
MiniTLS | 3:eb324ffffd2b | 247 | p = (buffer_t*) pBuf; |
MiniTLS | 3:eb324ffffd2b | 248 | while( p->next ) |
MiniTLS | 3:eb324ffffd2b | 249 | { |
MiniTLS | 3:eb324ffffd2b | 250 | p = p->next; |
MiniTLS | 3:eb324ffffd2b | 251 | } |
MiniTLS | 3:eb324ffffd2b | 252 | p->next = pAppBuf; |
MiniTLS | 3:eb324ffffd2b | 253 | } |
MiniTLS | 3:eb324ffffd2b | 254 | |
MiniTLS | 3:eb324ffffd2b | 255 | /** Split chain at specified buffer |
MiniTLS | 3:eb324ffffd2b | 256 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 257 | * \param pLinkedBuf pointer to buffer from which to split the chain |
MiniTLS | 3:eb324ffffd2b | 258 | */ |
MiniTLS | 3:eb324ffffd2b | 259 | void buffer_unlink(buffer_t* pBuf, buffer_t* pLinkedBuf) |
MiniTLS | 3:eb324ffffd2b | 260 | { |
MiniTLS | 3:eb324ffffd2b | 261 | buffer_t* p; |
MiniTLS | 3:eb324ffffd2b | 262 | p = (buffer_t*) pBuf; |
MiniTLS | 3:eb324ffffd2b | 263 | while( p->next && (p->next != pLinkedBuf) ) |
MiniTLS | 3:eb324ffffd2b | 264 | { |
MiniTLS | 3:eb324ffffd2b | 265 | p = p->next; |
MiniTLS | 3:eb324ffffd2b | 266 | } |
MiniTLS | 3:eb324ffffd2b | 267 | p->next = NULL; |
MiniTLS | 3:eb324ffffd2b | 268 | } |
MiniTLS | 3:eb324ffffd2b | 269 | |
MiniTLS | 3:eb324ffffd2b | 270 | /** Get buffer chain's total size |
MiniTLS | 3:eb324ffffd2b | 271 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 272 | * \return sum of each buffer's size |
MiniTLS | 3:eb324ffffd2b | 273 | */ |
MiniTLS | 3:eb324ffffd2b | 274 | size_t buffer_total_size(buffer_t* pBuf) |
MiniTLS | 3:eb324ffffd2b | 275 | { |
MiniTLS | 3:eb324ffffd2b | 276 | size_t size; |
MiniTLS | 3:eb324ffffd2b | 277 | buffer_t* p; |
MiniTLS | 3:eb324ffffd2b | 278 | size = 0; |
MiniTLS | 3:eb324ffffd2b | 279 | p = (buffer_t*) pBuf; |
MiniTLS | 3:eb324ffffd2b | 280 | do |
MiniTLS | 3:eb324ffffd2b | 281 | { |
MiniTLS | 3:eb324ffffd2b | 282 | size += buffer_size(p); |
MiniTLS | 3:eb324ffffd2b | 283 | } while( (p = p->next) != NULL ); |
MiniTLS | 3:eb324ffffd2b | 284 | return size; |
MiniTLS | 3:eb324ffffd2b | 285 | } |
MiniTLS | 3:eb324ffffd2b | 286 | |
MiniTLS | 3:eb324ffffd2b | 287 | /** Get buffer chain's total length |
MiniTLS | 3:eb324ffffd2b | 288 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 289 | * \return number of valid bytes in the whole chain |
MiniTLS | 3:eb324ffffd2b | 290 | */ |
MiniTLS | 3:eb324ffffd2b | 291 | size_t buffer_total_length(buffer_t* pBuf) |
MiniTLS | 3:eb324ffffd2b | 292 | { |
MiniTLS | 3:eb324ffffd2b | 293 | size_t len; |
MiniTLS | 3:eb324ffffd2b | 294 | buffer_t* p; |
MiniTLS | 3:eb324ffffd2b | 295 | len = 0; |
MiniTLS | 3:eb324ffffd2b | 296 | p = pBuf; |
MiniTLS | 3:eb324ffffd2b | 297 | do |
MiniTLS | 3:eb324ffffd2b | 298 | { |
MiniTLS | 3:eb324ffffd2b | 299 | len += buffer_length(p); |
MiniTLS | 3:eb324ffffd2b | 300 | } while( (p = p->next) != NULL ); |
MiniTLS | 3:eb324ffffd2b | 301 | return len; |
MiniTLS | 3:eb324ffffd2b | 302 | } |
MiniTLS | 3:eb324ffffd2b | 303 | |
MiniTLS | 3:eb324ffffd2b | 304 | /** Set buffer chain's total length (fill up one buffer and move to the next if needed) |
MiniTLS | 3:eb324ffffd2b | 305 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 306 | * \param length total length |
MiniTLS | 3:eb324ffffd2b | 307 | */ |
MiniTLS | 3:eb324ffffd2b | 308 | void buffer_set_total_length(buffer_t* pBuf, size_t length) |
MiniTLS | 3:eb324ffffd2b | 309 | { |
MiniTLS | 3:eb324ffffd2b | 310 | size_t remaining_len; |
MiniTLS | 3:eb324ffffd2b | 311 | buffer_t* p; |
MiniTLS | 3:eb324ffffd2b | 312 | remaining_len = length; |
MiniTLS | 3:eb324ffffd2b | 313 | p = pBuf; |
MiniTLS | 3:eb324ffffd2b | 314 | do |
MiniTLS | 3:eb324ffffd2b | 315 | { |
MiniTLS | 3:eb324ffffd2b | 316 | buffer_set_length(p, MIN(p->size,remaining_len)); |
MiniTLS | 3:eb324ffffd2b | 317 | remaining_len -= MIN(p->size,remaining_len); |
MiniTLS | 3:eb324ffffd2b | 318 | } while( (p = p->next) != NULL ); |
MiniTLS | 3:eb324ffffd2b | 319 | } |
MiniTLS | 3:eb324ffffd2b | 320 | |
MiniTLS | 3:eb324ffffd2b | 321 | #if 0 |
MiniTLS | 3:eb324ffffd2b | 322 | size_t buffer_read_byte(buffer_t* pBuf, uint8_t b) |
MiniTLS | 3:eb324ffffd2b | 323 | { |
MiniTLS | 3:eb324ffffd2b | 324 | |
MiniTLS | 3:eb324ffffd2b | 325 | } |
MiniTLS | 3:eb324ffffd2b | 326 | |
MiniTLS | 3:eb324ffffd2b | 327 | size_t buffer_read_bit(buffer_t* pBuf, uint8_t b) |
MiniTLS | 3:eb324ffffd2b | 328 | { |
MiniTLS | 3:eb324ffffd2b | 329 | |
MiniTLS | 3:eb324ffffd2b | 330 | } |
MiniTLS | 3:eb324ffffd2b | 331 | #endif |
MiniTLS | 3:eb324ffffd2b | 332 | |
MiniTLS | 3:eb324ffffd2b | 333 | #ifdef USE_MALLOC |
MiniTLS | 3:eb324ffffd2b | 334 | void buffer_free(buffer_t* pBuf) |
MiniTLS | 3:eb324ffffd2b | 335 | { |
MiniTLS | 3:eb324ffffd2b | 336 | free(pBuf->bufdata); |
MiniTLS | 3:eb324ffffd2b | 337 | free(pBuf); |
MiniTLS | 3:eb324ffffd2b | 338 | } |
MiniTLS | 3:eb324ffffd2b | 339 | #endif |
MiniTLS | 3:eb324ffffd2b | 340 | |
MiniTLS | 3:eb324ffffd2b | 341 | /** Dump a buffer's content to stdout (useful for debugging) |
MiniTLS | 3:eb324ffffd2b | 342 | * \param pBuf pointer to buffer_t structure |
MiniTLS | 3:eb324ffffd2b | 343 | */ |
MiniTLS | 3:eb324ffffd2b | 344 | void buffer_dump(buffer_t* pBuf) |
MiniTLS | 3:eb324ffffd2b | 345 | { |
MiniTLS | 3:eb324ffffd2b | 346 | size_t len; |
MiniTLS | 3:eb324ffffd2b | 347 | buffer_t* p; |
MiniTLS | 3:eb324ffffd2b | 348 | uint8_t* bufdata; |
MiniTLS | 3:eb324ffffd2b | 349 | int i; |
MiniTLS | 3:eb324ffffd2b | 350 | int j; |
MiniTLS | 3:eb324ffffd2b | 351 | p = (buffer_t*) pBuf; |
MiniTLS | 3:eb324ffffd2b | 352 | debugx_enter(); |
MiniTLS | 3:eb324ffffd2b | 353 | do |
MiniTLS | 3:eb324ffffd2b | 354 | { |
MiniTLS | 3:eb324ffffd2b | 355 | len = buffer_length(p); |
MiniTLS | 3:eb324ffffd2b | 356 | bufdata = p->start; |
MiniTLS | 3:eb324ffffd2b | 357 | i = 0; |
MiniTLS | 3:eb324ffffd2b | 358 | while(i < len) |
MiniTLS | 3:eb324ffffd2b | 359 | { |
MiniTLS | 3:eb324ffffd2b | 360 | for(j = i; j < MIN(len, i + 16); j++) |
MiniTLS | 3:eb324ffffd2b | 361 | { |
MiniTLS | 3:eb324ffffd2b | 362 | debugx("%02x ", bufdata[j]); |
MiniTLS | 3:eb324ffffd2b | 363 | } |
MiniTLS | 3:eb324ffffd2b | 364 | debugx("\r\n"); |
MiniTLS | 3:eb324ffffd2b | 365 | i = j; |
MiniTLS | 3:eb324ffffd2b | 366 | } |
MiniTLS | 3:eb324ffffd2b | 367 | if(p->next) |
MiniTLS | 3:eb324ffffd2b | 368 | { |
MiniTLS | 3:eb324ffffd2b | 369 | debugx("->\r\n"); |
MiniTLS | 3:eb324ffffd2b | 370 | } |
MiniTLS | 3:eb324ffffd2b | 371 | } while( (p = p->next) != NULL ); |
MiniTLS | 3:eb324ffffd2b | 372 | debugx_leave(); |
MiniTLS | 3:eb324ffffd2b | 373 | } |
MiniTLS | 3:eb324ffffd2b | 374 | |
MiniTLS | 3:eb324ffffd2b | 375 | /** |
MiniTLS | 3:eb324ffffd2b | 376 | * @} |
MiniTLS | 3:eb324ffffd2b | 377 | * @} |
MiniTLS | 3:eb324ffffd2b | 378 | * */ |