Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/crypto/heimdal/lib/roken/concat.c
39534 views
1
/*
2
* Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan
3
* (Royal Institute of Technology, Stockholm, Sweden).
4
* All rights reserved.
5
*
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions
8
* are met:
9
*
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
12
*
13
* 2. Redistributions in binary form must reproduce the above copyright
14
* notice, this list of conditions and the following disclaimer in the
15
* documentation and/or other materials provided with the distribution.
16
*
17
* 3. Neither the name of the Institute nor the names of its contributors
18
* may be used to endorse or promote products derived from this software
19
* without specific prior written permission.
20
*
21
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31
* SUCH DAMAGE.
32
*/
33
34
#include <config.h>
35
36
#include "roken.h"
37
38
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
39
roken_concat (char *s, size_t len, ...)
40
{
41
int ret;
42
va_list args;
43
44
va_start(args, len);
45
ret = roken_vconcat (s, len, args);
46
va_end(args);
47
return ret;
48
}
49
50
ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL
51
roken_vconcat (char *s, size_t len, va_list args)
52
{
53
const char *a;
54
55
while ((a = va_arg(args, const char*))) {
56
size_t n = strlen (a);
57
58
if (n >= len)
59
return -1;
60
memcpy (s, a, n);
61
s += n;
62
len -= n;
63
}
64
*s = '\0';
65
return 0;
66
}
67
68
ROKEN_LIB_FUNCTION size_t ROKEN_LIB_CALL
69
roken_vmconcat (char **s, size_t max_len, va_list args)
70
{
71
const char *a;
72
char *p, *q;
73
size_t len = 0;
74
*s = NULL;
75
p = malloc(1);
76
if(p == NULL)
77
return 0;
78
len = 1;
79
while ((a = va_arg(args, const char*))) {
80
size_t n = strlen (a);
81
82
if(max_len && len + n > max_len){
83
free(p);
84
return 0;
85
}
86
q = realloc(p, len + n);
87
if(q == NULL){
88
free(p);
89
return 0;
90
}
91
p = q;
92
memcpy (p + len - 1, a, n);
93
len += n;
94
}
95
p[len - 1] = '\0';
96
*s = p;
97
return len;
98
}
99
100
ROKEN_LIB_FUNCTION size_t ROKEN_LIB_CALL
101
roken_mconcat (char **s, size_t max_len, ...)
102
{
103
size_t ret;
104
va_list args;
105
106
va_start(args, max_len);
107
ret = roken_vmconcat (s, max_len, args);
108
va_end(args);
109
return ret;
110
}
111
112