더 높은 수준에서…

더 높은 수준에서…

며칠째 정보를 찾으려고 노력하고 있습니다. 분명히 내 목표는 ncurses-like C 라이브러리를 만드는 것입니다. 나는 완전히 알고 있다ANSI 이스케이프 시퀀스그리고 그것을 사용하는 방법. 그러나 나는 이식성을 원하므로 terminfo데이터베이스에 관심이 있습니다. 다음과 같은 문서의 일부를 읽었습니다.

이를 통해 이론과 원리를 이해할 수 있었지만 실제로는 C와 같은 프로그래밍 언어로 데이터베이스에 액세스/인터페이스하는 방법에 대한 예를 찾을 수 없습니다.

현재 내 생각에 떠오르는 유일한 방법은 데이터베이스 바이너리 파일을 메모리에 로드 terminfo하고 수동으로 액세스를 수행하는 것입니다. 그러나 내 자신의 체계를 구축해야 하고 더 쉽고/실용적/공식적인 방법이 없다는 것이 이상해 보입니다. 빌어먹을 데이터베이스에 접근하려고요.

답변1

FreeBSD의 termcap 데이터베이스에 액세스하려면~이다운영 체제에 제공되는 방식입니다. FreeBSD C 라이브러리에는 액세스를 위한 API가 있습니다.기능 데이터베이스. 그래서 getcap()et al. 낮은 수준에서 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" 계산기 키패드, "커서 주소 지정 모드" 및 3가지 형태의 커서 표시 등의 아이디어도 터미널이 실제로 작동하는 방식과 일치하지 않습니다.

만약 너라면~이다ncurses를 재발명하려면 최소한 색상 쌍 모델을 복사하지 마세요. 이는 터미널이 25년 이상 동안 사용해 왔던 ITU T.416 Indexed 및 Direct 색상 메커니즘은 말할 것도 없고 ECMA-48 및 AIXterm 색상 시스템과 거의 일치하지 않습니다.

추가 읽기

관련 정보