lib/strutils: add ul_stralnumcmp()
Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
parent
3d28996517
commit
27e6b3a92e
|
@ -363,5 +363,6 @@ extern char *strfappend(const char *s, const char *format, ...)
|
||||||
extern const char *split(const char **state, size_t *l, const char *separator, int quoted);
|
extern const char *split(const char **state, size_t *l, const char *separator, int quoted);
|
||||||
|
|
||||||
extern int skip_fline(FILE *fp);
|
extern int skip_fline(FILE *fp);
|
||||||
|
extern int ul_stralnumcmp(const char *p1, const char *p2);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1045,6 +1045,36 @@ int skip_fline(FILE *fp)
|
||||||
} while (1);
|
} while (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* compare two strings, but ignoring non-alnum and case of the characters, for example
|
||||||
|
* "Hello (123)!" is the same as "hello123".
|
||||||
|
*/
|
||||||
|
int ul_stralnumcmp(const char *p1, const char *p2)
|
||||||
|
{
|
||||||
|
const unsigned char *s1 = (const unsigned char *) p1;
|
||||||
|
const unsigned char *s2 = (const unsigned char *) p2;
|
||||||
|
unsigned char c1, c2;
|
||||||
|
|
||||||
|
do {
|
||||||
|
do {
|
||||||
|
c1 = (unsigned char) *s1++;
|
||||||
|
} while (c1 != '\0' && !isalnum((unsigned int) c1));
|
||||||
|
|
||||||
|
do {
|
||||||
|
c2 = (unsigned char) *s2++;
|
||||||
|
} while (c2 != '\0' && !isalnum((unsigned int) c2));
|
||||||
|
|
||||||
|
if (c1 != '\0')
|
||||||
|
c1 = tolower(c1);
|
||||||
|
if (c2 != '\0')
|
||||||
|
c2 = tolower(c2);
|
||||||
|
if (c1 == '\0')
|
||||||
|
return c1 - c2;
|
||||||
|
} while (c1 == c2);
|
||||||
|
|
||||||
|
return c1 - c2;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef TEST_PROGRAM_STRUTILS
|
#ifdef TEST_PROGRAM_STRUTILS
|
||||||
struct testS {
|
struct testS {
|
||||||
char *name;
|
char *name;
|
||||||
|
@ -1142,13 +1172,19 @@ int main(int argc, char *argv[])
|
||||||
if (argc == 4 && strcmp(argv[1], "--strdup-member") == 0)
|
if (argc == 4 && strcmp(argv[1], "--strdup-member") == 0)
|
||||||
return test_strdup_to_member(argc - 1, argv + 1);
|
return test_strdup_to_member(argc - 1, argv + 1);
|
||||||
|
|
||||||
else if (argc == 3 && strcmp(argv[1], "--normalize") == 0)
|
if (argc == 4 && strcmp(argv[1], "--stralnumcmp") == 0) {
|
||||||
|
printf("%s\n", ul_stralnumcmp(argv[2], argv[3]) == 0 ?
|
||||||
|
"match" : "dismatch");
|
||||||
|
return EXIT_SUCCESS;
|
||||||
|
|
||||||
|
} else if (argc == 3 && strcmp(argv[1], "--normalize") == 0)
|
||||||
return test_strutils_normalize(argc - 1, argv + 1);
|
return test_strutils_normalize(argc - 1, argv + 1);
|
||||||
|
|
||||||
else {
|
else {
|
||||||
fprintf(stderr, "usage: %1$s --size <number>[suffix]\n"
|
fprintf(stderr, "usage: %1$s --size <number>[suffix]\n"
|
||||||
" %1$s --cmp-paths <path> <path>\n"
|
" %1$s --cmp-paths <path> <path>\n"
|
||||||
" %1$s --strdup-member <str> <str>\n"
|
" %1$s --strdup-member <str> <str>\n"
|
||||||
|
" %1$s --stralnumcmp <str> <str>\n"
|
||||||
" %1$s --normalize <str>\n",
|
" %1$s --normalize <str>\n",
|
||||||
argv[0]);
|
argv[0]);
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
|
|
Loading…
Reference in New Issue