summaryrefslogtreecommitdiffstats
path: root/usr.bin/sort/file.h
blob: 7037d87486f8329d3646d41453a361bde30d10c3 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/*	$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(__SORT_FILE_H__)
#define	__SORT_FILE_H__

#include "coll.h"
#include "sort.h"

#define	SORT_DEFAULT	0
#define	SORT_QSORT	1
#define	SORT_MERGESORT	2
#define	SORT_HEAPSORT	3
#define	SORT_RADIXSORT  4

#define	DEFAULT_SORT_ALGORITHM SORT_HEAPSORT
#define	DEFAULT_SORT_FUNC heapsort

/*
 * List of data to be sorted.
 */
struct sort_list
{
	struct sort_list_item	**list;
	unsigned long long	 memsize;
	size_t			 count;
	size_t			 size;
	size_t			 sub_list_pos;
};

/*
 * File reader object 
 */
struct file_reader;

/*
 * List of files to be sorted
 */
struct file_list
{
	char			**fns;
	size_t			 count;
	size_t			 sz;
	bool			 tmp;
};

/*
 * Structure for zero-separated file reading (for input files list)
 */
struct file0_reader
{
	char			*current_line;
	FILE			*f;
	size_t			 current_sz;
};

/* memory */

/**/

extern unsigned long long free_memory;
extern unsigned long long available_free_memory;

/* Are we using mmap ? */
extern bool use_mmap;

/* temporary file dir */

extern const char *tmpdir;

/*
 * Max number of simultaneously open files (including the output file).
 */
extern size_t max_open_files;

/*
 * Compress program
 */
extern const char* compress_program;

/* funcs */

struct file_reader *file_reader_init(const char *fsrc);
struct bwstring *file_reader_readline(struct file_reader *fr);
void file_reader_free(struct file_reader *fr);

char *read_file0_line(struct file0_reader *f0r);

void init_tmp_files(void);
void clear_tmp_files(void);
char *new_tmp_file_name(void);
void tmp_file_atexit(const char *tmp_file);

void file_list_init(struct file_list *fl, bool tmp);
void file_list_add(struct file_list *fl, char *fn, bool allocate);
void file_list_populate(struct file_list *fl, int argc, char **argv, bool allocate);
void file_list_clean(struct file_list *fl);

int check(const char *);
void merge_files(struct file_list *fl, const char *fn_out);
FILE *openfile(const char *, const char *);
void closefile(FILE *, const char *);
int procfile(const char *fn, struct sort_list *list, struct file_list *fl);

void sort_list_init(struct sort_list *l);
void sort_list_add(struct sort_list *l, struct bwstring *str);
void sort_list_clean(struct sort_list *l);
void sort_list_dump(struct sort_list *l, const char *fn);

void sort_list_to_file(struct sort_list *list, const char *outfile);

#endif /* __SORT_FILE_H__ */
OpenPOWER on IntegriCloud