mirror of
https://github.com/Dasharo/edk2-upstream.git
synced 2026-06-13 19:16:19 -07:00
Replace traditional `#ifndef`/`#define`/`#endif` include guards with
`#pragma` once.
`#pragma once` is a widely supported preprocessor directive that
prevents header files from being included multiple times. It is
supported by all toolchains used to build edk2: GCC, Clang/LLVM, and
MSVC.
Note: Some files in BaseTools are excluded from the change if they
are autogenerated or direcly related to a header from a subproject,
etc. In particular, headers in these directories were ignored:
- BaseTools/Source/C/LzmaCompress/Sdk/
- BaseTools/Source/C/VfrCompile/Pccts/
Compared to macro-based include guards, `#pragma once`:
- Eliminates the risk of macro name collisions or copy/paste errors
where two headers inadvertently use the same guard macro.
- Eliminate inconsistency in the way include guard macros are named
(e.g., some files use `__FILE_H__`, others use `FILE_H_`, etc.).
- Reduces boilerplate (three lines replaced by one).
- Avoids polluting the macro namespace with guard symbols.
- Can improve build times as the preprocessor can skip re-opening the
file entirely, rather than re-reading it to find the matching
`#endif` ("multiple-include optimization").
- Note that some compilers may already optimize traditional include
guards, by recognzining the idiomatic pattern.
This change is made acknowledging that overall portability of the
code will technically be reduced, as `#pragma once` is not part of the
C/C++ standards.
However, this is considered acceptable given:
1. edk2 already defines a subset of supported compilers in
BaseTools/Conf/tools_def.template, all of which have supported
`#pragma once` for over two decades.
2. There have been concerns raised to the project about inconsistent
include guard naming and potential macro collisions.
Approximate compiler support dates:
- MSVC: Supported since Visual C++ 4.2 (1996)
- GCC: Supported since 3.4 (2004)
(http://gnu.ist.utl.pt/software/gcc/gcc-3.4/changes.html)
- Clang (LLVM based): Since initial release in 2007
Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
163 lines
2.8 KiB
C
163 lines
2.8 KiB
C
/** @file
|
|
String routines implementation
|
|
|
|
Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.<BR>
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#pragma once
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <Common/UefiBaseTypes.h>
|
|
|
|
//
|
|
// Common data structures
|
|
//
|
|
typedef struct {
|
|
UINTN Count;
|
|
//
|
|
// Actually this array can be 0 or more items (based on Count)
|
|
//
|
|
CHAR8* Strings[1];
|
|
} STRING_LIST;
|
|
|
|
|
|
//
|
|
// Functions declarations
|
|
//
|
|
|
|
/**
|
|
Allocates a new string and copies 'String' to clone it
|
|
|
|
@param String The string to clone
|
|
|
|
@return CHAR8* - NULL if there are not enough resources
|
|
**/
|
|
CHAR8*
|
|
CloneString (
|
|
IN CHAR8 *String
|
|
)
|
|
;
|
|
|
|
/**
|
|
Remove all comments, leading and trailing whitespace from the string.
|
|
|
|
@param String The string to 'strip'
|
|
|
|
@return EFI_STATUS
|
|
**/
|
|
EFI_STATUS
|
|
StripInfDscStringInPlace (
|
|
IN CHAR8 *String
|
|
)
|
|
;
|
|
|
|
/**
|
|
Creates and returns a 'split' STRING_LIST by splitting the string
|
|
on whitespace boundaries.
|
|
|
|
@param String The string to 'split'
|
|
|
|
@return EFI_STATUS
|
|
**/
|
|
STRING_LIST*
|
|
SplitStringByWhitespace (
|
|
IN CHAR8 *String
|
|
)
|
|
;
|
|
|
|
/**
|
|
Creates a new STRING_LIST with 0 strings.
|
|
|
|
@return STRING_LIST* - Null if there is not enough resources to create the object.
|
|
**/
|
|
STRING_LIST*
|
|
NewStringList (
|
|
)
|
|
;
|
|
|
|
|
|
/**
|
|
Adds String to StringList. A new copy of String is made before it is
|
|
added to StringList.
|
|
|
|
@return EFI_STATUS
|
|
**/
|
|
EFI_STATUS
|
|
AppendCopyOfStringToList (
|
|
IN OUT STRING_LIST **StringList,
|
|
IN CHAR8 *String
|
|
)
|
|
;
|
|
|
|
/**
|
|
Removes the last string from StringList and frees the memory associated
|
|
with it.
|
|
|
|
@param StringList The string list to remove the string from
|
|
|
|
@return EFI_STATUS
|
|
**/
|
|
EFI_STATUS
|
|
RemoveLastStringFromList (
|
|
IN STRING_LIST *StringList
|
|
)
|
|
;
|
|
|
|
|
|
/**
|
|
Allocates a STRING_LIST structure that can store StringCount strings.
|
|
|
|
@param StringCount The number of strings that need to be stored
|
|
|
|
@return EFI_STATUS
|
|
**/
|
|
STRING_LIST*
|
|
AllocateStringListStruct (
|
|
IN UINTN StringCount
|
|
)
|
|
;
|
|
|
|
|
|
/**
|
|
Frees all memory associated with StringList.
|
|
|
|
@param StringList The string list to free
|
|
|
|
@return EFI_STATUS
|
|
**/
|
|
VOID
|
|
FreeStringList (
|
|
IN STRING_LIST *StringList
|
|
)
|
|
;
|
|
|
|
|
|
/**
|
|
Generates a string that represents the STRING_LIST
|
|
|
|
@param StringList The string list to convert to a string
|
|
|
|
@return CHAR8* The string list represented with a single string. The returned
|
|
string must be freed by the caller.
|
|
**/
|
|
CHAR8*
|
|
StringListToString (
|
|
IN STRING_LIST *StringList
|
|
)
|
|
;
|
|
|
|
|
|
/**
|
|
Prints out the string list
|
|
|
|
@param StringList The string list to print
|
|
**/
|
|
VOID
|
|
PrintStringList (
|
|
IN STRING_LIST *StringList
|
|
)
|
|
;
|