73 lines
1.2 KiB
C
73 lines
1.2 KiB
C
|
|
#include "pl-incl.h"
|
|
#include "pl-ctype.h"
|
|
|
|
#ifndef HAVE_STRICMP
|
|
int
|
|
stricmp(const char *s1, const char *s2)
|
|
{ while(*s1 && makeLower(*s1) == makeLower(*s2))
|
|
s1++, s2++;
|
|
|
|
return makeLower(*s1) - makeLower(*s2);
|
|
}
|
|
#endif
|
|
|
|
#if !defined(HAVE_MBSCOLL) || !defined(HAVE_MBCASESCOLL)
|
|
static void
|
|
wstolower(wchar_t *w, size_t len)
|
|
{ wchar_t *e = &w[len];
|
|
|
|
for( ; w<e; w++ )
|
|
*w = towlower(*w);
|
|
}
|
|
|
|
static int
|
|
int_mbscoll(const char *s1, const char *s2, int icase)
|
|
{ size_t l1 = strlen(s1);
|
|
size_t l2 = strlen(s2);
|
|
wchar_t *w1;
|
|
wchar_t *w2;
|
|
int ml1, ml2;
|
|
mbstate_t mbs;
|
|
int rc;
|
|
|
|
if ( l1 < 1024 && (w1 = alloca(sizeof(wchar_t)*(l1+1))) )
|
|
{ ml1 = FALSE;
|
|
} else
|
|
{ w1 = PL_malloc(sizeof(wchar_t)*(l1+1));
|
|
ml1 = TRUE;
|
|
}
|
|
if ( l2 < 1024 && (w2 = alloca(sizeof(wchar_t)*(l2+1))) )
|
|
{ ml2 = FALSE;
|
|
} else
|
|
{ w2 = PL_malloc(sizeof(wchar_t)*(l2+1));
|
|
ml2 = TRUE;
|
|
}
|
|
|
|
memset(&mbs, 0, sizeof(mbs));
|
|
if ( mbsrtowcs(w1, &s1, l1+1, &mbs) == (size_t)-1 )
|
|
{ rc = -2;
|
|
goto out;
|
|
}
|
|
if ( mbsrtowcs(w2, &s2, l2+1, &mbs) == (size_t)-1 )
|
|
{ rc = 2;
|
|
goto out;
|
|
}
|
|
if ( icase )
|
|
{ wstolower(w1, l1);
|
|
wstolower(w2, l2);
|
|
}
|
|
|
|
rc = wcscoll(w1, w2);
|
|
|
|
out:
|
|
if ( ml1 ) PL_free(w1);
|
|
if ( ml2 ) PL_free(w2);
|
|
|
|
return rc;
|
|
}
|
|
#endif
|
|
|
|
|
|
|