move dir_sort_alpha function from generic utils to one specific place it is used
This commit is contained in:
parent
1bc010665e
commit
afea659fef
|
@ -24,6 +24,7 @@
|
|||
|
||||
#include "utils/config.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <fcntl.h>
|
||||
|
@ -601,6 +602,48 @@ process_dir_ent(struct fetch_file_context *ctx,
|
|||
return NSERROR_OK;
|
||||
}
|
||||
|
||||
/**
|
||||
* Comparison function for sorting directories.
|
||||
*
|
||||
* Correctly orders non zero-padded numerical parts.
|
||||
* ie. produces "file1, file2, file10" rather than "file1, file10, file2".
|
||||
*
|
||||
* \param d1 first directory entry
|
||||
* \param d2 second directory entry
|
||||
*/
|
||||
static int dir_sort_alpha(const struct dirent **d1, const struct dirent **d2)
|
||||
{
|
||||
const char *s1 = (*d1)->d_name;
|
||||
const char *s2 = (*d2)->d_name;
|
||||
|
||||
while (*s1 != '\0' && *s2 != '\0') {
|
||||
if ((*s1 >= '0' && *s1 <= '9') &&
|
||||
(*s2 >= '0' && *s2 <= '9')) {
|
||||
int n1 = 0, n2 = 0;
|
||||
while (*s1 >= '0' && *s1 <= '9') {
|
||||
n1 = n1 * 10 + (*s1) - '0';
|
||||
s1++;
|
||||
}
|
||||
while (*s2 >= '0' && *s2 <= '9') {
|
||||
n2 = n2 * 10 + (*s2) - '0';
|
||||
s2++;
|
||||
}
|
||||
if (n1 != n2) {
|
||||
return n1 - n2;
|
||||
}
|
||||
if (*s1 == '\0' || *s2 == '\0')
|
||||
break;
|
||||
}
|
||||
if (tolower(*s1) != tolower(*s2))
|
||||
break;
|
||||
|
||||
s1++;
|
||||
s2++;
|
||||
}
|
||||
|
||||
return tolower(*s1) - tolower(*s2);
|
||||
}
|
||||
|
||||
static void fetch_file_process_dir(struct fetch_file_context *ctx,
|
||||
struct stat *fdstat)
|
||||
{
|
||||
|
|
|
@ -365,41 +365,6 @@ char *strndup(const char *s, size_t n)
|
|||
#endif
|
||||
|
||||
|
||||
/* Exported interface, documented in utils.h */
|
||||
int dir_sort_alpha(const struct dirent **d1, const struct dirent **d2)
|
||||
{
|
||||
const char *s1 = (*d1)->d_name;
|
||||
const char *s2 = (*d2)->d_name;
|
||||
|
||||
while (*s1 != '\0' && *s2 != '\0') {
|
||||
if ((*s1 >= '0' && *s1 <= '9') &&
|
||||
(*s2 >= '0' && *s2 <= '9')) {
|
||||
int n1 = 0, n2 = 0;
|
||||
while (*s1 >= '0' && *s1 <= '9') {
|
||||
n1 = n1 * 10 + (*s1) - '0';
|
||||
s1++;
|
||||
}
|
||||
while (*s2 >= '0' && *s2 <= '9') {
|
||||
n2 = n2 * 10 + (*s2) - '0';
|
||||
s2++;
|
||||
}
|
||||
if (n1 != n2) {
|
||||
return n1 - n2;
|
||||
}
|
||||
if (*s1 == '\0' || *s2 == '\0')
|
||||
break;
|
||||
}
|
||||
if (tolower(*s1) != tolower(*s2))
|
||||
break;
|
||||
|
||||
s1++;
|
||||
s2++;
|
||||
}
|
||||
|
||||
return tolower(*s1) - tolower(*s2);
|
||||
}
|
||||
|
||||
|
||||
#ifndef HAVE_SCANDIR
|
||||
|
||||
/* exported function documented in utils/dirent.h */
|
||||
|
|
|
@ -231,17 +231,6 @@ nserror vsnstrjoin(char **str, size_t *size, char sep, size_t nelm, va_list ap);
|
|||
*/
|
||||
nserror snstrjoin(char **str, size_t *size, char sep, size_t nelm, ...);
|
||||
|
||||
/**
|
||||
* Comparison function for sorting directories.
|
||||
*
|
||||
* Correctly orders non zero-padded numerical parts.
|
||||
* ie. produces "file1, file2, file10" rather than "file1, file10, file2".
|
||||
*
|
||||
* d1 first directory entry
|
||||
* d2 second directory entry
|
||||
*/
|
||||
int dir_sort_alpha(const struct dirent **d1, const struct dirent **d2);
|
||||
|
||||
/* Platform specific functions */
|
||||
void warn_user(const char *warning, const char *detail);
|
||||
|
||||
|
|
Loading…
Reference in New Issue