On 2015-05-20 14:08:40, Jonathan Doman wrote: > +STATIC > +EFI_STATUS > +PosixExtendedMatch ( > + IN CHAR16 *String, > + IN CHAR16 *Pattern, > + OUT BOOLEAN *Result, > + OUT EFI_REGEX_CAPTURE **Captures, OPTIONAL > + OUT UINTN *CapturesCount > + ) > +{ > + REG_EX_HANDLE Regex; > + CHAR8 *AsciiString; > + CHAR8 *AsciiPattern; > + EFI_STATUS Status; > + > + ASSERT (String != NULL); > + ASSERT (Pattern != NULL); > + ASSERT (Result != NULL); > + ASSERT (CapturesCount != NULL); > + > + // > + // Our POSIX Extended library only supports ASCII input > + // > + AsciiString = AllocatePool (StrLen (String) + 1); > + if (AsciiString == NULL) { > + return EFI_OUT_OF_RESOURCES; > + } > + UnicodeStrToAsciiStr (String, AsciiString);
I don't think this matches the spec. > + AsciiPattern = AllocatePool (StrLen (Pattern) + 1); > + if (AsciiPattern == NULL) { > + FreePool (AsciiString); > + return EFI_OUT_OF_RESOURCES; > + } > + UnicodeStrToAsciiStr (Pattern, AsciiPattern); I don't think this matches the spec. > + // > + // Compile and run the regex > + // > + Status = RegExCompile (&Regex, AsciiPattern); > + > + if (!EFI_ERROR (Status)) { > + *Result = RegExMatch (Regex, AsciiString, NULL, 0); > + } else { > + *Result = FALSE; > + } > + > + // > + // Write out the results > + // > + if (!*Result) { > + if (Captures != NULL) { > + *Captures = NULL; > + } > + *CapturesCount = 0; > + } else { > + // > + // Doesn't support sub-expression capture groups yet Doesn't meet the spec. :) -Jordan > + // > + if (Captures != NULL) { > + *Captures = AllocatePool (sizeof(EFI_REGEX_CAPTURE)); > + (*Captures)[0].CapturePtr = String; > + (*Captures)[0].Length = StrLen (String); > + } > + *CapturesCount = 1; > + } > + > + RegExFree (Regex); > + > + FreePool (AsciiPattern); > + FreePool (AsciiString); > + > + return Status; > +} > + > +/** > + Returns information about the regular expression syntax types supported > + by the implementation. > + > + This A pointer to the EFI_REGULAR_EXPRESSION_PROTOCOL > + instance. > + > + RegExSyntaxTypeListSize On input, the size in bytes of > RegExSyntaxTypeList. > + On output with a return code of EFI_SUCCESS, the > + size in bytes of the data returned in > + RegExSyntaxTypeList. On output with a return code > + of EFI_BUFFER_TOO_SMALL, the size of > + RegExSyntaxTypeList required to obtain the list. > + > + RegExSyntaxTypeList A caller-allocated memory buffer filled by the > + driver with one EFI_REGEX_SYNTAX_TYPE element > + for each supported Regular expression syntax > + type. The list must not change across multiple > + calls to the same driver. The first syntax > + type in the list is the default type for the > + driver. > + > + @retval EFI_SUCCESS The regular expression syntax types list > + was returned successfully. > + @retval EFI_UNSUPPORTED The service is not supported by this driver. > + @retval EFI_DEVICE_ERROR The list of syntax types could not be > + retrieved due to a hardware or firmware > error. > + @retval EFI_BUFFER_TOO_SMALL The buffer RegExSyntaxTypeList is too small > + to hold the result. > + @retval EFI_INVALID_PARAMETER RegExSyntaxTypeListSize is NULL > + > +**/ > +EFI_STATUS > +EFIAPI > +RegularExpressionGetInfo ( > + IN EFI_REGULAR_EXPRESSION_PROTOCOL *This, > + IN OUT UINTN *RegExSyntaxTypeListSize, > + OUT EFI_REGEX_SYNTAX_TYPE *RegExSyntaxTypeList > + ) > +{ > + UINTN SyntaxSize; > + UINTN Index; > + > + if (This == NULL || RegExSyntaxTypeListSize == NULL || RegExSyntaxTypeList > == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + SyntaxSize = ARRAY_SIZE (mSupportedSyntaxes) * > sizeof(**mSupportedSyntaxes); > + > + if (*RegExSyntaxTypeListSize < SyntaxSize) { > + *RegExSyntaxTypeListSize = SyntaxSize; > + return EFI_BUFFER_TOO_SMALL; > + } > + > + for (Index = 0; Index < ARRAY_SIZE (mSupportedSyntaxes); ++Index) { > + CopyMem (&RegExSyntaxTypeList[Index], mSupportedSyntaxes[Index], > sizeof(**mSupportedSyntaxes)); > + } > + *RegExSyntaxTypeListSize = SyntaxSize; > + > + return EFI_SUCCESS; > +} > + > +/** > + Checks if the input string matches to the regular expression pattern. > + > + This A pointer to the EFI_REGULAR_EXPRESSION_PROTOCOL instance. > + Type EFI_REGULAR_EXPRESSION_PROTOCOL is defined in Section > + XYZ. > + > + String A pointer to a NULL terminated string to match against the > + regular expression string specified by Pattern. > + > + Pattern A pointer to a NULL terminated string that represents the > + regular expression. > + > + SyntaxType A pointer to the EFI_REGEX_SYNTAX_TYPE that identifies the > + regular expression syntax type to use. May be NULL in which > + case the function will use its default regular expression > + syntax type. > + > + Result On return, points to TRUE if String fully matches against > + the regular expression Pattern using the regular expression > + SyntaxType. Otherwise, points to FALSE. > + > + Captures A Pointer to an array of EFI_REGEX_CAPTURE objects to receive > + the captured groups in the event of a match. The full > + sub-string match is put in Captures[0], and the results of N > + capturing groups are put in Captures[1:N]. If Captures is > + NULL, then this function doesn't allocate the memory for the > + array and does not build up the elements. It only returns the > + number of matching patterns in CapturesCount. If Captures is > + not NULL, this function returns a pointer to an array and > + builds up the elements in the array. CapturesCount is also > + updated to the number of matching patterns found. It is the > + caller's responsibility to free the memory pool in Captures > + and in each CapturePtr in the array elements. > + > + CapturesCount On output, CapturesCount is the number of matching patterns > + found in String. Zero means no matching patterns were found > + in the string. > + > + @retval EFI_SUCCESS The regular expression string matching > + completed successfully. > + @retval EFI_UNSUPPORTED The regular expression syntax specified by > + SyntaxType is not supported by this driver. > + @retval EFI_DEVICE_ERROR The regular expression string matching > + failed due to a hardware or firmware error. > + @retval EFI_INVALID_PARAMETER String, Pattern, Result, or CapturesCountis > + NULL. > + > +**/ > +EFI_STATUS > +EFIAPI > +RegularExpressionMatch ( > + IN EFI_REGULAR_EXPRESSION_PROTOCOL *This, > + IN CHAR16 *String, > + IN CHAR16 *Pattern, > + IN EFI_REGEX_SYNTAX_TYPE *SyntaxType, OPTIONAL > + OUT BOOLEAN *Result, > + OUT EFI_REGEX_CAPTURE **Captures, OPTIONAL > + OUT UINTN *CapturesCount > + ) > +{ > + EFI_STATUS Status; > + UINT32 Index; > + BOOLEAN Supported; > + > + if (This == NULL || String == NULL || Pattern == NULL || Result == NULL || > CapturesCount == NULL) { > + return EFI_INVALID_PARAMETER; > + } > + > + // > + // Figure out which syntax to use > + // > + if (SyntaxType == NULL) { > + SyntaxType = mSupportedSyntaxes[0]; > + } else { > + Supported = FALSE; > + for (Index = 0; Index < ARRAY_SIZE (mSupportedSyntaxes); ++Index) { > + if (CompareGuid (SyntaxType, mSupportedSyntaxes[Index])) { > + Supported = TRUE; > + break; > + } > + } > + if (!Supported) { > + return EFI_UNSUPPORTED; > + } > + } > + > + // > + // Here is where we determine which underlying library can handle the > + // requested syntax. (Or possibly one library can implement all the > + // protocols.) > + // > + if (CompareGuid (SyntaxType, &gEfiRegexSyntaxTypePosixExtendedGuid)) { > + Status = PosixExtendedMatch (String, Pattern, Result, Captures, > CapturesCount); > + } else { > + ASSERT (FALSE); > + DEBUG ((DEBUG_ERROR, "Regex Syntax %g is supported but unimplemented\n", > SyntaxType)); > + Status = EFI_DEVICE_ERROR; > + } > + > + return Status; > +} > + > +/** > + Entry point for RegularExpressionDxe. > +**/ > +EFI_STATUS > +EFIAPI > +RegularExpressionDxeEntry ( > + IN EFI_HANDLE ImageHandle, > + IN EFI_SYSTEM_TABLE *SystemTable > + ) > +{ > + EFI_STATUS Status; > + > + STATIC > + CONST EFI_REGULAR_EXPRESSION_PROTOCOL ProtocolInstance = { > + RegularExpressionMatch, > + RegularExpressionGetInfo > + }; > + > + (VOID)SystemTable; > + > + Status = gBS->InstallMultipleProtocolInterfaces ( > + &ImageHandle, > + &gEfiRegularExpressionProtocolGuid, > + &ProtocolInstance, > + NULL > + ); > + > + return Status; > +} > diff --git > a/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.inf > b/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.inf > new file mode 100644 > index 0000000..b83f105 > --- /dev/null > +++ b/MdeModulePkg/Universal/RegularExpressionDxe/RegularExpressionDxe.inf > @@ -0,0 +1,44 @@ > +## > +# @file > +# > +# EFI_REGULAR_EXPRESSION_PROTOCOL Implementation > +# > +# Copyright (c) 2015, Hewlett-Packard Development Company, L.P.<BR> > +# > +# This program and the accompanying materials are licensed and made > available > +# under the terms and conditions of the BSD License that accompanies this > +# distribution. The full text of the license may be found at > +# http://opensource.org/licenses/bsd-license.php. > +# > +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, > WITHOUT > +# WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. > +## > + > +[Defines] > + INF_VERSION = 0x00010018 > + BASE_NAME = RegularExpressionDxe > + FILE_GUID = 3E197E9C-D8DC-42D3-89CE-B04FA9833756 > + MODULE_TYPE = UEFI_DRIVER > + VERSION_STRING = 1.0 > + ENTRY_POINT = RegularExpressionDxeEntry > + > +[Sources] > + RegularExpressionDxe.c > + > +[Packages] > + MdePkg/MdePkg.dec > + MdeModulePkg/MdeModulePkg.dec > + > +[LibraryClasses] > + UefiBootServicesTableLib > + UefiDriverEntryPoint > + MemoryAllocationLib > + BaseMemoryLib > + DebugLib > + RegExLib > + > +[Guids] > + gEfiRegexSyntaxTypePosixExtendedGuid > + > +[Protocols] > + gEfiRegularExpressionProtocolGuid > -- > 2.4.1 > > > ------------------------------------------------------------------------------ > One dashboard for servers and applications across Physical-Virtual-Cloud > Widest out-of-the-box monitoring support with 50+ applications > Performance metrics, stats and reports that give you Actionable Insights > Deep dive visibility with transaction tracing using APM Insight. > http://ad.doubleclick.net/ddm/clk/290420510;117567292;y > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/edk2-devel ------------------------------------------------------------------------------ _______________________________________________ edk2-devel mailing list edk2-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/edk2-devel