OpenSolaris_b135/lib/libtnf/tnf.h

/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License, Version 1.0 only
 * (the "License").  You may not use this file except in compliance
 * with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 *	Copyright (c) 1994, by Sun Microsytems, Inc.
 */

#ifndef _TNF_TNF_H
#define	_TNF_TNF_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#include <sys/types.h>
#include <tnf/com.h>

#ifdef __cplusplus
extern "C" {
#endif

/*
 * Opaque TNF handle
 */

typedef struct TNF	TNF;

/*
 * Opaque data handle
 */

typedef	unsigned long long	tnf_datum_t;

#define	TNF_DATUM_NULL	((tnf_datum_t)0)

/*
 * Reader data classification
 */

typedef enum {
	TNF_K_UNKNOWN,			/* unknown or error */
	TNF_K_SCALAR,			/* unclassified scalar */
	TNF_K_CHAR,			/* char */
	TNF_K_INT8,			/* int8 */
	TNF_K_INT16,			/* int16 */
	TNF_K_INT32,			/* int32 */
	TNF_K_UINT8,			/* uint8 */
	TNF_K_UINT16,			/* uint16 */
	TNF_K_UINT32,			/* uint32 */
	TNF_K_INT64,			/* int64 */
	TNF_K_UINT64,			/* uint64 */
	TNF_K_FLOAT32,			/* float32 */
	TNF_K_FLOAT64,			/* float64 */
	TNF_K_ARRAY,			/* array */
	TNF_K_STRING,			/* string */
	TNF_K_STRUCT,			/* struct */
	TNF_K_TYPE			/* type */
} tnf_kind_t;

/*
 * Error codes
 */

typedef enum {
	TNF_ERR_NONE = 0,

	/* 1 through 1023 reserved for errno values */
#define	TNF_ERRNO_MAX 		1023

	TNF_ERR_NOTTNF 		= 1024,	/* not TNF file */
	TNF_ERR_BADDATUM 	= 1025,	/* bad or NULL data handle */
	TNF_ERR_TYPEMISMATCH 	= 1026,	/* type mismatch */
	TNF_ERR_BADINDEX 	= 1027,	/* array index out of bounds */
	TNF_ERR_BADSLOT 	= 1028,	/* slot missing */
	TNF_ERR_BADREFTYPE 	= 1029,	/* invalid reference type  */
	TNF_ERR_ALLOCFAIL 	= 1030,	/* memory allocation failure */
	TNF_ERR_BADTNF 		= 1031,	/* bad TNF file */
	TNF_ERR_INTERNAL 	= 1032	/* internal error */
} tnf_errcode_t;

typedef void 	tnf_error_handler_t(void *, TNF *, tnf_errcode_t);

/*
 * TNF file interface
 */

tnf_errcode_t	tnf_reader_begin(caddr_t, size_t, TNF **);
tnf_errcode_t	tnf_reader_end(TNF *);

/*
 * Error interface
 */

void		tnf_set_error_handler(tnf_error_handler_t *, void *);
char *		tnf_error_message(tnf_errcode_t);

tnf_error_handler_t	tnf_default_error_handler;

/*
 * Data block access
 */

unsigned	tnf_get_block_count(TNF *);
tnf_datum_t	tnf_get_block_absolute(TNF *, unsigned);
tnf_datum_t	tnf_get_block_relative(tnf_datum_t, int);
int		tnf_is_block_header(tnf_datum_t);

/*
 * Record access
 */

tnf_datum_t	tnf_get_next_record(tnf_datum_t);
tnf_datum_t	tnf_get_block_header(tnf_datum_t);
tnf_datum_t	tnf_get_file_header(TNF *);

/*
 * Data classification predicates
 */

int		tnf_is_inline(tnf_datum_t);
int		tnf_is_scalar(tnf_datum_t);
int		tnf_is_record(tnf_datum_t);
int		tnf_is_array(tnf_datum_t);
int		tnf_is_string(tnf_datum_t);
int		tnf_is_struct(tnf_datum_t);
int		tnf_is_type(tnf_datum_t);

/*
 * Data operations
 */

tnf_kind_t	tnf_get_kind(tnf_datum_t);
size_t		tnf_get_size(tnf_datum_t);
tnf_datum_t	tnf_get_type(tnf_datum_t);
char *		tnf_get_type_name(tnf_datum_t);
caddr_t		tnf_get_raw(tnf_datum_t);

/*
 * Record operations
 */

tnf_datum_t	tnf_get_tag_arg(tnf_datum_t);

/*
 * Array operations
 */

unsigned	tnf_get_element_count(tnf_datum_t);
tnf_datum_t	tnf_get_element(tnf_datum_t, unsigned);
tnf_datum_t	tnf_get_element_type(tnf_datum_t);
caddr_t		tnf_get_elements(tnf_datum_t);
char *		tnf_get_chars(tnf_datum_t);

/*
 * Struct operations
 */

unsigned	tnf_get_slot_count(tnf_datum_t);
char *		tnf_get_slot_name(tnf_datum_t, unsigned);
unsigned	tnf_get_slot_index(tnf_datum_t, char *);
tnf_datum_t	tnf_get_slot_named(tnf_datum_t, char *);
tnf_datum_t	tnf_get_slot_indexed(tnf_datum_t, unsigned);

/*
 * Scalar data conversions
 */

char		tnf_get_char(tnf_datum_t);
tnf_int8_t	tnf_get_int8(tnf_datum_t);
tnf_int16_t	tnf_get_int16(tnf_datum_t);
tnf_int32_t	tnf_get_int32(tnf_datum_t);
tnf_int64_t	tnf_get_int64(tnf_datum_t);
tnf_float32_t	tnf_get_float32(tnf_datum_t);
tnf_float64_t	tnf_get_float64(tnf_datum_t);

/*
 * Type (tag) record operations
 */

tnf_kind_t	tnf_type_get_kind(tnf_datum_t);
char *		tnf_type_get_name(tnf_datum_t);
size_t		tnf_type_get_size(tnf_datum_t);
tnf_datum_t	tnf_type_get_property(tnf_datum_t, char *);
tnf_datum_t	tnf_type_get_base(tnf_datum_t);

#ifdef __cplusplus
}
#endif

#endif /* _TNF_TNF_H */