1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00
samba-mirror/lib/util
Douglas Bagnall 4e18e92399 util: add stable sort functions
Sometimes (e.g. in lzxpress Huffman encoding, and in some of our
tests: c.f. https://lists.samba.org/archive/samba-technical/2018-March/126010.html)
we want a stable sort algorithm (meaning one that retains the previous
order of items that compare equal).

The GNU libc qsort() is *usually* stable, in that it first tries to
use a mergesort but reverts to quicksort if the necessary allocations
fail. That has led Samba developers to unthinkingly assume qsort() is
stable which is not the case on many platforms, and might not always
be on GNU/Linuxes either.

This adds four functions. stable_sort() sorts an array, and requires
an auxiliary working array of the same size. stable_sort_talloc()
takes a talloc context so it ca create a working array and call
stable_sort(). stable_sort_r() takes an opaque context blob that gets
passed to the compare function, like qsort_r() and ldb_qsort(). And
stable_sort_talloc_r() rounds out the quadrant.

These are LGPL so that the can be used in ldb, which has problems with
unstable sort.

The tests are borrowed and extended from test_ldb_qsort.c.

When sorting non-trivial structs this is roughly as fast as GNU qsort,
but GNU qsort has optimisations for small items, using direct
assignments of rather than memcpy where the size allows the item to be
cast as some kind of int.

Signed-off-by: Douglas Bagnall <douglas.bagnall@catalyst.net.nz>
Reviewed-by: Joseph Sutton <josephsutton@catalyst.net.nz>
2022-12-01 22:56:39 +00:00
..
charset lib: Fix a typo 2022-08-26 18:54:37 +00:00
debug-classes util/debug: share classname table with tests 2022-06-17 01:28:30 +00:00
tests util: add stable sort functions 2022-12-01 22:56:39 +00:00
access.c lib/util/access: source3/auth/user_util: Check for INNETGR 2022-08-08 07:28:31 +00:00
access.h lib: util: Add allow_access_nolog(). 2016-11-16 12:41:09 +01:00
asn1.c asn1: Remove unused function asn1_check_enumerated() 2021-04-01 17:50:49 +00:00
asn1.h asn1: Remove unused function asn1_check_enumerated() 2021-04-01 17:50:49 +00:00
attr.h replace, attr.: use function attributes only if supported by feature macro (or old gcc) 2020-05-24 23:55:36 +00:00
base64.c util/base64: decode_data_blob_talloc catches talloc error 2022-05-12 02:22:35 +00:00
base64.h lib: Give base64.c its own .h 2016-05-04 01:28:23 +02:00
become_daemon.c lib:util: Fix log level for normal startup message 2021-05-20 15:07:28 +00:00
become_daemon.h lib: Remove close_low_fds() 2021-04-27 13:24:35 +00:00
binsearch.h binsearch.h: Re-licence under LGPLv3 per agreement of the copyright holders 2017-09-22 21:20:23 +02:00
bitmap.c lib:util: Fix undefined behavior in bitmap.c 2018-11-22 22:13:27 +01:00
bitmap.h
blocking.c lib: Provide a meaningful errno if FD_CLOEXEC is missing 2021-01-26 00:10:31 +00:00
blocking.h lib/util: Add a generic definition for set_close_on_exec 2016-06-08 10:33:19 +02:00
bytearray.h lib:util: Add (PULL|PUSH)_(BE|LE)_I(8|16|32|64) byterarray macros 2020-02-21 03:35:58 +00:00
byteorder.h lib:util: Add comments to use bytearray.h to byteorder.h 2020-02-21 02:09:33 +00:00
charset_compat.h
close_low_fd.c
close_low_fd.h
data_blob.c lib/util: Change function to mem_equal_const_time() 2022-06-09 22:49:29 +00:00
data_blob.h lib/util: Change function to data_blob_equal_const_time() 2022-06-09 22:49:29 +00:00
debug_s3.c debug: Add new smb.conf option "debug syslog format" 2021-11-01 07:29:47 +00:00
debug_s3.h
debug.c util/debug: share classname table with tests 2022-06-17 01:28:30 +00:00
debug.h debug: Add DEBUGLF macro with explicit location and function parameters. 2022-07-15 14:25:37 +00:00
discard.h lib:util: Move discard_const(_p) to own header for libndr.h 2019-02-14 15:59:26 +01:00
dlinklist.h DLIST_REMOVE: clang: Fix dereference of a null pointer warning 2019-06-11 12:10:17 +00:00
Doxyfile
dprintf.c lib: Remove a few #include "includes.h" 2022-07-25 12:04:33 +00:00
fault.c lib/util: Prefer backtrace_symbols() for internal backtraces 2022-06-09 22:49:29 +00:00
fault.h lib/util: add unlikely() to SMB_ASSERT() 2022-08-19 18:41:34 +00:00
fsusage.c lib: Remove a few #include "includes.h" 2022-07-25 12:04:33 +00:00
genrand_util.c lib:util: Zero memory in generate_random_machine_password() 2022-08-26 07:59:32 +00:00
genrand.c util/genrand: don't ignore errors in random number generation 2022-07-28 05:23:28 +00:00
genrand.h lib:util: Fix documentation for random number functions 2019-08-14 15:07:24 +00:00
getpass.c
gpfswrap.c lib/util/gpfswrap: remove unused gpfswrap_get_winattrs_path() 2022-06-03 21:53:31 +00:00
gpfswrap.h lib/util/gpfswrap: remove unused gpfswrap_get_winattrs_path() 2022-06-03 21:53:31 +00:00
idtree_random.c
idtree_random.h
idtree.c lib:util: Fix undefined behavior in idtree 2018-11-22 22:13:27 +01:00
idtree.h lib: Remove a duplicate function prototype 2019-08-19 23:14:38 +00:00
iov_buf.c lib/util: clang: Fix 'Null pointer passed as an argument' 2019-07-08 09:30:09 +00:00
iov_buf.h lib: Make lib/util/iov_buf.h self-contained 2022-11-22 18:27:33 +00:00
mainpage.dox
memcache.c lib:util: Avoid free'ing our own pointer 2021-02-03 10:57:01 +00:00
memcache.h smbd: Add filename_convert_dirfsp() 2022-04-28 13:12:33 +00:00
memory.h lib:util: Add BURN_FREE() and BURN_FREE_STR() 2022-08-26 07:59:32 +00:00
mkdir_p.c lib:util: Fix string check in mkdir_p() 2018-05-17 17:30:09 +02:00
mkdir_p.h gpo: move mkdir_p to lib/util 2017-11-20 21:41:14 +01:00
modules.c lib: Give util_paths.c its own header 2017-06-24 01:21:10 +02:00
ms_fnmatch.c lib: Whitespace fixes 2022-11-22 18:27:33 +00:00
msghdr.c util: Fix signed/unsigned comparisons by casting 2019-07-01 08:00:29 +00:00
msghdr.h lib: Move msghdr to lib/util/ 2016-06-07 14:34:10 +02:00
params.c lib: Simplify pm_process() 2022-02-07 19:58:57 +00:00
pidfile.c lib:util: Initialize pid 2021-12-15 19:32:30 +00:00
pidfile.h lib: Make pidfile_path_create() return the existing PID on conflict 2021-03-16 17:09:32 +00:00
rbtree.c lib/util: clang: Fix dereference of a null pointer warning 2019-06-11 12:10:17 +00:00
rbtree.h
README
rfc1738.c lib: Use hex_byte() in rfc1738_unescape() 2021-01-08 20:31:33 +00:00
safe_string.h lib/util: remove extra safe_string.h file 2020-08-28 02:18:40 +00:00
samba_modules.h lib:util: Make probing of modules more secure 2017-06-06 18:36:07 +02:00
samba_util.h lib:util: Add generate_random_u64_range() 2022-07-28 11:51:29 +00:00
samba-util.pc.in
select.c lib: Avoid an includes.h 2017-03-20 12:20:08 +01:00
select.h
server_id_db.c lib: Fix return of server_id_db_prune_name() 2019-07-03 10:51:32 +00:00
server_id_db.h
server_id.c lib: Slightly simplify server_id_set_disconnected() 2021-06-04 17:34:06 +00:00
server_id.h lib: Add server_id_cmp() 2019-09-17 22:49:36 +00:00
setid.c lib:util: Always include unistd.h for setgroups 2018-11-22 22:13:27 +01:00
setid.h
signal.c
signal.h lib/util: Add signal.h include 2021-12-13 16:22:28 +00:00
smb_strtox.c lib: fix smb_strtox.[c|h] license header 2020-08-05 10:17:06 +00:00
smb_strtox.h lib: fix smb_strtox.[c|h] license header 2020-08-05 10:17:06 +00:00
smb_threads_internal.h
smb_threads.c lib: Remove an unneeded includes.h 2022-04-26 21:41:29 +00:00
smb_threads.h lib: smb_threads: fix access before init bug 2018-07-04 21:07:09 +02:00
stable_sort.c util: add stable sort functions 2022-12-01 22:56:39 +00:00
stable_sort.h util: add stable sort functions 2022-12-01 22:56:39 +00:00
string_wrappers.h string_wrappers: include replace.h 2020-08-28 00:56:34 +00:00
strv_util.c util: Fix include file order 2018-11-30 08:12:31 +01:00
strv_util.h lib/util: Add strv_util.[ch] containing new function strv_split() 2016-03-01 05:43:19 +01:00
strv.c lib: Allow parsing a strv from a non-talloc const buf 2017-11-29 16:59:16 +01:00
strv.h lib: Fix includes in strv.h 2021-04-19 18:18:31 +00:00
substitute.c util:str_sub: talloc_free on error 2021-03-11 21:42:43 +00:00
substitute.h lib/util: Replace buggy string_sub_talloc() with talloc_string_sub() in lib/util 2021-03-10 08:06:25 +00:00
sys_popen.c lib: Fix CID 1445648 Null pointer dereferences 2019-05-28 20:27:14 +00:00
sys_popen.h lib: util: Finally remove possibilities of using sys_popen() unsafely. 2019-05-24 19:00:06 +00:00
sys_rw_data.c util: Fix signed/unsigned comparisons by casting 2019-07-01 08:00:29 +00:00
sys_rw_data.h lib: Move sys_rw* to lib/util 2015-10-13 01:23:07 +02:00
sys_rw.c lib: add sys_block_align[_truncate]() 2021-10-08 19:28:32 +00:00
sys_rw.h lib: add sys_block_align[_truncate]() 2021-10-08 19:28:32 +00:00
system.c
talloc_keep_secret.c lib:util: Check memset_s() error code in talloc_keep_secret_destructor() 2022-09-12 23:07:38 +00:00
talloc_keep_secret.h lib:util: Add support to keep talloc chunks secret 2019-04-03 06:48:21 +00:00
talloc_report_printf.c lib: Add talloc_full_report_printf() 2019-09-18 20:10:24 +00:00
talloc_report_printf.h lib: Add talloc_full_report_printf() 2019-09-18 20:10:24 +00:00
talloc_report.c util: Fix signed/unsigned comparisons by casting 2019-07-01 08:00:29 +00:00
talloc_report.h
talloc_stack.c lib: Remove an unneeded includes.h 2022-04-26 21:41:29 +00:00
talloc_stack.h util: Update GPL header of talloc_stack.h 2016-02-12 09:01:14 +01:00
tevent_debug.c
tevent_ntstatus.c
tevent_ntstatus.h
tevent_req_profile.c lib: Avoid the use of open_memstream in tevent_req_profile_string 2018-10-08 22:17:11 +02:00
tevent_req_profile.h lib: Avoid the use of open_memstream in tevent_req_profile_string 2018-10-08 22:17:11 +02:00
tevent_unix.c
tevent_unix.h
tevent_werror.c werror: replace WERR_NOMEM with WERR_NOT_ENOUGH_MEMORY in lib/util/tevent_werror.c 2016-09-28 00:04:18 +02:00
tevent_werror.h
tfork.c lib: Fix a typo 2021-04-19 19:07:01 +00:00
tfork.h lib: Fix a typo 2019-10-02 08:01:40 +00:00
tftw.c lib: Remove some unneeded #includes from tftw.c 2019-10-02 08:01:40 +00:00
tftw.h util: Add file tree walk interface 2019-01-28 15:44:18 +01:00
time_basic.c time_basic.h: Remove unnecessary dependency on replace.h 2016-01-13 04:43:23 +01:00
time_basic.h time_basic.h: Remove unnecessary dependency on replace.h 2016-01-13 04:43:23 +01:00
time.c lib: util: Make nt_time_to_full_timespec() call nt_time_to_unix_timespec_raw() for the conversion. 2022-01-11 01:36:51 +00:00
time.h lib: Fix the FreeBSD build 2022-07-23 23:29:38 +00:00
tini.c lib/util: add pm_process_with_flags to allow parsing ini files with empty values 2017-01-06 12:28:19 +01:00
tini.h lib/util: add pm_process_with_flags to allow parsing ini files with empty values 2017-01-06 12:28:19 +01:00
tiniparser.c lib: CID 1452289: API usage errors (USE_AFTER_FREE) 2019-08-14 07:39:38 +00:00
tiniparser.h Add fuzzing binary for tiniparser 2019-08-07 06:07:28 +00:00
tsort.h
unix_match.c lib/util: Move unix_wild_match() from source3/lib/util to lib/util/ 2016-11-16 12:41:09 +01:00
unix_match.h lib/util: Move unix_wild_match() from source3/lib/util to lib/util/ 2016-11-16 12:41:09 +01:00
unix_privs.c lib: Remove an unneeded includes.h 2022-04-26 21:41:29 +00:00
util_file.c lib: Fix file_lines_parse() to do what people expect. Much safer to use. 2020-11-13 16:22:32 +00:00
util_id.c lib: Remove a few #include "includes.h" 2022-07-25 12:04:33 +00:00
util_ldb.c lib: Remove an unneeded includes.h 2022-04-26 21:41:29 +00:00
util_ldb.h
util_net.c lib: Fix a typo 2022-01-05 01:02:38 +00:00
util_net.h lib: Add samba_sockaddr_[gs]et_port() 2021-01-11 13:19:32 +00:00
util_paths.c lib: Remove a few #include "includes.h" 2022-07-25 12:04:33 +00:00
util_paths.h lib:util: Add path_expand_tilde() 2020-05-15 13:18:38 +00:00
util_process.c lib/util: Make prctl_set_comment take a printf format string 2020-02-27 03:42:35 +00:00
util_process.h lib/util: Make prctl_set_comment take a printf format string 2020-02-27 03:42:35 +00:00
util_pw.c lib: Avoid an includes.h 2017-03-28 17:45:19 +02:00
util_pw.h
util_runcmd.c lib: Fix the build on FreeBSD 2021-01-25 09:48:09 +00:00
util_str_common.c lib: Remove a few #include "includes.h" 2022-07-25 12:04:33 +00:00
util_str_escape.c lib: Remove a few #include "includes.h" 2022-07-25 12:04:33 +00:00
util_str_escape.h lib/util: Add functions to escape log lines but not break all non-ascii 2017-03-29 02:37:26 +02:00
util_str_hex.c lib: Simplify parse_guid_string() and ndr_syntax_id_from_string() 2021-01-28 16:58:35 +00:00
util_str_hex.h lib: Simplify parse_guid_string() and ndr_syntax_id_from_string() 2021-01-28 16:58:35 +00:00
util_str.c lib: Remove a few #include "includes.h" 2022-07-25 12:04:33 +00:00
util_strlist_v3.c param: Fix str_list_v3 to accept ; again 2016-02-11 19:19:55 +01:00
util_strlist.c lib: Add str_list_add_printf() 2021-05-11 22:56:37 +00:00
util_strlist.h lib: Add str_list_add_printf() 2021-05-11 22:56:37 +00:00
util_tdb.c lib:util: Check return value of tdb_parse_record() 2021-12-15 19:32:30 +00:00
util_tdb.h lib: Remove unused tdb_traverse_delete_fn() 2021-04-19 18:18:31 +00:00
util.c lib/util: make use of tevent_cached_getpid() in performance critical code 2022-07-25 17:34:33 +00:00
util.h lib/util: add dump_data_diff*() helpers 2022-01-24 15:25:36 +00:00
wscript lib/util: Prefer backtrace_symbols() for internal backtraces 2022-06-09 22:49:29 +00:00
wscript_build util: add stable sort functions 2022-12-01 22:56:39 +00:00
wscript_configure lib/util: Prefer backtrace_symbols() for internal backtraces 2022-06-09 22:49:29 +00:00

This directory contains libutil (until we can think of a better name)

The idea is that this library contains simple but useful data structures 
and support functions that are generally useful; not just for Samba but for 
other projects as well. Functions here should not depend on any external 
libraries, just on libc (perhaps partially provided by libreplace).