Termcap

[섬네일|터미널 [사용자 인터페이스 라이브러리와 GUI 등가물 간의 관계.]]

**Termcap**("**term**inal **cap**ability")은 유닉스 계열 컴퓨터에서 사용되는 레거시 라이브러리 및 데이터베이스로, 프로그램이 단말기를 터미널과 독립적인 방식으로 사용할 수 있도록 하여 휴대용 텍스트 모드 애플리케이션 작성을 크게 단순화한다. 이것은 Ncurses, tput 및 기타 프로그램에서 사용하는 Terminfo 데이터베이스로 대체되었다.

termcap 데이터베이스는 수백 가지의 다양한 디스플레이 터미널의 기능을 설명할 수 있다. 이를 통해 프로그램은 터미널 유형에 관계없이 문자 기반 디스플레이 출력을 가질 수 있다. vi 및 이맥스와 같은 화면 텍스트 편집기는 termcap을 사용할 수 있는 프로그램의 예이다. 다른 프로그램은 Termcap 범주에 나열되어 있다. termcap 데이터베이스에 대한 액세스는 일반적으로 별도의 라이브러리(예: GNU Termcap)에 의해 제공되었다.

데이터베이스가 설명하는 내용의 예:
*디스플레이 너비(열 수)
*커서를 임의의 위치로 이동하기 위해 전송할 문자열(행 및 열 번호를 인코딩하는 방법 포함)
*화면을 한 줄 또는 여러 줄 위로 스크롤하는 방법
*이러한 스크롤 작업에 필요한 패딩 양.

## 역사
빌 조이는 버클리 유닉스 운영체제를 위해 1978년에 첫 termcap 라이브러리를 작성했다. 이후 대부분의 유닉스 및 유닉스 계열 환경, 심지어 OS-9에도 이식되었다. 조이의 설계는 초기 Incompatible Timesharing System의 터미널 데이터 저장소 설계에 영향을 받은 것으로 알려져 있다.

## 데이터 모델
Termcap 데이터베이스는 하나 이상의 터미널 설명으로 구성된다.

### 인덱스
각 설명에는 터미널의 표준 이름이 포함되어야 한다. 터미널 이름에 대한 하나 이상의 별칭도 포함될 수 있다. 표준 이름 또는 별칭은 라이브러리가 termcap 데이터베이스를 검색하는 데 사용하는 키이다.

### 데이터 값
설명에는 하나 이상의 기능이 포함되며, 이는 관습적인 이름을 가지고 있다. 기능은 불리언, 숫자 및 문자열 유형을 가진다. termcap 라이브러리는 각 기능 이름에 대해 미리 결정된 유형을 가지고 있지 않다. 구문을 통해 각 기능의 유형을 결정한다:
* 문자열 기능은 기능 이름과 해당 값 사이에 "="이 있다.
* 숫자 기능은 기능 이름과 해당 값 사이에 "#"이 있다.
* 불리언 기능은 연결된 값이 없다(지정되면 항상 참이다).

termcap을 사용하는 애플리케이션은 일반적으로 사용되는 기능에 대해 특정 유형을 기대하며, 데이터베이스 내용이 가정된 유형과 일치할 때만 성공적으로 반환되는 라이브러리 호출을 사용하여 termcap 데이터베이스에서 기능 값을 얻는다.

### 계층 구조
Termcap 설명은 하나의 설명의 내용을 다른 설명에 포함시키고, 포함된 설명에서 기능을 억제하거나, 기능을 재정의하거나 추가하여 구성할 수 있다. 어떤 저장 모델이 사용되든, termcap 라이브러리는 요청 시 요청된 설명에서 터미널 설명을 구성하며, 포함, 억제 또는 재정의를 수행한다.

## 저장 모델
Termcap 데이터는 텍스트로 저장되므로 쉽게 수정할 수 있다. 텍스트는 파일이나 환경 변수에서 termcap 라이브러리에 의해 검색될 수 있다.

### 환경 변수
**TERM** 환경 변수에는 터미널 유형 이름이 포함되어 있다.

**TERMCAP** 환경 변수에는 termcap 데이터베이스가 포함될 수 있다. 이는 터미널 에뮬레이터가 셸 및 종속 프로그램에 터미널 특성을 제공하기 위해 설정하는 단일 termcap 설명을 저장하는 데 가장 자주 사용된다.

**TERMPATH** 환경 변수는 최신 termcap 구현에서 지원되며 termcap 파일의 검색 경로를 정의한다.

### 플랫 파일
termcap 라이브러리의 원본(및 가장 일반적인) 구현은 플랫 텍스트 파일에서 데이터를 검색한다. 500KB와 같은 큰 termcap 파일을 검색하는 것은 느릴 수 있다. 성능 향상을 위해 **reorder**와 같은 유틸리티를 사용하여 가장 자주 사용되는 항목을 파일 시작 부분에 배치한다.

### 해시된 데이터베이스
4.4BSD 기반 termcap 구현은 터미널 설명을 해시된 데이터베이스(예: 버클리 DB 버전 1.85와 유사한 것)에 저장한다. 이들은 두 가지 유형의 레코드를 저장한다: 표준 항목을 가리키는 별칭과 표준 항목 자체. termcap 항목의 텍스트는 문자 그대로 저장된다.

## 제한 및 확장
원래 termcap 구현은 적은 메모리를 사용하도록 설계되었다.
* 첫 번째 이름은 16비트에 맞도록 두 글자이다.
* 기능 이름은 두 글자이다.
* 설명은 1023자로 제한된다.
* 정의가 있는 하나의 termcap 항목만 포함될 수 있으며, 반드시 끝에 있어야 한다.

termcap 인터페이스의 최신 구현은 일반적으로 항목 시작 부분에 두 문자 이름이 필요하지 않다.

기능 이름은 모든 구현에서 여전히 두 문자이다.

터미널 설명을 읽는 데 사용되는 **tgetent** 함수는 데이터에 충분히 커야 하는 버퍼를 사용하며, 1024자로 가정된다. termcap 인터페이스의 최신 구현은 고정 버퍼 대신 널 포인터를 허용하거나, NetBSD termcap의 **ZZ** 기능 등을 통해 맞지 않는 데이터를 숨김으로써 이 제약을 완화할 수 있다. Terminfo 라이브러리 인터페이스도 termcap 인터페이스를 에뮬레이션하며, 실제로는 고정 크기 버퍼를 사용하지 않는다.

terminfo 라이브러리의 termcap 에뮬레이션은 위치를 제한하지 않고 여러 다른 항목을 포함할 수 있도록 한다. termcap 라이브러리의 몇 가지 다른 최신 구현도 이 기능을 제공할 수 있지만, 잘 문서화되어 있지는 않다.

## 사용되지 않는 기능
특수 기능인 "hz" 기능은 ASCII 물결표 문자('~')를 제어 시퀀스 시작 문자로 사용하는 불운한 특성을 가진 Hazeltine 1500 터미널을 지원하기 위해 특별히 정의되었다. 해당 터미널을 지원하려면 데이터베이스를 사용하는 코드가 특정 제어 시퀀스를 도입하는 데 물결표를 사용하는 방법을 알아야 할 뿐만 아니라, 표시되는 텍스트의 모든 물결표를 다른 인쇄 가능한 문자로 대체하는 방법도 알아야 했다. 텍스트의 물결표가 터미널에 의해 제어 시퀀스의 시작으로 해석되어 텍스트 누락 및 화면 손상이 발생했기 때문이다. 또한, (밑줄 시작 및 끝과 같은) 속성 표시는 화면에서 공간을 차지했다. 데이터베이스 소스 코드의 주석은 종종 이를 "Hazeltine brain damage"라고 언급했다. Hazeltine 1500은 1970년대 후반에 널리 사용되던 터미널이었기 때문에, 애플리케이션이 그 한계를 처리할 수 있는 것이 중요했다.

## 같이 보기
* ANSI 이스케이프 시퀀스, 많은 시퀀스를 통합하려는 시도
* 단말기
* Curses
* Terminfo
* 단말 에뮬레이터

## 각주

## 외부 링크
* 현재 termcap 데이터
* 에릭 레이먼드 웹사이트의 Termcap/Terminfo 자료 페이지

분류:컴퓨터 데이터
분류:데이터베이스
분류:1978년 소프트웨어
분류:텍스트 모드
분류:Termcap