NAME
    error - raise a calc error condition

SYNOPSIS
    error([errnum | "E_STRING"])

TYPES
    errnum	integer, defaults to errno()
    E_STRING	string

    return	null value or error value

DESCRIPTION
    If errnum == 0:

	error(errnum) returns the null value.

	The "global calc_errno value" is set to 0.

	The global calc error count is not changed.

    With error(errnum) numeric argument:

	For 0 < errnum <= 32767:

	    error(errnum) returns a value that is of a special type called
	    "error".  The "error" return value, when given to iserror()
	    will cause that function to return a true value that happens
	    to match the "global calc_errno value".

	    The "global calc_errno value" is then set to errnum.

	For all other errnum values:

	    An error error condition is raised about the valid errnum.

	The global calc error count (see help errcount) is incremented.
	If the global calc error count exceeds the maximum count
	(see help errmax), any ongoing calc execution is aborted.

    With error("E_STRING") string argument:

	If E_STRING is a valid errsym code, then the E_STRING errsym
	is converted into an equivalent errnum and respective calc
	error condition is raised.

	If E_STRING is not a valid errsym code, an error error condition
	is raised about the invalid E_STRING.

	For example, these two calls are equivalent:

	    error(10003);	/* error 10003 has a E_STRING of "E_ADD" */
	    error("E_ADD");	/* error 10003 has a E_STRING of "E_ADD" */

	See help errsym for information on E_STRING errsym codes.

	For a list of the E_STRING associated with calc computation error
	codes, see help errorcodes.

    For no errnum arg:

	Calling error() without an argument will return the current
	"global calc_errno value" AND will also increment the
	global calc error count.

    All other values of errnum are reserved for future use and currently
    will generate an error.

    Use errno() instead of error() to return the "global calc_errno
    value" without incrementing the global calc error count.

    The term "global calc_errno value" is an internal calc state.
    This is NOT a calc variable called calc_errno.  The value of the
    "global calc_errno value" may be returned by errno() (see help errno).

    The "global calc_errno value" be set to some other non-zero
    value by other builtin functions and calculations, especially
    if they result in an error.  Thus, while calling errno(errnum) may
    set calc_errno, some other error may later overwrite the
    "global calc_errno value".

    By convention, the "global calc_errno value" has the following ranges:

	errnum < 0			Reserved for future use
	errnum == 0			calc_errno cleared: libc errno codes above here
	1 <= errnum <= 9999		system error and libc errno codes
	errnum == 10000			Reserved for "No error" calc internal state
	10001 <= errnum <= E__HIGHEST	calc computation error codes
	E__HIGHEST < errnum < 20000	Reserved for future calc error codes
	20000 < errnum <= 32767		User defined error codes start here
	errnum >= 32768			Reserved for future use

    The following constants are part of the calc error code mechanism:

	E__BASE == 10000		1 less than the 1st calc computation error code
	E__HIGHEST			highest assigned calc computation error code
	E__USERDEF == 20000		user defined error codes start here
	E__USERMAX == 32767		maximum user defined error code

	ECOUNT				number of calc computation error codes (not including E__BASE)

    See help errorcodes for the actual values of the above constants.

EXAMPLE
    ; errcount(0),; errmax(20),;
    ; print errcount(), errmax()
    0 20

    ; a = error(10009)

    ; print errcount(), errmax()
    1 20
    ; print a
    Error E_INV
    ; print iserror(a)
    10009
    ; print strerror(a)
    "Bad argument for inverse"
    ; print errno()
    10009

    ; b = error(0)

    ; print errcount(), errmax()
    1 20
    ; print isnull(b)
    1
    ; print errno()
    0

LIMITS
    0 <= errnum <= 32767

    E_STRING is string that must match the regular expression: ^E_[A-Z0-9_]+$

LINK LIBRARY
    int calc_errno;				/* global calc_errno value */

    CONST struct errtbl error_table[ECOUNT+2];	/* calc error codes, error symbols and error messages */

    bool is_e_digits(CONST char *errsym);
    bool is_valid_errnum(int errnum);
    bool is_errnum_in_error_table(int errnum);
    bool is_e_1string(CONST char *errsym);
    bool is_e_2string(CONST char *errsym);
    struct errtbl *find_errsym_in_errtbl(CONST char *errsym, CONST struct errtbl *tbl);
    struct errtbl *find_errnum_in_errtbl(int errnum, CONST struct errtbl *tbl);
    CONST struct errtbl *lookup_errnum_in_error_table(int errnum);
    int errsym_2_errnum(CONST char *errsym);
    char *errnum_2_errsym(int errnum, bool *palloced);
    char *errnum_2_errmsg(int errnum, bool *palloced);
    char *errsym_2_errmsg(CONST char *errsym, bool *palloced);

SEE ALSO
    errcount, errmax, errorcodes, iserror, errno, strerror, newerror,
    stoponerror

## Copyright (C) 1999-2006,2023  Landon Curt Noll
##
## 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:	1995/12/18 03:30:59
## File existed as early as:	1995
##
## chongo <was here> /\oo/\	http://www.isthe.com/chongo/
## Share and enjoy!  :-)	http://www.isthe.com/chongo/tech/comp/calc/
