9#include <Library/BaseLib.h>
10#include <Library/BaseOverflowLib.h>
11#include <Library/MemoryAllocationLib.h>
14#include <Library/PrintLib.h>
31 IN CONST CHAR8 *AppendString OPTIONAL
52 IN CONST UINTN AppendLength,
53 OUT UINTN *TargetLength
58 ASSERT (AppendLength != 0);
60 if (
Buffer->String == NULL) {
63 Buffer->String = AllocatePool (AppendLength + 1);
64 if (
Buffer->String == NULL) {
65 return EFI_OUT_OF_RESOURCES;
68 Buffer->BufferSize = AppendLength + 1;
69 *TargetLength = AppendLength;
71 if (
Buffer->BufferSize == 0) {
73 return EFI_UNSUPPORTED;
76 NewSize =
Buffer->BufferSize;
77 if (BaseOverflowAddUN (
Buffer->StringLength, AppendLength, TargetLength)) {
78 return EFI_OUT_OF_RESOURCES;
81 while (NewSize <= *TargetLength) {
82 if (BaseOverflowMulUN (NewSize, 2, &NewSize)) {
83 return EFI_OUT_OF_RESOURCES;
87 if (NewSize >
Buffer->BufferSize) {
89 if (
Buffer->String == NULL) {
90 return EFI_OUT_OF_RESOURCES;
93 Buffer->BufferSize = NewSize;
103 IN CONST CHAR8 *AppendString, OPTIONAL
111 if (AppendString == NULL) {
115 AppendLength = AsciiStrnLenS (AppendString,
Length);
120 if (AppendLength == 0) {
125 if (EFI_ERROR (Status)) {
129 Status = AsciiStrnCpyS (&
Buffer->String[
Buffer->StringLength], AppendLength + 1, AppendString, AppendLength);
130 if (EFI_ERROR (Status)) {
134 Buffer->StringLength = TargetLength;
142 IN CONST CHAR8 *FormatString,
149 UINTN NumberOfPrinted;
152 ASSERT (FormatString != NULL);
154 VA_START (Marker, FormatString);
156 VA_COPY (Marker2, Marker);
157 NumberOfPrinted = SPrintLengthAsciiFormat (FormatString, Marker2);
163 if (NumberOfPrinted == 0) {
164 Status = EFI_SUCCESS;
167 if (!EFI_ERROR (Status)) {
168 AsciiVSPrint (&
Buffer->String[
Buffer->StringLength], NumberOfPrinted + 1, FormatString, Marker);
169 Buffer->StringLength = TargetLength;
184 if ((StringBuffer == NULL) || (*StringBuffer == NULL)) {
189 String = (*StringBuffer)->String;
190 FreePool (*StringBuffer);
191 *StringBuffer = NULL;
204 if (Result != NULL) {
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]