diff options
-rw-r--r-- | ls.c | 53 |
1 files changed, 28 insertions, 25 deletions
@@ -73,8 +73,8 @@ static enum { static enum { HIDE_ALL, HIDE_SOME, HIDE_NONE } ls_hidden = HIDE_ALL; static enum { GROUP_NAME, GROUP_ID, GROUP_NONE } ls_group = GROUP_NAME; static enum { OWNER_NAME, OWNER_ID, OWNER_NONE } ls_owner = OWNER_NAME; +static enum { MARK_NONE, MARK_DIRS, MARK_ALL } ls_mark = MARK_NONE; -static int format = 0; static int recurse = 0; static int blocksize = DEFAULT_BLOCK_SIZE; static int reverse = 0; @@ -93,16 +93,17 @@ static char * ls_filename(struct file_info *f) char *suffix = ""; /* TODO: only if requested */ - - if (S_ISDIR(f->st.st_mode)) { + if (ls_mark != MARK_NONE && S_ISDIR(f->st.st_mode)) { suffix = "/"; - } else if (S_ISFIFO(f->st.st_mode)) { - suffix = "|"; - } else if (S_ISLNK(f->st.st_mode)) { - suffix = "@"; - } else if (S_ISREG(f->st.st_mode)) { - if ((S_IXUSR & f->st.st_mode) || (S_IXGRP & f->st.st_mode) || (S_IXOTH & f->st.st_mode)) { - suffix = "*"; + } else if (ls_mark == MARK_ALL) { + if (S_ISFIFO(f->st.st_mode)) { + suffix = "|"; + } else if (S_ISLNK(f->st.st_mode)) { + suffix = "@"; + } else if (S_ISREG(f->st.st_mode)) { + if ((S_IXUSR & f->st.st_mode) || (S_IXGRP & f->st.st_mode) || (S_IXOTH & f->st.st_mode)) { + suffix = "*"; + } } } @@ -336,7 +337,7 @@ static void ls_print_serial(size_t n, struct file_info files[static n]) return; } - /* TODO: lines */ + /* TODO: wrap at screen width */ for (size_t i = 0; i < n - 1; i++) { printf("%s, ", ls_filename(files + i)); } @@ -360,17 +361,22 @@ static size_t ls_get_columns(void) static void ls_print_columns(size_t n, struct file_info files[static n]) { - /* TODO: partial columns */ - size_t widest = ls_find_widest(n, files); size_t columns = ls_get_columns(); size_t ncolumns = columns / widest; size_t nrows = n / ncolumns; + + /* FIXME: partial columns */ + nrows++; + char format[32] = ""; snprintf(format, sizeof(format), "%%-%zds", widest); for (size_t i = 0; i < nrows; i++) { for (size_t j = 0; j < ncolumns; j++) { - printf(format, ls_filename(files + i + (nrows * j))); + size_t fn = i + (nrows * j); + if (fn < n) { + printf(format, ls_filename(files + fn)); + } } printf("\n"); } @@ -441,7 +447,7 @@ int main(int argc, char *argv[]) break; case 'F': /** append file type characters **/ - format |= CHARACTER; + ls_mark = MARK_ALL; break; case 'H': /** follow symbolic links on command line **/ @@ -476,7 +482,7 @@ int main(int argc, char *argv[]) sort = DIRECTORY; ls_hidden = HIDE_NONE; //display = ROWS; - format ^= BLOCKS; + //format ^= BLOCKS; recurse = 0; break; @@ -486,7 +492,7 @@ int main(int argc, char *argv[]) break; case 'i': /** include file serial numbers **/ - format |= INODES; + //format |= INODES; break; case 'k': /** use a blocksize of 1024 **/ @@ -513,11 +519,11 @@ int main(int argc, char *argv[]) break; case 'p': /** append / after directory names **/ - format |= DIRS; + ls_mark = MARK_DIRS; break; case 'q': /** replace non-printable characters with ? **/ - format |= QUOTE; // FIXME + //format |= QUOTE; // FIXME break; case 'r': /** reverse sort order **/ @@ -525,7 +531,7 @@ int main(int argc, char *argv[]) break; case 's': /** outpu total number of blocks **/ - format |= BLOCKS; // FIXME + //format |= BLOCKS; // FIXME break; case 't': /** sort by modified time **/ @@ -586,12 +592,9 @@ int main(int argc, char *argv[]) nfiles++; } - qsort(operands, nfiles, sizeof(operands[0]), ls_compare_files); - ls_print(nfiles, operands); - - /* list directories */ - if (nfiles > 0) { + qsort(operands, nfiles, sizeof(operands[0]), ls_compare_files); + ls_print(nfiles, operands); printf("\n"); } |