Skip to content

Commit

Permalink
util: New function base_name().
Browse files Browse the repository at this point in the history
  • Loading branch information
blp committed Nov 10, 2010
1 parent c214278 commit e1aff6f
Show file tree
Hide file tree
Showing 8 changed files with 75 additions and 43 deletions.
40 changes: 32 additions & 8 deletions lib/util.c
Original file line number Diff line number Diff line change
Expand Up @@ -395,6 +395,14 @@ get_cwd(void)
}
}

static char *
all_slashes_name(const char *s)
{
return xstrdup(s[0] == '/' && s[1] == '/' && s[2] != '/' ? "//"
: s[0] == '/' ? "/"
: ".");
}

/* Returns the directory name portion of 'file_name' as a malloc()'d string,
* similar to the POSIX dirname() function but thread-safe. */
char *
Expand All @@ -410,15 +418,31 @@ dir_name(const char *file_name)
while (len > 0 && file_name[len - 1] == '/') {
len--;
}
if (!len) {
return xstrdup((file_name[0] == '/'
&& file_name[1] == '/'
&& file_name[2] != '/') ? "//"
: file_name[0] == '/' ? "/"
: ".");
} else {
return xmemdup0(file_name, len);
return len ? xmemdup0(file_name, len) : all_slashes_name(file_name);
}

/* Returns the file name portion of 'file_name' as a malloc()'d string,
* similar to the POSIX basename() function but thread-safe. */
char *
base_name(const char *file_name)
{
size_t end, start;

end = strlen(file_name);
while (end > 0 && file_name[end - 1] == '/') {
end--;
}

if (!end) {
return all_slashes_name(file_name);
}

start = end;
while (start > 0 && file_name[start - 1] != '/') {
start--;
}

return xmemdup0(file_name + start, end - start);
}

/* If 'file_name' starts with '/', returns a copy of 'file_name'. Otherwise,
Expand Down
1 change: 1 addition & 0 deletions lib/util.h
Original file line number Diff line number Diff line change
Expand Up @@ -135,6 +135,7 @@ int hexit_value(int c);

char *get_cwd(void);
char *dir_name(const char *file_name);
char *base_name(const char *file_name);
char *abs_file_name(const char *dir, const char *file_name);

void ignore(bool x OVS_UNUSED);
Expand Down
2 changes: 1 addition & 1 deletion tests/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
/test-classifier
/test-csum
/test-dhcp-client
/test-dir_name
/test-file_name
/test-flows
/test-hash
/test-hmap
Expand Down
12 changes: 6 additions & 6 deletions tests/automake.mk
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ TESTSUITE_AT = \
tests/daemon-py.at \
tests/ovs-ofctl.at \
tests/vconn.at \
tests/dir_name.at \
tests/file_name.at \
tests/aes128.at \
tests/uuid.at \
tests/json.at \
Expand Down Expand Up @@ -65,7 +65,7 @@ lcov_wrappers = \
tests/lcov/test-classifier \
tests/lcov/test-csum \
tests/lcov/test-dhcp-client \
tests/lcov/test-dir_name \
tests/lcov/test-file_name \
tests/lcov/test-flows \
tests/lcov/test-hash \
tests/lcov/test-hmap \
Expand Down Expand Up @@ -114,7 +114,7 @@ valgrind_wrappers = \
tests/valgrind/test-classifier \
tests/valgrind/test-csum \
tests/valgrind/test-dhcp-client \
tests/valgrind/test-dir_name \
tests/valgrind/test-file_name \
tests/valgrind/test-flows \
tests/valgrind/test-hash \
tests/valgrind/test-hmap \
Expand Down Expand Up @@ -181,9 +181,9 @@ noinst_PROGRAMS += tests/test-csum
tests_test_csum_SOURCES = tests/test-csum.c
tests_test_csum_LDADD = lib/libopenvswitch.a

noinst_PROGRAMS += tests/test-dir_name
tests_test_dir_name_SOURCES = tests/test-dir_name.c
tests_test_dir_name_LDADD = lib/libopenvswitch.a
noinst_PROGRAMS += tests/test-file_name
tests_test_file_name_SOURCES = tests/test-file_name.c
tests_test_file_name_LDADD = lib/libopenvswitch.a

noinst_PROGRAMS += tests/test-flows
tests_test_flows_SOURCES = tests/test-flows.c
Expand Down
25 changes: 0 additions & 25 deletions tests/dir_name.at

This file was deleted.

26 changes: 26 additions & 0 deletions tests/file_name.at
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
AT_BANNER([test dir_name and base_name functions])

m4_define([CHECK_FILE_NAME],
[AT_SETUP([components of "$1" are "$2", "$3"])
AT_KEYWORDS([dir_name base_name])
AT_CHECK([test-file_name "AS_ESCAPE($1)"], [0], [$2
$3
])
AT_CLEANUP])

# These are the test cases given in POSIX for dirname() and basename().
CHECK_FILE_NAME([/usr/lib], [/usr], [lib])
CHECK_FILE_NAME([/usr/], [/], [usr])
CHECK_FILE_NAME([usr], [.], [usr])
CHECK_FILE_NAME([/], [/], [/])
CHECK_FILE_NAME([.], [.], [.])
CHECK_FILE_NAME([..], [.], [..])
CHECK_FILE_NAME([//], [//], [//]) # / is also allowed
CHECK_FILE_NAME([//foo], [//], [foo]) # / is also allowed for dirname
CHECK_FILE_NAME([], [.], [.])

# Additional test cases.
CHECK_FILE_NAME([dir/file], [dir], [file])
CHECK_FILE_NAME([dir/file/], [dir], [file])
CHECK_FILE_NAME([dir/file//], [dir], [file])
CHECK_FILE_NAME([///foo], [/], [foo])
10 changes: 8 additions & 2 deletions tests/test-dir_name.c → tests/test-file_name.c
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*
* Copyright (c) 2009 Nicira Networks.
* Copyright (c) 2009, 2010 Nicira Networks.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
Expand All @@ -24,9 +24,15 @@ main(int argc, char *argv[])
int i;

for (i = 1; i < argc; i++) {
char *dir = dir_name(argv[i]);
char *dir, *base;

dir = dir_name(argv[i]);
puts(dir);
free(dir);

base = base_name(argv[i]);
puts(base);
free(base);
}

return 0;
Expand Down
2 changes: 1 addition & 1 deletion tests/testsuite.at
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ m4_include([tests/daemon.at])
m4_include([tests/daemon-py.at])
m4_include([tests/ovs-ofctl.at])
m4_include([tests/vconn.at])
m4_include([tests/dir_name.at])
m4_include([tests/file_name.at])
m4_include([tests/aes128.at])
m4_include([tests/uuid.at])
m4_include([tests/json.at])
Expand Down

0 comments on commit e1aff6f

Please sign in to comment.