요즘 정보를 찾으려고 노력 중이에요. 분명히 말하면 내 목표는 ncurses
C와 유사한 라이브러리를 만드는 것입니다. 나는 완전히 알고 있다ANSI 이스케이프 시퀀스그리고 그것을 사용하는 방법. 그러나 나는 이식성을 원하므로 terminfo
데이터베이스에 관심이 있습니다. 예를 들어 문서의 일부를 읽었습니다.
- https://www.tldp.org/HOWTO/Text-Terminal-HOWTO-16.html)
- https://en.wikipedia.org/wiki/Terminfo
- terminfo의 매뉴얼 페이지
이를 통해 이론과 원리를 이해할 수 있었지만 실제로 C와 같은 프로그래밍 언어를 사용하여 데이터베이스에 액세스/연결하는 방법에 대한 예를 찾을 수 없었습니다.
현재 제가 생각할 수 있는 유일한 방법은 terminfo
데이터베이스 바이너리를 메모리에 로드하고 수동으로 액세스를 수행하는 것입니다. 하지만 저는 제 자신의 체계를 구축해야 하는데 더 쉽고/실용적/공식적인 방법이 없다는 것이 이상해 보입니다. 이 빌어먹을 데이터베이스에 접근해 보세요.
답변1
FreeBSD의 termcap 데이터베이스에 액세스하려면 다음이 있습니다.예운영 체제의 메서드입니다. FreeBSD C 라이브러리에는 액세스를 위한 API가 있습니다.역량 데이터베이스. 그러니 getcap()
누군가를 기다리십시오. 하위 수준 termcap 데이터베이스에 액세스하기 위해 호출되는 함수입니다. (하위 수준 API가 실제로 존재하지만 getcap()
데이터베이스가 프로그램을 사용하여 구축된 가변 길이 레코드 플랫 파일이거나 적절하게 색인화된 이진 데이터베이스 파일일 수 있다는 사실을 API만큼 추상화하지는 않습니다 cap_mkdb
.)
더 높은 수준은 tgetent()
, tputs()
등 입니다. (이것들은 많은 Linux 기반 운영 체제와 같은 terminfo 운영 체제에도 존재합니다.) 그러나 이는 FreeBSD C 라이브러리의 termcap ncurses 라이브러리의 일부이며 사용자는 자신만의 "ncurses와 같은" 라이브러리를 만들려고 합니다. (Linux 기반 운영 체제에서는 terminfo ncurses 라이브러리의 일부입니다.)
ncurses의 자체 terminfo API를 통하지 않고 terminfo 데이터베이스 레코드에 액세스하는 예는 unibilium 라이브러리입니다. NeoVIM은 이것을 사용합니다.
더 높은 수준에서…
terminfo/termcap의 아이디어는더 휴대하기 편리함21세기의 두 번째 10년이 되자, 그것은 실제로 전환점과 그 이상에 도달했습니다. ECMA-48:1976 표준을 준수하지 않는 종이 터미널은 물론 실제 비디오 터미널을 거의 만나지 못할 것입니다. 용어 정보 추상화는 실제 비디오 터미널의 기능과 일치하지 않는 경우가 많으며 어떤 면에서는장애이식성은 다소 뒤틀린 작업 방식을 강요하기 때문입니다.
이는 특히 다음에 적용됩니다.단자 입력, 실제로는 1980년대 초반부터 ECMA-48이었으며(RXVT, Interix, Linux KVT 및 SCO 콘솔에 대한 일부 상태 머신 보드 포함) 고정 문자열을 일치시키는 termcap/terminfo 모델은 매우 적합하지 않습니다. 그러나 "네이티브"/"xmit" 계산기 키보드, "커서 주소 지정 모드" 및 세 가지 형태의 커서 표현에 대한 아이디어도 터미널이 실제로 작동하는 방식과 맞지 않았습니다.
만약 너라면예ncurses를 재발명하려면 최소한 색상 쌍 모델을 복사하지 마세요. 이는 ECMA-48 및 AIXterm 색상 시스템과 거의 호환되지 않으며, 터미널에서 25년 넘게 사용해 온 ITU T.416 색인 및 직접 색상 메커니즘은 말할 것도 없습니다.
추가 읽기
getcap
.BSD 라이브러리 기능 매뉴얼. 무료 BSD. 2002년 3월 22일.tgetent
.ncurses(3X) 매뉴얼 무료 BSD.- https://github.com/mauke/unibilium
- https://unix.stackexchange.com/a/567575/5132
- 조나단 데보인 폴라드(2019). "터미널 기능". C++ 라이브러리. Nosh 툴셋.