/******************************************************************************* * BDX: Binary Data eXchange format library * Copyright (C) 1999--2006 Thomas Baier * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, a copy is available at * http://www.r-project.org/Licenses/ * ******************************************************************************/ #ifndef _BDX_H_ #define _BDX_H_ #ifdef __cplusplus extern "C" { #endif #include "SC_system.h" /* BDX: Binary Data eXchange Format */ /* * BDX version information * * 1 ... first version, never set * 2 ... removed magic, added version, changed data type defines * 3 ... added generic data type, special symbols (N/A, ERROR), objects */ #define BDX_VERSION 3 /* * Vtbl version information: * * 1 ... first interface (bdx_free, bdx_trace, Variant2BDX, BDX2Variant) */ #define BDX_VTBL_VERSION 1 #if 1 /* * very simple implementation, maybe use HDF5 in the future, or expand this * format (see rest of file) * * supported are scalars, arrays, vectors and lists * * scalar types: * * - GENERIC (element can be any type; only supported for arrays of GENERIC) * - BOOL * - double * - (long) integer * - STRING * - SPECIAL (element is a special value, like n/a or an error code) * * arrays of scalars (of any dimension), this includes GENERIC, too */ /* 04-03-02 | baier | BDX_LIST new, BDX_CMASK extended, removed BDX_VECTOR */ #define BDX_SCALAR 0x00010000 #define BDX_ARRAY 0x00020000 /* #define BDX_VECTOR 0x00040000 */ #define BDX_LIST 0x00080000 #define BDX_CMASK 0x000f0000 /* 04-03-02 | baier | BDX_GENERIC new, BDX_NULL changed to BDX_SPECIAL */ /* 04-11-16 | baier | BDX_HANDLE new (for COM objects), BDX_POINTER new */ #define BDX_GENERIC 0x00000000 #define BDX_BOOL 0x00000001 #define BDX_INT 0x00000002 #define BDX_DOUBLE 0x00000004 #define BDX_STRING 0x00000008 #define BDX_SPECIAL 0x00000010 #define BDX_HANDLE 0x00000020 /* COM object in BDX_RawData::ptr; marshalled in an IStream using CoMarshalInterThreadInterfaceInStream() */ #define BDX_POINTER 0x00000040 /* raw pointer in BDX_RawData::ptr; reserved. */ #define BDX_SMASK 0x0000007f /* 04-03-02 | baier | special value definitions */ /* 04-10-15 | baier | added rest */ #define BDX_SV_NULL 0x00000000 /* null element */ #define BDX_SV_NA 0x00000001 /* missing value */ #define BDX_SV_DIV0 0x00000002 /* division by zero */ #define BDX_SV_NAN 0x00000003 /* NAN (not a number) */ #define BDX_SV_INF 0x00000004 /* +Inf */ #define BDX_SV_NINF 0x00000005 /* -Inf */ #define BDX_SV_UNK 0xffffffff /* unknown code */ typedef long BDX_Dimension; typedef unsigned long BDX_Count; typedef unsigned long BDX_Version; typedef unsigned long BDX_Type; typedef union _BDX_RawData { unsigned long bool_value; double double_value; long int int_value; char* string_value; unsigned long special_value; void* ptr; } BDX_RawData; /* 04-03-02 | baier | new for transfer of non-typed arrays */ typedef struct _BDX_RawDataWithType { BDX_Type type; /* data type of element (not only scalar!) */ BDX_RawData raw_data; } BDX_RawDataWithType; typedef struct _BDX_NamedRawDataWithType { BDX_Type type; /* data type of element (not only scalar!) */ char* name; /* name for list elements */ BDX_RawData raw_data; } BDX_NamedRawDataWithType; /* 04-03-02 | baier | BDX_Data reworked, now data union with diff. members */ typedef struct _BDX_Data { BDX_Version version; BDX_Type type; BDX_Count dim_count; BDX_Dimension* dimensions; /* @TODO: attributes */ union { BDX_RawData* raw_data; BDX_RawDataWithType* raw_data_with_type; BDX_NamedRawDataWithType* named_raw_data_with_type; } data; } BDX_Data; /* function type-defs */ typedef void (SYSCALL *BDX_FREE) (struct _BDX_Data* bdx); typedef void (SYSCALL *BDX_TRACE) (struct _BDX_Data* bdx); typedef int (SYSCALL *BDX_VARIANT2BDX) (VARIANT var,struct _BDX_Data** bdx); typedef int (SYSCALL *BDX_BDX2VARIANT) (struct _BDX_Data* bdx,VARIANT* var); /* function table for BDX library */ typedef struct _BDX_Vtbl { BDX_FREE bdx_free; BDX_TRACE bdx_trace; BDX_VARIANT2BDX Variant2BDX; BDX_BDX2VARIANT BDX2Variant; } BDX_Vtbl; /* entry point: retrieve a proxy object with a given version */ typedef int (SYSCALL* BDX_GET_VTBL) (BDX_Vtbl**,unsigned long); #else /* * data type mapping: * * don't use an enum for this, because various compilers will interpret enums * as different size * * a data type (description) describes a data type, which is either * - a scalar (of some supported type) or * - a compound type (of scalars or compound types) * * scalars: * ... * * first version: * * - only scalars or * - vectors (of any dimension) of scalars * * are supported. * * e.g. an array of boolean values has a type of * * R_TYPE_COMPOUND_ARRAY | R_TYPE_SCALAR_BOOL */ /* * type specifications: * * data types are either scalars (boolean, short integer, long integer, * single precision floating point, double precision floating point, * complex and string) or compound types (always reduced to scalars) */ #define BDX_TYPESPEC_SCALAR 0x00000001 #define BDX_TYPESPEC_ARRAY 0x00000002 /* more to come */ #define BDX_SCALAR_BOOL 0x00000001 /*#define BDX_SCALAR_SHORT 0x00000002 */ #define BDX_SCALAR_LONG 0x00000003 /*#define BDX_SCALAR_FLOAT 0x00000004 */ #define BDX_SCALAR_DOUBLE 0x00000005 /*#define BDX_SCALAR_COMPLEX 0x00000006 */ /*#define BDX_SCALAR_CHAR 0x00000007 */ /*#define BDX_SCALAR_STRING 0x00000008 */ /*#define BDX_SCALAR_SIGNED 0x80000000 */ /* mapping from BDX_SCALAR_* to C types */ typedef unsigned long BDX_Scalar_BOOL; typedef long BDX_Scalar_LONG; typedef double BDX_Scalar_DOUBLE; /* some typedefs for commonly used types */ typedef unsigned long BDX_Length; typedef unsigned long BDX_Offset; typedef unsigned long BDX_Compound_Type; typedef unsigned long BDX_Scalar_Specification; typedef long BDX_Dimension; typedef unsigned long BDX_Count; typedef unsigned long BDX_Magic; /* a type specification */ typedef struct _BDX_Type_Specification { BDX_Compound_Type type; /* BDX_Offset type_declaration; */ } BDX_Type_Specification; /* basic structure */ typedef struct _BDX_Data { BDX_Magic magic; BDX_Length length; BDX_Type_Specification type_specification; /* depending on type_specification, either BDX_Array_Specificaton or */ /* BDX_Scalar_Specification follows. After all type specifications, the */ /* data follows */ } BDX_Data; /* bounds for an array type specification */ typedef struct _BDX_Array_Bounds { BDX_Dimension lower; BDX_Dimension upper; } BDX_Array_Bounds; /* the array type specification itself */ typedef struct _BDX_Array_Specification { BDX_Count dimensions; /* BDX_Type_Specification base_type_specification; */ /* simplificaton: the base type is a scalar type at the moment */ BDX_Scalar_Specification base_type; BDX_Array_Bounds bounds[1]; /* after dimensions bounds array members, the rest of the type specification */ /* follows. The the data... */ } BDX_Array_Specification; /* * examples: * * single scalar of type long memory layout: * * BDX_Data * { * magic = ??? * length = sizeof (BDX_Data) * + sizeof (BDX_Scalar_Specification); * + sizeof (BDX_Scalar_LONG); * type_specification = BDX_Type_Specification * { * type = BDX_TYPESPEC_SCALAR; * } * } * BDX_Scalar_Specification (induced by BDX_TYPESPEC_SCALAR) * = BDX_SCALAR_LONG; * BDX_Scalar_LONG (induced by BDX_SCALAR_LONG) * = ...; (data value) * * * 3-dimensional array, dimensions [2..4],[-5..3],[40,50] of doubles: * * BDX_Data * { * magic = ??? * length = sizeof (BDX_Data) * + sizeof (BDX_Array_Specification) * + 2 * sizeof (BDX_Array_Bounds) * + 3 * 9 * 11 * sizeof (BDX_Scalar_DOUBLE); * type_specification = BDX_Type_Specification * { * type = BDX_TYPESPEC_ARRAY; * } * } * BDX_Array_Specification (induced by BDX_TYPESPEC_ARRAY) * { * dimensions = 3; * base_type = BDX_Scalar_DOUBLE; * bounds[0] * { * lower = 2; * upper = 4; * } * bounds[1] * { * lower = -5; * upper = 3; * } * bounds[2] * { * lower = 40; * upper = 50; * } * } * BDX_Scalar_DOUBLE[3][9][11] data follows */ #endif #ifdef __cplusplus } #endif #endif