]> git.kaiwu.me - njs.git/commitdiff
Introduced nxt_file_basename() and nxt_file_dirname().
authorDmitry Volyntsev <xeioex@nginx.com>
Wed, 20 Feb 2019 13:16:30 +0000 (16:16 +0300)
committerDmitry Volyntsev <xeioex@nginx.com>
Wed, 20 Feb 2019 13:16:30 +0000 (16:16 +0300)
njs/njs_shell.c
njs/test/njs_unit_test.c
nxt/nxt_file.c
nxt/nxt_file.h

index cc274d5cc176ec6ff8a45e8203c079fb50357c11..91bc409207c8c9a1bbecaf3ad0e3020e37fa2c14 100644 (file)
@@ -216,7 +216,9 @@ main(int argc, char **argv)
 
     if (!opts.quiet) {
         if (opts.file != NULL) {
-            nxt_file_name(&vm_options.file, opts.file);
+            vm_options.file.start = (u_char *) opts.file;
+            vm_options.file.length = strlen(opts.file);
+            nxt_file_basename(&vm_options.file, &vm_options.file);
 
         } else {
             vm_options.file = nxt_string_value("shell");
index 2672d85fec70ea589a83ebb245d00e52fa8e997e..b1afdb638676dbabbee692a3080cd402c783e90f 100644 (file)
@@ -11994,6 +11994,97 @@ njs_vm_object_alloc_test(njs_vm_t * vm, nxt_bool_t disassemble,
 }
 
 
+static nxt_int_t
+nxt_file_basename_test(njs_vm_t * vm, nxt_bool_t disassemble,
+    nxt_bool_t verbose)
+{
+    nxt_str_t   name;
+    nxt_bool_t  success;
+    nxt_uint_t  i;
+
+    static const struct {
+        nxt_str_t   path;
+        nxt_str_t   expected;
+    } tests[] = {
+        { nxt_string(""),            nxt_string("") },
+        { nxt_string("/"),           nxt_string("") },
+        { nxt_string("/a"),          nxt_string("a") },
+        { nxt_string("///"),         nxt_string("") },
+        { nxt_string("///a"),        nxt_string("a") },
+        { nxt_string("///a/"),       nxt_string("") },
+        { nxt_string("a"),           nxt_string("a") },
+        { nxt_string("a/"),          nxt_string("") },
+        { nxt_string("a//"),         nxt_string("") },
+        { nxt_string("path/name"),   nxt_string("name") },
+        { nxt_string("/path/name"),  nxt_string("name") },
+        { nxt_string("/path/name/"), nxt_string("") },
+    };
+
+    for (i = 0; i < nxt_nitems(tests); i++) {
+        nxt_file_basename(&tests[i].path, &name);
+
+        success = nxt_strstr_eq(&tests[i].expected, &name);
+
+        if (!success) {
+            printf("nxt_file_basename_test(\"%.*s\"):\n"
+                   "expected: \"%.*s\"\n     got: \"%.*s\"\n",
+                   (int) tests[i].path.length, tests[i].path.start,
+                   (int) tests[i].expected.length, tests[i].expected.start,
+                   (int) name.length, name.start);
+            return NXT_ERROR;
+        }
+    }
+
+    return NXT_OK;
+}
+
+
+static nxt_int_t
+nxt_file_dirname_test(njs_vm_t * vm, nxt_bool_t disassemble,
+    nxt_bool_t verbose)
+{
+    nxt_str_t   name;
+    nxt_bool_t  success;
+    nxt_uint_t  i;
+
+    static const struct {
+        nxt_str_t   path;
+        nxt_str_t   expected;
+    } tests[] = {
+        { nxt_string(""),               nxt_string("") },
+        { nxt_string("/"),              nxt_string("/") },
+        { nxt_string("/a"),             nxt_string("/") },
+        { nxt_string("///"),            nxt_string("///") },
+        { nxt_string("///a"),           nxt_string("///") },
+        { nxt_string("///a/"),          nxt_string("///a") },
+        { nxt_string("a"),              nxt_string("") },
+        { nxt_string("a/"),             nxt_string("a") },
+        { nxt_string("a//"),            nxt_string("a") },
+        { nxt_string("p1/p2/name"),     nxt_string("p1/p2") },
+        { nxt_string("/p1/p2/name"),    nxt_string("/p1/p2") },
+        { nxt_string("/p1/p2///name"),  nxt_string("/p1/p2") },
+        { nxt_string("/p1/p2/name/"),   nxt_string("/p1/p2/name") },
+    };
+
+    for (i = 0; i < nxt_nitems(tests); i++) {
+        nxt_file_dirname(&tests[i].path, &name);
+
+        success = nxt_strstr_eq(&tests[i].expected, &name);
+
+        if (!success) {
+            printf("nxt_file_dirname_test(\"%.*s\"):\n"
+                   "expected: \"%.*s\"\n     got: \"%.*s\"\n",
+                   (int) tests[i].path.length, tests[i].path.start,
+                   (int) tests[i].expected.length, tests[i].expected.start,
+                   (int) name.length, name.start);
+            return NXT_ERROR;
+        }
+    }
+
+    return NXT_OK;
+}
+
+
 typedef struct {
     nxt_int_t  (*test)(njs_vm_t *, nxt_bool_t, nxt_bool_t);
     nxt_str_t  name;
@@ -12009,10 +12100,13 @@ njs_api_test(nxt_bool_t disassemble, nxt_bool_t verbose)
     njs_vm_opt_t    options;
     njs_api_test_t  *test;
 
-    static njs_api_test_t  njs_api_test[] =
-    {
+    static njs_api_test_t  njs_api_test[] = {
         { njs_vm_object_alloc_test,
-          nxt_string("njs_vm_object_alloc_test") }
+          nxt_string("njs_vm_object_alloc_test") },
+        { nxt_file_basename_test,
+          nxt_string("nxt_file_basename_test") },
+        { nxt_file_dirname_test,
+          nxt_string("nxt_file_dirname_test") },
     };
 
     rc = NXT_ERROR;
index 2bf3aae3ef9f6b9ec5fa9ffa514f5c5d11cb2262..4552e484f80db7538c72a498b1b3750e3fbc4b8f 100644 (file)
 
 
 void
-nxt_file_name(nxt_str_t *name, char *path)
+nxt_file_basename(const nxt_str_t *path, nxt_str_t *name)
 {
-    char  *p;
-    size_t  length;
+    const u_char  *p, *end;
 
-    length = strlen(path);
+    end = path->start + path->length;
+    p = end - 1;
 
-    for (p = path + length; p >= path; p--) {
-        if (*p == '/') {
-            p++;
-            break;
-        }
-    }
+    /* Stripping dir prefix. */
+
+    while (p >= path->start && *p != '/') { p--; }
+
+    p++;
 
     name->start = (u_char *) p;
-    name->length = length - (p - path);
+    name->length = end - p;
+}
+
+
+void
+nxt_file_dirname(const nxt_str_t *path, nxt_str_t *name)
+{
+    const u_char  *p, *end;
+
+    if (path->length == 0) {
+        *name = nxt_string_value("");
+        return;
+    }
+
+    p = path->start + path->length - 1;
+
+    /* Stripping basename. */
+
+    while (p >= path->start && *p != '/') { p--; }
+
+    end = p + 1;
+
+    if (end == path->start) {
+        *name = nxt_string_value("");
+        return;
+    }
+
+    /* Stripping trailing slashes. */
+
+    while (p >= path->start && *p == '/') { p--; }
+
+    p++;
+
+    if (p == path->start) {
+        p = end;
+    }
+
+    name->start = path->start;
+    name->length = p - path->start;
 }
index 545c5a0a6b1fd52f1fee99d7143f5ba6243165ce..3c603cc89821b66b19994bf66b24ac2b7c1f2abf 100644 (file)
@@ -8,7 +8,8 @@
 #define _NXT_FILE_H_INCLUDED_
 
 
-void nxt_file_name(nxt_str_t *name, char *path);
+void nxt_file_basename(const nxt_str_t *path, nxt_str_t *name);
+void nxt_file_dirname(const nxt_str_t *path, nxt_str_t *name);
 
 
 #endif /* _NXT_FILE_H_INCLUDED_ */