Enviado em 30/09/2012 - 05:48h
Eu não conheço biblioteca de compatibilidade entre DOS e UNIX num nível como os desses comandos externos. Aliás, nem sei se deveria existir, pois, como está explícito, trata-se de comandos externos.#include <stdlib.h>
int pausar(void){
#if defined(__unix)
return system("echo -n 'Pressione <ENTER> para prosseguir... ' ; read dummy")==0;
#elif defined(_MSDOS_) || defined(_WIN32) || defined(_WIN64) || defined(_OS2)
return system("pause")==0;
#else
/*
Sistema desconhecido. Como o C padrão é agnóstico sobre o ambiente
de execução, o mais seguro é não fazer coisa alguma.
*/
return 0;
#endif
}
int limpatela(void){
#if defined(__unix)
/*
O comando "clear" é um comando externo, que pode nem mesmo estar
instalado. Se não conseguir executar, a tela vai continuar "suja",
e ainda vai surgir nela uma mensagem de erro.
*/
return system("clear")==0;
#elif defined(_MSDOS_) || defined(_WIN32) || defined(_WIN64) || defined(_OS2)
return system("cls")==0;
#else
/*
Sistema desconhecido. Como o C padrão é agnóstico sobre o hardware,
pode ser que nem exista tela; logo não faz coisa alguma.
*/
return 0;
#endif
}
#if defined(__unix)
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <curses.h>
#include <term.h>
#endif
#include <stdio.h>
#include <stdlib.h>
int pausar(void){
#if defined(__unix)
static const char msg[]="Pressione <ENTER> para prosseguir... ";
static const char nl='\n';
int cons_fd;
struct termios old_tc, tc;
char ch;
/*
Obtém descritor do terminal controlador do processo, mesmo que as
entradas e saídas padrão tenham sido redirecionadas. Se falhar,
então não tem terminal controlador, logo não faz sentido pausar.
*/
if((cons_fd=open("/dev/tty", O_RDWR, 0x644))==-1)
return 0;
/* Obtém e salva configuração atual do terminal. */
tcgetattr(cons_fd, &old_tc);
/*
Copia configuração obtida, alterando propriedades necessárias para
uma leitura sem eco na tela, para mínimo impacto visual.
*/
tc=old_tc;
tc.c_lflag&=~(ICANON|ECHO);
tc.c_cc[VMIN]=1;
tc.c_cc[VTIME]=0;
tcsetattr(cons_fd, TCSANOW, &tc);
/* Exibe mensagem de prompt. */
write(cons_fd, msg, sizeof(msg)-1);
/* Aguarda o caráter correspondente à tecla desejada. */
while ( read(cons_fd, &ch, 1)==1 && ch!='\n' )
; /* Isso mesmo: nada dentro do corpo do loop. */
/*
Pula linha, para evitar que o próximo texto escrito na tela fique
junto da mensagem de prompt.
*/
write(cons_fd, &nl, 1);
/* Restaura configuração original do terminal e fecha seu descritor. */
tcsetattr(cons_fd, TCSANOW, &old_tc);
close(cons_fd);
/* Retorna indicando sucesso. */
return 1;
#elif defined(_MSDOS_) || defined(_WIN32) || defined(_WIN64) || defined(_OS2)
return system("pause")==0;
#else
/*
Sistema desconhecido. Como o C padrão é agnóstico sobre o ambiente
de execução, o mais seguro é não fazer coisa alguma.
*/
return 0;
#endif
}
int limpatela(void){
#if defined(__unix)
/* Só limpa a tela se a saída padrão estiver ligada a um terminal. */
if(!isatty(STDOUT_FILENO))
return 0;
/*
Vê se o tipo do terminal já está definido, por meio da variável global
cur_term, declarada em term.h.
*/
if(cur_term==NULL){
/* Não está ainda. Tenta defini-lo. */
int err_code;
if(setupterm(NULL, STDOUT_FILENO, &err_code)==ERR || err_code!=1){
/* Falha. Retorna indicando que nada foi feito. */
return 0;
}
}
/*
Envia código de limpeza de tela. O valor retornado será 1 se
tiver tido sucesso, e zero de tiver havido falha.
*/
return putp(clear_screen)==OK;
#elif defined(_MSDOS_) || defined(_WIN32) || defined(_WIN64) || defined(_OS2)
return system("cls")==0;
#else
/*
Sistema desconhecido. Como o C padrão é agnóstico sobre o hardware,
pode ser que nem exista tela; logo não faz coisa alguma.
*/
return 0;
#endif
}
Programa IRPF - Guia de Instalação e Resolução de alguns Problemas
Criando uma Infraestrutura para uma micro Empresa
Criar entrada (menuentry) ISO no Grub
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
O Que Fazer Após Instalar Fedora 42
Debian 12 -- Errata - Correções de segurança
Instalando o Pi-Hole versão v5.18.4 depois do lançamento da versão v6.0
O FIM da minha distro predileta: ARCOLINUX ...que pena (7)
Copiar Layout do Teclado para aplicar em outra Distribuição (1)