diff --git a/CHANGES b/CHANGES index 454a47f..8bf16c2 100644 --- a/CHANGES +++ b/CHANGES @@ -419,6 +419,21 @@ The following are the changes from calc version 2.14.3.4 to 2.14.3.5: config("triground") + When printing an error, calc used to print the errnum (error number): + + ; 1/0 + Error 10001 + + Calc now prints the errsym (errsym): + + ; 1/0 + Error E_DIVBYZERO + + Added errsym E_LN_3 for ln(0). + Added errsym E_LOG_5 for log(0). + Added errsym E_LOG2_4 for log2(0). + Added errsym E_LOGN_6 for logn(0,base). + The following are the changes from calc version 2.14.3.0 to 2.14.3.4: diff --git a/errtbl.c b/errtbl.c index 3ba9a76..fb2be9e 100644 --- a/errtbl.c +++ b/errtbl.c @@ -755,6 +755,10 @@ CONST struct errtbl error_table[] = { 10603, "E_CIS_1", "Non-real epsilon for cis" }, { 10604, "E_CIS_2", "Bad first argument for cis" }, { 10605, "E_CIS_3", "Too-large re(argument) for cis" }, + { 10606, "E_LN_3", "Cannot calculate ln of 0" }, + { 10607, "E_LOG_5", "Cannot calculate log of 0" }, + { 10608, "E_LOG2_4", "Cannot calculate log base 2 of 0" }, + { 10609, "E_LOGN_6", "Cannot calculate log base n of 0" }, /* IMPORTANT NOTE: add new entries above here and be sure their errnum numeric value is consecutive! */ /* The next NULL entry must be last */ diff --git a/func.c b/func.c index 0aae2a8..00059b5 100644 --- a/func.c +++ b/func.c @@ -2232,8 +2232,10 @@ f_ln(int count, VALUE **vals) */ switch (vals[0]->v_type) { case V_NUM: - if (!qisneg(vals[0]->v_num) && - !qiszero(vals[0]->v_num)) { + if (qiszero(vals[0]->v_num)) { + return error_value(E_LN_3); + } + if (!qisneg(vals[0]->v_num)) { result.v_num = qln(vals[0]->v_num, err); result.v_type = V_NUM; return result; @@ -2244,6 +2246,9 @@ f_ln(int count, VALUE **vals) c = c_ln(&ctmp, err); break; case V_COM: + if (ciszero(vals[0]->v_com)) { + return error_value(E_LN_3); + } c = c_ln(vals[0]->v_com, err); break; default: @@ -2289,8 +2294,10 @@ f_log(int count, VALUE **vals) */ switch (vals[0]->v_type) { case V_NUM: - if (!qisneg(vals[0]->v_num) && - !qiszero(vals[0]->v_num)) { + if (qiszero(vals[0]->v_num)) { + return error_value(E_LOG_5); + } + if (!qisneg(vals[0]->v_num)) { result.v_num = qlog(vals[0]->v_num, err); result.v_type = V_NUM; return result; @@ -2301,6 +2308,9 @@ f_log(int count, VALUE **vals) c = c_log(&ctmp, err); break; case V_COM: + if (ciszero(vals[0]->v_com)) { + return error_value(E_LOG_5); + } c = c_log(vals[0]->v_com, err); break; default: @@ -2349,6 +2359,9 @@ f_log2(int count, VALUE **vals) */ switch (vals[0]->v_type) { case V_NUM: + if (qiszero(vals[0]->v_num)) { + return error_value(E_LOG2_4); + } if (!qisneg(vals[0]->v_num) && !qiszero(vals[0]->v_num)) { result.v_num = qlog2(vals[0]->v_num, err); @@ -2361,6 +2374,9 @@ f_log2(int count, VALUE **vals) c = c_log2(&ctmp, err); break; case V_COM: + if (ciszero(vals[0]->v_com)) { + return error_value(E_LOG2_4); + } c = c_log2(vals[0]->v_com, err); break; default: @@ -2447,7 +2463,7 @@ f_logn(int count, VALUE **vals) switch (vals[0]->v_type) { case V_NUM: if (qiszero(vals[0]->v_num)) { - return error_value(E_LOGN_3); + return error_value(E_LOGN_6); } if (qisneg(vals[0]->v_num)) { ctmp.real = vals[0]->v_num; @@ -2471,7 +2487,7 @@ f_logn(int count, VALUE **vals) break; case V_COM: if (ciszero(vals[0]->v_com)) { - return error_value(E_LOGN_3); + return error_value(E_LOGN_6); } ln_x_c = c_ln(vals[0]->v_com, err); if (ln_x_c == NULL) { @@ -12027,6 +12043,11 @@ f_aexsec(int count, VALUE **vals) arg1 = *vals[0]; if (arg1.v_type == V_NUM) { + /* firewall */ + if (qisnegone(arg1.v_num)) { + return error_value(E_AEXSEC_3); + } + /* try to compute result using real trig function */ result.v_num = qaexsec_or_NULL(arg1.v_num, eps); @@ -12169,6 +12190,11 @@ f_aexcsc(int count, VALUE **vals) arg1 = *vals[0]; if (arg1.v_type == V_NUM) { + /* firewall */ + if (qisnegone(arg1.v_num)) { + return error_value(E_AEXCSC_3); + } + /* try to compute result using real trig function */ result.v_num = qaexcsc_or_NULL(arg1.v_num, eps); diff --git a/help/acsc b/help/acsc index d1fe6e8..d6f4e12 100644 --- a/help/acsc +++ b/help/acsc @@ -18,7 +18,7 @@ DESCRIPTION EXAMPLE ; print acsc(0), acsc(0.5), acsc(1) - Error 10454 1.57079632679489661923-1.31695789692481670863i 1.57079632679489661923 + Error E_ACSC_3 1.57079632679489661923-1.31695789692481670863i 1.57079632679489661923 ; print acsc(-0.5), acsc(-1) -1.57079632679489661923+1.31695789692481670863i -1.57079632679489661923 diff --git a/help/aexcsc b/help/aexcsc index 8cb8918..adb14fe 100644 --- a/help/aexcsc +++ b/help/aexcsc @@ -23,7 +23,7 @@ EXAMPLE 1.57079632679489661923 0.72972765622696636345 0.52359877559829887308 ; print aexcsc(-0.5), aexcsc(-1) - 1.57079632679489661923-1.31695789692481670863i Error 10454 + 1.57079632679489661923-1.31695789692481670863i Error E_AEXCSC_3 ; print aexcsc(.5, 1e-5), aexcsc(.5, 1e-10), aexcsc(.5, 1e-15) 0.72973 0.7297276562 0.729727656226966 diff --git a/help/aexsec b/help/aexsec index de3679c..521c980 100644 --- a/help/aexsec +++ b/help/aexsec @@ -23,7 +23,7 @@ EXAMPLE 0 0.84106867056793025578 1.04719755119659774615 ; print aexsec(-0.5), aexsec(-1) - 1.31695789692481670863i Error 10453 + 1.31695789692481670863i Error E_AEXSEC_3 ; print aexsec(.5, 1e-5), aexsec(.5, 1e-10), aexsec(.5, 1e-15), aexsec(.5, 1e-20) 0.84107 0.8410686706 0.84106867056793 0.84106867056793025578 diff --git a/help/asec b/help/asec index a6d202a..6676817 100644 --- a/help/asec +++ b/help/asec @@ -18,7 +18,7 @@ DESCRIPTION EXAMPLE ; print asec(0), asec(0.5), asec(1) - Error 10453 1.31695789692481670863i 0 + Error E_ASEC_3 1.31695789692481670863i 0 ; print asec(-0.5), asec(-1) 3.14159265358979323846-1.31695789692481670863i 3.14159265358979323846 diff --git a/help/blocks b/help/blocks index d3621e9..3d3710c 100644 --- a/help/blocks +++ b/help/blocks @@ -28,7 +28,7 @@ EXAMPLE chunksize = 256, maxsize = 256, datalen = 3 010203 ; blocks(2) - Error 10211 + Error E_BLOCKS_2 ; strerror() "Non-allocated index number for blocks" @@ -41,7 +41,7 @@ LINK LIBRARY SEE ALSO blk, blkfree -## Copyright (C) 1999,2021 Landon Curt Noll +## Copyright (C) 1999,2021,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 diff --git a/help/custom b/help/custom index 2002cc7..27fef12 100644 --- a/help/custom +++ b/help/custom @@ -73,13 +73,13 @@ EXAMPLE ; print custom("sysinfo", "baseb") Calc was built with custom functions disabled - Error 10195 + Error E_NO_C_ARG If calc compiled with ALLOW_CUSTOM= -DCUSTOM and is invoked without -C: ; print custom("sysinfo", "baseb") Calc must be run with a -C argument to use custom function - Error 10194 + Error E_NO_C_ARG If calc compiled with ALLOW_CUSTOM= -DCUSTOM and is invoked with -C: diff --git a/help/errcount b/help/errcount index b544d3c..56b4a50 100644 --- a/help/errcount +++ b/help/errcount @@ -36,7 +36,7 @@ EXAMPLE 0 ; a = 1/0; b = 2 + ""; c = error(27); d = newerror("a"); ; print errcount(), a, errcount(), errmax(); - 4 Error 10001 4 10 + 4 Error E_DIVBYZERO 4 10 LIMITS 0 <= num < 2^32 diff --git a/help/errmax b/help/errmax index 7c2ce07..d050ed2 100644 --- a/help/errmax +++ b/help/errmax @@ -20,7 +20,7 @@ DESCRIPTION EXAMPLE ; errmax(2) - 0 + 20 ; errcount() 0 ; a = 1/0; b = 2 + ""; c = error(27); d = newerror("alpha"); diff --git a/help/error b/help/error index 64c21fa..6999b59 100644 --- a/help/error +++ b/help/error @@ -111,7 +111,7 @@ EXAMPLE ; print errcount(), errmax() 1 20 ; print a - Error 10009 + Error E_INV ; print iserror(a) 10009 ; print strerror(a) diff --git a/help/fputstr b/help/fputstr index 1597859..ec5cccf 100644 --- a/help/fputstr +++ b/help/fputstr @@ -28,7 +28,7 @@ EXAMPLE ; fgetstr(f) ; fputstr(f, "Gamma") - Error 72 + Error E_FPUTSTR_3 LIMITS none @@ -39,7 +39,7 @@ LINK LIBRARY SEE ALSO fgetstr, fgetfield, fgets, fputs, fopen, files, fprintf -## Copyright (C) 1999-2006 Landon Curt Noll +## 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 diff --git a/help/freestatics b/help/freestatics index 8625d4d..84b5e31 100644 --- a/help/freestatics +++ b/help/freestatics @@ -31,7 +31,7 @@ EXAMPLE Number: 1 ; freestatics() ; f(1) - Error 10005 + Error E_MUL ; strerror(.) "Bad arguments for *" @@ -44,7 +44,7 @@ LINK LIBRARY SEE ALSO free, freeglobals, freeredc -## Copyright (C) 1999 Landon Curt Noll +## Copyright (C) 1999,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 diff --git a/help/freopen b/help/freopen index 78ed30f..8d56ed2 100644 --- a/help/freopen +++ b/help/freopen @@ -28,7 +28,7 @@ EXAMPLE "Leonard Euler" ; !chmod u-w /tmp/junk ; freopen(f, "w") - Error 10013 + Error E_FRAC LIMITS none @@ -40,7 +40,7 @@ SEE ALSO errno, fclose, feof, ferror, fflush, fgetc, fgetline, fgets, files, fopen, fprintf, fputc, fputs, fseek, fsize, ftell, isfile, printf, prompt -## Copyright (C) 1999-2006,2021 Landon Curt Noll +## Copyright (C) 1999-2006,2021,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 diff --git a/help/newerror b/help/newerror index 3c6b741..00b8f5e 100644 --- a/help/newerror +++ b/help/newerror @@ -40,7 +40,7 @@ EXAMPLE ; iserror(e1) 20000 ; error(20000) - Error 20000 + Error E_20000 ; strerror(error(20000)) "triangle side length <= 0" ; strerror(e1); diff --git a/help/protect b/help/protect index 3173745..054f8d8 100644 --- a/help/protect +++ b/help/protect @@ -228,7 +228,7 @@ EXAMPLE "No-type-change destination for assign" ; B = 45 ; swap(A,B) - Error 10372 + Error E_SWAP_2 ; strerror() "No-assign-to-or-from argument for swap" ; protect(A,-64) @@ -244,21 +244,21 @@ EXAMPLE ; B = list(5,6,7,8) ; protect(A,16) ; copy(B,A) - Error 10226 + Error E_COPY_14 ; strerror() "No-copy-to destination variable" ; A = list(1,2,3) ; protect(A,32) ; append(A,4) - Error 10402 + Error E_LIST_4 ; strerror() "No-relocate for list append" ; A = blk(0,5) ; copy("abc", A) ; copy("de",A) - Error 10229 + Error E_COPY_17 ; strerror() "No-relocate destination variable" @@ -266,7 +266,7 @@ EXAMPLE ; protect(A,0) ; protect(*A, 16) ; copy("abc", A) - Error 10228 + Error E_COPY_16 ; strerror() "No-copy-to destination named block" @@ -279,7 +279,7 @@ LINK LIBRARY SEE ALSO assign, copy, blk, error, errno, strerror -## Copyright (C) 1999-2006,2021 Landon Curt Noll +## Copyright (C) 1999-2006,2021,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 diff --git a/help/scan b/help/scan index a930fcd..58be95d 100644 --- a/help/scan +++ b/help/scan @@ -22,7 +22,7 @@ EXAMPLE ; scan(a, 0, c, d) ; 2+3 b=a^2 3+4i 3+"a" ; print a,b,c,d - 5 25 3+4i Error 3 + 5 25 3+4i Error E_ADD LIMITS The number of arguments is not to exceed 1024. @@ -33,7 +33,7 @@ LINK LIBRARY SEE ALSO fscan, strscan, fscanf, strscanf, scanf, printf, fprintf -## Copyright (C) 1999-2006 Landon Curt Noll +## 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 diff --git a/qtrans.c b/qtrans.c index a449691..e136e9b 100644 --- a/qtrans.c +++ b/qtrans.c @@ -1057,7 +1057,7 @@ qln(NUMBER *q, NUMBER *epsilon) bool neg; if (qiszero(q)) { - math_error("logarithm of 0"); + math_error("ln of 0"); not_reached(); } if (qiszero(epsilon)) { @@ -1173,7 +1173,7 @@ qlog(NUMBER *q, NUMBER *epsilon) /* firewall */ if (qiszero(q)) { - math_error("logarithm of 0"); + math_error("log of 0"); not_reached(); } if (qiszero(epsilon)) { @@ -1254,7 +1254,7 @@ qlog2(NUMBER *q, NUMBER *epsilon) /* firewall */ if (qiszero(q)) { - math_error("logarithm of 0"); + math_error("log2 of 0"); not_reached(); } if (qiszero(epsilon)) { @@ -1328,7 +1328,7 @@ qlogn(NUMBER *q, NUMBER *n, NUMBER *epsilon) /* firewall */ if (qiszero(q)) { - math_error("logarithm of 0"); + math_error("log base n of 0"); not_reached(); } if (qiszero(epsilon)) { diff --git a/symbol.c b/symbol.c index 0fce915..d02f541 100644 --- a/symbol.c +++ b/symbol.c @@ -241,10 +241,20 @@ printtype(VALUE *vp) { int type; char *s; + char *errsym; + bool alloced; type = vp->v_type; if (type < 0) { - printf("Error %d", -type); + errsym = errnum_2_errsym(-type, &alloced); + if (errsym == NULL) { + printf("Error %d", -type); + } else { + printf("Error %s", errsym); + if (alloced == true) { + free(errsym); + } + } return; } switch (type) { diff --git a/value.c b/value.c index aac645b..646f489 100644 --- a/value.c +++ b/value.c @@ -2794,15 +2794,31 @@ printvalue(VALUE *vp, int flags) { NUMBER *qtemp; int type; + char *errsym; + bool alloced; type = vp->v_type; if (type < 0) { - if (userfunc("error_print", vp)) + if (userfunc("error_print", vp)) { return; - if (-type >= E__BASE) - math_fmt("Error %d", -type); - else - math_fmt("System error %d", -type); + } + errsym = errnum_2_errsym(-type, &alloced); + if (errsym == NULL) { + if (-type >= E__BASE) { + math_fmt("Error %d", -type); + } else { + math_fmt("System error %d", -type); + } + } else { + if (-type >= E__BASE) { + math_fmt("Error %s", errsym); + } else { + math_fmt("System error %s", errsym); + } + if (alloced == true) { + free(errsym); + } + } return; } switch (type) { diff --git a/value.h b/value.h index c8b8021..69aa61a 100644 --- a/value.h +++ b/value.h @@ -84,8 +84,6 @@ typedef struct random RANDOM; * * NOTE: The v_type can be a negative value. This happens when * an error is returned as a VALUE. - * - * XXX - calc v3 wish: make v_type and v_subtype an int32_t - XXX */ struct value { short v_type; /* type of value - IMPORTANT: v_type < 0 is an error code */