我編寫了一個控制檯應用程序,它在運行時具有自己的命令提示符。不幸的是,我不能簡單地調用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.
這是一個開源的解決方案,可用於商業應用,所以許可證必須靈活。但我會研究它。 – latreides
儘管readline似乎是一個可行的解決方案(代碼方式),但不幸的是,它不在GPL(而不是LGPL)之下,這可能不是一個可接受的許可證。我的應用程序分爲兩個組件。一個庫,其中所有的真實代碼都可以運行,而可執行文件只不過是一個shell來調用庫。如果我在shell中(而不是在庫中)使用readline,只有shell需要GPL嗎?在法律上如何區分兩者? – latreides