1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
|
/*
** 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 <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <io.h>
#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;
}
|