Listing 1

/*-------------------------------------------------------------*/
/* 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;
}