summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorptt <ptt@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2004-04-26 23:28:24 +0800
committerptt <ptt@63ad8ddf-47c3-0310-b6dd-a9e9d9715204>2004-04-26 23:28:24 +0800
commit4b502e05397babe1c8050adb99c2f3e1ebcce641 (patch)
tree728b6c056cdbb67dc8579b5d789a967c1ad9858e
parentc144625766bb0db3b3f0bc5718fbe55d356e449f (diff)
parenta08baf738de7959e912f5b12314da85eaea5a3c9 (diff)
downloadpttbbs-Ptt.read.tar
pttbbs-Ptt.read.tar.gz
pttbbs-Ptt.read.tar.bz2
pttbbs-Ptt.read.tar.lz
pttbbs-Ptt.read.tar.xz
pttbbs-Ptt.read.tar.zst
pttbbs-Ptt.read.zip
simplify thread() i_read() git-svn-id: http://opensvn.csie.org/pttbbs/branches/Ptt.read@1862 63ad8ddf-47c3-0310-b6dd-a9e9d9715204
-rw-r--r--include/config.h8
-rw-r--r--include/modes.h2
-rw-r--r--include/perm.h5
-rw-r--r--include/proto.h9
-rw-r--r--include/pttstruct.h9
-rw-r--r--mbbsd/admin.c15
-rw-r--r--mbbsd/announce.c7
-rw-r--r--mbbsd/bbs.c44
-rw-r--r--mbbsd/board.c120
-rw-r--r--mbbsd/cal.c54
-rw-r--r--mbbsd/card.c50
-rw-r--r--mbbsd/chat.c2
-rw-r--r--mbbsd/chc.c8
-rw-r--r--mbbsd/chicken.c15
-rw-r--r--mbbsd/dark.c46
-rw-r--r--mbbsd/edit.c20
-rw-r--r--mbbsd/gamble.c4
-rw-r--r--mbbsd/gomo.c2
-rw-r--r--mbbsd/io.c118
-rw-r--r--mbbsd/mail.c71
-rw-r--r--mbbsd/mbbsd.c30
-rw-r--r--mbbsd/menu.c21
-rw-r--r--mbbsd/more.c3
-rw-r--r--mbbsd/name.c14
-rw-r--r--mbbsd/othello.c4
-rw-r--r--mbbsd/read.c396
-rw-r--r--mbbsd/register.c21
-rw-r--r--mbbsd/screen.c2
-rw-r--r--mbbsd/stuff.c79
-rw-r--r--mbbsd/talk.c32
-rw-r--r--mbbsd/user.c12
-rw-r--r--mbbsd/var.c1
-rw-r--r--mbbsd/vote.c3
-rw-r--r--mbbsd/xyz.c6
-rw-r--r--util/account.c34
35 files changed, 515 insertions, 752 deletions
diff --git a/include/config.h b/include/config.h
index d44ce8a0..5f9a5a73 100644
--- a/include/config.h
+++ b/include/config.h
@@ -25,6 +25,14 @@
#define MAX_CPULOAD (70) /* CPU 最高load */
#endif
+#ifndef MAX_LANG
+#define MAX_LANG (1) /* 最多使用語言 */
+#endif
+
+#ifndef MAX_STRING
+#define MAX_STRING (8000) /* 系統最多使用字串 */
+#endif
+
#ifndef MAX_POST_MONEY /* 發表文章稿費的上限 */
#define MAX_POST_MONEY 100
#endif
diff --git a/include/modes.h b/include/modes.h
index 16d23754..1a180055 100644
--- a/include/modes.h
+++ b/include/modes.h
@@ -13,7 +13,7 @@
#define READ_REDRAW 9
#define PART_REDRAW 10
#define TITLE_REDRAW 11
-#define POS_NEXT 101 /* cursor_pos(locmem, locmem->crs_ln + 1, 1);*/
+#define READ_SKIP 12
/* user 操作狀態與模式 */
#define IDLE 0
diff --git a/include/perm.h b/include/perm.h
index 2d676bae..02c03d0f 100644
--- a/include/perm.h
+++ b/include/perm.h
@@ -11,7 +11,7 @@
#define PERM_CLOAK 000000000100 /* 目前隱形中 */
#define PERM_SEECLOAK 000000000200 /* 看見忍者 */
#define PERM_XEMPT 000000000400 /* 永久保留帳號 */
-#define PERM_DENYPOST 000000001000 /* 站長隱身術 */
+#define PERM_SYSOPHIDE 000000001000 /* 站長隱身術 */
#define PERM_BM 000000002000 /* 板主 */
#define PERM_ACCOUNTS 000000004000 /* 帳號總管 */
#define PERM_CHATROOM 000000010000 /* 聊天室總管 */
@@ -51,8 +51,7 @@
#define HAS_PERM(x) ((x) ? cuser.userlevel & (x) : 1)
#define HAVE_PERM(x) (cuser.userlevel&(x))
-#define PERM_HIDE(u) ((u)->userlevel & PERM_SYSOP && \
- (u)->userlevel & PERM_DENYPOST)
+#define PERM_HIDE(u) (u && (u)->userlevel & PERM_SYSOPHIDE)
#define IS_BOARD(bptr) ((bptr)->brdname[0] && \
!((bptr)->brdattr & BRD_GROUPBOARD))
diff --git a/include/proto.h b/include/proto.h
index b3fed5a6..01593227 100644
--- a/include/proto.h
+++ b/include/proto.h
@@ -312,7 +312,6 @@ void init_alarm(void);
int num_in_buf(void);
int ochar(int c);
int rget(int x,char *prompt);
-char getans(char *prompt);
/* kaede */
int Rename(char* src, char* dst);
@@ -454,13 +453,13 @@ void check_register(void);
char *genpasswd(char *pw);
/* screen */
+void mouts(int y, int x, char *str);
void move(int y, int x);
void outs(char *str);
void clrtoeol(void);
void clear(void);
void refresh(void);
void clrtobot(void);
-void mprints(int y, int x, char *str);
void outmsg(char *msg);
void region_scroll_up(int top, int bottom);
void outc(unsigned char ch);
@@ -480,11 +479,13 @@ void out_lines(char *str, int line);
#define isprint2(ch) ((ch & 0x80) || isprint(ch))
#define not_alpha(ch) (ch < 'A' || (ch > 'Z' && ch < 'a') || ch > 'z')
#define not_alnum(ch) (ch < '0' || (ch > '9' && ch < 'A') || (ch > 'Z' && ch < 'a') || ch > 'z')
+#define pressanykey() vmsg_lines(b_lines, NULL)
+int vmsg_lines(int lines, const char *msg);
time_t gettime(int line, time_t dt, char* head);
void setcalfile(char *buf, char *userid);
void stand_title(char *title);
-void pressanykey(void);
-int vmsg (const char *fmt,...) GCC_CHECK_FORMAT(1,2);
+int getans(const char *fmt,...) GCC_CHECK_FORMAT(1,2);
+int vmsg(const char *fmt,...) GCC_CHECK_FORMAT(1,2);
void trim(char *buf);
void bell(void);
void setbpath(char *buf, char *boardname);
diff --git a/include/pttstruct.h b/include/pttstruct.h
index 80cef86c..eafc8636 100644
--- a/include/pttstruct.h
+++ b/include/pttstruct.h
@@ -424,6 +424,15 @@ typedef struct {
time_t Fuptime;
time_t Ftouchtime;
int Fbusystate;
+
+#ifdef I18N
+ /* i18n(internationlization) */
+ char *i18nstrptr[MAX_LANG][MAX_STRING];
+ char i18nstrbody[16 * MAX_LANG * MAX_STRING];
+ /* Based on the statistis, we found the lengh of one string
+ is 16 bytes approximately.
+ */
+#endif
} SHM_t;
typedef struct {
diff --git a/mbbsd/admin.c b/mbbsd/admin.c
index f6d35a6c..5379d0be 100644
--- a/mbbsd/admin.c
+++ b/mbbsd/admin.c
@@ -134,7 +134,6 @@ search_key_user(char *passwdfile, int mode)
fclose(fp1);
return 0;
} else {
- move(b_lines - 1, 0);
getdata(0, 0,
"目前的 PASSWD 檔沒有此 ID,新增嗎?[y/N]",
genbuf, 3, LCECHO);
@@ -705,6 +704,7 @@ m_newbrd(int recover)
}
add_board_record(&newboard);
+ getbcache(class_bid)->childcount = 0;
pressanykey();
setup_man(&newboard);
@@ -954,15 +954,13 @@ scan_register_form(char *regfile, int automode, int neednum)
prints("%d.%-12s:%s\n", n - 2, finfo[n], fdata[n]);
}
if (muser.userlevel & PERM_LOGINOK) {
- getdata(b_lines - 1, 0, "\033[1;32m此帳號已經完成註冊, "
- "更新(Y/N/Skip)?\033[m[N] ", ans, sizeof(ans), LCECHO);
+ ans[0]=getans("此帳號已經完成註冊, "
+ "更新(Y/N/Skip)?[N] ");
if (ans[0] != 'y' && ans[0] != 's')
ans[0] = 'd';
} else {
- move(b_lines - 1, 0);
- prints("是否接受此資料(Y/N/Q/Del/Skip)?[S] ");
if (search_ulist(unum) == NULL)
- ans[0] = igetch();
+ ans[0] = getans("是否接受此資料(Y/N/Q/Del/Skip)?[S] ");
else
ans[0] = 's';
if ('A' <= ans[0] && ans[0] <= 'Z')
@@ -1160,10 +1158,9 @@ cat_register()
{
if (system("cat register.new.tmp >> register.new") == 0 &&
system("rm -f register.new.tmp") == 0)
- mprints(22, 0, "OK 嚕~~ 繼續去奮鬥吧!!");
+ vmsg("OK 嚕~~ 繼續去奮鬥吧!!");
else
- mprints(22, 0, "沒辦法CAT過去呢 去檢查一下系統吧!!");
- pressanykey();
+ vmsg("沒辦法CAT過去呢 去檢查一下系統吧!!");
return 0;
}
diff --git a/mbbsd/announce.c b/mbbsd/announce.c
index 21696789..30fe76f3 100644
--- a/mbbsd/announce.c
+++ b/mbbsd/announce.c
@@ -317,8 +317,7 @@ a_pasteitem(menu_t * pm, int mode)
if (dashd(copyfile)) {
for (i = 0; copyfile[i] && copyfile[i] == pm->path[i]; i++);
if (!copyfile[i]) {
- outs("將目錄拷進自己的子目錄中,會造成無窮迴圈!");
- igetch();
+ vmsg("將目錄拷進自己的子目錄中,會造成無窮迴圈!");
return;
}
}
@@ -682,9 +681,7 @@ a_showname(menu_t * pm)
sym = 1;
}
if (sym) {
- pressanykey();
- move(b_lines - 1, 1);
- prints("此 symbolic link 指向 %s\n", &buf[i + 1]);
+ vmsg("此 symbolic link 指向 %s\n", &buf[i + 1]);
}
}
}
diff --git a/mbbsd/bbs.c b/mbbsd/bbs.c
index 519ac5aa..7719f140 100644
--- a/mbbsd/bbs.c
+++ b/mbbsd/bbs.c
@@ -57,7 +57,7 @@ save_violatelaw()
stand_title("繳罰單中心");
if (!(cuser.userlevel & PERM_VIOLATELAW)) {
- mprints(22, 0, "\033[1;31m你無聊啊? 你又沒有被開罰單~~\033[m");
+ mouts(22, 0, "\033[1;31m你無聊啊? 你又沒有被開罰單~~\033[m");
pressanykey();
return 0;
}
@@ -66,7 +66,7 @@ save_violatelaw()
snprintf(buf, sizeof(buf), "\033[1;31m這是你第 %d 次違反本站法規"
"必須繳出 %d $Ptt ,你只有 %d 元, 錢不夠啦!!\033[m",
(int)cuser.vl_count, (int)cuser.vl_count * 1000, cuser.money);
- mprints(22, 0, buf);
+ mouts(22, 0, buf);
pressanykey();
return 0;
}
@@ -77,19 +77,19 @@ save_violatelaw()
if (!getdata(10, 0, "確定嗎?[y/n]:", ok, sizeof(ok), LCECHO) ||
ok[0] == 'n' || ok[0] == 'N') {
- mprints(22, 0, "\033[1;31m等你想通了再來吧!! "
+ mouts(22, 0, "\033[1;31m等你想通了再來吧!! "
"我相信你不會知錯不改的~~~\033[m");
pressanykey();
return 0;
}
snprintf(buf, sizeof(buf), "這是你第 %d 次違法 必須繳出 %d $Ptt",
cuser.vl_count, cuser.vl_count * 1000);
- mprints(11, 0, buf);
+ mouts(11, 0, buf);
if (!getdata(10, 0, "要付錢[y/n]:", ok, sizeof(ok), LCECHO) ||
ok[0] == 'N' || ok[0] == 'n') {
- mprints(22, 0, "\033[1;31m 嗯 存夠錢 再來吧!!!\033[m");
+ mouts(22, 0, "\033[1;31m 嗯 存夠錢 再來吧!!!\033[m");
pressanykey();
return 0;
}
@@ -1129,12 +1129,12 @@ read_post(int ent, fileheader_t * fhdr, char *direct)
int more_result;
if (fhdr->owner[0] == '-')
- return DONOTHING;
+ return READ_SKIP;
setdirpath(genbuf, direct, fhdr->filename);
if ((more_result = more(genbuf, YEA)) == -1)
- return FULLUPDATE;
+ return READ_SKIP;
brc_addlist(fhdr->filename);
strncpy(currtitle, subject(fhdr->title), TTLEN);
@@ -1176,7 +1176,7 @@ read_post(int ent, fileheader_t * fhdr, char *direct)
"(=[]<>)\033[30m相關主題 \033[31m(↑↓)\033[30m上下封 \033[31m(←)"
"\033[30m離開 \033[m");
- switch (egetch()) {
+ switch (igetch()) {
case 'q':
case 'Q':
case KEY_LEFT:
@@ -1321,9 +1321,7 @@ hold_gamble(int ent, fileheader_t * fhdr, char *direct)
openticket(currbid);
return FULLUPDATE;
} else if (dashf(genbuf)) {
- move(b_lines - 1, 0);
- prints(" 目前系統正在處理開獎事宜, 請結果出爐後再舉辦.......");
- pressanykey();
+ vmsg(" 目前系統正在處理開獎事宜, 請結果出爐後再舉辦.......");
return FULLUPDATE;
}
getdata(b_lines - 2, 0, "要舉辦賭盤 (N/y):", yn, 3, LCECHO);
@@ -1687,9 +1685,7 @@ recommend(int ent, fileheader_t * fhdr, char *direct)
#ifndef DEBUG
if (!(currmode & MODE_BOARD) && getuser(cuser.userid) &&
now - lastrecommend < 40) {
- move(b_lines - 1, 0);
- prints("離上次推薦時間太近囉, 請多花點時間仔細閱\讀文章!");
- pressanykey();
+ vmsg("離上次推薦時間太近囉, 請多花點時間仔細閱\讀文章!");
return FULLUPDATE;
}
#endif
@@ -1933,13 +1929,9 @@ del_post(int ent, fileheader_t * fhdr, char *direct)
if (cuser.numposts)
cuser.numposts--;
if (!(currmode & MODE_DIGEST && currmode & MODE_BOARD)){
- move(b_lines - 1, 0);
- clrtoeol();
demoney(-fhdr->money);
- prints("%s,您的文章減為 %d 篇,支付清潔費 %d 銀", msg_del_ok,
+ vmsg("您的文章減為 %d 篇,支付清潔費 %d 銀",
cuser.numposts, fhdr->money);
- refresh();
- pressanykey();
}
}
return DIRCHANGED;
@@ -1953,30 +1945,24 @@ show_filename(int ent, fileheader_t * fhdr, char *direct)
{
if(!HAS_PERM(PERM_SYSOP)) return DONOTHING;
- move(b_lines - 1, 0);
- prints("檔案名稱: %s ", fhdr->filename);
- pressanykey();
+ vmsg("檔案名稱: %s ", fhdr->filename);
return PART_REDRAW;
}
static int
view_postmoney(int ent, fileheader_t * fhdr, char *direct)
{
- move(b_lines - 1, 0);
if(currmode & MODE_SELECT){
vmsg("請在離開目前的選擇模式再查詢");
return FULLUPDATE;
}
- clrtoeol();
if(fhdr->filemode & FILE_ANONYMOUS)
/* When the file is anonymous posted, fhdr->money is author.
* see do_general() */
- prints("匿名管理編號: %d (同一人被查詢時編號相同, 此編號每人看到不相同)",
+ vmsg("匿名管理編號: %d (同一人被查詢時編號相同, 此編號每人看到不相同)",
fhdr->money + currutmp->pid);
else
- prints("這一篇文章值 %d 銀", fhdr->money);
- refresh();
- pressanykey();
+ vmsg("這一篇文章值 %d 銀", fhdr->money);
return FULLUPDATE;
}
@@ -2078,7 +2064,7 @@ sequent_messages(fileheader_t * fptr)
"\033[30m下一封 \033[31m(←,q)\033[30m離開 \033[m");
continue_flag = 0;
- switch (egetch()) {
+ switch (igetch()) {
case KEY_LEFT:
case 'e':
case 'q':
diff --git a/mbbsd/board.c b/mbbsd/board.c
index 2cbd6df5..0c813609 100644
--- a/mbbsd/board.c
+++ b/mbbsd/board.c
@@ -186,10 +186,9 @@ load_boards(char *key)
int type = cuser.uflag & BRDSORT_FLAG ? 1 : 0;
int i, n;
int state;
- char byMALLOC = 0, needREALLOC = 0;
if (class_bid > 0) {
- bptr = &bcache[class_bid - 1];
+ bptr = getbcache(class_bid);
if (bptr->firstchild[type] == NULL || bptr->childcount <= 0)
load_uidofgid(class_bid, type);
}
@@ -214,7 +213,7 @@ load_boards(char *key)
else if (get_item_type(&fav->favh[i]) == FAVT_FOLDER )
state = NBRD_FOLDER;
else {
- bptr = &bcache[ fav_getid(&fav->favh[i]) - 1];
+ bptr = getbcache(fav_getid(&fav->favh[i]));
state = NBRD_BOARD;
if (is_set_attr(&fav->favh[i], FAVH_UNREAD))
state |= NBRD_UNREAD;
@@ -231,7 +230,7 @@ load_boards(char *key)
else
continue;
}else{
- bptr = &bcache[ fav_getid(&fav->favh[i]) - 1];
+ bptr = getbcache(fav_getid(&fav->favh[i]));
if( HasPerm(bptr) && strcasestr(bptr->title, key))
state = NBRD_BOARD;
else
@@ -249,8 +248,6 @@ load_boards(char *key)
}
if (brdnum == 0)
addnewbrdstat(0, 0);
- byMALLOC = 0;
- needREALLOC = (get_data_number(fav) != brdnum);
}
#if HOTBOARDCACHE
else if( class_bid == -1 ){
@@ -277,12 +274,6 @@ load_boards(char *key)
continue;
addnewbrdstat(n, state);
}
-#ifdef CRITICAL_MEMORY
- byMALLOC = 1;
-#else
- byMALLOC = 0;
-#endif
- needREALLOC = 1;
}
#if ! HOTBOARDCACHE
if (class_bid == -1)
@@ -290,9 +281,10 @@ load_boards(char *key)
#endif
} else { /* load boards of a subclass */
int childcount = bptr->childcount;
- nbrd = (boardstat_t *) malloc(childcount * sizeof(boardstat_t));
- for (bptr = bptr->firstchild[type]; bptr != NULL;
- bptr = bptr->next[type]) {
+ 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);
state = HasPerm(bptr);
if ( !(state || GROUPOP()) || TITLE_MATCH(bptr, key) )
@@ -308,21 +300,9 @@ load_boards(char *key)
}
addnewbrdstat(n, state);
}
- byMALLOC = 0;
- needREALLOC = (childcount != brdnum);
- }
-
- if( needREALLOC ){
- if( byMALLOC ){
- boardstat_t *newnbrd;
- newnbrd = (boardstat_t *)malloc(sizeof(boardstat_t) * brdnum);
- memcpy(newnbrd, nbrd, sizeof(boardstat_t) * brdnum);
- FREE(nbrd);
- nbrd = newnbrd;
- }
- else {
- nbrd = (boardstat_t *)realloc(nbrd, sizeof(boardstat_t) * brdnum);
- }
+ if(childcount != brdnum) //fix soon
+ getbcache(class_bid)->childcount = brdnum;
+
}
}
@@ -452,7 +432,7 @@ show_brdlist(int head, int clsflag, int newflag)
if (yank_flag == 0 && get_fav_type(&nbrd[0]) == 0){
move(3, 0);
- prints(" --- 空目錄 ---");
+ outs(" --- 空目錄 ---");
return;
}
@@ -488,7 +468,7 @@ show_brdlist(int head, int clsflag, int newflag)
}
if (class_bid == 1)
- prints(" ");
+ outs(" ");
if (!newflag) {
prints("%5d%c%s", head,
!(B_BH(ptr)->brdattr & BRD_HIDE) ? ' ' :
@@ -498,14 +478,14 @@ show_brdlist(int head, int clsflag, int newflag)
unread[ptr->myattr & NBRD_UNREAD ? 1 : 0]);
} else {
if (B_BH(ptr)->brdattr & BRD_GROUPBOARD)
- prints(" ");
+ outs(" ");
else
prints("%6d%s", (int)(B_TOTAL(ptr)),
unread[ptr->myattr & NBRD_UNREAD ? 1 : 0]);
}
if (class_bid != 1) {
if (!GROUPOP() && !HasPerm(B_BH(ptr))) {
- prints("Unknown?? 隱板 ?這個板是隱板");
+ outs("Unknown?? 隱板 ?這個板是隱板");
}
else {
prints("%s%-13s\033[m%s%5.5s\033[0;37m%2.2s\033[m"
@@ -519,15 +499,15 @@ show_brdlist(int head, int clsflag, int newflag)
B_BH(ptr)->title, B_BH(ptr)->title + 5, B_BH(ptr)->title + 7);
if (B_BH(ptr)->brdattr & BRD_BAD)
- prints(" X ");
+ outs(" X ");
else if (B_BH(ptr)->nuser >= 5000)
- prints("\033[1;34m爆!\033[m");
+ outs("\033[1;34m爆!\033[m");
else if (B_BH(ptr)->nuser >= 2000)
- prints("\033[1;31m爆!\033[m");
+ outs("\033[1;31m爆!\033[m");
else if (B_BH(ptr)->nuser >= 1000)
- prints("\033[1m爆!\033[m");
+ outs("\033[1m爆!\033[m");
else if (B_BH(ptr)->nuser >= 100)
- prints("\033[1mHOT\033[m");
+ outs("\033[1mHOT\033[m");
else if (B_BH(ptr)->nuser > 50)
prints("\033[1;31m%2d\033[m ", B_BH(ptr)->nuser);
else if (B_BH(ptr)->nuser > 10)
@@ -584,9 +564,34 @@ set_menu_BM(char *BM)
static void replace_link_by_target(boardstat_t *board)
{
- board->bid = BRD_LINK_TARGET(&bcache[board->bid - 1]);
+ board->bid = BRD_LINK_TARGET(getbcache(board->bid));
board->myattr &= ~NBRD_SYMBOLIC;
}
+static int
+paste_taged_brds(int gid)
+{
+ fav_t *fav;
+ int bid, tmp;
+
+ if (gid == 0 || ! (HAS_PERM(PERM_SYSOP) || GROUPOP()) ||
+ getans("貼上標記的看板?(y/N)")=='n') return 0;
+ fav = get_current_fav();
+ for (tmp = 0; tmp < fav->DataTail; tmp++) {
+ bid = fav_getid(&fav->favh[tmp]);
+ boardheader_t *bh = getbcache(bid);
+ if( !is_set_attr(&fav->favh[tmp], FAVH_ADM_TAG))
+ continue;
+ set_attr(&fav->favh[tmp], FAVH_ADM_TAG, 0);
+ if (bh->gid != gid) {
+ bh->gid = gid;
+ substitute_record(FN_BOARD, bh,
+ sizeof(boardheader_t), bid);
+ reset_board(bid);
+ log_usies("SetBoardGID", bh->brdname);
+ }
+ }
+ return 1;
+}
static void
choose_board(int newflag)
@@ -609,9 +614,8 @@ choose_board(int newflag)
load_boards(keyword);
if (brdnum <= 0 && yank_flag > 0) {
if (keyword[0] != 0) {
- mprints(b_lines - 1, 0, "沒有任何看板標題有此關鍵字 "
+ vmsg("沒有任何看板標題有此關鍵字 "
"(板主應注意看板標題命名)");
- pressanykey();
keyword[0] = 0;
brdnum = -1;
continue;
@@ -622,7 +626,8 @@ choose_board(int newflag)
continue;
}
if (HAS_PERM(PERM_SYSOP) || GROUPOP()) {
- if (m_newbrd(0) == -1)
+ if (paste_taged_brds(class_bid) ||
+ m_newbrd(0) == -1)
break;
brdnum = -1;
continue;
@@ -750,7 +755,7 @@ choose_board(int newflag)
case 'F':
case 'f':
if (class_bid>0 && HAS_PERM(PERM_SYSOP)) {
- bcache[class_bid - 1].firstchild[cuser.uflag & BRDSORT_FLAG ? 1 : 0]
+ getbcache(class_bid)->firstchild[cuser.uflag & BRDSORT_FLAG ? 1 : 0]
= NULL;
brdnum = -1;
}
@@ -789,7 +794,7 @@ choose_board(int newflag)
ptr = &nbrd[num];
if (ptr->myattr & NBRD_SYMBOLIC) {
if (getans("確定刪除連結?[N/y]") == 'y')
- delete_symbolic_link(&bcache[ptr->bid - 1], ptr->bid);
+ delete_symbolic_link(getbcache(ptr->bid), ptr->bid);
}
brdnum = -1;
}
@@ -813,26 +818,9 @@ choose_board(int newflag)
}
break;
case Ctrl('P'):
- if (class_bid != 0 &&
- (HAS_PERM(PERM_SYSOP) || GROUPOP())) {
- fav_t *fav = get_current_fav();
- for (tmp = 0; tmp < fav->DataTail; tmp++) {
- short bid = fav_getid(&fav->favh[tmp]);
- boardheader_t *bh = &bcache[ bid - 1 ];
- if( !is_set_attr(&fav->favh[tmp], FAVH_ADM_TAG))
- continue;
- set_attr(&fav->favh[tmp], FAVH_ADM_TAG, 0);
- if (bh->gid != class_bid) {
- bh->gid = class_bid;
- substitute_record(FN_BOARD, bh,
- sizeof(boardheader_t), bid);
- reset_board(bid);
- log_usies("SetBoardGID", bh->brdname);
- }
- }
- brdnum = -1;
- }
- break;
+ if (paste_taged_brds(class_bid))
+ brdnum = -1;
+ break;
case 'L':
if (HAS_PERM(PERM_SYSOP) && class_bid > 0) {
if (make_symbolic_link_interactively(class_bid) < 0)
@@ -1030,7 +1018,7 @@ choose_board(int newflag)
case 'W':
if (class_bid > 0 &&
(HAS_PERM(PERM_SYSOP) || GROUPOP())) {
- setbpath(buf, bcache[class_bid - 1].brdname);
+ setbpath(buf, getbcache(class_bid)->brdname);
mkdir(buf, 0755); /* Ptt:開群組目錄 */
b_note_edit_bname(class_bid);
brdnum = -1;
diff --git a/mbbsd/cal.c b/mbbsd/cal.c
index dca13c4d..3430ae75 100644
--- a/mbbsd/cal.c
+++ b/mbbsd/cal.c
@@ -96,18 +96,13 @@ osong(char *defaultid)
/* Jaky 一人一天點一首 */
if (!strcmp(buf, Cdatedate(&cuser.lastsong)) && !HAS_PERM(PERM_SYSOP)) {
move(22, 0);
- outs("你今天已經點過囉,明天再點吧....");
- refresh();
- pressanykey();
-
+ vmsg("你今天已經點過囉,明天再點吧....");
unlockutmpmode();
return 0;
}
if (cuser.money < 200) {
move(22, 0);
- outs("點歌要200銀唷!....");
- refresh();
- pressanykey();
+ vmsg("點歌要200銀唷!....");
unlockutmpmode();
return 0;
}
@@ -262,18 +257,12 @@ inmailbox(int m)
int
p_cloak()
{
- char buf[4];
- getdata(b_lines - 1, 0,
- currutmp->invisible ? "確定要現身?[y/N]" : "確定要隱身?[y/N]",
- buf, sizeof(buf), LCECHO);
- if (buf[0] != 'y')
+ if (getans(currutmp->invisible ? "確定要現身?[y/N]" : "確定要隱身?[y/N]") != 'y')
return 0;
if (cuser.money >= 19) {
vice(19, "付費隱身");
currutmp->invisible %= 2;
- outs((currutmp->invisible ^= 1) ? MSG_CLOAKED : MSG_UNCLOAK);
- refresh();
- safe_sleep(1);
+ vmsg((currutmp->invisible ^= 1) ? MSG_CLOAKED : MSG_UNCLOAK);
}
return 0;
}
@@ -282,10 +271,7 @@ p_cloak()
int
p_from()
{
- char ans[4];
-
- getdata(b_lines - 2, 0, "確定要改故鄉?[y/N]", ans, sizeof(ans), LCECHO);
- if (ans[0] != 'y')
+ if (getans("確定要改故鄉?[y/N]") != 'y')
return 0;
reload_money();
if (cuser.money < 49)
@@ -305,8 +291,7 @@ p_exmail()
int n;
if (cuser.exmailbox >= MAX_EXKEEPMAIL) {
- prints("容量最多增加 %d 封,不能再買了。", MAX_EXKEEPMAIL);
- refresh();
+ vmsg("容量最多增加 %d 封,不能再買了。", MAX_EXKEEPMAIL);
return 0;
}
snprintf(buf, sizeof(buf),
@@ -393,9 +378,7 @@ p_give()
snprintf(genbuf, sizeof(genbuf), "%s\t給%s\t%d\t%s",
cuser.userid, id, money - tax, ctime(&now));
log_file(FN_MONEY, genbuf, 1);
- genbuf[0] = 'n';
- getdata(3, 0, "要自行書寫紅包袋嗎?[y/N]", genbuf, 2, LCECHO);
- mail_redenvelop(cuser.userid, id, money - tax, genbuf[0]);
+ mail_redenvelop(cuser.userid, id, money - tax, getans("要自行書寫紅包袋嗎?[y/N]"));
}
return 0;
}
@@ -444,26 +427,3 @@ p_sysinfo(void)
return 0;
}
-/* 小計算機 */
-#if 0
-static void
-ccount(float *a, float b, int cmode)
-{
- switch (cmode) {
- case 0:
- case 1:
- case 2:
- *a += b;
- break;
- case 3:
- *a -= b;
- break;
- case 4:
- *a *= b;
- break;
- case 5:
- *a /= b;
- break;
- }
-}
-#endif
diff --git a/mbbsd/card.c b/mbbsd/card.c
index 2ed12260..b46ce2bc 100644
--- a/mbbsd/card.c
+++ b/mbbsd/card.c
@@ -41,7 +41,7 @@ card_select(int *now)
(*now == 2) ? cc[1] : cc[0],
(*now == 3) ? cc[1] : cc[0],
(*now == 4) ? cc[1] : cc[0]);
- switch (egetch()) {
+ switch (igetch()) {
case 'Q':
case 'q':
return 0;
@@ -450,16 +450,12 @@ card_jack(int *db)
if ((card_number(me[0]) == 0 && card_number(me[1]) == 12) ||
(card_number(me[1]) == 0 && card_number(me[0]) == 12)) {
if (card_flower(me[0]) == 0 && card_flower(me[1]) == 0) {
- move(b_lines - 1, 0);
- prints("非常不錯唷! (超級黑傑克!! 加 %d 元)", JACK * 10);
game_log(JACK, JACK * 10);
- pressanykey();
+ vmsg("非常不錯唷! (超級黑傑克!! 加 %d 元)", JACK * 10);
return 0;
} else {
- move(b_lines - 1, 0);
- prints("很不錯唷! (黑傑克!! 加 %d 元)", JACK * 5);
game_log(JACK, JACK * 5);
- pressanykey();
+ vmsg("很不錯唷! (黑傑克!! 加 %d 元)", JACK * 5);
return 0;
}
}
@@ -467,10 +463,8 @@ card_jack(int *db)
(card_number(cpu[1]) == 0 && card_number(cpu[0]) == 12)) {
c[0] = 1;
card_show(cpu, c, me, m);
- move(b_lines - 1, 0);
- prints("嘿嘿...不好意思....黑傑克!!");
game_log(JACK, 0);
- pressanykey();
+ vmsg("嘿嘿...不好意思....黑傑克!!");
return 0;
}
if ((*db < 0) && (card_number(me[0]) == card_number(me[1])) &&
@@ -485,27 +479,21 @@ card_jack(int *db)
m[i] = 1;
card_show(cpu, c, me, m);
if (card_alls_lower(me) > 21) {
- move(b_lines - 1, 0);
- prints("嗚嗚...爆掉了!");
game_log(JACK, 0);
- pressanykey();
+ vmsg("嗚嗚...爆掉了!");
return 0;
}
i++;
if ((i == 3) && (card_number(me[0]) == 7) &&
(card_number(me[1]) == 7) && (card_number(me[2]) == 7)) {
- move(b_lines - 1, 0);
- prints("很不錯唷! (幸運七號!! 加 %d 元)", JACK * 7);
game_log(JACK, JACK * 7);
- pressanykey();
+ vmsg("很不錯唷! (幸運七號!! 加 %d 元)", JACK * 7);
return 0;
}
}
if (i == 5) { /* 過五關 */
- move(b_lines - 1, 0);
- prints("好厲害唷! 過五關嘍! 加P幣 %d 元!", 5 * JACK);
game_log(JACK, JACK * 5);
- pressanykey();
+ vmsg("好厲害唷! 過五關嘍! 加P幣 %d 元!", 5 * JACK);
return 0;
}
j = 2;
@@ -516,19 +504,15 @@ card_jack(int *db)
c[j] = 1;
if (card_alls_lower(cpu) > 21) {
card_show(cpu, c, me, m);
- move(b_lines - 1, 0);
- prints("呵呵...電腦爆掉了! 你贏了! 可得P幣 %d 元", JACK * 2);
game_log(JACK, JACK * 2);
- pressanykey();
+ vmsg("呵呵...電腦爆掉了! 你贏了! 可得P幣 %d 元", JACK * 2);
return 0;
}
j++;
}
card_show(cpu, c, me, m);
- move(b_lines - 1, 0);
- prints("哇哇...電腦贏了!");
game_log(JACK, 0);
- pressanykey();
+ vmsg("哇哇...電腦贏了!");
return 0;
}
@@ -595,19 +579,15 @@ ten_helf()
m[i] = 1;
card_show(cpu, c, me, m);
if (card_all(me) > 21) {
- move(b_lines - 1, 0);
- prints("嗚嗚...爆掉了!");
game_log(TEN_HALF, 0);
- pressanykey();
+ vmsg("嗚嗚...爆掉了!");
return 0;
}
i++;
}
if (i == 5) { /* 過五關 */
- move(b_lines - 1, 0);
- prints("好厲害唷! 過五關嘍! 加P幣 %d 元!", 5 * PMONEY);
game_log(TEN_HALF, PMONEY * 5);
- pressanykey();
+ vmsg("好厲害唷! 過五關嘍! 加P幣 %d 元!", 5 * PMONEY);
return 0;
}
j = 1;
@@ -618,19 +598,15 @@ ten_helf()
c[j] = 1;
if (card_all(cpu) > 21) {
card_show(cpu, c, me, m);
- move(b_lines - 1, 0);
- prints("呵呵...電腦爆掉了! 你贏了! 可得P幣 %d 元", PMONEY * 2);
game_log(TEN_HALF, PMONEY * 2);
- pressanykey();
+ vmsg("呵呵...電腦爆掉了! 你贏了! 可得P幣 %d 元", PMONEY * 2);
return 0;
}
j++;
}
card_show(cpu, c, me, m);
- move(b_lines - 1, 0);
- prints("哇哇...電腦贏了!");
game_log(TEN_HALF, 0);
- pressanykey();
+ vmsg("哇哇...電腦贏了!");
return 0;
}
diff --git a/mbbsd/chat.c b/mbbsd/chat.c
index f94cfc5f..06f706c3 100644
--- a/mbbsd/chat.c
+++ b/mbbsd/chat.c
@@ -386,7 +386,7 @@ t_chat()
while (chatting) {
move(b_lines - 1, currchar + chatid_len);
- ch = igetkey();
+ ch = igetch();
switch (ch) {
case KEY_DOWN:
diff --git a/mbbsd/chc.c b/mbbsd/chc.c
index 17cda17e..d80cf276 100644
--- a/mbbsd/chc.c
+++ b/mbbsd/chc.c
@@ -49,7 +49,7 @@ static const char *chess_brd[BRD_ROW * 2 - 1] = {
"├─┼─┼─┼─┼─┼─┼─┼─┤", /* 3 */
"│ │ │ │ │ │ │ │ │",
"├─┴─┴─┴─┴─┴─┴─┴─┤", /* 4 */
- "│ 凱 達 格 藍 大 道 │",
+ "│ 楚 河 漢 界 │",
"├─┬─┬─┬─┬─┬─┬─┬─┤", /* 5 */
"│ │ │ │ │ │ │ │ │",
"├─┼─┼─┼─┼─┼─┼─┼─┤", /* 6 */
@@ -575,14 +575,14 @@ hisplay(int s, chcusr_t *user1, chcusr_t *user2, board_t board, board_t tmpbrd)
if (chc_lefttime < 0) {
chc_lefttime = 0;
- /* to make him break out igetkey() */
+ /* to make him break out igetch() */
chc_from.r = -2;
chc_broadcast_send(act_list, board);
}
chc_drawline(board, user1, user2, TIME_ROW);
move(1, 0);
oflush();
- switch (igetkey()) {
+ switch (igetch()) {
case 'q':
endgame = 2;
endturn = 1;
@@ -653,7 +653,7 @@ myplay(int s, chcusr_t *user1, chcusr_t *user2, board_t board, board_t tmpbrd)
chc_drawline(board, user1, user2, TIME_ROW);
chc_movecur(chc_cursor.r, chc_cursor.c);
oflush();
- ch = igetkey();
+ ch = igetch();
chc_lefttime = CHC_TIMEOUT - (now - start_time);
if (chc_lefttime < 0)
ch = 'q';
diff --git a/mbbsd/chicken.c b/mbbsd/chicken.c
index 1685d842..e285856d 100644
--- a/mbbsd/chicken.c
+++ b/mbbsd/chicken.c
@@ -127,8 +127,7 @@ new_chicken()
reload_money();
price = egg_price[(int)mychicken->type];
if (cuser.money < price) {
- prints("\n 錢不夠買蛋蛋,蛋蛋要 %d 元", price);
- refresh();
+ vmsg("\n 錢不夠買蛋蛋,蛋蛋要 %d 元", price);
return 0;
}
vice(price, "寵物蛋");
@@ -400,12 +399,10 @@ ch_buyitem(int money, char *picture, int *item, int haveticket)
else
demoney(-money * num);
show_file(picture, 5, 14, NO_RELOAD);
+ pressanykey();
} else {
- move(b_lines - 1, 0);
- clrtoeol();
- outs("現金不夠 !!!");
+ vmsg("現金不夠 !!!");
}
- pressanykey();
}
static void
@@ -928,20 +925,18 @@ chickenpk(int fd)
memcpy(&ouser, &xuser, sizeof(userec_t));
reload_chicken();
if (!ochicken->name[0] || !mychicken->name[0]) {
- outmsg("有一方沒有寵物"); /* Ptt:妨止page時把寵物賣掉 */
bell();
- refresh();
+ vmsg("有一方沒有寵物"); /* Ptt:妨止page時把寵物賣掉 */
add_io(0, 0);
close(fd);
unlockutmpmode();
- sleep(1);
return 0;
}
show_chicken_data(ochicken, mychicken);
add_io(fd, 3); /* 把fd加到igetch監視 */
while (1) {
r = rand();
- ch = igetkey();
+ ch = igetch();
getuser(mateid);
memcpy(&ouser, &xuser, sizeof(userec_t));
reload_chicken();
diff --git a/mbbsd/dark.c b/mbbsd/dark.c
index 4c9c6486..e26dd890 100644
--- a/mbbsd/dark.c
+++ b/mbbsd/dark.c
@@ -1,4 +1,4 @@
-/* $Id: dark.c,v 1.8 2002/07/22 19:02:00 in2 Exp $ */
+/* $Id$ */
#include "bbs.h"
#define RED 1
@@ -33,14 +33,6 @@ brdswap(sint y, sint x, sint ly, sint lx)
brd[ly][lx].value = -1;
}
-static void
-pprints(sint y, sint x, char *s)
-{
- move(y, x);
- clrtoeol();
- prints("%s", s);
-}
-
static sint
Is_win(item att, item det, sint y, sint x, sint ly, sint lx)
{
@@ -370,11 +362,11 @@ main_dark(int fd, userinfo_t * uin)
if (currutmp->turn) {
brd_rand();
send(fd, &brd, sizeof(brd), 0);
- pprints(21, 0, " ◆你是先手");
- pprints(22, 0, " ◆輪到你下了");
+ mouts(21, 0, " ◆你是先手");
+ mouts(22, 0, " ◆輪到你下了");
} else {
recv(fd, &brd, sizeof(brd), 0);
- pprints(21, 0, " ◆你是後手");
+ mouts(21, 0, " ◆你是後手");
}
move(12, 3);
prints("%s[0勝0敗]vs.%s[0勝0敗]", currutmp->userid, currutmp->mateid);
@@ -396,7 +388,7 @@ main_dark(int fd, userinfo_t * uin)
end = -1;
break;
}
- ch = igetkey();
+ ch = igetch();
if (ch == I_OTHERDATA) {
ch = recv(fd, &curr, sizeof(curr), 0);
if (ch != sizeof(curr)) {
@@ -412,20 +404,20 @@ main_dark(int fd, userinfo_t * uin)
break;
}
if (curr.end == -3)
- pprints(23, 30, "\033[33m要求合棋\033[m");
+ mouts(23, 30, "\033[33m要求合棋\033[m");
else if (curr.end == -4)
- pprints(23, 30, "\033[33m要求換邊\033[m");
+ mouts(23, 30, "\033[33m要求換邊\033[m");
else if (curr.end == -5)
- pprints(23, 30, "\033[33m要求連吃\033[m");
+ mouts(23, 30, "\033[33m要求連吃\033[m");
else
- pprints(23, 30, "");
+ mouts(23, 30, "");
recv(fd, &brd, sizeof(brd), 0);
my = curr.y;
mx = curr.x;
redraw();
if (curr.end)
- pprints(22, 0, " ◆輪到你下了");
+ mouts(22, 0, " ◆輪到你下了");
move(cury[my], curx[mx]);
} else {
if (currutmp->turn == 'p') {
@@ -434,7 +426,7 @@ main_dark(int fd, userinfo_t * uin)
currutmp->turn = 'e';
break;
} else {
- pprints(23, 30, "");
+ mouts(23, 30, "");
*buf = 0;
currutmp->turn = (uin->turn) ? 0 : 1;
}
@@ -442,17 +434,17 @@ main_dark(int fd, userinfo_t * uin)
if (ch == 'y') {
currutmp->color = (currutmp->color == '1') ? '0' : '1';
uin->color = (uin->color == '1') ? '0' : '1';
- pprints(21, 0, (currutmp->color == '1') ? " \033[1;33m◆你持紅色棋\033[m" : " \033[1;33m◆你持黑色棋\033[m");
+ mouts(21, 0, (currutmp->color == '1') ? " \033[1;33m◆你持紅色棋\033[m" : " \033[1;33m◆你持黑色棋\033[m");
} else {
- pprints(23, 30, "");
+ mouts(23, 30, "");
currutmp->turn = (uin->turn) ? 0 : 1;
}
} else if (currutmp->turn == 'g') {
if (ch == 'y') {
cont = 1;
- pprints(21, 0, " \033[1;33m◆你持紅色棋\033[m 可連吃");
+ mouts(21, 0, " \033[1;33m◆你持紅色棋\033[m 可連吃");
} else {
- pprints(23, 30, "");
+ mouts(23, 30, "");
currutmp->turn = (uin->turn) ? 0 : 1;
}
}
@@ -460,7 +452,7 @@ main_dark(int fd, userinfo_t * uin)
if (uin->turn == 'g') {
cont = 1;
uin->turn = (currutmp->turn) ? 0 : 1;
- pprints(21, 10, "可連吃");
+ mouts(21, 10, "可連吃");
}
end = playing(fd, currutmp->color - '0', ch, &go_on, uin);
@@ -493,12 +485,12 @@ main_dark(int fd, userinfo_t * uin)
continue;
}
if (!i && currutmp->color == '1') {
- pprints(21, 0, " \033[1;33m◆你持紅色棋\033[m");
+ mouts(21, 0, " \033[1;33m◆你持紅色棋\033[m");
i++;
move(cury[my], curx[mx]);
}
if (!i && currutmp->color == '0') {
- pprints(21, 0, " \033[1;33m◆你持黑色棋\033[m");
+ mouts(21, 0, " \033[1;33m◆你持黑色棋\033[m");
i++;
move(cury[my], curx[mx]);
}
@@ -540,7 +532,7 @@ main_dark(int fd, userinfo_t * uin)
}
break;
case -3:
- pprints(22, 0, "合棋唷!! 下次在分高下吧 ^_^");
+ mouts(22, 0, "合棋唷!! 下次在分高下吧 ^_^");
break;
default:
add_io(0, 0);
diff --git a/mbbsd/edit.c b/mbbsd/edit.c
index acc7bac0..eda5da08 100644
--- a/mbbsd/edit.c
+++ b/mbbsd/edit.c
@@ -258,7 +258,7 @@ ask(char *prompt)
standout();
prints("%s", prompt);
standend();
- ch = igetkey();
+ ch = igetch();
move(0, 0);
clrtoeol();
return (ch);
@@ -966,7 +966,6 @@ write_file(char *fpath, int saveheader, int *islocal)
switch (ans[0]) {
case 'a':
outs("文章\033[1m 沒有 \033[m存入");
- safe_sleep(1);
aborted = -1;
break;
case 'r':
@@ -1682,7 +1681,7 @@ vedit(char *fpath, int saveheader, int *islocal)
move(curr_window_line, ch);
if (!line_dirty && strcmp(line, currline->data))
strcpy(line, currline->data);
- ch = igetkey();
+ ch = igetch();
/* jochang debug */
if ((interval = (now - th))) {
th = now;
@@ -1836,28 +1835,27 @@ vedit(char *fpath, int saveheader, int *islocal)
char *tmp, *apos = ans;
int fg, bg;
- strlcpy(color, "\033[", sizeof(color));
+ strcpy(color, "\033[");
if (isdigit(*apos)) {
- snprintf(color, sizeof(color),
- "%s%c", color, *(apos++));
+ sprintf(color,"%s%c", color, *(apos++));
if (*apos)
- snprintf(color, sizeof(color), "%s;", color);
+ strcat(color, ";");
}
if (*apos) {
if ((tmp = strchr(t, toupper(*(apos++)))))
fg = tmp - t + 30;
else
fg = 37;
- snprintf(color, sizeof(color), "%s%d", color, fg);
+ sprintf(color, "%s%d", color, fg);
}
if (*apos) {
if ((tmp = strchr(t, toupper(*(apos++)))))
bg = tmp - t + 40;
else
bg = 40;
- snprintf(color, sizeof(color), "%s;%d", color, bg);
+ sprintf(color, "%s;%d", color, bg);
}
- snprintf(color, sizeof(color), "%sm", color);
+ strcat(color, "m");
insert_string(color);
} else
insert_string(reset_color);
@@ -2023,7 +2021,7 @@ vedit(char *fpath, int saveheader, int *islocal)
case '\n':
#ifdef MAX_EDIT_LINE
if( totaln == MAX_EDIT_LINE ){
- vmsg("MAX_EDIT_LINE exceed");
+ outs("MAX_EDIT_LINE exceed");
break;
}
#endif
diff --git a/mbbsd/gamble.c b/mbbsd/gamble.c
index 33e67bb8..512df7f2 100644
--- a/mbbsd/gamble.c
+++ b/mbbsd/gamble.c
@@ -159,9 +159,7 @@ ticket(int bid)
ch_buyitem(price, "etc/buyticket", &n, 0);
if (bid && !dashf(fn_ticket)) {
- move(b_lines - 1, 0);
- prints("哇!! 耐ㄚ捏...板主已經停止下注了 不能賭嚕");
- pressanykey();
+ vmsg("哇!! 耐ㄚ捏...板主已經停止下注了 不能賭嚕");
break;
}
diff --git a/mbbsd/gomo.c b/mbbsd/gomo.c
index 55060b67..82e9af8f 100644
--- a/mbbsd/gomo.c
+++ b/mbbsd/gomo.c
@@ -371,7 +371,7 @@ gomoku(int fd)
} else
clrtoeol();
BGOTOCUR(mv.x, mv.y);
- ch = igetkey();
+ ch = igetch();
if (ch != I_OTHERDATA)
iwantpass = 0;
if (ch == 'q') {
diff --git a/mbbsd/io.c b/mbbsd/io.c
index 829386f8..78adddda 100644
--- a/mbbsd/io.c
+++ b/mbbsd/io.c
@@ -174,6 +174,7 @@ dogetch()
if (len == 0 || errno != EINTR)
abort_bbs(0);
/* raise(SIGHUP); */
+
}
#ifdef SKIP_TELNET_CONTROL_SIGNAL
} while( inbuf[0] == -1 );
@@ -198,9 +199,32 @@ static int water_which_flag = 0;
int
igetch()
{
- register int ch;
- while ((ch = dogetch())) {
+ register int ch, mode = 0, last = 0;
+ while ((ch = dogetch())) {
+ if (mode == 0 && ch == KEY_ESC) // here is state machine for 2 bytes key
+ mode = 1;
+ else if (mode == 1) { /* Escape sequence */
+ if (ch == '[' || ch == 'O')
+ mode = 2;
+ else if (ch == '1' || ch == '4')
+ { mode = 3; last = ch; }
+ else
+ {
+ KEY_ESC_arg = ch;
+ return KEY_ESC;
+ }
+ } else if (mode == 2 && ch >= 'A' && ch <= 'D') /* Cursor key */
+ return KEY_UP + (ch - 'A');
+ else if (mode == 2 && ch >= '1' && ch <= '6')
+ { mode = 3; last = ch; }
+ else if (mode == 3 && ch == '~') { /* Ins Del Home End PgUp PgDn */
+ return KEY_HOME + (last - '1');
+ }
+ else // here is switch for default keys
switch (ch) {
+ case IAC:
+ case '\n': /* filters */
+ continue;
#ifdef DEBUG
case Ctrl('Q'):{
struct rusage ru;
@@ -234,8 +258,8 @@ igetch()
free(screen0);
redoscr();
continue;
- } else
- return (ch);
+ }
+ return ch;
case KEY_TAB:
if (WATERMODE(WATER_ORIG) || WATERMODE(WATER_NEW))
if (currutmp != NULL && watermode > 0) {
@@ -244,8 +268,7 @@ igetch()
t_display_new();
continue;
}
- return ch;
- break;
+ return ch;
case Ctrl('R'):
if (currutmp == NULL)
@@ -304,9 +327,7 @@ igetch()
continue;
}
}
- return ch;
- case '\n': /* Ptt把 \n拿掉 */
- continue;
+ return ch;
case Ctrl('T'):
if (WATERMODE(WATER_ORIG) || WATERMODE(WATER_NEW)) {
if (watermode > 0) {
@@ -318,7 +339,7 @@ igetch()
continue;
}
}
- return (ch);
+ return ch;
case Ctrl('F'):
if (WATERMODE(WATER_NEW)) {
@@ -337,7 +358,7 @@ igetch()
continue;
}
}
- return ch;
+ return ch;
case Ctrl('G'):
if (WATERMODE(WATER_NEW)) {
@@ -352,14 +373,10 @@ igetch()
continue;
}
}
- return ch;
- case IAC:
- // disallow user input telnet protocol leading char IAC chr(255)
- // TODO parse telnet protocol
- continue;
+ return ch;
default:
- return ch;
+ return ch;
}
}
return 0;
@@ -485,7 +502,7 @@ oldgetdata(int line, int col, char *prompt, char *buf, int len, int echo)
edit_outs(buf);
clen = currchar = strlen(buf);
- while (move(y, x + currchar), (ch = igetkey()) != '\r') {
+ while (move(y, x + currchar), (ch = igetch()) != '\r') {
switch (ch) {
case KEY_DOWN: case Ctrl('N'):
case KEY_UP: case Ctrl('P'):
@@ -587,14 +604,6 @@ getdata_buf(int line, int col, char *prompt, char *buf, int len, int echo)
return oldgetdata(line, col, prompt, buf, len, echo);
}
-char
-getans(char *prompt)
-{
- char ans[5];
-
- getdata(b_lines, 0, prompt, ans, sizeof(ans), LCECHO);
- return ans[0];
-}
int
getdata_str(int line, int col, char *prompt, char *buf, int len, int echo, char *defaultstr)
@@ -611,61 +620,4 @@ getdata(int line, int col, char *prompt, char *buf, int len, int echo)
return oldgetdata(line, col, prompt, buf, len, echo);
}
-int
-rget(int x, char *prompt)
-{
- register int ch;
-
- move(x, 0);
- clrtobot();
- outs(prompt);
- refresh();
- ch = igetch();
- if (ch >= 'A' && ch <= 'Z')
- ch = tolower(ch);
-
- return ch;
-}
-
-
-int
-igetkey()
-{
- int mode;
- int ch, last;
-
- mode = last = 0;
- while (1) {
- if( !(ch = igetch()) )
- continue;
- if (mode == 0) {
- if (ch == KEY_ESC)
- mode = 1;
- else
- return ch; /* Normal Key */
- } else if (mode == 1) { /* Escape sequence */
- if (ch == '[' || ch == 'O')
- mode = 2;
- else if (ch == '1' || ch == '4')
- mode = 3;
- else {
- KEY_ESC_arg = ch;
- return KEY_ESC;
- }
- } else if (mode == 2) { /* Cursor key */
- if (ch >= 'A' && ch <= 'D')
- return KEY_UP + (ch - 'A');
- else if (ch >= '1' && ch <= '6')
- mode = 3;
- else
- return ch;
- } else if (mode == 3) { /* Ins Del Home End PgUp PgDn */
- if (ch == '~')
- return KEY_HOME + (last - '1');
- else
- return ch;
- }
- last = ch;
- }
-}
diff --git a/mbbsd/mail.c b/mbbsd/mail.c
index 6c0ae7c7..6198004b 100644
--- a/mbbsd/mail.c
+++ b/mbbsd/mail.c
@@ -24,20 +24,14 @@ setforward()
getdata(b_lines, 0, "確定開啟自動轉信功\能?(Y/n)", yn, sizeof(yn),
LCECHO);
if (yn[0] != 'n' && (fp = fopen(buf, "w"))) {
- move(b_lines, 0);
- clrtoeol();
fprintf(fp, "%s", ip);
fclose(fp);
- outs("設定完成!");
- refresh();
+ vmsg("設定完成!");
return 0;
}
}
- move(b_lines, 0);
- clrtoeol();
- outs("取消自動轉信!");
unlink(buf);
- refresh();
+ vmsg("取消自動轉信!");
return 0;
}
@@ -163,27 +157,13 @@ chkmailbox()
mailmaxkeep = max_keepmail + cuser.exmailbox;
m_init();
if ((mailkeep = get_num_records(currmaildir, sizeof(fileheader_t))) >
- mailmaxkeep) {
- move(b_lines, 0);
- clrtoeol();
- bell();
- prints("您保存信件數目 %d 超出上限 %d, 請整理",
- mailkeep, mailmaxkeep);
+ mailmaxkeep ||
+ (mailsum = get_sum_records(currmaildir, sizeof(fileheader_t))) >
+ mailsumlimit) {
bell();
- refresh();
- igetch();
- return mailkeep;
- }
- if ((mailsum = get_sum_records(currmaildir, sizeof(fileheader_t))) >
- mailsumlimit) {
- move(b_lines, 0);
- clrtoeol();
bell();
- prints("您保存信件容量 %d(k)超出上限 %d(k), 請整理",
- mailsum, mailsumlimit);
- bell();
- refresh();
- igetch();
+ vmsg("您保存信件數目或容量 %d 超出上限 %d, 請整理",
+ mailkeep, mailmaxkeep);
return mailkeep;
}
}
@@ -498,13 +478,9 @@ multi_send(char *title)
if (vedit(fpath, YEA, NULL) == -1) {
unlink(fpath);
curredit = 0;
- outs(msg_cancel);
- pressanykey();
+ vmsg(msg_cancel);
return;
}
- stand_title("寄信中...");
- refresh();
-
listing = 80;
for (p = toplev; p; p = p->next) {
@@ -530,15 +506,14 @@ multi_send(char *title)
mymail.filemode |= FILE_MULTI; /* multi-send flag */
sethomedir(genbuf, p->word);
if (append_record_forward(genbuf, &mymail, sizeof(mymail)) == -1)
- outs(err_uid);
+ vmsg(err_uid);
mailalert(p->word);
}
hold_mail(fpath, NULL);
unlink(fpath);
curredit = 0;
} else
- outs(msg_cancel);
- pressanykey();
+ vmsg(msg_cancel);
}
static int
@@ -636,8 +611,7 @@ mail_all()
outs(err_uid);
snprintf(genbuf, sizeof(genbuf),
"%*s %5d / %5d", IDLEN + 1, userid, i + 1, unum);
- outmsg(genbuf);
- refresh();
+ vmsg(genbuf);
}
}
return 0;
@@ -746,12 +720,9 @@ read_new_mail(fileheader_t * fptr)
multi_reply(idc, fptr, currmaildir);
return FULLUPDATE;
}
- move(b_lines, 0);
- clrtoeol();
- outs(msg_mailer);
- refresh();
+ outmsg(msg_mailer);
- switch (egetch()) {
+ switch (igetch()) {
case 'r':
case 'R':
mail_reply(idc, fptr, currmaildir);
@@ -923,12 +894,9 @@ mail_read(int ent, fileheader_t * fhdr, char *direct)
multi_reply(ent, fhdr, direct);
return FULLUPDATE;
}
- move(b_lines, 0);
- clrtoeol();
- refresh();
- outs(msg_mailer);
+ outmsg(msg_mailer);
- switch (egetch()) {
+ switch (igetch()) {
case 'r':
case 'R':
replied = YEA;
@@ -1606,8 +1574,7 @@ doforward(char *direct, fileheader_t * fh, int mode)
strlcpy(address, cuser.email, sizeof(address));
if( mode == 'U' ){
- move(b_lines, 0);
- prints("將進行 uuencode 。若您不清楚什麼是 uuencode 請改用 F轉寄。");
+ vmsg("將進行 uuencode 。若您不清楚什麼是 uuencode 請改用 F轉寄。");
}
if (address[0]) {
@@ -1632,7 +1599,7 @@ doforward(char *direct, fileheader_t * fh, int mode)
snprintf(address, sizeof(address),
"%s.bbs@%s", fname, MYHOSTNAME);
} else {
- outmsg("取消轉寄");
+ vmsg("取消轉寄");
return 1;
}
} while (mode == 'Z' && strstr(address, MYHOSTNAME));
@@ -1640,9 +1607,7 @@ doforward(char *direct, fileheader_t * fh, int mode)
if (invalidaddr(address))
return -2;
- snprintf(fname, sizeof(fname), "正轉寄給 %s, 請稍候...", address);
- outmsg(fname);
- move(b_lines, 0);
+ outmsg("正轉寄請稍候...");
refresh();
/* 追蹤使用者 */
diff --git a/mbbsd/mbbsd.c b/mbbsd/mbbsd.c
index 927a7333..8cef890c 100644
--- a/mbbsd/mbbsd.c
+++ b/mbbsd/mbbsd.c
@@ -168,7 +168,7 @@ u_exit(char *mode)
cuser.pager = currutmp->pager;
memcpy(cuser.mind, currutmp->mind, 4);
setutmpbid(0);
- if (!(HAS_PERM(PERM_SYSOP) && HAS_PERM(PERM_DENYPOST)) &&
+ if (!(HAS_PERM(PERM_SYSOP) && HAS_PERM(PERM_SYSOPHIDE)) &&
!currutmp->invisible)
do_aloha("<<下站通知>> -- 我走囉!");
@@ -183,18 +183,6 @@ u_exit(char *mode)
}
void
-system_abort()
-{
- if (currmode)
- u_exit("ABORT");
-
- clear();
- refresh();
- fprintf(stdout, "謝謝光臨, 記得常來喔 !\n");
- exit(0);
-}
-
-void
abort_bbs(int sig)
{
if (currmode)
@@ -424,7 +412,7 @@ write_request(int sig)
memmove(&currutmp->msgs[0],
&currutmp->msgs[1],
sizeof(msgque_t) * currutmp->msgcount);
- igetkey();
+ igetch();
}
}
@@ -473,14 +461,12 @@ multi_user_check()
log_usies("KICK ", cuser.username);
} else {
if (search_ulistn(usernum, 3) != NULL)
- system_abort(); /* Goodbye(); */
+ abort_bbs(0); /* Goodbye(); */
}
} else {
/* allow multiple guest user */
if (search_ulistn(usernum, 100) != NULL) {
- outs("\n抱歉,目前已有太多 guest 在站上, 請用new註冊。\n");
- pressanykey();
- oflush();
+ vmsg("\n抱歉,目前已有太多 guest 在站上, 請用new註冊。\n");
exit(1);
}
}
@@ -604,7 +590,7 @@ login_query()
cuser.userlevel = PERM_BASIC | PERM_CHAT | PERM_PAGE |
PERM_POST | PERM_LOGINOK | PERM_MAILLIMIT |
PERM_CLOAK | PERM_SEECLOAK | PERM_XEMPT |
- PERM_DENYPOST | PERM_BM | PERM_ACCOUNTS |
+ PERM_SYSOPHIDE | PERM_BM | PERM_ACCOUNTS |
PERM_CHATROOM | PERM_BOARD | PERM_SYSOP | PERM_BBSADM;
mkuserdir(cuser.userid);
#endif
@@ -873,7 +859,7 @@ static void init_guest_info(void)
currutmp->pager = 2;
}
-#ifdef FOREIGN_REG
+#ifdef FOREIGN_REG_DAY
inline static void foreign_warning(void){
if ((cuser.uflag2 & FOREIGN) && !(cuser.uflag2 & LIVERIGHT)){
if (login_start_time - cuser.firstlogin > (FOREIGN_REG_DAY - 5) * 24 * 3600){
@@ -949,7 +935,7 @@ user_login()
SHM->max_time = now;
}
- if (!(HAS_PERM(PERM_SYSOP) && HAS_PERM(PERM_DENYPOST)) &&
+ if (!(HAS_PERM(PERM_SYSOP) && HAS_PERM(PERM_SYSOPHIDE)) &&
!currutmp->invisible)
do_aloha("<<上站通知>> -- 我來啦!");
@@ -981,7 +967,7 @@ user_login()
if (!PERM_HIDE(currutmp))
cuser.lastlogin = login_start_time;
-#ifdef FOREIGN_REG
+#ifdef FOREIGN_REG_DAY
foreign_warning();
#endif
passwd_update(usernum, &cuser);
diff --git a/mbbsd/menu.c b/mbbsd/menu.c
index 5f8276b8..3c4dcbae 100644
--- a/mbbsd/menu.c
+++ b/mbbsd/menu.c
@@ -5,25 +5,6 @@
static int refscreen = NA;
extern char *boardprefix;
extern struct utmpfile_t *utmpshm;
-
-int
-egetch()
-{
- int rval;
-
- while (1) {
- rval = igetkey();
- if (talkrequest) {
- talkreply();
- refscreen = YEA;
- return rval;
- }
- if (rval != Ctrl('L'))
- return rval;
- redoscr();
- }
-}
-
extern char *fn_board;
extern char board_hidden_status;
@@ -311,7 +292,7 @@ domenu(int cmdmode, char *cmdtitle, int cmd, commands_t cmdtable[])
pos++;
cursor_show(menu_row + pos, menu_column);
- } while (((cmd = egetch()) != EOF) || refscreen);
+ } while (((cmd = igetch()) != EOF) || refscreen);
abort_bbs(0);
}
diff --git a/mbbsd/more.c b/mbbsd/more.c
index 25b3d8dc..d8fb9306 100644
--- a/mbbsd/more.c
+++ b/mbbsd/more.c
@@ -23,7 +23,6 @@ static char *more_help[] = {
"(TAB) URL連結",
"(Ctrl-T) 存到暫存檔",
"(:/f/b) 跳至某頁/下/上篇",
- "(F/B) 跳至同一搜尋主題下/上篇",
"(a/A) 跳至同一作者下/上篇",
"([/]) 主題式閱\讀 上/下",
"(t) 主題式循序閱\讀",
@@ -330,7 +329,7 @@ more(char *fpath, int promptend)
while (line == b_lines || (line > 0 && viewed == fsize)) {
- switch ((ch = egetch())) {
+ switch ((ch = igetch())) {
case ':':
{
char buf[10];
diff --git a/mbbsd/name.c b/mbbsd/name.c
index 9d467352..3cb2b698 100644
--- a/mbbsd/name.c
+++ b/mbbsd/name.c
@@ -264,7 +264,6 @@ namecomplete(char *prompt, char *data)
prints("%*s", IDLEN + 1, "");
standend();
move(y, x);
- refresh();
while ((ch = igetch()) != EOF) {
if (ch == '\n' || ch == '\r') {
@@ -309,8 +308,7 @@ namecomplete(char *prompt, char *data)
len = MaxLen(morelist, p_lines);
}
if (morelist) {
- move(b_lines, 0);
- outs(msg_more);
+ vmsg(msg_more);
}
move(y, x);
continue;
@@ -356,7 +354,6 @@ namecomplete(char *prompt, char *data)
raise(SIGHUP); /* jochang: don't know if this is
* necessary... */
outc('\n');
- refresh();
if (clearbot) {
move(2, 0);
clrtobot();
@@ -434,8 +431,7 @@ usercomplete(char *prompt, char *data)
len = UserMaxLen((arrptr) cwlist, cwnum, morenum, p_lines);
}
if (morenum < cwnum) {
- move(b_lines, 0);
- outs(msg_more);
+ vmsg(msg_more);
} else
morenum = 0;
move(y, x);
@@ -478,7 +474,6 @@ usercomplete(char *prompt, char *data)
/* longjmp(byebye, -1); */
raise(SIGHUP); /* jochang: don't know if this is necessary */
outc('\n');
- refresh();
if (clearbot) {
move(2, 0);
clrtobot();
@@ -561,7 +556,6 @@ generalnamecomplete(char *prompt, char *data, int len, size_t nmemb,
prints("%*s", IDLEN + 1, "");
standend();
move(y, x);
- refresh();
ptr = 0;
data[ptr] = 0;
@@ -611,8 +605,7 @@ generalnamecomplete(char *prompt, char *data, int len, size_t nmemb,
col += len + 2;
}
if (morelist != end + 1) {
- move(b_lines, 0);
- outs(msg_more);
+ vmsg(msg_more);
}
move(y, x);
continue;
@@ -651,7 +644,6 @@ generalnamecomplete(char *prompt, char *data, int len, size_t nmemb,
}
outc('\n');
- refresh();
if (clearbot) {
move(2, 0);
clrtobot();
diff --git a/mbbsd/othello.c b/mbbsd/othello.c
index 96fea2e2..eba90375 100644
--- a/mbbsd/othello.c
+++ b/mbbsd/othello.c
@@ -124,7 +124,7 @@ get_key(char nowx, char nowy)
int ch;
move(STARTX - 1 + nowx * 2, STARTY - 1 + nowy * 4);
- ch = igetkey();
+ ch = igetch();
move(STARTX - 1 + nowx * 2, STARTY - 2 + nowy * 4);
if (nowboard[(int)nowx][(int)nowy] != HINT || if_hint == 1)
outs(CHESS_TYPE[(int)nowboard[(int)nowx][(int)nowy]]);
@@ -274,7 +274,7 @@ end_of_game(int quit)
if (fp)
fclose(fp);
move(1, 1);
- igetkey();
+ igetch();
}
static void
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;
diff --git a/mbbsd/register.c b/mbbsd/register.c
index 9e6c60b3..71d653a2 100644
--- a/mbbsd/register.c
+++ b/mbbsd/register.c
@@ -175,9 +175,7 @@ getnewuserid()
i = searchnewuser(1);
if ((i <= 0) || (i > MAX_USERS)) {
passwd_unlock();
- if (more("etc/user_full", NA) == -1)
- fprintf(stdout, "抱歉,使用者帳號已經滿了,無法註冊新的帳號\n\r");
- safe_sleep(2);
+ vmsg("抱歉,使用者帳號已經滿了,無法註冊新的帳號");
exit(1);
}
snprintf(genbuf, sizeof(genbuf), "uid %d", i);
@@ -203,10 +201,7 @@ new_register()
if( passbuf[0] == 'y' )
break;
if( passbuf[0] == 'n' ){
- clear();
- outs("\n抱歉, 您須要接受使用者條款才能註冊帳號享受我們的服務唷!");
- pressanykey();
- oflush();
+ vmsg("\n抱歉, 您須要接受使用者條款才能註冊帳號享受我們的服務唷!");
exit(1);
}
vmsg("請輸入 y表示接受, n表示不接受");
@@ -217,11 +212,7 @@ new_register()
try = 0;
while (1) {
if (++try >= 6) {
- outs("\n您嘗試錯誤的輸入太多,請下次再來吧\n");
- refresh();
-
- pressanykey();
- oflush();
+ vmsg("\n您嘗試錯誤的輸入太多,請下次再來吧\n");
exit(1);
}
getdata(17, 0, msg_uid, newuser.userid,
@@ -243,11 +234,7 @@ new_register()
try = 0;
while (1) {
if (++try >= 6) {
- outs("\n您嘗試錯誤的輸入太多,請下次再來吧\n");
- refresh();
-
- pressanykey();
- oflush();
+ vmsg("\n您嘗試錯誤的輸入太多,請下次再來吧\n");
exit(1);
}
if ((getdata(19, 0, "請設定密碼:", passbuf,
diff --git a/mbbsd/screen.c b/mbbsd/screen.c
index 43df3757..dcfafe2e 100644
--- a/mbbsd/screen.c
+++ b/mbbsd/screen.c
@@ -445,7 +445,7 @@ prints(char *fmt,...)
}
void
-mprints(int y, int x, char *str)
+mouts(int y, int x, char *str)
{
move(y, x);
clrtoeol();
diff --git a/mbbsd/stuff.c b/mbbsd/stuff.c
index e088b116..7f5e495a 100644
--- a/mbbsd/stuff.c
+++ b/mbbsd/stuff.c
@@ -401,64 +401,57 @@ capture_screen()
}
}
-void
-pressanykey()
+int
+vmsg_lines(const int lines, const char msg[])
{
int ch;
- outmsg("\033[37;45;1m "
- "● 請按 \033[33m(Space/Return)\033[37m 繼續 ●"
- " \033[33m(^T)\033[37m 存暫存檔 \033[m");
- do {
- ch = igetkey();
+ move(lines, 0);
+ clrtoeol();
+
+ if (msg)
+ outs((char *)msg);
+ else
+ outs("\033[45;1m \033[37m"
+ "\033[200m\033[1431m\033[506m□ 請按 \033[33m(Space/Return)\033[37m 繼續 □\033[201m (^T) 收到暫存檔 \033[m");
- if (ch == Ctrl('T')) {
+ do {
+ if( (ch = igetch()) == Ctrl('T') )
capture_screen();
- break;
- }
- } while ((ch != ' ') && (ch != KEY_LEFT) && (ch != '\r') && (ch != '\n'));
- move(b_lines, 0);
+ } while( ch == 0 );
+
+ move(lines, 0);
clrtoeol();
- refresh();
+ return ch;
}
int
-vmsg(const char *fmt,...)
+getans(const char *fmt,...)
{
- va_list ap;
- char msg[80] = {0};
- int ch;
-
+ char msg[128] = {0};
+ va_list ap;
va_start(ap, fmt);
vsnprintf(msg, sizeof(msg), fmt, ap);
va_end(ap);
+ return vmsg_lines(b_lines, msg);
+}
- move(b_lines, 0);
- clrtoeol();
-
- if (*msg)
- prints("\033[1;36;44m ◆ %-55.54s \033[33;46m \033[200m\033[1431m\033[506m[請按任意鍵繼續]\033[201m \033[m", msg);
- else
- outs("\033[46;1m \033[37m"
- "\033[200m\033[1431m\033[506m□ 請按 \033[33m(Space/Return)\033[37m 繼續 □\033[201m"
- " \033[m");
-
- do {
- ch = igetkey();
-
- if (ch == Ctrl('T')) {
- capture_screen();
- break;
- }
- } while ((ch != ' ') && (ch != KEY_LEFT) && (ch != '\r') && (ch != '\n'));
-
-
- move(b_lines, 0);
- clrtoeol();
- refresh();
- return ch;
+int
+vmsg(const char *fmt,...)
+{
+ char msg[128] = "\033[1;36;44m ◆ ", i;
+ va_list ap;
+ va_start(ap, fmt);
+ i = vsnprintf(msg+14, 100, fmt, ap);
+ va_end(ap);
+ for(i=i+14; i<69; i++)
+ *(msg+i) = ' ';
+ strcat(msg+69,
+ "\033[33;46m \033[200m\033[1431m\033[506m[請按任意鍵繼續]\033[201m \033[m");
+ return vmsg_lines(b_lines, msg);
}
+
void
bell()
{
@@ -548,7 +541,7 @@ cursor_key(int row, int column)
int ch;
cursor_show(row, column);
- ch = egetch();
+ ch = igetch();
move(row, column);
outs(STR_UNCUR);
return ch;
diff --git a/mbbsd/talk.c b/mbbsd/talk.c
index d667fb0a..d7550ba3 100644
--- a/mbbsd/talk.c
+++ b/mbbsd/talk.c
@@ -58,7 +58,7 @@ iswritable_stat(userinfo_t * uentp, int fri_stat)
int
isvisible_stat(userinfo_t * me, userinfo_t * uentp, int fri_stat)
{
- if (uentp->userid[0] == 0)
+ if (!uentp || uentp->userid[0] == 0)
return 0;
if (PERM_HIDE(uentp) && !(PERM_HIDE(me))) /* 對方紫色隱形而你沒有 */
@@ -512,7 +512,7 @@ my_write2(void)
which = 0;
do {
- switch ((ch = igetkey())) {
+ switch ((ch = igetch())) {
case Ctrl('T'):
case KEY_UP:
if (water_usies != 1) {
@@ -592,9 +592,7 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin)
strlcpy(destid, id, sizeof(destid));
if (!uin && !(flag == 0 && water_which->count > 0)) {
- outmsg("\033[1;33;41m糟糕! 對方已落跑了(不在站上)! \033[37m~>_<~\033[m");
- clrtoeol();
- refresh();
+ vmsg("糟糕! 對方已落跑了(不在站上)! ");
watermode = -1;
return 0;
}
@@ -608,9 +606,6 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin)
/* 一般水球 */
watermode = 0;
if (!(len = getdata(0, 0, prompt, msg, 56, DOECHO))) {
- outmsg("\033[1;33;42m算了! 放你一馬...\033[m");
- clrtoeol();
- refresh();
currutmp->chatid[0] = c0;
currutmp->mode = mode0;
currstat = currstat0;
@@ -635,9 +630,6 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin)
snprintf(buf, sizeof(buf), "丟給 %s : %s [Y/n]?", uin->userid, msg);
getdata(0, 0, buf, genbuf, 3, LCECHO);
if (genbuf[0] == 'n') {
- outmsg("\033[1;33;42m算了! 放你一馬...\033[m");
- clrtoeol();
- refresh();
currutmp->chatid[0] = c0;
currutmp->mode = mode0;
currstat = currstat0;
@@ -647,9 +639,7 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin)
}
watermode = -1;
if (!uin || !*uin->userid || strcasecmp(destid, uin->userid)) {
- outmsg("\033[1;33;41m糟糕! 對方已落跑了(不在站上)! \033[37m~>_<~\033[m");
- clrtoeol();
- refresh();
+ vmsg("糟糕! 對方已落跑了(不在站上)! ");
currutmp->chatid[0] = c0;
currutmp->mode = mode0;
currstat = currstat0;
@@ -712,7 +702,6 @@ my_write(pid_t pid, char *prompt, char *id, int flag, userinfo_t * puin)
}
clrtoeol();
- refresh();
currutmp->chatid[0] = c0;
currutmp->mode = mode0;
@@ -1055,7 +1044,7 @@ do_talk(int fd)
add_io(fd, 0);
while (1) {
- ch = igetkey();
+ ch = igetch();
if (ch == I_OTHERDATA) {
datac = recv(fd, data, sizeof(data), 0);
if (datac <= 0)
@@ -1765,7 +1754,6 @@ draw_pickup(int drawall, pickup_t * pickup, int pickup_way,
"%-2d\033[m\n",
msg_pickup_way[pickup_way], SHM->UTMPnumber,
myfriend, friendme, currutmp->brc_id ? (bfriend + 1) : 0, badfriend);
-
for (i = 0, ch = page * nPickups + 1; i < nPickups; ++i, ++ch) {
move(i + 3, 0);
prints("a");
@@ -1854,7 +1842,7 @@ draw_pickup(int drawall, pickup_t * pickup, int pickup_way,
#endif
);
- refresh();
+ //refresh();
}
}
@@ -1965,7 +1953,7 @@ userlist(void)
case 'H':
if (HAS_PERM(PERM_SYSOP)) {
- currutmp->userlevel ^= PERM_DENYPOST;
+ currutmp->userlevel ^= PERM_SYSOPHIDE;
redrawall = redraw = 1;
}
break;
@@ -2398,12 +2386,9 @@ userlist(void)
cuser.uflag2 -= tmp;
tmp = (tmp + 1) % 3;
cuser.uflag2 |= tmp;
- move(4, 0);
- prints("系統提供 一般 進階 未來 三種模式\n"
+ vmsg("系統提供 一般 進階 未來 三種模式\n"
"在切換後請正常下線再重新登入, 以確保結構正確\n"
"目前切換到 %s 水球模式\n", wm[tmp]);
- refresh();
- sleep(2);
redrawall = redraw = 1;
}
break;
@@ -2617,7 +2602,6 @@ talkreply(void)
char genbuf[200];
int a, sig = currutmp->sig;
- talkrequest = NA;
uip = &SHM->uinfo[currutmp->destuip];
snprintf(page_requestor, sizeof(page_requestor),
"%s (%s)", uip->userid, uip->username);
diff --git a/mbbsd/user.c b/mbbsd/user.c
index 4a544620..f6681cc2 100644
--- a/mbbsd/user.c
+++ b/mbbsd/user.c
@@ -1061,6 +1061,7 @@ toregister(char *email, char *genbuf, char *phone, char *career,
}
}
+#ifndef FOREIGN_REG
static int HaveRejectStr(char *s, char **rej)
{
int i;
@@ -1088,6 +1089,7 @@ static int HaveRejectStr(char *s, char **rej)
}
return 0;
}
+#endif
static char *isvalidname(char *rname)
{
@@ -1368,11 +1370,11 @@ u_register(void)
getfield(11, "含\033[1;33m縣市\033[m及門寢號碼"
"(台北請加\033[1;33m行政區\033[m)",
"目前住址", addr, 50);
- if( (errcode = isvalidaddr(addr)
+ if( (errcode = isvalidaddr(addr)) == NULL
#ifdef FOREIGN_REG
- && fore[0] ==0
+ && fore[0] == 0
#endif
- ) == NULL )
+ )
break;
else
vmsg(errcode);
@@ -1500,7 +1502,7 @@ u_list_CB(int num, userec_t * uentp)
permstr[0] = 'S';
else if (level & PERM_ACCOUNTS)
permstr[0] = 'A';
- else if (level & PERM_DENYPOST)
+ else if (level & PERM_SYSOPHIDE)
permstr[0] = 'p';
if (level & (PERM_BOARD))
@@ -1551,6 +1553,6 @@ u_list()
clrtoeol();
prints("\033[34;46m 已顯示 %d/%d 的使用者(系統容量無上限) "
"\033[31;47m (請按任意鍵繼續) \033[m", usercounter, totalusers);
- egetch();
+ igetch();
return 0;
}
diff --git a/mbbsd/var.c b/mbbsd/var.c
index c9347b20..f559eb6a 100644
--- a/mbbsd/var.c
+++ b/mbbsd/var.c
@@ -382,7 +382,6 @@ char real_name[IDLEN + 1];
int local_article;
/* mbbsd.c */
-int talkrequest = NA;
char fromhost[STRLEN] = "\0";
char water_usies = 0;
FILE *fp_writelog = NULL;
diff --git a/mbbsd/vote.c b/mbbsd/vote.c
index a6cb52c4..5325e64c 100644
--- a/mbbsd/vote.c
+++ b/mbbsd/vote.c
@@ -535,7 +535,7 @@ vote_view_all(char *bname)
setbfile(buf, bname, STR_new_control);
move(0, 0);
if ((fp = fopen(buf, "r"))) {
- prints("(0) ");
+ outs("(0) ");
x = 0;
fclose(fp);
@@ -760,7 +760,6 @@ vote_maintain(char *bname)
move((i % 15) + 2, (i / 15) * 40);
prints(buf);
}
- refresh();
}
snprintf(buf, sizeof(buf), "%c) ", num + 'A');
getdata((num % 15) + 2, (num / 15) * 40, buf,
diff --git a/mbbsd/xyz.c b/mbbsd/xyz.c
index e0b850b5..b20b9d74 100644
--- a/mbbsd/xyz.c
+++ b/mbbsd/xyz.c
@@ -180,9 +180,7 @@ note()
notedata_t myitem;
if (cuser.money < 5) {
- outmsg("\033[1;41m 哎呀! 要投五銀才能留言...沒錢耶..\033[m");
- clrtoeol();
- refresh();
+ vmsg("\033[1;41m 哎呀! 要投五銀才能留言...沒錢耶..\033[m");
return 0;
}
setutmpmode(EDNOTE);
@@ -313,7 +311,7 @@ mail_sysop()
move(12, 0);
clrtobot();
- prints("%16s %-18s權責劃分\n\n", "編號", "站長 ID");
+ outs(" 編號 站長 ID 權責劃分\n\n");
for (i = 0; i < j; i++)
prints("%15d. \033[1;%dm%-16s%s\033[0m\n",
diff --git a/util/account.c b/util/account.c
index bb1b1bc4..6c05b569 100644
--- a/util/account.c
+++ b/util/account.c
@@ -1,6 +1,7 @@
/* $Id$ */
#include "bbs.h"
+//test
#define ACCOUNT_MAX_LINE 16
#define ADJUST_M 6 /* adjust back 5 minutes */
@@ -90,9 +91,10 @@ void gzip(source, target, stamp)
int main(int argc, char **argv)
{
int hour, max, item, total, i, j, mo, da, max_user = 0, max_login = 0,
- max_reg = 0, mahour = 0, k;
+ max_reg = 0, mahour = 0, k, wday;
char *act_file = ".act";
char *log_file = "usies";
+ char *wday_str = "UMTWRFS";
char buf[256], buf1[256], *p;
FILE *fp, *fp1;
int act[27]; /* 次數/累計時間/pointer */
@@ -328,11 +330,29 @@ int main(int argc, char **argv)
if((fp = fopen("etc/feast", "r"))) {
while(fgets(buf1, sizeof(buf1), fp)) {
if(buf[0] != '#' &&
- sscanf(buf1, "%d %d ", &mo, &da) == 2) {
- if(ptime->tm_mday == da && ptime->tm_mon + 1 == mo) {
- i = 1;
- fprintf(fp1, "%-14.14s", &buf1[6]);
- }
+ sscanf(buf1, "%d %c%c", &mo, buf, buf+1) == 3) {
+ if (isdigit(buf[0])) {
+ if (isdigit(buf[1])) {
+ da = 10 * (buf[0] - '0') + (buf[1] - '0');
+ if(ptime->tm_mday == da && ptime->tm_mon + 1 == mo) {
+ i = 1;
+ fprintf(fp1, "%-14.14s", &buf1[6]);
+ }
+ }
+ else {
+ if (buf[0] - '0' <= 4) {
+ wday = 0;
+ buf[1] = toupper(buf[1]);
+ while(wday < 7 && buf[1] != *(wday_str + wday))
+ wday++;
+ if (ptime->tm_mon + 1 == mo && ptime->tm_wday == wday &&
+ (ptime->tm_mday - 1)/7 + 1 == (buf[0] - '0')) {
+ i = 1;
+ fprintf(fp1, "%-14.14s", &buf1[6]);
+ }
+ }
+ }
+ }
}
}
fclose(fp);
@@ -341,7 +361,7 @@ int main(int argc, char **argv)
if(i == 0) {
if((fp = fopen("etc/today_boring", "r"))) {
while(fgets(buf1, sizeof(buf1), fp))
- if(strlen(buf) > 3)
+ if(strlen(buf1) > 3)
fprintf(fp1, "%s", buf1);
fclose(fp);
} else