diff options
author | ptt <ptt@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-11-17 14:22:29 +0800 |
---|---|---|
committer | ptt <ptt@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2004-11-17 14:22:29 +0800 |
commit | 1e4d4c78b043cf336ebd25634f5137a412539c8c (patch) | |
tree | 78ccad41cea3e9e5b99eaa1ea0c0ef3f39ccd0e6 /mbbsd | |
parent | 1f197b3f501e0b9412e7686ec6b26b8cf39f0213 (diff) | |
download | pttbbs-1e4d4c78b043cf336ebd25634f5137a412539c8c.tar pttbbs-1e4d4c78b043cf336ebd25634f5137a412539c8c.tar.gz pttbbs-1e4d4c78b043cf336ebd25634f5137a412539c8c.tar.bz2 pttbbs-1e4d4c78b043cf336ebd25634f5137a412539c8c.tar.lz pttbbs-1e4d4c78b043cf336ebd25634f5137a412539c8c.tar.xz pttbbs-1e4d4c78b043cf336ebd25634f5137a412539c8c.tar.zst pttbbs-1e4d4c78b043cf336ebd25634f5137a412539c8c.zip |
remove all pointers in SHM_t
git-svn-id: http://opensvn.csie.org/pttbbs/branches/ptt.linux@2336 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
Diffstat (limited to 'mbbsd')
-rw-r--r-- | mbbsd/bbs.c | 4 | ||||
-rw-r--r-- | mbbsd/board.c | 57 | ||||
-rw-r--r-- | mbbsd/cache.c | 20 |
3 files changed, 44 insertions, 37 deletions
diff --git a/mbbsd/bbs.c b/mbbsd/bbs.c index 9c9d0dfc..19e775b8 100644 --- a/mbbsd/bbs.c +++ b/mbbsd/bbs.c @@ -262,8 +262,8 @@ whereami(int ent, fileheader_t * fhdr, char *direct) bh = getbcache(currutmp->brc_id); root = getbcache(1); p[0] = bh; - for (i = 0; i < WHEREAMI_LEVEL && p[i]->parent != root && p[i]->parent; i++) - p[i + 1] = p[i]->parent; + for (i = 0; i < WHEREAMI_LEVEL && p[i]->parent; i++) + p[i + 1] = getbcache(p[i]->parent); j = i; prints("我在哪?\n%-40.40s %.13s\n", p[j]->title + 7, p[j]->BM); for (j--; j >= 0; j--) diff --git a/mbbsd/board.c b/mbbsd/board.c index 954c7d8f..ee3aa5e7 100644 --- a/mbbsd/board.c +++ b/mbbsd/board.c @@ -32,6 +32,13 @@ inline int getbid(boardheader_t *fh) { return (fh - bcache); } +inline boardheader_t *getparent(boardheader_t *fh) +{ + if(fh->parent>0) + return &bcache[fh->parent-1]; + else + return NULL; +} void imovefav(int old) { @@ -127,29 +134,30 @@ check_newpost(boardstat_t * ptr) static void load_uidofgid(const int gid, const int type) { - boardheader_t *bptr, *currbptr; - int n, childcount = 0; - currbptr = &bcache[gid - 1]; + boardheader_t *bptr, *currbptr, *parent; + int bid, n, childcount = 0; + currbptr = parent = &bcache[gid - 1]; for (n = 0; n < numboards; ++n) { - if( !(bptr = &bcache[SHM->bsorted[type][n]]) + bid = SHM->bsorted[type][n]+1; + if( bid<=0 || !(bptr = &bcache[bid-1]) || bptr->brdname[0] == '\0' ) continue; if (bptr->gid == gid) { - if (currbptr == &bcache[gid - 1]) - currbptr->firstchild[type] = bptr; + if (currbptr == parent) + currbptr->firstchild[type] = bid; else { - currbptr->next[type] = bptr; - currbptr->parent = &bcache[gid - 1]; + currbptr->next[type] = bid; + currbptr->parent = gid; } childcount++; currbptr = bptr; } } - bcache[gid - 1].childcount = childcount; - if (currbptr == &bcache[gid - 1]) - currbptr->firstchild[type] = NULL; - else - currbptr->next[type] = NULL; + parent->childcount = childcount; + if (currbptr == parent) // no child + currbptr->firstchild[type] = -1; + else // the last child + currbptr->next[type] = -1; } static boardstat_t * @@ -186,12 +194,12 @@ load_boards(char *key) { boardheader_t *bptr = NULL; int type = cuser.uflag & BRDSORT_FLAG ? 1 : 0; - int i, n; + int i, n, bid; int state; if (class_bid > 0) { bptr = getbcache(class_bid); - if (bptr->firstchild[type] == NULL || bptr->childcount <= 0) + if (bptr->firstchild[type] == 0 ) load_uidofgid(class_bid, type); } brdnum = 0; @@ -268,9 +276,9 @@ load_boards(char *key) else { // general case nbrd = (boardstat_t *) MALLOC(sizeof(boardstat_t) * numboards); for (i = 0; i < numboards; i++) { - if ((bptr = &bcache[SHM->bsorted[type][i]]) == NULL) + n = SHM->bsorted[type][i]+1; + if (n<0 || (bptr = &bcache[n]) == NULL) continue; - n = getbid(bptr); if (!bptr->brdname[0] || (bptr->brdattr & (BRD_GROUPBOARD | BRD_SYMBOLIC)) || !((state = HasPerm(bptr)) || GROUPOP()) || @@ -288,12 +296,12 @@ load_boards(char *key) qsort(nbrd, brdnum, sizeof(boardstat_t), cmpboardfriends); #endif } else { /* load boards of a subclass */ - int childcount = bptr->childcount; + int childcount = bptr->childcount; nbrd = (boardstat_t *) malloc((childcount+2) * sizeof(boardstat_t)); // 預留兩個以免大量開版時掛調 - for (bptr = bptr->firstchild[type]; bptr != NULL && - brdnum < childcount+2; bptr = bptr->next[type]) { - n = getbid(bptr); + for (bid = bptr->firstchild[type]; bid > 0 && + brdnum < childcount+2; bid = bptr->next[type]) { + bptr = getbcache(bid); state = HasPerm(bptr); if ( !(state || GROUPOP()) || TITLE_MATCH(bptr, key) ) continue; @@ -304,9 +312,9 @@ load_boards(char *key) if (HAS_PERM(PERM_SYSOP)) state |= NBRD_SYMBOLIC; else - n = BRD_LINK_TARGET(bptr) - 1; + bid = BRD_LINK_TARGET(bptr); } - addnewbrdstat(n, state); + addnewbrdstat(bid-1, state); } if(childcount < brdnum) //Ptt: dirty fix fix soon getbcache(class_bid)->childcount = 0; @@ -784,8 +792,7 @@ choose_board(int newflag) case 'F': case 'f': if (class_bid>0 && HAS_PERM(PERM_SYSOP)) { - getbcache(class_bid)->firstchild[cuser.uflag & BRDSORT_FLAG ? 1 : 0] - = NULL; + getbcache(class_bid)->firstchild[cuser.uflag & BRDSORT_FLAG ? 1 : 0] = 0; brdnum = -1; } break; diff --git a/mbbsd/cache.c b/mbbsd/cache.c index c66a5b5b..c1246a52 100644 --- a/mbbsd/cache.c +++ b/mbbsd/cache.c @@ -498,17 +498,16 @@ void touchbtotal(int bid) { static int -cmpboardname(int i, int j) +cmpboardname(const void * i, const void * j) { - return strcasecmp(bcache[i].brdname, bcache[j].brdname); + return strcasecmp(bcache[*(int*)i].brdname, bcache[*(int*)j].brdname); } static int -cmpboardclass(int i, int j) +cmpboardclass(const void * i, const void * j) { - boardheader_t *brd1 = &bcache[i], *brd2 = &bcache[j]; - return (strncmp(brd1->title, brd2->title, 4) << 8) + - strcasecmp(brd1->brdname, brd2->brdname); + boardheader_t *brd1 = &bcache[*(int*)i], *brd2 = &bcache[*(int*)j]; + return (strncmp(brd1->title, brd2->title, 4)); } void @@ -521,16 +520,17 @@ sort_bcache(void) { sleep(1); return; } SHM->Bbusystate = 1; for (i = 0; i < SHM->Bnumber; i++) { - SHM->bsorted[1][i] = SHM->bsorted[0][i] = i; + SHM->bsorted[0][i] = i; } qsort(SHM->bsorted[0], SHM->Bnumber, sizeof(int), (QCAST) cmpboardname); + memcpy(SHM->bsorted[1], SHM->bsorted[0], sizeof(int)*SHM->Bnumber); qsort(SHM->bsorted[1], SHM->Bnumber, sizeof(int), (QCAST) cmpboardclass); for (i = 0; i < SHM->Bnumber; i++) { - bcache[i].firstchild[0] = NULL; - bcache[i].firstchild[1] = NULL; + bcache[i].firstchild[0] = 0; + bcache[i].firstchild[1] = 0; } SHM->Bbusystate = 0; } @@ -542,7 +542,7 @@ reload_bcache(void) if (SHM->Bbusystate) { safe_sleep(1); } - else { + else { int fd; SHM->Bbusystate = 1; |