summaryrefslogtreecommitdiffstats
path: root/mbbsd/read.c
diff options
context:
space:
mode:
Diffstat (limited to 'mbbsd/read.c')
-rw-r--r--mbbsd/read.c396
1 files changed, 199 insertions, 197 deletions
diff --git a/mbbsd/read.c b/mbbsd/read.c
index 1158cb02..3b723841 100644
--- a/mbbsd/read.c
+++ b/mbbsd/read.c
@@ -3,7 +3,6 @@
static fileheader_t *headers = NULL;
static int last_line; // PTT: last_line 游標可指的最後一個
-static int hit_thread;
#include <sys/mman.h>
@@ -95,7 +94,7 @@ AskTag(char *msg)
num = TagNum;
snprintf(buf, sizeof(buf), "◆ %s A)文章 T)標記 Q)uit?", msg);
- switch (rget(b_lines - 1, buf)) {
+ switch (getans(buf)) {
case 'q':
num = -1;
break;
@@ -232,17 +231,16 @@ fixkeep(char *s, int first)
static int
cursor_pos(keeploc_t * locmem, int val, int from_top)
{
- int top;
-
- if (locmem->crs_ln > last_line) {
- bell();
+ int top=locmem->top_ln;
+ if (!last_line)
+ {
+ cursor_show(3 , 0);
+ return DONOTHING;
+ }
+ if (val > last_line)
val = last_line;
- }
- if (locmem->crs_ln <= 0) {
- bell();
+ if (val <= 0)
val = 1;
- }
- top = locmem->top_ln;
if (val >= top && val < top + p_lines) {
cursor_clear(3 + locmem->crs_ln - top, 0);
locmem->crs_ln = val;
@@ -257,7 +255,7 @@ cursor_pos(keeploc_t * locmem, int val, int from_top)
}
static int
-thread(keeploc_t * locmem, int stype)
+thread(keeploc_t * locmem, int stype, int *new_ln)
{
static char a_ans[32], t_ans[32];
char ans[32], s_pmt[64];
@@ -267,7 +265,7 @@ thread(keeploc_t * locmem, int stype)
int circulate_flag = 1; /* circulate at end or begin */
int fd = -1;
- match = hit_thread = 0;
+ match = 0;
now = pos = locmem->crs_ln;
if (stype == 'A') {
if (!*currowner)
@@ -283,18 +281,6 @@ thread(keeploc_t * locmem, int stype)
query = a_ans;
circulate_flag = 0;
stype = RS_FORWARD;
- } else if (stype == '/') {
- if (!*t_ans)
- return DONOTHING;
- query = t_ans;
- circulate_flag = 0;
- stype = RS_TITLE | RS_FORWARD;
- } else if (stype == '?') {
- if (!*t_ans)
- return DONOTHING;
- circulate_flag = 0;
- query = t_ans;
- stype = RS_TITLE;
} else if (stype & RS_RELATED) {
tag = headers[pos - locmem->top_ln].title;
if (stype & RS_CURRENT) {
@@ -344,8 +330,7 @@ thread(keeploc_t * locmem, int stype)
if( fd )
close(fd);
if ((stype & RS_FIRST) && (near)) {
- hit_thread = 1;
- return cursor_pos(locmem, near, 10);
+ *new_ln = near;
}
return DONOTHING;
}
@@ -365,10 +350,10 @@ thread(keeploc_t * locmem, int stype)
if (stype & RS_THREAD) {
if (strncasecmp(fh.title, str_reply, 3)) {
- hit_thread = 1;
if( fd )
close(fd);
- return cursor_pos(locmem, now, 10);
+ *new_ln = now;
+ return DONOTHING;
}
continue;
}
@@ -383,8 +368,7 @@ thread(keeploc_t * locmem, int stype)
near = now;
continue;
}
- hit_thread = 1;
- match = cursor_pos(locmem, now, 10);
+ *new_ln = now;
if ((!(stype & RS_CURRENT)) &&
(stype & RS_RELATED) &&
strncmp(currtitle, query, TTLEN)) {
@@ -414,19 +398,17 @@ mail_forward(fileheader_t * fhdr, char *direct, int mode)
*p = '\0';
switch (i = doforward(buf, fhdr, mode)) {
case 0:
- outmsg(msg_fwd_ok);
+ vmsg(msg_fwd_ok);
break;
case -1:
- outmsg(msg_fwd_err1);
+ vmsg(msg_fwd_err1);
break;
case -2:
- outmsg(msg_fwd_err2);
+ vmsg(msg_fwd_err2);
break;
default:
break;
}
- refresh();
- sleep(1);
}
#endif
@@ -554,155 +536,133 @@ select_read(keeploc_t * locmem, int sr_mode)
return READ_REDRAW;
}
+#define select_read_mode(m) select_read(locmem, m) ? NEWDIRECT:READ_REDRAW
static int
-i_read_key(onekey_t * rcmdlist, keeploc_t * locmem, int ch, int bid, int bottom_line)
+i_read_key(onekey_t * rcmdlist, char default_ch, keeploc_t * locmem,
+ int bid, int bottom_line)
{
int mode = DONOTHING;
- int new_cursor, num;
+ int num;
char direct[60];
+ int ch, new_ln= locmem->crs_ln;
- while(mode == DONOTHING)
- {
- ch = egetch();
- if (ch >= '0' && ch <= '9'&& (new_cursor = search_num(ch, last_line))!= -1)
- {
- mode = cursor_pos(locmem, new_cursor+1, p_lines - 2);
- }
- else
- switch (ch) {
- case 'q':
- case 'e':
- case KEY_LEFT:
- if(currmode & MODE_SELECT){
- char genbuf[256];
- fileheader_t *fhdr = &headers[locmem->crs_ln - locmem->top_ln];
- board_select();
- setbdir(genbuf, currboard);
- locmem = getkeep(genbuf, 0, 1);
- locmem->crs_ln = getindex(genbuf, fhdr->filename, sizeof(fileheader_t));
- num = locmem->crs_ln - p_lines + 1;
- locmem->top_ln = num < 1 ? 1 : num;
- mode= NEWDIRECT;
- }
- mode= (currmode & MODE_ETC) ? board_etc() :
- (currmode & MODE_DIGEST) ? board_digest() : DOQUIT;
- break;
- case Ctrl('L'):
- redoscr();
- break;
- case Ctrl('H'):
- if (select_read(locmem, RS_NEWPOST))
- mode = NEWDIRECT;
- else
- mode = READ_REDRAW;
- break;
- case 'a':
- case 'A':
- if (select_read(locmem, RS_AUTHOR))
- mode = NEWDIRECT;
- else
- mode = READ_REDRAW;
- break;
-
- case 'G':
- if (select_read(locmem,RS_THREAD)) /* marked articles */
- mode = NEWDIRECT;
- else
- mode = READ_REDRAW;
- break;
+ do {
+ if(default_ch)
+ {
+ ch = default_ch;
+ default_ch=0;
+ }
+ else
+ {
+ if((mode=cursor_pos(locmem, new_ln, 10))!=DONOTHING)
+ return mode;
+ ch = igetch();
+ }
+ switch (ch) {
+ case '0':
+ case '1':
+ case '2':
+ case '3':
+ case '4':
+ case '5':
+ case '6':
+ case '7':
+ case '8':
+ case '9':
+ if((num = search_num(ch, last_line))!=-1)
+ new_ln = num+1;
+ break;
+ case 'q':
+ case 'e':
+ case KEY_LEFT:
+ if(currmode & MODE_SELECT){
+ char genbuf[256];
+ fileheader_t *fhdr = &headers[locmem->crs_ln - locmem->top_ln];
+ board_select();
+ setbdir(genbuf, currboard);
+ locmem = getkeep(genbuf, 0, 1);
+ locmem->crs_ln =
+ getindex(genbuf, fhdr->filename, sizeof(fileheader_t));
+ num = locmem->crs_ln - p_lines + 1;
+ locmem->top_ln = num < 1 ? 1 : num;
+
+ mode = NEWDIRECT;
+ }
+ else
+ mode = (currmode & MODE_ETC) ? board_etc() :
+ (currmode & MODE_DIGEST) ? board_digest() : DOQUIT;
+ break;
+ case Ctrl('L'):
+ redoscr();
+ break;
- case '/':
- case '?':
- if (select_read(locmem, RS_RELATED))
- mode = NEWDIRECT;
- else
- mode = READ_REDRAW;
- break;
- case 'S':
- if (select_read(locmem, RS_TITLE))
- mode = NEWDIRECT;
- else
- mode = READ_REDRAW;
- break;
- /* quick search title first */
- case '=':
- mode = thread(locmem, RELATE_FIRST);
- break;
- case '\\':
- mode = thread(locmem, CURSOR_FIRST);
- break;
- /* quick search title forword */
- case ']':
- mode = thread(locmem, RELATE_NEXT);
- break;
- case '+':
- mode = thread(locmem, CURSOR_NEXT);
- break;
- /* quick search title backword */
- case '[':
- mode = thread(locmem, RELATE_PREV);
- break;
- case '-':
- mode = thread(locmem, CURSOR_PREV);
- break;
- case '<':
- case ',':
- mode = thread(locmem, THREAD_PREV);
- break;
- case '.':
- case '>':
- mode = thread(locmem, THREAD_NEXT);
- break;
- case 'p':
- case 'k':
+ case Ctrl('H'):
+ mode = select_read_mode(RS_NEWPOST);
+ break;
+ case 'a':
+ case 'A':
+ mode = select_read_mode(RS_AUTHOR);
+ break;
+ case 'G':
+ mode = select_read_mode(RS_THREAD);
+ break;
+ case '/':
+ case '?':
+ mode = select_read_mode(RS_RELATED);
+ break;
+ case 'S':
+ mode = select_read_mode(RS_TITLE);
+ break;
+ case '=':
+ mode = thread(locmem, RELATE_FIRST, &new_ln);
+ break;
+ case '\\':
+ mode = thread(locmem, CURSOR_FIRST, &new_ln);
+ break;
+ case ']':
+ mode = thread(locmem, RELATE_NEXT, &new_ln);
+ break;
+ case '+':
+ mode = thread(locmem, CURSOR_NEXT, &new_ln);
+ break;
+ case '[':
+ mode = thread(locmem, RELATE_PREV, &new_ln);
+ break;
+ case '-':
+ mode = thread(locmem, CURSOR_PREV, &new_ln);
+ break;
+ case '<':
+ case ',':
+ mode = thread(locmem, THREAD_PREV, &new_ln);
+ break;
+ case '.':
+ case '>':
+ mode = thread(locmem, THREAD_NEXT, &new_ln);
+ break;
+ case 'p':
+ case 'k':
case KEY_UP:
- mode = cursor_pos(locmem, locmem->crs_ln - 1, p_lines - 2);
+ new_ln = locmem->crs_ln - 1;
break;
case 'n':
case 'j':
case KEY_DOWN:
- mode = cursor_pos(locmem, locmem->crs_ln + 1, 1);
+ new_ln = locmem->crs_ln + 1;
break;
case ' ':
case KEY_PGDN:
case 'N':
case Ctrl('F'):
- if (last_line >= locmem->top_ln + p_lines) {
- if (last_line > locmem->top_ln + p_lines)
- locmem->top_ln += p_lines;
- else
- locmem->top_ln += p_lines - 1;
- locmem->crs_ln = locmem->top_ln;
- mode = PARTUPDATE;
- }
- else
- cursor_clear(3 + locmem->crs_ln - locmem->top_ln, 0);
- locmem->crs_ln = last_line;
- cursor_show(3 + locmem->crs_ln - locmem->top_ln, 0);
+ new_ln = locmem->crs_ln + p_lines;
break;
case KEY_PGUP:
case Ctrl('B'):
case 'P':
- if (locmem->top_ln > 1) {
- locmem->top_ln -= p_lines;
- if (locmem->top_ln <= 0)
- locmem->top_ln = 1;
- locmem->crs_ln = locmem->top_ln;
- mode = PARTUPDATE;
- }
+ new_ln = locmem->crs_ln - p_lines;
break;
case KEY_END:
case '$':
- if (last_line >= locmem->top_ln + p_lines) {
- locmem->top_ln = last_line - p_lines + 1;
- if (locmem->top_ln <= 0)
- locmem->top_ln = 1;
- locmem->crs_ln = last_line;
- return PARTUPDATE;
- }
- cursor_clear(3 + locmem->crs_ln - locmem->top_ln, 0);
- locmem->crs_ln = last_line;
- cursor_show(3 + locmem->crs_ln - locmem->top_ln, 0);
+ new_ln = last_line;
break;
case 'F':
case 'U':
@@ -715,7 +675,6 @@ i_read_key(onekey_t * rcmdlist, keeploc_t * locmem, int ch, int bid, int bottom_
break;
case Ctrl('Q'):
mode = my_query(headers[locmem->crs_ln - locmem->top_ln].owner);
- break;
case Ctrl('S'):
if (HAS_PERM(PERM_ACCOUNTS)) {
int id;
@@ -726,7 +685,8 @@ i_read_key(onekey_t * rcmdlist, keeploc_t * locmem, int ch, int bid, int bottom_
sizeof(currauthor));
stand_title("使用者設定");
move(1, 0);
- if ((id = getuser(headers[locmem->crs_ln - locmem->top_ln].owner))) {
+ if ((id = getuser(headers[locmem->crs_ln - locmem->top_ln].owner)))
+ {
memcpy(&muser, &xuser, sizeof(muser));
user_display(&muser, 1);
uinfo_query(&muser, 1, id);
@@ -751,17 +711,17 @@ i_read_key(onekey_t * rcmdlist, keeploc_t * locmem, int ch, int bid, int bottom_
(currmode & MODE_SELECT) ?
(headers[locmem->crs_ln - locmem->top_ln].money & ~FHR_REFERENCE) :
locmem->crs_ln, TAG_TOGGLE))
- mode = POS_NEXT;
- else
- mode = DONOTHING;
- break;
+ locmem->crs_ln = locmem->crs_ln + 1;
+ mode = PART_REDRAW;
+ break;
+
case Ctrl('C'):
if (TagNum) {
TagNum = 0;
mode = FULLUPDATE;
}
- mode = DONOTHING;
break;
+
case Ctrl('T'):
mode = TagThread(currdirect);
break;
@@ -775,27 +735,29 @@ i_read_key(onekey_t * rcmdlist, keeploc_t * locmem, int ch, int bid, int bottom_
ch = 'r';
default:
if( ch == 'h' && currmode & (MODE_ETC | MODE_DIGEST) )
- return DONOTHING;
+ break;
if (ch > 0 && ch <= onekey_size) {
int (*func)() = rcmdlist[ch - 1];
if (func != NULL)
{
- num = locmem->crs_ln - bottom_line;
- if (num>0)
- {
- sprintf(direct,"%s.bottom", currdirect);
- mode = (*func)(num, &headers[locmem->crs_ln-locmem->top_ln],
+ num = locmem->crs_ln - bottom_line;
+
+ if (num>0)
+ {
+ sprintf(direct,"%s.bottom", currdirect);
+ mode= (*func)(num, &headers[locmem->crs_ln-locmem->top_ln],
direct);
- }
- else
- mode = (*func)(locmem->crs_ln,
+ }
+ else
+ mode = (*func)(locmem->crs_ln,
&headers[locmem->crs_ln - locmem->top_ln], currdirect);
}
- break;
- }
- }
+ }
+ break;
+ } // end switch
}
- return mode;
+ while (mode == DONOTHING);
+ return mode;
}
int
@@ -804,6 +766,7 @@ get_records_and_bottom(char *direct, fileheader_t* headers,
{
int n = bottom_line - recbase + 1, rv;
char directbottom[60];
+
if(!last_line) return 0;
if(n>=p_lines || (currmode & (MODE_SELECT | MODE_DIGEST)))
return get_records(direct, headers, sizeof(fileheader_t), recbase,
@@ -825,13 +788,12 @@ void
i_read(int cmdmode, char *direct, void (*dotitle) (), void (*doentry) (), onekey_t * rcmdlist, int bidcache)
{
keeploc_t *locmem = NULL;
- int recbase = 0, mode, ch;
+ int recbase = 0, mode, lastmode = 0, last_ln;
int num = 0, entries = 0, n_bottom=0;
int i;
- char currdirect0[64];
+ char currdirect0[64], default_ch = 0;
int last_line0 = last_line;
int bottom_line = 0;
- int hit_thread0 = hit_thread;
fileheader_t *headers0 = headers;
strlcpy(currdirect0, currdirect, sizeof(currdirect0));
@@ -860,9 +822,6 @@ i_read(int cmdmode, char *direct, void (*dotitle) (), void (*doentry) (), onekey
bottom_line = last_line = get_num_records(currdirect, FHSZ);
if (mode == NEWDIRECT) {
- if (last_line == 0) {
- outs("沒有任何文章..\n");
- }
num = last_line - p_lines + 1;
locmem = getkeep(currdirect, num < 1 ? 1 : num, last_line);
}
@@ -903,11 +862,11 @@ i_read(int cmdmode, char *direct, void (*dotitle) (), void (*doentry) (), onekey
clrtobot();
case PART_REDRAW:
move(3, 0);
- if(!entries)
- outs(" 沒有文章......");
+ if(last_line==0)
+ outs(" 沒有文章...");
else
- for (i = 0; i < entries; i++)
- (*doentry) (locmem->top_ln + i, &headers[i]);
+ for (i = 0; i < entries; i++)
+ (*doentry) (locmem->top_ln + i, &headers[i]);
case READ_REDRAW:
outmsg(curredit & EDIT_ITEM ?
"\033[44m 私人收藏 \033[30;47m 繼續? \033[m" :
@@ -915,16 +874,59 @@ i_read(int cmdmode, char *direct, void (*dotitle) (), void (*doentry) (), onekey
break;
case TITLE_REDRAW:
(*dotitle) ();
- break;
+ break;
}
- /* 讀取鍵盤,加以處理,設定 mode */
- mode = i_read_key(rcmdlist, locmem, ch, currbid,
- bottom_line);
+ mode = i_read_key(rcmdlist, default_ch, locmem, currbid,
+ bottom_line);
+ if(mode == READ_SKIP)
+ mode = lastmode;
+ // 以下這幾種 mode 要再處理游標
+ default_ch=0;
+ if(mode == READ_PREV || mode == READ_NEXT || mode == RELATE_PREV ||
+ mode == RELATE_FIRST || mode == 'A' || mode == 'a' ||
+ mode == RELATE_NEXT)
+ {
+ lastmode = mode;
+ last_ln = locmem->crs_ln;
+
+ switch(mode)
+ {
+ case READ_PREV:
+ mode = cursor_pos(locmem, locmem->crs_ln - 1, 10);
+ break;
+ case READ_NEXT:
+ mode = cursor_pos(locmem, locmem->crs_ln + 1, 10);
+ break;
+ case RELATE_PREV:
+ thread(locmem, RELATE_PREV, &num);
+ mode = cursor_pos(locmem, num, 10);
+ break;
+ case RELATE_NEXT:
+ thread(locmem, RELATE_NEXT, &num);
+ mode = cursor_pos(locmem, num, 10);
+ break;
+ case RELATE_FIRST:
+ thread(locmem, RELATE_FIRST, &num);
+ mode = cursor_pos(locmem, num, 10);
+ break;
+ case 'A':
+ thread(locmem, 'A', &num);
+ mode = cursor_pos(locmem, num, 10);
+ break;
+ case 'a':
+ thread(locmem, 'a', &num);
+ mode = cursor_pos(locmem, num, 10);
+ break;
+ }
+ if(locmem->crs_ln != last_ln) default_ch = 'r';
+ else mode = FULLUPDATE;
+ }
} while (mode != DOQUIT);
+#undef FHSZ
+
free(headers);
last_line = last_line0;
- hit_thread = hit_thread0;
headers = headers0;
strlcpy(currdirect, currdirect0, sizeof(currdirect));
return;