OpenCore  1.0.4
OpenCore Bootloader
Loading...
Searching...
No Matches
AsciiStringBuffer.c
Go to the documentation of this file.
1
8#include <Base.h>
9#include <Library/BaseLib.h>
10#include <Library/BaseOverflowLib.h>
11#include <Library/MemoryAllocationLib.h>
14#include <Library/PrintLib.h>
15
18 VOID
19 )
20{
22
23 Buffer = AllocateZeroPool (sizeof (OC_ASCII_STRING_BUFFER));
24
25 return Buffer;
26}
27
28EFI_STATUS
31 IN CONST CHAR8 *AppendString OPTIONAL
32 )
33{
34 return OcAsciiStringBufferAppendN (Buffer, AppendString, MAX_UINTN);
35}
36
48STATIC
49EFI_STATUS
52 IN CONST UINTN AppendLength,
53 OUT UINTN *TargetLength
54 )
55{
56 UINTN NewSize;
57
58 ASSERT (AppendLength != 0);
59
60 if (Buffer->String == NULL) {
61 ASSERT (Buffer->BufferSize == 0);
62
63 Buffer->String = AllocatePool (AppendLength + 1);
64 if (Buffer->String == NULL) {
65 return EFI_OUT_OF_RESOURCES;
66 }
67
68 Buffer->BufferSize = AppendLength + 1;
69 *TargetLength = AppendLength;
70 } else {
71 if (Buffer->BufferSize == 0) {
72 ASSERT (FALSE);
73 return EFI_UNSUPPORTED;
74 }
75
76 NewSize = Buffer->BufferSize;
77 if (BaseOverflowAddUN (Buffer->StringLength, AppendLength, TargetLength)) {
78 return EFI_OUT_OF_RESOURCES;
79 }
80
81 while (NewSize <= *TargetLength) {
82 if (BaseOverflowMulUN (NewSize, 2, &NewSize)) {
83 return EFI_OUT_OF_RESOURCES;
84 }
85 }
86
87 if (NewSize > Buffer->BufferSize) {
88 Buffer->String = ReallocatePool (Buffer->BufferSize, NewSize, Buffer->String);
89 if (Buffer->String == NULL) {
90 return EFI_OUT_OF_RESOURCES;
91 }
92
93 Buffer->BufferSize = NewSize;
94 }
95 }
96
97 return EFI_SUCCESS;
98}
99
100EFI_STATUS
103 IN CONST CHAR8 *AppendString, OPTIONAL
104 IN CONST UINTN Length
105 )
106{
107 EFI_STATUS Status;
108 UINTN AppendLength;
109 UINTN TargetLength;
110
111 if (AppendString == NULL) {
112 return EFI_SUCCESS;
113 }
114
115 AppendLength = AsciiStrnLenS (AppendString, Length);
116
117 //
118 // Buffer stays NULL if zero appended.
119 //
120 if (AppendLength == 0) {
121 return EFI_SUCCESS;
122 }
123
124 Status = InternalAsciiStringBufferExtendBy (Buffer, AppendLength, &TargetLength);
125 if (EFI_ERROR (Status)) {
126 return Status;
127 }
128
129 Status = AsciiStrnCpyS (&Buffer->String[Buffer->StringLength], AppendLength + 1, AppendString, AppendLength);
130 if (EFI_ERROR (Status)) {
131 return Status;
132 }
133
134 Buffer->StringLength = TargetLength;
135 return EFI_SUCCESS;
136}
137
138EFI_STATUS
139EFIAPI
142 IN CONST CHAR8 *FormatString,
143 ...
144 )
145{
146 EFI_STATUS Status;
147 VA_LIST Marker;
148 VA_LIST Marker2;
149 UINTN NumberOfPrinted;
150 UINTN TargetLength;
151
152 ASSERT (FormatString != NULL);
153
154 VA_START (Marker, FormatString);
155
156 VA_COPY (Marker2, Marker);
157 NumberOfPrinted = SPrintLengthAsciiFormat (FormatString, Marker2);
158 VA_END (Marker2);
159
160 //
161 // Buffer stays NULL if zero appended.
162 //
163 if (NumberOfPrinted == 0) {
164 Status = EFI_SUCCESS;
165 } else {
166 Status = InternalAsciiStringBufferExtendBy (Buffer, NumberOfPrinted, &TargetLength);
167 if (!EFI_ERROR (Status)) {
168 AsciiVSPrint (&Buffer->String[Buffer->StringLength], NumberOfPrinted + 1, FormatString, Marker);
169 Buffer->StringLength = TargetLength;
170 }
171 }
172
173 VA_END (Marker);
174 return Status;
175}
176
177CHAR8 *
179 IN OUT OC_ASCII_STRING_BUFFER **StringBuffer
180 )
181{
182 CHAR8 *String;
183
184 if ((StringBuffer == NULL) || (*StringBuffer == NULL)) {
185 ASSERT (FALSE);
186 return NULL;
187 }
188
189 String = (*StringBuffer)->String;
190 FreePool (*StringBuffer);
191 *StringBuffer = NULL;
192
193 return String;
194}
195
196VOID
198 IN OUT OC_ASCII_STRING_BUFFER **StringBuffer
199 )
200{
201 CHAR8 *Result;
202
203 Result = OcAsciiStringBufferFreeContainer (StringBuffer);
204 if (Result != NULL) {
205 FreePool (Result);
206 }
207}
UINT64 Length
CHAR8 * OcAsciiStringBufferFreeContainer(IN OUT OC_ASCII_STRING_BUFFER **StringBuffer)
EFI_STATUS OcAsciiStringBufferAppendN(IN OUT OC_ASCII_STRING_BUFFER *Buffer, IN CONST CHAR8 *AppendString, OPTIONAL IN CONST UINTN Length)
STATIC EFI_STATUS InternalAsciiStringBufferExtendBy(IN OUT OC_ASCII_STRING_BUFFER *Buffer, IN CONST UINTN AppendLength, OUT UINTN *TargetLength)
EFI_STATUS OcAsciiStringBufferAppend(IN OUT OC_ASCII_STRING_BUFFER *Buffer, IN CONST CHAR8 *AppendString OPTIONAL)
EFI_STATUS EFIAPI OcAsciiStringBufferSPrint(IN OUT OC_ASCII_STRING_BUFFER *Buffer, IN CONST CHAR8 *FormatString,...)
OC_ASCII_STRING_BUFFER * OcAsciiStringBufferInit(VOID)
VOID OcAsciiStringBufferFree(IN OUT OC_ASCII_STRING_BUFFER **StringBuffer)
OC_TYPING_BUFFER_ENTRY Buffer[OC_TYPING_BUFFER_SIZE]
Definition OcTypingLib.h:42
#define ASSERT(x)
Definition coder.h:55