return (r);
}
+struct archive_string *
+archive_string_dirname(struct archive_string *as)
+{
+ /* strip trailing separators */
+ while (as->length > 1 && as->s[as->length - 1] == '/')
+ as->length--;
+ /* strip final component */
+ while (as->length > 0 && as->s[as->length - 1] != '/')
+ as->length--;
+ /* empty path -> cwd */
+ if (as->length == 0)
+ return (archive_strcat(as, "."));
+ /* strip separator(s) */
+ while (as->length > 1 && as->s[as->length - 1] == '/')
+ as->length--;
+ /* terminate */
+ as->s[as->length] = '\0';
+ return (as);
+}
+
#if HAVE_ICONV
/*
void archive_string_sprintf(struct archive_string *, const char *, ...)
__LA_PRINTF(2, 3);
+/* Equivalent to dirname(3) */
+struct archive_string *
+archive_string_dirname(struct archive_string *);
+
/* Translates from MBS to Unicode. */
/* Returns non-zero if conversion failed in any way. */
int archive_wstring_append_from_mbs(struct archive_wstring *dest,
archive_string_free(&s);
}
+static void
+test_archive_string_dirname(void)
+{
+ static struct pair { const char *str, *exp; } pairs[] = {
+ { "", "." },
+ { "/", "/" },
+ { "//", "/" },
+ { "///", "/" },
+ { "./", "." },
+ { ".", "." },
+ { "..", "." },
+ { "foo", "." },
+ { "foo/", "." },
+ { "foo//", "." },
+ { "foo/bar", "foo" },
+ { "foo/bar/", "foo" },
+ { "foo/bar//", "foo" },
+ { "foo//bar", "foo" },
+ { "foo//bar/", "foo" },
+ { "foo//bar//", "foo" },
+ { "/foo", "/" },
+ { "//foo", "/" },
+ { "//foo/", "/" },
+ { "//foo//", "/" },
+ { 0 },
+ };
+ struct pair *pair;
+ struct archive_string s;
+
+ archive_string_init(&s);
+ for (pair = pairs; pair->str; pair++) {
+ archive_strcpy(&s, pair->str);
+ archive_string_dirname(&s);
+ assertEqualString(pair->exp, s.s);
+ }
+}
+
DEFINE_TEST(test_archive_string)
{
test_archive_string_ensure();
test_archive_string_concat();
test_archive_string_copy();
test_archive_string_sprintf();
+ test_archive_string_dirname();
}
static const char *strings[] =