8d8b9b560a
- Check that catopen() succeeded before calling catclose(). musl will crash in the latter if the catalogue descriptor is -1. - Keep the message catalogue open for most of sort(1)'s actual operation. - Don't use catgets(3) to print error messages if catopen(3) had failed. Reviewed by: arichardson, emaste MFC after: 1 week Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D34081
138 lines
3.3 KiB
C
138 lines
3.3 KiB
C
/* $FreeBSD$ */
|
|
|
|
/*-
|
|
* SPDX-License-Identifier: BSD-2-Clause-FreeBSD
|
|
*
|
|
* Copyright (C) 2009 Gabor Kovesdan <gabor@FreeBSD.org>
|
|
* Copyright (C) 2012 Oleg Moskalenko <mom040267@gmail.com>
|
|
* All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
* SUCH DAMAGE.
|
|
*/
|
|
|
|
#if !defined(__BSD_SORT_H__)
|
|
#define __BSD_SORT_H__
|
|
|
|
#include <errno.h>
|
|
#include <stdbool.h>
|
|
#include <stdio.h>
|
|
#include <sysexits.h>
|
|
#include <wchar.h>
|
|
|
|
#include <sys/types.h>
|
|
#include <md5.h>
|
|
|
|
#define VERSION "2.3-FreeBSD"
|
|
|
|
#ifdef WITHOUT_NLS
|
|
#define getstr(n) nlsstr[n]
|
|
#else
|
|
#include <nl_types.h>
|
|
|
|
extern nl_catd catalog;
|
|
#define getstr(n) \
|
|
(catalog == (nl_catd)-1 ? nlsstr[n] : catgets(catalog, 1, n, nlsstr[n]))
|
|
#endif
|
|
|
|
extern const char *nlsstr[];
|
|
|
|
#if defined(SORT_THREADS)
|
|
#define MT_SORT_THRESHOLD (10000)
|
|
extern unsigned int ncpu;
|
|
extern size_t nthreads;
|
|
#endif
|
|
|
|
/*
|
|
* If true, we output some debug information.
|
|
*/
|
|
extern bool debug_sort;
|
|
|
|
/*
|
|
* MD5 context for random hash function
|
|
*/
|
|
extern MD5_CTX md5_ctx;
|
|
|
|
/*
|
|
* sort.c
|
|
*/
|
|
|
|
/*
|
|
* This structure holds main sort options which are NOT affecting the sort ordering.
|
|
*/
|
|
struct sort_opts
|
|
{
|
|
wint_t field_sep;
|
|
int sort_method;
|
|
bool cflag;
|
|
bool csilentflag;
|
|
bool kflag;
|
|
bool mflag;
|
|
bool sflag;
|
|
bool uflag;
|
|
bool zflag;
|
|
bool tflag;
|
|
bool complex_sort;
|
|
};
|
|
|
|
/*
|
|
* Key value structure forward declaration
|
|
*/
|
|
struct key_value;
|
|
|
|
/*
|
|
* Cmp function
|
|
*/
|
|
typedef int (*cmpcoll_t)(struct key_value *kv1, struct key_value *kv2, size_t offset);
|
|
|
|
/*
|
|
* This structure holds "sort modifiers" - options which are affecting the sort ordering.
|
|
*/
|
|
struct sort_mods
|
|
{
|
|
cmpcoll_t func;
|
|
bool bflag;
|
|
bool dflag;
|
|
bool fflag;
|
|
bool gflag;
|
|
bool iflag;
|
|
bool Mflag;
|
|
bool nflag;
|
|
bool rflag;
|
|
bool Rflag;
|
|
bool Vflag;
|
|
bool hflag;
|
|
};
|
|
|
|
extern bool need_hint;
|
|
|
|
extern struct sort_opts sort_opts_vals;
|
|
|
|
extern struct sort_mods * const default_sort_mods;
|
|
|
|
/*
|
|
* Cached value of MB_CUR_MAX. Because MB_CUR_MAX is used often throughout the program,
|
|
* this avoids frequent calls to __mb_cur_max.
|
|
*/
|
|
extern size_t mb_cur_max;
|
|
|
|
#endif /* __BSD_SORT_H__ */
|