/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (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) 1988 AT&T
 *	  All Rights Reserved
 *
 * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_CONV_H
#define	_CONV_H

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

/*
 * Global include file for conversion library.
 */

#include <stdlib.h>
#include <libelf.h>
#include <dlfcn.h>
#include <libld.h>
#include <sgs.h>
#include <machdep.h>

#ifdef	__cplusplus
extern "C" {
#endif

/*
 * Configuration features available - maintained here (instead of debug.h)
 * to save libconv from having to include debug.h which results in numerous
 * "declared but not used or defined" lint errors.
 */
#define	CONF_EDLIBPATH	0x000100	/* ELF default library path */
#define	CONF_ESLIBPATH	0x000200	/* ELF secure library path */
#define	CONF_ADLIBPATH	0x000400	/* AOUT default library path */
#define	CONF_ASLIBPATH	0x000800	/* AOUT secure library path */
#define	CONF_DIRCFG	0x001000	/* directory configuration available */
#define	CONF_OBJALT	0x002000	/* object alternatives available */
#define	CONF_MEMRESV	0x004000	/* memory reservation required */
#define	CONF_ENVS	0x008000	/* environment variables available */
#define	CONF_FLTR	0x010000	/* filter information available */
#define	CONF_FEATMSK	0xffff00

/*
 * Buffer types:
 *
 * Many of the routines in this module require the user to supply a
 * buffer into which the desired strings may be written. These are
 * all arrays of characters, and might be defined as simple arrays
 * of char. The problem with that approach is that when such an array
 * is passed to a function, the C language considers it to have the
 * type (char *), without any regard to its length. Not all of our
 * buffers have the same length, and we want to ensure that the compiler
 * will refuse to compile code that passes the wrong type of buffer to
 * a given routine. The solution is to define the buffers as unions
 * that contain the needed array, and then to pass the given union
 * by address. The compiler will catch attempts to pass the wrong type
 * of pointer, and the size of a structure/union is implicit in its type.
 *
 * A nice side effect of this approach is that we can use a union with
 * multiple buffers to handle the cases where a given routine needs
 * more than one type of buffer. The end result is a single buffer large
 * enough to handle any of the subcases, but no larger.
 */

/*
 * Size of buffer used by conv_invalid_val():
 *
 * Various values that can't be matched to a symbolic definition are converted
 * to a numeric string.
 *
 * The buffer size reflects the maximum number of digits needed to
 * display an integer as text, plus a trailing null, and with room for
 * a leading "0x" if hexidecimal display is selected.
 */
#define	CONV32_INV_BUFSIZE	12
typedef union {
	char			buf[CONV32_INV_BUFSIZE];
} Conv32_inv_buf_t;

#define	CONV64_INV_BUFSIZE	22
typedef union {
	char			buf[CONV64_INV_BUFSIZE];
} Conv64_inv_buf_t;



/* conv_ehdr_flags() */
#define	CONF_EHDR_FLAGS_BASE_BUFSIZE	69
#define	CONV32_EHDR_FLAGS_BUFSIZE	\
	(CONF_EHDR_FLAGS_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV32_EHDR_FLAGS_BUFSIZE];
} Conv32_ehdr_flags_buf_t;

#define	CONV64_EHDR_FLAGS_BUFSIZE	\
	(CONF_EHDR_FLAGS_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV64_EHDR_FLAGS_BUFSIZE];
} Conv64_ehdr_flags_buf_t;


/* conv_reject_desc() */
typedef union {
	Conv32_inv_buf_t	inv_buf;
	Conv32_ehdr_flags_buf_t	flags_buf;
} Conv32_reject_desc_buf_t;

typedef union {
	Conv64_inv_buf_t	inv_buf;
	Conv64_ehdr_flags_buf_t	flags_buf;
} Conv64_reject_desc_buf_t;


/*
 * conv_cap_val_hw1()
 *
 * This size is based on the maximum number of hardware capabilities
 * that exist.  See common/elfcap.
 */
#define	CONV_CAP_VAL_HW1_BUFSIZE	195

typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV_CAP_VAL_HW1_BUFSIZE];
} Conv32_cap_val_hw1_buf_t;

typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV_CAP_VAL_HW1_BUFSIZE];
} Conv64_cap_val_hw1_buf_t;


/*
 * conv_cap_val_sf1()
 *
 * This size is based on the maximum number of software capabilities
 * that exist.  See common/elfcap.
 */
#define	CONV_CAP_VAL_SF1_BUFSIZE	45

typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV_CAP_VAL_SF1_BUFSIZE];
} Conv32_cap_val_sf1_buf_t;

typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV_CAP_VAL_SF1_BUFSIZE];
} Conv64_cap_val_sf1_buf_t;



/* conv_cap_val_buf() */
typedef union {
	Conv32_inv_buf_t		inv_buf;
	Conv32_cap_val_hw1_buf_t	cap_val_hw1_buf;
	Conv32_cap_val_sf1_buf_t	cap_val_sf1_buf;
} Conv32_cap_val_buf_t;

typedef union {
	Conv64_inv_buf_t		inv_buf;
	Conv64_cap_val_hw1_buf_t	cap_val_hw1_buf;
	Conv64_cap_val_sf1_buf_t	cap_val_sf1_buf;
} Conv64_cap_val_buf_t;


/* conv_config_feat() */
#define	CONV_CONFIG_FEAT_BUFSIZE	195

typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV_CONFIG_FEAT_BUFSIZE];
} Conv32_config_feat_buf_t;

typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV_CONFIG_FEAT_BUFSIZE];
} Conv64_config_feat_buf_t;


/* conv_config_obj() */
#define	CONV_CONFIG_OBJ_BUFSIZE		154

typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV_CONFIG_OBJ_BUFSIZE];
} Conv32_config_obj_buf_t;

typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV_CONFIG_OBJ_BUFSIZE];
} Conv64_config_obj_buf_t;


/* conv_dl_mode() */
#define	CONV_DL_MODE_BUFSIZE		122

typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV_DL_MODE_BUFSIZE];
} Conv32_dl_mode_buf_t;

typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV_DL_MODE_BUFSIZE];
} Conv64_dl_mode_buf_t;


/* conv_dl_flag() */
#define	CONV_DL_FLAG_BUFSIZE		195

typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV_DL_FLAG_BUFSIZE];
} Conv32_dl_flag_buf_t;

typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV_DL_FLAG_BUFSIZE];
} Conv64_dl_flag_buf_t;


/* conv_grphdl_flags() */
#define	CONV_GRPHDL_FLAGS_BUFSIZE	80

typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV_GRPHDL_FLAGS_BUFSIZE];
} Conv32_grphdl_flags_buf_t;

typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV_GRPHDL_FLAGS_BUFSIZE];
} Conv64_grphdl_flags_buf_t;


/* conv_grpdesc_flags() */
#define	CONV_GRPDESC_FLAGS_BUFSIZE	80

typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV_GRPDESC_FLAGS_BUFSIZE];
} Conv32_grpdesc_flags_buf_t;

typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV_GRPDESC_FLAGS_BUFSIZE];
} Conv64_grpdesc_flags_buf_t;


/* conv_seg_flags() */
#define	CONV_SEG_FLAGS_BUFSIZE		186

typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV_SEG_FLAGS_BUFSIZE];
} Conv32_seg_flags_buf_t;

typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV_SEG_FLAGS_BUFSIZE];
} Conv64_seg_flags_buf_t;


/* conv_dyn_posflag1() */
#define	CONF_DYN_POSFLAG1_BASE_BUFSIZE	23
#define	CONV32_DYN_POSFLAG1_BUFSIZE	\
	(CONF_DYN_POSFLAG1_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV32_DYN_POSFLAG1_BUFSIZE];
} Conv32_dyn_posflag1_buf_t;

#define	CONV64_DYN_POSFLAG1_BUFSIZE	\
	(CONF_DYN_POSFLAG1_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV64_DYN_POSFLAG1_BUFSIZE];
} Conv64_dyn_posflag1_buf_t;


/* conv_dyn_flag() */
#define	CONF_DYN_FLAG_BASE_BUFSIZE	48
#define	CONV32_DYN_FLAG_BUFSIZE	\
	(CONF_DYN_FLAG_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV32_DYN_FLAG_BUFSIZE];
} Conv32_dyn_flag_buf_t;

#define	CONV64_DYN_FLAG_BUFSIZE	\
	(CONF_DYN_FLAG_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV64_DYN_FLAG_BUFSIZE];
} Conv64_dyn_flag_buf_t;


/* conv_dyn_flag1() */
#define	CONF_DYN_FLAG1_BASE_BUFSIZE	223
#define	CONV32_DYN_FLAG1_BUFSIZE	\
	(CONF_DYN_FLAG1_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV32_DYN_FLAG1_BUFSIZE];
} Conv32_dyn_flag1_buf_t;

#define	CONV64_DYN_FLAG1_BUFSIZE	\
	(CONF_DYN_FLAG1_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV64_DYN_FLAG1_BUFSIZE];
} Conv64_dyn_flag1_buf_t;


/* conv_dyn_feature1() */
#define	CONF_DYN_FEATURE1_BASE_BUFSIZE	20
#define	CONV32_DYN_FEATURE1_BUFSIZE	\
	(CONF_DYN_FEATURE1_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV32_DYN_FEATURE1_BUFSIZE];
} Conv32_dyn_feature1_buf_t;

#define	CONV64_DYN_FEATURE1_BUFSIZE	\
	(CONF_DYN_FEATURE1_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV64_DYN_FEATURE1_BUFSIZE];
} Conv64_dyn_feature1_buf_t;


/* conv_bnd_type() */
#define	CONF_BND_TYPE_BASE_BUFSIZE	29
#define	CONV32_BND_TYPE_BUFSIZE	\
	(CONF_BND_TYPE_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV32_BND_TYPE_BUFSIZE];
} Conv32_bnd_type_buf_t;

#define	CONV64_BND_TYPE_BUFSIZE	\
	(CONF_BND_TYPE_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV64_BND_TYPE_BUFSIZE];
} Conv64_bnd_type_buf_t;


/* conv_bnd_obj() */
#define	CONF_BND_OBJ_BASE_BUFSIZE	38
#define	CONV32_BND_OBJ_BUFSIZE	\
	(CONF_BND_OBJ_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV32_BND_OBJ_BUFSIZE];
} Conv32_bnd_obj_buf_t;

#define	CONV64_BND_OBJ_BUFSIZE	\
	(CONF_BND_OBJ_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV64_BND_OBJ_BUFSIZE];
} Conv64_bnd_obj_buf_t;


/* conv_phdr_flags() */
#define	CONF_PHDR_FLAGS_BASE_BUFSIZE	35
#define	CONV32_PHDR_FLAGS_BUFSIZE	\
	(CONF_PHDR_FLAGS_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV32_PHDR_FLAGS_BUFSIZE];
} Conv32_phdr_flags_buf_t;

#define	CONV64_PHDR_FLAGS_BUFSIZE	\
	(CONF_PHDR_FLAGS_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV64_PHDR_FLAGS_BUFSIZE];
} Conv64_phdr_flags_buf_t;


/* conv_sec_flags() */
#define	CONF_SEC_FLAGS_BASE_BUFSIZE	168
#define	CONV32_SEC_FLAGS_BUFSIZE	\
	(CONF_SEC_FLAGS_BASE_BUFSIZE + CONV32_INV_BUFSIZE)
typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV32_SEC_FLAGS_BUFSIZE];
} Conv32_sec_flags_buf_t;

#define	CONV64_SEC_FLAGS_BUFSIZE	\
	(CONF_SEC_FLAGS_BASE_BUFSIZE + CONV64_INV_BUFSIZE)
typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV64_SEC_FLAGS_BUFSIZE];
} Conv64_sec_flags_buf_t;


/* conv_dwarf_ehe() */
#define	CONV_DWARF_EHE_BUFSIZE		33
typedef union {
	Conv32_inv_buf_t	inv_buf;
	char			buf[CONV_DWARF_EHE_BUFSIZE];
} Conv32_dwarf_ehe_buf_t;
typedef union {
	Conv64_inv_buf_t	inv_buf;
	char			buf[CONV_DWARF_EHE_BUFSIZE];
} Conv64_dwarf_ehe_buf_t;



/*
 * Generic names for class specific buffer types above
 */
#if	defined(_ELF64)
#define	CONV_INV_BUFSIZE		CONV64_INV_BUFSIZE
#define	CONV_EHDR_FLAGS_BUFSIZE		CONV64_EHDR_FLAGS_BUFSIZE
#define	CONV_DYN_POSFLAG1_BUFSIZE	CONV64_DYN_POSFLAG1_BUFSIZE
#define	CONV_DYN_FLAG_BUFSIZE		CONV64_DYN_FLAG_BUFSIZE
#define	CONV_DYN_FLAG1_BUFSIZE		CONV64_DYN_FLAG1_BUFSIZE
#define	CONV_DYN_FEATURE1_BUFSIZE	CONV64_DYN_FEATURE1_BUFSIZE
#define	CONV_BND_TYPE_BUFSIZE		CONV64_BND_TYPE_BUFSIZE
#define	CONV_BND_OBJ_BUFSIZE		CONV64_BND_OBJ_BUFSIZE
#define	CONV_PHDR_FLAGS_BUFSIZE		CONV64_PHDR_FLAGS_BUFSIZE
#define	CONV_SEC_FLAGS_BUFSIZE		CONV64_SEC_FLAGS_BUFSIZE

#define	Conv_inv_buf_t			Conv64_inv_buf_t
#define	Conv_ehdr_flags_buf_t		Conv64_ehdr_flags_buf_t
#define	Conv_reject_desc_buf_t		Conv64_reject_desc_buf_t
#define	Conv_cap_val_hw1_buf_t		Conv64_cap_val_hw1_buf_t
#define	Conv_cap_val_sf1_buf_t		Conv64_cap_val_sf1_buf_t
#define	Conv_cap_val_buf_t		Conv64_cap_val_buf_t
#define	Conv_config_feat_buf_t		Conv64_config_feat_buf_t
#define	Conv_config_obj_buf_t		Conv64_config_obj_buf_t
#define	Conv_dl_mode_buf_t		Conv64_dl_mode_buf_t
#define	Conv_dl_flag_buf_t		Conv64_dl_flag_buf_t
#define	Conv_grphdl_flags_buf_t		Conv64_grphdl_flags_buf_t
#define	Conv_grpdesc_flags_buf_t	Conv64_grpdesc_flags_buf_t
#define	Conv_seg_flags_buf_t		Conv64_seg_flags_buf_t
#define	Conv_dyn_posflag1_buf_t		Conv64_dyn_posflag1_buf_t
#define	Conv_dyn_flag_buf_t		Conv64_dyn_flag_buf_t
#define	Conv_dyn_flag1_buf_t		Conv64_dyn_flag1_buf_t
#define	Conv_dyn_feature1_buf_t		Conv64_dyn_feature1_buf_t
#define	Conv_bnd_type_buf_t		Conv64_bnd_type_buf_t
#define	Conv_bnd_obj_buf_t		Conv64_bnd_obj_buf_t
#define	Conv_phdr_flags_buf_t		Conv64_phdr_flags_buf_t
#define	Conv_sec_flags_buf_t		Conv64_sec_flags_buf_t
#define	Conv_dwarf_ehe_buf_t		Conv64_dwarf_ehe_buf_t
#else
#define	CONV_INV_BUFSIZE		CONV32_INV_BUFSIZE
#define	CONV_EHDR_FLAGS_BUFSIZE		CONV32_EHDR_FLAGS_BUFSIZE
#define	CONV_DYN_POSFLAG1_BUFSIZE	CONV32_DYN_POSFLAG1_BUFSIZE
#define	CONV_DYN_FLAG_BUFSIZE		CONV32_DYN_FLAG_BUFSIZE
#define	CONV_DYN_FLAG1_BUFSIZE		CONV32_DYN_FLAG1_BUFSIZE
#define	CONV_DYN_FEATURE1_BUFSIZE	CONV32_DYN_FEATURE1_BUFSIZE
#define	CONV_BND_TYPE_BUFSIZE		CONV32_BND_TYPE_BUFSIZE
#define	CONV_BND_OBJ_BUFSIZE		CONV32_BND_OBJ_BUFSIZE
#define	CONV_PHDR_FLAGS_BUFSIZE		CONV32_PHDR_FLAGS_BUFSIZE
#define	CONV_SEC_FLAGS_BUFSIZE		CONV32_SEC_FLAGS_BUFSIZE

#define	Conv_inv_buf_t			Conv32_inv_buf_t
#define	Conv_ehdr_flags_buf_t		Conv32_ehdr_flags_buf_t
#define	Conv_reject_desc_buf_t		Conv32_reject_desc_buf_t
#define	Conv_cap_val_hw1_buf_t		Conv32_cap_val_hw1_buf_t
#define	Conv_cap_val_sf1_buf_t		Conv32_cap_val_sf1_buf_t
#define	Conv_cap_val_buf_t		Conv32_cap_val_buf_t
#define	Conv_config_feat_buf_t		Conv32_config_feat_buf_t
#define	Conv_config_obj_buf_t		Conv32_config_obj_buf_t
#define	Conv_dl_mode_buf_t		Conv32_dl_mode_buf_t
#define	Conv_dl_flag_buf_t		Conv32_dl_flag_buf_t
#define	Conv_grphdl_flags_buf_t		Conv32_grphdl_flags_buf_t
#define	Conv_grpdesc_flags_buf_t	Conv32_grpdesc_flags_buf_t
#define	Conv_seg_flags_buf_t		Conv32_seg_flags_buf_t
#define	Conv_dyn_posflag1_buf_t		Conv32_dyn_posflag1_buf_t
#define	Conv_dyn_flag_buf_t		Conv32_dyn_flag_buf_t
#define	Conv_dyn_flag1_buf_t		Conv32_dyn_flag1_buf_t
#define	Conv_dyn_feature1_buf_t		Conv32_dyn_feature1_buf_t
#define	Conv_bnd_type_buf_t		Conv32_bnd_type_buf_t
#define	Conv_bnd_obj_buf_t		Conv32_bnd_obj_buf_t
#define	Conv_phdr_flags_buf_t		Conv32_phdr_flags_buf_t
#define	Conv_sec_flags_buf_t		Conv32_sec_flags_buf_t
#define	Conv_dwarf_ehe_buf_t		Conv32_dwarf_ehe_buf_t
#endif




/*
 * Flags that alter standard formatting for conversion routines.
 */
#define	CONV_FMT_DECIMAL	0x01	/* conv_invalid_val() should print */
					/*    integer print as decimal */
					/*    (default is hex) */
#define	CONV_FMT_SPACE		0x02	/* conv_invalid_val() should append */
					/*    a space after the number.  */
#define	CONV_FMT_ALTDUMP	0x04	/* Output strings using the versions */
					/*    used by the dump program. */
#define	CONV_FMT_ALTFILE	0x08	/* Output strings in the form used */
					/*    by the file(1) command */
#define	CONV_FMT_ALTCRLE	0x10	/* Output strings in the form used */
					/*    by the crle(1) command */

/*
 * Mask of CONV_FMT bits that reflect a desire to use alternate strings.
 */
#define	CONV_FMTALTMASK	(CONV_FMT_ALTDUMP | CONV_FMT_ALTFILE)

/*
 * The expansion of bit-field data items is driven from a value descriptor and
 * the conv_expn_field() routine.
 */
typedef struct {
	Xword		v_val;		/* expansion value */
	const char	*v_msg;		/* associated message string */
} Val_desc;

/*
 * conv_expn_field() is willing to supply default strings for the
 * prefix, separator, and suffix arguments, if they are passed as NULL.
 * The caller needs to know how much room to allow for these items.
 * These values supply those sizes.
 */
#define	CONV_EXPN_FIELD_DEF_PREFIX_SIZE	2	/* Default is "[ " */
#define	CONV_EXPN_FIELD_DEF_SEP_SIZE	1	/* Default is " " */
#define	CONV_EXPN_FIELD_DEF_SUFFIX_SIZE	2	/* Default is " ]" */

/*
 * conv_expn_field() requires a large number of inputs, many of which
 * can be NULL to accept default behavior. An argument of the following
 * type is used to supply them.
 */
typedef struct {
	char *buf;		/* Buffer to receive generated string */
	size_t bufsize;		/* sizeof(buf) */
	const Val_desc *vdp;	/* Array of value descriptors, giving the */
				/*	possible bit values, and their */
				/*	corresponding strings. Note that the */
				/*	final element must contain only NULL */
				/*	values. This terminates the list. */
	const char **lead_str;	/* NULL, or array of pointers to strings to */
				/*	be output at the head of the list. */
				/*	Last entry must be NULL. */
	Xword oflags;		/* Bits for which output strings are desired */
	Xword rflags;		/* Bits for which a numeric value should be */
				/*	output if vdp does not provide str. */
				/*	Must be a proper subset of oflags */
	const char *prefix;	/* NULL, or string to prefix output with */
				/*	If NULL, "[ " is used. */
	const char *sep;	/* NULL, or string to separate output items */
				/*	with. If NULL, " " is used. */
	const char *suffix;	/* NULL, or string to suffix output with */
				/*	If NULL, " ]" is used. */
} CONV_EXPN_FIELD_ARG;

/*
 * Define all generic interfaces.
 */
extern	uchar_t		conv_check_native(char **, char **);
extern	const char	*conv_config_feat(int, Conv_config_feat_buf_t *);
extern	const char	*conv_config_obj(ushort_t, Conv_config_obj_buf_t *);
extern	const char	*conv_config_upm(const char *, const char *,
			    const char *, size_t);
extern	const char	*conv_def_tag(Symref, Conv_inv_buf_t *);
extern	const char	*conv_demangle_name(const char *);
extern	const char	*conv_dl_flag(int, int, Conv_dl_flag_buf_t *);
extern	const char	*conv_dl_mode(int, int, Conv_dl_mode_buf_t *);
extern	const char	*conv_dwarf_ehe(uint_t, Conv_dwarf_ehe_buf_t *);
extern	const char	*conv_elfdata_type(Elf_Type, Conv_inv_buf_t *);
extern	const char	*conv_grphdl_flags(uint_t, Conv_grphdl_flags_buf_t *);
extern	const char	*conv_grpdesc_flags(uint_t, Conv_grpdesc_flags_buf_t *);
extern	Isa_desc	*conv_isalist(void);
extern	const char	*conv_lddstub(int);
extern	const char	*conv_seg_flags(Half, Conv_seg_flags_buf_t *);
extern	int		conv_sys_eclass();
extern	Uts_desc	*conv_uts(void);
extern	const char	*conv_ver_flags(Half);
extern	const char	*conv_ver_index(Versym, int, Conv_inv_buf_t *);


/*
 * Define all class specific routines.
 */
#if	defined(_ELF64)
#define	conv_bnd_obj		conv64_bnd_obj
#define	conv_bnd_type		conv64_bnd_type
#define	conv_cap_tag		conv64_cap_tag
#define	conv_cap_val		conv64_cap_val
#define	conv_cap_val_hw1	conv64_cap_val_hw1
#define	conv_cap_val_sf1	conv64_cap_val_sf1
#define	conv_dyn_feature1	conv64_dyn_feature1
#define	conv_dyn_flag1		conv64_dyn_flag1
#define	conv_dyn_flag		conv64_dyn_flag
#define	conv_dyn_posflag1	conv64_dyn_posflag1
#define	conv_dyn_tag		conv64_dyn_tag
#define	conv_ehdr_class		conv64_ehdr_class
#define	conv_ehdr_data		conv64_ehdr_data
#define	conv_ehdr_flags		conv64_ehdr_flags
#define	conv_ehdr_mach		conv64_ehdr_mach
#define	conv_ehdr_osabi		conv64_ehdr_osabi
#define	conv_ehdr_type		conv64_ehdr_type
#define	conv_ehdr_vers		conv64_ehdr_vers
#define	conv_expn_field		conv64_expn_field
#define	conv_invalid_val	conv64_invalid_val
#define	conv_phdr_flags		conv64_phdr_flags
#define	conv_phdr_type		conv64_phdr_type
#define	conv_reject_desc	conv64_reject_desc
#define	conv_reloc_type		conv64_reloc_type
#define	conv_reloc_type_static	conv64_reloc_type_static
#define	conv_reloc_386_type	conv64_reloc_386_type
#define	conv_reloc_amd64_type	conv64_reloc_amd64_type
#define	conv_reloc_SPARC_type	conv64_reloc_SPARC_type
#define	conv_sec_flags		conv64_sec_flags
#define	conv_sec_linkinfo	conv64_sec_linkinfo
#define	conv_sec_type		conv64_sec_type
#define	conv_sym_info_bind	conv64_sym_info_bind
#define	conv_sym_info_type	conv64_sym_info_type
#define	conv_sym_shndx		conv64_sym_shndx
#define	conv_sym_other		conv64_sym_other
#define	conv_sym_value		conv64_sym_value
#define	conv_sym_SPARC_value	conv64_sym_SPARC_value
#else
#define	conv_bnd_obj		conv32_bnd_obj
#define	conv_bnd_type		conv32_bnd_type
#define	conv_cap_tag		conv32_cap_tag
#define	conv_cap_val		conv32_cap_val
#define	conv_cap_val_hw1	conv32_cap_val_hw1
#define	conv_cap_val_sf1	conv32_cap_val_sf1
#define	conv_dyn_feature1	conv32_dyn_feature1
#define	conv_dyn_flag1		conv32_dyn_flag1
#define	conv_dyn_flag		conv32_dyn_flag
#define	conv_dyn_posflag1	conv32_dyn_posflag1
#define	conv_dyn_tag		conv32_dyn_tag
#define	conv_ehdr_class		conv32_ehdr_class
#define	conv_ehdr_data		conv32_ehdr_data
#define	conv_ehdr_flags		conv32_ehdr_flags
#define	conv_ehdr_mach		conv32_ehdr_mach
#define	conv_ehdr_osabi		conv32_ehdr_osabi
#define	conv_ehdr_type		conv32_ehdr_type
#define	conv_ehdr_vers		conv32_ehdr_vers
#define	conv_expn_field		conv32_expn_field
#define	conv_invalid_val	conv32_invalid_val
#define	conv_phdr_flags		conv32_phdr_flags
#define	conv_phdr_type		conv32_phdr_type
#define	conv_reject_desc	conv32_reject_desc
#define	conv_reloc_type		conv32_reloc_type
#define	conv_reloc_type_static	conv32_reloc_type_static
#define	conv_reloc_386_type	conv32_reloc_386_type
#define	conv_reloc_amd64_type	conv32_reloc_amd64_type
#define	conv_reloc_SPARC_type	conv32_reloc_SPARC_type
#define	conv_sec_flags		conv32_sec_flags
#define	conv_sec_linkinfo	conv32_sec_linkinfo
#define	conv_sec_type		conv32_sec_type
#define	conv_sym_info_bind	conv32_sym_info_bind
#define	conv_sym_info_type	conv32_sym_info_type
#define	conv_sym_shndx		conv32_sym_shndx
#define	conv_sym_other		conv32_sym_other
#define	conv_sym_value		conv32_sym_value
#define	conv_sym_SPARC_value	conv32_sym_SPARC_value
#endif

extern	const char	*conv_bnd_obj(uint_t, Conv_bnd_obj_buf_t *);
extern	const char	*conv_bnd_type(uint_t, Conv_bnd_type_buf_t *);
extern	const char	*conv_cap_tag(Xword, Conv_inv_buf_t *);
extern	const char	*conv_cap_val(Xword, Xword, Half, Conv_cap_val_buf_t *);
extern	const char	*conv_cap_val_hw1(Xword, Half,
			    Conv_cap_val_hw1_buf_t *);
extern	const char	*conv_cap_val_sf1(Xword, Half,
			    Conv_cap_val_sf1_buf_t *);
extern	const char	*conv_dyn_flag1(Xword, Conv_dyn_flag1_buf_t *);
extern	const char	*conv_dyn_flag(Xword, int, Conv_dyn_flag_buf_t *);
extern	const char	*conv_dyn_posflag1(Xword, int,
			    Conv_dyn_posflag1_buf_t *);
extern	const char	*conv_dyn_tag(Xword, Half, int, Conv_inv_buf_t *);
extern	const char	*conv_dyn_feature1(Xword, int,
			    Conv_dyn_feature1_buf_t *);
extern	const char	*conv_ehdr_class(uchar_t, int, Conv_inv_buf_t *);
extern	const char	*conv_ehdr_data(uchar_t, int, Conv_inv_buf_t *);
extern	const char	*conv_ehdr_flags(Half, Word, Conv_ehdr_flags_buf_t *);
extern	const char	*conv_ehdr_mach(Half, int, Conv_inv_buf_t *);
extern	const char	*conv_ehdr_osabi(uchar_t, int, Conv_inv_buf_t *);
extern	const char	*conv_ehdr_type(Half, int, Conv_inv_buf_t *);
extern	const char	*conv_ehdr_vers(Word, int, Conv_inv_buf_t *);
extern	int		conv_expn_field(CONV_EXPN_FIELD_ARG *);
extern	const char	*conv_invalid_val(Conv_inv_buf_t *, Xword, int);
extern	const char	*conv_phdr_flags(Word, Conv_phdr_flags_buf_t *);
extern	const char	*conv_phdr_type(Half, Word, int, Conv_inv_buf_t *);
extern	const char	*conv_reject_desc(Rej_desc *, Conv_reject_desc_buf_t *);
extern	const char	*conv_reloc_type(Half, Word, int, Conv_inv_buf_t *);
extern	const char	*conv_reloc_type_static(Half, Word, int);
extern	const char	*conv_reloc_386_type(Word, int, Conv_inv_buf_t *);
extern	const char	*conv_reloc_amd64_type(Word, int, Conv_inv_buf_t *);
extern	const char	*conv_reloc_SPARC_type(Word, int, Conv_inv_buf_t *);
extern	const char	*conv_sec_flags(Xword, Conv_sec_flags_buf_t *);
extern	const char	*conv_sec_linkinfo(Word, Xword, Conv_inv_buf_t *);
extern	const char	*conv_sec_type(Half, Word, int, Conv_inv_buf_t *);
extern	const char	*conv_sym_info_bind(uchar_t, int, Conv_inv_buf_t *);
extern	const char	*conv_sym_info_type(Half, uchar_t, int,
			    Conv_inv_buf_t *);
extern	const char	*conv_sym_shndx(Half, Conv_inv_buf_t *);
extern	const char	*conv_sym_other(uchar_t, Conv_inv_buf_t *);
extern	const char	*conv_sym_value(Half, uchar_t, Addr, Conv_inv_buf_t *);
extern	const char	*conv_sym_SPARC_value(Addr, int, Conv_inv_buf_t *);

#ifdef	__cplusplus
}
#endif

#endif /* _CONV_H */