xref: /illumos-gate/usr/src/cmd/sort/utility.h (revision 101e15b5f8a77d9433805e541996abaabc9ca8c1)
1*101e15b5SRichard Lowe /*
2*101e15b5SRichard Lowe  * CDDL HEADER START
3*101e15b5SRichard Lowe  *
4*101e15b5SRichard Lowe  * The contents of this file are subject to the terms of the
5*101e15b5SRichard Lowe  * Common Development and Distribution License, Version 1.0 only
6*101e15b5SRichard Lowe  * (the "License").  You may not use this file except in compliance
7*101e15b5SRichard Lowe  * with the License.
8*101e15b5SRichard Lowe  *
9*101e15b5SRichard Lowe  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*101e15b5SRichard Lowe  * or http://www.opensolaris.org/os/licensing.
11*101e15b5SRichard Lowe  * See the License for the specific language governing permissions
12*101e15b5SRichard Lowe  * and limitations under the License.
13*101e15b5SRichard Lowe  *
14*101e15b5SRichard Lowe  * When distributing Covered Code, include this CDDL HEADER in each
15*101e15b5SRichard Lowe  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*101e15b5SRichard Lowe  * If applicable, add the following below this CDDL HEADER, with the
17*101e15b5SRichard Lowe  * fields enclosed by brackets "[]" replaced with your own identifying
18*101e15b5SRichard Lowe  * information: Portions Copyright [yyyy] [name of copyright owner]
19*101e15b5SRichard Lowe  *
20*101e15b5SRichard Lowe  * CDDL HEADER END
21*101e15b5SRichard Lowe  */
22*101e15b5SRichard Lowe /*
23*101e15b5SRichard Lowe  * Copyright 1998-2003 Sun Microsystems, Inc.  All rights reserved.
24*101e15b5SRichard Lowe  * Use is subject to license terms.
25*101e15b5SRichard Lowe  */
26*101e15b5SRichard Lowe 
27*101e15b5SRichard Lowe #ifndef	_SORT_UTILITY_H
28*101e15b5SRichard Lowe #define	_SORT_UTILITY_H
29*101e15b5SRichard Lowe 
30*101e15b5SRichard Lowe #ifdef	__cplusplus
31*101e15b5SRichard Lowe extern "C" {
32*101e15b5SRichard Lowe #endif
33*101e15b5SRichard Lowe 
34*101e15b5SRichard Lowe #include <sys/mman.h>
35*101e15b5SRichard Lowe #include <sys/stat.h>
36*101e15b5SRichard Lowe 
37*101e15b5SRichard Lowe #include <assert.h>
38*101e15b5SRichard Lowe #include <errno.h>
39*101e15b5SRichard Lowe #include <fcntl.h>
40*101e15b5SRichard Lowe #include <libintl.h>
41*101e15b5SRichard Lowe #include <signal.h>
42*101e15b5SRichard Lowe #include <stdarg.h>
43*101e15b5SRichard Lowe #include <stdio.h>
44*101e15b5SRichard Lowe #include <stdlib.h>
45*101e15b5SRichard Lowe #include <string.h>
46*101e15b5SRichard Lowe #include <unistd.h>
47*101e15b5SRichard Lowe #include <wchar.h>
48*101e15b5SRichard Lowe 
49*101e15b5SRichard Lowe #include "types.h"
50*101e15b5SRichard Lowe 
51*101e15b5SRichard Lowe #define	CMDNAME	"sort"
52*101e15b5SRichard Lowe 
53*101e15b5SRichard Lowe #ifndef TRUE
54*101e15b5SRichard Lowe #define	TRUE	1
55*101e15b5SRichard Lowe #endif /* TRUE */
56*101e15b5SRichard Lowe 
57*101e15b5SRichard Lowe #ifndef FALSE
58*101e15b5SRichard Lowe #define	FALSE	0
59*101e15b5SRichard Lowe #endif /* FALSE */
60*101e15b5SRichard Lowe 
61*101e15b5SRichard Lowe #define	SGN(x)		(((x) == 0 ? 0 : ((x) > 0 ? 1 : -1)))
62*101e15b5SRichard Lowe #define	MIN(x, y)	(((x) < (y)) ? (x) : (y))
63*101e15b5SRichard Lowe #define	MAX(x, y)	(((x) > (y)) ? (x) : (y))
64*101e15b5SRichard Lowe 
65*101e15b5SRichard Lowe #define	SE_BAD_FIELD			1
66*101e15b5SRichard Lowe #define	SE_BAD_SPECIFIER		2
67*101e15b5SRichard Lowe #define	SE_BAD_STREAM			3
68*101e15b5SRichard Lowe #define	SE_CANT_MMAP_FILE		4
69*101e15b5SRichard Lowe #define	SE_CANT_OPEN_FILE		5
70*101e15b5SRichard Lowe #define	SE_CANT_SET_SIGNAL		6
71*101e15b5SRichard Lowe #define	SE_CAUGHT_SIGNAL		7
72*101e15b5SRichard Lowe #define	SE_CHECK_ERROR			8
73*101e15b5SRichard Lowe #define	SE_CHECK_FAILED			9
74*101e15b5SRichard Lowe #define	SE_CHECK_SUCCEED		10
75*101e15b5SRichard Lowe #define	SE_ILLEGAL_CHARACTER		11
76*101e15b5SRichard Lowe #define	SE_INSUFFICIENT_DESCRIPTORS	12
77*101e15b5SRichard Lowe #define	SE_INSUFFICIENT_MEMORY		13
78*101e15b5SRichard Lowe #define	SE_MMAP_FAILED			14
79*101e15b5SRichard Lowe #define	SE_MUNMAP_FAILED		15
80*101e15b5SRichard Lowe #define	SE_READ_FAILED			16
81*101e15b5SRichard Lowe #define	SE_REALLOCATE_BUFFER		17
82*101e15b5SRichard Lowe #define	SE_STAT_FAILED			18
83*101e15b5SRichard Lowe #define	SE_TOO_MANY_TEMPFILES		19
84*101e15b5SRichard Lowe #define	SE_UNLINK_FAILED		20
85*101e15b5SRichard Lowe #define	SE_USAGE			21
86*101e15b5SRichard Lowe #define	SE_WRITE_FAILED			22
87*101e15b5SRichard Lowe #define	SE_CLOSE_FAILED			23
88*101e15b5SRichard Lowe 
89*101e15b5SRichard Lowe #define	KILOBYTE			1024
90*101e15b5SRichard Lowe #define	MEGABYTE			(1024 * KILOBYTE)
91*101e15b5SRichard Lowe 
92*101e15b5SRichard Lowe #define	AV_MEM_MULTIPLIER		3
93*101e15b5SRichard Lowe #define	AV_MEM_DIVISOR			4
94*101e15b5SRichard Lowe 
95*101e15b5SRichard Lowe #define	OUTPUT_MODE	(S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | \
96*101e15b5SRichard Lowe     S_IWOTH)
97*101e15b5SRichard Lowe 
98*101e15b5SRichard Lowe #define	E_SUCCESS	0	/* Exit status for successful run */
99*101e15b5SRichard Lowe #define	E_FAILED_CHECK	1	/* Exit status for failed check */
100*101e15b5SRichard Lowe #define	E_ERROR		2	/* Exit status for other error */
101*101e15b5SRichard Lowe #define	E_USAGE		E_ERROR	/* Exit status for usage error */
102*101e15b5SRichard Lowe 
103*101e15b5SRichard Lowe #define	EMSG_CHECK	\
104*101e15b5SRichard Lowe     gettext("check option (-c) only for use with a single file\n")
105*101e15b5SRichard Lowe #define	EMSG_MMAP	gettext("can't mmap %s")
106*101e15b5SRichard Lowe #define	EMSG_MUNMAP	gettext("can't munmap %s")
107*101e15b5SRichard Lowe #define	EMSG_REALLOC	gettext("unable to reallocate buffer")
108*101e15b5SRichard Lowe #define	EMSG_ALLOC	gettext("unable to allocate memory")
109*101e15b5SRichard Lowe #define	EMSG_OPEN	gettext("can't open %s")
110*101e15b5SRichard Lowe #define	EMSG_READ	gettext("can't read %s")
111*101e15b5SRichard Lowe #define	EMSG_WRITE	gettext("can't write %s")
112*101e15b5SRichard Lowe #define	EMSG_STAT	gettext("can't stat %s")
113*101e15b5SRichard Lowe #define	EMSG_CLOSE	gettext("can't close %s")
114*101e15b5SRichard Lowe #define	EMSG_UNLINK	gettext("can't unlink %s")
115*101e15b5SRichard Lowe #define	EMSG_ILLEGAL_CHAR gettext("can't translate illegal wide character\n")
116*101e15b5SRichard Lowe #define	EMSG_TEMPORARY	gettext("temporary file template exhausted\n")
117*101e15b5SRichard Lowe #define	EMSG_MEMORY	\
118*101e15b5SRichard Lowe     gettext("insufficient memory; use -S option to increase allocation\n")
119*101e15b5SRichard Lowe #define	EMSG_DESCRIPTORS gettext("insufficient available file descriptors\n")
120*101e15b5SRichard Lowe #define	EMSG_SIGNAL	gettext("can't set signal handler for %s")
121*101e15b5SRichard Lowe #define	EMSG_BADPRIME	gettext("internal file state corrupted\n")
122*101e15b5SRichard Lowe 
123*101e15b5SRichard Lowe #define	EMSG_UNKN_STREAM gettext("INTERNAL: stream of type %d seen\n")
124*101e15b5SRichard Lowe #define	EMSG_UNKN_FIELD	gettext("INTERNAL: field of type %d seen\n")
125*101e15b5SRichard Lowe #define	EMSG_UNKN_OPTION gettext("INTERNAL: option parser error\n")
126*101e15b5SRichard Lowe 
127*101e15b5SRichard Lowe #define	WMSG_NEWLINE_ADDED \
128*101e15b5SRichard Lowe     gettext("missing NEWLINE added at end of input file %s\n")
129*101e15b5SRichard Lowe 
130*101e15b5SRichard Lowe extern void warn(const char *, ...);
131*101e15b5SRichard Lowe extern void die(const char *, ...);
132*101e15b5SRichard Lowe extern void usage(void);
133*101e15b5SRichard Lowe 
134*101e15b5SRichard Lowe extern void swap(void **, void **);
135*101e15b5SRichard Lowe 
136*101e15b5SRichard Lowe extern int bump_file_template();
137*101e15b5SRichard Lowe extern char *get_file_template();
138*101e15b5SRichard Lowe extern void set_file_template(char **);
139*101e15b5SRichard Lowe 
140*101e15b5SRichard Lowe extern void set_cleanup_chain(stream_t **);
141*101e15b5SRichard Lowe 
142*101e15b5SRichard Lowe extern void set_output_file(char *);
143*101e15b5SRichard Lowe extern void set_output_guard(stream_t *);
144*101e15b5SRichard Lowe extern void clear_output_guard(void);
145*101e15b5SRichard Lowe extern void establish_output_guard(sort_t *);
146*101e15b5SRichard Lowe extern void remove_output_guard();
147*101e15b5SRichard Lowe 
148*101e15b5SRichard Lowe extern void atexit_handler(void);
149*101e15b5SRichard Lowe 
150*101e15b5SRichard Lowe extern size_t available_memory(size_t);
151*101e15b5SRichard Lowe extern void set_memory_ratio(sort_t *, int *, int *);
152*101e15b5SRichard Lowe 
153*101e15b5SRichard Lowe extern size_t strtomem(char *);
154*101e15b5SRichard Lowe extern void *safe_realloc(void *, size_t);
155*101e15b5SRichard Lowe extern void safe_free(void *);
156*101e15b5SRichard Lowe 
157*101e15b5SRichard Lowe extern void *xzmap(void *, size_t, int, int, off_t);
158*101e15b5SRichard Lowe extern void hold_file_descriptor(void);
159*101e15b5SRichard Lowe extern void release_file_descriptor(void);
160*101e15b5SRichard Lowe 
161*101e15b5SRichard Lowe extern void copy_line_rec(const line_rec_t *, line_rec_t *);
162*101e15b5SRichard Lowe extern void trip_eof(FILE *f);
163*101e15b5SRichard Lowe 
164*101e15b5SRichard Lowe extern int cxwrite(int, char *, size_t);
165*101e15b5SRichard Lowe extern int wxwrite(int, wchar_t *);
166*101e15b5SRichard Lowe 
167*101e15b5SRichard Lowe extern int xstreql(const char *, const char *);
168*101e15b5SRichard Lowe extern int xstrneql(const char *, const char *, const size_t);
169*101e15b5SRichard Lowe extern char *xstrnchr(const char *, const int, const size_t);
170*101e15b5SRichard Lowe extern void xstrninv(char *, ssize_t, ssize_t);
171*101e15b5SRichard Lowe 
172*101e15b5SRichard Lowe extern int xwcsneql(const wchar_t *, const wchar_t *, const size_t);
173*101e15b5SRichard Lowe extern wchar_t *xwsnchr(const wchar_t *, const wint_t, const size_t);
174*101e15b5SRichard Lowe extern void xwcsninv(wchar_t *, ssize_t, ssize_t);
175*101e15b5SRichard Lowe 
176*101e15b5SRichard Lowe #ifdef _LITTLE_ENDIAN
177*101e15b5SRichard Lowe extern void xwcsntomsb(wchar_t *, ssize_t);
178*101e15b5SRichard Lowe #endif /* _LITTLE_ENDIAN */
179*101e15b5SRichard Lowe 
180*101e15b5SRichard Lowe extern wchar_t *xmemwchar(wchar_t *, wchar_t, ssize_t);
181*101e15b5SRichard Lowe 
182*101e15b5SRichard Lowe extern void xcp(char *, char *, off_t);
183*101e15b5SRichard Lowe extern void xdump(FILE *, uchar_t *, size_t, int);
184*101e15b5SRichard Lowe 
185*101e15b5SRichard Lowe #ifdef DEBUG
186*101e15b5SRichard Lowe #define	ASSERT(x) assert(x)
187*101e15b5SRichard Lowe #else
188*101e15b5SRichard Lowe #define	ASSERT(x)
189*101e15b5SRichard Lowe #endif
190*101e15b5SRichard Lowe 
191*101e15b5SRichard Lowe #ifdef STATS
192*101e15b5SRichard Lowe #define	__S(x) x
193*101e15b5SRichard Lowe #else
194*101e15b5SRichard Lowe #define	__S(x)
195*101e15b5SRichard Lowe #endif
196*101e15b5SRichard Lowe 
197*101e15b5SRichard Lowe #ifdef	__cplusplus
198*101e15b5SRichard Lowe }
199*101e15b5SRichard Lowe #endif
200*101e15b5SRichard Lowe 
201*101e15b5SRichard Lowe #endif	/* _SORT_UTILITY_H */
202