/*
 * Copyright (c) 2000-2002, 2005 Sendmail, Inc. and its suppliers.
 *	All rights reserved.
 *
 * By using this file, you agree to the terms and conditions set
 * forth in the LICENSE file which can be found at the top level of
 * the sendmail distribution.
 */

#include "sm/generic.h"
SM_RCSID("@(#)$Id: strget.c,v 1.14 2005/06/09 00:43:40 ca Exp $")

#include "sm/assert.h"
#include "sm/magic.h"
#include "sm/memops.h"
#include "sm/rpool.h"
#include "sm/limits.h"
#include "sm/str.h"
#include "sm/str-int.h"

/*
**  SM_STR_GETDATA -- Return pointer to data buffer _inside_ str.
**
**	This returns a pointer to the '\0' terminated data buffer
**	inside of sm_str_P object str.
**	This is dynamic data, and is not guaranteed to be the same
**	after subsequent calls to other sm_str_* functions.
**
**	Parameters:
**		str -- sm_str_P object.
**
**	Returns:
**		'\0 terminated buf data embedded in str.
**		NULL on error.
*/

uchar *
sm_str_getdata(sm_str_P str)
{
	SM_IS_BUF(str);
	if ((str->sm_str_len > 0 &&
	     str->sm_str_base[str->sm_str_len - 1] == '\0') ||
	    (str->sm_str_size > str->sm_str_len &&
	     str->sm_str_base[str->sm_str_len] == '\0'))
		return str->sm_str_base;
	if (str->sm_str_len == str->sm_str_size)
	{
		uint new_alloc;

		/* We need room for the final '\0' */
		new_alloc = str->sm_str_len + 1;
		SM_STR_INCREASE_N_R(str, new_alloc);
	}
	str->sm_str_base[str->sm_str_len] = '\0';
	return str->sm_str_base;
}


syntax highlighted by Code2HTML, v. 0.9.1