Created
February 19, 2019 13:44
-
-
Save xeioex/27677f8ced0dbbc41349653e8397eb66 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # HG changeset patch | |
| # User Dmitry Volyntsev <[email protected]> | |
| # Date 1550583722 -10800 | |
| # Tue Feb 19 16:42:02 2019 +0300 | |
| # Node ID 11a891d23ce599c8248ac3078587d515c2310239 | |
| # Parent bb8b8d00b96910dc55e958687d7258d312e05912 | |
| Introduced nxt_basename(). | |
| diff --git a/njs/njs_shell.c b/njs/njs_shell.c | |
| --- a/njs/njs_shell.c | |
| +++ b/njs/njs_shell.c | |
| @@ -216,7 +216,7 @@ main(int argc, char **argv) | |
| if (!opts.quiet) { | |
| if (opts.file != NULL) { | |
| - nxt_file_name(&vm_options.file, opts.file); | |
| + nxt_basename(opts.file, &vm_options.file); | |
| } else { | |
| vm_options.file = nxt_string_value("shell"); | |
| diff --git a/njs/test/njs_unit_test.c b/njs/test/njs_unit_test.c | |
| --- a/njs/test/njs_unit_test.c | |
| +++ b/njs/test/njs_unit_test.c | |
| @@ -12009,6 +12009,48 @@ njs_vm_object_alloc_test(njs_vm_t * vm, | |
| } | |
| +static nxt_int_t | |
| +nxt_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 { | |
| + const char *path; | |
| + nxt_str_t expected; | |
| + } tests[] = { | |
| + { "/", nxt_string("/") }, | |
| + { "/a", nxt_string("a") }, | |
| + { "///", nxt_string("/") }, | |
| + { "///a", nxt_string("a") }, | |
| + { "///a/", nxt_string("a") }, | |
| + { "a", nxt_string("a") }, | |
| + { "a/", nxt_string("a") }, | |
| + { "a//", nxt_string("a") }, | |
| + { "path/name", nxt_string("name") }, | |
| + { "/path/name", nxt_string("name") }, | |
| + { "/path/name/", nxt_string("name") }, | |
| + }; | |
| + | |
| + for (i = 0; i < nxt_nitems(tests); i++) { | |
| + nxt_basename(tests[i].path, &name); | |
| + | |
| + success = nxt_strstr_eq(&tests[i].expected, &name); | |
| + | |
| + if (!success) { | |
| + printf("nxt_basename_test(\"%s\"):\n" | |
| + "expected: \"%.*s\"\n got: \"%.*s\"\n", | |
| + tests[i].path, (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; | |
| @@ -12024,10 +12066,11 @@ njs_api_test(nxt_bool_t disassemble, nxt | |
| 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_basename_test, | |
| + nxt_string("nxt_basename_test") }, | |
| }; | |
| rc = NXT_ERROR; | |
| diff --git a/nxt/nxt_file.c b/nxt/nxt_file.c | |
| --- a/nxt/nxt_file.c | |
| +++ b/nxt/nxt_file.c | |
| @@ -14,20 +14,38 @@ | |
| void | |
| -nxt_file_name(nxt_str_t *name, char *path) | |
| +nxt_basename(const char *path, nxt_str_t *name) | |
| { | |
| - char *p; | |
| - size_t length; | |
| + size_t length; | |
| + const char *p, *end; | |
| length = strlen(path); | |
| - for (p = path + length; p >= path; p--) { | |
| - if (*p == '/') { | |
| - p++; | |
| - break; | |
| - } | |
| + if (length == 0) { | |
| + name->start = NULL; | |
| + name->length = 0; | |
| + return; | |
| } | |
| + /* Trailing slashes. */ | |
| + | |
| + end = path + length; | |
| + p = end - 1; | |
| + | |
| + while (p >= path && *p == '/') { p--; } | |
| + | |
| + if (p == path - 1) { | |
| + name->start = (u_char *) path; | |
| + name->length = 1; | |
| + return; | |
| + } | |
| + | |
| + end = p + 1; | |
| + | |
| + while (p >= path && *p != '/') { p--; } | |
| + | |
| + p++; | |
| + | |
| name->start = (u_char *) p; | |
| - name->length = length - (p - path); | |
| + name->length = end - p; | |
| } | |
| diff --git a/nxt/nxt_file.h b/nxt/nxt_file.h | |
| --- a/nxt/nxt_file.h | |
| +++ b/nxt/nxt_file.h | |
| @@ -8,7 +8,7 @@ | |
| #define _NXT_FILE_H_INCLUDED_ | |
| -void nxt_file_name(nxt_str_t *name, char *path); | |
| +void nxt_basename(const char *path, nxt_str_t *name); | |
| #endif /* _NXT_FILE_H_INCLUDED_ */ |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment