1
2#include "palrt.h"
3#include "pal.h"
4#include "stdlib.h"
5#include "pal_mstypes.h"
6#include "pal_error.h"
7#include <new>
8#include <memory.h>
9
10#define wcslen PAL_wcslen
11
12bool ResizeBuffer(char *&buffer, size_t& size, size_t currLen, size_t newSize, bool &fixedBuffer)
13{
14 newSize = (size_t)(newSize * 1.5);
15 _ASSERTE(newSize > size); // check for overflow
16
17 if (newSize < 32)
18 newSize = 32;
19
20 // We can't use coreclr includes here so we use std::nothrow
21 // rather than the coreclr version
22 char *newBuffer = new (std::nothrow) char[newSize];
23
24 if (newBuffer == NULL)
25 return false;
26
27 memcpy(newBuffer, buffer, currLen);
28
29 if (!fixedBuffer)
30 delete[] buffer;
31
32 buffer = newBuffer;
33 size = newSize;
34 fixedBuffer = false;
35
36 return true;
37}
38
39bool WriteToBuffer(const BYTE *src, size_t len, char *&buffer, size_t& offset, size_t& size, bool &fixedBuffer)
40{
41 if(!src) return true;
42 if (offset + len > size)
43 {
44 if (!ResizeBuffer(buffer, size, offset, size + len, fixedBuffer))
45 return false;
46 }
47
48 memcpy(buffer + offset, src, len);
49 offset += len;
50 return true;
51}
52
53bool WriteToBuffer(PCWSTR str, char *&buffer, size_t& offset, size_t& size, bool &fixedBuffer)
54{
55 if(!str) return true;
56 size_t byteCount = (wcslen(str) + 1) * sizeof(*str);
57
58 if (offset + byteCount > size)
59 {
60 if (!ResizeBuffer(buffer, size, offset, size + byteCount, fixedBuffer))
61 return false;
62 }
63
64 memcpy(buffer + offset, str, byteCount);
65 offset += byteCount;
66 return true;
67}
68
69bool WriteToBuffer(const char *str, char *&buffer, size_t& offset, size_t& size, bool &fixedBuffer)
70{
71 if(!str) return true;
72 size_t len = strlen(str) + 1;
73 if (offset + len > size)
74 {
75 if (!ResizeBuffer(buffer, size, offset, size + len, fixedBuffer))
76 return false;
77 }
78
79 memcpy(buffer + offset, str, len);
80 offset += len;
81 return true;
82}
83
84