xref: /netbsd-src/usr.bin/sort/sort.h (revision d710132b4b8ce7f7cccaaf660cb16aa16b4077a0)
1 /*	$NetBSD: sort.h,v 1.15 2002/12/25 21:19:15 jdolecek Exp $	*/
2 
3 /*-
4  * Copyright (c) 1993
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * This code is derived from software contributed to Berkeley by
8  * Peter McIlroy.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *	This product includes software developed by the University of
21  *	California, Berkeley and its contributors.
22  * 4. Neither the name of the University nor the names of its contributors
23  *    may be used to endorse or promote products derived from this software
24  *    without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
36  * SUCH DAMAGE.
37  *
38  *	@(#)sort.h	8.1 (Berkeley) 6/6/93
39  */
40 
41 #include <sys/param.h>
42 
43 #include <db.h>
44 #include <err.h>
45 #include <errno.h>
46 #include <fcntl.h>
47 #include <limits.h>
48 #include <stdio.h>
49 #include <stdlib.h>
50 #include <string.h>
51 
52 #define NBINS		256
53 
54 /* values for masks, weights, and other flags. */
55 #define I 1		/* mask out non-printable characters */
56 #define D 2		/* sort alphanumeric characters only */
57 #define N 4		/* Field is a number */
58 #define F 8		/* weight lower and upper case the same */
59 #define R 16		/* Field is reversed with respect to the global weight */
60 #define BI 32		/* ignore blanks in icol */
61 #define BT 64		/* ignore blanks in tcol */
62 
63 /* masks for delimiters: blanks, fields, and termination. */
64 #define BLANK 1		/* ' ', '\t'; '\n' if -T is invoked */
65 #define FLD_D 2		/* ' ', '\t' default; from -t otherwise */
66 #define REC_D_F 4	/* '\n' default; from -T otherwise */
67 
68 #define ND 10	/* limit on number of -k options. */
69 
70 #define min(a, b) ((a) < (b) ? (a) : (b))
71 #define max(a, b) ((a) > (b) ? (a) : (b))
72 
73 #define	FCLOSE(file) {							\
74 	if (EOF == fclose(file))					\
75 		err(2, "%p", file);					\
76 }
77 
78 #define	EWRITE(ptr, size, n, f) {					\
79 	if (!fwrite(ptr, size, n, f))					\
80 		 err(2, NULL);						\
81 }
82 
83 /* length of record is currently limited to maximum string length (size_t) */
84 typedef size_t length_t;
85 
86 /* a record is a key/line pair starting at rec.data. It has a total length
87  * and an offset to the start of the line half of the pair.
88  */
89 typedef struct recheader {
90 	length_t length;
91 	length_t offset;
92 	u_char data[1];
93 } RECHEADER;
94 
95 typedef struct trecheader {
96 	length_t length;
97 	length_t offset;
98 } TRECHEADER;
99 
100 /* This is the column as seen by struct field.  It is used by enterfield.
101  * They are matched with corresponding coldescs during initialization.
102  */
103 struct column {
104 	struct coldesc *p;
105 	int num;
106 	int indent;
107 };
108 
109 /* a coldesc has a number and pointers to the beginning and end of the
110  * corresponding column in the current line.  This is determined in enterkey.
111  */
112 typedef struct coldesc {
113 	u_char *start;
114 	u_char *end;
115 	int num;
116 } COLDESC;
117 
118 /* A field has an initial and final column; an omitted final column
119  * implies the end of the line.  Flags regulate omission of blanks and
120  * numerical sorts; mask determines which characters are ignored (from -i, -d);
121  * weights determines the sort weights of a character (from -f, -r).
122  */
123 struct field {
124 	struct column icol;
125 	struct column tcol;
126 	u_int flags;
127 	u_char *mask;
128 	u_char *weights;
129 };
130 
131 struct filelist {
132 	const char * const * names;
133 };
134 
135 typedef int (*get_func_t)(int, int, struct filelist *, int,
136 		RECHEADER *, u_char *, struct field *);
137 typedef void (*put_func_t)(const struct recheader *, FILE *);
138 
139 extern int PANIC;	/* maximum depth of fsort before fmerge is called */
140 extern u_char ascii[NBINS], Rascii[NBINS], Ftable[NBINS], RFtable[NBINS];
141 extern u_char d_mask[NBINS];
142 extern int SINGL_FLD, SEP_FLAG, UNIQUE;
143 extern int REC_D;
144 extern const char *tmpdir;
145 extern int stable_sort;
146 extern u_char gweights[NBINS];
147 extern struct coldesc clist[(ND+1)*2];
148 extern int ncols;
149 
150 void	 append(const u_char **, int, int, FILE *,
151 	    void (*)(const RECHEADER *, FILE *), struct field *);
152 void	 concat(FILE *, FILE *);
153 length_t enterkey(RECHEADER *, DBT *, int, struct field *);
154 void	 fixit(int *, char **);
155 void	 fldreset(struct field *);
156 FILE	*ftmp(void);
157 void	 fmerge(int, int, struct filelist *, int,
158 		get_func_t, FILE *, put_func_t, struct field *);
159 void	 fsort(int, int, int, struct filelist *, int, FILE *,
160 		struct field *);
161 int	 geteasy(int, int, struct filelist *,
162 	    int, RECHEADER *, u_char *, struct field *);
163 int	 getnext(int, int, struct filelist *,
164 	    int, RECHEADER *, u_char *, struct field *);
165 int	 makekey(int, int, struct filelist *,
166 	    int, RECHEADER *, u_char *, struct field *);
167 int	 makeline(int, int, struct filelist *,
168 	    int, RECHEADER *, u_char *, struct field *);
169 void	 num_init(void);
170 void	 onepass(const u_char **, int, long, long *, u_char *, FILE *);
171 int	 optval(int, int);
172 void	 order(struct filelist *, get_func_t, struct field *);
173 void	 putline(const RECHEADER *, FILE *);
174 void	 putrec(const RECHEADER *, FILE *);
175 void	 rd_append(int, int, int, FILE *, u_char *, u_char *);
176 int	 setfield(const char *, struct field *, int);
177 void	 settables(int);
178