/*-------------------------------------------------------------*/
/* Purpose: */
/* Enable any key to be pressed while reading and printing */
/* a text file to cancel the print. Uses setjmp() and */
/* longjmp() */
/* Compiled: cl /c /AL /W3 filename (Microsoft Cv5.1) */
/*-------------------------------------------------------------*/
#pragma check_stack (off) /* disable stack checking */
#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <setjmp.h>
#include <io.h>
#include <dos.h>
#include <conio.h>
#include <conio.h>
#include <fcntl.h>
#include <sys\types.h>
#include <sys\stat.h>
static jmp_buf mark;
static void (interrupt far *old_int09) (void);
static void (interrupt far *keyb_rtn_ptr) (void);
static int busy=0;
/* function prototypes */
static void interrupt far new_int09(void);
void main(void);
/*-------------------------------------------------------------*/
/* main()
/* Purpose: */
/* Read and print file indefinitety to test the print cancel.*/
/*-------------------------------------------------------------*/
void main()
{
int read_handle;
int prn_handle;
unsigned read_cnt;
char *buff;
read_handle = open("TEST.DAT", O_BINARY | O_RDWR, 0);
prn_handle = fileno(stdprn); /* get file handle
for stdprn */
buff = (char *) malloc(4096);
if(setjmp(mark) != 0) /* return here on key
press */
{
printf("Cancelled print!\n");
return; /* print cancelled */
}
old_int09 = _dos_getvect(0x09); /* save old keyboard
handler */
_dos_setvect(0x09, new_int09); /* new keyboard
handler */
while(1) /* read forever */
{
read_cnt = read(read_handle, buff, 4096);
write(prn_handle, buff, read_cnt);
lseek(read_handle, OL, SEEK_SET);
}
}
/*------------------------------------------------------------*/
/* new_int09() */
/* Purpose: */
/* Handles interrupt 09h interrupts. */
/*------------------------------------------------------------*/
static void interrupt far new_int09()
{
(*old_int09)(); /* call former interrupt handler */
_disable(); /* disable hardware interrupts */
/* while testing and setting the */
/* busy flag */
if(busy) /* prevent recursive invocations */
return;
busy = 1;
_enable(); /* reenable hardware interrupts - */
/* it's safe */
if(kbhit()) /* key in buffer */
{
longjmp(mark, -1); /* cancel the printing */
}
busy = 0;
}