summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2008-01-28 18:36:35 +0800
committerpiaip <piaip@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2008-01-28 18:36:35 +0800
commit06a1fa962bc8dc058fdf7e0ddfab4c3db2336a67 (patch)
tree2d9728ee6310cf5bf1380ad58ed2f4be72cb46f1
parent1ee4544b9503acb2a86427495a8e206b2225382b (diff)
downloadpttbbs-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.c59
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;
}