本專案實作了一個類似 grep 的文本搜尋工具 bl2,但其獨特之處在於能夠完整保持原始文本的視覺效果。透過 ANSI 轉義序列為匹配關鍵字著色,使搜尋結果在終端機中以彩色高亮顯示,極大地提升了可讀性。專案包含四個核心檔案:myst_color.c、myst_color.h、bl2.c 以及 Makefile。
myst_color.c/h 定義了一個雙向鏈表結構 NODE,用於逐字元儲存文本內容及其對應的顏色屬性。這是實現「視覺效果保留」的關鍵——程式不直接處理字串,而是將文件轉換為節點串列,每個節點獨立攜帶顏色資訊。
typedef struct data {
int val; // 字元的 ASCII 值
char *color; // ANSI 顏色代碼,如 "\33[1;31m" (亮紅)
struct data *prev, *next; // 雙向鏈表指標
} NODE;
init(FILE *fp):讀取檔案內容,逐字元建立節點,初始顏色設為預設灰色 \33[1;30m,返回鏈表頭指標。rand_color(int num):從預定義的 12 種顏色陣列中,根據隨機種子選取一種高亮顏色供關鍵字使用。print(NODE *pNODE):遍歷鏈表,依序輸出節點的顏色代碼與字元,最後換行,實現彩色輸出。bl2.c 是程式的入口點,處理命令列參數、呼叫初始化、執行搜尋匹配並觸發輸出。
argv[1] 為搜尋關鍵字,argv[2] 為目標檔案路徑。init() 建立字元鏈表,並透過 rand_color(1) 取得高亮顏色。程式採用雙指標回溯策略:
node。node2 前進,ch 遞增)。*ch == '\0'),則回溯(node2->prev),將匹配區間內所有節點的 color 更新為高亮色。node 繼續後移,尋找下一處匹配。此演算法雖非最高效(如 KMP 或 Boyer-Moore),但對於教學與中小型文件足夠,且完美契合「逐字元著色」的資料結構設計。
提供標準的編譯規則,啟用嚴格警告(-Wall -Wextra -ansi -pedantic)與優化(-O3),生成執行檔 bl2。
bl2 專案展示了如何將「資料結構(雙向鏈表)」與「終端機特性(ANSI 色碼)」結合,實現一個功能雖簡單但極具實用價值的工具。其設計思想——將文本離散化為可攜帶屬性的節點——可擴展至語法高亮編輯器、日誌分析器等更複雜的場景。