move dir_sort_alpha function from generic utils to one specific place it is used

This commit is contained in:
Vincent Sanders 2016-04-19 12:01:05 +01:00
parent 1bc010665e
commit afea659fef
3 changed files with 43 additions and 46 deletions

View File

@ -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)
{

View File

@ -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 */

View File

@ -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);