From 29d4af6016b5616ccac56c702c078e36189ef951 Mon Sep 17 00:00:00 2001 From: Ben Pfaff Date: Mon, 19 Oct 2009 14:04:14 -0700 Subject: [PATCH] New dir_name() function plus tests. --- lib/util.c | 26 ++++++++++++++++++++++++++ lib/util.h | 2 ++ tests/automake.mk | 5 +++++ tests/dir_name.at | 25 +++++++++++++++++++++++++ tests/test-dir_name.c | 33 +++++++++++++++++++++++++++++++++ tests/testsuite.at | 1 + 6 files changed, 92 insertions(+) create mode 100644 tests/dir_name.at create mode 100644 tests/test-dir_name.c diff --git a/lib/util.c b/lib/util.c index 6c152e24..65cb3608 100644 --- a/lib/util.c +++ b/lib/util.c @@ -357,3 +357,29 @@ hexit_value(int c) NOT_REACHED(); } + +/* Returns the directory name portion of 'file_name' as a malloc()'d string, + * similar to the POSIX dirname() function but thread-safe. */ +char * +dir_name(const char *file_name) +{ + size_t len = strlen(file_name); + while (len > 0 && file_name[len - 1] == '/') { + len--; + } + while (len > 0 && file_name[len - 1] != '/') { + len--; + } + 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); + } +} diff --git a/lib/util.h b/lib/util.h index afa43f62..9e7b88f0 100644 --- a/lib/util.h +++ b/lib/util.h @@ -125,6 +125,8 @@ bool str_to_double(const char *, double *); int hexit_value(int c); +char *dir_name(const char *file_name); + #ifdef __cplusplus } #endif diff --git a/tests/automake.mk b/tests/automake.mk index 41f498fe..a9edee0e 100644 --- a/tests/automake.mk +++ b/tests/automake.mk @@ -8,6 +8,7 @@ TESTSUITE_AT = \ tests/testsuite.at \ tests/lcov-pre.at \ tests/library.at \ + tests/dir_name.at \ tests/aes128.at \ tests/uuid.at \ tests/json.at \ @@ -54,6 +55,10 @@ 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-flows tests_test_flows_SOURCES = tests/test-flows.c tests_test_flows_LDADD = lib/libopenvswitch.a diff --git a/tests/dir_name.at b/tests/dir_name.at new file mode 100644 index 00000000..4555e521 --- /dev/null +++ b/tests/dir_name.at @@ -0,0 +1,25 @@ +AT_BANNER([test dir_name function]) + +m4_define([CHECK_DIR_NAME], + [AT_SETUP([dir_name("$1") returns "$2"]) + AT_KEYWORDS([dir_name]) + OVS_CHECK_LCOV([test-dir_name "AS_ESCAPE($1)"], [0], [$2 +]) + AT_CLEANUP]) + +# These are the test cases given in POSIX for dirname(). +CHECK_DIR_NAME([/usr/lib], [/usr]) +CHECK_DIR_NAME([/usr/], [/]) +CHECK_DIR_NAME([usr], [.]) +CHECK_DIR_NAME([/], [/]) +CHECK_DIR_NAME([.], [.]) +CHECK_DIR_NAME([..], [.]) +CHECK_DIR_NAME([//], [//]) # / is also allowed +CHECK_DIR_NAME([//foo], [//]) # / is also allowed +CHECK_DIR_NAME([], [.]) + +# Additional test cases. +CHECK_DIR_NAME([dir/file], [dir]) +CHECK_DIR_NAME([dir/file/], [dir]) +CHECK_DIR_NAME([dir/file//], [dir]) +CHECK_DIR_NAME([///foo], [/]) diff --git a/tests/test-dir_name.c b/tests/test-dir_name.c new file mode 100644 index 00000000..627ecf17 --- /dev/null +++ b/tests/test-dir_name.c @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2009 Nicira Networks. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at: + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include "util.h" +#include + +int +main(int argc, char *argv[]) +{ + int i; + + for (i = 1; i < argc; i++) { + char *dir = dir_name(argv[i]); + puts(dir); + free(dir); + } + + return 0; +} diff --git a/tests/testsuite.at b/tests/testsuite.at index ca453155..816bed1c 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -19,6 +19,7 @@ AT_TESTED([ovs-vsctl]) m4_include([tests/lcov-pre.at]) m4_include([tests/library.at]) +m4_include([tests/dir_name.at]) m4_include([tests/aes128.at]) m4_include([tests/uuid.at]) m4_include([tests/json.at]) -- 2.30.2