util: New function base_name().
authorBen Pfaff <blp@nicira.com>
Tue, 9 Nov 2010 22:38:28 +0000 (14:38 -0800)
committerBen Pfaff <blp@nicira.com>
Wed, 10 Nov 2010 18:56:01 +0000 (10:56 -0800)
lib/util.c
lib/util.h
tests/.gitignore
tests/automake.mk
tests/dir_name.at [deleted file]
tests/file_name.at [new file with mode: 0644]
tests/test-dir_name.c [deleted file]
tests/test-file_name.c [new file with mode: 0644]
tests/testsuite.at

index 328cfac4ed6d8751db5a9426f8801e44c7a95021..12403cbbcf4d35e132cbe48ac40255380a97c2d1 100644 (file)
@@ -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 *
@@ -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,
index 5147ffc5555c2e6683210af9c3b3e89b0ab0ff0a..6bc174040659b235acc8082aff7a4b134c6d7794 100644 (file)
@@ -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);
index f79aff2b8ec357dc4837c9411a3ce2c89439b798..91fa1766ee5ada57110676b5d23902812a9880ee 100644 (file)
@@ -9,7 +9,7 @@
 /test-classifier
 /test-csum
 /test-dhcp-client
-/test-dir_name
+/test-file_name
 /test-flows
 /test-hash
 /test-hmap
index f9c0de0edd28a0c71ff7ede41469e441c2204a0a..9e1bd9c214535506ecbd260957a517e30d63b2a7 100644 (file)
@@ -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 \
@@ -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 \
@@ -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 \
@@ -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
diff --git a/tests/dir_name.at b/tests/dir_name.at
deleted file mode 100644 (file)
index 062e422..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-AT_BANNER([test dir_name function])
-
-m4_define([CHECK_DIR_NAME],
-  [AT_SETUP([dir_name("$1") returns "$2"])
-   AT_KEYWORDS([dir_name])
-   AT_CHECK([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/file_name.at b/tests/file_name.at
new file mode 100644 (file)
index 0000000..e0b43dc
--- /dev/null
@@ -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])
diff --git a/tests/test-dir_name.c b/tests/test-dir_name.c
deleted file mode 100644 (file)
index 627ecf1..0000000
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * 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 <config.h>
-#include "util.h"
-#include <stdlib.h>
-
-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/test-file_name.c b/tests/test-file_name.c
new file mode 100644 (file)
index 0000000..a9d1ab9
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * 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.
+ * 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 <config.h>
+#include "util.h"
+#include <stdlib.h>
+
+int
+main(int argc, char *argv[])
+{
+    int i;
+
+    for (i = 1; i < argc; i++) {
+        char *dir, *base;
+
+        dir = dir_name(argv[i]);
+        puts(dir);
+        free(dir);
+
+        base = base_name(argv[i]);
+        puts(base);
+        free(base);
+    }
+
+    return 0;
+}
index d66563c8fc2da921a379261aab96a9e9a4df4c76..c6468d85d59e1ddb828484fc7e845998e937f083 100644 (file)
@@ -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])