/** @file
  Definitions of Hii Expression.
  Copyright (c) 2019, Intel Corporation. All rights reserved.
  (C) Copyright 2021 Hewlett Packard Enterprise Development LP
  Copyright (c) 2022-2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/
#ifndef HII_EXPRESSION_H_
#define HII_EXPRESSION_H_
#include 
/**
  Get the expression list count.
  @param[in]  Level              Which type this expression belong to. Form,
                                 statement or option?
  @retval >=0                    The expression count
  @retval -1                     Input parameter error.
**/
INTN
GetConditionalExpressionCount (
  IN EXPRESS_LEVEL  Level
  );
/**
  Get the expression Buffer pointer.
  @param[in]  Level              Which type this expression belong to. Form,
                                 statement or option?
  @retval  The start pointer of the expression buffer or NULL.
**/
HII_EXPRESSION **
GetConditionalExpressionList (
  IN EXPRESS_LEVEL  Level
  );
/**
  Push the expression options onto the Stack.
  @param[in]  Pointer            Pointer to the current expression.
  @param[in]  Level              Which type this expression belong to. Form,
                                 statement or option?
  @retval EFI_SUCCESS            The value was pushed onto the stack.
  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the stack.
**/
EFI_STATUS
PushConditionalExpression (
  IN HII_EXPRESSION  *Pointer,
  IN EXPRESS_LEVEL   Level
  );
/**
  Pop the expression options from the Stack
  @param[in]  Level              Which type this expression belong to. Form,
                                 statement or option?
  @retval EFI_SUCCESS            The value was pushed onto the stack.
  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the stack.
**/
EFI_STATUS
PopConditionalExpression (
  IN EXPRESS_LEVEL  Level
  );
/**
  Reset stack pointer to begin of the stack.
**/
VOID
ResetCurrentExpressionStack (
  VOID
  );
/**
  Push current expression onto the Stack
  @param[in]  Pointer            Pointer to current expression.
  @retval EFI_SUCCESS            The value was pushed onto the stack.
  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the stack.
**/
EFI_STATUS
PushCurrentExpression (
  IN VOID  *Pointer
  );
/**
  Pop current expression from the Stack
  @param[in]  Pointer            Pointer to current expression to be pop.
  @retval EFI_SUCCESS            The value was pushed onto the stack.
  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the stack.
**/
EFI_STATUS
PopCurrentExpression (
  OUT VOID  **Pointer
  );
/**
  Reset stack pointer to begin of the stack.
**/
VOID
ResetMapExpressionListStack (
  VOID
  );
/**
  Push the list of map expression onto the Stack
  @param[in]  Pointer            Pointer to the list of map expression to be pushed.
  @retval EFI_SUCCESS            The value was pushed onto the stack.
  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the stack.
**/
EFI_STATUS
PushMapExpressionList (
  IN VOID  *Pointer
  );
/**
  Pop the list of map expression from the Stack
  @param[in]  Pointer            Pointer to the list of map expression to be pop.
  @retval EFI_SUCCESS            The value was pushed onto the stack.
  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the stack.
**/
EFI_STATUS
PopMapExpressionList (
  OUT VOID  **Pointer
  );
/**
  Reset stack pointer to begin of the stack.
**/
VOID
ResetScopeStack (
  VOID
  );
/**
  Push an Operand onto the Stack
  @param[in]  Operand            Operand to push.
  @retval EFI_SUCCESS            The value was pushed onto the stack.
  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the
                                 stack.
**/
EFI_STATUS
PushScope (
  IN UINT8  Operand
  );
/**
  Pop an Operand from the Stack
  @param[out]  Operand           Operand to pop.
  @retval EFI_SUCCESS            The value was pushed onto the stack.
  @retval EFI_OUT_OF_RESOURCES   There is not enough system memory to grow the
                                 stack.
**/
EFI_STATUS
PopScope (
  OUT UINT8  *Operand
  );
#endif