/** @file
Header file for helper functions useful for accessing files.

Copyright (c) 2004 - 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 {
  CHAR8 *FileImage;
  CHAR8 *Eof;
  CHAR8 *CurrentFilePointer;
} MEMORY_FILE;


//
// Functions declarations
//

/**
  This opens a file, reads it into memory and returns a memory file
  object.

  @param InputFile          Memory file image.
  @param OutputMemoryFile   Handle to memory file

  @return EFI_STATUS
  OutputMemoryFile is valid if !EFI_ERROR
**/
EFI_STATUS
GetMemoryFile (
  IN CHAR8       *InputFileName,
  OUT EFI_HANDLE *OutputMemoryFile
  )
;

/**
  Frees all memory associated with the input memory file.

  @param InputMemoryFile   Handle to memory file

  @return EFI_STATUS
**/
EFI_STATUS
FreeMemoryFile (
  IN EFI_HANDLE InputMemoryFile
  )
;

/**
  This function reads a line from the memory file.  The newline characters
  are stripped and a null terminated string is returned.

  If the string pointer returned is non-NULL, then the caller must free the
  memory associated with this string.

  @param InputMemoryFile   Handle to memory file

  @retval NULL if error or EOF
  @retval NULL character termincated string otherwise (MUST BE FREED BY CALLER)
**/
CHAR8 *
ReadMemoryFileLine (
  IN EFI_HANDLE     InputMemoryFile
  )
;
