From 596df6ef9bfe023af103b821d9bf4fa0d0fbe788 Mon Sep 17 00:00:00 2001 From: Aki Date: Tue, 14 Jun 2022 22:17:50 +0200 Subject: Extended ls with -aA options --- ls.c | 48 ++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 6 deletions(-) diff --git a/ls.c b/ls.c index c507523..fe6ae76 100644 --- a/ls.c +++ b/ls.c @@ -4,7 +4,20 @@ #include -int ls(const char * path) +struct options +{ + unsigned int skip_dots:1; + unsigned int skip_self_and_up:1; +}; + + +struct options defaults = { + .skip_dots = 1, + .skip_self_and_up = 1, +}; + + +int ls(const char * path, struct options opts) { DIR * dir; if (NULL == (dir = opendir(path))) { @@ -12,8 +25,16 @@ int ls(const char * path) return 1; } struct dirent * entry; - while (NULL != (entry = readdir(dir))) + while (NULL != (entry = readdir(dir))) { + const unsigned int is_dot = '.' == entry->d_name[0]; + if (opts.skip_dots && is_dot) + continue; + const unsigned int is_self = is_dot && 0 == entry->d_name[1]; + const unsigned int is_up = is_dot && '.' == entry->d_name[1]; + if (opts.skip_self_and_up && (is_self || is_up)) + continue; printf("%s\n", entry->d_name); + } closedir(dir); return 0; } @@ -21,10 +42,25 @@ int ls(const char * path) int main(int argc, char * argv[]) { + int opt; + struct options opts = defaults; + while (-1 != (opt = getopt(argc, argv, "aA"))) { + switch (opt) { + case 'a': + opts.skip_self_and_up = 0; + // fall-through + case 'A': + opts.skip_dots = 0; + break; + default: + dprintf(2, "Usage: %s [-aA] [file...]\n", argv[0]); + return 1; + } + } int res = 0; - if (argc == 1) - res |= ls("."); - for (int i = 1; i < argc; ++i) - res |= ls(argv[i]); + if (optind >= argc) + res |= ls(".", opts); + for (int i = optind; i < argc; ++i) + res |= ls(argv[i], opts); return res; } -- cgit v1.1