|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T u
Length: 3336 (0xd08) Types: TextFile Names: »usgio.c«
└─⟦52210d11f⟧ Bits:30007239 EUUGD2: TeX 3 1992-12 └─⟦883b7f77d⟧ »dvi2vdu.tar.Z« └─⟦f158c222e⟧ └─⟦this⟧ »dvi2vdu/dvi2vdu-1.1J/src/usgio.c«
/* System V interface to the terminal for use by DVItoVDU. Marc Hadley. Kernel Technology. June 1989. Procedures for setting and resetting UNIX tty characteristics. Interesting functions are: savetty(); restoretty(); echoon(); echooff(); singlecharon(); singlecharoff(); buffercount(); suspend(); A side effect of calling savetty() is to set up signal handling to reset the terminal characteristics appropriately for the various interrupt signals. */ #include "def.h" #include <termio.h> #include <signal.h> #include <fcntl.h> #include <setjmp.h> static char *sccsid[] = "@(#)usgio.c 1.1"; extern jmp_buf commprompt_env; /* jump buffer for handleint() */ /* (defined in dvitovdu.c) */ struct termio initchars; /* store initial terminal characteristics */ /* Save the original tty characteristics and set up the signalling. */ void savetty() { (void) ioctl(0, TCGETA, &initchars); setsignals(); } /* Restore the original tty characteristics. */ void restoretty() { (void) ioctl(0, TCSETA, &initchars); } /* Set driver to read characters as they are typed without waiting for a terminator. Echo remains unchanged. */ void singlecharon() { struct termio s; (void) ioctl(0, TCGETA, &s); /* s.c_iflag = IGNPAR | IGNBRK | ICRNL; */ s.c_lflag &= ~ICANON; s.c_cc[VEOF] = 1; s.c_cc[VEOL] = 1; (void) ioctl(0, TCSETA, &s); /* fflush(stdin); */ } /* Turn off single character read mode. */ void singlecharoff() { struct termio s; (void) ioctl(0, TCGETA, &s); s.c_iflag = initchars.c_iflag; s.c_lflag |= ICANON; s.c_cc[VEOF] = initchars.c_cc[VEOF]; s.c_cc[VEOL] = initchars.c_cc[VEOL]; (void) ioctl(0, TCSETA, &s); (void) fflush(stdin); } /* Turn character echoing on. */ void echoon() { struct termio s; (void) ioctl(0, TCGETA, &s); s.c_lflag |= ECHO; (void) ioctl(0, TCSETA, &s); } /* Turn character echoing off. */ void echooff() { struct termio s; (void) ioctl(0, TCGETA, &s); s.c_lflag &= ~ECHO; (void) ioctl(0, TCSETA, &s); } /* Catch signals from tty and do nothing */ handleint(sig) int sig; { char inbuf[512]; extern Void (*ResetVDU)(); (void) fflush(stdin); setsignals(); /* do this first, before longjmp! */ if(sig == SIGINT) longjmp(commprompt_env, 1); /* longjmp to NextCommand() loop */ } /* Signal initialization. */ setsignals() { (void) signal(SIGINT, handleint); } /* set terminal to no blocking read mode , read a char and if one available push it back then return after setting back to blocking read mode */ int getcharnowait() { int success; unsigned char ch; no_block_on(); success = read(0,(char *)(&ch),1); no_block_off(); if (success > 0) return ((int) ch); else return (EOF); } static int s; no_block_on() /* set reads to be knob locking */ { s = fcntl( 0,F_GETFL,0); (void) fcntl( 0, F_SETFL, s | O_NDELAY ); } no_block_off() /* turn off knob locking reads */ { extern int errno; errno = 0; if( fcntl( 0, F_SETFL, s ) == -1 ) (void) printf( "fcntl failed, errno = %d\n", errno ); } /* Suspend the process */ void suspend() { (void) signal(SIGINT, SIG_DFL); #ifdef SIGTSTP kill(0, SIGTSTP); #endif /* resumed again, goody! */ setsignals(); }