/**********************************************************************
// @@@ START COPYRIGHT @@@
//
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements.  See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.  The ASF licenses this file
// to you 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.
//
// @@@ END COPYRIGHT @@@
**********************************************************************/
/*
 * idltype.h
 *
 * Andrew Schofield, Wednesday, the 6th of October 1995
 *
 * $Id: idltype.h 1.10 2000/02/10 12:28:28 ASchofield Exp $
 *
 * Header file containing 'C' type definitions corresponding to
 * IDL types and macros
 *
 * The declarations cascade for portability reasons, e.g.
 * IDL_char is used to define IDL_string and IDL_octet is used
 * to define IDL_boolean.
 */
#ifndef IDLTYPE_H
#define IDLTYPE_H

/*
 * Figure out the compilation enviroment 
 * Let's start with TRU64 and alpha
 */
#if defined __alpha && !defined __vms
#define IDL_LP_64
#endif

/*
 * Solaris sparc(v9) 64bit enviroment
 */
#if defined __sun  && defined _LP64 
#define IDL_LP_64
#endif
/*
 * HPUX HPPA 64bit enviroment
 */
#if defined __hpux  && defined __LP64__
#define IDL_LP_64
#endif

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Version
 */
#define IDL_TYPE_H_VERSION 19971225

/*
 * One byte types
 */
typedef unsigned char IDL_octet;
#define IDL_octet_min		((IDL_octet) 0)
#define IDL_octet_max		((IDL_octet) 255)

typedef char IDL_char;
#define IDL_char_min		((IDL_char) -128)
#define IDL_char_max		((IDL_char)  127)

typedef IDL_octet IDL_boolean;
#define IDL_TRUE  		((IDL_boolean) 1)
#define IDL_FALSE 		((IDL_boolean) 0)

/*
 * Two byte integers
 */
typedef short IDL_short;
#define IDL_short_min	       	((IDL_short) -32768)
#define IDL_short_max		((IDL_short)  32767)

typedef unsigned short IDL_unsigned_short;
#define IDL_unsigned_short_min	((IDL_unsigned_short) 0)
#define IDL_unsigned_short_max	((IDL_unsigned_short) 65535)

/*
 * Four byte integers
 */
#if defined(IDL_LP_64)
    typedef int IDL_long;
    typedef unsigned int IDL_unsigned_long;
#else
#ifdef _WIN32
    typedef long IDL_long;
    typedef unsigned long IDL_unsigned_long;
#else
    typedef int IDL_long;
    typedef unsigned int IDL_unsigned_long;
#endif
#endif

/*
 * for 64bit StmtHandle
 */

typedef long Long;

/* Some compilers don't deal well with large negative numbers */
#define IDL_long_min	       	((IDL_long) -2147483647 - 1)
#define IDL_long_max		((IDL_long)  2147483647)

#define IDL_unsigned_long_min	((IDL_unsigned_long) 0)
#ifdef _MSC_VER
#define IDL_unsigned_long_max	((IDL_unsigned_long) 4294967295)
#else
#define IDL_unsigned_long_max	((IDL_unsigned_long) 4294967295UL)
#endif

typedef IDL_long IDL_enum;
#define IDL_enum_min	  	((IDL_enum) 0)
#define IDL_enum_max		((IDL_enum) IDL_long_max)

typedef IDL_long IDL_union_discriminator;

/*
 * Eight byte integers
 */
#if defined(_MSC_VER) || defined(__vms)
typedef __int64 IDL_long_long;
#else
#ifndef __cplusplus
typedef long long IDL_long_long;
#else
#if defined(__USLC__) /* UNIXWARE */ || defined(__hpux) \
  || (defined(__nonstopux) && !defined(_LONGLONG)) /* NSUXB */
typedef union IDL_long_long_tag
{
  IDL_long	v_long[2];	     /* must be first, see IDL_long_long_max */
  double 	v_double; 			   /* force 8 byte alignment */
  char   	v_char[8];
  IDL_short	v_short[4];
} IDL_long_long;
#define IDL_long_long_faked
#else
typedef long long IDL_long_long;
#endif /* __USLC__ || __hpux */
#endif /* __cplusplus */
#endif /* _MSC_VER */

#if defined(_MSC_VER) || defined(__vms)  
typedef unsigned __int64 IDL_unsigned_long_long;
#else
typedef unsigned long long IDL_unsigned_long_long;
#endif


#ifdef IDL_long_long_faked
/* These declarations only work as initializers */
#define IDL_long_long_min	{ IDL_long_min, IDL_long_min }
/* Approximate max, since can't assume byte order */
#define IDL_long_long_max	{ IDL_long_max, IDL_long_max }

#define IDL_unsigned_long_long_min  	{ 0, 0 }
#define IDL_unsigned_long_long_max 	IDL_long_long_max

#else

#if defined(_MSC_VER) || defined(__vms) || defined(__nonstopux) || defined(__alpha) || defined(__SunOS_5_7)
#define IDL_long_long_min	((IDL_long_long) -9223372036854775807 - 1)
#define IDL_long_long_max	((IDL_long_long)  9223372036854775807)
#else
#define IDL_long_long_min	((IDL_long_long) -9223372036854775807LL - 1)
#define IDL_long_long_max	((IDL_long_long)  9223372036854775807LL)
#endif

#define IDL_unsigned_long_long_min  	((IDL_unsigned_long_long) 0)
#define IDL_unsigned_long_long_max	\
                                   ((IDL_unsigned_long_long) IDL_long_long_max)
#endif

/*
 * Real numbers
 */
typedef float IDL_float;
typedef double IDL_double;

/*
 * Pointers
 */
#if defined(IDL_LP_64)
#define IDL_PTR_SIZE 8
#endif

#ifndef IDL_PTR_SIZE
#define IDL_PTR_SIZE 4
#endif

/*
 * Defines to pad pointers to a fixed size (8 bytes)
 */
#if IDL_PTR_SIZE == 8
#define IDL_PTR_PAD(name, count)
#else
#define IDL_PTR_PAD(name, count)  char name##pad_[8 - IDL_PTR_SIZE] [count];
#endif

/*
 * Any type
 */
typedef struct {
  void *_type;
  IDL_PTR_PAD(_type, 1)
  void *_value;
  IDL_PTR_PAD(_value, 1)
} IDL_any;

/*
 * Unbounded string
 */
typedef IDL_char *IDL_string;

/*
 * Object reference
 */
typedef char *IDL_Object;

/*
 * Void type
 */
typedef void IDL_void;

/*
 * TypeCode
 */
typedef void *IDL_TypeCode;

/*
 * Principal
 */
typedef struct IDL_Principal_seq_ {
  IDL_unsigned_long _length;
  char pad_to_offset_8_[4];
  IDL_octet *_buffer;
  IDL_PTR_PAD(_buffer, 1)
} IDL_Principal;

#ifdef __cplusplus
}
#endif
#endif /* IDLTYPE_H */

