summaryrefslogtreecommitdiff
path: root/src/commands/ls.c
diff options
context:
space:
mode:
authorTyler Murphy <tylerm@tylerm.dev>2023-05-04 16:10:37 -0400
committerTyler Murphy <tylerm@tylerm.dev>2023-05-04 16:10:37 -0400
commitb1364be7e271c5a080e29efcda209a190a82d6d9 (patch)
treefc64d1546e59b5ed1c2c204612b6181bc401c27f /src/commands/ls.c
parentgrep (diff)
downloadlazysphere-b1364be7e271c5a080e29efcda209a190a82d6d9.tar.gz
lazysphere-b1364be7e271c5a080e29efcda209a190a82d6d9.tar.bz2
lazysphere-b1364be7e271c5a080e29efcda209a190a82d6d9.zip
ansii c
Diffstat (limited to '')
-rw-r--r--src/commands/ls.c113
1 files changed, 73 insertions, 40 deletions
diff --git a/src/commands/ls.c b/src/commands/ls.c
index a5c60d2..e8d58d0 100644
--- a/src/commands/ls.c
+++ b/src/commands/ls.c
@@ -65,13 +65,18 @@ static DIR* get_directory(char* path) {
static bool get_file_info(const char* file_name, struct FileInfo* info) {
- uid_t uid = getuid();
- gid_t gid = getgid();
-
+ uid_t uid;
+ gid_t gid;
+ int save, ty;
struct stat s;
+ size_t file_len;
+
+ uid = getuid();
+ gid = getgid();
+
memset(&s, 0, sizeof(struct stat));
- int save = push_path_buffer(file_name);
+ save = push_path_buffer(file_name);
if (lstat(get_path_buffer(), &s) < 0) {
error_s("failed to read file '%s': %s\n", get_path_buffer(), strerror(errno));
@@ -79,7 +84,7 @@ static bool get_file_info(const char* file_name, struct FileInfo* info) {
return false;
}
- int ty = (s.st_mode & S_IFMT) >> 12;
+ ty = (s.st_mode & S_IFMT) >> 12;
info->set_uid = false;
info->set_gid = false;
@@ -171,7 +176,7 @@ static bool get_file_info(const char* file_name, struct FileInfo* info) {
info->links = s.st_nlink;
info->type = ty;
- size_t file_len = strlen(file_name) + 1;
+ file_len = strlen(file_name) + 1;
info->name = malloc(file_len);
memcpy(info->name, file_name, file_len);
@@ -217,13 +222,16 @@ static char* get_file_color(struct FileInfo* info) {
static void list_files(struct FileInfo* files, int file_len, struct FileListInfo info) {
+ struct winsize w;
+ char* color;
+ int column_width, row_count, i;
+
if (flags.more_info) {
char total[13];
print_file_size(info.total_size, total);
printf("total %s\n", total);
}
- struct winsize w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
if (!isatty(1)) {
@@ -232,11 +240,10 @@ static void list_files(struct FileInfo* files, int file_len, struct FileListInfo
flags.colored = NO;
}
- char* color;
- const int column_width = info.max_name + 1;
- const int row_count = w.ws_col / column_width;
+ column_width = info.max_name + 1;
+ row_count = w.ws_col / column_width;
- for (int i = 0; i < file_len; i++) {
+ for (i = 0; i < file_len; i++) {
struct FileInfo finfo = files[i];
color = get_file_color(&finfo);
if (flags.more_info) {
@@ -305,25 +312,28 @@ static void push_file(
const char* file_path
) {
struct FileInfo finfo;
+ int user_len, group_len, name_len, size_len, link_len;
+
if (!get_file_info(file_path, &finfo)) return;
if (*size == *capacity) {
*capacity *= 2;
*files = realloc(*files, sizeof(struct FileInfo) * *capacity);
}
- int user_len = strlen(finfo.usr->pw_name);
+
+ user_len = strlen(finfo.usr->pw_name);
if (user_len > info->max_usr) info->max_usr = user_len;
- int group_len = strlen(finfo.grp->gr_name);
+ group_len = strlen(finfo.grp->gr_name);
if (group_len > info->max_grp) info->max_grp = group_len;
- int name_len = strlen(file_path);
+ name_len = strlen(file_path);
if (name_len > info->max_name) info->max_name = name_len;
- int size_len = strlen(finfo.size);
+ size_len = strlen(finfo.size);
if (size_len > info->max_size) info->max_size = size_len;
- int link_len = num_places(finfo.links);
+ link_len = num_places(finfo.links);
if (link_len > info->max_link) info->max_link = link_len;
info->total_len += name_len + 2;
@@ -335,18 +345,22 @@ static void push_file(
static void recurse_directory(char* dir_name) {
DIR* d;
+ int capacity, size, save;
struct dirent* file;
- int save = push_path_buffer(dir_name);
+ struct FileInfo* files;
+ struct FileListInfo info;
+
+ save = push_path_buffer(dir_name);
d = get_directory(get_path_buffer());
if (d == NULL) {
return;
}
- int capacity = 8;
- int size = 0;
- struct FileInfo* files = malloc(sizeof(struct FileInfo) * capacity);
- struct FileListInfo info;
+ capacity = 8;
+ size = 0;
+
+ files = malloc(sizeof(struct FileInfo) * capacity);
memset(&info, 0, sizeof(struct FileListInfo));
while((file = readdir(d)) != NULL) {
@@ -360,10 +374,11 @@ static void recurse_directory(char* dir_name) {
}
- if (flags.colored == NO)
+ if (flags.colored == NO) {
printf("\n%s:\n", get_path_buffer());
- else
+ } else {
printf("\n%s%s:%s\n", DIR_COLOR, get_path_buffer(), FILE_COLOR);
+ }
list_files(files, size, info);
@@ -377,23 +392,29 @@ static void recurse_directory(char* dir_name) {
}
static void list_directory(char* path) {
+
+ DIR* d;
+ int capacity, size, save;
+ struct FileInfo* files;
+ struct FileListInfo info;
+ struct dirent* file;
+
if (flags.recurse) {
recurse_directory(path);
return;
}
- DIR* d = get_directory(path);
+ d = get_directory(path);
if (d == NULL) return;
- int save = push_path_buffer(path);
+ save = push_path_buffer(path);
- int capacity = 8;
- int size = 0;
- struct FileInfo* files = malloc(sizeof(struct FileInfo) * capacity);
- struct FileListInfo info;
+ capacity = 8;
+ size = 0;
+
+ files = malloc(sizeof(struct FileInfo) * capacity);
memset(&info, 0, sizeof(struct FileListInfo));
- struct dirent* file;
while ((file = readdir(d)) != NULL) {
if (!flags.hidden && prefix(".", file->d_name)) continue;
if (flags.hide_dot && is_dot_dir(file->d_name)) continue;
@@ -415,15 +436,20 @@ static bool is_dir(const char* path) {
}
static void list_file_args(int start, int argc, char** argv) {
- int capacity = 8;
- int size = 0;
- struct FileInfo* files = malloc(sizeof(struct FileInfo) * capacity);
+
+ int capacity, size, i;
+ struct FileInfo* files;
struct FileListInfo info;
+
+ capacity = 8;
+ size = 0;
+
+ files = malloc(sizeof(struct FileInfo) * capacity);
memset(&info, 0, sizeof(struct FileListInfo));
- for (int i = start; i < argc; i++) {
+ for (i = start; i < argc; i++) {
if (is_dir(argv[i])) continue;
- push_file((struct FileInfo**) &files, &info, &size, &capacity, argv[i]);
+ push_file(&files, &info, &size, &capacity, argv[i]);
}
if (size > 0) list_files(files, size, info);
@@ -487,6 +513,9 @@ static int long_arg(char* cur, char* next) {
COMMAND(ls) {
+ int start, i;
+ bool titled;
+
flags.hidden = false;
flags.more_info = false;
flags.hide_dot = false;
@@ -494,7 +523,7 @@ COMMAND(ls) {
flags.recurse = false;
flags.colored = NO;
- int start = parse_args(argc, argv, help, short_arg, long_arg);
+ start = parse_args(argc, argv, help, short_arg, long_arg);
if (argc - start == 0) {
list_directory(".");
@@ -503,15 +532,19 @@ COMMAND(ls) {
list_file_args(start, argc, argv);
- bool titled = argc - start > 1;
- for (int i = start; i < argc; i++) {
+ titled = argc - start > 1;
+ for (i = start; i < argc; i++) {
+
if (!is_dir(argv[i])) continue;
+
if (titled && !flags.recurse) {
- if (flags.colored != NO)
+ if (flags.colored != NO) {
printf("\n%s%s:%s\n", DIR_COLOR, argv[i], FILE_COLOR);
- else
+ } else {
printf("\n%s:\n", argv[i]);
+ }
}
+
list_directory(argv[i]);
}