diff options
author | gabor <gabor@FreeBSD.org> | 2010-02-21 14:28:03 +0000 |
---|---|---|
committer | gabor <gabor@FreeBSD.org> | 2010-02-21 14:28:03 +0000 |
commit | fa4f0af78a622f11cab7366751ecb1a4700eca23 (patch) | |
tree | b3eb6d7631ef53fad942d51b66b7a7918b1ceab4 /contrib | |
parent | 1fdea921e1450bf99dc432803cd6c88e08540a21 (diff) | |
download | FreeBSD-src-fa4f0af78a622f11cab7366751ecb1a4700eca23.zip FreeBSD-src-fa4f0af78a622f11cab7366751ecb1a4700eca23.tar.gz |
- Remove GNU bc/dc bits. There has not been any regressions seen after
BSD bc/dc import. It has been tested with make universe that this code
is not used by anything any more.
Approved by: delphij (mentor)
Diffstat (limited to 'contrib')
84 files changed, 0 insertions, 20770 deletions
diff --git a/contrib/bc/AUTHORS b/contrib/bc/AUTHORS deleted file mode 100644 index b665a63..0000000 --- a/contrib/bc/AUTHORS +++ /dev/null @@ -1,4 +0,0 @@ -Phil Nelson <philnelson@acm.org> wrote bc, including the number.c -source in the "lib" directory. - -Ken Pizzini wrote dc. diff --git a/contrib/bc/ChangeLog b/contrib/bc/ChangeLog deleted file mode 100644 index f277079..0000000 --- a/contrib/bc/ChangeLog +++ /dev/null @@ -1,1043 +0,0 @@ -Wed Sep 27 17:19:48 2000 Phil Nelson <phil@cs.wwu.edu> - - * doc/bc.texi: Added new file. Mainly translated from bc.1 - by Brian Youmans. - doc/bc.1: Minor changes made as part of reviewing bc.texi. - -Wed Sep 20 11:45:00 2000 Phil Nelson <phil@cs.wwu.edu> - - * bc/bc.y: Added a comment on the meanings of lvals. - -Wed Sep 13 11:40:24 2000 Phil Nelson <phil@cs.wwu.edu> - - * bc/main.c: add --interactive to long options. - bc/bc.1: add -i/--interactive to doc. - MANY: Update FSF address and Phil's e-mail. - -Tue Sep 12 13:58:16 2000 Phil Nelson <phil@cs.wwu.edu> - - * NEWS: update for recent changes. - bc/bc.y: remove required parens around return expression. - doc/bc.1: update for recent changes. - -Fri Sep 8 10:20:01 2000 Phil Nelson <phil@cs.wwu.edu> - - * bc/Makefile.am, dc/Makefile.am, lib/Makefile.am: - Compile with unsigned characters. - bc/main.c: Add --help option. - bc/scan.l: Print illegal, non-printable characters in octal. - -Fri Sep 8 09:36:54 2000 Phil Nelson <phil@cs.wwu.edu> - - * bc/bc.y: Allow more newlines in function definitions. - bc/proto.h: Don't prototype main. - -Fri Sep 1 16:09:50 2000 Phil Nelson <phil@cs.wwu.edu> - - * bc/bc.y: Spelling correction - bc/execute.c: Correct expressions for multi-byte names. - bc/load.c: Add parens for correct casting. - doc/bc.1: Typos. - Above fixes pointed out by kwzh@gnu.org (Karl Heuer). - -Tue Aug 29 23:03:30 PDT 2000 Phil Nelson <phil@cs.wwu.edu> - - * lib/testmul.c: #ifdef out a declaration matching #ifdef out - code. - -Mon Jul 31 07:01:42 2000 Ken Pizzini <ken@gnu.org> - - * dc/numeric.c: use of the "n" command can cause a number to be printed - without a trailing newline, which would cause the column counter to - fail to be reset and result in inappropriately wrapped numeric outputs. - Fixed by always clearing the column counter before outputting each number. - - * dc/stack.c: if a stack is used without ever using the correspondingly - named register, it is perfectly legitimate for the register to be - uninitialized; added an "else if" to handle this case without aborting. - - * dc/eval.c: updated the comment explaining the restrictions - on the | command to better reflect reality. - - * doc/dc.texi: update the FSF office address in the copyright notice - -Thu Jul 13 18:13:00 2000 Phil Nelson <phil@cs.wwu.edu> - - * README: note --with-libedit configure parameter. - -Tue Jun 20 22:52:10 2000 Phil Nelson <phil@cs.wwu.edu> - - * bc/bcdefs.h: Include <readline/history.h> to quiet warnings. - - * configure.in: make --with-readline and --with-libedit work correctly. - - * Makefile.am: use $(MAKE) instead of directly calling make. - - * lib/testmul.c: Update to use bc_ on all number.c routines. - -Sat Jun 10 22:44:29 2000 Phil Nelson <phil@cs.wwu.edu> - - * bc/Makefile.am: Add scan.c to maintainer-clean target. - - * acconfig.h configure.in stamp-h.in bc/Makefile.am bc/execute.c - bc/fix-libmath_h bc/global.c bc/load.c bc/main.c bc/storage.c: - Remove long string for libmath. Clean up for compiler errors. - - * dc/numeric.c: Correct parameter name. - -Wed May 10 15:51:16 2000 Phil Nelson <phil@cs.wwu.edu> - - * {bc,doc,dc,lib}/Makefile.am: Add Makefile.in to maintainer-clean. - - * bootstrap.sh: Added script to run the auto* tools. - - * Imported all into CVS tree. - -Sun 2000-05-07 Phil Nelson <phil@cs.wwu.edu> - - * bc/Makefile.am, dc/Makefile.am, lib/Makefile.am: Add -Wall to CFLAGS. - - * bc/{execute.c,proto.h,storage.c,util.c}, dc/numeric.c: Changes for - -Wall and for name changes in lib/number.c. (Added bc_ to several - routine. Updated copyright notice.) - - * h/number.h, lib/number.c: Now comes from bcmath library which is - distributed in a different place. - -Wed Mar 29 17:47:34 2000 Phil Nelson <phil@cs.wwu.edu> - - * bc/{bc.y,bcdefs.h,global.h,main.c,proto.h,scan.l,storage.c}: - Added BSD libedit support. Generic support for both where possible. - Fixed bugs in readline support noticed during libedit addition. - Works with NetBSD-1.4.1 libedit. - * doc/bc.1: Documented libedit addition. - -Wed Mar 29 10:20:18 2000 Phil Nelson <phil@cs.wwu.edu> - - * FAQ: Added this file. - * Makfile.am: Added FAQ to distribution - -Tue Mar 28 13:52:35 2000 Phil Nelson <phil@cs.wwu.edu> - - * lib/number.c, h/number.h: Moved definitions so - number.c/number.h is a stand-alone "library". - Changed definition of out_num to not reference a global. - * lib/testmul.c: updated #includes for number.h changes. - * h/{bcdefs.h,const.h,global.h,proto.h} moved to - bc where they really belong. - * bc/execute.c: Changed calls to out_num for correctness. - * dc/numeric.c: Changed calls to out_num for correctness, - include only number.h now and not all the other junk. - * configure.in, acconfig.h: Start of support for BSD libedit, - added --with-pkg for NetBSD /usr/pkg tree. - -Tue Mar 28 11:20:00 2000 Phil Nelson <phil@cs.wwu.edu> - - * Test/{exp.b,fact.b,jn.b,mul.b,raise.b}: Tweeks on the tests - run to do more computation and test the recursive multiply. - * bc/scan.l: Removed a printf('\r') that was unneeded. - -Mon Mar 27 14:00:00 2000 Phil Nelson <phil@cs.wwu.edu> - - * NEWS: Updated for 1.06. - * lib/number.c, h/number.h: Fixed bugs in recursive multiply. - Changed these files to be under the LGPL. - * Tests/jn.b: Added more tests. - * lib/Makefile.am: Only generate a timed version of number.o if - requested. - * README: Updated with information on how to generate a timed - version of number.o. - * h/version.h: Updated copyright and version number for dc. - -Thu Mar 16 14:01:45 2000 Phil Nelson <phil@cs.wwu.edu> - - * doc/bc.1, doc/dc.1, doc/dc.texi: Changed bug reporting address - to bug-bc@gnu.org to update with what we hope will be reality. - -Tue Feb 8 08:54:19 2000 Phil Nelson <phil@cs.wwu.edu> - - * doc/bc.1, bc/util.c: Removed "multiply digits" - limit due to new recursive algorithm that doesn't - have those limits. - -Tue Feb 8 08:47:05 2000 Phil Nelson <phil@cs.wwu.edu> - - * lib/Makefile.am, lib/testmul.c, lib/number.c, Makefile.am: - Finally got a resonable version of the program - to test the crossover between non-recursive and - recursive multiply algorithms. Added to distribution - and build process. Does increase build time by - about 10 minutes. - -Wed Oct 6 13:28:59 1999 Phil Nelson <phil@cs.wwu.edu> - - * lib/Makefile.am: Added rules to allow DEFSADD definitions. - -Sat Oct 2 19:59:51 1999 Phil Nelson <phil@cs.wwu.edu> - - * bc/libmath.b: Correctly do the cosine accuracy. - -Fri Oct 1 12:41:51 1999 Phil Nelson <phil@cs.wwu.edu> - - * lib/number.c: Increase accuracy of computing raise. - Also turn off use of recursive multiply routines - until furthur testing. - * bc/libmath.b: Increase accuracy of cosine. - * bc/Makefile.am: Remove -lfl from items to make. - -Wed Jul 28 10:29:28 1999 Phil Nelson <phil@cs.wwu.edu> - - * bc/scan.l: rl_len from char to int. (From FreeBSD - bug tracking system and Nick Hibma <nick.hibma@jrc.it>) - -Tue Jun 22 08:00:28 1999 Phil Nelson <phil@cs.wwu.edu> - - * lib/number.c: Rewrote bc_multiply to use a faster - algorithm. Old code not removed yet. - -Mon Jun 21 03:08:02 1999 Phil Nelson <phil@cs.wwu.edu> - - * h/version.h: Updated version number to 1.06. - bc/bc.y: Corrected bug in for statement, not popping. - bc/execute.c: Improved stack dump/instruction tracing. - -Tue Jun 15 22:30:42 1999 Phil Nelson <phil@cs.wwu.edu> - - * configure.in: Updated bc version to 1.06. - -Tue Jun 15 22:27:44 1999 Phil Nelson <phil@cs.wwu.edu> - - * h/bcdefs.h, h/const.h, bc/execute.c, bc/load.c, bc/storage.c, - bc/util.c: Removed segmented function storaged. Now - dynamically expands (by doubling, starting at 1024 bytes) - to allow arbitrary sized functions. - -Thu Jun 10 22:33:44 1999 Phil Nelson <phil@cs.wwu.edu> - - * bc/libmath.b: change scaling in computation of j(n,x) so - it correctly computes the value. - -Wed Jun 10 10:10:10 1998 Release of bc-1.05a. - -Fri Apr 17 10:40:59 1998 Phil Nelson <phil@cs.wwu.edu> - - * bc/main.c: Enable readline only if interactive. - -Thu Apr 16 16:49:22 1998 Phil Nelson <phil@cs.wwu.edu> - - * bc/configure.in: Tweeking of AM_PROG_LEX and associated - special case goo for solaris. - -Sat Mar 28 21:43:18 1998 Phil Nelson <phil@cs.wwu.edu> - - * bc/Makefile.am: Added "YFLAGS = -d" to get bc.h to build properly. - -Mon Mar 9 12:54:42 PST 1998 Ken Pizzini <ken@halcyon.com> - - * doc/dc.texi, doc/dc.1: correct some documentation bugs. - -Sun Mar 8 23:56:24 PST 1998 Ken Pizzini <ken@halcyon.com> - - * dc/numeric.c: eliminate superfluous variable from dc_dump_num(); - annotate unused parameters in dc_add() and dc_sub(). - - * h/version.h: change dc version number to 1.2 for release. - -Sun Mar 8 21:13:50 1998 Phil Nelson <phil@cs.wwu.edu> - - * bc/main.c: Applied patch from Ken Pizzini to force line - mode buffering on stdout. - -Tue Jan 6 09:15:04 PST 1998 Ken Pizzini <ken@halcyon.com> - - * h/version.h: dc is now up to version 1.1.5. - - * dc/eval.c, dc/numeric.c, doc/dc.texi, doc/dc.1: once again - changed the behavior of the 'P' command with a numeric argument - to make it more general. It now dumps out the *whole* number - (or rather, the whole of its positive integer portion) as a - byte stream. (For small values this is still the same as 'aP'.) - - * dc/dc-proto.h, dc/dc.h, dc/eval.c, dc/misc.c, dc/numeric.c, - dc/stack.c, dc/string.c: Changed most uses of dc_boolean to - either dc_discard or dc_newline, and instances of DC_TRUE and - DC_FALSE to appropriate instances of DC_TOSS, DC_KEEP, DC_NONL, - or DC_WITHNL so that the code self-documents a little better. - -Sun Jan 4 15:39:46 PST 1998 Ken Pizzini <ken@halcyon.com> - - * dc/eval.c, doc/dc.texi, doc/dc.1: Changed the functionality - of the 'P' command, and added the 'n' command. Due to - a quirk of the implementation of traditional dc, some - people have come to expect that the 'P' command on a - numeric argument in the range of 1 to 99 should output - the corresponding character, despite the fact that this - usage can have very weird results for numbers outside - that range. This functionality is why the 'a' command - was introduced last March, but people really want it to - "just work" without needing to use the 'a' command. - Bowing to this demand, the 'P' command now does the - equivalent of "aP" if the argument is numeric, and the - 'n' command has been added to support the previous - functionality of the 'P' command. - - * dc/misc.c, dc/eval.c, dc/stack.c, dc/dc-proto.h: - Changed prototype for dc_print(). It now additionally - takes two flags, newline_p and discard_p, which it - passes through to dc_out_num() and dc_out_str() as - needed. - - * h/version.h: dc is now up to version 1.1.4. - -Sat Sep 27 13:48:53 1997 Ken Pizzini <ken@halcyon.com> - - * h/version.h: dc is now up to version 1.1.3. - - * dc/stack.c, dc/array.c, dc/dc-proto.h, doc/dc.texi, doc/dc.1: - It has come to my attention that, though undocumented, - traditional dc stacked its arrays in parallel with the - stacking of simple registers. I have now duplicated - this functionality. - - * dc/dc.c, configure.in: line-buffer dc's output if setvbuf() - is supported. This was requested to simplify using dc as - an inferior process under emacs. - -Fri Sep 26 19:56:15 1997 Ken Pizzini <ken@halcyon.com> - - * dc/dc.c: fixed bug reporting address for --help. - - * doc/dc.1, doc/dc.texi: corrected documentation of the maximum - admissible input base. - - * doc/dc.texi: corrected sample code equivalence for the | command. - - * lib/number.c: added a warning for non-zero scale in the base - for bc_raisemod(). - -Fri Sep 26 18:15:31 1997 Ken Pizzini <ken@halcyon.com> - - * dc/eval.c, doc/dc.1, doc/dc.texi: added !=, !<, and !> commands. - - * dc/eval.c: eliminated double-free in 'a' command. - - * dc/dc.c: changed placment of check for filename "-" so that - "-f -" will work. - - * h/version.h: updated dc version to 1.1.2. - -Thu Sep 18 17:41:10 1997 Ken Pizzini <ken@halcyon.com> - - * dc/eval.c: fixed off-by-one error for Q and q commands. - - * dc/dc.c: added missing f: to third argument of getopt(). - - * h/version.h: updated dc version to 1.1.1. - -Thu May 22 08:24:08 1997 Phil Nelson <phil@cs.wwu.edu> - - * lib/number.c(bc_sqrt): Fixed a bug that computed 0 for sqrt - of most numbers less than .000001. - -Thu May 1 10:41:38 1997 Phil Nelson <phil@cs.wwu.edu> - - * Test/timetest: change path to bc executable. - -Wed Apr 30 12:00:00 1997 Phil Nelson <phil@cs.wwu.edu> - - * Froze bc-1.04, started new directory for bc-1.05. - Fixes to bc-1.04 will be distributed as bc-1.05. - -Mon Apr 21 14:57:14 1997 Phil Nelson <phil@cs.wwu.edu> - - * bc/scan.l: Changed rules for single line comment to work - with lex as well as flex. Also, do not include \n in the - comment. - - * doc/bc.1: Clarified the single line comment and that \n - is processed outside of the comment. - -Sun Apr 20 22:21:30 1997 Phil Nelson <phil@cs.wwu.edu> - - * bc/scan.l: Added rules for a single line comment starting - with the # character. - - * doc/bc.1: Documented the single line comment. - - * bc/Makefile.am: Added DISTCLEANFILES for proper clean up. - -Sat Apr 19 22:08:05 1997 Phil Nelson <phil@cs.wwu.edu> - - * dc/Makefile.am: Removed file from distribution list. - - * h/version.h: Updated dc version to 1.1. - -Fri Apr 18 16:43:04 1997 Phil Nelson <phil@cs.wwu.edu> - - * lib/number.c (bc_add, bc_sub) Added 1 to the length - of the memset call to make sure it zeroed all the - storage. - -Fri Apr 18 13:58:56 1997 Phil Nelson <phil@cs.wwu.edu> - - * configure.in: Tweeks to get things right. Not sure if things - changed much. Still working with autoconf/automake to do - the right thing. - -Wed Apr 16 16:49:17 1997 Phil Nelson <phil@cs.wwu.edu> - - * bc/main.c (main): Changed processing of BC_ENV_ARGS. - - * bc/main.c (parse_args): Removed "start" parameter. - -Tue Apr 15 13:21:28 1997 Phil Nelson <phil@cs.wwu.edu> - - * acconfig.h: Included support for PACKAGE and VERSION. - - * configure.in: More tweeks for automake support. - - * h/number.h: Improve definition of MIN and MAX. - - * doc/bc.1: Changed copyright, tweeked other text, added - e-mail address for bugs. - - * doc/dc.1: Added copyright and GPL license information, - Changed a few .SH formats. - -Fri Apr 11 16:14:42 1997 Phil Nelson <phil@cs.wwu.edu> - - * Makefile.am configure.in doc/Makefile.am lib/Makefile.am - bc/Makefile.am bc/bc.y dc/Makefile.am: Changes to accomodate - automake-1.1n (pre-release version of automake 1.2). - - * bc/bc.y bc/sbc.y: Changes to make sure tokens are numbered the - same in bc/bc.h and bc/sbc.h. - - * bc/scan.l: Changes for automake's naming convention. - - * NEWS: Fixed a typo. - -Thu Apr 10 14:42:55 1997 Phil Nelson <phil@cs.wwu.edu> - - * bc/{execute.c, global.c, libmath.b, load.c, main.c, sbc.y - scan.l, storage.c, util.c}: Changed copyright comment and - added 1997 to copyright years. - - * h/{bcdefs.h, const.h, global.h, number.h proto.h, version.h}: - Changed copyright comment and added 1997 to copyright years. - - * h/version.h: Changed bc version to 1.04. - - * lib/number.c: Changed copyright comment and added 1997 to - copyright years. - - * lib/vfprintf.c: Noted that this was only for minix. - - * NEWS, README: README is now comp.sources.reviewed readme only. - NEWS now lists changes from version to version. - -Thu Apr 10 13:41:56 1997 Phil Nelson <phil@fawn.cs.wwu.edu> - - * Makefile.am: Removed FIXME stuff. - -Thu Apr 8 13:39:53 1997 Phil Nelson <phil@cs.wwu.edu> - - * bc/Makefile.am: Remove files that should not be distributed. - -Mon Apr 7 17:14:28 1997 Phil Nelson <phil@cs.wwu.edu> - - * Makefile.am: Removed Misc directory from distribution. - -Mon Apr 7 16:16:01 1997 Phil Nelson <phil@cs.wwu.edu> - - * bc/sbc.y: Corrected use of nextarg(). - -Tue Mar 25 19:32:28 1997 Ken Pizzini <ken@halcyon.com> - - * dc/eval.c, dc/misc.c, dc/stack.c, dc/string.c, - dc/dc.h, dc/dc-proto.h, dc/dc.c, dc/numeric.c, - doc/dc.texi: updated years in copyright - notices. - - * dc/dc.1: updated last-revision date. - -Tue Mar 25 16:35:46 1997 Ken Pizzini <ken@halcyon.com> - - * lib/number.c: give a run-time warning in bc_raisemod() - if the modulus does not appear to be an integer. - - * doc/dc.texi, doc/dc.1: documented a warning against - the use of the new | command in conjunction with a - non-integral modulus. - -Tue Mar 25 15:36:04 1997 Ken Pizzini <ken@halcyon.com> - - * dc/string.c: dc_out_str() updated to use fwrite() - instead of printf(), to allow for the existence of - a NUL character in the string. - -Tue Mar 25 13:42:51 1997 Ken Pizzini <ken@halcyon.com> - - * doc/dc.texi, doc/dc.1: added documentation for new | command. - -Tue Mar 25 13:19:55 1997 Ken Pizzini <ken@halcyon.com> - - * dc/dc-proto.h: added prototype for dc_triop(). - -Tue Mar 25 12:00:38 1997 Ken Pizzini <ken@halcyon.com> - - * lib/number.c: add bc_modexp() modular-exponentiation function. - - * h/proto.h: add prototypes for bc_modexp() and bc_divmod(). - -Tue Mar 25 09:07:13 1997 Ken Pizzini <ken@halcyon.com> - - * doc/dc.texi, doc/dc.1: updated documentation with the - new command-line options. - - * doc/dc.texi, doc/dc.1: updated documentation with the - new '~', 'r', and 'a' commands. - - * dc/dc.c: added bug reporting information to --version text. - -Mon Mar 24 19:37:30 1997 Ken Pizzini <ken@halcyon.com> - - * lib/number.c: added new "bc_divmod" function. - - * dc/numeric.c: added new "dc_divrem" glue function to bc_divmod. - - * dc/stack.c: added new "dc_binop2" function. - - * dc/dc-proto.h: added new prototypes for dc_divrem() and dc_binop2(). - - * dc/eval.c, dc/numeric.c: add new '~' command which - returns both the quotient and remainder from division. - -Mon Mar 24 18:13:42 1997 Ken Pizzini <ken@halcyon.com> - - * dc/eval.c: Add new 'r' (reverse top two stack elements) command. - -Mon Mar 24 17:47:02 1997 Ken Pizzini <ken@halcyon.com> - - * dc/misc.c: split out the main() related functions into - a seperate dc/dc.c file. - - * dc/Makefile.am: updated to reflect this split. - -Sat Mar 1 04:57:54 1997 Ken Pizzini <ken@halcyon.com> - - * dc/misc.c: added "--file" option. - -Sat Mar 1 02:13:06 1997 Ken Pizzini <ken@halcyon.com> - - * dc/eval.c: fixed bug of an excess increment in - dc_evalstr()'s DC_COMMENT case. (Probably would - never show up in practice, but did violate the - letter of the C Standard.) - - * renamed dc/number.c to dc/numeric.c, to avoid - confusion with lib/number.c. - -Thu Feb 27 19:45:45 1997 Ken Pizzini <ken@halcyon.com> - - * dc/string.c, dc/dc.h: changed implementation of dc_str - type from a void * to a type which is only completed - in dc/string.c. No functional change, just prettier code. - -Thu Feb 27 18:25:19 1997 Ken Pizzini <ken@halcyon.com> - - * Cleaned up Makefile.am files. - -Thu Feb 6 00:41:02 1997 Ken Pizzini <ken@halcyon.com> - - * Noticed pre-autoconf vestages (NO_XXX configuration options); - fixed to refer to autoconf HAVE_XXX definitions. - - * The definition of BC_XXX values in h/const.h might - conflict with values of the same name from <limits.h>; - fixed to override without spewing warnings. - - * Added check for ptrdiff_t to configure.in; removed - special ptrdiff_t definition from dc/string.c . - -Wed Feb 5 22:28:37 1997 Ken Pizzini <ken@halcyon.com> - - * Only compile (guts of) lib/vfprintf.c if system does - not have its own version. - -Wed Feb 5 22:26:16 1997 Ken Pizzini <ken@halcyon.com> - - * Changed dc/misc.c source to use standard GNU option - parsing routine (instead of special-case code). - - * Added "-e" option to dc. - - * Bumped dc version number to 1.0.4. - -Wed Feb 5 22:08:06 1997 Ken Pizzini <ken@halcyon.com> - - * rearranged source layout (added subdirectory structure); - removed "dc-" prefix from dc C source in its new home. - - * merged bc's "version.h" and dc's "dc-version.h" files - into h/version.h; patched dc/misc.c to refer to new - DC_VERSION macro name. - - * Tweaked configure.in in anticipation of using automake. - -Wed Jul 24 16:27:20 1996 Phil Nelson <phil@cs.wwu.edu> - - * number.c (out_num): Move free of t_num to proper place. - -Mon Jun 3 00:31:10 1996 Phil Nelson <phil@cs.wwu.edu> - - * number.c: (bc_sqrt, is_near_zero) Was hanging in an infinite - loop on sqrt(.9999). Rewrote to take difference. New routine - is_near_zero to check for one digit off. - -Thu Feb 22 12:14:38 1996 Phil Nelson <phil@cs.wwu.edu> - - * dc-eval.c (dc_func): Added the 'a' (number to ascii character) - command. - -Thu Feb 22 11:55:15 1996 Phil Nelson <phil@cs.wwu.edu> - - * dc-eval.c: (Changes from Ken) Changes dealing with stdin_lookahead - and peekc. - - * dc-misc.c: (Changes from Ken) Changes in option processing. - - * dc-version.c: (Change from Ken) Version is 1.0.2. - -Mon Oct 9 15:40:06 1995 Phil Nelson <phil@cs.wwu.edu> - - * execute.c (execute): Add a pop to 'W' and 'P' codes. Otherwise, - the stack continues to grow. - - * number.c (out_num): Free all bc_nums used. - -Thu Jun 29 00:35:57 1995 Phil Nelson <phil@cs.wwu.edu> - - * bc.1: Added information about long options and use of the - readline library. - -Wed Jun 28 21:03:45 1995 Phil Nelson <phil@cs.wwu.edu> - - * scan.l: rl_input: detect EOF. - -Wed Jun 28 19:03:51 1995 Phil Nelson <phil@cs.wwu.edu> - - * Makefile.in: fbc target, changed $(LEXLIB) => $(LIBS) - -Wed Jun 28 01:33:07 1995 Phil Nelson <phil@cs.wwu.edu> - - * acconfig.h, bc.y, scan.l, storage.c, util.c, configure.in: - Improved readline support with a new pseudo variable "history" - that controls the number of history lines available. - Also removed "optional" history. - -Wed Jun 28 01:03:52 1995 Phil Nelson <phil@cs.wwu.edu> - - * getopt.h, getopt.c, getopt1.c: Imported from glibc-1.09 - to allow long option processing. - - * main.c (parse_args): Make it use long arguments. - - * global.h: Change option flag variables from "char" to "int" - to allow long_arguments easy access to the variables. - - * Makefile.in: Add getopt.h, getopt.c, and getopt1.c in the - proper places in the Makefile. - -Fri Jun 23 12:00:16 1995 Phil Nelson <phil@cs.wwu.edu> - - * scan.l, main.c (main), acconfig.h, configure.in: - Added support for readline input on stdin. - -Thu Jun 22 20:08:57 1995 Phil Nelson <phil@cs.wwu.edu> - - * bc.1: Change documentation on POSIX array parameter support. - -Fri Apr 7 12:29:28 1995 Phil Nelson <phil@cs.wwu.edu> - - * main.c (parse_args): change "char ch" to "int optch" with - related changes. - -Thu Mar 23 04:11:00 1995 Phil Nelson <phil@cs.wwu.edu> - - * bc.1: Update documentation to include new -q - option and the environment variables. - -Thu Mar 23 03:30:38 1995 Phil Nelson <phil@cs.wwu.edu> - - * bcdefs.h, global.h, main.c, util.c, bc.y: Reworked - argument processing to allow for getting arguments - from the environment and the command line. Added - a new mechanism to access file names for opening - and for error messages. Also added a "quiet" - option to turn off the welcome banner. - -Thu Mar 23 03:12:11 1995 Phil Nelson <phil@cs.wwu.edu> - - * util.c: Corrected a comment. - -Tue Mar 21 13:36:24 1995 Phil Nelson <phil@cs.wwu.edu> - - * bc.y: Added "opt_newline" to allow more newlines - in non-POSIX mode. - -Tue Mar 21 09:38:28 1995 Phil Nelson <phil@cs.wwu.edu> - - * execute.c, main.c, util.c: Add support for user - defined line length, "correct POSIX line length", - no breaking of strings in std_only mode. This - included adding a new function "out_schar" to - util.c. Also removed "if (interactive)" before - all fflushes. - -Tue Mar 21 09:12:16 1995 Phil Nelson <phil@cs.wwu.edu> - - * global.h: Added new variable "line_size". Cleaned up - some definitions by adding comments. - -Mon Mar 20 23:33:01 1995 Phil Nelson <phil@cs.wwu.edu> - - * proto.h: Define getopt only if no unistd.h file. - -Mon Mar 20 23:23:34 1995 Phil Nelson <phil@cs.wwu.edu> - - * number.c, proto.h, execute.c, storage.c, dc-number.c: - Changes to bc_add and bc_sub parameters to allow for - different scale results than were possible. This is - for correct implementation of modulo. All calls were - updated. - -Mon Mar 20 19:26:06 1995 Phil Nelson <phil@cs.wwu.edu> - - * sbc.y: Removed second parameter on calls to arg_str to match - real function. - -Tue Feb 28 14:30:18 1995 Phil Nelson <phil@cs.wwu.edu> - - * Makefile.in: Change realclean to maintainer-clean. Added warning. - -Mon Feb 27 17:08:24 1995 Phil Nelson <phil@cs.wwu.edu> - - * number.c: Change output to conform with POSIX standard for zero - only when the -s flag is given. Otherwise it does the tradational - thing. - - * dc-misc.c: Add the "std_only" flag, always set to zero. This is - needed due to the above change. - -Tue Nov 29 15:18:20 1994 Phil Nelson <phil@cs.wwu.edu> - - * bc.1: Remove the "then" keyword in the if statement documentation. - -Mon Nov 28 16:50:25 1994 Phil Nelson <phil@cs.wwu.edu> - - * bc.1: Fixed a font change error. - - * Makefile.in: Added missing \ in two targets. - -Tue Nov 22 11:09:08 1994 Phil Nelson <phil@cs.wwu.edu> - - * bc.1: clarified ibase and math routines. - -Thu Nov 3 14:09:31 1994 Phil Nelson (phil@cs.wwu.edu) - - * Makefile.in: added targets uninstall, installdirs and modified - other targets to get makes in a directory other than srcdir to - work. - - * configure.in: added shell commands to get configure to work - correctly in directories other than srcdir. - -Wed Nov 2 10:18:19 1994 Phil Nelson (phil@cs.wwu.edu) - - * bc.1 bc.y bcdefs.h const.h execute.c global.c global.h load.c - main.c number.c number.h proto.h sbc.y scan.l storage.c util.c: - updated copyright to 1994. - - * version.h: updated version number and copyright date. - - * Makefile.in, configure.in, Install: updated for use with - autoconf-2.0 and install-sh. Changed target install a bit. - - * install-sh: Included this file from the autoconf-2.0 - distribution to have configure run without errors. - - * README: updated to version 1.03. - -Mon Oct 31 10:26:28 1994 Phil Nelson (phil@cs.wwu.edu) - - * Added Ken Pizzini's dc implementation that uses bc numeric - routines. The following files have been added: - dc-Concerns dc-array.c dc-eval.c dc-misc.c dc-number.c - dc-proto.h dc-regdef.h dc-stack.c dc-string.c dc-version.h - dc.1 dc.h dc.texinfo - - * dc-array.c: Added a conditional include of stdlib.h to get - size_t defined on my SunOS 4.1.3 system. - - * configure.in: Added support for dc. - - * Makefile.in: Added support for dc. Added rule to make - config.h.in. - -Sun Aug 7 15:09:19 1994 Phil Nelson (phil@cs.wwu.edu) - - * configure.in, Makefile.in, acconfig.h: Add support for autoconf. - Removed old Makefile. - -Wed Jul 20 22:46:32 1994 Phil Nelson (phil@cs.wwu.edu) - - * bc.y: change definition of next_label in function definition. - Previous value of 0 caused break to not work. It is now 1. - -Fri Apr 8 14:16:37 1994 Phil Nelson (phil@cs.wwu.edu) - - * Makefile: Change the distribution to include libmath.h.dist - which is a copy of libmath.h that has the compiled libmath.b. - -Sun Feb 13 01:08:14 1994 Phil Nelson (phil@cs.wwu.edu) - - * execute.c: Change the string quote characters to be more like - C. \a => alert (bell) \b => backspace and added \q => ". - - * bc.1: Updated information on above changes. - -Wed Oct 27 23:34:40 1993 Phil Nelson (phil@cs.wwu.edu) - - * Makefile: Changed compress to gzip. Changed the - comment and definition of the DOT_IS_LAST compile option. - - * scan.l: Changed DOT_IS_LAST to NO_DOT_LAST and changed - the test so "." is the last variable is standard. - -Wed May 19 15:15:12 1993 Phil Nelson (phil at cs.wwu.edu) - - * number.c: Fixed output of negative numbers in bases other than - base 10. - -Wed Apr 21 11:56:31 1993 Phil Nelson (phil at cs.wwu.edu) - - * bc.1: Changed Steve Sommars e-mail address. - -Wed Apr 14 12:13:39 1993 Phil Nelson (phil at cs.wwu.edu) - - * sbc.y: removed leading , on first line. - -Wed Mar 31 16:12:39 1993 Phil Nelson (phil at cs.wwu.edu) - - * bc.1: Updated segment number for function bodies. - -Thu Mar 11 15:34:34 1993 Phil Nelson (phil at cs.wwu.edu) - - * Makefile: added version.h to bc.o's dependency list. - -Mon Mar 1 14:00:46 1993 Phil Nelson (phil at cs.wwu.edu) - - * util.c: (nextarg) changed parameter "val" to be an int. - -Tue Feb 16 10:06:45 1993 Phil Nelson (phil at cs.wwu.edu) - - * util.c: (call_str, arg_str) added a function call_str that - correctly produces the string of argmuent types for a function - call. arg_str produced them in the reverse order. This - eliminated the need for the "comma" argument to arg_str, which - was removed. - - * bc.y: changed the calls to arg_str to have only one parameter - in the function definition rule and replaced the call to arg_str - with call_str in the function call rule. - -Tue Nov 24 17:38:40 1992 Phil Nelson (phil at cs.wwu.edu) - - * Makefile: Added LEXLIB definitions for use with lex. - -Thu Oct 22 13:43:16 1992 Phil Nelson (phil at cs.wwu.edu) - - * number.c (bc_raise): Rearranged and added code to speed up - the computation by not doing unneeded multiplications. - -Wed Sep 30 10:43:52 1992 Phil Nelson (phil at cs.wwu.edu) - - * global.h: Fixed documentation. - -Tue Sep 29 15:27:50 1992 Phil Nelson (phil at cs.wwu.edu) - - * storage.c (process_params): Changed processing of more arguments - than in a function definition to just a return. - - * Makefile: Made changes to make it more in conformance with the - GNU coding standards. - -Tue Jul 7 21:09:07 1992 Phil Nelson (phil at cs.wwu.edu) - - * (const.h, bc.y, util.c) Added code so that when the math - library is loaded, redefinition of any math library function - will not cause the other functions to quit working correctly. - Before this change, redefining a(x) would cause s(x) and c(x) - to quit working and redefining s(x) would cause c(x) to quit - working. - -Wed Jul 1 14:35:29 1992 Phil Nelson (phil at cs.wwu.edu) - - * (libmath.b) Changed the calculation of scale for computing - e(x) and l(x). This provides a little more accuracy in the - last digit at the expense of a little speed. - - * (Test/checklib.b) Changed tests to be parameterized and test - more values. - -Thu Jun 25 09:22:59 1992 Phil Nelson (phil at cs.wwu.edu) - - * (configure) changed the script from looking in the - include directory for a .h file to asking cc (gcc) to - find the .h file. This will allow better detection - of include files available to the C compiler. - -Wed Jun 24 22:11:37 1992 Phil Nelson (phil at cs.wwu.edu) - - * (bc.y) Added a warning for the "last" variable. - - * (scan.l) Added code to allow for a single dot (.) to be the - same as the variable "last". This is not a "standard" feature, - but is provided for those who want it. - - * (Install) Documented the new define for dot (.). - - * (bc.1) Documented the use of dot (.) for "last". - - * (Makefile) Added an easy method for adding extra defines for - use during the compile. Set DOT_IS_LAST as a standard - extra define. - - * (number.c) Changed the code for sqrt for better speed. - -Mon Jun 22 21:47:05 1992 Phil Nelson (phil at cs.wwu.edu) - - * Changed the name of math.h to libmath.h to avoid conflict - with /usr/include/math.h. Changed all references to math.h - to libmath.h in all files. - - * (configure) Changed the test for long strings accepted by - cc to not include libmath.h and thus not need to distribute - a file that is generated by the system. - - * (Makefile) Changed PREFIX, BINDIR, LIBDIR, and MANDIR to - lower case. - -Tue Mar 3 10:16:07 1992 Phil Nelson (phil at cs.wwu.edu) - - * (main.c) Added missing } at line 140. - - * (version.h) Changed date of version 1.02 to March 3, 1992. - -Mon Feb 3 16:07:57 1992 Phil Nelson (phil at cs.wwu.edu) - - * (version.h) Updated version number and date. - - * (bc.1) Added a new "VERSION" section. - -Wed Jan 29 14:13:55 1992 Phil Nelson (phil at cs.wwu.edu) - - * (execute.c) Removed the setjmp and longjmp calls that may have - caused some problems with interrupted programs. - -Thu Jan 16 17:08:16 1992 Phil Nelson (phil at cs.wwu.edu) - - * (Makefile) Changed install to install the manual. - -Wed Jan 8 13:23:42 1992 Phil Nelson (phil at cs.wwu.edu) - - * Change all copyright notices to include 1992. - - * (load.c) Added termination to "load_code" to ignore code - after an error has been found. - - * (scan.l) Changed the check for NUL characters in STRING tokens - (before the close quote) to work correctly. Also added code to - report illegal characters in a more readable output format. - - * (bc.1) Added the exclusion of NUL characters from strings in - the "differences" section and updated date of last change. - - * (const.h) Changed BC_MAX_SEGS to 16. - -Mon Jan 6 14:20:02 1992 Phil Nelson (phil at cs.wwu.edu) - - * (number.c) Changed the out_num routine to use a correct field - size for bases greater than 16. e.g. For base 1000, each - "digit" is a three digit number. - - * (Makefile) Added the "8" flag to get an 8 bit scanner. - - * (scan.l) Changed "char *" to "unsigned char *" to match the - declaration of yytext for the 8 bit scanner. Also added code - to detect the null character in strings and generate an error. - -Sat Jan 4 20:32:20 1992 Phil Nelson (phil at cs.wwu.edu) - - * (const.h) Changed BC_BASE_MAX to INT_MAX to allow more bases! - -Mon Dec 30 21:47:28 1991 Phil Nelson (phil at cs.wwu.edu) - - * (main.c) Fixed the bug that loaded the math library before - every file. - - * (bc.y) Removed some type declarations that duplicated token - definitions so it could be run through bison. - - * (load.c) Added a check for maximum code size. - - * (Makefile) Added a prefix for LIBDIR and BINDIR so it can be - changed easily. - -Mon Nov 25 13:11:17 1991 Phil Nelson (phil at cs.wwu.edu) - - * Changed version number in version.h to 1.01 with current date. - - * Changed LIBFILE definition in Makefile. - - * Added a recursive function example to bc.1. - -Sun Nov 24 21:24:01 1991 Phil Nelson (phil at cs.wwu.edu) - - * Changed the Makefile to make sure configure is run first. - Added the $(CC) the configure call. Moved some defines - toward the front of the Makefile to make sure they are - read by installers. Also added SUBDIRS variable and updated - the GNU distribution to include the subdirectories. Included - math.h in the distribution for use by configure. Included - ChangeLog in the distribution. - - * Split the README into README and Install. Changed Install - to have current information. Documented the STRINGS_H define. - Updated the version number in README. - - * Added a check for <strings.h> in configure. - -Fri Nov 22 15:06:32 1991 Phil Nelson (phil at cs.wwu.edu) - - * Changed configure to check for varargs.h first. Also, added - checks to see if long strings (math.h) are accepted by the - C compiler. Also added parameters to configure. - - * Deleted #include <sys/types.h> from proto.h. Also made only - ANSI C compilers include <stdlib.h>. - - * Changed the Makefile to have the install bin directory be - /usr/local/bin and the install lib directory be /usr/local/lib. - - * Changed some files in the Test directory to eliminate the - <op>= form that some older bcs don't like. - - * Made some small corrections in bc.1. - -Tue Oct 29 10:06:32 1991 Phil Nelson (phil at cs.wwu.edu) - - * Called current version 1.00. - - * Submitted GNU bc-1.00 to comp.sources.reviewed diff --git a/contrib/bc/Examples/ckbook.b b/contrib/bc/Examples/ckbook.b deleted file mode 100644 index 5815ea0..0000000 --- a/contrib/bc/Examples/ckbook.b +++ /dev/null @@ -1,16 +0,0 @@ -scale=2 -print "\nCheck book program!\n" -print " Remember, deposits are negative transactions.\n" -print " Exit by a 0 transaction.\n\n" - -print "Initial balance? "; bal = read() -bal /= 1 -print "\n" -while (1) { - "current balance = "; bal - "transaction? "; trans = read() - if (trans == 0) break; - bal -= trans - bal /= 1 -} -quit diff --git a/contrib/bc/Examples/pi.b b/contrib/bc/Examples/pi.b deleted file mode 100644 index 0d840cf..0000000 --- a/contrib/bc/Examples/pi.b +++ /dev/null @@ -1,53 +0,0 @@ -/* - This is a program to determine the distribution of digits in the - fraction part of PI. It will look at the first scale digits. - - The results are left in the global variable digits. - digits[0] is the number of 0's in PI. - - This program requires the math library. -*/ - -define pi () { - auto ix, pi, save_scale, work; - - save_scale = scale; - scale += 5; - print "\n\nCalculating PI to ",scale," digits. Please wait . . ."; - pi = 4*a(1); - scale -= 5; - work = pi; - - print "\nCounting digits. . ."; - for (ix = 0; ix < 10; ix++) digits[ix] = 0; - - /* Extract the One's digit from pi. */ - scale = 0; - one_digit = work / 1; - - for (ix = save_scale; ix > 0; ix--) { - - /* Remove the One's digit and multiply by 10. */ - scale = ix; - work = (work - one_digit) / 1 * 10; - - /* Extract the One's digit. */ - scale = 0; - one_digit = work / 1; - - digits[one_digit] += 1; - } - - /* Restore the scale. */ - scale = save_scale; - - /* Report. */ - print "\n\n" - print "PI to ", scale, " digits is:\n", pi/1, "\n\n" - print "The frequency of the digits are:\n" - for (ix = 0; ix < 10; ix++) { - print " ", ix, " - ", digits[ix], " times\n" - } - - print "\n\n" -} diff --git a/contrib/bc/Examples/primes.b b/contrib/bc/Examples/primes.b deleted file mode 100644 index 2b52ca7..0000000 --- a/contrib/bc/Examples/primes.b +++ /dev/null @@ -1,32 +0,0 @@ - -/* An example that finds all primes between 2 and limit. */ - -define primes (limit) { - auto num, p, root, i - - prime[1] = 2; - prime[2] = 3; - num = 2; - if (limit >= 2) print "prime 1 = 2\n" - if (limit >= 3) print "prime 2 = 3\n"; - scale = 0; - - for ( p=5; p <= limit; p += 2) { - root = sqrt(p); - isprime = 1; - for ( i = 1; i < num && prime[i] <= root; i++ ) { - if ( p % prime[i] == 0 ) { - isprime = 0; - break; - } - } - if (isprime) { - num += 1; - prime [num] = p; - print "prime ", num, " = ", p, "\n" - } - } -} - - -print "\ntyping 'primes (10)' will print all primes less than 10.\n" diff --git a/contrib/bc/Examples/twins.b b/contrib/bc/Examples/twins.b deleted file mode 100644 index de910a7..0000000 --- a/contrib/bc/Examples/twins.b +++ /dev/null @@ -1,40 +0,0 @@ - -/* An example that finds all primes between 2 and limit. */ - -define primes (limit) { - auto num, p, root, i - - prime[1] = 2; - prime[2] = 3; - num = 2; - scale = 0; - - for ( p=5; p <= limit; p += 2) { - root = sqrt(p); - isprime = 1; - for ( i = 1; i < num && prime[i] <= root; i++ ) { - if ( p % prime[i] == 0 ) { - isprime = 0; - break; - } - } - if (isprime) { - num += 1; - prime [num] = p; - } - } -} - - -print "\ntyping 'twins (10)' will print all twin primes less than 10.\n" - -define twins (limit) { - auto i; - - i = primes(limit+2); - - for (i=1; prime[i] > 0; i++) { - if ((prime[i]+2) == prime[i+1]) \ - print "twins are ", prime[i], " and ", prime[i+1], "\n" - } -} diff --git a/contrib/bc/FAQ b/contrib/bc/FAQ deleted file mode 100644 index 32dd051..0000000 --- a/contrib/bc/FAQ +++ /dev/null @@ -1,17 +0,0 @@ -Because of frequent questions ....... here is the BC FAQ - - -1) Why does BC have its own arbitrary precision number routines - (found in lib/number.c) rather than using GMP? - -GMP has "integers" (no digits after a decimal), "rational numbers" -(stored as 2 integers) and "floats". None of these will correctly -represent a POSIX BC number. Floats are the closest, but will not -behave correctly for many computations. For example, BC numbers have -a "scale" that represent the number of digits to represent after the -decimal point. The multiplying two of these numbers requires one to -calculate an exact number of digits after the decimal point regardless -of the number of digits in the integer part. GMP floats have a -"fixed, but arbitrary" mantissa and so multiplying two floats will end -up dropping digits BC must calculate. - diff --git a/contrib/bc/FREEBSD-upgrade b/contrib/bc/FREEBSD-upgrade deleted file mode 100644 index 0174d7b..0000000 --- a/contrib/bc/FREEBSD-upgrade +++ /dev/null @@ -1,14 +0,0 @@ -$FreeBSD$ - -bc 1.0.5a - originals can be found at: ftp://prep.ai.mit.edu/pub/gnu/ - removed no subdirectories - removed bc/scan.c bc/bc.c bc/bc.h doc/texinfo.tex doc/dc.info - removed */getopt* - obrien@FreeBSD.ORG - - Imported with the commands: - - tar xvzf bc-1.0.5a.tar.gz - cd bc-1.0.5 - cvs import src/contrib/bc BC bc_1_0_5a diff --git a/contrib/bc/INSTALL b/contrib/bc/INSTALL deleted file mode 100644 index 3b50ea9..0000000 --- a/contrib/bc/INSTALL +++ /dev/null @@ -1,176 +0,0 @@ -Basic Installation -================== - - These are generic installation instructions. - - The `configure' shell script attempts to guess correct values for -various system-dependent variables used during compilation. It uses -those values to create a `Makefile' in each directory of the package. -It may also create one or more `.h' files containing system-dependent -definitions. Finally, it creates a shell script `config.status' that -you can run in the future to recreate the current configuration, a file -`config.cache' that saves the results of its tests to speed up -reconfiguring, and a file `config.log' containing compiler output -(useful mainly for debugging `configure'). - - If you need to do unusual things to compile the package, please try -to figure out how `configure' could check whether to do them, and mail -diffs or instructions to the address given in the `README' so they can -be considered for the next release. If at some point `config.cache' -contains results you don't want to keep, you may remove or edit it. - - The file `configure.in' is used to create `configure' by a program -called `autoconf'. You only need `configure.in' if you want to change -it or regenerate `configure' using a newer version of `autoconf'. - -The simplest way to compile this package is: - - 1. `cd' to the directory containing the package's source code and type - `./configure' to configure the package for your system. If you're - using `csh' on an old version of System V, you might need to type - `sh ./configure' instead to prevent `csh' from trying to execute - `configure' itself. - - Running `configure' takes a while. While running, it prints some - messages telling which features it is checking for. - - 2. Type `make' to compile the package. - - 3. Optionally, type `make check' to run any self-tests that come with - the package. - - 4. Type `make install' to install the programs and any data files and - documentation. - - 5. You can remove the program binaries and object files from the - source code directory by typing `make clean'. To also remove the - files that `configure' created (so you can compile the package for - a different kind of computer), type `make distclean'. There is - also a `make maintainer-clean' target, but that is intended mainly - for the package's developers. If you use it, you may have to get - all sorts of other programs in order to regenerate files that came - with the distribution. - -Compilers and Options -===================== - - Some systems require unusual options for compilation or linking that -the `configure' script does not know about. You can give `configure' -initial values for variables by setting them in the environment. Using -a Bourne-compatible shell, you can do that on the command line like -this: - CC=c89 CFLAGS=-O2 LIBS=-lposix ./configure - -Or on systems that have the `env' program, you can do it like this: - env CPPFLAGS=-I/usr/local/include LDFLAGS=-s ./configure - -Compiling For Multiple Architectures -==================================== - - You can compile the package for more than one kind of computer at the -same time, by placing the object files for each architecture in their -own directory. To do this, you must use a version of `make' that -supports the `VPATH' variable, such as GNU `make'. `cd' to the -directory where you want the object files and executables to go and run -the `configure' script. `configure' automatically checks for the -source code in the directory that `configure' is in and in `..'. - - If you have to use a `make' that does not supports the `VPATH' -variable, you have to compile the package for one architecture at a time -in the source code directory. After you have installed the package for -one architecture, use `make distclean' before reconfiguring for another -architecture. - -Installation Names -================== - - By default, `make install' will install the package's files in -`/usr/local/bin', `/usr/local/man', etc. You can specify an -installation prefix other than `/usr/local' by giving `configure' the -option `--prefix=PATH'. - - You can specify separate installation prefixes for -architecture-specific files and architecture-independent files. If you -give `configure' the option `--exec-prefix=PATH', the package will use -PATH as the prefix for installing programs and libraries. -Documentation and other data files will still use the regular prefix. - - If the package supports it, you can cause programs to be installed -with an extra prefix or suffix on their names by giving `configure' the -option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. - -Optional Features -================= - - Some packages pay attention to `--enable-FEATURE' options to -`configure', where FEATURE indicates an optional part of the package. -They may also pay attention to `--with-PACKAGE' options, where PACKAGE -is something like `gnu-as' or `x' (for the X Window System). The -`README' should mention any `--enable-' and `--with-' options that the -package recognizes. - - For packages that use the X Window System, `configure' can usually -find the X include and library files automatically, but if it doesn't, -you can use the `configure' options `--x-includes=DIR' and -`--x-libraries=DIR' to specify their locations. - -Specifying the System Type -========================== - - There may be some features `configure' can not figure out -automatically, but needs to determine by the type of host the package -will run on. Usually `configure' can figure that out, but if it prints -a message saying it can not guess the host type, give it the -`--host=TYPE' option. TYPE can either be a short name for the system -type, such as `sun4', or a canonical name with three fields: - CPU-COMPANY-SYSTEM - -See the file `config.sub' for the possible values of each field. If -`config.sub' isn't included in this package, then this package doesn't -need to know the host type. - - If you are building compiler tools for cross-compiling, you can also -use the `--target=TYPE' option to select the type of system they will -produce code for and the `--build=TYPE' option to select the type of -system on which you are compiling the package. - -Sharing Defaults -================ - - If you want to set default values for `configure' scripts to share, -you can create a site shell script called `config.site' that gives -default values for variables like `CC', `cache_file', and `prefix'. -`configure' looks for `PREFIX/share/config.site' if it exists, then -`PREFIX/etc/config.site' if it exists. Or, you can set the -`CONFIG_SITE' environment variable to the location of the site script. -A warning: not all `configure' scripts look for a site script. - -Operation Controls -================== - - `configure' recognizes the following options to control how it -operates. - -`--cache-file=FILE' - Use and save the results of the tests in FILE instead of - `./config.cache'. Set FILE to `/dev/null' to disable caching, for - debugging `configure'. - -`--help' - Print a summary of the options to `configure', and exit. - -`--quiet' -`--silent' -`-q' - Do not print messages saying which checks are being made. - -`--srcdir=DIR' - Look for the package's source code in directory DIR. Usually - `configure' can determine that directory automatically. - -`--version' - Print the version of Autoconf used to generate the `configure' - script, and exit. - -`configure' also accepts some other, not widely useful, options. - diff --git a/contrib/bc/Makefile.am b/contrib/bc/Makefile.am deleted file mode 100644 index 6703d74..0000000 --- a/contrib/bc/Makefile.am +++ /dev/null @@ -1,18 +0,0 @@ -## Process this file with automake to produce Makefile.in - -SUBDIRS = lib bc dc doc - -MAINTAINERCLEANFILES = aclocal.m4 config.h.in configure Makefile.in \ - $(distdir).tar.gz h/number.h - -dist-hook: - mkdir $(distdir)/h $(distdir)/Examples $(distdir)/Test - cp -p $(srcdir)/h/*.h $(distdir)/h - cp -p $(srcdir)/Examples/*.b $(distdir)/Examples - cp -p $(srcdir)/Test/*.b $(srcdir)/Test/*.bc $(distdir)/Test - cp -p $(srcdir)/Test/signum $(srcdir)/Test/timetest $(distdir)/Test - cp -p $(srcdir)/lib/testmul.c $(distdir)/lib - cp -p $(srcdir)/FAQ $(distdir) - -timetest: - (cd lib; $(MAKE) specialnumber) diff --git a/contrib/bc/Makefile.in b/contrib/bc/Makefile.in deleted file mode 100644 index b57eae5..0000000 --- a/contrib/bc/Makefile.in +++ /dev/null @@ -1,368 +0,0 @@ -# Makefile.in generated automatically by automake 1.4 from Makefile.am - -# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include - -DESTDIR = - -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ - -top_builddir = . - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -transform = @program_transform_name@ - -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -CC = @CC@ -LEX = @LEX@ -MAKEINFO = @MAKEINFO@ -PACKAGE = @PACKAGE@ -RANLIB = @RANLIB@ -READLINELIB = @READLINELIB@ -VERSION = @VERSION@ -YACC = @YACC@ - -SUBDIRS = lib bc dc doc - -MAINTAINERCLEANFILES = aclocal.m4 config.h.in configure Makefile.in $(distdir).tar.gz h/number.h - -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = config.h -CONFIG_CLEAN_FILES = -DIST_COMMON = README ./stamp-h.in AUTHORS COPYING COPYING.LIB ChangeLog \ -INSTALL Makefile.am Makefile.in NEWS acconfig.h aclocal.m4 config.h.in \ -configure configure.in install-sh missing mkinstalldirs - - -DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) - -TAR = tar -GZIP_ENV = --best -all: all-redirect -.SUFFIXES: -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$@ CONFIG_HEADERS= $(SHELL) ./config.status - -$(ACLOCAL_M4): configure.in - cd $(srcdir) && $(ACLOCAL) - -config.status: $(srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) - $(SHELL) ./config.status --recheck -$(srcdir)/configure: $(srcdir)/configure.in $(ACLOCAL_M4) $(CONFIGURE_DEPENDENCIES) - cd $(srcdir) && $(AUTOCONF) - -config.h: stamp-h - @if test ! -f $@; then \ - rm -f stamp-h; \ - $(MAKE) stamp-h; \ - else :; fi -stamp-h: $(srcdir)/config.h.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES= CONFIG_HEADERS=config.h \ - $(SHELL) ./config.status - @echo timestamp > stamp-h 2> /dev/null -$(srcdir)/config.h.in: $(srcdir)/stamp-h.in - @if test ! -f $@; then \ - rm -f $(srcdir)/stamp-h.in; \ - $(MAKE) $(srcdir)/stamp-h.in; \ - else :; fi -$(srcdir)/stamp-h.in: $(top_srcdir)/configure.in $(ACLOCAL_M4) acconfig.h - cd $(top_srcdir) && $(AUTOHEADER) - @echo timestamp > $(srcdir)/stamp-h.in 2> /dev/null - -mostlyclean-hdr: - -clean-hdr: - -distclean-hdr: - -rm -f config.h - -maintainer-clean-hdr: - -# This directory's subdirectories are mostly independent; you can cd -# into them and run `make' without going through this Makefile. -# To change the values of `make' variables: instead of editing Makefiles, -# (1) if the variable is set in `config.status', edit `config.status' -# (which will cause the Makefiles to be regenerated when you run `make'); -# (2) otherwise, pass the desired values on the `make' command line. - -@SET_MAKE@ - -all-recursive install-data-recursive install-exec-recursive \ -installdirs-recursive install-recursive uninstall-recursive \ -check-recursive installcheck-recursive info-recursive dvi-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - dot_seen=yes; \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done; \ - if test "$$dot_seen" = "no"; then \ - $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ - fi; test -z "$$fail" - -mostlyclean-recursive clean-recursive distclean-recursive \ -maintainer-clean-recursive: - @set fnord $(MAKEFLAGS); amf=$$2; \ - dot_seen=no; \ - rev=''; list='$(SUBDIRS)'; for subdir in $$list; do \ - rev="$$subdir $$rev"; \ - test "$$subdir" = "." && dot_seen=yes; \ - done; \ - test "$$dot_seen" = "no" && rev=". $$rev"; \ - target=`echo $@ | sed s/-recursive//`; \ - for subdir in $$rev; do \ - echo "Making $$target in $$subdir"; \ - if test "$$subdir" = "."; then \ - local_target="$$target-am"; \ - else \ - local_target="$$target"; \ - fi; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ - || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ - done && test -z "$$fail" -tags-recursive: - list='$(SUBDIRS)'; for subdir in $$list; do \ - test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ - done - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - here=`pwd` && cd $(srcdir) \ - && mkid -f$$here/ID $$unique $(LISP) - -TAGS: tags-recursive $(HEADERS) $(SOURCES) config.h.in $(TAGS_DEPENDENCIES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SUBDIRS)'; for subdir in $$list; do \ - if test "$$subdir" = .; then :; else \ - test -f $$subdir/TAGS && tags="$$tags -i $$here/$$subdir/TAGS"; \ - fi; \ - done; \ - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)config.h.in$$unique$(LISP)$$tags" \ - || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags config.h.in $$unique $(LISP) -o $$here/TAGS) - -mostlyclean-tags: - -clean-tags: - -distclean-tags: - -rm -f TAGS ID - -maintainer-clean-tags: - -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) - -# This target untars the dist file and tries a VPATH configuration. Then -# it guarantees that the distribution is self-contained by making another -# tarfile. -distcheck: dist - -rm -rf $(distdir) - GZIP=$(GZIP_ENV) $(TAR) zxf $(distdir).tar.gz - mkdir $(distdir)/=build - mkdir $(distdir)/=inst - dc_install_base=`cd $(distdir)/=inst && pwd`; \ - cd $(distdir)/=build \ - && ../configure --srcdir=.. --prefix=$$dc_install_base \ - && $(MAKE) $(AM_MAKEFLAGS) \ - && $(MAKE) $(AM_MAKEFLAGS) dvi \ - && $(MAKE) $(AM_MAKEFLAGS) check \ - && $(MAKE) $(AM_MAKEFLAGS) install \ - && $(MAKE) $(AM_MAKEFLAGS) installcheck \ - && $(MAKE) $(AM_MAKEFLAGS) dist - -rm -rf $(distdir) - @banner="$(distdir).tar.gz is ready for distribution"; \ - dashes=`echo "$$banner" | sed s/./=/g`; \ - echo "$$dashes"; \ - echo "$$banner"; \ - echo "$$dashes" -dist: distdir - -chmod -R a+r $(distdir) - GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) - -rm -rf $(distdir) -dist-all: distdir - -chmod -R a+r $(distdir) - GZIP=$(GZIP_ENV) $(TAR) chozf $(distdir).tar.gz $(distdir) - -rm -rf $(distdir) -distdir: $(DISTFILES) - -rm -rf $(distdir) - mkdir $(distdir) - -chmod 777 $(distdir) - @for file in $(DISTFILES); do \ - d=$(srcdir); \ - if test -d $$d/$$file; then \ - cp -pr $$/$$file $(distdir)/$$file; \ - else \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file || :; \ - fi; \ - done - for subdir in $(SUBDIRS); do \ - if test "$$subdir" = .; then :; else \ - test -d $(distdir)/$$subdir \ - || mkdir $(distdir)/$$subdir \ - || exit 1; \ - chmod 777 $(distdir)/$$subdir; \ - (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=../$(distdir) distdir=../$(distdir)/$$subdir distdir) \ - || exit 1; \ - fi; \ - done - $(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-hook -info-am: -info: info-recursive -dvi-am: -dvi: dvi-recursive -check-am: all-am -check: check-recursive -installcheck-am: -installcheck: installcheck-recursive -all-recursive-am: config.h - $(MAKE) $(AM_MAKEFLAGS) all-recursive - -install-exec-am: -install-exec: install-exec-recursive - -install-data-am: -install-data: install-data-recursive - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -install: install-recursive -uninstall-am: -uninstall: uninstall-recursive -all-am: Makefile config.h -all-redirect: all-recursive-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install -installdirs: installdirs-recursive -installdirs-am: - - -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) - -rm -f config.cache config.log stamp-h stamp-h[0-9]* - -maintainer-clean-generic: - -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) -mostlyclean-am: mostlyclean-hdr mostlyclean-tags mostlyclean-generic - -mostlyclean: mostlyclean-recursive - -clean-am: clean-hdr clean-tags clean-generic mostlyclean-am - -clean: clean-recursive - -distclean-am: distclean-hdr distclean-tags distclean-generic clean-am - -distclean: distclean-recursive - -rm -f config.status - -maintainer-clean-am: maintainer-clean-hdr maintainer-clean-tags \ - maintainer-clean-generic distclean-am - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -maintainer-clean: maintainer-clean-recursive - -rm -f config.status - -.PHONY: mostlyclean-hdr distclean-hdr clean-hdr maintainer-clean-hdr \ -install-data-recursive uninstall-data-recursive install-exec-recursive \ -uninstall-exec-recursive installdirs-recursive uninstalldirs-recursive \ -all-recursive check-recursive installcheck-recursive info-recursive \ -dvi-recursive mostlyclean-recursive distclean-recursive clean-recursive \ -maintainer-clean-recursive tags tags-recursive mostlyclean-tags \ -distclean-tags clean-tags maintainer-clean-tags distdir info-am info \ -dvi-am dvi check check-am installcheck-am installcheck all-recursive-am \ -install-exec-am install-exec install-data-am install-data install-am \ -install uninstall-am uninstall all-redirect all-am all installdirs-am \ -installdirs mostlyclean-generic distclean-generic clean-generic \ -maintainer-clean-generic clean mostlyclean distclean maintainer-clean - - -dist-hook: - mkdir $(distdir)/h $(distdir)/Examples $(distdir)/Test - cp -p $(srcdir)/h/*.h $(distdir)/h - cp -p $(srcdir)/Examples/*.b $(distdir)/Examples - cp -p $(srcdir)/Test/*.b $(srcdir)/Test/*.bc $(distdir)/Test - cp -p $(srcdir)/Test/signum $(srcdir)/Test/timetest $(distdir)/Test - cp -p $(srcdir)/lib/testmul.c $(distdir)/lib - cp -p $(srcdir)/FAQ $(distdir) - -timetest: - (cd lib; $(MAKE) specialnumber) - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/contrib/bc/NEWS b/contrib/bc/NEWS deleted file mode 100644 index fc02a0d..0000000 --- a/contrib/bc/NEWS +++ /dev/null @@ -1,68 +0,0 @@ -This is GNU bc version 1.06. (And dc version 1.2) - -Changes in dc from 1.2 to 1.3: - Minor bug fixes. - New multiply algorithm of bc. - -Changes in bc from 1.05 to 1.06: - New multiply algoirthm and many other changes in lib/number.c - Function size now done dynamically. - Function syntax in non-posix mode allows newlines in more places. - Bug fixes: - improved computation of j(n,x). - enables readline only if interactive. - for statment bug fixed. - use int instead of char for readline char counts. - improved cosine accuracy. - -Changes in dc from 1.1 to 1.2: - added !< != !> commands - arrays now stack - output is now line buffered, provided setvbuf() is available - fixed known bugs in 'q', 'Q', 'a' commands, '-f' command-line option, - and documentation - changed the 'P' command's behavior on a numeric argument: - due to popular demand it now does the equivalent of 'aP' - (for small values) - added new 'n' command to do what the old 'P' command did - -Changes in bc from 1.04 to 1.05: - Solaris makes work better. - bug fixes - stdout now always does line buffering. - sqrt bug fixed for small numbers. - readline (if support is compiled in) is enabled only for - interactive executions of bc. - - -This is GNU bc version 1.04. (And dc version 1.1) - -Changes from 1.03 - - reorganization of source tree - use of automake - - new commands for dc (|, ~, r, a) - new command line options for dc - - fixed infinite loop in sqrt in bc - fixed an I/O bug in bc - made bc conform to POSIX for array parameters - added long option support for bc - new commandline options for bc (-q) - added support for readline to bc (use configure --with-readline) - command line argumens can now be taken from an environment variable - - -Changes from 1.02 - - minor bug fixes in bc. - - addition of Ken Pizzini's dc program that uses the GNU bc - arbitrary precision arithmetic routines. - -Changes from 1.01 - - minor bug fixes. - - diff --git a/contrib/bc/README b/contrib/bc/README deleted file mode 100644 index 2813fb8..0000000 --- a/contrib/bc/README +++ /dev/null @@ -1,86 +0,0 @@ -GNU bc version 1.06: - -Extra configuration options: - - --with-readline tells bc to use the readline package that allows - for editing input lines when run interactive. - - --with-editline tells bc to use the BSD editline package that - allows for editing input lines when run interactive. - -Extra make steps: - - The simple make compiles a version of bc with fixed parameters - for the recursive multiplication algorithm. The fixed parameter - is the number of digits where a sequential algorithm is used - instead of the recursive algorithm. It is set to a value that - is known good on a couple of machines. (Sparc Ultra 10, Pentium - II, 450.) I'm calling this point the crossover point. - - To make a version of bc with a custom crossover point for your - machine, do the following steps: - - make timetest - make - - The timetest step takes a minimum of 10 minutes to complete. - - --------- Original comp.sources.reviewed README -------- - -Program: GNU bc -Author: Philip A. Nelson -E-mail: phil@cs.wwu.edu -OS: UNIX (BSD, System V, MINIX, POSIX) -Copying: GNU GPL version 2 -Copyright holder: Free Software Foundation, Inc. -Version: bc version 1.01 -Required: vsprintf and vfprintf routines. -Machines: It has been compiled and run on the following environments: - BSD4.3 (VAX 11) - MINIX 1.5 (IBM PC, both K&R and ANSI compilers) - MINIX 1.5 (pc532) - SUN-OS 4.1 (SUN 3 and SUN 4) - SVR3V5 (Motorola 68K) - SVR3.2 (3B2) - SVR4.0.2 (a 386 box) - ULTRIX 4.1 (DEC 5000) - UTS (Amdahl) - -bc is an arbitrary precision numeric processing language. Syntax is -similar to C, but differs in many substantial areas. It supports -interactive execution of statements. bc is a utility included in the -POSIX P1003.2/D11 draft standard. - -This version was written to be a POSIX compliant bc processor with -several extensions to the draft standard. Option flags are available -to cause warning or rejection of the extensions to the POSIX standard. -For those who want only POSIX bc with no extensions, a grammar is -provided for exactly the language described in the POSIX document. -The grammar (sbc.y) comes from the POSIX document. The Makefile -contains rules to make sbc. (for Standard BC) - -Since the POSIX document does not specify how bc must be implemented, -this version does not use the historical method of having bc be a -compiler for the dc calculator. This version has a single executable -that both compiles the language and runs the a resulting "byte code". -The "byte code" is NOT the dc language. - -Also, included in the initial distribution is the library file -vfprintf.c for MINIX systems. My minix 1.5 did not have this file. -Also, you should verify that vsprintf.c works correctly on your -system. - -The extensions add some features I think are missing. The major -changes and additions for bc are (a) names are allowed to be full -identifiers ([a-z][a-z0-9_]*), (b) addition of the &&, ||, and ! -operators, (c) allowing comparison and boolean operations in any -expression, (d) addition of an else clause to the if statement, (e) -addition of a new standard function "read()" that reads a number from -the standard input under program control, (f) passing of arrays as -parameters by variable, (g) addition of the "halt" statement that is -an executable statement unlike the quit (i.e. "if (1 == 0) quit" will -halt bc but "if (1 == 0) halt" will not halt bc.), and (h) the -addition of the special variable "last" that is assigned the value of -each print as the number is printed. ------------------------------------------------------------------------ diff --git a/contrib/bc/Test/BUG.bc b/contrib/bc/Test/BUG.bc deleted file mode 100644 index 254eefe..0000000 --- a/contrib/bc/Test/BUG.bc +++ /dev/null @@ -1,40 +0,0 @@ -/* <--- bug.bc ---><--- bug.bc ---><--- bug.bc ---><--- bug.bc ---> */ - -/* - * See the file "signum" for a description and reference for this - * program. - * - * THIS BUG IS *NOT* IN GNU BC!!! - * - */ - -obase=16 -ibase=16 -x=1A8F5C99605AE52 /* dividend */ -y=BB0B404 /* divisor */ -q=245A07AD /* (correct) quotient */ -r=147EB9E /* (correct) remainder */ -"Base 16 -" -"x = "; x /* output numbers just to be sure... */ -"y = "; y -"quo = "; q -"rem = "; r -"x/y = "; x/y /* watch this result! */ -"x%y = "; x%y /* watch this result! */ -"y*q+r= "; y*q+r /* check quotient & remainder */ -/* - * Do the same thing in base 10: - */ -" -Base 10 -" -ibase=A -obase=10 -"x = "; x /* output numbers just to be sure... */ -"y = "; y -"q = "; q -"r = "; r -"x/y = "; x/y /* watch this result! */ -"x%y = "; x%y /* watch this result! */ -"y*q+r= "; y*q+r /* check quotient & remainder */ diff --git a/contrib/bc/Test/array.b b/contrib/bc/Test/array.b deleted file mode 100644 index a0341ec..0000000 --- a/contrib/bc/Test/array.b +++ /dev/null @@ -1,14 +0,0 @@ -"This tests arrays! -" -define p(x,y) { - auto i; - for (i=x; i<y; i++) a[i]; -} - -for (i=0; i<10; i++) a[i] = i; -j = p(0,10); - -for (i=1000; i<1030; i++) a[i] = i; -j = p(1000,1030); -j = p(0,10); - diff --git a/contrib/bc/Test/arrayp.b b/contrib/bc/Test/arrayp.b deleted file mode 100644 index 3f3ca50..0000000 --- a/contrib/bc/Test/arrayp.b +++ /dev/null @@ -1,30 +0,0 @@ -"This tests arrays! -" -define p(a[],x,y) { - auto i; - for (i=x; i<y; i++) a[i]; -} - -define m(a[],x,y) { - auto i; - for (i=x; i<y; i++) a[i] = i; -} - -define m1(*a[],x,y) { - auto i; - print "m1\n" - for (i=x; i<y; i++) a[i] = i; -} - -for (i=0; i<10; i++) a[i] = i; -j = p(a[],0,10); - -j = m(b[],0,10); -j = p(b[],0,10); - -print "---\n"; -j = m1(b[],0,10); -j = p(b[],0,10); - -quit - diff --git a/contrib/bc/Test/aryprm.b b/contrib/bc/Test/aryprm.b deleted file mode 100644 index 9d3f95b..0000000 --- a/contrib/bc/Test/aryprm.b +++ /dev/null @@ -1,16 +0,0 @@ -define p ( x[] ) { - auto i; - for (i=0; i<10; i++) x[i]; -} - -define m ( x[] ) { - auto i; - for (i=0; i<10; i++) x[i] *= 2; -} - -scale = 20; -for (i=0; i<10; i++) a[i] = sqrt(i); - -p(a[]); -m(a[]); -p(a[]); diff --git a/contrib/bc/Test/atan.b b/contrib/bc/Test/atan.b deleted file mode 100644 index e742279..0000000 --- a/contrib/bc/Test/atan.b +++ /dev/null @@ -1,5 +0,0 @@ -for (a=0; a<1000; a+=2) x=a(a) -x -for (a=0; a<2; a+=.01) x=a(a) -x -quit diff --git a/contrib/bc/Test/checklib.b b/contrib/bc/Test/checklib.b deleted file mode 100644 index 44c1fac..0000000 --- a/contrib/bc/Test/checklib.b +++ /dev/null @@ -1,109 +0,0 @@ -define t (x,y,d,s,t) { - auto u, v, w, i, b, c; - - if (s >= t) { - "Bad Scales. Try again. -"; return; - } - - for (i = x; i < y; i += d) { - scale = s; - u = f(i); - scale = t; - v = f(i); - scale = s; - w = v / 1; - b += 1; - if (u != w) { - c += 1; -" -Failed: -" - " index = "; i; - " val1 = "; u; - " val2 = "; v; -" -" - } - } - -" -Total tests: "; b; -" -Total failures: "; c; -" -Percent failed: "; scale = 2; c*100/b; - -} - -/* - b = begining scale value, - l = limit scale value, - i = increment scale value. - - if b is set to a non-zero value before this file is executed, - b, l and i are not reset. -*/ - -if (b == 0) { b = 10; l = 61; i = 10; } - -" -Checking e(x)" -define f(x) { - return (e(x)) -} -for (s=10; s<l; s=s+i) { -" -scale = "; s -j = t(0,200,1,s,s+4) -} - -" -Checking l(x)" -define f(x) { - return (l(x)) -} -for (s=10; s<l; s=s+i) { -" -scale = "; s -j = t(1,10000,25,s,s+4) -} - -" -Checking s(x)" -define f(x) { - return (s(x)) -} -for (s=10; s<l; s=s+i) { -" -scale = "; s -j = t(0,8*a(1),.01,s,s+4) -} - -" -Checking a(x)" -define f(x) { - return (a(x)) -} -for (s=10; s<l; s=s+i) { -" -scale = "; s -j = t(-1000,1000,10,s,s+4) -} - -" -Checking j(n,x)" -define f(x) { - return (j(n,x)) -} -for (s=10; s<l; s=s+i) { -" -n=0, scale = "; s -n=0 -j = t(0,30,.1,s,s+4) -" -n=1, scale = "; s -n=1 -j = t(0,30,.1,s,s+4) -} - diff --git a/contrib/bc/Test/div.b b/contrib/bc/Test/div.b deleted file mode 100644 index 3c7d377..0000000 --- a/contrib/bc/Test/div.b +++ /dev/null @@ -1,8 +0,0 @@ -scale = 20 -a=2/3 -for (i=0; i<1000; i++) { - for (j=1; j<100; j++) b=a/j -} -b -quit - diff --git a/contrib/bc/Test/exp.b b/contrib/bc/Test/exp.b deleted file mode 100644 index 92c482c..0000000 --- a/contrib/bc/Test/exp.b +++ /dev/null @@ -1,3 +0,0 @@ -for (a=0; a<180; a+=.4) x=e(a) -x -quit diff --git a/contrib/bc/Test/fact.b b/contrib/bc/Test/fact.b deleted file mode 100644 index 995a26d..0000000 --- a/contrib/bc/Test/fact.b +++ /dev/null @@ -1,12 +0,0 @@ -define f (x) { - - if (x<=1) return(1) - return (f(x-1)*x) -} - -for (a=1; a<600; a++) b=f(a) -" -" -"b=";b -quit - diff --git a/contrib/bc/Test/jn.b b/contrib/bc/Test/jn.b deleted file mode 100644 index a4e0624..0000000 --- a/contrib/bc/Test/jn.b +++ /dev/null @@ -1,6 +0,0 @@ -scale = 50 -for (a=0; a<=100; a += 20) { - for (b=0; b<=300; b += 20) x=j(a,b) - x -} -quit diff --git a/contrib/bc/Test/ln.b b/contrib/bc/Test/ln.b deleted file mode 100644 index cd00232..0000000 --- a/contrib/bc/Test/ln.b +++ /dev/null @@ -1,4 +0,0 @@ -scale = 60 -for (a=1; a<100000000000000000000000000000000000000; a = a*2) x=l(a) -x -quit diff --git a/contrib/bc/Test/mul.b b/contrib/bc/Test/mul.b deleted file mode 100644 index 722086f..0000000 --- a/contrib/bc/Test/mul.b +++ /dev/null @@ -1,13 +0,0 @@ -scale = 20 -for (i=0; i<10000; i++) { - for (j=1; j<100; j++) b=i*j -} -b -for (i=0; i<10000; i++) { - for (j=1000000000000000000000000000000000000000000000000000000000000000000; \ - j<1000000000000000000000000000000000000000000000000000000000000000100; \ - j++) b=i*j -} -b -quit - diff --git a/contrib/bc/Test/raise.b b/contrib/bc/Test/raise.b deleted file mode 100644 index ec6929d..0000000 --- a/contrib/bc/Test/raise.b +++ /dev/null @@ -1,7 +0,0 @@ -for (i=0; i<1000; i++) a = 2^i; -a -for (i=3000; i<3100; i++) a = 3^i; -a -for (i=200; i<220; i++) a = (4^100)^i; -a -quit diff --git a/contrib/bc/Test/signum b/contrib/bc/Test/signum deleted file mode 100644 index 9e27d2d..0000000 --- a/contrib/bc/Test/signum +++ /dev/null @@ -1,87 +0,0 @@ - - - -/* From gnu@cygnus.com Wed Jul 14 13:46:44 1993 -Return-Path: <gnu@cygnus.com> -To: phil@cs.wwu.edu, gnu@cygnus.com -Subject: bc/dc - no rest for the wicked -Date: Tue, 06 Jul 93 19:12:40 -0700 -From: gnu@cygnus.com - -GNU bc 1.02 passes all these tests. Can you add the test to the distribution? -Putting it into a DejaGnu test case for GNU bc would be a great thing, too. -(I haven't seen the Signum paper, maybe you can dig it out.) - - John Gilmore - Cygnus Support - -------- Forwarded Message - -Date: Tue, 6 Jul 93 08:45:48 PDT -From: uunet!Eng.Sun.COM!David.Hough@uunet.UU.NET (David Hough) -Message-Id: <9307061545.AA14477@dgh.Eng.Sun.COM> -To: numeric-interest@validgh.com -Subject: bc/dc - no rest for the wicked - -Steve Sommars sent me a bc script which reproduces ALL the test cases from -Dittmer's paper. Neither SunOS 5.2 on SPARC nor 5.1 on x86 come out clean. -Anybody else who has fixed all the bugs would be justified in -bragging about it here. */ - - -/*Ingo Dittmer, ACM Signum, April 1993, page 8-11*/ -define g(x,y,z){ - auto a - a=x%y - if(a!=z){ -" -x=";x - "y=";y - "Should be ";z - "was ";a - } -} - -/*Table 1*/ -g=g(53894380494284,9980035577,2188378484) -g=g(47907874973121,9980035577,3704203521) -g=g(76850276401922,9980035577,4002459022) -g=g(85830854846664,9980035577,2548884464) -g=g(43915353970066,9980035577,3197431266) -g=g(35930746212825,9980035577,2618135625) -g=g(51900604524715,9980035577,4419524315) -g=g(87827018005068,9980035577,2704927468) -g=g(57887902441764,9980035577,3696095164) -g=g(96810941031110,9980035577,4595934210) - -/*Table 2*/ -g=g(86833646827370,9980035577,7337307470) -g=g(77850880592435,9980035577,6603091835) -g=g(84836601050323,9980035577,6298645823) -g=g(85835110016211,9980035577,6804054011) -g=g(94817143459192,9980035577,6805477692) -g=g(94818870293481,9980035577,8532311981) -g=g(91823235571154,9980035577,6908262754) -g=g(59885451951796,9980035577,5238489796) -g=g(80844460893239,9980035577,6172719539) -g=g(67869195894693,9980035577,4953971093) -g=g(95813990985202,9980035577,5649446002) - -/*Skip Table 3, duplicate of line 1, table 1*/ - -/*Table 4*/ -g=g(28420950579078013018256253301,17987947258,16619542243) -g=g(12015118977201790601658257234,16687885701,8697335297) -g=g(14349070374946789715188912007,13712994561,3605141129) -g=g(61984050238512905451986475027,13337935089,5296182558) -g=g(86189707791214681859449918641,17837971389,14435206830) -g=g(66747908181102582528134773954,19462997965,8615839889) - -/*Table 6*/ -g=g(4999253,9998,253) -g=g(8996373,9995,873) - - -/* Added by Phil Nelson..... */ -"end of tests -" diff --git a/contrib/bc/Test/sine.b b/contrib/bc/Test/sine.b deleted file mode 100644 index 18c4b57..0000000 --- a/contrib/bc/Test/sine.b +++ /dev/null @@ -1,5 +0,0 @@ -for (i=0; i<8*a(1); i=i+.01) x=s(i) -x -for (i=i; i<16*a(1); i=i+.01) x=s(i+.1234123412341234) -x -quit diff --git a/contrib/bc/Test/sqrt.b b/contrib/bc/Test/sqrt.b deleted file mode 100644 index 3fb548c..0000000 --- a/contrib/bc/Test/sqrt.b +++ /dev/null @@ -1,13 +0,0 @@ -scale = 5 -for (a=1; a<500; a++) r=sqrt(a) -r -scale = 10 -for (a=1; a<500; a++) r=sqrt(a) -r -scale = 25 -for (a=1; a<500; a++) r=sqrt(a) -r -scale = 40 -for (a=1; a<500; a++) r=sqrt(a) -r -quit diff --git a/contrib/bc/Test/sqrt1.b b/contrib/bc/Test/sqrt1.b deleted file mode 100644 index c3ca269..0000000 --- a/contrib/bc/Test/sqrt1.b +++ /dev/null @@ -1,13 +0,0 @@ -for (j=0; j<10; j++) { - a = .9; - b = .9+j; - scale = 2; - for (i=0; i<90; i++) { - scale += 1; - a /= 10; - b += a; - x = sqrt(b); - } - x; -} -quit diff --git a/contrib/bc/Test/sqrt2.b b/contrib/bc/Test/sqrt2.b deleted file mode 100644 index bd0eaad..0000000 --- a/contrib/bc/Test/sqrt2.b +++ /dev/null @@ -1,10 +0,0 @@ -scale = 20 -for (a=1; a<5000; a += 1) r=sqrt(a) -r -for (a=1; a<50000; a += 100) r=sqrt(a) -r -for (a=1; a<500000; a+=1000) r=sqrt(a) -r -for (a=1; a<5000000; a+=10000) r=sqrt(a) -r -quit diff --git a/contrib/bc/Test/testfn.b b/contrib/bc/Test/testfn.b deleted file mode 100644 index 7578fc5..0000000 --- a/contrib/bc/Test/testfn.b +++ /dev/null @@ -1,47 +0,0 @@ -/* This function "t" tests the function "f" to see if computing at - two different scales has much effect on the accuracy. - test from f(x) to f(y) incrementing the index by d. f(i) is - computed at two scales, scale s and then scale t, where t>s. - the result from scale t is divided by 1 at scale s and the - results are compared. If they are different, the function is - said to have failed. It will then print out the value of i - (called index) and the two original values val1 (scale s) and - val2 (scale t) */ - -define t (x,y,d,s,t) { - auto u, v, w, i, b, c; - - if (s >= t) { - "Bad Scales. Try again. -"; return; - } - - for (i = x; i < y; i += d) { - scale = s; - u = f(i); - scale = t; - v = f(i); - scale = s; - w = v / 1; - b += 1; - if (u != w) { - c += 1; -" -Failed: -" - " index = "; i; - " val1 = "; u; - " val2 = "; v; -" -" - } - } - -" -Total tests: "; b; -" -Total failures: "; c; -" -Percent failed: "; scale = 2; c*100/b; - -} diff --git a/contrib/bc/Test/timetest b/contrib/bc/Test/timetest deleted file mode 100755 index 1a4d0ea..0000000 --- a/contrib/bc/Test/timetest +++ /dev/null @@ -1,16 +0,0 @@ -#!/bin/sh -# -# Time the functions. -# -SYSBC=/usr/bin/bc -if [ x$BC = x ] ; then - BC=../bc/bc -fi -for file in exp.b ln.b sine.b atan.b jn.b mul.b div.b raise.b sqrt.b -do -for prog in $BC $SYSBC $OTHERBC -do -echo Timing $file with $prog -time $prog -l $file -done -done diff --git a/contrib/bc/acconfig.h b/contrib/bc/acconfig.h deleted file mode 100644 index ff17f82..0000000 --- a/contrib/bc/acconfig.h +++ /dev/null @@ -1,24 +0,0 @@ -/* PACKAGE name */ -#undef PACKAGE - -/* Package VERSION number */ -#undef VERSION - -/* VERSION number for DC target*/ -#undef DC_VERSION - -/* COPYRIGHT notice for DC target */ -#undef DC_COPYRIGHT - -/* COPYRIGHT notice for BC target */ -#undef BC_COPYRIGHT - -/* Define to use the readline library. */ -#undef READLINE - -/* Define to use the BSD libedit library. */ -#undef LIBEDIT - -/* Define to `size_t' if <sys/types.h> and <stddef.h> don't define. */ -#undef ptrdiff_t - diff --git a/contrib/bc/aclocal.m4 b/contrib/bc/aclocal.m4 deleted file mode 100644 index 102dc3e..0000000 --- a/contrib/bc/aclocal.m4 +++ /dev/null @@ -1,136 +0,0 @@ -dnl aclocal.m4 generated automatically by aclocal 1.4 - -dnl Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -dnl This file is free software; the Free Software Foundation -dnl gives unlimited permission to copy and/or distribute it, -dnl with or without modifications, as long as this notice is preserved. - -dnl This program is distributed in the hope that it will be useful, -dnl but WITHOUT ANY WARRANTY, to the extent permitted by law; without -dnl even the implied warranty of MERCHANTABILITY or FITNESS FOR A -dnl PARTICULAR PURPOSE. - -# Do all the work for Automake. This macro actually does too much -- -# some checks are only needed if your package does certain things. -# But this isn't really a big deal. - -# serial 1 - -dnl Usage: -dnl AM_INIT_AUTOMAKE(package,version, [no-define]) - -AC_DEFUN(AM_INIT_AUTOMAKE, -[AC_REQUIRE([AC_PROG_INSTALL]) -PACKAGE=[$1] -AC_SUBST(PACKAGE) -VERSION=[$2] -AC_SUBST(VERSION) -dnl test to see if srcdir already configured -if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then - AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) -fi -ifelse([$3],, -AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) -AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])) -AC_REQUIRE([AM_SANITY_CHECK]) -AC_REQUIRE([AC_ARG_PROGRAM]) -dnl FIXME This is truly gross. -missing_dir=`cd $ac_aux_dir && pwd` -AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) -AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir) -AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) -AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) -AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir) -AC_REQUIRE([AC_PROG_MAKE_SET])]) - -# -# Check to make sure that the build environment is sane. -# - -AC_DEFUN(AM_SANITY_CHECK, -[AC_MSG_CHECKING([whether build environment is sane]) -# Just in case -sleep 1 -echo timestamp > conftestfile -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` - if test "[$]*" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftestfile` - fi - if test "[$]*" != "X $srcdir/configure conftestfile" \ - && test "[$]*" != "X conftestfile $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken -alias in your environment]) - fi - - test "[$]2" = conftestfile - ) -then - # Ok. - : -else - AC_MSG_ERROR([newly created file is older than distributed files! -Check your system clock]) -fi -rm -f conftest* -AC_MSG_RESULT(yes)]) - -dnl AM_MISSING_PROG(NAME, PROGRAM, DIRECTORY) -dnl The program must properly implement --version. -AC_DEFUN(AM_MISSING_PROG, -[AC_MSG_CHECKING(for working $2) -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if ($2 --version) < /dev/null > /dev/null 2>&1; then - $1=$2 - AC_MSG_RESULT(found) -else - $1="$3/missing $2" - AC_MSG_RESULT(missing) -fi -AC_SUBST($1)]) - -# Like AC_CONFIG_HEADER, but automatically create stamp file. - -AC_DEFUN(AM_CONFIG_HEADER, -[AC_PREREQ([2.12]) -AC_CONFIG_HEADER([$1]) -dnl When config.status generates a header, we must update the stamp-h file. -dnl This file resides in the same directory as the config header -dnl that is generated. We must strip everything past the first ":", -dnl and everything past the last "/". -AC_OUTPUT_COMMANDS(changequote(<<,>>)dnl -ifelse(patsubst(<<$1>>, <<[^ ]>>, <<>>), <<>>, -<<test -z "<<$>>CONFIG_HEADERS" || echo timestamp > patsubst(<<$1>>, <<^\([^:]*/\)?.*>>, <<\1>>)stamp-h<<>>dnl>>, -<<am_indx=1 -for am_file in <<$1>>; do - case " <<$>>CONFIG_HEADERS " in - *" <<$>>am_file "*<<)>> - echo timestamp > `echo <<$>>am_file | sed -e 's%:.*%%' -e 's%[^/]*$%%'`stamp-h$am_indx - ;; - esac - am_indx=`expr "<<$>>am_indx" + 1` -done<<>>dnl>>) -changequote([,]))]) - - -dnl AM_PROG_LEX -dnl Look for flex, lex or missing, then run AC_PROG_LEX and AC_DECL_YYTEXT -AC_DEFUN(AM_PROG_LEX, -[missing_dir=ifelse([$1],,`cd $ac_aux_dir && pwd`,$1) -AC_CHECK_PROGS(LEX, flex lex, "$missing_dir/missing flex") -AC_PROG_LEX -AC_DECL_YYTEXT]) - diff --git a/contrib/bc/bc/Makefile.am b/contrib/bc/bc/Makefile.am deleted file mode 100644 index 9187339..0000000 --- a/contrib/bc/bc/Makefile.am +++ /dev/null @@ -1,42 +0,0 @@ -## Process this file with automake to produce Makefile.in -bin_PROGRAMS = bc - -bc_SOURCES = main.c bc.y scan.l execute.c load.c storage.c util.c global.c - -EXTRA_DIST = bc.h bcdefs.h const.h fix-libmath_h global.h libmath.b proto.h \ - sbc.y -noinst_HEADERS = libmath.h - -DISTCLEANFILES = sbc sbc.c sbc.h - -MAINTAINERCLEANFILES = Makefile.in libmath.h bc.c bc.h scan.c - -INCLUDES = -I$(srcdir) -I$(srcdir)/../h -LIBBC = ../lib/libbc.a -LIBL = @LEXLIB@ -LDADD = $(LIBBC) $(LIBL) @READLINELIB@ - -YFLAGS = -d - -CFLAGS = @CFLAGS@ -Wall -funsigned-char - -$(PROGRAMS): $(LIBBC) - -scan.o: bc.h -global.o: libmath.h - -libmath.h: libmath.b - echo '{0}' > libmath.h - $(MAKE) fbc - ./fbc -c $(srcdir)/libmath.b </dev/null >libmath.h - $(srcdir)/fix-libmath_h - rm -f ./fbc - -fbcOBJ = main.o bc.o scan.o execute.o global.o load.o storage.o util.o -fbc: $(fbcOBJ) - $(LINK) $(fbcOBJ) $(LIBBC) $(LIBL) $(READLINELIB) $(LIBS) - -sbcOBJ = main.o sbc.o scan.o execute.o global.o load.o storage.o util.o -sbc.o: sbc.c -sbc: $(sbcOBJ) - $(LINK) $(sbcOBJ) $(LIBBC) $(LIBL) $(READLINELIB) $(LIBS) diff --git a/contrib/bc/bc/Makefile.in b/contrib/bc/bc/Makefile.in deleted file mode 100644 index 18ebce0..0000000 --- a/contrib/bc/bc/Makefile.in +++ /dev/null @@ -1,345 +0,0 @@ -# Makefile.in generated automatically by automake 1.4 from Makefile.am - -# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include - -DESTDIR = - -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ - -top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -transform = @program_transform_name@ - -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -CC = @CC@ -LEX = @LEX@ -MAKEINFO = @MAKEINFO@ -PACKAGE = @PACKAGE@ -RANLIB = @RANLIB@ -READLINELIB = @READLINELIB@ -VERSION = @VERSION@ -YACC = @YACC@ - -bin_PROGRAMS = bc - -bc_SOURCES = main.c bc.y scan.l execute.c load.c storage.c util.c global.c - -EXTRA_DIST = bc.h bcdefs.h const.h fix-libmath_h global.h libmath.b proto.h sbc.y - -noinst_HEADERS = libmath.h - -DISTCLEANFILES = sbc sbc.c sbc.h - -MAINTAINERCLEANFILES = Makefile.in libmath.h bc.c bc.h scan.c - -INCLUDES = -I$(srcdir) -I$(srcdir)/../h -LIBBC = ../lib/libbc.a -LIBL = @LEXLIB@ -LDADD = $(LIBBC) $(LIBL) @READLINELIB@ - -YFLAGS = -d - -CFLAGS = @CFLAGS@ -Wall -funsigned-char - -fbcOBJ = main.o bc.o scan.o execute.o global.o load.o storage.o util.o - -sbcOBJ = main.o sbc.o scan.o execute.o global.o load.o storage.o util.o -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = ../config.h -CONFIG_CLEAN_FILES = -PROGRAMS = $(bin_PROGRAMS) - - -DEFS = @DEFS@ -I. -I$(srcdir) -I.. -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -bc_OBJECTS = main.o bc.o scan.o execute.o load.o storage.o util.o \ -global.o -bc_LDADD = $(LDADD) -bc_DEPENDENCIES = ../lib/libbc.a -bc_LDFLAGS = -LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ -LEXLIB = @LEXLIB@ -COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ -HEADERS = $(noinst_HEADERS) - -DIST_COMMON = Makefile.am Makefile.in bc.c scan.c - - -DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) - -TAR = tar -GZIP_ENV = --best -SOURCES = $(bc_SOURCES) -OBJECTS = $(bc_OBJECTS) - -all: all-redirect -.SUFFIXES: -.SUFFIXES: .S .c .l .o .s .y -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps bc/Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - - -mostlyclean-binPROGRAMS: - -clean-binPROGRAMS: - -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) - -distclean-binPROGRAMS: - -maintainer-clean-binPROGRAMS: - -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(bindir) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - if test -f $$p; then \ - echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ - $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - else :; fi; \ - done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - list='$(bin_PROGRAMS)'; for p in $$list; do \ - rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - done - -.c.o: - $(COMPILE) -c $< - -.s.o: - $(COMPILE) -c $< - -.S.o: - $(COMPILE) -c $< - -mostlyclean-compile: - -rm -f *.o core *.core - -clean-compile: - -distclean-compile: - -rm -f *.tab.c - -maintainer-clean-compile: - -bc: $(bc_OBJECTS) $(bc_DEPENDENCIES) - @rm -f bc - $(LINK) $(bc_LDFLAGS) $(bc_OBJECTS) $(bc_LDADD) $(LIBS) -.l.c: - $(LEX) $(AM_LFLAGS) $(LFLAGS) $< && mv $(LEX_OUTPUT_ROOT).c $@ -.y.c: - $(YACC) $(AM_YFLAGS) $(YFLAGS) $< && mv y.tab.c $*.c - if test -f y.tab.h; then \ - if cmp -s y.tab.h $*.h; then rm -f y.tab.h; else mv y.tab.h $*.h; fi; \ - else :; fi -bc.h: bc.c - - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - here=`pwd` && cd $(srcdir) \ - && mkid -f$$here/ID $$unique $(LISP) - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) - -mostlyclean-tags: - -clean-tags: - -distclean-tags: - -rm -f TAGS ID - -maintainer-clean-tags: - -distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) - -subdir = bc - -distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - d=$(srcdir); \ - if test -d $$d/$$file; then \ - cp -pr $$/$$file $(distdir)/$$file; \ - else \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file || :; \ - fi; \ - done -bc.o: bc.c bcdefs.h ../config.h const.h ../h/number.h global.h proto.h -execute.o: execute.c bcdefs.h ../config.h const.h ../h/number.h global.h \ - proto.h -global.o: global.c bcdefs.h ../config.h const.h ../h/number.h global.h \ - libmath.h -load.o: load.c bcdefs.h ../config.h const.h ../h/number.h global.h \ - proto.h -main.o: main.c bcdefs.h ../config.h const.h ../h/number.h global.h \ - proto.h ../h/getopt.h -scan.o: scan.c bcdefs.h ../config.h const.h ../h/number.h bc.h global.h \ - proto.h -storage.o: storage.c bcdefs.h ../config.h const.h ../h/number.h global.h \ - proto.h -util.o: util.c bcdefs.h ../config.h const.h ../h/number.h global.h \ - proto.h - -info-am: -info: info-am -dvi-am: -dvi: dvi-am -check-am: all-am -check: check-am -installcheck-am: -installcheck: installcheck-am -install-exec-am: install-binPROGRAMS -install-exec: install-exec-am - -install-data-am: -install-data: install-data-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -install: install-am -uninstall-am: uninstall-binPROGRAMS -uninstall: uninstall-am -all-am: Makefile $(PROGRAMS) $(HEADERS) -all-redirect: all-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install -installdirs: - $(mkinstalldirs) $(DESTDIR)$(bindir) - - -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) - -rm -f config.cache config.log stamp-h stamp-h[0-9]* - -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) - -maintainer-clean-generic: - -test -z "scanlbchbcc$(MAINTAINERCLEANFILES)" || rm -f scanl bch bcc $(MAINTAINERCLEANFILES) -mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \ - mostlyclean-tags mostlyclean-generic - -mostlyclean: mostlyclean-am - -clean-am: clean-binPROGRAMS clean-compile clean-tags clean-generic \ - mostlyclean-am - -clean: clean-am - -distclean-am: distclean-binPROGRAMS distclean-compile distclean-tags \ - distclean-generic clean-am - -distclean: distclean-am - -maintainer-clean-am: maintainer-clean-binPROGRAMS \ - maintainer-clean-compile maintainer-clean-tags \ - maintainer-clean-generic distclean-am - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -maintainer-clean: maintainer-clean-am - -.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ -maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ -mostlyclean-compile distclean-compile clean-compile \ -maintainer-clean-compile tags mostlyclean-tags distclean-tags \ -clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \ -check-am installcheck-am installcheck install-exec-am install-exec \ -install-data-am install-data install-am install uninstall-am uninstall \ -all-redirect all-am all installdirs mostlyclean-generic \ -distclean-generic clean-generic maintainer-clean-generic clean \ -mostlyclean distclean maintainer-clean - - -$(PROGRAMS): $(LIBBC) - -scan.o: bc.h -global.o: libmath.h - -libmath.h: libmath.b - echo '{0}' > libmath.h - $(MAKE) fbc - ./fbc -c $(srcdir)/libmath.b </dev/null >libmath.h - $(srcdir)/fix-libmath_h - rm -f ./fbc -fbc: $(fbcOBJ) - $(LINK) $(fbcOBJ) $(LIBBC) $(LIBL) $(READLINELIB) $(LIBS) -sbc.o: sbc.c -sbc: $(sbcOBJ) - $(LINK) $(sbcOBJ) $(LIBBC) $(LIBL) $(READLINELIB) $(LIBS) - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/contrib/bc/bc/bc.y b/contrib/bc/bc/bc.y deleted file mode 100644 index 403e326..0000000 --- a/contrib/bc/bc/bc.y +++ /dev/null @@ -1,654 +0,0 @@ -%{ -/* bc.y: The grammar for a POSIX compatable bc processor with some - extensions to the language. */ - -/* This file is part of GNU bc. - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to: - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#include "bcdefs.h" -#include "global.h" -#include "proto.h" -%} - -%start program - -%union { - char *s_value; - char c_value; - int i_value; - arg_list *a_value; - } - -/* Extensions over POSIX bc. - a) NAME was LETTER. This grammar allows longer names. - Single letter names will still work. - b) Relational_expression allowed only one comparison. - This grammar has added boolean expressions with - && (and) || (or) and ! (not) and allowed all of them in - full expressions. - c) Added an else to the if. - d) Call by variable array parameters - e) read() procedure that reads a number under program control from stdin. - f) halt statement that halts the the program under program control. It - is an executed statement. - g) continue statement for for loops. - h) optional expressions in the for loop. - i) print statement to print multiple numbers per line. - j) warranty statement to print an extended warranty notice. - j) limits statement to print the processor's limits. -*/ - -%token <i_value> ENDOFLINE AND OR NOT -%token <s_value> STRING NAME NUMBER -/* '-', '+' are tokens themselves */ -/* '=', '+=', '-=', '*=', '/=', '%=', '^=' */ -%token <c_value> ASSIGN_OP -/* '==', '<=', '>=', '!=', '<', '>' */ -%token <s_value> REL_OP -/* '++', '--' */ -%token <c_value> INCR_DECR -/* 'define', 'break', 'quit', 'length' */ -%token <i_value> Define Break Quit Length -/* 'return', 'for', 'if', 'while', 'sqrt', 'else' */ -%token <i_value> Return For If While Sqrt Else -/* 'scale', 'ibase', 'obase', 'auto', 'read' */ -%token <i_value> Scale Ibase Obase Auto Read -/* 'warranty', 'halt', 'last', 'continue', 'print', 'limits' */ -%token <i_value> Warranty, Halt, Last, Continue, Print, Limits -/* 'history' */ -%token <i_value> UNARY_MINUS HistoryVar - -/* Types of all other things. */ -%type <i_value> expression return_expression named_expression opt_expression -%type <c_value> '+' '-' '*' '/' '%' -%type <a_value> opt_parameter_list opt_auto_define_list define_list -%type <a_value> opt_argument_list argument_list -%type <i_value> program input_item semicolon_list statement_list -%type <i_value> statement function statement_or_error required_eol - -/* precedence */ -%left OR -%left AND -%nonassoc NOT -%left REL_OP -%right ASSIGN_OP -%left '+' '-' -%left '*' '/' '%' -%right '^' -%nonassoc UNARY_MINUS -%nonassoc INCR_DECR - -%% -program : /* empty */ - { - $$ = 0; - if (interactive && !quiet) - { - show_bc_version (); - welcome (); - } - } - | program input_item - ; -input_item : semicolon_list ENDOFLINE - { run_code (); } - | function - { run_code (); } - | error ENDOFLINE - { - yyerrok; - init_gen (); - } - ; -opt_newline : /* empty */ - | ENDOFLINE - { warn ("newline not allowed"); } - ; -semicolon_list : /* empty */ - { $$ = 0; } - | statement_or_error - | semicolon_list ';' statement_or_error - | semicolon_list ';' - ; -statement_list : /* empty */ - { $$ = 0; } - | statement_or_error - | statement_list ENDOFLINE - | statement_list ENDOFLINE statement_or_error - | statement_list ';' - | statement_list ';' statement - ; -statement_or_error : statement - | error statement - { $$ = $2; } - ; -statement : Warranty - { warranty (""); } - | Limits - { limits (); } - | expression - { - if ($1 & 2) - warn ("comparison in expression"); - if ($1 & 1) - generate ("W"); - else - generate ("p"); - } - | STRING - { - $$ = 0; - generate ("w"); - generate ($1); - free ($1); - } - | Break - { - if (break_label == 0) - yyerror ("Break outside a for/while"); - else - { - sprintf (genstr, "J%1d:", break_label); - generate (genstr); - } - } - | Continue - { - warn ("Continue statement"); - if (continue_label == 0) - yyerror ("Continue outside a for"); - else - { - sprintf (genstr, "J%1d:", continue_label); - generate (genstr); - } - } - | Quit - { exit (0); } - | Halt - { generate ("h"); } - | Return return_expression - { generate ("R"); } - | For - { - $1 = break_label; - break_label = next_label++; - } - '(' opt_expression ';' - { - if ($4 & 2) - warn ("Comparison in first for expression"); - if ($4 >= 0) - generate ("p"); - $4 = next_label++; - sprintf (genstr, "N%1d:", $4); - generate (genstr); - } - opt_expression ';' - { - if ($7 < 0) generate ("1"); - $7 = next_label++; - sprintf (genstr, "B%1d:J%1d:", $7, break_label); - generate (genstr); - $<i_value>$ = continue_label; - continue_label = next_label++; - sprintf (genstr, "N%1d:", continue_label); - generate (genstr); - } - opt_expression ')' - { - if ($10 & 2 ) - warn ("Comparison in third for expression"); - if ($10 & 16) - sprintf (genstr, "J%1d:N%1d:", $4, $7); - else - sprintf (genstr, "pJ%1d:N%1d:", $4, $7); - generate (genstr); - } - opt_newline statement - { - sprintf (genstr, "J%1d:N%1d:", - continue_label, break_label); - generate (genstr); - break_label = $1; - continue_label = $<i_value>9; - } - | If '(' expression ')' - { - $3 = if_label; - if_label = next_label++; - sprintf (genstr, "Z%1d:", if_label); - generate (genstr); - } - opt_newline statement opt_else - { - sprintf (genstr, "N%1d:", if_label); - generate (genstr); - if_label = $3; - } - | While - { - $1 = next_label++; - sprintf (genstr, "N%1d:", $1); - generate (genstr); - } - '(' expression - { - $4 = break_label; - break_label = next_label++; - sprintf (genstr, "Z%1d:", break_label); - generate (genstr); - } - ')' opt_newline statement - { - sprintf (genstr, "J%1d:N%1d:", $1, break_label); - generate (genstr); - break_label = $4; - } - | '{' statement_list '}' - { $$ = 0; } - | Print - { warn ("print statement"); } - print_list - ; -print_list : print_element - | print_element ',' print_list - ; -print_element : STRING - { - generate ("O"); - generate ($1); - free ($1); - } - | expression - { generate ("P"); } - ; -opt_else : /* nothing */ - | Else - { - warn ("else clause in if statement"); - $1 = next_label++; - sprintf (genstr, "J%d:N%1d:", $1, if_label); - generate (genstr); - if_label = $1; - } - opt_newline statement -function : Define NAME '(' opt_parameter_list ')' opt_newline - '{' required_eol opt_auto_define_list - { - /* Check auto list against parameter list? */ - check_params ($4,$9); - sprintf (genstr, "F%d,%s.%s[", - lookup($2,FUNCTDEF), - arg_str ($4), arg_str ($9)); - generate (genstr); - free_args ($4); - free_args ($9); - $1 = next_label; - next_label = 1; - } - statement_list /* ENDOFLINE */ '}' - { - generate ("0R]"); - next_label = $1; - } - ; -opt_parameter_list : /* empty */ - { $$ = NULL; } - | define_list - ; -opt_auto_define_list : /* empty */ - { $$ = NULL; } - | Auto define_list ENDOFLINE - { $$ = $2; } - | Auto define_list ';' - { $$ = $2; } - ; -define_list : NAME - { $$ = nextarg (NULL, lookup ($1,SIMPLE), FALSE);} - | NAME '[' ']' - { $$ = nextarg (NULL, lookup ($1,ARRAY), FALSE); } - | '*' NAME '[' ']' - { $$ = nextarg (NULL, lookup ($2,ARRAY), TRUE); } - | define_list ',' NAME - { $$ = nextarg ($1, lookup ($3,SIMPLE), FALSE); } - | define_list ',' NAME '[' ']' - { $$ = nextarg ($1, lookup ($3,ARRAY), FALSE); } - | define_list ',' '*' NAME '[' ']' - { $$ = nextarg ($1, lookup ($4,ARRAY), TRUE); } - ; -opt_argument_list : /* empty */ - { $$ = NULL; } - | argument_list - ; -argument_list : expression - { - if ($1 & 2) warn ("comparison in argument"); - $$ = nextarg (NULL,0,FALSE); - } - | NAME '[' ']' - { - sprintf (genstr, "K%d:", -lookup ($1,ARRAY)); - generate (genstr); - $$ = nextarg (NULL,1,FALSE); - } - | argument_list ',' expression - { - if ($3 & 2) warn ("comparison in argument"); - $$ = nextarg ($1,0,FALSE); - } - | argument_list ',' NAME '[' ']' - { - sprintf (genstr, "K%d:", -lookup ($3,ARRAY)); - generate (genstr); - $$ = nextarg ($1,1,FALSE); - } - ; - -/* Expression lval meanings! (Bits mean something!) - * 0 => Top op is assignment. - * 1 => Top op is not assignment. - * 2 => Comparison is somewhere in expression. - * 4 => Expression is in parenthesis. - * 16 => Empty optional expression. - */ - -opt_expression : /* empty */ - { - $$ = 16; - warn ("Missing expression in for statement"); - } - | expression - ; -return_expression : /* empty */ - { - $$ = 0; - generate ("0"); - } - | expression - { - if ($1 & 2) - warn ("comparison in return expresion"); - if (!($1 & 4)) - warn ("return expression requires parenthesis"); - } - ; -expression : named_expression ASSIGN_OP - { - if ($2 != '=') - { - if ($1 < 0) - sprintf (genstr, "DL%d:", -$1); - else - sprintf (genstr, "l%d:", $1); - generate (genstr); - } - } - expression - { - if ($4 & 2) warn("comparison in assignment"); - if ($2 != '=') - { - sprintf (genstr, "%c", $2); - generate (genstr); - } - if ($1 < 0) - sprintf (genstr, "S%d:", -$1); - else - sprintf (genstr, "s%d:", $1); - generate (genstr); - $$ = 0; - } - ; - | expression AND - { - warn("&& operator"); - $2 = next_label++; - sprintf (genstr, "DZ%d:p", $2); - generate (genstr); - } - expression - { - sprintf (genstr, "DZ%d:p1N%d:", $2, $2); - generate (genstr); - $$ = ($1 | $4) & ~4; - } - | expression OR - { - warn("|| operator"); - $2 = next_label++; - sprintf (genstr, "B%d:", $2); - generate (genstr); - } - expression - { - int tmplab; - tmplab = next_label++; - sprintf (genstr, "B%d:0J%d:N%d:1N%d:", - $2, tmplab, $2, tmplab); - generate (genstr); - $$ = ($1 | $4) & ~4; - } - | NOT expression - { - $$ = $2 & ~4; - warn("! operator"); - generate ("!"); - } - | expression REL_OP expression - { - $$ = 3; - switch (*($2)) - { - case '=': - generate ("="); - break; - - case '!': - generate ("#"); - break; - - case '<': - if ($2[1] == '=') - generate ("{"); - else - generate ("<"); - break; - - case '>': - if ($2[1] == '=') - generate ("}"); - else - generate (">"); - break; - } - } - | expression '+' expression - { - generate ("+"); - $$ = ($1 | $3) & ~4; - } - | expression '-' expression - { - generate ("-"); - $$ = ($1 | $3) & ~4; - } - | expression '*' expression - { - generate ("*"); - $$ = ($1 | $3) & ~4; - } - | expression '/' expression - { - generate ("/"); - $$ = ($1 | $3) & ~4; - } - | expression '%' expression - { - generate ("%"); - $$ = ($1 | $3) & ~4; - } - | expression '^' expression - { - generate ("^"); - $$ = ($1 | $3) & ~4; - } - | '-' expression %prec UNARY_MINUS - { - generate ("n"); - $$ = $2 & ~4; - } - | named_expression - { - $$ = 1; - if ($1 < 0) - sprintf (genstr, "L%d:", -$1); - else - sprintf (genstr, "l%d:", $1); - generate (genstr); - } - | NUMBER - { - int len = strlen($1); - $$ = 1; - if (len == 1 && *$1 == '0') - generate ("0"); - else if (len == 1 && *$1 == '1') - generate ("1"); - else - { - generate ("K"); - generate ($1); - generate (":"); - } - free ($1); - } - | '(' expression ')' - { $$ = $2 | 5; } - | NAME '(' opt_argument_list ')' - { - $$ = 1; - if ($3 != NULL) - { - sprintf (genstr, "C%d,%s:", - lookup ($1,FUNCT), - call_str ($3)); - free_args ($3); - } - else - { - sprintf (genstr, "C%d:", lookup ($1,FUNCT)); - } - generate (genstr); - } - | INCR_DECR named_expression - { - $$ = 1; - if ($2 < 0) - { - if ($1 == '+') - sprintf (genstr, "DA%d:L%d:", -$2, -$2); - else - sprintf (genstr, "DM%d:L%d:", -$2, -$2); - } - else - { - if ($1 == '+') - sprintf (genstr, "i%d:l%d:", $2, $2); - else - sprintf (genstr, "d%d:l%d:", $2, $2); - } - generate (genstr); - } - | named_expression INCR_DECR - { - $$ = 1; - if ($1 < 0) - { - sprintf (genstr, "DL%d:x", -$1); - generate (genstr); - if ($2 == '+') - sprintf (genstr, "A%d:", -$1); - else - sprintf (genstr, "M%d:", -$1); - } - else - { - sprintf (genstr, "l%d:", $1); - generate (genstr); - if ($2 == '+') - sprintf (genstr, "i%d:", $1); - else - sprintf (genstr, "d%d:", $1); - } - generate (genstr); - } - | Length '(' expression ')' - { generate ("cL"); $$ = 1;} - | Sqrt '(' expression ')' - { generate ("cR"); $$ = 1;} - | Scale '(' expression ')' - { generate ("cS"); $$ = 1;} - | Read '(' ')' - { - warn ("read function"); - generate ("cI"); $$ = 1; - } - ; -named_expression : NAME - { $$ = lookup($1,SIMPLE); } - | NAME '[' expression ']' - { - if ($3 > 1) warn("comparison in subscript"); - $$ = lookup($1,ARRAY); - } - | Ibase - { $$ = 0; } - | Obase - { $$ = 1; } - | Scale - { $$ = 2; } - | HistoryVar - { $$ = 3; - warn ("History variable"); - } - | Last - { $$ = 4; - warn ("Last variable"); - } - ; - - -required_eol : { warn ("End of line required"); } - | ENDOFLINE - | required_eol ENDOFLINE - { warn ("Too many end of lines"); } - ; - -%% - diff --git a/contrib/bc/bc/bcdefs.h b/contrib/bc/bc/bcdefs.h deleted file mode 100644 index 260cd12..0000000 --- a/contrib/bc/bc/bcdefs.h +++ /dev/null @@ -1,188 +0,0 @@ -/* bcdefs.h: The single file to include all constants and type definitions. */ - -/* This file is part of GNU bc. - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -/* Include the configuration file. */ -#include "config.h" - -/* Standard includes for all files. */ -#include <stdio.h> -#include <sys/types.h> -#include <ctype.h> -#ifdef HAVE_STRINGS_H -#include <strings.h> -#else -#include <string.h> -#endif -#ifdef HAVE_LIMITS_H -#include <limits.h> -#endif - -#if defined(LIBEDIT) -#include <histedit.h> -#endif - -#if defined(READLINE) -#include <readline/readline.h> -#include <readline/history.h> -#endif - -/* Include the other definitions. */ -#include "const.h" -#include "number.h" - -/* These definitions define all the structures used in - code and data storage. This includes the representation of - labels. The "guiding" principle is to make structures that - take a minimum of space when unused but can be built to contain - the full structures. */ - -/* Labels are first. Labels are generated sequentially in functions - and full code. They just "point" to a single bye in the code. The - "address" is the byte number. The byte number is used to get an - actual character pointer. */ - -typedef struct bc_label_group - { - long l_adrs [ BC_LABEL_GROUP ]; - struct bc_label_group *l_next; - } bc_label_group; - -/* Argument list. Recorded in the function so arguments can - be checked at call time. */ - -typedef struct arg_list - { - int av_name; - int arg_is_var; /* Extension ... variable parameters. */ - struct arg_list *next; - } arg_list; - -/* Each function has its own code segments and labels. There can be - no jumps between functions so labels are unique to a function. */ - -typedef struct - { - char f_defined; /* Is this function defined yet. */ - char *f_body; - int f_body_size; /* Size of body. Power of 2. */ - int f_code_size; - bc_label_group *f_label; - arg_list *f_params; - arg_list *f_autos; - } bc_function; - -/* Code addresses. */ -typedef struct { - int pc_func; - int pc_addr; - } program_counter; - - -/* Variables are "pushable" (auto) and thus we need a stack mechanism. - This is built into the variable record. */ - -typedef struct bc_var - { - bc_num v_value; - struct bc_var *v_next; - } bc_var; - - -/* bc arrays can also be "auto" variables and thus need the same - kind of stacking mechanisms. */ - -typedef struct bc_array_node - { - union - { - bc_num n_num [NODE_SIZE]; - struct bc_array_node *n_down [NODE_SIZE]; - } n_items; - } bc_array_node; - -typedef struct bc_array - { - bc_array_node *a_tree; - short a_depth; - } bc_array; - -typedef struct bc_var_array - { - bc_array *a_value; - char a_param; - struct bc_var_array *a_next; - } bc_var_array; - - -/* For the stacks, execution and function, we need records to allow - for arbitrary size. */ - -typedef struct estack_rec { - bc_num s_num; - struct estack_rec *s_next; -} estack_rec; - -typedef struct fstack_rec { - int s_val; - struct fstack_rec *s_next; -} fstack_rec; - - -/* The following are for the name tree. */ - -typedef struct id_rec { - char *id; /* The program name. */ - /* A name == 0 => nothing assigned yet. */ - int a_name; /* The array variable name (number). */ - int f_name; /* The function name (number). */ - int v_name; /* The variable name (number). */ - short balance; /* For the balanced tree. */ - struct id_rec *left, *right; /* Tree pointers. */ -} id_rec; - - -/* A list of files to process. */ - -typedef struct file_node { - char *name; - struct file_node *next; -} file_node; - -/* Macro Definitions */ - -#if defined(LIBEDIT) -#define HISTORY_SIZE(n) history(hist, &histev, H_SETSIZE, n) -#define UNLIMIT_HISTORY history(hist, &histev, H_SETSIZE, INT_MAX) -#endif - -#if defined(READLINE) -#define HISTORY_SIZE(n) stifle_history(n) -#define UNLIMIT_HISTORY unstifle_history() -#endif diff --git a/contrib/bc/bc/const.h b/contrib/bc/bc/const.h deleted file mode 100644 index 1a7c5b8..0000000 --- a/contrib/bc/bc/const.h +++ /dev/null @@ -1,98 +0,0 @@ -/* const.h: Constants for bc. */ - -/* This file is part of GNU bc. - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - - -/* Define INT_MAX and LONG_MAX if not defined. Assuming 32 bits... */ - -#ifndef INT_MAX -#define INT_MAX 0x7FFFFFFF -#endif -#ifndef LONG_MAX -#define LONG_MAX 0x7FFFFFFF -#endif - - -/* Define constants in some reasonable size. The next 4 constants are - POSIX constants. */ - -#ifdef BC_BASE_MAX - /* <limits.h> on a POSIX.2 system may have defined these. Override. */ -# undef BC_BASE_MAX -# undef BC_SCALE_MAX -# undef BC_STRING_MAX -# undef BC_DIM_MAX -#endif - -#define BC_BASE_MAX INT_MAX -#define BC_SCALE_MAX INT_MAX -#define BC_STRING_MAX INT_MAX - - -/* Definitions for arrays. */ - -#define BC_DIM_MAX 65535 /* this should be NODE_SIZE^NODE_DEPTH-1 */ - -#define NODE_SIZE 16 /* Must be a power of 2. */ -#define NODE_MASK 0xf /* Must be NODE_SIZE-1. */ -#define NODE_SHIFT 4 /* Number of 1 bits in NODE_MASK. */ -#define NODE_DEPTH 4 - - -/* Other BC limits defined but not part of POSIX. */ - -#define BC_LABEL_GROUP 64 -#define BC_LABEL_LOG 6 -#define BC_START_SIZE 1024 /* Initial code body size. */ - -/* Maximum number of variables, arrays and functions and the - allocation increment for the dynamic arrays. */ - -#define MAX_STORE 32767 -#define STORE_INCR 32 - -/* Other interesting constants. */ - -#define FALSE 0 -#define TRUE 1 - -/* for use with lookup (). */ -#define SIMPLE 0 -#define ARRAY 1 -#define FUNCT 2 -#define FUNCTDEF 3 - -#define EXTERN extern -#ifdef __STDC__ -#define CONST const -#define VOID void -#else -#define CONST -#define VOID -#endif diff --git a/contrib/bc/bc/execute.c b/contrib/bc/bc/execute.c deleted file mode 100644 index d2864d11..0000000 --- a/contrib/bc/bc/execute.c +++ /dev/null @@ -1,788 +0,0 @@ -/* execute.c - run a bc program. */ - -/* This file is part of GNU bc. - Copyright (C) 1991-1994, 1997, 2000 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#include "bcdefs.h" -#include <signal.h> -#include "global.h" -#include "proto.h" - - -/* The SIGINT interrupt handling routine. */ - -int had_sigint; - -void -stop_execution (sig) - int sig; -{ - had_sigint = TRUE; - printf ("\n"); - rt_error ("interrupted execution"); -} - - -/* Get the current byte and advance the PC counter. */ - -unsigned char -byte (pc) - program_counter *pc; -{ - return (functions[pc->pc_func].f_body[pc->pc_addr++]); -} - - -/* The routine that actually runs the machine. */ - -void -execute () -{ - int label_num, l_gp, l_off; - bc_label_group *gp; - - char inst, ch; - int new_func; - int var_name; - - int const_base; - - bc_num temp_num; - arg_list *auto_list; - - /* Initialize this run... */ - pc.pc_func = 0; - pc.pc_addr = 0; - runtime_error = FALSE; - bc_init_num (&temp_num); - - /* Set up the interrupt mechanism for an interactive session. */ - if (interactive) - { - signal (SIGINT, stop_execution); - had_sigint = FALSE; - } - - while (pc.pc_addr < functions[pc.pc_func].f_code_size && !runtime_error) - { - inst = byte(&pc); - -#if DEBUG > 3 - { /* Print out address and the stack before each instruction.*/ - int depth; estack_rec *temp = ex_stack; - - printf ("func=%d addr=%d inst=%c\n",pc.pc_func, pc.pc_addr, inst); - if (temp == NULL) printf ("empty stack.\n", inst); - else - { - depth = 1; - while (temp != NULL) - { - printf (" %d = ", depth); - bc_out_num (temp->s_num, 10, out_char, std_only); - depth++; - temp = temp->s_next; - } - out_char ('\n'); - } - } -#endif - - switch ( inst ) - { - - case 'A' : /* increment array variable (Add one). */ - var_name = byte(&pc); - if ((var_name & 0x80) != 0) - var_name = ((var_name & 0x7f) << 8) + byte(&pc); - incr_array (var_name); - break; - - case 'B' : /* Branch to a label if TOS != 0. Remove value on TOS. */ - case 'Z' : /* Branch to a label if TOS == 0. Remove value on TOS. */ - c_code = !bc_is_zero (ex_stack->s_num); - pop (); - case 'J' : /* Jump to a label. */ - label_num = byte(&pc); /* Low order bits first. */ - label_num += byte(&pc) << 8; - if (inst == 'J' || (inst == 'B' && c_code) - || (inst == 'Z' && !c_code)) { - gp = functions[pc.pc_func].f_label; - l_gp = label_num >> BC_LABEL_LOG; - l_off = label_num % BC_LABEL_GROUP; - while (l_gp-- > 0) gp = gp->l_next; - pc.pc_addr = gp->l_adrs[l_off]; - } - break; - - case 'C' : /* Call a function. */ - /* Get the function number. */ - new_func = byte(&pc); - if ((new_func & 0x80) != 0) - new_func = ((new_func & 0x7f) << 8) + byte(&pc); - - /* Check to make sure it is defined. */ - if (!functions[new_func].f_defined) - { - rt_error ("Function %s not defined.", f_names[new_func]); - break; - } - - /* Check and push parameters. */ - process_params (&pc, new_func); - - /* Push auto variables. */ - for (auto_list = functions[new_func].f_autos; - auto_list != NULL; - auto_list = auto_list->next) - auto_var (auto_list->av_name); - - /* Push pc and ibase. */ - fpush (pc.pc_func); - fpush (pc.pc_addr); - fpush (i_base); - - /* Reset pc to start of function. */ - pc.pc_func = new_func; - pc.pc_addr = 0; - break; - - case 'D' : /* Duplicate top of stack */ - push_copy (ex_stack->s_num); - break; - - case 'K' : /* Push a constant */ - /* Get the input base and convert it to a bc number. */ - if (pc.pc_func == 0) - const_base = i_base; - else - const_base = fn_stack->s_val; - if (const_base == 10) - push_b10_const (&pc); - else - push_constant (prog_char, const_base); - break; - - case 'L' : /* load array variable */ - var_name = byte(&pc); - if ((var_name & 0x80) != 0) - var_name = ((var_name & 0x7f) << 8) + byte(&pc); - load_array (var_name); - break; - - case 'M' : /* decrement array variable (Minus!) */ - var_name = byte(&pc); - if ((var_name & 0x80) != 0) - var_name = ((var_name & 0x7f) << 8) + byte(&pc); - decr_array (var_name); - break; - - case 'O' : /* Write a string to the output with processing. */ - while ((ch = byte(&pc)) != '"') - if (ch != '\\') - out_schar (ch); - else - { - ch = byte(&pc); - if (ch == '"') break; - switch (ch) - { - case 'a': out_schar (007); break; - case 'b': out_schar ('\b'); break; - case 'f': out_schar ('\f'); break; - case 'n': out_schar ('\n'); break; - case 'q': out_schar ('"'); break; - case 'r': out_schar ('\r'); break; - case 't': out_schar ('\t'); break; - case '\\': out_schar ('\\'); break; - default: break; - } - } - fflush (stdout); - break; - - case 'R' : /* Return from function */ - if (pc.pc_func != 0) - { - /* "Pop" autos and parameters. */ - pop_vars(functions[pc.pc_func].f_autos); - pop_vars(functions[pc.pc_func].f_params); - /* reset the pc. */ - fpop (); - pc.pc_addr = fpop (); - pc.pc_func = fpop (); - } - else - rt_error ("Return from main program."); - break; - - case 'S' : /* store array variable */ - var_name = byte(&pc); - if ((var_name & 0x80) != 0) - var_name = ((var_name & 0x7f ) << 8) + byte(&pc); - store_array (var_name); - break; - - case 'T' : /* Test tos for zero */ - c_code = bc_is_zero (ex_stack->s_num); - assign (c_code); - break; - - case 'W' : /* Write the value on the top of the stack. */ - case 'P' : /* Write the value on the top of the stack. No newline. */ - bc_out_num (ex_stack->s_num, o_base, out_char, std_only); - if (inst == 'W') out_char ('\n'); - store_var (4); /* Special variable "last". */ - fflush (stdout); - pop (); - break; - - case 'c' : /* Call special function. */ - new_func = byte(&pc); - - switch (new_func) - { - case 'L': /* Length function. */ - /* For the number 0.xxxx, 0 is not significant. */ - if (ex_stack->s_num->n_len == 1 && - ex_stack->s_num->n_scale != 0 && - ex_stack->s_num->n_value[0] == 0 ) - bc_int2num (&ex_stack->s_num, ex_stack->s_num->n_scale); - else - bc_int2num (&ex_stack->s_num, ex_stack->s_num->n_len - + ex_stack->s_num->n_scale); - break; - - case 'S': /* Scale function. */ - bc_int2num (&ex_stack->s_num, ex_stack->s_num->n_scale); - break; - - case 'R': /* Square Root function. */ - if (!bc_sqrt (&ex_stack->s_num, scale)) - rt_error ("Square root of a negative number"); - break; - - case 'I': /* Read function. */ - push_constant (input_char, i_base); - break; - } - break; - - case 'd' : /* Decrement number */ - var_name = byte(&pc); - if ((var_name & 0x80) != 0) - var_name = ((var_name & 0x7f) << 8) + byte(&pc); - decr_var (var_name); - break; - - case 'h' : /* Halt the machine. */ - exit (0); - - case 'i' : /* increment number */ - var_name = byte(&pc); - if ((var_name & 0x80) != 0) - var_name = ((var_name & 0x7f) << 8) + byte(&pc); - incr_var (var_name); - break; - - case 'l' : /* load variable */ - var_name = byte(&pc); - if ((var_name & 0x80) != 0) - var_name = ((var_name & 0x7f) << 8) + byte(&pc); - load_var (var_name); - break; - - case 'n' : /* Negate top of stack. */ - bc_sub (_zero_, ex_stack->s_num, &ex_stack->s_num, 0); - break; - - case 'p' : /* Pop the execution stack. */ - pop (); - break; - - case 's' : /* store variable */ - var_name = byte(&pc); - if ((var_name & 0x80) != 0) - var_name = ((var_name & 0x7f) << 8) + byte(&pc); - store_var (var_name); - break; - - case 'w' : /* Write a string to the output. */ - while ((ch = byte(&pc)) != '"') out_schar (ch); - fflush (stdout); - break; - - case 'x' : /* Exchange Top of Stack with the one under the tos. */ - if (check_stack(2)) { - bc_num temp = ex_stack->s_num; - ex_stack->s_num = ex_stack->s_next->s_num; - ex_stack->s_next->s_num = temp; - } - break; - - case '0' : /* Load Constant 0. */ - push_copy (_zero_); - break; - - case '1' : /* Load Constant 0. */ - push_copy (_one_); - break; - - case '!' : /* Negate the boolean value on top of the stack. */ - c_code = bc_is_zero (ex_stack->s_num); - assign (c_code); - break; - - case '&' : /* compare greater than */ - if (check_stack(2)) - { - c_code = !bc_is_zero (ex_stack->s_next->s_num) - && !bc_is_zero (ex_stack->s_num); - pop (); - assign (c_code); - } - break; - - case '|' : /* compare greater than */ - if (check_stack(2)) - { - c_code = !bc_is_zero (ex_stack->s_next->s_num) - || !bc_is_zero (ex_stack->s_num); - pop (); - assign (c_code); - } - break; - - case '+' : /* add */ - if (check_stack(2)) - { - bc_add (ex_stack->s_next->s_num, ex_stack->s_num, &temp_num, 0); - pop(); - pop(); - push_num (temp_num); - bc_init_num (&temp_num); - } - break; - - case '-' : /* subtract */ - if (check_stack(2)) - { - bc_sub (ex_stack->s_next->s_num, ex_stack->s_num, &temp_num, 0); - pop(); - pop(); - push_num (temp_num); - bc_init_num (&temp_num); - } - break; - - case '*' : /* multiply */ - if (check_stack(2)) - { - bc_multiply (ex_stack->s_next->s_num, ex_stack->s_num, - &temp_num, scale); - pop(); - pop(); - push_num (temp_num); - bc_init_num (&temp_num); - } - break; - - case '/' : /* divide */ - if (check_stack(2)) - { - if (bc_divide (ex_stack->s_next->s_num, - ex_stack->s_num, &temp_num, scale) == 0) - { - pop(); - pop(); - push_num (temp_num); - bc_init_num (&temp_num); - } - else - rt_error ("Divide by zero"); - } - break; - - case '%' : /* remainder */ - if (check_stack(2)) - { - if (bc_is_zero (ex_stack->s_num)) - rt_error ("Modulo by zero"); - else - { - bc_modulo (ex_stack->s_next->s_num, - ex_stack->s_num, &temp_num, scale); - pop(); - pop(); - push_num (temp_num); - bc_init_num (&temp_num); - } - } - break; - - case '^' : /* raise */ - if (check_stack(2)) - { - bc_raise (ex_stack->s_next->s_num, - ex_stack->s_num, &temp_num, scale); - if (bc_is_zero (ex_stack->s_next->s_num) && bc_is_neg (ex_stack->s_num)) - rt_error ("divide by zero"); - pop(); - pop(); - push_num (temp_num); - bc_init_num (&temp_num); - } - break; - - case '=' : /* compare equal */ - if (check_stack(2)) - { - c_code = bc_compare (ex_stack->s_next->s_num, - ex_stack->s_num) == 0; - pop (); - assign (c_code); - } - break; - - case '#' : /* compare not equal */ - if (check_stack(2)) - { - c_code = bc_compare (ex_stack->s_next->s_num, - ex_stack->s_num) != 0; - pop (); - assign (c_code); - } - break; - - case '<' : /* compare less than */ - if (check_stack(2)) - { - c_code = bc_compare (ex_stack->s_next->s_num, - ex_stack->s_num) == -1; - pop (); - assign (c_code); - } - break; - - case '{' : /* compare less than or equal */ - if (check_stack(2)) - { - c_code = bc_compare (ex_stack->s_next->s_num, - ex_stack->s_num) <= 0; - pop (); - assign (c_code); - } - break; - - case '>' : /* compare greater than */ - if (check_stack(2)) - { - c_code = bc_compare (ex_stack->s_next->s_num, - ex_stack->s_num) == 1; - pop (); - assign (c_code); - } - break; - - case '}' : /* compare greater than or equal */ - if (check_stack(2)) - { - c_code = bc_compare (ex_stack->s_next->s_num, - ex_stack->s_num) >= 0; - pop (); - assign (c_code); - } - break; - - default : /* error! */ - rt_error ("bad instruction: inst=%c", inst); - } - } - - /* Clean up the function stack and pop all autos/parameters. */ - while (pc.pc_func != 0) - { - pop_vars(functions[pc.pc_func].f_autos); - pop_vars(functions[pc.pc_func].f_params); - fpop (); - pc.pc_addr = fpop (); - pc.pc_func = fpop (); - } - - /* Clean up the execution stack. */ - while (ex_stack != NULL) pop(); - - /* Clean up the interrupt stuff. */ - if (interactive) - { - signal (SIGINT, use_quit); - if (had_sigint) - printf ("Interruption completed.\n"); - } -} - - -/* Prog_char gets another byte from the program. It is used for - conversion of text constants in the code to numbers. */ - -char -prog_char () -{ - return byte(&pc); -} - - -/* Read a character from the standard input. This function is used - by the "read" function. */ - -char -input_char () -{ - char in_ch; - - /* Get a character from the standard input for the read function. */ - in_ch = getchar(); - - /* Check for a \ quoted newline. */ - if (in_ch == '\\') - { - in_ch = getchar(); - if (in_ch == '\n') - in_ch = getchar(); - } - - /* Classify and preprocess the input character. */ - if (isdigit((int)in_ch)) - return (in_ch - '0'); - if (in_ch >= 'A' && in_ch <= 'F') - return (in_ch + 10 - 'A'); - if (in_ch >= 'a' && in_ch <= 'f') - return (in_ch + 10 - 'a'); - if (in_ch == '.' || in_ch == '+' || in_ch == '-') - return (in_ch); - if (in_ch <= ' ') - return (' '); - - return (':'); -} - - -/* Push_constant converts a sequence of input characters as returned - by IN_CHAR into a number. The number is pushed onto the execution - stack. The number is converted as a number in base CONV_BASE. */ - -void -push_constant (in_char, conv_base) - char (*in_char)(VOID); - int conv_base; -{ - int digits; - bc_num build, temp, result, mult, divisor; - char in_ch, first_ch; - char negative; - - /* Initialize all bc numbers */ - bc_init_num (&temp); - bc_init_num (&result); - bc_init_num (&mult); - build = bc_copy_num (_zero_); - negative = FALSE; - - /* The conversion base. */ - bc_int2num (&mult, conv_base); - - /* Get things ready. */ - in_ch = in_char(); - while (in_ch == ' ') - in_ch = in_char(); - - if (in_ch == '+') - in_ch = in_char(); - else - if (in_ch == '-') - { - negative = TRUE; - in_ch = in_char(); - } - - /* Check for the special case of a single digit. */ - if (in_ch < 16) - { - first_ch = in_ch; - in_ch = in_char(); - if (in_ch < 16 && first_ch >= conv_base) - first_ch = conv_base - 1; - bc_int2num (&build, (int) first_ch); - } - - /* Convert the integer part. */ - while (in_ch < 16) - { - if (in_ch < 16 && in_ch >= conv_base) in_ch = conv_base-1; - bc_multiply (build, mult, &result, 0); - bc_int2num (&temp, (int) in_ch); - bc_add (result, temp, &build, 0); - in_ch = in_char(); - } - if (in_ch == '.') - { - in_ch = in_char(); - if (in_ch >= conv_base) in_ch = conv_base-1; - bc_free_num (&result); - bc_free_num (&temp); - divisor = bc_copy_num (_one_); - result = bc_copy_num (_zero_); - digits = 0; - while (in_ch < 16) - { - bc_multiply (result, mult, &result, 0); - bc_int2num (&temp, (int) in_ch); - bc_add (result, temp, &result, 0); - bc_multiply (divisor, mult, &divisor, 0); - digits++; - in_ch = in_char(); - if (in_ch < 16 && in_ch >= conv_base) in_ch = conv_base-1; - } - bc_divide (result, divisor, &result, digits); - bc_add (build, result, &build, 0); - } - - /* Final work. */ - if (negative) - bc_sub (_zero_, build, &build, 0); - - push_num (build); - bc_free_num (&temp); - bc_free_num (&result); - bc_free_num (&mult); -} - - -/* When converting base 10 constants from the program, we use this - more efficient way to convert them to numbers. PC tells where - the constant starts and is expected to be advanced to after - the constant. */ - -void -push_b10_const (pc) - program_counter *pc; -{ - bc_num build; - program_counter look_pc; - int kdigits, kscale; - char inchar; - char *ptr; - - /* Count the digits and get things ready. */ - look_pc = *pc; - kdigits = 0; - kscale = 0; - inchar = byte (&look_pc); - while (inchar != '.' && inchar != ':') - { - kdigits++; - inchar = byte(&look_pc); - } - if (inchar == '.' ) - { - inchar = byte(&look_pc); - while (inchar != ':') - { - kscale++; - inchar = byte(&look_pc); - } - } - - /* Get the first character again and move the pc. */ - inchar = byte(pc); - - /* Secial cases of 0, 1, and A-F single inputs. */ - if (kdigits == 1 && kscale == 0) - { - if (inchar == 0) - { - push_copy (_zero_); - inchar = byte(pc); - return; - } - if (inchar == 1) { - push_copy (_one_); - inchar = byte(pc); - return; - } - if (inchar > 9) - { - bc_init_num (&build); - bc_int2num (&build, inchar); - push_num (build); - inchar = byte(pc); - return; - } - } - - /* Build the new number. */ - if (kdigits == 0) - { - build = bc_new_num (1,kscale); - ptr = build->n_value; - *ptr++ = 0; - } - else - { - build = bc_new_num (kdigits,kscale); - ptr = build->n_value; - } - - while (inchar != ':') - { - if (inchar != '.') - { - if (inchar > 9) - *ptr++ = 9; - else - *ptr++ = inchar; - } - inchar = byte(pc); - } - push_num (build); -} - - -/* Put the correct value on the stack for C_CODE. Frees TOS num. */ - -void -assign (c_code) - char c_code; -{ - bc_free_num (&ex_stack->s_num); - if (c_code) - ex_stack->s_num = bc_copy_num (_one_); - else - ex_stack->s_num = bc_copy_num (_zero_); -} - diff --git a/contrib/bc/bc/fix-libmath_h b/contrib/bc/bc/fix-libmath_h deleted file mode 100755 index f973a8c..0000000 --- a/contrib/bc/bc/fix-libmath_h +++ /dev/null @@ -1,9 +0,0 @@ -ed libmath.h <<EOS-EOS -1,1s/^/{"/ -1,\$s/\$/",/ -2,\$s/^/"/ -\$,\$d -\$,\$s/,\$/,0}/ -w -q -EOS-EOS diff --git a/contrib/bc/bc/global.c b/contrib/bc/bc/global.c deleted file mode 100644 index 5d1205c..0000000 --- a/contrib/bc/bc/global.c +++ /dev/null @@ -1,42 +0,0 @@ -/* global.c: This defines the global variables. */ - -/* This file is part of GNU bc. - Copyright (C) 1991-1994, 1997, 2000 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#include "bcdefs.h" - -/* Since we want to define them here, we use the following define. */ -#undef EXTERN -#define EXTERN - -/* Define all the global variables for bc. */ -#include "global.h" - -CONST char *libmath[] = -#include "libmath.h" -; diff --git a/contrib/bc/bc/global.h b/contrib/bc/bc/global.h deleted file mode 100644 index cf6945c..0000000 --- a/contrib/bc/bc/global.h +++ /dev/null @@ -1,154 +0,0 @@ -/* global.h: The global variables for bc. */ - -/* This file is part of GNU bc. - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - - -/* The current break level's lable. */ -EXTERN int break_label; - -/* The current if statement's else label or label after else. */ -EXTERN int if_label; - -/* The current for statement label for continuing the loop. */ -EXTERN int continue_label; - -/* Next available label number. */ -EXTERN int next_label; - -/* Byte code character storage. Used in many places for generation of code. */ -EXTERN char genstr[80]; - -/* Count of characters printed to the output in compile_only mode. */ -EXTERN int out_count; - -/* Have we generated any code since the last initialization of the code - generator. */ -EXTERN char did_gen; - -/* Is this run an interactive execution. (Is stdin a terminal?) */ -EXTERN char interactive; - -/* Just generate the byte code. -c flag. */ -EXTERN int compile_only; - -/* Load the standard math functions. -l flag. */ -EXTERN int use_math; - -/* Give a warning on use of any non-standard feature (non-POSIX). -w flag. */ -EXTERN int warn_not_std; - -/* Accept POSIX bc only! -s flag. */ -EXTERN int std_only; - -/* Don't print the banner at start up. -q flag. */ -EXTERN int quiet; - -/* The list of file names to process. */ -EXTERN file_node *file_names; - -/* The name of the current file being processed. */ -EXTERN char *file_name; - -/* Is the current file a named file or standard input? */ -EXTERN char is_std_in; - -/* global variables for the bc machine. All will be dynamic in size.*/ -/* Function storage. main is (0) and functions (1-f_count) */ - -EXTERN bc_function *functions; -EXTERN char **f_names; -EXTERN int f_count; - -/* Variable stoarge and reverse names. */ - -EXTERN bc_var **variables; -EXTERN char **v_names; -EXTERN int v_count; - -/* Array Variable storage and reverse names. */ - -EXTERN bc_var_array **arrays; -EXTERN char **a_names; -EXTERN int a_count; - -/* Execution stack. */ -EXTERN estack_rec *ex_stack; - -/* Function return stack. */ -EXTERN fstack_rec *fn_stack; - -/* Current ibase, obase, scale, and n_history (if needed). */ -EXTERN int i_base; -EXTERN int o_base; -EXTERN int scale; -#if defined(READLINE) || defined(LIBEDIT) -EXTERN int n_history; -#endif - -#if defined(LIBEDIT) -/* LIBEDIT data */ -EditLine *edit; -History *hist; -HistEvent histev; -#endif - -/* "Condition code" -- false (0) or true (1) */ -EXTERN char c_code; - -/* Records the number of the runtime error. */ -EXTERN char runtime_error; - -/* Holds the current location of execution. */ -EXTERN program_counter pc; - -/* For POSIX bc, this is just for number output, not strings. */ -EXTERN int out_col; - -/* Keeps track of the current number of characters per output line. - This includes the \n at the end of the line. */ -EXTERN int line_size; - -/* Input Line numbers and other error information. */ -EXTERN int line_no; -EXTERN int had_error; - -/* For larger identifiers, a tree, and how many "storage" locations - have been allocated. */ - -EXTERN int next_array; -EXTERN int next_func; -EXTERN int next_var; - -EXTERN id_rec *name_tree; - -/* For use with getopt. Do not declare them here.*/ -extern int optind; - -/* Access to the yy input file. Defined in scan.c. */ -extern FILE *yyin; diff --git a/contrib/bc/bc/libmath.b b/contrib/bc/bc/libmath.b deleted file mode 100644 index 7bb6405..0000000 --- a/contrib/bc/bc/libmath.b +++ /dev/null @@ -1,287 +0,0 @@ -/* libmath.b for GNU bc. */ - -/* This file is part of GNU bc. - Copyright (C) 1991, 1992, 1993, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - - -scale = 20 - -/* Uses the fact that e^x = (e^(x/2))^2 - When x is small enough, we use the series: - e^x = 1 + x + x^2/2! + x^3/3! + ... -*/ - -define e(x) { - auto a, d, e, f, i, m, n, v, z - - /* a - holds x^y of x^y/y! */ - /* d - holds y! */ - /* e - is the value x^y/y! */ - /* v - is the sum of the e's */ - /* f - number of times x was divided by 2. */ - /* m - is 1 if x was minus. */ - /* i - iteration count. */ - /* n - the scale to compute the sum. */ - /* z - orignal scale. */ - - /* Check the sign of x. */ - if (x<0) { - m = 1 - x = -x - } - - /* Precondition x. */ - z = scale; - n = 6 + z + .44*x; - scale = scale(x)+1; - while (x > 1) { - f += 1; - x /= 2; - scale += 1; - } - - /* Initialize the variables. */ - scale = n; - v = 1+x - a = x - d = 1 - - for (i=2; 1; i++) { - e = (a *= x) / (d *= i) - if (e == 0) { - if (f>0) while (f--) v = v*v; - scale = z - if (m) return (1/v); - return (v/1); - } - v += e - } -} - -/* Natural log. Uses the fact that ln(x^2) = 2*ln(x) - The series used is: - ln(x) = 2(a+a^3/3+a^5/5+...) where a=(x-1)/(x+1) -*/ - -define l(x) { - auto e, f, i, m, n, v, z - - /* return something for the special case. */ - if (x <= 0) return ((1 - 10^scale)/1) - - /* Precondition x to make .5 < x < 2.0. */ - z = scale; - scale = 6 + scale; - f = 2; - i=0 - while (x >= 2) { /* for large numbers */ - f *= 2; - x = sqrt(x); - } - while (x <= .5) { /* for small numbers */ - f *= 2; - x = sqrt(x); - } - - /* Set up the loop. */ - v = n = (x-1)/(x+1) - m = n*n - - /* Sum the series. */ - for (i=3; 1; i+=2) { - e = (n *= m) / i - if (e == 0) { - v = f*v - scale = z - return (v/1) - } - v += e - } -} - -/* Sin(x) uses the standard series: - sin(x) = x - x^3/3! + x^5/5! - x^7/7! ... */ - -define s(x) { - auto e, i, m, n, s, v, z - - /* precondition x. */ - z = scale - scale = 1.1*z + 2; - v = a(1) - if (x < 0) { - m = 1; - x = -x; - } - scale = 0 - n = (x / v + 2 )/4 - x = x - 4*n*v - if (n%2) x = -x - - /* Do the loop. */ - scale = z + 2; - v = e = x - s = -x*x - for (i=3; 1; i+=2) { - e *= s/(i*(i-1)) - if (e == 0) { - scale = z - if (m) return (-v/1); - return (v/1); - } - v += e - } -} - -/* Cosine : cos(x) = sin(x+pi/2) */ -define c(x) { - auto v, z; - z = scale; - scale = scale*1.2; - v = s(x+a(1)*2); - scale = z; - return (v/1); -} - -/* Arctan: Using the formula: - atan(x) = atan(c) + atan((x-c)/(1+xc)) for a small c (.2 here) - For under .2, use the series: - atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ... */ - -define a(x) { - auto a, e, f, i, m, n, s, v, z - - /* a is the value of a(.2) if it is needed. */ - /* f is the value to multiply by a in the return. */ - /* e is the value of the current term in the series. */ - /* v is the accumulated value of the series. */ - /* m is 1 or -1 depending on x (-x -> -1). results are divided by m. */ - /* i is the denominator value for series element. */ - /* n is the numerator value for the series element. */ - /* s is -x*x. */ - /* z is the saved user's scale. */ - - /* Negative x? */ - m = 1; - if (x<0) { - m = -1; - x = -x; - } - - /* Special case and for fast answers */ - if (x==1) { - if (scale <= 25) return (.7853981633974483096156608/m) - if (scale <= 40) return (.7853981633974483096156608458198757210492/m) - if (scale <= 60) \ - return (.785398163397448309615660845819875721049292349843776455243736/m) - } - if (x==.2) { - if (scale <= 25) return (.1973955598498807583700497/m) - if (scale <= 40) return (.1973955598498807583700497651947902934475/m) - if (scale <= 60) \ - return (.197395559849880758370049765194790293447585103787852101517688/m) - } - - - /* Save the scale. */ - z = scale; - - /* Note: a and f are known to be zero due to being auto vars. */ - /* Calculate atan of a known number. */ - if (x > .2) { - scale = z+5; - a = a(.2); - } - - /* Precondition x. */ - scale = z+3; - while (x > .2) { - f += 1; - x = (x-.2) / (1+x*.2); - } - - /* Initialize the series. */ - v = n = x; - s = -x*x; - - /* Calculate the series. */ - for (i=3; 1; i+=2) { - e = (n *= s) / i; - if (e == 0) { - scale = z; - return ((f*a+v)/m); - } - v += e - } -} - - -/* Bessel function of integer order. Uses the following: - j(-n,x) = (-1)^n*j(n,x) - j(n,x) = x^n/(2^n*n!) * (1 - x^2/(2^2*1!*(n+1)) + x^4/(2^4*2!*(n+1)*(n+2)) - - x^6/(2^6*3!*(n+1)*(n+2)*(n+3)) .... ) -*/ -define j(n,x) { - auto a, b, d, e, f, i, m, s, v, z - - /* Make n an integer and check for negative n. */ - z = scale; - scale = 0; - n = n/1; - if (n<0) { - n = -n; - if (n%2 == 1) m = 1; - } - - /* save ibase */ - b = ibase; - ibase = A; - - /* Compute the factor of x^n/(2^n*n!) */ - f = 1; - for (i=2; i<=n; i++) f = f*i; - scale = 1.5*z; - f = x^n / 2^n / f; - - /* Initialize the loop .*/ - v = e = 1; - s = -x*x/4 - scale = 1.5*z + length(f) - scale(f); - - /* The Loop.... */ - for (i=1; 1; i++) { - e = e * s / i / (n+i); - if (e == 0) { - ibase = b; - scale = z - if (m) return (-f*v/1); - return (f*v/1); - } - v += e; - } -} diff --git a/contrib/bc/bc/libmath.h b/contrib/bc/bc/libmath.h deleted file mode 100644 index bf48f4b..0000000 --- a/contrib/bc/bc/libmath.h +++ /dev/null @@ -1,40 +0,0 @@ -{"@iK20:s2:p@r", -"@iF1,5.6,7,8,9,10,11,12,13,14[l5:0<Z1:1s11:pl5:ns5:pN1:l2:s14:", -"pK6:l14:+K.44:l5:*+s12:pl5:cS1+s2:pN2:l5:1>Z3:l9:1+s9:pl5:K2:", -"/s5:pl2:1+s2:pJ2:N3:l12:s2:p1l5:+s13:pl5:s6:p1s7:pK2:s10:pN5:", -"1B6:J4:N7:l10:i10:pJ5:N6:l6:l5:*s6:l7:l10:*s7:/s8:pl8:0=Z8:l9:", -"0>Z9:N10:l9:d9:Z11:l13:l13:*s13:pJ10:N11:N9:l14:s2:pl11:Z12:1", -"l13:/RN12:l13:1/RN8:l13:l8:+s13:pJ7:N4:0R]@r", -"@iF2,5.8,9,10,11,12,13,14[l5:0{Z1:1K10:l2:^-1/RN1:l2:s14:pK6:", -"l2:+s2:pK2:s9:p0s10:pN2:l5:K2:}Z3:l9:K2:*s9:pl5:cRs5:pJ2:N3:N4:", -"l5:K.5:{Z5:l9:K2:*s9:pl5:cRs5:pJ4:N5:l5:1-l5:1+/s12:s13:pl12:", -"l12:*s11:pK3:s10:pN7:1B8:J6:N9:l10:K2:+s10:pJ7:N8:l12:l11:*s12:", -"l10:/s8:pl8:0=Z10:l9:l13:*s13:pl14:s2:pl13:1/RN10:l13:l8:+s13:", -"pJ9:N6:0R]@r", -"@iF3,5.8,10,11,12,15,13,14[l2:s14:pK1.1:l14:*K2:+s2:p1C4,0:s13:", -"pl5:0<Z1:1s11:pl5:ns5:pN1:0s2:pl5:l13:/K2:+K4:/s12:pl5:K4:l12:", -"*l13:*-s5:pl12:K2:%Z2:l5:ns5:pN2:l14:K2:+s2:pl5:s8:s13:pl5:nl5:", -"*s15:pK3:s10:pN4:1B5:J3:N6:l10:K2:+s10:pJ4:N5:l8:l15:l10:l10:", -"1-*/*s8:pl8:0=Z7:l14:s2:pl11:Z8:l13:n1/RN8:l13:1/RN7:l13:l8:+", -"s13:pJ6:N3:0R]@r", -"@iF5,5.13,14[l2:s14:pl2:K1.2:*s2:pl5:1C4,0:K2:*+C3,0:s13:pl14:", -"s2:pl13:1/R0R]@r", -"@iF4,5.6,8,9,10,11,12,15,13,14[1s11:pl5:0<Z1:1ns11:pl5:ns5:pN1:", -"l5:1=Z2:l2:K25:{Z3:K.7853981633974483096156608:l11:/RN3:l2:K40", -":{Z4:K.7853981633974483096156608458198757210492:l11:/RN4:l2:K", -"60:{Z5:K.785398163397448309615660845819875721049292349843776455243736", -":l11:/RN5:N2:l5:K.2:=Z6:l2:K25:{Z7:K.1973955598498807583700497", -":l11:/RN7:l2:K40:{Z8:K.1973955598498807583700497651947902934475", -":l11:/RN8:l2:K60:{Z9:K.197395559849880758370049765194790293447585103787852101517688", -":l11:/RN9:N6:l2:s14:pl5:K.2:>Z10:l14:K5:+s2:pK.2:C4,0:s6:pN10:", -"l14:K3:+s2:pN11:l5:K.2:>Z12:l9:1+s9:pl5:K.2:-1l5:K.2:*+/s5:pJ11:N12:", -"l5:s12:s13:pl5:nl5:*s15:pK3:s10:pN14:1B15:J13:N16:l10:K2:+s10:", -"pJ14:N15:l12:l15:*s12:l10:/s8:pl8:0=Z17:l14:s2:pl9:l6:*l13:+l11:", -"/RN17:l13:l8:+s13:pJ16:N13:0R]@r", -"@iF6,12,5.6,16,7,8,9,10,11,15,13,14[l2:s14:p0s2:pl12:1/s12:pl12:", -"0<Z1:l12:ns12:pl12:K2:%1=Z2:1s11:pN2:N1:l0:s16:pKA:s0:p1s9:pK", -"2:s10:pN4:l10:l12:{B5:J3:N6:l10:i10:pJ4:N5:l9:l10:*s9:pJ6:N3:", -"K1.5:l14:*s2:pl5:l12:^K2:l12:^/l9:/s9:p1s8:s13:pl5:nl5:*K4:/s15:", -"pK1.5:l14:*l9:cL+l9:cS-s2:p1s10:pN8:1B9:J7:N10:l10:i10:pJ8:N9:", -"l8:l15:*l10:/l12:l10:+/s8:pl8:0=Z11:l16:s0:pl14:s2:pl11:Z12:l9:", -"nl13:*1/RN12:l9:l13:*1/RN11:l13:l8:+s13:pJ10:N7:0R]@r",0} diff --git a/contrib/bc/bc/load.c b/contrib/bc/bc/load.c deleted file mode 100644 index dd03435..0000000 --- a/contrib/bc/bc/load.c +++ /dev/null @@ -1,351 +0,0 @@ -/* load.c: This code "loads" code into the code segments. */ - -/* This file is part of GNU bc. - Copyright (C) 1991-1994, 1997, 2000 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#include "bcdefs.h" -#include "global.h" -#include "proto.h" - -/* Load variables. */ - -program_counter load_adr; -char load_str; -char load_const; - -/* Initialize the load sequence. */ -void -init_load () -{ - clear_func(0); - load_adr.pc_func = 0; - load_adr.pc_addr = 0; - load_str = FALSE; - load_const = FALSE; -} - -/* addbyte adds one BYTE to the current code segment. */ -void -addbyte (byte) - char byte; -{ - int pc; - bc_function *f; - char *new_body; - - /* If there was an error, don't continue. */ - if (had_error) return; - - /* Calculate the segment and offset. */ - pc = load_adr.pc_addr++; - f = &functions[load_adr.pc_func]; - - if (pc >= f->f_body_size) - { - f->f_body_size *= 2; - new_body = (char *) bc_malloc (f->f_body_size); - memcpy(new_body, f->f_body, f->f_body_size/2); - free (f->f_body); - f->f_body = new_body; - } - - /* Store the byte. */ - f->f_body[pc] = byte; - f->f_code_size++; -} - - -/* Define a label LAB to be the current program counter. */ - -void -def_label (lab) - long lab; -{ - bc_label_group *temp; - int group, offset, func; - - /* Get things ready. */ - group = lab >> BC_LABEL_LOG; - offset = lab % BC_LABEL_GROUP; - func = load_adr.pc_func; - - /* Make sure there is at least one label group. */ - if (functions[func].f_label == NULL) - { - functions[func].f_label = - (bc_label_group *) bc_malloc (sizeof(bc_label_group)); - functions[func].f_label->l_next = NULL; - } - - /* Add the label group. */ - temp = functions[func].f_label; - while (group > 0) - { - if (temp->l_next == NULL) - { - temp->l_next = (bc_label_group *) bc_malloc (sizeof(bc_label_group)); - temp->l_next->l_next = NULL; - } - temp = temp->l_next; - group --; - } - - /* Define it! */ - temp->l_adrs [offset] = load_adr.pc_addr; -} - -/* Several instructions have integers in the code. They - are all known to be legal longs. So, no error code - is added. STR is the pointer to the load string and - must be moved to the last non-digit character. */ - -long -long_val (str) - char **str; -{ int val = 0; - char neg = FALSE; - - if (**str == '-') - { - neg = TRUE; - (*str)++; - } - while (isdigit((int)(**str))) - val = val*10 + *(*str)++ - '0'; - - if (neg) - return -val; - else - return val; -} - - -/* load_code loads the CODE into the machine. */ - -void -load_code (code) - char *code; -{ - char *str; - long ap_name; /* auto or parameter name. */ - long label_no; - long vaf_name; /* variable, array or function number. */ - long func; - static program_counter save_adr; - - /* Initialize. */ - str = code; - - /* Scan the code. */ - while (*str != 0) - { - /* If there was an error, don't continue. */ - if (had_error) return; - - if (load_str) - { - if (*str == '"') load_str = FALSE; - addbyte (*str++); - } - else - if (load_const) - { - if (*str == '\n') - str++; - else - { - if (*str == ':') - { - load_const = FALSE; - addbyte (*str++); - } - else - if (*str == '.') - addbyte (*str++); - else - if (*str >= 'A') - addbyte (*str++ + 10 - 'A'); - else - addbyte (*str++ - '0'); - } - } - else - { - switch (*str) - { - - case '"': /* Starts a string. */ - load_str = TRUE; - break; - - case 'N': /* A label */ - str++; - label_no = long_val (&str); - def_label (label_no); - break; - - case 'B': /* Branch to label. */ - case 'J': /* Jump to label. */ - case 'Z': /* Branch Zero to label. */ - addbyte(*str++); - label_no = long_val (&str); - if (label_no > 65535L) - { /* Better message? */ - fprintf (stderr,"Program too big.\n"); - exit(1); - } - addbyte ( (char) (label_no & 0xFF)); - addbyte ( (char) (label_no >> 8)); - break; - - case 'F': /* A function, get the name and initialize it. */ - str++; - func = long_val (&str); - clear_func (func); -#if DEBUG > 2 - printf ("Loading function number %d\n", func); -#endif - /* get the parameters */ - while (*str++ != '.') - { - if (*str == '.') - { - str++; - break; - } - if (*str == '*') - { - str++; - ap_name = long_val (&str); -#if DEBUG > 2 - printf ("var parameter number %d\n", ap_name); -#endif - functions[(int)func].f_params = - nextarg (functions[(int)func].f_params, ap_name, - TRUE); - } - else - { - ap_name = long_val (&str); -#if DEBUG > 2 - printf ("parameter number %d\n", ap_name); -#endif - functions[(int)func].f_params = - nextarg (functions[(int)func].f_params, ap_name, - FALSE); - } - } - - /* get the auto vars */ - while (*str != '[') - { - if (*str == ',') str++; - ap_name = long_val (&str); -#if DEBUG > 2 - printf ("auto number %d\n", ap_name); -#endif - functions[(int)func].f_autos = - nextarg (functions[(int)func].f_autos, ap_name, FALSE); - } - save_adr = load_adr; - load_adr.pc_func = func; - load_adr.pc_addr = 0; - break; - - case ']': /* A function end */ - functions[load_adr.pc_func].f_defined = TRUE; - load_adr = save_adr; - break; - - case 'C': /* Call a function. */ - addbyte (*str++); - func = long_val (&str); - if (func < 128) - addbyte ( (char) func); - else - { - addbyte (((func >> 8) & 0xff) | 0x80); - addbyte (func & 0xff); - } - if (*str == ',') str++; - while (*str != ':') - addbyte (*str++); - addbyte (':'); - break; - - case 'c': /* Call a special function. */ - addbyte (*str++); - addbyte (*str); - break; - - case 'K': /* A constant.... may have an "F" in it. */ - addbyte (*str); - load_const = TRUE; - break; - - case 'd': /* Decrement. */ - case 'i': /* Increment. */ - case 'l': /* Load. */ - case 's': /* Store. */ - case 'A': /* Array Increment */ - case 'M': /* Array Decrement */ - case 'L': /* Array Load */ - case 'S': /* Array Store */ - addbyte (*str++); - vaf_name = long_val (&str); - if (vaf_name < 128) - addbyte (vaf_name); - else - { - addbyte (((vaf_name >> 8) & 0xff) | 0x80); - addbyte (vaf_name & 0xff); - } - break; - - case '@': /* A command! */ - switch (*(++str)) - { - case 'i': - init_load (); - break; - case 'r': - execute (); - break; - } - break; - - case '\n': /* Ignore the newlines */ - break; - - default: /* Anything else */ - addbyte (*str); - } - str++; - } - } -} diff --git a/contrib/bc/bc/main.c b/contrib/bc/bc/main.c deleted file mode 100644 index 8ac2981..0000000 --- a/contrib/bc/bc/main.c +++ /dev/null @@ -1,358 +0,0 @@ -/* main.c: The main program for bc. */ - -/* This file is part of GNU bc. - Copyright (C) 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -$FreeBSD$ - -*************************************************************************/ - -#include "bcdefs.h" -#include <signal.h> -#include "global.h" -#include "proto.h" -#include "getopt.h" - - -/* Variables for processing multiple files. */ -static char first_file; - -/* Points to the last node in the file name list for easy adding. */ -static file_node *last = NULL; - -/* long option support */ -static struct option long_options[] = -{ - {"compile", 0, &compile_only, TRUE}, - {"help", 0, 0, 'h'}, - {"interactive", 0, 0, 'i'}, - {"mathlib", 0, &use_math, TRUE}, - {"quiet", 0, &quiet, TRUE}, - {"standard", 0, &std_only, TRUE}, - {"version", 0, 0, 'v'}, - {"warn", 0, &warn_not_std, TRUE}, - - {0, 0, 0, 0} -}; - - -void -usage (char *progname) -{ - printf ("usage: %s [options] [file ...]\n%s%s%s%s%s%s%s", progname, - " -h --help print this usage and exit\n", - " -i --interactive force interactive mode\n", - " -l --mathlib use the predefined math routines\n", - " -q --quiet don't print initial banner\n", - " -s --standard non-standard bc constructs are errors\n", - " -w --warn warn about non-standard bc constructs\n", - " -v --version print version information and exit\n"); -} - - -void -parse_args (argc, argv) - int argc; - char **argv; -{ - int optch; - int long_index; - file_node *temp; - - /* Force getopt to initialize. Depends on GNU getopt. */ - optind = 0; - - /* Parse the command line */ - while (1) - { - optch = getopt_long (argc, argv, "chilqswv", long_options, &long_index); - - if (optch == EOF) /* End of arguments. */ - break; - - switch (optch) - { - case 'c': /* compile only */ - compile_only = TRUE; - break; - - case 'h': /* help */ - usage(argv[0]); - exit (0); - break; - - case 'i': /* force interactive */ - interactive = TRUE; - break; - - case 'l': /* math lib */ - use_math = TRUE; - break; - - case 'q': /* quiet mode */ - quiet = TRUE; - break; - - case 's': /* Non standard features give errors. */ - std_only = TRUE; - break; - - case 'v': /* Print the version. */ - show_bc_version (); - exit (0); - break; - - case 'w': /* Non standard features give warnings. */ - warn_not_std = TRUE; - break; - - case 0: - /* long options */ - break; - - default: - usage(argv[0]); - exit (1); - } - } - - /* Add file names to a list of files to process. */ - while (optind < argc) - { - temp = (file_node *) bc_malloc(sizeof(file_node)); - temp->name = argv[optind]; - temp->next = NULL; - if (last == NULL) - file_names = temp; - else - last->next = temp; - last = temp; - optind++; - } -} - -/* The main program for bc. */ -int -main (argc, argv) - int argc; - char *argv[]; -{ - char *env_value; - char *env_argv[30]; - int env_argc; - - /* Initialize many variables. */ - compile_only = FALSE; - use_math = FALSE; - warn_not_std = FALSE; - std_only = FALSE; - if (isatty(0) && isatty(1)) - interactive = TRUE; - else - interactive = FALSE; - quiet = FALSE; - file_names = NULL; - -#ifdef HAVE_SETVBUF - /* attempt to simplify interaction with applications such as emacs */ - (void) setvbuf(stdout, NULL, _IOLBF, 0); -#endif - - /* Environment arguments. */ - env_value = getenv ("BC_ENV_ARGS"); - if (env_value != NULL) - { - env_argc = 1; - env_argv[0] = "BC_ENV_ARGS"; - while (*env_value != 0) - { - if (*env_value != ' ') - { - env_argv[env_argc++] = env_value; - while (*env_value != ' ' && *env_value != 0) - env_value++; - if (*env_value != 0) - { - *env_value = 0; - env_value++; - } - } - else - env_value++; - } - parse_args (env_argc, env_argv); - } - - /* Command line arguments. */ - parse_args (argc, argv); - - /* Other environment processing. */ - if (getenv ("POSIXLY_CORRECT") != NULL) - std_only = TRUE; - - env_value = getenv ("BC_LINE_LENGTH"); - if (env_value != NULL) - { - line_size = atoi (env_value); - if (line_size < 2) - line_size = 70; - } - else - line_size = 70; - - /* Initialize the machine. */ - init_storage(); - init_load(); - - /* Set up interrupts to print a message. */ - if (interactive) - signal (SIGINT, use_quit); - - /* Initialize the front end. */ - init_tree(); - init_gen (); - is_std_in = FALSE; - first_file = TRUE; - if (!open_new_file ()) - exit (1); - -#if defined(LIBEDIT) - if (interactive) { - /* Enable libedit support. */ - edit = el_init ("bc", stdin, stdout, stderr); - hist = history_init(); - el_set (edit, EL_EDITOR, "emacs"); - el_set (edit, EL_HIST, history, hist); - el_set (edit, EL_PROMPT, null_prompt); - el_source (edit, NULL); - history (hist, &histev, H_SETSIZE, INT_MAX); - } -#endif - -#if defined(READLINE) - if (interactive) { - /* Readline support. Set both application name and input file. */ - rl_readline_name = "bc"; - rl_instream = stdin; - using_history (); - } -#endif - - /* Do the parse. */ - yyparse (); - - /* End the compile only output with a newline. */ - if (compile_only) - printf ("\n"); - - exit (0); -} - - -/* This is the function that opens all the files. - It returns TRUE if the file was opened, otherwise - it returns FALSE. */ - -int -open_new_file () -{ - FILE *new_file; - file_node *temp; - - /* Set the line number. */ - line_no = 1; - - /* Check to see if we are done. */ - if (is_std_in) return (FALSE); - - /* Open the other files. */ - if (use_math && first_file) - { - /* Load the code from a precompiled version of the math libarary. */ - extern char *libmath[]; - char **mstr; - char tmp; - /* These MUST be in the order of first mention of each function. - That is why "a" comes before "c" even though "a" is defined after - after "c". "a" is used in "s"! */ - tmp = lookup ("e", FUNCT); - tmp = lookup ("l", FUNCT); - tmp = lookup ("s", FUNCT); - tmp = lookup ("a", FUNCT); - tmp = lookup ("c", FUNCT); - tmp = lookup ("j", FUNCT); - mstr = libmath; - while (*mstr) { - load_code (*mstr); - mstr++; - } - } - - /* One of the argv values. */ - if (file_names != NULL) - { - new_file = fopen (file_names->name, "r"); - if (new_file != NULL) - { - new_yy_file (new_file); - temp = file_names; - file_name = temp->name; - file_names = temp->next; - free (temp); - return TRUE; - } - fprintf (stderr, "File %s is unavailable.\n", file_names->name); - exit (1); - } - - /* If we fall through to here, we should return stdin. */ - new_yy_file (stdin); - is_std_in = TRUE; - return TRUE; -} - - -/* Set yyin to the new file. */ - -void -new_yy_file (file) - FILE *file; -{ - if (!first_file) fclose (yyin); - yyin = file; - first_file = FALSE; -} - - -/* Message to use quit. */ - -void -use_quit (sig) - int sig; -{ - printf ("\n(interrupt) use quit to exit.\n"); - signal (SIGINT, use_quit); -} diff --git a/contrib/bc/bc/proto.h b/contrib/bc/bc/proto.h deleted file mode 100644 index 1e7311f..0000000 --- a/contrib/bc/bc/proto.h +++ /dev/null @@ -1,148 +0,0 @@ -/* proto.h: Prototype function definitions for "external" functions. */ - -/* This file is part of GNU bc. - Copyright (C) 1991-1994, 1997, 2000 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -/* For the pc version using k&r ACK. (minix1.5 and earlier.) */ -#ifdef SHORTNAMES -#define init_numbers i_numbers -#define push_constant push__constant -#define load_const in_load_const -#define yy_get_next_buffer yyget_next_buffer -#define yy_init_buffer yyinit_buffer -#define yy_last_accepting_state yylast_accepting_state -#define arglist1 arg1list -#endif - -/* Include the standard library header files. */ -#ifdef HAVE_UNISTD_H -#include <unistd.h> -#endif -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif - -/* Define the _PROTOTYPE macro if it is needed. */ - -#ifndef _PROTOTYPE -#ifdef __STDC__ -#define _PROTOTYPE(func, args) func args -#else -#define _PROTOTYPE(func, args) func() -#endif -#endif - -/* From execute.c */ -_PROTOTYPE(void stop_execution, (int)); -_PROTOTYPE(unsigned char byte, (program_counter *pc)); -_PROTOTYPE(void execute, (void)); -_PROTOTYPE(char prog_char, (void)); -_PROTOTYPE(char input_char, (void)); -_PROTOTYPE(void push_constant, (char (*in_char)(void), int conv_base)); -_PROTOTYPE(void push_b10_const, (program_counter *pc)); -_PROTOTYPE(void assign, (int c_code)); - -/* From util.c */ -_PROTOTYPE(char *strcopyof, (char *str)); -_PROTOTYPE(arg_list *nextarg, (arg_list *args, int val, int is_var)); -_PROTOTYPE(char *arg_str, (arg_list *args)); -_PROTOTYPE(char *call_str, (arg_list *args)); -_PROTOTYPE(void free_args, (arg_list *args)); -_PROTOTYPE(void check_params, (arg_list *params, arg_list *autos)); -_PROTOTYPE(void init_gen, (void)); -_PROTOTYPE(void generate, (char *str)); -_PROTOTYPE(void run_code, (void)); -_PROTOTYPE(void out_char, (int ch)); -_PROTOTYPE(void out_schar, (int ch)); -_PROTOTYPE(id_rec *find_id, (id_rec *tree, char *id)); -_PROTOTYPE(int insert_id_rec, (id_rec **root, id_rec *new_id)); -_PROTOTYPE(void init_tree, (void)); -_PROTOTYPE(int lookup, (char *name, int namekind)); -_PROTOTYPE(char *bc_malloc, (int)); -_PROTOTYPE(void out_of_memory, (void)); -_PROTOTYPE(void welcome, (void)); -_PROTOTYPE(void warranty, (char *)); -_PROTOTYPE(void show_bc_version, (void)); -_PROTOTYPE(void limits, (void)); -_PROTOTYPE(void yyerror, (char *str ,...)); -_PROTOTYPE(void warn, (char *mesg ,...)); -_PROTOTYPE(void rt_error, (char *mesg ,...)); -_PROTOTYPE(void rt_warn, (char *mesg ,...)); - -/* From load.c */ -_PROTOTYPE(void init_load, (void)); -_PROTOTYPE(void addbyte, (int byte)); -_PROTOTYPE(void def_label, (long lab)); -_PROTOTYPE(long long_val, (char **str)); -_PROTOTYPE(void load_code, (char *code)); - -/* From main.c */ -_PROTOTYPE(int open_new_file, (void)); -_PROTOTYPE(void new_yy_file, (FILE *file)); -_PROTOTYPE(void use_quit, (int)); - -/* From storage.c */ -_PROTOTYPE(void init_storage, (void)); -_PROTOTYPE(void more_functions, (void)); -_PROTOTYPE(void more_variables, (void)); -_PROTOTYPE(void more_arrays, (void)); -_PROTOTYPE(void clear_func, (int func )); -_PROTOTYPE(int fpop, (void)); -_PROTOTYPE(void fpush, (int val )); -_PROTOTYPE(void pop, (void)); -_PROTOTYPE(void push_copy, (bc_num num )); -_PROTOTYPE(void push_num, (bc_num num )); -_PROTOTYPE(char check_stack, (int depth )); -_PROTOTYPE(bc_var *get_var, (int var_name )); -_PROTOTYPE(bc_num *get_array_num, (int var_index, long index )); -_PROTOTYPE(void store_var, (int var_name )); -_PROTOTYPE(void store_array, (int var_name )); -_PROTOTYPE(void load_var, (int var_name )); -_PROTOTYPE(void load_array, (int var_name )); -_PROTOTYPE(void decr_var, (int var_name )); -_PROTOTYPE(void decr_array, (int var_name )); -_PROTOTYPE(void incr_var, (int var_name )); -_PROTOTYPE(void incr_array, (int var_name )); -_PROTOTYPE(void auto_var, (int name )); -_PROTOTYPE(void free_a_tree, (bc_array_node *root, int depth )); -_PROTOTYPE(void pop_vars, (arg_list *list )); -_PROTOTYPE(void process_params, (program_counter *pc, int func )); - -/* For the scanner and parser.... */ -_PROTOTYPE(int yyparse, (void)); -_PROTOTYPE(int yylex, (void)); - -#if defined(LIBEDIT) -/* The *?*&^ prompt function */ -_PROTOTYPE(char *null_prompt, (EditLine *)); -#endif - -/* Other things... */ -#ifndef HAVE_UNISTD_H -_PROTOTYPE (int getopt, (int, char *[], CONST char *)); -#endif diff --git a/contrib/bc/bc/sbc.y b/contrib/bc/bc/sbc.y deleted file mode 100644 index b1ff1d1..0000000 --- a/contrib/bc/bc/sbc.y +++ /dev/null @@ -1,448 +0,0 @@ -%{ -/* sbc.y: A POSIX bc processor written for minix with no extensions. */ - -/* This file is part of GNU bc. - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#include "bcdefs.h" -#include "global.h" /* To get the global variables. */ -#include "proto.h" -%} - -%start program - -%union { - char *s_value; - char c_value; - int i_value; - arg_list *a_value; - } - -%token <i_value> ENDOFLINE AND OR NOT -%token <s_value> STRING NAME NUMBER -/* '-', '+' are tokens themselves */ -%token <c_value> ASSIGN_OP -/* '=', '+=', '-=', '*=', '/=', '%=', '^=' */ -%token <s_value> REL_OP -/* '==', '<=', '>=', '!=', '<', '>' */ -%token <c_value> INCR_DECR -/* '++', '--' */ -%token <i_value> Define Break Quit Length -/* 'define', 'break', 'quit', 'length' */ -%token <i_value> Return For If While Sqrt Else -/* 'return', 'for', 'if', 'while', 'sqrt', 'else' */ -%token <i_value> Scale Ibase Obase Auto Read -/* 'scale', 'ibase', 'obase', 'auto', 'read' */ -%token <i_value> Warranty, Halt, Last, Continue, Print, Limits -/* 'warranty', 'halt', 'last', 'continue', 'print', 'limits' */ - -/* The types of all other non-terminals. */ -%type <i_value> expression named_expression return_expression -%type <a_value> opt_parameter_list parameter_list opt_auto_define_list -%type <a_value> define_list opt_argument_list argument_list -%type <i_value> program input_item semicolon_list statement_list -%type <i_value> statement_or_error statement function relational_expression - -/* precedence */ -%nonassoc REL_OP -%right ASSIGN_OP -%left '+' '-' -%left '*' '/' '%' -%right '^' -%nonassoc UNARY_MINUS -%nonassoc INCR_DECR - -%% -program : /* empty */ - { - $$ = 0; - std_only = TRUE; - if (interactive) - { - printf ("s%s\n", BC_VERSION); - welcome(); - } - } - | program input_item - ; -input_item : semicolon_list ENDOFLINE - { run_code(); } - | function - { run_code(); } - | error ENDOFLINE - { - yyerrok; - init_gen() ; - } - ; -semicolon_list : /* empty */ - { $$ = 0; } - | statement_or_error - | semicolon_list ';' statement_or_error - | semicolon_list ';' - ; -statement_list : /* empty */ - { $$ = 0; } - | statement - | statement_list ENDOFLINE - | statement_list ENDOFLINE statement - | statement_list ';' - | statement_list ';' statement - ; -statement_or_error : statement - | error statement - { $$ = $2; } - ; -statement : Warranty - { warranty("s"); } - | expression - { - if ($1 & 1) - generate ("W"); - else - generate ("p"); - } - | STRING - { - $$ = 0; - generate ("w"); - generate ($1); - free ($1); - } - | Break - { - if (break_label == 0) - yyerror ("Break outside a for/while"); - else - { - sprintf (genstr, "J%1d:", break_label); - generate (genstr); - } - } - | Quit - { exit(0); } - | Return - { generate ("0R"); } - | Return '(' return_expression ')' - { generate ("R"); } - | For - { - $1 = break_label; - break_label = next_label++; - } - '(' expression ';' - { - $4 = next_label++; - sprintf (genstr, "pN%1d:", $4); - generate (genstr); - } - relational_expression ';' - { - $7 = next_label++; - sprintf (genstr, "B%1d:J%1d:", $7, break_label); - generate (genstr); - $<i_value>$ = next_label++; - sprintf (genstr, "N%1d:", $<i_value>$); - generate (genstr); - } - expression ')' - { - sprintf (genstr, "pJ%1d:N%1d:", $4, $7); - generate (genstr); - } - statement - { - sprintf (genstr, "J%1d:N%1d:", $<i_value>9, - break_label); - generate (genstr); - break_label = $1; - } - | If '(' relational_expression ')' - { - $3 = next_label++; - sprintf (genstr, "Z%1d:", $3); - generate (genstr); - } - statement - { - sprintf (genstr, "N%1d:", $3); - generate (genstr); - } - | While - { - $1 = next_label++; - sprintf (genstr, "N%1d:", $1); - generate (genstr); - } - '(' relational_expression - { - $4 = break_label; - break_label = next_label++; - sprintf (genstr, "Z%1d:", break_label); - generate (genstr); - } - ')' statement - { - sprintf (genstr, "J%1d:N%1d:", $1, break_label); - generate (genstr); - break_label = $4; - } - | '{' statement_list '}' - { $$ = 0; } - ; -function : Define NAME '(' opt_parameter_list ')' '{' - ENDOFLINE opt_auto_define_list - { - check_params ($4,$8); - sprintf (genstr, "F%d,%s.%s[", lookup($2,FUNCT), - arg_str ($4), arg_str ($8)); - generate (genstr); - free_args ($4); - free_args ($8); - $1 = next_label; - next_label = 0; - } - statement_list ENDOFLINE '}' - { - generate ("0R]"); - next_label = $1; - } - ; -opt_parameter_list : /* empty */ - { $$ = NULL; } - | parameter_list - ; -parameter_list : NAME - { $$ = nextarg (NULL, lookup($1,SIMPLE), FALSE); } - | define_list ',' NAME - { $$ = nextarg ($1, lookup($3,SIMPLE), FALSE); } - ; -opt_auto_define_list : /* empty */ - { $$ = NULL; } - | Auto define_list ENDOFLINE - { $$ = $2; } - | Auto define_list ';' - { $$ = $2; } - ; -define_list : NAME - { $$ = nextarg (NULL, lookup($1,SIMPLE), FALSE); } - | NAME '[' ']' - { $$ = nextarg (NULL, lookup($1,ARRAY), FALSE); } - | define_list ',' NAME - { $$ = nextarg ($1, lookup($3,SIMPLE), FALSE); } - | define_list ',' NAME '[' ']' - { $$ = nextarg ($1, lookup($3,ARRAY), FALSE); } - ; -opt_argument_list : /* empty */ - { $$ = NULL; } - | argument_list - ; -argument_list : expression - { $$ = nextarg (NULL,0, FALSE); } - | argument_list ',' expression - { $$ = nextarg ($1,0, FALSE); } - ; -relational_expression : expression - { $$ = 0; } - | expression REL_OP expression - { - $$ = 0; - switch (*($2)) - { - case '=': - generate ("="); - break; - case '!': - generate ("#"); - break; - case '<': - if ($2[1] == '=') - generate ("{"); - else - generate ("<"); - break; - case '>': - if ($2[1] == '=') - generate ("}"); - else - generate (">"); - break; - } - } - ; -return_expression : /* empty */ - { - $$ = 0; - generate ("0"); - } - | expression - ; -expression : named_expression ASSIGN_OP - { - if ($2 != '=') - { - if ($1 < 0) - sprintf (genstr, "DL%d:", -$1); - else - sprintf (genstr, "l%d:", $1); - generate (genstr); - } - } - expression - { - $$ = 0; - if ($2 != '=') - { - sprintf (genstr, "%c", $2); - generate (genstr); - } - if ($1 < 0) - sprintf (genstr, "S%d:", -$1); - else - sprintf (genstr, "s%d:", $1); - generate (genstr); - } - | expression '+' expression - { generate ("+"); } - | expression '-' expression - { generate ("-"); } - | expression '*' expression - { generate ("*"); } - | expression '/' expression - { generate ("/"); } - | expression '%' expression - { generate ("%"); } - | expression '^' expression - { generate ("^"); } - | '-' expression %prec UNARY_MINUS - { generate ("n"); $$ = 1;} - | named_expression - { - $$ = 1; - if ($1 < 0) - sprintf (genstr, "L%d:", -$1); - else - sprintf (genstr, "l%d:", $1); - generate (genstr); - } - | NUMBER - { - int len = strlen($1); - $$ = 1; - if (len == 1 && *$1 == '0') - generate ("0"); - else - { - if (len == 1 && *$1 == '1') - generate ("1"); - else - { - generate ("K"); - generate ($1); - generate (":"); - } - free ($1); - } - } - | '(' expression ')' - { $$ = 1; } - | NAME '(' opt_argument_list ')' - { - $$ = 1; - if ($3 != NULL) - { - sprintf (genstr, "C%d,%s:", lookup($1,FUNCT), - arg_str ($3)); - free_args ($3); - } - else - sprintf (genstr, "C%d:", lookup($1,FUNCT)); - generate (genstr); - } - | INCR_DECR named_expression - { - $$ = 1; - if ($2 < 0) - { - if ($1 == '+') - sprintf (genstr, "DA%d:L%d:", -$2, -$2); - else - sprintf (genstr, "DM%d:L%d:", -$2, -$2); - } - else - { - if ($1 == '+') - sprintf (genstr, "i%d:l%d:", $2, $2); - else - sprintf (genstr, "d%d:l%d:", $2, $2); - } - generate (genstr); - } - | named_expression INCR_DECR - { - $$ = 1; - if ($1 < 0) - { - sprintf (genstr, "DL%d:x", -$1); - generate (genstr); - if ($2 == '+') - sprintf (genstr, "A%d:", -$1); - else - sprintf (genstr, "M%d:", -$1); - } - else - { - sprintf (genstr, "l%d:", $1); - generate (genstr); - if ($2 == '+') - sprintf (genstr, "i%d:", $1); - else - sprintf (genstr, "d%d:", $1); - } - generate (genstr); - } - | Length '(' expression ')' - { generate ("cL"); $$ = 1;} - | Sqrt '(' expression ')' - { generate ("cR"); $$ = 1;} - | Scale '(' expression ')' - { generate ("cS"); $$ = 1;} - ; -named_expression : NAME - { $$ = lookup($1,SIMPLE); } - | NAME '[' expression ']' - { $$ = lookup($1,ARRAY); } - | Ibase - { $$ = 0; } - | Obase - { $$ = 1; } - | Scale - { $$ = 2; } - ; - -%% diff --git a/contrib/bc/bc/scan.l b/contrib/bc/bc/scan.l deleted file mode 100644 index 8910c66..0000000 --- a/contrib/bc/bc/scan.l +++ /dev/null @@ -1,374 +0,0 @@ -%{ -/* $FreeBSD$ */ -/* scan.l: the (f)lex description file for the scanner. */ - -/* This file is part of GNU bc. - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#include "bcdefs.h" -#include "bc.h" -#include "global.h" -#include "proto.h" -#include <errno.h> - -/* Using flex, we can ask for a smaller input buffer. With lex, this - does nothing! */ - -#ifdef SMALL_BUF -#undef YY_READ_BUF_SIZE -#define YY_READ_BUF_SIZE 512 -#endif - -/* Force . as last for now. */ -#define DOT_IS_LAST - -/* We want to define our own yywrap. */ -#undef yywrap -_PROTOTYPE(int yywrap, (void)); - -#if defined(LIBEDIT) -/* Support for the BSD libedit with history for - nicer input on the interactive part of input. */ - -#include <histedit.h> - -/* Have input call the following function. */ -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - bcel_input((char *)buf, &result, max_size) - -/* Variables to help interface editline with bc. */ -static const char *bcel_line = (char *)NULL; -static int bcel_len = 0; - - -/* Required to get rid of that ugly ? default prompt! */ -char * -null_prompt (EditLine *el) -{ - return ""; -} - - -/* bcel_input puts upto MAX characters into BUF with the number put in - BUF placed in *RESULT. If the yy input file is the same as - stdin, use editline. Otherwise, just read it. -*/ - -static void -bcel_input (buf, result, max) - char *buf; - int *result; - int max; -{ - if (!edit || yyin != stdin) - { - while ( (*result = read( fileno(yyin), buf, max )) < 0 ) - if (errno != EINTR) - { - yyerror( "read() in flex scanner failed" ); - exit (1); - } - return; - } - - /* Do we need a new string? */ - if (bcel_len == 0) - { - bcel_line = el_gets(edit, &bcel_len); - if (bcel_line == NULL) { - /* end of file */ - *result = 0; - bcel_len = 0; - return; - } - if (bcel_len != 0) - history (hist, &histev, H_ENTER, bcel_line); - fflush (stdout); - } - - if (bcel_len <= max) - { - strncpy (buf, bcel_line, bcel_len); - *result = bcel_len; - bcel_len = 0; - } - else - { - strncpy (buf, bcel_line, max); - *result = max; - bcel_line += max; - bcel_len -= max; - } -} -#endif - -#ifdef READLINE -/* Support for the readline and history libraries. This allows - nicer input on the interactive part of input. */ - -/* Have input call the following function. */ -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - rl_input((char *)buf, &result, max_size) - -/* Variables to help interface readline with bc. */ -static char *rl_line = (char *)NULL; -static char *rl_start = (char *)NULL; -static int rl_len = 0; - -/* Definitions for readline access. */ -extern FILE *rl_instream; - -/* rl_input puts upto MAX characters into BUF with the number put in - BUF placed in *RESULT. If the yy input file is the same as - rl_instream (stdin), use readline. Otherwise, just read it. -*/ - -static void -rl_input (buf, result, max) - char *buf; - int *result; - int max; -{ - if (yyin != rl_instream) - { - while ( (*result = read( fileno(yyin), buf, max )) < 0 ) - if (errno != EINTR) - { - yyerror( "read() in flex scanner failed" ); - exit (1); - } - return; - } - - /* Do we need a new string? */ - if (rl_len == 0) - { - if (rl_start) - free(rl_start); - rl_start = readline (""); - if (rl_start == NULL) { - /* end of file */ - *result = 0; - rl_len = 0; - return; - } - rl_line = rl_start; - rl_len = strlen (rl_line)+1; - if (rl_len != 1) - add_history (rl_line); - rl_line[rl_len-1] = '\n'; - fflush (stdout); - } - - if (rl_len <= max) - { - strncpy (buf, rl_line, rl_len); - *result = rl_len; - rl_len = 0; - } - else - { - strncpy (buf, rl_line, max); - *result = max; - rl_line += max; - rl_len -= max; - } -} -#endif - -#if !defined(READLINE) && !defined(LIBEDIT) - -/* MINIX returns from read with < 0 if SIGINT is encountered. - In flex, we can redefine YY_INPUT to the following. In lex, this - does nothing! */ -#undef YY_INPUT -#define YY_INPUT(buf,result,max_size) \ - while ( (result = read( fileno(yyin), (char *) buf, max_size )) < 0 ) \ - if (errno != EINTR) \ - YY_FATAL_ERROR( "read() in flex scanner failed" ); -#endif - -%} -DIGIT [0-9A-F] -LETTER [a-z] -%s slcomment -%% -"#" { - if (!std_only) - BEGIN(slcomment); - else - yyerror ("illegal character: #"); - } -<slcomment>[^\n]* { BEGIN(INITIAL); } -<slcomment>"\n" { line_no++; BEGIN(INITIAL); return(ENDOFLINE); } -define return(Define); -break return(Break); -quit return(Quit); -length return(Length); -return return(Return); -for return(For); -if return(If); -while return(While); -sqrt return(Sqrt); -scale return(Scale); -ibase return(Ibase); -obase return(Obase); -auto return(Auto); -else return(Else); -read return(Read); -halt return(Halt); -last return(Last); -history { -#if defined(READLINE) || defined(LIBEDIT) - return(HistoryVar); -#else - yylval.s_value = strcopyof(yytext); return(NAME); -#endif - } - -warranty return(Warranty); -continue return(Continue); -print return(Print); -limits return(Limits); -"." { -#ifdef DOT_IS_LAST - return(Last); -#else - yyerror ("illegal character: %s",yytext); -#endif - } -"+"|"-"|";"|"("|")"|"{"|"}"|"["|"]"|","|"^" { yylval.c_value = yytext[0]; - return((int)yytext[0]); } -&& { return(AND); } -\|\| { return(OR); } -"!" { return(NOT); } -"*"|"/"|"%" { yylval.c_value = yytext[0]; return((int)yytext[0]); } -"="|\+=|-=|\*=|\/=|%=|\^= { yylval.c_value = yytext[0]; return(ASSIGN_OP); } -=\+|=-|=\*|=\/|=%|=\^ { -#ifdef OLD_EQ_OP - char warn_save; - warn_save = warn_not_std; - warn_not_std = TRUE; - warn ("Old fashioned =<op>"); - warn_not_std = warn_save; - yylval.c_value = yytext[1]; -#else - yylval.c_value = '='; - yyless (1); -#endif - return(ASSIGN_OP); - } -==|\<=|\>=|\!=|"<"|">" { yylval.s_value = strcopyof(yytext); return(REL_OP); } -\+\+|-- { yylval.c_value = yytext[0]; return(INCR_DECR); } -"\n" { line_no++; return(ENDOFLINE); } -\\\n { line_no++; /* ignore a "quoted" newline */ } -[ \t]+ { /* ignore spaces and tabs */ } -"/*" { - int c; - - for (;;) - { - while ( ((c=input()) != '*') && (c != EOF)) - /* eat it */ - if (c == '\n') line_no++; - if (c == '*') - { - while ( (c=input()) == '*') /* eat it*/; - if (c == '/') break; /* at end of comment */ - if (c == '\n') line_no++; - } - if (c == EOF) - { - fprintf (stderr,"EOF encountered in a comment.\n"); - break; - } - } - } -[a-z][a-z0-9_]* { yylval.s_value = strcopyof(yytext); return(NAME); } -\"[^\"]*\" { - unsigned char *look; - int count = 0; - yylval.s_value = strcopyof(yytext); - for (look = yytext; *look != 0; look++) - { - if (*look == '\n') line_no++; - if (*look == '"') count++; - } - if (count != 2) yyerror ("NUL character in string."); - return(STRING); - } -{DIGIT}({DIGIT}|\\\n)*("."({DIGIT}|\\\n)*)?|"."(\\\n)*{DIGIT}({DIGIT}|\\\n)* { - unsigned char *src, *dst; - int len; - /* remove a trailing decimal point. */ - len = strlen(yytext); - if (yytext[len-1] == '.') - yytext[len-1] = 0; - /* remove leading zeros. */ - src = yytext; - dst = yytext; - while (*src == '0') src++; - if (*src == 0) src--; - /* Copy strings removing the newlines. */ - while (*src != 0) - { - if (*src == '\\') - { - src++; src++; - line_no++; - } - else - *dst++ = *src++; - } - *dst = 0; - yylval.s_value = strcopyof(yytext); - return(NUMBER); - } -. { - if (yytext[0] < ' ') - yyerror ("illegal character: ^%c",yytext[0] + '@'); - else - if (yytext[0] > '~') - yyerror ("illegal character: \\%03o", (int) yytext[0]); - else - yyerror ("illegal character: %s",yytext); - } -%% - - - -/* This is the way to get multiple files input into lex. */ - -int -yywrap() -{ - if (!open_new_file ()) return (1); /* EOF on standard in. */ - return (0); /* We have more input. */ -} diff --git a/contrib/bc/bc/storage.c b/contrib/bc/bc/storage.c deleted file mode 100644 index 10ebf5c..0000000 --- a/contrib/bc/bc/storage.c +++ /dev/null @@ -1,1067 +0,0 @@ -/* storage.c: Code and data storage manipulations. This includes labels. */ - -/* This file is part of GNU bc. - Copyright (C) 1991-1994, 1997, 2000 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#include "bcdefs.h" -#include "global.h" -#include "proto.h" - - -/* Initialize the storage at the beginning of the run. */ - -void -init_storage () -{ - - /* Functions: we start with none and ask for more. */ - f_count = 0; - more_functions (); - f_names[0] = "(main)"; - - /* Variables. */ - v_count = 0; - more_variables (); - - /* Arrays. */ - a_count = 0; - more_arrays (); - - /* Other things... */ - ex_stack = NULL; - fn_stack = NULL; - i_base = 10; - o_base = 10; - scale = 0; -#if defined(READLINE) || defined(LIBEDIT) - n_history = -1; -#endif - c_code = FALSE; - bc_init_numbers(); -} - -/* Three functions for increasing the number of functions, variables, or - arrays that are needed. This adds another 32 of the requested object. */ - -void -more_functions (VOID) -{ - int old_count; - int indx; - bc_function *old_f; - bc_function *f; - char **old_names; - - /* Save old information. */ - old_count = f_count; - old_f = functions; - old_names = f_names; - - /* Add a fixed amount and allocate new space. */ - f_count += STORE_INCR; - functions = (bc_function *) bc_malloc (f_count*sizeof (bc_function)); - f_names = (char **) bc_malloc (f_count*sizeof (char *)); - - /* Copy old ones. */ - for (indx = 0; indx < old_count; indx++) - { - functions[indx] = old_f[indx]; - f_names[indx] = old_names[indx]; - } - - /* Initialize the new ones. */ - for (; indx < f_count; indx++) - { - f = &functions[indx]; - f->f_defined = FALSE; - f->f_body = (char *) bc_malloc (BC_START_SIZE); - f->f_body_size = BC_START_SIZE; - f->f_code_size = 0; - f->f_label = NULL; - f->f_autos = NULL; - f->f_params = NULL; - } - - /* Free the old elements. */ - if (old_count != 0) - { - free (old_f); - free (old_names); - } -} - -void -more_variables () -{ - int indx; - int old_count; - bc_var **old_var; - char **old_names; - - /* Save the old values. */ - old_count = v_count; - old_var = variables; - old_names = v_names; - - /* Increment by a fixed amount and allocate. */ - v_count += STORE_INCR; - variables = (bc_var **) bc_malloc (v_count*sizeof(bc_var *)); - v_names = (char **) bc_malloc (v_count*sizeof(char *)); - - /* Copy the old variables. */ - for (indx = 3; indx < old_count; indx++) - variables[indx] = old_var[indx]; - - /* Initialize the new elements. */ - for (; indx < v_count; indx++) - variables[indx] = NULL; - - /* Free the old elements. */ - if (old_count != 0) - { - free (old_var); - free (old_names); - } -} - -void -more_arrays () -{ - int indx; - int old_count; - bc_var_array **old_ary; - char **old_names; - - /* Save the old values. */ - old_count = a_count; - old_ary = arrays; - old_names = a_names; - - /* Increment by a fixed amount and allocate. */ - a_count += STORE_INCR; - arrays = (bc_var_array **) bc_malloc (a_count*sizeof(bc_var_array *)); - a_names = (char **) bc_malloc (a_count*sizeof(char *)); - - /* Copy the old arrays. */ - for (indx = 1; indx < old_count; indx++) - arrays[indx] = old_ary[indx]; - - - /* Initialize the new elements. */ - for (; indx < v_count; indx++) - arrays[indx] = NULL; - - /* Free the old elements. */ - if (old_count != 0) - { - free (old_ary); - free (old_names); - } -} - - -/* clear_func clears out function FUNC and makes it ready to redefine. */ - -void -clear_func (func) - int func; -{ - bc_function *f; - bc_label_group *lg; - - /* Set the pointer to the function. */ - f = &functions[func]; - f->f_defined = FALSE; - /* XXX restore f_body to initial size??? */ - f->f_code_size = 0; - if (f->f_autos != NULL) - { - free_args (f->f_autos); - f->f_autos = NULL; - } - if (f->f_params != NULL) - { - free_args (f->f_params); - f->f_params = NULL; - } - while (f->f_label != NULL) - { - lg = f->f_label->l_next; - free (f->f_label); - f->f_label = lg; - } -} - - -/* Pop the function execution stack and return the top. */ - -int -fpop() -{ - fstack_rec *temp; - int retval; - - if (fn_stack != NULL) - { - temp = fn_stack; - fn_stack = temp->s_next; - retval = temp->s_val; - free (temp); - } - else - { - retval = 0; - rt_error ("function stack underflow, contact maintainer."); - } - return (retval); -} - - -/* Push VAL on to the function stack. */ - -void -fpush (val) - int val; -{ - fstack_rec *temp; - - temp = (fstack_rec *) bc_malloc (sizeof (fstack_rec)); - temp->s_next = fn_stack; - temp->s_val = val; - fn_stack = temp; -} - - -/* Pop and discard the top element of the regular execution stack. */ - -void -pop () -{ - estack_rec *temp; - - if (ex_stack != NULL) - { - temp = ex_stack; - ex_stack = temp->s_next; - bc_free_num (&temp->s_num); - free (temp); - } -} - - -/* Push a copy of NUM on to the regular execution stack. */ - -void -push_copy (num) - bc_num num; -{ - estack_rec *temp; - - temp = (estack_rec *) bc_malloc (sizeof (estack_rec)); - temp->s_num = bc_copy_num (num); - temp->s_next = ex_stack; - ex_stack = temp; -} - - -/* Push NUM on to the regular execution stack. Do NOT push a copy. */ - -void -push_num (num) - bc_num num; -{ - estack_rec *temp; - - temp = (estack_rec *) bc_malloc (sizeof (estack_rec)); - temp->s_num = num; - temp->s_next = ex_stack; - ex_stack = temp; -} - - -/* Make sure the ex_stack has at least DEPTH elements on it. - Return TRUE if it has at least DEPTH elements, otherwise - return FALSE. */ - -char -check_stack (depth) - int depth; -{ - estack_rec *temp; - - temp = ex_stack; - while ((temp != NULL) && (depth > 0)) - { - temp = temp->s_next; - depth--; - } - if (depth > 0) - { - rt_error ("Stack error."); - return FALSE; - } - return TRUE; -} - - -/* The following routines manipulate simple variables and - array variables. */ - -/* get_var returns a pointer to the variable VAR_NAME. If one does not - exist, one is created. */ - -bc_var * -get_var (var_name) - int var_name; -{ - bc_var *var_ptr; - - var_ptr = variables[var_name]; - if (var_ptr == NULL) - { - var_ptr = variables[var_name] = (bc_var *) bc_malloc (sizeof (bc_var)); - bc_init_num (&var_ptr->v_value); - } - return var_ptr; -} - - -/* get_array_num returns the address of the bc_num in the array - structure. If more structure is requried to get to the index, - this routine does the work to create that structure. VAR_INDEX - is a zero based index into the arrays storage array. INDEX is - the index into the bc array. */ - -bc_num * -get_array_num (var_index, index) - int var_index; - long index; -{ - bc_var_array *ary_ptr; - bc_array *a_var; - bc_array_node *temp; - int log, ix, ix1; - int sub [NODE_DEPTH]; - - /* Get the array entry. */ - ary_ptr = arrays[var_index]; - if (ary_ptr == NULL) - { - ary_ptr = arrays[var_index] = - (bc_var_array *) bc_malloc (sizeof (bc_var_array)); - ary_ptr->a_value = NULL; - ary_ptr->a_next = NULL; - ary_ptr->a_param = FALSE; - } - - a_var = ary_ptr->a_value; - if (a_var == NULL) { - a_var = ary_ptr->a_value = (bc_array *) bc_malloc (sizeof (bc_array)); - a_var->a_tree = NULL; - a_var->a_depth = 0; - } - - /* Get the index variable. */ - sub[0] = index & NODE_MASK; - ix = index >> NODE_SHIFT; - log = 1; - while (ix > 0 || log < a_var->a_depth) - { - sub[log] = ix & NODE_MASK; - ix >>= NODE_SHIFT; - log++; - } - - /* Build any tree that is necessary. */ - while (log > a_var->a_depth) - { - temp = (bc_array_node *) bc_malloc (sizeof(bc_array_node)); - if (a_var->a_depth != 0) - { - temp->n_items.n_down[0] = a_var->a_tree; - for (ix=1; ix < NODE_SIZE; ix++) - temp->n_items.n_down[ix] = NULL; - } - else - { - for (ix=0; ix < NODE_SIZE; ix++) - temp->n_items.n_num[ix] = bc_copy_num(_zero_); - } - a_var->a_tree = temp; - a_var->a_depth++; - } - - /* Find the indexed variable. */ - temp = a_var->a_tree; - while ( log-- > 1) - { - ix1 = sub[log]; - if (temp->n_items.n_down[ix1] == NULL) - { - temp->n_items.n_down[ix1] = - (bc_array_node *) bc_malloc (sizeof(bc_array_node)); - temp = temp->n_items.n_down[ix1]; - if (log > 1) - for (ix=0; ix < NODE_SIZE; ix++) - temp->n_items.n_down[ix] = NULL; - else - for (ix=0; ix < NODE_SIZE; ix++) - temp->n_items.n_num[ix] = bc_copy_num(_zero_); - } - else - temp = temp->n_items.n_down[ix1]; - } - - /* Return the address of the indexed variable. */ - return &(temp->n_items.n_num[sub[0]]); -} - - -/* Store the top of the execution stack into VAR_NAME. - This includes the special variables ibase, obase, and scale. */ - -void -store_var (var_name) - int var_name; -{ - bc_var *var_ptr; - long temp; - char toobig; - - if (var_name > 3) - { - /* It is a simple variable. */ - var_ptr = get_var (var_name); - if (var_ptr != NULL) - { - bc_free_num(&var_ptr->v_value); - var_ptr->v_value = bc_copy_num (ex_stack->s_num); - } - } - else - { - /* It is a special variable... */ - toobig = FALSE; - temp = 0; - if (bc_is_neg (ex_stack->s_num)) - { - switch (var_name) - { - case 0: - rt_warn ("negative ibase, set to 2"); - temp = 2; - break; - case 1: - rt_warn ("negative obase, set to 2"); - temp = 2; - break; - case 2: - rt_warn ("negative scale, set to 0"); - temp = 0; - break; -#if defined(READLINE) || defined(LIBEDIT) - case 3: - temp = -1; - break; -#endif - } - } - else - { - temp = bc_num2long (ex_stack->s_num); - if (!bc_is_zero (ex_stack->s_num) && temp == 0) - toobig = TRUE; - } - switch (var_name) - { - case 0: - if (temp < 2 && !toobig) - { - i_base = 2; - rt_warn ("ibase too small, set to 2"); - } - else - if (temp > 16 || toobig) - { - i_base = 16; - rt_warn ("ibase too large, set to 16"); - } - else - i_base = (int) temp; - break; - - case 1: - if (temp < 2 && !toobig) - { - o_base = 2; - rt_warn ("obase too small, set to 2"); - } - else - if (temp > BC_BASE_MAX || toobig) - { - o_base = BC_BASE_MAX; - rt_warn ("obase too large, set to %d", BC_BASE_MAX); - } - else - o_base = (int) temp; - break; - - case 2: - /* WARNING: The following if statement may generate a compiler - warning if INT_MAX == LONG_MAX. This is NOT a problem. */ - if (temp > BC_SCALE_MAX || toobig ) - { - scale = BC_SCALE_MAX; - rt_warn ("scale too large, set to %d", BC_SCALE_MAX); - } - else - scale = (int) temp; - break; - -#if defined(READLINE) || defined(LIBEDIT) - case 3: - if (toobig) - { - temp = -1; - rt_warn ("history too large, set to unlimited"); - UNLIMIT_HISTORY; - } - else - { - n_history = temp; - if (temp < 0) - UNLIMIT_HISTORY; - else - HISTORY_SIZE(n_history); - } -#endif - } - } -} - - -/* Store the top of the execution stack into array VAR_NAME. - VAR_NAME is the name of an array, and the next to the top - of stack for the index into the array. */ - -void -store_array (var_name) - int var_name; -{ - bc_num *num_ptr; - long index; - - if (!check_stack(2)) return; - index = bc_num2long (ex_stack->s_next->s_num); - if (index < 0 || index > BC_DIM_MAX || - (index == 0 && !bc_is_zero(ex_stack->s_next->s_num))) - rt_error ("Array %s subscript out of bounds.", a_names[var_name]); - else - { - num_ptr = get_array_num (var_name, index); - if (num_ptr != NULL) - { - bc_free_num (num_ptr); - *num_ptr = bc_copy_num (ex_stack->s_num); - bc_free_num (&ex_stack->s_next->s_num); - ex_stack->s_next->s_num = ex_stack->s_num; - bc_init_num (&ex_stack->s_num); - pop(); - } - } -} - - -/* Load a copy of VAR_NAME on to the execution stack. This includes - the special variables ibase, obase and scale. */ - -void -load_var (var_name) - int var_name; -{ - bc_var *var_ptr; - - switch (var_name) - { - - case 0: - /* Special variable ibase. */ - push_copy (_zero_); - bc_int2num (&ex_stack->s_num, i_base); - break; - - case 1: - /* Special variable obase. */ - push_copy (_zero_); - bc_int2num (&ex_stack->s_num, o_base); - break; - - case 2: - /* Special variable scale. */ - push_copy (_zero_); - bc_int2num (&ex_stack->s_num, scale); - break; - -#if defined(READLINE) || defined(LIBEDIT) - case 3: - /* Special variable history. */ - push_copy (_zero_); - bc_int2num (&ex_stack->s_num, n_history); - break; -#endif - - default: - /* It is a simple variable. */ - var_ptr = variables[var_name]; - if (var_ptr != NULL) - push_copy (var_ptr->v_value); - else - push_copy (_zero_); - } -} - - -/* Load a copy of VAR_NAME on to the execution stack. This includes - the special variables ibase, obase and scale. */ - -void -load_array (var_name) - int var_name; -{ - bc_num *num_ptr; - long index; - - if (!check_stack(1)) return; - index = bc_num2long (ex_stack->s_num); - if (index < 0 || index > BC_DIM_MAX || - (index == 0 && !bc_is_zero(ex_stack->s_num))) - rt_error ("Array %s subscript out of bounds.", a_names[var_name]); - else - { - num_ptr = get_array_num (var_name, index); - if (num_ptr != NULL) - { - pop(); - push_copy (*num_ptr); - } - } -} - - -/* Decrement VAR_NAME by one. This includes the special variables - ibase, obase, and scale. */ - -void -decr_var (var_name) - int var_name; -{ - bc_var *var_ptr; - - switch (var_name) - { - - case 0: /* ibase */ - if (i_base > 2) - i_base--; - else - rt_warn ("ibase too small in --"); - break; - - case 1: /* obase */ - if (o_base > 2) - o_base--; - else - rt_warn ("obase too small in --"); - break; - - case 2: /* scale */ - if (scale > 0) - scale--; - else - rt_warn ("scale can not be negative in -- "); - break; - -#if defined(READLINE) || defined(LIBEDIT) - case 3: /* history */ - n_history--; - if (n_history >= 0) - HISTORY_SIZE(n_history); - else - { - n_history = -1; - rt_warn ("history is negative, set to unlimited"); - UNLIMIT_HISTORY; - } -#endif - - default: /* It is a simple variable. */ - var_ptr = get_var (var_name); - if (var_ptr != NULL) - bc_sub (var_ptr->v_value,_one_,&var_ptr->v_value, 0); - } -} - - -/* Decrement VAR_NAME by one. VAR_NAME is an array, and the top of - the execution stack is the index and it is popped off the stack. */ - -void -decr_array (var_name) - int var_name; -{ - bc_num *num_ptr; - long index; - - /* It is an array variable. */ - if (!check_stack (1)) return; - index = bc_num2long (ex_stack->s_num); - if (index < 0 || index > BC_DIM_MAX || - (index == 0 && !bc_is_zero (ex_stack->s_num))) - rt_error ("Array %s subscript out of bounds.", a_names[var_name]); - else - { - num_ptr = get_array_num (var_name, index); - if (num_ptr != NULL) - { - pop (); - bc_sub (*num_ptr, _one_, num_ptr, 0); - } - } -} - - -/* Increment VAR_NAME by one. This includes the special variables - ibase, obase, and scale. */ - -void -incr_var (var_name) - int var_name; -{ - bc_var *var_ptr; - - switch (var_name) - { - - case 0: /* ibase */ - if (i_base < 16) - i_base++; - else - rt_warn ("ibase too big in ++"); - break; - - case 1: /* obase */ - if (o_base < BC_BASE_MAX) - o_base++; - else - rt_warn ("obase too big in ++"); - break; - - case 2: - if (scale < BC_SCALE_MAX) - scale++; - else - rt_warn ("Scale too big in ++"); - break; - -#if defined(READLINE) || defined(LIBEDIT) - case 3: /* history */ - n_history++; - if (n_history > 0) - HISTORY_SIZE(n_history); - else - { - n_history = -1; - rt_warn ("history set to unlimited"); - UNLIMIT_HISTORY; - } -#endif - - default: /* It is a simple variable. */ - var_ptr = get_var (var_name); - if (var_ptr != NULL) - bc_add (var_ptr->v_value, _one_, &var_ptr->v_value, 0); - - } -} - - -/* Increment VAR_NAME by one. VAR_NAME is an array and top of - execution stack is the index and is popped off the stack. */ - -void -incr_array (var_name) - int var_name; -{ - bc_num *num_ptr; - long index; - - if (!check_stack (1)) return; - index = bc_num2long (ex_stack->s_num); - if (index < 0 || index > BC_DIM_MAX || - (index == 0 && !bc_is_zero (ex_stack->s_num))) - rt_error ("Array %s subscript out of bounds.", a_names[var_name]); - else - { - num_ptr = get_array_num (var_name, index); - if (num_ptr != NULL) - { - pop (); - bc_add (*num_ptr, _one_, num_ptr, 0); - } - } -} - - -/* Routines for processing autos variables and parameters. */ - -/* NAME is an auto variable that needs to be pushed on its stack. */ - -void -auto_var (name) - int name; -{ - bc_var *v_temp; - bc_var_array *a_temp; - int ix; - - if (name > 0) - { - /* A simple variable. */ - ix = name; - v_temp = (bc_var *) bc_malloc (sizeof (bc_var)); - v_temp->v_next = variables[ix]; - bc_init_num (&v_temp->v_value); - variables[ix] = v_temp; - } - else - { - /* An array variable. */ - ix = -name; - a_temp = (bc_var_array *) bc_malloc (sizeof (bc_var_array)); - a_temp->a_next = arrays[ix]; - a_temp->a_value = NULL; - a_temp->a_param = FALSE; - arrays[ix] = a_temp; - } -} - - -/* Free_a_tree frees everything associated with an array variable tree. - This is used when popping an array variable off its auto stack. */ - -void -free_a_tree ( root, depth ) - bc_array_node *root; - int depth; -{ - int ix; - - if (root != NULL) - { - if (depth > 1) - for (ix = 0; ix < NODE_SIZE; ix++) - free_a_tree (root->n_items.n_down[ix], depth-1); - else - for (ix = 0; ix < NODE_SIZE; ix++) - bc_free_num ( &(root->n_items.n_num[ix])); - free (root); - } -} - - -/* LIST is an NULL terminated list of varible names that need to be - popped off their auto stacks. */ - -void -pop_vars (list) - arg_list *list; -{ - bc_var *v_temp; - bc_var_array *a_temp; - int ix; - - while (list != NULL) - { - ix = list->av_name; - if (ix > 0) - { - /* A simple variable. */ - v_temp = variables[ix]; - if (v_temp != NULL) - { - variables[ix] = v_temp->v_next; - bc_free_num (&v_temp->v_value); - free (v_temp); - } - } - else - { - /* An array variable. */ - ix = -ix; - a_temp = arrays[ix]; - if (a_temp != NULL) - { - arrays[ix] = a_temp->a_next; - if (!a_temp->a_param && a_temp->a_value != NULL) - { - free_a_tree (a_temp->a_value->a_tree, - a_temp->a_value->a_depth); - free (a_temp->a_value); - } - free (a_temp); - } - } - list = list->next; - } -} - -/* COPY_NODE: Copies an array node for a call by value parameter. */ -bc_array_node * -copy_tree (ary_node, depth) - bc_array_node *ary_node; - int depth; -{ - bc_array_node *res = (bc_array_node *) bc_malloc (sizeof(bc_array_node)); - int i; - - if (depth > 1) - for (i=0; i<NODE_SIZE; i++) - if (ary_node->n_items.n_down[i] != NULL) - res->n_items.n_down[i] = - copy_tree (ary_node->n_items.n_down[i], depth - 1); - else - res->n_items.n_down[i] = NULL; - else - for (i=0; i<NODE_SIZE; i++) - if (ary_node->n_items.n_num[i] != NULL) - res->n_items.n_num[i] = bc_copy_num (ary_node->n_items.n_num[i]); - else - res->n_items.n_num[i] = NULL; - return res; -} - -/* COPY_ARRAY: Copies an array for a call by value array parameter. - ARY is the pointer to the bc_array structure. */ - -bc_array * -copy_array (ary) - bc_array *ary; -{ - bc_array *res = (bc_array *) bc_malloc (sizeof(bc_array)); - res->a_depth = ary->a_depth; - res->a_tree = copy_tree (ary->a_tree, ary->a_depth); - return (res); -} - - -/* A call is being made to FUNC. The call types are at PC. Process - the parameters by doing an auto on the parameter variable and then - store the value at the new variable or put a pointer the the array - variable. */ - -void -process_params (pc, func) - program_counter *pc; - int func; -{ - char ch; - arg_list *params; - int ix, ix1; - bc_var *v_temp; - bc_var_array *a_src, *a_dest; - bc_num *n_temp; - - /* Get the parameter names from the function. */ - params = functions[func].f_params; - - while ((ch = byte(pc)) != ':') - { - if (params != NULL) - { - if ((ch == '0') && params->av_name > 0) - { - /* A simple variable. */ - ix = params->av_name; - v_temp = (bc_var *) bc_malloc (sizeof(bc_var)); - v_temp->v_next = variables[ix]; - v_temp->v_value = ex_stack->s_num; - bc_init_num (&ex_stack->s_num); - variables[ix] = v_temp; - } - else - if ((ch == '1') && (params->av_name < 0)) - { - /* The variables is an array variable. */ - - /* Compute source index and make sure some structure exists. */ - ix = (int) bc_num2long (ex_stack->s_num); - n_temp = get_array_num (ix, 0); - - /* Push a new array and Compute Destination index */ - auto_var (params->av_name); - ix1 = -params->av_name; - - /* Set up the correct pointers in the structure. */ - if (ix == ix1) - a_src = arrays[ix]->a_next; - else - a_src = arrays[ix]; - a_dest = arrays[ix1]; - if (params->arg_is_var) - { - a_dest->a_param = TRUE; - a_dest->a_value = a_src->a_value; - } - else - { - a_dest->a_param = FALSE; - a_dest->a_value = copy_array (a_src->a_value); - } - } - else - { - if (params->av_name < 0) - rt_error ("Parameter type mismatch parameter %s.", - a_names[-params->av_name]); - else - rt_error ("Parameter type mismatch, parameter %s.", - v_names[params->av_name]); - params++; - } - pop (); - } - else - { - rt_error ("Parameter number mismatch"); - return; - } - params = params->next; - } - if (params != NULL) - rt_error ("Parameter number mismatch"); -} diff --git a/contrib/bc/bc/util.c b/contrib/bc/bc/util.c deleted file mode 100644 index c305c2e..0000000 --- a/contrib/bc/bc/util.c +++ /dev/null @@ -1,873 +0,0 @@ -/* util.c: Utility routines for bc. */ - -/* This file is part of GNU bc. - Copyright (C) 1991-1994, 1997, 2000 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111 USA - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - - -#include "bcdefs.h" -#ifndef VARARGS -#include <stdarg.h> -#else -#include <varargs.h> -#endif -#include "global.h" -#include "proto.h" - - -/* strcopyof mallocs new memory and copies a string to to the new - memory. */ - -char * -strcopyof (str) - char *str; -{ - char *temp; - - temp = (char *) bc_malloc (strlen (str)+1); - return (strcpy (temp,str)); -} - - -/* nextarg adds another value to the list of arguments. */ - -arg_list * -nextarg (args, val, is_var) - arg_list *args; - int val; - int is_var; -{ arg_list *temp; - - temp = (arg_list *) bc_malloc (sizeof (arg_list)); - temp->av_name = val; - temp->arg_is_var = is_var; - temp->next = args; - - return (temp); -} - - -/* For generate, we must produce a string in the form - "val,val,...,val". We also need a couple of static variables - for retaining old generated strings. It also uses a recursive - function that builds the string. */ - -static char *arglist1 = NULL, *arglist2 = NULL; - - -/* make_arg_str does the actual construction of the argument string. - ARGS is the pointer to the list and LEN is the maximum number of - characters needed. 1 char is the minimum needed. - */ - -_PROTOTYPE (static char *make_arg_str, (arg_list *args, int len)); - -static char * -make_arg_str (args, len) - arg_list *args; - int len; -{ - char *temp; - char sval[20]; - - /* Recursive call. */ - if (args != NULL) - temp = make_arg_str (args->next, len+12); - else - { - temp = (char *) bc_malloc (len); - *temp = 0; - return temp; - } - - /* Add the current number to the end of the string. */ - if (args->arg_is_var) - if (len != 1) - sprintf (sval, "*%d,", args->av_name); - else - sprintf (sval, "*%d", args->av_name); - else - if (len != 1) - sprintf (sval, "%d,", args->av_name); - else - sprintf (sval, "%d", args->av_name); - temp = strcat (temp, sval); - return (temp); -} - -char * -arg_str (args) - arg_list *args; -{ - if (arglist2 != NULL) - free (arglist2); - arglist2 = arglist1; - arglist1 = make_arg_str (args, 1); - return (arglist1); -} - -char * -call_str (args) - arg_list *args; -{ - arg_list *temp; - int arg_count; - int ix; - - if (arglist2 != NULL) - free (arglist2); - arglist2 = arglist1; - - /* Count the number of args and add the 0's and 1's. */ - for (temp = args, arg_count = 0; temp != NULL; temp = temp->next) - arg_count++; - arglist1 = (char *) bc_malloc(arg_count+1); - for (temp = args, ix=0; temp != NULL; temp = temp->next) - arglist1[ix++] = ( temp->av_name ? '1' : '0'); - arglist1[ix] = 0; - - return (arglist1); -} - -/* free_args frees an argument list ARGS. */ - -void -free_args (args) - arg_list *args; -{ - arg_list *temp; - - temp = args; - while (temp != NULL) - { - args = args->next; - free (temp); - temp = args; - } -} - - -/* Check for valid parameter (PARAMS) and auto (AUTOS) lists. - There must be no duplicates any where. Also, this is where - warnings are generated for array parameters. */ - -void -check_params ( params, autos ) - arg_list *params, *autos; -{ - arg_list *tmp1, *tmp2; - - /* Check for duplicate parameters. */ - if (params != NULL) - { - tmp1 = params; - while (tmp1 != NULL) - { - tmp2 = tmp1->next; - while (tmp2 != NULL) - { - if (tmp2->av_name == tmp1->av_name) - yyerror ("duplicate parameter names"); - tmp2 = tmp2->next; - } - if (tmp1->arg_is_var) - warn ("Variable array parameter"); - tmp1 = tmp1->next; - } - } - - /* Check for duplicate autos. */ - if (autos != NULL) - { - tmp1 = autos; - while (tmp1 != NULL) - { - tmp2 = tmp1->next; - while (tmp2 != NULL) - { - if (tmp2->av_name == tmp1->av_name) - yyerror ("duplicate auto variable names"); - tmp2 = tmp2->next; - } - if (tmp1->arg_is_var) - yyerror ("* not allowed here"); - tmp1 = tmp1->next; - } - } - - /* Check for duplicate between parameters and autos. */ - if ((params != NULL) && (autos != NULL)) - { - tmp1 = params; - while (tmp1 != NULL) - { - tmp2 = autos; - while (tmp2 != NULL) - { - if (tmp2->av_name == tmp1->av_name) - yyerror ("variable in both parameter and auto lists"); - tmp2 = tmp2->next; - } - tmp1 = tmp1->next; - } - } -} - - -/* Initialize the code generator the parser. */ - -void -init_gen () -{ - /* Get things ready. */ - break_label = 0; - continue_label = 0; - next_label = 1; - out_count = 2; - if (compile_only) - printf ("@i"); - else - init_load (); - had_error = FALSE; - did_gen = FALSE; -} - - -/* generate code STR for the machine. */ - -void -generate (str) - char *str; -{ - did_gen = TRUE; - if (compile_only) - { - printf ("%s",str); - out_count += strlen(str); - if (out_count > 60) - { - printf ("\n"); - out_count = 0; - } - } - else - load_code (str); -} - - -/* Execute the current code as loaded. */ - -void -run_code() -{ - /* If no compile errors run the current code. */ - if (!had_error && did_gen) - { - if (compile_only) - { - printf ("@r\n"); - out_count = 0; - } - else - execute (); - } - - /* Reinitialize the code generation and machine. */ - if (did_gen) - init_gen(); - else - had_error = FALSE; -} - - -/* Output routines: Write a character CH to the standard output. - It keeps track of the number of characters output and may - break the output with a "\<cr>". Always used for numbers. */ - -void -out_char (ch) - int ch; -{ - if (ch == '\n') - { - out_col = 0; - putchar ('\n'); - } - else - { - out_col++; - if (out_col == line_size-1) - { - putchar ('\\'); - putchar ('\n'); - out_col = 1; - } - putchar (ch); - } -} - -/* Output routines: Write a character CH to the standard output. - It keeps track of the number of characters output and may - break the output with a "\<cr>". This one is for strings. - In POSIX bc, strings are not broken across lines. */ - -void -out_schar (ch) - int ch; -{ - if (ch == '\n') - { - out_col = 0; - putchar ('\n'); - } - else - { - if (!std_only) - { - out_col++; - if (out_col == line_size-1) - { - putchar ('\\'); - putchar ('\n'); - out_col = 1; - } - } - putchar (ch); - } -} - - -/* The following are "Symbol Table" routines for the parser. */ - -/* find_id returns a pointer to node in TREE that has the correct - ID. If there is no node in TREE with ID, NULL is returned. */ - -id_rec * -find_id (tree, id) - id_rec *tree; - char *id; -{ - int cmp_result; - - /* Check for an empty tree. */ - if (tree == NULL) - return NULL; - - /* Recursively search the tree. */ - cmp_result = strcmp (id, tree->id); - if (cmp_result == 0) - return tree; /* This is the item. */ - else if (cmp_result < 0) - return find_id (tree->left, id); - else - return find_id (tree->right, id); -} - - -/* insert_id_rec inserts a NEW_ID rec into the tree whose ROOT is - provided. insert_id_rec returns TRUE if the tree height from - ROOT down is increased otherwise it returns FALSE. This is a - recursive balanced binary tree insertion algorithm. */ - -int insert_id_rec (root, new_id) - id_rec **root; - id_rec *new_id; -{ - id_rec *A, *B; - - /* If root is NULL, this where it is to be inserted. */ - if (*root == NULL) - { - *root = new_id; - new_id->left = NULL; - new_id->right = NULL; - new_id->balance = 0; - return (TRUE); - } - - /* We need to search for a leaf. */ - if (strcmp (new_id->id, (*root)->id) < 0) - { - /* Insert it on the left. */ - if (insert_id_rec (&((*root)->left), new_id)) - { - /* The height increased. */ - (*root)->balance --; - - switch ((*root)->balance) - { - case 0: /* no height increase. */ - return (FALSE); - case -1: /* height increase. */ - return (FALSE); - case -2: /* we need to do a rebalancing act. */ - A = *root; - B = (*root)->left; - if (B->balance <= 0) - { - /* Single Rotate. */ - A->left = B->right; - B->right = A; - *root = B; - A->balance = 0; - B->balance = 0; - } - else - { - /* Double Rotate. */ - *root = B->right; - B->right = (*root)->left; - A->left = (*root)->right; - (*root)->left = B; - (*root)->right = A; - switch ((*root)->balance) - { - case -1: - A->balance = 1; - B->balance = 0; - break; - case 0: - A->balance = 0; - B->balance = 0; - break; - case 1: - A->balance = 0; - B->balance = -1; - break; - } - (*root)->balance = 0; - } - } - } - } - else - { - /* Insert it on the right. */ - if (insert_id_rec (&((*root)->right), new_id)) - { - /* The height increased. */ - (*root)->balance ++; - switch ((*root)->balance) - { - case 0: /* no height increase. */ - return (FALSE); - case 1: /* height increase. */ - return (FALSE); - case 2: /* we need to do a rebalancing act. */ - A = *root; - B = (*root)->right; - if (B->balance >= 0) - { - /* Single Rotate. */ - A->right = B->left; - B->left = A; - *root = B; - A->balance = 0; - B->balance = 0; - } - else - { - /* Double Rotate. */ - *root = B->left; - B->left = (*root)->right; - A->right = (*root)->left; - (*root)->left = A; - (*root)->right = B; - switch ((*root)->balance) - { - case -1: - A->balance = 0; - B->balance = 1; - break; - case 0: - A->balance = 0; - B->balance = 0; - break; - case 1: - A->balance = -1; - B->balance = 0; - break; - } - (*root)->balance = 0; - } - } - } - } - - /* If we fall through to here, the tree did not grow in height. */ - return (FALSE); -} - - -/* Initialize variables for the symbol table tree. */ - -void -init_tree() -{ - name_tree = NULL; - next_array = 1; - next_func = 1; - /* 0 => ibase, 1 => obase, 2 => scale, 3 => history, 4 => last. */ - next_var = 5; -} - - -/* Lookup routines for symbol table names. */ - -int -lookup (name, namekind) - char *name; - int namekind; -{ - id_rec *id; - - /* Warn about non-standard name. */ - if (strlen(name) != 1) - warn ("multiple letter name - %s", name); - - /* Look for the id. */ - id = find_id (name_tree, name); - if (id == NULL) - { - /* We need to make a new item. */ - id = (id_rec *) bc_malloc (sizeof (id_rec)); - id->id = strcopyof (name); - id->a_name = 0; - id->f_name = 0; - id->v_name = 0; - insert_id_rec (&name_tree, id); - } - - /* Return the correct value. */ - switch (namekind) - { - - case ARRAY: - /* ARRAY variable numbers are returned as negative numbers. */ - if (id->a_name != 0) - { - free (name); - return (-id->a_name); - } - id->a_name = next_array++; - a_names[id->a_name] = name; - if (id->a_name < MAX_STORE) - { - if (id->a_name >= a_count) - more_arrays (); - return (-id->a_name); - } - yyerror ("Too many array variables"); - exit (1); - - case FUNCT: - case FUNCTDEF: - if (id->f_name != 0) - { - free(name); - /* Check to see if we are redefining a math lib function. */ - if (use_math && namekind == FUNCTDEF && id->f_name <= 6) - id->f_name = next_func++; - return (id->f_name); - } - id->f_name = next_func++; - f_names[id->f_name] = name; - if (id->f_name < MAX_STORE) - { - if (id->f_name >= f_count) - more_functions (); - return (id->f_name); - } - yyerror ("Too many functions"); - exit (1); - - case SIMPLE: - if (id->v_name != 0) - { - free(name); - return (id->v_name); - } - id->v_name = next_var++; - v_names[id->v_name - 1] = name; - if (id->v_name <= MAX_STORE) - { - if (id->v_name >= v_count) - more_variables (); - return (id->v_name); - } - yyerror ("Too many variables"); - exit (1); - } - - yyerror ("End of util.c/lookup() reached. Please report this bug."); - exit (1); - /* not reached */ -} - - -/* Print the welcome banner. */ - -void -welcome() -{ - printf ("This is free software with ABSOLUTELY NO WARRANTY.\n"); - printf ("For details type `warranty'. \n"); -} - -/* Print out the version information. */ -void -show_bc_version() -{ - printf("%s %s\n%s\n", PACKAGE, VERSION, BC_COPYRIGHT); -} - - -/* Print out the warranty information. */ - -void -warranty(prefix) - char *prefix; -{ - printf ("\n%s", prefix); - show_bc_version (); - printf ("\n" -" This program is free software; you can redistribute it and/or modify\n" -" it under the terms of the GNU General Public License as published by\n" -" the Free Software Foundation; either version 2 of the License , or\n" -" (at your option) any later version.\n\n" -" This program is distributed in the hope that it will be useful,\n" -" but WITHOUT ANY WARRANTY; without even the implied warranty of\n" -" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n" -" GNU General Public License for more details.\n\n" -" You should have received a copy of the GNU General Public License\n" -" along with this program. If not, write to\n\n" -" The Free Software Foundation, Inc.\n" -" 59 Temple Place, Suite 330\n" -" Boston, MA 02111, USA.\n\n"); -} - -/* Print out the limits of this program. */ - -void -limits() -{ - printf ("BC_BASE_MAX = %d\n", BC_BASE_MAX); - printf ("BC_DIM_MAX = %ld\n", (long) BC_DIM_MAX); - printf ("BC_SCALE_MAX = %d\n", BC_SCALE_MAX); - printf ("BC_STRING_MAX = %d\n", BC_STRING_MAX); - printf ("MAX Exponent = %ld\n", (long) LONG_MAX); - printf ("Number of vars = %ld\n", (long) MAX_STORE); -#ifdef OLD_EQ_OP - printf ("Old assignment operatiors are valid. (=-, =+, ...)\n"); -#endif -} - -/* bc_malloc will check the return value so all other places do not - have to do it! SIZE is the number of bytes to allocate. */ - -char * -bc_malloc (size) - int size; -{ - char *ptr; - - ptr = (char *) malloc (size); - if (ptr == NULL) - out_of_memory (); - - return ptr; -} - - -/* The following routines are error routines for various problems. */ - -/* Malloc could not get enought memory. */ - -void -out_of_memory() -{ - fprintf (stderr, "Fatal error: Out of memory for malloc.\n"); - exit (1); -} - - - -/* The standard yyerror routine. Built with variable number of argumnets. */ - -#ifndef VARARGS -#ifdef __STDC__ -void -yyerror (char *str, ...) -#else -void -yyerror (str) - char *str; -#endif -#else -void -yyerror (str, va_alist) - char *str; -#endif -{ - char *name; - va_list args; - -#ifndef VARARGS - va_start (args, str); -#else - va_start (args); -#endif - if (is_std_in) - name = "(standard_in)"; - else - name = file_name; - fprintf (stderr,"%s %d: ",name,line_no); - vfprintf (stderr, str, args); - fprintf (stderr, "\n"); - had_error = TRUE; - va_end (args); -} - - -/* The routine to produce warnings about non-standard features - found during parsing. */ - -#ifndef VARARGS -#ifdef __STDC__ -void -warn (char *mesg, ...) -#else -void -warn (mesg) - char *mesg; -#endif -#else -void -warn (mesg, va_alist) - char *mesg; -#endif -{ - char *name; - va_list args; - -#ifndef VARARGS - va_start (args, mesg); -#else - va_start (args); -#endif - if (std_only) - { - if (is_std_in) - name = "(standard_in)"; - else - name = file_name; - fprintf (stderr,"%s %d: ",name,line_no); - vfprintf (stderr, mesg, args); - fprintf (stderr, "\n"); - had_error = TRUE; - } - else - if (warn_not_std) - { - if (is_std_in) - name = "(standard_in)"; - else - name = file_name; - fprintf (stderr,"%s %d: (Warning) ",name,line_no); - vfprintf (stderr, mesg, args); - fprintf (stderr, "\n"); - } - va_end (args); -} - -/* Runtime error will print a message and stop the machine. */ - -#ifndef VARARGS -#ifdef __STDC__ -void -rt_error (char *mesg, ...) -#else -void -rt_error (mesg) - char *mesg; -#endif -#else -void -rt_error (mesg, va_alist) - char *mesg; -#endif -{ - va_list args; - - fprintf (stderr, "Runtime error (func=%s, adr=%d): ", - f_names[pc.pc_func], pc.pc_addr); -#ifndef VARARGS - va_start (args, mesg); -#else - va_start (args); -#endif - vfprintf (stderr, mesg, args); - va_end (args); - - fprintf (stderr, "\n"); - runtime_error = TRUE; -} - - -/* A runtime warning tells of some action taken by the processor that - may change the program execution but was not enough of a problem - to stop the execution. */ - -#ifndef VARARGS -#ifdef __STDC__ -void -rt_warn (char *mesg, ...) -#else -void -rt_warn (mesg) - char *mesg; -#endif -#else -void -rt_warn (mesg, va_alist) - char *mesg; -#endif -{ - va_list args; - - fprintf (stderr, "Runtime warning (func=%s, adr=%d): ", - f_names[pc.pc_func], pc.pc_addr); -#ifndef VARARGS - va_start (args, mesg); -#else - va_start (args); -#endif - vfprintf (stderr, mesg, args); - va_end (args); - - fprintf (stderr, "\n"); -} diff --git a/contrib/bc/config.h.in b/contrib/bc/config.h.in deleted file mode 100644 index ebb9e34..0000000 --- a/contrib/bc/config.h.in +++ /dev/null @@ -1,81 +0,0 @@ -/* config.h.in. Generated automatically from configure.in by autoheader. */ - -/* Define to empty if the keyword does not work. */ -#undef const - -/* Define if you don't have vprintf but do have _doprnt. */ -#undef HAVE_DOPRNT - -/* Define if you have the vprintf function. */ -#undef HAVE_VPRINTF - -/* Define if on MINIX. */ -#undef _MINIX - -/* Define if the system does not provide POSIX.1 features except - with this defined. */ -#undef _POSIX_1_SOURCE - -/* Define if you need to in order for stat and other things to work. */ -#undef _POSIX_SOURCE - -/* Define to `unsigned' if <sys/types.h> doesn't define. */ -#undef size_t - -/* Define if you have the ANSI C header files. */ -#undef STDC_HEADERS - -/* Define if lex declares yytext as a char * by default, not a char[]. */ -#undef YYTEXT_POINTER - -/* VERSION number for DC target*/ -#undef DC_VERSION - -/* COPYRIGHT notice for DC target */ -#undef DC_COPYRIGHT - -/* COPYRIGHT notice for BC target */ -#undef BC_COPYRIGHT - -/* Define to use the readline library. */ -#undef READLINE - -/* Define to use the BSD libedit library. */ -#undef LIBEDIT - -/* Define to `size_t' if <sys/types.h> and <stddef.h> don't define. */ -#undef ptrdiff_t - -/* Define if you have the isgraph function. */ -#undef HAVE_ISGRAPH - -/* Define if you have the setvbuf function. */ -#undef HAVE_SETVBUF - -/* Define if you have the <lib.h> header file. */ -#undef HAVE_LIB_H - -/* Define if you have the <limits.h> header file. */ -#undef HAVE_LIMITS_H - -/* Define if you have the <stdarg.h> header file. */ -#undef HAVE_STDARG_H - -/* Define if you have the <stddef.h> header file. */ -#undef HAVE_STDDEF_H - -/* Define if you have the <stdlib.h> header file. */ -#undef HAVE_STDLIB_H - -/* Define if you have the <string.h> header file. */ -#undef HAVE_STRING_H - -/* Define if you have the <unistd.h> header file. */ -#undef HAVE_UNISTD_H - -/* Name of package */ -#undef PACKAGE - -/* Version number of package */ -#undef VERSION - diff --git a/contrib/bc/configure b/contrib/bc/configure deleted file mode 100755 index e5fc7d9..0000000 --- a/contrib/bc/configure +++ /dev/null @@ -1,2656 +0,0 @@ -#! /bin/sh - -# Guess values for system-dependent variables and create Makefiles. -# Generated automatically using autoconf version 2.13 -# Copyright (C) 1992, 93, 94, 95, 96 Free Software Foundation, Inc. -# -# This configure script is free software; the Free Software Foundation -# gives unlimited permission to copy, distribute and modify it. - -# Defaults: -ac_help= -ac_default_prefix=/usr/local -# Any additions from configure.in: -ac_help="$ac_help - --with-pkg use software installed in /usr/pkg tree" -ac_help="$ac_help - --with-libedit support fancy BSD command input -editing" -ac_help="$ac_help - --with-readline support fancy command input editing" - -# Initialize some variables set by options. -# The variables have the same names as the options, with -# dashes changed to underlines. -build=NONE -cache_file=./config.cache -exec_prefix=NONE -host=NONE -no_create= -nonopt=NONE -no_recursion= -prefix=NONE -program_prefix=NONE -program_suffix=NONE -program_transform_name=s,x,x, -silent= -site= -srcdir= -target=NONE -verbose= -x_includes=NONE -x_libraries=NONE -bindir='${exec_prefix}/bin' -sbindir='${exec_prefix}/sbin' -libexecdir='${exec_prefix}/libexec' -datadir='${prefix}/share' -sysconfdir='${prefix}/etc' -sharedstatedir='${prefix}/com' -localstatedir='${prefix}/var' -libdir='${exec_prefix}/lib' -includedir='${prefix}/include' -oldincludedir='/usr/include' -infodir='${prefix}/info' -mandir='${prefix}/man' - -# Initialize some other variables. -subdirs= -MFLAGS= MAKEFLAGS= -SHELL=${CONFIG_SHELL-/bin/sh} -# Maximum number of lines to put in a shell here document. -ac_max_here_lines=12 - -ac_prev= -for ac_option -do - - # If the previous option needs an argument, assign it. - if test -n "$ac_prev"; then - eval "$ac_prev=\$ac_option" - ac_prev= - continue - fi - - case "$ac_option" in - -*=*) ac_optarg=`echo "$ac_option" | sed 's/[-_a-zA-Z0-9]*=//'` ;; - *) ac_optarg= ;; - esac - - # Accept the important Cygnus configure options, so we can diagnose typos. - - case "$ac_option" in - - -bindir | --bindir | --bindi | --bind | --bin | --bi) - ac_prev=bindir ;; - -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) - bindir="$ac_optarg" ;; - - -build | --build | --buil | --bui | --bu) - ac_prev=build ;; - -build=* | --build=* | --buil=* | --bui=* | --bu=*) - build="$ac_optarg" ;; - - -cache-file | --cache-file | --cache-fil | --cache-fi \ - | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) - ac_prev=cache_file ;; - -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ - | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) - cache_file="$ac_optarg" ;; - - -datadir | --datadir | --datadi | --datad | --data | --dat | --da) - ac_prev=datadir ;; - -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ - | --da=*) - datadir="$ac_optarg" ;; - - -disable-* | --disable-*) - ac_feature=`echo $ac_option|sed -e 's/-*disable-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - eval "enable_${ac_feature}=no" ;; - - -enable-* | --enable-*) - ac_feature=`echo $ac_option|sed -e 's/-*enable-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_feature| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_feature: invalid feature name" 1>&2; exit 1; } - fi - ac_feature=`echo $ac_feature| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "enable_${ac_feature}='$ac_optarg'" ;; - - -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ - | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ - | --exec | --exe | --ex) - ac_prev=exec_prefix ;; - -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ - | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ - | --exec=* | --exe=* | --ex=*) - exec_prefix="$ac_optarg" ;; - - -gas | --gas | --ga | --g) - # Obsolete; use --with-gas. - with_gas=yes ;; - - -help | --help | --hel | --he) - # Omit some internal or obsolete options to make the list less imposing. - # This message is too long to be a string in the A/UX 3.1 sh. - cat << EOF -Usage: configure [options] [host] -Options: [defaults in brackets after descriptions] -Configuration: - --cache-file=FILE cache test results in FILE - --help print this message - --no-create do not create output files - --quiet, --silent do not print \`checking...' messages - --version print the version of autoconf that created configure -Directory and file names: - --prefix=PREFIX install architecture-independent files in PREFIX - [$ac_default_prefix] - --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX - [same as prefix] - --bindir=DIR user executables in DIR [EPREFIX/bin] - --sbindir=DIR system admin executables in DIR [EPREFIX/sbin] - --libexecdir=DIR program executables in DIR [EPREFIX/libexec] - --datadir=DIR read-only architecture-independent data in DIR - [PREFIX/share] - --sysconfdir=DIR read-only single-machine data in DIR [PREFIX/etc] - --sharedstatedir=DIR modifiable architecture-independent data in DIR - [PREFIX/com] - --localstatedir=DIR modifiable single-machine data in DIR [PREFIX/var] - --libdir=DIR object code libraries in DIR [EPREFIX/lib] - --includedir=DIR C header files in DIR [PREFIX/include] - --oldincludedir=DIR C header files for non-gcc in DIR [/usr/include] - --infodir=DIR info documentation in DIR [PREFIX/info] - --mandir=DIR man documentation in DIR [PREFIX/man] - --srcdir=DIR find the sources in DIR [configure dir or ..] - --program-prefix=PREFIX prepend PREFIX to installed program names - --program-suffix=SUFFIX append SUFFIX to installed program names - --program-transform-name=PROGRAM - run sed PROGRAM on installed program names -EOF - cat << EOF -Host type: - --build=BUILD configure for building on BUILD [BUILD=HOST] - --host=HOST configure for HOST [guessed] - --target=TARGET configure for TARGET [TARGET=HOST] -Features and packages: - --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) - --enable-FEATURE[=ARG] include FEATURE [ARG=yes] - --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] - --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) - --x-includes=DIR X include files are in DIR - --x-libraries=DIR X library files are in DIR -EOF - if test -n "$ac_help"; then - echo "--enable and --with options recognized:$ac_help" - fi - exit 0 ;; - - -host | --host | --hos | --ho) - ac_prev=host ;; - -host=* | --host=* | --hos=* | --ho=*) - host="$ac_optarg" ;; - - -includedir | --includedir | --includedi | --included | --include \ - | --includ | --inclu | --incl | --inc) - ac_prev=includedir ;; - -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ - | --includ=* | --inclu=* | --incl=* | --inc=*) - includedir="$ac_optarg" ;; - - -infodir | --infodir | --infodi | --infod | --info | --inf) - ac_prev=infodir ;; - -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) - infodir="$ac_optarg" ;; - - -libdir | --libdir | --libdi | --libd) - ac_prev=libdir ;; - -libdir=* | --libdir=* | --libdi=* | --libd=*) - libdir="$ac_optarg" ;; - - -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ - | --libexe | --libex | --libe) - ac_prev=libexecdir ;; - -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ - | --libexe=* | --libex=* | --libe=*) - libexecdir="$ac_optarg" ;; - - -localstatedir | --localstatedir | --localstatedi | --localstated \ - | --localstate | --localstat | --localsta | --localst \ - | --locals | --local | --loca | --loc | --lo) - ac_prev=localstatedir ;; - -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ - | --localstate=* | --localstat=* | --localsta=* | --localst=* \ - | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) - localstatedir="$ac_optarg" ;; - - -mandir | --mandir | --mandi | --mand | --man | --ma | --m) - ac_prev=mandir ;; - -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) - mandir="$ac_optarg" ;; - - -nfp | --nfp | --nf) - # Obsolete; use --without-fp. - with_fp=no ;; - - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) - no_create=yes ;; - - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) - no_recursion=yes ;; - - -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ - | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ - | --oldin | --oldi | --old | --ol | --o) - ac_prev=oldincludedir ;; - -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ - | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ - | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) - oldincludedir="$ac_optarg" ;; - - -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) - ac_prev=prefix ;; - -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) - prefix="$ac_optarg" ;; - - -program-prefix | --program-prefix | --program-prefi | --program-pref \ - | --program-pre | --program-pr | --program-p) - ac_prev=program_prefix ;; - -program-prefix=* | --program-prefix=* | --program-prefi=* \ - | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) - program_prefix="$ac_optarg" ;; - - -program-suffix | --program-suffix | --program-suffi | --program-suff \ - | --program-suf | --program-su | --program-s) - ac_prev=program_suffix ;; - -program-suffix=* | --program-suffix=* | --program-suffi=* \ - | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) - program_suffix="$ac_optarg" ;; - - -program-transform-name | --program-transform-name \ - | --program-transform-nam | --program-transform-na \ - | --program-transform-n | --program-transform- \ - | --program-transform | --program-transfor \ - | --program-transfo | --program-transf \ - | --program-trans | --program-tran \ - | --progr-tra | --program-tr | --program-t) - ac_prev=program_transform_name ;; - -program-transform-name=* | --program-transform-name=* \ - | --program-transform-nam=* | --program-transform-na=* \ - | --program-transform-n=* | --program-transform-=* \ - | --program-transform=* | --program-transfor=* \ - | --program-transfo=* | --program-transf=* \ - | --program-trans=* | --program-tran=* \ - | --progr-tra=* | --program-tr=* | --program-t=*) - program_transform_name="$ac_optarg" ;; - - -q | -quiet | --quiet | --quie | --qui | --qu | --q \ - | -silent | --silent | --silen | --sile | --sil) - silent=yes ;; - - -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) - ac_prev=sbindir ;; - -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ - | --sbi=* | --sb=*) - sbindir="$ac_optarg" ;; - - -sharedstatedir | --sharedstatedir | --sharedstatedi \ - | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ - | --sharedst | --shareds | --shared | --share | --shar \ - | --sha | --sh) - ac_prev=sharedstatedir ;; - -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ - | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ - | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ - | --sha=* | --sh=*) - sharedstatedir="$ac_optarg" ;; - - -site | --site | --sit) - ac_prev=site ;; - -site=* | --site=* | --sit=*) - site="$ac_optarg" ;; - - -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) - ac_prev=srcdir ;; - -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) - srcdir="$ac_optarg" ;; - - -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ - | --syscon | --sysco | --sysc | --sys | --sy) - ac_prev=sysconfdir ;; - -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ - | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) - sysconfdir="$ac_optarg" ;; - - -target | --target | --targe | --targ | --tar | --ta | --t) - ac_prev=target ;; - -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) - target="$ac_optarg" ;; - - -v | -verbose | --verbose | --verbos | --verbo | --verb) - verbose=yes ;; - - -version | --version | --versio | --versi | --vers) - echo "configure generated by autoconf version 2.13" - exit 0 ;; - - -with-* | --with-*) - ac_package=`echo $ac_option|sed -e 's/-*with-//' -e 's/=.*//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-_a-zA-Z0-9]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - case "$ac_option" in - *=*) ;; - *) ac_optarg=yes ;; - esac - eval "with_${ac_package}='$ac_optarg'" ;; - - -without-* | --without-*) - ac_package=`echo $ac_option|sed -e 's/-*without-//'` - # Reject names that are not valid shell variable names. - if test -n "`echo $ac_package| sed 's/[-a-zA-Z0-9_]//g'`"; then - { echo "configure: error: $ac_package: invalid package name" 1>&2; exit 1; } - fi - ac_package=`echo $ac_package| sed 's/-/_/g'` - eval "with_${ac_package}=no" ;; - - --x) - # Obsolete; use --with-x. - with_x=yes ;; - - -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ - | --x-incl | --x-inc | --x-in | --x-i) - ac_prev=x_includes ;; - -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ - | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) - x_includes="$ac_optarg" ;; - - -x-libraries | --x-libraries | --x-librarie | --x-librari \ - | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) - ac_prev=x_libraries ;; - -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ - | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) - x_libraries="$ac_optarg" ;; - - -*) { echo "configure: error: $ac_option: invalid option; use --help to show usage" 1>&2; exit 1; } - ;; - - *) - if test -n "`echo $ac_option| sed 's/[-a-z0-9.]//g'`"; then - echo "configure: warning: $ac_option: invalid host type" 1>&2 - fi - if test "x$nonopt" != xNONE; then - { echo "configure: error: can only configure for one host and one target at a time" 1>&2; exit 1; } - fi - nonopt="$ac_option" - ;; - - esac -done - -if test -n "$ac_prev"; then - { echo "configure: error: missing argument to --`echo $ac_prev | sed 's/_/-/g'`" 1>&2; exit 1; } -fi - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -# File descriptor usage: -# 0 standard input -# 1 file creation -# 2 errors and warnings -# 3 some systems may open it to /dev/tty -# 4 used on the Kubota Titan -# 6 checking for... messages and results -# 5 compiler messages saved in config.log -if test "$silent" = yes; then - exec 6>/dev/null -else - exec 6>&1 -fi -exec 5>./config.log - -echo "\ -This file contains any messages produced by compilers while -running configure, to aid debugging if configure makes a mistake. -" 1>&5 - -# Strip out --no-create and --no-recursion so they do not pile up. -# Also quote any args containing shell metacharacters. -ac_configure_args= -for ac_arg -do - case "$ac_arg" in - -no-create | --no-create | --no-creat | --no-crea | --no-cre \ - | --no-cr | --no-c) ;; - -no-recursion | --no-recursion | --no-recursio | --no-recursi \ - | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) ;; - *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?]*) - ac_configure_args="$ac_configure_args '$ac_arg'" ;; - *) ac_configure_args="$ac_configure_args $ac_arg" ;; - esac -done - -# NLS nuisances. -# Only set these to C if already set. These must not be set unconditionally -# because not all systems understand e.g. LANG=C (notably SCO). -# Fixing LC_MESSAGES prevents Solaris sh from translating var values in `set'! -# Non-C LC_CTYPE values break the ctype check. -if test "${LANG+set}" = set; then LANG=C; export LANG; fi -if test "${LC_ALL+set}" = set; then LC_ALL=C; export LC_ALL; fi -if test "${LC_MESSAGES+set}" = set; then LC_MESSAGES=C; export LC_MESSAGES; fi -if test "${LC_CTYPE+set}" = set; then LC_CTYPE=C; export LC_CTYPE; fi - -# confdefs.h avoids OS command line length limits that DEFS can exceed. -rm -rf conftest* confdefs.h -# AIX cpp loses on an empty file, so make sure it contains at least a newline. -echo > confdefs.h - -# A filename unique to this package, relative to the directory that -# configure is in, which we can look for to find out if srcdir is correct. -ac_unique_file=doc/bc.1 - -# Find the source files, if location was not specified. -if test -z "$srcdir"; then - ac_srcdir_defaulted=yes - # Try the directory containing this script, then its parent. - ac_prog=$0 - ac_confdir=`echo $ac_prog|sed 's%/[^/][^/]*$%%'` - test "x$ac_confdir" = "x$ac_prog" && ac_confdir=. - srcdir=$ac_confdir - if test ! -r $srcdir/$ac_unique_file; then - srcdir=.. - fi -else - ac_srcdir_defaulted=no -fi -if test ! -r $srcdir/$ac_unique_file; then - if test "$ac_srcdir_defaulted" = yes; then - { echo "configure: error: can not find sources in $ac_confdir or .." 1>&2; exit 1; } - else - { echo "configure: error: can not find sources in $srcdir" 1>&2; exit 1; } - fi -fi -srcdir=`echo "${srcdir}" | sed 's%\([^/]\)/*$%\1%'` - -# Prefer explicitly selected file to automatically selected ones. -if test -z "$CONFIG_SITE"; then - if test "x$prefix" != xNONE; then - CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" - else - CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" - fi -fi -for ac_site_file in $CONFIG_SITE; do - if test -r "$ac_site_file"; then - echo "loading site script $ac_site_file" - . "$ac_site_file" - fi -done - -if test -r "$cache_file"; then - echo "loading cache $cache_file" - . $cache_file -else - echo "creating cache $cache_file" - > $cache_file -fi - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -ac_exeext= -ac_objext=o -if (echo "testing\c"; echo 1,2,3) | grep c >/dev/null; then - # Stardent Vistra SVR4 grep lacks -e, says ghazi@caip.rutgers.edu. - if (echo -n testing; echo 1,2,3) | sed s/-n/xn/ | grep xn >/dev/null; then - ac_n= ac_c=' -' ac_t=' ' - else - ac_n=-n ac_c= ac_t= - fi -else - ac_n= ac_c='\c' ac_t= -fi - - -ac_aux_dir= -for ac_dir in $srcdir $srcdir/.. $srcdir/../..; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: can not find install-sh or install.sh in $srcdir $srcdir/.. $srcdir/../.." 1>&2; exit 1; } -fi -ac_config_guess=$ac_aux_dir/config.guess -ac_config_sub=$ac_aux_dir/config.sub -ac_configure=$ac_aux_dir/configure # This should be Cygnus configure. - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:563: checking for a BSD compatible install" >&5 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -echo $ac_n "checking whether build environment is sane""... $ac_c" 1>&6 -echo "configure:616: checking whether build environment is sane" >&5 -# Just in case -sleep 1 -echo timestamp > conftestfile -# Do `set' in a subshell so we don't clobber the current shell's -# arguments. Must try -L first in case configure is actually a -# symlink; some systems play weird games with the mod time of symlinks -# (eg FreeBSD returns the mod time of the symlink's containing -# directory). -if ( - set X `ls -Lt $srcdir/configure conftestfile 2> /dev/null` - if test "$*" = "X"; then - # -L didn't work. - set X `ls -t $srcdir/configure conftestfile` - fi - if test "$*" != "X $srcdir/configure conftestfile" \ - && test "$*" != "X conftestfile $srcdir/configure"; then - - # If neither matched, then we have a broken ls. This can happen - # if, for instance, CONFIG_SHELL is bash and it inherits a - # broken ls alias from the environment. This has actually - # happened. Such a system could not be considered "sane". - { echo "configure: error: ls -t appears to fail. Make sure there is not a broken -alias in your environment" 1>&2; exit 1; } - fi - - test "$2" = conftestfile - ) -then - # Ok. - : -else - { echo "configure: error: newly created file is older than distributed files! -Check your system clock" 1>&2; exit 1; } -fi -rm -f conftest* -echo "$ac_t""yes" 1>&6 -if test "$program_transform_name" = s,x,x,; then - program_transform_name= -else - # Double any \ or $. echo might interpret backslashes. - cat <<\EOF_SED > conftestsed -s,\\,\\\\,g; s,\$,$$,g -EOF_SED - program_transform_name="`echo $program_transform_name|sed -f conftestsed`" - rm -f conftestsed -fi -test "$program_prefix" != NONE && - program_transform_name="s,^,${program_prefix},; $program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" - -# sed with no file args requires a program. -test "$program_transform_name" = "" && program_transform_name="s,x,x," - -echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:673: checking whether ${MAKE-make} sets \${MAKE}" >&5 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftestmake <<\EOF -all: - @echo 'ac_maketemp="${MAKE}"' -EOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi -rm -f conftestmake -fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$ac_t""yes" 1>&6 - SET_MAKE= -else - echo "$ac_t""no" 1>&6 - SET_MAKE="MAKE=${MAKE-make}" -fi - - -PACKAGE="bc" - -VERSION="1.06" - -if test "`cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then - { echo "configure: error: source directory already configured; run "make distclean" there first" 1>&2; exit 1; } -fi -cat >> confdefs.h <<EOF -#define PACKAGE "$PACKAGE" -EOF - -cat >> confdefs.h <<EOF -#define VERSION "$VERSION" -EOF - - - -missing_dir=`cd $ac_aux_dir && pwd` -echo $ac_n "checking for working aclocal""... $ac_c" 1>&6 -echo "configure:719: checking for working aclocal" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (aclocal --version) < /dev/null > /dev/null 2>&1; then - ACLOCAL=aclocal - echo "$ac_t""found" 1>&6 -else - ACLOCAL="$missing_dir/missing aclocal" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working autoconf""... $ac_c" 1>&6 -echo "configure:732: checking for working autoconf" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (autoconf --version) < /dev/null > /dev/null 2>&1; then - AUTOCONF=autoconf - echo "$ac_t""found" 1>&6 -else - AUTOCONF="$missing_dir/missing autoconf" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working automake""... $ac_c" 1>&6 -echo "configure:745: checking for working automake" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (automake --version) < /dev/null > /dev/null 2>&1; then - AUTOMAKE=automake - echo "$ac_t""found" 1>&6 -else - AUTOMAKE="$missing_dir/missing automake" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working autoheader""... $ac_c" 1>&6 -echo "configure:758: checking for working autoheader" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (autoheader --version) < /dev/null > /dev/null 2>&1; then - AUTOHEADER=autoheader - echo "$ac_t""found" 1>&6 -else - AUTOHEADER="$missing_dir/missing autoheader" - echo "$ac_t""missing" 1>&6 -fi - -echo $ac_n "checking for working makeinfo""... $ac_c" 1>&6 -echo "configure:771: checking for working makeinfo" >&5 -# Run test in a subshell; some versions of sh will print an error if -# an executable is not found, even if stderr is redirected. -# Redirect stdin to placate older versions of autoconf. Sigh. -if (makeinfo --version) < /dev/null > /dev/null 2>&1; then - MAKEINFO=makeinfo - echo "$ac_t""found" 1>&6 -else - MAKEINFO="$missing_dir/missing makeinfo" - echo "$ac_t""missing" 1>&6 -fi - - - - - - -cat >> confdefs.h <<\EOF -#define DC_VERSION "1.3" -EOF - -cat >> confdefs.h <<EOF -#define BC_COPYRIGHT "Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc." -EOF - -cat >> confdefs.h <<EOF -#define DC_COPYRIGHT "Copyright 1994, 1997, 1998, 2000 Free Software Foundation, Inc." -EOF - - -# Extract the first word of "gcc", so it can be a program name with args. -set dummy gcc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:804: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="gcc" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$CC"; then - # Extract the first word of "cc", so it can be a program name with args. -set dummy cc; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:834: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_prog_rejected=no - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - if test "$ac_dir/$ac_word" = "/usr/ucb/cc"; then - ac_prog_rejected=yes - continue - fi - ac_cv_prog_CC="cc" - break - fi - done - IFS="$ac_save_ifs" -if test $ac_prog_rejected = yes; then - # We found a bogon in the path, so make sure we never use it. - set dummy $ac_cv_prog_CC - shift - if test $# -gt 0; then - # We chose a different compiler from the bogus one. - # However, it has the same basename, so the bogon will be chosen - # first if we set CC to just the basename; use the full file name. - shift - set dummy "$ac_dir/$ac_word" "$@" - shift - ac_cv_prog_CC="$@" - fi -fi -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - - if test -z "$CC"; then - case "`uname -s`" in - *win32* | *WIN32*) - # Extract the first word of "cl", so it can be a program name with args. -set dummy cl; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:885: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$CC"; then - ac_cv_prog_CC="$CC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_CC="cl" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -CC="$ac_cv_prog_CC" -if test -n "$CC"; then - echo "$ac_t""$CC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - ;; - esac - fi - test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } -fi - -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 -echo "configure:917: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 - -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -cat > conftest.$ac_ext << EOF - -#line 928 "configure" -#include "confdefs.h" - -main(){return(0);} -EOF -if { (eval echo configure:933: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - ac_cv_prog_cc_works=yes - # If we can't run a trivial program, we are probably using a cross compiler. - if (./conftest; exit) 2>/dev/null; then - ac_cv_prog_cc_cross=no - else - ac_cv_prog_cc_cross=yes - fi -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - ac_cv_prog_cc_works=no -fi -rm -fr conftest* -ac_ext=c -# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. -ac_cpp='$CPP $CPPFLAGS' -ac_compile='${CC-cc} -c $CFLAGS $CPPFLAGS conftest.$ac_ext 1>&5' -ac_link='${CC-cc} -o conftest${ac_exeext} $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS 1>&5' -cross_compiling=$ac_cv_prog_cc_cross - -echo "$ac_t""$ac_cv_prog_cc_works" 1>&6 -if test $ac_cv_prog_cc_works = no; then - { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; } -fi -echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 -echo "configure:959: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 -echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 -cross_compiling=$ac_cv_prog_cc_cross - -echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 -echo "configure:964: checking whether we are using GNU C" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.c <<EOF -#ifdef __GNUC__ - yes; -#endif -EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:973: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then - ac_cv_prog_gcc=yes -else - ac_cv_prog_gcc=no -fi -fi - -echo "$ac_t""$ac_cv_prog_gcc" 1>&6 - -if test $ac_cv_prog_gcc = yes; then - GCC=yes -else - GCC= -fi - -ac_test_CFLAGS="${CFLAGS+set}" -ac_save_CFLAGS="$CFLAGS" -CFLAGS= -echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 -echo "configure:992: checking whether ${CC-cc} accepts -g" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - echo 'void f(){}' > conftest.c -if test -z "`${CC-cc} -g -c conftest.c 2>&1`"; then - ac_cv_prog_cc_g=yes -else - ac_cv_prog_cc_g=no -fi -rm -f conftest* - -fi - -echo "$ac_t""$ac_cv_prog_cc_g" 1>&6 -if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" -elif test $ac_cv_prog_cc_g = yes; then - if test "$GCC" = yes; then - CFLAGS="-g -O2" - else - CFLAGS="-g" - fi -else - if test "$GCC" = yes; then - CFLAGS="-O2" - else - CFLAGS= - fi -fi - -echo $ac_n "checking how to run the C preprocessor""... $ac_c" 1>&6 -echo "configure:1024: checking how to run the C preprocessor" >&5 -# On Suns, sometimes $CPP names a directory. -if test -n "$CPP" && test -d "$CPP"; then - CPP= -fi -if test -z "$CPP"; then -if eval "test \"`echo '$''{'ac_cv_prog_CPP'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # This must be in double quotes, not single quotes, because CPP may get - # substituted into the Makefile and "${CC-cc}" will confuse make. - CPP="${CC-cc} -E" - # On the NeXT, cc -E runs the code through the compiler's parser, - # not just through cpp. - cat > conftest.$ac_ext <<EOF -#line 1039 "configure" -#include "confdefs.h" -#include <assert.h> -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1045: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -E -traditional-cpp" - cat > conftest.$ac_ext <<EOF -#line 1056 "configure" -#include "confdefs.h" -#include <assert.h> -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1062: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP="${CC-cc} -nologo -E" - cat > conftest.$ac_ext <<EOF -#line 1073 "configure" -#include "confdefs.h" -#include <assert.h> -Syntax Error -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1079: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - : -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - CPP=/lib/cpp -fi -rm -f conftest* -fi -rm -f conftest* -fi -rm -f conftest* - ac_cv_prog_CPP="$CPP" -fi - CPP="$ac_cv_prog_CPP" -else - ac_cv_prog_CPP="$CPP" -fi -echo "$ac_t""$CPP" 1>&6 - -ac_safe=`echo "minix/config.h" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for minix/config.h""... $ac_c" 1>&6 -echo "configure:1105: checking for minix/config.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1110 "configure" -#include "confdefs.h" -#include <minix/config.h> -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1115: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - MINIX=yes -else - echo "$ac_t""no" 1>&6 -MINIX= -fi - -if test "$MINIX" = yes; then - cat >> confdefs.h <<\EOF -#define _POSIX_SOURCE 1 -EOF - - cat >> confdefs.h <<\EOF -#define _POSIX_1_SOURCE 2 -EOF - - cat >> confdefs.h <<\EOF -#define _MINIX 1 -EOF - -fi - - -missing_dir=`cd $ac_aux_dir && pwd` -for ac_prog in flex lex -do -# Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1159: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$LEX"; then - ac_cv_prog_LEX="$LEX" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_LEX="$ac_prog" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -LEX="$ac_cv_prog_LEX" -if test -n "$LEX"; then - echo "$ac_t""$LEX" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -test -n "$LEX" && break -done -test -n "$LEX" || LEX=""$missing_dir/missing flex"" - -# Extract the first word of "flex", so it can be a program name with args. -set dummy flex; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1192: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_LEX'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$LEX"; then - ac_cv_prog_LEX="$LEX" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_LEX="flex" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_LEX" && ac_cv_prog_LEX="lex" -fi -fi -LEX="$ac_cv_prog_LEX" -if test -n "$LEX"; then - echo "$ac_t""$LEX" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -if test -z "$LEXLIB" -then - case "$LEX" in - flex*) ac_lib=fl ;; - *) ac_lib=l ;; - esac - echo $ac_n "checking for yywrap in -l$ac_lib""... $ac_c" 1>&6 -echo "configure:1226: checking for yywrap in -l$ac_lib" >&5 -ac_lib_var=`echo $ac_lib'_'yywrap | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-l$ac_lib $LIBS" -cat > conftest.$ac_ext <<EOF -#line 1234 "configure" -#include "confdefs.h" -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char yywrap(); - -int main() { -yywrap() -; return 0; } -EOF -if { (eval echo configure:1245: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - LEXLIB="-l$ac_lib" -else - echo "$ac_t""no" 1>&6 -fi - -fi - -echo $ac_n "checking lex output file root""... $ac_c" 1>&6 -echo "configure:1268: checking lex output file root" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_lex_root'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # The minimal lex program is just a single line: %%. But some broken lexes -# (Solaris, I think it was) want two %% lines, so accommodate them. -echo '%% -%%' | $LEX -if test -f lex.yy.c; then - ac_cv_prog_lex_root=lex.yy -elif test -f lexyy.c; then - ac_cv_prog_lex_root=lexyy -else - { echo "configure: error: cannot find output from $LEX; giving up" 1>&2; exit 1; } -fi -fi - -echo "$ac_t""$ac_cv_prog_lex_root" 1>&6 -LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root - -echo $ac_n "checking whether yytext is a pointer""... $ac_c" 1>&6 -echo "configure:1289: checking whether yytext is a pointer" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_lex_yytext_pointer'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - # POSIX says lex can declare yytext either as a pointer or an array; the -# default is implementation-dependent. Figure out which it is, since -# not all implementations provide the %pointer and %array declarations. -ac_cv_prog_lex_yytext_pointer=no -echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c -ac_save_LIBS="$LIBS" -LIBS="$LIBS $LEXLIB" -cat > conftest.$ac_ext <<EOF -#line 1301 "configure" -#include "confdefs.h" -`cat $LEX_OUTPUT_ROOT.c` -int main() { - -; return 0; } -EOF -if { (eval echo configure:1308: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - ac_cv_prog_lex_yytext_pointer=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 -fi -rm -f conftest* -LIBS="$ac_save_LIBS" -rm -f "${LEX_OUTPUT_ROOT}.c" - -fi - -echo "$ac_t""$ac_cv_prog_lex_yytext_pointer" 1>&6 -if test $ac_cv_prog_lex_yytext_pointer = yes; then - cat >> confdefs.h <<\EOF -#define YYTEXT_POINTER 1 -EOF - -fi - -for ac_prog in 'bison -y' byacc -do -# Extract the first word of "$ac_prog", so it can be a program name with args. -set dummy $ac_prog; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1334: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_YACC'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$YACC"; then - ac_cv_prog_YACC="$YACC" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_YACC="$ac_prog" - break - fi - done - IFS="$ac_save_ifs" -fi -fi -YACC="$ac_cv_prog_YACC" -if test -n "$YACC"; then - echo "$ac_t""$YACC" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -test -n "$YACC" && break -done -test -n "$YACC" || YACC="yacc" - -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# ./install, which can be erroneously created by make from ./install.sh. -echo $ac_n "checking for a BSD compatible install""... $ac_c" 1>&6 -echo "configure:1376: checking for a BSD compatible install" >&5 -if test -z "$INSTALL"; then -if eval "test \"`echo '$''{'ac_cv_path_install'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - IFS="${IFS= }"; ac_save_IFS="$IFS"; IFS=":" - for ac_dir in $PATH; do - # Account for people who put trailing slashes in PATH elements. - case "$ac_dir/" in - /|./|.//|/etc/*|/usr/sbin/*|/usr/etc/*|/sbin/*|/usr/afsws/bin/*|/usr/ucb/*) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - if test -f $ac_dir/$ac_prog; then - if test $ac_prog = install && - grep dspmsg $ac_dir/$ac_prog >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - else - ac_cv_path_install="$ac_dir/$ac_prog -c" - break 2 - fi - fi - done - ;; - esac - done - IFS="$ac_save_IFS" - -fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL="$ac_cv_path_install" - else - # As a last resort, use the slow shell script. We don't cache a - # path for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the path is relative. - INSTALL="$ac_install_sh" - fi -fi -echo "$ac_t""$INSTALL" 1>&6 - -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' - -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL_PROGRAM}' - -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' - -# Extract the first word of "ranlib", so it can be a program name with args. -set dummy ranlib; ac_word=$2 -echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 -echo "configure:1431: checking for $ac_word" >&5 -if eval "test \"`echo '$''{'ac_cv_prog_RANLIB'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - if test -n "$RANLIB"; then - ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. -else - IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS=":" - ac_dummy="$PATH" - for ac_dir in $ac_dummy; do - test -z "$ac_dir" && ac_dir=. - if test -f $ac_dir/$ac_word; then - ac_cv_prog_RANLIB="ranlib" - break - fi - done - IFS="$ac_save_ifs" - test -z "$ac_cv_prog_RANLIB" && ac_cv_prog_RANLIB=":" -fi -fi -RANLIB="$ac_cv_prog_RANLIB" -if test -n "$RANLIB"; then - echo "$ac_t""$RANLIB" 1>&6 -else - echo "$ac_t""no" 1>&6 -fi - -echo $ac_n "checking whether ${MAKE-make} sets \${MAKE}""... $ac_c" 1>&6 -echo "configure:1459: checking whether ${MAKE-make} sets \${MAKE}" >&5 -set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_prog_make_${ac_make}_set'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftestmake <<\EOF -all: - @echo 'ac_maketemp="${MAKE}"' -EOF -# GNU make sometimes prints "make[1]: Entering...", which would confuse us. -eval `${MAKE-make} -f conftestmake 2>/dev/null | grep temp=` -if test -n "$ac_maketemp"; then - eval ac_cv_prog_make_${ac_make}_set=yes -else - eval ac_cv_prog_make_${ac_make}_set=no -fi -rm -f conftestmake -fi -if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then - echo "$ac_t""yes" 1>&6 - SET_MAKE= -else - echo "$ac_t""no" 1>&6 - SET_MAKE="MAKE=${MAKE-make}" -fi - - -for ac_hdr in stdarg.h stddef.h stdlib.h string.h limits.h unistd.h lib.h -do -ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6 -echo "configure:1490: checking for $ac_hdr" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1495 "configure" -#include "confdefs.h" -#include <$ac_hdr> -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1500: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_hdr=HAVE_`echo $ac_hdr | sed 'y%abcdefghijklmnopqrstuvwxyz./-%ABCDEFGHIJKLMNOPQRSTUVWXYZ___%'` - cat >> confdefs.h <<EOF -#define $ac_tr_hdr 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - -echo $ac_n "checking for working const""... $ac_c" 1>&6 -echo "configure:1527: checking for working const" >&5 -if eval "test \"`echo '$''{'ac_cv_c_const'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1532 "configure" -#include "confdefs.h" - -int main() { - -/* Ultrix mips cc rejects this. */ -typedef int charset[2]; const charset x; -/* SunOS 4.1.1 cc rejects this. */ -char const *const *ccp; -char **p; -/* NEC SVR4.0.2 mips cc rejects this. */ -struct point {int x, y;}; -static struct point const zero = {0,0}; -/* AIX XL C 1.02.0.0 rejects this. - It does not let you subtract one const X* pointer from another in an arm - of an if-expression whose if-part is not a constant expression */ -const char *g = "string"; -ccp = &g + (g ? g-g : 0); -/* HPUX 7.0 cc rejects these. */ -++ccp; -p = (char**) ccp; -ccp = (char const *const *) p; -{ /* SCO 3.2v4 cc rejects this. */ - char *t; - char const *s = 0 ? (char *) 0 : (char const *) 0; - - *t++ = 0; -} -{ /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ - int x[] = {25, 17}; - const int *foo = &x[0]; - ++foo; -} -{ /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ - typedef const int *iptr; - iptr p = 0; - ++p; -} -{ /* AIX XL C 1.02.0.0 rejects this saying - "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ - struct s { int j; const int *ap[3]; }; - struct s *b; b->j = 5; -} -{ /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ - const int foo = 10; -} - -; return 0; } -EOF -if { (eval echo configure:1581: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then - rm -rf conftest* - ac_cv_c_const=yes -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_c_const=no -fi -rm -f conftest* -fi - -echo "$ac_t""$ac_cv_c_const" 1>&6 -if test $ac_cv_c_const = no; then - cat >> confdefs.h <<\EOF -#define const -EOF - -fi - -echo $ac_n "checking for ANSI C header files""... $ac_c" 1>&6 -echo "configure:1602: checking for ANSI C header files" >&5 -if eval "test \"`echo '$''{'ac_cv_header_stdc'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1607 "configure" -#include "confdefs.h" -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> -#include <float.h> -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1615: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - ac_cv_header_stdc=yes -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -if test $ac_cv_header_stdc = yes; then - # SunOS 4.x string.h does not declare mem*, contrary to ANSI. -cat > conftest.$ac_ext <<EOF -#line 1632 "configure" -#include "confdefs.h" -#include <string.h> -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "memchr" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. -cat > conftest.$ac_ext <<EOF -#line 1650 "configure" -#include "confdefs.h" -#include <stdlib.h> -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "free" >/dev/null 2>&1; then - : -else - rm -rf conftest* - ac_cv_header_stdc=no -fi -rm -f conftest* - -fi - -if test $ac_cv_header_stdc = yes; then - # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. -if test "$cross_compiling" = yes; then - : -else - cat > conftest.$ac_ext <<EOF -#line 1671 "configure" -#include "confdefs.h" -#include <ctype.h> -#define ISLOWER(c) ('a' <= (c) && (c) <= 'z') -#define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) -#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) -int main () { int i; for (i = 0; i < 256; i++) -if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) exit(2); -exit (0); } - -EOF -if { (eval echo configure:1682: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null -then - : -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -fr conftest* - ac_cv_header_stdc=no -fi -rm -fr conftest* -fi - -fi -fi - -echo "$ac_t""$ac_cv_header_stdc" 1>&6 -if test $ac_cv_header_stdc = yes; then - cat >> confdefs.h <<\EOF -#define STDC_HEADERS 1 -EOF - -fi - -echo $ac_n "checking for size_t""... $ac_c" 1>&6 -echo "configure:1706: checking for size_t" >&5 -if eval "test \"`echo '$''{'ac_cv_type_size_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1711 "configure" -#include "confdefs.h" -#include <sys/types.h> -#if STDC_HEADERS -#include <stdlib.h> -#include <stddef.h> -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "(^|[^a-zA-Z_0-9])size_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_size_t=yes -else - rm -rf conftest* - ac_cv_type_size_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_size_t" 1>&6 -if test $ac_cv_type_size_t = no; then - cat >> confdefs.h <<\EOF -#define size_t unsigned -EOF - -fi - -echo $ac_n "checking for ptrdiff_t""... $ac_c" 1>&6 -echo "configure:1739: checking for ptrdiff_t" >&5 -if eval "test \"`echo '$''{'ac_cv_type_ptrdiff_t'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1744 "configure" -#include "confdefs.h" -#include <sys/types.h> -#if STDC_HEADERS -#include <stdlib.h> -#include <stddef.h> -#endif -EOF -if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | - egrep "(^|[^a-zA-Z_0-9])ptrdiff_t[^a-zA-Z_0-9]" >/dev/null 2>&1; then - rm -rf conftest* - ac_cv_type_ptrdiff_t=yes -else - rm -rf conftest* - ac_cv_type_ptrdiff_t=no -fi -rm -f conftest* - -fi -echo "$ac_t""$ac_cv_type_ptrdiff_t" 1>&6 -if test $ac_cv_type_ptrdiff_t = no; then - cat >> confdefs.h <<\EOF -#define ptrdiff_t size_t -EOF - -fi - - -echo $ac_n "checking for vprintf""... $ac_c" 1>&6 -echo "configure:1773: checking for vprintf" >&5 -if eval "test \"`echo '$''{'ac_cv_func_vprintf'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1778 "configure" -#include "confdefs.h" -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char vprintf(); below. */ -#include <assert.h> -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char vprintf(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_vprintf) || defined (__stub___vprintf) -choke me -#else -vprintf(); -#endif - -; return 0; } -EOF -if { (eval echo configure:1801: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_vprintf=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_vprintf=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'vprintf`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define HAVE_VPRINTF 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi - -if test "$ac_cv_func_vprintf" != yes; then -echo $ac_n "checking for _doprnt""... $ac_c" 1>&6 -echo "configure:1825: checking for _doprnt" >&5 -if eval "test \"`echo '$''{'ac_cv_func__doprnt'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1830 "configure" -#include "confdefs.h" -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char _doprnt(); below. */ -#include <assert.h> -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char _doprnt(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub__doprnt) || defined (__stub____doprnt) -choke me -#else -_doprnt(); -#endif - -; return 0; } -EOF -if { (eval echo configure:1853: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func__doprnt=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func__doprnt=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'_doprnt`\" = yes"; then - echo "$ac_t""yes" 1>&6 - cat >> confdefs.h <<\EOF -#define HAVE_DOPRNT 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi - -fi - -for ac_func in isgraph setvbuf -do -echo $ac_n "checking for $ac_func""... $ac_c" 1>&6 -echo "configure:1880: checking for $ac_func" >&5 -if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 1885 "configure" -#include "confdefs.h" -/* System header to define __stub macros and hopefully few prototypes, - which can conflict with char $ac_func(); below. */ -#include <assert.h> -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char $ac_func(); - -int main() { - -/* The GNU C library defines this for functions which it implements - to always fail with ENOSYS. Some functions are actually named - something starting with __ and the normal name is an alias. */ -#if defined (__stub_$ac_func) || defined (__stub___$ac_func) -choke me -#else -$ac_func(); -#endif - -; return 0; } -EOF -if { (eval echo configure:1908: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_func_$ac_func=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_func_$ac_func=no" -fi -rm -f conftest* -fi - -if eval "test \"`echo '$ac_cv_func_'$ac_func`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_tr_func=HAVE_`echo $ac_func | tr 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'` - cat >> confdefs.h <<EOF -#define $ac_tr_func 1 -EOF - -else - echo "$ac_t""no" 1>&6 -fi -done - - -# Check whether --with-pkg or --without-pkg was given. -if test "${with_pkg+set}" = set; then - withval="$with_pkg" - - CPPFLAGS="$CPPFLAGS -I/usr/pkg/include" - LDFLAGS="$LDFLAGS -L/usr/pkg/lib" - echo Using /usr/pkg/include and /usr/pkg/lib - -fi - - -bcle=n -# Check whether --with-libedit or --without-libedit was given. -if test "${with_libedit+set}" = set; then - withval="$with_libedit" - - echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6 -echo "configure:1950: checking for tgetent in -ltermcap" >&5 -ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ltermcap $LIBS" -cat > conftest.$ac_ext <<EOF -#line 1958 "configure" -#include "confdefs.h" -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char tgetent(); - -int main() { -tgetent() -; return 0; } -EOF -if { (eval echo configure:1969: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - TERMLIB=-ltermcap -else - echo "$ac_t""no" 1>&6 -fi - - LDSAVE=$LDFLAGS - LDFLAGS="$LDFLAGS $TERMLIB" - echo $ac_n "checking for el_gets in -ledit""... $ac_c" 1>&6 -echo "configure:1992: checking for el_gets in -ledit" >&5 -ac_lib_var=`echo edit'_'el_gets | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ledit $LIBS" -cat > conftest.$ac_ext <<EOF -#line 2000 "configure" -#include "confdefs.h" -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char el_gets(); - -int main() { -el_gets() -; return 0; } -EOF -if { (eval echo configure:2011: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_safe=`echo "histedit.h" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for histedit.h""... $ac_c" 1>&6 -echo "configure:2028: checking for histedit.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 2033 "configure" -#include "confdefs.h" -#include <histedit.h> -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2038: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - READLINELIB="-ledit $TERMLIB";bcle=y -else - echo "$ac_t""no" 1>&6 -fi - -else - echo "$ac_t""no" 1>&6 -READLINELIB="" -fi - - if test "$bcle" = "y"; then - echo Using the libedit library. - cat >> confdefs.h <<\EOF -#define LIBEDIT 1 -EOF - - fi - LDFLAGS=$LDSAVE - -fi - - -bcrl=n -# Check whether --with-readline or --without-readline was given. -if test "${with_readline+set}" = set; then - withval="$with_readline" - - echo $ac_n "checking for tparm in -lncurses""... $ac_c" 1>&6 -echo "configure:2082: checking for tparm in -lncurses" >&5 -ac_lib_var=`echo ncurses'_'tparm | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lncurses $LIBS" -cat > conftest.$ac_ext <<EOF -#line 2090 "configure" -#include "confdefs.h" -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char tparm(); - -int main() { -tparm() -; return 0; } -EOF -if { (eval echo configure:2101: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - TERMLIB=-lncurses -else - echo "$ac_t""no" 1>&6 -echo $ac_n "checking for tgetent in -ltermcap""... $ac_c" 1>&6 -echo "configure:2120: checking for tgetent in -ltermcap" >&5 -ac_lib_var=`echo termcap'_'tgetent | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-ltermcap $LIBS" -cat > conftest.$ac_ext <<EOF -#line 2128 "configure" -#include "confdefs.h" -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char tgetent(); - -int main() { -tgetent() -; return 0; } -EOF -if { (eval echo configure:2139: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - TERMLIB=-ltermcap -else - echo "$ac_t""no" 1>&6 -fi - -fi - - LDSAVE=$LDFLAGS - LDFLAGS="$LDFLAGS $TERMLIB" - echo $ac_n "checking for readline in -lreadline""... $ac_c" 1>&6 -echo "configure:2164: checking for readline in -lreadline" >&5 -ac_lib_var=`echo readline'_'readline | sed 'y%./+-%__p_%'` -if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - ac_save_LIBS="$LIBS" -LIBS="-lreadline $LIBS" -cat > conftest.$ac_ext <<EOF -#line 2172 "configure" -#include "confdefs.h" -/* Override any gcc2 internal prototype to avoid an error. */ -/* We use char because int might match the return type of a gcc2 - builtin and then its argument prototype would still apply. */ -char readline(); - -int main() { -readline() -; return 0; } -EOF -if { (eval echo configure:2183: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=yes" -else - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_lib_$ac_lib_var=no" -fi -rm -f conftest* -LIBS="$ac_save_LIBS" - -fi -if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then - echo "$ac_t""yes" 1>&6 - ac_safe=`echo "readline/readline.h" | sed 'y%./+-%__p_%'` -echo $ac_n "checking for readline/readline.h""... $ac_c" 1>&6 -echo "configure:2200: checking for readline/readline.h" >&5 -if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then - echo $ac_n "(cached) $ac_c" 1>&6 -else - cat > conftest.$ac_ext <<EOF -#line 2205 "configure" -#include "confdefs.h" -#include <readline/readline.h> -EOF -ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2210: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } -ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` -if test -z "$ac_err"; then - rm -rf conftest* - eval "ac_cv_header_$ac_safe=yes" -else - echo "$ac_err" >&5 - echo "configure: failed program was:" >&5 - cat conftest.$ac_ext >&5 - rm -rf conftest* - eval "ac_cv_header_$ac_safe=no" -fi -rm -f conftest* -fi -if eval "test \"`echo '$ac_cv_header_'$ac_safe`\" = yes"; then - echo "$ac_t""yes" 1>&6 - READLINELIB="-lreadline $TERMLIB";bcrl=y -else - echo "$ac_t""no" 1>&6 -fi - -else - echo "$ac_t""no" 1>&6 -READLINELIB="" -fi - - if test "$bcrl" = "y" ; then - echo Using the readline library. - cat >> confdefs.h <<\EOF -#define READLINE 1 -EOF - - fi - LDFLAGS=$LDSAVE - -fi - - -if test "$LEX" = "flex" ; then - LEX="flex -I8" -else - if test "$bcrl" = "y" ; then - echo "configure: warning: readline works only with flex." 1>&2 - fi -fi - -if test "$bcrl" = "y" -a "$bcle" = "y" ; then - { echo "configure: error: Can not use both readline and libedit. Aborting." 1>&2; exit 1; } -fi - -if test "$LEX" = "lex" -a `uname -s` = "SunOS" ; then - LEXLIB="" - echo "SunOS using lex does not have a -ll." -fi - - -if test "$program_transform_name" = s,x,x,; then - program_transform_name= -else - # Double any \ or $. echo might interpret backslashes. - cat <<\EOF_SED > conftestsed -s,\\,\\\\,g; s,\$,$$,g -EOF_SED - program_transform_name="`echo $program_transform_name|sed -f conftestsed`" - rm -f conftestsed -fi -test "$program_prefix" != NONE && - program_transform_name="s,^,${program_prefix},; $program_transform_name" -# Use a double $ so make ignores it. -test "$program_suffix" != NONE && - program_transform_name="s,\$\$,${program_suffix},; $program_transform_name" - -# sed with no file args requires a program. -test "$program_transform_name" = "" && program_transform_name="s,x,x," - -trap '' 1 2 15 -cat > confcache <<\EOF -# This file is a shell script that caches the results of configure -# tests run on this system so they can be shared between configure -# scripts and configure runs. It is not useful on other systems. -# If it contains results you don't want to keep, you may remove or edit it. -# -# By default, configure uses ./config.cache as the cache file, -# creating it if it does not exist already. You can give configure -# the --cache-file=FILE option to use a different cache file; that is -# what configure does when it calls configure scripts in -# subdirectories, so they share the cache. -# Giving --cache-file=/dev/null disables caching, for debugging configure. -# config.status only pays attention to the cache file if you give it the -# --recheck option to rerun configure. -# -EOF -# The following way of writing the cache mishandles newlines in values, -# but we know of no workaround that is simple, portable, and efficient. -# So, don't put newlines in cache variables' values. -# Ultrix sh set writes to stderr and can't be redirected directly, -# and sets the high bit in the cache file unless we assign to the vars. -(set) 2>&1 | - case `(ac_space=' '; set | grep ac_space) 2>&1` in - *ac_space=\ *) - # `set' does not quote correctly, so add quotes (double-quote substitution - # turns \\\\ into \\, and sed turns \\ into \). - sed -n \ - -e "s/'/'\\\\''/g" \ - -e "s/^\\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\\)=\\(.*\\)/\\1=\${\\1='\\2'}/p" - ;; - *) - # `set' quotes correctly as required by POSIX, so do not add quotes. - sed -n -e 's/^\([a-zA-Z0-9_]*_cv_[a-zA-Z0-9_]*\)=\(.*\)/\1=${\1=\2}/p' - ;; - esac >> confcache -if cmp -s $cache_file confcache; then - : -else - if test -w $cache_file; then - echo "updating cache $cache_file" - cat confcache > $cache_file - else - echo "not updating unwritable cache $cache_file" - fi -fi -rm -f confcache - -trap 'rm -fr conftest* confdefs* core core.* *.core $ac_clean_files; exit 1' 1 2 15 - -test "x$prefix" = xNONE && prefix=$ac_default_prefix -# Let make expand exec_prefix. -test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' - -# Any assignment to VPATH causes Sun make to only execute -# the first set of double-colon rules, so remove it if not needed. -# If there is a colon in the path, we need to keep it. -if test "x$srcdir" = x.; then - ac_vpsub='/^[ ]*VPATH[ ]*=[^:]*$/d' -fi - -trap 'rm -f $CONFIG_STATUS conftest*; exit 1' 1 2 15 - -DEFS=-DHAVE_CONFIG_H - -# Without the "./", some shells look in PATH for config.status. -: ${CONFIG_STATUS=./config.status} - -echo creating $CONFIG_STATUS -rm -f $CONFIG_STATUS -cat > $CONFIG_STATUS <<EOF -#! /bin/sh -# Generated automatically by configure. -# Run this file to recreate the current configuration. -# This directory was configured as follows, -# on host `(hostname || uname -n) 2>/dev/null | sed 1q`: -# -# $0 $ac_configure_args -# -# Compiler output produced by configure, useful for debugging -# configure, is in ./config.log if it exists. - -ac_cs_usage="Usage: $CONFIG_STATUS [--recheck] [--version] [--help]" -for ac_option -do - case "\$ac_option" in - -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) - echo "running \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion" - exec \${CONFIG_SHELL-/bin/sh} $0 $ac_configure_args --no-create --no-recursion ;; - -version | --version | --versio | --versi | --vers | --ver | --ve | --v) - echo "$CONFIG_STATUS generated by autoconf version 2.13" - exit 0 ;; - -help | --help | --hel | --he | --h) - echo "\$ac_cs_usage"; exit 0 ;; - *) echo "\$ac_cs_usage"; exit 1 ;; - esac -done - -ac_given_srcdir=$srcdir -ac_given_INSTALL="$INSTALL" - -trap 'rm -fr `echo "Makefile bc/Makefile dc/Makefile doc/Makefile lib/Makefile config.h" | sed "s/:[^ ]*//g"` conftest*; exit 1' 1 2 15 -EOF -cat >> $CONFIG_STATUS <<EOF - -# Protect against being on the right side of a sed subst in config.status. -sed 's/%@/@@/; s/@%/@@/; s/%g\$/@g/; /@g\$/s/[\\\\&%]/\\\\&/g; - s/@@/%@/; s/@@/@%/; s/@g\$/%g/' > conftest.subs <<\\CEOF -$ac_vpsub -$extrasub -s%@SHELL@%$SHELL%g -s%@CFLAGS@%$CFLAGS%g -s%@CPPFLAGS@%$CPPFLAGS%g -s%@CXXFLAGS@%$CXXFLAGS%g -s%@FFLAGS@%$FFLAGS%g -s%@DEFS@%$DEFS%g -s%@LDFLAGS@%$LDFLAGS%g -s%@LIBS@%$LIBS%g -s%@exec_prefix@%$exec_prefix%g -s%@prefix@%$prefix%g -s%@program_transform_name@%$program_transform_name%g -s%@bindir@%$bindir%g -s%@sbindir@%$sbindir%g -s%@libexecdir@%$libexecdir%g -s%@datadir@%$datadir%g -s%@sysconfdir@%$sysconfdir%g -s%@sharedstatedir@%$sharedstatedir%g -s%@localstatedir@%$localstatedir%g -s%@libdir@%$libdir%g -s%@includedir@%$includedir%g -s%@oldincludedir@%$oldincludedir%g -s%@infodir@%$infodir%g -s%@mandir@%$mandir%g -s%@INSTALL_PROGRAM@%$INSTALL_PROGRAM%g -s%@INSTALL_SCRIPT@%$INSTALL_SCRIPT%g -s%@INSTALL_DATA@%$INSTALL_DATA%g -s%@PACKAGE@%$PACKAGE%g -s%@VERSION@%$VERSION%g -s%@ACLOCAL@%$ACLOCAL%g -s%@AUTOCONF@%$AUTOCONF%g -s%@AUTOMAKE@%$AUTOMAKE%g -s%@AUTOHEADER@%$AUTOHEADER%g -s%@MAKEINFO@%$MAKEINFO%g -s%@SET_MAKE@%$SET_MAKE%g -s%@CC@%$CC%g -s%@CPP@%$CPP%g -s%@LEX@%$LEX%g -s%@LEXLIB@%$LEXLIB%g -s%@LEX_OUTPUT_ROOT@%$LEX_OUTPUT_ROOT%g -s%@YACC@%$YACC%g -s%@RANLIB@%$RANLIB%g -s%@READLINELIB@%$READLINELIB%g - -CEOF -EOF - -cat >> $CONFIG_STATUS <<\EOF - -# Split the substitutions into bite-sized pieces for seds with -# small command number limits, like on Digital OSF/1 and HP-UX. -ac_max_sed_cmds=90 # Maximum number of lines to put in a sed script. -ac_file=1 # Number of current file. -ac_beg=1 # First line for current file. -ac_end=$ac_max_sed_cmds # Line after last line for current file. -ac_more_lines=: -ac_sed_cmds="" -while $ac_more_lines; do - if test $ac_beg -gt 1; then - sed "1,${ac_beg}d; ${ac_end}q" conftest.subs > conftest.s$ac_file - else - sed "${ac_end}q" conftest.subs > conftest.s$ac_file - fi - if test ! -s conftest.s$ac_file; then - ac_more_lines=false - rm -f conftest.s$ac_file - else - if test -z "$ac_sed_cmds"; then - ac_sed_cmds="sed -f conftest.s$ac_file" - else - ac_sed_cmds="$ac_sed_cmds | sed -f conftest.s$ac_file" - fi - ac_file=`expr $ac_file + 1` - ac_beg=$ac_end - ac_end=`expr $ac_end + $ac_max_sed_cmds` - fi -done -if test -z "$ac_sed_cmds"; then - ac_sed_cmds=cat -fi -EOF - -cat >> $CONFIG_STATUS <<EOF - -CONFIG_FILES=\${CONFIG_FILES-"Makefile bc/Makefile dc/Makefile doc/Makefile lib/Makefile"} -EOF -cat >> $CONFIG_STATUS <<\EOF -for ac_file in .. $CONFIG_FILES; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - # Adjust a relative srcdir, top_srcdir, and INSTALL for subdirectories. - - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - ac_dir_suffix="/`echo $ac_dir|sed 's%^\./%%'`" - # A "../" for each directory in $ac_dir_suffix. - ac_dots=`echo $ac_dir_suffix|sed 's%/[^/]*%../%g'` - else - ac_dir_suffix= ac_dots= - fi - - case "$ac_given_srcdir" in - .) srcdir=. - if test -z "$ac_dots"; then top_srcdir=. - else top_srcdir=`echo $ac_dots|sed 's%/$%%'`; fi ;; - /*) srcdir="$ac_given_srcdir$ac_dir_suffix"; top_srcdir="$ac_given_srcdir" ;; - *) # Relative path. - srcdir="$ac_dots$ac_given_srcdir$ac_dir_suffix" - top_srcdir="$ac_dots$ac_given_srcdir" ;; - esac - - case "$ac_given_INSTALL" in - [/$]*) INSTALL="$ac_given_INSTALL" ;; - *) INSTALL="$ac_dots$ac_given_INSTALL" ;; - esac - - echo creating "$ac_file" - rm -f "$ac_file" - configure_input="Generated automatically from `echo $ac_file_in|sed 's%.*/%%'` by configure." - case "$ac_file" in - *Makefile*) ac_comsub="1i\\ -# $configure_input" ;; - *) ac_comsub= ;; - esac - - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - sed -e "$ac_comsub -s%@configure_input@%$configure_input%g -s%@srcdir@%$srcdir%g -s%@top_srcdir@%$top_srcdir%g -s%@INSTALL@%$INSTALL%g -" $ac_file_inputs | (eval "$ac_sed_cmds") > $ac_file -fi; done -rm -f conftest.s* - -# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where -# NAME is the cpp macro being defined and VALUE is the value it is being given. -# -# ac_d sets the value in "#define NAME VALUE" lines. -ac_dA='s%^\([ ]*\)#\([ ]*define[ ][ ]*\)' -ac_dB='\([ ][ ]*\)[^ ]*%\1#\2' -ac_dC='\3' -ac_dD='%g' -# ac_u turns "#undef NAME" with trailing blanks into "#define NAME VALUE". -ac_uA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_uB='\([ ]\)%\1#\2define\3' -ac_uC=' ' -ac_uD='\4%g' -# ac_e turns "#undef NAME" without trailing blanks into "#define NAME VALUE". -ac_eA='s%^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' -ac_eB='$%\1#\2define\3' -ac_eC=' ' -ac_eD='%g' - -if test "${CONFIG_HEADERS+set}" != set; then -EOF -cat >> $CONFIG_STATUS <<EOF - CONFIG_HEADERS="config.h" -EOF -cat >> $CONFIG_STATUS <<\EOF -fi -for ac_file in .. $CONFIG_HEADERS; do if test "x$ac_file" != x..; then - # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". - case "$ac_file" in - *:*) ac_file_in=`echo "$ac_file"|sed 's%[^:]*:%%'` - ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; - *) ac_file_in="${ac_file}.in" ;; - esac - - echo creating $ac_file - - rm -f conftest.frag conftest.in conftest.out - ac_file_inputs=`echo $ac_file_in|sed -e "s%^%$ac_given_srcdir/%" -e "s%:% $ac_given_srcdir/%g"` - cat $ac_file_inputs > conftest.in - -EOF - -# Transform confdefs.h into a sed script conftest.vals that substitutes -# the proper values into config.h.in to produce config.h. And first: -# Protect against being on the right side of a sed subst in config.status. -# Protect against being in an unquoted here document in config.status. -rm -f conftest.vals -cat > conftest.hdr <<\EOF -s/[\\&%]/\\&/g -s%[\\$`]%\\&%g -s%#define \([A-Za-z_][A-Za-z0-9_]*\) *\(.*\)%${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD}%gp -s%ac_d%ac_u%gp -s%ac_u%ac_e%gp -EOF -sed -n -f conftest.hdr confdefs.h > conftest.vals -rm -f conftest.hdr - -# This sed command replaces #undef with comments. This is necessary, for -# example, in the case of _POSIX_SOURCE, which is predefined and required -# on some systems where configure will not decide to define it. -cat >> conftest.vals <<\EOF -s%^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*%/* & */% -EOF - -# Break up conftest.vals because some shells have a limit on -# the size of here documents, and old seds have small limits too. - -rm -f conftest.tail -while : -do - ac_lines=`grep -c . conftest.vals` - # grep -c gives empty output for an empty file on some AIX systems. - if test -z "$ac_lines" || test "$ac_lines" -eq 0; then break; fi - # Write a limited-size here document to conftest.frag. - echo ' cat > conftest.frag <<CEOF' >> $CONFIG_STATUS - sed ${ac_max_here_lines}q conftest.vals >> $CONFIG_STATUS - echo 'CEOF - sed -f conftest.frag conftest.in > conftest.out - rm -f conftest.in - mv conftest.out conftest.in -' >> $CONFIG_STATUS - sed 1,${ac_max_here_lines}d conftest.vals > conftest.tail - rm -f conftest.vals - mv conftest.tail conftest.vals -done -rm -f conftest.vals - -cat >> $CONFIG_STATUS <<\EOF - rm -f conftest.frag conftest.h - echo "/* $ac_file. Generated automatically by configure. */" > conftest.h - cat conftest.in >> conftest.h - rm -f conftest.in - if cmp -s $ac_file conftest.h 2>/dev/null; then - echo "$ac_file is unchanged" - rm -f conftest.h - else - # Remove last slash and all that follows it. Not all systems have dirname. - ac_dir=`echo $ac_file|sed 's%/[^/][^/]*$%%'` - if test "$ac_dir" != "$ac_file" && test "$ac_dir" != .; then - # The file is in a subdirectory. - test ! -d "$ac_dir" && mkdir "$ac_dir" - fi - rm -f $ac_file - mv conftest.h $ac_file - fi -fi; done - -EOF -cat >> $CONFIG_STATUS <<EOF - - -EOF -cat >> $CONFIG_STATUS <<\EOF -test -z "$CONFIG_HEADERS" || echo timestamp > stamp-h - -exit 0 -EOF -chmod +x $CONFIG_STATUS -rm -fr confdefs* $ac_clean_files -test "$no_create" = yes || ${CONFIG_SHELL-/bin/sh} $CONFIG_STATUS || exit 1 - diff --git a/contrib/bc/configure.in b/contrib/bc/configure.in deleted file mode 100644 index 5f982d3..0000000 --- a/contrib/bc/configure.in +++ /dev/null @@ -1,89 +0,0 @@ -dnl Process this file with autoconf to produce a configure script. -AC_INIT(doc/bc.1) -AM_INIT_AUTOMAKE("bc", "1.06") -AM_CONFIG_HEADER(config.h) - -AC_DEFINE(DC_VERSION,"1.3") -AC_DEFINE_UNQUOTED(BC_COPYRIGHT, dnl - ["Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc."]) -AC_DEFINE_UNQUOTED(DC_COPYRIGHT, dnl - ["Copyright 1994, 1997, 1998, 2000 Free Software Foundation, Inc."]) - -AC_PROG_CC -AC_MINIX -dnl AC_ISC_POSIX - -AM_PROG_LEX -AC_PROG_YACC -AC_PROG_INSTALL -AC_PROG_RANLIB -AC_PROG_MAKE_SET - -AC_CHECK_HEADERS(stdarg.h stddef.h stdlib.h string.h limits.h unistd.h lib.h) -AC_C_CONST -AC_TYPE_SIZE_T -AC_CHECK_TYPE(ptrdiff_t, size_t) - -AC_FUNC_VPRINTF -AC_CHECK_FUNCS(isgraph setvbuf) - -AC_ARG_WITH(pkg,[ --with-pkg use software installed in /usr/pkg tree], [ - CPPFLAGS="$CPPFLAGS -I/usr/pkg/include" - LDFLAGS="$LDFLAGS -L/usr/pkg/lib" - echo Using /usr/pkg/include and /usr/pkg/lib -]) - -bcle=n -AC_ARG_WITH(libedit,[ --with-libedit support fancy BSD command input -editing], [ - AC_CHECK_LIB(termcap,tgetent,TERMLIB=-ltermcap) - LDSAVE=$LDFLAGS - LDFLAGS="$LDFLAGS $TERMLIB" - AC_CHECK_LIB(edit,el_gets, - [AC_CHECK_HEADER(histedit.h, - READLINELIB="-ledit $TERMLIB";bcle=y)], - READLINELIB="") - if test "$bcle" = "y"; then - echo Using the libedit library. - AC_DEFINE(LIBEDIT,1) - fi - LDFLAGS=$LDSAVE -]) - -bcrl=n -AC_ARG_WITH(readline,[ --with-readline support fancy command input editing], [ - AC_CHECK_LIB(ncurses,tparm,TERMLIB=-lncurses, - AC_CHECK_LIB(termcap,tgetent,TERMLIB=-ltermcap)) - LDSAVE=$LDFLAGS - LDFLAGS="$LDFLAGS $TERMLIB" - AC_CHECK_LIB(readline,readline, - [AC_CHECK_HEADER(readline/readline.h, - READLINELIB="-lreadline $TERMLIB";bcrl=y)], - READLINELIB="") - if test "$bcrl" = "y" ; then - echo Using the readline library. - AC_DEFINE(READLINE,1) - fi - LDFLAGS=$LDSAVE -]) - -if test "$LEX" = "flex" ; then - LEX="flex -I8" -else - if test "$bcrl" = "y" ; then - AC_MSG_WARN(readline works only with flex.) - fi -fi - -if test "$bcrl" = "y" -a "$bcle" = "y" ; then - AC_MSG_ERROR(Can not use both readline and libedit. Aborting.) -fi - -if test "$LEX" = "lex" -a `uname -s` = "SunOS" ; then - LEXLIB="" - echo "SunOS using lex does not have a -ll." -fi - -AC_SUBST(READLINELIB) -AC_ARG_PROGRAM -AC_OUTPUT(Makefile bc/Makefile dc/Makefile doc/Makefile lib/Makefile) diff --git a/contrib/bc/dc/Makefile.am b/contrib/bc/dc/Makefile.am deleted file mode 100644 index 99164ba..0000000 --- a/contrib/bc/dc/Makefile.am +++ /dev/null @@ -1,14 +0,0 @@ -## Process this file with automake to produce Makefile.in -bin_PROGRAMS = dc - -dc_SOURCES = dc.c misc.c eval.c stack.c array.c numeric.c string.c -noinst_HEADERS = dc.h dc-proto.h dc-regdef.h - -INCLUDES = -I$(srcdir)/.. -I$(srcdir)/../h -LDADD = ../lib/libbc.a - -MAINTAINERCLEANFILES = Makefile.in - -CFLAGS = @CFLAGS@ -Wall -funsigned-char - -$(PROGRAMS): $(LDADD) diff --git a/contrib/bc/dc/Makefile.in b/contrib/bc/dc/Makefile.in deleted file mode 100644 index 0772dd6..0000000 --- a/contrib/bc/dc/Makefile.in +++ /dev/null @@ -1,296 +0,0 @@ -# Makefile.in generated automatically by automake 1.4 from Makefile.am - -# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include - -DESTDIR = - -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ - -top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -transform = @program_transform_name@ - -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -CC = @CC@ -LEX = @LEX@ -MAKEINFO = @MAKEINFO@ -PACKAGE = @PACKAGE@ -RANLIB = @RANLIB@ -READLINELIB = @READLINELIB@ -VERSION = @VERSION@ -YACC = @YACC@ - -bin_PROGRAMS = dc - -dc_SOURCES = dc.c misc.c eval.c stack.c array.c numeric.c string.c -noinst_HEADERS = dc.h dc-proto.h dc-regdef.h - -INCLUDES = -I$(srcdir)/.. -I$(srcdir)/../h -LDADD = ../lib/libbc.a - -MAINTAINERCLEANFILES = Makefile.in - -CFLAGS = @CFLAGS@ -Wall -funsigned-char -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = ../config.h -CONFIG_CLEAN_FILES = -PROGRAMS = $(bin_PROGRAMS) - - -DEFS = @DEFS@ -I. -I$(srcdir) -I.. -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -dc_OBJECTS = dc.o misc.o eval.o stack.o array.o numeric.o string.o -dc_LDADD = $(LDADD) -dc_DEPENDENCIES = ../lib/libbc.a -dc_LDFLAGS = -COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ -HEADERS = $(noinst_HEADERS) - -DIST_COMMON = Makefile.am Makefile.in - - -DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) - -TAR = tar -GZIP_ENV = --best -SOURCES = $(dc_SOURCES) -OBJECTS = $(dc_OBJECTS) - -all: all-redirect -.SUFFIXES: -.SUFFIXES: .S .c .o .s -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps dc/Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - - -mostlyclean-binPROGRAMS: - -clean-binPROGRAMS: - -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) - -distclean-binPROGRAMS: - -maintainer-clean-binPROGRAMS: - -install-binPROGRAMS: $(bin_PROGRAMS) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(bindir) - @list='$(bin_PROGRAMS)'; for p in $$list; do \ - if test -f $$p; then \ - echo " $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`"; \ - $(INSTALL_PROGRAM) $$p $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - else :; fi; \ - done - -uninstall-binPROGRAMS: - @$(NORMAL_UNINSTALL) - list='$(bin_PROGRAMS)'; for p in $$list; do \ - rm -f $(DESTDIR)$(bindir)/`echo $$p|sed 's/$(EXEEXT)$$//'|sed '$(transform)'|sed 's/$$/$(EXEEXT)/'`; \ - done - -.c.o: - $(COMPILE) -c $< - -.s.o: - $(COMPILE) -c $< - -.S.o: - $(COMPILE) -c $< - -mostlyclean-compile: - -rm -f *.o core *.core - -clean-compile: - -distclean-compile: - -rm -f *.tab.c - -maintainer-clean-compile: - -dc: $(dc_OBJECTS) $(dc_DEPENDENCIES) - @rm -f dc - $(LINK) $(dc_LDFLAGS) $(dc_OBJECTS) $(dc_LDADD) $(LIBS) - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - here=`pwd` && cd $(srcdir) \ - && mkid -f$$here/ID $$unique $(LISP) - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) - -mostlyclean-tags: - -clean-tags: - -distclean-tags: - -rm -f TAGS ID - -maintainer-clean-tags: - -distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) - -subdir = dc - -distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - d=$(srcdir); \ - if test -d $$d/$$file; then \ - cp -pr $$/$$file $(distdir)/$$file; \ - else \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file || :; \ - fi; \ - done -array.o: array.c ../config.h dc.h dc-proto.h dc-regdef.h -dc.o: dc.c ../config.h ../h/getopt.h dc.h dc-proto.h -eval.o: eval.c ../config.h dc.h dc-proto.h -misc.o: misc.c ../config.h ../h/getopt.h dc.h dc-proto.h -numeric.o: numeric.c ../config.h ../h/number.h dc.h dc-proto.h -stack.o: stack.c ../config.h dc.h dc-proto.h dc-regdef.h -string.o: string.c ../config.h dc.h dc-proto.h - -info-am: -info: info-am -dvi-am: -dvi: dvi-am -check-am: all-am -check: check-am -installcheck-am: -installcheck: installcheck-am -install-exec-am: install-binPROGRAMS -install-exec: install-exec-am - -install-data-am: -install-data: install-data-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -install: install-am -uninstall-am: uninstall-binPROGRAMS -uninstall: uninstall-am -all-am: Makefile $(PROGRAMS) $(HEADERS) -all-redirect: all-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install -installdirs: - $(mkinstalldirs) $(DESTDIR)$(bindir) - - -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) - -rm -f config.cache config.log stamp-h stamp-h[0-9]* - -maintainer-clean-generic: - -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) -mostlyclean-am: mostlyclean-binPROGRAMS mostlyclean-compile \ - mostlyclean-tags mostlyclean-generic - -mostlyclean: mostlyclean-am - -clean-am: clean-binPROGRAMS clean-compile clean-tags clean-generic \ - mostlyclean-am - -clean: clean-am - -distclean-am: distclean-binPROGRAMS distclean-compile distclean-tags \ - distclean-generic clean-am - -distclean: distclean-am - -maintainer-clean-am: maintainer-clean-binPROGRAMS \ - maintainer-clean-compile maintainer-clean-tags \ - maintainer-clean-generic distclean-am - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -maintainer-clean: maintainer-clean-am - -.PHONY: mostlyclean-binPROGRAMS distclean-binPROGRAMS clean-binPROGRAMS \ -maintainer-clean-binPROGRAMS uninstall-binPROGRAMS install-binPROGRAMS \ -mostlyclean-compile distclean-compile clean-compile \ -maintainer-clean-compile tags mostlyclean-tags distclean-tags \ -clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \ -check-am installcheck-am installcheck install-exec-am install-exec \ -install-data-am install-data install-am install uninstall-am uninstall \ -all-redirect all-am all installdirs mostlyclean-generic \ -distclean-generic clean-generic maintainer-clean-generic clean \ -mostlyclean distclean maintainer-clean - - -$(PROGRAMS): $(LDADD) - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/contrib/bc/dc/array.c b/contrib/bc/dc/array.c deleted file mode 100644 index d97f716..0000000 --- a/contrib/bc/dc/array.c +++ /dev/null @@ -1,122 +0,0 @@ -/* - * implement arrays for dc - * - * Copyright (C) 1994, 1997, 1998 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -/* This module is the only one that knows what arrays look like. */ - -#include "config.h" - -#include <stdio.h> /* "dc-proto.h" wants this */ -#ifdef HAVE_STDLIB_H -/* get size_t definition from "almost ANSI" compiling environments. */ -#include <stdlib.h> -#endif -#include "dc.h" -#include "dc-proto.h" -#include "dc-regdef.h" - -/* what's most useful: quick access or sparse arrays? */ -/* I'll go with sparse arrays for now */ -struct dc_array { - int Index; - dc_data value; - struct dc_array *next; -}; - - -/* initialize the arrays */ -void -dc_array_init DC_DECLVOID() -{ -} - -/* store value into array_id[Index] */ -void -dc_array_set DC_DECLARG((array_id, Index, value)) - int array_id DC_DECLSEP - int Index DC_DECLSEP - dc_data value DC_DECLEND -{ - struct dc_array *cur; - struct dc_array *prev=NULL; - struct dc_array *newentry; - - cur = dc_get_stacked_array(array_id); - while (cur && cur->Index < Index){ - prev = cur; - cur = cur->next; - } - if (cur && cur->Index == Index){ - if (cur->value.dc_type == DC_NUMBER) - dc_free_num(&cur->value.v.number); - else if (cur->value.dc_type == DC_STRING) - dc_free_str(&cur->value.v.string); - else - dc_garbage(" in array", array_id); - cur->value = value; - }else{ - newentry = dc_malloc(sizeof *newentry); - newentry->Index = Index; - newentry->value = value; - newentry->next = cur; - if (prev) - prev->next = newentry; - else - dc_set_stacked_array(array_id, newentry); - } -} - -/* retrieve a dup of a value from array_id[Index] */ -/* A zero value is returned if the specified value is unintialized. */ -dc_data -dc_array_get DC_DECLARG((array_id, Index)) - int array_id DC_DECLSEP - int Index DC_DECLEND -{ - struct dc_array *cur; - - for (cur=dc_get_stacked_array(array_id); cur; cur=cur->next) - if (cur->Index == Index) - return dc_dup(cur->value); - return dc_int2data(0); -} - -/* free an array chain */ -void -dc_array_free DC_DECLARG((a_head)) - struct dc_array *a_head DC_DECLEND -{ - struct dc_array *cur; - struct dc_array *next; - - for (cur=a_head; cur; cur=next) { - next = cur->next; - if (cur->value.dc_type == DC_NUMBER) - dc_free_num(&cur->value.v.number); - else if (cur->value.dc_type == DC_STRING) - dc_free_str(&cur->value.v.string); - else - dc_garbage("in stack", -1); - free(cur); - } -} diff --git a/contrib/bc/dc/dc-proto.h b/contrib/bc/dc/dc-proto.h deleted file mode 100644 index f0ac28b..0000000 --- a/contrib/bc/dc/dc-proto.h +++ /dev/null @@ -1,90 +0,0 @@ -/* - * prototypes of all externally visible dc functions - * - * Copyright (C) 1994, 1997, 1998 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -extern const char *dc_str2charp DC_PROTO((dc_str)); -extern const char *dc_system DC_PROTO((const char *)); -extern void *dc_malloc DC_PROTO((size_t)); -extern struct dc_array *dc_get_stacked_array DC_PROTO((int)); - -extern void dc_array_set DC_PROTO((int, int, dc_data)); -extern void dc_array_free DC_PROTO((struct dc_array *)); -extern void dc_array_init DC_PROTO((void)); -extern void dc_binop DC_PROTO((int (*)(dc_num, dc_num, int, dc_num *), int)); -extern void dc_binop2 DC_PROTO((int (*)(dc_num, dc_num, int, - dc_num *, dc_num *), int)); -extern void dc_triop DC_PROTO((int (*)(dc_num, dc_num, dc_num, int, - dc_num *), int)); -extern void dc_clear_stack DC_PROTO((void)); -extern void dc_dump_num(dc_num, dc_discard); -extern void dc_free_num DC_PROTO((dc_num *)); -extern void dc_free_str DC_PROTO((dc_str *)); -extern void dc_garbage DC_PROTO((const char *, int)); -extern void dc_math_init DC_PROTO((void)); -extern void dc_memfail DC_PROTO((void)); -extern void dc_out_num DC_PROTO((dc_num, int, dc_newline, dc_discard)); -extern void dc_out_str DC_PROTO((dc_str, dc_newline, dc_discard)); -extern void dc_print DC_PROTO((dc_data, int, dc_newline, dc_discard)); -extern void dc_printall DC_PROTO((int)); -extern void dc_push DC_PROTO((dc_data)); -extern void dc_register_init DC_PROTO((void)); -extern void dc_register_push DC_PROTO((int, dc_data)); -extern void dc_register_set DC_PROTO((int, dc_data)); -extern void dc_set_stacked_array DC_PROTO((int, struct dc_array *)); -extern void dc_show_id DC_PROTO((FILE *, int, const char *)); -extern void dc_string_init DC_PROTO((void)); - -extern int dc_cmpop DC_PROTO((void)); -extern int dc_compare DC_PROTO((dc_num, dc_num)); -extern int dc_evalfile DC_PROTO((FILE *)); -extern int dc_evalstr DC_PROTO((dc_data)); -extern int dc_num2int DC_PROTO((dc_num, dc_discard)); -extern int dc_numlen DC_PROTO((dc_num)); -extern int dc_pop DC_PROTO((dc_data *)); -extern int dc_register_get DC_PROTO((int, dc_data *)); -extern int dc_register_pop DC_PROTO((int, dc_data *)); -extern int dc_tell_length DC_PROTO((dc_data, dc_discard)); -extern int dc_tell_scale DC_PROTO((dc_num, dc_discard)); -extern int dc_tell_stackdepth DC_PROTO((void)); -extern int dc_top_of_stack DC_PROTO((dc_data *)); - -extern size_t dc_strlen DC_PROTO((dc_str)); - -extern dc_data dc_array_get DC_PROTO((int, int)); -extern dc_data dc_dup DC_PROTO((dc_data)); -extern dc_data dc_dup_num DC_PROTO((dc_num)); -extern dc_data dc_dup_str DC_PROTO((dc_str)); -extern dc_data dc_getnum DC_PROTO((int (*)(void), int, int *)); -extern dc_data dc_int2data DC_PROTO((int)); -extern dc_data dc_makestring DC_PROTO((const char *, size_t)); -extern dc_data dc_readstring DC_PROTO((FILE *, int , int)); - -extern int dc_add DC_PROTO((dc_num, dc_num, int, dc_num *)); -extern int dc_div DC_PROTO((dc_num, dc_num, int, dc_num *)); -extern int dc_divrem DC_PROTO((dc_num, dc_num, int, dc_num *, dc_num *)); -extern int dc_exp DC_PROTO((dc_num, dc_num, int, dc_num *)); -extern int dc_modexp DC_PROTO((dc_num, dc_num, dc_num, int, dc_num *)); -extern int dc_mul DC_PROTO((dc_num, dc_num, int, dc_num *)); -extern int dc_rem DC_PROTO((dc_num, dc_num, int, dc_num *)); -extern int dc_sub DC_PROTO((dc_num, dc_num, int, dc_num *)); -extern int dc_sqrt DC_PROTO((dc_num, int, dc_num *)); diff --git a/contrib/bc/dc/dc-regdef.h b/contrib/bc/dc/dc-regdef.h deleted file mode 100644 index 540268c..0000000 --- a/contrib/bc/dc/dc-regdef.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * definitions for dc's "register" declarations - * - * Copyright (C) 1994 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -#ifdef HAVE_LIMITS_H -# include <limits.h> /* UCHAR_MAX */ -#endif - -/* determine how many register stacks there are */ -#ifndef DC_REGCOUNT -# ifndef UCHAR_MAX -# define DC_REGCOUNT 256 -# else -# define DC_REGCOUNT (UCHAR_MAX+1) -# endif -#endif /* not DC_REGCOUNT */ - -/* efficiency hack for masking arbritrary integers to 0..(DC_REGCOUNT-1) */ -#if (DC_REGCOUNT & (DC_REGCOUNT-1)) == 0 /* DC_REGCOUNT is power of 2 */ -# define regmap(r) ((r) & (DC_REGCOUNT-1)) -#else -# define regmap(r) ((r) % DC_REGCOUNT) -#endif diff --git a/contrib/bc/dc/dc.c b/contrib/bc/dc/dc.c deleted file mode 100644 index a72644c..0000000 --- a/contrib/bc/dc/dc.c +++ /dev/null @@ -1,183 +0,0 @@ -/* - * implement the "dc" Desk Calculator language. - * - * Copyright (C) 1994, 1997, 1998, 2000 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -/* Written with strong hiding of implementation details - * in their own specialized modules. - */ -/* This module contains the argument processing/main functions. - */ - -#include "config.h" - -#include <stdio.h> -#ifdef HAVE_STDLIB_H -# include <stdlib.h> -#endif -#ifdef HAVE_STRING_H -# include <string.h> -#else -# ifdef HAVE_STRINGS_H -# include <strings.h> -# endif -#endif -#include <getopt.h> -#include "dc.h" -#include "dc-proto.h" - -#ifndef EXIT_SUCCESS /* C89 <stdlib.h> */ -# define EXIT_SUCCESS 0 -#endif -#ifndef EXIT_FAILURE /* C89 <stdlib.h> */ -# define EXIT_FAILURE 1 -#endif - -const char *progname; /* basename of program invocation */ - -static void -bug_report_info DC_DECLVOID() -{ - printf("Email bug reports to: bug-dc@gnu.org .\n"); -} - -static void -show_version DC_DECLVOID() -{ - printf("dc (GNU %s %s) %s\n", PACKAGE, VERSION, DC_VERSION); - printf("\n%s\n\ -This is free software; see the source for copying conditions. There is NO\n\ -warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE,\n\ -to the extent permitted by law.\n", DC_COPYRIGHT); -} - -/* your generic usage function */ -static void -usage DC_DECLARG((f)) - FILE *f DC_DECLEND -{ - fprintf(f, "\ -Usage: %s [OPTION] [file ...]\n\ - -e, --expression=EXPR evaluate expression\n\ - -f, --file=FILE evaluate contents of file\n\ - -h, --help display this help and exit\n\ - -V, --version output version information and exit\n\ -\n\ -", progname); - bug_report_info(); -} - -/* returns a pointer to one past the last occurance of c in s, - * or s if c does not occur in s. - */ -static char * -r1bindex DC_DECLARG((s, c)) - char *s DC_DECLSEP - int c DC_DECLEND -{ - char *p = strrchr(s, c); - - if (!p) - return s; - return p + 1; -} - -static void -try_file(const char *filename) -{ - FILE *input; - - if (strcmp(filename, "-") == 0) { - input = stdin; - } else if ( !(input=fopen(filename, "r")) ) { - fprintf(stderr, "Could not open file "); - perror(filename); - exit(EXIT_FAILURE); - } - if (dc_evalfile(input)) - exit(EXIT_FAILURE); - if (input != stdin) - fclose(input); -} - - -int -main DC_DECLARG((argc, argv)) - int argc DC_DECLSEP - char **argv DC_DECLEND -{ - static struct option const long_opts[] = { - {"expression", required_argument, NULL, 'e'}, - {"file", required_argument, NULL, 'f'}, - {"help", no_argument, NULL, 'h'}, - {"version", no_argument, NULL, 'V'}, - {NULL, 0, NULL, 0} - }; - int did_eval = 0; - int c; - - progname = r1bindex(*argv, '/'); -#ifdef HAVE_SETVBUF - /* attempt to simplify interaction with applications such as emacs */ - (void) setvbuf(stdout, NULL, _IOLBF, 0); -#endif - dc_math_init(); - dc_string_init(); - dc_register_init(); - dc_array_init(); - - while ((c = getopt_long(argc, argv, "hVe:f:", long_opts, (int *)0)) != EOF) { - switch (c) { - case 'e': - { dc_data string = dc_makestring(optarg, strlen(optarg)); - if (dc_evalstr(string)) - return EXIT_SUCCESS; - dc_free_str(&string.v.string); - did_eval = 1; - } - break; - case 'f': - try_file(optarg); - did_eval = 1; - break; - case 'h': - usage(stdout); - return EXIT_SUCCESS; - case 'V': - show_version(); - return EXIT_SUCCESS; - default: - usage(stderr); - return EXIT_FAILURE; - } - } - - for (; optind < argc; ++optind) { - try_file(argv[optind]); - did_eval = 1; - } - if (!did_eval) { - /* if no -e commands and no command files, then eval stdin */ - if (dc_evalfile(stdin)) - return EXIT_FAILURE; - } - return EXIT_SUCCESS; -} diff --git a/contrib/bc/dc/dc.h b/contrib/bc/dc/dc.h deleted file mode 100644 index 3300f44..0000000 --- a/contrib/bc/dc/dc.h +++ /dev/null @@ -1,82 +0,0 @@ -/* - * Header file for dc routines - * - * Copyright (C) 1994, 1997, 1998 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -#ifndef DC_DEFS_H -#define DC_DEFS_H - -/* 'I' is a command, and bases 17 and 18 are quite - * unusual, so we limit ourselves to bases 2 to 16 - */ -#define DC_IBASE_MAX 16 - -#define DC_SUCCESS 0 -#define DC_DOMAIN_ERROR 1 -#define DC_FAIL 2 /* generic failure */ - - -#ifndef __STDC__ -# define DC_PROTO(x) () -# define DC_DECLVOID() () -# define DC_DECLARG(arglist) arglist -# define DC_DECLSEP ; -# define DC_DECLEND ; -#else /* __STDC__ */ -# define DC_PROTO(x) x -# define DC_DECLVOID() (void) -# define DC_DECLARG(arglist) ( -# define DC_DECLSEP , -# define DC_DECLEND ) -#endif /* __STDC__ */ - - -typedef enum {DC_TOSS, DC_KEEP} dc_discard; -typedef enum {DC_NONL, DC_WITHNL} dc_newline; - - -/* type discriminant for dc_data */ -typedef enum {DC_UNINITIALIZED, DC_NUMBER, DC_STRING} dc_value_type; - -/* only numeric.c knows what dc_num's *really* look like */ -typedef struct dc_number *dc_num; - -/* only string.c knows what dc_str's *really* look like */ -typedef struct dc_string *dc_str; - - -/* except for the two implementation-specific modules, all - * dc functions only know of this one generic type of object - */ -typedef struct { - dc_value_type dc_type; /* discriminant for union */ - union { - dc_num number; - dc_str string; - } v; -} dc_data; - - -/* This is dc's only global variable: */ -extern const char *progname; /* basename of program invocation */ - -#endif /* not DC_DEFS_H */ diff --git a/contrib/bc/dc/eval.c b/contrib/bc/dc/eval.c deleted file mode 100644 index 21592d9..0000000 --- a/contrib/bc/dc/eval.c +++ /dev/null @@ -1,682 +0,0 @@ -/* - * evaluate the dc language, from a FILE* or a string - * - * Copyright (C) 1994, 1997, 1998, 2000 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -/* This is the only module which knows about the dc input language */ - -#include "config.h" - -#include <stdio.h> -#ifdef HAVE_STRING_H -# include <string.h> /* memchr */ -#else -# ifdef HAVE_MEMORY_H -# include <memory.h> /* memchr, maybe */ -# else -# ifdef HAVE_STRINGS_H -# include <strings.h> /* memchr, maybe */ -# endif -#endif -#endif -#include "dc.h" -#include "dc-proto.h" - -typedef enum {DC_FALSE, DC_TRUE} dc_boolean; - -typedef enum { - DC_OKAY = DC_SUCCESS, /* no further intervention needed for this command */ - DC_EATONE, /* caller needs to eat the lookahead char */ - DC_QUIT, /* quit out of unwind_depth levels of evaluation */ - - /* with the following return values, the caller does not have to - * fret about stdin_lookahead's value - */ - DC_INT, /* caller needs to parse a dc_num from input stream */ - DC_STR, /* caller needs to parse a dc_str from input stream */ - DC_SYSTEM, /* caller needs to run a system() on next input line */ - DC_COMMENT, /* caller needs to skip to the next input line */ - DC_NEGCMP, /* caller needs to re-call dc_func() with `negcmp' set */ - - DC_EOF_ERROR /* unexpected end of input; abort current eval */ -} dc_status; - -static int dc_ibase=10; /* input base, 2 <= dc_ibase <= DC_IBASE_MAX */ -static int dc_obase=10; /* output base, 2 <= dc_obase */ -static int dc_scale=0; /* scale (see user documentaton) */ - -/* for Quitting evaluations */ -static int unwind_depth=0; - -/* if true, active Quit will not exit program */ -static dc_boolean unwind_noexit=DC_FALSE; - -/* - * Used to synchronize lookahead on stdin for '?' command. - * If set to EOF then lookahead is used up. - */ -static int stdin_lookahead=EOF; - - -/* input_fil and input_str are passed as arguments to dc_getnum */ - -/* used by the input_* functions: */ -static FILE *input_fil_fp; -static const char *input_str_string; - -/* Since we have a need for two characters of pushback, and - * ungetc() only guarantees one, we place the second pushback here - */ -static int input_pushback; - -/* passed as an argument to dc_getnum */ -static int -input_fil DC_DECLVOID() -{ - if (input_pushback != EOF){ - int c = input_pushback; - input_pushback = EOF; - return c; - } - return getc(input_fil_fp); -} - -/* passed as an argument to dc_getnum */ -static int -input_str DC_DECLVOID() -{ - if (!*input_str_string) - return EOF; - return *input_str_string++; -} - - - -/* takes a string and evals it; frees the string when done */ -/* Wrapper around dc_evalstr to avoid duplicating the free call - * at all possible return points. - */ -static int -dc_eval_and_free_str DC_DECLARG((string)) - dc_data string DC_DECLEND -{ - dc_status status; - - status = dc_evalstr(string); - if (string.dc_type == DC_STRING) - dc_free_str(&string.v.string); - return status; -} - - -/* dc_func does the grunt work of figuring out what each input - * character means; used by both dc_evalstr and dc_evalfile - * - * c -> the "current" input character under consideration - * peekc -> the lookahead input character - * negcmp -> negate comparison test (for <,=,> commands) - */ -static dc_status -dc_func DC_DECLARG((c, peekc, negcmp)) - int c DC_DECLSEP - int peekc DC_DECLSEP - int negcmp DC_DECLEND -{ - /* we occasionally need these for temporary data */ - /* Despite the GNU coding standards, it is much easier - * to have these declared once here, since this function - * is just one big switch statement. - */ - dc_data datum; - int tmpint; - - switch (c){ - case '_': case '.': - case '0': case '1': case '2': case '3': - case '4': case '5': case '6': case '7': - case '8': case '9': case 'A': case 'B': - case 'C': case 'D': case 'E': case 'F': - return DC_INT; - case ' ': - case '\t': - case '\n': - /* standard command separators */ - break; - - case '+': /* add top two stack elements */ - dc_binop(dc_add, dc_scale); - break; - case '-': /* subtract top two stack elements */ - dc_binop(dc_sub, dc_scale); - break; - case '*': /* multiply top two stack elements */ - dc_binop(dc_mul, dc_scale); - break; - case '/': /* divide top two stack elements */ - dc_binop(dc_div, dc_scale); - break; - case '%': - /* take the remainder from division of the top two stack elements */ - dc_binop(dc_rem, dc_scale); - break; - case '~': - /* Do division on the top two stack elements. Return the - * quotient as next-to-top of stack and the remainder as - * top-of-stack. - */ - dc_binop2(dc_divrem, dc_scale); - break; - case '|': - /* Consider the top three elements of the stack as (base, exp, mod), - * where mod is top-of-stack, exp is next-to-top, and base is - * second-from-top. Mod must be non-zero, exp must be non-negative, - * and all three must be integers. Push the result of raising - * base to the exp power, reduced modulo mod. If we had base in - * register b, exp in register e, and mod in register m then this - * is conceptually equivalent to "lble^lm%", but it is implemented - * in a more efficient manner, and can handle arbritrarily large - * values for exp. - */ - dc_triop(dc_modexp, dc_scale); - break; - case '^': /* exponientiation of the top two stack elements */ - dc_binop(dc_exp, dc_scale); - break; - case '<': - /* eval register named by peekc if - * less-than holds for top two stack elements - */ - if (peekc == EOF) - return DC_EOF_ERROR; - if ( (dc_cmpop() < 0) == !negcmp ) - if (dc_register_get(peekc, &datum) == DC_SUCCESS) - if (dc_eval_and_free_str(datum) == DC_QUIT) - return DC_QUIT; - return DC_EATONE; - case '=': - /* eval register named by peekc if - * equal-to holds for top two stack elements - */ - if (peekc == EOF) - return DC_EOF_ERROR; - if ( (dc_cmpop() == 0) == !negcmp ) - if (dc_register_get(peekc, &datum) == DC_SUCCESS) - if (dc_eval_and_free_str(datum) == DC_QUIT) - return DC_QUIT; - return DC_EATONE; - case '>': - /* eval register named by peekc if - * greater-than holds for top two stack elements - */ - if (peekc == EOF) - return DC_EOF_ERROR; - if ( (dc_cmpop() > 0) == !negcmp ) - if (dc_register_get(peekc, &datum) == DC_SUCCESS) - if (dc_eval_and_free_str(datum) == DC_QUIT) - return DC_QUIT; - return DC_EATONE; - case '?': /* read a line from standard-input and eval it */ - if (stdin_lookahead != EOF){ - ungetc(stdin_lookahead, stdin); - stdin_lookahead = EOF; - } - if (dc_eval_and_free_str(dc_readstring(stdin, '\n', '\n')) == DC_QUIT) - return DC_QUIT; - return DC_OKAY; - case '[': /* read to balancing ']' into a dc_str */ - return DC_STR; - case '!': /* read to newline and call system() on resulting string */ - if (peekc == '<' || peekc == '=' || peekc == '>') - return DC_NEGCMP; - return DC_SYSTEM; - case '#': /* comment; skip remainder of current line */ - return DC_COMMENT; - - case 'a': /* Convert top of stack to an ascii character. */ - if (dc_pop(&datum) == DC_SUCCESS){ - char tmps; - if (datum.dc_type == DC_NUMBER){ - tmps = (char) dc_num2int(datum.v.number, DC_TOSS); - }else if (datum.dc_type == DC_STRING){ - tmps = *dc_str2charp(datum.v.string); - dc_free_str(&datum.v.string); - }else{ - dc_garbage("at top of stack", -1); - } - dc_push(dc_makestring(&tmps, 1)); - } - break; - case 'c': /* clear whole stack */ - dc_clear_stack(); - break; - case 'd': /* duplicate the datum on the top of stack */ - if (dc_top_of_stack(&datum) == DC_SUCCESS) - dc_push(dc_dup(datum)); - break; - case 'f': /* print list of all stack items */ - dc_printall(dc_obase); - break; - case 'i': /* set input base to value on top of stack */ - if (dc_pop(&datum) == DC_SUCCESS){ - tmpint = 0; - if (datum.dc_type == DC_NUMBER) - tmpint = dc_num2int(datum.v.number, DC_TOSS); - if ( ! (2 <= tmpint && tmpint <= DC_IBASE_MAX) ) - fprintf(stderr, - "%s: input base must be a number \ -between 2 and %d (inclusive)\n", - progname, DC_IBASE_MAX); - else - dc_ibase = tmpint; - } - break; - case 'k': /* set scale to value on top of stack */ - if (dc_pop(&datum) == DC_SUCCESS){ - tmpint = -1; - if (datum.dc_type == DC_NUMBER) - tmpint = dc_num2int(datum.v.number, DC_TOSS); - if ( ! (tmpint >= 0) ) - fprintf(stderr, - "%s: scale must be a nonnegative number\n", - progname); - else - dc_scale = tmpint; - } - break; - case 'l': /* "load" -- push value on top of register stack named - * by peekc onto top of evaluation stack; does not - * modify the register stack - */ - if (peekc == EOF) - return DC_EOF_ERROR; - if (dc_register_get(peekc, &datum) == DC_SUCCESS) - dc_push(datum); - return DC_EATONE; - case 'n': /* print the value popped off of top-of-stack; - * do not add a trailing newline - */ - if (dc_pop(&datum) == DC_SUCCESS) - dc_print(datum, dc_obase, DC_NONL, DC_TOSS); - break; - case 'o': /* set output base to value on top of stack */ - if (dc_pop(&datum) == DC_SUCCESS){ - tmpint = 0; - if (datum.dc_type == DC_NUMBER) - tmpint = dc_num2int(datum.v.number, DC_TOSS); - if ( ! (tmpint > 1) ) - fprintf(stderr, - "%s: output base must be a number greater than 1\n", - progname); - else - dc_obase = tmpint; - } - break; - case 'p': /* print the datum on the top of stack, - * with a trailing newline - */ - if (dc_top_of_stack(&datum) == DC_SUCCESS) - dc_print(datum, dc_obase, DC_WITHNL, DC_KEEP); - break; - case 'q': /* quit two levels of evaluation, posibly exiting program */ - unwind_depth = 1; /* the return below is the first level of returns */ - unwind_noexit = DC_FALSE; - return DC_QUIT; - case 'r': /* rotate (swap) the top two elements on the stack - */ - if (dc_pop(&datum) == DC_SUCCESS) { - dc_data datum2; - int two_status; - two_status = dc_pop(&datum2); - dc_push(datum); - if (two_status == DC_SUCCESS) - dc_push(datum2); - } - break; - case 's': /* "store" -- replace top of register stack named - * by peekc with the value popped from the top - * of the evaluation stack - */ - if (peekc == EOF) - return DC_EOF_ERROR; - if (dc_pop(&datum) == DC_SUCCESS) - dc_register_set(peekc, datum); - return DC_EATONE; - case 'v': /* replace top of stack with its square root */ - if (dc_pop(&datum) == DC_SUCCESS){ - dc_num tmpnum; - if (datum.dc_type != DC_NUMBER){ - fprintf(stderr, - "%s: square root of nonnumeric attempted\n", - progname); - }else if (dc_sqrt(datum.v.number, dc_scale, &tmpnum) == DC_SUCCESS){ - dc_free_num(&datum.v.number); - datum.v.number = tmpnum; - dc_push(datum); - } - } - break; - case 'x': /* eval the datum popped from top of stack */ - if (dc_pop(&datum) == DC_SUCCESS){ - if (datum.dc_type == DC_STRING){ - if (dc_eval_and_free_str(datum) == DC_QUIT) - return DC_QUIT; - }else if (datum.dc_type == DC_NUMBER){ - dc_push(datum); - }else{ - dc_garbage("at top of stack", -1); - } - } - break; - case 'z': /* push the current stack depth onto the top of stack */ - dc_push(dc_int2data(dc_tell_stackdepth())); - break; - - case 'I': /* push the current input base onto the stack */ - dc_push(dc_int2data(dc_ibase)); - break; - case 'K': /* push the current scale onto the stack */ - dc_push(dc_int2data(dc_scale)); - break; - case 'L': /* pop a value off of register stack named by peekc - * and push it onto the evaluation stack - */ - if (peekc == EOF) - return DC_EOF_ERROR; - if (dc_register_pop(peekc, &datum) == DC_SUCCESS) - dc_push(datum); - return DC_EATONE; - case 'O': /* push the current output base onto the stack */ - dc_push(dc_int2data(dc_obase)); - break; - case 'P': - /* Pop the value off the top of a stack. If it is - * a number, dump out the integer portion of its - * absolute value as a "base UCHAR_MAX+1" byte stream; - * if it is a string, just print it. - * In either case, do not append a trailing newline. - */ - if (dc_pop(&datum) == DC_SUCCESS){ - if (datum.dc_type == DC_NUMBER) - dc_dump_num(datum.v.number, DC_TOSS); - else if (datum.dc_type == DC_STRING) - dc_out_str(datum.v.string, DC_NONL, DC_TOSS); - else - dc_garbage("at top of stack", -1); - } - break; - case 'Q': /* quit out of top-of-stack nested evals; - * pops value from stack; - * does not exit program (stops short if necessary) - */ - if (dc_pop(&datum) == DC_SUCCESS){ - unwind_depth = 0; - unwind_noexit = DC_TRUE; - if (datum.dc_type == DC_NUMBER) - unwind_depth = dc_num2int(datum.v.number, DC_TOSS); - if (unwind_depth-- > 0) - return DC_QUIT; - unwind_depth = 0; /* paranoia */ - fprintf(stderr, - "%s: Q command requires a number >= 1\n", - progname); - } - break; -#if 0 - case 'R': /* pop a value off of the evaluation stack,; - * rotate the top - remaining stack elements that many - * places forward (negative numbers mean rotate - * backward). - */ - if (dc_pop(&datum) == DC_SUCCESS){ - tmpint = 0; - if (datum.dc_type == DC_NUMBER) - tmpint = dc_num2int(datum.v.number, DC_TOSS); - dc_stack_rotate(tmpint); - } - break; -#endif - case 'S': /* pop a value off of the evaluation stack - * and push it onto the register stack named by peekc - */ - if (peekc == EOF) - return DC_EOF_ERROR; - if (dc_pop(&datum) == DC_SUCCESS) - dc_register_push(peekc, datum); - return DC_EATONE; - case 'X': /* replace the number on top-of-stack with its scale factor */ - if (dc_pop(&datum) == DC_SUCCESS){ - tmpint = 0; - if (datum.dc_type == DC_NUMBER) - tmpint = dc_tell_scale(datum.v.number, DC_TOSS); - dc_push(dc_int2data(tmpint)); - } - break; - case 'Z': /* replace the datum on the top-of-stack with its length */ - if (dc_pop(&datum) == DC_SUCCESS) - dc_push(dc_int2data(dc_tell_length(datum, DC_TOSS))); - break; - - case ':': /* store into array */ - if (peekc == EOF) - return DC_EOF_ERROR; - if (dc_pop(&datum) == DC_SUCCESS){ - tmpint = -1; - if (datum.dc_type == DC_NUMBER) - tmpint = dc_num2int(datum.v.number, DC_TOSS); - if (dc_pop(&datum) == DC_SUCCESS){ - if (tmpint < 0) - fprintf(stderr, - "%s: array index must be a nonnegative integer\n", - progname); - else - dc_array_set(peekc, tmpint, datum); - } - } - return DC_EATONE; - case ';': /* retreive from array */ - if (peekc == EOF) - return DC_EOF_ERROR; - if (dc_pop(&datum) == DC_SUCCESS){ - tmpint = -1; - if (datum.dc_type == DC_NUMBER) - tmpint = dc_num2int(datum.v.number, DC_TOSS); - if (tmpint < 0) - fprintf(stderr, - "%s: array index must be a nonnegative integer\n", - progname); - else - dc_push(dc_array_get(peekc, tmpint)); - } - return DC_EATONE; - - default: /* What did that user mean? */ - fprintf(stderr, "%s: ", progname); - dc_show_id(stdout, c, " unimplemented\n"); - break; - } - return DC_OKAY; -} - - -/* takes a string and evals it */ -int -dc_evalstr DC_DECLARG((string)) - dc_data string DC_DECLEND -{ - const char *s; - const char *end; - const char *p; - size_t len; - int c; - int peekc; - int count; - int negcmp; - int next_negcmp = 0; - - if (string.dc_type != DC_STRING){ - fprintf(stderr, - "%s: eval called with non-string argument\n", - progname); - return DC_OKAY; - } - s = dc_str2charp(string.v.string); - end = s + dc_strlen(string.v.string); - while (s < end){ - c = *(const unsigned char *)s++; - peekc = EOF; - if (s < end) - peekc = *(const unsigned char *)s; - negcmp = next_negcmp; - next_negcmp = 0; - switch (dc_func(c, peekc, negcmp)){ - case DC_OKAY: - break; - case DC_EATONE: - if (peekc != EOF) - ++s; - break; - case DC_QUIT: - if (unwind_depth > 0){ - --unwind_depth; - return DC_QUIT; - } - return DC_OKAY; - - case DC_INT: - input_str_string = s - 1; - dc_push(dc_getnum(input_str, dc_ibase, &peekc)); - s = input_str_string; - if (peekc != EOF) - --s; - break; - case DC_STR: - count = 1; - for (p=s; p<end && count>0; ++p) - if (*p == ']') - --count; - else if (*p == '[') - ++count; - len = p - s; - dc_push(dc_makestring(s, len-1)); - s = p; - break; - case DC_SYSTEM: - s = dc_system(s); - case DC_COMMENT: - s = memchr(s, '\n', (size_t)(end-s)); - if (!s) - s = end; - else - ++s; - break; - case DC_NEGCMP: - next_negcmp = 1; - break; - - case DC_EOF_ERROR: - fprintf(stderr, "%s: unexpected EOS\n", progname); - return DC_OKAY; - } - } - return DC_OKAY; -} - - -/* This is the main function of the whole DC program. - * Reads the file described by fp, calls dc_func to do - * the dirty work, and takes care of dc_func's shortcomings. - */ -int -dc_evalfile DC_DECLARG((fp)) - FILE *fp DC_DECLEND -{ - int c; - int peekc; - int negcmp; - int next_negcmp = 0; - dc_data datum; - - stdin_lookahead = EOF; - for (c=getc(fp); c!=EOF; c=peekc){ - peekc = getc(fp); - /* - * The following if() is the only place where ``stdin_lookahead'' - * might be set to other than EOF: - */ - if (fp == stdin) - stdin_lookahead = peekc; - negcmp = next_negcmp; - next_negcmp = 0; - switch (dc_func(c, peekc, negcmp)){ - case DC_OKAY: - if (stdin_lookahead != peekc && fp == stdin) - peekc = getc(fp); - break; - case DC_EATONE: - peekc = getc(fp); - break; - case DC_QUIT: - if (unwind_noexit != DC_TRUE) - return DC_SUCCESS; - fprintf(stderr, - "%s: Q command argument exceeded string execution depth\n", - progname); - if (stdin_lookahead != peekc && fp == stdin) - peekc = getc(fp); - break; - - case DC_INT: - input_fil_fp = fp; - input_pushback = c; - ungetc(peekc, fp); - dc_push(dc_getnum(input_fil, dc_ibase, &peekc)); - break; - case DC_STR: - ungetc(peekc, fp); - datum = dc_readstring(fp, '[', ']'); - dc_push(datum); - peekc = getc(fp); - break; - case DC_SYSTEM: - ungetc(peekc, fp); - datum = dc_readstring(stdin, '\n', '\n'); - (void)dc_system(dc_str2charp(datum.v.string)); - dc_free_str(&datum.v.string); - peekc = getc(fp); - break; - case DC_COMMENT: - while (peekc!=EOF && peekc!='\n') - peekc = getc(fp); - if (peekc != EOF) - peekc = getc(fp); - break; - case DC_NEGCMP: - next_negcmp = 1; - break; - - case DC_EOF_ERROR: - fprintf(stderr, "%s: unexpected EOF\n", progname); - return DC_FAIL; - } - } - return DC_SUCCESS; -} diff --git a/contrib/bc/dc/misc.c b/contrib/bc/dc/misc.c deleted file mode 100644 index fa94de1..0000000 --- a/contrib/bc/dc/misc.c +++ /dev/null @@ -1,179 +0,0 @@ -/* - * misc. functions for the "dc" Desk Calculator language. - * - * Copyright (C) 1994, 1997, 1998, 2000 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -/* This module contains miscelaneous functions that have no - * special knowledge of any private data structures. - * They could all be moved to their own separate modules, but - * are agglomerated here for convenience. - */ - -#include "config.h" - -#include <stdio.h> -#ifdef HAVE_STDLIB_H -# include <stdlib.h> -#endif -#ifdef HAVE_STRING_H -# include <string.h> -#else -# ifdef HAVE_STRINGS_H -# include <strings.h> -# endif -#endif -#include <ctype.h> -#ifndef isgraph -# ifndef HAVE_ISGRAPH -# define isgraph isprint -# endif -#endif -#include <getopt.h> -#include "dc.h" -#include "dc-proto.h" - -#ifndef EXIT_FAILURE /* C89 <stdlib.h> */ -# define EXIT_FAILURE 1 -#endif - - -/* print an "out of memory" diagnostic and exit program */ -void -dc_memfail DC_DECLVOID() -{ - fprintf(stderr, "%s: out of memory\n", progname); - exit(EXIT_FAILURE); -} - -/* malloc or die */ -void * -dc_malloc DC_DECLARG((len)) - size_t len DC_DECLEND -{ - void *result = malloc(len); - - if (!result) - dc_memfail(); - return result; -} - - -/* print the id in a human-understandable form - * fp is the output stream to place the output on - * id is the name of the register (or command) to be printed - * suffix is a modifier (such as "stack") to be printed - */ -void -dc_show_id DC_DECLARG((fp, id, suffix)) - FILE *fp DC_DECLSEP - int id DC_DECLSEP - const char *suffix DC_DECLEND -{ - if (isgraph(id)) - fprintf(fp, "'%c' (%#o)%s", id, id, suffix); - else - fprintf(fp, "%#o%s", id, suffix); -} - - -/* report that corrupt data has been detected; - * use the msg and regid (if nonnegative) to give information - * about where the garbage was found, - * - * will abort() so that a debugger might be used to help find - * the bug - */ -/* If this routine is called, then there is a bug in the code; - * i.e. it is _not_ a data or user error - */ -void -dc_garbage DC_DECLARG((msg, regid)) - const char *msg DC_DECLSEP - int regid DC_DECLEND -{ - if (regid < 0) { - fprintf(stderr, "%s: garbage %s\n", progname, msg); - } else { - fprintf(stderr, "%s:%s register ", progname, msg); - dc_show_id(stderr, regid, " is garbage\n"); - } - abort(); -} - - -/* call system() with the passed string; - * if the string contains a newline, terminate the string - * there before calling system. - * Return a pointer to the first unused character in the string - * (i.e. past the '\n' if there was one, to the '\0' otherwise). - */ -const char * -dc_system DC_DECLARG((s)) - const char *s DC_DECLEND -{ - const char *p; - char *tmpstr; - size_t len; - - p = strchr(s, '\n'); - if (p) { - len = p - s; - tmpstr = dc_malloc(len + 1); - strncpy(tmpstr, s, len); - tmpstr[len] = '\0'; - system(tmpstr); - free(tmpstr); - return p + 1; - } - system(s); - return s + strlen(s); -} - - -/* print out the indicated value */ -void -dc_print DC_DECLARG((value, obase, newline_p, discard_p)) - dc_data value DC_DECLSEP - int obase DC_DECLSEP - dc_newline newline_p DC_DECLSEP - dc_discard discard_p DC_DECLEND -{ - if (value.dc_type == DC_NUMBER) { - dc_out_num(value.v.number, obase, newline_p, discard_p); - } else if (value.dc_type == DC_STRING) { - dc_out_str(value.v.string, newline_p, discard_p); - } else { - dc_garbage("in data being printed", -1); - } -} - -/* return a duplicate of the passed value, regardless of type */ -dc_data -dc_dup DC_DECLARG((value)) - dc_data value DC_DECLEND -{ - if (value.dc_type!=DC_NUMBER && value.dc_type!=DC_STRING) - dc_garbage("in value being duplicated", -1); - if (value.dc_type == DC_NUMBER) - return dc_dup_num(value.v.number); - /*else*/ - return dc_dup_str(value.v.string); -} diff --git a/contrib/bc/dc/numeric.c b/contrib/bc/dc/numeric.c deleted file mode 100644 index 6086be5..0000000 --- a/contrib/bc/dc/numeric.c +++ /dev/null @@ -1,600 +0,0 @@ -/* - * interface dc to the bc numeric routines - * - * Copyright (C) 1994, 1997, 1998, 2000 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -/* This should be the only module that knows the internals of type dc_num */ -/* In this particular implementation we just slather out some glue and - * make use of bc's numeric routines. - */ - -#include "config.h" - -#include <stdio.h> -#include <ctype.h> -#ifdef HAVE_LIMITS_H -# include <limits.h> -#else -# define UCHAR_MAX ((unsigned char)~0) -#endif -#include <stdlib.h> -#include "number.h" -#include "dc.h" -#include "dc-proto.h" - -#ifdef __GNUC__ -# if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__-0 >= 7) -# define ATTRIB(x) __attribute__(x) -# endif -#endif -#ifndef ATTRIB -# define ATTRIB(x) -#endif - -/* Forward prototype */ -static void out_char (int); - -/* there is no POSIX standard for dc, so we'll take the GNU definitions */ -int std_only = FALSE; - -/* convert an opaque dc_num into a real bc_num */ -#define CastNum(x) ((bc_num)(x)) - -/* add two dc_nums, place into *result; - * return DC_SUCCESS on success, DC_DOMAIN_ERROR on domain error - */ -int -dc_add DC_DECLARG((a, b, kscale, result)) - dc_num a DC_DECLSEP - dc_num b DC_DECLSEP - int kscale ATTRIB((unused)) DC_DECLSEP - dc_num *result DC_DECLEND -{ - bc_init_num((bc_num *)result); - bc_add(CastNum(a), CastNum(b), (bc_num *)result, 0); - return DC_SUCCESS; -} - -/* subtract two dc_nums, place into *result; - * return DC_SUCCESS on success, DC_DOMAIN_ERROR on domain error - */ -int -dc_sub DC_DECLARG((a, b, kscale, result)) - dc_num a DC_DECLSEP - dc_num b DC_DECLSEP - int kscale ATTRIB((unused)) DC_DECLSEP - dc_num *result DC_DECLEND -{ - bc_init_num((bc_num *)result); - bc_sub(CastNum(a), CastNum(b), (bc_num *)result, 0); - return DC_SUCCESS; -} - -/* multiply two dc_nums, place into *result; - * return DC_SUCCESS on success, DC_DOMAIN_ERROR on domain error - */ -int -dc_mul DC_DECLARG((a, b, kscale, result)) - dc_num a DC_DECLSEP - dc_num b DC_DECLSEP - int kscale DC_DECLSEP - dc_num *result DC_DECLEND -{ - bc_init_num((bc_num *)result); - bc_multiply(CastNum(a), CastNum(b), (bc_num *)result, kscale); - return DC_SUCCESS; -} - -/* divide two dc_nums, place into *result; - * return DC_SUCCESS on success, DC_DOMAIN_ERROR on domain error - */ -int -dc_div DC_DECLARG((a, b, kscale, result)) - dc_num a DC_DECLSEP - dc_num b DC_DECLSEP - int kscale DC_DECLSEP - dc_num *result DC_DECLEND -{ - bc_init_num((bc_num *)result); - if (bc_divide(CastNum(a), CastNum(b), (bc_num *)result, kscale)){ - fprintf(stderr, "%s: divide by zero\n", progname); - return DC_DOMAIN_ERROR; - } - return DC_SUCCESS; -} - -/* divide two dc_nums, place quotient into *quotient and remainder - * into *remainder; - * return DC_SUCCESS on success, DC_DOMAIN_ERROR on domain error - */ -int -dc_divrem DC_DECLARG((a, b, kscale, quotient, remainder)) - dc_num a DC_DECLSEP - dc_num b DC_DECLSEP - int kscale DC_DECLSEP - dc_num *quotient DC_DECLSEP - dc_num *remainder DC_DECLEND -{ - bc_init_num((bc_num *)quotient); - bc_init_num((bc_num *)remainder); - if (bc_divmod(CastNum(a), CastNum(b), - (bc_num *)quotient, (bc_num *)remainder, kscale)){ - fprintf(stderr, "%s: divide by zero\n", progname); - return DC_DOMAIN_ERROR; - } - return DC_SUCCESS; -} - -/* place the reminder of dividing a by b into *result; - * return DC_SUCCESS on success, DC_DOMAIN_ERROR on domain error - */ -int -dc_rem DC_DECLARG((a, b, kscale, result)) - dc_num a DC_DECLSEP - dc_num b DC_DECLSEP - int kscale DC_DECLSEP - dc_num *result DC_DECLEND -{ - bc_init_num((bc_num *)result); - if (bc_modulo(CastNum(a), CastNum(b), (bc_num *)result, kscale)){ - fprintf(stderr, "%s: remainder by zero\n", progname); - return DC_DOMAIN_ERROR; - } - return DC_SUCCESS; -} - -int -dc_modexp DC_DECLARG((base, expo, mod, kscale, result)) - dc_num base DC_DECLSEP - dc_num expo DC_DECLSEP - dc_num mod DC_DECLSEP - int kscale DC_DECLSEP - dc_num *result DC_DECLEND -{ - bc_init_num((bc_num *)result); - if (bc_raisemod(CastNum(base), CastNum(expo), CastNum(mod), - (bc_num *)result, kscale)){ - if (bc_is_zero(CastNum(mod))) - fprintf(stderr, "%s: remainder by zero\n", progname); - return DC_DOMAIN_ERROR; - } - return DC_SUCCESS; -} - -/* place the result of exponentiationg a by b into *result; - * return DC_SUCCESS on success, DC_DOMAIN_ERROR on domain error - */ -int -dc_exp DC_DECLARG((a, b, kscale, result)) - dc_num a DC_DECLSEP - dc_num b DC_DECLSEP - int kscale DC_DECLSEP - dc_num *result DC_DECLEND -{ - bc_init_num((bc_num *)result); - bc_raise(CastNum(a), CastNum(b), (bc_num *)result, kscale); - return DC_SUCCESS; -} - -/* take the square root of the value, place into *result; - * return DC_SUCCESS on success, DC_DOMAIN_ERROR on domain error - */ -int -dc_sqrt DC_DECLARG((value, kscale, result)) - dc_num value DC_DECLSEP - int kscale DC_DECLSEP - dc_num *result DC_DECLEND -{ - bc_num tmp; - - tmp = bc_copy_num(CastNum(value)); - if (!bc_sqrt(&tmp, kscale)){ - fprintf(stderr, "%s: square root of negative number\n", progname); - bc_free_num(&tmp); - return DC_DOMAIN_ERROR; - } - *((bc_num *)result) = tmp; - return DC_SUCCESS; -} - -/* compare dc_nums a and b; - * return a negative value if a < b; - * return a positive value if a > b; - * return zero value if a == b - */ -int -dc_compare DC_DECLARG((a, b)) - dc_num a DC_DECLSEP - dc_num b DC_DECLEND -{ - return bc_compare(CastNum(a), CastNum(b)); -} - -/* attempt to convert a dc_num to its corresponding int value - * If discard_p is DC_TOSS then deallocate the value after use. - */ -int -dc_num2int DC_DECLARG((value, discard_p)) - dc_num value DC_DECLSEP - dc_discard discard_p DC_DECLEND -{ - long result; - - result = bc_num2long(CastNum(value)); - if (discard_p == DC_TOSS) - dc_free_num(&value); - return (int)result; -} - -/* convert a C integer value into a dc_num */ -/* For convenience of the caller, package the dc_num - * into a dc_data result. - */ -dc_data -dc_int2data DC_DECLARG((value)) - int value DC_DECLEND -{ - dc_data result; - - bc_init_num((bc_num *)&result.v.number); - bc_int2num((bc_num *)&result.v.number, value); - result.dc_type = DC_NUMBER; - return result; -} - -/* get a dc_num from some input stream; - * input is a function which knows how to read the desired input stream - * ibase is the input base (2<=ibase<=DC_IBASE_MAX) - * *readahead will be set to the readahead character consumed while - * looking for the end-of-number - */ -/* For convenience of the caller, package the dc_num - * into a dc_data result. - */ -dc_data -dc_getnum DC_DECLARG((input, ibase, readahead)) - int (*input) DC_PROTO((void)) DC_DECLSEP - int ibase DC_DECLSEP - int *readahead DC_DECLEND -{ - bc_num base; - bc_num result; - bc_num build; - bc_num tmp; - bc_num divisor; - dc_data full_result; - int negative = 0; - int digit; - int decimal; - int c; - - bc_init_num(&tmp); - bc_init_num(&build); - bc_init_num(&base); - result = bc_copy_num(_zero_); - bc_int2num(&base, ibase); - c = (*input)(); - while (isspace(c)) - c = (*input)(); - if (c == '_' || c == '-'){ - negative = c; - c = (*input)(); - }else if (c == '+'){ - c = (*input)(); - } - while (isspace(c)) - c = (*input)(); - for (;;){ - if (isdigit(c)) - digit = c - '0'; - else if ('A' <= c && c <= 'F') - digit = 10 + c - 'A'; - else - break; - c = (*input)(); - bc_int2num(&tmp, digit); - bc_multiply(result, base, &result, 0); - bc_add(result, tmp, &result, 0); - } - if (c == '.'){ - bc_free_num(&build); - bc_free_num(&tmp); - divisor = bc_copy_num(_one_); - build = bc_copy_num(_zero_); - decimal = 0; - for (;;){ - c = (*input)(); - if (isdigit(c)) - digit = c - '0'; - else if ('A' <= c && c <= 'F') - digit = 10 + c - 'A'; - else - break; - bc_int2num(&tmp, digit); - bc_multiply(build, base, &build, 0); - bc_add(build, tmp, &build, 0); - bc_multiply(divisor, base, &divisor, 0); - ++decimal; - } - bc_divide(build, divisor, &build, decimal); - bc_add(result, build, &result, 0); - } - /* Final work. */ - if (negative) - bc_sub(_zero_, result, &result, 0); - - bc_free_num(&tmp); - bc_free_num(&build); - bc_free_num(&base); - if (readahead) - *readahead = c; - full_result.v.number = (dc_num)result; - full_result.dc_type = DC_NUMBER; - return full_result; -} - - -/* return the "length" of the number */ -int -dc_numlen DC_DECLARG((value)) - dc_num value DC_DECLEND -{ - bc_num num = CastNum(value); - - /* is this right??? */ - return num->n_len + num->n_scale - (*num->n_value == '\0'); -} - -/* return the scale factor of the passed dc_num - * If discard_p is DC_TOSS then deallocate the value after use. - */ -int -dc_tell_scale DC_DECLARG((value, discard_p)) - dc_num value DC_DECLSEP - dc_discard discard_p DC_DECLEND -{ - int kscale; - - kscale = CastNum(value)->n_scale; - if (discard_p == DC_TOSS) - dc_free_num(&value); - return kscale; -} - - -/* initialize the math subsystem */ -void -dc_math_init DC_DECLVOID() -{ - bc_init_numbers(); -} - -/* print out a dc_num in output base obase to stdout; - * if newline_p is DC_WITHNL, terminate output with a '\n'; - * if discard_p is DC_TOSS then deallocate the value after use - */ -void -dc_out_num DC_DECLARG((value, obase, newline_p, discard_p)) - dc_num value DC_DECLSEP - int obase DC_DECLSEP - dc_newline newline_p DC_DECLSEP - dc_discard discard_p DC_DECLEND -{ - out_char('\0'); /* clear the column counter */ - bc_out_num(CastNum(value), obase, out_char, 0); - if (newline_p == DC_WITHNL) - putchar ('\n'); - if (discard_p == DC_TOSS) - dc_free_num(&value); -} - -/* dump out the absolute value of the integer part of a - * dc_num as a byte stream, without any line wrapping; - * if discard_p is DC_TOSS then deallocate the value after use - */ -void -dc_dump_num DC_DECLARG((dcvalue, discard_p)) - dc_num dcvalue DC_DECLSEP - dc_discard discard_p DC_DECLEND -{ - struct digit_stack { int digit; struct digit_stack *link;}; - struct digit_stack *top_of_stack = NULL; - struct digit_stack *cur; - struct digit_stack *next; - bc_num value; - bc_num obase; - bc_num digit; - - bc_init_num(&value); - bc_init_num(&obase); - bc_init_num(&digit); - - /* we only handle the integer portion: */ - bc_divide(CastNum(dcvalue), _one_, &value, 0); - /* we only handle the absolute value: */ - value->n_sign = PLUS; - /* we're done with the dcvalue parameter: */ - if (discard_p == DC_TOSS) - dc_free_num(&dcvalue); - - bc_int2num(&obase, 1+UCHAR_MAX); - do { - (void) bc_divmod(value, obase, &value, &digit, 0); - cur = dc_malloc(sizeof *cur); - cur->digit = (int)bc_num2long(digit); - cur->link = top_of_stack; - top_of_stack = cur; - } while (!bc_is_zero(value)); - - for (cur=top_of_stack; cur; cur=next) { - putchar(cur->digit); - next = cur->link; - free(cur); - } - - bc_free_num(&digit); - bc_free_num(&obase); - bc_free_num(&value); -} - -/* deallocate an instance of a dc_num */ -void -dc_free_num DC_DECLARG((value)) - dc_num *value DC_DECLEND -{ - bc_free_num((bc_num *)value); -} - -/* return a duplicate of the number in the passed value */ -/* The mismatched data types forces the caller to deal with - * bad dc_type'd dc_data values, and makes it more convenient - * for the caller to not have to do the grunge work of setting - * up a dc_type result. - */ -dc_data -dc_dup_num DC_DECLARG((value)) - dc_num value DC_DECLEND -{ - dc_data result; - - ++CastNum(value)->n_refs; - result.v.number = value; - result.dc_type = DC_NUMBER; - return result; -} - - - -/*---------------------------------------------------------------------------\ -| The rest of this file consists of stubs for bc routines called by numeric.c| -| so as to minimize the amount of bc code needed to build dc. | -| The bulk of the code was just lifted straight out of the bc source. | -\---------------------------------------------------------------------------*/ - -#ifdef HAVE_STDLIB_H -# include <stdlib.h> -#endif - -#ifdef HAVE_STDARG_H -# include <stdarg.h> -#else -# include <varargs.h> -#endif - - -int out_col = 0; - -/* Output routines: Write a character CH to the standard output. - It keeps track of the number of characters output and may - break the output with a "\<cr>". */ - -static void -out_char (ch) - int ch; -{ - - if (ch == '\0') - { - out_col = 0; - } - else - { - out_col++; - if (out_col == 70) - { - putchar ('\\'); - putchar ('\n'); - out_col = 1; - } - putchar (ch); - } -} - -/* Malloc could not get enough memory. */ - -void -out_of_memory() -{ - dc_memfail(); -} - -/* Runtime error will print a message and stop the machine. */ - -#ifdef HAVE_STDARG_H -#ifdef __STDC__ -void -rt_error (char *mesg, ...) -#else -void -rt_error (mesg) - char *mesg; -#endif -#else -void -rt_error (mesg, va_alist) - char *mesg; -#endif -{ - va_list args; - - fprintf (stderr, "Runtime error: "); -#ifdef HAVE_STDARG_H - va_start (args, mesg); -#else - va_start (args); -#endif - vfprintf (stderr, mesg, args); - va_end (args); - fprintf (stderr, "\n"); -} - - -/* A runtime warning tells of some action taken by the processor that - may change the program execution but was not enough of a problem - to stop the execution. */ - -#ifdef HAVE_STDARG_H -#ifdef __STDC__ -void -rt_warn (char *mesg, ...) -#else -void -rt_warn (mesg) - char *mesg; -#endif -#else -void -rt_warn (mesg, va_alist) - char *mesg; -#endif -{ - va_list args; - - fprintf (stderr, "Runtime warning: "); -#ifdef HAVE_STDARG_H - va_start (args, mesg); -#else - va_start (args); -#endif - vfprintf (stderr, mesg, args); - va_end (args); - fprintf (stderr, "\n"); -} diff --git a/contrib/bc/dc/stack.c b/contrib/bc/dc/stack.c deleted file mode 100644 index 1d8a9bf..0000000 --- a/contrib/bc/dc/stack.c +++ /dev/null @@ -1,494 +0,0 @@ -/* - * implement stack functions for dc - * - * Copyright (C) 1994, 1997, 1998 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -/* This module is the only one that knows what stacks (both the - * regular evaluation stack and the named register stacks) - * look like. - */ - -#include "config.h" - -#include <stdio.h> -#ifdef HAVE_STDLIB_H -# include <stdlib.h> -#endif -#include "dc.h" -#include "dc-proto.h" -#include "dc-regdef.h" - -/* an oft-used error message: */ -#define Empty_Stack fprintf(stderr, "%s: stack empty\n", progname) - - -/* simple linked-list implementaion suffices: */ -struct dc_list { - dc_data value; - struct dc_array *array; /* opaque */ - struct dc_list *link; -}; -typedef struct dc_list dc_list; - -/* the anonymous evaluation stack */ -static dc_list *dc_stack=NULL; - -/* the named register stacks */ -static dc_list *dc_register[DC_REGCOUNT]; - - -/* allocate a new dc_list item */ -static dc_list * -dc_alloc DC_DECLVOID() -{ - dc_list *result; - - result = dc_malloc(sizeof *result); - result->value.dc_type = DC_UNINITIALIZED; - result->array = NULL; - result->link = NULL; - return result; -} - - -/* check that there are two numbers on top of the stack, - * then call op with the popped numbers. Construct a dc_data - * value from the dc_num returned by op and push it - * on the stack. - * If the op call doesn't return DC_SUCCESS, then leave the stack - * unmodified. - */ -void -dc_binop DC_DECLARG((op, kscale)) - int (*op)DC_PROTO((dc_num, dc_num, int, dc_num *)) DC_DECLSEP - int kscale DC_DECLEND -{ - dc_data a; - dc_data b; - dc_data r; - - if (!dc_stack || !dc_stack->link){ - Empty_Stack; - return; - } - if (dc_stack->value.dc_type!=DC_NUMBER - || dc_stack->link->value.dc_type!=DC_NUMBER){ - fprintf(stderr, "%s: non-numeric value\n", progname); - return; - } - (void)dc_pop(&b); - (void)dc_pop(&a); - if ((*op)(a.v.number, b.v.number, kscale, &r.v.number) == DC_SUCCESS){ - r.dc_type = DC_NUMBER; - dc_push(r); - dc_free_num(&a.v.number); - dc_free_num(&b.v.number); - }else{ - /* op failed; restore the stack */ - dc_push(a); - dc_push(b); - } -} - -/* check that there are two numbers on top of the stack, - * then call op with the popped numbers. Construct two dc_data - * values from the dc_num's returned by op and push them - * on the stack. - * If the op call doesn't return DC_SUCCESS, then leave the stack - * unmodified. - */ -void -dc_binop2 DC_DECLARG((op, kscale)) - int (*op)DC_PROTO((dc_num, dc_num, int, dc_num *, dc_num *)) DC_DECLSEP - int kscale DC_DECLEND -{ - dc_data a; - dc_data b; - dc_data r1; - dc_data r2; - - if (!dc_stack || !dc_stack->link){ - Empty_Stack; - return; - } - if (dc_stack->value.dc_type!=DC_NUMBER - || dc_stack->link->value.dc_type!=DC_NUMBER){ - fprintf(stderr, "%s: non-numeric value\n", progname); - return; - } - (void)dc_pop(&b); - (void)dc_pop(&a); - if ((*op)(a.v.number, b.v.number, kscale, - &r1.v.number, &r2.v.number) == DC_SUCCESS){ - r1.dc_type = DC_NUMBER; - dc_push(r1); - r2.dc_type = DC_NUMBER; - dc_push(r2); - dc_free_num(&a.v.number); - dc_free_num(&b.v.number); - }else{ - /* op failed; restore the stack */ - dc_push(a); - dc_push(b); - } -} - -/* check that there are two numbers on top of the stack, - * then call dc_compare with the popped numbers. - * Return negative, zero, or positive based on the ordering - * of the two numbers. - */ -int -dc_cmpop DC_DECLVOID() -{ - int result; - dc_data a; - dc_data b; - - if (!dc_stack || !dc_stack->link){ - Empty_Stack; - return 0; - } - if (dc_stack->value.dc_type!=DC_NUMBER - || dc_stack->link->value.dc_type!=DC_NUMBER){ - fprintf(stderr, "%s: non-numeric value\n", progname); - return 0; - } - (void)dc_pop(&b); - (void)dc_pop(&a); - result = dc_compare(b.v.number, a.v.number); - dc_free_num(&a.v.number); - dc_free_num(&b.v.number); - return result; -} - -/* check that there are three numbers on top of the stack, - * then call op with the popped numbers. Construct a dc_data - * value from the dc_num returned by op and push it - * on the stack. - * If the op call doesn't return DC_SUCCESS, then leave the stack - * unmodified. - */ -void -dc_triop DC_DECLARG((op, kscale)) - int (*op)DC_PROTO((dc_num, dc_num, dc_num, int, dc_num *)) DC_DECLSEP - int kscale DC_DECLEND -{ - dc_data a; - dc_data b; - dc_data c; - dc_data r; - - if (!dc_stack || !dc_stack->link || !dc_stack->link->link){ - Empty_Stack; - return; - } - if (dc_stack->value.dc_type!=DC_NUMBER - || dc_stack->link->value.dc_type!=DC_NUMBER - || dc_stack->link->link->value.dc_type!=DC_NUMBER){ - fprintf(stderr, "%s: non-numeric value\n", progname); - return; - } - (void)dc_pop(&c); - (void)dc_pop(&b); - (void)dc_pop(&a); - if ((*op)(a.v.number, b.v.number, c.v.number, - kscale, &r.v.number) == DC_SUCCESS){ - r.dc_type = DC_NUMBER; - dc_push(r); - dc_free_num(&a.v.number); - dc_free_num(&b.v.number); - dc_free_num(&c.v.number); - }else{ - /* op failed; restore the stack */ - dc_push(a); - dc_push(b); - dc_push(c); - } -} - - -/* initialize the register stacks to their initial values */ -void -dc_register_init DC_DECLVOID() -{ - int i; - - for (i=0; i<DC_REGCOUNT; ++i) - dc_register[i] = NULL; -} - -/* clear the evaluation stack */ -void -dc_clear_stack DC_DECLVOID() -{ - dc_list *n; - dc_list *t; - - for (n=dc_stack; n; n=t){ - t = n->link; - if (n->value.dc_type == DC_NUMBER) - dc_free_num(&n->value.v.number); - else if (n->value.dc_type == DC_STRING) - dc_free_str(&n->value.v.string); - else - dc_garbage("in stack", -1); - dc_array_free(n->array); - free(n); - } - dc_stack = NULL; -} - -/* push a value onto the evaluation stack */ -void -dc_push DC_DECLARG((value)) - dc_data value DC_DECLEND -{ - dc_list *n = dc_alloc(); - - if (value.dc_type!=DC_NUMBER && value.dc_type!=DC_STRING) - dc_garbage("in data being pushed", -1); - n->value = value; - n->link = dc_stack; - dc_stack = n; -} - -/* push a value onto the named register stack */ -void -dc_register_push DC_DECLARG((stackid, value)) - int stackid DC_DECLSEP - dc_data value DC_DECLEND -{ - dc_list *n = dc_alloc(); - - stackid = regmap(stackid); - n->value = value; - n->link = dc_register[stackid]; - dc_register[stackid] = n; -} - -/* set *result to the value on the top of the evaluation stack */ -/* The caller is responsible for duplicating the value if it - * is to be maintained as anything more than a transient identity. - * - * DC_FAIL is returned if the stack is empty (and *result unchanged), - * DC_SUCCESS is returned otherwise - */ -int -dc_top_of_stack DC_DECLARG((result)) - dc_data *result DC_DECLEND -{ - if (!dc_stack){ - Empty_Stack; - return DC_FAIL; - } - if (dc_stack->value.dc_type!=DC_NUMBER - && dc_stack->value.dc_type!=DC_STRING) - dc_garbage("at top of stack", -1); - *result = dc_stack->value; - return DC_SUCCESS; -} - -/* set *result to a dup of the value on the top of the named register stack */ -/* - * DC_FAIL is returned if the named stack is empty (and *result unchanged), - * DC_SUCCESS is returned otherwise - */ -int -dc_register_get DC_DECLARG((regid, result)) - int regid DC_DECLSEP - dc_data *result DC_DECLEND -{ - dc_list *r; - - regid = regmap(regid); - r = dc_register[regid]; - if ( ! r ){ - fprintf(stderr, "%s: register ", progname); - dc_show_id(stderr, regid, " is empty\n"); - return DC_FAIL; - } - *result = dc_dup(r->value); - return DC_SUCCESS; -} - -/* set the top of the named register stack to the indicated value */ -/* If the named stack is empty, craft a stack entry to enter the - * value into. - */ -void -dc_register_set DC_DECLARG((regid, value)) - int regid DC_DECLSEP - dc_data value DC_DECLEND -{ - dc_list *r; - - regid = regmap(regid); - r = dc_register[regid]; - if ( ! r ) - dc_register[regid] = dc_alloc(); - else if (r->value.dc_type == DC_NUMBER) - dc_free_num(&r->value.v.number); - else if (r->value.dc_type == DC_STRING) - dc_free_str(&r->value.v.string); - else if (r->value.dc_type == DC_UNINITIALIZED) - ; - else - dc_garbage("", regid); - dc_register[regid]->value = value; -} - -/* pop from the evaluation stack - * - * DC_FAIL is returned if the stack is empty (and *result unchanged), - * DC_SUCCESS is returned otherwise - */ -int -dc_pop DC_DECLARG((result)) - dc_data *result DC_DECLEND -{ - dc_list *r; - - r = dc_stack; - if (!r){ - Empty_Stack; - return DC_FAIL; - } - if (r->value.dc_type!=DC_NUMBER && r->value.dc_type!=DC_STRING) - dc_garbage("at top of stack", -1); - *result = r->value; - dc_stack = r->link; - dc_array_free(r->array); - free(r); - return DC_SUCCESS; -} - -/* pop from the named register stack - * - * DC_FAIL is returned if the named stack is empty (and *result unchanged), - * DC_SUCCESS is returned otherwise - */ -int -dc_register_pop DC_DECLARG((stackid, result)) - int stackid DC_DECLSEP - dc_data *result DC_DECLEND -{ - dc_list *r; - - stackid = regmap(stackid); - r = dc_register[stackid]; - if (!r){ - fprintf(stderr, "%s: stack register ", progname); - dc_show_id(stderr, stackid, " is empty\n"); - return DC_FAIL; - } - if (r->value.dc_type!=DC_NUMBER && r->value.dc_type!=DC_STRING) - dc_garbage(" stack", stackid); - *result = r->value; - dc_register[stackid] = r->link; - dc_array_free(r->array); - free(r); - return DC_SUCCESS; -} - - -/* tell how many entries are currently on the evaluation stack */ -int -dc_tell_stackdepth DC_DECLVOID() -{ - dc_list *n; - int depth=0; - - for (n=dc_stack; n; n=n->link) - ++depth; - return depth; -} - - -/* return the length of the indicated data value; - * if discard_p is DC_TOSS, the deallocate the value when done - * - * The definition of a datum's length is deligated to the - * appropriate module. - */ -int -dc_tell_length DC_DECLARG((value, discard_p)) - dc_data value DC_DECLSEP - dc_discard discard_p DC_DECLEND -{ - int length; - - if (value.dc_type == DC_NUMBER){ - length = dc_numlen(value.v.number); - if (discard_p == DC_TOSS) - dc_free_num(&value.v.number); - } else if (value.dc_type == DC_STRING) { - length = dc_strlen(value.v.string); - if (discard_p == DC_TOSS) - dc_free_str(&value.v.string); - } else { - dc_garbage("in tell_length", -1); - /*NOTREACHED*/ - length = 0; /*just to suppress spurious compiler warnings*/ - } - return length; -} - - - -/* print out all of the values on the evaluation stack */ -void -dc_printall DC_DECLARG((obase)) - int obase DC_DECLEND -{ - dc_list *n; - - for (n=dc_stack; n; n=n->link) - dc_print(n->value, obase, DC_WITHNL, DC_KEEP); -} - - - - -/* get the current array head for the named array */ -struct dc_array * -dc_get_stacked_array DC_DECLARG((array_id)) - int array_id DC_DECLEND -{ - dc_list *r = dc_register[regmap(array_id)]; - return r ? r->array : NULL; -} - -/* set the current array head for the named array */ -void -dc_set_stacked_array DC_DECLARG((array_id, new_head)) - int array_id DC_DECLSEP - struct dc_array *new_head DC_DECLEND -{ - dc_list *r; - - array_id = regmap(array_id); - r = dc_register[array_id]; - if ( ! r ) - r = dc_register[array_id] = dc_alloc(); - r->array = new_head; -} diff --git a/contrib/bc/dc/string.c b/contrib/bc/dc/string.c deleted file mode 100644 index a7f79a4..0000000 --- a/contrib/bc/dc/string.c +++ /dev/null @@ -1,211 +0,0 @@ -/* - * implement string functions for dc - * - * Copyright (C) 1994, 1997, 1998 Free Software Foundation, Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program 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 General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, you can either send email to this - * program's author (see below) or write to: - * - * The Free Software Foundation, Inc. - * 59 Temple Place, Suite 330 - * Boston, MA 02111 USA - */ - -/* This should be the only module that knows the internals of type dc_string */ - -#include "config.h" - -#include <stdio.h> -#ifdef HAVE_STDDEF_H -# include <stddef.h> /* ptrdiff_t */ -#else -# define ptrdiff_t size_t -#endif -#ifdef HAVE_STDLIB_H -# include <stdlib.h> -#endif -#ifdef HAVE_STRING_H -# include <string.h> /* memcpy */ -#else -# ifdef HAVE_MEMORY_H -# include <memory.h> /* memcpy, maybe */ -# else -# ifdef HAVE_STRINGS_H -# include <strings.h> /* memcpy, maybe */ -# endif -# endif -#endif -#include "dc.h" -#include "dc-proto.h" - -/* here is the completion of the dc_string type: */ -struct dc_string { - char *s_ptr; /* pointer to base of string */ - size_t s_len; /* length of counted string */ - int s_refs; /* reference count to cut down on memory use by duplicates */ -}; - - -/* return a duplicate of the string in the passed value */ -/* The mismatched data types forces the caller to deal with - * bad dc_type'd dc_data values, and makes it more convenient - * for the caller to not have to do the grunge work of setting - * up a dc_type result. - */ -dc_data -dc_dup_str DC_DECLARG((value)) - dc_str value DC_DECLEND -{ - dc_data result; - - ++value->s_refs; - result.v.string = value; - result.dc_type = DC_STRING; - return result; -} - -/* free an instance of a dc_str value */ -void -dc_free_str DC_DECLARG((value)) - dc_str *value DC_DECLEND -{ - struct dc_string *string = *value; - - if (--string->s_refs < 1){ - free(string->s_ptr); - free(string); - } -} - -/* Output a dc_str value. - * Add a trailing newline if "newline" is set. - * Free the value after use if discard_flag is set. - */ -void -dc_out_str DC_DECLARG((value, newline, discard_flag)) - dc_str value DC_DECLSEP - dc_newline newline DC_DECLSEP - dc_discard discard_flag DC_DECLEND -{ - fwrite(value->s_ptr, value->s_len, sizeof *value->s_ptr, stdout); - if (newline == DC_WITHNL) - putchar('\n'); - if (discard_flag == DC_TOSS) - dc_free_str(&value); -} - -/* make a copy of a string (base s, length len) - * into a dc_str value; return a dc_data result - * with this value - */ -dc_data -dc_makestring DC_DECLARG((s, len)) - const char *s DC_DECLSEP - size_t len DC_DECLEND -{ - dc_data result; - struct dc_string *string; - - string = dc_malloc(sizeof *string); - string->s_ptr = dc_malloc(len+1); - memcpy(string->s_ptr, s, len); - string->s_ptr[len] = '\0'; /* nul terminated for those who need it */ - string->s_len = len; - string->s_refs = 1; - result.v.string = string; - result.dc_type = DC_STRING; - return result; -} - -/* read a dc_str value from FILE *fp; - * if ldelim == rdelim, then read until a ldelim char or EOF is reached; - * if ldelim != rdelim, then read until a matching rdelim for the - * (already eaten) first ldelim is read. - * Return a dc_data result with the dc_str value as its contents. - */ -dc_data -dc_readstring DC_DECLARG((fp, ldelim, rdelim)) - FILE *fp DC_DECLSEP - int ldelim DC_DECLSEP - int rdelim DC_DECLEND -{ - static char *line_buf = NULL; /* a buffer to build the string in */ - static size_t buflen = 0; /* the current size of line_buf */ - int depth=1; - int c; - char *p; - const char *end; - - if (!line_buf){ - /* initial buflen should be large enough to handle most cases */ - buflen = 2016; - line_buf = dc_malloc(buflen); - } - p = line_buf; - end = line_buf + buflen; - for (;;){ - c = getc(fp); - if (c == EOF) - break; - else if (c == rdelim && --depth < 1) - break; - else if (c == ldelim) - ++depth; - if (p >= end){ - ptrdiff_t offset = p - line_buf; - /* buflen increment should be big enough - * to avoid execessive reallocs: - */ - buflen += 2048; - line_buf = realloc(line_buf, buflen); - if (!line_buf) - dc_memfail(); - p = line_buf + offset; - end = line_buf + buflen; - } - *p++ = c; - } - return dc_makestring(line_buf, (size_t)(p-line_buf)); -} - -/* return the base pointer of the dc_str value; - * This function is needed because no one else knows what dc_str - * looks like. - */ -const char * -dc_str2charp DC_DECLARG((value)) - dc_str value DC_DECLEND -{ - return value->s_ptr; -} - -/* return the length of the dc_str value; - * This function is needed because no one else knows what dc_str - * looks like, and strlen(dc_str2charp(value)) won't work - * if there's an embedded '\0'. - */ -size_t -dc_strlen DC_DECLARG((value)) - dc_str value DC_DECLEND -{ - return value->s_len; -} - - -/* initialize the strings subsystem */ -void -dc_string_init DC_DECLVOID() -{ - /* nothing to do for this implementation */ -} diff --git a/contrib/bc/doc/Makefile.am b/contrib/bc/doc/Makefile.am deleted file mode 100644 index a729cee..0000000 --- a/contrib/bc/doc/Makefile.am +++ /dev/null @@ -1,12 +0,0 @@ -## Process this file with automake to produce Makefile.in - -info_TEXINFOS = bc.texi dc.texi -MAKEINFO = makeinfo --no-split - -MAINTAINERCLEANFILES = Makefile.in - -# FIXME: remove this when automake has been fixed to include these -# files automatically -EXTRA_DIST = bc.1 dc.1 - -man_MANS = bc.1 dc.1 diff --git a/contrib/bc/doc/Makefile.in b/contrib/bc/doc/Makefile.in deleted file mode 100644 index 840d007..0000000 --- a/contrib/bc/doc/Makefile.in +++ /dev/null @@ -1,355 +0,0 @@ -# Makefile.in generated automatically by automake 1.4 from Makefile.am - -# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include - -DESTDIR = - -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ - -top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -transform = @program_transform_name@ - -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -CC = @CC@ -LEX = @LEX@ -PACKAGE = @PACKAGE@ -RANLIB = @RANLIB@ -READLINELIB = @READLINELIB@ -VERSION = @VERSION@ -YACC = @YACC@ - -info_TEXINFOS = bc.texi dc.texi -MAKEINFO = makeinfo --no-split - -MAINTAINERCLEANFILES = Makefile.in - -# FIXME: remove this when automake has been fixed to include these -# files automatically -EXTRA_DIST = bc.1 dc.1 - -man_MANS = bc.1 dc.1 -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = ../config.h -CONFIG_CLEAN_FILES = -TEXI2DVI = texi2dvi -INFO_DEPS = bc.info dc.info -DVIS = bc.dvi dc.dvi -TEXINFOS = bc.texi dc.texi -man1dir = $(mandir)/man1 -MANS = $(man_MANS) - -NROFF = nroff -DIST_COMMON = Makefile.am Makefile.in texinfo.tex - - -DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) - -TAR = tar -GZIP_ENV = --best -all: all-redirect -.SUFFIXES: -.SUFFIXES: .dvi .info .ps .texi .texinfo .txi -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps doc/Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - - -bc.info: bc.texi -bc.dvi: bc.texi - - -dc.info: dc.texi -dc.dvi: dc.texi - - -DVIPS = dvips - -.texi.info: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` - -.texi.dvi: - TEXINPUTS=.:$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< - -.texi: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` - -.texinfo.info: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` - -.texinfo: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` - -.texinfo.dvi: - TEXINPUTS=.:$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< - -.txi.info: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` - -.txi.dvi: - TEXINPUTS=.:$$TEXINPUTS \ - MAKEINFO='$(MAKEINFO) -I $(srcdir)' $(TEXI2DVI) $< - -.txi: - @cd $(srcdir) && rm -f $@ $@-[0-9] $@-[0-9][0-9] - cd $(srcdir) \ - && $(MAKEINFO) `echo $< | sed 's,.*/,,'` -.dvi.ps: - $(DVIPS) $< -o $@ - -install-info-am: $(INFO_DEPS) - @$(NORMAL_INSTALL) - $(mkinstalldirs) $(DESTDIR)$(infodir) - @list='$(INFO_DEPS)'; \ - for file in $$list; do \ - d=$(srcdir); \ - for ifile in `cd $$d && echo $$file $$file-[0-9] $$file-[0-9][0-9]`; do \ - if test -f $$d/$$ifile; then \ - echo " $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile"; \ - $(INSTALL_DATA) $$d/$$ifile $(DESTDIR)$(infodir)/$$ifile; \ - else : ; fi; \ - done; \ - done - @$(POST_INSTALL) - @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ - list='$(INFO_DEPS)'; \ - for file in $$list; do \ - echo " install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file";\ - install-info --info-dir=$(DESTDIR)$(infodir) $(DESTDIR)$(infodir)/$$file || :;\ - done; \ - else : ; fi - -uninstall-info: - $(PRE_UNINSTALL) - @if $(SHELL) -c 'install-info --version | sed 1q | fgrep -s -v -i debian' >/dev/null 2>&1; then \ - ii=yes; \ - else ii=; fi; \ - list='$(INFO_DEPS)'; \ - for file in $$list; do \ - test -z "$ii" \ - || install-info --info-dir=$(DESTDIR)$(infodir) --remove $$file; \ - done - @$(NORMAL_UNINSTALL) - list='$(INFO_DEPS)'; \ - for file in $$list; do \ - (cd $(DESTDIR)$(infodir) && rm -f $$file $$file-[0-9] $$file-[0-9][0-9]); \ - done - -dist-info: $(INFO_DEPS) - list='$(INFO_DEPS)'; \ - for base in $$list; do \ - d=$(srcdir); \ - for file in `cd $$d && eval echo $$base*`; do \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file; \ - done; \ - done - -mostlyclean-aminfo: - -rm -f bc.aux bc.cp bc.cps bc.dvi bc.fn bc.fns bc.ky bc.kys bc.ps \ - bc.log bc.pg bc.toc bc.tp bc.tps bc.vr bc.vrs bc.op bc.tr \ - bc.cv bc.cn dc.aux dc.cp dc.cps dc.dvi dc.fn dc.fns dc.ky \ - dc.kys dc.ps dc.log dc.pg dc.toc dc.tp dc.tps dc.vr dc.vrs \ - dc.op dc.tr dc.cv dc.cn - -clean-aminfo: - -distclean-aminfo: - -maintainer-clean-aminfo: - cd $(srcdir) && for i in $(INFO_DEPS); do \ - rm -f $$i; \ - if test "`echo $$i-[0-9]*`" != "$$i-[0-9]*"; then \ - rm -f $$i-[0-9]*; \ - fi; \ - done - -install-man1: - $(mkinstalldirs) $(DESTDIR)$(man1dir) - @list='$(man1_MANS)'; \ - l2='$(man_MANS)'; for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ - else file=$$i; fi; \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst"; \ - $(INSTALL_DATA) $$file $(DESTDIR)$(man1dir)/$$inst; \ - done - -uninstall-man1: - @list='$(man1_MANS)'; \ - l2='$(man_MANS)'; for i in $$l2; do \ - case "$$i" in \ - *.1*) list="$$list $$i" ;; \ - esac; \ - done; \ - for i in $$list; do \ - ext=`echo $$i | sed -e 's/^.*\\.//'`; \ - inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ - inst=`echo $$inst | sed '$(transform)'`.$$ext; \ - echo " rm -f $(DESTDIR)$(man1dir)/$$inst"; \ - rm -f $(DESTDIR)$(man1dir)/$$inst; \ - done -install-man: $(MANS) - @$(NORMAL_INSTALL) - $(MAKE) $(AM_MAKEFLAGS) install-man1 -uninstall-man: - @$(NORMAL_UNINSTALL) - $(MAKE) $(AM_MAKEFLAGS) uninstall-man1 -tags: TAGS -TAGS: - - -distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) - -subdir = doc - -distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - d=$(srcdir); \ - if test -d $$d/$$file; then \ - cp -pr $$/$$file $(distdir)/$$file; \ - else \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file || :; \ - fi; \ - done - $(MAKE) $(AM_MAKEFLAGS) top_distdir="$(top_distdir)" distdir="$(distdir)" dist-info -info-am: $(INFO_DEPS) -info: info-am -dvi-am: $(DVIS) -dvi: dvi-am -check-am: all-am -check: check-am -installcheck-am: -installcheck: installcheck-am -install-exec-am: -install-exec: install-exec-am - -install-data-am: install-info-am install-man -install-data: install-data-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -install: install-am -uninstall-am: uninstall-info uninstall-man -uninstall: uninstall-am -all-am: Makefile $(INFO_DEPS) $(MANS) -all-redirect: all-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install -installdirs: - $(mkinstalldirs) $(DESTDIR)$(infodir) $(DESTDIR)$(mandir)/man1 - - -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) - -rm -f config.cache config.log stamp-h stamp-h[0-9]* - -maintainer-clean-generic: - -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) -mostlyclean-am: mostlyclean-aminfo mostlyclean-generic - -mostlyclean: mostlyclean-am - -clean-am: clean-aminfo clean-generic mostlyclean-am - -clean: clean-am - -distclean-am: distclean-aminfo distclean-generic clean-am - -distclean: distclean-am - -maintainer-clean-am: maintainer-clean-aminfo maintainer-clean-generic \ - distclean-am - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -maintainer-clean: maintainer-clean-am - -.PHONY: install-info-am uninstall-info mostlyclean-aminfo \ -distclean-aminfo clean-aminfo maintainer-clean-aminfo install-man1 \ -uninstall-man1 install-man uninstall-man tags distdir info-am info \ -dvi-am dvi check check-am installcheck-am installcheck install-exec-am \ -install-exec install-data-am install-data install-am install \ -uninstall-am uninstall all-redirect all-am all installdirs \ -mostlyclean-generic distclean-generic clean-generic \ -maintainer-clean-generic clean mostlyclean distclean maintainer-clean - - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/contrib/bc/doc/bc.1 b/contrib/bc/doc/bc.1 deleted file mode 100644 index bb19594..0000000 --- a/contrib/bc/doc/bc.1 +++ /dev/null @@ -1,793 +0,0 @@ -.\" -.\" bc.1 - the *roff document processor source for the bc manual -.\" -.\" This file is part of GNU bc. -.\" Copyright (C) 1991-1994, 1997, 2000 Free Software Foundation, Inc. -.\" -.\" This program is free software; you can redistribute it and/or modify -.\" it under the terms of the GNU General Public License as published by -.\" the Free Software Foundation; either version 2 of the License , or -.\" (at your option) any later version. -.\" -.\" This program 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 General Public License for more details. -.\" -.\" You should have received a copy of the GNU General Public License -.\" along with this program; see the file COPYING. If not, write to: -.\" The Free Software Foundation, Inc. -.\" 59 Temple Place, Suite 330 -.\" Boston, MA 02111 USA -.\" -.\" You may contact the author by: -.\" e-mail: philnelson@acm.org -.\" us-mail: Philip A. Nelson -.\" Computer Science Department, 9062 -.\" Western Washington University -.\" Bellingham, WA 98226-9062 -.\" -.\" $FreeBSD$ -.\" -.TH bc 1 .\" "Command Manual" v1.06 "Sept 12, 2000" -.SH NAME -bc - An arbitrary precision calculator language -.SH SYNTAX -\fBbc\fR [ \fB-hlwsqv\fR ] [long-options] [ \fI file ...\fR ] -.SH VERSION -This man page documents GNU bc version 1.06. -.SH DESCRIPTION -\fBbc\fR is a language that supports arbitrary precision numbers -with interactive execution of statements. There are some similarities -in the syntax to the C programming language. -A standard math library is available by command line option. -If requested, the math library is defined before processing any files. -\fBbc\fR starts by processing code from all the files listed -on the command line in the order listed. After all files have been -processed, \fBbc\fR reads from the standard input. All code is -executed as it is read. (If a file contains a command to halt the -processor, \fBbc\fR will never read from the standard input.) -.PP -This version of \fBbc\fR contains several extensions beyond -traditional \fBbc\fR implementations and the POSIX draft standard. -Command line options can cause these extensions to print a warning -or to be rejected. This -document describes the language accepted by this processor. -Extensions will be identified as such. -.SS OPTIONS -.IP "-h, --help" -Print the usage and exit. -.IP "-i, --interactive" -Force interactive mode. -.IP "-l, --mathlib" -Define the standard math library. -.IP "-w, --warn" -Give warnings for extensions to POSIX \fBbc\fR. -.IP "-s, --standard" -Process exactly the POSIX \fBbc\fR language. -.IP "-q, --quiet" -Do not print the normal GNU bc welcome. -.IP "-v, --version" -Print the version number and copyright and quit. -.SS NUMBERS -The most basic element in \fBbc\fR is the number. Numbers are -arbitrary precision numbers. This precision is both in the integer -part and the fractional part. All numbers are represented internally -in decimal and all computation is done in decimal. (This version -truncates results from divide and multiply operations.) There are two -attributes of numbers, the length and the scale. The length is the -total number of significant decimal digits in a number and the scale -is the total number of decimal digits after the decimal point. For -example: -.nf -.RS - .000001 has a length of 6 and scale of 6. - 1935.000 has a length of 7 and a scale of 3. -.RE -.fi -.SS VARIABLES -Numbers are stored in two types of variables, simple variables and -arrays. Both simple variables and array variables are named. Names -begin with a letter followed by any number of letters, digits and -underscores. All letters must be lower case. (Full alpha-numeric -names are an extension. In POSIX \fBbc\fR all names are a single -lower case letter.) The type of variable is clear by the context -because all array variable names will be followed by brackets ([]). -.PP -There are four special variables, \fBscale, ibase, obase,\fR and -\fBlast\fR. \fBscale\fR defines how some operations use digits after the -decimal point. The default value of \fBscale\fR is 0. \fBibase\fR -and \fBobase\fR define the conversion base for input and output -numbers. The default for both input and output is base 10. -\fBlast\fR (an extension) is a variable that has the value of the last -printed number. These will be discussed in further detail where -appropriate. All of these variables may have values assigned to them -as well as used in expressions. -.SS COMMENTS -Comments in \fBbc\fR start with the characters \fB/*\fR and end with -the characters \fB*/\fR. Comments may start anywhere and appear as a -single space in the input. (This causes comments to delimit other -input items. For example, a comment can not be found in the middle of -a variable name.) Comments include any newlines (end of line) between -the start and the end of the comment. -.PP -To support the use of scripts for \fBbc\fR, a single line comment has been -added as an extension. A single line comment starts at a \fB#\fR -character and continues to the next end of the line. The end of line -character is not part of the comment and is processed normally. -.SS EXPRESSIONS -The numbers are manipulated by expressions and statements. Since -the language was designed to be interactive, statements and expressions -are executed as soon as possible. There is no "main" program. Instead, -code is executed as it is encountered. (Functions, discussed in -detail later, are defined when encountered.) -.PP -A simple expression is just a constant. \fBbc\fR converts constants -into internal decimal numbers using the current input base, specified -by the variable \fBibase\fR. (There is an exception in functions.) -The legal values of \fBibase\fR are 2 through 16. Assigning a -value outside this range to \fBibase\fR will result in a value of 2 -or 16. Input numbers may contain the characters 0-9 and A-F. (Note: -They must be capitals. Lower case letters are variable names.) -Single digit numbers always have the value of the digit regardless of -the value of \fBibase\fR. (i.e. A = 10.) For multi-digit numbers, -\fBbc\fR changes all input digits greater or equal to ibase to the -value of \fBibase\fR-1. This makes the number \fBFFF\fR always be -the largest 3 digit number of the input base. -.PP -Full expressions are similar to many other high level languages. -Since there is only one kind of number, there are no rules for mixing -types. Instead, there are rules on the scale of expressions. Every -expression has a scale. This is derived from the scale of original -numbers, the operation performed and in many cases, the value of the -variable \fBscale\fR. Legal values of the variable \fBscale\fR are -0 to the maximum number representable by a C integer. -.PP -In the following descriptions of legal expressions, "expr" refers to a -complete expression and "var" refers to a simple or an array variable. -A simple variable is just a -.RS -\fIname\fR -.RE -and an array variable is specified as -.RS -\fIname\fR[\fIexpr\fR] -.RE -Unless specifically -mentioned the scale of the result is the maximum scale of the -expressions involved. -.IP "- expr" -The result is the negation of the expression. -.IP "++ var" -The variable is incremented by one and the new value is the result of -the expression. -.IP "-- var" -The variable -is decremented by one and the new value is the result of the -expression. -.IP "var ++" - The result of the expression is the value of -the variable and then the variable is incremented by one. -.IP "var --" -The result of the expression is the value of the variable and then -the variable is decremented by one. -.IP "expr + expr" -The result of the expression is the sum of the two expressions. -.IP "expr - expr" -The result of the expression is the difference of the two expressions. -.IP "expr * expr" -The result of the expression is the product of the two expressions. -.IP "expr / expr" -The result of the expression is the quotient of the two expressions. -The scale of the result is the value of the variable \fBscale\fR. -.IP "expr % expr" -The result of the expression is the "remainder" and it is computed in the -following way. To compute a%b, first a/b is computed to \fBscale\fR -digits. That result is used to compute a-(a/b)*b to the scale of the -maximum of \fBscale\fR+scale(b) and scale(a). If \fBscale\fR is set -to zero and both expressions are integers this expression is the -integer remainder function. -.IP "expr ^ expr" -The result of the expression is the value of the first raised to the -second. The second expression must be an integer. (If the second -expression is not an integer, a warning is generated and the -expression is truncated to get an integer value.) The scale of the -result is \fBscale\fR if the exponent is negative. If the exponent -is positive the scale of the result is the minimum of the scale of the -first expression times the value of the exponent and the maximum of -\fBscale\fR and the scale of the first expression. (e.g. scale(a^b) -= min(scale(a)*b, max( \fBscale,\fR scale(a))).) It should be noted -that expr^0 will always return the value of 1. -.IP "( expr )" -This alters the standard precedence to force the evaluation of the -expression. -.IP "var = expr" -The variable is assigned the value of the expression. -.IP "var <op>= expr" -This is equivalent to "var = var <op> expr" with the exception that -the "var" part is evaluated only once. This can make a difference if -"var" is an array. -.PP - Relational expressions are a special kind of expression -that always evaluate to 0 or 1, 0 if the relation is false and 1 if -the relation is true. These may appear in any legal expression. -(POSIX bc requires that relational expressions are used only in if, -while, and for statements and that only one relational test may be -done in them.) The relational operators are -.IP "expr1 < expr2" -The result is 1 if expr1 is strictly less than expr2. -.IP "expr1 <= expr2" -The result is 1 if expr1 is less than or equal to expr2. -.IP "expr1 > expr2" -The result is 1 if expr1 is strictly greater than expr2. -.IP "expr1 >= expr2" -The result is 1 if expr1 is greater than or equal to expr2. -.IP "expr1 == expr2" -The result is 1 if expr1 is equal to expr2. -.IP "expr1 != expr2" -The result is 1 if expr1 is not equal to expr2. -.PP -Boolean operations are also legal. (POSIX \fBbc\fR does NOT have -boolean operations). The result of all boolean operations are 0 and 1 -(for false and true) as in relational expressions. The boolean -operators are: -.IP "!expr" -The result is 1 if expr is 0. -.IP "expr && expr" -The result is 1 if both expressions are non-zero. -.IP "expr || expr" -The result is 1 if either expression is non-zero. -.PP -The expression precedence is as follows: (lowest to highest) -.nf -.RS -|| operator, left associative -&& operator, left associative -! operator, nonassociative -Relational operators, left associative -Assignment operator, right associative -+ and - operators, left associative -*, / and % operators, left associative -^ operator, right associative -unary - operator, nonassociative -++ and -- operators, nonassociative -.RE -.fi -.PP -This precedence was chosen so that POSIX compliant \fBbc\fR programs -will run correctly. This will cause the use of the relational and -logical operators to have some unusual behavior when used with -assignment expressions. Consider the expression: -.RS -a = 3 < 5 -.RE -.PP -Most C programmers would assume this would assign the result of "3 < -5" (the value 1) to the variable "a". What this does in \fBbc\fR is -assign the value 3 to the variable "a" and then compare 3 to 5. It is -best to use parenthesis when using relational and logical operators -with the assignment operators. -.PP -There are a few more special expressions that are provided in \fBbc\fR. -These have to do with user defined functions and standard -functions. They all appear as "\fIname\fB(\fIparameters\fB)\fR". -See the section on functions for user defined functions. The standard -functions are: -.IP "length ( expression )" -The value of the length function is the number of significant digits in the -expression. -.IP "read ( )" -The read function (an extension) will read a number from the standard -input, regardless of where the function occurs. Beware, this can -cause problems with the mixing of data and program in the standard input. -The best use for this function is in a previously written program that -needs input from the user, but never allows program code to be input -from the user. The value of the read function is the number read from -the standard input using the current value of the variable -\fBibase\fR for the conversion base. -.IP "scale ( expression )" -The value of the scale function is the number of digits after the decimal -point in the expression. -.IP "sqrt ( expression )" -The value of the sqrt function is the square root of the expression. If -the expression is negative, a run time error is generated. -.SS STATEMENTS -Statements (as in most algebraic languages) provide the sequencing of -expression evaluation. In \fBbc\fR statements are executed "as soon -as possible." Execution happens when a newline in encountered and -there is one or more complete statements. Due to this immediate -execution, newlines are very important in \fBbc\fR. In fact, both a -semicolon and a newline are used as statement separators. An -improperly placed newline will cause a syntax error. Because newlines -are statement separators, it is possible to hide a newline by using -the backslash character. The sequence "\e<nl>", where <nl> is the -newline appears to \fBbc\fR as whitespace instead of a newline. A -statement list is a series of statements separated by semicolons and -newlines. The following is a list of \fBbc\fR statements and what -they do: (Things enclosed in brackets ([]) are optional parts of the -statement.) -.IP "expression" -This statement does one of two things. If the expression starts with -"<variable> <assignment> ...", it is considered to be an assignment -statement. If the expression is not an assignment statement, the -expression is evaluated and printed to the output. After the number -is printed, a newline is printed. For example, "a=1" is an assignment -statement and "(a=1)" is an expression that has an embedded -assignment. All numbers that are printed are printed in the base -specified by the variable \fBobase\fR. The legal values for \fB -obase\fR are 2 through BC_BASE_MAX. (See the section LIMITS.) For -bases 2 through 16, the usual method of writing numbers is used. For -bases greater than 16, \fBbc\fR uses a multi-character digit method -of printing the numbers where each higher base digit is printed as a -base 10 number. The multi-character digits are separated by spaces. -Each digit contains the number of characters required to represent the -base ten value of "obase-1". Since numbers are of arbitrary -precision, some numbers may not be printable on a single output line. -These long numbers will be split across lines using the "\e" as the -last character on a line. The maximum number of characters printed -per line is 70. Due to the interactive nature of \fBbc\fR, printing -a number causes the side effect of assigning the printed value to the -special variable \fBlast\fR. This allows the user to recover the -last value printed without having to retype the expression that -printed the number. Assigning to \fBlast\fR is legal and will -overwrite the last printed value with the assigned value. The newly -assigned value will remain until the next number is printed or another -value is assigned to \fBlast\fR. (Some installations may allow the -use of a single period (.) which is not part of a number as a short -hand notation for for \fBlast\fR.) -.IP "string" -The string is printed to the output. Strings start with a double quote -character and contain all characters until the next double quote character. -All characters are take literally, including any newline. No newline -character is printed after the string. -.IP "\fBprint\fR list" -The print statement (an extension) provides another method of output. -The "list" is a list of strings and expressions separated by commas. -Each string or expression is printed in the order of the list. No -terminating newline is printed. Expressions are evaluated and their -value is printed and assigned to the variable \fBlast\fR. Strings -in the print statement are printed to the output and may contain -special characters. Special characters start with the backslash -character (\e). The special characters recognized by \fBbc\fR are -"a" (alert or bell), "b" (backspace), "f" (form feed), "n" (newline), -"r" (carriage return), "q" (double quote), "t" (tab), and "\e" (backslash). -Any other character following the backslash will be ignored. -.IP "{ statement_list }" -This is the compound statement. It allows multiple statements to be -grouped together for execution. -.IP "\fBif\fR ( expression ) statement1 [\fBelse\fR statement2]" -The if statement evaluates the expression and executes statement1 or -statement2 depending on the value of the expression. If the expression -is non-zero, statement1 is executed. If statement2 is present and -the value of the expression is 0, then statement2 is executed. (The -else clause is an extension.) -.IP "\fBwhile\fR ( expression ) statement" -The while statement will execute the statement while the expression -is non-zero. It evaluates the expression before each execution of -the statement. Termination of the loop is caused by a zero -expression value or the execution of a break statement. -.IP "\fBfor\fR ( [expression1] ; [expression2] ; [expression3] ) statement" -The for statement controls repeated execution of the statement. -Expression1 is evaluated before the loop. Expression2 is evaluated -before each execution of the statement. If it is non-zero, the statement -is evaluated. If it is zero, the loop is terminated. After each -execution of the statement, expression3 is evaluated before the reevaluation -of expression2. If expression1 or expression3 are missing, nothing is -evaluated at the point they would be evaluated. -If expression2 is missing, it is the same as substituting -the value 1 for expression2. (The optional expressions are an -extension. POSIX \fBbc\fR requires all three expressions.) -The following is equivalent code for the for statement: -.nf -.RS -expression1; -while (expression2) { - statement; - expression3; -} -.RE -.fi -.IP "\fBbreak\fR" -This statement causes a forced exit of the most recent enclosing while -statement or for statement. -.IP "\fBcontinue\fR" -The continue statement (an extension) causes the most recent enclosing -for statement to start the next iteration. -.IP "\fBhalt\fR" -The halt statement (an extension) is an executed statement that causes -the \fBbc\fR processor to quit only when it is executed. For example, -"if (0 == 1) halt" will not cause \fBbc\fR to terminate because the halt is -not executed. -.IP "\fBreturn\fR" -Return the value 0 from a function. (See the section on functions.) -.IP "\fBreturn\fR ( expression )" -Return the value of the expression from a function. (See the section on -functions.) As an extension, the parenthesis are not required. -.SS PSEUDO STATEMENTS -These statements are not statements in the traditional sense. They are -not executed statements. Their function is performed at "compile" time. -.IP "\fBlimits\fR" -Print the local limits enforced by the local version of \fBbc\fR. This -is an extension. -.IP "\fBquit\fR" -When the quit statement is read, the \fBbc\fR processor -is terminated, regardless of where the quit statement is found. For -example, "if (0 == 1) quit" will cause \fBbc\fR to terminate. -.IP "\fBwarranty\fR" -Print a longer warranty notice. This is an extension. -.SS FUNCTIONS -Functions provide a method of defining a computation that can be executed -later. Functions in -.B bc -always compute a value and return it to the caller. Function definitions -are "dynamic" in the sense that a function is undefined until a definition -is encountered in the input. That definition is then used until another -definition function for the same name is encountered. The new definition -then replaces the older definition. A function is defined as follows: -.nf -.RS -\fBdefine \fIname \fB( \fIparameters \fB) { \fInewline -\fI auto_list statement_list \fB}\fR -.RE -.fi -A function call is just an expression of the form -"\fIname\fB(\fIparameters\fB)\fR". -.PP -Parameters are numbers or arrays (an extension). In the function definition, -zero or more parameters are defined by listing their names separated by -commas. Numbers are only call by value parameters. Arrays are only -call by variable. Arrays are specified in the parameter definition by -the notation "\fIname\fB[]\fR". In the function call, actual parameters -are full expressions for number parameters. The same notation is used -for passing arrays as for defining array parameters. The named array is -passed by variable to the function. Since function definitions are dynamic, -parameter numbers and types are checked when a function is called. Any -mismatch in number or types of parameters will cause a runtime error. -A runtime error will also occur for the call to an undefined function. -.PP -The \fIauto_list\fR is an optional list of variables that are for -"local" use. The syntax of the auto list (if present) is "\fBauto -\fIname\fR, ... ;". (The semicolon is optional.) Each \fIname\fR is -the name of an auto variable. Arrays may be specified by using the -same notation as used in parameters. These variables have their -values pushed onto a stack at the start of the function. The -variables are then initialized to zero and used throughout the -execution of the function. At function exit, these variables are -popped so that the original value (at the time of the function call) -of these variables are restored. The parameters are really auto -variables that are initialized to a value provided in the function -call. Auto variables are different than traditional local variables -because if function A calls function B, B may access function -A's auto variables by just using the same name, unless function B has -called them auto variables. Due to the fact that auto variables and -parameters are pushed onto a stack, \fBbc\fR supports recursive functions. -.PP -The function body is a list of \fBbc\fR statements. Again, statements -are separated by semicolons or newlines. Return statements cause the -termination of a function and the return of a value. There are two -versions of the return statement. The first form, "\fBreturn\fR", returns -the value 0 to the calling expression. The second form, -"\fBreturn ( \fIexpression \fB)\fR", computes the value of the expression -and returns that value to the calling expression. There is an implied -"\fBreturn (0)\fR" at the end of every function. This allows a function -to terminate and return 0 without an explicit return statement. -.PP -Functions also change the usage of the variable \fBibase\fR. All -constants in the function body will be converted using the value of -\fBibase\fR at the time of the function call. Changes of \fBibase\fR -will be ignored during the execution of the function except for the -standard function \fBread\fR, which will always use the current value -of \fBibase\fR for conversion of numbers. -.PP -As an extension, the format of the definition has been slightly relaxed. -The standard requires the opening brace be on the same line as the -\fBdefine\fR keyword and all other parts must be on following lines. -This version of \fBbc\fR will allow any number of newlines before and -after the opening brace of the function. For example, the following -definitions are legal. -.nf -.RS -\f(CW -define d (n) { return (2*n); } -define d (n) - { return (2*n); } -\fR -.RE -.fi -.SS MATH LIBRARY -If \fBbc\fR is invoked with the \fB-l\fR option, a math library is preloaded -and the default scale is set to 20. The math functions will calculate their -results to the scale set at the time of their call. -The math library defines the following functions: -.IP "s (\fIx\fR)" -The sine of x, x is in radians. -.IP "c (\fIx\fR)" -The cosine of x, x is in radians. -.IP "a (\fIx\fR)" -The arctangent of x, arctangent returns radians. -.IP "l (\fIx\fR)" -The natural logarithm of x. -.IP "e (\fIx\fR)" -The exponential function of raising e to the value x. -.IP "j (\fIn,x\fR)" -The bessel function of integer order n of x. -.SS EXAMPLES -In /bin/sh, the following will assign the value of "pi" to the shell -variable \fBpi\fR. -.RS -\f(CW -pi=$(echo "scale=10; 4*a(1)" | bc -l) -\fR -.RE -.PP -The following is the definition of the exponential function used in the -math library. This function is written in POSIX \fBbc\fR. -.nf -.RS -\f(CW -scale = 20 - -/* Uses the fact that e^x = (e^(x/2))^2 - When x is small enough, we use the series: - e^x = 1 + x + x^2/2! + x^3/3! + ... -*/ - -define e(x) { - auto a, d, e, f, i, m, v, z - - /* Check the sign of x. */ - if (x<0) { - m = 1 - x = -x - } - - /* Precondition x. */ - z = scale; - scale = 4 + z + .44*x; - while (x > 1) { - f += 1; - x /= 2; - } - - /* Initialize the variables. */ - v = 1+x - a = x - d = 1 - - for (i=2; 1; i++) { - e = (a *= x) / (d *= i) - if (e == 0) { - if (f>0) while (f--) v = v*v; - scale = z - if (m) return (1/v); - return (v/1); - } - v += e - } -} -\fR -.RE -.fi -.PP -The following is code that uses the extended features of \fBbc\fR to -implement a simple program for calculating checkbook balances. This -program is best kept in a file so that it can be used many times -without having to retype it at every use. -.nf -.RS -\f(CW -scale=2 -print "\enCheck book program!\en" -print " Remember, deposits are negative transactions.\en" -print " Exit by a 0 transaction.\en\en" - -print "Initial balance? "; bal = read() -bal /= 1 -print "\en" -while (1) { - "current balance = "; bal - "transaction? "; trans = read() - if (trans == 0) break; - bal -= trans - bal /= 1 -} -quit -\fR -.RE -.fi -.PP -The following is the definition of the recursive factorial function. -.nf -.RS -\f(CW -define f (x) { - if (x <= 1) return (1); - return (f(x-1) * x); -} -\fR -.RE -.fi -.SS READLINE AND LIBEDIT OPTIONS -GNU \fBbc\fR can be compiled (via a configure option) to use the GNU -\fBreadline\fR input editor library or the BSD \fBlibedit\fR library. -This allows the user to do editing of lines before sending them -to \fBbc\fR. It also allows for a history of previous lines typed. -When this option is selected, \fBbc\fR has one more special variable. -This special variable, \fBhistory\fR is the number of lines of history -retained. For \fBreadline\fR, a value of -1 means that an unlimited -number of history lines are retained. Setting the value of -\fBhistory\fR to a positive number restricts the number of history -lines to the number given. The value of 0 disables the history -feature. The default value is 100. For more information, read the -user manuals for the GNU \fBreadline\fR, \fBhistory\fR and BSD \fBlibedit\fR -libraries. One can not enable both \fBreadline\fR and \fBlibedit\fR -at the same time. -.SS DIFFERENCES -This version of -.B bc -was implemented from the POSIX P1003.2/D11 draft and contains -several differences and extensions relative to the draft and -traditional implementations. -It is not implemented in the traditional way using -.I dc(1). -This version is a single process which parses and runs a byte code -translation of the program. There is an "undocumented" option (-c) -that causes the program to output the byte code to -the standard output instead of running it. It was mainly used for -debugging the parser and preparing the math library. -.PP -A major source of differences is -extensions, where a feature is extended to add more functionality and -additions, where new features are added. -The following is the list of differences and extensions. -.IP "LANG environment" -This version does not conform to the POSIX standard in the processing -of the LANG environment variable and all environment variables starting -with LC_. -.IP names -Traditional and POSIX -.B bc -have single letter names for functions, variables and arrays. They have -been extended to be multi-character names that start with a letter and -may contain letters, numbers and the underscore character. -.IP Strings -Strings are not allowed to contain NUL characters. POSIX says all characters -must be included in strings. -.IP last -POSIX \fBbc\fR does not have a \fBlast\fR variable. Some implementations -of \fBbc\fR use the period (.) in a similar way. -.IP comparisons -POSIX \fBbc\fR allows comparisons only in the if statement, the while -statement, and the second expression of the for statement. Also, only -one relational operation is allowed in each of those statements. -.IP "if statement, else clause" -POSIX \fBbc\fR does not have an else clause. -.IP "for statement" -POSIX \fBbc\fR requires all expressions to be present in the for statement. -.IP "&&, ||, !" -POSIX \fBbc\fR does not have the logical operators. -.IP "read function" -POSIX \fBbc\fR does not have a read function. -.IP "print statement" -POSIX \fBbc\fR does not have a print statement . -.IP "continue statement" -POSIX \fBbc\fR does not have a continue statement. -.IP "return statement" -POSIX \fBbc\fR requires parentheses around the return expression. -.IP "array parameters" -POSIX \fBbc\fR does not (currently) support array parameters in full. -The POSIX grammar allows for arrays in function definitions, but does -not provide a method to specify an array as an actual parameter. (This -is most likely an oversight in the grammar.) Traditional implementations -of \fBbc\fR have only call by value array parameters. -.IP "function format" -POSIX \fBbc\fR requires the opening brace on the same line as the -\fBdefine\fR key word and the \fBauto\fR statement on the next line. -.IP "=+, =-, =*, =/, =%, =^" -POSIX \fBbc\fR does not require these "old style" assignment operators to -be defined. This version may allow these "old style" assignments. Use -the limits statement to see if the installed version supports them. If -it does support the "old style" assignment operators, the statement -"a =- 1" will decrement \fBa\fR by 1 instead of setting \fBa\fR to the -value -1. -.IP "spaces in numbers" -Other implementations of \fBbc\fR allow spaces in numbers. For example, -"x=1 3" would assign the value 13 to the variable x. The same statement -would cause a syntax error in this version of \fBbc\fR. -.IP "errors and execution" -This implementation varies from other implementations in terms of what -code will be executed when syntax and other errors are found in the -program. If a syntax error is found in a function definition, error -recovery tries to find the beginning of a statement and continue to -parse the function. Once a syntax error is found in the function, the -function will not be callable and becomes undefined. -Syntax errors in the interactive execution code will invalidate the -current execution block. The execution block is terminated by an -end of line that appears after a complete sequence of statements. -For example, -.nf -.RS -a = 1 -b = 2 -.RE -.fi -has two execution blocks and -.nf -.RS -{ a = 1 - b = 2 } -.RE -.fi -has one execution block. Any runtime error will terminate the execution -of the current execution block. A runtime warning will not terminate the -current execution block. -.IP "Interrupts" -During an interactive session, the SIGINT signal (usually generated by -the control-C character from the terminal) will cause execution of the -current execution block to be interrupted. It will display a "runtime" -error indicating which function was interrupted. After all runtime -structures have been cleaned up, a message will be printed to notify the -user that \fBbc\fR is ready for more input. All previously defined functions -remain defined and the value of all non-auto variables are the value at -the point of interruption. All auto variables and function parameters -are removed during the -clean up process. During a non-interactive -session, the SIGINT signal will terminate the entire run of \fBbc\fR. -.SS LIMITS -The following are the limits currently in place for this -.B bc -processor. Some of them may have been changed by an installation. -Use the limits statement to see the actual values. -.IP BC_BASE_MAX -The maximum output base is currently set at 999. The maximum input base -is 16. -.IP BC_DIM_MAX -This is currently an arbitrary limit of 65535 as distributed. Your -installation may be different. -.IP BC_SCALE_MAX -The number of digits after the decimal point is limited to INT_MAX digits. -Also, the number of digits before the decimal point is limited to INT_MAX -digits. -.IP BC_STRING_MAX -The limit on the number of characters in a string is INT_MAX characters. -.IP exponent -The value of the exponent in the raise operation (^) is limited to LONG_MAX. -.IP "variable names" -The current limit on the number of unique names is 32767 for each of -simple variables, arrays and functions. -.SH ENVIRONMENT -The following environment variables are processed by \fBbc\fR: -.IP "POSIXLY_CORRECT" -This is the same as the \fB-s\fR option. -.IP "BC_ENV_ARGS" -This is another mechanism to get arguments to \fBbc\fR. The -format is the same as the command line arguments. These arguments -are processed first, so any files listed in the environment arguments -are processed before any command line argument files. This allows -the user to set up "standard" options and files to be processed -at every invocation of \fBbc\fR. The files in the environment -variables would typically contain function definitions for functions -the user wants defined every time \fBbc\fR is run. -.IP "BC_LINE_LENGTH" -This should be an integer specifying the number of characters in an -output line for numbers. This includes the backslash and newline characters -for long numbers. -.SH DIAGNOSTICS -If any file on the command line can not be opened, \fBbc\fR will report -that the file is unavailable and terminate. Also, there are compile -and run time diagnostics that should be self-explanatory. -.SH BUGS -Error recovery is not very good yet. -.PP -Email bug reports to -.BR bug-bc@gnu.org . -Be sure to include the word ``bc'' somewhere in the ``Subject:'' field. -.SH AUTHOR -.nf -Philip A. Nelson -philnelson@acm.org -.fi -.SH ACKNOWLEDGEMENTS -The author would like to thank Steve Sommars (Steve.Sommars@att.com) for -his extensive help in testing the implementation. Many great suggestions -were given. This is a much better product due to his involvement. diff --git a/contrib/bc/doc/bc.texi b/contrib/bc/doc/bc.texi deleted file mode 100644 index a7cb9f6..0000000 --- a/contrib/bc/doc/bc.texi +++ /dev/null @@ -1,1014 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header -@setfilename bc.info -@settitle bc Command Manual -@c %**end of header - -@c This file has the new style title page commands. -@c Run `makeinfo' rather than `texinfo-format-buffer'. - -@smallbook - -@c tex -@c \overfullrule=0pt -@c end tex - -@titlepage -@title @command{bc} -@subtitle an arbitrary precision calculator language -@subtitle version 1.06 - -@author Philip A. Nelson -@page - -This manual documents @command{bc}, an arbitrary precision calculator language. - -This manual is part of GNU @command{bc}.@* -@sp4 -Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. -59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@iftex -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). -@end iftex - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Foundation. - -You may contact the author by: -e-mail: @email{phil@@cs.wwu.edu}@* -us-mail: Philip A. Nelson@* -Computer Science Department, 9062@* -Western Washington University@* -Bellingham, WA 98226-9062 - -@end titlepage - -@node Top, Introduction, (dir), (dir) - -@menu -* Introduction:: -* Basic Elements:: -* Expressions:: -* Statements:: -* Functions:: -* Examples:: -* Readline and Libedit Options:: -* GNU @command{bc} and Other Implementations:: -* Limits:: -* Environment Variables:: -@end menu - -@node Introduction, Basic Elements, Top, Top -@chapter Introduction -@menu -* Description:: -* Command Line Options:: -@end menu - -@node Description, Command Line Options, Introduction, Introduction -@section Description - -@command{bc} [ -hlwsqv ] [long-options] [ @var{ file ...} ] - -@command{bc} is a language that supports arbitrary precision numbers -with interactive execution of statements. There are some similarities -in the syntax to the C programming language. -A standard math library is available by command line option. -If requested, the math library is defined before processing any files. -@command{bc} starts by processing code from all the files listed -on the command line in the order listed. After all files have been -processed, @command{bc} reads from the standard input. All code is -executed as it is read. (If a file contains a command to halt the -processor, @command{bc} will never read from the standard input.) - -This version of @command{bc} contains several extensions beyond -traditional @command{bc} implementations and the POSIX draft standard. -Command line options can cause these extensions to print a warning or to -be rejected. This document describes the language accepted by this -processor. Extensions will be identified as such. - -The author would like to thank Steve Sommars -(@email{Steve.Sommars@@att.com}) for his extensive help in testing the -implementation. Many great suggestions were given. This is a much -better product due to his involvement. - -Email bug reports to @email{bug-bc@@gnu.org}. Be sure to include -the word ``bc'' somewhere in the ``Subject:'' field. - -@node Command Line Options, Numbers, Description, Introduction -@section Command Line Options - -@command{bc} takes the following options from the command line: -@table @code - -@item -h, --help -Print the usage and exit. - -@item -l, --mathlib -Define the standard math library. - -@item -w, --warn -Give warnings for extensions to POSIX @command{bc}. - -@item -s, --standard -Process exactly the POSIX @command{bc} language. - -@item -q, --quiet -Do not print the normal GNU @command{bc} welcome. - -@item -v, --version -Print the version number and copyright and quit. - -@end table - - -@node Basic Elements, Expressions, Introduction, Top -@chapter Basic Elements -@menu -* Numbers:: -* Variables:: -* Comments:: -@end menu - -@node Numbers, Variables, Command Line Options, Basic Elements -@section Numbers - -The most basic element in @command{bc} is the number. Numbers are -arbitrary precision numbers. This precision is both in the integer part -and the fractional part. All numbers are represented internally in -decimal and all computation is done in decimal. (This version truncates -results from divide and multiply operations.) There are two attributes -of numbers, the length and the scale. The length is the total number of -significant decimal digits in a number and the scale is the total number -of decimal digits after the decimal point. For example, .000001 has a -length of 6 and scale of 6, while 1935.000 has a length of 7 and a scale -of 3. - -@node Variables, Comments, Numbers, Basic Elements -@section Variables - -Numbers are stored in two types of variables, simple variables and -arrays. Both simple variables and array variables are named. Names -begin with a letter followed by any number of letters, digits and -underscores. All letters must be lower case. (Full alphanumeric -names are an extension. In POSIX @command{bc} all names are a single -lower case letter.) The type of variable is clear by the context -because all array variable names will be followed by brackets ( [ ] ). - -There are four special variables, @var{scale}, @var{ibase}, @var{obase}, and -@var{last}. @var{scale} defines how some operations use digits after the -decimal point. The default value of @var{scale} is 0. @var{ibase} -and @var{obase} define the conversion base for input and output -numbers. The default for both input and output is base 10. -@var{last} (an extension) is a variable that has the value of the last -printed number. These will be discussed in further detail where -appropriate. All of these variables may have values assigned to them -as well as used in expressions. - -@node Comments, , Variables, Basic Elements -@section Comments - -Comments in @command{bc} start with the characters @code{/*} and end with -the characters @code{*/}. Comments may start anywhere and appear as a -single space in the input. (This causes comments to delimit other -input items. For example, a comment can not be found in the middle of -a variable name.) Comments include any newlines (end of line) between -the start and the end of the comment. - -To support the use of scripts for @command{bc}, a single line comment has been -added as an extension. A single line comment starts at a @code{#} -character and continues to the next end of the line. The end of line -character is not part of the comment and is processed normally. - -@node Expressions, Statements, Basic Elements, Top -@chapter Expressions - -@menu -* About Expressions and Special Variables:: -* Basic Expressions:: -* Relational Expressions:: -* Boolean Expressions:: -* Precedence:: -* Special Expressions:: -@end menu - -@node About Expressions and Special Variables, Basic Expressions, Expressions, Expressions -@section About Expressions and Special Variables - -The numbers are manipulated by expressions and statements. Since -the language was designed to be interactive, statements and expressions -are executed as soon as possible. There is no main program. Instead, -code is executed as it is encountered. (Functions, discussed in -detail later, are defined when encountered.) - -A simple expression is just a constant. @command{bc} converts constants -into internal decimal numbers using the current input base, specified by -the variable @var{ibase}. (There is an exception in functions.) The -legal values of @var{ibase} are 2 through 16. Assigning a value outside -this range to @var{ibase} will result in a value of 2 or 16. Input -numbers may contain the characters 0-9 and A-F. (Note: They must be -capitals. Lower case letters are variable names.) Single digit numbers -always have the value of the digit regardless of the value of -@var{ibase}. (i.e. A = 10.) For multi-digit numbers, @command{bc} -changes all input digits greater or equal to @var{ibase} to the value of -@var{ibase}-1. This makes the number @code{FFF} always be the largest -3 digit number of the input base. - -Full expressions are similar to many other high level languages. -Since there is only one kind of number, there are no rules for mixing -types. Instead, there are rules on the scale of expressions. Every -expression has a scale. This is derived from the scale of original -numbers, the operation performed and in many cases, the value of the -variable @var{scale}. Legal values of the variable @var{scale} are -0 to the maximum number representable by a C integer. - -@node Basic Expressions, Relational Expressions, About Expressions and Special Variables, Expressions -@section Basic Expressions - -In the following descriptions of legal expressions, "expr" refers to a -complete expression and "@var{var}" refers to a simple or an array variable. -A simple variable is just a - -@var{name} - -and an array variable is specified as - -@var{name}[@var{expr}] - -Unless specifically mentioned the scale of the result is the maximum -scale of the expressions involved. - -@table @code -@item - expr -The result is the negation of the expression. - -@item ++ @var{var} -The variable is incremented by one and the new value is the result of -the expression. - -@item -- @var{var} -The variable -is decremented by one and the new value is the result of the -expression. - -@item @var{var} ++ - The result of the expression is the value of -the variable and then the variable is incremented by one. - -@item @var{var} -- -The result of the expression is the value of the variable and then -the variable is decremented by one. - -@item expr + expr -The result of the expression is the sum of the two expressions. - -@item expr - expr -The result of the expression is the difference of the two expressions. - -@item expr * expr -The result of the expression is the product of the two expressions. - -@item expr / expr -The result of the expression is the quotient of the two expressions. -The scale of the result is the value of the variable @code{scale} - -@item expr % expr -The result of the expression is the "remainder" and it is computed in the -following way. To compute a%b, first a/b is computed to @var{scale} -digits. That result is used to compute a-(a/b)*b to the scale of the -maximum of @var{scale}+scale(b) and scale(a). If @var{scale} is set -to zero and both expressions are integers this expression is the -integer remainder function. - -@item expr ^ expr -The result of the expression is the value of the first raised to the -second. The second expression must be an integer. (If the second -expression is not an integer, a warning is generated and the -expression is truncated to get an integer value.) The scale of the -result is @var{scale} if the exponent is negative. If the exponent -is positive the scale of the result is the minimum of the scale of the -first expression times the value of the exponent and the maximum of -@var{scale} and the scale of the first expression. (e.g. scale(a^b) -= min(scale(a)*b, max(@var{scale}, scale(a))).) It should be noted -that expr^0 will always return the value of 1. - -@item ( expr ) -This alters the standard precedence to force the evaluation of the -expression. - -@item @var{var} = expr -The variable is assigned the value of the expression. - -@item @var{var} <op>= expr -This is equivalent to "@var{var} = @var{var} <op> expr" with the -exception that the "@var{var}" part is evaluated only once. This can -make a difference if "@var{var}" is an array. -@end table - -@node Relational Expressions, Boolean Expressions, Basic Expressions, Expressions -@section Relational Expressions - -Relational expressions are a special kind of expression that always -evaluate to 0 or 1, 0 if the relation is false and 1 if the relation is -true. These may appear in any legal expression. (POSIX @command{bc} -requires that relational expressions are used only in @code{if}, -@code{while}, and @code{for} statements and that only one relational -test may be done in them.) The relational operators are - -@table @code -@item expr1 < expr2 -The result is 1 if expr1 is strictly less than expr2. - -@item expr1 <= expr2 -The result is 1 if expr1 is less than or equal to expr2. - -@item expr1 > expr2 -The result is 1 if expr1 is strictly greater than expr2. - -@item expr1 >= expr2 -The result is 1 if expr1 is greater than or equal to expr2. - -@item expr1 == expr2 -The result is 1 if expr1 is equal to expr2. - -@item expr1 != expr2 -The result is 1 if expr1 is not equal to expr2. -@end table - -@node Boolean Expressions, Precedence, Relational Expressions, Expressions -@section Boolean Expressions - -Boolean operations are also legal. (POSIX @command{bc} does NOT have -boolean operations). The result of all boolean operations are 0 and 1 -(for false and true) as in relational expressions. The boolean -operators are: - -@table @code -@item !expr -The result is 1 if expr is 0. - -@item expr && expr -The result is 1 if both expressions are non-zero. - -@item expr || expr -The result is 1 if either expression is non-zero. -@end table - -@node Precedence, Special Expressions, Boolean Expressions, Expressions -@section Precedence - -The expression precedence is as follows: (lowest to highest) - -@example -|| operator, left associative -&& operator, left associative -! operator, nonassociative -Relational operators, left associative -Assignment operator, right associative -+ and - operators, left associative -*, / and % operators, left associative -^ operator, right associative -unary - operator, nonassociative -++ and -- operators, nonassociative -@end example - -This precedence was chosen so that POSIX compliant @command{bc} programs -will run correctly. This will cause the use of the relational and -logical operators to have some unusual behavior when used with -assignment expressions. Consider the expression: - -@example -a = 3 < 5 -@end example - -Most C programmers would assume this would assign the result of "3 < -5" (the value 1) to the variable "a". What this does in @command{bc} is -assign the value 3 to the variable "a" and then compare 3 to 5. It is -best to use parentheses when using relational and logical operators -with the assignment operators. - -@node Special Expressions, , Precedence, Expressions -@section Special Expressions - -There are a few more special expressions that are provided in -@command{bc}. These have to do with user-defined functions and standard -functions. They all appear as -"@var{name}@code{(}@var{parameters}@code{)}". @xref{Functions}, for -user-defined functions. The standard functions are: - -@table @code -@item length ( expression ) -The value of the length function is the number of significant digits in the -expression. - -@item read ( ) -The @code{read} function (an extension) will read a number from the -standard input, regardless of where the function occurs. Beware, this -can cause problems with the mixing of data and program in the standard -input. The best use for this function is in a previously written -program that needs input from the user, but never allows program code to -be input from the user. The value of the @code{read} function is the -number read from the standard input using the current value of the -variable @var{ibase} for the conversion base. - -@item scale ( expression ) -The value of the @code{scale} function is the number of digits after the -decimal point in the expression. - -@item sqrt ( expression ) -The value of the @code{sqrt} function is the square root of the -expression. If the expression is negative, a run time error is -generated. -@end table - -@node Statements, Functions, Expressions, Top -@chapter Statements - -@menu -* Pseudo Statements:: -@end menu - -Statements (as in most algebraic languages) provide the sequencing of -expression evaluation. In @command{bc} statements are executed "as soon -as possible." Execution happens when a newline in encountered and there -is one or more complete statements. Due to this immediate execution, -newlines are very important in @command{bc}. In fact, both a semicolon -and a newline are used as statement separators. An improperly placed -newline will cause a syntax error. Because newlines are statement -separators, it is possible to hide a newline by using the backslash -character. The sequence "\<nl>", where <nl> is the newline appears to -@command{bc} as whitespace instead of a newline. A statement list is a -series of statements separated by semicolons and newlines. The -following is a list of @command{bc} statements and what they do: (Things -enclosed in brackets ( [ ] ) are optional parts of the statement.) - -@table @var -@item expression -This statement does one of two things. If the expression starts with -"<variable> <assignment> ...", it is considered to be an assignment -statement. If the expression is not an assignment statement, the -expression is evaluated and printed to the output. After the number is -printed, a newline is printed. For example, "a=1" is an assignment -statement and "(a=1)" is an expression that has an embedded assignment. -All numbers that are printed are printed in the base specified by the -variable @var{obase}. The legal values for @var{obase} are 2 through -BC_BASE_MAX (@pxref{Environment Variables}). For bases 2 through 16, -the usual method of writing numbers is used. For bases greater than 16, -@command{bc} uses a multi-character digit method of printing the numbers -where each higher base digit is printed as a base 10 number. The -multi-character digits are separated by spaces. Each digit contains the -number of characters required to represent the base ten value of -"@var{obase} -1". Since numbers are of arbitrary precision, some -numbers may not be printable on a single output line. These long -numbers will be split across lines using the "\" as the last character -on a line. The maximum number of characters printed per line is 70. -Due to the interactive nature of @command{bc}, printing a number causes -the side effect of assigning the printed value to the special variable -@var{last}. This allows the user to recover the last value printed -without having to retype the expression that printed the number. -Assigning to @var{last} is legal and will overwrite the last printed -value with the assigned value. The newly assigned value will remain -until the next number is printed or another value is assigned to -@var{last}. (Some installations may allow the use of a single period -(.) which is not part of a number as a short hand notation for for -@var{last}.) - -@item string -The string is printed to the output. Strings start with a double quote -character and contain all characters until the next double quote character. -All characters are taken literally, including any newline. No newline -character is printed after the string. - -@item @code{print} @var{list} -The @code{print} statement (an extension) provides another method of -output. The @var{list} is a list of strings and expressions separated by -commas. Each string or expression is printed in the order of the list. -No terminating newline is printed. Expressions are evaluated and their -value is printed and assigned to the variable @code{last}. Strings in -the print statement are printed to the output and may contain special -characters. Special characters start with the backslash character (\e). -The special characters recognized by @command{bc} are "a" (alert or -bell), "b" (backspace), "f" (form feed), "n" (newline), "r" (carriage -return), "q" (double quote), "t" (tab), and "\e" (backslash). Any other -character following the backslash will be ignored. - -@item @{ statement_list @} -This is the compound statement. It allows multiple statements to be -grouped together for execution. - -@item @code{if} ( expression ) statement1 [@code{else} statement2] -The if statement evaluates the expression and executes statement1 or -statement2 depending on the value of the expression. If the expression -is non-zero, statement1 is executed. If statement2 is present and -the value of the expression is 0, then statement2 is executed. (The -@code{else} clause is an extension.) - -@item @code{while} ( expression ) statement -The while statement will execute the statement while the expression -is non-zero. It evaluates the expression before each execution of -the statement. Termination of the loop is caused by a zero -expression value or the execution of a @code{break} statement. - -@item @code{for} ( [expression1] ; [expression2] ; [expression3] ) statement -The @code{for} statement controls repeated execution of the statement. -@var{Expression1} is evaluated before the loop. @var{Expression2} is -evaluated before each execution of the statement. If it is non-zero, -the statement is evaluated. If it is zero, the loop is terminated. -After each execution of the statement, @var{expression3} is evaluated -before the reevaluation of expression2. If @var{expression1} or -@var{expression3} are missing, nothing is evaluated at the point they -would be evaluated. If @var{expression2} is missing, it is the same as -substituting the value 1 for @var{expression2}. (The optional -expressions are an extension. POSIX @command{bc} requires all three -expressions.) The following is equivalent code for the @code{for} -statement: - -@example -expression1; -while (expression2) @{ - statement; - expression3; -@} -@end example - -@item @code{break} -This statement causes a forced exit of the most recent enclosing @code{while} -statement or @code{for} statement. - -@item @code{continue} -The @code{continue} statement (an extension) causes the most recent enclosing -@code{for} statement to start the next iteration. - -@item @code{halt} -The @code{halt} statement (an extension) is an executed statement that -causes the @command{bc} processor to quit only when it is executed. For -example, "if (0 == 1) halt" will not cause @command{bc} to terminate -because the @code{halt} is not executed. - -@item @code{return} -Return the value 0 from a function. (@xref{Functions}.) - -@item @code{return} ( expression ) -Return the value of the expression from a function. (@xref{Functions}.) -As an extension, the parenthesis are not required. -@end table - -@node Pseudo Statements, , Statements, Statements -@section Pseudo Statements - -These statements are not statements in the traditional sense. They are -not executed statements. Their function is performed at "compile" time. - -@table @code -@item limits -Print the local limits enforced by the local version of @command{bc}. This -is an extension. - -@item quit -When the @code{quit} statement is read, the @command{bc} processor -is terminated, regardless of where the @code{quit} statement is found. For -example, "if (0 == 1) quit" will cause @command{bc} to terminate. - -@item warranty -Print a longer warranty notice. This is an extension. -@end table - -@node Functions, Examples, Statements, Top -@chapter Functions - -@menu -* Math Library Functions:: -@end menu - -Functions provide a method of defining a computation that can be -executed later. Functions in @command{bc} always compute a value and -return it to the caller. Function definitions are "dynamic" in the -sense that a function is undefined until a definition is encountered in -the input. That definition is then used until another definition -function for the same name is encountered. The new definition then -replaces the older definition. A function is defined as follows: - -@example -@code{define} @var{name} @code{(} @var{parameters} @code{)} @code{@{} @var{newline} - @var{auto_list statement_list} @code{@}} -@end example - -A function call is just an expression of the form -"@code{name} @code{(}@var{parameters}@code{)}". - -Parameters are numbers or arrays (an extension). In the function definition, -zero or more parameters are defined by listing their names separated by -commas. Numbers are only call by value parameters. Arrays are only -call by variable. Arrays are specified in the parameter definition by -the notation "@var{name}@code{[ ]}". In the function call, actual parameters -are full expressions for number parameters. The same notation is used -for passing arrays as for defining array parameters. The named array is -passed by variable to the function. Since function definitions are dynamic, -parameter numbers and types are checked when a function is called. Any -mismatch in number or types of parameters will cause a runtime error. -A runtime error will also occur for the call to an undefined function. - -The @var{auto_list} is an optional list of variables that are for -"local" use. The syntax of the auto list (if present) is "@code{auto} -@var{name}, ... ;". (The semicolon is optional.) Each @var{name} is -the name of an auto variable. Arrays may be specified by using the -same notation as used in parameters. These variables have their -values pushed onto a stack at the start of the function. The -variables are then initialized to zero and used throughout the -execution of the function. At function exit, these variables are -popped so that the original value (at the time of the function call) -of these variables are restored. The parameters are really auto -variables that are initialized to a value provided in the function -call. -Auto variables are different than traditional local variables -because if function A calls function B, B may access function -A's auto variables by just using the same name, unless function B has -called them auto variables. Due to the fact that auto variables and -parameters are pushed onto a stack, @command{bc} supports recursive functions. - -The function body is a list of @command{bc} statements. Again, statements -are separated by semicolons or newlines. Return statements cause the -termination of a function and the return of a value. There are two -versions of the return statement. The first form, "@code{return}", returns -the value 0 to the calling expression. The second form, -"@code{return} ( @var{expression} )", computes the value of the expression -and returns that value to the calling expression. There is an implied -"@code{return} (0)" at the end of every function. This allows a function -to terminate and return 0 without an explicit @code{return} statement. - -Functions also change the usage of the variable @var{ibase}. All -constants in the function body will be converted using the value of -@var{ibase} at the time of the function call. Changes of @var{ibase} -will be ignored during the execution of the function except for the -standard function @code{read}, which will always use the current value -of @var{ibase} for conversion of numbers. - -As an extension, the format of the definition has been slightly relaxed. -The standard requires the opening brace be on the same line as the -@code{define} keyword and all other parts must be on following lines. -This version of @command{bc} will allow any number of newlines before and -after the opening brace of the function. For example, the following -definitions are legal. - -@example - define d (n) @{ return (2*n); @} - define d (n) - @{ return (2*n); @} -@end example - - -@node Math Library Functions, , Functions, Functions -@section Math Library Functions - -If @command{bc} is invoked with the @code{-l} option, a math library is -preloaded and the default @var{scale} is set to 20. The math functions will -calculate their results to the scale set at the time of their call. The -math library defines the following functions: - -@table @code -@item s (@var{x}) -The sine of @var{x}, @var{x} is in radians. - -@item c (@var{x}) -The cosine of @var{x}, @var{x} is in radians. - -@item a (@var{x}) -The arctangent of @var{x}, arctangent returns radians. - -@item l (@var{x}) -The natural logarithm of @var{x}. - -@item @var{e} (@var{x}) -The exponential function of raising @var{e} to the value @var{x}. - -@item @var{j} (@var{n,x}) -The bessel function of integer order @var{n} of @var{x}. -@end table - -@node Examples, Readline and Libedit Options, Functions, Top -@chapter Examples - -In /bin/sh, the following will assign the value of "pi" to the shell -variable @var{pi}. -@example - -pi=$(echo "scale=10; 4*a(1)" | bc -l) - -@end example - -The following is the definition of the exponential function used in the -math library. This function is written in POSIX @command{bc}. - -@example - -scale = 20 - -/* Uses the fact that e^x = (e^(x/2))^2 - When x is small enough, we use the series: - e^x = 1 + x + x^2/2! + x^3/3! + ... -*/ - -define e(x) @{ - auto a, d, e, f, i, m, v, z - - /* Check the sign of x. */ - if (x<0) @{ - m = 1 - x = -x - @} - - /* Precondition x. */ - z = scale; - scale = 4 + z + .44*x; - while (x > 1) @{ - f += 1; - x /= 2; - @} - - /* Initialize the variables. */ - v = 1+x - a = x - d = 1 - - for (i=2; 1; i++) @{ - e = (a *= x) / (d *= i) - if (e == 0) @{ - if (f>0) while (f--) v = v*v; - scale = z - if (m) return (1/v); - return (v/1); - @} - v += e - @} -@} - -@end example - -The following is code that uses the extended features of @command{bc} to -implement a simple program for calculating checkbook balances. This -program is best kept in a file so that it can be used many times -without having to retype it at every use. - -@example - -scale=2 -print "\nCheck book program\n!" -print " Remember, deposits are negative transactions.\n" -print " Exit by a 0 transaction.\n\n" - -print "Initial balance? "; bal = read() -bal /= 1 -print "\n" -while (1) @{ - "current balance = "; bal - "transaction? "; trans = read() - if (trans == 0) break; - bal -= trans - bal /= 1 -@} -quit - -@end example - - -The following is the definition of the recursive factorial function. - -@example - -define f (x) @{ - if (x <= 1) return (1); - return (f(x-1) * x); -@} - -@end example - -@node Readline and Libedit Options, GNU @command{bc} and Other Implementations, Examples, Top -@chapter Readline and Libedit Options - -GNU @command{bc} can be compiled (via a configure option) to use the GNU -@command{readline} input editor library or the BSD @command{libedit} -library. This allows the user to do -more editing of lines before sending them to @command{bc}. It also -allows for a history of previous lines typed. When this option is -selected, @command{bc} has one more special variable. This special -variable, @var{history} is the number of lines of history retained. A -value of -1 means that an unlimited number of history lines are -retained. This is the default value. Setting the value of -@var{history} to a positive number restricts the number of history lines -to the number given. The value of 0 disables the history feature. For -more information, read the user manuals for the GNU @command{readline}, -@command{history} and BSD @command{libedit} libraries. One can not -enable both @command{readline} and @command{libedit} at the same time. - -@node GNU @command{bc} and Other Implementations, Limits, Readline and Libedit Options, Top -@chapter GNU @command{bc} and Other Implementations - -This version of @command{bc} was implemented from the POSIX P1003.2/D11 -draft and contains several differences and extensions relative to the -draft and traditional implementations. It is not implemented in the -traditional way using @command{dc}. This version is a single process -which parses and runs a byte code translation of the program. There is -an "undocumented" option (-c) that causes the program to output the byte -code to the standard output instead of running it. It was mainly used -for debugging the parser and preparing the math library. - -A major source of differences is extensions, where a feature is extended -to add more functionality and additions, where new features are added. -The following is the list of differences and extensions. - -@table @var - -@item LANG environment -This version does not conform to the POSIX standard in the processing -of the LANG environment variable and all environment variables starting -with LC_. - -@item names -Traditional and POSIX @command{bc} -have single letter names for functions, variables and arrays. They have -been extended to be multi-character names that start with a letter and -may contain letters, numbers and the underscore character. - -@item Strings -Strings are not allowed to contain NUL characters. POSIX says all characters -must be included in strings. - -@item last -POSIX @command{bc} does not have a \fBlast variable. Some implementations -of @command{bc} use the period (.) in a similar way. - -@item comparisons -POSIX @command{bc} allows comparisons only in the @code{if} statement, -the @code{while} statement, and the second expression of the @code{for} -statement. Also, only one relational operation is allowed in each of -those statements. - -@item if statement, else clause -POSIX @command{bc} does not have an @code{else} clause. - -@item for statement -POSIX @command{bc} requires all expressions to be present in the -@code{for} statement. - -@item &&, ||, ! -POSIX @command{bc} does not have the logical operators. - -@item read function -POSIX @command{bc} does not have a @code{read} function. - -@item print statement -POSIX @command{bc} does not have a @code{print} statement. - -@item continue statement -POSIX @command{bc} does not have a continue statement. - -@item array parameters -POSIX @command{bc} does not (currently) support array parameters in full. -The POSIX grammar allows for arrays in function definitions, but does -not provide a method to specify an array as an actual parameter. (This -is most likely an oversight in the grammar.) Traditional implementations -of @command{bc} have only call by value array parameters. - -@item function format -POSIX @command{bc} requires the opening brace on the same line as the -@code{define} key word and the @code{auto} statement on the next line. - -@item =+, =-, =*, =/, =%, =^ -POSIX @command{bc} does not require these "old style" assignment -operators to be defined. This version may allow these "old style" -assignments. Use the @code{limits} statement to see if the installed -version supports them. If it does support the "old style" assignment -operators, the statement "a =- 1" will decrement @code{a} by 1 instead -of setting @code{a} to the value -1. - -@item spaces in numbers -Other implementations of @command{bc} allow spaces in numbers. For example, -"x=1 3" would assign the value 13 to the variable x. The same statement -would cause a syntax error in this version of @command{bc}. - -@item errors and execution -This implementation varies from other implementations in terms of what -code will be executed when syntax and other errors are found in the -program. If a syntax error is found in a function definition, error -recovery tries to find the beginning of a statement and continue to -parse the function. Once a syntax error is found in the function, the -function will not be callable and becomes undefined. -Syntax errors in the interactive execution code will invalidate the -current execution block. The execution block is terminated by an -end of line that appears after a complete sequence of statements. -For example, - -@example -a = 1 -b = 2 -@end example - -has two execution blocks and - -@example -@{ a = 1 - b = 2 @} -@end example - -has one execution block. Any runtime error will terminate the execution -of the current execution block. A runtime warning will not terminate the -current execution block. - -@item Interrupts -During an interactive session, the SIGINT signal (usually generated by -the control-C character from the terminal) will cause execution of the -current execution block to be interrupted. It will display a "runtime" -error indicating which function was interrupted. After all runtime -structures have been cleaned up, a message will be printed to notify the -user that @command{bc} is ready for more input. All previously defined -functions remain defined and the value of all non-auto variables are the -value at the point of interruption. All auto variables and function -parameters are removed during the clean up process. During a -non-interactive session, the SIGINT signal will terminate the entire run -of @command{bc}. -@end table - -@node Limits, Environment Variables, GNU @command{bc} and Other Implementations, Top -@chapter Limits - -The following are the limits currently in place for this @command{bc} -processor. Some of them may have been changed by an installation. Use -the @code{limits} statement to see the actual values. - -@table @code - -@item BC_BASE_MAX -The maximum output base is currently set at 999. The maximum input base -is 16. - -@item BC_DIM_MAX -This is currently an arbitrary limit of 65535 as distributed. Your -installation may be different. - -@item BC_SCALE_MAX -The number of digits after the decimal point is limited to INT_MAX digits. -Also, the number of digits before the decimal point is limited to INT_MAX -digits. - -@item BC_STRING_MAX -The limit on the number of characters in a string is INT_MAX characters. - -@item exponent -The value of the exponent in the raise operation (^) is limited to LONG_MAX. - -@item multiply -The multiply routine may yield incorrect results if a number -has more than LONG_MAX / 90 total digits. For 32 bit longs, this number is -23,860,929 digits. - -@item variable names -The current limit on the number of unique names is 32767 for each of -simple variables, arrays and functions. -@end table - -@node Environment Variables, , Limits, Top -@chapter Environment Variables - -The following environment variables are processed by @command{bc}: - -@table @code - - -@item POSIXLY_CORRECT -This is the same as the -s option (@pxref{Command Line Options}). - -@item BC_ENV_ARGS -This is another mechanism to get arguments to @command{bc}. The format -is the same as the command line arguments. These arguments are -processed first, so any files listed in the environent arguments are -processed before any command line argument files. This allows the user -to set up "standard" options and files to be processed at every -invocation of @command{bc}. The files in the environment variables -would typically contain function definitions for functions the user -wants defined every time @command{bc} is run. - -@item BC_LINE_LENGTH -This should be an integer specifing the number of characters in an -output line for numbers. This includes the backslash and newline -characters for long numbers. -@end table - -@contents -@bye - - diff --git a/contrib/bc/doc/dc.1 b/contrib/bc/doc/dc.1 deleted file mode 100644 index adaf5d0..0000000 --- a/contrib/bc/doc/dc.1 +++ /dev/null @@ -1,490 +0,0 @@ -.\" -.\" dc.1 - the *roff document processor source for the dc manual -.\" -.\" This file is part of GNU dc. -.\" Copyright (C) 1994, 1997, 1998, 2000 Free Software Foundation, Inc. -.\" -.\" This program is free software; you can redistribute it and/or modify -.\" it under the terms of the GNU General Public License as published by -.\" the Free Software Foundation; either version 2 of the License , or -.\" (at your option) any later version. -.\" -.\" This program 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 General Public License for more details. -.\" -.\" You should have received a copy of the GNU General Public License -.\" along with this program; see the file COPYING. If not, write to: -.\" The Free Software Foundation, Inc. -.\" 59 Temple Place, Suite 330 -.\" Boston, MA 02111 USA -.\" -.\" $FreeBSD$ -.\" -.TH DC 1 "1997-03-25" "GNU Project" -.ds dc \fIdc\fP -.ds Dc \fIDc\fP -.SH NAME -dc \- an arbitrary precision calculator -.SH SYNOPSIS -dc [-V] [--version] [-h] [--help] - [-e scriptexpression] [--expression=scriptexpression] - [-f scriptfile] [--file=scriptfile] - [file ...] -.SH DESCRIPTION -.PP -\*(Dc is a reverse-polish desk calculator which supports -unlimited precision arithmetic. -It also allows you to define and call macros. -Normally \*(dc reads from the standard input; -if any command arguments are given to it, they are filenames, -and \*(dc reads and executes the contents of the files before reading -from standard input. -All normal output is to standard output; -all error output is to standard error. -.PP -A reverse-polish calculator stores numbers on a stack. -Entering a number pushes it on the stack. -Arithmetic operations pop arguments off the stack and push the results. -.PP -To enter a number in -.IR dc , -type the digits with an optional decimal point. -Exponential notation is not supported. -To enter a negative number, -begin the number with ``_''. -``-'' cannot be used for this, -as it is a binary operator for subtraction instead. -To enter two numbers in succession, -separate them with spaces or newlines. -These have no meaning as commands. -.SH OPTIONS -\*(Dc may be invoked with the following command-line options: -.TP -.B -V -.TP -.B --version -Print out the version of \*(dc that is being run and a copyright notice, -then exit. -.TP -.B -h -.TP -.B --help -Print a usage message briefly summarizing these command-line options -and the bug-reporting address, -then exit. -.TP -.B -e \fIscript\fP -.TP -.BI --expression= script -Add the commands in -.I script -to the set of commands to be run while processing the input. -.TP -.B -f \fIscript-file\fP -.TP -.BI --file= script-file -Add the commands contained in the file -.I script-file -to the set of commands to be run while processing the input. -.PP -If any command-line parameters remain after processing the above, -these parameters are interpreted as the names of input files to -be processed. -A file name of -.B - -refers to the standard input stream. -The standard input will processed if no file names are specified. -.PD -.SH -Printing Commands -.TP -.B p -Prints the value on the top of the stack, -without altering the stack. -A newline is printed after the value. -.TP -.B n -Prints the value on the top of the stack, popping it off, -and does not print a newline after. -.TP -.B P -Pops off the value on top of the stack. -If it it a string, it is simply printed without a trailing newline. -Otherwise it is a number, and the integer portion of its absolute -value is printed out as a "base (UCHAR_MAX+1)" byte stream. -Assuming that (UCHAR_MAX+1) is 256 -(as it is on most machines with 8-bit bytes), -the sequence \fBKSK 0k1/ [_1*]sx d0>x [256~aPd0<x]dsxx sxLKk\fP -could also accomplish this function, -except for the side-effect of clobbering the x register. -.TP -.B f -Prints the entire contents of the stack -.ig -and the contents of all of the registers, -.. -without altering anything. -This is a good command to use if you are lost or want -to figure out what the effect of some command has been. -.PD -.SH -Arithmetic -.TP -.B + -Pops two values off the stack, adds them, -and pushes the result. -The precision of the result is determined only -by the values of the arguments, -and is enough to be exact. -.TP -.B - -Pops two values, -subtracts the first one popped from the second one popped, -and pushes the result. -.TP -.B * -Pops two values, multiplies them, and pushes the result. -The number of fraction digits in the result depends on -the current precision value and the number of fraction -digits in the two arguments. -.TP -.B / -Pops two values, -divides the second one popped from the first one popped, -and pushes the result. -The number of fraction digits is specified by the precision value. -.TP -.B % -Pops two values, -computes the remainder of the division that the -.B / -command would do, -and pushes that. -The value computed is the same as that computed by -the sequence \fBSd dld/ Ld*-\fP . -.TP -.B ~ -Pops two values, -divides the second one popped from the first one popped. -The quotient is pushed first, and the remainder is pushed next. -The number of fraction digits used in the division -is specified by the precision value. -(The sequence \fBSdSn lnld/ LnLd%\fP could also accomplish -this function, with slightly different error checking.) -.TP -.B ^ -Pops two values and exponentiates, -using the first value popped as the exponent -and the second popped as the base. -The fraction part of the exponent is ignored. -The precision value specifies the number of fraction -digits in the result. -.TP -.B | -Pops three values and computes a modular exponentiation. -The first value popped is used as the reduction modulus; -this value must be a non-zero number, -and should be an integer. -The second popped is used as the exponent; -this value must be a non-negative number, -and any fractional part of this exponent will be ignored. -The third value popped is the base which gets exponentiated, -which should be an integer. -For small integers this is like the sequence \fBSm^Lm%\fP, -but, unlike \fB^\fP, this command will work with arbitrarily large exponents. -.TP -.B v -Pops one value, -computes its square root, -and pushes that. -The precision value specifies the number of fraction digits in the result. -.PP -Most arithmetic operations are affected by the ``precision value'', -which you can set with the -.B k -command. -The default precision value is zero, -which means that all arithmetic except for -addition and subtraction produces integer results. -.SH -Stack Control -.TP -.B c -Clears the stack, rendering it empty. -.TP -.B d -Duplicates the value on the top of the stack, -pushing another copy of it. -Thus, ``4d*p'' computes 4 squared and prints it. -.TP -.B r -Reverses the order of (swaps) the top two values on the stack. -.SH -Registers -.PP -\*(Dc provides at least 256 memory registers, -each named by a single character. -You can store a number or a string in a register and retrieve it later. -.TP -.BI s r -Pop the value off the top of the stack and store -it into register -.IR r . -.TP -.BI l r -Copy the value in register -.I r -and push it onto the stack. -This does not alter the contents of -.IR r . -.PP -Each register also contains its own stack. -The current register value is the top of the register's stack. -.TP -.BI S r -Pop the value off the top of the (main) stack and -push it onto the stack of register -.IR r . -The previous value of the register becomes inaccessible. -.TP -.BI L r -Pop the value off the top of register -.IR r 's -stack and push it onto the main stack. -The previous value -in register -.IR r 's -stack, if any, -is now accessible via the -.BI l r -command. -.ig -.PP -The -.B f -command prints a list of all registers that have contents stored in them, -together with their contents. -Only the current contents of each register -(the top of its stack) -is printed. -.. -.SH -Parameters -.PP -\*(Dc has three parameters that control its operation: -the precision, the input radix, and the output radix. -The precision specifies the number -of fraction digits to keep in the result of most arithmetic operations. -The input radix controls the interpretation of numbers typed in; -all numbers typed in use this radix. -The output radix is used for printing numbers. -.PP -The input and output radices are separate parameters; -you can make them unequal, -which can be useful or confusing. -The input radix must be between 2 and 16 inclusive. -The output radix must be at least 2. -The precision must be zero or greater. -The precision is always measured in decimal digits, -regardless of the current input or output radix. -.TP -.B i -Pops the value off the top of the stack -and uses it to set the input radix. -.TP -.B o -Pops the value off the top of the stack -and uses it to set the output radix. -.TP -.B k -Pops the value off the top of the stack -and uses it to set the precision. -.TP -.B I -Pushes the current input radix on the stack. -.TP -.B O -Pushes the current output radix on the stack. -.TP -.B K -Pushes the current precision on the stack. -.SH -Strings -.PP -\*(Dc can operate on strings as well as on numbers. -The only things you can do with strings are -print them and execute them as macros -(which means that the contents of the string are processed as -\*(dc commands). -All registers and the stack can hold strings, -and \*(dc always knows whether any given object is a string or a number. -Some commands such as arithmetic operations demand numbers -as arguments and print errors if given strings. -Other commands can accept either a number or a string; -for example, the -.B p -command can accept either and prints the object -according to its type. -.TP -.BI [ characters ] -Makes a string containing -.I characters -(contained between balanced -.B [ -and -.B ] -characters), -and pushes it on the stack. -For example, -.B [foo]P -prints the characters -.B foo -(with no newline). -.TP -.B a -The top-of-stack is popped. -If it was a number, then the low-order byte of this number -is converted into a string and pushed onto the stack. -Otherwise the top-of-stack was a string, -and the first character of that string is pushed back. -.TP -.B x -Pops a value off the stack and executes it as a macro. -Normally it should be a string; -if it is a number, -it is simply pushed back onto the stack. -For example, -.B [1p]x -executes the macro -.B 1p -which pushes -.B 1 -on the stack and prints -.B 1 -on a separate line. -.PP -Macros are most often stored in registers; -.B [1p]sa -stores a macro to print -.B 1 -into register -.BR a , -and -.B lax -invokes this macro. -.TP -.BI > r -Pops two values off the stack and compares them -assuming they are numbers, -executing the contents of register -.I r -as a macro if the original top-of-stack -is greater. -Thus, -.B 1 2>a -will invoke register -.BR a 's -contents and -.B 2 1>a -will not. -.TP -.BI !> r -Similar but invokes the macro if the original top-of-stack is -not greater than (less than or equal to) what was the second-to-top. -.TP -.BI < r -Similar but invokes the macro if the original top-of-stack is less. -.TP -.BI !< r -Similar but invokes the macro if the original top-of-stack is -not less than (greater than or equal to) what was the second-to-top. -.TP -.BI = r -Similar but invokes the macro if the two numbers popped are equal. -.TP -.BI != r -Similar but invokes the macro if the two numbers popped are not equal. -.ig -This can also be validly used to compare two strings for equality. -.. -.TP -.B ? -Reads a line from the terminal and executes it. -This command allows a macro to request input from the user. -.TP -.B q -exits from a macro and also from the macro which invoked it. -If called from the top level, -or from a macro which was called directly from the top level, -the -.B q -command will cause \*(dc to exit. -.TP -.B Q -Pops a value off the stack and uses it as a count -of levels of macro execution to be exited. -Thus, -.B 3Q -exits three levels. -The -.B Q -command will never cause \*(dc to exit. -.SH -Status Inquiry -.TP -.B Z -Pops a value off the stack, -calculates the number of digits it has -(or number of characters, if it is a string) -and pushes that number. -.TP -.B X -Pops a value off the stack, -calculates the number of fraction digits it has, -and pushes that number. -For a string, -the value pushed is -.\" -1. -0. -.TP -.B z -Pushes the current stack depth: -the number of objects on the stack before the execution of the -.B z -command. -.SH -Miscellaneous -.TP -.B ! -Will run the rest of the line as a system command. -Note that parsing of the !<, !=, and !> commands take precedence, -so if you want to run a command starting with <, =, or > you will -need to add a space after the !. -.TP -.B # -Will interpret the rest of the line as a comment. -.TP -.BI : r -Will pop the top two values off of the stack. -The old second-to-top value will be stored in the array -.IR r , -indexed by the old top-of-stack value. -.TP -.BI ; r -Pops the top-of-stack and uses it as an index into -the array -.IR r . -The selected value is then pushed onto the stack. -.P -Note that each stacked instance of a register has its own -array associated with it. -Thus \fB1 0:a 0Sa 2 0:a La 0;ap\fP will print 1, -because the 2 was stored in an instance of 0:a that -was later popped. -.SH -BUGS -.PP -Email bug reports to -.BR bug-dc@gnu.org . diff --git a/contrib/bc/doc/dc.texi b/contrib/bc/doc/dc.texi deleted file mode 100644 index 0a4d973..0000000 --- a/contrib/bc/doc/dc.texi +++ /dev/null @@ -1,526 +0,0 @@ -\input texinfo @c -*-texinfo-*- -@c %**start of header -@setfilename dc.info -@settitle dc, an arbitrary precision calculator -@c %**end of header - -@c This file has the new style title page commands. -@c Run `makeinfo' rather than `texinfo-format-buffer'. - -@c smallbook - -@c tex -@c \overfullrule=0pt -@c end tex - -@c Combine indices. -@synindex cp fn -@syncodeindex vr fn -@syncodeindex ky fn -@syncodeindex pg fn -@syncodeindex tp fn - -@ifinfo -@direntry -* dc: (dc). Arbritrary precision RPN ``Desktop Calculator''. -@end direntry -This file documents @sc{dc}, an arbitrary precision calculator. - -Published by the Free Software Foundation, Inc. -59 Temple Place, Suite 330 -Boston, MA 02111 USA - -Copyright (C) 1984, 1994, 1997, 1998, 2000 Free Software Foundation, Inc. - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -@ignore -Permission is granted to process this file through TeX and print the -results, provided the printed document carries copying permission -notice identical to this one except for the removal of this paragraph -(this paragraph not being relevant to the printed manual). - -@end ignore -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Foundation. -@end ifinfo - -@setchapternewpage off - -@titlepage -@title dc, an arbitrary precision calculator - -@author by Ken Pizzini -@author original manual by Richard Stallman -@page -@vskip 0pt plus 1filll -Copyright @copyright{} 1994, 1997, 1998 Free Software Foundation, Inc. - -@sp 2 -Published by the Free Software Foundation, @* -59 Temple Place, Suite 330 @* -Boston, MA 02111 USA - -Permission is granted to make and distribute verbatim copies of -this manual provided the copyright notice and this permission notice -are preserved on all copies. - -Permission is granted to copy and distribute modified versions of this -manual under the conditions for verbatim copying, provided that the entire -resulting derived work is distributed under the terms of a permission -notice identical to this one. - -Permission is granted to copy and distribute translations of this manual -into another language, under the above conditions for modified versions, -except that this permission notice may be stated in a translation approved -by the Foundation. - -@end titlepage -@page - -@node Top, Introduction, (dir), (dir) - -@menu -* Introduction:: Introduction -* Invocation:: Invocation -* Printing Commands:: Printing Commands -* Arithmetic:: Arithmetic -* Stack Control:: Stack Control -* Registers:: Registers -* Parameters:: Parameters -* Strings:: Strings -* Status Inquiry:: Status Inquiry -* Miscellaneous:: Other commands -* Reporting bugs:: Reporting bugs -@end menu - -@node Introduction, Invocation, Top, Top -@comment node-name, next, previous, up -@chapter Introduction - -@sc{dc} is a reverse-polish desk calculator -which supports unlimited precision arithmetic. -It also allows you to define and call macros. -Normally @sc{dc} reads from the standard input; -if any command arguments are given to it, they are filenames, -and @sc{dc} reads and executes the contents of the files -instead of reading from standard input. -All normal output is to standard output; -all error messages are written to standard error. - -To exit, use @samp{q}. -@kbd{C-c} does not exit; -it is used to abort macros that are looping, etc. -(Currently this is not true; @kbd{C-c} does exit.) - -A reverse-polish calculator stores numbers on a stack. -Entering a number pushes it on the stack. -Arithmetic operations pop arguments off the stack and push the results. - -To enter a number in @sc{dc}, type the digits, -with an optional decimal point. -Exponential notation is not supported. -To enter a negative number, begin the number with @samp{_}. -@samp{-} cannot be used for this, as it is a binary operator -for subtraction instead. -To enter two numbers in succession, -separate them with spaces or newlines. -These have no meaning as commands. - -@node Invocation, Printing Commands, Introduction, Top -@chapter Invocation - -@sc{dc} may be invoked with the following command-line options: -@table @samp - -@item -e @var{expr} -@item --expression=@var{expr} -Evaluate @var{expr} as @sc{dc} commands. - -@item -f @var{file} -@item --file=@var{file} -Read and evaluate @sc{dc} commands from @var{file}. - -@item -h -@item --help -Print a usage message summarizing the command-line options, then exit. - -@item -V -@item --version -Print the version information for this program, then exit. -@end table - -If any command-line parameters remain after processing the options, -these parameters are interpreted as additional @var{file}s whose -contents are read and evaluated. -A file name of @code{-} refers to the standard input stream. -If no @code{-e} option was specified, and no files were specified, -then the standard input will be read for commands to evaluate. - -@node Printing Commands, Arithmetic, Invocation, Top -@chapter Printing Commands - -@table @samp -@item p -Prints the value on the top of the stack, -without altering the stack. -A newline is printed after the value. - -@item n -Prints the value on the top of the stack, popping it off, -and does not print a newline after. -(This command is a GNU extension.) - -@item P -Pops off the value on top of the stack. -If it it a string, it is simply printed without a trailing newline. -Otherwise it is a number, and the integer portion of its absolute -value is printed out as a "base (UCHAR_MAX+1)" byte stream. -Assuming that (UCHAR_MAX+1) is 256 -(as it is on most machines with 8-bit bytes), -the sequence -@code{KSK 0k1/ [_1*]sx d0>x [256~aPd0<x]dsxx sxLKk} -could also accomplish this function, -except for the side-effect of clobbering the x register. -(Details of the behavior with a number are a GNU extension.) - -@item f -Prints the entire contents of the stack -@c and the contents of all of the registers, -without altering anything. -This is a good command to use if you are lost or want -to figure out what the effect of some command has been. -@end table - -@node Arithmetic, Stack Control, Printing Commands, Top -@chapter Arithmetic - -@table @samp -@item + -Pops two values off the stack, adds them, and pushes the result. -The precision of the result is determined only -by the values of the arguments, and is enough to be exact. - -@item - -Pops two values, subtracts the first one popped -from the second one popped, and pushes the result. - -@item * -Pops two values, multiplies them, and pushes the result. -The number of fraction digits in the result is the largest of -the precision value, -the number of fraction digits in the multiplier, -or the number of fraction digits in the multiplicand; -but in no event exceeding the number of digits required for -an exact result. - -@item / -Pops two values, divides the second one popped -from the first one popped, and pushes the result. -The number of fraction digits is specified by the precision value. - -@item % -Pops two values, -computes the remainder of the division that -the @samp{/} command would do, -and pushes that. -The value computed is the same as that computed by -the sequence @code{Sd dld/ Ld*-} . - -@item ~ -Pops two values, -divides the second one popped from the first one popped. -The quotient is pushed first, and the remainder is pushed next. -The number of fraction digits used in the division -is specified by the precision value. -(The sequence @code{SdSn lnld/ LnLd%} could also accomplish -this function, with slightly different error checking.) -(This command is a GNU extension.) - -@item ^ -Pops two values and exponentiates, -using the first value popped as the exponent -and the second popped as the base. -The fraction part of the exponent is ignored. -The precision value specifies the number of fraction -digits in the result. - -@item | -Pops three values and computes a modular exponentiation. -The first value popped is used as the reduction modulus; -this value must be a non-zero number, -and the result may not be accurate if the modulus -is not an integer. -The second popped is used as the exponent; -this value must be a non-negative number, -and any fractional part of this exponent will be ignored. -The third value popped is the base which gets exponentiated, -which should be an integer. -For small integers this is like the sequence @code{Sm^Lm%}, -but, unlike @code{^}, this command will work with arbritrarily large exponents. -(This command is a GNU extension.) - -@item v -Pops one value, computes its square root, and pushes that. -The precision value specifies the number of fraction digits -in the result. -@end table - -Most arithmetic operations are affected by the @emph{precision value}, -which you can set with the @samp{k} command. -The default precision value is zero, -which means that all arithmetic except for -addition and subtraction produces integer results. - -@node Stack Control, Registers, Arithmetic, Top -@chapter Stack Control - -@table @samp -@item c -Clears the stack, rendering it empty. - -@item d -Duplicates the value on the top of the stack, -pushing another copy of it. -Thus, @samp{4d*p} computes 4 squared and prints it. - -@item r -Reverses the order of (swaps) the top two values on the stack. -(This command is a GNU extension.) -@end table - -@node Registers, Parameters, Stack Control, Top -@chapter Registers - -@sc{dc} provides at least 256 memory registers, -each named by a single character. -You can store a number in a register and retrieve it later. - -@table @samp -@item s@var{r} -Pop the value off the top of the stack and -store it into register @var{r}. - -@item l@var{r} -Copy the value in register @var{r}, -and push it onto the stack. -This does not alter the contents of @var{r}. - -Each register also contains its own stack. -The current register value is the top of the register's stack. - -@item S@var{r} -Pop the value off the top of the (main) stack and -push it onto the stack of register @var{r}. -The previous value of the register becomes inaccessible. - -@item L@var{r} -Pop the value off the top of register @var{r}'s stack -and push it onto the main stack. -The previous value in register @var{r}'s stack, if any, -is now accessible via the @samp{l@var{r}} command. -@end table -@c -@c The @samp{f} command prints a list of all registers that have contents -@c stored in them, together with their contents. -@c Only the current contents of each register (the top of its stack) -@c is printed. - -@node Parameters, Strings, Registers, Top -@chapter Parameters - -@sc{dc} has three parameters that control its operation: -the precision, the input radix, and the output radix. -The precision specifies the number of fraction digits -to keep in the result of most arithmetic operations. -The input radix controls the interpretation of numbers typed in; -@emph{all} numbers typed in use this radix. -The output radix is used for printing numbers. - -The input and output radices are separate parameters; -you can make them unequal, which can be useful or confusing. -The input radix must be between 2 and 16 inclusive. -The output radix must be at least 2. -The precision must be zero or greater. -The precision is always measured in decimal digits, -regardless of the current input or output radix. - -@table @samp -@item i -Pops the value off the top of the stack -and uses it to set the input radix. - -@item o -Pops the value off the top of the stack -and uses it to set the output radix. - -@item k -Pops the value off the top of the stack -and uses it to set the precision. - -@item I -Pushes the current input radix on the stack. - -@item O -Pushes the current output radix on the stack. - -@item K -Pushes the current precision on the stack. - -@end table - -@node Strings, Status Inquiry, Parameters, Top -@chapter Strings - -@sc{dc} can operate on strings as well as on numbers. -The only things you can do with strings are print them -and execute them as macros -(which means that the contents of the string are processed as @sc{dc} commands). -Both registers and the stack can hold strings, -and @sc{dc} always knows whether any given object is a string or a number. -Some commands such as arithmetic operations demand numbers -as arguments and print errors if given strings. -Other commands can accept either a number or a string; -for example, the @samp{p} command can accept either and prints the object -according to its type. - -@table @samp -@item [@var{characters}] -Makes a string containing @var{characters} and pushes it on the stack. -For example, @samp{[foo]P} prints the characters @samp{foo} -(with no newline). - -@item a -The mnemonic for this is somewhat erroneous: asciify. -The top-of-stack is popped. -If it was a number, then the low-order byte of this number -is converted into a string and pushed onto the stack. -Otherwise the top-of-stack was a string, -and the first character of that string is pushed back. -(This command is a GNU extension.) - -@item x -Pops a value off the stack and executes it as a macro. -Normally it should be a string; -if it is a number, it is simply pushed back onto the stack. -For example, @samp{[1p]x} executes the macro @samp{1p}, -which pushes 1 on the stack and prints @samp{1} on a separate line. - -Macros are most often stored in registers; -@samp{[1p]sa} stores a macro to print @samp{1} into register @samp{a}, -and @samp{lax} invokes the macro. - -@item >@var{r} -Pops two values off the stack and compares them -assuming they are numbers, -executing the contents of register @var{r} as a macro -if the original top-of-stack is greater. -Thus, @samp{1 2>a} will invoke register @samp{a}'s contents -and @samp{2 1>a} will not. - -@item !>@var{r} -Similar but invokes the macro if the original top-of-stack is not greater -(is less than or equal to) what was the second-to-top. - -@item <@var{r} -Similar but invokes the macro if the original top-of-stack is less. - -@item !<@var{r} -Similar but invokes the macro if the original top-of-stack is not less -(is greater than or equal to) what was the second-to-top. - -@item =@var{r} -Similar but invokes the macro if the two numbers popped are equal. -@c This can also be validly used to compare two strings for equality. - -@item !=@var{r} -Similar but invokes the macro if the two numbers popped are not equal. -@c This can also be validly used to compare two strings for equality. - -@item ? -Reads a line from the terminal and executes it. -This command allows a macro to request input from the user. - -@item q -During the execution of a macro, -this command exits from the macro and also from the macro which invoked it. -If called from the top level, -or from a macro which was called directly from the top level, -the @samp{q} command will cause @sc{dc} to exit. - -@item Q -Pops a value off the stack and uses it as a count -of levels of macro execution to be exited. -Thus, @samp{3Q} exits three levels. -@end table - -@node Status Inquiry, Miscellaneous, Strings, Top -@chapter Status Inquiry - -@table @samp -@item Z -Pops a value off the stack, -calculates the number of digits it has -(or number of characters, if it is a string) -and pushes that number. - -@item X -Pops a value off the stack, -calculates the number of fraction digits it has, -and pushes that number. -For a string, the value pushed is -@c -1. -0. - -@item z -Pushes the current stack depth: -the number of objects on the stack -before the execution of the @samp{z} command. -@end table - -@node Miscellaneous, Reporting bugs, Status Inquiry, Top -@chapter Miscellaneous - -@table @samp -@item ! -Will run the rest of the line as a system command. -Note that parsing of the !<, !=, and !> commands take precidence, -so if you want to run a command starting with <, =, or > you will -need to add a space after the !. - -@item # -Will interpret the rest of the line as a comment. -(This command is a GNU extension.) - -@item :@var{r} -Will pop the top two values off of the stack. -The old second-to-top value will be stored in the array @var{r}, -indexed by the old top-of-stack value. - -@item ;@var{r} -Pops the top-of-stack and uses it as an index into -the array @var{r}. -The selected value is then pushed onto the stack. -@end table - -Note that each stacked instance of a register has its own -array associated with it. -Thus @samp{1 @var{0:a} 0S@var{a} 2 @var{0:a} L@var{a} @var{0;a}p} -will print 1, because the 2 was stored in an instance of @var{0:a} -that was later popped. - -@node Reporting bugs, , Miscellaneous, Top -@chapter Reporting bugs - -Email bug reports to @email{bug-dc@@gnu.org}. -@contents -@bye diff --git a/contrib/bc/h/number.h b/contrib/bc/h/number.h deleted file mode 100644 index 8d78120..0000000 --- a/contrib/bc/h/number.h +++ /dev/null @@ -1,153 +0,0 @@ -/* number.h: Arbitrary precision numbers header file. */ -/* - Copyright (C) 1991, 1992, 1993, 1994, 1997, 2000 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to: - - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111-1307 USA. - - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#ifndef _NUMBER_H_ -#define _NUMBER_H_ - -typedef enum {PLUS, MINUS} sign; - -typedef struct bc_struct *bc_num; - -typedef struct bc_struct - { - sign n_sign; - int n_len; /* The number of digits before the decimal point. */ - int n_scale; /* The number of digits after the decimal point. */ - int n_refs; /* The number of pointers to this number. */ - bc_num n_next; /* Linked list for available list. */ - char *n_ptr; /* The pointer to the actual storage. - If NULL, n_value points to the inside of - another number (bc_multiply...) and should - not be "freed." */ - char *n_value; /* The number. Not zero char terminated. - May not point to the same place as n_ptr as - in the case of leading zeros generated. */ - } bc_struct; - - -/* The base used in storing the numbers in n_value above. - Currently this MUST be 10. */ - -#define BASE 10 - -/* Some useful macros and constants. */ - -#define CH_VAL(c) (c - '0') -#define BCD_CHAR(d) (d + '0') - -#ifdef MIN -#undef MIN -#undef MAX -#endif -#define MAX(a,b) ((a)>(b)?(a):(b)) -#define MIN(a,b) ((a)>(b)?(b):(a)) -#define ODD(a) ((a)&1) - -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif - -#ifndef LONG_MAX -#define LONG_MAX 0x7ffffff -#endif - - -/* Global numbers. */ -extern bc_num _zero_; -extern bc_num _one_; -extern bc_num _two_; - - -/* Function Prototypes */ - -/* Define the _PROTOTYPE macro if it is needed. */ - -#ifndef _PROTOTYPE -#ifdef __STDC__ -#define _PROTOTYPE(func, args) func args -#else -#define _PROTOTYPE(func, args) func() -#endif -#endif - -_PROTOTYPE(void bc_init_numbers, (void)); - -_PROTOTYPE(bc_num bc_new_num, (int length, int scale)); - -_PROTOTYPE(void bc_free_num, (bc_num *num)); - -_PROTOTYPE(bc_num bc_copy_num, (bc_num num)); - -_PROTOTYPE(void bc_init_num, (bc_num *num)); - -_PROTOTYPE(void bc_str2num, (bc_num *num, char *str, int scale)); - -_PROTOTYPE(char *bc_num2str, (bc_num num)); - -_PROTOTYPE(void bc_int2num, (bc_num *num, int val)); - -_PROTOTYPE(long bc_num2long, (bc_num num)); - -_PROTOTYPE(int bc_compare, (bc_num n1, bc_num n2)); - -_PROTOTYPE(char bc_is_zero, (bc_num num)); - -_PROTOTYPE(char bc_is_near_zero, (bc_num num, int scale)); - -_PROTOTYPE(char bc_is_neg, (bc_num num)); - -_PROTOTYPE(void bc_add, (bc_num n1, bc_num n2, bc_num *result, int scale_min)); - -_PROTOTYPE(void bc_sub, (bc_num n1, bc_num n2, bc_num *result, int scale_min)); - -_PROTOTYPE(void bc_multiply, (bc_num n1, bc_num n2, bc_num *prod, int scale)); - -_PROTOTYPE(int bc_divide, (bc_num n1, bc_num n2, bc_num *quot, int scale)); - -_PROTOTYPE(int bc_modulo, (bc_num num1, bc_num num2, bc_num *result, - int scale)); - -_PROTOTYPE(int bc_divmod, (bc_num num1, bc_num num2, bc_num *quot, - bc_num *rem, int scale)); - -_PROTOTYPE(int bc_raisemod, (bc_num base, bc_num expo, bc_num mod, - bc_num *result, int scale)); - -_PROTOTYPE(void bc_raise, (bc_num num1, bc_num num2, bc_num *result, - int scale)); - -_PROTOTYPE(int bc_sqrt, (bc_num *num, int scale)); - -_PROTOTYPE(void bc_out_num, (bc_num num, int o_base, void (* out_char)(int), - int leading_zero)); - -#endif diff --git a/contrib/bc/install-sh b/contrib/bc/install-sh deleted file mode 100755 index ab74c88..0000000 --- a/contrib/bc/install-sh +++ /dev/null @@ -1,238 +0,0 @@ -#!/bin/sh -# -# install - install a program, script, or datafile -# This comes from X11R5. -# -# Calling this script install-sh is preferred over install.sh, to prevent -# `make' implicit rules from creating a file called install from it -# when there is no Makefile. -# -# This script is compatible with the BSD install script, but was written -# from scratch. -# - - -# set DOITPROG to echo to test this script - -# Don't use :- since 4.3BSD and earlier shells don't like it. -doit="${DOITPROG-}" - - -# put in absolute paths if you don't have them in your path; or use env. vars. - -mvprog="${MVPROG-mv}" -cpprog="${CPPROG-cp}" -chmodprog="${CHMODPROG-chmod}" -chownprog="${CHOWNPROG-chown}" -chgrpprog="${CHGRPPROG-chgrp}" -stripprog="${STRIPPROG-strip}" -rmprog="${RMPROG-rm}" -mkdirprog="${MKDIRPROG-mkdir}" - -tranformbasename="" -transform_arg="" -instcmd="$mvprog" -chmodcmd="$chmodprog 0755" -chowncmd="" -chgrpcmd="" -stripcmd="" -rmcmd="$rmprog -f" -mvcmd="$mvprog" -src="" -dst="" -dir_arg="" - -while [ x"$1" != x ]; do - case $1 in - -c) instcmd="$cpprog" - shift - continue;; - - -d) dir_arg=true - shift - continue;; - - -m) chmodcmd="$chmodprog $2" - shift - shift - continue;; - - -o) chowncmd="$chownprog $2" - shift - shift - continue;; - - -g) chgrpcmd="$chgrpprog $2" - shift - shift - continue;; - - -s) stripcmd="$stripprog" - shift - continue;; - - -t=*) transformarg=`echo $1 | sed 's/-t=//'` - shift - continue;; - - -b=*) transformbasename=`echo $1 | sed 's/-b=//'` - shift - continue;; - - *) if [ x"$src" = x ] - then - src=$1 - else - # this colon is to work around a 386BSD /bin/sh bug - : - dst=$1 - fi - shift - continue;; - esac -done - -if [ x"$src" = x ] -then - echo "install: no input file specified" - exit 1 -else - true -fi - -if [ x"$dir_arg" != x ]; then - dst=$src - src="" - - if [ -d $dst ]; then - instcmd=: - else - instcmd=mkdir - fi -else - -# Waiting for this to be detected by the "$instcmd $src $dsttmp" command -# might cause directories to be created, which would be especially bad -# if $src (and thus $dsttmp) contains '*'. - - if [ -f $src -o -d $src ] - then - true - else - echo "install: $src does not exist" - exit 1 - fi - - if [ x"$dst" = x ] - then - echo "install: no destination specified" - exit 1 - else - true - fi - -# If destination is a directory, append the input filename; if your system -# does not like double slashes in filenames, you may need to add some logic - - if [ -d $dst ] - then - dst="$dst"/`basename $src` - else - true - fi -fi - -## this sed command emulates the dirname command -dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` - -# Make sure that the destination directory exists. -# this part is taken from Noah Friedman's mkinstalldirs script - -# Skip lots of stat calls in the usual case. -if [ ! -d "$dstdir" ]; then -defaultIFS=' -' -IFS="${IFS-${defaultIFS}}" - -oIFS="${IFS}" -# Some sh's can't handle IFS=/ for some reason. -IFS='%' -set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` -IFS="${oIFS}" - -pathcomp='' - -while [ $# -ne 0 ] ; do - pathcomp="${pathcomp}${1}" - shift - - if [ ! -d "${pathcomp}" ] ; - then - $mkdirprog "${pathcomp}" - else - true - fi - - pathcomp="${pathcomp}/" -done -fi - -if [ x"$dir_arg" != x ] -then - $doit $instcmd $dst && - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi -else - -# If we're going to rename the final executable, determine the name now. - - if [ x"$transformarg" = x ] - then - dstfile=`basename $dst` - else - dstfile=`basename $dst $transformbasename | - sed $transformarg`$transformbasename - fi - -# don't allow the sed command to completely eliminate the filename - - if [ x"$dstfile" = x ] - then - dstfile=`basename $dst` - else - true - fi - -# Make a temp file name in the proper directory. - - dsttmp=$dstdir/#inst.$$# - -# Move or copy the file name to the temp name - - $doit $instcmd $src $dsttmp && - - trap "rm -f ${dsttmp}" 0 && - -# and set any options; do chmod last to preserve setuid bits - -# If any of these fail, we abort the whole thing. If we want to -# ignore errors from any of these, just make sure not to ignore -# errors from the above "$doit $instcmd $src $dsttmp" command. - - if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && - if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && - if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && - if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && - -# Now rename the file to the real destination. - - $doit $rmcmd -f $dstdir/$dstfile && - $doit $mvcmd $dsttmp $dstdir/$dstfile - -fi && - - -exit 0 diff --git a/contrib/bc/lib/Makefile.am b/contrib/bc/lib/Makefile.am deleted file mode 100644 index 6f74b4d..0000000 --- a/contrib/bc/lib/Makefile.am +++ /dev/null @@ -1,26 +0,0 @@ -## Process this file with automake to produce Makefile.in -noinst_LIBRARIES = libbc.a - -INCLUDES = -I. -I.. -I$(srcdir)/../h - -libbc_a_SOURCES = getopt.c getopt1.c vfprintf.c number.c - -DEFS = @DEFS@ $(DEFSADD) - -CFLAGS = @CFLAGS@ -Wall -funsigned-char - -MAINTAINERCLEANFILES = Makefile.in number.c - -newnumber.o: number.c muldigits.h - $(CC) $(CFLAGS) $(INCLUDES) -c -DMULDIGITS -o newnumber.o $(srcdir)/number.c - -muldigits.h: testmul - @echo "The following may take up to 10 minutes." - testmul > muldigits.h - -testmul: testmul.o number.o - $(CC) $(CFLAGS) -o testmul testmul.o number.o - -specialnumber: newnumber.o - cp newnumber.o number.o - diff --git a/contrib/bc/lib/Makefile.in b/contrib/bc/lib/Makefile.in deleted file mode 100644 index 5ffa593..0000000 --- a/contrib/bc/lib/Makefile.in +++ /dev/null @@ -1,283 +0,0 @@ -# Makefile.in generated automatically by automake 1.4 from Makefile.am - -# Copyright (C) 1994, 1995-8, 1999 Free Software Foundation, Inc. -# This Makefile.in is free software; the Free Software Foundation -# gives unlimited permission to copy and/or distribute it, -# with or without modifications, as long as this notice is preserved. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY, to the extent permitted by law; without -# even the implied warranty of MERCHANTABILITY or FITNESS FOR A -# PARTICULAR PURPOSE. - - -SHELL = @SHELL@ - -srcdir = @srcdir@ -top_srcdir = @top_srcdir@ -VPATH = @srcdir@ -prefix = @prefix@ -exec_prefix = @exec_prefix@ - -bindir = @bindir@ -sbindir = @sbindir@ -libexecdir = @libexecdir@ -datadir = @datadir@ -sysconfdir = @sysconfdir@ -sharedstatedir = @sharedstatedir@ -localstatedir = @localstatedir@ -libdir = @libdir@ -infodir = @infodir@ -mandir = @mandir@ -includedir = @includedir@ -oldincludedir = /usr/include - -DESTDIR = - -pkgdatadir = $(datadir)/@PACKAGE@ -pkglibdir = $(libdir)/@PACKAGE@ -pkgincludedir = $(includedir)/@PACKAGE@ - -top_builddir = .. - -ACLOCAL = @ACLOCAL@ -AUTOCONF = @AUTOCONF@ -AUTOMAKE = @AUTOMAKE@ -AUTOHEADER = @AUTOHEADER@ - -INSTALL = @INSTALL@ -INSTALL_PROGRAM = @INSTALL_PROGRAM@ $(AM_INSTALL_PROGRAM_FLAGS) -INSTALL_DATA = @INSTALL_DATA@ -INSTALL_SCRIPT = @INSTALL_SCRIPT@ -transform = @program_transform_name@ - -NORMAL_INSTALL = : -PRE_INSTALL = : -POST_INSTALL = : -NORMAL_UNINSTALL = : -PRE_UNINSTALL = : -POST_UNINSTALL = : -CC = @CC@ -LEX = @LEX@ -MAKEINFO = @MAKEINFO@ -PACKAGE = @PACKAGE@ -RANLIB = @RANLIB@ -READLINELIB = @READLINELIB@ -VERSION = @VERSION@ -YACC = @YACC@ - -noinst_LIBRARIES = libbc.a - -INCLUDES = -I. -I.. -I$(srcdir)/../h - -libbc_a_SOURCES = getopt.c getopt1.c vfprintf.c number.c - -DEFS = @DEFS@ $(DEFSADD) - -CFLAGS = @CFLAGS@ -Wall -funsigned-char - -MAINTAINERCLEANFILES = Makefile.in number.c -mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs -CONFIG_HEADER = ../config.h -CONFIG_CLEAN_FILES = -LIBRARIES = $(noinst_LIBRARIES) - -CPPFLAGS = @CPPFLAGS@ -LDFLAGS = @LDFLAGS@ -LIBS = @LIBS@ -libbc_a_LIBADD = -libbc_a_OBJECTS = getopt.o getopt1.o vfprintf.o number.o -AR = ar -COMPILE = $(CC) $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -CCLD = $(CC) -LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(LDFLAGS) -o $@ -DIST_COMMON = Makefile.am Makefile.in - - -DISTFILES = $(DIST_COMMON) $(SOURCES) $(HEADERS) $(TEXINFOS) $(EXTRA_DIST) - -TAR = tar -GZIP_ENV = --best -SOURCES = $(libbc_a_SOURCES) -OBJECTS = $(libbc_a_OBJECTS) - -all: all-redirect -.SUFFIXES: -.SUFFIXES: .S .c .o .s -$(srcdir)/Makefile.in: Makefile.am $(top_srcdir)/configure.in $(ACLOCAL_M4) - cd $(top_srcdir) && $(AUTOMAKE) --gnu --include-deps lib/Makefile - -Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status - cd $(top_builddir) \ - && CONFIG_FILES=$(subdir)/$@ CONFIG_HEADERS= $(SHELL) ./config.status - - -mostlyclean-noinstLIBRARIES: - -clean-noinstLIBRARIES: - -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) - -distclean-noinstLIBRARIES: - -maintainer-clean-noinstLIBRARIES: - -.c.o: - $(COMPILE) -c $< - -.s.o: - $(COMPILE) -c $< - -.S.o: - $(COMPILE) -c $< - -mostlyclean-compile: - -rm -f *.o core *.core - -clean-compile: - -distclean-compile: - -rm -f *.tab.c - -maintainer-clean-compile: - -libbc.a: $(libbc_a_OBJECTS) $(libbc_a_DEPENDENCIES) - -rm -f libbc.a - $(AR) cru libbc.a $(libbc_a_OBJECTS) $(libbc_a_LIBADD) - $(RANLIB) libbc.a - -tags: TAGS - -ID: $(HEADERS) $(SOURCES) $(LISP) - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - here=`pwd` && cd $(srcdir) \ - && mkid -f$$here/ID $$unique $(LISP) - -TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) $(LISP) - tags=; \ - here=`pwd`; \ - list='$(SOURCES) $(HEADERS)'; \ - unique=`for i in $$list; do echo $$i; done | \ - awk ' { files[$$0] = 1; } \ - END { for (i in files) print i; }'`; \ - test -z "$(ETAGS_ARGS)$$unique$(LISP)$$tags" \ - || (cd $(srcdir) && etags $(ETAGS_ARGS) $$tags $$unique $(LISP) -o $$here/TAGS) - -mostlyclean-tags: - -clean-tags: - -distclean-tags: - -rm -f TAGS ID - -maintainer-clean-tags: - -distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) - -subdir = lib - -distdir: $(DISTFILES) - @for file in $(DISTFILES); do \ - d=$(srcdir); \ - if test -d $$d/$$file; then \ - cp -pr $$/$$file $(distdir)/$$file; \ - else \ - test -f $(distdir)/$$file \ - || ln $$d/$$file $(distdir)/$$file 2> /dev/null \ - || cp -p $$d/$$file $(distdir)/$$file || :; \ - fi; \ - done -getopt.o: getopt.c ../config.h ../h/getopt.h -getopt1.o: getopt1.c ../config.h ../h/getopt.h -number.o: number.c ../config.h ../h/number.h -vfprintf.o: vfprintf.c ../config.h - -info-am: -info: info-am -dvi-am: -dvi: dvi-am -check-am: all-am -check: check-am -installcheck-am: -installcheck: installcheck-am -install-exec-am: -install-exec: install-exec-am - -install-data-am: -install-data: install-data-am - -install-am: all-am - @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am -install: install-am -uninstall-am: -uninstall: uninstall-am -all-am: Makefile $(LIBRARIES) -all-redirect: all-am -install-strip: - $(MAKE) $(AM_MAKEFLAGS) AM_INSTALL_PROGRAM_FLAGS=-s install -installdirs: - - -mostlyclean-generic: - -clean-generic: - -distclean-generic: - -rm -f Makefile $(CONFIG_CLEAN_FILES) - -rm -f config.cache config.log stamp-h stamp-h[0-9]* - -maintainer-clean-generic: - -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) -mostlyclean-am: mostlyclean-noinstLIBRARIES mostlyclean-compile \ - mostlyclean-tags mostlyclean-generic - -mostlyclean: mostlyclean-am - -clean-am: clean-noinstLIBRARIES clean-compile clean-tags clean-generic \ - mostlyclean-am - -clean: clean-am - -distclean-am: distclean-noinstLIBRARIES distclean-compile \ - distclean-tags distclean-generic clean-am - -distclean: distclean-am - -maintainer-clean-am: maintainer-clean-noinstLIBRARIES \ - maintainer-clean-compile maintainer-clean-tags \ - maintainer-clean-generic distclean-am - @echo "This command is intended for maintainers to use;" - @echo "it deletes files that may require special tools to rebuild." - -maintainer-clean: maintainer-clean-am - -.PHONY: mostlyclean-noinstLIBRARIES distclean-noinstLIBRARIES \ -clean-noinstLIBRARIES maintainer-clean-noinstLIBRARIES \ -mostlyclean-compile distclean-compile clean-compile \ -maintainer-clean-compile tags mostlyclean-tags distclean-tags \ -clean-tags maintainer-clean-tags distdir info-am info dvi-am dvi check \ -check-am installcheck-am installcheck install-exec-am install-exec \ -install-data-am install-data install-am install uninstall-am uninstall \ -all-redirect all-am all installdirs mostlyclean-generic \ -distclean-generic clean-generic maintainer-clean-generic clean \ -mostlyclean distclean maintainer-clean - - -newnumber.o: number.c muldigits.h - $(CC) $(CFLAGS) $(INCLUDES) -c -DMULDIGITS -o newnumber.o $(srcdir)/number.c - -muldigits.h: testmul - @echo "The following may take up to 10 minutes." - testmul > muldigits.h - -testmul: testmul.o number.o - $(CC) $(CFLAGS) -o testmul testmul.o number.o - -specialnumber: newnumber.o - cp newnumber.o number.o - -# Tell versions [3.59,3.63) of GNU make to not export all variables. -# Otherwise a system limit (for SysV at least) may be exceeded. -.NOEXPORT: diff --git a/contrib/bc/lib/number.c b/contrib/bc/lib/number.c deleted file mode 100644 index 1f913d5..0000000 --- a/contrib/bc/lib/number.c +++ /dev/null @@ -1,1793 +0,0 @@ -/* number.c: Implements arbitrary precision numbers. */ -/* - Copyright (C) 1991, 1992, 1993, 1994, 1997, 2000 Free Software Foundation, Inc. - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License , or - (at your option) any later version. - - This program 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 General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; see the file COPYING. If not, write to: - - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111-1307 USA. - - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#include <stdio.h> -#include <config.h> -#include <number.h> -#include <assert.h> -#include <stdlib.h> -#include <ctype.h>/* Prototypes needed for external utility routines. */ - -#define bc_rt_warn rt_warn -#define bc_rt_error rt_error -#define bc_out_of_memory out_of_memory - -_PROTOTYPE(void rt_warn, (char *mesg ,...)); -_PROTOTYPE(void rt_error, (char *mesg ,...)); -_PROTOTYPE(void out_of_memory, (void)); - -/* Storage used for special numbers. */ -bc_num _zero_; -bc_num _one_; -bc_num _two_; - -static bc_num _bc_Free_list = NULL; - -/* new_num allocates a number and sets fields to known values. */ - -bc_num -bc_new_num (length, scale) - int length, scale; -{ - bc_num temp; - - if (_bc_Free_list != NULL) { - temp = _bc_Free_list; - _bc_Free_list = temp->n_next; - } else { - temp = (bc_num) malloc (sizeof(bc_struct)); - if (temp == NULL) bc_out_of_memory (); - } - temp->n_sign = PLUS; - temp->n_len = length; - temp->n_scale = scale; - temp->n_refs = 1; - temp->n_ptr = (char *) malloc (length+scale); - if (temp->n_ptr == NULL) bc_out_of_memory(); - temp->n_value = temp->n_ptr; - memset (temp->n_ptr, 0, length+scale); - return temp; -} - -/* "Frees" a bc_num NUM. Actually decreases reference count and only - frees the storage if reference count is zero. */ - -void -bc_free_num (num) - bc_num *num; -{ - if (*num == NULL) return; - (*num)->n_refs--; - if ((*num)->n_refs == 0) { - if ((*num)->n_ptr) - free ((*num)->n_ptr); - (*num)->n_next = _bc_Free_list; - _bc_Free_list = *num; - } - *num = NULL; -} - - -/* Intitialize the number package! */ - -void -bc_init_numbers () -{ - _zero_ = bc_new_num (1,0); - _one_ = bc_new_num (1,0); - _one_->n_value[0] = 1; - _two_ = bc_new_num (1,0); - _two_->n_value[0] = 2; -} - - -/* Make a copy of a number! Just increments the reference count! */ - -bc_num -bc_copy_num (num) - bc_num num; -{ - num->n_refs++; - return num; -} - - -/* Initialize a number NUM by making it a copy of zero. */ - -void -bc_init_num (num) - bc_num *num; -{ - *num = bc_copy_num (_zero_); -} - -/* For many things, we may have leading zeros in a number NUM. - _bc_rm_leading_zeros just moves the data "value" pointer to the - correct place and adjusts the length. */ - -static void -_bc_rm_leading_zeros (num) - bc_num num; -{ - /* We can move n_value to point to the first non zero digit! */ - while (*num->n_value == 0 && num->n_len > 1) { - num->n_value++; - num->n_len--; - } -} - - -/* Compare two bc numbers. Return value is 0 if equal, -1 if N1 is less - than N2 and +1 if N1 is greater than N2. If USE_SIGN is false, just - compare the magnitudes. */ - -static int -_bc_do_compare (n1, n2, use_sign, ignore_last) - bc_num n1, n2; - int use_sign; - int ignore_last; -{ - char *n1ptr, *n2ptr; - int count; - - /* First, compare signs. */ - if (use_sign && n1->n_sign != n2->n_sign) - { - if (n1->n_sign == PLUS) - return (1); /* Positive N1 > Negative N2 */ - else - return (-1); /* Negative N1 < Positive N1 */ - } - - /* Now compare the magnitude. */ - if (n1->n_len != n2->n_len) - { - if (n1->n_len > n2->n_len) - { - /* Magnitude of n1 > n2. */ - if (!use_sign || n1->n_sign == PLUS) - return (1); - else - return (-1); - } - else - { - /* Magnitude of n1 < n2. */ - if (!use_sign || n1->n_sign == PLUS) - return (-1); - else - return (1); - } - } - - /* If we get here, they have the same number of integer digits. - check the integer part and the equal length part of the fraction. */ - count = n1->n_len + MIN (n1->n_scale, n2->n_scale); - n1ptr = n1->n_value; - n2ptr = n2->n_value; - - while ((count > 0) && (*n1ptr == *n2ptr)) - { - n1ptr++; - n2ptr++; - count--; - } - if (ignore_last && count == 1 && n1->n_scale == n2->n_scale) - return (0); - if (count != 0) - { - if (*n1ptr > *n2ptr) - { - /* Magnitude of n1 > n2. */ - if (!use_sign || n1->n_sign == PLUS) - return (1); - else - return (-1); - } - else - { - /* Magnitude of n1 < n2. */ - if (!use_sign || n1->n_sign == PLUS) - return (-1); - else - return (1); - } - } - - /* They are equal up to the last part of the equal part of the fraction. */ - if (n1->n_scale != n2->n_scale) - { - if (n1->n_scale > n2->n_scale) - { - for (count = n1->n_scale-n2->n_scale; count>0; count--) - if (*n1ptr++ != 0) - { - /* Magnitude of n1 > n2. */ - if (!use_sign || n1->n_sign == PLUS) - return (1); - else - return (-1); - } - } - else - { - for (count = n2->n_scale-n1->n_scale; count>0; count--) - if (*n2ptr++ != 0) - { - /* Magnitude of n1 < n2. */ - if (!use_sign || n1->n_sign == PLUS) - return (-1); - else - return (1); - } - } - } - - /* They must be equal! */ - return (0); -} - - -/* This is the "user callable" routine to compare numbers N1 and N2. */ - -int -bc_compare (n1, n2) - bc_num n1, n2; -{ - return _bc_do_compare (n1, n2, TRUE, FALSE); -} - -/* In some places we need to check if the number is negative. */ - -char -bc_is_neg (num) - bc_num num; -{ - return num->n_sign == MINUS; -} - -/* In some places we need to check if the number NUM is zero. */ - -char -bc_is_zero (num) - bc_num num; -{ - int count; - char *nptr; - - /* Quick check. */ - if (num == _zero_) return TRUE; - - /* Initialize */ - count = num->n_len + num->n_scale; - nptr = num->n_value; - - /* The check */ - while ((count > 0) && (*nptr++ == 0)) count--; - - if (count != 0) - return FALSE; - else - return TRUE; -} - -/* In some places we need to check if the number NUM is almost zero. - Specifically, all but the last digit is 0 and the last digit is 1. - Last digit is defined by scale. */ - -char -bc_is_near_zero (num, scale) - bc_num num; - int scale; -{ - int count; - char *nptr; - - /* Error checking */ - if (scale > num->n_scale) - scale = num->n_scale; - - /* Initialize */ - count = num->n_len + scale; - nptr = num->n_value; - - /* The check */ - while ((count > 0) && (*nptr++ == 0)) count--; - - if (count != 0 && (count != 1 || *--nptr != 1)) - return FALSE; - else - return TRUE; -} - - -/* Perform addition: N1 is added to N2 and the value is - returned. The signs of N1 and N2 are ignored. - SCALE_MIN is to set the minimum scale of the result. */ - -static bc_num -_bc_do_add (n1, n2, scale_min) - bc_num n1, n2; - int scale_min; -{ - bc_num sum; - int sum_scale, sum_digits; - char *n1ptr, *n2ptr, *sumptr; - int carry, n1bytes, n2bytes; - int count; - - /* Prepare sum. */ - sum_scale = MAX (n1->n_scale, n2->n_scale); - sum_digits = MAX (n1->n_len, n2->n_len) + 1; - sum = bc_new_num (sum_digits, MAX(sum_scale, scale_min)); - - /* Zero extra digits made by scale_min. */ - if (scale_min > sum_scale) - { - sumptr = (char *) (sum->n_value + sum_scale + sum_digits); - for (count = scale_min - sum_scale; count > 0; count--) - *sumptr++ = 0; - } - - /* Start with the fraction part. Initialize the pointers. */ - n1bytes = n1->n_scale; - n2bytes = n2->n_scale; - n1ptr = (char *) (n1->n_value + n1->n_len + n1bytes - 1); - n2ptr = (char *) (n2->n_value + n2->n_len + n2bytes - 1); - sumptr = (char *) (sum->n_value + sum_scale + sum_digits - 1); - - /* Add the fraction part. First copy the longer fraction.*/ - if (n1bytes != n2bytes) - { - if (n1bytes > n2bytes) - while (n1bytes>n2bytes) - { *sumptr-- = *n1ptr--; n1bytes--;} - else - while (n2bytes>n1bytes) - { *sumptr-- = *n2ptr--; n2bytes--;} - } - - /* Now add the remaining fraction part and equal size integer parts. */ - n1bytes += n1->n_len; - n2bytes += n2->n_len; - carry = 0; - while ((n1bytes > 0) && (n2bytes > 0)) - { - *sumptr = *n1ptr-- + *n2ptr-- + carry; - if (*sumptr > (BASE-1)) - { - carry = 1; - *sumptr -= BASE; - } - else - carry = 0; - sumptr--; - n1bytes--; - n2bytes--; - } - - /* Now add carry the longer integer part. */ - if (n1bytes == 0) - { n1bytes = n2bytes; n1ptr = n2ptr; } - while (n1bytes-- > 0) - { - *sumptr = *n1ptr-- + carry; - if (*sumptr > (BASE-1)) - { - carry = 1; - *sumptr -= BASE; - } - else - carry = 0; - sumptr--; - } - - /* Set final carry. */ - if (carry == 1) - *sumptr += 1; - - /* Adjust sum and return. */ - _bc_rm_leading_zeros (sum); - return sum; -} - - -/* Perform subtraction: N2 is subtracted from N1 and the value is - returned. The signs of N1 and N2 are ignored. Also, N1 is - assumed to be larger than N2. SCALE_MIN is the minimum scale - of the result. */ - -static bc_num -_bc_do_sub (n1, n2, scale_min) - bc_num n1, n2; - int scale_min; -{ - bc_num diff; - int diff_scale, diff_len; - int min_scale, min_len; - char *n1ptr, *n2ptr, *diffptr; - int borrow, count, val; - - /* Allocate temporary storage. */ - diff_len = MAX (n1->n_len, n2->n_len); - diff_scale = MAX (n1->n_scale, n2->n_scale); - min_len = MIN (n1->n_len, n2->n_len); - min_scale = MIN (n1->n_scale, n2->n_scale); - diff = bc_new_num (diff_len, MAX(diff_scale, scale_min)); - - /* Zero extra digits made by scale_min. */ - if (scale_min > diff_scale) - { - diffptr = (char *) (diff->n_value + diff_len + diff_scale); - for (count = scale_min - diff_scale; count > 0; count--) - *diffptr++ = 0; - } - - /* Initialize the subtract. */ - n1ptr = (char *) (n1->n_value + n1->n_len + n1->n_scale -1); - n2ptr = (char *) (n2->n_value + n2->n_len + n2->n_scale -1); - diffptr = (char *) (diff->n_value + diff_len + diff_scale -1); - - /* Subtract the numbers. */ - borrow = 0; - - /* Take care of the longer scaled number. */ - if (n1->n_scale != min_scale) - { - /* n1 has the longer scale */ - for (count = n1->n_scale - min_scale; count > 0; count--) - *diffptr-- = *n1ptr--; - } - else - { - /* n2 has the longer scale */ - for (count = n2->n_scale - min_scale; count > 0; count--) - { - val = - *n2ptr-- - borrow; - if (val < 0) - { - val += BASE; - borrow = 1; - } - else - borrow = 0; - *diffptr-- = val; - } - } - - /* Now do the equal length scale and integer parts. */ - - for (count = 0; count < min_len + min_scale; count++) - { - val = *n1ptr-- - *n2ptr-- - borrow; - if (val < 0) - { - val += BASE; - borrow = 1; - } - else - borrow = 0; - *diffptr-- = val; - } - - /* If n1 has more digits then n2, we now do that subtract. */ - if (diff_len != min_len) - { - for (count = diff_len - min_len; count > 0; count--) - { - val = *n1ptr-- - borrow; - if (val < 0) - { - val += BASE; - borrow = 1; - } - else - borrow = 0; - *diffptr-- = val; - } - } - - /* Clean up and return. */ - _bc_rm_leading_zeros (diff); - return diff; -} - - -/* Here is the full subtract routine that takes care of negative numbers. - N2 is subtracted from N1 and the result placed in RESULT. SCALE_MIN - is the minimum scale for the result. */ - -void -bc_sub (n1, n2, result, scale_min) - bc_num n1, n2, *result; - int scale_min; -{ - bc_num diff = NULL; - int cmp_res; - int res_scale; - - if (n1->n_sign != n2->n_sign) - { - diff = _bc_do_add (n1, n2, scale_min); - diff->n_sign = n1->n_sign; - } - else - { - /* subtraction must be done. */ - /* Compare magnitudes. */ - cmp_res = _bc_do_compare (n1, n2, FALSE, FALSE); - switch (cmp_res) - { - case -1: - /* n1 is less than n2, subtract n1 from n2. */ - diff = _bc_do_sub (n2, n1, scale_min); - diff->n_sign = (n2->n_sign == PLUS ? MINUS : PLUS); - break; - case 0: - /* They are equal! return zero! */ - res_scale = MAX (scale_min, MAX(n1->n_scale, n2->n_scale)); - diff = bc_new_num (1, res_scale); - memset (diff->n_value, 0, res_scale+1); - break; - case 1: - /* n2 is less than n1, subtract n2 from n1. */ - diff = _bc_do_sub (n1, n2, scale_min); - diff->n_sign = n1->n_sign; - break; - } - } - - /* Clean up and return. */ - bc_free_num (result); - *result = diff; -} - - -/* Here is the full add routine that takes care of negative numbers. - N1 is added to N2 and the result placed into RESULT. SCALE_MIN - is the minimum scale for the result. */ - -void -bc_add (n1, n2, result, scale_min) - bc_num n1, n2, *result; - int scale_min; -{ - bc_num sum = NULL; - int cmp_res; - int res_scale; - - if (n1->n_sign == n2->n_sign) - { - sum = _bc_do_add (n1, n2, scale_min); - sum->n_sign = n1->n_sign; - } - else - { - /* subtraction must be done. */ - cmp_res = _bc_do_compare (n1, n2, FALSE, FALSE); /* Compare magnitudes. */ - switch (cmp_res) - { - case -1: - /* n1 is less than n2, subtract n1 from n2. */ - sum = _bc_do_sub (n2, n1, scale_min); - sum->n_sign = n2->n_sign; - break; - case 0: - /* They are equal! return zero with the correct scale! */ - res_scale = MAX (scale_min, MAX(n1->n_scale, n2->n_scale)); - sum = bc_new_num (1, res_scale); - memset (sum->n_value, 0, res_scale+1); - break; - case 1: - /* n2 is less than n1, subtract n2 from n1. */ - sum = _bc_do_sub (n1, n2, scale_min); - sum->n_sign = n1->n_sign; - } - } - - /* Clean up and return. */ - bc_free_num (result); - *result = sum; -} - -/* Recursive vs non-recursive multiply crossover ranges. */ -#if defined(MULDIGITS) -#include "muldigits.h" -#else -#define MUL_BASE_DIGITS 80 -#endif - -int mul_base_digits = MUL_BASE_DIGITS; -#define MUL_SMALL_DIGITS mul_base_digits/4 - -/* Multiply utility routines */ - -static bc_num -new_sub_num (length, scale, value) - int length, scale; - char *value; -{ - bc_num temp; - - if (_bc_Free_list != NULL) { - temp = _bc_Free_list; - _bc_Free_list = temp->n_next; - } else { - temp = (bc_num) malloc (sizeof(bc_struct)); - if (temp == NULL) bc_out_of_memory (); - } - temp->n_sign = PLUS; - temp->n_len = length; - temp->n_scale = scale; - temp->n_refs = 1; - temp->n_ptr = NULL; - temp->n_value = value; - return temp; -} - -static void -_bc_simp_mul (bc_num n1, int n1len, bc_num n2, int n2len, bc_num *prod, - int full_scale) -{ - char *n1ptr, *n2ptr, *pvptr; - char *n1end, *n2end; /* To the end of n1 and n2. */ - int indx, sum, prodlen; - - prodlen = n1len+n2len+1; - - *prod = bc_new_num (prodlen, 0); - - n1end = (char *) (n1->n_value + n1len - 1); - n2end = (char *) (n2->n_value + n2len - 1); - pvptr = (char *) ((*prod)->n_value + prodlen - 1); - sum = 0; - - /* Here is the loop... */ - for (indx = 0; indx < prodlen-1; indx++) - { - n1ptr = (char *) (n1end - MAX(0, indx-n2len+1)); - n2ptr = (char *) (n2end - MIN(indx, n2len-1)); - while ((n1ptr >= n1->n_value) && (n2ptr <= n2end)) - sum += *n1ptr-- * *n2ptr++; - *pvptr-- = sum % BASE; - sum = sum / BASE; - } - *pvptr = sum; -} - - -/* A special adder/subtractor for the recursive divide and conquer - multiply algorithm. Note: if sub is called, accum must - be larger that what is being subtracted. Also, accum and val - must have n_scale = 0. (e.g. they must look like integers. *) */ -static void -_bc_shift_addsub (bc_num accum, bc_num val, int shift, int sub) -{ - signed char *accp, *valp; - int count, carry; - - count = val->n_len; - if (val->n_value[0] == 0) - count--; - assert (accum->n_len+accum->n_scale >= shift+count); - - /* Set up pointers and others */ - accp = (signed char *)(accum->n_value + - accum->n_len + accum->n_scale - shift - 1); - valp = (signed char *)(val->n_value + val->n_len - 1); - carry = 0; - - if (sub) { - /* Subtraction, carry is really borrow. */ - while (count--) { - *accp -= *valp-- + carry; - if (*accp < 0) { - carry = 1; - *accp-- += BASE; - } else { - carry = 0; - accp--; - } - } - while (carry) { - *accp -= carry; - if (*accp < 0) - *accp-- += BASE; - else - carry = 0; - } - } else { - /* Addition */ - while (count--) { - *accp += *valp-- + carry; - if (*accp > (BASE-1)) { - carry = 1; - *accp-- -= BASE; - } else { - carry = 0; - accp--; - } - } - while (carry) { - *accp += carry; - if (*accp > (BASE-1)) - *accp-- -= BASE; - else - carry = 0; - } - } -} - -/* Recursive divide and conquer multiply algorithm. - Based on - Let u = u0 + u1*(b^n) - Let v = v0 + v1*(b^n) - Then uv = (B^2n+B^n)*u1*v1 + B^n*(u1-u0)*(v0-v1) + (B^n+1)*u0*v0 - - B is the base of storage, number of digits in u1,u0 close to equal. -*/ -static void -_bc_rec_mul (bc_num u, int ulen, bc_num v, int vlen, bc_num *prod, - int full_scale) -{ - bc_num u0, u1, v0, v1; - int u0len, v0len; - bc_num m1, m2, m3, d1, d2; - int n, prodlen, m1zero; - int d1len, d2len; - - /* Base case? */ - if ((ulen+vlen) < mul_base_digits - || ulen < MUL_SMALL_DIGITS - || vlen < MUL_SMALL_DIGITS ) { - _bc_simp_mul (u, ulen, v, vlen, prod, full_scale); - return; - } - - /* Calculate n -- the u and v split point in digits. */ - n = (MAX(ulen, vlen)+1) / 2; - - /* Split u and v. */ - if (ulen < n) { - u1 = bc_copy_num (_zero_); - u0 = new_sub_num (ulen,0, u->n_value); - } else { - u1 = new_sub_num (ulen-n, 0, u->n_value); - u0 = new_sub_num (n, 0, u->n_value+ulen-n); - } - if (vlen < n) { - v1 = bc_copy_num (_zero_); - v0 = new_sub_num (vlen,0, v->n_value); - } else { - v1 = new_sub_num (vlen-n, 0, v->n_value); - v0 = new_sub_num (n, 0, v->n_value+vlen-n); - } - _bc_rm_leading_zeros (u1); - _bc_rm_leading_zeros (u0); - u0len = u0->n_len; - _bc_rm_leading_zeros (v1); - _bc_rm_leading_zeros (v0); - v0len = v0->n_len; - - m1zero = bc_is_zero(u1) || bc_is_zero(v1); - - /* Calculate sub results ... */ - - bc_init_num(&d1); - bc_init_num(&d2); - bc_sub (u1, u0, &d1, 0); - d1len = d1->n_len; - bc_sub (v0, v1, &d2, 0); - d2len = d2->n_len; - - - /* Do recursive multiplies and shifted adds. */ - if (m1zero) - m1 = bc_copy_num (_zero_); - else - _bc_rec_mul (u1, u1->n_len, v1, v1->n_len, &m1, 0); - - if (bc_is_zero(d1) || bc_is_zero(d2)) - m2 = bc_copy_num (_zero_); - else - _bc_rec_mul (d1, d1len, d2, d2len, &m2, 0); - - if (bc_is_zero(u0) || bc_is_zero(v0)) - m3 = bc_copy_num (_zero_); - else - _bc_rec_mul (u0, u0->n_len, v0, v0->n_len, &m3, 0); - - /* Initialize product */ - prodlen = ulen+vlen+1; - *prod = bc_new_num(prodlen, 0); - - if (!m1zero) { - _bc_shift_addsub (*prod, m1, 2*n, 0); - _bc_shift_addsub (*prod, m1, n, 0); - } - _bc_shift_addsub (*prod, m3, n, 0); - _bc_shift_addsub (*prod, m3, 0, 0); - _bc_shift_addsub (*prod, m2, n, d1->n_sign != d2->n_sign); - - /* Now clean up! */ - bc_free_num (&u1); - bc_free_num (&u0); - bc_free_num (&v1); - bc_free_num (&m1); - bc_free_num (&v0); - bc_free_num (&m2); - bc_free_num (&m3); - bc_free_num (&d1); - bc_free_num (&d2); -} - -/* The multiply routine. N2 times N1 is put int PROD with the scale of - the result being MIN(N2 scale+N1 scale, MAX (SCALE, N2 scale, N1 scale)). - */ - -void -bc_multiply (n1, n2, prod, scale) - bc_num n1, n2, *prod; - int scale; -{ - bc_num pval; - int len1, len2; - int full_scale, prod_scale; - - /* Initialize things. */ - len1 = n1->n_len + n1->n_scale; - len2 = n2->n_len + n2->n_scale; - full_scale = n1->n_scale + n2->n_scale; - prod_scale = MIN(full_scale,MAX(scale,MAX(n1->n_scale,n2->n_scale))); - - /* Do the multiply */ - _bc_rec_mul (n1, len1, n2, len2, &pval, full_scale); - - /* Assign to prod and clean up the number. */ - pval->n_sign = ( n1->n_sign == n2->n_sign ? PLUS : MINUS ); - pval->n_value = pval->n_ptr; - pval->n_len = len2 + len1 + 1 - full_scale; - pval->n_scale = prod_scale; - _bc_rm_leading_zeros (pval); - if (bc_is_zero (pval)) - pval->n_sign = PLUS; - bc_free_num (prod); - *prod = pval; -} - -/* Some utility routines for the divide: First a one digit multiply. - NUM (with SIZE digits) is multiplied by DIGIT and the result is - placed into RESULT. It is written so that NUM and RESULT can be - the same pointers. */ - -static void -_one_mult (num, size, digit, result) - unsigned char *num; - int size, digit; - unsigned char *result; -{ - int carry, value; - unsigned char *nptr, *rptr; - - if (digit == 0) - memset (result, 0, size); - else - { - if (digit == 1) - memcpy (result, num, size); - else - { - /* Initialize */ - nptr = (unsigned char *) (num+size-1); - rptr = (unsigned char *) (result+size-1); - carry = 0; - - while (size-- > 0) - { - value = *nptr-- * digit + carry; - *rptr-- = value % BASE; - carry = value / BASE; - } - - if (carry != 0) *rptr = carry; - } - } -} - - -/* The full division routine. This computes N1 / N2. It returns - 0 if the division is ok and the result is in QUOT. The number of - digits after the decimal point is SCALE. It returns -1 if division - by zero is tried. The algorithm is found in Knuth Vol 2. p237. */ - -int -bc_divide (n1, n2, quot, scale) - bc_num n1, n2, *quot; - int scale; -{ - bc_num qval; - unsigned char *num1, *num2; - unsigned char *ptr1, *ptr2, *n2ptr, *qptr; - int scale1, val; - unsigned int len1, len2, scale2, qdigits, extra, count; - unsigned int qdig, qguess, borrow, carry; - unsigned char *mval; - char zero; - unsigned int norm; - - /* Test for divide by zero. */ - if (bc_is_zero (n2)) return -1; - - /* Test for divide by 1. If it is we must truncate. */ - if (n2->n_scale == 0) - { - if (n2->n_len == 1 && *n2->n_value == 1) - { - qval = bc_new_num (n1->n_len, scale); - qval->n_sign = (n1->n_sign == n2->n_sign ? PLUS : MINUS); - memset (&qval->n_value[n1->n_len],0,scale); - memcpy (qval->n_value, n1->n_value, - n1->n_len + MIN(n1->n_scale,scale)); - bc_free_num (quot); - *quot = qval; - } - } - - /* Set up the divide. Move the decimal point on n1 by n2's scale. - Remember, zeros on the end of num2 are wasted effort for dividing. */ - scale2 = n2->n_scale; - n2ptr = (unsigned char *) n2->n_value+n2->n_len+scale2-1; - while ((scale2 > 0) && (*n2ptr-- == 0)) scale2--; - - len1 = n1->n_len + scale2; - scale1 = n1->n_scale - scale2; - if (scale1 < scale) - extra = scale - scale1; - else - extra = 0; - num1 = (unsigned char *) malloc (n1->n_len+n1->n_scale+extra+2); - if (num1 == NULL) bc_out_of_memory(); - memset (num1, 0, n1->n_len+n1->n_scale+extra+2); - memcpy (num1+1, n1->n_value, n1->n_len+n1->n_scale); - - len2 = n2->n_len + scale2; - num2 = (unsigned char *) malloc (len2+1); - if (num2 == NULL) bc_out_of_memory(); - memcpy (num2, n2->n_value, len2); - *(num2+len2) = 0; - n2ptr = num2; - while (*n2ptr == 0) - { - n2ptr++; - len2--; - } - - /* Calculate the number of quotient digits. */ - if (len2 > len1+scale) - { - qdigits = scale+1; - zero = TRUE; - } - else - { - zero = FALSE; - if (len2>len1) - qdigits = scale+1; /* One for the zero integer part. */ - else - qdigits = len1-len2+scale+1; - } - - /* Allocate and zero the storage for the quotient. */ - qval = bc_new_num (qdigits-scale,scale); - memset (qval->n_value, 0, qdigits); - - /* Allocate storage for the temporary storage mval. */ - mval = (unsigned char *) malloc (len2+1); - if (mval == NULL) bc_out_of_memory (); - - /* Now for the full divide algorithm. */ - if (!zero) - { - /* Normalize */ - norm = 10 / ((int)*n2ptr + 1); - if (norm != 1) - { - _one_mult (num1, len1+scale1+extra+1, norm, num1); - _one_mult (n2ptr, len2, norm, n2ptr); - } - - /* Initialize divide loop. */ - qdig = 0; - if (len2 > len1) - qptr = (unsigned char *) qval->n_value+len2-len1; - else - qptr = (unsigned char *) qval->n_value; - - /* Loop */ - while (qdig <= len1+scale-len2) - { - /* Calculate the quotient digit guess. */ - if (*n2ptr == num1[qdig]) - qguess = 9; - else - qguess = (num1[qdig]*10 + num1[qdig+1]) / *n2ptr; - - /* Test qguess. */ - if (n2ptr[1]*qguess > - (num1[qdig]*10 + num1[qdig+1] - *n2ptr*qguess)*10 - + num1[qdig+2]) - { - qguess--; - /* And again. */ - if (n2ptr[1]*qguess > - (num1[qdig]*10 + num1[qdig+1] - *n2ptr*qguess)*10 - + num1[qdig+2]) - qguess--; - } - - /* Multiply and subtract. */ - borrow = 0; - if (qguess != 0) - { - *mval = 0; - _one_mult (n2ptr, len2, qguess, mval+1); - ptr1 = (unsigned char *) num1+qdig+len2; - ptr2 = (unsigned char *) mval+len2; - for (count = 0; count < len2+1; count++) - { - val = (int) *ptr1 - (int) *ptr2-- - borrow; - if (val < 0) - { - val += 10; - borrow = 1; - } - else - borrow = 0; - *ptr1-- = val; - } - } - - /* Test for negative result. */ - if (borrow == 1) - { - qguess--; - ptr1 = (unsigned char *) num1+qdig+len2; - ptr2 = (unsigned char *) n2ptr+len2-1; - carry = 0; - for (count = 0; count < len2; count++) - { - val = (int) *ptr1 + (int) *ptr2-- + carry; - if (val > 9) - { - val -= 10; - carry = 1; - } - else - carry = 0; - *ptr1-- = val; - } - if (carry == 1) *ptr1 = (*ptr1 + 1) % 10; - } - - /* We now know the quotient digit. */ - *qptr++ = qguess; - qdig++; - } - } - - /* Clean up and return the number. */ - qval->n_sign = ( n1->n_sign == n2->n_sign ? PLUS : MINUS ); - if (bc_is_zero (qval)) qval->n_sign = PLUS; - _bc_rm_leading_zeros (qval); - bc_free_num (quot); - *quot = qval; - - /* Clean up temporary storage. */ - free (mval); - free (num1); - free (num2); - - return 0; /* Everything is OK. */ -} - - -/* Division *and* modulo for numbers. This computes both NUM1 / NUM2 and - NUM1 % NUM2 and puts the results in QUOT and REM, except that if QUOT - is NULL then that store will be omitted. - */ - -int -bc_divmod (num1, num2, quot, rem, scale) - bc_num num1, num2, *quot, *rem; - int scale; -{ - bc_num quotient = NULL; - bc_num temp; - int rscale; - - /* Check for correct numbers. */ - if (bc_is_zero (num2)) return -1; - - /* Calculate final scale. */ - rscale = MAX (num1->n_scale, num2->n_scale+scale); - bc_init_num(&temp); - - /* Calculate it. */ - bc_divide (num1, num2, &temp, scale); - if (quot) - quotient = bc_copy_num (temp); - bc_multiply (temp, num2, &temp, rscale); - bc_sub (num1, temp, rem, rscale); - bc_free_num (&temp); - - if (quot) - { - bc_free_num (quot); - *quot = quotient; - } - - return 0; /* Everything is OK. */ -} - - -/* Modulo for numbers. This computes NUM1 % NUM2 and puts the - result in RESULT. */ - -int -bc_modulo (num1, num2, result, scale) - bc_num num1, num2, *result; - int scale; -{ - return bc_divmod (num1, num2, NULL, result, scale); -} - -/* Raise BASE to the EXPO power, reduced modulo MOD. The result is - placed in RESULT. If a EXPO is not an integer, - only the integer part is used. */ - -int -bc_raisemod (base, expo, mod, result, scale) - bc_num base, expo, mod, *result; - int scale; -{ - bc_num power, exponent, parity, temp; - int rscale; - - /* Check for correct numbers. */ - if (bc_is_zero(mod)) return -1; - if (bc_is_neg(expo)) return -1; - - /* Set initial values. */ - power = bc_copy_num (base); - exponent = bc_copy_num (expo); - temp = bc_copy_num (_one_); - bc_init_num(&parity); - - /* Check the base for scale digits. */ - if (base->n_scale != 0) - bc_rt_warn ("non-zero scale in base"); - - /* Check the exponent for scale digits. */ - if (exponent->n_scale != 0) - { - bc_rt_warn ("non-zero scale in exponent"); - bc_divide (exponent, _one_, &exponent, 0); /*truncate */ - } - - /* Check the modulus for scale digits. */ - if (mod->n_scale != 0) - bc_rt_warn ("non-zero scale in modulus"); - - /* Do the calculation. */ - rscale = MAX(scale, base->n_scale); - while ( !bc_is_zero(exponent) ) - { - (void) bc_divmod (exponent, _two_, &exponent, &parity, 0); - if ( !bc_is_zero(parity) ) - { - bc_multiply (temp, power, &temp, rscale); - (void) bc_modulo (temp, mod, &temp, scale); - } - - bc_multiply (power, power, &power, rscale); - (void) bc_modulo (power, mod, &power, scale); - } - - /* Assign the value. */ - bc_free_num (&power); - bc_free_num (&exponent); - bc_free_num (result); - *result = temp; - return 0; /* Everything is OK. */ -} - -/* Raise NUM1 to the NUM2 power. The result is placed in RESULT. - Maximum exponent is LONG_MAX. If a NUM2 is not an integer, - only the integer part is used. */ - -void -bc_raise (num1, num2, result, scale) - bc_num num1, num2, *result; - int scale; -{ - bc_num temp, power; - long exponent; - int rscale; - int pwrscale; - int calcscale; - char neg; - - /* Check the exponent for scale digits and convert to a long. */ - if (num2->n_scale != 0) - bc_rt_warn ("non-zero scale in exponent"); - exponent = bc_num2long (num2); - if (exponent == 0 && (num2->n_len > 1 || num2->n_value[0] != 0)) - bc_rt_error ("exponent too large in raise"); - - /* Special case if exponent is a zero. */ - if (exponent == 0) - { - bc_free_num (result); - *result = bc_copy_num (_one_); - return; - } - - /* Other initializations. */ - if (exponent < 0) - { - neg = TRUE; - exponent = -exponent; - rscale = scale; - } - else - { - neg = FALSE; - rscale = MIN (num1->n_scale*exponent, MAX(scale, num1->n_scale)); - } - - /* Set initial value of temp. */ - power = bc_copy_num (num1); - pwrscale = num1->n_scale; - while ((exponent & 1) == 0) - { - pwrscale = 2*pwrscale; - bc_multiply (power, power, &power, pwrscale); - exponent = exponent >> 1; - } - temp = bc_copy_num (power); - calcscale = pwrscale; - exponent = exponent >> 1; - - /* Do the calculation. */ - while (exponent > 0) - { - pwrscale = 2*pwrscale; - bc_multiply (power, power, &power, pwrscale); - if ((exponent & 1) == 1) { - calcscale = pwrscale + calcscale; - bc_multiply (temp, power, &temp, calcscale); - } - exponent = exponent >> 1; - } - - /* Assign the value. */ - if (neg) - { - bc_divide (_one_, temp, result, rscale); - bc_free_num (&temp); - } - else - { - bc_free_num (result); - *result = temp; - if ((*result)->n_scale > rscale) - (*result)->n_scale = rscale; - } - bc_free_num (&power); -} - -/* Take the square root NUM and return it in NUM with SCALE digits - after the decimal place. */ - -int -bc_sqrt (num, scale) - bc_num *num; - int scale; -{ - int rscale, cmp_res, done; - int cscale; - bc_num guess, guess1, point5, diff; - - /* Initial checks. */ - cmp_res = bc_compare (*num, _zero_); - if (cmp_res < 0) - return 0; /* error */ - else - { - if (cmp_res == 0) - { - bc_free_num (num); - *num = bc_copy_num (_zero_); - return 1; - } - } - cmp_res = bc_compare (*num, _one_); - if (cmp_res == 0) - { - bc_free_num (num); - *num = bc_copy_num (_one_); - return 1; - } - - /* Initialize the variables. */ - rscale = MAX (scale, (*num)->n_scale); - bc_init_num(&guess); - bc_init_num(&guess1); - bc_init_num(&diff); - point5 = bc_new_num (1,1); - point5->n_value[1] = 5; - - - /* Calculate the initial guess. */ - if (cmp_res < 0) - { - /* The number is between 0 and 1. Guess should start at 1. */ - guess = bc_copy_num (_one_); - cscale = (*num)->n_scale; - } - else - { - /* The number is greater than 1. Guess should start at 10^(exp/2). */ - bc_int2num (&guess,10); - - bc_int2num (&guess1,(*num)->n_len); - bc_multiply (guess1, point5, &guess1, 0); - guess1->n_scale = 0; - bc_raise (guess, guess1, &guess, 0); - bc_free_num (&guess1); - cscale = 3; - } - - /* Find the square root using Newton's algorithm. */ - done = FALSE; - while (!done) - { - bc_free_num (&guess1); - guess1 = bc_copy_num (guess); - bc_divide (*num, guess, &guess, cscale); - bc_add (guess, guess1, &guess, 0); - bc_multiply (guess, point5, &guess, cscale); - bc_sub (guess, guess1, &diff, cscale+1); - if (bc_is_near_zero (diff, cscale)) - { - if (cscale < rscale+1) - cscale = MIN (cscale*3, rscale+1); - else - done = TRUE; - } - } - - /* Assign the number and clean up. */ - bc_free_num (num); - bc_divide (guess,_one_,num,rscale); - bc_free_num (&guess); - bc_free_num (&guess1); - bc_free_num (&point5); - bc_free_num (&diff); - return 1; -} - - -/* The following routines provide output for bcd numbers package - using the rules of POSIX bc for output. */ - -/* This structure is used for saving digits in the conversion process. */ -typedef struct stk_rec { - long digit; - struct stk_rec *next; -} stk_rec; - -/* The reference string for digits. */ -static char ref_str[] = "0123456789ABCDEF"; - - -/* A special output routine for "multi-character digits." Exactly - SIZE characters must be output for the value VAL. If SPACE is - non-zero, we must output one space before the number. OUT_CHAR - is the actual routine for writing the characters. */ - -void -bc_out_long (val, size, space, out_char) - long val; - int size, space; -#ifdef __STDC__ - void (*out_char)(int); -#else - void (*out_char)(); -#endif -{ - char digits[40]; - int len, ix; - - if (space) (*out_char) (' '); - sprintf (digits, "%ld", val); - len = strlen (digits); - while (size > len) - { - (*out_char) ('0'); - size--; - } - for (ix=0; ix < len; ix++) - (*out_char) (digits[ix]); -} - -/* Output of a bcd number. NUM is written in base O_BASE using OUT_CHAR - as the routine to do the actual output of the characters. */ - -void -bc_out_num (num, o_base, out_char, leading_zero) - bc_num num; - int o_base; -#ifdef __STDC__ - void (*out_char)(int); -#else - void (*out_char)(); -#endif - int leading_zero; -{ - char *nptr; - int index, fdigit, pre_space; - stk_rec *digits, *temp; - bc_num int_part, frac_part, base, cur_dig, t_num, max_o_digit; - - /* The negative sign if needed. */ - if (num->n_sign == MINUS) (*out_char) ('-'); - - /* Output the number. */ - if (bc_is_zero (num)) - (*out_char) ('0'); - else - if (o_base == 10) - { - /* The number is in base 10, do it the fast way. */ - nptr = num->n_value; - if (num->n_len > 1 || *nptr != 0) - for (index=num->n_len; index>0; index--) - (*out_char) (BCD_CHAR(*nptr++)); - else - nptr++; - - if (leading_zero && bc_is_zero (num)) - (*out_char) ('0'); - - /* Now the fraction. */ - if (num->n_scale > 0) - { - (*out_char) ('.'); - for (index=0; index<num->n_scale; index++) - (*out_char) (BCD_CHAR(*nptr++)); - } - } - else - { - /* special case ... */ - if (leading_zero && bc_is_zero (num)) - (*out_char) ('0'); - - /* The number is some other base. */ - digits = NULL; - bc_init_num (&int_part); - bc_divide (num, _one_, &int_part, 0); - bc_init_num (&frac_part); - bc_init_num (&cur_dig); - bc_init_num (&base); - bc_sub (num, int_part, &frac_part, 0); - /* Make the INT_PART and FRAC_PART positive. */ - int_part->n_sign = PLUS; - frac_part->n_sign = PLUS; - bc_int2num (&base, o_base); - bc_init_num (&max_o_digit); - bc_int2num (&max_o_digit, o_base-1); - - - /* Get the digits of the integer part and push them on a stack. */ - while (!bc_is_zero (int_part)) - { - bc_modulo (int_part, base, &cur_dig, 0); - temp = (stk_rec *) malloc (sizeof(stk_rec)); - if (temp == NULL) bc_out_of_memory(); - temp->digit = bc_num2long (cur_dig); - temp->next = digits; - digits = temp; - bc_divide (int_part, base, &int_part, 0); - } - - /* Print the digits on the stack. */ - if (digits != NULL) - { - /* Output the digits. */ - while (digits != NULL) - { - temp = digits; - digits = digits->next; - if (o_base <= 16) - (*out_char) (ref_str[ (int) temp->digit]); - else - bc_out_long (temp->digit, max_o_digit->n_len, 1, out_char); - free (temp); - } - } - - /* Get and print the digits of the fraction part. */ - if (num->n_scale > 0) - { - (*out_char) ('.'); - pre_space = 0; - t_num = bc_copy_num (_one_); - while (t_num->n_len <= num->n_scale) { - bc_multiply (frac_part, base, &frac_part, num->n_scale); - fdigit = bc_num2long (frac_part); - bc_int2num (&int_part, fdigit); - bc_sub (frac_part, int_part, &frac_part, 0); - if (o_base <= 16) - (*out_char) (ref_str[fdigit]); - else { - bc_out_long (fdigit, max_o_digit->n_len, pre_space, out_char); - pre_space = 1; - } - bc_multiply (t_num, base, &t_num, 0); - } - bc_free_num (&t_num); - } - - /* Clean up. */ - bc_free_num (&int_part); - bc_free_num (&frac_part); - bc_free_num (&base); - bc_free_num (&cur_dig); - bc_free_num (&max_o_digit); - } -} -/* Convert a number NUM to a long. The function returns only the integer - part of the number. For numbers that are too large to represent as - a long, this function returns a zero. This can be detected by checking - the NUM for zero after having a zero returned. */ - -long -bc_num2long (num) - bc_num num; -{ - long val; - char *nptr; - int index; - - /* Extract the int value, ignore the fraction. */ - val = 0; - nptr = num->n_value; - for (index=num->n_len; (index>0) && (val<=(LONG_MAX/BASE)); index--) - val = val*BASE + *nptr++; - - /* Check for overflow. If overflow, return zero. */ - if (index>0) val = 0; - if (val < 0) val = 0; - - /* Return the value. */ - if (num->n_sign == PLUS) - return (val); - else - return (-val); -} - - -/* Convert an integer VAL to a bc number NUM. */ - -void -bc_int2num (num, val) - bc_num *num; - int val; -{ - char buffer[30]; - char *bptr, *vptr; - int ix = 1; - char neg = 0; - - /* Sign. */ - if (val < 0) - { - neg = 1; - val = -val; - } - - /* Get things going. */ - bptr = buffer; - *bptr++ = val % BASE; - val = val / BASE; - - /* Extract remaining digits. */ - while (val != 0) - { - *bptr++ = val % BASE; - val = val / BASE; - ix++; /* Count the digits. */ - } - - /* Make the number. */ - bc_free_num (num); - *num = bc_new_num (ix, 0); - if (neg) (*num)->n_sign = MINUS; - - /* Assign the digits. */ - vptr = (*num)->n_value; - while (ix-- > 0) - *vptr++ = *--bptr; -} - -/* Convert a numbers to a string. Base 10 only.*/ - -char -*num2str (num) - bc_num num; -{ - char *str, *sptr; - char *nptr; - int index, signch; - - /* Allocate the string memory. */ - signch = ( num->n_sign == PLUS ? 0 : 1 ); /* Number of sign chars. */ - if (num->n_scale > 0) - str = (char *) malloc (num->n_len + num->n_scale + 2 + signch); - else - str = (char *) malloc (num->n_len + 1 + signch); - if (str == NULL) bc_out_of_memory(); - - /* The negative sign if needed. */ - sptr = str; - if (signch) *sptr++ = '-'; - - /* Load the whole number. */ - nptr = num->n_value; - for (index=num->n_len; index>0; index--) - *sptr++ = BCD_CHAR(*nptr++); - - /* Now the fraction. */ - if (num->n_scale > 0) - { - *sptr++ = '.'; - for (index=0; index<num->n_scale; index++) - *sptr++ = BCD_CHAR(*nptr++); - } - - /* Terminate the string and return it! */ - *sptr = '\0'; - return (str); -} -/* Convert strings to bc numbers. Base 10 only.*/ - -void -bc_str2num (num, str, scale) - bc_num *num; - char *str; - int scale; -{ - int digits, strscale; - char *ptr, *nptr; - char zero_int; - - /* Prepare num. */ - bc_free_num (num); - - /* Check for valid number and count digits. */ - ptr = str; - digits = 0; - strscale = 0; - zero_int = FALSE; - if ( (*ptr == '+') || (*ptr == '-')) ptr++; /* Sign */ - while (*ptr == '0') ptr++; /* Skip leading zeros. */ - while (isdigit((int)*ptr)) ptr++, digits++; /* digits */ - if (*ptr == '.') ptr++; /* decimal point */ - while (isdigit((int)*ptr)) ptr++, strscale++; /* digits */ - if ((*ptr != '\0') || (digits+strscale == 0)) - { - *num = bc_copy_num (_zero_); - return; - } - - /* Adjust numbers and allocate storage and initialize fields. */ - strscale = MIN(strscale, scale); - if (digits == 0) - { - zero_int = TRUE; - digits = 1; - } - *num = bc_new_num (digits, strscale); - - /* Build the whole number. */ - ptr = str; - if (*ptr == '-') - { - (*num)->n_sign = MINUS; - ptr++; - } - else - { - (*num)->n_sign = PLUS; - if (*ptr == '+') ptr++; - } - while (*ptr == '0') ptr++; /* Skip leading zeros. */ - nptr = (*num)->n_value; - if (zero_int) - { - *nptr++ = 0; - digits = 0; - } - for (;digits > 0; digits--) - *nptr++ = CH_VAL(*ptr++); - - - /* Build the fractional part. */ - if (strscale > 0) - { - ptr++; /* skip the decimal point! */ - for (;strscale > 0; strscale--) - *nptr++ = CH_VAL(*ptr++); - } -} - -/* pn prints the number NUM in base 10. */ - -static void -out_char (int c) -{ - putchar(c); -} - - -void -pn (num) - bc_num num; -{ - bc_out_num (num, 10, out_char, 0); - out_char ('\n'); -} - - -/* pv prints a character array as if it was a string of bcd digits. */ -void -pv (name, num, len) - char *name; - unsigned char *num; - int len; -{ - int i; - printf ("%s=", name); - for (i=0; i<len; i++) printf ("%c",BCD_CHAR(num[i])); - printf ("\n"); -} diff --git a/contrib/bc/lib/testmul.c b/contrib/bc/lib/testmul.c deleted file mode 100644 index f7044d6..0000000 --- a/contrib/bc/lib/testmul.c +++ /dev/null @@ -1,244 +0,0 @@ -/* compute the crossover for recursive and simple multiplication */ - -#include <stdio.h> -#include <time.h> -#include "number.h" -#ifndef VARARGS -#include <stdarg.h> -#else -#include <varargs.h> -#endif - -/* from number.c ... */ -extern int mul_base_digits; -/* extern int mul_small_digits; */ -extern bc_num _one_; - -/* global variables */ -int test_n = 1000; -int test_time = 30 * CLOCKS_PER_SEC; /* 30 seconds */ - -/* Other things for number.c. */ -int std_only; - -void -out_of_memory() -{ - fprintf (stderr, "Fatal error: Out of memory for malloc.\n"); - exit (1); -} - -/* Runtime error will print a message and stop the machine. */ - -#ifndef VARARGS -#ifdef __STDC__ -void -rt_error (char *mesg, ...) -#else -void -rt_error (mesg) - char *mesg; -#endif -#else -void -rt_error (mesg, va_alist) - char *mesg; -#endif -{ - va_list args; - char error_mesg [255]; - -#ifndef VARARGS - va_start (args, mesg); -#else - va_start (args); -#endif - vsprintf (error_mesg, mesg, args); - va_end (args); - - fprintf (stderr, "Runtime error: %s\n", error_mesg); -} - -/* A runtime warning tells of some action taken by the processor that - may change the program execution but was not enough of a problem - to stop the execution. */ - -#ifndef VARARGS -#ifdef __STDC__ -void -rt_warn (char *mesg, ...) -#else -void -rt_warn (mesg) - char *mesg; -#endif -#else -void -rt_warn (mesg, va_alist) - char *mesg; -#endif -{ - va_list args; - char error_mesg [255]; - -#ifndef VARARGS - va_start (args, mesg); -#else - va_start (args); -#endif - vsprintf (error_mesg, mesg, args); - va_end (args); - - fprintf (stderr, "Runtime warning: %s\n", error_mesg); -} - -void -out_char (int ch) -{ - putchar (ch); -} - -/* Time stuff !!! */ - -int -timeit ( bc_num a, bc_num b, int *n) -{ - clock_t first; - int i, res; - bc_num c; - - bc_init_num (&c); - first = clock(); - *n = 0; - do { - for (i=0; i<test_n; i++) - bc_multiply(a,b,&c,0); - *n += test_n; - res = (int) (clock() - first); - } while (res < test_time); - return res; -} - -int debug = 0; /* Print debugging messages? */ - -int main (int argc, char **argv) -{ - bc_num ten, num, expo, big; - - int min, max, mid; - -#if 0 - int smallsize; -#endif - - int n1, n2; - clock_t t1, t2; - float permul1, permul2; - - /* args? */ - if (argc > 1) - if (strcmp (argv[1], "-d") == 0) - debug = 1; - - bc_init_numbers(); - bc_init_num (&ten); - bc_init_num (&num); - bc_init_num (&expo); - bc_init_num (&big); - bc_int2num (&ten, 10); - - if (debug) - fprintf (stderr, "Timings are for %d multiplies\n" - "Minimum time is %d seconds\n", test_n, - test_time/CLOCKS_PER_SEC); - - /* Two of the same size */ - min = 10; - max = 500; - - if (debug) - fprintf (stderr, "Testing numbers of the same length.\n"); - - while (min < max) { - mid = (min+max)/2; - if (debug) fprintf (stderr,"Checking %d...\n", mid); - - bc_int2num (&expo, mid); - bc_raise (ten, expo, &num, 0); - bc_sub (num, _one_, &num, 0); - - mul_base_digits = 2*mid+1; - t1 = timeit (num, num, &n1); - permul1 = (float)t1/(float)n1; - - mul_base_digits = 2*mid-1; - t2 = timeit (num, num, &n2); - permul2 = (float)t2/(float)n2; - - if (permul1 < permul2) - min = mid+1; - else - max = mid-1; - - if (debug) { - fprintf (stderr, "n1 = %d :: n2 = %d\n", n1, n2); - fprintf (stderr, "p1 = %f :: p2 = %f\n", permul1, permul2); - } - } - - if (debug) - fprintf (stderr, "Base digits crossover at %d digits\n", min); - printf ("#define MUL_BASE_DIGITS %d\n", 2*min); - - -#if 0 - mul_base_digits = min; - - /* Small one times a big one. */ - - smallsize = min/2; - bc_int2num (&expo, smallsize); - bc_raise (ten, expo, &big, 0); - bc_sub (num, _one_, &big, 0); - - min = min / 2; - max = 500; - - if (debug) - fprintf (stderr, "Testing numbers of the different length.\n"); - - while (min < max) { - mid = (min+max)/2; - if (debug) fprintf (stderr, "Checking %d...\n", mid); - - bc_int2num (&expo, mid-smallsize); - bc_raise (ten, expo, &num, 0); - bc_sub (num, _one_, &num, 0); - - mul_small_digits = mid+1; - t1 = timeit (big, num, &n1); - permul1 = (float)t1/(float)n1; - - mul_small_digits = mid-1; - t2 = timeit (big, num, &n2); - permul2 = (float)t2/(float)n2; - - if (permul1 < permul2) - min = mid+1; - else - max = mid-1; - - if (debug) { - fprintf (stderr, "n1 = %d :: n2 = %d\n", n1, n2); - fprintf (stderr, "p1 = %f :: p2 = %f\n", permul1, permul2); - } - } - - if (debug) - fprintf (stderr, "Non equal digits crossover at %d total digits\n", min); - printf ("#define MUL_SMALL_DIGITS = %d\n", min); - -#endif - - return 0; -} diff --git a/contrib/bc/lib/vfprintf.c b/contrib/bc/lib/vfprintf.c deleted file mode 100644 index ad53d0c..0000000 --- a/contrib/bc/lib/vfprintf.c +++ /dev/null @@ -1,31 +0,0 @@ -/* vfprintf.c -- this was provided for minix. It may not - work on any other system. */ - -#include "config.h" -#ifndef HAVE_VPRINTF -#ifndef HAVE_DOPRINT - #error need vfprintf() or doprint() -#else - -#ifdef HAVE_LIB_H -#include <lib.h> -#endif -#ifdef HAVE_STDARG_H -#include <stdarg.h> -#endif -#ifdef HAVE_STDIO_H -#include <stdio.h> -#endif - -int vfprintf(file, format, argp) -FILE *file; -_CONST char *format; -va_list argp; -{ - _doprintf(file, format, argp); - if (testflag(file, PERPRINTF)) fflush(file); - return 0; -} - -#endif /* HAVE_DOPRINT */ -#endif /* !HAVE_VFPRINTF */ diff --git a/contrib/bc/missing b/contrib/bc/missing deleted file mode 100755 index e4b838c..0000000 --- a/contrib/bc/missing +++ /dev/null @@ -1,134 +0,0 @@ -#! /bin/sh -# Common stub for a few missing GNU programs while installing. -# Copyright (C) 1996, 1997 Free Software Foundation, Inc. -# Franc,ois Pinard <pinard@iro.umontreal.ca>, 1996. - -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation; either version 2, or (at your option) -# any later version. - -# This program 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 General Public License for more details. - -# You should have received a copy of the GNU General Public License -# along with this program; if not, write to the Free Software -# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA -# 02111-1307, USA. - -if test $# -eq 0; then - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 -fi - -case "$1" in - - -h|--h|--he|--hel|--help) - echo "\ -$0 [OPTION]... PROGRAM [ARGUMENT]... - -Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an -error status if there is no known handling for PROGRAM. - -Options: - -h, --help display this help and exit - -v, --version output version information and exit - -Supported PROGRAM values: - aclocal touch file \`aclocal.m4' - autoconf touch file \`configure' - autoheader touch file \`config.h.in' - automake touch all \`Makefile.in' files - bison touch file \`y.tab.c' - makeinfo touch the output file - yacc touch file \`y.tab.c'" - ;; - - -v|--v|--ve|--ver|--vers|--versi|--versio|--version) - echo "missing - GNU libit 0.0" - ;; - - -*) - echo 1>&2 "$0: Unknown \`$1' option" - echo 1>&2 "Try \`$0 --help' for more information" - exit 1 - ;; - - aclocal) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. It should be needed only if - you modified \`acinclude.m4' or \`configure.in'. You might want - to install the \`Automake' and \`Perl' packages. Grab them from - any GNU archive site." - touch aclocal.m4 - ;; - - autoconf) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. It should be needed only if - you modified \`configure.in'. You might want to install the - \`Autoconf' and \`GNU m4' packages. Grab them from any GNU - archive site." - touch configure - ;; - - autoheader) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. It should be needed only if - you modified \`acconfig.h' or \`configure.in'. You might want - to install the \`Autoconf' and \`GNU m4' packages. Grab them - from any GNU archive site." - touch config.h.in - ;; - - automake) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. It should be needed only if - you modified \`Makefile.am', \`acinclude.m4' or \`configure.in'. - You might want to install the \`Automake' and \`Perl' packages. - Grab them from any GNU archive site." - find . -type f -name Makefile.am -print \ - | sed 's/^\(.*\).am$/touch \1.in/' \ - | sh - ;; - - bison|yacc) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. It should be needed only if - your modified any \`.y' file. For being effective, your - modifications might require the \`Bison' package. Grab it from - any GNU archive site." - touch y.tab.c - ;; - - makeinfo) - echo 1>&2 "\ -WARNING: \`$1' is missing on your system. It should be needed only if - you modified a \`.texi' or \`.texinfo' file, or any other file - indirectly affecting the aspect of the manual. The spurious - call might also be the consequence of using a buggy \`make' (AIX, - DU, IRIX). You might want to install the \`Texinfo' package or - the \`GNU make' package. Grab either from any GNU archive site." - file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` - if test -z "$file"; then - file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` - file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` - fi - touch $file - ;; - - *) - echo 1>&2 "\ -WARNING: \`$1' is needed, and you do not seem to have it handy on your - system. You might have modified some files without having the - proper tools for further handling them. Check the \`README' file, - it often tells you about the needed prerequirements for installing - this package. You may also peek at any GNU archive site, in case - some other package would contain this missing \`$1' program." - exit 1 - ;; -esac - -exit 0 diff --git a/contrib/bc/mkinstalldirs b/contrib/bc/mkinstalldirs deleted file mode 100755 index cc8783e..0000000 --- a/contrib/bc/mkinstalldirs +++ /dev/null @@ -1,36 +0,0 @@ -#! /bin/sh -# mkinstalldirs --- make directory hierarchy -# Author: Noah Friedman <friedman@prep.ai.mit.edu> -# Created: 1993-05-16 -# Last modified: 1994-03-25 -# Public domain - -errstatus=0 - -for file in ${1+"$@"} ; do - set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` - shift - - pathcomp= - for d in ${1+"$@"} ; do - pathcomp="$pathcomp$d" - case "$pathcomp" in - -* ) pathcomp=./$pathcomp ;; - esac - - if test ! -d "$pathcomp"; then - echo "mkdir $pathcomp" 1>&2 - mkdir "$pathcomp" > /dev/null 2>&1 || lasterr=$? - fi - - if test ! -d "$pathcomp"; then - errstatus=$lasterr - fi - - pathcomp="$pathcomp/" - done -done - -exit $errstatus - -# mkinstalldirs ends here diff --git a/contrib/bc/stamp-h.in b/contrib/bc/stamp-h.in deleted file mode 100644 index 9788f70..0000000 --- a/contrib/bc/stamp-h.in +++ /dev/null @@ -1 +0,0 @@ -timestamp |