
Termcap ( terminal capability ) est une bibliothèque logicielle et une base de données héritées utilisées sur les ordinateurs de type Unix. Elle permet aux programmes d'utiliser les terminaux d'affichage de manière indépendante du terminal, ce qui simplifie considérablement le développement d'applications portables en mode texte . Elle a été remplacée par la base de données terminfo , utilisée par ncurses , tput et d'autres programmes.
Une base de données termcap peut décrire les capacités de centaines de terminaux d'affichage différents. Cela permet aux programmes d'avoir un affichage en mode texte , indépendamment du type de terminal. Les éditeurs de texte à l'écran tels que vi et Emacs sont des exemples de programmes pouvant utiliser termcap. D'autres programmes sont répertoriés dans la catégorie Termcap . L'accès à la base de données termcap était généralement fourni par des bibliothèques distinctes, comme GNU Termcap.
Exemples de ce que décrit la base de données :
- l'affichage comporte combien de colonnes
- Quelle chaîne de caractères envoyer pour déplacer le curseur à une position arbitraire (y compris la manière d'encoder les numéros de ligne et de colonne) ?
- Comment faire défiler l'écran vers le haut d'une ou plusieurs lignes ?
- Quelle quantité de marge est nécessaire pour une telle opération de défilement ?
Histoire
Bill Joy a écrit la première bibliothèque termcap en 1978 pour le système d'exploitation Berkeley Unix ; elle a depuis été portée sur la plupart des environnements Unix et de type Unix, même OS-9 . La conception de Joy aurait été influencée par la conception du stockage de données du terminal dans l'ancien système Incompatible Timesharing System .
Modèle de données
Les bases de données Termcap contiennent une ou plusieurs descriptions de terminaux.
Indices
Chaque description doit contenir le nom canonique du terminal. Elle peut également contenir un ou plusieurs alias pour ce nom. Le nom canonique ou les alias servent de clés de recherche dans la base de données termcap.
Valeurs des données
La description contient une ou plusieurs fonctionnalités, nommées de manière conventionnelle. Ces fonctionnalités sont de type booléen , numérique ou chaîne de caractères . La bibliothèque termcap n'attribue pas de type prédéfini à chaque nom de fonctionnalité. Elle détermine le type de chaque fonctionnalité selon la syntaxe suivante :
- Les capacités de type chaîne de caractères comportent un "=" entre le nom de la capacité et sa valeur.
- Les capacités numériques comportent un « # » entre le nom de la capacité et sa valeur, et
- Les capacités booléennes n'ont pas de valeur associée (elles sont toujours vraies si elles sont spécifiées).
Les applications qui utilisent termcap attendent des types spécifiques pour les capacités couramment utilisées et obtiennent les valeurs des capacités à partir de la base de données termcap en utilisant des appels de bibliothèque qui ne renvoient un résultat positif que lorsque le contenu de la base de données correspond au type supposé.
Hiérarchie
Les descriptions Termcap peuvent être construites en incluant le contenu d'une description dans une autre, en supprimant des fonctionnalités de la description incluse ou en remplaçant ou ajoutant des fonctionnalités. Quel que soit le modèle de stockage utilisé, la bibliothèque Termcap construit la description du terminal à partir de la description demandée, en incluant, supprimant ou remplaçant des fonctionnalités au moment de la requête.
Modèle de stockage
Les données de Termcap sont stockées sous forme de texte, ce qui facilite leur modification. La bibliothèque Termcap peut récupérer ce texte à partir de fichiers ou de variables d'environnement.
Variables environnementales
La variable d'environnement TERM contient le nom du type de terminal.
La variable d'environnement TERMCAP peut contenir une base de données termcap. Elle est le plus souvent utilisée pour stocker une description termcap unique, définie par un émulateur de terminal afin de fournir les caractéristiques du terminal à l'interpréteur de commandes et aux programmes dépendants.
La variable d'environnement TERMPATH est prise en charge par les implémentations termcap les plus récentes et définit un chemin de recherche pour les fichiers termcap.
fichier plat
L'implémentation originale (et la plus courante) de la bibliothèque termcap récupère les données à partir d'un fichier texte brut. La recherche dans un fichier termcap volumineux, par exemple de 500 ko, peut s'avérer lente. Pour améliorer les performances, un utilitaire tel que reorder est utilisé afin de placer les entrées les plus fréquemment utilisées au début du fichier.
Base de données hachée
Les implémentations de termcap basées sur 4.4BSD stockent la description du terminal dans une base de données hachée (par exemple, Berkeley DB version 1.85). Celle-ci contient deux types d'enregistrements : des alias pointant vers l'entrée canonique et l'entrée canonique elle-même. Le texte de l'entrée termcap est stocké tel quel.
Limitations et extensions
L'implémentation originale de termcap était conçue pour utiliser peu de mémoire :
- Le prénom comporte deux caractères, pour tenir dans 16 bits.
- Les noms de capacités sont composés de deux caractères.
- Les descriptions sont limitées à 1023 caractères.
- Une seule entrée termcap avec ses définitions peut être incluse, et elle doit figurer à la fin.
Les implémentations plus récentes de l'interface termcap ne nécessitent généralement pas le nom à deux caractères au début de l'entrée.
Dans toutes les implémentations, les noms des fonctionnalités restent composés de deux caractères.
La fonction `tgetent` utilisée pour lire la description du terminal emploie un tampon dont la taille doit être suffisante pour les données, et est supposée être de 1024 caractères. Les implémentations plus récentes de l'interface `termcap` peuvent assouplir cette contrainte en autorisant un pointeur nul à la place du tampon fixe , ou en masquant les données trop volumineuses, par exemple via la fonctionnalité ZZ dans `termcap` de NetBSD . L' interface de la bibliothèque `terminfo` émule également l'interface `termcap` et n'utilise pas réellement le tampon de taille fixe.
L'émulation de termcap par la bibliothèque terminfo permet d'inclure plusieurs autres entrées sans restriction de position. Quelques autres implémentations plus récentes de la bibliothèque termcap peuvent également offrir cette possibilité, bien que cela soit peu documenté.
Fonctionnalités obsolètes
Une fonctionnalité spéciale, la fonctionnalité « hz », a été définie spécifiquement pour prendre en charge le terminal Hazeltine 1500 , qui présentait la particularité d'utiliser le tilde ASCII (« ~ ») comme amorce de séquence de contrôle. Pour assurer la compatibilité avec ce terminal, le code utilisant la base de données devait non seulement savoir comment le tilde était utilisé pour introduire certaines séquences de contrôle, mais aussi le remplacer par un autre caractère imprimable dans le texte affiché. En effet, le terminal interprétait un tilde comme le début d'une séquence de contrôle, ce qui entraînait des textes manquants et un affichage illisible. De plus, les marqueurs d'attributs (comme le début et la fin du soulignement) occupaient de l'espace à l'écran. Les commentaires dans le code source de la base de données désignaient souvent ce problème par l'expression « crise Hazeltine ». Le Hazeltine 1500 étant un terminal largement répandu à la fin des années 1970, il était important que les applications puissent gérer ses limitations.