Skip to content

Instantly share code, notes, and snippets.

@xeioex
Created February 19, 2019 13:44
Show Gist options
  • Save xeioex/27677f8ced0dbbc41349653e8397eb66 to your computer and use it in GitHub Desktop.
Save xeioex/27677f8ced0dbbc41349653e8397eb66 to your computer and use it in GitHub Desktop.
# 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