w_string_t *w_query_ctx_get_wholename( struct w_query_ctx *ctx ) { w_string_t *full_name; uint32_t name_start; if (ctx->wholename) { return ctx->wholename; } if (ctx->query->relative_root != NULL) { // At this point every path should start with the relative root, so this is // legal name_start = ctx->query->relative_root->len + 1; } else { name_start = ctx->root->root_path->len + 1; } full_name = w_string_path_cat(compute_parent_path(ctx, ctx->file), w_file_get_name(ctx->file)); // Record the name relative to the root ctx->wholename = w_string_slice(full_name, name_start, full_name->len - name_start); w_string_delref(full_name); return ctx->wholename; }
w_string_t *w_string_canon_path(w_string_t *str) { int end; int trim = 0; for (end = str->len - 1; end >= 0 && str->buf[end] == '/'; end--) { trim++; } if (trim) { return w_string_slice(str, 0, str->len - trim); } w_string_addref(str); return str; }
w_string_t *w_string_dirname(w_string_t *str) { int end; /* can't use libc strXXX functions because we may be operating * on a slice */ for (end = str->len - 1; end >= 0; end--) { if (str->buf[end] == '/') { /* found the end of the parent dir */ return w_string_slice(str, 0, end); } } return NULL; }
w_string_t *w_string_basename(w_string_t *str) { int end; /* can't use libc strXXX functions because we may be operating * on a slice */ for (end = str->len - 1; end >= 0; end--) { if (str->buf[end] == '/') { /* found the end of the parent dir */ return w_string_slice(str, end + 1, str->len - (end + 1)); } } w_string_addref(str); return str; }
w_string_t *w_query_ctx_get_wholename( struct w_query_ctx *ctx ) { w_string_t *full_name; uint32_t name_start; if (ctx->wholename) { return ctx->wholename; } name_start = ctx->root->root_path->len + 1; full_name = w_string_path_cat(ctx->file->parent->path, ctx->file->name); // Record the name relative to the root ctx->wholename = w_string_slice(full_name, name_start, full_name->len - name_start); w_string_delref(full_name); return ctx->wholename; }
w_string w_string::slice(uint32_t start, uint32_t len) const { return w_string(w_string_slice(str_, start, len), false); }