-
Notifications
You must be signed in to change notification settings - Fork 6
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix Pack 003: LUNATIC FORCE [Stage Final] #61
Fix Pack 003: LUNATIC FORCE [Stage Final] #61
Conversation
ae300e0
to
320f45b
Compare
Currently there is file size inconsistency issue about xover list system with Updated 2020-02-12: |
…ne status. - include/cppdef.h: Add relevant utility macros.
- maple/bbslua.c: Undefine `BBSLUA_HAVE_SYNCNOW` for M3.
After some investigation, the aforementioned issue only occurs on WSL1 and does not affect normal Linux. A workaround mechanism for broken
The mechanism will be implemented in future PRs, and therefore the issue is no longer relevant to this PR. This PR is now reopen and available to be merged again. |
8014083
to
88d8528
Compare
…ear the screen.
…Make `BBS` a module.
…ad of a Ruby array as the argument.
- include/bbs_script.h: Redefine `RUBY_RELEASE_STR` as `MRUBY_RUBY_VERSION` for mruby. - so/xyz.c: `x_siteinfo()`: Show mruby version if mruby is used.
…with empty `backtrace`, e.g., syntax error exceptions.
…tion. Found with `ack 'memcpy\([^,]*?(\b\w+\b)[^,]*?,[^,]*\1'` - maple/more.c: `mgets()` & `mread()` - maple/talk.c: `bmw_rqst()` - maple/xover.c: `Tagger()` - so/chat.c: `t_chat()`
…he last page which is full of items. - Add the local variable `top_prev` to determine whether to display the message. - Move the code of the message display logic from special operations to cursor redraw handling.
… thread article is found.
- maple/talk.c: `pal_search()` & `ulist_search()`. - maple/xover.c: `xo_jump()`. - so/innbbs.c: `innbbs_search()`. - so/list.c: `list_search()`.
…acks. - `XO_HEAD` & `XO_BODY` are required for scrolling - `XO_NONE` cannot be used as xover callback key
… in compile time.
…char buf[T_LINES - 6]`.
…pping and redraw prompt on screen size changes.
…and redraw menu on screen size changes.
…ghtbar system for new users and guests. Guests can be used for system demonstration. New users should inherit the UI behavior for guest to avoid confusion.
- Downgrade most network logging to debug. - Use ngx.exit(444), a special code for nginx to close connection directly, to close request after websocket connection has been established. Fixes: ptt/pttbbs#71 (cherry picked from commit ptt/pttbbs@a3431e4)
(cherry picked from commit ptt/pttbbs@bf3826b)
- `xo_load()`: Use `mmap()` for loading xover records. - Make `xo_pool` a pointer to the xover record of the screen top item - Add `xo_pool_base` for the xover record of the beginning item of the list - Lift the restriction that the size of a xover record should not bigger than `XO_RSIZ`
…l entries at once.
…c for the previous and the next items.
…ling down (`ESC-DOWN` & `J`) a row.
- maple/xover.c: `xo_get()`: Initialize `xo->top` to perform the initial alignment. - maple/post.c: `xypost_pick()` & maple/xover.c: `xo_load()` & `xo_thread()`: Refine the calculation of the position of the list top.
88d8528
to
b58f120
Compare
Demonstration screenshots
innbbsd
setting rewritten withxover()
Fixpack 003 Stage 5 Changelog (en-us):
The translation is currently not available.
Fixpack 003 Stage 5 Changelog (zh-tw):
標記意義:
✨
-重要功能改變;💥
-重要錯誤修正;❗️
-需要特別應對的改變❗️ 需要的特別應對
UTMP::in_addr
的大小改變了,請重開 UTMPSHM,不然進入 BBS 時會立即 crash。xo_pool
的型別改變了,請全部重新編譯,否則列表會出現黑洞項目。✨ 快速鍵與其行為的變更
maple/edit.c
) 可用Esc
和Esc-Esc
輸入 ESC 字元so/mine.c
) 的退出鍵從Esc
改成Esc-Esc
,避免不小心按出去Esc-R
、Esc-T
、Esc-W
快速鍵,對應Ctrl-R
、Ctrl-T
、Ctrl-W
,解決在 PttChrome 上的快速鍵衝突 (雖然可用
Alt-R
、Alt-T
、Alt-W
)maple/menu.c
) 增加搜尋看板的快速鍵S
和/
vkey_match()
&match_getch()
) 的操作:PgUp
/PgDown
,會跳到最尾 / 首頁的首 / 尾項
PgUp
向上翻頁後,游標會對齊頁面尾項。Esc-Up
&K
) 與下捲 (Esc-Down
&J
) 的快速鍵Esc
和Esc-Esc
Esc
和Esc-Esc
💥 系統安全、資料正確的修正
memcpy()
的問題,以免在較新的作業系統上出現資料毀壞的問題
xo_pool[]
還原不完全,可能會造成讀到不存在的文章,以及造成文章黑洞的問題
💥 使用者權限的修正
remove_perm()
只會移除前 1/4MAXBOARD
(1750
) 個看板的寫入權限,導致因 crosspost 或灌水而被停權時,在重新登入前還可以發表文章的問題
💥 影響使用者介面使用的修正
list_search()
(群組名單搜尋) 目標不在第一頁時會跳到錯誤項的問題閱讀紀錄 (BRH) 的修正
brh_add()
: 避免閱讀紀錄為空,且下篇文章的時間值剛好為INT_MAX
時,目前閱讀紀錄的長度會變成目前文章的時間值的問題
brh_add()
時,前面幾篇文章會變成未讀的問題BRH_WINDOW
,避免浪費記憶體空間visio (
maple/visio.c
) 的修正vbuf[]
太大而浪費空間的問題TRAP_ESC
定義時,vkey()
正確處理Esc-Esc
和Esc-<特殊鍵>
vkey()
對I_TIMEOUT
及I_OTHERDATA
的處理vkey()
加上計時要素:Esc
VKEY_ESC_WAIT_TIME_MS
毫秒 (預設 0.65 秒) 後會送出Esc
Esc
後,在VKEY_ESC_WAIT_TIME_MS
毫秒內再按按鍵會送出對應鍵VKEY_SEQ_WAIT_TIME_MS
毫秒內(預設 0.01 秒) 要收到下一個字元,否則送出對應鍵
Esc
,計時減半,直到送出按鍵才回復igetch()
加入的邊界檢查的邊界設定錯誤,造成邊界檢查無效的問題'\xff'
(telnet:IAC IAC
) 的輸出入vget()
的歷史紀錄處理:move()
座標超出範圍的處理,從忽略或跑到下一行開頭,改成限制在範圍內outf()
,如果字串內有一個'\t'
,就把空白填充到此,否則填充到結尾clear()
,clearange()
,clrtoeol()
,clrtobot()
)使用 hardcoded 的成員大小,導致改變資料結構
screenline
成員之大小後,畫面清除函數將無法正確運作的問題
寬/高螢幕顯示的修正
maple/banmail
(檔信列表)、so/aloha
(上站通知名單)、so/brdstat
(看板使用資訊)、so/chatmenu
(聊天室動詞列表)、bitset()
(多重選項設定)b_cols - 1
個字元填滿到b_cols
個字元,像 PttBBS 那樣vget()
的自動完成列表 (vget_match()
) 支援寬螢幕vs_head()
) 的標題置中邏輯,使其達到真置中special_search()
(特殊觀察名單)、so/passwd.c
(送新密碼)b_cols
個字元,像 PttBBS 那樣(T_LINES_REF/a + b, T_COLS_REF/c + d)
會被 map 到真實座標系的
(t_lines/a + b, t_columns/c + d)
上 (有條件限制)T_LINES_DIV_RES % a == 0
,abs(b) < T_LINES_OFF_MAX
,T_COLS_DIV_RES % c == 0
, &abs(d) < T_COLS_OFF_MAX
四個條件要同時成立
gety_ref()
&getx_ref()
: 取得真實座標系的 y/xmove_ref(y, x)
: 呼叫move_ansi(gety_ref(y), getx_ref(x))
vget()
(輸入框處理函數) 在畫面大小改變後,按任意鍵可以調整位置重繪pfterm 的修正
maple/pfterm.c
) 內的函數宣告用extern "C"
包起PFTERM_SUPPORT_IAC
就允許輸出'\xff'
的設定(D)Service -> (U)ser -> (C)onfigure -> (F)avorite -> 0 □ 彩色模式
vattr
) 改名成 cursor attribute (cattr
)outc()
中處理 cursor attribute現在只要有其中一個屬性就打開反白效果
(亮色背景會被轉換成對應的普通色背景)
CSI ; <m> H
誤當作CSI ; H
的 parsing 錯誤;2007 年時就有此問題ESC <ch>
誤當做CSI <ch>
的 parsing 錯誤的 macro
EXEC_ESCSEQ
,依照 ECMA-48 所使用的術語,改名成EXEC_C1_FS
pmore 的修正
PMORE_NO_FORCE_CLRTOEOL
處理✨ 引進 PttBBS 式的光棒選單系統,及相關修正
cursor_*()
函數實行(D)Service -> (U)ser -> (C)onfigure -> (F)avorite -> K ■ 使用光棒選單系統
grayout()
函數成grayoutrect()
,以處理多個 column 的列表與 xover 列表系統 (
maple/xover.c
) 有關的修正XO::xyz
的型別由char *
改成void *
so/innbbs.c
) 用xover()
重寫;移除xo_cursor()
函數造成
xover()
不知道列表有被重繪,而漏畫游標的問題h
鍵的 callback 函數的回傳值被強制視為XO_NONE
的問題 [maple-itoc]std::unordered_map
)作為 callback 函數列表的資料結構 (
KeyFuncList
; 原先是KeyFunc[]
),讓取得某函數的時間複雜度變成
O(1)
(
KeyMapList
; 原先是KeyMap[]
)XZ::cb
改放入XO
中,強制寫程式的人指定 callback 函數列表,避免誤用函數而造成資料毀壞
XO::recsiz
,為之後消除 xover 系統的 boilerplate code 的工作作準備XO_MOVE
重新定義為游標位置的 bias,簡化游標位置為負數的處理return XO_MOVE + XO_TAIL
可以讓游標移到最後 (TAIL
;非TALL
)xo->pos = XO_TAIL
在列表項目數不超過XO_TAIL
時也可以(bool)(cmd & XR_PART_BODY)
檢查列表本身會不會被重繪cmd |= XR_BODY
指定至少從列表處重繪XR_*
以及XR_PART_*
macros 作為組合用return XR_FOOT + XO_MOVE + XO_WRAP + XO_REL - 42
i
鍵對應的功能,並重繪至少從列表內容到 footer 的畫面部分:return XR_BODY + 'i'
return XO_ZONE + 9
return XO_ZONE + XO_WRAP + XO_REL + 1
XO_REL
以方便游標位置未知時的上下移動,以及避免移動範圍有限的限制XZ::xo
變成 dangling pointer,以修正強制切換 xover zone 的時候會 crash 的問題
XO_FOOT
時,從原本只清除螢幕底部,改成呼叫對應的 callback 函數XO_NONE
但卻需要重繪 footer 的函數改為回傳XO_FOOT
xo_thread()
(主題瀏覽) 改以回傳值有無包含游標操作來判斷是否找到文章,現在回傳值可以包含畫面重繪的指令,解決了 footer 不會重繪的問題
XR_FOOT
,可重繪 footer 了xover()
輔助訊息 (找沒有了耶...:(
) 出現後按任意鍵可重繪 footerxover()
進入滿的最後一頁時的輔助訊息 (都給我看光光了! ^O^
)xo_load()
改成使用MAP_PRIVATE
的mmap()
,一次 map 整個列表,由系統決定載入時機,緩解全站使用者一齊瘋狂上捲下捲時 IO 爆炸的危機;
移除原先的 buffer read 程式碼,
並解除 xover record 的 byte 大小不能大於
XO_RSIZ
(256) 的限制xo_pool
的型別改變了,請全部重新編譯,否則列表會出現黑洞項目。xo_thread()
中的列表重新載入xo_thread()
(thread 模式) 沒找到文章時的無用的換頁mmap()
post_history()
中找上一篇與下一篇文章的邏輯xo_load()
,而是直接呼叫重繪列表的函數XO_SCRL
來以行作單位捲動列表與主選單系統 (
maple/menu.c
domenu()
) 有關的修正menu()
分離成main_menu()
&domenu()
兩函數QUIT
和SKIN
的處理goodbye()
移到maple/bbsd.c
tn_main()
內MENU
,讓 callback 函數可以自帶一個
const void *
參數,放什麼都可,免去換個參數就要寫個新函數的不便
避免進入選單時,先前儲存的選項剛好是快速鍵時會誤執行對應功能的問題
MENU::desc
,有'\n'
字元時,就將後面的文字顯示在畫面下方作為說明,目前選項沒有說明時,使用目前選單的說明,再沒有就不顯示。
與 BBS-Lua (
maple/bbslua.c
) 有關的修正read_vin()
移動vi_pool[]
內的資料時大小算錯的問題bl_k2s()
) 支援'\0'
(Ctrl-Space)與 BBS-Ruby (
maple/bbsruby.c
) 有關的修正ruby_script_range_detect()
獨立出新函數bbsruby_load_TOC()
BBS
改成 Ruby modulerb_funcallv()
取代rb_funcall()
解決 BBS-Ruby 不能在 CRuby 2.3 後的版本上安全執行的問題,
以及完美解決 Ruby 全域物件不會重設的問題
與編輯器有關的修正
✨ 系統設定介面的修正
bitset()
(多重選項設定): 防止使用者選擇系統保留的選項,並暗化其顯示[acct|bm]_setup()
(帳號/版主資料查詢與設定):在輸入查詢理由前維持隱藏隱私資料;查詢完立即清除螢幕
x_file()
(編個人檔案/編系統檔案): 用主選單系統 (domenu()
) 重寫介面與星空戰鬥雞 (
so/pip.h
&so/pip.c
) 有關的修正pip_play_outing()
(郊遊) 的特殊事件忘了輸出標題的問題"Y"
&"N"
使用標準的true
&false
取代pip_weapon_doing_menu()
(武器購買) 選單中的 0 號道具 (沒有裝備);統一
<part>list[n].name
與weapon<part>[n]
;移除weapon<part>
陣列pip_endingcombat()
(戰鬥結局) 符合特定條件時,產生未定義結果的問題pip_getworkmax()
(最大工作點數) 在點數都過低時,產生未定義結果的問題pip_getworkmax()
把workO
(酒家) 誤當作workP
(夜總會) 的問題pip_marriage_offer()
(求婚) 在小雞性別不明時會 buffer overrun 的問題(你是不是假定了我的性別)修正點數都在某範圍內才會給中等評價,任一點數超出就會給最低評價的邏輯問題
twice()
(計算升級點數) 使用float
變數,計算精度卻為int
的問題struct chicken
中性質相近的點數欄位改用陣列重寫,將需要一次操作多個點數的函數用迴圈改寫
刪減成 779 + 8458 = 9237 行,少了 544 行,也就是約原先 5% 的行數
✨ 其它影響使用者介面的雜項修正
board_outs()
: 避免看板分類的色彩為黑色,改顯示成亮黑色hdr_outs()
: 修正文章標題的括號 highlight 沒有處理 DBCS 的問題與 IP、socket、及 DNS 有關的修正
dns_open()
獨立出dns_openip()
函數,消除有問題的goto
AF_*
macros,不使用PF_*
macrosinnbbsd/
)、聊天室 (maple/xchatd
)、BBS 主程式 (maple/bbsd
)支援 IPv6
UTMP::in_addr
的型別改成include/dns.h
中的ip_addr
(已重新定義為
struct sockaddr_in
和struct sockaddr_in6
的 union);大小改變了,請重開 UTMPSHM
include/dns.h
&lib/dns.c
) 支援 IPv6 的 DNS 查詢dns_ident()
&dns_name()
加上 buffer 長度參數,防止 buffer overflowdns_mx()
&dns_smtp()
使用的分隔符號:
與 IPv6 格式衝突的問題NOIDENT
就能啟用進站反查的設定與轉信程式 (
innbbsd
) 有關的修正Date and Time Specification
一節parse_date()
),允許 2 位數年份以及秒的省略,並正確處理連續空格及可省略的空格,
使其更符合 RFC-1123 (但不處理文字時區與括號註解)
Atime()
) 所產生的括號時區,因為括號內文字是註解 (見 RFC-822),需要被處理程式忽略
BBSUTCZONE
編譯設定,以解決時區被 hardcoded 的問題與 daolib (
lib/
) 有關的修正與 shared libraries (
so/
) 有關的修正static
DL_get()
)並加上防止 library 還在使用時就被 unload 的保護機制
DL_HOTSWAP
啟用 dynamic loading library 的 hot-swapping 的設定與測試程式 (
test/
) 有關的修正lib_splay
的splay_free()
會造成存取違規以及 double free 的問題splay_out()
和splay_free()
擴充後,移到lib/splay.c
中lib_xsort
主函數中的 memory leakassert()
及 C11/C++11 的static_assert()
檢查運作結果與 BBS 維護工具 (
util/
) 有關的修正account
移到acpro
中,解除在某些時段不能重設分類看板的限制
readBENZ
、readFRIENZ
、以及readUSR
工具utmp-dump
先前用getopt()
重寫的 command-line option parsing有邏輯錯誤,而導致無法進入主程式的問題
splay_free()
消除acl-sort
及poststat
中的 memory leaksacl-sort
中的at_cmp(x, y)
比較函數,在x
和y
相同時,會造成 buffer overrun,甚至進入無限迴圈的問題
與程式資訊 (
so/xyz.c
:x_siteinfo()
) 有關的修正include/global.h
),以應付不同版本或啟用不同功能的
bbsd
可能載入同版本的xyz
的情況✨ 與上站紀錄有關的修正
BBS
: telnet;WSP
: WebSocket proxy)雜項
now
以及函數syncnow()
,因為現在的 Linux 有 vDSO#ifdef
ACCT::ident
mmap()
可以用;移除HAVE_MMAP
macro 及其相關 code與 coding style 有關的修正
hdr_stamp()
前對token
的註解,從A / F / 0
改成'A' / 'F' / 0
以免有人看了之後真的 pass 字元
'0'
進去爆炸不要用 bitwise operation 取代 2 的冪次的乘法/除法/取餘法,
(不過還是可以取代 2 的冪次的「向負無限大取整數」的除法/取餘法)
應該用一般的乘法以及 unsigned type 的除法/取餘法,
因為現代的編譯器會嘗試把乘除運算取代成位元運算
xo_thread()
: 不要在 code 中假設 macro 的值 (RS_FORWARD
),這樣不容易看懂,而且一改就會爆
const
static const
const
extern
DISKDATA
、SHMDATA
,方便快速知道改了某資料結構的後果;
加入註解標籤
Hashable
方便之後改成 C++ 的 hash tableSTR4()
,用函數strncmp()
取代,以免處理短字串時出錯其它與相容 C++ 標準有關的修正
const
字串的問題(無法通過 C++ 編譯)register
關鍵字 (在 C++ 中沒用,C++17 後不能用)與編譯工具有關的修正
GETVAR
沒有正確移除參數引號的問題bmake
編譯時的NO_SO
flag (強制 static link) 不被正確處理的問題