From b93acabd5936de69340a6633f74a19201450d428 Mon Sep 17 00:00:00 2001
From: Yorhel <git@yorhel.nl>
Date: Sun, 5 Mar 2023 08:37:05 +0100
Subject: [PATCH] Add --(enable|disable)-natsort options

Backport of zig/46b88bcb5ca584ff2c976af40a182e8e048892be
---
 doc/ncdu.pod  | 4 ++++
 src/dirlist.c | 5 +++--
 src/dirlist.h | 2 ++
 src/main.c    | 2 ++
 4 files changed, 11 insertions(+), 2 deletions(-)

diff --git a/doc/ncdu.pod b/doc/ncdu.pod
index f00d378..32285db 100644
--- a/doc/ncdu.pod
+++ b/doc/ncdu.pod
@@ -238,6 +238,10 @@ The column can be suffixed with I<-asc> or I<-desc> to set the order to
 ascending or descending, respectively. e.g. C<--sort=name-desc> will sort by
 name in descending order.
 
+=item B<--enable-natsort>, B<--disable-natsort>
+
+Enable (default) or disable natural sort when sorting by file name.
+
 =item B<--group-directories-first>, B<--no-group-directories-first>
 
 Sort (or not) directories before files.
diff --git a/src/dirlist.c b/src/dirlist.c
index 522a570..37287ad 100644
--- a/src/dirlist.c
+++ b/src/dirlist.c
@@ -39,7 +39,8 @@ int64_t dirlist_maxs       = 0,
 int    dirlist_sort_desc   = 1,
        dirlist_sort_col    = DL_COL_SIZE,
        dirlist_sort_df     = 0,
-       dirlist_hidden      = 0;
+       dirlist_hidden      = 0,
+       dirlist_natsort     = 1;
 
 /* private state vars */
 static struct dir *parent_alloc, *head, *head_real, *selected, *top = NULL;
@@ -80,7 +81,7 @@ static int dirlist_cmp(struct dir *x, struct dir *y) {
    *
    * Note that the method used below is supposed to be fast, not readable :-)
    */
-#define CMP_NAME  strnatcmp(x->name, y->name)
+#define CMP_NAME  (dirlist_natsort ? strnatcmp(x->name, y->name) : strcmp(x->name, y->name))
 #define CMP_SIZE  (x->size  > y->size  ? 1 : (x->size  == y->size  ? 0 : -1))
 #define CMP_ASIZE (x->asize > y->asize ? 1 : (x->asize == y->asize ? 0 : -1))
 #define CMP_ITEMS (x->items > y->items ? 1 : (x->items == y->items ? 0 : -1))
diff --git a/src/dirlist.h b/src/dirlist.h
index 4086246..902106d 100644
--- a/src/dirlist.h
+++ b/src/dirlist.h
@@ -78,6 +78,8 @@ extern int dirlist_sort_desc, dirlist_sort_col, dirlist_sort_df;
 /* set with dirlist_set_hidden() */
 extern int dirlist_hidden;
 
+extern int dirlist_natsort;
+
 /* maximum size of an item in the opened dir */
 extern int64_t dirlist_maxs, dirlist_maxa;
 
diff --git a/src/main.c b/src/main.c
index 8a9fc11..1f3ccb9 100644
--- a/src/main.c
+++ b/src/main.c
@@ -219,6 +219,8 @@ static int arg_option(void) {
   else if(OPT("--hide-percent")) graph &= 1;
   else if(OPT("--group-directories-first")) dirlist_sort_df = 1;
   else if(OPT("--no-group-directories-first")) dirlist_sort_df = 0;
+  else if(OPT("--enable-natsort")) dirlist_natsort = 1;
+  else if(OPT("--disable-natsort")) dirlist_natsort = 0;
   else if(OPT("--sort")) {
     arg = ARG;
     tmp = strrchr(arg, '-');
-- 
GitLab