/** @file
    Machine dependent ANSI type definitions.

    Copyright (c) 2010-2012, 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.

 * Copyright (c) 1990, 1993
 *  The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *  from: @(#)ansi.h  8.2 (Berkeley) 1/4/94
    NetBSD: ansi.h,v 1.7 2006/10/04 13:51:59 tnozaki Exp
**/
#ifndef _ANSI_H_
#define _ANSI_H_

#include <sys/EfiCdefs.h>

#include <machine/int_types.h>

/*
 * Types which are fundamental to the implementation and may appear in
 * more than one standard header are defined here.  Standard headers
 * then use:
 *  #ifdef  _BSD_SIZE_T_
 *  typedef _BSD_SIZE_T_ size_t;
 *  #undef  _BSD_SIZE_T_
 *  #endif
 */
#define _BSD_CLOCK_T_     _EFI_CLOCK_T      /* clock() */
#define _BSD_PTRDIFF_T_   _EFI_PTRDIFF_T_   /* ptr1 - ptr2 */
#define _BSD_SIZE_T_      _EFI_SIZE_T_      /* sizeof() */
#define _BSD_SSIZE_T_     INTN              /* byte count or error */
#define _BSD_TIME_T_      _EFI_TIME_T       /* time() */
#define _BSD_VA_LIST_     VA_LIST
#define _BSD_CLOCKID_T_   INT64             /* clockid_t */
#define _BSD_TIMER_T_     INT64             /* timer_t */
#define _BSD_SUSECONDS_T_ INT64             /* suseconds_t */
#define _BSD_USECONDS_T_  UINT64            /* useconds_t */

/*
 * NOTE: rune_t is not covered by ANSI nor other standards, and should not
 * be instantiated outside of lib/libc/locale.  use wchar_t.
 *
 * Runes (wchar_t) is declared to be an ``int'' instead of the more natural
 * ``unsigned long'' or ``long''.  Two things are happening here.  It is not
 * unsigned so that EOF (-1) can be naturally assigned to it and used.  Also,
 * it looks like 10646 will be a 31 bit standard.  This means that if your
 * ints cannot hold 32 bits, you will be in trouble.  The reason an int was
 * chosen over a long is that the is*() and to*() routines take ints (says
 * ANSI C), but they use _RUNE_T_ instead of int.  By changing it here, you
 * lose a bit of ANSI conformance, but your programs will still work.
 *
 * Note that _WCHAR_T_ and _RUNE_T_ must be of the same type.  When wchar_t
 * and rune_t are typedef'd, _WCHAR_T_ will be undef'd, but _RUNE_T remains
 * defined for ctype.h.
 */
#define _BSD_WCHAR_T_       _EFI_WCHAR_T    /* wchar_t */
#define _BSD_WINT_T_        _EFI_WINT_T     /* wint_t */
#define _BSD_RUNE_T_        _EFI_WCHAR_T    /* rune_t */
#define _BSD_WCTRANS_T_     void *          /* wctrans_t */
#define _BSD_WCTYPE_T_      unsigned int    /* wctype_t */

/*
 * mbstate_t is an opaque object to keep conversion state, during multibyte
 * stream conversions.  The content must not be referenced by user programs.
 */
typedef struct {
  UINT32  A;      // Np;
  UINT32  B;      // U;
  UINT32  E;      // L
  UINT8   C[4];   // n[4]
  UINT16  D[2];   // w[2]
} __mbstate_t;
#define _BSD_MBSTATE_T_   __mbstate_t /* mbstate_t */

#endif  /* _ANSI_H_ */
