summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2010-11-06 10:16:59 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2010-11-06 10:16:59 +0800
commit2bff4e23f70b50c723be12dfd5f5e615bb75e4c0 (patch)
tree3f916ef4990db99007421a1e65e9bc5da3fc0c3f
parentaae80fce2c6c58d993ea524a12b7a0b8286d6f67 (diff)
downloadpttbbs-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.c53
-rw-r--r--pttbbs/include/cmsys.h4
-rw-r--r--pttbbs/mbbsd/pmore.c4
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);