nsxivc5f6b2c
Sort directory entries when using -r
+14 −1
1 file changed
- M main.c +14 −1
| @@ -199,10 +199,15 @@ int check_append(const char *filename) { | |||
| 199 | 199 | } | |
| 200 | 200 | } | |
| 201 | 201 | ||
| 202 | + | int fncmp(const void *a, const void *b) { | |
| 203 | + | return strcoll(*((char* const*) a), *((char* const*) b)); | |
| 204 | + | } | |
| 205 | + | ||
| 202 | 206 | void read_dir_rec(const char *dirname) { | |
| 203 | 207 | char *filename; | |
| 204 | 208 | const char **dirnames; | |
| 205 | 209 | int dircnt, diridx; | |
| 210 | + | int fcnt, fstart; | |
| 206 | 211 | unsigned char first; | |
| 207 | 212 | size_t len; | |
| 208 | 213 | DIR *dir; | |
| @@ -217,6 +222,9 @@ void read_dir_rec(const char *dirname) { | |||
| 217 | 222 | dirnames = (const char**) s_malloc(dircnt * sizeof(const char*)); | |
| 218 | 223 | dirnames[0] = dirname; | |
| 219 | 224 | ||
| 225 | + | fcnt = 0; | |
| 226 | + | fstart = fileidx; | |
| 227 | + | ||
| 220 | 228 | while (diridx > 0) { | |
| 221 | 229 | dirname = dirnames[--diridx]; | |
| 222 | 230 | if (!(dir = opendir(dirname))) { | |
| @@ -238,7 +246,9 @@ void read_dir_rec(const char *dirname) { | |||
| 238 | 246 | } | |
| 239 | 247 | dirnames[diridx++] = filename; | |
| 240 | 248 | } else { | |
| 241 | − | if (!check_append(filename)) | |
| 249 | + | if (check_append(filename)) | |
| 250 | + | ++fcnt; | |
| 251 | + | else | |
| 242 | 252 | free(filename); | |
| 243 | 253 | } | |
| 244 | 254 | } | |
| @@ -251,6 +261,9 @@ void read_dir_rec(const char *dirname) { | |||
| 251 | 261 | first = 0; | |
| 252 | 262 | } | |
| 253 | 263 | ||
| 264 | + | if (fcnt > 1) | |
| 265 | + | qsort(filenames + fstart, fcnt, sizeof(char*), fncmp); | |
| 266 | + | ||
| 254 | 267 | free(dirnames); | |
| 255 | 268 | } | |
| 256 | 269 | ||