>From dbfdef9a720c8ea9ed1a90a4e4c66aa7e0ed3e1f Mon Sep 17 00:00:00 2001 From: Assaf Gordon Date: Wed, 5 Jan 2022 13:03:39 -0700 Subject: [PATCH 1/9] cut: set-fields: add no-sort options --- src/set-fields.c | 27 +++++++++++++++------------ src/set-fields.h | 4 +++- 2 files changed, 18 insertions(+), 13 deletions(-) diff --git a/src/set-fields.c b/src/set-fields.c index e3cce30d9..5e4ee6715 100644 --- a/src/set-fields.c +++ b/src/set-fields.c @@ -279,22 +279,25 @@ set_fields (char const *fieldstr, unsigned int options) ? _("missing list of byte/character positions") : _("missing list of fields")); - qsort (frp, n_frp, sizeof (frp[0]), compare_ranges); - - /* Merge range pairs (e.g. `2-5,3-4' becomes `2-5'). */ - for (size_t i = 0; i < n_frp; ++i) + if (!(options & SETFLD_NO_SORT)) { - for (size_t j = i + 1; j < n_frp; ++j) + qsort (frp, n_frp, sizeof (frp[0]), compare_ranges); + + /* Merge range pairs (e.g. `2-5,3-4' becomes `2-5'). */ + for (size_t i = 0; i < n_frp; ++i) { - if (frp[j].lo <= frp[i].hi) + for (size_t j = i + 1; j < n_frp; ++j) { - frp[i].hi = MAX (frp[j].hi, frp[i].hi); - memmove (frp + j, frp + j + 1, (n_frp - j - 1) * sizeof *frp); - n_frp--; - j--; + if (frp[j].lo <= frp[i].hi) + { + frp[i].hi = MAX (frp[j].hi, frp[i].hi); + memmove (frp + j, frp + j + 1, (n_frp - j - 1) * sizeof *frp); + n_frp--; + j--; + } + else + break; } - else - break; } } diff --git a/src/set-fields.h b/src/set-fields.h index 7bc9b3afe..9127d9957 100644 --- a/src/set-fields.h +++ b/src/set-fields.h @@ -34,8 +34,10 @@ enum { SETFLD_ALLOW_DASH = 0x01, /* allow single dash meaning 'all fields' */ SETFLD_COMPLEMENT = 0x02, /* complement the field list */ - SETFLD_ERRMSG_USE_POS = 0x04 /* when reporting errors, say 'position' instead + SETFLD_ERRMSG_USE_POS = 0x04, /* when reporting errors, say 'position' instead of 'field' (used with cut -b/-c) */ + SETFLD_NO_SORT = 0x08 /* Do not sort the fields; keep duplicated + and overlapped fields */ }; /* allocates and initializes the FRP array and N_FRP count */ -- 2.20.1