cmp.c revision 330897
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 * 4. 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#if 0
36#ifndef lint
37static char sccsid[] = "@(#)cmp.c	8.1 (Berkeley) 5/31/93";
38#endif /* not lint */
39#endif
40#include <sys/cdefs.h>
41__FBSDID("$FreeBSD: stable/11/bin/ls/cmp.c 330897 2018-03-14 03:19:51Z eadler $");
42
43
44#include <sys/types.h>
45#include <sys/stat.h>
46
47#include <fts.h>
48#include <string.h>
49
50#include "ls.h"
51#include "extern.h"
52
53int
54namecmp(const FTSENT *a, const FTSENT *b)
55{
56
57	return (strcoll(a->fts_name, b->fts_name));
58}
59
60int
61revnamecmp(const FTSENT *a, const FTSENT *b)
62{
63
64	return (strcoll(b->fts_name, a->fts_name));
65}
66
67int
68modcmp(const FTSENT *a, const FTSENT *b)
69{
70
71	if (b->fts_statp->st_mtim.tv_sec >
72	    a->fts_statp->st_mtim.tv_sec)
73		return (1);
74	if (b->fts_statp->st_mtim.tv_sec <
75	    a->fts_statp->st_mtim.tv_sec)
76		return (-1);
77	if (b->fts_statp->st_mtim.tv_nsec >
78	    a->fts_statp->st_mtim.tv_nsec)
79		return (1);
80	if (b->fts_statp->st_mtim.tv_nsec <
81	    a->fts_statp->st_mtim.tv_nsec)
82		return (-1);
83	if (f_samesort)
84		return (strcoll(b->fts_name, a->fts_name));
85	else
86		return (strcoll(a->fts_name, b->fts_name));
87}
88
89int
90revmodcmp(const FTSENT *a, const FTSENT *b)
91{
92
93	return (modcmp(b, a));
94}
95
96int
97acccmp(const FTSENT *a, const FTSENT *b)
98{
99
100	if (b->fts_statp->st_atim.tv_sec >
101	    a->fts_statp->st_atim.tv_sec)
102		return (1);
103	if (b->fts_statp->st_atim.tv_sec <
104	    a->fts_statp->st_atim.tv_sec)
105		return (-1);
106	if (b->fts_statp->st_atim.tv_nsec >
107	    a->fts_statp->st_atim.tv_nsec)
108		return (1);
109	if (b->fts_statp->st_atim.tv_nsec <
110	    a->fts_statp->st_atim.tv_nsec)
111		return (-1);
112	if (f_samesort)
113		return (strcoll(b->fts_name, a->fts_name));
114	else
115		return (strcoll(a->fts_name, b->fts_name));
116}
117
118int
119revacccmp(const FTSENT *a, const FTSENT *b)
120{
121
122	return (acccmp(b, a));
123}
124
125int
126birthcmp(const FTSENT *a, const FTSENT *b)
127{
128
129	if (b->fts_statp->st_birthtim.tv_sec >
130	    a->fts_statp->st_birthtim.tv_sec)
131		return (1);
132	if (b->fts_statp->st_birthtim.tv_sec <
133	    a->fts_statp->st_birthtim.tv_sec)
134		return (-1);
135	if (b->fts_statp->st_birthtim.tv_nsec >
136	    a->fts_statp->st_birthtim.tv_nsec)
137		return (1);
138	if (b->fts_statp->st_birthtim.tv_nsec <
139	    a->fts_statp->st_birthtim.tv_nsec)
140		return (-1);
141	if (f_samesort)
142		return (strcoll(b->fts_name, a->fts_name));
143	else
144		return (strcoll(a->fts_name, b->fts_name));
145}
146
147int
148revbirthcmp(const FTSENT *a, const FTSENT *b)
149{
150
151	return (birthcmp(b, a));
152}
153
154int
155statcmp(const FTSENT *a, const FTSENT *b)
156{
157
158	if (b->fts_statp->st_ctim.tv_sec >
159	    a->fts_statp->st_ctim.tv_sec)
160		return (1);
161	if (b->fts_statp->st_ctim.tv_sec <
162	    a->fts_statp->st_ctim.tv_sec)
163		return (-1);
164	if (b->fts_statp->st_ctim.tv_nsec >
165	    a->fts_statp->st_ctim.tv_nsec)
166		return (1);
167	if (b->fts_statp->st_ctim.tv_nsec <
168	    a->fts_statp->st_ctim.tv_nsec)
169		return (-1);
170	if (f_samesort)
171		return (strcoll(b->fts_name, a->fts_name));
172	else
173		return (strcoll(a->fts_name, b->fts_name));
174}
175
176int
177revstatcmp(const FTSENT *a, const FTSENT *b)
178{
179
180	return (statcmp(b, a));
181}
182
183int
184sizecmp(const FTSENT *a, const FTSENT *b)
185{
186
187	if (b->fts_statp->st_size > a->fts_statp->st_size)
188		return (1);
189	if (b->fts_statp->st_size < a->fts_statp->st_size)
190		return (-1);
191	return (strcoll(a->fts_name, b->fts_name));
192}
193
194int
195revsizecmp(const FTSENT *a, const FTSENT *b)
196{
197
198	return (sizecmp(b, a));
199}
200