ftp.nice.ch/pub/next/developer/languages/lisp/AKCL.1.599.s.tar.gz#/akcl-1-599/c/interrupt.c

This is interrupt.c in view mode; [Download] [Up]

/*
(C) Copyright Taiichi Yuasa and Masami Hagiya, 1984.  All rights reserved.
*/

/*
	interrupt.c
	DG-SPECIFIC
*/

#include <sysid.h>
#include <packets:normal_io.h>
#include <packets:task.h>

#include "^h:pio.h"

#include "include.h"

#define WAIT_TIME	1000

object SVinterrupt_enable;					/**/

short	wait_stack[100];

char	*stdin_system_buf;
struct _iobuf
	stdin_system;

init_interrupt()
{
	stdin_system_buf = _fdl[stdin->_fd]->pkt.nio.ibad;
	stdin_system = *stdin;
}

init_interrupt1()						/**/
{								/**/
	SVinterrupt_enable					/**/
	= make_si_special("*INTERRUPT-ENABLE*", Ct);		/**/
}								/**/

sigint()
{
/**************************************************************
	avoid trap of C library read routine.
***************************************************************/
	_fdl[stdin->_fd]->pkt.nio.ibad = stdin_system_buf;
	*stdin = stdin_system;
/**************************************************************/
	interrupt_flag = FALSE;
	terminal_interrupt(FALSE);
}

wait_task()
{
	int ac0, ac1, ac2, ier;

	interrupt_flag = FALSE;
	interrupt_enable = FALSE;	/* FALSE while initializing */

	while (!interrupt_enable) {	/* wait for initializing end */
		ac0 = 100;
		sys($WDELAY, &ac0, &ac1, &ac2);
	}
LOOP:
	sys($INTWT, &ac0, &ac1, &ac2);


/*
	When ^C^A is typed, if the value of SI:*INTERRUPT-ENABLE* is NIL,
	SI:*INTERRUPT-ENABLE* is set to T and the interrupt is ignored.
	By checking the value of SI:*INTERRUPT-ENABLE*,
	the program can control its flow according to terminal interrupts.
	It may have to reset the value of SI:*INTERRUPT-ENABLE*
	for processing successive interrupts.
	If ^C^A is typed twice (or more times) consecutively, however,
	the control will go through the following if statement,
	and the interrupt will be processed in the usual way, i.e.
	an error will be signalled.
*/	
	if (symbol_value(SVinterrupt_enable) == Cnil) {		/**/
		SVinterrupt_enable->s.s_dbind = Ct;		/**/
		goto LOOP;					/**/
	}							/**/

	interrupt_flag = TRUE;

	ac0 = WAIT_TIME;
	sys($WDELAY, &ac0, &ac1, &ac2);

	if (interrupt_flag) {
		while (!interrupt_enable) {
			ac0 = 100;
			sys($WDELAY, &ac0, &ac1, &ac2);
		}
		ac0 = sigint;
		ac1 = 1;
		sys($IDGOTO, &ac0, &ac1, &ac2);
	}

	goto LOOP;
}

/*
	$signal$init is called from C library
*/
$signal$init()
{
	P_TASK	taskp;
	int ac0, ac1, ac2, ier;

	taskp.dlnk = 1;
	taskp.dlnkb = 0;
	taskp.dpri = 0;
	taskp.did = 2;
	taskp.dpc = wait_task;
	taskp.dac2 = 0;
	taskp.dstb = wait_stack;
	taskp.dsflt = -1;
	taskp.dssz = 1024;
	taskp.dflgs = 0;
	taskp.dres = 0;
	taskp.dnum = 1;

	ac2 = &taskp;
	ier = sys($TASK, &ac0, &ac1, &ac2);
	if (ier) sys_emes(ier);

}

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.