1/*
2 * Copyright (c) 2000-2001 Proofpoint, Inc. and its suppliers.
3 *	All rights reserved.
4 *
5 * By using this file, you agree to the terms and conditions set
6 * forth in the LICENSE file which can be found at the top level of
7 * the sendmail distribution.
8 */
9
10#include <sm/gen.h>
11SM_RCSID("@(#)$Id: stringf.c,v 1.16 2013-11-22 20:51:43 ca Exp $")
12#include <errno.h>
13#include <stdio.h>
14#include <sm/exc.h>
15#include <sm/heap.h>
16#include <sm/string.h>
17#include <sm/varargs.h>
18
19/*
20**  SM_STRINGF_X -- printf() to dynamically allocated string.
21**
22**	Takes the same arguments as printf.
23**	It returns a pointer to a dynamically allocated string
24**	containing the text that printf would print to standard output.
25**	It raises an exception on error.
26**	The name comes from a PWB Unix function called stringf.
27**
28**	Parameters:
29**		fmt -- format string.
30**		... -- arguments for format.
31**
32**	Returns:
33**		Pointer to a dynamically allocated string.
34**
35**	Exceptions:
36**		F:sm_heap -- out of memory (via sm_vstringf_x()).
37*/
38
39char *
40#if SM_VA_STD
41sm_stringf_x(const char *fmt, ...)
42#else /* SM_VA_STD */
43sm_stringf_x(fmt, va_alist)
44	const char *fmt;
45	va_dcl
46#endif /* SM_VA_STD */
47{
48	SM_VA_LOCAL_DECL
49	char *s;
50
51	SM_VA_START(ap, fmt);
52	s = sm_vstringf_x(fmt, ap);
53	SM_VA_END(ap);
54	return s;
55}
56
57/*
58**  SM_VSTRINGF_X -- printf() to dynamically allocated string.
59**
60**	Parameters:
61**		fmt -- format string.
62**		ap -- arguments for format.
63**
64**	Returns:
65**		Pointer to a dynamically allocated string.
66**
67**	Exceptions:
68**		F:sm_heap -- out of memory
69*/
70
71char *
72sm_vstringf_x(fmt, ap)
73	const char *fmt;
74	SM_VA_LOCAL_DECL
75{
76	char *s;
77
78	sm_vasprintf(&s, fmt, ap);
79	if (s == NULL)
80	{
81		if (errno == ENOMEM)
82			sm_exc_raise_x(&SmHeapOutOfMemory);
83		sm_exc_raisenew_x(&SmEtypeOs, errno, "sm_vasprintf", NULL);
84	}
85	return s;
86}
87