Rework the concat() algorithm to be correct in all cases.

MFC after:	1 month
Sponsored by:	The FreeBSD Foundation
This commit is contained in:
Edward Tomasz Napierala 2015-03-13 11:26:02 +00:00
parent 8f73e77536
commit cd3772d076
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=279953

View File

@ -92,6 +92,7 @@ char *
concat(const char *s1, char separator, const char *s2)
{
char *result;
char s1last, s2first;
int ret;
if (s1 == NULL)
@ -99,14 +100,22 @@ concat(const char *s1, char separator, const char *s2)
if (s2 == NULL)
s2 = "";
/*
* If s2 starts with separator - skip it; otherwise concatenating
* "/" and "/foo" would end up returning "//foo".
*/
if (s2[0] == separator)
s2++;
if (s1[0] == '\0')
s1last = '\0';
else
s1last = s1[strlen(s1) - 1];
if (s1[0] == '\0' || s2[0] == '\0' || s1[strlen(s1) - 1] == separator) {
s2first = s2[0];
if (s1last == separator && s2first == separator) {
/*
* If s1 ends with the separator and s2 begins with
* it - skip the latter; otherwise concatenating "/"
* and "/foo" would end up returning "//foo".
*/
ret = asprintf(&result, "%s%s", s1, s2 + 1);
} else if (s1last == separator || s2first == separator ||
s1[0] == '\0' || s2[0] == '\0') {
ret = asprintf(&result, "%s%s", s1, s2);
} else {
ret = asprintf(&result, "%s%c%s", s1, separator, s2);