mirror of
https://github.com/lcn2/calc.git
synced 2025-08-16 01:03:29 +03:00
129 lines
4.6 KiB
Plaintext
129 lines
4.6 KiB
Plaintext
Interrupts
|
|
|
|
While a calculation is in progress, you can generate the SIGINT
|
|
signal, and the calculator will catch it. At appropriate points
|
|
within a calculation, the calculator will check that the signal
|
|
has been given, and will abort the calculation cleanly. If the
|
|
calculator is in the middle of a large calculation, it might be
|
|
a while before the interrupt has an effect.
|
|
|
|
You can generate the SIGINT signal multiple times if necessary,
|
|
and each time the calculator will abort the calculation at a more
|
|
risky place within the calculation. Each new interrupt prints a
|
|
message of the form:
|
|
|
|
[Abort level n]
|
|
|
|
where n ranges from 1 to 3. For n equal to 1, the calculator will
|
|
abort calculations at the next statement boundary specified by an
|
|
ABORT opcode as described below. For n equal to 2, the calculator
|
|
will abort calculations at the next opcode boundary. For n equal to 3,
|
|
the calculator will abort calculations at the next attempt to allocate
|
|
memory for the result of an integer arithmetic operation; this
|
|
level may be appropriate for stopping a builtin operation like
|
|
inversion of a large matrix.
|
|
|
|
If a final interrupt is given when n is 3, the calculator will
|
|
immediately abort the current calculation and longjmp back to the
|
|
top level command level. Doing this may result in corrupted data
|
|
structures and unpredictable future behavior, and so should only
|
|
be done as a last resort. You are advised to quit the calculator
|
|
after this has been done.
|
|
|
|
ABORT opcodes
|
|
|
|
If config("trace") & 2 is zero, ABORT opcodes are introduced at
|
|
various places in the opcodes for evaluation of command lines
|
|
and functions defined by "define ... { ... }" commands. In the
|
|
following, config("trace") has been set equal to 8 so that opcodes
|
|
are displayed when a function is defined. The function f(x)
|
|
evaluates x + (x - 1) + (x - 2) + ... until a zero term is
|
|
encountered. If f() is called with a negative or fractional x,
|
|
the calculation is never completed and to stop it, an interruption
|
|
(on many systems, by ctrl-C) will be necessary.
|
|
|
|
; config("trace", 8),
|
|
; define f(x) {local s; while (x) {s += x--} return s}
|
|
0: DEBUG line 2
|
|
2: PARAMADDR x
|
|
4: JUMPZ 19
|
|
6: DEBUG line 2
|
|
8: LOCALADDR s
|
|
10: DUPLICATE
|
|
11: PARAMADDR x
|
|
13: POSTDEC
|
|
14: POP
|
|
15: ADD
|
|
16: ASSIGNPOP
|
|
17: JUMP 2
|
|
19: DEBUG line 2
|
|
21: LOCALADDR s
|
|
23: RETURN
|
|
f(x) defined
|
|
|
|
(The line number following DEBUG refers to the line in the file
|
|
from which the definition is read.) If an attempt is made to
|
|
evaluate f(-1), the effect of the DEBUG at opcode 6 ensures that
|
|
a single SIGINT will stop the calculation at a start of
|
|
{s += x--} loop. In interactive mode, with ^C indicating
|
|
input of ctrl-C, the displayed output is as in:
|
|
|
|
; f(-1)
|
|
^C
|
|
[Abort level 1]
|
|
"f": line 2: Calculation aborted at statement boundary
|
|
|
|
The DEBUG opcodes are disabled by nonzero config("trace") & 2.
|
|
Changing config("trace") to achieve this, and defining g(x) with
|
|
the same definition as for f(x) gives:
|
|
|
|
; define g(x) {local s; while (x) {s += x--} return s}
|
|
0: PARAMADDR x
|
|
2: JUMPZ 15
|
|
4: LOCALADDR s
|
|
6: DUPLICATE
|
|
7: PARAMADDR x
|
|
9: POSTDEC
|
|
10: POP
|
|
11: ADD
|
|
12: ASSIGNPOP
|
|
13: JUMP 0
|
|
15: LOCALADDR s
|
|
17: RETURN
|
|
g(x) defined
|
|
|
|
If g(-1) is called, two interrupts are necessary, as in:
|
|
|
|
; g(-1)
|
|
^C
|
|
[Abort level 1]
|
|
^C
|
|
[Abort level 2]
|
|
"g": Calculation aborted in opcode
|
|
|
|
## Copyright (C) 1999-2006 David I. Bell, Landon Curt Noll and Ernest Bowen
|
|
##
|
|
## Calc is open software; you can redistribute it and/or modify it under
|
|
## the terms of the version 2.1 of the GNU Lesser General Public License
|
|
## as published by the Free Software Foundation.
|
|
##
|
|
## Calc is distributed in the hope that it will be useful, but WITHOUT
|
|
## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
## or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General
|
|
## Public License for more details.
|
|
##
|
|
## A copy of version 2.1 of the GNU Lesser General Public License is
|
|
## distributed with calc under the filename COPYING-LGPL. You should have
|
|
## received a copy with calc; if not, write to Free Software Foundation, Inc.
|
|
## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
##
|
|
## @(#) $Revision: 30.1 $
|
|
## @(#) $Id: interrupt,v 30.1 2007/03/16 11:10:42 chongo Exp $
|
|
## @(#) $Source: /usr/local/src/cmd/calc/help/RCS/interrupt,v $
|
|
##
|
|
## Under source code control: 1991/07/21 04:37:21
|
|
## File existed as early as: 1991
|
|
##
|
|
## chongo <was here> /\oo/\ http://www.isthe.com/chongo/
|
|
## Share and enjoy! :-) http://www.isthe.com/chongo/tech/comp/calc/
|