Trucos de Programacion "C" y "C++" en castellano
Entornos Linux y Windows

Termcap y Terminfo

Uso de Termcap y Terminfo a bajo nivel

En los sistemas Unix/Linux, existen unos ficheros de descripciones de las capacidades de un terminal. Esos ficheros, son Termcap, y TemInfo. Con uno de ellos basta para el acceso a las funciones de el terminal. Salvo en los casos en los que sea estrictamente necesario, se recomienda el uso de las funciones de las curses.

Estos ficheros contienen la descripción detallada de los terminales, y las secuencias de escape necesarias para accder a sus funciones.

Actualmente el fichero termcap se mantiene para permitir la compatibilidad con versiones antiguas. Se recomienda que TODAS las aplicaciones nuevas vayan con Terminfo, por ser más rápida y más moderna.

Uso de TermInfo

Para utilizar terminfo en un proyecto, se deben incluir las cabeceras curses.h y term.h

Necesitaremos una variable char * para almacenar el nombre del terminal desde el que se estan conectando. Para obtener dicho nombre utilizaremos la función getenv (Para obtener valores del sistema):

if ((term=(char *) getenv("TERM"))==NULL)
{
fatal ("TERM no esta establecido");
}

Luego, inicializaremos las variables del sistema, segun el terminal que estemos usando, con la función setupterm:

setupterm (term, 1, &status);
if (status!=1) fatal ("Error al realizar la funcion setupterm");

NOTA: La variable term es la misma que se empleo antes con la función getenv

A continuación, no resta mas que comprobar si el terminal soporta la función que queremos emplear:

if ( bell = = NULL ) fatal("La cadena bell (Pitido) No existe");

y mandarla al terminal cuando sea necesario:

putp(bell);

 

Uso de TermCap

Para el empleo de Termcap, solo es necesario la utilización de la librería curses.h
Deberemos poseer, ademas, una variable para guardar el entrono, otra para guardar TODAS las especificaciones del terminal en concreto, y una última variable para manejar la capacidad en concreto de la terminal que queremos usar. Todas estas variables son de tipo char *.
Al igual que en terminfo, tendremos que obtener del entorno el nombre del terminal que estamos usando:

if ((term=(char *) getenv("TERM"))==NULL) { return 0; }

A continuación deberemos gardar las especificaciones del terminal en una variable del programa:

tgetent(TBuffer,term);

NOTA: TBuffer es una variable char *, con tamaño ya reservado (En las terminales actuales yo lo crearía como char TBuffer [4096]; ), puesto que si no cabe la información, el programa fallará.
NOTA2: En las versiones actuales de gcc, si se pasa un char * sin espacio asignado, se le asignará dinámicamente el espacio necesario.

Ahora simplemente, obtendremos la función que nos interese del interior de este terminal:

cadena=(char*)tgetstr("po",&TBuffer);

Y luego lo mandaremos a imprimir:

fputs(cadena,stdout);

OTRAS NOTAS

para conocer las capacidades de termcap y terminfo, estab bien documentadas en los documentos man.

Si alguien encuentra una traducción al castellano, por favor, mandarme un mail a para que pueda incluirlo en este documento.

 

Webmaster

Hiperion Pozuelo, Madrid, ES
Soy una persona sencilla, quizas demasiado seria, que disfruto de la vida.
Actualmente busco pareja.