summaryrefslogtreecommitdiffstats
path: root/mbbsd
diff options
context:
space:
mode:
Diffstat (limited to 'mbbsd')
-rw-r--r--mbbsd/friend.c2
-rw-r--r--mbbsd/stuff.c25
-rw-r--r--mbbsd/talk.c27
3 files changed, 34 insertions, 20 deletions
diff --git a/mbbsd/friend.c b/mbbsd/friend.c
index 8205686d..ab9f1076 100644
--- a/mbbsd/friend.c
+++ b/mbbsd/friend.c
@@ -271,7 +271,9 @@ friend_load(int type)
myfriends[friendcount++] = unum;
fclose(fp);
}
+ qsort(myfriends, friendcount, sizeof(int), qsort_intcompar);
memcpy(currutmp->friend, myfriends, sizeof(myfriends));
+ currutmp->nFriends = friendcount;
}
if (!type || type & FRIEND_REJECT) {
diff --git a/mbbsd/stuff.c b/mbbsd/stuff.c
index d8201330..a6aaec46 100644
--- a/mbbsd/stuff.c
+++ b/mbbsd/stuff.c
@@ -663,3 +663,28 @@ StringHash(unsigned char *s)
}
return (v * 2654435769UL) >> (32 - HASH_BITS);
}
+
+inline int *intbsearch(int key, int *base0, int nmemb)
+{
+ /* 改自 /usr/src/lib/libc/stdlib/bsearch.c ,
+ 專給搜 int array 用的, 不透過 compar function 故較快些 */
+ const char *base = (char *)base0;
+ size_t lim;
+ int *p;
+
+ for (lim = nmemb; lim != 0; lim >>= 1) {
+ p = (int *)(base + (lim >> 1) * 4);
+ if( key == *p )
+ return p;
+ if( key > *p ){/* key > p: move right */
+ base = (char *)p + 4;
+ lim--;
+ } /* else move left */
+ }
+ return (NULL);
+}
+
+int qsort_intcompar(const void *a, const void *b)
+{
+ return *(int *)a - *(int *)b;
+}
diff --git a/mbbsd/talk.c b/mbbsd/talk.c
index a576fbf4..9633570d 100644
--- a/mbbsd/talk.c
+++ b/mbbsd/talk.c
@@ -155,33 +155,20 @@ modestring(userinfo_t * uentp, int simple)
int
set_friend_bit(userinfo_t * me, userinfo_t * ui)
{
- int unum, *myfriends, hit = 0, n;
+ int unum, *myfriends, hit = 0;
/* 判斷對方是否為我的朋友 ? */
- unum = ui->uid;
- myfriends = me->friend;
- while ((n = *myfriends++)) {
- if (unum == n) {
- hit = IFH;
- break;
- }
- }
+ if( intbsearch(ui->uid, me->friend, me->nFriends) )
+ hit = IFH;
/* 判斷我是否為對方的朋友 ? */
- myfriends = ui->friend;
- while ((unum = *myfriends++)) {
- if (unum == me->uid) {
- hit |= HFM;
- break;
- }
- }
+ if( intbsearch(me->uid, ui->friend, ui->nFriends) )
+ hit |= HFM;
/* 判斷對方是否為我的仇人 ? */
-
- unum = ui->uid;
myfriends = me->reject;
- while ((n = *myfriends++)) {
- if (unum == n) {
+ while ((unum = *myfriends++)) {
+ if (unum == ui->uid) {
hit |= IRH;
break;
}