1
1

turn string functions that don't take length arguments into wrappers for

the versions that take length arguments, add multibyte equivalent of
strlen(), and fix potential segfault in mbstrnlen()


git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2300 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
Этот коммит содержится в:
David Lawrence Ramsey 2005-01-25 19:21:11 +00:00
родитель 14ace1711d
Коммит 3f9c63589e
3 изменённых файлов: 35 добавлений и 73 удалений

Просмотреть файл

@ -97,22 +97,23 @@ CVS code -
is_alnum_mbchar(), is_alnum_wchar(), is_blank_mbchar(),
is_blank_wchar(), is_cntrl_mbchar(), is_cntrl_wchar(),
control_mbrep(), control_wrep(), mbwidth(), mb_cur_max(),
make_mbchar(), mbstrnlen(), mbstrcasecmp(), mbstrncasecmp(),
mbstrcasestr(), and mbrevstrcasestr(); changes to is_byte()
(moved to chars.c), is_blank_char() (moved to chars.c),
is_cntrl_char() (moved to chars.c), nstricmp() (renamed
nstrcasecmp() and moved to chars.c), nstrnicmp() (renamed
nstrncasecmp() and moved to chars.c), nstristr() (renamed
nstrcasestr() and moved to chars.c), revstrstr() (moved to
chars.c), revstristr() (renamed revstrcasestr() and moved to
chars.c), nstrnlen() (moved to chars.c), parse_char()
(renamed parse_mbchar() and moved to chars.c), move_left()
(renamed move_mbleft() and moved to chars.c), move_right()
(renamed move_mbright() and moved to chars.c), do_home(),
do_verbatim_input(), do_delete(), do_tab(), do_next_word(),
do_prev_word(), do_input(), do_output(), strstrwrapper(),
get_buffer(), unget_input(), unget_kbinput(), get_input(),
parse_kbinput(), unparse_kbinput(), parse_verbatim_kbinput(),
make_mbchar(), mbstrlen(), mbstrnlen(), mbstrcasecmp(),
mbstrncasecmp(), mbstrcasestr(), and mbrevstrcasestr();
changes to is_byte() (moved to chars.c), is_blank_char()
(moved to chars.c), is_cntrl_char() (moved to chars.c),
nstricmp() (renamed nstrcasecmp() and moved to chars.c),
nstrnicmp() (renamed nstrncasecmp() and moved to chars.c),
nstristr() (renamed nstrcasestr() and moved to chars.c),
revstrstr() (moved to chars.c), revstristr() (renamed
revstrcasestr() and moved to chars.c), nstrnlen() (moved to
chars.c), parse_char() (renamed parse_mbchar() and moved to
chars.c), move_left() (renamed move_mbleft() and moved to
chars.c), move_right() (renamed move_mbright() and moved to
chars.c), do_home(), do_verbatim_input(), do_delete(),
do_tab(), do_next_word(), do_prev_word(), do_input(),
do_output(), strstrwrapper(), get_buffer(), unget_input(),
unget_kbinput(), get_input(), parse_kbinput(),
unparse_kbinput(), parse_verbatim_kbinput(),
do_statusbar_input(), do_statusbar_home(),
do_statusbar_verbatim_kbinput(), do_statusbar_output(), and
display_string(); removal of buffer_to_keys() and

Просмотреть файл

@ -436,66 +436,19 @@ size_t move_mbright(const char *buf, size_t pos)
/* This function is equivalent to strcasecmp(). */
int nstrcasecmp(const char *s1, const char *s2)
{
assert(s1 != NULL && s2 != NULL);
for (; *s1 != '\0' && *s2 != '\0'; s1++, s2++) {
if (tolower(*s1) != tolower(*s2))
break;
}
return (tolower(*s1) - tolower(*s2));
return
#ifdef HAVE_STRNCASECMP
strncasecmp(s1, s2, (size_t)-1);
#else
nstrncasecmp(s1, s2, (size_t)-1);
#endif
}
#endif
/* This function is equivalent to strcasecmp() for multibyte strings. */
int mbstrcasecmp(const char *s1, const char *s2)
{
#ifdef NANO_WIDE
if (!ISSET(NO_UTF8)) {
char *s1_mb = charalloc(MB_CUR_MAX);
char *s2_mb = charalloc(MB_CUR_MAX);
wchar_t ws1, ws2;
assert(s1 != NULL && s2 != NULL);
while (*s1 != '\0' && *s2 != '\0') {
int s1_mb_len, s2_mb_len;
s1_mb_len = parse_mbchar(s1, s1_mb, NULL, NULL);
if (mbtowc(&ws1, s1_mb, s1_mb_len) <= 0) {
mbtowc(NULL, NULL, 0);
ws1 = (unsigned char)*s1_mb;
}
s2_mb_len = parse_mbchar(s2, s2_mb, NULL, NULL);
if (mbtowc(&ws2, s2_mb, s2_mb_len) <= 0) {
mbtowc(NULL, NULL, 0);
ws2 = (unsigned char)*s2_mb;
}
if (towlower(ws1) != towlower(ws2))
break;
s1 += s1_mb_len;
s2 += s2_mb_len;
}
free(s1_mb);
free(s2_mb);
return (towlower(ws1) - towlower(ws2));
} else
#endif
return
#ifdef HAVE_STRCASECMP
strcasecmp(s1, s2);
#else
nstrcasecmp(s1, s2);
#endif
return mbstrncasecmp(s1, s2, (size_t)-1);
}
#ifndef HAVE_STRNCASECMP
@ -752,6 +705,12 @@ const char *mbrevstrcasestr(const char *haystack, const char *needle,
}
#endif
/* This function is equivalent to strlen() for multibyte strings. */
size_t mbstrlen(const char *s)
{
return mbstrnlen(s, (size_t)-1);
}
#ifndef HAVE_STRNLEN
/* This function is equivalent to strnlen(). */
size_t nstrnlen(const char *s, size_t maxlen)
@ -779,18 +738,19 @@ size_t mbstrnlen(const char *s, size_t maxlen)
int s_mb_len;
while (*s != '\0') {
s_mb_len = parse_mbchar(s + n, s_mb, NULL, NULL);
s_mb_len = parse_mbchar(s, s_mb, NULL, NULL);
if (maxlen == 0)
break;
maxlen--;
n += s_mb_len;
s += s_mb_len;
n++;
}
free(s_mb);
return strnlenpt(s, n);
return n;
} else
#endif
return

Просмотреть файл

@ -202,6 +202,7 @@ const char *revstrcasestr(const char *haystack, const char *needle,
const char *mbrevstrcasestr(const char *haystack, const char *needle,
const char *rev_start);
#endif
size_t mbstrlen(const char *s);
#ifndef HAVE_STRNLEN
size_t nstrnlen(const char *s, size_t maxlen);
#endif