summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ls.c53
1 files changed, 28 insertions, 25 deletions
diff --git a/ls.c b/ls.c
index 8a0c53f..5d90802 100644
--- a/ls.c
+++ b/ls.c
@@ -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");
}