From 06a1fa962bc8dc058fdf7e0ddfab4c3db2336a67 Mon Sep 17 00:00:00 2001 From: piaip Date: Mon, 28 Jan 2008 10:36:35 +0000 Subject: - 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 --- mbbsd/read.c | 59 ++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 42 insertions(+), 17 deletions(-) (limited to 'mbbsd/read.c') 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; } -- cgit v1.2.3