xref: /illumos-gate/usr/src/contrib/ast/src/lib/libast/path/pathcat.c (revision b30d193948be5a7794d7ae3ba0ed9c2f72c88e0f)
1 /***********************************************************************
2 *                                                                      *
3 *               This software is part of the ast package               *
4 *          Copyright (c) 1985-2011 AT&T Intellectual Property          *
5 *                      and is licensed under the                       *
6 *                 Eclipse Public License, Version 1.0                  *
7 *                    by AT&T Intellectual Property                     *
8 *                                                                      *
9 *                A copy of the License is available at                 *
10 *          http://www.eclipse.org/org/documents/epl-v10.html           *
11 *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12 *                                                                      *
13 *              Information and Software Systems Research               *
14 *                            AT&T Research                             *
15 *                           Florham Park NJ                            *
16 *                                                                      *
17 *                 Glenn Fowler <gsf@research.att.com>                  *
18 *                  David Korn <dgk@research.att.com>                   *
19 *                   Phong Vo <kpv@research.att.com>                    *
20 *                                                                      *
21 ***********************************************************************/
22 #pragma prototyped
23 /*
24  * Glenn Fowler
25  * AT&T Bell Laboratories
26  *
27  * single dir support for pathaccess()
28  */
29 
30 #define _AST_API_H	1
31 
32 #include <ast.h>
33 
34 /*
35  * building 3d flirts with the dark side
36  */
37 
38 #if _BLD_3d
39 
40 #undef	pathcat
41 #define pathcat_20100601	_3d_pathcat
42 
43 #else
44 
45 char*
pathcat(char * path,const char * dirs,int sep,const char * a,const char * b)46 pathcat(char* path, const char* dirs, int sep, const char* a, const char* b)
47 {
48 	return pathcat_20100601(dirs, sep, a, b, path, PATH_MAX);
49 }
50 
51 #endif
52 
53 #undef	_AST_API
54 
55 #include <ast_api.h>
56 
57 char*
pathcat_20100601(register const char * dirs,int sep,const char * a,register const char * b,char * path,size_t size)58 pathcat_20100601(register const char* dirs, int sep, const char* a, register const char* b, char* path, size_t size)
59 {
60 	register char*	s;
61 	register char*	e;
62 
63 	s = path;
64 	e = path + size;
65 	while (*dirs && *dirs != sep)
66 	{
67 		if (s >= e)
68 			return 0;
69 		*s++ = *dirs++;
70 	}
71 	if (s != path)
72 	{
73 		if (s >= e)
74 			return 0;
75 		*s++ = '/';
76 	}
77 	if (a)
78 	{
79 		while (*s = *a++)
80 			if (++s >= e)
81 				return 0;
82 		if (b)
83 		{
84 			if (s >= e)
85 				return 0;
86 			*s++ = '/';
87 		}
88 	}
89 	else if (!b)
90 		b = ".";
91 	if (b)
92 		do
93 		{
94 			if (s >= e)
95 				return 0;
96 		} while (*s++ = *b++);
97 	return *dirs ? (char*)++dirs : 0;
98 }
99