sysconf.ini 的設定 ================== 作者: 遊手好閒的石頭成 日期: 2000年12月22日 AM 02:07 在 The TIP Project 中, sysconf 佔了舉足輕重的地位。 TTP 中的每個軟體,幾乎都在 sysconf 中,放了些它們自 已的設定內容,如果沒有 sysconf ,則這些軟體的使用彈 性,就沒那麼好了。 而 The TIP Project 的 sysconf 格式,是延續 Firebird BBS 2.x 以來的格式,並沒有改變多少,因此這篇文章,說明的 是通則,而不限定於 The TIP Project 的軟體。 1.註解或指引 以字元 # 表示註解開始,在 # 後面的文字,皆為註解內容。 字元 # 放在任何地方都可以,不一定要在第一個字元的位置。 指引同樣是以 # 開頭,但 # 後緊接著關鍵字,以指引 sysconf 的動作,目前只有一個指引動作: #include ,引入指定的檔案, 例如: #include memu.ini 。 2.普通鍵值 任何非特定字元起始的內容,皆被視為設定普通鍵值,其格式 為 key = value 。 例如: BBSHOME = /home/bbs BBSUID = 9999 EGROUP0 = "*" "My BBS Name" = XXXXXX "My BBS Domain name" = bbs1.org, bbs2.org.tw ps.後面兩種設定方式,在我改過的 sysconf.c 可以使用;可以用 括號括起 key ,也可以指定多組 value 。 3. menu 內容或 menu 背景 以字元 % 表示 menu 內容或背景的起始段落,開頭的 % 後,要緊 接著設定 menu 內容的關鍵字 "menu" 或是代表 menu 背景的名稱。 當 menu 內容或背景結束時,要用單獨的 % 表示段落結束。 開頭的 % 跟結束的 % ,需要單獨一行。 設定 menu 背景: --------------------------------------------- #menu 背景,命名為 MENU_BG1 #在 %MENU_BG1 到 % 之間的所有內容,都被視為 #menu 背景。 在儲存時,會做簡單的壓縮。 %MENU_BG1 ┌────────────────────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ % ---------------------------------------- 設定 menu 內容: 若在 % 後緊跟著 "menu" ,表示設定一個 menu 內容,而非背景, %menu 後要加上此 menu 的名稱。 所有 menu 內容,都包在 %menu 和 % 間。 關鍵字 title 設定此 menu 的標題(會顯示在畫面頂行); 前面的兩個參數無意義,第三個參數才是標題內容。 關鍵字 screen 設定此 menu 的背景,前兩個參數設定 背景顯示位置的起始行、列,列通常設 0 ,行不一定,自行調整。 其他都是設定 menu 的選項: 1) 選項的動作 2) 選項擺放的 line ,如果是 0 表示接在前項後。 3) 選項擺放的 column ,如果是 0 表示接在前項後。 4) 選項的執行權限,可以用數字,也可以用鍵值。 5) 選項動作的參數,在執行選項動作時,會傳給它; 這個參數內容的第一個字,還同時表示了這個選項的 按鍵值,如果這個字是 "N" ,表示按下 N鍵,游標就 會直接移到這個選項上。 6) 選項顯示的文字內容。 選項的動作有二:進入另一個 menu 或是呼叫函數。 1) 用 ! 開始的,表示進入另一個 menu , ! 後面接著 該 menu 的名稱;如果 menu 名稱是 ".." ,表示回到 上一層。 2) 用 @ 開始的,表示呼叫函數。 這個函數必須在程式碼的 sysconf_cmdlist 陣列中有設定才行。 cmdlist 長這樣: struct { char* name; int (*func)(char*arg); } sysconf_cmdlist[] = { "domenu", domenu, ^^^^^^^^ 這是寫在程式碼中的函數 "BoardsNew", Boards, ^^^^^^^^^ 這是寫在 menu 中的名稱。 "Leave", Goodbye, "ReadMail", m_read, ... NULL, NULL }; ps. 各家source放的地方不一樣,自已找吧... --------------------------------------- %menu M_BOARDS title 0, 0, "討論區選單" screen 6, 0, MENU_BG1 @BoardsNew 13,3, PERM_BASIC, "New", "(N)ew 閱讀新文章" @BoardsAll 0, 0, 0, "Boards", "(B)oards 閱覽討論區" @SelectBoard 0, 0, 0, "Select", "(S)elect 選擇討論區" @ReadBoard 0, 0, 0, "Read", "(R)ead 閱讀文章" @PostArticle 0, 0, PERM_POST, "Post", "(P)ost 發表文章 " !.. 0, 0, 0, "Exit", "(E)xit 回到主選單" % ------------------------------------------- 以下示範一個擴充選項動作的方法。 假設我要增加一個動作,在執行選項動作後,可以顯示指定的 檔案內容(例如公告事項)。 1) 增加原始碼 (也可以加在已有的原始碼) m_viewfile.c -------------------- int m_viewfile(char *arg) { ... ... /*因為參數的第一個字元拿去表示按鍵值了*/ prints("你正在觀看檔案: %s", arg+1); more(arg+1); ... } ------------------- 然後修改 Makefile ,加入這個原始碼。 2) 修改 sysconf_cmdlist ,加入這個動作 sysconf_cmdlist[] = { ... "Viewfile", m_viewfile, NULL, NULL }; 3) remake bbs 4) 修改 menu.ini ,加入新的選項 %menu X_Menu title 0,0,"X檔案" screen 13,0,MENU_BG1 @Viewfile 14,10,0, "CCopyright" "(C)版權宣告" @Viewfile 0,0,0 "Nannounce/news" "(N)今日新聞" @Viewfile 0,0,0 "SSysops" "(S)站長名單" !.. 0, 0, 0, "Exit", "(E)回到主選單" % 最後,再解說選項動作 EGroups ,這是一個列出分類討論 區的函數,EGroups 接受一個參數,這個參數表示它所要列 出的討論區類別的鍵。 例如: ---------------- EGroup0 = "abc" EGroup1 = "axy" @EGroups 0,0,0, "0", "討論區分類 0" @EGroups 0,0,0, "1", "討論區分類 1" @EGroups 0,0,0, "2", "討論區分類 2" ----------------------- 當選擇了 "討論區分類1" 的選項後,bbs 會呼叫 EGroups("1") ,而 EGroups() 就依參數的內容,取得鍵值 "EGroup1" 的內容,再依這 個內容所指定的類別碼去列示討論區。 以這個例子來說,類別碼 "a" 的討論區,在分類0 及分類1 中都 會出現,而若選到了分類2 ,則什麼討論區都不會列出來,因為 sysconf 找不到 "EGroup2" 這個 key 。 -- The TIP Project 根基於 Firebird BBS 原始碼的改進計劃 Short URL: http://fbtip.tsx.org/ Group: http://groups.yahoo.com/list/firebird-tip Mailing list: firebird-tip@yahoogroups.com