2013-07-29 144 views
0

我編寫了一個控制檯應用程序,它在運行時具有自己的命令提示符。不幸的是,我不能簡單地調用std :: cin並等待輸入,因爲我需要爲命令歷史記錄來解釋向上/向下。從控制檯讀取數據

相反,我不得不關閉回聲並將控制檯置於非規範模式,並使用'read'命令逐個獲取每個字符,如果它們是可打印字符,則回顯它們,或嘗試解析/解釋它們如果它是一個轉義碼的開始。

我遇到的問題是很難以廣義/通用的方式閱讀和解析各種轉義代碼。當我必須讀取/解析對大小/位置查詢的響應時,它變得更加成問題。

有沒有更好的方法從終端讀取?是否有特殊的功能可以讀取/解析特殊的終端代碼? ncurses並不是一個可行的選項(它清除了屏幕,甚至只是使用filter()似乎矯枉過正),而其他應用程序一直都在這樣做,而不必牽扯這些依賴關係......我做錯了什麼?

這裏是我目前的'getch'函數的一個縮寫,它的功能非常有限(並且具有更高級的代碼,被破壞)。

int getch_ex() 
{ 
    int buf = 0; 
    size_t count = read(0, &buf, 1); 
    if ((count > 0) && (buf == ESCAPE_CODE)) 
    { 
     size_t count = read(0, &buf, 1); // [ 
     if ((count > 0) && (buf == '[')) 
     { 
      count = read(0, &buf, 2); 
     } 
    } 
    return (buf); 
} 

帶提示的其他終端應用程序(grub,python等)如何實現這個功能?

我的主要目標是在Linux和OS X.

回答

0

看看readline庫。這聽起來像它正是你想要的。注意license如果這個商業代碼雖然。

+0

這是一個開源的解決方案,可用於商業應用,所以許可證必須靈活。但我會研究它。 – latreides

+0

儘管readline似乎是一個可行的解決方案(代碼方式),但不幸的是,它不在GPL(而不是LGPL)之下,這可能不是一個可接受的許可證。我的應用程序分爲兩個組件。一個庫,其中所有的真實代碼都可以運行,而可執行文件只不過是一個shell來調用庫。如果我在shell中(而不是在庫中)使用readline,只有shell需要GPL嗎?在法律上如何區分兩者? – latreides

0

如果不是做GUI或視窗系統,看看在ncurses庫包。

+0

ncurses要求您清除屏幕,因此它不是一個可行的解決方案。我認爲你可以使用filter()來使用某些ncurses函數而不用初始化屏幕,但是它對於這樣一個小的需求來說是一個相當大的依賴關係(以及我檢查出來的所有其他應用程序都實現了同樣的任務,不需要拉入額外的依賴) – latreides