about summary refs log tree commit diff
diff options
context:
space:
mode:
authorChristian Neukirchen <chneukirchen@gmail.com>2015-10-26 14:40:49 +0100
committerChristian Neukirchen <chneukirchen@gmail.com>2015-10-26 14:40:49 +0100
commitc500373deff3f2bf94bf30a720bc52b569743d68 (patch)
treef297ee483533f5fd416fe5b45ec0df3a9dc8b543
parent929fb5bd5b5ecebb6a3619cb4fa8446a3dd14275 (diff)
downloadlr-c500373deff3f2bf94bf30a720bc52b569743d68.tar.gz
lr-c500373deff3f2bf94bf30a720bc52b569743d68.tar.xz
lr-c500373deff3f2bf94bf30a720bc52b569743d68.zip
sort by extension
-rw-r--r--README.md1
-rw-r--r--lr.c12
2 files changed, 13 insertions, 0 deletions
diff --git a/README.md b/README.md
index 248af49..d5ebc2d 100644
--- a/README.md
+++ b/README.md
@@ -90,6 +90,7 @@ Default: `n`.
 * `a`: atime.
 * `c`: ctime.
 * `d`: path depth.
+* `e`: file extension.
 * `i`: inode number.
 * `m`: mtime.
 * `n`: file name.
diff --git a/lr.c b/lr.c
index e1a13df..30be4d4 100644
--- a/lr.c
+++ b/lr.c
@@ -533,6 +533,16 @@ basenam(const char *s)
 }
 
 static const char *
+extnam(const char *s)
+{
+	char *r = strrchr(s, '/');
+	char *e = strrchr(s, '.');
+	if (!r || r < e)
+		return e ? e + 1 : "";
+	return "";
+}
+
+static const char *
 readlin(const char *p, const char *alt)
 {
 	static char b[PATH_MAX];
@@ -740,6 +750,8 @@ order(const void *a, const void *b)
 		              "ZZZZAZZZZZZZZZZZ"[(fa->sb.st_mode >> 12) & 0x0f]);
 		case 'n': STRCMP(fa->fpath, fb->fpath);
 		case 'N': STRCMP(fb->fpath, fa->fpath);
+		case 'e': STRCMP(extnam(fa->fpath), extnam(fb->fpath));
+		case 'E': STRCMP(extnam(fb->fpath), extnam(fa->fpath));
 		default: STRCMP(fa->fpath, fb->fpath);
 		}
 	}