/** @file
  This section defines the Regular Expression Protocol. This protocol isused to match
  Unicode strings against Regular Expression patterns.

Copyright (c) 2015, Intel Corporation. All rights reserved.<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.

**/

#ifndef __REGULAR_EXPRESSION_PROTOCOL_H__
#define __REGULAR_EXPRESSION_PROTOCOL_H__

#define EFI_REGULAR_EXPRESSION_PROTOCOL_GUID \
  { \
    0xB3F79D9A, 0x436C, 0xDC11, {0xB0, 0x52, 0xCD, 0x85, 0xDF, 0x52, 0x4C, 0xE6 } \
  }

#define EFI_REGEX_SYNTAX_TYPE_POSIX_EXTENDED_GUID \
  { \
    0x5F05B20F, 0x4A56, 0xC231, {0xFA, 0x0B, 0xA7, 0xB1, 0xF1, 0x10, 0x04, 0x1D } \
  }

#define EFI_REGEX_SYNTAX_TYPE_PERL_GUID \
  { \
    0x63E60A51, 0x497D, 0xD427, {0xC4, 0xA5, 0xB8, 0xAB, 0xDC, 0x3A, 0xAE, 0xB6 } \
  }

#define EFI_REGEX_SYNTAX_TYPE_ECMA_262_GUID \
  { \
    0x9A473A4A, 0x4CEB, 0xB95A, {0x41, 0x5E, 0x5B, 0xA0, 0xBC, 0x63, 0x9B, 0x2E } \
  }

typedef struct _EFI_REGULAR_EXPRESSION_PROTOCOL  EFI_REGULAR_EXPRESSION_PROTOCOL;


typedef struct {
  CONST CHAR16 *CapturePtr; // Pointer to the start of the captured sub-expression
                            // within matched String.

  UINTN        Length;      // Length of captured sub-expression.
} EFI_REGEX_CAPTURE;

typedef EFI_GUID EFI_REGEX_SYNTAX_TYPE;

//
// Protocol member functions
//
/**
  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
                           RegExSyntaxTypeListrequired to obtain the list.

  RegExSyntaxTypeList      A caller-allocated memory buffer filled by the
                           driver with one EFI_REGEX_SYNTAX_TYPEelement
                           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

**/
typedef
EFI_STATUS
(EFIAPI *EFI_REGULAR_EXPRESSION_GET_INFO) (
  IN     EFI_REGULAR_EXPRESSION_PROTOCOL *This,
  IN OUT UINTN                           *RegExSyntaxTypeListSize,
  OUT    EFI_REGEX_SYNTAX_TYPE           *RegExSyntaxTypeList
  );

/**
  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
                                 SyntaxTypeis 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.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_REGULAR_EXPRESSION_MATCH) (
  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
  );

struct _EFI_REGULAR_EXPRESSION_PROTOCOL {
  EFI_REGULAR_EXPRESSION_MATCH     MatchString;
  EFI_REGULAR_EXPRESSION_GET_INFO  GetInfo;
} ;

extern EFI_GUID gEfiRegularExpressionProtocolGuid;

//
// For regular expression rules specified in the POSIX Extended Regular
// Expression (ERE) Syntax:
//
extern EFI_GUID gEfiRegexSyntaxTypePosixExtendedGuid;

//
// For regular expression rules specifiedin the ECMA 262 Specification
//
extern EFI_GUID gEfiRegexSyntaxTypeEcma262Guid;

//
// For regular expression rules specified in the Perl standard:
//
extern EFI_GUID gEfiRegexSyntaxTypePerlGuid;

#endif
