#ifndef LIBRCS__REVISION_H
#define LIBRCS__REVISION_H

/*
 * Copyright (c) 2003  Petr Baudis.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above
 *     copyright notice, this list of conditions and the following
 *     disclaimer in the documentation and/or other materials
 *     provided with the distribution.
 *   * Neither the name of the author nor the names of the product's
 *     contributors may be used to endorse or promote products
 *     derived from this software without specific prior written
 *     permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
 * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

#ifdef __cplusplus
extern "C" {
#endif


#include <librev/inode.h>
#include <librev/list.h>

#include <librcs/file.h>
#include <librcs/librcs.h>


/* This file describes the librcs' basic object: {struct rcs_revision}. It
 * describes the physical RCS revision and some data which are too specific to
 * fit inside of {struct rcs_revision}. In fact only quite a little of them
 * since we can hold most of them. This object is back-reachable from
 * rev_revision.data.  */

rcs_object (revision,
	/* Public attributes */

	/* State string. Normally one of { "Rel", "Stab", "Exp" }. */
	/* {rcs_revision_get_state()}, {rcs_revision_set_state()} */
	char *state;

	/* Determines whether this revision is a head or not. This matter for
	 * determining the data style (dataobj or diff). */
	/* {rcs_revision_get_head()}, {rcs_revision_set_head()} */
	int head;

	/* The rev_release object, containing the rest of information in a
	 * generic form. */
	/* {rcs_revision_get_revision()} */
	struct rev_revision *revision;
);

/* Constructor */

/* This creates the object associated with given librev revision. */
/* Returns the pointer on success, NULL otherwise. */
struct rcs_revision *rcs_revision_init (struct rev_revision *rev);


/* Attributes */

#include <assert.h>

/* This returns the state string. */
static inline char *
rcs_revision_get_state (struct rcs_revision *obj)
{
	assert (obj);
	return obj->state;
}

/* This sets the state string (freeing the old one, if any). */
static inline void
rcs_revision_set_state (struct rcs_revision *obj, char *state)
{
	assert (obj);
	if (obj->state) free (obj->state);
	obj->state = state ? strdup (state) : NULL;
}

/* This returns the head boolean. */
static inline int
rcs_revision_get_head (struct rcs_revision *obj)
{
	assert (obj);
	return obj->head;
}

/* This sets the head boolean. */
static inline void
rcs_revision_set_head (struct rcs_revision *obj, int head)
{
	assert (obj);
	obj->head = head;
}

/* This returns the generic revision object, containing further information.
 * You can freely manipulate this object. */
static inline struct rev_revision *
rcs_revision_get_revision (struct rcs_revision *obj)
{
	assert (obj);
	return obj->revision;
}


#ifdef __cplusplus
}
#endif

#endif
