xref: /freebsd/usr.bin/sort/file.h (revision 389e4940069316fe667ffa263fa7d6390d0a960f)
1 /*	$FreeBSD$	*/
2 
3 /*-
4  * SPDX-License-Identifier: BSD-2-Clause-FreeBSD
5  *
6  * Copyright (C) 2009 Gabor Kovesdan <gabor@FreeBSD.org>
7  * Copyright (C) 2012 Oleg Moskalenko <mom040267@gmail.com>
8  * All rights reserved.
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  *
19  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  */
31 
32 #if !defined(__SORT_FILE_H__)
33 #define	__SORT_FILE_H__
34 
35 #include "coll.h"
36 #include "sort.h"
37 
38 #define	SORT_DEFAULT	0
39 #define	SORT_QSORT	1
40 #define	SORT_MERGESORT	2
41 #define	SORT_HEAPSORT	3
42 #define	SORT_RADIXSORT  4
43 
44 #define	DEFAULT_SORT_ALGORITHM SORT_HEAPSORT
45 #define	DEFAULT_SORT_FUNC heapsort
46 
47 /*
48  * List of data to be sorted.
49  */
50 struct sort_list
51 {
52 	struct sort_list_item	**list;
53 	unsigned long long	 memsize;
54 	size_t			 count;
55 	size_t			 size;
56 	size_t			 sub_list_pos;
57 };
58 
59 /*
60  * File reader object
61  */
62 struct file_reader;
63 
64 /*
65  * List of files to be sorted
66  */
67 struct file_list
68 {
69 	char			**fns;
70 	size_t			 count;
71 	size_t			 sz;
72 	bool			 tmp;
73 };
74 
75 /* memory */
76 
77 /**/
78 
79 extern unsigned long long free_memory;
80 extern unsigned long long available_free_memory;
81 
82 /* Are we using mmap ? */
83 extern bool use_mmap;
84 
85 /* temporary file dir */
86 
87 extern const char *tmpdir;
88 
89 /*
90  * Max number of simultaneously open files (including the output file).
91  */
92 extern size_t max_open_files;
93 
94 /*
95  * Compress program
96  */
97 extern const char* compress_program;
98 
99 /* funcs */
100 
101 struct file_reader *file_reader_init(const char *fsrc);
102 struct bwstring *file_reader_readline(struct file_reader *fr);
103 void file_reader_free(struct file_reader *fr);
104 
105 void init_tmp_files(void);
106 void clear_tmp_files(void);
107 char *new_tmp_file_name(void);
108 void tmp_file_atexit(const char *tmp_file);
109 
110 void file_list_init(struct file_list *fl, bool tmp);
111 void file_list_add(struct file_list *fl, char *fn, bool allocate);
112 void file_list_populate(struct file_list *fl, int argc, char **argv, bool allocate);
113 void file_list_clean(struct file_list *fl);
114 
115 int check(const char *);
116 void merge_files(struct file_list *fl, const char *fn_out);
117 FILE *openfile(const char *, const char *);
118 void closefile(FILE *, const char *);
119 int procfile(const char *fn, struct sort_list *list, struct file_list *fl);
120 
121 void sort_list_init(struct sort_list *l);
122 void sort_list_add(struct sort_list *l, struct bwstring *str);
123 void sort_list_clean(struct sort_list *l);
124 void sort_list_dump(struct sort_list *l, const char *fn);
125 
126 void sort_list_to_file(struct sort_list *list, const char *outfile);
127 
128 #endif /* __SORT_FILE_H__ */
129