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
}
Servidor de Backup com Ubuntu Server 24.04 LTS, RAID e Duplicati (Dell PowerEdge T420)
Visualizar câmeras IP ONVIF no Linux sem necessidade de instalar aplicativos
Atualizar Debian Online de uma Versão para outra
Instalando Discord no Debian 13
Instalar driver Nvidia no Debian 13
Redimensionando, espelhando, convertendo e rotacionando imagens com script
Software livre - será que eu estou tão errado assim? (10)
Boot do PosRog so funciona em notebook (1)