1db555d9aSPeter Avalos.\" $OpenBSD: bc.1,v 1.22 2007/05/31 19:20:07 jmc Exp $ 2f2d37758SMatthew Dillon.\" 3f2d37758SMatthew Dillon.\" Copyright (C) Caldera International Inc. 2001-2002. 4f2d37758SMatthew Dillon.\" All rights reserved. 5f2d37758SMatthew Dillon.\" 6f2d37758SMatthew Dillon.\" Redistribution and use in source and binary forms, with or without 7f2d37758SMatthew Dillon.\" modification, are permitted provided that the following conditions 8f2d37758SMatthew Dillon.\" are met: 9f2d37758SMatthew Dillon.\" 1. Redistributions of source code and documentation must retain the above 10f2d37758SMatthew Dillon.\" copyright notice, this list of conditions and the following disclaimer. 11f2d37758SMatthew Dillon.\" 2. Redistributions in binary form must reproduce the above copyright 12f2d37758SMatthew Dillon.\" notice, this list of conditions and the following disclaimer in the 13f2d37758SMatthew Dillon.\" documentation and/or other materials provided with the distribution. 14f2d37758SMatthew Dillon.\" 3. All advertising materials mentioning features or use of this software 15f2d37758SMatthew Dillon.\" must display the following acknowledgement: 16f2d37758SMatthew Dillon.\" This product includes software developed or owned by Caldera 17f2d37758SMatthew Dillon.\" International, Inc. 18f2d37758SMatthew Dillon.\" 4. Neither the name of Caldera International, Inc. nor the names of other 19f2d37758SMatthew Dillon.\" contributors may be used to endorse or promote products derived from 20f2d37758SMatthew Dillon.\" this software without specific prior written permission. 21f2d37758SMatthew Dillon.\" 22f2d37758SMatthew Dillon.\" USE OF THE SOFTWARE PROVIDED FOR UNDER THIS LICENSE BY CALDERA 23f2d37758SMatthew Dillon.\" INTERNATIONAL, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR 24f2d37758SMatthew Dillon.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 25f2d37758SMatthew Dillon.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26f2d37758SMatthew Dillon.\" IN NO EVENT SHALL CALDERA INTERNATIONAL, INC. BE LIABLE FOR ANY DIRECT, 27f2d37758SMatthew Dillon.\" INDIRECT INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 28f2d37758SMatthew Dillon.\" (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 29f2d37758SMatthew Dillon.\" SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30f2d37758SMatthew Dillon.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 31f2d37758SMatthew Dillon.\" STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 32f2d37758SMatthew Dillon.\" IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 33f2d37758SMatthew Dillon.\" POSSIBILITY OF SUCH DAMAGE. 34f2d37758SMatthew Dillon.\" 35f2d37758SMatthew Dillon.\" @(#)bc.1 6.8 (Berkeley) 8/8/91 36f2d37758SMatthew Dillon.\" 37d3d5dcf2SThomas Nikolajsen.Dd November 14, 2009 38f2d37758SMatthew Dillon.Dt BC 1 391fbe6674SSascha Wildner.Os 40f2d37758SMatthew Dillon.Sh NAME 41f2d37758SMatthew Dillon.Nm bc 42f2d37758SMatthew Dillon.Nd arbitrary-precision arithmetic language and calculator 43f2d37758SMatthew Dillon.Sh SYNOPSIS 449b5a9965SSascha Wildner.Nm 45f2d37758SMatthew Dillon.Op Fl cl 46b6d9cda5SSascha Wildner.Op Fl e Ar expression 47f2d37758SMatthew Dillon.Op Ar file ... 48f2d37758SMatthew Dillon.Sh DESCRIPTION 49f2d37758SMatthew Dillon.Nm 50f2d37758SMatthew Dillonis an interactive processor for a language which resembles 51f2d37758SMatthew DillonC but provides unlimited precision arithmetic. 52b6d9cda5SSascha WildnerIt takes input from any expressions on the command line and 53b6d9cda5SSascha Wildnerany files given, then reads the standard input. 54f2d37758SMatthew Dillon.Pp 55f2d37758SMatthew DillonOptions available: 56f2d37758SMatthew Dillon.Bl -tag -width Ds 57f2d37758SMatthew Dillon.It Fl c 58f2d37758SMatthew Dillon.Nm 59f2d37758SMatthew Dillonis actually a preprocessor for 60f2d37758SMatthew Dillon.Xr dc 1 , 61f2d37758SMatthew Dillonwhich it invokes automatically, unless the 62f2d37758SMatthew Dillon.Fl c 63f2d37758SMatthew Dillon.Pq compile only 64f2d37758SMatthew Dillonoption is present. 65f2d37758SMatthew DillonIn this case the generated 66f2d37758SMatthew Dillon.Xr dc 1 67f2d37758SMatthew Dilloninstructions are sent to the standard output, 68f2d37758SMatthew Dilloninstead of being interpreted by a running 69f2d37758SMatthew Dillon.Xr dc 1 70f2d37758SMatthew Dillonprocess. 71b6d9cda5SSascha Wildner.It Fl e Ar expression 72b6d9cda5SSascha WildnerEvaluate 73b6d9cda5SSascha Wildner.Ar expression . 74b6d9cda5SSascha WildnerIf multiple 75b6d9cda5SSascha Wildner.Fl e 76b6d9cda5SSascha Wildneroptions are specified, they are processed in the order given, 77b6d9cda5SSascha Wildnerseparated by newlines. 78f2d37758SMatthew Dillon.It Fl l 79b6d9cda5SSascha WildnerAllow specification of an arbitrary precision math library. 80b6d9cda5SSascha WildnerThe definitions in the library are available to command line 81b6d9cda5SSascha Wildnerexpressions. 82f2d37758SMatthew Dillon.El 83f2d37758SMatthew Dillon.Pp 84f2d37758SMatthew DillonThe syntax for 85f2d37758SMatthew Dillon.Nm 86f2d37758SMatthew Dillonprograms is as follows: 87f2d37758SMatthew Dillon.Sq L 88f2d37758SMatthew Dillonmeans letter a-z; 89f2d37758SMatthew Dillon.Sq E 90f2d37758SMatthew Dillonmeans expression; 91f2d37758SMatthew Dillon.Sq S 92f2d37758SMatthew Dillonmeans statement. 93f2d37758SMatthew DillonAs a non-portable extension, it is possible to use long names 94f2d37758SMatthew Dillonin addition to single letter names. 95f2d37758SMatthew DillonA long name is a sequence starting with a lowercase letter 96f2d37758SMatthew Dillonfollowed by any number of lowercase letters and digits. 97f2d37758SMatthew DillonThe underscore character 98f2d37758SMatthew Dillon.Pq Sq _ 99f2d37758SMatthew Dilloncounts as a letter. 100f2d37758SMatthew Dillon.Pp 101f2d37758SMatthew DillonComments 102f2d37758SMatthew Dillon.Bd -unfilled -offset indent -compact 103f2d37758SMatthew Dillonare enclosed in /* and */ 104f2d37758SMatthew Dillonare enclosed in # and the next newline 105f2d37758SMatthew Dillon.Ed 106f2d37758SMatthew Dillon.Pp 107f2d37758SMatthew DillonThe newline is not part of the line comment, 108f2d37758SMatthew Dillonwhich in itself is a non-portable extension. 109f2d37758SMatthew Dillon.Pp 110f2d37758SMatthew DillonNames 111f2d37758SMatthew Dillon.Bd -unfilled -offset indent -compact 112f2d37758SMatthew Dillonsimple variables: L 113f2d37758SMatthew Dillonarray elements: L [ E ] 114f2d37758SMatthew DillonThe words `ibase', `obase', and `scale' 115f2d37758SMatthew DillonThe word `last' or a single dot 116f2d37758SMatthew Dillon.Ed 117f2d37758SMatthew Dillon.Pp 118f2d37758SMatthew DillonOther operands 119f2d37758SMatthew Dillon.Bd -unfilled -offset indent -compact 120f2d37758SMatthew Dillonarbitrarily long numbers with optional sign and decimal point 121f2d37758SMatthew Dillon( E ) 122f2d37758SMatthew Dillonsqrt ( E ) 123f2d37758SMatthew Dillonlength ( E ) number of significant decimal digits 124f2d37758SMatthew Dillonscale ( E ) number of digits right of decimal point 125f2d37758SMatthew DillonL ( E , ... , E ) 126f2d37758SMatthew Dillon.Ed 127f2d37758SMatthew Dillon.Pp 128f2d37758SMatthew DillonThe sequence 129f2d37758SMatthew Dillon.Sq \e<newline><whitespace> 130f2d37758SMatthew Dillonis ignored within numbers. 131f2d37758SMatthew Dillon.Pp 132f2d37758SMatthew DillonOperators 133f2d37758SMatthew Dillon.Pp 134f2d37758SMatthew DillonThe following arithmetic and logical operators can be used. 135f2d37758SMatthew DillonThe semantics of the operators is the same as in the C language. 136f2d37758SMatthew DillonThey are listed in order of decreasing precedence. 137f2d37758SMatthew DillonOperators in the same group have the same precedence. 138*cb7e3b3cSJoris Giovannangeli.Bl -column "= += \-= *= /= %= ^=" "Associativity" "multiply, divide, modulus" -offset indent 139f2d37758SMatthew Dillon.It Sy "Operator" Ta Sy "Associativity" Ta Sy "Description" 140f2d37758SMatthew Dillon.It "++ \-\-" Ta "none" Ta "increment, decrement" 141f2d37758SMatthew Dillon.It "\-" Ta "none" Ta "unary minus" 142f2d37758SMatthew Dillon.It "^" Ta "right" Ta "power" 143f2d37758SMatthew Dillon.It "* / %" Ta "left" Ta "multiply, divide, modulus" 144f2d37758SMatthew Dillon.It "+ \-" Ta "left" Ta "plus, minus" 145f2d37758SMatthew Dillon.It "= += -= *= /= %= ^=" Ta "right" Ta "assignment" 146f2d37758SMatthew Dillon.It "== <= >= != < >" Ta "none" Ta "relational" 147f2d37758SMatthew Dillon.It "!" Ta "none" Ta "boolean not" 148f2d37758SMatthew Dillon.It "&&" Ta "left" Ta "boolean and" 149f2d37758SMatthew Dillon.It "||" Ta "left" Ta "boolean or" 150f2d37758SMatthew Dillon.El 151f2d37758SMatthew Dillon.Pp 152f2d37758SMatthew DillonNote the following: 153f2d37758SMatthew Dillon.Bl -bullet -offset indent 154f2d37758SMatthew Dillon.It 155f2d37758SMatthew DillonThe relational operators may appear in any expression. 156f2d37758SMatthew DillonThe 157f2d37758SMatthew Dillon.St -p1003.2 158f2d37758SMatthew Dillonstandard only allows them in the conditional expression of an 159f2d37758SMatthew Dillon.Sq if , 160f2d37758SMatthew Dillon.Sq while 161f2d37758SMatthew Dillonor 162f2d37758SMatthew Dillon.Sq for 163f2d37758SMatthew Dillonstatement. 164f2d37758SMatthew Dillon.It 165f2d37758SMatthew DillonThe relational operators have a lower precedence than the assignment 166f2d37758SMatthew Dillonoperators. 167f2d37758SMatthew DillonThis has the consequence that the expression 168f2d37758SMatthew Dillon.Sy a = b < c 169f2d37758SMatthew Dillonis interpreted as 170f2d37758SMatthew Dillon.Sy (a = b) < c , 171f2d37758SMatthew Dillonwhich is probably not what the programmer intended. 172f2d37758SMatthew Dillon.It 173f2d37758SMatthew DillonIn contrast with the C language, the relational operators all have 174f2d37758SMatthew Dillonthe same precedence, and are non-associative. 175f2d37758SMatthew DillonThe expression 176f2d37758SMatthew Dillon.Sy a < b < c 177f2d37758SMatthew Dillonwill produce a syntax error. 178f2d37758SMatthew Dillon.It 179f2d37758SMatthew DillonThe boolean operators (!, && and ||) are non-portable extensions. 180f2d37758SMatthew Dillon.It 181f2d37758SMatthew DillonThe boolean not 182f2d37758SMatthew Dillon(!) operator has much lower precedence than the same operator in the 183f2d37758SMatthew DillonC language. 184f2d37758SMatthew DillonThis has the consequence that the expression 185f2d37758SMatthew Dillon.Sy !a < b 186f2d37758SMatthew Dillonis interpreted as 187f2d37758SMatthew Dillon.Sy !(a < b) . 188f2d37758SMatthew DillonPrudent programmers use parentheses when writing expressions involving 189f2d37758SMatthew Dillonboolean operators. 190f2d37758SMatthew Dillon.El 191f2d37758SMatthew Dillon.Pp 192f2d37758SMatthew DillonStatements 193f2d37758SMatthew Dillon.Bd -unfilled -offset indent -compact 194f2d37758SMatthew DillonE 195f2d37758SMatthew Dillon{ S ; ... ; S } 196f2d37758SMatthew Dillonif ( E ) S 197f2d37758SMatthew Dillonif ( E ) S else S 198f2d37758SMatthew Dillonwhile ( E ) S 199f2d37758SMatthew Dillonfor ( E ; E ; E ) S 200f2d37758SMatthew Dillonnull statement 201f2d37758SMatthew Dillonbreak 202f2d37758SMatthew Dilloncontinue 203f2d37758SMatthew Dillonquit 204f2d37758SMatthew Dillona string of characters, enclosed in double quotes 205f2d37758SMatthew Dillonprint E ,..., E 206f2d37758SMatthew Dillon.Ed 207f2d37758SMatthew Dillon.Pp 2088a1d8d65SSascha WildnerA string may contain any character, except a double quote. 209f2d37758SMatthew DillonThe if statement with an else branch is a non-portable extension. 210f2d37758SMatthew DillonAll three E's in a for statement may be empty. 211f2d37758SMatthew DillonThis is a non-portable extension. 212f2d37758SMatthew DillonThe continue and print statements are also non-portable extensions. 213f2d37758SMatthew Dillon.Pp 214f2d37758SMatthew DillonThe print statement takes a list of comma-separated expressions. 215f2d37758SMatthew DillonEach expression in the list is evaluated and the computed 216f2d37758SMatthew Dillonvalue is printed and assigned to the variable `last'. 217f2d37758SMatthew DillonNo trailing newline is printed. 218f2d37758SMatthew DillonThe expression may also be a string enclosed in double quotes. 219f2d37758SMatthew DillonWithin these strings the following escape sequences may be used: 220f2d37758SMatthew Dillon.Sq \ea 221f2d37758SMatthew Dillonfor bell (alert), 222f2d37758SMatthew Dillon.Sq \eb 223f2d37758SMatthew Dillonfor backspace, 224f2d37758SMatthew Dillon.Sq \ef 225f2d37758SMatthew Dillonfor formfeed, 226f2d37758SMatthew Dillon.Sq \en 227f2d37758SMatthew Dillonfor newline, 228f2d37758SMatthew Dillon.Sq \er 229f2d37758SMatthew Dillonfor carriage return, 230f2d37758SMatthew Dillon.Sq \et 231f2d37758SMatthew Dillonfor tab, 232f2d37758SMatthew Dillon.Sq \eq 233f2d37758SMatthew Dillonfor double quote and 234f2d37758SMatthew Dillon.Sq \e\e 235f2d37758SMatthew Dillonfor backslash. 236f2d37758SMatthew DillonAny other character following a backslash will be ignored. 237f2d37758SMatthew DillonStrings will not be assigned to `last'. 238f2d37758SMatthew Dillon.Pp 239f2d37758SMatthew DillonFunction definitions 240f2d37758SMatthew Dillon.Bd -unfilled -offset indent 241f2d37758SMatthew Dillondefine L ( L ,..., L ) { 242f2d37758SMatthew Dillon auto L, ... , L 243f2d37758SMatthew Dillon S; ... S 244f2d37758SMatthew Dillon return ( E ) 245f2d37758SMatthew Dillon} 246f2d37758SMatthew Dillon.Ed 247f2d37758SMatthew Dillon.Pp 248f2d37758SMatthew DillonAs a non-portable extension, the opening brace of the define statement 249f2d37758SMatthew Dillonmay appear on the next line. 250f2d37758SMatthew DillonThe return statement may also appear in the following forms: 251f2d37758SMatthew Dillon.Bd -unfilled -offset indent 252f2d37758SMatthew Dillonreturn 253f2d37758SMatthew Dillonreturn () 254f2d37758SMatthew Dillonreturn E 255f2d37758SMatthew Dillon.Ed 256f2d37758SMatthew Dillon.Pp 257f2d37758SMatthew DillonThe first two are equivalent to the statement 258f2d37758SMatthew Dillon.Dq return 0 . 259f2d37758SMatthew DillonThe last form is a non-portable extension. 260f2d37758SMatthew DillonNot specifying a return statement is equivalent to writing 261f2d37758SMatthew Dillon.Dq return (0) . 262f2d37758SMatthew Dillon.Pp 263f2d37758SMatthew DillonFunctions available in the math library, which is loaded by specifying the 264f2d37758SMatthew Dillon.Fl l 265f2d37758SMatthew Dillonflag on the command line 266f2d37758SMatthew Dillon.Pp 267f2d37758SMatthew Dillon.Bl -tag -width j(n,x) -offset indent -compact 268f2d37758SMatthew Dillon.It s(x) 269f2d37758SMatthew Dillonsine 270f2d37758SMatthew Dillon.It c(x) 271f2d37758SMatthew Dilloncosine 272f2d37758SMatthew Dillon.It e(x) 273f2d37758SMatthew Dillonexponential 274f2d37758SMatthew Dillon.It l(x) 275f2d37758SMatthew Dillonlog 276f2d37758SMatthew Dillon.It a(x) 277f2d37758SMatthew Dillonarctangent 278f2d37758SMatthew Dillon.It j(n,x) 279f2d37758SMatthew DillonBessel function 280f2d37758SMatthew Dillon.El 281f2d37758SMatthew Dillon.Pp 282f2d37758SMatthew DillonAll function arguments are passed by value. 283f2d37758SMatthew Dillon.Pp 284f2d37758SMatthew DillonThe value of a statement that is an expression is printed 285f2d37758SMatthew Dillonunless the main operator is an assignment. 286f2d37758SMatthew DillonThe value printed is assigned to the special variable `last'. 287f2d37758SMatthew DillonThis is a non-portable extension. 288f2d37758SMatthew DillonA single dot may be used as a synonym for `last'. 289f2d37758SMatthew DillonEither semicolons or newlines may separate statements. 290f2d37758SMatthew DillonAssignment to 291f2d37758SMatthew Dillon.Ar scale 292f2d37758SMatthew Dilloninfluences the number of digits to be retained on arithmetic 293f2d37758SMatthew Dillonoperations in the manner of 294f2d37758SMatthew Dillon.Xr dc 1 . 295f2d37758SMatthew DillonAssignments to 296f2d37758SMatthew Dillon.Ar ibase 297f2d37758SMatthew Dillonor 298f2d37758SMatthew Dillon.Ar obase 299f2d37758SMatthew Dillonset the input and output number radix respectively. 300f2d37758SMatthew Dillon.Pp 301f2d37758SMatthew DillonThe same letter may be used as an array, a function, 302f2d37758SMatthew Dillonand a simple variable simultaneously. 303f2d37758SMatthew DillonAll variables are global to the program. 304f2d37758SMatthew Dillon`Auto' variables are pushed down during function calls. 305f2d37758SMatthew DillonWhen using arrays as function arguments 306f2d37758SMatthew Dillonor defining them as automatic variables, 307f2d37758SMatthew Dillonempty square brackets must follow the array name. 308f2d37758SMatthew Dillon.Pp 309f2d37758SMatthew DillonFor example 310f2d37758SMatthew Dillon.Bd -literal -offset indent 311f2d37758SMatthew Dillonscale = 20 312f2d37758SMatthew Dillondefine e(x){ 313f2d37758SMatthew Dillon auto a, b, c, i, s 314f2d37758SMatthew Dillon a = 1 315f2d37758SMatthew Dillon b = 1 316f2d37758SMatthew Dillon s = 1 317f2d37758SMatthew Dillon for(i=1; 1==1; i++){ 318f2d37758SMatthew Dillon a = a*x 319f2d37758SMatthew Dillon b = b*i 320f2d37758SMatthew Dillon c = a/b 321f2d37758SMatthew Dillon if(c == 0) return(s) 322f2d37758SMatthew Dillon s = s+c 323f2d37758SMatthew Dillon } 324f2d37758SMatthew Dillon} 325f2d37758SMatthew Dillon.Ed 326f2d37758SMatthew Dillon.Pp 327f2d37758SMatthew Dillondefines a function to compute an approximate value of 328f2d37758SMatthew Dillonthe exponential function and 329f2d37758SMatthew Dillon.Pp 330f2d37758SMatthew Dillon.Dl for(i=1; i<=10; i++) e(i) 331f2d37758SMatthew Dillon.Pp 332f2d37758SMatthew Dillonprints approximate values of the exponential function of 333f2d37758SMatthew Dillonthe first ten integers. 334b6d9cda5SSascha Wildner.Bd -literal -offset indent 335b6d9cda5SSascha Wildner$ bc -l -e 'scale = 500; 2 * a(2^10000)' -e quit 336b6d9cda5SSascha Wildner.Ed 337b6d9cda5SSascha Wildnerprints an approximation of pi. 338f2d37758SMatthew Dillon.Sh FILES 339f2d37758SMatthew Dillon.Bl -tag -width /usr/share/misc/bc.library -compact 340f2d37758SMatthew Dillon.It Pa /usr/share/misc/bc.library 341f2d37758SMatthew Dillonmath library, read when the 342f2d37758SMatthew Dillon.Fl l 343f2d37758SMatthew Dillonoption is specified on the command line. 344f2d37758SMatthew Dillon.El 345f2d37758SMatthew Dillon.Sh SEE ALSO 346f2d37758SMatthew Dillon.Xr dc 1 347d3d5dcf2SThomas Nikolajsen.Rs 348d3d5dcf2SThomas Nikolajsen.%A "Lorinda Cherry" 349d3d5dcf2SThomas Nikolajsen.%A "Robert Morris" 350d3d5dcf2SThomas Nikolajsen.%B "4.4BSD Users's Supplementary Documents (USD)" 351d3d5dcf2SThomas Nikolajsen.%T "BC \- An Arbitrary Precision Desk-Calculator Language" 352d3d5dcf2SThomas Nikolajsen.Re 353f2d37758SMatthew Dillon.Sh STANDARDS 354f2d37758SMatthew DillonThe 355f2d37758SMatthew Dillon.Nm 356db555d9aSPeter Avalosutility is compliant with the 357db555d9aSPeter Avalos.St -p1003.1-2004 358f2d37758SMatthew Dillonspecification. 359db555d9aSPeter Avalos.Pp 360db555d9aSPeter AvalosThe flags 361db555d9aSPeter Avalos.Op Fl ce 362db555d9aSPeter Avalosare extensions to that specification. 363f2d37758SMatthew Dillon.Sh HISTORY 364f2d37758SMatthew DillonThe 365f2d37758SMatthew Dillon.Nm 3668a1d8d65SSascha Wildnercommand first appeared in 367f2d37758SMatthew Dillon.At v6 . 368f2d37758SMatthew DillonA complete rewrite of the 369f2d37758SMatthew Dillon.Nm 370f2d37758SMatthew Dilloncommand first appeared in 371f2d37758SMatthew Dillon.Ox 3.5 . 372f2d37758SMatthew Dillon.Sh AUTHORS 373f8a0f69aSSascha Wildner.An -nosplit 374f2d37758SMatthew DillonThe original version of the 375f2d37758SMatthew Dillon.Nm 376f2d37758SMatthew Dilloncommand was written by 377f2d37758SMatthew Dillon.An Robert Morris 378f2d37758SMatthew Dillonand 379f2d37758SMatthew Dillon.An Lorinda Cherry . 380f2d37758SMatthew DillonThe current version of the 381f2d37758SMatthew Dillon.Nm 382f2d37758SMatthew Dillonutility was written by 383f2d37758SMatthew Dillon.An Otto Moerbeek . 384f2d37758SMatthew Dillon.Sh BUGS 385f2d37758SMatthew Dillon.Ql Quit 386f2d37758SMatthew Dillonis interpreted when read, not when executed. 387f2d37758SMatthew Dillon.Pp 388f2d37758SMatthew DillonSome non-portable extensions, as found in the GNU version of the 389f2d37758SMatthew Dillon.Nm 390f2d37758SMatthew Dillonutility are not implemented (yet). 391