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 #if 0
36 #ifndef lint
37 static char sccsid[] = "@(#)cmp.c 8.1 (Berkeley) 5/31/93";
38 #endif /* not lint */
39 #endif
40 #include <sys/cdefs.h>
41 __FBSDID("$FreeBSD$");
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
53 int
namecmp(const FTSENT * a,const FTSENT * b)54 namecmp(const FTSENT *a, const FTSENT *b)
55 {
56
57 return (strcoll(a->fts_name, b->fts_name));
58 }
59
60 int
revnamecmp(const FTSENT * a,const FTSENT * b)61 revnamecmp(const FTSENT *a, const FTSENT *b)
62 {
63
64 return (strcoll(b->fts_name, a->fts_name));
65 }
66
67 int
modcmp(const FTSENT * a,const FTSENT * b)68 modcmp(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
89 int
revmodcmp(const FTSENT * a,const FTSENT * b)90 revmodcmp(const FTSENT *a, const FTSENT *b)
91 {
92
93 return (modcmp(b, a));
94 }
95
96 int
acccmp(const FTSENT * a,const FTSENT * b)97 acccmp(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
118 int
revacccmp(const FTSENT * a,const FTSENT * b)119 revacccmp(const FTSENT *a, const FTSENT *b)
120 {
121
122 return (acccmp(b, a));
123 }
124
125 int
birthcmp(const FTSENT * a,const FTSENT * b)126 birthcmp(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
147 int
revbirthcmp(const FTSENT * a,const FTSENT * b)148 revbirthcmp(const FTSENT *a, const FTSENT *b)
149 {
150
151 return (birthcmp(b, a));
152 }
153
154 int
statcmp(const FTSENT * a,const FTSENT * b)155 statcmp(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
176 int
revstatcmp(const FTSENT * a,const FTSENT * b)177 revstatcmp(const FTSENT *a, const FTSENT *b)
178 {
179
180 return (statcmp(b, a));
181 }
182
183 int
sizecmp(const FTSENT * a,const FTSENT * b)184 sizecmp(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
194 int
revsizecmp(const FTSENT * a,const FTSENT * b)195 revsizecmp(const FTSENT *a, const FTSENT *b)
196 {
197
198 return (sizecmp(b, a));
199 }
200