140266059SGregory Neil Shapiro /*
25dd76dd0SGregory Neil Shapiro * Copyright (c) 2000-2001, 2003 Proofpoint, Inc. and its suppliers.
340266059SGregory Neil Shapiro * All rights reserved.
440266059SGregory Neil Shapiro *
540266059SGregory Neil Shapiro * By using this file, you agree to the terms and conditions set
640266059SGregory Neil Shapiro * forth in the LICENSE file which can be found at the top level of
740266059SGregory Neil Shapiro * the sendmail distribution.
840266059SGregory Neil Shapiro *
940266059SGregory Neil Shapiro */
1040266059SGregory Neil Shapiro
1140266059SGregory Neil Shapiro #include <sm/gen.h>
124313cc83SGregory Neil Shapiro SM_RCSID("@(#)$Id: strdup.c,v 1.16 2013-11-22 20:51:43 ca Exp $")
1340266059SGregory Neil Shapiro
1440266059SGregory Neil Shapiro #include <sm/heap.h>
1540266059SGregory Neil Shapiro #include <sm/string.h>
1640266059SGregory Neil Shapiro
1740266059SGregory Neil Shapiro /*
1840266059SGregory Neil Shapiro ** SM_STRNDUP_X -- Duplicate a string of a given length
1940266059SGregory Neil Shapiro **
2040266059SGregory Neil Shapiro ** Allocates memory and copies source string (of given length) into it.
2140266059SGregory Neil Shapiro **
2240266059SGregory Neil Shapiro ** Parameters:
2340266059SGregory Neil Shapiro ** s -- string to copy.
2440266059SGregory Neil Shapiro ** n -- length to copy.
2540266059SGregory Neil Shapiro **
2640266059SGregory Neil Shapiro ** Returns:
2740266059SGregory Neil Shapiro ** copy of string, raises exception if out of memory.
2840266059SGregory Neil Shapiro **
2940266059SGregory Neil Shapiro ** Side Effects:
3040266059SGregory Neil Shapiro ** allocate memory for new string.
3140266059SGregory Neil Shapiro */
3240266059SGregory Neil Shapiro
3340266059SGregory Neil Shapiro char *
3440266059SGregory Neil Shapiro sm_strndup_x(s, n)
3540266059SGregory Neil Shapiro const char *s;
3640266059SGregory Neil Shapiro size_t n;
3740266059SGregory Neil Shapiro {
3840266059SGregory Neil Shapiro char *d = sm_malloc_x(n + 1);
3940266059SGregory Neil Shapiro
4040266059SGregory Neil Shapiro (void) memcpy(d, s, n);
4140266059SGregory Neil Shapiro d[n] = '\0';
4240266059SGregory Neil Shapiro return d;
4340266059SGregory Neil Shapiro }
4440266059SGregory Neil Shapiro
4540266059SGregory Neil Shapiro /*
4640266059SGregory Neil Shapiro ** SM_STRDUP -- Duplicate a string
4740266059SGregory Neil Shapiro **
4840266059SGregory Neil Shapiro ** Allocates memory and copies source string into it.
4940266059SGregory Neil Shapiro **
5040266059SGregory Neil Shapiro ** Parameters:
5140266059SGregory Neil Shapiro ** s -- string to copy.
5240266059SGregory Neil Shapiro **
5340266059SGregory Neil Shapiro ** Returns:
5440266059SGregory Neil Shapiro ** copy of string, NULL if out of memory.
5540266059SGregory Neil Shapiro **
5640266059SGregory Neil Shapiro ** Side Effects:
5740266059SGregory Neil Shapiro ** allocate memory for new string.
5840266059SGregory Neil Shapiro */
5940266059SGregory Neil Shapiro
6040266059SGregory Neil Shapiro char *
sm_strdup(s)6140266059SGregory Neil Shapiro sm_strdup(s)
62*5b0945b5SGregory Neil Shapiro const char *s;
6340266059SGregory Neil Shapiro {
6440266059SGregory Neil Shapiro size_t l;
6540266059SGregory Neil Shapiro char *d;
6640266059SGregory Neil Shapiro
6740266059SGregory Neil Shapiro l = strlen(s) + 1;
6840266059SGregory Neil Shapiro d = sm_malloc_tagged(l, "sm_strdup", 0, sm_heap_group());
6940266059SGregory Neil Shapiro if (d != NULL)
7040266059SGregory Neil Shapiro (void) sm_strlcpy(d, s, l);
7140266059SGregory Neil Shapiro return d;
7240266059SGregory Neil Shapiro }
73e92d3f3fSGregory Neil Shapiro
74e92d3f3fSGregory Neil Shapiro #if DO_NOT_USE_STRCPY
75e92d3f3fSGregory Neil Shapiro
76e92d3f3fSGregory Neil Shapiro /*
77e92d3f3fSGregory Neil Shapiro ** SM_STRDUP_X -- Duplicate a string
78e92d3f3fSGregory Neil Shapiro **
79e92d3f3fSGregory Neil Shapiro ** Allocates memory and copies source string into it.
80e92d3f3fSGregory Neil Shapiro **
81e92d3f3fSGregory Neil Shapiro ** Parameters:
82e92d3f3fSGregory Neil Shapiro ** s -- string to copy.
83e92d3f3fSGregory Neil Shapiro **
84e92d3f3fSGregory Neil Shapiro ** Returns:
85e92d3f3fSGregory Neil Shapiro ** copy of string, exception if out of memory.
86e92d3f3fSGregory Neil Shapiro **
87e92d3f3fSGregory Neil Shapiro ** Side Effects:
88e92d3f3fSGregory Neil Shapiro ** allocate memory for new string.
89e92d3f3fSGregory Neil Shapiro */
90e92d3f3fSGregory Neil Shapiro
91e92d3f3fSGregory Neil Shapiro char *
sm_strdup_x(s)92e92d3f3fSGregory Neil Shapiro sm_strdup_x(s)
93e92d3f3fSGregory Neil Shapiro const char *s;
94e92d3f3fSGregory Neil Shapiro {
95e92d3f3fSGregory Neil Shapiro size_t l;
96e92d3f3fSGregory Neil Shapiro char *d;
97e92d3f3fSGregory Neil Shapiro
98e92d3f3fSGregory Neil Shapiro l = strlen(s) + 1;
99e92d3f3fSGregory Neil Shapiro d = sm_malloc_tagged_x(l, "sm_strdup_x", 0, sm_heap_group());
100e92d3f3fSGregory Neil Shapiro (void) sm_strlcpy(d, s, l);
101e92d3f3fSGregory Neil Shapiro return d;
102e92d3f3fSGregory Neil Shapiro }
103e92d3f3fSGregory Neil Shapiro
104e92d3f3fSGregory Neil Shapiro /*
105e92d3f3fSGregory Neil Shapiro ** SM_PSTRDUP_X -- Duplicate a string (using "permanent" memory)
106e92d3f3fSGregory Neil Shapiro **
107e92d3f3fSGregory Neil Shapiro ** Allocates memory and copies source string into it.
108e92d3f3fSGregory Neil Shapiro **
109e92d3f3fSGregory Neil Shapiro ** Parameters:
110e92d3f3fSGregory Neil Shapiro ** s -- string to copy.
111e92d3f3fSGregory Neil Shapiro **
112e92d3f3fSGregory Neil Shapiro ** Returns:
113e92d3f3fSGregory Neil Shapiro ** copy of string, exception if out of memory.
114e92d3f3fSGregory Neil Shapiro **
115e92d3f3fSGregory Neil Shapiro ** Side Effects:
116e92d3f3fSGregory Neil Shapiro ** allocate memory for new string.
117e92d3f3fSGregory Neil Shapiro */
118e92d3f3fSGregory Neil Shapiro
119e92d3f3fSGregory Neil Shapiro char *
sm_pstrdup_x(s)120e92d3f3fSGregory Neil Shapiro sm_pstrdup_x(s)
121e92d3f3fSGregory Neil Shapiro const char *s;
122e92d3f3fSGregory Neil Shapiro {
123e92d3f3fSGregory Neil Shapiro size_t l;
124e92d3f3fSGregory Neil Shapiro char *d;
125e92d3f3fSGregory Neil Shapiro
126e92d3f3fSGregory Neil Shapiro l = strlen(s) + 1;
127e92d3f3fSGregory Neil Shapiro d = sm_pmalloc_x(l);
128e92d3f3fSGregory Neil Shapiro (void) sm_strlcpy(d, s, l);
129e92d3f3fSGregory Neil Shapiro return d;
130e92d3f3fSGregory Neil Shapiro }
131e92d3f3fSGregory Neil Shapiro
132e92d3f3fSGregory Neil Shapiro /*
133e92d3f3fSGregory Neil Shapiro ** SM_STRDUP_X -- Duplicate a string
134e92d3f3fSGregory Neil Shapiro **
135e92d3f3fSGregory Neil Shapiro ** Allocates memory and copies source string into it.
136e92d3f3fSGregory Neil Shapiro **
137e92d3f3fSGregory Neil Shapiro ** Parameters:
138e92d3f3fSGregory Neil Shapiro ** s -- string to copy.
139e92d3f3fSGregory Neil Shapiro ** file -- name of source file
140e92d3f3fSGregory Neil Shapiro ** line -- line in source file
141e92d3f3fSGregory Neil Shapiro ** group -- heap group
142e92d3f3fSGregory Neil Shapiro **
143e92d3f3fSGregory Neil Shapiro ** Returns:
144e92d3f3fSGregory Neil Shapiro ** copy of string, exception if out of memory.
145e92d3f3fSGregory Neil Shapiro **
146e92d3f3fSGregory Neil Shapiro ** Side Effects:
147e92d3f3fSGregory Neil Shapiro ** allocate memory for new string.
148e92d3f3fSGregory Neil Shapiro */
149e92d3f3fSGregory Neil Shapiro
150e92d3f3fSGregory Neil Shapiro char *
sm_strdup_tagged_x(s,file,line,group)151e92d3f3fSGregory Neil Shapiro sm_strdup_tagged_x(s, file, line, group)
152e92d3f3fSGregory Neil Shapiro const char *s;
153e92d3f3fSGregory Neil Shapiro char *file;
154e92d3f3fSGregory Neil Shapiro int line, group;
155e92d3f3fSGregory Neil Shapiro {
156e92d3f3fSGregory Neil Shapiro size_t l;
157e92d3f3fSGregory Neil Shapiro char *d;
158e92d3f3fSGregory Neil Shapiro
159e92d3f3fSGregory Neil Shapiro l = strlen(s) + 1;
160e92d3f3fSGregory Neil Shapiro d = sm_malloc_tagged_x(l, file, line, group);
161e92d3f3fSGregory Neil Shapiro (void) sm_strlcpy(d, s, l);
162e92d3f3fSGregory Neil Shapiro return d;
163e92d3f3fSGregory Neil Shapiro }
164e92d3f3fSGregory Neil Shapiro
165e92d3f3fSGregory Neil Shapiro #endif /* DO_NOT_USE_STRCPY */
166e92d3f3fSGregory Neil Shapiro
167