diff options
Diffstat (limited to 'man1p/bc.1p')
-rw-r--r-- | man1p/bc.1p | 1354 |
1 files changed, 1354 insertions, 0 deletions
diff --git a/man1p/bc.1p b/man1p/bc.1p new file mode 100644 index 000000000..a2860dc69 --- /dev/null +++ b/man1p/bc.1p @@ -0,0 +1,1354 @@ +.\" Copyright (c) 2001-2003 The Open Group, All Rights Reserved +.TH "BC" P 2003 "IEEE/The Open Group" "POSIX Programmer's Manual" +.\" bc +.SH NAME +bc \- arbitrary-precision arithmetic language +.SH SYNOPSIS +.LP +\fBbc\fP \fB[\fP\fB-l\fP\fB] [\fP\fIfile\fP \fB...\fP\fB]\fP +.SH DESCRIPTION +.LP +The \fIbc\fP utility shall implement an arbitrary precision calculator. +It shall take input from any files given, then read +from the standard input. If the standard input and standard output +to \fIbc\fP are attached to a terminal, the invocation of +\fIbc\fP shall be considered to be \fIinteractive\fP, causing behavioral +constraints described in the following sections. +.SH OPTIONS +.LP +The \fIbc\fP utility shall conform to the Base Definitions volume +of IEEE\ Std\ 1003.1-2001, Section 12.2, Utility Syntax Guidelines. +.LP +The following option shall be supported: +.TP 7 +\fB-l\fP +(The letter ell.) Define the math functions and initialize \fIscale\fP +to 20, instead of the default zero; see the EXTENDED +DESCRIPTION section. +.sp +.SH OPERANDS +.LP +The following operand shall be supported: +.TP 7 +\fIfile\fP +A pathname of a text file containing \fIbc\fP program statements. +After all \fIfile\fPs have been read, \fIbc\fP shall read +the standard input. +.sp +.SH STDIN +.LP +See the INPUT FILES section. +.SH INPUT FILES +.LP +Input files shall be text files containing a sequence of comments, +statements, and function definitions that shall be executed +as they are read. +.SH ENVIRONMENT VARIABLES +.LP +The following environment variables shall affect the execution of +\fIbc\fP: +.TP 7 +\fILANG\fP +Provide a default value for the internationalization variables that +are unset or null. (See the Base Definitions volume of +IEEE\ Std\ 1003.1-2001, Section 8.2, Internationalization Variables +for +the precedence of internationalization variables used to determine +the values of locale categories.) +.TP 7 +\fILC_ALL\fP +If set to a non-empty string value, override the values of all the +other internationalization variables. +.TP 7 +\fILC_CTYPE\fP +Determine the locale for the interpretation of sequences of bytes +of text data as characters (for example, single-byte as +opposed to multi-byte characters in arguments and input files). +.TP 7 +\fILC_MESSAGES\fP +Determine the locale that should be used to affect the format and +contents of diagnostic messages written to standard +error. +.TP 7 +\fINLSPATH\fP +Determine the location of message catalogs for the processing of \fILC_MESSAGES +\&.\fP +.sp +.SH ASYNCHRONOUS EVENTS +.LP +Default. +.SH STDOUT +.LP +The output of the \fIbc\fP utility shall be controlled by the program +read, and consist of zero or more lines containing the +value of all executed expressions without assignments. The radix and +precision of the output shall be controlled by the values of +the \fBobase\fP and \fBscale\fP variables; see the EXTENDED DESCRIPTION +section. +.SH STDERR +.LP +The standard error shall be used only for diagnostic messages. +.SH OUTPUT FILES +.LP +None. +.SH EXTENDED DESCRIPTION +.SS Grammar +.LP +The grammar in this section and the lexical conventions in the following +section shall together describe the syntax for +\fIbc\fP programs. The general conventions for this style of grammar +are described in \fIGrammar Conventions\fP . A valid program can be +represented as the non-terminal symbol +\fBprogram\fP in the grammar. This formal syntax shall take precedence +over the text syntax description. +.sp +.RS +.nf + +\fB%token EOF NEWLINE STRING LETTER NUMBER +.sp + +%token MUL_OP +/* '*', '/', '%' */ +.sp + +%token ASSIGN_OP +/* '=', '+=', '-=', '*=', '/=', '%=', '^=' */ +.sp + +%token REL_OP +/* '==', '<=', '>=', '!=', '<', '>' */ +.sp + +%token INCR_DECR +/* '++', '--' */ +.sp + +%token Define Break Quit Length +/* 'define', 'break', 'quit', 'length' */ +.sp + +%token Return For If While Sqrt +/* 'return', 'for', 'if', 'while', 'sqrt' */ +.sp + +%token Scale Ibase Obase Auto +/* 'scale', 'ibase', 'obase', 'auto' */ +.sp + +%start program +.sp + +%% +.sp + +program : EOF + | input_item program + ; +.sp + +input_item : semicolon_list NEWLINE + | function + ; +.sp + +semicolon_list : /* empty */ + | statement + | semicolon_list ';' statement + | semicolon_list ';' + ; +.sp + +statement_list : /* empty */ + | statement + | statement_list NEWLINE + | statement_list NEWLINE statement + | statement_list ';' + | statement_list ';' statement + ; +.sp + +statement : expression + | STRING + | Break + | Quit + | Return + | Return '(' return_expression ')' + | For '(' expression ';' + relational_expression ';' + expression ')' statement + | If '(' relational_expression ')' statement + | While '(' relational_expression ')' statement + | '{' statement_list '}' + ; +.sp + +function : Define LETTER '(' opt_parameter_list ')' + '{' NEWLINE opt_auto_define_list + statement_list '}' + ; +.sp + +opt_parameter_list : /* empty */ + | parameter_list + ; +.sp + +parameter_list : LETTER + | define_list ',' LETTER + ; +.sp + +opt_auto_define_list : /* empty */ + | Auto define_list NEWLINE + | Auto define_list ';' + ; +.sp + +define_list : LETTER + | LETTER '[' ']' + | define_list ',' LETTER + | define_list ',' LETTER '[' ']' + ; +.sp + +opt_argument_list : /* empty */ + | argument_list + ; +.sp + +argument_list : expression + | LETTER '[' ']' ',' argument_list + ; +.sp + +relational_expression : expression + | expression REL_OP expression + ; +.sp + +return_expression : /* empty */ + | expression + ; +.sp + +expression : named_expression + | NUMBER + | '(' expression ')' + | LETTER '(' opt_argument_list ')' + | '-' expression + | expression '+' expression + | expression '-' expression + | expression MUL_OP expression + | expression '^' expression + | INCR_DECR named_expression + | named_expression INCR_DECR + | named_expression ASSIGN_OP expression + | Length '(' expression ')' + | Sqrt '(' expression ')' + | Scale '(' expression ')' + ; +.sp + +named_expression : LETTER + | LETTER '[' expression ']' + | Scale + | Ibase + | Obase + ; +\fP +.fi +.RE +.SS Lexical Conventions in bc +.LP +The lexical conventions for \fIbc\fP programs, with respect to the +preceding grammar, shall be as follows: +.IP " 1." 4 +Except as noted, \fIbc\fP shall recognize the longest possible token +or delimiter beginning at a given point. +.LP +.IP " 2." 4 +A comment shall consist of any characters beginning with the two adjacent +characters \fB"/*"\fP and terminated by the next +occurrence of the two adjacent characters \fB"*/"\fP . Comments shall +have no effect except to delimit lexical tokens. +.LP +.IP " 3." 4 +The <newline> shall be recognized as the token \fBNEWLINE\fP. +.LP +.IP " 4." 4 +The token \fBSTRING\fP shall represent a string constant; it shall +consist of any characters beginning with the double-quote +character ( \fB' )'\fP and terminated by another occurrence of the +double-quote character. The value of the string is the +sequence of all characters between, but not including, the two double-quote +characters. All characters shall be taken literally +from the input, and there is no way to specify a string containing +a double-quote character. The length of the value of each string +shall be limited to {BC_STRING_MAX} bytes. +.LP +.IP " 5." 4 +A <blank> shall have no effect except as an ordinary character if +it appears within a \fBSTRING\fP token, or to delimit a +lexical token other than \fBSTRING\fP. +.LP +.IP " 6." 4 +The combination of a backslash character immediately followed by a +<newline> shall have no effect other than to delimit +lexical tokens with the following exceptions: +.RS +.IP " *" 3 +It shall be interpreted as the character sequence \fB"\\<newline>"\fP +in \fBSTRING\fP tokens. +.LP +.IP " *" 3 +It shall be ignored as part of a multi-line \fBNUMBER\fP token. +.LP +.RE +.LP +.IP " 7." 4 +The token \fBNUMBER\fP shall represent a numeric constant. It shall +be recognized by the following grammar: +.sp +.RS +.nf + +\fBNUMBER : integer + | '.' integer + | integer '.' + | integer '.' integer + ; +.sp + +integer : digit + | integer digit + ; +.sp + +digit : 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 + | 8 | 9 | A | B | C | D | E | F + ; +\fP +.fi +.RE +.LP +.IP " 8." 4 +The value of a \fBNUMBER\fP token shall be interpreted as a numeral +in the base specified by the value of the internal register +\fBibase\fP (described below). Each of the \fBdigit\fP characters +shall have the value from 0 to 15 in the order listed here, and +the period character shall represent the radix point. The behavior +is undefined if digits greater than or equal to the value of +\fBibase\fP appear in the token. However, note the exception for single-digit +values being assigned to \fBibase\fP and +\fBobase\fP themselves, in Operations in bc . +.LP +.IP " 9." 4 +The following keywords shall be recognized as tokens: +.TS C +center; lw(15) lw(15) lw(15) lw(15) lw(15). +T{ +\fB +.br +auto +.br +break +.br +define +.br +\fP +T} T{ +\fB +.br +ibase +.br +if +.br +for +.br +\fP +T} T{ +\fB +.br +length +.br +obase +.br +quit +.br +\fP +T} T{ +\fB +.br +return +.br +scale +.br +sqrt +.br +\fP +T} T{ +\fB +.br +while +.br +\fP +T} +.TE +.LP +.IP "10." 4 +Any of the following characters occurring anywhere except within a +keyword shall be recognized as the token \fBLETTER\fP: +.sp +.RS +.nf + +\fBa b c d e f g h i j k l m n o p q r s t u v w x y z +\fP +.fi +.RE +.LP +.IP "11." 4 +The following single-character and two-character sequences shall be +recognized as the token \fBASSIGN_OP\fP: +.sp +.RS +.nf + +\fB= += -= *= /= %= ^= +\fP +.fi +.RE +.LP +.IP "12." 4 +If an \fB'='\fP character, as the beginning of a token, is followed +by a \fB'-'\fP character with no intervening +delimiter, the behavior is undefined. +.LP +.IP "13." 4 +The following single-characters shall be recognized as the token \fBMUL_OP\fP: +.sp +.RS +.nf + +\fB* / % +\fP +.fi +.RE +.LP +.IP "14." 4 +The following single-character and two-character sequences shall be +recognized as the token \fBREL_OP\fP: +.sp +.RS +.nf + +\fB== <= >= != < > +\fP +.fi +.RE +.LP +.IP "15." 4 +The following two-character sequences shall be recognized as the token +\fBINCR_DECR\fP: +.sp +.RS +.nf + +\fB++ -- +\fP +.fi +.RE +.LP +.IP "16." 4 +The following single characters shall be recognized as tokens whose +names are the character: +.sp +.RS +.nf + +\fB<newline> ( ) , + - ; [ ] ^ { } +\fP +.fi +.RE +.LP +.IP "17." 4 +The token \fBEOF\fP is returned when the end of input is reached. +.LP +.SS Operations in bc +.LP +There are three kinds of identifiers: ordinary identifiers, array +identifiers, and function identifiers. All three types consist +of single lowercase letters. Array identifiers shall be followed by +square brackets ( \fB"[]"\fP ). An array subscript is +required except in an argument or auto list. Arrays are singly dimensioned +and can contain up to {BC_DIM_MAX} elements. Indexing +shall begin at zero so an array is indexed from 0 to {BC_DIM_MAX}-1. +Subscripts shall be truncated to integers. The application +shall ensure that function identifiers are followed by parentheses, +possibly enclosing arguments. The three types of identifiers do +not conflict. +.LP +The following table summarizes the rules for precedence and associativity +of all operators. Operators on the same line shall +have the same precedence; rows are in order of decreasing precedence. +.sp +.ce 1 +\fBTable: Operators in \fIbc\fP\fP +.TS C +center; l l. +\fBOperator\fP \fBAssociativity\fP +++, -- N/A +unary - N/A +^ Right to left +*, /, % Left to right ++, binary - Left to right +=, +=, -=, *=, /=, %=, ^= Right to left +==, <=, >=, !=, <, > None +.TE +.LP +Each expression or named expression has a \fIscale\fP, which is the +number of decimal digits that shall be maintained as the +fractional portion of the expression. +.LP +\fINamed expressions\fP are places where values are stored. Named +expressions shall be valid on the left side of an assignment. +The value of a named expression shall be the value stored in the place +named. Simple identifiers and array elements are named +expressions; they have an initial value of zero and an initial scale +of zero. +.LP +The internal registers \fBscale\fP, \fBibase\fP, and \fBobase\fP are +all named expressions. The scale of an expression +consisting of the name of one of these registers shall be zero; values +assigned to any of these registers are truncated to +integers. The \fBscale\fP register shall contain a global value used +in computing the scale of expressions (as described below). +The value of the register \fBscale\fP is limited to 0 <= \fBscale\fP +<= {BC_SCALE_MAX} and shall have a default value of +zero. The \fBibase\fP and \fBobase\fP registers are the input and +output number radix, respectively. The value of \fBibase\fP +shall be limited to: +.sp +.RS +.nf + +\fB2 <= ibase <= 16 +\fP +.fi +.RE +.LP +The value of \fBobase\fP shall be limited to: +.sp +.RS +.nf + +\fB2 <= obase <= {BC_BASE_MAX} +\fP +.fi +.RE +.LP +When either \fBibase\fP or \fBobase\fP is assigned a single \fBdigit\fP +value from the list in Lexical Conventions in bc , the value shall +be assumed in hexadecimal. (For example, \fBibase\fP=A sets to +base ten, regardless of the current \fBibase\fP value.) Otherwise, +the behavior is undefined when digits greater than or equal to +the value of \fBibase\fP appear in the input. Both \fBibase\fP and +\fBobase\fP shall have initial values of 10. +.LP +Internal computations shall be conducted as if in decimal, regardless +of the input and output bases, to the specified number of +decimal digits. When an exact result is not achieved (for example, +\fBscale\fP=0;\ 3.2/1)\fB,\fP the result shall be +truncated. +.LP +For all values of \fBobase\fP specified by this volume of IEEE\ Std\ 1003.1-2001, +\fIbc\fP shall output numeric values +by performing each of the following steps in order: +.IP " 1." 4 +If the value is less than zero, a hyphen ( \fB'-'\fP ) character shall +be output. +.LP +.IP " 2." 4 +One of the following is output, depending on the numerical value: +.RS +.IP " *" 3 +If the absolute value of the numerical value is greater than or equal +to one, the integer portion of the value shall be output +as a series of digits appropriate to \fBobase\fP (as described below), +most significant digit first. The most significant non-zero +digit shall be output next, followed by each successively less significant +digit. +.LP +.IP " *" 3 +If the absolute value of the numerical value is less than one but +greater than zero and the scale of the numerical value is +greater than zero, it is unspecified whether the character 0 is output. +.LP +.IP " *" 3 +If the numerical value is zero, the character 0 shall be output. +.LP +.RE +.LP +.IP " 3." 4 +If the scale of the value is greater than zero and the numeric value +is not zero, a period character shall be output, followed +by a series of digits appropriate to \fBobase\fP (as described below) +representing the most significant portion of the fractional +part of the value. If \fIs\fP represents the scale of the value being +output, the number of digits output shall be \fIs\fP if +\fBobase\fP is 10, less than or equal to \fIs\fP if \fBobase\fP is +greater than 10, or greater than or equal to \fIs\fP if +\fBobase\fP is less than 10. For \fBobase\fP values other than 10, +this should be the number of digits needed to represent a +precision of 10**\fIs\fP. +.LP +.LP +For \fBobase\fP values from 2 to 16, valid digits are the first \fBobase\fP +of the single characters: +.sp +.RS +.nf + +\fB0 1 2 3 4 5 6 7 8 9 A B C D E F +\fP +.fi +.RE +.LP +which represent the values zero to 15, inclusive, respectively. +.LP +For bases greater than 16, each digit shall be written as a separate +multi-digit decimal number. Each digit except the most +significant fractional digit shall be preceded by a single <space>. +For bases from 17 to 100, \fIbc\fP shall write two-digit +decimal numbers; for bases from 101 to 1000, three-digit decimal strings, +and so on. For example, the decimal number 1024 in base +25 would be written as: +.sp +.RS +.nf + +\fB 01 15 24 +\fP +.fi +.RE +.LP +and in base 125, as: +.sp +.RS +.nf + +\fB 008 024 +\fP +.fi +.RE +.LP +Very large numbers shall be split across lines with 70 characters +per line in the POSIX locale; other locales may split at +different character boundaries. Lines that are continued shall end +with a backslash ( \fB'\\'\fP ). +.LP +A function call shall consist of a function name followed by parentheses +containing a comma-separated list of expressions, which +are the function arguments. A whole array passed as an argument shall +be specified by the array name followed by empty square +brackets. All function arguments shall be passed by value. As a result, +changes made to the formal parameters shall have no effect +on the actual arguments. If the function terminates by executing a +\fBreturn\fP statement, the value of the function shall be the +value of the expression in the parentheses of the \fBreturn\fP statement +or shall be zero if no expression is provided or if there +is no \fBreturn\fP statement. +.LP +The result of \fBsqrt\fP( \fIexpression\fP) shall be the square root +of the expression. The result shall be truncated in the +least significant decimal place. The scale of the result shall be +the scale of the expression or the value of \fBscale\fP, +whichever is larger. +.LP +The result of \fBlength\fP( \fIexpression\fP) shall be the total number +of significant decimal digits in the expression. The +scale of the result shall be zero. +.LP +The result of \fBscale\fP( \fIexpression\fP) shall be the scale of +the expression. The scale of the result shall be zero. +.LP +A numeric constant shall be an expression. The scale shall be the +number of digits that follow the radix point in the input +representing the constant, or zero if no radix point appears. +.LP +The sequence (\ \fIexpression\fP\ ) shall be an expression with the +same value and scale as \fIexpression\fP. The +parentheses can be used to alter the normal precedence. +.LP +The semantics of the unary and binary operators are as follows: +.TP 7 +-\fIexpression\fP +.sp +The result shall be the negative of the \fIexpression\fP. The scale +of the result shall be the scale of \fIexpression\fP. +.sp +.LP +The unary increment and decrement operators shall not modify the scale +of the named expression upon which they operate. The +scale of the result shall be the scale of that named expression. +.TP 7 +++\fInamed-expression\fP +.sp +The named expression shall be incremented by one. The result shall +be the value of the named expression after incrementing. +.TP 7 +--\fInamed-expression\fP +.sp +The named expression shall be decremented by one. The result shall +be the value of the named expression after decrementing. +.TP 7 +\fInamed-expression\fP++ +.sp +The named expression shall be incremented by one. The result shall +be the value of the named expression before incrementing. +.TP 7 +\fInamed-expression\fP-- +.sp +The named expression shall be decremented by one. The result shall +be the value of the named expression before decrementing. +.sp +.LP +The exponentiation operator, circumflex ( \fB'^'\fP ), shall bind +right to left. +.TP 7 +\fIexpression\fP^\fIexpression\fP +.sp +The result shall be the first \fIexpression\fP raised to the power +of the second \fIexpression\fP. If the second expression is +not an integer, the behavior is undefined. If \fIa\fP is the scale +of the left expression and \fIb\fP is the absolute value of +the right expression, the scale of the result shall be: +.sp +.RS +.nf + +\fBif b >= 0 min(a * b, max(scale, a)) if b < 0 scale +\fP +.fi +.RE +.sp +The multiplicative operators ( \fB'*'\fP , \fB'/'\fP , \fB'%'\fP ) +shall bind left to right. +.TP 7 +\fIexpression\fP*\fIexpression\fP +.sp +The result shall be the product of the two expressions. If \fIa\fP +and \fIb\fP are the scales of the two expressions, then the +scale of the result shall be: +.sp +.RS +.nf + +\fBmin(a+b,max(scale,a,b)) +\fP +.fi +.RE +.TP 7 +\fIexpression\fP/\fIexpression\fP +.sp +The result shall be the quotient of the two expressions. The scale +of the result shall be the value of \fBscale\fP. +.TP 7 +\fIexpression\fP%\fIexpression\fP +.sp +For expressions \fIa\fP and \fIb\fP, \fIa\fP% \fIb\fP shall be evaluated +equivalent to the steps: +.RS +.IP " 1." 4 +Compute \fIa\fP/ \fIb\fP to current scale. +.LP +.IP " 2." 4 +Use the result to compute: +.sp +.RS +.nf + +\fBa - (a / b) * b +\fP +.fi +.RE +.LP +to scale: +.sp +.RS +.nf + +\fBmax(scale + scale(b), scale(a)) +\fP +.fi +.RE +.LP +.RE +The scale of the result shall be: +.sp +.RS +.nf + +\fBmax(scale + scale(b), scale(a)) +\fP +.fi +.RE +.LP +When \fBscale\fP is zero, the \fB'%'\fP operator is the mathematical +remainder operator. +.sp +.LP +The additive operators ( \fB'+'\fP , \fB'-'\fP ) shall bind left to +right. +.TP 7 +\fIexpression\fP+\fIexpression\fP +.sp +The result shall be the sum of the two expressions. The scale of the +result shall be the maximum of the scales of the +expressions. +.TP 7 +\fIexpression\fP-\fIexpression\fP +.sp +The result shall be the difference of the two expressions. The scale +of the result shall be the maximum of the scales of the +expressions. +.sp +.LP +The assignment operators ( \fB'='\fP , \fB"+="\fP , \fB"-="\fP , \fB"*="\fP +, \fB"/="\fP , \fB"%="\fP , +\fB"^="\fP ) shall bind right to left. +.TP 7 +\fInamed-expression\fP=\fIexpression\fP +.sp +This expression shall result in assigning the value of the expression +on the right to the named expression on the left. The scale +of both the named expression and the result shall be the scale of +\fIexpression\fP. +.sp +.LP +The compound assignment forms: +.sp +.RS +.nf + +\fInamed-expression\fP \fB<\fP\fIoperator\fP\fB>=\fP \fIexpression\fP +.fi +.RE +.LP +shall be equivalent to: +.sp +.RS +.nf + +\fInamed-expression\fP\fB=\fP\fInamed-expression\fP \fB<\fP\fIoperator\fP\fB>\fP \fIexpression\fP +.fi +.RE +.LP +except that the \fInamed-expression\fP shall be evaluated only once. +.LP +Unlike all other operators, the relational operators ( \fB'<'\fP , +\fB'>'\fP , \fB"<="\fP , \fB">="\fP , +\fB"=="\fP , \fB"!="\fP ) shall be only valid as the object of an +\fBif\fP, \fBwhile\fP, or inside a \fBfor\fP +statement. +.TP 7 +\fIexpression1\fP<\fIexpression2\fP +.sp +The relation shall be true if the value of \fIexpression1\fP is strictly +less than the value of \fIexpression2\fP. +.TP 7 +\fIexpression1\fP>\fIexpression2\fP +.sp +The relation shall be true if the value of \fIexpression1\fP is strictly +greater than the value of \fIexpression2\fP. +.TP 7 +\fIexpression1\fP<=\fIexpression2\fP +.sp +The relation shall be true if the value of \fIexpression1\fP is less +than or equal to the value of \fIexpression2\fP. +.TP 7 +\fIexpression1\fP>=\fIexpression2\fP +.sp +The relation shall be true if the value of \fIexpression1\fP is greater +than or equal to the value of \fIexpression2\fP. +.TP 7 +\fIexpression1\fP==\fIexpression2\fP +.sp +The relation shall be true if the values of \fIexpression1\fP and +\fIexpression2\fP are equal. +.TP 7 +\fIexpression1\fP!=\fIexpression2\fP +.sp +The relation shall be true if the values of \fIexpression1\fP and +\fIexpression2\fP are unequal. +.sp +.LP +There are only two storage classes in \fIbc\fP: global and automatic +(local). Only identifiers that are local to a function +need be declared with the \fBauto\fP command. The arguments to a function +shall be local to the function. All other identifiers +are assumed to be global and available to all functions. All identifiers, +global and local, have initial values of zero. +Identifiers declared as auto shall be allocated on entry to the function +and released on returning from the function. They +therefore do not retain values between function calls. Auto arrays +shall be specified by the array name followed by empty square +brackets. On entry to a function, the old values of the names that +appear as parameters and as automatic variables shall be pushed +onto a stack. Until the function returns, reference to these names +shall refer only to the new values. +.LP +References to any of these names from other functions that are called +from this function also refer to the new value until one +of those functions uses the same name for a local variable. +.LP +When a statement is an expression, unless the main operator is an +assignment, execution of the statement shall write the value +of the expression followed by a <newline>. +.LP +When a statement is a string, execution of the statement shall write +the value of the string. +.LP +Statements separated by semicolons or <newline>s shall be executed +sequentially. In an interactive invocation of +\fIbc\fP, each time a <newline> is read that satisfies the grammatical +production: +.sp +.RS +.nf + +\fBinput_item : semicolon_list NEWLINE +\fP +.fi +.RE +.LP +the sequential list of statements making up the \fBsemicolon_list\fP +shall be executed immediately and any output produced by +that execution shall be written without any delay due to buffering. +.LP +In an \fBif\fP statement ( \fBif\fP( \fIrelation\fP) \fIstatement\fP), +the \fIstatement\fP shall be executed if the +relation is true. +.LP +The \fBwhile\fP statement ( \fBwhile\fP( \fIrelation\fP) \fIstatement\fP) +implements a loop in which the \fIrelation\fP is +tested; each time the \fIrelation\fP is true, the \fIstatement\fP +shall be executed and the \fIrelation\fP retested. When the +\fIrelation\fP is false, execution shall resume after \fIstatement\fP. +.LP +A \fBfor\fP statement( \fBfor\fP( \fIexpression\fP; \fIrelation\fP; +\fIexpression\fP) \fIstatement\fP) shall be the same +as: +.sp +.RS +.nf + +\fIfirst-expression\fP\fBwhile (\fP\fIrelation\fP\fB) { + \fP \fIstatement\fP \fB \fP \fIlast-expression\fP\fB} +\fP +.fi +.RE +The application shall ensure that all three expressions are present. +.LP +The \fBbreak\fP statement shall cause termination of a \fBfor\fP or +\fBwhile\fP statement. +.LP +The \fBauto\fP statement ( \fBauto\fP \fIidentifier\fP \fB[\fP, \fIidentifier\fP +\fB]\fP ...) shall cause the values of +the identifiers to be pushed down. The identifiers can be ordinary +identifiers or array identifiers. Array identifiers shall be +specified by following the array name by empty square brackets. The +application shall ensure that the \fBauto\fP statement is the +first statement in a function definition. +.LP +A \fBdefine\fP statement: +.sp +.RS +.nf + +\fBdefine\fP \fILETTER\fP \fB(\fP \fIopt_parameter_list\fP \fB) { + \fP \fIopt_auto_define_list\fP \fB \fP \fIstatement_list\fP\fB} +\fP +.fi +.RE +.LP +defines a function named \fBLETTER\fP. If a function named \fBLETTER\fP +was previously defined, the \fBdefine\fP statement +shall replace the previous definition. The expression: +.sp +.RS +.nf + +\fBLETTER (\fP \fIopt_argument_list\fP \fB) +\fP +.fi +.RE +.LP +shall invoke the function named \fBLETTER\fP. The behavior is undefined +if the number of arguments in the invocation does not +match the number of parameters in the definition. Functions shall +be defined before they are invoked. A function shall be +considered to be defined within its own body, so recursive calls are +valid. The values of numeric constants within a function shall +be interpreted in the base specified by the value of the \fBibase\fP +register when the function is invoked. +.LP +The \fBreturn\fP statements ( \fBreturn\fP and \fBreturn\fP( \fIexpression\fP)) +shall cause termination of a function, +popping of its auto variables, and specification of the result of +the function. The first form shall be equivalent to +\fBreturn\fP(0). The value and scale of the result returned by the +function shall be the value and scale of the expression +returned. +.LP +The \fBquit\fP statement ( \fBquit\fP) shall stop execution of a \fIbc\fP +program at the point where the statement occurs in +the input, even if it occurs in a function definition, or in an \fBif\fP, +\fBfor\fP, or \fBwhile\fP statement. +.LP +The following functions shall be defined when the \fB-l\fP option +is specified: +.TP 7 +\fBs\fP(\ \fIexpression\fP\ ) +.sp +Sine of argument in radians. +.TP 7 +\fBc\fP(\ \fIexpression\fP\ ) +.sp +Cosine of argument in radians. +.TP 7 +\fBa\fP(\ \fIexpression\fP\ ) +.sp +Arctangent of argument. +.TP 7 +\fBl\fP(\ \fIexpression\fP\ ) +.sp +Natural logarithm of argument. +.TP 7 +\fBe\fP(\ \fIexpression\fP\ ) +.sp +Exponential function of argument. +.TP 7 +\fBj\fP(\ \fIexpression\fP,\ \fIexpression\fP\ ) +.sp +Bessel function of integer order. +.sp +.LP +The scale of the result returned by these functions shall be the value +of the \fBscale\fP register at the time the function is +invoked. The value of the \fBscale\fP register after these functions +have completed their execution shall be the same value it had +upon invocation. The behavior is undefined if any of these functions +is invoked with an argument outside the domain of the +mathematical function. +.SH EXIT STATUS +.LP +The following exit values shall be returned: +.TP 7 +0 +All input files were processed successfully. +.TP 7 +\fIunspecified\fP +An error occurred. +.sp +.SH CONSEQUENCES OF ERRORS +.LP +If any \fIfile\fP operand is specified and the named file cannot be +accessed, \fIbc\fP shall write a diagnostic message to +standard error and terminate without any further action. +.LP +In an interactive invocation of \fIbc\fP, the utility should print +an error message and recover following any error in the +input. In a non-interactive invocation of \fIbc\fP, invalid input +causes undefined behavior. +.LP +\fIThe following sections are informative.\fP +.SH APPLICATION USAGE +.LP +Automatic variables in \fIbc\fP do not work in exactly the same way +as in either C or PL/1. +.LP +For historical reasons, the exit status from \fIbc\fP cannot be relied +upon to indicate that an error has occurred. Returning +zero after an error is possible. Therefore, \fIbc\fP should be used +primarily by interactive users (who can react to error +messages) or by application programs that can somehow validate the +answers returned as not including error messages. +.LP +The \fIbc\fP utility always uses the period ( \fB'.'\fP ) character +to represent a radix point, regardless of any +decimal-point character specified as part of the current locale. In +languages like C or \fIawk\fP, the period character is used in program +source, so it can be portable and unambiguous, +while the locale-specific character is used in input and output. Because +there is no distinction between source and input in +\fIbc\fP, this arrangement would not be possible. Using the locale-specific +character in \fIbc\fP's input would introduce +ambiguities into the language; consider the following example in a +locale with a comma as the decimal-point character: +.sp +.RS +.nf + +\fBdefine f(a,b) { + ... +} +\&... +.sp + +f(1,2,3) +\fP +.fi +.RE +.LP +Because of such ambiguities, the period character is used in input. +Having input follow different conventions from output would +be confusing in either pipeline usage or interactive usage, so the +period is also used in output. +.SH EXAMPLES +.LP +In the shell, the following assigns an approximation of the first +ten digits of \fB'pi'\fP to the variable \fIx\fP: +.sp +.RS +.nf + +\fBx=$(printf "%s\\n" 'scale = 10; 104348/33215' | bc) +\fP +.fi +.RE +.LP +The following \fIbc\fP program prints the same approximation of \fB'pi'\fP +, with a +label, to standard output: +.sp +.RS +.nf + +\fBscale = 10 +"pi equals " +104348 / 33215 +\fP +.fi +.RE +.LP +The following defines a function to compute an approximate value of +the exponential function (note that such a function is +predefined if the \fB-l\fP option is specified): +.sp +.RS +.nf + +\fBscale = 20 +define e(x){ + auto a, b, c, i, s + a = 1 + b = 1 + s = 1 + for (i = 1; 1 == 1; i++){ + a = a*x + b = b*i + c = a/b + if (c == 0) { + return(s) + } + s = s+c + } +} +\fP +.fi +.RE +.LP +The following prints approximate values of the exponential function +of the first ten integers: +.sp +.RS +.nf + +\fBfor (i = 1; i <= 10; ++i) { + e(i) +} +\fP +.fi +.RE +.SH RATIONALE +.LP +The \fIbc\fP utility is implemented historically as a front-end processor +for \fIdc\fP; \fIdc\fP was not selected to be part +of this volume of IEEE\ Std\ 1003.1-2001 because \fIbc\fP was thought +to have a more intuitive programmatic interface. +Current implementations that implement \fIbc\fP using \fIdc\fP are +expected to be compliant. +.LP +The exit status for error conditions has been left unspecified for +several reasons: +.IP " *" 3 +The \fIbc\fP utility is used in both interactive and non-interactive +situations. Different exit codes may be appropriate for +the two uses. +.LP +.IP " *" 3 +It is unclear when a non-zero exit should be given; divide-by-zero, +undefined functions, and syntax errors are all +possibilities. +.LP +.IP " *" 3 +It is not clear what utility the exit status has. +.LP +.IP " *" 3 +In the 4.3 BSD, System V, and Ninth Edition implementations, \fIbc\fP +works in conjunction with \fIdc\fP. The \fIdc\fP +utility is the parent, \fIbc\fP is the child. This was done to cleanly +terminate \fIbc\fP if \fIdc\fP aborted. +.LP +.LP +The decision to have \fIbc\fP exit upon encountering an inaccessible +input file is based on the belief that \fIbc\fP +\fIfile1\fP \fIfile2\fP is used most often when at least \fIfile1\fP +contains data/function declarations/initializations. Having +\fIbc\fP continue with prerequisite files missing is probably not +useful. There is no implication in the CONSEQUENCES OF ERRORS +section that \fIbc\fP must check all its files for accessibility before +opening any of them. +.LP +There was considerable debate on the appropriateness of the language +accepted by \fIbc\fP. Several reviewers preferred to see +either a pure subset of the C language or some changes to make the +language more compatible with C. While the \fIbc\fP language +has some obvious similarities to C, it has never claimed to be compatible +with any version of C. An interpreter for a subset of C +might be a very worthwhile utility, and it could potentially make +\fIbc\fP obsolete. However, no such utility is known in +historical practice, and it was not within the scope of this volume +of IEEE\ Std\ 1003.1-2001 to define such a language and +utility. If and when they are defined, it may be appropriate to include +them in a future version of IEEE\ Std\ 1003.1. This +left the following alternatives: +.IP " 1." 4 +Exclude any calculator language from this volume of IEEE\ Std\ 1003.1-2001. +.LP +The consensus of the standard developers was that a simple programmatic +calculator language is very useful for both applications +and interactive users. The only arguments for excluding any calculator +were that it would become obsolete if and when a +C-compatible one emerged, or that the absence would encourage the +development of such a C-compatible one. These arguments did not +sufficiently address the needs of current application writers. +.LP +.IP " 2." 4 +Standardize the historical \fIdc\fP, possibly with minor modifications. +.LP +The consensus of the standard developers was that \fIdc\fP is a fundamentally +less usable language and that that would be far +too severe a penalty for avoiding the issue of being similar to but +incompatible with C. +.LP +.IP " 3." 4 +Standardize the historical \fIbc\fP, possibly with minor modifications. +.LP +This was the approach taken. Most of the proponents of changing the +language would not have been satisfied until most or all of +the incompatibilities with C were resolved. Since most of the changes +considered most desirable would break historical applications +and require significant modification to historical implementations, +almost no modifications were made. The one significant +modification that was made was the replacement of the historical \fIbc\fP +assignment operators \fB"=+"\fP , and so on, with the +more modern \fB"+="\fP , and so on. The older versions are considered +to be fundamentally flawed because of the lexical +ambiguity in uses like \fIa\fP=-1. +.LP +In order to permit implementations to deal with backwards-compatibility +as they see fit, the behavior of this one ambiguous +construct was made undefined. (At least three implementations have +been known to support this change already, so the degree of +change involved should not be great.) +.LP +.LP +The \fB'%'\fP operator is the mathematical remainder operator when +\fBscale\fP is zero. The behavior of this operator for +other values of \fBscale\fP is from historical implementations of +\fIbc\fP, and has been maintained for the sake of historical +applications despite its non-intuitive nature. +.LP +Historical implementations permit setting \fBibase\fP and \fBobase\fP +to a broader range of values. This includes values less +than 2, which were not seen as sufficiently useful to standardize. +These implementations do not interpret input properly for values +of \fBibase\fP that are greater than 16. This is because numeric constants +are recognized syntactically, rather than lexically, as +described in this volume of IEEE\ Std\ 1003.1-2001. They are built +from lexical tokens of single hexadecimal digits and +periods. Since <blank>s between tokens are not visible at the syntactic +level, it is not possible to recognize the +multi-digit "digits" used in the higher bases properly. The ability +to recognize input in these bases was not considered useful +enough to require modifying these implementations. Note that the recognition +of numeric constants at the syntactic level is not a +problem with conformance to this volume of IEEE\ Std\ 1003.1-2001, +as it does not impact the behavior of conforming +applications (and correct \fIbc\fP programs). Historical implementations +also accept input with all of the digits \fB'0'\fP - +\fB'9'\fP and \fB'A'\fP - \fB'F'\fP regardless of the value of \fBibase\fP; +since digits with value greater than or equal +to \fBibase\fP are not really appropriate, the behavior when they +appear is undefined, except for the common case of: +.sp +.RS +.nf + +\fBibase=8; + /* Process in octal base. */ +\&... +ibase=A + /* Restore decimal base. */ +\fP +.fi +.RE +.LP +In some historical implementations, if the expression to be written +is an uninitialized array element, a leading <space> +and/or up to four leading 0 characters may be output before the character +zero. This behavior is considered a bug; it is unlikely +that any currently conforming application relies on: +.sp +.RS +.nf + +\fBecho 'b[3]' | bc +\fP +.fi +.RE +.LP +returning 00000 rather than 0. +.LP +Exact calculation of the number of fractional digits to output for +a given value in a base other than 10 can be computationally +expensive. Historical implementations use a faster approximation, +and this is permitted. Note that the requirements apply only to +values of \fBobase\fP that this volume of IEEE\ Std\ 1003.1-2001 requires +implementations to support (in particular, not +to 1, 0, or negative bases, if an implementation supports them as +an extension). +.LP +Historical implementations of \fIbc\fP did not allow array parameters +to be passed as the last parameter to a function. New +implementations are encouraged to remove this restriction even though +it is not required by the grammar. +.SH FUTURE DIRECTIONS +.LP +None. +.SH SEE ALSO +.LP +\fIGrammar Conventions\fP , \fIawk\fP +.SH COPYRIGHT +Portions of this text are reprinted and reproduced in electronic form +from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology +-- Portable Operating System Interface (POSIX), The Open Group Base +Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of +Electrical and Electronics Engineers, Inc and The Open Group. In the +event of any discrepancy between this version and the original IEEE and +The Open Group Standard, the original IEEE and The Open Group Standard +is the referee document. The original Standard can be obtained online at +http://www.opengroup.org/unix/online.html . |