/** @file
  Global data for the program environment.

  Copyright (c) 2010 - 2011, 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 which 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.
**/
#include  <Uefi.h>

#include  <stdio.h>
#include  <stdlib.h>
#include  <sys/types.h>
#include  <limits.h>
#include  <signal.h>
#include  <time.h>
#include  <setjmp.h>

#include  <kfile.h>
#include  <Device/Device.h>

#include  "Device/Console.h"

/* ##################  Type Declarations  ################################# */

/** The type of an atexit handler function. **/
typedef void            __xithandler_t(void);

/* ##################  Global Declarations  ############################### */
#ifndef TYPE_BIT
#define TYPE_BIT(type)  (sizeof (type) * CHAR_BIT)
#endif /* !defined TYPE_BIT */

#ifndef TYPE_SIGNED
#define TYPE_SIGNED(type) (((type) -1) < 0)
#endif /* !defined TYPE_SIGNED */

#ifndef INT_STRLEN_MAXIMUM
/*
** 302 / 1000 is log10(2.0) rounded up.
** Subtract one for the sign bit if the type is signed;
** add one for integer division truncation;
** add one more for a minus sign if the type is signed.
*/
#define INT_STRLEN_MAXIMUM(type) \
((TYPE_BIT(type) - TYPE_SIGNED(type)) * 302 / 1000 + 1 + TYPE_SIGNED(type))
#endif /* !defined INT_STRLEN_MAXIMUM */

/*
** Big enough for something such as
** ??? ???-2147483648 -2147483648:-2147483648:-2147483648 -2147483648\n
** (two three-character abbreviations, five strings denoting integers,
** three explicit spaces, two explicit colons, a newline,
** and a trailing ASCII nul).
*/
#define ASCTIME_BUFLEN  ((2 * 3) + (5 * INT_STRLEN_MAXIMUM(int)) + 3 + 2 + 1 + 1)

struct __filedes;   /* Forward Reference */
struct stat;        /* Forward Reference so I don't have to include <stat.h> */

struct  __MainData {
  // File descriptors
  struct __filedes  fdarray[OPEN_MAX];
  // Low-level File abstractions for the stdin, stdout, stderr streams
  ConInstance      *StdIo[3];

  // Signal Handlers
  __sighandler_t    *sigarray[SIG_LAST];      // Pointers to signal handlers

  char              *NArgV[ARGC_MAX];         // Narrow character argv array
  char              *NCmdLine;                // Narrow character version of command line arguments.

  void (*cleanup)(void);        // Stdio Cleanup Function Pointer

  __xithandler_t   *atexit_handler[ATEXIT_MAX];  // Array of handlers for atexit.
  clock_t           AppStartTime;                // Set in Main.c and used for time.h
  clock_t           ClocksPerSecond;             // Set in Main.c and used for time.h
  int               num_atexit;                  ///< Number of registered atexit handlers.

  CHAR16            UString[UNICODE_STRING_MAX];
  CHAR16            UString2[UNICODE_STRING_MAX];
  struct tm         BDTime;                       // Broken-down time structure for localtime.
  EFI_TIME          TimeBuffer;                   // Used by <time.h>mk
  char              ASgetenv[ASCII_STRING_MAX];   // Only modified by getenv
  char              ASasctime[ASCTIME_BUFLEN];    // Only modified by asctime

  jmp_buf           MainExit;                     ///< Save environment used for implementing _Exit()
  int               ExitValue;                    ///< Value being returned by _Exit()

  BOOLEAN         aborting;                       // Ensures cleanup function only called once when aborting.
};

extern struct  __MainData  *gMD;
