home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-12-07 | 41.4 KB | 1,057 lines |
-
-
-
- bc(1) bc(1)
-
-
- NNAAMMEE
- bc - An arbitrary precision calculator language
-
- SSYYNNTTAAXX
- bbcc [ --llwwss ] [ _f_i_l_e _._._. ]
-
- VVEERRSSIIOONN
- This man page documents GNU bc version 1.02.
-
- DDEESSCCRRIIPPTTIIOONN
- bbcc 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. bbcc starts by processing code from
- all the files listed on the command line in the order
- listed. After all files have been processed, bbcc reads
- from the standard input. All code is executed as it is
- read. (If a file contains a command to halt the proces-
- sor, bbcc will never read from the standard input.)
-
- This version of bbcc contains several extensions beyond tra-
- ditional bbcc 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.
-
- OOPPTTIIOONNSS
- -l Define the standard math library.
-
- -w Give warnings for extensions to POSIX bbcc.
-
- -s Process exactly the POSIX bbcc language.
-
- NNUUMMBBEERRSS
- The most basic element in bbcc 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.
- 1935.000 has a length of 7 and a scale of 3.
-
- VVAARRIIAABBLLEESS
- Numbers are stored in two types of variables, simple vari-
- ables and arrays. Both simple variables and array vari-
- ables are named. Names begin with a letter followed by
-
-
-
- . 1
-
-
-
-
-
- bc(1) bc(1)
-
-
- any number of letters, digits and underscores. All let-
- ters must be lower case. (Full alpha-numeric names are an
- extension. In POSIX bbcc 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, ssccaallee,, iibbaassee,, oobbaassee,, and
- llaasstt. ssccaallee defines how some operations use digits after
- the decimal point. The default value of ssccaallee is 0. iibbaassee
- and oobbaassee define the conversion base for input and output
- numbers. The default for both input and output is base
- 10. llaasstt (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.
-
- CCOOMMMMEENNTTSS
- Comments in bbcc start with the characters //** and end with
- the characters **//. 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.
-
- EEXXPPRREESSSSIIOONNSS
- The numbers are manipulated by expressions and statements.
- Since the language was designed to be interactive, state-
- ments 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. bbcc converts con-
- stants into internal decimal numbers using the current
- input base, specified by the variable iibbaassee. (There is an
- exception in functions.) The legal values of iibbaassee are 2
- through 16 (F). Assigning a value outside this range to
- iibbaassee 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 iibbaassee. (i.e. A = 10.) For
- multi-digit numbers, bbcc changes all input digits greater
- or equal to ibase to the value of iibbaassee-1. This makes the
- number FFFFFF always be the largest 3 digit number of the
- input base.
-
- Full expressions are similar to many other high level lan-
- guages. 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.
-
-
-
- . 2
-
-
-
-
-
- bc(1) bc(1)
-
-
- This is derived from the scale of original numbers, the
- operation performed and in many cases, the value of the
- variable ssccaallee. Legal values of the variable ssccaallee are 0
- to the maximum number representable by a C integer.
-
- In the following descriptions of legal expressions, "expr"
- refers to a complete expression and "var" refers to a sim-
- ple or an array variable. A simple variable is just a
- _n_a_m_e
- and an array variable is specified as
- _n_a_m_e[_e_x_p_r]
- Unless specifically mentioned the scale of the result is
- the maximum scale of the expressions involved.
-
- - expr The result is the negation of the expression.
-
- ++ var The variable is incremented by one and the new
- value is the result of the expression.
-
- -- var The variable is decremented by one and the new
- value is the result of the expression.
-
- var ++ The result of the expression is the value of the
- variable and then the variable is incremented by
- one.
-
- var -- The result of the expression is the value of the
- variable and then the variable is decremented by
- one.
-
- expr + expr
- The result of the expression is the sum of the two
- expressions.
-
- expr - expr
- The result of the expression is the difference of
- the two expressions.
-
- expr * expr
- The result of the expression is the product of the
- two expressions.
-
- 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 ssccaallee.
-
- 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 ssccaallee digits. That
- result is used to compute a-(a/b)*b to the scale of
- the maximum of ssccaallee+scale(b) and scale(a). If
- ssccaallee is set to zero and both expressions are
-
-
-
- . 3
-
-
-
-
-
- bc(1) bc(1)
-
-
- integers this expression is the integer remainder
- function.
-
- 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 ssccaallee 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 ssccaallee and the scale of the first expres-
- sion. (e.g. scale(a^b) = min(scale(a)*b, max(
- ssccaallee,, scale(a))).) It should be noted that expr^0
- will always return the value of 1.
-
- ( expr )
- This alters the standard precedence to force the
- evaluation of the expression.
-
- var = expr
- The variable is assigned the value of the expres-
- sion.
-
- 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.
-
- 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
-
- expr1 < expr2
- The result is 1 if expr1 is strictly less than
- expr2.
-
- expr1 <= expr2
- The result is 1 if expr1 is less than or equal to
- expr2.
-
- expr1 > expr2
- The result is 1 if expr1 is strictly greater than
- expr2.
-
- expr1 >= expr2
- The result is 1 if expr1 is greater than or equal
-
-
-
- . 4
-
-
-
-
-
- bc(1) bc(1)
-
-
- to expr2.
-
- expr1 == expr2
- The result is 1 if expr1 is equal to expr2.
-
- expr1 != expr2
- The result is 1 if expr1 is not equal to expr2.
-
- Boolean operations are also legal. (POSIX bbcc does NOT
- have boolean operations). The result of all boolean opera-
- tions are 0 and 1 (for false and true) as in relational
- expressions. The boolean operators are:
-
- !expr The result is 1 if expr is 0.
-
- expr && expr
- The result is 1 if both expressions are non-zero.
-
- expr || expr
- The result is 1 if either expression is non-zero.
-
- The expression precedence is as follows: (lowest to high-
- est)
- || 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
-
- This precedence was chosen so that POSIX compliant bbcc pro-
- grams 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:
- a = 3 < 5
-
- Most C programmers would assume this would assign the
- result of "3 < 5" (the value 1) to the variable "a". What
- this does in bbcc 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.
-
- There are a few more special expressions that are provided
- in bbcc. These have to do with user defined functions and
- standard functions. They all appear as
- "_n_a_m_e((_p_a_r_a_m_e_t_e_r_s))". See the section on functions for user
- defined functions. The standard functions are:
-
-
-
-
- . 5
-
-
-
-
-
- bc(1) bc(1)
-
-
- length ( expression )
- The value of the length function is the number of
- significant digits in the expression.
-
- 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 pre-
- viously 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 iibbaassee for the conver-
- sion base.
-
- scale ( expression )
- The value of the scale function is the number of
- digits after the decimal point in the expression.
-
- 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.
-
- SSTTAATTEEMMEENNTTSS
- Statements (as in most algebraic languages) provide the
- sequencing of expression evaluation. In bbcc 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 bbcc. In fact, both a semicolon and a new-
- line are used as statement separators. An improperly
- placed newline will cause a syntax error. Because new-
- lines 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 bbcc 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 bbcc statements and what they do:
- (Things enclosed in brackets ([]) are optional parts of
- the statement.)
-
- expression
- This statement does one of two things. If the
- expression starts with "<variable> <assignment>
- ...", it is considered to be an assignment state-
- ment. If the expression is not an assignment
- statement, the expression is evaluated and printed
- to the output. After the number is printed, a new-
- line is printed. For example, "a=1" is an assign-
- ment statement and "(a=1)" is an expression that
- has an embedded assignment. All numbers that are
-
-
-
- . 6
-
-
-
-
-
- bc(1) bc(1)
-
-
- printed are printed in the base specified by the
- variable oobbaassee. The legal values for oobbaassee 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, bbcc
- 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 num-
- ber of characters required to represent the base
- ten value of "obase-1". Since numbers are of arbi-
- trary 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 charac-
- ters printed per line is 70. Due to the interac-
- tive nature of bbcc printing a number cause the side
- effect of assigning the printed value the the spe-
- cial variable llaasstt. This allows the user to recover
- the last value printed without having to retype the
- expression that printed the number. Assigning to
- llaasstt 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 llaasstt.
-
- string The string is printed to the output. Strings start
- with a double quote character and contain all char-
- acters until the next double quote character. All
- characters are take literally, including any new-
- line. No newline character is printed after the
- string.
-
- pprriinntt 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
- the the variable llaasstt. Strings in the print state-
- ment are printed to the output and may contain spe-
- cial characters. Special characters start with the
- backslash character (\). The special characters
- recognized by bbcc are "b" (bell), "f" (form feed),
- "n" (newline), "r" (carriage return), "t" (tab),
- and "\" (backslash). Any other character following
- the backslash will be ignored. This still does not
- allow the double quote character to be part of any
- string.
-
- { statement_list }
- This is the compound statement. It allows multiple
- statements to be grouped together for execution.
-
-
-
- . 7
-
-
-
-
-
- bc(1) bc(1)
-
-
- iiff ( expression ) tthheenn statement1 [eellssee statement2]
- The if statement evaluates the expression and exe-
- cutes 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.)
-
- wwhhiillee ( 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 expres-
- sion value or the execution of a break statement.
-
- ffoorr ( [expression1] ; [expression2] ; [expression3] )
- statement
- The for statement controls repeated execution of
- the statement. Expression1 is evaluated before the
- loop. Expression2 is evaluated before each execu-
- tion 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 expres-
- sion2. (The optional expressions are an extension.
- POSIX bbcc requires all three expressions.) The fol-
- lowing is equivalent code for the for statement:
- expression1;
- while (expression2) {
- statement;
- expression3;
- }
-
- bbrreeaakk This statement causes a forced exit of the most
- recent enclosing while statement or for statement.
-
- ccoonnttiinnuuee
- The continue statement (an extension) causes the
- most recent enclosing for statement to start the
- next iteration.
-
- hhaalltt The halt statement (an extension) is an executed
- statement that causes the bbcc processor to quit only
- when it is executed. For example, "if (0 == 1)
- halt" will not cause bbcc to terminate because the
- halt is not executed.
-
- rreettuurrnn Return the value 0 from a function. (See the sec-
- tion on functions.)
-
-
-
- . 8
-
-
-
-
-
- bc(1) bc(1)
-
-
- rreettuurrnn ( expression )
- Return the value of the expression from a function.
- (See the section on functions.)
-
- PPSSEEUUDDOO SSTTAATTEEMMEENNTTSS
- These statements are not statements in the traditional
- sense. They are not executed statements. Their function
- is performed at "compile" time.
-
- lliimmiittss Print the local limits enforced by the local ver-
- sion of bbcc. This is an extension.
-
- qquuiitt When the quit statement is read, the bbcc processor
- is terminated, regardless of where the quit state-
- ment is found. For example, "if (0 == 1) quit"
- will cause bbcc to terminate.
-
- wwaarrrraannttyy
- Print a longer warranty notice. This is an exten-
- sion.
-
- FFUUNNCCTTIIOONNSS
- Functions provide a method of defining a computation that
- can be executed later. Functions in bbcc 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 def-
- inition 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:
- ddeeffiinnee _n_a_m_e (( _p_a_r_a_m_e_t_e_r_s )) {{ _n_e_w_l_i_n_e
- _a_u_t_o___l_i_s_t _s_t_a_t_e_m_e_n_t___l_i_s_t }}
- A function call is just an expression of the form
- "_n_a_m_e((_p_a_r_a_m_e_t_e_r_s))".
-
- 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 defini-
- tion by the notation "_n_a_m_e[[]]". In the function call,
- actual parameters are full expressions for number parame-
- ters. 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 _a_u_t_o___l_i_s_t_i_s _a_n _o_p_t_i_o_n_a_l _l_i_s_t _o_f _v_a_r_i_a_b_l_e_s _t_h_a_t _a_r_e _f_o_r
- _"_l_o_c_a_l_" _u_s_e_. _T_h_e _s_y_n_t_a_x _o_f _t_h_e _a_u_t_o _l_i_s_t _(_i_f _p_r_e_s_e_n_t_) _i_s
- _"aauuttoo _n_a_m_e, ... ;". (The semicolon is optional.) Each
-
-
-
- . 9
-
-
-
-
-
- bc(1) bc(1)
-
-
- _n_a_m_e is the name of an auto variable. Arrays may be spec-
- ified 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 ini-
- tialized 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 pro-
- vided in the function call. Auto variables are different
- than traditional local variables in the fact that if func-
- tion 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, bbcc sup-
- ports recursive functions.
-
- The function body is a list of bbcc 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, "rreettuurrnn", returns the
- value 0 to the calling expression. The second form,
- "rreettuurrnn (( _e_x_p_r_e_s_s_i_o_n ))", computes the value of the expres-
- sion and returns that value to the calling expression.
- There is an implied "rreettuurrnn ((00))" at the end of every func-
- tion. This allows a function to terminate and return 0
- without an explicit return statement.
-
- Functions also change the usage of the variable iibbaassee.
- All constants in the function body will be converted using
- the value of iibbaassee at the time of the function call.
- Changes of iibbaassee will be ignored during the execution of
- the function except for the standard function rreeaadd, which
- will always use the current value of iibbaassee for conversion
- of numbers.
-
- MMAATTHH LLIIBBRRAARRYY
- If bbcc is invoked with the --ll 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 fol-
- lowing functions:
-
- s (_x) The sine of x in radians.
-
- c (_x) The cosine of x in radians.
-
- a (_x) The arctangent of x.
-
- l (_x) The natural logarithm of x.
-
- e (_x) The exponential function of raising e to the value
- x.
-
-
-
- . 10
-
-
-
-
-
- bc(1) bc(1)
-
-
- j (_n_,_x)
- The bessel function of integer order n of x.
-
- EEXXAAMMPPLLEESS
- In /bin/sh, the following will assign the value of "pi"
- to the shell variable ppii.
-
- ppii==$$((eecchhoo ""ssccaallee==1100;; 44**aa((11))"" || bbcc --ll))
-
-
- The following is the definition of the exponential func-
- tion used in the math library. This function is written
- in POSIX bbcc.
-
- ssccaallee == 2200
-
- //** UUsseess tthhee ffaacctt tthhaatt ee^^xx == ((ee^^((xx//22))))^^22
- WWhheenn xx iiss ssmmaallll eennoouugghh,, wwee uussee tthhee sseerriieess::
- ee^^xx == 11 ++ xx ++ xx^^22//22!! ++ xx^^33//33!! ++ ......
- **//
-
- ddeeffiinnee ee((xx)) {{
- aauuttoo aa,, dd,, ee,, ff,, ii,, mm,, vv,, zz
-
- //** CChheecckk tthhee ssiiggnn ooff xx.. **//
- iiff ((xx<<00)) {{
- mm == 11
- xx == --xx
- }}
-
- //** PPrreeccoonnddiittiioonn xx.. **//
- zz == ssccaallee;;
- ssccaallee == 44 ++ zz ++ ..4444**xx;;
- wwhhiillee ((xx >> 11)) {{
- ff ++== 11;;
- xx //== 22;;
- }}
-
- //** IInniittiiaalliizzee tthhee vvaarriiaabblleess.. **//
- vv == 11++xx
- aa == xx
- dd == 11
-
- ffoorr ((ii==22;; 11;; ii++++)) {{
- ee == ((aa **== xx)) // ((dd **== ii))
- iiff ((ee ==== 00)) {{
- iiff ((ff>>00)) wwhhiillee ((ff----)) vv == vv**vv;;
- ssccaallee == zz
- iiff ((mm)) rreettuurrnn ((11//vv));;
- rreettuurrnn ((vv//11));;
- }}
- vv ++== ee
- }}
- }}
-
-
-
- . 11
-
-
-
-
-
- bc(1) bc(1)
-
-
- The following is code that uses the extended features of
- bbcc 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.
-
- ssccaallee==22
- pprriinntt ""\\nnCChheecckk bbooookk pprrooggrraamm!!\\nn""
- pprriinntt "" RReemmeemmbbeerr,, ddeeppoossiittss aarree nneeggaattiivvee ttrraannssaaccttiioonnss..\\nn""
- pprriinntt "" EExxiitt bbyy aa 00 ttrraannssaaccttiioonn..\\nn\\nn""
-
- pprriinntt ""IInniittiiaall bbaallaannccee?? "";; bbaall == rreeaadd(())
- bbaall //== 11
- pprriinntt ""\\nn""
- wwhhiillee ((11)) {{
- ""ccuurrrreenntt bbaallaannccee == "";; bbaall
- ""ttrraannssaaccttiioonn?? "";; ttrraannss == rreeaadd(())
- iiff ((ttrraannss ==== 00)) bbrreeaakk;;
- bbaall --== ttrraannss
- bbaall //== 11
- }}
- qquuiitt
-
-
- The following is the definition of the recursive factorial
- function.
-
- ddeeffiinnee ff ((xx)) {{
- iiff ((xx <<== 11)) rreettuurrnn ((11));;
- rreettuurrnn ((ff((xx--11)) ** xx));;
- }}
-
-
- DDIIFFFFEERREENNCCEESS
- This version of bbcc was implemented from the POSIX
- P1003.2/D11 draft and contains several differences and
- extensions relative to the draft and traditional implemen-
- tations. It is not implemented in the traditional way
- using _d_c_(_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.
-
- A major source of differences is extensions, where a fea-
- ture is extended to add more functionality and additions,
- where new features are added. The following is the list
- of differences and extensions.
-
- LANG This version does not conform to the POSIX standard
- in the processing of the LANG environment variable
- and all environment variables starting with LC_.
-
-
-
-
- . 12
-
-
-
-
-
- bc(1) bc(1)
-
-
- names Traditional and POSIX bbcc 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, num-
- bers and the underscore character.
-
- Strings
- Strings are not allowed to contain NUL characters.
- POSIX says all characters must be included in
- strings.
-
- last POSIX bbcc does not have a llaasstt variable. Some
- implementations of bbcc use the period (.) in a simi-
- lar way.
-
- comparisons
- POSIX bbcc allows comparisons only in the if state-
- ment, the while statement, and the second expres-
- sion of the for statement. Also, only one rela-
- tional operation is allowed in each of those state-
- ments.
-
- if statement, else clause
- POSIX bbcc does not have an else clause.
-
- for statement
- POSIX bbcc requires all expressions to be present in
- the for statement.
-
- &&, ||, !
- POSIX bbcc does not have the logical operators.
-
- read function
- POSIX bbcc does not have a read function.
-
- print statement
- POSIX bbcc does not have a print statement .
-
- continue statement
- POSIX bbcc does not have a continue statement.
-
- array parameters
- POSIX bbcc does not have array parameters. Other
- implementations of bbcc may have call by value array
- parameters.
-
- =+, =-, =*, =/, =%, =^
- POSIX bbcc does not require these "old style" assign-
- ment operators to be defined. This version may
- allow these "old style" assignments. Use the lim-
- its statement to see if the installed version sup-
- ports them. If it does support the "old style"
- assignment operators, the statement "a =- 1" will
- decrement aa by 1 instead of setting aa to the value
-
-
-
- . 13
-
-
-
-
-
- bc(1) bc(1)
-
-
- -1.
-
- spaces in numbers
- Other implementations of bbcc allow spaces in num-
- bers. 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 bbcc.
-
- errors and execution
- This implementation varies from other implementa-
- tions 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 defini-
- tion, 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 unde-
- fined. 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 state-
- ments. For example,
- a = 1
- b = 2
- has two execution blocks and
- { a = 1
- b = 2 }
- 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.
-
- 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 bbcc 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 ses-
- sion, the SIGINT signal will terminate the entire
- run of bbcc.
-
- LLIIMMIITTSS
- The following are the limits currently in place for this
- bbcc processor. Some of them may have been changed by an
- installation. Use the limits statement to see the actual
- values.
-
-
-
-
- . 14
-
-
-
-
-
- bc(1) bc(1)
-
-
- BC_BASE_MAX
- The maximum output base is currently set at 999.
- The maximum input base is 16.
-
- BC_DIM_MAX
- This is currently an arbitrary limit of 65535 as
- distributed. Your installation may be different.
-
- 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.
-
- BC_STRING_MAX
- The limit on the number of characters in a string
- is INT_MAX characters.
-
- exponent
- The value of the exponent in the raise operation
- (^) is limited to LONG_MAX.
-
- 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.
-
- code size
- Each function and the "main" program are limited to
- 10240 bytes of compiled byte code each. This limit
- (BC_MAX_SEGS) can be easily changed to have more
- than 10 segments of 1024 bytes.
-
- variable names
- The current limit on the number of unique names is
- 32767 for each of simple variables, arrays and
- functions.
-
- FFIILLEESS
- In most installations, bbcc is completely self-contained.
- Where executable size is of importance or the C compiler
- does not deal with very long strings, bbcc will read the
- standard math library from the file
- /usr/local/lib/libmath.b. (The actual location may vary.
- It may be /lib/libmath.b.)
-
- DDIIAAGGNNOOSSTTIICCSS
- If any file on the command line can not be opened, bbcc will
- report that the file is unavailable and terminate. Also,
- there are compile and run time diagnostics that should be
- self-explanatory.
-
- BBUUGGSS
- Error recovery is not very good yet.
-
-
-
- . 15
-
-
-
-
-
- bc(1) bc(1)
-
-
- AAUUTTHHOORR
- Philip A. Nelson
- phil@cs.wwu.edu
-
- AACCKKNNOOWWLLEEDDGGEEMMEENNTTSS
- The author would like to thank Steve Sommars
- (sesv@iwtsf.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.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- . 16
-
-
-