#ifndef UUID_H
#define UUID_H

/*
 * Copyright (c) 1990- 1993, 1996 Open Software Foundation, Inc.
 * Copyright (c) 1989 by Hewlett-Packard Company, Palo Alto, Ca. &
 * Digital Equipment Corporation, Maynard, Mass.
 * Copyright (c) 1998 Microsoft.
 * To anyone who acknowledges that this file is provided "AS IS"
 * without any express or implied warranty: permission to use, copy,
 * modify, and distribute this file for any purpose is hereby
 * granted without fee, provided that the above copyright notices and
 * this notice appears in all source code copies, and that none of
 * the names of Open Software Foundation, Inc., Hewlett-Packard
 * Company, or Digital Equipment Corporation be used in advertising
 * or publicity pertaining to distribution of the software without
 * specific, written prior permission.  Neither Open Software
 * Foundation, Inc., Hewlett-Packard Company, Microsoft, nor Digital Equipment
 * Corporation makes any representations about the suitability of
 * this software for any purpose.
 */

#include "sysdep.h"

/*! . */
typedef struct _uuid_upnp
{
	/*! . */
	uint32_t time_low;
	/*! . */
	uint16_t time_mid;
	/*! . */
	uint16_t time_hi_and_version;
	/*! . */
	uint8_t clock_seq_hi_and_reserved;
	/*! . */
	uint8_t clock_seq_low;
	/*! . */
	uint8_t node[6];
} uuid_upnp;

/*!
 * \brief Generate a UUID.
 */
int uuid_create(
	/*! . */
	uuid_upnp *id);

/*!
 * \brief Out will be xxxx-xx-xx-xx-xxxxxx format.
 */
void upnp_uuid_unpack(
	/*! . */
	uuid_upnp *u,
	/*! . */
	char *out);

/*!
 * \brief Create a UUID using a "name" from a "name space"
 */
void uuid_create_from_name(
	/*! Resulting UUID. */
	uuid_upnp *uid,
	/*! UUID to serve as context, so identical names from different name
	 * spaces generate different UUIDs. */
	uuid_upnp nsid,
	/*! The name from which to generate a UUID. */
	void *name,
	/*! The length of the name. */
	int namelen);

/*!
 * \brief Compare two UUID's "lexically".
 *
 * \return
 *	-1   u1 is lexically before u2
 *	 0   u1 is equal to u2
 *	 1   u1 is lexically after u2
 *
 * \note Lexical ordering is not temporal ordering!
 */
int uuid_compare(
	/*! . */
	uuid_upnp *u1,
	/*! . */
	uuid_upnp *u2);
#endif /* UUID_H */
