1/*-
2 * SPDX-License-Identifier: BSD-3-Clause
3 *
4 * Copyright (c) 1989, 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 * Michael Fischbein.
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. Neither the name of the University nor the names of its contributors
19 *    may be used to endorse or promote products derived from this software
20 *    without specific prior written permission.
21 *
22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32 * SUCH DAMAGE.
33 */
34
35#include <sys/types.h>
36#include <sys/stat.h>
37
38#include <fts.h>
39#include <string.h>
40
41#include "ls.h"
42#include "extern.h"
43
44int
45namecmp(const FTSENT *a, const FTSENT *b)
46{
47
48	return (strcoll(a->fts_name, b->fts_name));
49}
50
51int
52revnamecmp(const FTSENT *a, const FTSENT *b)
53{
54
55	return (strcoll(b->fts_name, a->fts_name));
56}
57
58int
59verscmp(const FTSENT *a, const FTSENT *b)
60{
61
62	return (strverscmp(a->fts_name, b->fts_name));
63}
64
65int
66revverscmp(const FTSENT *a, const FTSENT *b)
67{
68
69	return (strverscmp(b->fts_name, a->fts_name));
70}
71
72int
73modcmp(const FTSENT *a, const FTSENT *b)
74{
75
76	if (b->fts_statp->st_mtim.tv_sec >
77	    a->fts_statp->st_mtim.tv_sec)
78		return (1);
79	if (b->fts_statp->st_mtim.tv_sec <
80	    a->fts_statp->st_mtim.tv_sec)
81		return (-1);
82	if (b->fts_statp->st_mtim.tv_nsec >
83	    a->fts_statp->st_mtim.tv_nsec)
84		return (1);
85	if (b->fts_statp->st_mtim.tv_nsec <
86	    a->fts_statp->st_mtim.tv_nsec)
87		return (-1);
88	if (f_samesort)
89		return (strcoll(b->fts_name, a->fts_name));
90	else
91		return (strcoll(a->fts_name, b->fts_name));
92}
93
94int
95revmodcmp(const FTSENT *a, const FTSENT *b)
96{
97
98	return (modcmp(b, a));
99}
100
101int
102acccmp(const FTSENT *a, const FTSENT *b)
103{
104
105	if (b->fts_statp->st_atim.tv_sec >
106	    a->fts_statp->st_atim.tv_sec)
107		return (1);
108	if (b->fts_statp->st_atim.tv_sec <
109	    a->fts_statp->st_atim.tv_sec)
110		return (-1);
111	if (b->fts_statp->st_atim.tv_nsec >
112	    a->fts_statp->st_atim.tv_nsec)
113		return (1);
114	if (b->fts_statp->st_atim.tv_nsec <
115	    a->fts_statp->st_atim.tv_nsec)
116		return (-1);
117	if (f_samesort)
118		return (strcoll(b->fts_name, a->fts_name));
119	else
120		return (strcoll(a->fts_name, b->fts_name));
121}
122
123int
124revacccmp(const FTSENT *a, const FTSENT *b)
125{
126
127	return (acccmp(b, a));
128}
129
130int
131birthcmp(const FTSENT *a, const FTSENT *b)
132{
133
134	if (b->fts_statp->st_birthtim.tv_sec >
135	    a->fts_statp->st_birthtim.tv_sec)
136		return (1);
137	if (b->fts_statp->st_birthtim.tv_sec <
138	    a->fts_statp->st_birthtim.tv_sec)
139		return (-1);
140	if (b->fts_statp->st_birthtim.tv_nsec >
141	    a->fts_statp->st_birthtim.tv_nsec)
142		return (1);
143	if (b->fts_statp->st_birthtim.tv_nsec <
144	    a->fts_statp->st_birthtim.tv_nsec)
145		return (-1);
146	if (f_samesort)
147		return (strcoll(b->fts_name, a->fts_name));
148	else
149		return (strcoll(a->fts_name, b->fts_name));
150}
151
152int
153revbirthcmp(const FTSENT *a, const FTSENT *b)
154{
155
156	return (birthcmp(b, a));
157}
158
159int
160statcmp(const FTSENT *a, const FTSENT *b)
161{
162
163	if (b->fts_statp->st_ctim.tv_sec >
164	    a->fts_statp->st_ctim.tv_sec)
165		return (1);
166	if (b->fts_statp->st_ctim.tv_sec <
167	    a->fts_statp->st_ctim.tv_sec)
168		return (-1);
169	if (b->fts_statp->st_ctim.tv_nsec >
170	    a->fts_statp->st_ctim.tv_nsec)
171		return (1);
172	if (b->fts_statp->st_ctim.tv_nsec <
173	    a->fts_statp->st_ctim.tv_nsec)
174		return (-1);
175	if (f_samesort)
176		return (strcoll(b->fts_name, a->fts_name));
177	else
178		return (strcoll(a->fts_name, b->fts_name));
179}
180
181int
182revstatcmp(const FTSENT *a, const FTSENT *b)
183{
184
185	return (statcmp(b, a));
186}
187
188int
189sizecmp(const FTSENT *a, const FTSENT *b)
190{
191
192	if (b->fts_statp->st_size > a->fts_statp->st_size)
193		return (1);
194	if (b->fts_statp->st_size < a->fts_statp->st_size)
195		return (-1);
196	return (strcoll(a->fts_name, b->fts_name));
197}
198
199int
200revsizecmp(const FTSENT *a, const FTSENT *b)
201{
202
203	return (sizecmp(b, a));
204}
205