de Conio.h a Ncurses.h en C – MS-DOS a GNU/Linux

El fin de semana pasado una amiga me pidió ayuda con su programa de fin de semestre, asi que me visito en mi oficina para ayudarla, el unico equipo disponible con compilador de C que tenia era una estación con GNU/Linux.

Desenfundo su memoria USB e inmediatamente trato de mostrarme el programa, por supuesto el .EXE precompilado que tenia, no funciono, asi que intento recompilar en Linux para hacer un ejecutable propio del sistema, pero no compilo.

Revise el código y el 90% era código ANSI, pero el manejo de la consola, no era así, no era portable porque conio.h es una librería de borland C y está prácticamente amarrada al MSDOS, jamás iba a funcionarle el código en Linux, a menos que se modificara y reescribiera una subversión para Linux y pues al final no es difícil portarlo, asi que la ayude con eso también, ahora tiene un programa que compila y funciona en DOS como en Linux

El problema que hay aun en algunas universidades es que siguen enseñando Turbo C y sus librerías privativas como la conio.h y no se les puede culpar de todo, al final de cuentas el manejo de la consola es diferente en cada plataforma, asi que cada plataforma tiene que tener sus propias librerías.

Para el viejo MSDOS, esta el conio y eso estaba bien cuando DOS reinaba, en los tipos de unix como Linux curses no es un estandart por la ANSI sin embargo es un standart defacto en cada unix.

Aquí tratare de mostrar como portar programas de conio.h a ncurses.h

Curses es mucho mas rico que conio, por ejemplo curses soporta underline osea subrayar letras en la consola ademas del clásico blink que las letras aparezcan y desaparezcan. El conio.h solo trae soporte a blink

Curses es solo un poco mas difícil de manipular que conio.h esto se debe a que se puede considerar a curses como una capa sobre la terminal, denominada ventana y sobre esta ventana se llevan a cabo los colores y efectos de la terminal, esta ventana debe ser inicializada, al mismo tiempo que es un buffer y debe ser tratado como tal.

Podemos inicializar la ventana con las siguientes funciones

initscr();
savetty();

y terminar la ventana para volver a la consola stadart con

echo ();
resetty();
endwin();

En realidad solo con resetty y endwin es suficiente, pero usamos echo para asegurarnos que quedara activado el echo, de lo contrario no se verán los caracteres porque no tendrán echo, si es que en el programa hicimos un noecho();

Despues deinicializar la ventana con curses.h la programación se torna similar a conio.h pero con algunas variantes, mostrare las fuciones mas comunes en conio.h en su versión curses

Conio.h ncurses.h

Limpiar pantalla
Clrscr(); – erase ();

Mover el cursor en la plantalla
Gotoxy (x,y) – move (y,x);
Nótese que las X y las Y están invertidas en curses, fuera de ese detalle el comportamiento es el mismo

Imprimir caracteres en pantalla
Cprintf (); – addch (); o si se trata de una cadena addstr ();

El manejo de color en curses es un poco mas complicado por que hay que verificar si la consola soporta color e inicializar el color, así como la paleta de colores que vamos a usar, la usaremos en pares 2 colores por vez ósea el color de frente y el de fondo
En conio.h textcolor y textbackground son 2 funciones separadas en curses se usan al mismo tiempo

Primero se inicializa con la función start_color ();
Después se asignan los colores con las funciones
init_pair (1,COLOR_CYAN,COLOR_BLACK);

en init_pair le decimos el color de frente que es CYAN y el de fondo que es negro
attron (COLOR_PAIR (1) | A_UNDERLINE);
con attron lo asignamos a la ventana, y además si queremos agregamos | A_UNDERLINE para que las letras esten subrayadas o usar A_BLINK para hacer que aparezcan y desaparezcan entre otras opciones como A_BOLD para hacerlas negritas, como dije curses es mas rico en elementos visuales para la consola.

Ahora escribiré un programa con estas funciones básicas que será exactamente igual a la hora de ejecutarse en DOS usando conio.h y en GNU/Linux usando curses.

Version DOS y Conio.h

#include <conio.h>
#include <stdio.h>

int cuadro (int a,int b,int c,int d)
{
    int x;

    for (x = a; x != c; x++)
    {
        gotoxy (x,b);
        putchar (205);
    }

    for (x = b; x != d; x++)
    {
        gotoxy (c,x);
        putchar (186);
    }

    for (x = c; x != a; x–)
    {
        gotoxy (x,d);
        putchar(205);
    }

    for (x = d; x != b; x–)
    {
        gotoxy (a,x);
        putchar(186);
    }

    gotoxy (a,b); putchar(201);
    gotoxy (c,b); putchar(187);
    gotoxy (c,d); putchar(188);
    gotoxy (a,d); putchar(200);
    return 0;
}

int main ()
{
    clrscr ();
    cuadro (5,5,70,20);
    cuadro (6,7,69,19);

    gotoxy (15,6);
    textcolor (CYAN);
    cprintf (“Hola MS/DOS, visita
https://www.lastdragon.net”);
    getchar ();

    return 0;
}

Version GNU/Linux y ncurses.h
#include <ncurses.h>

int cuadro (int a,int b,int c,int d)
{
        int x;

        for (x = a; x != c; x++)
        {
               
move (b,x);
               
addch(‘-‘);
        }

        for (x = b; x != d; x++)
        {
               
move (x,c);
               
addch(‘|’);
        }

        for (x = c; x != a; x–)
        {
               
move (d,x);
               
addch(‘-‘);
        }

        for (x = d; x != b; x–)
        {
               
move (x,a);
               
addch(‘|’);
        }

        move (b,a); addch(‘+’);
        move (b,c); addch(‘+’);
        move (d,c); addch(‘+’);
        move (d,a); addch(‘+’);
        return 0;
}

int main ()
{
        initscr();
        savetty();
        erase ();

        cuadro (5,5,70,20);
        cuadro (6,7,69,19);

        start_color ();
        init_pair
(1,COLOR_CYAN,COLOR_BLACK);
        attron (COLOR_PAIR (1) |
A_UNDERLINE);

        move (6,15);
        addstr (“Hola GNU/Linux,
visita https://www.lastdragon.net”);
        refresh ();

        getch ();
        echo ();
        resetty();
        endwin();

        return 0;

Video demostrando como corren ambos programas

Espero que este artículo ayude a todos los que aprendieron C en ambientes de Microsoft y DOS a migrar sus programas a GNU/Linux y otros NIX usando curses

14 Comments

Add a Comment

Comment spam protected by SpamBam