ls: Sort the output alphabetically

Also use StringBuilder to construct the full relative paths, to get rid
of an unnecessary and suspicious-looking buffer.
This commit is contained in:
Andreas Kling 2019-08-20 21:37:25 +02:00
parent 029786e6b5
commit 9731bff44c
Notes: sideshowbarker 2024-07-19 12:35:06 +09:00

View File

@ -1,4 +1,6 @@
#include <AK/AKString.h>
#include <AK/QuickSort.h>
#include <AK/StringBuilder.h>
#include <AK/Vector.h>
#include <LibCore/CDirIterator.h>
#include <dirent.h>
@ -202,26 +204,33 @@ bool print_filesystem_object(const char* path, const char* name)
int do_file_system_object_long(const char* path)
{
DIR* dirp = opendir(path);
if (!dirp) {
if (errno == ENOTDIR) {
CDirIterator di(path, !flag_show_dotfiles ? CDirIterator::SkipDots : CDirIterator::Flags::NoFlags);
if (di.has_error()) {
if (di.error() == ENOTDIR) {
if (print_filesystem_object(path, path))
return 0;
return 2;
}
perror("opendir");
fprintf(stderr, "CDirIterator: %s\n", di.error_string());
return 1;
}
char pathbuf[PATH_MAX];
while (auto* de = readdir(dirp)) {
if (de->d_name[0] == '.' && !flag_show_dotfiles)
Vector<String, 1024> names;
while (di.has_next())
names.append(di.next_path());
quick_sort(names.begin(), names.end(), [](auto& a, auto& b) { return a < b; });
for (auto& name : names) {
ASSERT(!name.is_empty());
if (name[0] == '.' && !flag_show_dotfiles)
continue;
sprintf(pathbuf, "%s/%s", path, de->d_name);
if (!print_filesystem_object(pathbuf, de->d_name))
StringBuilder builder;
builder.append(path);
builder.append('/');
builder.append(name);
if (!print_filesystem_object(builder.to_string().characters(), name.characters()))
return 2;
}
closedir(dirp);
return 0;
}
@ -262,15 +271,17 @@ int do_file_system_object_short(const char* path)
if (names.last().length() > longest_name)
longest_name = name.length();
}
quick_sort(names.begin(), names.end(), [](auto& a, auto& b) { return a < b; });
int printed_on_row = 0;
int nprinted;
for (int i = 0; i < names.size(); ++i) {
auto& name = names[i];
char pathbuf[256];
sprintf(pathbuf, "%s/%s", path, name.characters());
if (!print_filesystem_object_short(pathbuf, name.characters(), &nprinted))
StringBuilder builder;
builder.append(path);
builder.append('/');
builder.append(name);
if (!print_filesystem_object_short(builder.to_string().characters(), name.characters(), &nprinted))
return 2;
int offset = 0;
if (terminal_columns > longest_name)