/* ------------------------------------------------------------------
 * Copyright (C) 1998-2009 PacketVideo
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 * -------------------------------------------------------------------
 */
// -*- c++ -*-
// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =

//         O S C L C O N F I G _ U N I X _ C O M M O N

// = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = =


/*! \file osclconfig_limits_typedefs.h
 *  \brief This file contains common typedefs based on the ANSI C limits.h header
 *
 *  This header file should work for any ANSI C compiler to determine the
 *  proper native C types to use for OSCL integer types.
 */


#ifndef OSCLCONFIG_UNIX_COMMON_H_INCLUDED
#define OSCLCONFIG_UNIX_COMMON_H_INCLUDED


// system header files
#include <stdlib.h> // abort
#include <stdarg.h> // va_list
#include <sys/types.h>
#include <stdio.h>
#include <wchar.h>
#include <string.h>
#include <unistd.h> //for sleep
#include <pthread.h>
#include <ctype.h> // for tolower and toupper
#ifdef __cplusplus
#include <new> //for placement new
#endif
#include <math.h>

#define OSCL_DISABLE_INLINES                0

#define OSCL_HAS_ANSI_STDLIB_SUPPORT        1
#define OSCL_HAS_ANSI_MATH_SUPPORT          1
#define OSCL_HAS_GLOBAL_VARIABLE_SUPPORT    1
#define OSCL_HAS_ANSI_STRING_SUPPORT        1
#define OSCL_HAS_ANSI_WIDE_STRING_SUPPORT   1
#define OSCL_HAS_ANSI_STDIO_SUPPORT         1

#define OSCL_MEMFRAG_PTR_BEFORE_LEN         1

#define OSCL_HAS_UNIX_SUPPORT               1
#define OSCL_HAS_MSWIN_SUPPORT              0
#define OSCL_HAS_SYMBIAN_SUPPORT            0

// 64-bit int
#define OSCL_HAS_NATIVE_INT64_TYPE 1
#define OSCL_HAS_NATIVE_UINT64_TYPE 1
#define OSCL_NATIVE_INT64_TYPE     int64_t
#define OSCL_NATIVE_UINT64_TYPE    uint64_t
#define INT64(x) x##LL
#define UINT64(x) x##ULL
#define INT64_HILO(high,low) ((((high##LL))<<32)|low)
#define UINT64_HILO(high,low) ((((high##ULL))<<32)|low)

// character set.
#define OSCL_HAS_UNICODE_SUPPORT            1
#define OSCL_NATIVE_WCHAR_TYPE wchar_t
#if (OSCL_HAS_UNICODE_SUPPORT)
#define _STRLIT(x) L ## x
#else
#define _STRLIT(x) x
#endif
#define _STRLIT_CHAR(x) x
#define _STRLIT_WCHAR(x) L ## x

// Thread-local storage.  Unix has keyed TLS.
#define OSCL_HAS_TLS_SUPPORT    1
#define OSCL_TLS_IS_KEYED 1
typedef pthread_key_t TOsclTlsKey ;
#define OSCL_TLS_KEY_CREATE_FUNC(key) (pthread_key_create(&key,NULL)==0)
#define OSCL_TLS_KEY_DELETE_FUNC(key) pthread_key_delete(key)
#define OSCL_TLS_STORE_FUNC(key,ptr) (pthread_setspecific(key,(const void*)ptr)==0)
#define OSCL_TLS_GET_FUNC(key) pthread_getspecific(key)

//Basic lock
#define OSCL_HAS_BASIC_LOCK 1
#include <pthread.h>
typedef pthread_mutex_t TOsclBasicLockObject;

#endif // OSCLCONFIG_UNIX_COMMON_H_INCLUDED

