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 44 int 45 namecmp(const FTSENT *a, const FTSENT *b) 46 { 47 48 return (strcoll(a->fts_name, b->fts_name)); 49 } 50 51 int 52 revnamecmp(const FTSENT *a, const FTSENT *b) 53 { 54 55 return (strcoll(b->fts_name, a->fts_name)); 56 } 57 58 int 59 verscmp(const FTSENT *a, const FTSENT *b) 60 { 61 62 return (strverscmp(a->fts_name, b->fts_name)); 63 } 64 65 int 66 revverscmp(const FTSENT *a, const FTSENT *b) 67 { 68 69 return (strverscmp(b->fts_name, a->fts_name)); 70 } 71 72 int 73 modcmp(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 94 int 95 revmodcmp(const FTSENT *a, const FTSENT *b) 96 { 97 98 return (modcmp(b, a)); 99 } 100 101 int 102 acccmp(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 123 int 124 revacccmp(const FTSENT *a, const FTSENT *b) 125 { 126 127 return (acccmp(b, a)); 128 } 129 130 int 131 birthcmp(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 152 int 153 revbirthcmp(const FTSENT *a, const FTSENT *b) 154 { 155 156 return (birthcmp(b, a)); 157 } 158 159 int 160 statcmp(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 181 int 182 revstatcmp(const FTSENT *a, const FTSENT *b) 183 { 184 185 return (statcmp(b, a)); 186 } 187 188 int 189 sizecmp(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 199 int 200 revsizecmp(const FTSENT *a, const FTSENT *b) 201 { 202 203 return (sizecmp(b, a)); 204 } 205