Path: blob/main/contrib/llvm-project/lldb/source/Utility/TildeExpressionResolver.cpp
39587 views
//===-- TildeExpressionResolver.cpp ---------------------------------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "lldb/Utility/TildeExpressionResolver.h"910#include <cassert>11#include <system_error>1213#include "llvm/ADT/STLExtras.h"14#include "llvm/ADT/SmallVector.h"15#include "llvm/Support/FileSystem.h"16#include "llvm/Support/Path.h"17#include "llvm/Support/raw_ostream.h"1819#if !defined(_WIN32)20#include <pwd.h>21#endif2223using namespace lldb_private;24using namespace llvm;2526namespace fs = llvm::sys::fs;27namespace path = llvm::sys::path;2829TildeExpressionResolver::~TildeExpressionResolver() = default;3031bool StandardTildeExpressionResolver::ResolveExact(32StringRef Expr, SmallVectorImpl<char> &Output) {33// We expect the tilde expression to be ONLY the expression itself, and34// contain no separators.35assert(!llvm::any_of(Expr, [](char c) { return path::is_separator(c); }));36assert(Expr.empty() || Expr[0] == '~');3738return !fs::real_path(Expr, Output, true);39}4041bool StandardTildeExpressionResolver::ResolvePartial(StringRef Expr,42StringSet<> &Output) {43// We expect the tilde expression to be ONLY the expression itself, and44// contain no separators.45assert(!llvm::any_of(Expr, [](char c) { return path::is_separator(c); }));46assert(Expr.empty() || Expr[0] == '~');4748Output.clear();49#if defined(_WIN32) || defined(__ANDROID__)50return false;51#else52if (Expr.empty())53return false;5455SmallString<32> Buffer("~");56setpwent();57struct passwd *user_entry;58Expr = Expr.drop_front();5960while ((user_entry = getpwent()) != nullptr) {61StringRef ThisName(user_entry->pw_name);62if (!ThisName.starts_with(Expr))63continue;6465Buffer.resize(1);66Buffer.append(ThisName);67Buffer.append(path::get_separator());68Output.insert(Buffer);69}7071return true;72#endif73}7475bool TildeExpressionResolver::ResolveFullPath(76StringRef Expr, llvm::SmallVectorImpl<char> &Output) {77if (!Expr.starts_with("~")) {78Output.assign(Expr.begin(), Expr.end());79return false;80}8182namespace path = llvm::sys::path;83StringRef Left =84Expr.take_until([](char c) { return path::is_separator(c); });8586if (!ResolveExact(Left, Output)) {87Output.assign(Expr.begin(), Expr.end());88return false;89}9091Output.append(Expr.begin() + Left.size(), Expr.end());92return true;93}949596