aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--toys/sort.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/toys/sort.c b/toys/sort.c
index dd06b821..3cec31af 100644
--- a/toys/sort.c
+++ b/toys/sort.c
@@ -6,7 +6,7 @@
*
* See http://www.opengroup.org/onlinepubs/007904975/utilities/sort.html
-USE_SORT(NEWTOY(sort, USE_SORT_BIG("S:T:m" "o:k*t:bgMcszdfi") "run", TOYFLAG_USR|TOYFLAG_BIN))
+USE_SORT(NEWTOY(sort, USE_SORT_BIG("S:T:m" "o:k*t:xbgMcszdfi") "run", TOYFLAG_USR|TOYFLAG_BIN))
config SORT
bool "sort"
@@ -34,6 +34,7 @@ config SORT_BIG
-g general numeric sort (double precision with nan and inf)
-i ignore nonprinting characters
-M month sort (jan, feb, etc).
+ -x Hexadecimal numerical sort
-s skip fallback sort (only sort with keys)
-z zero (null) terminated input
-k sort by "key" (see below)
@@ -84,10 +85,11 @@ DEFINE_GLOBALS(
#define FLAG_M 512 // Sort type: date
#define FLAG_g 1024 // Sort type: strtod()
#define FLAG_b 2048 // Ignore leading blanks
+#define FLAG_x 4096 // Hex sort
// Left off dealing with FLAG_b/FLAG_bb logic...
-#define FLAG_bb 32768 // Ignore trailing blanks
+#define FLAG_bb (1<<31) // Ignore trailing blanks
struct sort_key
{
@@ -188,7 +190,7 @@ static struct sort_key *add_key(void)
// Perform actual comparison
static int compare_values(int flags, char *x, char *y)
{
- int ff = flags & (FLAG_n|FLAG_g|FLAG_M);
+ int ff = flags & (FLAG_n|FLAG_g|FLAG_M||FLAG_x);
// Ascii sort
if (!ff) return strcmp(x, y);
@@ -230,6 +232,8 @@ static int compare_values(int flags, char *x, char *y)
else return dx==thyme.tm_mon ? 0 : dx-thyme.tm_mon;
// This has to be ff == FLAG_n
+ } else if (CFG_SORT_BIG && ff == FLAG_x) {
+ return strtol(x, NULL, 16)-strtol(y, NULL, 16);
} else {
// Full floating point version of -n
if (CFG_SORT_BIG) {