|
|
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: #ifdef NeXT
61: #define xmalloc(l) malloc(l)
62: extern char *malloc ();
63: #else
64: extern char *xmalloc ();
65: #endif /* NeXT */
66:
67: /* VARARGS */
68: char *
69: concat (va_alist)
70: va_dcl
71: {
72: register int length = 0;
73: register char *newstr;
74: register char *end;
75: register char *arg;
76: va_list args;
77:
78: /* First compute the size of the result and get sufficient memory. */
79:
80: va_start (args);
81: while ((arg = va_arg (args, char *)) != NULLP)
82: {
83: length += strlen (arg);
84: }
85: newstr = (char *) xmalloc (length + 1);
86: va_end (args);
87:
88: /* Now copy the individual pieces to the result string. */
89:
90: if (newstr != NULLP)
91: {
92: va_start (args);
93: end = newstr;
94: while ((arg = va_arg (args, char *)) != NULLP)
95: {
96: while (*arg)
97: {
98: *end++ = *arg++;
99: }
100: }
101: *end = '\000';
102: va_end (args);
103: }
104:
105: return (newstr);
106: }
107:
108: #ifdef MAIN
109:
110: /* Simple little test driver. */
111:
112: main ()
113: {
114: printf ("\"\" = \"%s\"\n", concat (NULLP));
115: printf ("\"a\" = \"%s\"\n", concat ("a", NULLP));
116: printf ("\"ab\" = \"%s\"\n", concat ("a", "b", NULLP));
117: printf ("\"abc\" = \"%s\"\n", concat ("a", "b", "c", NULLP));
118: printf ("\"abcd\" = \"%s\"\n", concat ("ab", "cd", NULLP));
119: printf ("\"abcde\" = \"%s\"\n", concat ("ab", "c", "de", NULLP));
120: printf ("\"abcdef\" = \"%s\"\n", concat ("", "a", "", "bcd", "ef", NULLP));
121: }
122:
123: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.