/* Simple Interactive Text I/O -- 文字模式下的簡單繪圖副程式庫. 主要供其他程式叫用, 所以通常用 gcc -Wall -c sitio.c 編譯後, 所產生的 sitio.o 需要與其他程式 link. 若要單獨測試, 則應下: gcc -Wall -DTEST sitio.c 本程式只是 C 教學範例 (詳見 http://www.cyut.edu.tw/~ckhung/b/c/) 所以 (1) 功能相當不完整 (2) 看不懂裡面在做什麼也沒有關係. 如果真的要在文字模式下寫大的程式, 建議用 ncurses 甚至 cdk, 見 http://www.cyut.edu.tw/~ckhung/b/mi 其中的 "反樸歸真: 文字模式下的程式設計" 從這裡也可以找到下載 nansi 的 link. DOS 或 MS Windows 的使用者需在 config.sys 當中設定 device = ansi.sys (可用系統內建版本, 或下載 nansi) */ #include "sitio.h" #include #if defined (__TURBOC__) #else #include /* 控制鍵盤的相關副程式 */ static struct termios old_term; #endif /* 啟動 sitio */ void beginsitio(void) { #if defined (__TURBOC__) #else struct termios tios; tcgetattr(0, & old_term); /* 取得目前的鍵盤設定 */ /* 讓印到螢幕上的控制字串立即生效 (不要 buffer) */ setvbuf(stdout, NULL, _IONBF, 0); tios = old_term; tios.c_lflag &= ~ICANON; /* 取消標準的前置處理 */ tios.c_lflag &= ~ECHO; /* 不要當應聲蟲. */ /* 讓程式設計師用自己的方式把輸入的字元印出來 (甚至可以不印) */ tios.c_cc[VMIN] = 1; /* Buffer 內只要有一個字元就立即傳回 */ tios.c_cc[VTIME] = 0; /* 無限期地等待 */ tcsetattr(0, TCSANOW, & tios); /* 讓新的設定馬上生效! */ #endif } void endsitio(void) { #if defined (__TURBOC__) #else tcsetattr(0, TCSANOW, & old_term); #endif } /* 清除螢幕 */ void clearscr(void) { printf("\x1b[2J"); } /* 把遊標移到第 row 列第 col 行 */ void gotorc(int row, int col) { printf("\x1b[%d;%dH", row, col); } /******************************************************************/ /* (與 ANSI escape sequence 無關, 但經常搭配使用) */ /* 從鍵盤上讀入一個鍵 */ int getkey(void) { #if defined (__TURBOC__) return getch(); #else return getchar(); #endif } /******************************************************************/ /* 範例程式 */ #if defined(TEST) #include int main(void) { int row=1, col=1; int ch; beginsitio(); clearscr(); gotorc(23, 1); printf("use hjkl to move the cursor, any other key to quit"); do { gotorc(row, col); ch = getkey(); if (ch == EOF) break; switch (ch) { case 'h': --col; if (col<=0) col+=70; break; case 'l': ++col; if (col>70) col-=70; break; case 'k': --row; if (row<=0) row+=20; break; case 'j': ++row; if (row>20) row-=20; break; } } while (strchr("hjkl", ch)); clearscr(); gotorc(24, 1); endsitio(); return 0; } #endif