diff options
author | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2008-01-28 18:36:35 +0800 |
---|---|---|
committer | piaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204> | 2008-01-28 18:36:35 +0800 |
commit | 06a1fa962bc8dc058fdf7e0ddfab4c3db2336a67 (patch) | |
tree | 2d9728ee6310cf5bf1380ad58ed2f4be72cb46f1 | |
parent | 1ee4544b9503acb2a86427495a8e206b2225382b (diff) | |
download | pttbbs-06a1fa962bc8dc058fdf7e0ddfab4c3db2336a67.tar pttbbs-06a1fa962bc8dc058fdf7e0ddfab4c3db2336a67.tar.gz pttbbs-06a1fa962bc8dc058fdf7e0ddfab4c3db2336a67.tar.bz2 pttbbs-06a1fa962bc8dc058fdf7e0ddfab4c3db2336a67.tar.lz pttbbs-06a1fa962bc8dc058fdf7e0ddfab4c3db2336a67.tar.xz pttbbs-06a1fa962bc8dc058fdf7e0ddfab4c3db2336a67.tar.zst pttbbs-06a1fa962bc8dc058fdf7e0ddfab4c3db2336a67.zip |
- read: avoid black holes, even if board article counter is wrong.
git-svn-id: http://opensvn.csie.org/pttbbs/trunk/pttbbs@3878 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r-- | mbbsd/read.c | 59 |
1 files changed, 42 insertions, 17 deletions
diff --git a/mbbsd/read.c b/mbbsd/read.c index db503a0f..753b595d 100644 --- a/mbbsd/read.c +++ b/mbbsd/read.c @@ -1135,30 +1135,55 @@ i_read_key(const onekey_t * rcmdlist, keeploc_t * locmem, return mode; } +// recbase: 顯示位置的開頭 +// headers_size:要顯示幾行 +// last_line: 全板 .DIR + 置底 的有效數目 +// bottom_line: 全板 .DIR (無置底) 的有效數目 + +// XXX never return -1! + static int get_records_and_bottom(char *direct, fileheader_t* headers, int recbase, int headers_size, int last_line, int bottom_line) { - int n = bottom_line - recbase + 1, rv; - char directbottom[60]; + // n: 置底除外的可顯示數目 + int n = bottom_line - recbase + 1, rv = 0; - if( !last_line ) + if( last_line < 1) // 完全沒東西 return 0; + + // 不顯示置底的情形 if( n >= headers_size || (currmode & (MODE_SELECT | MODE_DIGEST)) ) - return get_records(direct, headers, sizeof(fileheader_t), recbase, - headers_size); - - sprintf(directbottom, "%s.bottom", direct); - if( n <= 0 ) - return get_records(directbottom, headers, sizeof(fileheader_t), 1-n, - last_line-recbase + 1); - - rv = get_records(direct, headers, sizeof(fileheader_t), recbase, n); - - /* XXX if entries return -1 */ - if( bottom_line < last_line ) - rv += get_records(directbottom, headers+n, sizeof(fileheader_t), 1, - headers_size - n ); + { + rv = get_records(direct, headers, sizeof(fileheader_t), + recbase, headers_size); + return rv > 0 ? rv : 0; + } + + // 顯示本文+置底: + + // 讀取 .DIR 本文 + if (n > 0) + { + n = get_records(direct, headers, sizeof(fileheader_t), recbase, n); + if (n < 0) n = 0; + rv += n; // rv 為有效本文數 + } + + // 讀取置底 + n = last_line - bottom_line +1; + if (rv + n > headers_size) + n = headers_size - rv; + + if (n > 0) { + char directbottom[PATHLEN]; + snprintf(directbottom, sizeof(directbottom)-1, "%s.bottom", direct); + directbottom[sizeof(directbottom)-1] = 0; + n = get_records(directbottom, headers+rv, sizeof(fileheader_t), 1, n); + if (n < 0) n = 0; + rv += n; + } + return rv; } |