WIP. send a large constant string twice a second, in order to test out the transport with something indicative of our required load.

Dependencies:   FXOS8700CQ NTPClient azure_umqtt_c iothub_mqtt_transport mbed-rtos mbed wolfSSL Socket lwip-eth lwip-sys lwip

Fork of FXOS8700CQ_To_Azure_IoT by Mark Radbourne

Committer:
julianhigginson
Date:
Thu Jan 05 23:40:24 2017 +0000
Revision:
7:0d1a0fe537dc
Parent:
3:c0556ff7b8e3
modified dummy message for minimal data transport

Who changed what in which revision?

UserRevisionLine numberNew contents of line
markrad 3:c0556ff7b8e3 1 // Copyright (c) Microsoft. All rights reserved.
markrad 3:c0556ff7b8e3 2 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
markrad 3:c0556ff7b8e3 3
markrad 3:c0556ff7b8e3 4 //
markrad 3:c0556ff7b8e3 5 // PUT NO INCLUDES BEFORE HERE
markrad 3:c0556ff7b8e3 6 //
markrad 3:c0556ff7b8e3 7 #include <stdlib.h>
markrad 3:c0556ff7b8e3 8 #ifdef _CRTDBG_MAP_ALLOC
markrad 3:c0556ff7b8e3 9 #include <crtdbg.h>
markrad 3:c0556ff7b8e3 10 #endif
markrad 3:c0556ff7b8e3 11 #include "azure_c_shared_utility/gballoc.h"
markrad 3:c0556ff7b8e3 12
markrad 3:c0556ff7b8e3 13 #include <stddef.h>
markrad 3:c0556ff7b8e3 14 #include <string.h>
markrad 3:c0556ff7b8e3 15 //
markrad 3:c0556ff7b8e3 16 // PUT NO CLIENT LIBRARY INCLUDES BEFORE HERE
markrad 3:c0556ff7b8e3 17 //
markrad 3:c0556ff7b8e3 18
markrad 3:c0556ff7b8e3 19 #include "azure_c_shared_utility/buffer_.h"
markrad 3:c0556ff7b8e3 20 #include "azure_c_shared_utility/xlogging.h"
markrad 3:c0556ff7b8e3 21
markrad 3:c0556ff7b8e3 22 typedef struct BUFFER_TAG
markrad 3:c0556ff7b8e3 23 {
markrad 3:c0556ff7b8e3 24 unsigned char* buffer;
markrad 3:c0556ff7b8e3 25 size_t size;
markrad 3:c0556ff7b8e3 26 }BUFFER;
markrad 3:c0556ff7b8e3 27
markrad 3:c0556ff7b8e3 28 /* Codes_SRS_BUFFER_07_001: [BUFFER_new shall allocate a BUFFER_HANDLE that will contain a NULL unsigned char*.] */
markrad 3:c0556ff7b8e3 29 BUFFER_HANDLE BUFFER_new(void)
markrad 3:c0556ff7b8e3 30 {
markrad 3:c0556ff7b8e3 31 BUFFER* temp = (BUFFER*)malloc(sizeof(BUFFER));
markrad 3:c0556ff7b8e3 32 /* Codes_SRS_BUFFER_07_002: [BUFFER_new shall return NULL on any error that occurs.] */
markrad 3:c0556ff7b8e3 33 if (temp != NULL)
markrad 3:c0556ff7b8e3 34 {
markrad 3:c0556ff7b8e3 35 temp->buffer = NULL;
markrad 3:c0556ff7b8e3 36 temp->size = 0;
markrad 3:c0556ff7b8e3 37 }
markrad 3:c0556ff7b8e3 38 return (BUFFER_HANDLE)temp;
markrad 3:c0556ff7b8e3 39 }
markrad 3:c0556ff7b8e3 40
markrad 3:c0556ff7b8e3 41 static int BUFFER_safemalloc(BUFFER* handleptr, size_t size)
markrad 3:c0556ff7b8e3 42 {
markrad 3:c0556ff7b8e3 43 int result;
markrad 3:c0556ff7b8e3 44 size_t sizetomalloc = size;
markrad 3:c0556ff7b8e3 45 if (size == 0)
markrad 3:c0556ff7b8e3 46 {
markrad 3:c0556ff7b8e3 47 sizetomalloc = 1;
markrad 3:c0556ff7b8e3 48 }
markrad 3:c0556ff7b8e3 49 handleptr->buffer = (unsigned char*)malloc(sizetomalloc);
markrad 3:c0556ff7b8e3 50 if (handleptr->buffer == NULL)
markrad 3:c0556ff7b8e3 51 {
markrad 3:c0556ff7b8e3 52 /*Codes_SRS_BUFFER_02_003: [If allocating memory fails, then BUFFER_create shall return NULL.]*/
markrad 3:c0556ff7b8e3 53 result = __LINE__;
markrad 3:c0556ff7b8e3 54 }
markrad 3:c0556ff7b8e3 55 else
markrad 3:c0556ff7b8e3 56 {
markrad 3:c0556ff7b8e3 57 // we still consider the real buffer size is 0
markrad 3:c0556ff7b8e3 58 handleptr->size = size;
markrad 3:c0556ff7b8e3 59 result = 0;
markrad 3:c0556ff7b8e3 60 }
markrad 3:c0556ff7b8e3 61 return result;
markrad 3:c0556ff7b8e3 62 }
markrad 3:c0556ff7b8e3 63
markrad 3:c0556ff7b8e3 64 BUFFER_HANDLE BUFFER_create(const unsigned char* source, size_t size)
markrad 3:c0556ff7b8e3 65 {
markrad 3:c0556ff7b8e3 66 BUFFER* result;
markrad 3:c0556ff7b8e3 67 /*Codes_SRS_BUFFER_02_001: [If source is NULL then BUFFER_create shall return NULL.]*/
markrad 3:c0556ff7b8e3 68 if (source == NULL)
markrad 3:c0556ff7b8e3 69 {
markrad 3:c0556ff7b8e3 70 result = NULL;
markrad 3:c0556ff7b8e3 71 }
markrad 3:c0556ff7b8e3 72 else
markrad 3:c0556ff7b8e3 73 {
markrad 3:c0556ff7b8e3 74 /*Codes_SRS_BUFFER_02_002: [Otherwise, BUFFER_create shall allocate memory to hold size bytes and shall copy from source size bytes into the newly allocated memory.] */
markrad 3:c0556ff7b8e3 75 result = (BUFFER*)malloc(sizeof(BUFFER));
markrad 3:c0556ff7b8e3 76 if (result == NULL)
markrad 3:c0556ff7b8e3 77 {
markrad 3:c0556ff7b8e3 78 /*Codes_SRS_BUFFER_02_003: [If allocating memory fails, then BUFFER_create shall return NULL.] */
markrad 3:c0556ff7b8e3 79 /*fallthrough*/
markrad 3:c0556ff7b8e3 80 }
markrad 3:c0556ff7b8e3 81 else
markrad 3:c0556ff7b8e3 82 {
markrad 3:c0556ff7b8e3 83 /* Codes_SRS_BUFFER_02_005: [If size parameter is 0 then 1 byte of memory shall be allocated yet size of the buffer shall be set to 0.]*/
markrad 3:c0556ff7b8e3 84 if (BUFFER_safemalloc(result, size) != 0)
markrad 3:c0556ff7b8e3 85 {
markrad 3:c0556ff7b8e3 86 LogError("unable to BUFFER_safemalloc ");
markrad 3:c0556ff7b8e3 87 free(result);
markrad 3:c0556ff7b8e3 88 result = NULL;
markrad 3:c0556ff7b8e3 89 }
markrad 3:c0556ff7b8e3 90 else
markrad 3:c0556ff7b8e3 91 {
markrad 3:c0556ff7b8e3 92 /*Codes_SRS_BUFFER_02_004: [Otherwise, BUFFER_create shall return a non-NULL handle.] */
markrad 3:c0556ff7b8e3 93 memcpy(result->buffer, source, size);
markrad 3:c0556ff7b8e3 94 }
markrad 3:c0556ff7b8e3 95 }
markrad 3:c0556ff7b8e3 96 }
markrad 3:c0556ff7b8e3 97 return (BUFFER_HANDLE)result;
markrad 3:c0556ff7b8e3 98 }
markrad 3:c0556ff7b8e3 99
markrad 3:c0556ff7b8e3 100 /* Codes_SRS_BUFFER_07_003: [BUFFER_delete shall delete the data associated with the BUFFER_HANDLE along with the Buffer.] */
markrad 3:c0556ff7b8e3 101 void BUFFER_delete(BUFFER_HANDLE handle)
markrad 3:c0556ff7b8e3 102 {
markrad 3:c0556ff7b8e3 103 /* Codes_SRS_BUFFER_07_004: [BUFFER_delete shall not delete any BUFFER_HANDLE that is NULL.] */
markrad 3:c0556ff7b8e3 104 if (handle != NULL)
markrad 3:c0556ff7b8e3 105 {
markrad 3:c0556ff7b8e3 106 BUFFER* b = (BUFFER*)handle;
markrad 3:c0556ff7b8e3 107 if (b->buffer != NULL)
markrad 3:c0556ff7b8e3 108 {
markrad 3:c0556ff7b8e3 109 /* Codes_SRS_BUFFER_07_003: [BUFFER_delete shall delete the data associated with the BUFFER_HANDLE along with the Buffer.] */
markrad 3:c0556ff7b8e3 110 free(b->buffer);
markrad 3:c0556ff7b8e3 111 }
markrad 3:c0556ff7b8e3 112 free(b);
markrad 3:c0556ff7b8e3 113 }
markrad 3:c0556ff7b8e3 114 }
markrad 3:c0556ff7b8e3 115
markrad 3:c0556ff7b8e3 116 /*return 0 if the buffer was copied*/
markrad 3:c0556ff7b8e3 117 /*else return different than zero*/
markrad 3:c0556ff7b8e3 118 /* Codes_SRS_BUFFER_07_008: [BUFFER_build allocates size_t bytes, copies the unsigned char* into the buffer and returns zero on success.] */
markrad 3:c0556ff7b8e3 119 int BUFFER_build(BUFFER_HANDLE handle, const unsigned char* source, size_t size)
markrad 3:c0556ff7b8e3 120 {
markrad 3:c0556ff7b8e3 121 int result;
markrad 3:c0556ff7b8e3 122 if (handle == NULL)
markrad 3:c0556ff7b8e3 123 {
markrad 3:c0556ff7b8e3 124 /* Codes_SRS_BUFFER_07_009: [BUFFER_build shall return nonzero if handle is NULL ] */
markrad 3:c0556ff7b8e3 125 result = __LINE__;
markrad 3:c0556ff7b8e3 126 }
markrad 3:c0556ff7b8e3 127 /* Codes_SRS_BUFFER_01_002: [The size argument can be zero, in which case the underlying buffer held by the buffer instance shall be freed.] */
markrad 3:c0556ff7b8e3 128 else if (size == 0)
markrad 3:c0556ff7b8e3 129 {
markrad 3:c0556ff7b8e3 130 /* Codes_SRS_BUFFER_01_003: [If size is zero, source can be NULL.] */
markrad 3:c0556ff7b8e3 131 BUFFER* b = (BUFFER*)handle;
markrad 3:c0556ff7b8e3 132 free(b->buffer);
markrad 3:c0556ff7b8e3 133 b->buffer = NULL;
markrad 3:c0556ff7b8e3 134 b->size = 0;
markrad 3:c0556ff7b8e3 135
markrad 3:c0556ff7b8e3 136 result = 0;
markrad 3:c0556ff7b8e3 137 }
markrad 3:c0556ff7b8e3 138 else
markrad 3:c0556ff7b8e3 139 {
markrad 3:c0556ff7b8e3 140 if (source == NULL)
markrad 3:c0556ff7b8e3 141 {
markrad 3:c0556ff7b8e3 142 /* Codes_SRS_BUFFER_01_001: [If size is positive and source is NULL, BUFFER_build shall return nonzero] */
markrad 3:c0556ff7b8e3 143 result = __LINE__;
markrad 3:c0556ff7b8e3 144 }
markrad 3:c0556ff7b8e3 145 else
markrad 3:c0556ff7b8e3 146 {
markrad 3:c0556ff7b8e3 147 BUFFER* b = (BUFFER*)handle;
markrad 3:c0556ff7b8e3 148 /* Codes_SRS_BUFFER_07_011: [BUFFER_build shall overwrite previous contents if the buffer has been previously allocated.] */
markrad 3:c0556ff7b8e3 149 unsigned char* newBuffer = (unsigned char*)realloc(b->buffer, size);
markrad 3:c0556ff7b8e3 150 if (newBuffer == NULL)
markrad 3:c0556ff7b8e3 151 {
markrad 3:c0556ff7b8e3 152 /* Codes_SRS_BUFFER_07_010: [BUFFER_build shall return nonzero if any error is encountered.] */
markrad 3:c0556ff7b8e3 153 result = __LINE__;
markrad 3:c0556ff7b8e3 154 }
markrad 3:c0556ff7b8e3 155 else
markrad 3:c0556ff7b8e3 156 {
markrad 3:c0556ff7b8e3 157 b->buffer = newBuffer;
markrad 3:c0556ff7b8e3 158 b->size = size;
markrad 3:c0556ff7b8e3 159 /* Codes_SRS_BUFFER_01_002: [The size argument can be zero, in which case nothing shall be copied from source.] */
markrad 3:c0556ff7b8e3 160 (void)memcpy(b->buffer, source, size);
markrad 3:c0556ff7b8e3 161
markrad 3:c0556ff7b8e3 162 result = 0;
markrad 3:c0556ff7b8e3 163 }
markrad 3:c0556ff7b8e3 164 }
markrad 3:c0556ff7b8e3 165 }
markrad 3:c0556ff7b8e3 166
markrad 3:c0556ff7b8e3 167 return result;
markrad 3:c0556ff7b8e3 168 }
markrad 3:c0556ff7b8e3 169
markrad 3:c0556ff7b8e3 170 /*return 0 if the buffer was pre-build(that is, had its space allocated)*/
markrad 3:c0556ff7b8e3 171 /*else return different than zero*/
markrad 3:c0556ff7b8e3 172 /* Codes_SRS_BUFFER_07_005: [BUFFER_pre_build allocates size_t bytes of BUFFER_HANDLE and returns zero on success.] */
markrad 3:c0556ff7b8e3 173 int BUFFER_pre_build(BUFFER_HANDLE handle, size_t size)
markrad 3:c0556ff7b8e3 174 {
markrad 3:c0556ff7b8e3 175 int result;
markrad 3:c0556ff7b8e3 176 if (handle == NULL)
markrad 3:c0556ff7b8e3 177 {
markrad 3:c0556ff7b8e3 178 /* Codes_SRS_BUFFER_07_006: [If handle is NULL or size is 0 then BUFFER_pre_build shall return a nonzero value.] */
markrad 3:c0556ff7b8e3 179 result = __LINE__;
markrad 3:c0556ff7b8e3 180 }
markrad 3:c0556ff7b8e3 181 else if (size == 0)
markrad 3:c0556ff7b8e3 182 {
markrad 3:c0556ff7b8e3 183 /* Codes_SRS_BUFFER_07_006: [If handle is NULL or size is 0 then BUFFER_pre_build shall return a nonzero value.] */
markrad 3:c0556ff7b8e3 184 result = __LINE__;
markrad 3:c0556ff7b8e3 185 }
markrad 3:c0556ff7b8e3 186 else
markrad 3:c0556ff7b8e3 187 {
markrad 3:c0556ff7b8e3 188 BUFFER* b = (BUFFER*)handle;
markrad 3:c0556ff7b8e3 189 if (b->buffer != NULL)
markrad 3:c0556ff7b8e3 190 {
markrad 3:c0556ff7b8e3 191 /* Codes_SRS_BUFFER_07_007: [BUFFER_pre_build shall return nonzero if the buffer has been previously allocated and is not NULL.] */
markrad 3:c0556ff7b8e3 192 result = __LINE__;
markrad 3:c0556ff7b8e3 193 }
markrad 3:c0556ff7b8e3 194 else
markrad 3:c0556ff7b8e3 195 {
markrad 3:c0556ff7b8e3 196 if ((b->buffer = (unsigned char*)malloc(size)) == NULL)
markrad 3:c0556ff7b8e3 197 {
markrad 3:c0556ff7b8e3 198 /* Codes_SRS_BUFFER_07_013: [BUFFER_pre_build shall return nonzero if any error is encountered.] */
markrad 3:c0556ff7b8e3 199 result = __LINE__;
markrad 3:c0556ff7b8e3 200 }
markrad 3:c0556ff7b8e3 201 else
markrad 3:c0556ff7b8e3 202 {
markrad 3:c0556ff7b8e3 203 b->size = size;
markrad 3:c0556ff7b8e3 204 result = 0;
markrad 3:c0556ff7b8e3 205 }
markrad 3:c0556ff7b8e3 206 }
markrad 3:c0556ff7b8e3 207 }
markrad 3:c0556ff7b8e3 208 return result;
markrad 3:c0556ff7b8e3 209 }
markrad 3:c0556ff7b8e3 210
markrad 3:c0556ff7b8e3 211 /* Codes_SRS_BUFFER_07_019: [BUFFER_content shall return the data contained within the BUFFER_HANDLE.] */
markrad 3:c0556ff7b8e3 212 int BUFFER_content(BUFFER_HANDLE handle, const unsigned char** content)
markrad 3:c0556ff7b8e3 213 {
markrad 3:c0556ff7b8e3 214 int result;
markrad 3:c0556ff7b8e3 215 if ((handle == NULL) || (content == NULL))
markrad 3:c0556ff7b8e3 216 {
markrad 3:c0556ff7b8e3 217 /* Codes_SRS_BUFFER_07_020: [If the handle and/or content*is NULL BUFFER_content shall return nonzero.] */
markrad 3:c0556ff7b8e3 218 result = __LINE__;
markrad 3:c0556ff7b8e3 219 }
markrad 3:c0556ff7b8e3 220 else
markrad 3:c0556ff7b8e3 221 {
markrad 3:c0556ff7b8e3 222 BUFFER* b = (BUFFER*)handle;
markrad 3:c0556ff7b8e3 223 *content = b->buffer;
markrad 3:c0556ff7b8e3 224 result = 0;
markrad 3:c0556ff7b8e3 225 }
markrad 3:c0556ff7b8e3 226 return result;
markrad 3:c0556ff7b8e3 227 }
markrad 3:c0556ff7b8e3 228
markrad 3:c0556ff7b8e3 229 /*return 0 if everything went ok and whatever was built in the buffer was unbuilt*/
markrad 3:c0556ff7b8e3 230 /* Codes_SRS_BUFFER_07_012: [BUFFER_unbuild shall clear the underlying unsigned char* data associated with the BUFFER_HANDLE this will return zero on success.] */
markrad 3:c0556ff7b8e3 231 extern int BUFFER_unbuild(BUFFER_HANDLE handle)
markrad 3:c0556ff7b8e3 232 {
markrad 3:c0556ff7b8e3 233 int result;
markrad 3:c0556ff7b8e3 234 if (handle == NULL)
markrad 3:c0556ff7b8e3 235 {
markrad 3:c0556ff7b8e3 236 /* Codes_SRS_BUFFER_07_014: [BUFFER_unbuild shall return a nonzero value if BUFFER_HANDLE is NULL.] */
markrad 3:c0556ff7b8e3 237 result = __LINE__;
markrad 3:c0556ff7b8e3 238 }
markrad 3:c0556ff7b8e3 239 else
markrad 3:c0556ff7b8e3 240 {
markrad 3:c0556ff7b8e3 241 BUFFER* b = (BUFFER*)handle;
markrad 3:c0556ff7b8e3 242 if (b->buffer != NULL)
markrad 3:c0556ff7b8e3 243 {
markrad 3:c0556ff7b8e3 244 free(b->buffer);
markrad 3:c0556ff7b8e3 245 b->buffer = NULL;
markrad 3:c0556ff7b8e3 246 b->size = 0;
markrad 3:c0556ff7b8e3 247 result = 0;
markrad 3:c0556ff7b8e3 248 }
markrad 3:c0556ff7b8e3 249 else
markrad 3:c0556ff7b8e3 250 {
markrad 3:c0556ff7b8e3 251 /* Codes_SRS_BUFFER_07_015: [BUFFER_unbuild shall return a nonzero value if the unsigned char* referenced by BUFFER_HANDLE is NULL.] */
markrad 3:c0556ff7b8e3 252 result = __LINE__;
markrad 3:c0556ff7b8e3 253 }
markrad 3:c0556ff7b8e3 254 }
markrad 3:c0556ff7b8e3 255 return result;
markrad 3:c0556ff7b8e3 256 }
markrad 3:c0556ff7b8e3 257
markrad 3:c0556ff7b8e3 258 /* Codes_SRS_BUFFER_07_016: [BUFFER_enlarge shall increase the size of the unsigned char* referenced by BUFFER_HANDLE.] */
markrad 3:c0556ff7b8e3 259 int BUFFER_enlarge(BUFFER_HANDLE handle, size_t enlargeSize)
markrad 3:c0556ff7b8e3 260 {
markrad 3:c0556ff7b8e3 261 int result;
markrad 3:c0556ff7b8e3 262 if (handle == NULL)
markrad 3:c0556ff7b8e3 263 {
markrad 3:c0556ff7b8e3 264 /* Codes_SRS_BUFFER_07_017: [BUFFER_enlarge shall return a nonzero result if any parameters are NULL or zero.] */
markrad 3:c0556ff7b8e3 265 result = __LINE__;
markrad 3:c0556ff7b8e3 266 }
markrad 3:c0556ff7b8e3 267 else if (enlargeSize == 0)
markrad 3:c0556ff7b8e3 268 {
markrad 3:c0556ff7b8e3 269 /* Codes_SRS_BUFFER_07_017: [BUFFER_enlarge shall return a nonzero result if any parameters are NULL or zero.] */
markrad 3:c0556ff7b8e3 270 result = __LINE__;
markrad 3:c0556ff7b8e3 271 }
markrad 3:c0556ff7b8e3 272 else
markrad 3:c0556ff7b8e3 273 {
markrad 3:c0556ff7b8e3 274 BUFFER* b = (BUFFER*)handle;
markrad 3:c0556ff7b8e3 275 unsigned char* temp = (unsigned char*)realloc(b->buffer, b->size + enlargeSize);
markrad 3:c0556ff7b8e3 276 if (temp == NULL)
markrad 3:c0556ff7b8e3 277 {
markrad 3:c0556ff7b8e3 278 /* Codes_SRS_BUFFER_07_018: [BUFFER_enlarge shall return a nonzero result if any error is encountered.] */
markrad 3:c0556ff7b8e3 279 result = __LINE__;
markrad 3:c0556ff7b8e3 280 }
markrad 3:c0556ff7b8e3 281 else
markrad 3:c0556ff7b8e3 282 {
markrad 3:c0556ff7b8e3 283 b->buffer = temp;
markrad 3:c0556ff7b8e3 284 b->size += enlargeSize;
markrad 3:c0556ff7b8e3 285 result = 0;
markrad 3:c0556ff7b8e3 286 }
markrad 3:c0556ff7b8e3 287 }
markrad 3:c0556ff7b8e3 288 return result;
markrad 3:c0556ff7b8e3 289 }
markrad 3:c0556ff7b8e3 290
markrad 3:c0556ff7b8e3 291 /* Codes_SRS_BUFFER_07_021: [BUFFER_size shall place the size of the associated buffer in the size variable and return zero on success.] */
markrad 3:c0556ff7b8e3 292 int BUFFER_size(BUFFER_HANDLE handle, size_t* size)
markrad 3:c0556ff7b8e3 293 {
markrad 3:c0556ff7b8e3 294 int result;
markrad 3:c0556ff7b8e3 295 if ((handle == NULL) || (size == NULL))
markrad 3:c0556ff7b8e3 296 {
markrad 3:c0556ff7b8e3 297 /* Codes_SRS_BUFFER_07_022: [BUFFER_size shall return a nonzero value for any error that is encountered.] */
markrad 3:c0556ff7b8e3 298 result = __LINE__;
markrad 3:c0556ff7b8e3 299 }
markrad 3:c0556ff7b8e3 300 else
markrad 3:c0556ff7b8e3 301 {
markrad 3:c0556ff7b8e3 302 BUFFER* b = (BUFFER*)handle;
markrad 3:c0556ff7b8e3 303 *size = b->size;
markrad 3:c0556ff7b8e3 304 result = 0;
markrad 3:c0556ff7b8e3 305 }
markrad 3:c0556ff7b8e3 306 return result;
markrad 3:c0556ff7b8e3 307 }
markrad 3:c0556ff7b8e3 308
markrad 3:c0556ff7b8e3 309 /* Codes_SRS_BUFFER_07_024: [BUFFER_append concatenates b2 onto b1 without modifying b2 and shall return zero on success.] */
markrad 3:c0556ff7b8e3 310 int BUFFER_append(BUFFER_HANDLE handle1, BUFFER_HANDLE handle2)
markrad 3:c0556ff7b8e3 311 {
markrad 3:c0556ff7b8e3 312 int result;
markrad 3:c0556ff7b8e3 313 if ( (handle1 == NULL) || (handle2 == NULL) || (handle1 == handle2) )
markrad 3:c0556ff7b8e3 314 {
markrad 3:c0556ff7b8e3 315 /* Codes_SRS_BUFFER_07_023: [BUFFER_append shall return a nonzero upon any error that is encountered.] */
markrad 3:c0556ff7b8e3 316 result = __LINE__;
markrad 3:c0556ff7b8e3 317 }
markrad 3:c0556ff7b8e3 318 else
markrad 3:c0556ff7b8e3 319 {
markrad 3:c0556ff7b8e3 320 BUFFER* b1 = (BUFFER*)handle1;
markrad 3:c0556ff7b8e3 321 BUFFER* b2 = (BUFFER*)handle2;
markrad 3:c0556ff7b8e3 322 if (b1->buffer == NULL)
markrad 3:c0556ff7b8e3 323 {
markrad 3:c0556ff7b8e3 324 /* Codes_SRS_BUFFER_07_023: [BUFFER_append shall return a nonzero upon any error that is encountered.] */
markrad 3:c0556ff7b8e3 325 result = __LINE__;
markrad 3:c0556ff7b8e3 326 }
markrad 3:c0556ff7b8e3 327 else if (b2->buffer == NULL)
markrad 3:c0556ff7b8e3 328 {
markrad 3:c0556ff7b8e3 329 /* Codes_SRS_BUFFER_07_023: [BUFFER_append shall return a nonzero upon any error that is encountered.] */
markrad 3:c0556ff7b8e3 330 result = __LINE__;
markrad 3:c0556ff7b8e3 331 }
markrad 3:c0556ff7b8e3 332 else
markrad 3:c0556ff7b8e3 333 {
markrad 3:c0556ff7b8e3 334 if (b2->size ==0)
markrad 3:c0556ff7b8e3 335 {
markrad 3:c0556ff7b8e3 336 // b2->size = 0, whatever b1->size is, do nothing
markrad 3:c0556ff7b8e3 337 result = 0;
markrad 3:c0556ff7b8e3 338 }
markrad 3:c0556ff7b8e3 339 else
markrad 3:c0556ff7b8e3 340 {
markrad 3:c0556ff7b8e3 341 // b2->size != 0, whatever b1->size is
markrad 3:c0556ff7b8e3 342 unsigned char* temp = (unsigned char*)realloc(b1->buffer, b1->size + b2->size);
markrad 3:c0556ff7b8e3 343 if (temp == NULL)
markrad 3:c0556ff7b8e3 344 {
markrad 3:c0556ff7b8e3 345 /* Codes_SRS_BUFFER_07_023: [BUFFER_append shall return a nonzero upon any error that is encountered.] */
markrad 3:c0556ff7b8e3 346 result = __LINE__;
markrad 3:c0556ff7b8e3 347 }
markrad 3:c0556ff7b8e3 348 else
markrad 3:c0556ff7b8e3 349 {
markrad 3:c0556ff7b8e3 350 /* Codes_SRS_BUFFER_07_024: [BUFFER_append concatenates b2 onto b1 without modifying b2 and shall return zero on success.]*/
markrad 3:c0556ff7b8e3 351 b1->buffer = temp;
markrad 3:c0556ff7b8e3 352 // Append the BUFFER
markrad 3:c0556ff7b8e3 353 (void)memcpy(&b1->buffer[b1->size], b2->buffer, b2->size);
markrad 3:c0556ff7b8e3 354 b1->size += b2->size;
markrad 3:c0556ff7b8e3 355 result = 0;
markrad 3:c0556ff7b8e3 356 }
markrad 3:c0556ff7b8e3 357 }
markrad 3:c0556ff7b8e3 358 }
markrad 3:c0556ff7b8e3 359 }
markrad 3:c0556ff7b8e3 360 return result;
markrad 3:c0556ff7b8e3 361 }
markrad 3:c0556ff7b8e3 362
markrad 3:c0556ff7b8e3 363 int BUFFER_prepend(BUFFER_HANDLE handle1, BUFFER_HANDLE handle2)
markrad 3:c0556ff7b8e3 364 {
markrad 3:c0556ff7b8e3 365 int result;
markrad 3:c0556ff7b8e3 366 if ((handle1 == NULL) || (handle2 == NULL) || (handle1 == handle2))
markrad 3:c0556ff7b8e3 367 {
markrad 3:c0556ff7b8e3 368 /* Codes_SRS_BUFFER_01_005: [ BUFFER_prepend shall return a non-zero upon value any error that is encountered. ]*/
markrad 3:c0556ff7b8e3 369 result = __LINE__;
markrad 3:c0556ff7b8e3 370 }
markrad 3:c0556ff7b8e3 371 else
markrad 3:c0556ff7b8e3 372 {
markrad 3:c0556ff7b8e3 373 BUFFER* b1 = (BUFFER*)handle1;
markrad 3:c0556ff7b8e3 374 BUFFER* b2 = (BUFFER*)handle2;
markrad 3:c0556ff7b8e3 375 if (b1->buffer == NULL)
markrad 3:c0556ff7b8e3 376 {
markrad 3:c0556ff7b8e3 377 /* Codes_SRS_BUFFER_01_005: [ BUFFER_prepend shall return a non-zero upon value any error that is encountered. ]*/
markrad 3:c0556ff7b8e3 378 result = __LINE__;
markrad 3:c0556ff7b8e3 379 }
markrad 3:c0556ff7b8e3 380 else if (b2->buffer == NULL)
markrad 3:c0556ff7b8e3 381 {
markrad 3:c0556ff7b8e3 382 /* Codes_SRS_BUFFER_01_005: [ BUFFER_prepend shall return a non-zero upon value any error that is encountered. ]*/
markrad 3:c0556ff7b8e3 383 result = __LINE__;
markrad 3:c0556ff7b8e3 384 }
markrad 3:c0556ff7b8e3 385 else
markrad 3:c0556ff7b8e3 386 {
markrad 3:c0556ff7b8e3 387 //put b2 ahead of b1: [b2][b1], return b1
markrad 3:c0556ff7b8e3 388 if (b2->size ==0)
markrad 3:c0556ff7b8e3 389 {
markrad 3:c0556ff7b8e3 390 // do nothing
markrad 3:c0556ff7b8e3 391 result = 0;
markrad 3:c0556ff7b8e3 392 }
markrad 3:c0556ff7b8e3 393 else
markrad 3:c0556ff7b8e3 394 {
markrad 3:c0556ff7b8e3 395 // b2->size != 0
markrad 3:c0556ff7b8e3 396 unsigned char* temp = (unsigned char*)malloc(b1->size + b2->size);
markrad 3:c0556ff7b8e3 397 if (temp == NULL)
markrad 3:c0556ff7b8e3 398 {
markrad 3:c0556ff7b8e3 399 /* Codes_SRS_BUFFER_01_005: [ BUFFER_prepend shall return a non-zero upon value any error that is encountered. ]*/
markrad 3:c0556ff7b8e3 400 result = __LINE__;
markrad 3:c0556ff7b8e3 401 }
markrad 3:c0556ff7b8e3 402 else
markrad 3:c0556ff7b8e3 403 {
markrad 3:c0556ff7b8e3 404 /* Codes_SRS_BUFFER_01_004: [ BUFFER_prepend concatenates handle1 onto handle2 without modifying handle1 and shall return zero on success. ]*/
markrad 3:c0556ff7b8e3 405 // Append the BUFFER
markrad 3:c0556ff7b8e3 406 (void)memcpy(temp, b2->buffer, b2->size);
markrad 3:c0556ff7b8e3 407 // start from b1->size to append b1
markrad 3:c0556ff7b8e3 408 (void)memcpy(&temp[b2->size], b1->buffer, b1->size);
markrad 3:c0556ff7b8e3 409 free(b1->buffer);
markrad 3:c0556ff7b8e3 410 b1->buffer = temp;
markrad 3:c0556ff7b8e3 411 b1->size += b2->size;
markrad 3:c0556ff7b8e3 412 result = 0;
markrad 3:c0556ff7b8e3 413 }
markrad 3:c0556ff7b8e3 414 }
markrad 3:c0556ff7b8e3 415 }
markrad 3:c0556ff7b8e3 416 }
markrad 3:c0556ff7b8e3 417 return result;
markrad 3:c0556ff7b8e3 418 }
markrad 3:c0556ff7b8e3 419
markrad 3:c0556ff7b8e3 420
markrad 3:c0556ff7b8e3 421 /* Codes_SRS_BUFFER_07_025: [BUFFER_u_char shall return a pointer to the underlying unsigned char*.] */
markrad 3:c0556ff7b8e3 422 unsigned char* BUFFER_u_char(BUFFER_HANDLE handle)
markrad 3:c0556ff7b8e3 423 {
markrad 3:c0556ff7b8e3 424 BUFFER* handleData = (BUFFER*)handle;
markrad 3:c0556ff7b8e3 425 unsigned char* result;
markrad 3:c0556ff7b8e3 426 if (handle == NULL || handleData->size == 0)
markrad 3:c0556ff7b8e3 427 {
markrad 3:c0556ff7b8e3 428 /* Codes_SRS_BUFFER_07_026: [BUFFER_u_char shall return NULL for any error that is encountered.] */
markrad 3:c0556ff7b8e3 429 /* Codes_SRS_BUFFER_07_029: [BUFFER_u_char shall return NULL if underlying buffer size is zero.] */
markrad 3:c0556ff7b8e3 430 result = NULL;
markrad 3:c0556ff7b8e3 431 }
markrad 3:c0556ff7b8e3 432 else
markrad 3:c0556ff7b8e3 433 {
markrad 3:c0556ff7b8e3 434 result = handleData->buffer;
markrad 3:c0556ff7b8e3 435 }
markrad 3:c0556ff7b8e3 436 return result;
markrad 3:c0556ff7b8e3 437 }
markrad 3:c0556ff7b8e3 438
markrad 3:c0556ff7b8e3 439 /* Codes_SRS_BUFFER_07_027: [BUFFER_length shall return the size of the underlying buffer.] */
markrad 3:c0556ff7b8e3 440 size_t BUFFER_length(BUFFER_HANDLE handle)
markrad 3:c0556ff7b8e3 441 {
markrad 3:c0556ff7b8e3 442 size_t result;
markrad 3:c0556ff7b8e3 443 if (handle == NULL)
markrad 3:c0556ff7b8e3 444 {
markrad 3:c0556ff7b8e3 445 /* Codes_SRS_BUFFER_07_028: [BUFFER_length shall return zero for any error that is encountered.] */
markrad 3:c0556ff7b8e3 446 result = 0;
markrad 3:c0556ff7b8e3 447 }
markrad 3:c0556ff7b8e3 448 else
markrad 3:c0556ff7b8e3 449 {
markrad 3:c0556ff7b8e3 450 BUFFER* b = (BUFFER*)handle;
markrad 3:c0556ff7b8e3 451 result = b->size;
markrad 3:c0556ff7b8e3 452 }
markrad 3:c0556ff7b8e3 453 return result;
markrad 3:c0556ff7b8e3 454 }
markrad 3:c0556ff7b8e3 455
markrad 3:c0556ff7b8e3 456 BUFFER_HANDLE BUFFER_clone(BUFFER_HANDLE handle)
markrad 3:c0556ff7b8e3 457 {
markrad 3:c0556ff7b8e3 458 BUFFER_HANDLE result;
markrad 3:c0556ff7b8e3 459 if (handle == NULL)
markrad 3:c0556ff7b8e3 460 {
markrad 3:c0556ff7b8e3 461 result = NULL;
markrad 3:c0556ff7b8e3 462 }
markrad 3:c0556ff7b8e3 463 else
markrad 3:c0556ff7b8e3 464 {
markrad 3:c0556ff7b8e3 465 BUFFER* suppliedBuff = (BUFFER*)handle;
markrad 3:c0556ff7b8e3 466 BUFFER* b = (BUFFER*)malloc(sizeof(BUFFER));
markrad 3:c0556ff7b8e3 467 if (b != NULL)
markrad 3:c0556ff7b8e3 468 {
markrad 3:c0556ff7b8e3 469 if (BUFFER_safemalloc(b, suppliedBuff->size) != 0)
markrad 3:c0556ff7b8e3 470 {
markrad 3:c0556ff7b8e3 471 result = NULL;
markrad 3:c0556ff7b8e3 472 }
markrad 3:c0556ff7b8e3 473 else
markrad 3:c0556ff7b8e3 474 {
markrad 3:c0556ff7b8e3 475 memcpy(b->buffer, suppliedBuff->buffer, suppliedBuff->size);
markrad 3:c0556ff7b8e3 476 b->size = suppliedBuff->size;
markrad 3:c0556ff7b8e3 477 result = (BUFFER_HANDLE)b;
markrad 3:c0556ff7b8e3 478 }
markrad 3:c0556ff7b8e3 479 }
markrad 3:c0556ff7b8e3 480 else
markrad 3:c0556ff7b8e3 481 {
markrad 3:c0556ff7b8e3 482 result = NULL;
markrad 3:c0556ff7b8e3 483 }
markrad 3:c0556ff7b8e3 484 }
markrad 3:c0556ff7b8e3 485 return result;
markrad 3:c0556ff7b8e3 486 }