still more cleanups to chars.c and related code
git-svn-id: svn://svn.savannah.gnu.org/nano/trunk/nano@2648 35c25a1d-7b9e-4130-9fde-d3aeb78583b8
Этот коммит содержится в:
родитель
8b698f4a29
Коммит
7b601fdbe1
@ -55,11 +55,14 @@ CVS code -
|
|||||||
main(), search_init(), nanorc.sample, nano.1, nanorc.5,
|
main(), search_init(), nanorc.sample, nano.1, nanorc.5,
|
||||||
nano.texi, etc. (DLR)
|
nano.texi, etc. (DLR)
|
||||||
- Various cleanups in chars.c. Remove some unnecessary (w)ctype
|
- Various cleanups in chars.c. Remove some unnecessary (w)ctype
|
||||||
wrappers, change other ctype wrappers to take wint_t instead
|
wrappers; change other ctype wrappers to take wint_t instead
|
||||||
of wchar_t, and rename some functions for consistency. Changes
|
of wchar_t; rename some functions for consistency; and don't
|
||||||
|
count matches between valid and invalid multibyte sequences
|
||||||
|
anymore, as it causes problems when doing a replace. Changes
|
||||||
to is_alnum_mbchar(), is_blank_char() (renamed nisblank()),
|
to is_alnum_mbchar(), is_blank_char() (renamed nisblank()),
|
||||||
is_blank_mbchar(), is_blank_wchar() (renamed niswblank()),
|
is_blank_mbchar(), is_blank_wchar() (renamed niswblank()),
|
||||||
is_cntrl_wchar(), control_rep(), control_mbrep(), etc.;
|
is_cntrl_wchar(), control_rep(), control_mbrep(),
|
||||||
|
mbstrncasecmp(), mbstrcasestr(), mbrevstrcasestr(), etc.;
|
||||||
removal of is_alnum_char() and is_alnum_wchar(). (DLR)
|
removal of is_alnum_char() and is_alnum_wchar(). (DLR)
|
||||||
- Implement word count via Meta-D at the main window. Note that
|
- Implement word count via Meta-D at the main window. Note that
|
||||||
this is disabled when NANO_SMALL is defined. New functions
|
this is disabled when NANO_SMALL is defined. New functions
|
||||||
|
59
src/chars.c
59
src/chars.c
@ -201,17 +201,15 @@ char *control_mbrep(const char *c, char *crep, int *crep_len)
|
|||||||
}
|
}
|
||||||
|
|
||||||
*crep_len = crep_mb_len;
|
*crep_len = crep_mb_len;
|
||||||
|
|
||||||
return crep;
|
|
||||||
} else {
|
} else {
|
||||||
#endif
|
#endif
|
||||||
*crep_len = 1;
|
*crep_len = 1;
|
||||||
*crep = control_rep(*c);
|
*crep = control_rep(*c);
|
||||||
|
|
||||||
return crep;
|
|
||||||
#ifdef NANO_WIDE
|
#ifdef NANO_WIDE
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
return crep;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function is equivalent to wcwidth() for multibyte characters. */
|
/* This function is equivalent to wcwidth() for multibyte characters. */
|
||||||
@ -244,7 +242,7 @@ int mb_cur_max(void)
|
|||||||
{
|
{
|
||||||
return
|
return
|
||||||
#ifdef NANO_WIDE
|
#ifdef NANO_WIDE
|
||||||
!ISSET(NO_UTF8) ? MB_CUR_MAX :
|
(!ISSET(NO_UTF8)) ? MB_CUR_MAX :
|
||||||
#endif
|
#endif
|
||||||
1;
|
1;
|
||||||
}
|
}
|
||||||
@ -295,12 +293,12 @@ char *make_mbstring(const char *str)
|
|||||||
size_t str_mb_len = 0;
|
size_t str_mb_len = 0;
|
||||||
|
|
||||||
while (*str != '\0') {
|
while (*str != '\0') {
|
||||||
bool bad_char;
|
bool bad_chr;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
chr_mb_len = parse_mbchar(str, chr_mb, &bad_char, NULL);
|
chr_mb_len = parse_mbchar(str, chr_mb, &bad_chr, NULL);
|
||||||
|
|
||||||
if (bad_char) {
|
if (bad_chr) {
|
||||||
char *bad_chr_mb;
|
char *bad_chr_mb;
|
||||||
int bad_chr_mb_len;
|
int bad_chr_mb_len;
|
||||||
|
|
||||||
@ -329,7 +327,7 @@ char *make_mbstring(const char *str)
|
|||||||
#endif
|
#endif
|
||||||
return mallocstrcpy(NULL, str);
|
return mallocstrcpy(NULL, str);
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* ENABLE_NANORC || NANO_EXTRA */
|
||||||
|
|
||||||
/* Parse a multibyte character from buf. Return the number of bytes
|
/* Parse a multibyte character from buf. Return the number of bytes
|
||||||
* used. If chr isn't NULL, store the multibyte character in it. If
|
* used. If chr isn't NULL, store the multibyte character in it. If
|
||||||
@ -483,7 +481,7 @@ int nstrncasecmp(const char *s1, const char *s2, size_t n)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (n > 0)
|
if (n > 0)
|
||||||
return (tolower(*s1) - tolower(*s2));
|
return tolower(*s1) - tolower(*s2);
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -502,6 +500,7 @@ int mbstrncasecmp(const char *s1, const char *s2, size_t n)
|
|||||||
assert(s1 != NULL && s2 != NULL);
|
assert(s1 != NULL && s2 != NULL);
|
||||||
|
|
||||||
while (n > 0 && *s1 != '\0' && *s2 != '\0') {
|
while (n > 0 && *s1 != '\0' && *s2 != '\0') {
|
||||||
|
bool bad_s1_mb = FALSE, bad_s2_mb = FALSE;
|
||||||
int s1_mb_len, s2_mb_len;
|
int s1_mb_len, s2_mb_len;
|
||||||
|
|
||||||
s1_mb_len = parse_mbchar(s1, s1_mb, NULL, NULL);
|
s1_mb_len = parse_mbchar(s1, s1_mb, NULL, NULL);
|
||||||
@ -509,6 +508,7 @@ int mbstrncasecmp(const char *s1, const char *s2, size_t n)
|
|||||||
if (mbtowc(&ws1, s1_mb, s1_mb_len) <= 0) {
|
if (mbtowc(&ws1, s1_mb, s1_mb_len) <= 0) {
|
||||||
mbtowc(NULL, NULL, 0);
|
mbtowc(NULL, NULL, 0);
|
||||||
ws1 = (unsigned char)*s1_mb;
|
ws1 = (unsigned char)*s1_mb;
|
||||||
|
bad_s1_mb = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
s2_mb_len = parse_mbchar(s2, s2_mb, NULL, NULL);
|
s2_mb_len = parse_mbchar(s2, s2_mb, NULL, NULL);
|
||||||
@ -516,9 +516,11 @@ int mbstrncasecmp(const char *s1, const char *s2, size_t n)
|
|||||||
if (mbtowc(&ws2, s2_mb, s2_mb_len) <= 0) {
|
if (mbtowc(&ws2, s2_mb, s2_mb_len) <= 0) {
|
||||||
mbtowc(NULL, NULL, 0);
|
mbtowc(NULL, NULL, 0);
|
||||||
ws2 = (unsigned char)*s2_mb;
|
ws2 = (unsigned char)*s2_mb;
|
||||||
|
bad_s2_mb = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (n == 0 || towlower(ws1) != towlower(ws2))
|
if (n == 0 || bad_s1_mb != bad_s2_mb ||
|
||||||
|
towlower(ws1) != towlower(ws2))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
s1 += s1_mb_len;
|
s1 += s1_mb_len;
|
||||||
@ -529,7 +531,7 @@ int mbstrncasecmp(const char *s1, const char *s2, size_t n)
|
|||||||
free(s1_mb);
|
free(s1_mb);
|
||||||
free(s2_mb);
|
free(s2_mb);
|
||||||
|
|
||||||
return (towlower(ws1) - towlower(ws2));
|
return towlower(ws1) - towlower(ws2);
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
return strncasecmp(s1, s2, n);
|
return strncasecmp(s1, s2, n);
|
||||||
@ -573,11 +575,14 @@ const char *mbstrcasestr(const char *haystack, const char *needle)
|
|||||||
int r_mb_len, q_mb_len;
|
int r_mb_len, q_mb_len;
|
||||||
|
|
||||||
while (*q != '\0') {
|
while (*q != '\0') {
|
||||||
|
bool bad_r_mb = FALSE, bad_q_mb = FALSE;
|
||||||
|
|
||||||
r_mb_len = parse_mbchar(r, r_mb, NULL, NULL);
|
r_mb_len = parse_mbchar(r, r_mb, NULL, NULL);
|
||||||
|
|
||||||
if (mbtowc(&wr, r_mb, r_mb_len) <= 0) {
|
if (mbtowc(&wr, r_mb, r_mb_len) <= 0) {
|
||||||
mbtowc(NULL, NULL, 0);
|
mbtowc(NULL, NULL, 0);
|
||||||
wr = (unsigned char)*r;
|
wr = (unsigned char)*r;
|
||||||
|
bad_r_mb = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
q_mb_len = parse_mbchar(q, q_mb, NULL, NULL);
|
q_mb_len = parse_mbchar(q, q_mb, NULL, NULL);
|
||||||
@ -585,9 +590,11 @@ const char *mbstrcasestr(const char *haystack, const char *needle)
|
|||||||
if (mbtowc(&wq, q_mb, q_mb_len) <= 0) {
|
if (mbtowc(&wq, q_mb, q_mb_len) <= 0) {
|
||||||
mbtowc(NULL, NULL, 0);
|
mbtowc(NULL, NULL, 0);
|
||||||
wq = (unsigned char)*q;
|
wq = (unsigned char)*q;
|
||||||
|
bad_q_mb = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (towlower(wr) != towlower(wq))
|
if (bad_r_mb != bad_q_mb ||
|
||||||
|
towlower(wr) != towlower(wq))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
r += r_mb_len;
|
r += r_mb_len;
|
||||||
@ -605,13 +612,14 @@ const char *mbstrcasestr(const char *haystack, const char *needle)
|
|||||||
free(r_mb);
|
free(r_mb);
|
||||||
free(q_mb);
|
free(q_mb);
|
||||||
|
|
||||||
return found_needle ? haystack : NULL;
|
return (found_needle) ? haystack : NULL;
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
return strcasestr(haystack, needle);
|
return strcasestr(haystack, needle);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if !defined(NANO_SMALL) || !defined(DISABLE_TABCOMP)
|
#ifndef NANO_SMALL
|
||||||
|
#ifndef DISABLE_TABCOMP
|
||||||
/* This function is equivalent to strstr(), except in that it scans the
|
/* This function is equivalent to strstr(), except in that it scans the
|
||||||
* string in reverse, starting at rev_start. */
|
* string in reverse, starting at rev_start. */
|
||||||
const char *revstrstr(const char *haystack, const char *needle, const
|
const char *revstrstr(const char *haystack, const char *needle, const
|
||||||
@ -631,9 +639,8 @@ const char *revstrstr(const char *haystack, const char *needle, const
|
|||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* !DISABLE_TABCOMP */
|
||||||
|
|
||||||
#ifndef NANO_SMALL
|
|
||||||
/* This function is equivalent to strcasestr(), except in that it scans
|
/* This function is equivalent to strcasestr(), except in that it scans
|
||||||
* the string in reverse, starting at rev_start. */
|
* the string in reverse, starting at rev_start. */
|
||||||
const char *revstrcasestr(const char *haystack, const char *needle,
|
const char *revstrcasestr(const char *haystack, const char *needle,
|
||||||
@ -674,11 +681,14 @@ const char *mbrevstrcasestr(const char *haystack, const char *needle,
|
|||||||
int r_mb_len, q_mb_len;
|
int r_mb_len, q_mb_len;
|
||||||
|
|
||||||
while (*q != '\0') {
|
while (*q != '\0') {
|
||||||
|
bool bad_r_mb = FALSE, bad_q_mb = FALSE;
|
||||||
|
|
||||||
r_mb_len = parse_mbchar(r, r_mb, NULL, NULL);
|
r_mb_len = parse_mbchar(r, r_mb, NULL, NULL);
|
||||||
|
|
||||||
if (mbtowc(&wr, r_mb, r_mb_len) <= 0) {
|
if (mbtowc(&wr, r_mb, r_mb_len) <= 0) {
|
||||||
mbtowc(NULL, NULL, 0);
|
mbtowc(NULL, NULL, 0);
|
||||||
wr = (unsigned char)*r;
|
wr = (unsigned char)*r;
|
||||||
|
bad_r_mb = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
q_mb_len = parse_mbchar(q, q_mb, NULL, NULL);
|
q_mb_len = parse_mbchar(q, q_mb, NULL, NULL);
|
||||||
@ -686,9 +696,11 @@ const char *mbrevstrcasestr(const char *haystack, const char *needle,
|
|||||||
if (mbtowc(&wq, q_mb, q_mb_len) <= 0) {
|
if (mbtowc(&wq, q_mb, q_mb_len) <= 0) {
|
||||||
mbtowc(NULL, NULL, 0);
|
mbtowc(NULL, NULL, 0);
|
||||||
wq = (unsigned char)*q;
|
wq = (unsigned char)*q;
|
||||||
|
bad_q_mb = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (towlower(wr) != towlower(wq))
|
if (bad_r_mb != bad_q_mb ||
|
||||||
|
towlower(wr) != towlower(wq))
|
||||||
break;
|
break;
|
||||||
|
|
||||||
r += r_mb_len;
|
r += r_mb_len;
|
||||||
@ -710,12 +722,12 @@ const char *mbrevstrcasestr(const char *haystack, const char *needle,
|
|||||||
free(r_mb);
|
free(r_mb);
|
||||||
free(q_mb);
|
free(q_mb);
|
||||||
|
|
||||||
return found_needle ? rev_start : NULL;
|
return (found_needle) ? rev_start : NULL;
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
return revstrcasestr(haystack, needle, rev_start);
|
return revstrcasestr(haystack, needle, rev_start);
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* !NANO_SMALL */
|
||||||
|
|
||||||
/* This function is equivalent to strlen() for multibyte strings. */
|
/* This function is equivalent to strlen() for multibyte strings. */
|
||||||
size_t mbstrlen(const char *s)
|
size_t mbstrlen(const char *s)
|
||||||
@ -746,11 +758,10 @@ size_t mbstrnlen(const char *s, size_t maxlen)
|
|||||||
#ifdef NANO_WIDE
|
#ifdef NANO_WIDE
|
||||||
if (!ISSET(NO_UTF8)) {
|
if (!ISSET(NO_UTF8)) {
|
||||||
size_t n = 0;
|
size_t n = 0;
|
||||||
char *s_mb = charalloc(MB_CUR_MAX);
|
|
||||||
int s_mb_len;
|
int s_mb_len;
|
||||||
|
|
||||||
while (*s != '\0') {
|
while (*s != '\0') {
|
||||||
s_mb_len = parse_mbchar(s, s_mb, NULL, NULL);
|
s_mb_len = parse_mbchar(s, NULL, NULL, NULL);
|
||||||
|
|
||||||
if (maxlen == 0)
|
if (maxlen == 0)
|
||||||
break;
|
break;
|
||||||
@ -760,8 +771,6 @@ size_t mbstrnlen(const char *s, size_t maxlen)
|
|||||||
n++;
|
n++;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(s_mb);
|
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
} else
|
} else
|
||||||
#endif
|
#endif
|
||||||
@ -811,4 +820,4 @@ char *mbstrchr(const char *s, char *c)
|
|||||||
#endif
|
#endif
|
||||||
return strchr(s, *c);
|
return strchr(s, *c);
|
||||||
}
|
}
|
||||||
#endif
|
#endif /* !DISABLE_JUSTIFY */
|
||||||
|
@ -201,8 +201,10 @@ const char *nstrcasestr(const char *haystack, const char *needle);
|
|||||||
#endif
|
#endif
|
||||||
const char *mbstrcasestr(const char *haystack, const char *needle);
|
const char *mbstrcasestr(const char *haystack, const char *needle);
|
||||||
#ifndef NANO_SMALL
|
#ifndef NANO_SMALL
|
||||||
|
#ifndef DISABLE_TABCOMP
|
||||||
const char *revstrstr(const char *haystack, const char *needle, const
|
const char *revstrstr(const char *haystack, const char *needle, const
|
||||||
char *rev_start);
|
char *rev_start);
|
||||||
|
#endif
|
||||||
const char *revstrcasestr(const char *haystack, const char *needle,
|
const char *revstrcasestr(const char *haystack, const char *needle,
|
||||||
const char *rev_start);
|
const char *rev_start);
|
||||||
const char *mbrevstrcasestr(const char *haystack, const char *needle,
|
const char *mbrevstrcasestr(const char *haystack, const char *needle,
|
||||||
|
Загрузка…
x
Ссылка в новой задаче
Block a user