Release calc version 2.11.0t7.2

This commit is contained in:
Landon Curt Noll
1999-10-15 11:48:41 -07:00
parent 35982c7cc8
commit 9204d2fb8c
10 changed files with 536 additions and 275 deletions

12
BUGS
View File

@@ -77,15 +77,3 @@ Known problems or mis-features:
* There is some places in the source with obscure variable names * There is some places in the source with obscure variable names
and not much in the way of comments. We need some major cleanup and not much in the way of comments. We need some major cleanup
and documentation. and documentation.
* On a Dec Alpha, using the Dec Alpha cc (not gcc) make check for
version 2.11.0t5.1 fails in the regression test:
From vandermj@molbio.sbphrd.com Tue Oct 5 04:06:52 1999
Subject: Re: oops, try calc version 2.10.0t5.1
Date: Tue, 05 Oct 1999 07:06:30 -0400
Regular cc on Dec alpha, 'make check' dies with:
1804: surd_value(a) == 2+3i
"": line 1706: Calling qfreenum with nozero links!!!

17
CHANGES
View File

@@ -103,6 +103,23 @@ Following is the change from calc version 2.11.0t7 to date:
n == 0 if -c, continue, without -c, stop n == 0 if -c, continue, without -c, stop
n < 0 continue on error, even if -c was given on the command line n < 0 continue on error, even if -c was given on the command line
Calc compilation now stops at the first scanerror.
Restored the feature where -p disables the printing of leading tabs
as of config("tab",0) had been executed. So using calc in a pipe:
calc -p 2+17 | whey
will write '19' instead of '\t17' to the whey command.
Updated calc man page and help/usage file to reflect recent
command line changes.
Converted start_done into a general calc run state enum called
run_state within the calc source.
Misc calc man page fixes.
Following is the change from calc version 2.11.0t1 to 2.11.0t6.3: Following is the change from calc version 2.11.0t1 to 2.11.0t6.3:

96
calc.c
View File

@@ -11,7 +11,6 @@
#include <pwd.h> #include <pwd.h>
#include <sys/types.h> #include <sys/types.h>
#include <ctype.h> #include <ctype.h>
#include <setjmp.h>
#define CALC_C #define CALC_C
#include "calc.h" #include "calc.h"
@@ -37,40 +36,13 @@
#include <stdlib.h> #include <stdlib.h>
#endif #endif
/*
* external definitions and functions
*/
extern int abortlevel; /* current level of aborts */
extern BOOL inputwait; /* TRUE if in a terminal input wait */
extern jmp_buf jmpbuf; /* for errors */
extern int isatty(int tty); /* TRUE if fd is a tty */
extern int p_flag; /* TRUE => pipe mode */
extern int q_flag; /* TRUE => don't execute rc files */
extern int u_flag; /* TRUE => unbuffer stdin and stdout */
extern int d_flag; /* TRUE => disable heading, lib_debug == 0 */
extern int stoponerror; /* >0 => stop, <0 => continue, ==0 => use -c */
extern char *pager; /* $PAGER or default */
extern int stdin_tty; /* TRUE if stdin is a tty */
extern int interactive; /* TRUE if interactive session (no cmd args) */
extern char *program; /* our name */
extern char cmdbuf[]; /* command line expression */
extern char *version(void); /* return version string */
/* /*
* static definitions and functions * static definitions and functions
*/ */
static char *usage = "usage: %s [-C] [-e] [-h] [-i] [-m mode] [-n] [-p]\n" static char *usage = "usage: %s [-c] [-C] [-d] [-e] [-h] [-i] [-m mode]\n"
"\t[-q] [-u] [-c] [-d] [[--] calc_cmd ...]\n"; "\t[-n] [-p] [-q] [-u] [-v] [[--] calc_cmd ...]\n";
static void intint(int arg); /* interrupt routine */ static void intint(int arg); /* interrupt routine */
static int havecommands;
static int c_flag; /* To permit continuation after error */
static int i_flag; /* To go interactive if permitted */
/* /*
* Top level calculator routine. * Top level calculator routine.
@@ -163,8 +135,7 @@ main(int argc, char **argv)
exit(1); exit(1);
} }
} }
interactive = (optind >= argc); havecommands = (optind < argc);
havecommands = !interactive;
/* /*
* look at the length of any trailing command args * look at the length of any trailing command args
@@ -258,69 +229,73 @@ main(int argc, char **argv)
post_init = TRUE; post_init = TRUE;
} }
/*
* (re)establish the interrupt handler
*/
(void) signal(SIGINT, intint); (void) signal(SIGINT, intint);
if (start_done == 0) { /*
* execute calc code based on the run state
*/
if (run_state == RUN_PRE_BEGIN) {
if (!q_flag && allow_read) { if (!q_flag && allow_read) {
start_done = 1; run_state = RUN_PRE_RCFILES;
runrcfiles(); runrcfiles();
} }
start_done = 2; run_state = RUN_POST_RCFILES;
} }
if (start_done == 1) { if (run_state == RUN_PRE_RCFILES) {
fprintf(stderr, "Execution error in rcfiles\n"); fprintf(stderr, "Execution error in rcfiles\n");
if ((c_flag && !stoponerror) || stoponerror < 0) { if ((c_flag && !stoponerror) || stoponerror < 0) {
getcommands(FALSE); getcommands(FALSE);
start_done = 2; run_state = RUN_POST_RCFILES;
} else { } else {
if ((havecommands && !i_flag) || !stdin_tty) if ((havecommands && !i_flag) || !stdin_tty)
start_done = 7; run_state = RUN_STOP_ON_ERROR;
else if (havecommands) else if (havecommands)
start_done = 4; run_state = RUN_POST_CMD_ARGS;
else else
start_done = 2; run_state = RUN_POST_RCFILES;
} }
} }
if (start_done == 2) { if (run_state == RUN_POST_RCFILES) {
if (havecommands) { if (havecommands) {
start_done = 3; run_state = RUN_PRE_CMD_ARGS;
(void) openstring(cmdbuf); (void) openstring(cmdbuf);
getcommands(FALSE); getcommands(FALSE);
} }
start_done = 4; run_state = RUN_POST_CMD_ARGS;
} }
if (start_done == 3) { if (run_state == RUN_PRE_CMD_ARGS) {
fprintf(stderr, "Execution error in commands\n"); fprintf(stderr, "Execution error in commands\n");
if ((c_flag && !stoponerror) || stoponerror < 0) { if ((c_flag && !stoponerror) || stoponerror < 0) {
getcommands(FALSE); getcommands(FALSE);
start_done = 4; run_state = RUN_POST_CMD_ARGS;
} } else {
else {
closeinput(); closeinput();
if (!stdin_tty || !i_flag) if (!stdin_tty || !i_flag)
start_done = 7; run_state = RUN_STOP_ON_ERROR;
else else
start_done = 4; run_state = RUN_POST_CMD_ARGS;
} }
} }
if (start_done == 4) { if (run_state == RUN_POST_CMD_ARGS) {
if (stdin_tty && ((havecommands && !i_flag) || p_flag)) if (stdin_tty && ((havecommands && !i_flag) || p_flag))
start_done = 6; run_state = RUN_NOT_TOP_LEVEL;
else else
openterminal(); openterminal();
} } else if (run_state == RUN_TOP_LEVEL) {
else if (start_done == 5) { if (!stdin_tty && (!c_flag || stoponerror) &&
if (!stdin_tty && (!c_flag || stoponerror) && stoponerror >= 0) { stoponerror >= 0) {
start_done = 7; run_state = RUN_STOP_ON_ERROR;
} } else if ((c_flag && !stoponerror) || stoponerror < 0)
else if ((c_flag && !stoponerror) || stoponerror < 0)
getcommands(FALSE); getcommands(FALSE);
else else
reinitialize(); reinitialize();
} }
if (start_done < 6) { if (run_state < RUN_NOT_TOP_LEVEL) {
start_done = 5; run_state = RUN_TOP_LEVEL;
getcommands(TRUE); getcommands(TRUE);
} }
@@ -328,7 +303,8 @@ main(int argc, char **argv)
* all done * all done
*/ */
libcalc_call_me_last(); libcalc_call_me_last();
return (start_done - 6) ? 1 : 0; return (run_state == RUN_STOP_ON_ERROR ||
run_state == RUN_UNKNOWN) ? 1 : 0;
} }

42
calc.h
View File

@@ -10,6 +10,7 @@
#if !defined(__CALC_H__) #if !defined(__CALC_H__)
#define __CALC_H__ #define __CALC_H__
#include <setjmp.h>
#include "value.h" #include "value.h"
@@ -146,15 +147,34 @@ extern void showerrors(void);
*/ */
extern void initialize(void); extern void initialize(void);
extern void reinitialize(void); extern void reinitialize(void);
extern int isatty(int tty); /* TRUE if fd is a tty */
extern char *version(void); /* return version string */
extern int post_init; /* TRUE => setjmp for math_error is ready */
/* /*
* Global data definitions. * global flags and definitions
*/ */
extern int abortlevel; /* current level of aborts */
extern BOOL inputwait; /* TRUE if in a terminal input wait */
extern jmp_buf jmpbuf; /* for errors */
extern int p_flag; /* TRUE => pipe mode */
extern int q_flag; /* TRUE => don't execute rc files */
extern int u_flag; /* TRUE => unbuffer stdin and stdout */
extern int d_flag; /* TRUE => disable heading, lib_debug == 0 */
extern int c_flag; /* TRUE => continue after error if permitted */
extern int i_flag; /* TRUE => try to go interactive after error */
extern int stoponerror; /* >0 => stop, <0 => continue, ==0 => use -c */
extern char *pager; /* $PAGER or default */
extern int stdin_tty; /* TRUE if stdin is a tty */
extern int havecommands; /* TRUE if have cmd args) */
extern char *program; /* our name */
extern char cmdbuf[]; /* command line expression */
extern int abortlevel; /* current level of aborts */ extern int abortlevel; /* current level of aborts */
extern BOOL inputwait; /* TRUE if in a terminal input wait */ extern BOOL inputwait; /* TRUE if in a terminal input wait */
extern VALUE *stack; /* execution stack */ extern VALUE *stack; /* execution stack */
extern int start_done; /* TRUE => start up processing finished */
extern int dumpnames; /* TRUE => dump names rather than indices */ extern int dumpnames; /* TRUE => dump names rather than indices */
extern char *calcpath; /* $CALCPATH or default */ extern char *calcpath; /* $CALCPATH or default */
@@ -172,7 +192,21 @@ extern int allow_read; /* FALSE => may not open any files for reading */
extern int allow_write; /* FALSE => may not open any files for writing */ extern int allow_write; /* FALSE => may not open any files for writing */
extern int allow_exec; /* FALSE => may not execute any commands */ extern int allow_exec; /* FALSE => may not execute any commands */
extern int post_init; /* TRUE => setjmp for math_error is ready */ /*
* calc startup and run state
*/
typedef enum {
RUN_UNKNOWN = -1, /* unknown or unset start state */
RUN_PRE_BEGIN = 0, /* pre-startup state, calc execution started */
RUN_PRE_RCFILES = 1, /* rc files about to or are being evaluated */
RUN_POST_RCFILES = 2, /* rc files have been evaluated */
RUN_PRE_CMD_ARGS = 3, /* cmd_args about to or are being evaluated */
RUN_POST_CMD_ARGS = 4, /* cmd_args have been evaluated */
RUN_TOP_LEVEL = 5, /* running at the top interactive level */
RUN_NOT_TOP_LEVEL = 6, /* running not at the top interactive level */
RUN_STOP_ON_ERROR = 7 /* we need to stop due to errors */
} run;
extern run run_state;
/* /*

517
calc.man
View File

@@ -1,46 +1,186 @@
.\" .\"
.\" Copyright (c) 1994 David I. Bell and Landon Curt Noll .\" Copyright (c) 1993 David I. Bell and Landon Curt Noll
.\" Original man page dated 15nov93
.\" Copyright (c) 1999 David I. Bell and Landon Curt Noll
.\" Permission is granted to use, distribute, or modify this source, .\" Permission is granted to use, distribute, or modify this source,
.\" provided that this copyright notice remains intact. .\" provided that this copyright notice remains intact.
.\" .\"
.\" calculator by David I. Bell .\" calculator by David I. Bell
.\" man page by Landon Noll .\" man page by Landon Noll
.TH calc 1 "^..^" "15nov93" .TH calc 1 "^..^" "15Oct1999"
.SH NAME .SH NAME
calc \- arbitrary precision calculator calc \- arbitrary precision calculator
.SH SYNOPSIS .SH SYNOPSIS
\fIcalc\fP \fIcalc\fP
[\fI\-h\fP] .RB [ \-c ]
[\fI\-m mode\fP] .RB [ \-C ]
[\fI\-p\fP] .RB [ \-d ]
[\fI\-q\fP] .RB [ \-e ]
[\fI\-u\fP] .RB [ \-h ]
[\fI\-v\fP] .RB [ \-i ]
[\fIcalc_cmd \&.\|.\|.\fp] .RB [ \-m\ \&mode ]
.br
.in +5n
.RB [ \-n ]
.RB [ \-p ]
.RB [ \-q ]
.RB [ \-u ]
.RB [ \-v ]
.RB [ calc_cmd\ \&.\|.\|. ]
.in -5n
.SH DESCRIPTION .SH DESCRIPTION
\& \&
.br .br
CALC COMMAND LINE CALC COMMAND LINE
.PP .PP
.TP .TP
\fI\-h\fP .B \-c
Print a help message. Continue reading command lines even after an execution
This option implies \fI \-q\fP. error has caused the abandonment of a line.
This is equivalent to the calc command \fIhelp help\fP. .sp 1
The help facility is disabled unless the \fImode\fP is 5 or 7. For example:
See \fI\-m\fP below. .sp 1
.sp .in +5n
.nf
calc read many_errors.cal
.fi
.in -5n
.sp 1
will cause
.B calc
to abort on the first error, whereas:
.sp 1
.in +5n
.nf
calc -c read many_errors.cal
.fi
.in -5n
.sp 1
will
cause
.B calc
to try to process each line being read
despite the errors that it encounters.
.TP .TP
\fI\-m mode\fP .B \-C
This flag sets the permission mode of calc. Permit the execution of custom builtin functions. Without
It controls the ability for \fIcalc\fP to open files this flag, calling the custom() builtin function will
and execute programs. simply generate an error.
\fIMode\fP may be a number from 0 to 7. .sp 1
.sp Use if this flag may cause
The \fImode\fP value is interpreted in a way similar .B calc
to that of the \fRchmod(1)\fP octal mode: to execute functions that
.sp are non-standard and that are not portable. Custom builtin
.in +0.5i functions are disabled by default for this reason.
.TP
.B \-d
Disable the printing of the opening title. The printing
of library debug and informational messages is also disabled
as if \fBconfig("lib_debug", 0)\fP had been executed.
.sp 1
For example:
.sp 1
.in +5n
calc 'read qtime; qtime(2)'
.in -5n
.sp 1
will output something like:
.sp 1
.in +5n
.nf
qtime(utc_hr_offset) defined
It's nearly ten past six.
.fi
.in -5n
.sp 1
whereas:
.sp 1
.in +5n
.nf
calc -d 'read qtime; qtime(2)'
.fi
.in -5n
.sp 1
will just say:
.sp 1
.in +5n
.nf
It's nearly ten past six.
.fi
.in -5n
.sp 1
.TP
.B \-e
Ignore any environment variables on startup.
The getenv() builtin will still return values, however.
.TP
.B \-h
Print a help message. This option implies
.BR \-q .
This
is equivalent to the
.B calc
command help help.
The help facility is disabled unless the mode is 5 or 7.
See
.BR \-m .
.TP
.B \-i
Become interactive if possible.
Be default, if
.I calc_cmd
args are given,
.B calc
will execute them and exit.
This flag args are given,
.B calc
will execute them and exit.
This flag will cause
.B calc
to drop into interactive mode after the
commands are executed.
.sp 1
For example:
.sp 1
.in +5n
.nf
calc 2+5
.fi
.in -5n
.sp 1
will print the value 7 and exit whereas:
.sp 1
.in +5n
.nf
calc -i 2+5
.fi
.in -5n
.sp 1
will print the value 7 and prompt the user for more
.B calc
commands.
.TP
.BR \-m " mode"
This flag sets the permission mode of
.BR calc .
It controls the ability for
.B calc
to open files and execute programs.
Mode may be a number from 0 to 7.
.sp 1
The mode value is interpreted in a way similar to that
of the
.BR chmod (1)
octal mode:
.sp 1
.in +5n
.nf .nf
0 do not open any file, do not execute progs 0 do not open any file, do not execute progs
1 do not open any file 1 do not open any file
@@ -51,140 +191,166 @@ to that of the \fRchmod(1)\fP octal mode:
6 do not execute any program 6 do not execute any program
7 allow everything (default mode) 7 allow everything (default mode)
.fi .fi
.in -0.5i .in -5n
.sp .sp 1
If one wished to run calc from a privledged user, one might If one wished to run
want to use \fI\-m 0\fP in an effort to make calc more secure. .B calc
.sp from a privileged user, one might want to use
\fIMode\fP bits for reading and writing apply only on an open. .B \-m
0 in an effort to make
.B calc
somewhat more secure.
.sp 1
Mode bits for reading and writing apply only on an
open.
Files already open are not effected. Files already open are not effected.
Thus if one wanted to use the \fI\-m 0\fP in an effort to make Thus if one wanted to use the
\fIcalc\fP more secure, but still wanted to read and write a specific .B \-m
file, one might want to do: 0 in an effort to make
.sp .B calc
.in +0.5i somewhat more secure, but still wanted to read and write a specific
file, one might want to do in
.BR sh (1),
.BR ksh (1),
.BR bash (1)-like
shells:
.sp 1
.in +5n
.nf .nf
\fRcalc \-m 0 3<a.file\fP calc -m 0 3<a.file
.fi .fi
.in -0.5i .in -5n
.sp .sp 1
Files presented to \fIcalc\fP in this way are opened in an unknown mode. Files presented to
\fICalc\fP will attempt to read or write them if directed. .B calc
.sp in this way are opened in an
If the \fImode\fP disables opening of files for reading, then unknown mode.
the startup library scripts are disabled as of \fI\-q\fP was given. .B Calc
The reading of key bindings is also disabled when the \fImode\fP will attempt to read or write them if directed.
disables opening of files for reading. .sp 1
If the mode disables opening of files for reading, then
the startup library scripts are disabled as of
.B \-q
was given.
The reading of key bindings is also disabled
when the mode disables opening of files for reading.
.TP .TP
\fI \-p\fP .B \-n
Pipe processing is enabled by use of \-p. For example: Use the new configuration defaults instead of the old
.sp default classic defaults.
.in +0.5i This flag as the same effect
as executing \fBconfig("all", "newcfg")\fP at startup time.
.TP
.B \-p
Pipe processing is enabled by use of
.BR \-p .
For example:
.sp 1
.in +5n
.nf .nf
\fRecho "print 2^21701\-1, 2^23209\-1" | calc \-p | fizzbin\fP calc -p '2^21701-1' | fizzbin
.fi .fi
.in -0.5i .in -5n
.sp .sp 1
In pipe mode, \fIcalc\fP does not prompt, does not print leading tabs In pipe mode,
and does not print the initial header. .B calc
does not prompt, does not print leading
tabs and does not print the initial header.
The
.B \-p
flag overrides
.BR \-i .
.TP .TP
\fI \-q\fP .B \-q
Disable the use of the \fI$CALCRC\fP startup scripts. Disable the use of the $CALCRC startup scripts.
.TP .TP
\fI \-u\fP .B \-u
Disable buffering of stdin and stdout. Disable buffering of stdin and stdout.
.TP .TP
\fI \-v\fP .B \-v
Print the version and exit. Print the
.B calc
version number and exit.
.PP .PP
Without \fIcalc_cmd\fPs, \fIcalc\fP operates interactively. Without
If one or more \fIcalc_cmd\fPs are given on the command line, .IR calc_cmd ,
\fIcalc\fP will execute them and exit. .B calc
The printing of leading tabs on output is disabled operates interactively.
as if \fIconfig("tab",0)\fP had been executed. If one or more
.I calc_cmd
are given on the command line,
.B calc
will execute them and exit.
If
.B \-i
is given,
.B calc
will attempt to become interactive
even of one or more
.I calc_cmd
are given on the command line.
.PP .PP
Normally on startup, \fIcalc\fP attempts to execute a collection Normally on startup,
of library scripts. .B calc
The environment variable \fI$CALCRC\fP (if non-existent then attempts to execute a collection of
a compiled in value) contains a \fI:\fP separated list of library scripts.
startup library scripts. The environment variable $CALCRC (if non-existent
No error conditions are produced if these startup library scripts then a compiled in value) contains a : separated list of startup
are not found. library scripts.
No error conditions are produced if these startup
library scripts are not found.
.PP .PP
If the \fImode\fP disables opening of files for reading, then If the mode disables opening of files for reading, then the startup
the startup library scripts are disabled as of \fI\-q\fP was given library scripts are disabled as of
and \fI$CALCRC\fP as well as the default compiled in value are ignored. .B \-q
was given and $CALCRC as well
as the default compiled in value are ignored.
.PP .PP
Filenames are subject to ``~'' expansion (see below). Filenames are subject to ``~'' expansion (see below).
The environment variable \fI$CALCPATH\fP (if non-existent then The
a compiled in value) contains a \fI:\fP separated list of search environment variable $CALCPATH (if non-existent then a compiled in
directories. value) contains a : separated list of search directories.
If a file does not begin with \fI/\fP, \fI~\fP or \fI./\fP, If a
then it is searched for under each directory listed in the \fI$CALCPATH\fP. file does not begin with /, ~ or ./, then it is searched for under
It is an error if no such readable file is found. each directory listed in the $CALCPATH.
It is an error if no such
readable file is found.
.PP .PP
Calc treats all open files, other than stdin, stdout and stderr .B Calc
as files available for reading and writing. treats all open files, other than stdin, stdout and
One may present calc with an already open file in the following way: stderr as files available for reading and writing.
.sp One may
.in +0.5i present
.B calc
with an already open file using
.BR sh (1),
.BR ksh (1),
.BR bash (1)-like
shells is to:
.sp 1
.in +5n
calc 3<open_file 4<open_file2
.in -5n
.sp 1
For more information use the following
.B calc
commands:
.sp 1
.in +5n
.nf .nf
\fRcalc 3<open_file 4<open_file2\fP
.fi
.in -0.5i
.PP
For more information use the following calc commands:
.PP
.in 1.0i
help usage
.br
help help help help
.br help overview
help usage
help environment help environment
.in -1.0i help config
.PP .fi
OVERVIEW .in -5n
.PP .sp 1
\fICalc\fP is arbitrary precision arithmetic system that uses
a C-like language.
\fICalc\fP is useful as a calculator, an algorithm prototyped
and as a mathematical research tool.
More importantly, \fIcalc\fP provides one with a machine
independent means of computation.
.PP
\fICalc\fP comes with a rich set of builtin mathematical
and programmatic functions.
.PP
\fICalc\fP is distributed with library of scripts.
Written in the same C-like language, library scripts may be
read in and executed during a \fIcalc\fP session.
These library scripts are also provided because they are
useful and to serve as examples of the \fIcalc\fP language.
One may further extend \fIcalc\fP thru the
use of user defined scripts.
.PP
Internally calc represents numeric values as fractions reduced to their
lowest terms.
The numerators and denominators of these factions may grow to
arbitrarily large values.
Numeric values read in are automatically converted into rationals.
The user need not be aware of this internal representation.
.PP
For more information use the following calc commands:
.PP
.in 1.0i
help intro
.br
help builtin
.br
help stdlib
.br
help define
.br
show builtins
.br
show functions
.in -1.0i
.PP .PP
DATA TYPES DATA TYPES
.PP .PP
@@ -199,7 +365,9 @@ multiplication, division, negation, squaring, modulus,
rounding, exponentiation, equality, comparison, printing rounding, exponentiation, equality, comparison, printing
and so on. and so on.
.PP .PP
For more information use the following calc commands: For more information use the following
.B calc
commands:
.PP .PP
.in 1.0i .in 1.0i
help types help types
@@ -220,7 +388,9 @@ procedure.
Values may be grouped together in a matrix, or into a Values may be grouped together in a matrix, or into a
a list that permits stack and queue style operations. a list that permits stack and queue style operations.
.PP .PP
For more information use the following calc commands: For more information use the following
.B calc
commands:
.PP .PP
.in 1.0i .in 1.0i
help variable help variable
@@ -256,7 +426,9 @@ For example:
~chongo/lib/fft_multiply.cal ~chongo/lib/fft_multiply.cal
.in -1.0i .in -1.0i
.PP .PP
For more information use the following calc command: For more information use the following
.B calc
command:
.PP .PP
.in 1.0i .in 1.0i
help file help file
@@ -275,7 +447,9 @@ These include commands such as function definition, help,
reading in library scripts, dump files to a file, error notification, reading in library scripts, dump files to a file, error notification,
configuration control and status. configuration control and status.
.PP .PP
For more information use the following calc command: For more information use the following
.B calc
command:
.PP .PP
.in 1.0i .in 1.0i
help command help command
@@ -295,7 +469,8 @@ help config
.PD 0 .PD 0
.TP 20 .TP 20
${LIBDIR}/*.cal ${LIBDIR}/*.cal
library scripts shipped with calc library scripts shipped with
.B calc
.br .br
.sp .sp
.TP 20 .TP 20
@@ -323,7 +498,9 @@ Default value: ${CALCPATH}
.TP 5 .TP 5
CALCRC CALCRC
On startup (unless \-h or \-q was given on the command On startup (unless \-h or \-q was given on the command
line), calc searches for files along this :-separated line),
.B calc
searches for files along this :-separated
environment variable. environment variable.
.br .br
.sp .sp
@@ -333,7 +510,9 @@ Default value: ${CALCRC}
.TP 5 .TP 5
CALCBINDINGS CALCBINDINGS
On startup (unless \fI\-h\fP or \fI\-q\fP was given on the command On startup (unless \fI\-h\fP or \fI\-q\fP was given on the command
line, or \fI\-m\fP disallows opening files for reading), calc reads line, or \fI\-m\fP disallows opening files for reading),
.B calc
reads
key bindings from the filename specified key bindings from the filename specified
by this environment variable. by this environment variable.
.br .br
@@ -343,9 +522,12 @@ Default value: ${CALCBINDINGS}
.SH CREDIT .SH CREDIT
\& \&
.br .br
The majority of calc was written by David I. Bell. The majority of
.B calc
was written by David I. Bell.
.sp .sp
Calc archives and calc-tester mailing list maintained by Landon Curt Noll. .B Calc
archives and calc-tester mailing list maintained by Landon Curt Noll.
.sp .sp
Thanks for suggestions and encouragement from Peter Miller, Thanks for suggestions and encouragement from Peter Miller,
Neil Justusson, and Landon Noll. Neil Justusson, and Landon Noll.
@@ -378,30 +560,27 @@ Copyright (c) 19xx Ernest Bowen and Landon Curt Noll
Permission is granted to use, distribute, or modify this source, Permission is granted to use, distribute, or modify this source,
provided that this copyright notice remains intact. provided that this copyright notice remains intact.
.sp .sp
Send calc comments, suggestions, bug fixes, enhancements Send comments, suggestions, bug fixes, enhancements
and interesting calc scripts that you would like you see included and interesting
.B calc
scripts that you would like you see included
in future distributions to: in future distributions to:
.sp .sp
.in +0.5i .in +0.5i
dbell@auug.org.au calc-tester-request@postofc.corp.sgi.com
.br
chongo@toad.com
.in -0.5i .in -0.5i
.sp .sp
Landon Noll maintains the official calc ftp archive at: Landon Noll maintains the the
.B calc
web site is located at:
.sp .sp
.in +0.5i .in +0.5i
ftp://ftp.uu.net/pub/calc http://reality.sgi.com/chongo/calc
.in -0.5i .in -0.5i
.sp .sp
Alpha test versions, complete with bugs, untested code and One may join the
experimental features may be fetched (if you are brave) under: .B calc
.sp testing group by sending a request to:
.in +0.5i
http://reality.sgi.com/chongo/calc/
.in -0.5i
.sp
One may join the calc testing group by sending a request to:
.sp .sp
.in +0.5i .in +0.5i
calc-tester-request@postofc.corp.sgi.com calc-tester-request@postofc.corp.sgi.com
@@ -410,14 +589,14 @@ calc-tester-request@postofc.corp.sgi.com
Your message body (not the subject) should consist of: Your message body (not the subject) should consist of:
.sp .sp
.in +0.5i .in +0.5i
.nf
subscribe calc-tester address subscribe calc-tester address
.br
end end
.br
name your_full_name name your_full_name
.fi
.in -0.5i
.sp .sp
where "address" is your EMail address and "your_full_name" where "address" is your EMail address and "your_full_name"
is your full name. is your full name.
.in -0.5i
.sp .sp
Enjoy! Share and Enjoy! :\-)

View File

@@ -2,7 +2,22 @@ Calc command line
Calc has the following command line: Calc has the following command line:
calc [-C] [-e] [-h] [-i] [-m mode] [-n] [-p] [-q] [-u] [calc_cmd ...] calc [-c] [-C] [-d] [-e] [-h] [-i] [-m mode]
[-n] [-p] [-q] [-u] [-v] [calc_cmd ...]
-c Continue reading command lines even after an execution
error has caused the abandonment of a line.
For example:
calc read many_errors.cal
will cause calc to abort on the first error, whereas:
calc -c read many_errors.cal
will cause calc to try to process each line being read
despite the errors that it encounters.
-C Permit the execution of custom builtin functions. Without -C Permit the execution of custom builtin functions. Without
this flag, calling the custom() builtin function will this flag, calling the custom() builtin function will
@@ -12,6 +27,27 @@ Calc command line
are non-standard and that are not portable. Custom builtin are non-standard and that are not portable. Custom builtin
functions are disabled by default for this reason. functions are disabled by default for this reason.
-d Disable the printing of the opening title. The printing
of library debug and informational messages is also disabled
as if config("lib_debug",0) had been executed.
For example:
calc 'read qtime; qtime(2)'
will output something like:
qtime(utc_hr_offset) defined
It's nearly ten past six.
whereas:
calc -d 'read qtime; qtime(2)'
will just say:
It's nearly ten past six.
-e Ignore any environment variables on startup. The -e Ignore any environment variables on startup. The
getenv() builtin will still return values, however. getenv() builtin will still return values, however.
@@ -19,7 +55,21 @@ Calc command line
is equivalent to the calc command help help. The help is equivalent to the calc command help help. The help
facility is disabled unless the mode is 5 or 7. See -m. facility is disabled unless the mode is 5 or 7. See -m.
-i Do not about if the error count exceeds maxerr(). -i Become interactive if possible. Be default, if calc_cmd
args are given, calc will execute them and exit. This flag
will cause calc to drop into interactive mode after the
commands are executed.
For example:
calc 2+5
will print the value 7 and exit whereas:
calc -i 2+5
will print the value 7 and prompt the user for more
calc commands.
-m mode -m mode
This flag sets the permission mode of calc. It This flag sets the permission mode of calc. It
@@ -38,7 +88,7 @@ Calc command line
6 do not execute any program 6 do not execute any program
7 allow everything (default mode) 7 allow everything (default mode)
If one wished to run calc from a privledged user, one If one wished to run calc from a privileged user, one
might want to use -m 0 in an effort to make calc more might want to use -m 0 in an effort to make calc more
secure. secure.
@@ -46,7 +96,7 @@ Calc command line
open. Files already open are not effected. Thus if one open. Files already open are not effected. Thus if one
wanted to use the -m 0 in an effort to make calc more wanted to use the -m 0 in an effort to make calc more
secure, but still wanted to read and write a specific secure, but still wanted to read and write a specific
file, one might want to do: file, one might want to do in sh, ksh, bash-like shells:
calc -m 0 3<a.file calc -m 0 3<a.file
@@ -59,25 +109,28 @@ Calc command line
given. The reading of key bindings is also disabled given. The reading of key bindings is also disabled
when the mode disables opening of files for reading. when the mode disables opening of files for reading.
-n Use the new configutation defaults instead of the old -n Use the new configuration defaults instead of the old
default classic defaults. This flag as the same effect default classic defaults. This flag as the same effect
as executing config("all", "newcfg") at startup time. as executing config("all", "newcfg") at startup time.
-p Pipe processing is enabled by use of -p. For example: -p Pipe processing is enabled by use of -p. For example:
echo "print 2^21701-1, 2^23209-1" | calc -p | fizzbin calc -p '2^21701-1' | fizzbin
In pipe mode, calc does not prompt, does not print In pipe mode, calc does not prompt, does not print leading
leading tabs and does not print the initial header. tabs and does not print the initial header. The -p flag
overrides -i.
-q Disable the use of the $CALCRC startup scripts. -q Disable the use of the $CALCRC startup scripts.
-u Disable buffering of stdin and stdout. -u Disable buffering of stdin and stdout.
-v Print calc version number and exit.
Without `calc_cmd', calc operates interactively. If one or more Without `calc_cmd', calc operates interactively. If one or more
`calc_cmd' are given on the command line, calc will execute them and `calc_cmd' are given on the command line, calc will execute them and
exit. The printing of leading tabs on output is disabled as if exit. If -i is given, calc will attempt to become interactive
config("tab",0) had been executed. even of one or more `calc_cmd' are given on the command line.
Normally on startup, calc attempts to execute a collection of Normally on startup, calc attempts to execute a collection of
library scripts. The environment variable $CALCRC (if non-existent library scripts. The environment variable $CALCRC (if non-existent
@@ -98,7 +151,8 @@ Calc command line
Calc treats all open files, other than stdin, stdout and Calc treats all open files, other than stdin, stdout and
stderr as files available for reading and writing. One may stderr as files available for reading and writing. One may
present calc with an already open file in the following way: present calc with an already open file using sh, ksh or bash-like
shells is to:
calc 3<open_file 4<open_file2 calc 3<open_file 4<open_file2

View File

@@ -311,7 +311,7 @@ f_open(char *name, char *mode)
*/ */
if (!allow_read && !allow_write) { if (!allow_read && !allow_write) {
/* no reads and no writes means no opens! */ /* no reads and no writes means no opens! */
if (start_done) { if (run_state > RUN_PRE_BEGIN) {
fprintf(stderr, fprintf(stderr,
"open of %s mode %s - %s\n", name, mode, "open of %s mode %s - %s\n", name, mode,
"open for read or write disallowed by -m\n"); "open for read or write disallowed by -m\n");
@@ -319,7 +319,7 @@ f_open(char *name, char *mode)
return NULL; return NULL;
} else if (!allow_read && strchr(mode, 'r') != NULL) { } else if (!allow_read && strchr(mode, 'r') != NULL) {
/* reading new files disallowed */ /* reading new files disallowed */
if (start_done) { if (run_state > RUN_PRE_BEGIN) {
fprintf(stderr, fprintf(stderr,
"open of %s mode %s - %s\n", name, mode, "open of %s mode %s - %s\n", name, mode,
"open for read disallowed by -m\n"); "open for read disallowed by -m\n");
@@ -330,7 +330,7 @@ f_open(char *name, char *mode)
strchr(mode, 'a') != NULL || strchr(mode, 'a') != NULL ||
strchr(mode, '+') != NULL)) { strchr(mode, '+') != NULL)) {
/* writing new files disallowed */ /* writing new files disallowed */
if (start_done) { if (run_state > RUN_PRE_BEGIN) {
fprintf(stderr, fprintf(stderr,
"open of %s mode %s - %s\n", name, mode, "open of %s mode %s - %s\n", name, mode,
"open for write disallowed by -m\n"); "open for write disallowed by -m\n");

View File

@@ -63,7 +63,7 @@ int new_std = FALSE; /* TRUE (-n) => use newstd configuration */
int abortlevel; /* current level of aborts */ int abortlevel; /* current level of aborts */
BOOL inputwait; /* TRUE if in a terminal input wait */ BOOL inputwait; /* TRUE if in a terminal input wait */
jmp_buf jmpbuf; /* for errors */ jmp_buf jmpbuf; /* for errors */
int start_done = FALSE; /* TRUE => start up processing finished */ run run_state = RUN_UNKNOWN; /* calc startup and run state */
char *program = "calc"; /* our name */ char *program = "calc"; /* our name */
char cmdbuf[MAXCMD+1+1+1]; /* command line expression + "\n\0" + guard */ char cmdbuf[MAXCMD+1+1+1]; /* command line expression + "\n\0" + guard */
@@ -83,8 +83,8 @@ int p_flag = FALSE; /* TRUE => pipe mode */
int q_flag = FALSE; /* TRUE => don't execute rc files */ int q_flag = FALSE; /* TRUE => don't execute rc files */
int u_flag = FALSE; /* TRUE => unbuffer stdin and stdout */ int u_flag = FALSE; /* TRUE => unbuffer stdin and stdout */
int d_flag = FALSE; /* TRUE => disable heading, lib_debug == 0 */ int d_flag = FALSE; /* TRUE => disable heading, lib_debug == 0 */
int c_flag = FALSE; /* TRUE => continue on error if permitted */
int stoponerror = FALSE; /* >0 => stop, <0 => continue on error */ int i_flag = FALSE; /* TRUE => go interactive if permitted */
/* /*
* global values * global values
@@ -96,8 +96,9 @@ char *home; /* $HOME or default */
char *pager; /* $PAGER or default */ char *pager; /* $PAGER or default */
char *shell; /* $SHELL or default */ char *shell; /* $SHELL or default */
int stdin_tty = FALSE; /* TRUE if stdin is a tty */ int stdin_tty = FALSE; /* TRUE if stdin is a tty */
int interactive = FALSE; /* TRUE if interactive session (no cmd args) */ int havecommands = FALSE; /* TRUE if have one or more cmd args */
int post_init = FALSE; /* TRUE setjmp for math_error is readready */ int stoponerror = FALSE; /* >0 => stop, <0 => continue on error */
int post_init = FALSE; /* TRUE setjmp for math_error is ready */
int no_env = FALSE; /* TRUE (-e) => ignore env vars on startup */ int no_env = FALSE; /* TRUE (-e) => ignore env vars on startup */
int errmax = ERRMAX; /* if >= 0, maximum value for errcount */ int errmax = ERRMAX; /* if >= 0, maximum value for errcount */
@@ -164,6 +165,13 @@ libcalc_call_me_first(void)
conf->lib_debug = 0; conf->lib_debug = 0;
} }
/*
* -p turns off tab
*/
if (p_flag) {
conf->tab_ok = 0;
}
/* /*
* initialize * initialize
*/ */
@@ -172,6 +180,7 @@ libcalc_call_me_first(void)
/* /*
* ready to rock & roll .. * ready to rock & roll ..
*/ */
run_state = RUN_PRE_BEGIN;
init_done = 1; init_done = 1;
return; return;
} }

View File

@@ -643,6 +643,10 @@ scanerror(int skip, char *fmt, ...)
va_end(ap); va_end(ap);
fprintf(stderr, "%s\n", buf); fprintf(stderr, "%s\n", buf);
/* bail out if continuation not permitted */
if ((!c_flag && !stoponerror) || stoponerror > 0)
longjmp(jmpbuf, 1);
/* bail out if too many errors */ /* bail out if too many errors */
if (conf->maxscancount > 0 && errorcount > conf->maxscancount) { if (conf->maxscancount > 0 && errorcount > conf->maxscancount) {
fputs("Too many scan errors, compilation aborted.\n", stderr); fputs("Too many scan errors, compilation aborted.\n", stderr);

View File

@@ -12,7 +12,7 @@
#define MAJOR_VER 2 /* major version */ #define MAJOR_VER 2 /* major version */
#define MINOR_VER 11 /* minor version */ #define MINOR_VER 11 /* minor version */
#define MAJOR_PATCH 0 /* patch level or 0 if no patch */ #define MAJOR_PATCH 0 /* patch level or 0 if no patch */
#define MINOR_PATCH "7.1" /* test number or empty string if no patch */ #define MINOR_PATCH "7.2" /* test number or empty string if no patch */
/* /*
* calc version constants * calc version constants