|
|
1.1 root 1: /* Concatenate variable number of strings.
2: Copyright (C) 1991 Free Software Foundation, Inc.
3: Written by Fred Fish @ Cygnus Support
4:
5: This file is part of the libiberty library.
6: Libiberty is free software; you can redistribute it and/or
7: modify it under the terms of the GNU Library General Public
8: License as published by the Free Software Foundation; either
9: version 2 of the License, or (at your option) any later version.
10:
11: Libiberty is distributed in the hope that it will be useful,
12: but WITHOUT ANY WARRANTY; without even the implied warranty of
13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14: Library General Public License for more details.
15:
16: You should have received a copy of the GNU Library General Public
17: License along with libiberty; see the file COPYING.LIB. If
18: not, write to the Free Software Foundation, Inc., 675 Mass Ave,
19: Cambridge, MA 02139, USA. */
20:
21:
22: /*
23:
24: NAME
25:
26: concat -- concatenate a variable number of strings
27:
28: SYNOPSIS
29:
30: #include <varargs.h>
31:
32: char *concat (s1, s2, s3, ..., NULL)
33:
34: DESCRIPTION
35:
36: Concatenate a variable number of strings and return the result
37: in freshly malloc'd memory.
38:
39: Returns NULL if insufficient memory is available. The argument
40: list is terminated by the first NULL pointer encountered. Pointers
41: to empty strings are ignored.
42:
43: NOTES
44:
45: This function uses xmalloc() which is expected to be a front end
46: function to malloc() that deals with low memory situations. In
47: typical use, if malloc() returns NULL then xmalloc() diverts to an
48: error handler routine which never returns, and thus xmalloc will
49: never return a NULL pointer. If the client application wishes to
50: deal with low memory situations itself, it should supply an xmalloc
51: that just directly invokes malloc and blindly returns whatever
52: malloc returns.
53: */
54:
55:
56: #include <varargs.h>
57:
58: #define NULLP (char *)0
59:
60: extern char *xmalloc ();
61:
62: /* VARARGS */
63: char *
64: concat (va_alist)
65: va_dcl
66: {
67: register int length = 0;
68: register char *newstr;
69: register char *end;
70: register char *arg;
71: va_list args;
72:
73: /* First compute the size of the result and get sufficient memory. */
74:
75: va_start (args);
76: while ((arg = va_arg (args, char *)) != NULLP)
77: {
78: length += strlen (arg);
79: }
80: newstr = (char *) xmalloc (length + 1);
81: va_end (args);
82:
83: /* Now copy the individual pieces to the result string. */
84:
85: if (newstr != NULLP)
86: {
87: va_start (args);
88: end = newstr;
89: while ((arg = va_arg (args, char *)) != NULLP)
90: {
91: while (*arg)
92: {
93: *end++ = *arg++;
94: }
95: }
96: *end = '\000';
97: va_end (args);
98: }
99:
100: return (newstr);
101: }
102:
103: #ifdef MAIN
104:
105: /* Simple little test driver. */
106:
107: main ()
108: {
109: printf ("\"\" = \"%s\"\n", concat (NULLP));
110: printf ("\"a\" = \"%s\"\n", concat ("a", NULLP));
111: printf ("\"ab\" = \"%s\"\n", concat ("a", "b", NULLP));
112: printf ("\"abc\" = \"%s\"\n", concat ("a", "b", "c", NULLP));
113: printf ("\"abcd\" = \"%s\"\n", concat ("ab", "cd", NULLP));
114: printf ("\"abcde\" = \"%s\"\n", concat ("ab", "c", "de", NULLP));
115: printf ("\"abcdef\" = \"%s\"\n", concat ("", "a", "", "bcd", "ef", NULLP));
116: }
117:
118: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.