/*
 * Copyright (C) 2018 Synaptics Incorporated. All rights reserved.
 * Copyright 2006 Marvell Semiconductor Inc
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 *
 * INFORMATION CONTAINED IN THIS DOCUMENT IS PROVIDED "AS-IS," AND
 * SYNAPTICS EXPRESSLY DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES,
 * INCLUDING ANY IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE, AND ANY WARRANTIES OF NON-INFRINGEMENT OF ANY
 * INTELLECTUAL PROPERTY RIGHTS. IN NO EVENT SHALL SYNAPTICS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, PUNITIVE, OR
 * CONSEQUENTIAL DAMAGES ARISING OUT OF OR IN CONNECTION WITH THE USE
 * OF THE INFORMATION CONTAINED IN THIS DOCUMENT, HOWEVER CAUSED AND
 * BASED ON ANY THEORY OF LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * NEGLIGENCE OR OTHER TORTIOUS ACTION, AND EVEN IF SYNAPTICS WAS
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. IF A TRIBUNAL OF
 * COMPETENT JURISDICTION DOES NOT PERMIT THE DISCLAIMER OF DIRECT
 * DAMAGES OR ANY OTHER DAMAGES, SYNAPTICS' TOTAL CUMULATIVE LIABILITY
 * TO ANY PARTY SHALL NOT EXCEED ONE HUNDRED U.S. DOLLARS.
 */

/*---------------------------------------------------------------------------
    Description:    Basic numeric types, nothing more.
    Author:         Hongjie Guan
  ---------------------------------------------------------------------------*/

#ifndef CTYPES_H_
#define CTYPES_H_


/*---------------------------------------------------------------------------
    Microsoft Visual C++
  ---------------------------------------------------------------------------*/
#if defined (_MSC_VER)

    typedef	unsigned char       UNSG8;
    typedef	signed char         SIGN8;
    typedef	unsigned short      UNSG16;
    typedef	signed short        SIGN16;
    typedef	unsigned int        UNSG32;
    typedef	signed int          SIGN32;
    typedef	unsigned __int64    UNSG64;
    typedef	signed __int64      SIGN64;
    typedef	float               REAL32;
    typedef	double              REAL64;

    #ifndef INLINE
        #define	INLINE          static __forceinline
    #endif

/*---------------------------------------------------------------------------
    ARMCC (RVCT)
  ---------------------------------------------------------------------------*/
#elif defined (__ARMCC_VERSION)

    typedef	unsigned char       UNSG8;
    typedef	signed char         SIGN8;
    typedef	unsigned short      UNSG16;
    typedef	signed short        SIGN16;
    typedef	unsigned int        UNSG32;
    typedef	signed int          SIGN32;
    typedef	unsigned long long  UNSG64;
    typedef	signed long long    SIGN64;
    typedef	float               REAL32;
    typedef	double              REAL64;

    #ifndef INLINE
        #define INLINE          static __inline
    #endif

/*---------------------------------------------------------------------------
    GNU C/C++
  ---------------------------------------------------------------------------*/
#elif defined (__GNUC__)

    typedef	unsigned char       UNSG8;
    typedef	signed char         SIGN8;
    typedef	unsigned short      UNSG16;
    typedef	signed short        SIGN16;
    typedef	unsigned int        UNSG32;
    typedef	signed int          SIGN32;
    typedef	unsigned long long  UNSG64;
    typedef	signed long long    SIGN64;
    typedef	float               REAL32;
    typedef	double              REAL64;

    #ifndef INLINE
        #define INLINE          static inline
    #endif

#endif


/*---------------------------------------------------------------------------
    NULL
  ---------------------------------------------------------------------------*/

#ifndef NULL
    #ifdef __cplusplus
        #define NULL            0
    #else
        #define NULL            ((void *)0)
    #endif
#endif


/*---------------------------------------------------------------------------
    Multiple-word types
  ---------------------------------------------------------------------------*/
#ifndef	Txxb
	#define	Txxb
	typedef	UNSG8				T8b;
	typedef	UNSG16				T16b;
	typedef	UNSG32				T32b;
	typedef	UNSG32				T64b [2];
	typedef	UNSG32				T96b [3];
	typedef	UNSG32				T128b[4];
	typedef	UNSG32				T160b[5];
	typedef	UNSG32				T192b[6];
	typedef	UNSG32				T224b[7];
	typedef	UNSG32				T256b[8];
#endif



#endif
