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
}
Como gerar qualquer emoji ou símbolo unicode a partir do seu teclado
Instalar e Configurar o Slackware Linux em 2025
Como configurar os repositórios do apt no Debian 12 em 2025
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Configurando o Conky para iniciar corretamente no sistema
3 configurações básicas que podem melhorar muito a sua edição pelo editor nano
Como colorir os logs do terminal com ccze
Instalação Microsoft Edge no Linux Mint 22
Como configurar posicionamento e movimento de janelas no Lubuntu (Openbox) com atalhos de teclado
QUERO REVIVER UM COMPUTADOR ANTIGO, MAS TIVE PROBLEMAS COM OS LINUX QU... (12)
como funciona endereçamento ip? (6)