1/*
2 * Copyright (c) 2000-2001, 2003 Sendmail, 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
11#pragma ident	"%Z%%M%	%I%	%E% SMI"
12
13#include <sm/gen.h>
14SM_RCSID("@(#)$Id: strdup.c,v 1.15 2003/10/10 17:56:57 ca Exp $")
15
16#include <sm/heap.h>
17#include <sm/string.h>
18
19/*
20**  SM_STRNDUP_X -- Duplicate a string of a given length
21**
22**	Allocates memory and copies source string (of given length) into it.
23**
24**	Parameters:
25**		s -- string to copy.
26**		n -- length to copy.
27**
28**	Returns:
29**		copy of string, raises exception if out of memory.
30**
31**	Side Effects:
32**		allocate memory for new string.
33*/
34
35char *
36sm_strndup_x(s, n)
37	const char *s;
38	size_t n;
39{
40	char *d = sm_malloc_x(n + 1);
41
42	(void) memcpy(d, s, n);
43	d[n] = '\0';
44	return d;
45}
46
47/*
48**  SM_STRDUP -- Duplicate a string
49**
50**	Allocates memory and copies source string into it.
51**
52**	Parameters:
53**		s -- string to copy.
54**
55**	Returns:
56**		copy of string, NULL if out of memory.
57**
58**	Side Effects:
59**		allocate memory for new string.
60*/
61
62char *
63sm_strdup(s)
64	char *s;
65{
66	size_t l;
67	char *d;
68
69	l = strlen(s) + 1;
70	d = sm_malloc_tagged(l, "sm_strdup", 0, sm_heap_group());
71	if (d != NULL)
72		(void) sm_strlcpy(d, s, l);
73	return d;
74}
75
76#if DO_NOT_USE_STRCPY
77
78/*
79**  SM_STRDUP_X -- Duplicate a string
80**
81**	Allocates memory and copies source string into it.
82**
83**	Parameters:
84**		s -- string to copy.
85**
86**	Returns:
87**		copy of string, exception if out of memory.
88**
89**	Side Effects:
90**		allocate memory for new string.
91*/
92
93char *
94sm_strdup_x(s)
95	const char *s;
96{
97	size_t l;
98	char *d;
99
100	l = strlen(s) + 1;
101	d = sm_malloc_tagged_x(l, "sm_strdup_x", 0, sm_heap_group());
102	(void) sm_strlcpy(d, s, l);
103	return d;
104}
105
106/*
107**  SM_PSTRDUP_X -- Duplicate a string (using "permanent" memory)
108**
109**	Allocates memory and copies source string into it.
110**
111**	Parameters:
112**		s -- string to copy.
113**
114**	Returns:
115**		copy of string, exception if out of memory.
116**
117**	Side Effects:
118**		allocate memory for new string.
119*/
120
121char *
122sm_pstrdup_x(s)
123	const char *s;
124{
125	size_t l;
126	char *d;
127
128	l = strlen(s) + 1;
129	d = sm_pmalloc_x(l);
130	(void) sm_strlcpy(d, s, l);
131	return d;
132}
133
134/*
135**  SM_STRDUP_X -- Duplicate a string
136**
137**	Allocates memory and copies source string into it.
138**
139**	Parameters:
140**		s -- string to copy.
141**		file -- name of source file
142**		line -- line in source file
143**		group -- heap group
144**
145**	Returns:
146**		copy of string, exception if out of memory.
147**
148**	Side Effects:
149**		allocate memory for new string.
150*/
151
152char *
153sm_strdup_tagged_x(s, file, line, group)
154	const char *s;
155	char *file;
156	int line, group;
157{
158	size_t l;
159	char *d;
160
161	l = strlen(s) + 1;
162	d = sm_malloc_tagged_x(l, file, line, group);
163	(void) sm_strlcpy(d, s, l);
164	return d;
165}
166
167#endif /* DO_NOT_USE_STRCPY */
168
169