/** @file
  Configuration Manager Object parser.

  Copyright (c) 2021, ARM Limited. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef CONFIGURATION_MANAGER_OBJECT_PARSER_H_
#define CONFIGURATION_MANAGER_OBJECT_PARSER_H_

#define OUTPUT_FIELD_COLUMN_WIDTH   32

/** Function prototype to format a field print.

  @param [in] Format  Format string for tracing the data as specified by
                      the 'Format' member of ACPI_PARSER.
  @param [in] Ptr     Pointer to the start of the buffer.
**/
typedef VOID (EFIAPI *FNPTR_PRINT_FORMATTER)(CONST CHAR8* Format, UINT8* Ptr);

/**
  The CM_OBJ_PARSER structure describes the fields of an CmObject and
  provides means for the parser to interpret and trace appropriately.

  ParseAcpi() uses the format string specified by 'Format' for tracing
  the field data.
*/
typedef struct CmObjParser CM_OBJ_PARSER;
struct CmObjParser {

  /// String describing the Cm Object
  CONST CHAR8*            NameStr;

  /// The length of the field.
  UINT32                  Length;

  /// Optional Print() style format string for tracing the data. If not
  /// used this must be set to NULL.
  CONST CHAR8*            Format;

  /// Optional pointer to a print formatter function which
  /// is typically used to trace complex field information.
  /// If not used this must be set to NULL.
  /// The Format string is passed to the PrintFormatter function
  /// but may be ignored by the implementation code.
  FNPTR_PRINT_FORMATTER   PrintFormatter;

  /// Optional pointer to print the fields of another CM_OBJ_PARSER
  /// structure. This is useful to print sub-structures.
  CONST CM_OBJ_PARSER     *SubObjParser;

  /// Count of items in the SubObj.
  UINTN                   SubObjItemCount;
};

/**
  A structure mapping an array of Configuration Manager Object parsers
  with their object names.
*/
typedef struct CmObjParserArray {

  /// Object name
  CONST CHAR8         * ObjectName;

  /// Function pointer to the parser
  CONST CM_OBJ_PARSER * Parser;

  /// Count of items
  UINTN                 ItemCount;
} CM_OBJ_PARSER_ARRAY;

#endif // CONFIGURATION_MANAGER_OBJECT_PARSER_H_
