/** * 從第 y 列開始 show 出 filename 檔案中的前 lines 行。 * mode 為 output 的模式,參數同 strip_ansi。 * @param filename: the file to show * @param y: starting line on screen * @param lines: max lines to be displayed * @param mode: SHOWFILE_*, see modes.h * @return 失敗傳回 0,否則為 1。 * 2 表示有 PttPrints 碼 */ int show_file(const char *filename, int y, int lines, int mode) { FILE *fp; char buf[ANSILINELEN]; int ret = 1; int strpmode = STRIP_ALL; if (mode & SHOWFILE_ALLOW_COLOR) strpmode = ONLY_COLOR; if (mode & SHOWFILE_ALLOW_MOVE) strpmode = NO_RELOAD; if (y >= 0) move(y, 0); clrtoln(lines + y); if ((fp = fopen(filename, "r"))) { while (fgets(buf, sizeof(buf), fp) && lines--) { move(y++, 0); if (mode == SHOWFILE_RAW) { outs(buf); } else if ((mode & SHOWFILE_ALLOW_STAR) && (strstr(buf, ESC_STR "*") != NULL)) { // because Ptt_prints escapes are not so often, // let's try harder to detect it. outs(Ptt_prints(buf, sizeof(buf), strpmode)); ret = 2; } else { // ESC is very common... strip_ansi(buf, buf, strpmode); outs(buf); } } fclose(fp); outs(ANSI_RESET); // prevent some broken Welcome file } else return 0; return ret; }
/** * 從目前的行數(scr_ln) clear 到底 */ inline void clrtobot(void) { clrtoln(t_lines); }