diff options
author | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2010-11-06 10:16:59 +0800 |
---|---|---|
committer | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2010-11-06 10:16:59 +0800 |
commit | 2bff4e23f70b50c723be12dfd5f5e615bb75e4c0 (patch) | |
tree | 3f916ef4990db99007421a1e65e9bc5da3fc0c3f | |
parent | aae80fce2c6c58d993ea524a12b7a0b8286d6f67 (diff) | |
download | pttbbs-2bff4e23f70b50c723be12dfd5f5e615bb75e4c0.tar pttbbs-2bff4e23f70b50c723be12dfd5f5e615bb75e4c0.tar.gz pttbbs-2bff4e23f70b50c723be12dfd5f5e615bb75e4c0.tar.bz2 pttbbs-2bff4e23f70b50c723be12dfd5f5e615bb75e4c0.tar.lz pttbbs-2bff4e23f70b50c723be12dfd5f5e615bb75e4c0.tar.xz pttbbs-2bff4e23f70b50c723be12dfd5f5e615bb75e4c0.tar.zst pttbbs-2bff4e23f70b50c723be12dfd5f5e615bb75e4c0.zip |
add DBCS-safe strncasecmp to pmore
git-svn-id: http://opensvn.csie.org/pttbbs/trunk@5206 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r-- | pttbbs/common/sys/string.c | 53 | ||||
-rw-r--r-- | pttbbs/include/cmsys.h | 4 | ||||
-rw-r--r-- | pttbbs/mbbsd/pmore.c | 4 |
3 files changed, 49 insertions, 12 deletions
diff --git a/pttbbs/common/sys/string.c b/pttbbs/common/sys/string.c index 7b071ba7..1d0aa3a9 100644 --- a/pttbbs/common/sys/string.c +++ b/pttbbs/common/sys/string.c @@ -323,24 +323,31 @@ int DBCS_RemoveIntrEscape(unsigned char *buf, int *len) } /** + * DBCS_NextStatus(c, prev_status): 取得 c 的 DBCS 狀態 + */ +int +DBCS_NextStatus(char c, int prev_status) { + if(prev_status == DBCS_LEADING) + return DBCS_TRAILING; + if ((unsigned char)c >= 0x80) + return DBCS_LEADING; + return prev_status = DBCS_ASCII; +} + +/** * DBCS_Status(dbcstr, pos): 取得字串中指定位置的 DBCS 狀態。 + * 若 pos 超過結尾則傳回最後一個字元的 DBCS status */ int DBCS_Status(const char *dbcstr, int pos) { int sts = DBCS_ASCII; - const unsigned char *s = (const unsigned char*)dbcstr; + char c; - while(pos >= 0) - { - if(sts == DBCS_LEADING) - sts = DBCS_TRAILING; - else if (*s >= 0x80) - { - sts = DBCS_LEADING; - } else { - sts = DBCS_ASCII; - } - s++, pos--; + while (pos-- >= 0) { + c = *dbcstr++; + sts = DBCS_NextStatus(c, sts); + if (c == 0) + break; } return sts; } @@ -359,6 +366,7 @@ void DBCS_safe_trim(char *dbcstr) char * DBCS_strcasestr(const char* pool, const char *ptr) { + // TODO rewrite this with DBCS_Status int i = 0, i2 = 0, found = 0, szpool = strlen(pool), szptr = strlen(ptr); @@ -403,6 +411,27 @@ DBCS_strcasestr(const char* pool, const char *ptr) return NULL; } +/* + * DBCS_strncasecmp(s1, s2, len): 比較 s1/s2 (只忽略英文大小寫) + */ +int +DBCS_strncasecmp(const char *s1, const char *s2, size_t len) { + // quick return by strncasecmp + int r = strncasecmp(s1, s2, len); + int sts1 = DBCS_ASCII, sts2 = DBCS_ASCII; + if (r != 0) + return r; + + while (len-- > 0) { + char c1 = *s1++, c2 = *s2++; + sts1 = DBCS_NextStatus(c1, sts1); + sts2 = DBCS_NextStatus(c2, sts2); + if (sts1 != DBCS_ASCII && c1 != c2) + return (unsigned char)c1 - (unsigned char)c2; + } + return 0; +} + /* ----------------------------------------------------- */ /* 字串檢查函數:英文、數字、檔名、E-mail address */ /* ----------------------------------------------------- */ diff --git a/pttbbs/include/cmsys.h b/pttbbs/include/cmsys.h index 1d129493..f80bbd8d 100644 --- a/pttbbs/include/cmsys.h +++ b/pttbbs/include/cmsys.h @@ -110,9 +110,13 @@ extern char * qp_encode (char *s, size_t slen, const char *d, const char *tocode extern unsigned StringHash(const char *s); /* DBCS utilities */ extern int DBCS_RemoveIntrEscape(unsigned char *buf, int *len); +extern int DBCS_NextStatus(char c, int prev_status); extern int DBCS_Status(const char *dbcstr, int pos); extern void DBCS_safe_trim(char *dbcstr); extern char * DBCS_strcasestr(const char* pool, const char *ptr); +extern int DBCS_strncasecmp(const char *s1, const char *s2, size_t len); +#define HAVE_DBCS_STRCASESTR +#define HAVE_DBCS_STRNCASECMP extern size_t str_iconv( const char *fromcode, /* charset of source string */ const char *tocode, /* charset of destination string */ diff --git a/pttbbs/mbbsd/pmore.c b/pttbbs/mbbsd/pmore.c index aaa7f2b5..a577d875 100644 --- a/pttbbs/mbbsd/pmore.c +++ b/pttbbs/mbbsd/pmore.c @@ -2669,7 +2669,11 @@ pmore2( else if (*ans == 'q') sbuf[0] = 0; else +#ifdef HAVE_DBCS_STRNCASECMP + sr.cmpfunc = DBCS_strncasecmp; +#else sr.cmpfunc = strncasecmp; +#endif } sr.len = strlen(sbuf); if(sr.len) sr.search_str = (unsigned char*)strdup(sbuf); |