mirror of
https://github.com/lcn2/calc.git
synced 2025-08-19 01:13:27 +03:00
Some folks might think: “you still use RCS”?!? And we will say, hey, at least we switched from SCCS to RCS back in … I think it was around 1994 ... at least we are keeping up! :-) :-) :-) Logs say that SCCS version 18 became RCS version 19 on 1994 March 18. RCS served us well. But now it is time to move on. And so we are switching to git. Calc releases produce a lot of file changes. In the 125 releases of calc since 1996, when I started managing calc releases, there have been 15473 file mods!
125 lines
4.4 KiB
Plaintext
125 lines
4.4 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.
|
|
##
|
|
## 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/
|