#include <arpa/inet.h>
#include <atalk/unicode.h>
+#include <atalk/byteorder.h>
+
#include "precompose.h"
-#include "byteorder.h"
/*******************************************************************
Convert a string to lower case.
while (*s) {
if ((0xD800 <= *s) && (*s < 0xDC00)) {
if ((0xDC00 <= s[1]) && (s[1] < 0xE000)) {
- u_int32_t s_sp = (u_int32_t)*s << 16 | (u_int32_t)s[1];
- u_int32_t v_sp = tolower_sp(s_sp);
+ uint32_t s_sp = (uint32_t)*s << 16 | (uint32_t)s[1];
+ uint32_t v_sp = tolower_sp(s_sp);
if (v_sp != s_sp) {
*s = v_sp >> 16;
s++;
while (*s) {
if ((0xD800 <= *s) && (*s < 0xDC00)) {
if ((0xDC00 <= s[1]) && (s[1] < 0xE000)) {
- u_int32_t s_sp = (u_int32_t)*s << 16 | (u_int32_t)s[1];
- u_int32_t v_sp = toupper_sp(s_sp);
+ uint32_t s_sp = (uint32_t)*s << 16 | (uint32_t)s[1];
+ uint32_t v_sp = toupper_sp(s_sp);
if (v_sp != s_sp) {
*s = v_sp >> 16;
s++;
return ( c == tolower_w(c));
}
-int islower_sp(u_int32_t c_sp)
+int islower_sp(uint32_t c_sp)
{
return ( c_sp == tolower_sp(c_sp));
}
return ( c == toupper_w(c));
}
-int isupper_sp(u_int32_t c_sp)
+int isupper_sp(uint32_t c_sp)
{
return ( c_sp == toupper_sp(c_sp));
}
ucs2_t *strcasechr_w(const ucs2_t *s, ucs2_t c)
{
while (*s != 0) {
-/* LOG(log_debug, logtype_default, "Comparing %X to %X (%X - %X)", c, *s, toupper_w(c), toupper_w(*s));*/
- if (toupper_w(c) == toupper_w(*s)) return (ucs2_t *)s;
+ if (tolower_w(c) == tolower_w(*s)) return (ucs2_t *)s;
s++;
}
if (c == *s) return (ucs2_t *)s;
return NULL;
}
-ucs2_t *strcasechr_sp(const ucs2_t *s, u_int32_t c_sp)
+ucs2_t *strcasechr_sp(const ucs2_t *s, uint32_t c_sp)
{
if (*s == 0) return NULL;
while (s[1] != 0) {
- if (toupper_sp(c_sp) == toupper_sp((u_int32_t)*s << 16 | (u_int32_t)s[1])) return (ucs2_t *)s;
+ if (tolower_sp(c_sp) == tolower_sp((uint32_t)*s << 16 | (uint32_t)s[1])) return (ucs2_t *)s;
s++;
}
/*******************************************************************
wide strcasestr()
********************************************************************/
-/* */
+/* surrogate pair support */
ucs2_t *strcasestr_w(const ucs2_t *s, const ucs2_t *ins)
{
slen = strlen_w(s);
inslen = strlen_w(ins);
r = (ucs2_t *)s;
- while ((r = strcasechr_w(r, *ins))) {
- if (strncasecmp_w(r, ins, inslen) == 0) return r;
- r++;
+
+ if ((0xD800 <= *ins) && (*ins < 0xDC00)) {
+ if ((0xDC00 <= ins[1]) && (ins[1] < 0xE000)) {
+ uint32_t ins_sp = (uint32_t)*ins << 16 | (uint32_t)ins[1];
+ while ((r = strcasechr_sp(r, ins_sp))) {
+ if (strncasecmp_w(r, ins, inslen) == 0) return r;
+ r++;
+ }
+ } else {
+ return NULL; /* illegal sequence */
+ }
+ } else {
+ while ((r = strcasechr_w(r, *ins))) {
+ if (strncasecmp_w(r, ins, inslen) == 0) return r;
+ r++;
+ }
}
return NULL;
}
while (*a && *b) {
if ((0xD800 <= *a) && (*a < 0xDC00)) {
- if (ret = tolower_sp((u_int32_t)*a << 16 | (u_int32_t)a[1]) - tolower_sp((u_int32_t)*b << 16 | (u_int32_t)b[1])) return ret;
+ if (ret = tolower_sp((uint32_t)*a << 16 | (uint32_t)a[1]) - tolower_sp((uint32_t)*b << 16 | (uint32_t)b[1])) return ret;
a++;
b++;
if (!(*a && *b)) return (tolower_w(*a) - tolower_w(*b)); /* avoid buffer over run */
while ((n < len) && *a && *b) {
if ((0xD800 <= *a) && (*a < 0xDC00)) {
- if (ret = tolower_sp((u_int32_t)*a << 16 | (u_int32_t)a[1]) - tolower_sp((u_int32_t)*b << 16 | (u_int32_t)b[1])) return ret;
+ if (ret = tolower_sp((uint32_t)*a << 16 | (uint32_t)a[1]) - tolower_sp((uint32_t)*b << 16 | (uint32_t)b[1])) return ret;
a++;
b++;
n++;
/*******************************************************************
copy a string with max len
********************************************************************/
+/* This function is not used. */
+/* NOTE: not check isolation of surrogate pair */
ucs2_t *strncpy_w(ucs2_t *dest, const ucs2_t *src, const size_t max)
{
/*******************************************************************
append a string of len bytes and add a terminator
********************************************************************/
+/* These functions are not used. */
+/* NOTE: not check isolation of surrogate pair */
ucs2_t *strncat_w(ucs2_t *dest, const ucs2_t *src, const size_t max)
{
size_t start;
return dest;
}
-
+/* no problem of surrogate pair */
ucs2_t *strcat_w(ucs2_t *dest, const ucs2_t *src)
{
size_t start;
base = *in;
while (*outlen > 2) {
i += 2;
- in++;
-
if (i == inplen) {
*out = base;
out++;
*outlen -= 2;
return o_len - *outlen;
}
-
+ in++;
comb = *in;
result = 0;
/* Binary Search for Surrogate Pair */
else if ((0xD800 <= base) && (base < 0xDC00)) {
- if ((0xDC00 <= comb) && (comb < 0xE000) && (i + 4 <= inplen)) {
+ if ((0xDC00 <= comb) && (comb < 0xE000) && (i + 6 <= inplen)) {
base_sp = ((uint32_t)base << 16) | (uint32_t)comb;
do {
comb_sp = ((uint32_t)in[1] << 16) | (uint32_t)in[2];
i += 4;
in +=2;
}
- } while ((i + 4 <= inplen) && result_sp) ;
+ } while ((i + 6 <= inplen) && result_sp) ;
*out = base_sp >> 16;
out++;
*outlen -= 2;
i += 2;
+ if (i == inplen) {
+ out++;
+ *out = 0;
+ return o_len - *outlen;
+ }
in++;
base = *in;