/*
 * profile.h
 */

#ifndef _KRB5_PROFILE_H
#define _KRB5_PROFILE_H

#if defined(_MSDOS) || defined(_WIN32) || defined(MACINTOSH)
#include <win-mac.h>
#endif

#ifndef KRB5_CALLCONV
#define KRB5_CALLCONV
#define KRB5_CALLCONV_C
#define KRB5_DLLIMP
#define GSS_DLLIMP
#define KRB5_EXPORTVAR
#define FAR
#define NEAR
#endif

typedef struct _profile_t *profile_t;

#if !defined(PROTOTYPE)
#if defined(__STDC__) || defined(__cplusplus) || defined(_MSDOS) || defined(_WIN32)
#define PROTOTYPE(x) x
#else
#define PROTOTYPE(x) ()
#endif
#endif

/*
 * Used by the profile iterator in prof_get.c
 */
#define PROFILE_ITER_LIST_SECTION	0x0001
#define PROFILE_ITER_SECTIONS_ONLY	0x0002
#define PROFILE_ITER_RELATIONS_ONLY	0x0004

/* Macintoh CFM-68K magic incantation */
#if defined(macintosh) && defined(__CFM68K__) && !defined(__USING_STATIC_LIBS__)
#pragma import on
#endif

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/* On everything but MacOS, we use file paths as unique file identifiers */
#ifndef macintosh
#define PROFILE_USES_PATHS
#endif

#ifdef PROFILE_USES_PATHS
typedef char* profile_filespec_t;	/* path as C string */
typedef char* profile_filespec_list_t;	/* list of : separated paths, C string */
typedef const char* const_profile_filespec_t;	/* path as C string */
typedef const char* const_profile_filespec_list_t;	/* list of : separated paths, C string */
#else
/* On MacOS, we use native file specifiers as unique file identifiers */
#include <Files.h>
typedef FSSpec profile_filespec_t;
typedef FSSpec* profile_filespec_list_t;
/* array should be terminated with {0, 0, ""} */
typedef FSSpec const_profile_filespec_t;
typedef FSSpec* const_profile_filespec_list_t;	
#endif

KRB5_DLLIMP long KRB5_CALLCONV profile_init
	PROTOTYPE ((const_profile_filespec_t *files, profile_t *ret_profile));

KRB5_DLLIMP long KRB5_CALLCONV profile_init_path
	PROTOTYPE ((const_profile_filespec_list_t filelist, profile_t *ret_profile));

KRB5_DLLIMP long KRB5_CALLCONV profile_flush
	PROTOTYPE ((profile_t profile));

KRB5_DLLIMP void KRB5_CALLCONV profile_abandon
	PROTOTYPE ((profile_t profile));

KRB5_DLLIMP void KRB5_CALLCONV profile_release
	PROTOTYPE ((profile_t profile));

KRB5_DLLIMP long KRB5_CALLCONV profile_get_values
	PROTOTYPE ((profile_t profile, const char **names, char ***ret_values));

KRB5_DLLIMP void KRB5_CALLCONV profile_free_list
	PROTOTYPE ((char **list));

KRB5_DLLIMP long KRB5_CALLCONV profile_get_string
	PROTOTYPE((profile_t profile, const char *name, const char *subname, 
			const char *subsubname, const char *def_val,
			char **ret_string));
KRB5_DLLIMP long KRB5_CALLCONV profile_get_integer
	PROTOTYPE((profile_t profile, const char *name, const char *subname,
			const char *subsubname, int def_val,
			int *ret_default));

KRB5_DLLIMP long KRB5_CALLCONV profile_get_relation_names
	PROTOTYPE((profile_t profile, const char **names, char ***ret_names));

KRB5_DLLIMP long KRB5_CALLCONV profile_get_subsection_names
	PROTOTYPE((profile_t profile, const char **names, char ***ret_names));

KRB5_DLLIMP long KRB5_CALLCONV profile_iterator_create
	PROTOTYPE((profile_t profile, const char **names,
		   int flags, void **ret_iter));

KRB5_DLLIMP void KRB5_CALLCONV profile_iterator_free
	PROTOTYPE((void **iter_p));
	
KRB5_DLLIMP long KRB5_CALLCONV profile_iterator
	PROTOTYPE((void	**iter_p, char **ret_name, char **ret_value));

KRB5_DLLIMP void KRB5_CALLCONV profile_release_string PROTOTYPE((char *str));

KRB5_DLLIMP long KRB5_CALLCONV profile_update_relation
	PROTOTYPE((profile_t profile, const char **names, 
		   const char *old_value, const char *new_value));

KRB5_DLLIMP long KRB5_CALLCONV profile_clear_relation
	PROTOTYPE((profile_t profile, const char **names));

KRB5_DLLIMP long KRB5_CALLCONV profile_rename_section
	PROTOTYPE((profile_t profile, const char **names, 
		   const char *new_name));

KRB5_DLLIMP long KRB5_CALLCONV profile_add_relation
	PROTOTYPE((profile_t profile, const char **names, 
		   const char *new_value));

#ifdef __cplusplus
}
#endif /* __cplusplus */

/* Macintoh CFM-68K magic incantation */
#if defined(macintosh) && defined(__CFM68K__) && !defined(__USING_STATIC_LIBS__)
#pragma import reset
#endif

#endif /* _KRB5_PROFILE_H */
