/* ** prtoggle() ** ** Tee's all standard output to the printer. ** ** Parameters: None ** ** Returns: 0 if operation was successful. ** -1 if stdout or stdin is redirected. ** ** Side effects: Flushes the keyboard buffer ** ** Original Copyright 1988-1991 by Bob Stout as part of ** the MicroFirm Function Library (MFL) ** ** This subset version is functionally identical to the ** version originally published by the author in Tech Specialist ** magazine and is hereby donated to the public domain. */ #include #include #include #include #if !defined(__ZTC__) && !defined(__TURBOC__) #define MK_FP(seg,offset) \ ((void far *)(((unsigned long)(seg)<<16) | (unsigned)(offset))) #define peek(s,o) (*((unsigned far *)(MK_FP(s,o)))) #define poke(s,o,w) (*((unsigned far *)(MK_FP(s,o)))=(w)) #endif #define SUCCESS 0 #define ERROR -1 static unsigned head, tail, start, end; static int idx = 0; static unsigned keystack[16][2]; int ungetkey(unsigned key) { int count; #ifdef __ZTC__ peek(0x40, 0x1a, &head, sizeof(unsigned)); peek(0x40, 0x1c, &tail, sizeof(unsigned)); #else head = peek(0x40, 0x1a); tail = peek(0x40, 0x1c); #endif count = tail - head; if (0 > count) count += (16 * sizeof(unsigned)); count >>= 1; if (15 > count) { #ifdef __ZTC__ peek(0x40, tail, &keystack[idx][0], sizeof(unsigned)); #else keystack[idx][0] = peek(0x40, tail); #endif keystack[idx][1] = tail; #ifdef __ZTC__ poke(0x40, tail, &key, sizeof(unsigned)); #else poke(0x40, tail, key); #endif tail += sizeof(unsigned); if (0x3e <= tail) tail = 0x1e; #ifdef __ZTC__ poke(0x40, 0x1c, &tail, sizeof(unsigned)); #else poke(0x40, 0x1c, tail); #endif return key; } return EOF; } int prtoggle(void) { if (!isatty(fileno(stdin)) || !isatty(fileno(stdout))) return -1; while (kbhit()) /* Flush the keyboard buffer */ getch(); ungetkey('P' - 64); /* Stuff a Ctrl-P into the buffer */ system(""); /* Let COMMAND.COM do the work */ return 0; }