{"id":223,"date":"2008-01-14T00:01:30","date_gmt":"2008-01-14T06:01:30","guid":{"rendered":"http:\/\/www.lastdragon.net\/?p=223"},"modified":"2008-01-14T00:49:42","modified_gmt":"2008-01-14T06:49:42","slug":"reservado-8","status":"publish","type":"post","link":"https:\/\/www.lastdragon.net\/?p=223","title":{"rendered":"de Conio.h a Ncurses.h en C &#8211; MS-DOS a GNU\/Linux"},"content":{"rendered":"<p>El fin de semana pasado una amiga me pidi\u00f3 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\u00f3n con GNU\/Linux.<\/p>\n<p>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.<\/p>\n<p>Revise el c\u00f3digo y el 90% era c\u00f3digo ANSI, pero el manejo de la consola, no era as\u00ed, no era portable porque conio.h es una librer\u00eda de borland C y est\u00e1 pr\u00e1cticamente amarrada al MSDOS, jam\u00e1s iba a funcionarle el c\u00f3digo en Linux, a menos que se modificara y reescribiera una subversi\u00f3n para Linux y pues al final no es dif\u00edcil portarlo, asi que la ayude con eso tambi\u00e9n, ahora tiene un programa que compila y funciona en DOS como en Linux<\/p>\n<p>El problema que hay aun en algunas universidades es que siguen ense\u00f1ando Turbo C y sus librer\u00edas 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\u00edas. <\/p>\n<p>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.<\/p>\n<p>Aqu\u00ed tratare de mostrar como portar programas de conio.h a ncurses.h<\/p>\n<p>Curses es mucho mas rico que conio, por ejemplo curses soporta underline osea subrayar letras en la consola ademas del cl\u00e1sico blink que las letras aparezcan  y desaparezcan. El  conio.h solo trae soporte a blink<\/p>\n<p>Curses es solo un poco mas dif\u00edcil 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.<\/p>\n<p>Podemos inicializar la ventana con las siguientes funciones<\/p>\n<p>       initscr();<br \/>\n       savetty();<\/p>\n<p>y terminar la ventana para volver a la consola stadart con<\/p>\n<p>echo ();<br \/>\n resetty();<br \/>\n endwin();<\/p>\n<p>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\u00e1n los caracteres porque no tendr\u00e1n echo, si es que en el programa hicimos un noecho();<\/p>\n<p>Despues deinicializar la ventana con curses.h la programaci\u00f3n se torna similar a conio.h pero con algunas variantes, mostrare las fuciones mas comunes en conio.h en su versi\u00f3n curses<\/p>\n<p>Conio.h       ncurses.h<\/p>\n<p>Limpiar pantalla<br \/>\nClrscr();  \u2013  erase ();<\/p>\n<p>Mover el cursor en la plantalla<br \/>\nGotoxy (x,y)  &#8211;   move (y,x);<br \/>\nN\u00f3tese que las X y las Y est\u00e1n invertidas en curses, fuera de ese detalle el comportamiento es el mismo<\/p>\n<p>Imprimir caracteres en pantalla<br \/>\nCprintf  (); &#8211;  addch ();  o si se trata de una cadena addstr ();<\/p>\n<p>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\u00ed como la paleta de colores que vamos a usar, la usaremos en pares 2 colores por vez \u00f3sea el color de frente y el de fondo<br \/>\nEn conio.h textcolor y textbackground  son 2 funciones separadas en curses se usan al mismo tiempo<\/p>\n<p>Primero se inicializa con la funci\u00f3n start_color ();<br \/>\nDespu\u00e9s se asignan los colores con las funciones<br \/>\ninit_pair (1,COLOR_CYAN,COLOR_BLACK);<\/p>\n<p>en init_pair le decimos el color de frente que es CYAN y el de fondo que es negro<br \/>\n attron (COLOR_PAIR (1) | A_UNDERLINE);<br \/>\ncon attron lo asignamos a la ventana, y adem\u00e1s 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.<\/p>\n<p>Ahora escribir\u00e9 un programa con estas funciones b\u00e1sicas que ser\u00e1 exactamente igual a la hora de ejecutarse en DOS usando conio.h y en GNU\/Linux usando curses.<\/p>\n<p>Version DOS y Conio.h<\/p>\n<p>#include &lt;conio.h&gt;<br \/>\n#include &lt;stdio.h&gt;<\/p>\n<p>int cuadro (int a,int b,int c,int d)<br \/>\n{<br \/>\n&nbsp;&nbsp;&nbsp; int x;<\/p>\n<p>&nbsp;&nbsp;&nbsp; for (x = a; x != c; x++)<br \/>\n&nbsp;&nbsp;&nbsp; {<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gotoxy (x,b);<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; putchar (205);<br \/>\n&nbsp;&nbsp;&nbsp; }<\/p>\n<p>&nbsp;&nbsp;&nbsp; for (x = b; x != d; x++)<br \/>\n&nbsp;&nbsp;&nbsp; {<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gotoxy (c,x);<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; putchar (186);<br \/>\n&nbsp;&nbsp;&nbsp; }<\/p>\n<p>&nbsp;&nbsp;&nbsp; for (x = c; x != a; x&#8211;)<br \/>\n&nbsp;&nbsp;&nbsp; {<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gotoxy (x,d);<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; putchar(205);<br \/>\n&nbsp;&nbsp;&nbsp; }<\/p>\n<p>&nbsp;&nbsp;&nbsp; for (x = d; x != b; x&#8211;)<br \/>\n&nbsp;&nbsp;&nbsp; {<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; gotoxy (a,x);<br \/>\n&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; putchar(186);<br \/>\n&nbsp;&nbsp;&nbsp; }<\/p>\n<p>&nbsp;&nbsp;&nbsp; gotoxy (a,b); putchar(201);<br \/>\n&nbsp;&nbsp;&nbsp; gotoxy (c,b); putchar(187);<br \/>\n&nbsp;&nbsp;&nbsp; gotoxy (c,d); putchar(188);<br \/>\n&nbsp;&nbsp;&nbsp; gotoxy (a,d); putchar(200);<br \/>\n&nbsp;&nbsp;&nbsp; return 0;<br \/>\n}<\/p>\n<p>int main ()<br \/>\n{<br \/>\n&nbsp;&nbsp;&nbsp; clrscr ();<br \/>\n&nbsp;&nbsp;&nbsp; cuadro (5,5,70,20);<br \/>\n&nbsp;&nbsp;&nbsp; cuadro (6,7,69,19);<\/p>\n<p>&nbsp;&nbsp;&nbsp; gotoxy (15,6);<br \/>\n&nbsp;&nbsp;&nbsp; textcolor (CYAN);<br \/>\n&nbsp;&nbsp;&nbsp; cprintf (&#8220;Hola MS\/DOS, visita<br \/>\nhttps:\/\/www.lastdragon.net&#8221;);<br \/>\n&nbsp;&nbsp;&nbsp; getchar ();<\/p>\n<p>\n&nbsp;&nbsp;&nbsp; return 0;<br \/>\n}<\/p>\n<p>Version GNU\/Linux y ncurses.h<br \/>\n#include &lt;ncurses.h&gt;<\/p>\n<p>int cuadro (int a,int b,int c,int d)<br \/>\n{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (x = a; x != c; x++)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nmove (b,x);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\naddch(&#8216;-&#8216;);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (x = b; x != d; x++)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nmove (x,c);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\naddch(&#8216;|&#8217;);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (x = c; x != a; x&#8211;)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nmove (d,x);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\naddch(&#8216;-&#8216;);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (x = d; x != b; x&#8211;)<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\nmove (x,a);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br \/>\naddch(&#8216;|&#8217;);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; move (b,a); addch(&#8216;+&#8217;);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; move (b,c); addch(&#8216;+&#8217;);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; move (d,c); addch(&#8216;+&#8217;);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; move (d,a); addch(&#8216;+&#8217;);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<br \/>\n}<\/p>\n<p>int main ()<br \/>\n{<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; initscr();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; savetty();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; erase ();<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cuadro (5,5,70,20);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cuadro (6,7,69,19);<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; start_color ();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init_pair<br \/>\n(1,COLOR_CYAN,COLOR_BLACK);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; attron (COLOR_PAIR (1) |<br \/>\nA_UNDERLINE);<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; move (6,15);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; addstr (&#8220;Hola GNU\/Linux,<br \/>\nvisita https:\/\/www.lastdragon.net&#8221;);<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; refresh ();<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; getch ();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo ();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; resetty();<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; endwin();<\/p>\n<p>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 0;<\/p>\n<p>Video demostrando como corren  ambos programas<\/p>\n<p><object width=\"425\" height=\"350\"><param name=\"movie\" value=\"http:\/\/www.youtube.com\/v\/9H794xO1L7s\"><\/param><embed src=\"http:\/\/www.youtube.com\/v\/9H794xO1L7s\" type=\"application\/x-shockwave-flash\" width=\"425\" height=\"350\"><\/embed><\/object><\/p>\n<p>Espero que este art\u00edculo 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<\/p>\n","protected":false},"excerpt":{"rendered":"<p>El fin de semana pasado una amiga me pidi\u00f3 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\u00f3n con GNU\/Linux. Desenfundo su memoria USB e inmediatamente trato de mostrarme el programa, por supuesto el&#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3],"tags":[],"class_list":["post-223","post","type-post","status-publish","format-standard","hentry","category-programacion"],"_links":{"self":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/223","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=223"}],"version-history":[{"count":0,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=\/wp\/v2\/posts\/223\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=223"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=223"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lastdragon.net\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}