gawk-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[gawk-diffs] [SCM] gawk branch, long-double, updated. gawk-4.1.0-832-g55


From: Arnold Robbins
Subject: [gawk-diffs] [SCM] gawk branch, long-double, updated. gawk-4.1.0-832-g55e343f
Date: Tue, 16 Sep 2014 17:22:41 +0000

This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "gawk".

The branch, long-double has been updated
       via  55e343f41fcf292ad4e714d0cccf4f2e1f474f58 (commit)
       via  b219ee54781d97816b98b711396191c661925d29 (commit)
       via  dc510090126eb27d2e0514f42a4da4863873903d (commit)
       via  3fcce8a32e825dd10384d5276c420c2514442fe2 (commit)
       via  23681ec5b179a4e981781ce2daa08f61cb7317d4 (commit)
       via  8a1df492afae19d544fa5e5b636ed427b2d1c3f5 (commit)
       via  7796fb7a2e70c0252531bd224889baccacae1c9e (commit)
       via  1684dfc1f5abd1e0093feb586ae428ce42d1a827 (commit)
       via  dc03ae8d25acc19f27f015ab568e07f7d24fe2f6 (commit)
       via  33acaac51cd9087eb7a9b7e73c11f58da396df9a (commit)
       via  9b21de890a81179e951ffa5bea2099673f584b16 (commit)
       via  ca9f23d6c33c4b5cb3786d480948a42988ca99ac (commit)
       via  9da96e570a835d6a0427c9182585af307d393f45 (commit)
       via  c037ac7669150fbc955313fa63928fe00d3c825d (commit)
       via  f9fadc3b2bf0bf9d65a981a712aa9aebc21a699b (commit)
       via  01c916919342d33cddfadb89b0b4e0ad6f6201f0 (commit)
       via  4585a0f2ec53a3d26646925ad269acb9c861347a (commit)
       via  4e463bfa0ca3d2e317a0d6afe0badd6b7ee4a001 (commit)
       via  c59f2580c1c2e3ac399c7fd33a860470e58ca76a (commit)
       via  0f5cb955662136ad4a93e35db5721dd986dfd55b (commit)
       via  3f30f514c6e81c4a9e8ba1374a5080683783c382 (commit)
       via  c30a04c8d3a2eef06338934f577fe3416f40d529 (commit)
       via  16a26e063e9c62bff0478fa210d875c4eed2b7c0 (commit)
       via  7448f28d356fc5cd8d9117111baea3a549e0930e (commit)
       via  8beb9796b17b6ca48eb62df8fd3d31421e43c761 (commit)
       via  611353597e20081bd0c72617e24fa5ff4c63dac1 (commit)
       via  cb92ab7aa657c57446cc9e0087f1364adaac8fee (commit)
       via  a0d7edfff1b489e50ae8751429ebf925948b746f (commit)
       via  a205df7903bce201577df4f7049c190e283f1ea4 (commit)
       via  f84a4ffb830e5f9ce138cb74fae99ad930805723 (commit)
       via  fb838ec318104f66a36e59f71ffb4f9eaa9b2eaa (commit)
       via  2783f2c7d4e52fa7accfba7b847c416d8c71cd0f (commit)
       via  bfc794de222760871c6c6de6bb923a0bf57ee166 (commit)
       via  00f86a1d837f838a715dc879076325f772c4c5c9 (commit)
       via  ba1e7ab66563efb5b597a418e2e9fb4a01998d03 (commit)
       via  6c541fd0f75cd328dd80afec757ecccc833719af (commit)
       via  5a05ddf24b9f5ebc81a1b295ba7a6fbc7348776b (commit)
       via  ff28c07f95ff2400eb0ad1becc0eae1eab9dc93d (commit)
       via  3a2e4e1b409d87ade30d3ad2976695235347f13b (commit)
       via  a5847cb0a97b093cd0f23b65c72370af836c9748 (commit)
       via  b52b7b9f65b0edfe28f0b16a4aa72f1b76cf8820 (commit)
       via  12e05615041147de61658bda8f5e7d5a4acd87c3 (commit)
       via  73780a2b7c4a873c6844a489856b5ae2fe1a9c64 (commit)
       via  5167f5aaabb5adb4801be9f46ba3ba16596014c3 (commit)
       via  ccac19d49a596ba9eaef739cbc9dd4ebf87c8a24 (commit)
       via  cd3f4b04ef1a3a0027e72ed6d7af2fcab5ca64df (commit)
       via  12cd52d7342ec15db88fbbcb4e75af53406c0c49 (commit)
       via  056c0179993b718d7859618023fd549c766e479f (commit)
       via  3defec04e39c4ca6987a21f79686576d9823c653 (commit)
       via  3cf354e731174233ff2370a8d3cd4cd9ba0b8e91 (commit)
       via  f215e2b823693103796cd71493b90300f54adba4 (commit)
       via  0a8f56def1597bd886d7c9095c1f73e157d1197b (commit)
       via  5663bd64a728649e694462caa0c5641c5eac5c60 (commit)
       via  e909ea8295f5556db159ec28fdc566f504f9cb9a (commit)
       via  9a83e89c9880ec6f368216b5dda37cbf8cbf800f (commit)
       via  59c3dea5f888dd71d806e31f67ca6d9a9577eabc (commit)
       via  79b577d28d0921221726d881229b0364ef36eace (commit)
       via  44f0c70e04a1beef988cde4950aabe29139e789a (commit)
       via  1a9579b6c5722277b34802b7665f340b095a2e98 (commit)
       via  c9b1f9189625a8dab6092cbd46f8496537af227c (commit)
       via  5e5e1e890b276d93f09317883dd7ce8555c6a1a8 (commit)
       via  f6b764345406aae0e659c007cf99f33ff7469bf2 (commit)
       via  058370e159ba10507e7830ab4d83d5588542cf6b (commit)
       via  9d8bd17c58e8fc74d4ad80b199d5ea1d5cbd2bce (commit)
       via  1059680510215830da7e2eb91e72e4623d460d19 (commit)
       via  aec76b2b6e79e36dafced60fd91a877f5db98c4e (commit)
       via  9e2907afe246b3930d9ae6043a2657c4492f4507 (commit)
       via  e43ac01de95f05ac3c56f20d35329d086052ced2 (commit)
       via  3b80e5be5d9efcec1f73deda7fd4910f48834a83 (commit)
       via  46810569c80b88bb468600eefe2eb460487ee0a1 (commit)
       via  85567808d9e08b0e50a42d8251a913889a8b5208 (commit)
       via  2092a35f5833a74b1f606f93f318d6189a8450de (commit)
       via  1f4bd1601d0abb51db4cf28d0a3b51d8661bda94 (commit)
       via  70bc75567b2ea3e0309b9171168bc1d2c1cadf43 (commit)
       via  1be1a93e63a7ff6b45c7c20908df8bfd2a86c1be (commit)
       via  52306503277c1259eeb704d6b94aed0392536e76 (commit)
       via  52c0756d5d49d1077035167f50a15c8b952d0f69 (commit)
       via  a9298670aee293adad4693604b6b92cac8139d9f (commit)
       via  01f1baef24748e4741572fbd7ed8a1dce522fe95 (commit)
       via  7117f0234b9e771a22b03a5d9d4be5e6ab70b20b (commit)
       via  6b9d87b595278e606096018ea16615033c5571fe (commit)
       via  7cc33dc5325181f26ded26b745229147e130bab1 (commit)
       via  26998ea46d81f0212943170227839a218acb711d (commit)
       via  eafb7b72c2b6095cba51a77f5f7a5240a658c55c (commit)
       via  2aff045eb07d96c572242287487450f1d9acc5fe (commit)
       via  726b050637589997897cc3707b277633d8873f4c (commit)
       via  7f35f25a0c8c7f2859b28359d61c3b4c2f608c79 (commit)
       via  60c3f44d133e8a964911b5d7fb5d4e8472dbae3e (commit)
       via  4bfa1b9c2e5ef3bb08eb107bd9aca7a8748ce209 (commit)
       via  8f2f7ef2872a9a95dc1506504b60225ef98944f1 (commit)
       via  9a1a8c22e42af12f5859ef5d159b070f959912e6 (commit)
       via  831486481c397e13dc164524e54eddbc017fade3 (commit)
       via  ff21da5c7f072a69e9582f1a7ae2039f27f564cf (commit)
       via  873f410df729f1c7bbe2d3a8b95b41c9706d700d (commit)
       via  d3bd5c88e7505063348d88604180d3e1e6e0f5a9 (commit)
       via  e02ffe43c534493a40e9b9403cd91a6357514c85 (commit)
       via  54146e27c8fd7756a944d0e168aa969624567b55 (commit)
       via  e3f18c6702e67aabd90edea58a4edcc5d0495fdf (commit)
       via  825dd9a1839ca42c4ed6152de41515958e11660d (commit)
       via  59c75072583f4460c5eca6e0aae70f36dbaecd62 (commit)
       via  b223339f5b27d7deb0cd7e45f6f50624990fb336 (commit)
       via  c93614354db29e990db243a36c8030ad1c9ca1b7 (commit)
       via  9cd825e62e4e1ba27e4238962fb6f04d3e9d906c (commit)
       via  c0bea6b83a4e9e8bd8fb1e7dc700a5cf1ec4c0c5 (commit)
       via  37e5d574d1d2d48fcee475791e9b549a02e04eee (commit)
       via  91f979adfcc3c19bec24fc5272c23c065ba3040b (commit)
       via  412c272389116f18218148c7a84c0486ad814051 (commit)
       via  0eb7c07d8527a73cf2ab3896853da7a386d85545 (commit)
       via  7c16d375cbe99bde0a8a6d338f66fc236ce0cd19 (commit)
       via  cd99e34adaad23a24b3333fe45d4267fef3a1eeb (commit)
       via  a3789a72120e0e35d4db309215f87695a256b033 (commit)
       via  df2eaea6a92c7d89d604d0a4e885d064678ce3ed (commit)
       via  21606db0d06b91332b1514f6662f7bc6d414e54e (commit)
       via  a8fa027b743c00a80b2ca300e3b71b6770fd4866 (commit)
       via  9a5b89ce4cf173a7e23d9b196a2d7dee9ec2d2f0 (commit)
       via  bd29e4330190f4ce26dc1f734229357b6f248a1a (commit)
       via  38cc76cf9fbaa6bc7ff4af803f6a10da70cc769e (commit)
       via  f6e8ca91a0046536ed5ffef60bb818d674fadf54 (commit)
       via  aa06b223e89872515f5abe08566c32cae2af3024 (commit)
       via  577ece63770a6c4b5ad00d6998127fb7e85b86b9 (commit)
       via  78c6a89faebafdcab0ee5994ddadd986f4a0e9d2 (commit)
       via  3a0515fa9a96d2847a539e8af616d85cedf6d788 (commit)
       via  3ceb23374fc269d883dc5d56e40518db77efea1a (commit)
       via  88cdccf6bceb2078895fec825f0b776487197c78 (commit)
       via  f1245d04a9f076773c60499b468f44ed9c91b59b (commit)
       via  78ded8ee8f11a321c96417e7d02dac2f5723a221 (commit)
       via  57454ce9249bdfea6451c231858e6a8b5d26c775 (commit)
       via  7cdd5a510d45228574c34b066b2ddac833fef118 (commit)
       via  9180926c14842c03fd3baa5b3f27ac1c5bb11924 (commit)
       via  46b2d10640dc4404680fc7ffc670dd06feb5ecf3 (commit)
       via  a83444c3f520da5983965baa1ea04dc4476ef1d9 (commit)
       via  5cb84303090ceeaae218692e849d76bb5f0dce69 (commit)
       via  1b4fdde13df0ef1139e0b7233414332d4b3fbf4d (commit)
       via  fe3173cd6266b73b5400bcf7dd6862979e64e4df (commit)
       via  3df58b6bd16b0e098e4e1da29064d63c86e13f05 (commit)
       via  e0027b635872545e584975cf89909b3d0d553163 (commit)
       via  69e53560d3aae50837d6e0dea3abc56bbd031d82 (commit)
       via  7e29c49a236619b84c20ba8c9f5361feba063e21 (commit)
       via  80dcefc97cb6255c20ff7a678980cac0896a3676 (commit)
       via  3a73ec7f27db0fec9ca68e97800f30f9ad33e293 (commit)
       via  10552910dbf1b61736ac1869e4c5a9f347039918 (commit)
       via  ec27289f558e73b40c3d90f599cf392a9d03e864 (commit)
       via  bc63f89e6cc42d55c6f98cd506d9cf0336f94196 (commit)
       via  4f04830cdcef50ac2449b6dbc97c67acc4ec238d (commit)
       via  f20d398e580607d3d986e94dcbd0ae189f528478 (commit)
       via  af22ae5e8cfbea8a31583975bc6b5daf1d9a6c48 (commit)
       via  4a42ca2e31b40f0d46634f9ab77d82e4fe727c22 (commit)
       via  a09ff78b4fc11a487be7f3dd4cdf75aa34ec54da (commit)
       via  b6c937359a778e40a5d532c2a3aed8b21b89b3be (commit)
       via  1d16bc2525dfd1a8191ac4a419b1ca7af6bb0670 (commit)
       via  e52651945d6a0c66063aefa10438ba6aedf558c0 (commit)
       via  15b155a5f90932577d61e8039374a499647bc423 (commit)
       via  969b704c66bac2508e7fa320a408448a819dda12 (commit)
       via  9f916df9df1d94a589562944df1a9b3367082092 (commit)
       via  e0cb2b1f1b87cfc493db276c85bbec8246cd4b3b (commit)
       via  35f20969b80eaa1eaf4d778dfa2b0f1f6637b8d3 (commit)
       via  4bf0a8ccb72ea56ae4e7f576dd1902603b521e8d (commit)
       via  55390bf583f7a3629a4c63de436702fa1b8b613b (commit)
       via  e96948cae7fb67f9fa0f8cb4fb8784f227905dee (commit)
       via  3b01804f1b62c091f56a996c7f00657934dc9a0f (commit)
       via  337e1e6b1c142c2b800d316e477973d29c0659a1 (commit)
       via  daf5b0c87115b6793c5ac6568009916d4be3152b (commit)
       via  e1995be638c789f513eaf682f2790b3dadf40cd7 (commit)
       via  757ab2b5d36d3c468022b64acfc696859679107f (commit)
       via  d1093f2c3c24ccabfc2c093a6a7c8205a30cb3c7 (commit)
       via  d48b796888b2e6bafc898f4f45038349785a6d8f (commit)
       via  d029488bda4b1cdddc5a7c397375da080d476efa (commit)
       via  4392e20625836b88b47272c935c990fd72ca4f4c (commit)
       via  b2a169acc85cb791ad3e54ea3d250b897d819a15 (commit)
       via  a7eae6112b56320655433e4e3c8a67f6f7321bdd (commit)
       via  57082b3fc5dcf4fbc340678130847fdb2b169f1b (commit)
       via  c87f4150028ba1a144f8fa1f5e390b7cc129d7b9 (commit)
       via  ebc6bf4dbef0532bcf14b3ccdaec7c4c447f95dc (commit)
       via  c503fbaba8667315946913d865e16d3c97fbe21f (commit)
       via  d90b79ae60682ab40c661befdb948bca7fe47d5d (commit)
       via  4e18efb370c2e688c35b64270e1bcb625ea3abb0 (commit)
       via  a9772e81b3bdf78c2f9f26cbd03eecfaaecafa38 (commit)
       via  3da3dbeb0116c0cfe2590e7fa0676b8a0f12fd68 (commit)
       via  cb3db09270b4caaddb0d606ec892841c149698eb (commit)
       via  684968d926e000a4c82b47fbc2a5b24e564e8400 (commit)
       via  931074569ea4a92ac2eddb19745a518f1f697193 (commit)
       via  dbe9adb6394beea5a09630076e1cd94075e1578d (commit)
       via  c0f26ad704ffb72b6613570014169ec9d0aef601 (commit)
       via  ca8646e523f70435bccf5e582db8e54f87a07012 (commit)
       via  9e5b2c4106be2d9aaf98730a03e75d313cfa2e80 (commit)
       via  b3f2b841140e7d3b3b16fb4446aad2ac00802898 (commit)
       via  a29f25b08f9dce05bea6892e3d5396cf201417c8 (commit)
       via  67feb4fd1ad858fb67dcb3fcb25bd2bcfe80d777 (commit)
       via  353b9af72c79e25ba2d45c62d543536aa82c02cf (commit)
       via  af0e307c34759a6e6d27c94219df47b56545ec00 (commit)
       via  8b086817a7907d54dbe813f0dd05626b86e56cd1 (commit)
       via  c85701de44acc1cb67dcc8b220bd94b9191873ed (commit)
       via  b34ea22faeecc99f81f4d897d5c4cc815eab2ddb (commit)
       via  b3e02a657547d3ebaccdd9e6853979ee8d1e3b67 (commit)
       via  a2a25b2e5841a2aac5e8b78b97dec88feb1e7144 (commit)
       via  0fb3bc1f907fc707d3ffc662adf51021560a0ddc (commit)
       via  cd78eac2bc3b182ddca47b97f7f460c3358c7b09 (commit)
       via  49b06342a826719088367b8edd89e401c42b432a (commit)
       via  1f09ba8c86f73123383cd69d38414f8e922855e0 (commit)
       via  0870fdf71fcfa30498e14f921ece224bad8b6819 (commit)
       via  35de6ecfbbc272f25d12370785b1032447f37164 (commit)
       via  4336a9ce853edb66dbfb43bb6856d007a97191d0 (commit)
       via  0ebae58196378b06e083109701875f15c60a7b9a (commit)
       via  57dfae2cdd29002643719cfb42b42aeb50e57bfe (commit)
       via  40694fc1c11bae6fac8e809a6a4c161c12cc37b7 (commit)
       via  12857707435f1d4bf9adf33b6fbfd57ff91529a7 (commit)
       via  123402fa15ec56d510ddd4cba16a5aea88e18023 (commit)
       via  7dfa21486fdb9f30f8adcb7b7207458000b02866 (commit)
       via  03edc59397a4924b29852107198c4f345c986e80 (commit)
       via  bce72232ae0d79d8af6b5aa1986b78c04d6c7c28 (commit)
       via  628837bf58f885225532b6c2de41b60ffa7c14e9 (commit)
       via  c1d7f8b0dfa6264148c3369e46fbe68dd6add2dc (commit)
       via  823aca91eec1b7525b74b9cd66ae286c37f2da75 (commit)
       via  989529069906ee419cf6fa370909ebc59e0db09e (commit)
       via  f4cc4f9178ac30cdee6b2fca38b42985af42e097 (commit)
       via  46a649988936bfcb2fd1f79dcb580b4a17c46dae (commit)
       via  0ceab11e44cac45f8653fa79510726cc121719f4 (commit)
       via  b9e3fbd2db8410b4717d8589d6e315a617c62b4a (commit)
       via  2535d8a18e8c0d328fe6d1d8ae015320eeec6b5d (commit)
       via  101a091c6d85115fd312c6c75b5e75974696e199 (commit)
       via  4e4446794686a101e0c64ff7242a44a646c56d7e (commit)
       via  567f771431686847499354999fd141b6118e8a54 (commit)
       via  19564e696aca506a14ceb4a08aa2b7c7988a2473 (commit)
       via  57e6adcaa52609962670f3eb41c893810dbb8868 (commit)
       via  602c8e6544e079246701737d61bb00d80d115456 (commit)
       via  07fb211522418f8537c24b28dc1ec79da0044658 (commit)
       via  6c29291112b6b767e98ce3fb93dd4752d0ef1469 (commit)
       via  ae8a268a242aea9c52cc194e28473e2ce4f8d2f2 (commit)
       via  ab8ea56780ec1ee0d82c43e7ab7b7204ccab3ae2 (commit)
       via  6e5964a4f6dd7d2476af106387f40c7ae9ead0c5 (commit)
       via  975fbde5ddb54b76212f25e5f114758ebf91f572 (commit)
       via  698f8a9414180fc1243de799126dcbb57c86592a (commit)
       via  3cdb8b8cf57d6ccfd215d0170c2b616340719d86 (commit)
       via  6afaf0a27a5b9429c74fcbfb505a6d047a0c5d94 (commit)
       via  787a601c5eefb6dc49042e2ead2c5bd819f7ff8b (commit)
       via  a0bc08515ee5a7b9cebc377d42d775b86aa48c77 (commit)
       via  f58c712b921b976b43d89dc45c2beaf115b3143e (commit)
       via  db96948d6e6f8ccf9d035b3c468a2a60e3944f73 (commit)
       via  1c8936c4d92b34c9c70ff8083e67d77c7fcfb439 (commit)
       via  83cdb74c338a83be6fe47201ef3f49c828a72c32 (commit)
       via  c0da63689b60c4e724b753a6796836d12ab09934 (commit)
       via  a9221a2068449cd388a91aa5bc23fdb70d8babe3 (commit)
       via  eb03b1e1816d524fcc2b78f6bdf502f515eae54e (commit)
       via  ee9707cc44eea3ca64cb71666ac3e8ed26a3bb7f (commit)
       via  0ac63db595a009d1f07dba8246e52710348b0798 (commit)
       via  37be8a17ee9e955dec8bbddb8cd2b31487e44a0c (commit)
       via  1a4fe61b7ad390740a0c70a0175b82301c083704 (commit)
       via  6013197b678697404fe44e8db58a9d40a2832ce4 (commit)
       via  2dbda7d9bb23f050673841c42f845be539e19a2c (commit)
       via  20c76cfdadff3bf969279038ac0408ec179a8efd (commit)
       via  540418bc7d1f84f7f1cdabbc9ccb093447f1c320 (commit)
       via  2cd2431737dd088c4eb957e27aa6a1edb17aa88e (commit)
       via  9c32ff7ed5aeca6906dbdb5bcf602f675893f3be (commit)
       via  31ab1e85c7423384a19575217178f34d54f4be7e (commit)
       via  98ecd5e8c7b6c83b8c794050249b445dfea17334 (commit)
       via  57fe811dd036e276abd30eed3aac135df7e362ab (commit)
       via  df80d9b911fcfff4c9e2da2d6a820f074108f696 (commit)
       via  01886e08505e3aa28b0798776284f27bc64ab9fd (commit)
       via  3582c0812a82986ddd6959c28db520dc376e39e0 (commit)
       via  61f18b3aac9acf83f06163e37461eea5d915523b (commit)
       via  79c40aa674b3d723cc646a14984d095abff2fa06 (commit)
       via  d22cc6269fed3bc11e2b8b0e9ffc59d5cbc92b8d (commit)
       via  6f523090fc503c7f2e4748b81b0e6d138f6a28e6 (commit)
       via  f002cb87a7ec02f311c75ad5c0d9e31cf7519aa1 (commit)
       via  56e0891a41a9b151c9dfe7665401ba5950ac2f91 (commit)
       via  55775186a2fb7e4f61b57e2923abe4e6e4728eb0 (commit)
       via  263bd7ca867fdb26241a8681075f99d97c33c4d0 (commit)
       via  bfebb6547fb331a87820be10d9c91efd274ea399 (commit)
       via  188e4c22845855953c24b9ac26a86320371e1482 (commit)
       via  42100bbb008a4aa6088b77285777283e49339ae1 (commit)
       via  f6f37055efd53b08e22001776c6e223de78d7f54 (commit)
       via  6855adcdcb8fd310b298043ace84f0cc9133c517 (commit)
       via  bbbdcd5cec911cdef6e8e82c6000b10dabafacae (commit)
       via  e081fb5a615104d2ac8ec6b193ce3106950a3bbb (commit)
       via  582c08d3795cec69eae28f9513c65d21ad0a13e8 (commit)
       via  6e8392351cfc4c8f489feac3c07edeacfe6d8949 (commit)
       via  3ac1e3fcac5919fcac6b5653e2ee6488ed69808b (commit)
       via  ea2b78528d646e4d60a8e8a13d40db2e1b03feac (commit)
       via  b04f6c730f608e853f84c6e2c77d018039a3a693 (commit)
       via  e58a44a35b0c64d8072d4663b68a5cfdebc6a83b (commit)
       via  30826905fb5989599ee4313e1d4af584ac478fb4 (commit)
       via  5c5a827839987b36fc8f0fc3003d745d0923814b (commit)
       via  b6a5e7aa9d0e8b125fc885168f9a8b63bc0f7758 (commit)
       via  3e41ef8d18bcc6026445f04618a9564710301a49 (commit)
       via  871c74808578617fdf6dab0ee5b28b9c7d00aaae (commit)
       via  b6dbba36f373166e14cad2767b89d0331b8ac77c (commit)
       via  291ff169ddc21abd09e1b46c69eddd56edd31899 (commit)
       via  11c996c675afa475d46834b2b09039097e25afb5 (commit)
       via  74db9f3cb12c4c45487b8646473daad7d0df641f (commit)
       via  730a2388f18c57478fb0afa07b15947616f84c5a (commit)
       via  086cf8797aed3e6e2281456cff48e0c879f38813 (commit)
       via  3473e4d1cd41d32c1b902dd17e56977bf9051c2b (commit)
       via  451a255062f7e54bb6654ea8ea437cfbb4ec929d (commit)
       via  b02fb9b76e40a94cdaad17b7d1a720a71f8f8eb0 (commit)
       via  e83d848b576ba38ca98fcb97f72d5c1891982615 (commit)
       via  119d46dcdfbc84058ea517ac1ec18bf3dbb26ec4 (commit)
       via  698b17a3422b7b9cc1e4ab078ed7f26cfa30c463 (commit)
       via  1e09bc8abf811e718a5ae77f6428bc31b1f4fdcb (commit)
       via  caab17cf55dfe1122a4e1955236492423ff1ca40 (commit)
       via  83edcc2fccc61f50eb040af8b8227c31b0236336 (commit)
       via  a0283cb5e4c3191db16fc9b48d0ff05f660ef3ae (commit)
       via  6c173e43fc3902e5dc4be1ed90aac7a66228628e (commit)
       via  f778f620480f476fd4a61fa43cd3349f95afaf48 (commit)
       via  2b2bcaaa614db05c72ce1c4d213e7a4eaab27937 (commit)
       via  030d19b3fa9ce83ebeedf4d9bf27a527977f01d7 (commit)
       via  284608d0645dcb90d0a443f155bb9e513eaf9eff (commit)
       via  f4eb81006930f3d2fe944298b63bb546f0ee3e9f (commit)
       via  13eee814c9d9e5c7b4cf0e0f55c23951fec443f2 (commit)
       via  203e7f84ea7f296b61d3bb80d1fc458a3fe5a58d (commit)
       via  4db69d42558bae4bb3fb4eccc91671ee16ccfe08 (commit)
       via  a5f1cf2beb31002f3cd35bfef7cb8af8843fc2b5 (commit)
       via  08fc54511a406a767652b617f9c8e293e794258a (commit)
       via  8401ded64836e829620dfbbc2b6edf731edfb337 (commit)
       via  9d0462137c48a149b41ffc8cce183999374c8683 (commit)
       via  d8d656a2929d9fd54d9263634c803b92dab568c3 (commit)
       via  2f8d4e37f5dffe7f5b8d28a21d785b37d6e09e0f (commit)
       via  1eade34854d9bfa858ffd2aa44cd1f5baf5951f8 (commit)
       via  79c0ad1fe45d4f14e21d4f2f984f6b4c7c83fdae (commit)
       via  1fa5be5e29fb1a7096173be2b76c4b83d8e41b28 (commit)
       via  5f280f8854de0652f8fb53c6bcf4e63ad189cb0b (commit)
       via  fb189c40596609a4026bedaaca2a344b177d905a (commit)
       via  478c3f9f2f8f0d3a3e3e8ac4ea412a6ee7e54b86 (commit)
       via  251fa761931520336e19fb09af583954a6f481ce (commit)
       via  dac059baf5518edf195c873db91eb42af6551586 (commit)
       via  4522cf0e0ff06a7eecde480505bf8c2591bf5fa3 (commit)
       via  a8e112a6707877ce24f9560104d157409942b957 (commit)
       via  f672202ff2ec279e5c3260e8810a4ccc213a5876 (commit)
       via  fa30c4248c55cbce828bd9f31f5d45ca842464b3 (commit)
       via  ac9bad12d159288eeaf704da3aeed63a859339cf (commit)
       via  35653e6bd56e589a0525c3012a16353420375a6f (commit)
       via  2dce17ca688920d26694336de74ebd7bcfc0aa20 (commit)
       via  9c4ae62976adec2eb00f3e7c51f8dcfc986db390 (commit)
       via  e88d7d831b34b84fd5d9f944305e5409e7e01d94 (commit)
       via  6687cad78247baa628df4d140894fb3ae9eb5872 (commit)
       via  12f1a0c2e46f8578e4093fa86013c22202d19b8d (commit)
       via  9e72453f0ba1ff009890dbe3c915620b48492912 (commit)
      from  9cfca6dd301451aa83e6f79436181020a40ea1b0 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://git.sv.gnu.org/cgit/gawk.git/commit/?id=55e343f41fcf292ad4e714d0cccf4f2e1f474f58

commit 55e343f41fcf292ad4e714d0cccf4f2e1f474f58
Merge: 9cfca6d b219ee5
Author: Arnold D. Robbins <address@hidden>
Date:   Tue Sep 16 20:22:12 2014 +0300

    Merge branch 'num-handler' into long-double
    
    Still need to fix the long double tests.

diff --cc Makefile.am
index 0c69a03,52ef5a4..37138ec
--- a/Makefile.am
+++ b/Makefile.am
@@@ -61,13 -61,12 +61,15 @@@ EXTRA_DIST = 
  # The order to do things in.
  # Build explicitly in "." in order to build gawk first, so
  # that `make check' without a prior `make' works.
 +
 +EXTRADIRS = misc
 +
+ # Build in awklib after in doc, since we want to extract
+ # sample files if doc/gawk.texi changed.
 -SUBDIRS = \
 +BASEDIRS = \
        . \
-       awklib \
        doc \
+       awklib \
        po \
        extension \
        test
diff --cc Makefile.in
index 1d1b6c1,4b5fa69..f7bd47e
--- a/Makefile.in
+++ b/Makefile.in
@@@ -472,11 -468,12 +472,14 @@@ EXTRA_DIST = 
  # The order to do things in.
  # Build explicitly in "." in order to build gawk first, so
  # that `make check' without a prior `make' works.
 +EXTRADIRS = misc
++
+ # Build in awklib after in doc, since we want to extract
+ # sample files if doc/gawk.texi changed.
 -SUBDIRS = \
 +BASEDIRS = \
        . \
-       awklib \
        doc \
+       awklib \
        po \
        extension \
        test
diff --cc awkgram.c
index 030d097,861ab0b..41bef6e
--- a/awkgram.c
+++ b/awkgram.c
@@@ -197,9 -194,7 +197,7 @@@ extern double fmod(double x, double y)
  
  #define YYSTYPE INSTRUCTION *
  
- #define is_identchar(c)               (isalnum(c) || (c) == '_')
- 
- #line 203 "awkgram.c" /* yacc.c:339  */
 -#line 198 "awkgram.c" /* yacc.c:339  */
++#line 201 "awkgram.c" /* yacc.c:339  */
  
  # ifndef YY_NULLPTR
  #  if defined __cplusplus && 201103L <= __cplusplus
@@@ -353,7 -348,7 +351,7 @@@ int yyparse (void)
  
  /* Copy the second part of user declarations.  */
  
- #line 357 "awkgram.c" /* yacc.c:358  */
 -#line 352 "awkgram.c" /* yacc.c:358  */
++#line 355 "awkgram.c" /* yacc.c:358  */
  
  #ifdef short
  # undef short
@@@ -655,25 -650,25 +653,25 @@@ static const yytype_uint8 yytranslate[
    /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
  static const yytype_uint16 yyrline[] =
  {
-        0,   202,   202,   204,   209,   210,   216,   228,   232,   243,
-      249,   254,   262,   270,   272,   277,   285,   287,   293,   294,
-      296,   322,   333,   344,   350,   359,   369,   371,   373,   379,
-      384,   385,   389,   408,   407,   441,   443,   448,   449,   462,
-      467,   468,   472,   474,   476,   483,   573,   615,   657,   770,
-      777,   784,   794,   803,   812,   821,   832,   848,   847,   871,
-      883,   883,   981,   981,  1014,  1044,  1050,  1051,  1057,  1058,
-     1065,  1070,  1082,  1096,  1098,  1106,  1111,  1113,  1121,  1123,
-     1132,  1133,  1141,  1146,  1146,  1157,  1161,  1169,  1170,  1173,
-     1175,  1180,  1181,  1190,  1191,  1196,  1201,  1207,  1209,  1211,
-     1218,  1219,  1225,  1226,  1231,  1233,  1238,  1240,  1248,  1253,
-     1262,  1269,  1271,  1273,  1289,  1299,  1306,  1308,  1313,  1315,
-     1317,  1325,  1327,  1332,  1334,  1339,  1341,  1343,  1393,  1395,
-     1397,  1399,  1401,  1403,  1405,  1407,  1430,  1435,  1440,  1465,
-     1471,  1473,  1475,  1477,  1479,  1481,  1486,  1490,  1504,  1506,
-     1512,  1518,  1531,  1532,  1533,  1538,  1543,  1547,  1551,  1566,
-     1578,  1583,  1619,  1637,  1638,  1644,  1645,  1650,  1652,  1659,
-     1676,  1693,  1695,  1702,  1707,  1715,  1725,  1737,  1746,  1750,
-     1754,  1758,  1762,  1766,  1769,  1771,  1775,  1779,  1783
 -       0,   197,   197,   199,   204,   205,   211,   223,   227,   238,
 -     244,   249,   257,   265,   267,   272,   280,   282,   288,   289,
 -     291,   317,   328,   339,   345,   354,   364,   366,   368,   374,
 -     379,   380,   384,   403,   402,   436,   438,   443,   444,   457,
 -     462,   463,   467,   469,   471,   478,   568,   610,   652,   765,
 -     772,   779,   789,   798,   807,   816,   827,   843,   842,   866,
 -     878,   878,   976,   976,  1009,  1039,  1045,  1046,  1052,  1053,
 -    1060,  1065,  1077,  1091,  1093,  1101,  1106,  1108,  1116,  1118,
 -    1127,  1128,  1136,  1141,  1141,  1152,  1156,  1164,  1165,  1168,
 -    1170,  1175,  1176,  1185,  1186,  1191,  1196,  1202,  1204,  1206,
 -    1213,  1214,  1220,  1221,  1226,  1228,  1233,  1235,  1243,  1248,
 -    1257,  1264,  1266,  1268,  1284,  1294,  1301,  1303,  1308,  1310,
 -    1312,  1320,  1322,  1327,  1329,  1334,  1336,  1338,  1388,  1390,
 -    1392,  1394,  1396,  1398,  1400,  1402,  1416,  1421,  1426,  1451,
 -    1457,  1459,  1461,  1463,  1465,  1467,  1472,  1476,  1508,  1510,
 -    1516,  1522,  1535,  1536,  1537,  1542,  1547,  1551,  1555,  1570,
 -    1582,  1587,  1623,  1641,  1642,  1648,  1649,  1654,  1656,  1663,
 -    1680,  1697,  1699,  1706,  1711,  1719,  1729,  1741,  1750,  1754,
 -    1758,  1762,  1766,  1770,  1773,  1775,  1779,  1783,  1787
++       0,   200,   200,   202,   207,   208,   214,   226,   230,   241,
++     247,   252,   260,   268,   270,   275,   283,   285,   291,   292,
++     294,   320,   331,   342,   348,   357,   367,   369,   371,   377,
++     382,   383,   387,   406,   405,   439,   441,   446,   447,   460,
++     465,   466,   470,   472,   474,   481,   571,   613,   655,   768,
++     775,   782,   792,   801,   810,   819,   830,   846,   845,   869,
++     881,   881,   979,   979,  1012,  1042,  1048,  1049,  1055,  1056,
++    1063,  1068,  1080,  1094,  1096,  1104,  1109,  1111,  1119,  1121,
++    1130,  1131,  1139,  1144,  1144,  1155,  1159,  1167,  1168,  1171,
++    1173,  1178,  1179,  1188,  1189,  1194,  1199,  1205,  1207,  1209,
++    1216,  1217,  1223,  1224,  1229,  1231,  1236,  1238,  1246,  1251,
++    1260,  1267,  1269,  1271,  1287,  1297,  1304,  1306,  1311,  1313,
++    1315,  1323,  1325,  1330,  1332,  1337,  1339,  1341,  1391,  1393,
++    1395,  1397,  1399,  1401,  1403,  1405,  1419,  1424,  1429,  1454,
++    1460,  1462,  1464,  1466,  1468,  1470,  1475,  1479,  1493,  1495,
++    1501,  1507,  1520,  1521,  1522,  1527,  1532,  1536,  1540,  1555,
++    1567,  1572,  1608,  1626,  1627,  1633,  1634,  1639,  1641,  1648,
++    1665,  1682,  1684,  1691,  1696,  1704,  1714,  1726,  1735,  1739,
++    1743,  1747,  1751,  1755,  1758,  1760,  1764,  1768,  1772
  };
  #endif
  
@@@ -1846,26 -1841,26 +1844,26 @@@ yyreduce
    switch (yyn)
      {
          case 3:
- #line 205 "awkgram.y" /* yacc.c:1646  */
 -#line 200 "awkgram.y" /* yacc.c:1646  */
++#line 203 "awkgram.y" /* yacc.c:1646  */
      {
                rule = 0;
                yyerrok;
          }
- #line 1855 "awkgram.c" /* yacc.c:1646  */
 -#line 1850 "awkgram.c" /* yacc.c:1646  */
++#line 1853 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 5:
- #line 211 "awkgram.y" /* yacc.c:1646  */
 -#line 206 "awkgram.y" /* yacc.c:1646  */
++#line 209 "awkgram.y" /* yacc.c:1646  */
      {
                next_sourcefile();
                if (sourcefile == srcfiles)
                        process_deferred();
          }
- #line 1865 "awkgram.c" /* yacc.c:1646  */
 -#line 1860 "awkgram.c" /* yacc.c:1646  */
++#line 1863 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 6:
- #line 217 "awkgram.y" /* yacc.c:1646  */
 -#line 212 "awkgram.y" /* yacc.c:1646  */
++#line 215 "awkgram.y" /* yacc.c:1646  */
      {
                rule = 0;
                /*
@@@ -1874,19 -1869,19 +1872,19 @@@
                 */
                /* yyerrok; */
          }
- #line 1878 "awkgram.c" /* yacc.c:1646  */
 -#line 1873 "awkgram.c" /* yacc.c:1646  */
++#line 1876 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 7:
- #line 229 "awkgram.y" /* yacc.c:1646  */
 -#line 224 "awkgram.y" /* yacc.c:1646  */
++#line 227 "awkgram.y" /* yacc.c:1646  */
      {
                (void) append_rule((yyvsp[-1]), (yyvsp[0]));
          }
- #line 1886 "awkgram.c" /* yacc.c:1646  */
 -#line 1881 "awkgram.c" /* yacc.c:1646  */
++#line 1884 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 8:
- #line 233 "awkgram.y" /* yacc.c:1646  */
 -#line 228 "awkgram.y" /* yacc.c:1646  */
++#line 231 "awkgram.y" /* yacc.c:1646  */
      {
                if (rule != Rule) {
                        msg(_("%s blocks must have an action part"), 
ruletab[rule]);
@@@ -1897,39 -1892,39 +1895,39 @@@
                } else          /* pattern rule with non-empty pattern */
                        (void) append_rule((yyvsp[-1]), NULL);
          }
- #line 1901 "awkgram.c" /* yacc.c:1646  */
 -#line 1896 "awkgram.c" /* yacc.c:1646  */
++#line 1899 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 9:
- #line 244 "awkgram.y" /* yacc.c:1646  */
 -#line 239 "awkgram.y" /* yacc.c:1646  */
++#line 242 "awkgram.y" /* yacc.c:1646  */
      {
                in_function = NULL;
                (void) mk_function((yyvsp[-1]), (yyvsp[0]));
                yyerrok;
          }
- #line 1911 "awkgram.c" /* yacc.c:1646  */
 -#line 1906 "awkgram.c" /* yacc.c:1646  */
++#line 1909 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 10:
- #line 250 "awkgram.y" /* yacc.c:1646  */
 -#line 245 "awkgram.y" /* yacc.c:1646  */
++#line 248 "awkgram.y" /* yacc.c:1646  */
      {
                want_source = false;
                yyerrok;
          }
- #line 1920 "awkgram.c" /* yacc.c:1646  */
 -#line 1915 "awkgram.c" /* yacc.c:1646  */
++#line 1918 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 11:
- #line 255 "awkgram.y" /* yacc.c:1646  */
 -#line 250 "awkgram.y" /* yacc.c:1646  */
++#line 253 "awkgram.y" /* yacc.c:1646  */
      {
                want_source = false;
                yyerrok;
          }
- #line 1929 "awkgram.c" /* yacc.c:1646  */
 -#line 1924 "awkgram.c" /* yacc.c:1646  */
++#line 1927 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 12:
- #line 263 "awkgram.y" /* yacc.c:1646  */
 -#line 258 "awkgram.y" /* yacc.c:1646  */
++#line 261 "awkgram.y" /* yacc.c:1646  */
      {
                if (include_source((yyvsp[0])) < 0)
                        YYABORT;
@@@ -1937,23 -1932,23 +1935,23 @@@
                bcfree((yyvsp[0]));
                (yyval) = NULL;
          }
- #line 1941 "awkgram.c" /* yacc.c:1646  */
 -#line 1936 "awkgram.c" /* yacc.c:1646  */
++#line 1939 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 13:
- #line 271 "awkgram.y" /* yacc.c:1646  */
 -#line 266 "awkgram.y" /* yacc.c:1646  */
++#line 269 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 1947 "awkgram.c" /* yacc.c:1646  */
 -#line 1942 "awkgram.c" /* yacc.c:1646  */
++#line 1945 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 14:
- #line 273 "awkgram.y" /* yacc.c:1646  */
 -#line 268 "awkgram.y" /* yacc.c:1646  */
++#line 271 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 1953 "awkgram.c" /* yacc.c:1646  */
 -#line 1948 "awkgram.c" /* yacc.c:1646  */
++#line 1951 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 15:
- #line 278 "awkgram.y" /* yacc.c:1646  */
 -#line 273 "awkgram.y" /* yacc.c:1646  */
++#line 276 "awkgram.y" /* yacc.c:1646  */
      {
                if (load_library((yyvsp[0])) < 0)
                        YYABORT;
@@@ -1961,35 -1956,35 +1959,35 @@@
                bcfree((yyvsp[0]));
                (yyval) = NULL;
          }
- #line 1965 "awkgram.c" /* yacc.c:1646  */
 -#line 1960 "awkgram.c" /* yacc.c:1646  */
++#line 1963 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 16:
- #line 286 "awkgram.y" /* yacc.c:1646  */
 -#line 281 "awkgram.y" /* yacc.c:1646  */
++#line 284 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 1971 "awkgram.c" /* yacc.c:1646  */
 -#line 1966 "awkgram.c" /* yacc.c:1646  */
++#line 1969 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 17:
- #line 288 "awkgram.y" /* yacc.c:1646  */
 -#line 283 "awkgram.y" /* yacc.c:1646  */
++#line 286 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 1977 "awkgram.c" /* yacc.c:1646  */
 -#line 1972 "awkgram.c" /* yacc.c:1646  */
++#line 1975 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 18:
- #line 293 "awkgram.y" /* yacc.c:1646  */
 -#line 288 "awkgram.y" /* yacc.c:1646  */
++#line 291 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; rule = Rule; }
- #line 1983 "awkgram.c" /* yacc.c:1646  */
 -#line 1978 "awkgram.c" /* yacc.c:1646  */
++#line 1981 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 19:
- #line 295 "awkgram.y" /* yacc.c:1646  */
 -#line 290 "awkgram.y" /* yacc.c:1646  */
++#line 293 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); rule = Rule; }
- #line 1989 "awkgram.c" /* yacc.c:1646  */
 -#line 1984 "awkgram.c" /* yacc.c:1646  */
++#line 1987 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 20:
- #line 297 "awkgram.y" /* yacc.c:1646  */
 -#line 292 "awkgram.y" /* yacc.c:1646  */
++#line 295 "awkgram.y" /* yacc.c:1646  */
      {
                INSTRUCTION *tp;
  
@@@ -2015,11 -2010,11 +2013,11 @@@
                (yyval) = list_append(list_merge((yyvsp[-3]), (yyvsp[0])), tp);
                rule = Rule;
          }
- #line 2019 "awkgram.c" /* yacc.c:1646  */
 -#line 2014 "awkgram.c" /* yacc.c:1646  */
++#line 2017 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 21:
- #line 323 "awkgram.y" /* yacc.c:1646  */
 -#line 318 "awkgram.y" /* yacc.c:1646  */
++#line 321 "awkgram.y" /* yacc.c:1646  */
      {
                static int begin_seen = 0;
                if (do_lint_old && ++begin_seen == 2)
@@@ -2030,11 -2025,11 +2028,11 @@@
                (yyvsp[0])->source_file = source;
                (yyval) = (yyvsp[0]);
          }
- #line 2034 "awkgram.c" /* yacc.c:1646  */
 -#line 2029 "awkgram.c" /* yacc.c:1646  */
++#line 2032 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 22:
- #line 334 "awkgram.y" /* yacc.c:1646  */
 -#line 329 "awkgram.y" /* yacc.c:1646  */
++#line 332 "awkgram.y" /* yacc.c:1646  */
      {
                static int end_seen = 0;
                if (do_lint_old && ++end_seen == 2)
@@@ -2045,70 -2040,70 +2043,70 @@@
                (yyvsp[0])->source_file = source;
                (yyval) = (yyvsp[0]);
          }
- #line 2049 "awkgram.c" /* yacc.c:1646  */
 -#line 2044 "awkgram.c" /* yacc.c:1646  */
++#line 2047 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 23:
- #line 345 "awkgram.y" /* yacc.c:1646  */
 -#line 340 "awkgram.y" /* yacc.c:1646  */
++#line 343 "awkgram.y" /* yacc.c:1646  */
      {
                (yyvsp[0])->in_rule = rule = BEGINFILE;
                (yyvsp[0])->source_file = source;
                (yyval) = (yyvsp[0]);
          }
- #line 2059 "awkgram.c" /* yacc.c:1646  */
 -#line 2054 "awkgram.c" /* yacc.c:1646  */
++#line 2057 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 24:
- #line 351 "awkgram.y" /* yacc.c:1646  */
 -#line 346 "awkgram.y" /* yacc.c:1646  */
++#line 349 "awkgram.y" /* yacc.c:1646  */
      {
                (yyvsp[0])->in_rule = rule = ENDFILE;
                (yyvsp[0])->source_file = source;
                (yyval) = (yyvsp[0]);
          }
- #line 2069 "awkgram.c" /* yacc.c:1646  */
 -#line 2064 "awkgram.c" /* yacc.c:1646  */
++#line 2067 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 25:
- #line 360 "awkgram.y" /* yacc.c:1646  */
 -#line 355 "awkgram.y" /* yacc.c:1646  */
++#line 358 "awkgram.y" /* yacc.c:1646  */
      {
                if ((yyvsp[-3]) == NULL)
                        (yyval) = list_create(instruction(Op_no_op));
                else
                        (yyval) = (yyvsp[-3]);
          }
- #line 2080 "awkgram.c" /* yacc.c:1646  */
 -#line 2075 "awkgram.c" /* yacc.c:1646  */
++#line 2078 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 26:
- #line 370 "awkgram.y" /* yacc.c:1646  */
 -#line 365 "awkgram.y" /* yacc.c:1646  */
++#line 368 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 2086 "awkgram.c" /* yacc.c:1646  */
 -#line 2081 "awkgram.c" /* yacc.c:1646  */
++#line 2084 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 27:
- #line 372 "awkgram.y" /* yacc.c:1646  */
 -#line 367 "awkgram.y" /* yacc.c:1646  */
++#line 370 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 2092 "awkgram.c" /* yacc.c:1646  */
 -#line 2087 "awkgram.c" /* yacc.c:1646  */
++#line 2090 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 28:
- #line 374 "awkgram.y" /* yacc.c:1646  */
 -#line 369 "awkgram.y" /* yacc.c:1646  */
++#line 372 "awkgram.y" /* yacc.c:1646  */
      {
                yyerror(_("`%s' is a built-in function, it cannot be 
redefined"),
                                        tokstart);
                YYABORT;
          }
- #line 2102 "awkgram.c" /* yacc.c:1646  */
 -#line 2097 "awkgram.c" /* yacc.c:1646  */
++#line 2100 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 29:
- #line 380 "awkgram.y" /* yacc.c:1646  */
 -#line 375 "awkgram.y" /* yacc.c:1646  */
++#line 378 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 2108 "awkgram.c" /* yacc.c:1646  */
 -#line 2103 "awkgram.c" /* yacc.c:1646  */
++#line 2106 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 32:
- #line 390 "awkgram.y" /* yacc.c:1646  */
 -#line 385 "awkgram.y" /* yacc.c:1646  */
++#line 388 "awkgram.y" /* yacc.c:1646  */
      {
                (yyvsp[-5])->source_file = source;
                if (install_function((yyvsp[-4])->lextok, (yyvsp[-5]), 
(yyvsp[-2])) < 0)
@@@ -2119,17 -2114,17 +2117,17 @@@
                /* $4 already free'd in install_function */
                (yyval) = (yyvsp[-5]);
          }
- #line 2123 "awkgram.c" /* yacc.c:1646  */
 -#line 2118 "awkgram.c" /* yacc.c:1646  */
++#line 2121 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 33:
- #line 408 "awkgram.y" /* yacc.c:1646  */
 -#line 403 "awkgram.y" /* yacc.c:1646  */
++#line 406 "awkgram.y" /* yacc.c:1646  */
      { want_regexp = true; }
- #line 2129 "awkgram.c" /* yacc.c:1646  */
 -#line 2124 "awkgram.c" /* yacc.c:1646  */
++#line 2127 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 34:
- #line 410 "awkgram.y" /* yacc.c:1646  */
 -#line 405 "awkgram.y" /* yacc.c:1646  */
++#line 408 "awkgram.y" /* yacc.c:1646  */
      {
                  NODE *n, *exp;
                  char *re;
@@@ -2158,23 -2153,23 +2156,23 @@@
                  (yyval)->opcode = Op_match_rec;
                  (yyval)->memory = n;
                }
- #line 2162 "awkgram.c" /* yacc.c:1646  */
 -#line 2157 "awkgram.c" /* yacc.c:1646  */
++#line 2160 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 35:
- #line 442 "awkgram.y" /* yacc.c:1646  */
 -#line 437 "awkgram.y" /* yacc.c:1646  */
++#line 440 "awkgram.y" /* yacc.c:1646  */
      { bcfree((yyvsp[0])); }
- #line 2168 "awkgram.c" /* yacc.c:1646  */
 -#line 2163 "awkgram.c" /* yacc.c:1646  */
++#line 2166 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 37:
- #line 448 "awkgram.y" /* yacc.c:1646  */
 -#line 443 "awkgram.y" /* yacc.c:1646  */
++#line 446 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 2174 "awkgram.c" /* yacc.c:1646  */
 -#line 2169 "awkgram.c" /* yacc.c:1646  */
++#line 2172 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 38:
- #line 450 "awkgram.y" /* yacc.c:1646  */
 -#line 445 "awkgram.y" /* yacc.c:1646  */
++#line 448 "awkgram.y" /* yacc.c:1646  */
      {
                if ((yyvsp[0]) == NULL)
                        (yyval) = (yyvsp[-1]);
@@@ -2187,40 -2182,40 +2185,40 @@@
                }
            yyerrok;
          }
- #line 2191 "awkgram.c" /* yacc.c:1646  */
 -#line 2186 "awkgram.c" /* yacc.c:1646  */
++#line 2189 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 39:
- #line 463 "awkgram.y" /* yacc.c:1646  */
 -#line 458 "awkgram.y" /* yacc.c:1646  */
++#line 461 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 2197 "awkgram.c" /* yacc.c:1646  */
 -#line 2192 "awkgram.c" /* yacc.c:1646  */
++#line 2195 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 42:
- #line 473 "awkgram.y" /* yacc.c:1646  */
 -#line 468 "awkgram.y" /* yacc.c:1646  */
++#line 471 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 2203 "awkgram.c" /* yacc.c:1646  */
 -#line 2198 "awkgram.c" /* yacc.c:1646  */
++#line 2201 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 43:
- #line 475 "awkgram.y" /* yacc.c:1646  */
 -#line 470 "awkgram.y" /* yacc.c:1646  */
++#line 473 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[-1]); }
- #line 2209 "awkgram.c" /* yacc.c:1646  */
 -#line 2204 "awkgram.c" /* yacc.c:1646  */
++#line 2207 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 44:
- #line 477 "awkgram.y" /* yacc.c:1646  */
 -#line 472 "awkgram.y" /* yacc.c:1646  */
++#line 475 "awkgram.y" /* yacc.c:1646  */
      {
                if (do_pretty_print)
                        (yyval) = list_prepend((yyvsp[0]), 
instruction(Op_exec_count));
                else
                        (yyval) = (yyvsp[0]);
          }
- #line 2220 "awkgram.c" /* yacc.c:1646  */
 -#line 2215 "awkgram.c" /* yacc.c:1646  */
++#line 2218 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 45:
- #line 484 "awkgram.y" /* yacc.c:1646  */
 -#line 479 "awkgram.y" /* yacc.c:1646  */
++#line 482 "awkgram.y" /* yacc.c:1646  */
      {
                INSTRUCTION *dflt, *curr = NULL, *cexp, *cstmt;
                INSTRUCTION *ip, *nextc, *tbreak;
@@@ -2310,11 -2305,11 +2308,11 @@@
                break_allowed--;                        
                fix_break_continue(ip, tbreak, NULL);
          }
- #line 2314 "awkgram.c" /* yacc.c:1646  */
 -#line 2309 "awkgram.c" /* yacc.c:1646  */
++#line 2312 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 46:
- #line 574 "awkgram.y" /* yacc.c:1646  */
 -#line 569 "awkgram.y" /* yacc.c:1646  */
++#line 572 "awkgram.y" /* yacc.c:1646  */
      { 
                /*
                 *    -----------------
@@@ -2356,11 -2351,11 +2354,11 @@@
                continue_allowed--;
                fix_break_continue(ip, tbreak, tcont);
          }
- #line 2360 "awkgram.c" /* yacc.c:1646  */
 -#line 2355 "awkgram.c" /* yacc.c:1646  */
++#line 2358 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 47:
- #line 616 "awkgram.y" /* yacc.c:1646  */
 -#line 611 "awkgram.y" /* yacc.c:1646  */
++#line 614 "awkgram.y" /* yacc.c:1646  */
      {
                /*
                 *    -----------------
@@@ -2402,11 -2397,11 +2400,11 @@@
                } /* else
                        $1 and $4 are NULLs */
          }
- #line 2406 "awkgram.c" /* yacc.c:1646  */
 -#line 2401 "awkgram.c" /* yacc.c:1646  */
++#line 2404 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 48:
- #line 658 "awkgram.y" /* yacc.c:1646  */
 -#line 653 "awkgram.y" /* yacc.c:1646  */
++#line 656 "awkgram.y" /* yacc.c:1646  */
      {
                INSTRUCTION *ip;
                char *var_name = (yyvsp[-5])->lextok;
@@@ -2519,44 -2514,44 +2517,44 @@@ regular_loop
                break_allowed--;
                continue_allowed--;
          }
- #line 2523 "awkgram.c" /* yacc.c:1646  */
 -#line 2518 "awkgram.c" /* yacc.c:1646  */
++#line 2521 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 49:
- #line 771 "awkgram.y" /* yacc.c:1646  */
 -#line 766 "awkgram.y" /* yacc.c:1646  */
++#line 769 "awkgram.y" /* yacc.c:1646  */
      {
                (yyval) = mk_for_loop((yyvsp[-11]), (yyvsp[-9]), (yyvsp[-6]), 
(yyvsp[-3]), (yyvsp[0]));
  
                break_allowed--;
                continue_allowed--;
          }
- #line 2534 "awkgram.c" /* yacc.c:1646  */
 -#line 2529 "awkgram.c" /* yacc.c:1646  */
++#line 2532 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 50:
- #line 778 "awkgram.y" /* yacc.c:1646  */
 -#line 773 "awkgram.y" /* yacc.c:1646  */
++#line 776 "awkgram.y" /* yacc.c:1646  */
      {
                (yyval) = mk_for_loop((yyvsp[-10]), (yyvsp[-8]), (INSTRUCTION 
*) NULL, (yyvsp[-3]), (yyvsp[0]));
  
                break_allowed--;
                continue_allowed--;
          }
- #line 2545 "awkgram.c" /* yacc.c:1646  */
 -#line 2540 "awkgram.c" /* yacc.c:1646  */
++#line 2543 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 51:
- #line 785 "awkgram.y" /* yacc.c:1646  */
 -#line 780 "awkgram.y" /* yacc.c:1646  */
++#line 783 "awkgram.y" /* yacc.c:1646  */
      {
                if (do_pretty_print)
                        (yyval) = list_prepend((yyvsp[0]), 
instruction(Op_exec_count));
                else
                        (yyval) = (yyvsp[0]);
          }
- #line 2556 "awkgram.c" /* yacc.c:1646  */
 -#line 2551 "awkgram.c" /* yacc.c:1646  */
++#line 2554 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 52:
- #line 795 "awkgram.y" /* yacc.c:1646  */
 -#line 790 "awkgram.y" /* yacc.c:1646  */
++#line 793 "awkgram.y" /* yacc.c:1646  */
      { 
                if (! break_allowed)
                        error_ln((yyvsp[-1])->source_line,
@@@ -2565,11 -2560,11 +2563,11 @@@
                (yyval) = list_create((yyvsp[-1]));
  
          }
- #line 2569 "awkgram.c" /* yacc.c:1646  */
 -#line 2564 "awkgram.c" /* yacc.c:1646  */
++#line 2567 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 53:
- #line 804 "awkgram.y" /* yacc.c:1646  */
 -#line 799 "awkgram.y" /* yacc.c:1646  */
++#line 802 "awkgram.y" /* yacc.c:1646  */
      {
                if (! continue_allowed)
                        error_ln((yyvsp[-1])->source_line,
@@@ -2578,11 -2573,11 +2576,11 @@@
                (yyval) = list_create((yyvsp[-1]));
  
          }
- #line 2582 "awkgram.c" /* yacc.c:1646  */
 -#line 2577 "awkgram.c" /* yacc.c:1646  */
++#line 2580 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 54:
- #line 813 "awkgram.y" /* yacc.c:1646  */
 -#line 808 "awkgram.y" /* yacc.c:1646  */
++#line 811 "awkgram.y" /* yacc.c:1646  */
      {
                /* if inside function (rule = 0), resolve context at run-time */
                if (rule && rule != Rule)
@@@ -2591,11 -2586,11 +2589,11 @@@
                (yyvsp[-1])->target_jmp = ip_rec;
                (yyval) = list_create((yyvsp[-1]));
          }
- #line 2595 "awkgram.c" /* yacc.c:1646  */
 -#line 2590 "awkgram.c" /* yacc.c:1646  */
++#line 2593 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 55:
- #line 822 "awkgram.y" /* yacc.c:1646  */
 -#line 817 "awkgram.y" /* yacc.c:1646  */
++#line 820 "awkgram.y" /* yacc.c:1646  */
      {
                /* if inside function (rule = 0), resolve context at run-time */
                if (rule == BEGIN || rule == END || rule == ENDFILE)
@@@ -2606,11 -2601,11 +2604,11 @@@
                (yyvsp[-1])->target_endfile = ip_endfile;
                (yyval) = list_create((yyvsp[-1]));
          }
- #line 2610 "awkgram.c" /* yacc.c:1646  */
 -#line 2605 "awkgram.c" /* yacc.c:1646  */
++#line 2608 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 56:
- #line 833 "awkgram.y" /* yacc.c:1646  */
 -#line 828 "awkgram.y" /* yacc.c:1646  */
++#line 831 "awkgram.y" /* yacc.c:1646  */
      {
                /* Initialize the two possible jump targets, the actual target
                 * is resolved at run-time. 
@@@ -2625,20 -2620,20 +2623,20 @@@
                } else
                        (yyval) = list_append((yyvsp[-1]), (yyvsp[-2]));
          }
- #line 2629 "awkgram.c" /* yacc.c:1646  */
 -#line 2624 "awkgram.c" /* yacc.c:1646  */
++#line 2627 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 57:
- #line 848 "awkgram.y" /* yacc.c:1646  */
 -#line 843 "awkgram.y" /* yacc.c:1646  */
++#line 846 "awkgram.y" /* yacc.c:1646  */
      {
                if (! in_function)
                        yyerror(_("`return' used outside function context"));
          }
- #line 2638 "awkgram.c" /* yacc.c:1646  */
 -#line 2633 "awkgram.c" /* yacc.c:1646  */
++#line 2636 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 58:
- #line 851 "awkgram.y" /* yacc.c:1646  */
 -#line 846 "awkgram.y" /* yacc.c:1646  */
++#line 849 "awkgram.y" /* yacc.c:1646  */
      {
                if ((yyvsp[-1]) == NULL) {
                        (yyval) = list_create((yyvsp[-3]));
@@@ -2659,17 -2654,17 +2657,17 @@@
                        (yyval) = list_append((yyvsp[-1]), (yyvsp[-3]));
                }
          }
- #line 2663 "awkgram.c" /* yacc.c:1646  */
 -#line 2658 "awkgram.c" /* yacc.c:1646  */
++#line 2661 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 60:
- #line 883 "awkgram.y" /* yacc.c:1646  */
 -#line 878 "awkgram.y" /* yacc.c:1646  */
++#line 881 "awkgram.y" /* yacc.c:1646  */
      { in_print = true; in_parens = 0; }
- #line 2669 "awkgram.c" /* yacc.c:1646  */
 -#line 2664 "awkgram.c" /* yacc.c:1646  */
++#line 2667 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 61:
- #line 884 "awkgram.y" /* yacc.c:1646  */
 -#line 879 "awkgram.y" /* yacc.c:1646  */
++#line 882 "awkgram.y" /* yacc.c:1646  */
      {
                /*
                 * Optimization: plain `print' has no expression list, so $3 is 
null.
@@@ -2766,17 -2761,17 +2764,17 @@@ regular_print
                        }
                }
          }
- #line 2770 "awkgram.c" /* yacc.c:1646  */
 -#line 2765 "awkgram.c" /* yacc.c:1646  */
++#line 2768 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 62:
- #line 981 "awkgram.y" /* yacc.c:1646  */
 -#line 976 "awkgram.y" /* yacc.c:1646  */
++#line 979 "awkgram.y" /* yacc.c:1646  */
      { sub_counter = 0; }
- #line 2776 "awkgram.c" /* yacc.c:1646  */
 -#line 2771 "awkgram.c" /* yacc.c:1646  */
++#line 2774 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 63:
- #line 982 "awkgram.y" /* yacc.c:1646  */
 -#line 977 "awkgram.y" /* yacc.c:1646  */
++#line 980 "awkgram.y" /* yacc.c:1646  */
      {
                char *arr = (yyvsp[-2])->lextok;
  
@@@ -2809,11 -2804,11 +2807,11 @@@
                        (yyval) = list_append(list_append((yyvsp[0]), 
(yyvsp[-2])), (yyvsp[-3]));
                }
          }
- #line 2813 "awkgram.c" /* yacc.c:1646  */
 -#line 2808 "awkgram.c" /* yacc.c:1646  */
++#line 2811 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 64:
- #line 1019 "awkgram.y" /* yacc.c:1646  */
 -#line 1014 "awkgram.y" /* yacc.c:1646  */
++#line 1017 "awkgram.y" /* yacc.c:1646  */
      {
                static bool warned = false;
                char *arr = (yyvsp[-1])->lextok;
@@@ -2839,52 -2834,52 +2837,52 @@@
                                fatal(_("`delete' is not allowed with 
FUNCTAB"));
                }
          }
- #line 2843 "awkgram.c" /* yacc.c:1646  */
 -#line 2838 "awkgram.c" /* yacc.c:1646  */
++#line 2841 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 65:
- #line 1045 "awkgram.y" /* yacc.c:1646  */
 -#line 1040 "awkgram.y" /* yacc.c:1646  */
++#line 1043 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = optimize_assignment((yyvsp[0])); }
- #line 2849 "awkgram.c" /* yacc.c:1646  */
 -#line 2844 "awkgram.c" /* yacc.c:1646  */
++#line 2847 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 66:
- #line 1050 "awkgram.y" /* yacc.c:1646  */
 -#line 1045 "awkgram.y" /* yacc.c:1646  */
++#line 1048 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 2855 "awkgram.c" /* yacc.c:1646  */
 -#line 2850 "awkgram.c" /* yacc.c:1646  */
++#line 2853 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 67:
- #line 1052 "awkgram.y" /* yacc.c:1646  */
 -#line 1047 "awkgram.y" /* yacc.c:1646  */
++#line 1050 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 2861 "awkgram.c" /* yacc.c:1646  */
 -#line 2856 "awkgram.c" /* yacc.c:1646  */
++#line 2859 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 68:
- #line 1057 "awkgram.y" /* yacc.c:1646  */
 -#line 1052 "awkgram.y" /* yacc.c:1646  */
++#line 1055 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 2867 "awkgram.c" /* yacc.c:1646  */
 -#line 2862 "awkgram.c" /* yacc.c:1646  */
++#line 2865 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 69:
- #line 1059 "awkgram.y" /* yacc.c:1646  */
 -#line 1054 "awkgram.y" /* yacc.c:1646  */
++#line 1057 "awkgram.y" /* yacc.c:1646  */
      {
                if ((yyvsp[-1]) == NULL)
                        (yyval) = list_create((yyvsp[0]));
                else
                        (yyval) = list_prepend((yyvsp[-1]), (yyvsp[0]));
          }
- #line 2878 "awkgram.c" /* yacc.c:1646  */
 -#line 2873 "awkgram.c" /* yacc.c:1646  */
++#line 2876 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 70:
- #line 1066 "awkgram.y" /* yacc.c:1646  */
 -#line 1061 "awkgram.y" /* yacc.c:1646  */
++#line 1064 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 2884 "awkgram.c" /* yacc.c:1646  */
 -#line 2879 "awkgram.c" /* yacc.c:1646  */
++#line 2882 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 71:
- #line 1071 "awkgram.y" /* yacc.c:1646  */
 -#line 1066 "awkgram.y" /* yacc.c:1646  */
++#line 1069 "awkgram.y" /* yacc.c:1646  */
      {
                INSTRUCTION *casestmt = (yyvsp[0]);
                if ((yyvsp[0]) == NULL)
@@@ -2896,11 -2891,11 +2894,11 @@@
                bcfree((yyvsp[-2]));
                (yyval) = (yyvsp[-4]);
          }
- #line 2900 "awkgram.c" /* yacc.c:1646  */
 -#line 2895 "awkgram.c" /* yacc.c:1646  */
++#line 2898 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 72:
- #line 1083 "awkgram.y" /* yacc.c:1646  */
 -#line 1078 "awkgram.y" /* yacc.c:1646  */
++#line 1081 "awkgram.y" /* yacc.c:1646  */
      {
                INSTRUCTION *casestmt = (yyvsp[0]);
                if ((yyvsp[0]) == NULL)
@@@ -2911,17 -2906,17 +2909,17 @@@
                (yyvsp[-3])->case_stmt = casestmt;
                (yyval) = (yyvsp[-3]);
          }
- #line 2915 "awkgram.c" /* yacc.c:1646  */
 -#line 2910 "awkgram.c" /* yacc.c:1646  */
++#line 2913 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 73:
- #line 1097 "awkgram.y" /* yacc.c:1646  */
 -#line 1092 "awkgram.y" /* yacc.c:1646  */
++#line 1095 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 2921 "awkgram.c" /* yacc.c:1646  */
 -#line 2916 "awkgram.c" /* yacc.c:1646  */
++#line 2919 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 74:
- #line 1099 "awkgram.y" /* yacc.c:1646  */
 -#line 1094 "awkgram.y" /* yacc.c:1646  */
++#line 1097 "awkgram.y" /* yacc.c:1646  */
      { 
                NODE *n = (yyvsp[0])->memory;
                (void) force_number(n);
@@@ -2929,71 -2924,71 +2927,71 @@@
                bcfree((yyvsp[-1]));
                (yyval) = (yyvsp[0]);
          }
- #line 2933 "awkgram.c" /* yacc.c:1646  */
 -#line 2928 "awkgram.c" /* yacc.c:1646  */
++#line 2931 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 75:
- #line 1107 "awkgram.y" /* yacc.c:1646  */
 -#line 1102 "awkgram.y" /* yacc.c:1646  */
++#line 1105 "awkgram.y" /* yacc.c:1646  */
      {
                bcfree((yyvsp[-1]));
                (yyval) = (yyvsp[0]);
          }
- #line 2942 "awkgram.c" /* yacc.c:1646  */
 -#line 2937 "awkgram.c" /* yacc.c:1646  */
++#line 2940 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 76:
- #line 1112 "awkgram.y" /* yacc.c:1646  */
 -#line 1107 "awkgram.y" /* yacc.c:1646  */
++#line 1110 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 2948 "awkgram.c" /* yacc.c:1646  */
 -#line 2943 "awkgram.c" /* yacc.c:1646  */
++#line 2946 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 77:
- #line 1114 "awkgram.y" /* yacc.c:1646  */
 -#line 1109 "awkgram.y" /* yacc.c:1646  */
++#line 1112 "awkgram.y" /* yacc.c:1646  */
      {
                (yyvsp[0])->opcode = Op_push_re;
                (yyval) = (yyvsp[0]);
          }
- #line 2957 "awkgram.c" /* yacc.c:1646  */
 -#line 2952 "awkgram.c" /* yacc.c:1646  */
++#line 2955 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 78:
- #line 1122 "awkgram.y" /* yacc.c:1646  */
 -#line 1117 "awkgram.y" /* yacc.c:1646  */
++#line 1120 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 2963 "awkgram.c" /* yacc.c:1646  */
 -#line 2958 "awkgram.c" /* yacc.c:1646  */
++#line 2961 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 79:
- #line 1124 "awkgram.y" /* yacc.c:1646  */
 -#line 1119 "awkgram.y" /* yacc.c:1646  */
++#line 1122 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 2969 "awkgram.c" /* yacc.c:1646  */
 -#line 2964 "awkgram.c" /* yacc.c:1646  */
++#line 2967 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 81:
- #line 1134 "awkgram.y" /* yacc.c:1646  */
 -#line 1129 "awkgram.y" /* yacc.c:1646  */
++#line 1132 "awkgram.y" /* yacc.c:1646  */
      {
                (yyval) = (yyvsp[-1]);
          }
- #line 2977 "awkgram.c" /* yacc.c:1646  */
 -#line 2972 "awkgram.c" /* yacc.c:1646  */
++#line 2975 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 82:
- #line 1141 "awkgram.y" /* yacc.c:1646  */
 -#line 1136 "awkgram.y" /* yacc.c:1646  */
++#line 1139 "awkgram.y" /* yacc.c:1646  */
      {
                in_print = false;
                in_parens = 0;
                (yyval) = NULL;
          }
- #line 2987 "awkgram.c" /* yacc.c:1646  */
 -#line 2982 "awkgram.c" /* yacc.c:1646  */
++#line 2985 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 83:
- #line 1146 "awkgram.y" /* yacc.c:1646  */
 -#line 1141 "awkgram.y" /* yacc.c:1646  */
++#line 1144 "awkgram.y" /* yacc.c:1646  */
      { in_print = false; in_parens = 0; }
- #line 2993 "awkgram.c" /* yacc.c:1646  */
 -#line 2988 "awkgram.c" /* yacc.c:1646  */
++#line 2991 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 84:
- #line 1147 "awkgram.y" /* yacc.c:1646  */
 -#line 1142 "awkgram.y" /* yacc.c:1646  */
++#line 1145 "awkgram.y" /* yacc.c:1646  */
      {
                if ((yyvsp[-2])->redir_type == redirect_twoway
                        && (yyvsp[0])->lasti->opcode == Op_K_getline_redir
@@@ -3001,136 -2996,136 +2999,136 @@@
                        yyerror(_("multistage two-way pipelines don't work"));
                (yyval) = list_prepend((yyvsp[0]), (yyvsp[-2]));
          }
- #line 3005 "awkgram.c" /* yacc.c:1646  */
 -#line 3000 "awkgram.c" /* yacc.c:1646  */
++#line 3003 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 85:
- #line 1158 "awkgram.y" /* yacc.c:1646  */
 -#line 1153 "awkgram.y" /* yacc.c:1646  */
++#line 1156 "awkgram.y" /* yacc.c:1646  */
      {
                (yyval) = mk_condition((yyvsp[-3]), (yyvsp[-5]), (yyvsp[0]), 
NULL, NULL);
          }
- #line 3013 "awkgram.c" /* yacc.c:1646  */
 -#line 3008 "awkgram.c" /* yacc.c:1646  */
++#line 3011 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 86:
- #line 1163 "awkgram.y" /* yacc.c:1646  */
 -#line 1158 "awkgram.y" /* yacc.c:1646  */
++#line 1161 "awkgram.y" /* yacc.c:1646  */
      {
                (yyval) = mk_condition((yyvsp[-6]), (yyvsp[-8]), (yyvsp[-3]), 
(yyvsp[-2]), (yyvsp[0]));
          }
- #line 3021 "awkgram.c" /* yacc.c:1646  */
 -#line 3016 "awkgram.c" /* yacc.c:1646  */
++#line 3019 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 91:
- #line 1180 "awkgram.y" /* yacc.c:1646  */
 -#line 1175 "awkgram.y" /* yacc.c:1646  */
++#line 1178 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 3027 "awkgram.c" /* yacc.c:1646  */
 -#line 3022 "awkgram.c" /* yacc.c:1646  */
++#line 3025 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 92:
- #line 1182 "awkgram.y" /* yacc.c:1646  */
 -#line 1177 "awkgram.y" /* yacc.c:1646  */
++#line 1180 "awkgram.y" /* yacc.c:1646  */
      {
                bcfree((yyvsp[-1]));
                (yyval) = (yyvsp[0]);
          }
- #line 3036 "awkgram.c" /* yacc.c:1646  */
 -#line 3031 "awkgram.c" /* yacc.c:1646  */
++#line 3034 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 93:
- #line 1190 "awkgram.y" /* yacc.c:1646  */
 -#line 1185 "awkgram.y" /* yacc.c:1646  */
++#line 1188 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 3042 "awkgram.c" /* yacc.c:1646  */
 -#line 3037 "awkgram.c" /* yacc.c:1646  */
++#line 3040 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 94:
- #line 1192 "awkgram.y" /* yacc.c:1646  */
 -#line 1187 "awkgram.y" /* yacc.c:1646  */
++#line 1190 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]) ; }
- #line 3048 "awkgram.c" /* yacc.c:1646  */
 -#line 3043 "awkgram.c" /* yacc.c:1646  */
++#line 3046 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 95:
- #line 1197 "awkgram.y" /* yacc.c:1646  */
 -#line 1192 "awkgram.y" /* yacc.c:1646  */
++#line 1195 "awkgram.y" /* yacc.c:1646  */
      {
                (yyvsp[0])->param_count = 0;
                (yyval) = list_create((yyvsp[0]));
          }
- #line 3057 "awkgram.c" /* yacc.c:1646  */
 -#line 3052 "awkgram.c" /* yacc.c:1646  */
++#line 3055 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 96:
- #line 1202 "awkgram.y" /* yacc.c:1646  */
 -#line 1197 "awkgram.y" /* yacc.c:1646  */
++#line 1200 "awkgram.y" /* yacc.c:1646  */
      {
                (yyvsp[0])->param_count =  (yyvsp[-2])->lasti->param_count + 1;
                (yyval) = list_append((yyvsp[-2]), (yyvsp[0]));
                yyerrok;
          }
- #line 3067 "awkgram.c" /* yacc.c:1646  */
 -#line 3062 "awkgram.c" /* yacc.c:1646  */
++#line 3065 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 97:
- #line 1208 "awkgram.y" /* yacc.c:1646  */
 -#line 1203 "awkgram.y" /* yacc.c:1646  */
++#line 1206 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 3073 "awkgram.c" /* yacc.c:1646  */
 -#line 3068 "awkgram.c" /* yacc.c:1646  */
++#line 3071 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 98:
- #line 1210 "awkgram.y" /* yacc.c:1646  */
 -#line 1205 "awkgram.y" /* yacc.c:1646  */
++#line 1208 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[-1]); }
- #line 3079 "awkgram.c" /* yacc.c:1646  */
 -#line 3074 "awkgram.c" /* yacc.c:1646  */
++#line 3077 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 99:
- #line 1212 "awkgram.y" /* yacc.c:1646  */
 -#line 1207 "awkgram.y" /* yacc.c:1646  */
++#line 1210 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[-2]); }
- #line 3085 "awkgram.c" /* yacc.c:1646  */
 -#line 3080 "awkgram.c" /* yacc.c:1646  */
++#line 3083 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 100:
- #line 1218 "awkgram.y" /* yacc.c:1646  */
 -#line 1213 "awkgram.y" /* yacc.c:1646  */
++#line 1216 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 3091 "awkgram.c" /* yacc.c:1646  */
 -#line 3086 "awkgram.c" /* yacc.c:1646  */
++#line 3089 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 101:
- #line 1220 "awkgram.y" /* yacc.c:1646  */
 -#line 1215 "awkgram.y" /* yacc.c:1646  */
++#line 1218 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 3097 "awkgram.c" /* yacc.c:1646  */
 -#line 3092 "awkgram.c" /* yacc.c:1646  */
++#line 3095 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 102:
- #line 1225 "awkgram.y" /* yacc.c:1646  */
 -#line 1220 "awkgram.y" /* yacc.c:1646  */
++#line 1223 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 3103 "awkgram.c" /* yacc.c:1646  */
 -#line 3098 "awkgram.c" /* yacc.c:1646  */
++#line 3101 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 103:
- #line 1227 "awkgram.y" /* yacc.c:1646  */
 -#line 1222 "awkgram.y" /* yacc.c:1646  */
++#line 1225 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 3109 "awkgram.c" /* yacc.c:1646  */
 -#line 3104 "awkgram.c" /* yacc.c:1646  */
++#line 3107 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 104:
- #line 1232 "awkgram.y" /* yacc.c:1646  */
 -#line 1227 "awkgram.y" /* yacc.c:1646  */
++#line 1230 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = mk_expression_list(NULL, (yyvsp[0])); }
- #line 3115 "awkgram.c" /* yacc.c:1646  */
 -#line 3110 "awkgram.c" /* yacc.c:1646  */
++#line 3113 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 105:
- #line 1234 "awkgram.y" /* yacc.c:1646  */
 -#line 1229 "awkgram.y" /* yacc.c:1646  */
++#line 1232 "awkgram.y" /* yacc.c:1646  */
      {
                (yyval) = mk_expression_list((yyvsp[-2]), (yyvsp[0]));
                yyerrok;
          }
- #line 3124 "awkgram.c" /* yacc.c:1646  */
 -#line 3119 "awkgram.c" /* yacc.c:1646  */
++#line 3122 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 106:
- #line 1239 "awkgram.y" /* yacc.c:1646  */
 -#line 1234 "awkgram.y" /* yacc.c:1646  */
++#line 1237 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 3130 "awkgram.c" /* yacc.c:1646  */
 -#line 3125 "awkgram.c" /* yacc.c:1646  */
++#line 3128 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 107:
- #line 1241 "awkgram.y" /* yacc.c:1646  */
 -#line 1236 "awkgram.y" /* yacc.c:1646  */
++#line 1239 "awkgram.y" /* yacc.c:1646  */
      {
                /*
                 * Returning the expression list instead of NULL lets
@@@ -3138,52 -3133,52 +3136,52 @@@
                 */
                (yyval) = (yyvsp[-1]);
          }
- #line 3142 "awkgram.c" /* yacc.c:1646  */
 -#line 3137 "awkgram.c" /* yacc.c:1646  */
++#line 3140 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 108:
- #line 1249 "awkgram.y" /* yacc.c:1646  */
 -#line 1244 "awkgram.y" /* yacc.c:1646  */
++#line 1247 "awkgram.y" /* yacc.c:1646  */
      {
                /* Ditto */
                (yyval) = mk_expression_list((yyvsp[-2]), (yyvsp[0]));
          }
- #line 3151 "awkgram.c" /* yacc.c:1646  */
 -#line 3146 "awkgram.c" /* yacc.c:1646  */
++#line 3149 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 109:
- #line 1254 "awkgram.y" /* yacc.c:1646  */
 -#line 1249 "awkgram.y" /* yacc.c:1646  */
++#line 1252 "awkgram.y" /* yacc.c:1646  */
      {
                /* Ditto */
                (yyval) = (yyvsp[-2]);
          }
- #line 3160 "awkgram.c" /* yacc.c:1646  */
 -#line 3155 "awkgram.c" /* yacc.c:1646  */
++#line 3158 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 110:
- #line 1263 "awkgram.y" /* yacc.c:1646  */
 -#line 1258 "awkgram.y" /* yacc.c:1646  */
++#line 1261 "awkgram.y" /* yacc.c:1646  */
      {
                if (do_lint && (yyvsp[0])->lasti->opcode == Op_match_rec)
                        lintwarn_ln((yyvsp[-1])->source_line,
                                _("regular expression on right of assignment"));
                (yyval) = mk_assignment((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1]));
          }
- #line 3171 "awkgram.c" /* yacc.c:1646  */
 -#line 3166 "awkgram.c" /* yacc.c:1646  */
++#line 3169 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 111:
- #line 1270 "awkgram.y" /* yacc.c:1646  */
 -#line 1265 "awkgram.y" /* yacc.c:1646  */
++#line 1268 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = mk_boolean((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
- #line 3177 "awkgram.c" /* yacc.c:1646  */
 -#line 3172 "awkgram.c" /* yacc.c:1646  */
++#line 3175 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 112:
- #line 1272 "awkgram.y" /* yacc.c:1646  */
 -#line 1267 "awkgram.y" /* yacc.c:1646  */
++#line 1270 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = mk_boolean((yyvsp[-2]), (yyvsp[0]), (yyvsp[-1])); }
- #line 3183 "awkgram.c" /* yacc.c:1646  */
 -#line 3178 "awkgram.c" /* yacc.c:1646  */
++#line 3181 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 113:
- #line 1274 "awkgram.y" /* yacc.c:1646  */
 -#line 1269 "awkgram.y" /* yacc.c:1646  */
++#line 1272 "awkgram.y" /* yacc.c:1646  */
      {
                if ((yyvsp[-2])->lasti->opcode == Op_match_rec)
                        warning_ln((yyvsp[-1])->source_line,
@@@ -3199,11 -3194,11 +3197,11 @@@
                        (yyval) = list_append(list_merge((yyvsp[-2]), 
(yyvsp[0])), (yyvsp[-1]));
                }
          }
- #line 3203 "awkgram.c" /* yacc.c:1646  */
 -#line 3198 "awkgram.c" /* yacc.c:1646  */
++#line 3201 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 114:
- #line 1290 "awkgram.y" /* yacc.c:1646  */
 -#line 1285 "awkgram.y" /* yacc.c:1646  */
++#line 1288 "awkgram.y" /* yacc.c:1646  */
      {
                if (do_lint_old)
                        warning_ln((yyvsp[-1])->source_line,
@@@ -3213,91 -3208,91 +3211,91 @@@
                (yyvsp[-1])->expr_count = 1;
                (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1]));
          }
- #line 3217 "awkgram.c" /* yacc.c:1646  */
 -#line 3212 "awkgram.c" /* yacc.c:1646  */
++#line 3215 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 115:
- #line 1300 "awkgram.y" /* yacc.c:1646  */
 -#line 1295 "awkgram.y" /* yacc.c:1646  */
++#line 1298 "awkgram.y" /* yacc.c:1646  */
      {
                if (do_lint && (yyvsp[0])->lasti->opcode == Op_match_rec)
                        lintwarn_ln((yyvsp[-1])->source_line,
                                _("regular expression on right of comparison"));
                (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1]));
          }
- #line 3228 "awkgram.c" /* yacc.c:1646  */
 -#line 3223 "awkgram.c" /* yacc.c:1646  */
++#line 3226 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 116:
- #line 1307 "awkgram.y" /* yacc.c:1646  */
 -#line 1302 "awkgram.y" /* yacc.c:1646  */
++#line 1305 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = mk_condition((yyvsp[-4]), (yyvsp[-3]), (yyvsp[-2]), 
(yyvsp[-1]), (yyvsp[0])); }
- #line 3234 "awkgram.c" /* yacc.c:1646  */
 -#line 3229 "awkgram.c" /* yacc.c:1646  */
++#line 3232 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 117:
- #line 1309 "awkgram.y" /* yacc.c:1646  */
 -#line 1304 "awkgram.y" /* yacc.c:1646  */
++#line 1307 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 3240 "awkgram.c" /* yacc.c:1646  */
 -#line 3235 "awkgram.c" /* yacc.c:1646  */
++#line 3238 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 118:
- #line 1314 "awkgram.y" /* yacc.c:1646  */
 -#line 1309 "awkgram.y" /* yacc.c:1646  */
++#line 1312 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 3246 "awkgram.c" /* yacc.c:1646  */
 -#line 3241 "awkgram.c" /* yacc.c:1646  */
++#line 3244 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 119:
- #line 1316 "awkgram.y" /* yacc.c:1646  */
 -#line 1311 "awkgram.y" /* yacc.c:1646  */
++#line 1314 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 3252 "awkgram.c" /* yacc.c:1646  */
 -#line 3247 "awkgram.c" /* yacc.c:1646  */
++#line 3250 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 120:
- #line 1318 "awkgram.y" /* yacc.c:1646  */
 -#line 1313 "awkgram.y" /* yacc.c:1646  */
++#line 1316 "awkgram.y" /* yacc.c:1646  */
      { 
                (yyvsp[0])->opcode = Op_assign_quotient;
                (yyval) = (yyvsp[0]);
          }
- #line 3261 "awkgram.c" /* yacc.c:1646  */
 -#line 3256 "awkgram.c" /* yacc.c:1646  */
++#line 3259 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 121:
- #line 1326 "awkgram.y" /* yacc.c:1646  */
 -#line 1321 "awkgram.y" /* yacc.c:1646  */
++#line 1324 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 3267 "awkgram.c" /* yacc.c:1646  */
 -#line 3262 "awkgram.c" /* yacc.c:1646  */
++#line 3265 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 122:
- #line 1328 "awkgram.y" /* yacc.c:1646  */
 -#line 1323 "awkgram.y" /* yacc.c:1646  */
++#line 1326 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 3273 "awkgram.c" /* yacc.c:1646  */
 -#line 3268 "awkgram.c" /* yacc.c:1646  */
++#line 3271 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 123:
- #line 1333 "awkgram.y" /* yacc.c:1646  */
 -#line 1328 "awkgram.y" /* yacc.c:1646  */
++#line 1331 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 3279 "awkgram.c" /* yacc.c:1646  */
 -#line 3274 "awkgram.c" /* yacc.c:1646  */
++#line 3277 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 124:
- #line 1335 "awkgram.y" /* yacc.c:1646  */
 -#line 1330 "awkgram.y" /* yacc.c:1646  */
++#line 1333 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 3285 "awkgram.c" /* yacc.c:1646  */
 -#line 3280 "awkgram.c" /* yacc.c:1646  */
++#line 3283 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 125:
- #line 1340 "awkgram.y" /* yacc.c:1646  */
 -#line 1335 "awkgram.y" /* yacc.c:1646  */
++#line 1338 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 3291 "awkgram.c" /* yacc.c:1646  */
 -#line 3286 "awkgram.c" /* yacc.c:1646  */
++#line 3289 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 126:
- #line 1342 "awkgram.y" /* yacc.c:1646  */
 -#line 1337 "awkgram.y" /* yacc.c:1646  */
++#line 1340 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 3297 "awkgram.c" /* yacc.c:1646  */
 -#line 3292 "awkgram.c" /* yacc.c:1646  */
++#line 3295 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 127:
- #line 1344 "awkgram.y" /* yacc.c:1646  */
 -#line 1339 "awkgram.y" /* yacc.c:1646  */
++#line 1342 "awkgram.y" /* yacc.c:1646  */
      {
                int count = 2;
                bool is_simple_var = false;
@@@ -3344,92 -3339,83 +3342,83 @@@
                                max_args = count;
                }
          }
- #line 3348 "awkgram.c" /* yacc.c:1646  */
 -#line 3343 "awkgram.c" /* yacc.c:1646  */
++#line 3346 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 129:
- #line 1396 "awkgram.y" /* yacc.c:1646  */
 -#line 1391 "awkgram.y" /* yacc.c:1646  */
++#line 1394 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1])); }
- #line 3354 "awkgram.c" /* yacc.c:1646  */
 -#line 3349 "awkgram.c" /* yacc.c:1646  */
++#line 3352 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 130:
- #line 1398 "awkgram.y" /* yacc.c:1646  */
 -#line 1393 "awkgram.y" /* yacc.c:1646  */
++#line 1396 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1])); }
- #line 3360 "awkgram.c" /* yacc.c:1646  */
 -#line 3355 "awkgram.c" /* yacc.c:1646  */
++#line 3358 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 131:
- #line 1400 "awkgram.y" /* yacc.c:1646  */
 -#line 1395 "awkgram.y" /* yacc.c:1646  */
++#line 1398 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1])); }
- #line 3366 "awkgram.c" /* yacc.c:1646  */
 -#line 3361 "awkgram.c" /* yacc.c:1646  */
++#line 3364 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 132:
- #line 1402 "awkgram.y" /* yacc.c:1646  */
 -#line 1397 "awkgram.y" /* yacc.c:1646  */
++#line 1400 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1])); }
- #line 3372 "awkgram.c" /* yacc.c:1646  */
 -#line 3367 "awkgram.c" /* yacc.c:1646  */
++#line 3370 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 133:
- #line 1404 "awkgram.y" /* yacc.c:1646  */
 -#line 1399 "awkgram.y" /* yacc.c:1646  */
++#line 1402 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1])); }
- #line 3378 "awkgram.c" /* yacc.c:1646  */
 -#line 3373 "awkgram.c" /* yacc.c:1646  */
++#line 3376 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 134:
- #line 1406 "awkgram.y" /* yacc.c:1646  */
 -#line 1401 "awkgram.y" /* yacc.c:1646  */
++#line 1404 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1])); }
- #line 3384 "awkgram.c" /* yacc.c:1646  */
 -#line 3379 "awkgram.c" /* yacc.c:1646  */
++#line 3382 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 135:
- #line 1408 "awkgram.y" /* yacc.c:1646  */
 -#line 1403 "awkgram.y" /* yacc.c:1646  */
++#line 1406 "awkgram.y" /* yacc.c:1646  */
      {
                /*
-                * In BEGINFILE/ENDFILE, allow `getline var < file'
+                * In BEGINFILE/ENDFILE, allow `getline [var] < file'
                 */
  
-               if (rule == BEGINFILE || rule == ENDFILE) {
-                       if ((yyvsp[-1]) != NULL && (yyvsp[0]) != NULL)
-                               ;        /* all  ok */
-                       else {
-                               if ((yyvsp[-1]) != NULL)
-                                       error_ln((yyvsp[-2])->source_line,
-                                               _("`getline var' invalid inside 
`%s' rule"), ruletab[rule]);
-                               else
-                                       error_ln((yyvsp[-2])->source_line,
-                                               _("`getline' invalid inside 
`%s' rule"), ruletab[rule]);
-                       }
-               }
+               if ((rule == BEGINFILE || rule == ENDFILE) && (yyvsp[0]) == 
NULL)
+                       error_ln((yyvsp[-2])->source_line,
+                                _("non-redirected `getline' invalid inside 
`%s' rule"), ruletab[rule]);
                if (do_lint && rule == END && (yyvsp[0]) == NULL)
                        lintwarn_ln((yyvsp[-2])->source_line,
                                _("non-redirected `getline' undefined inside 
END action"));
                (yyval) = mk_getline((yyvsp[-2]), (yyvsp[-1]), (yyvsp[0]), 
redirect_input);
          }
- #line 3411 "awkgram.c" /* yacc.c:1646  */
 -#line 3397 "awkgram.c" /* yacc.c:1646  */
++#line 3400 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 136:
- #line 1431 "awkgram.y" /* yacc.c:1646  */
 -#line 1417 "awkgram.y" /* yacc.c:1646  */
++#line 1420 "awkgram.y" /* yacc.c:1646  */
      {
                (yyvsp[0])->opcode = Op_postincrement;
                (yyval) = mk_assignment((yyvsp[-1]), NULL, (yyvsp[0]));
          }
- #line 3420 "awkgram.c" /* yacc.c:1646  */
 -#line 3406 "awkgram.c" /* yacc.c:1646  */
++#line 3409 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 137:
- #line 1436 "awkgram.y" /* yacc.c:1646  */
 -#line 1422 "awkgram.y" /* yacc.c:1646  */
++#line 1425 "awkgram.y" /* yacc.c:1646  */
      {
                (yyvsp[0])->opcode = Op_postdecrement;
                (yyval) = mk_assignment((yyvsp[-1]), NULL, (yyvsp[0]));
          }
- #line 3429 "awkgram.c" /* yacc.c:1646  */
 -#line 3415 "awkgram.c" /* yacc.c:1646  */
++#line 3418 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 138:
- #line 1441 "awkgram.y" /* yacc.c:1646  */
 -#line 1427 "awkgram.y" /* yacc.c:1646  */
++#line 1430 "awkgram.y" /* yacc.c:1646  */
      {
                if (do_lint_old) {
                    warning_ln((yyvsp[-1])->source_line,
@@@ -3449,64 -3435,64 +3438,64 @@@
                        (yyval) = list_append(list_merge(t, (yyvsp[0])), 
(yyvsp[-1]));
                }
          }
- #line 3453 "awkgram.c" /* yacc.c:1646  */
 -#line 3439 "awkgram.c" /* yacc.c:1646  */
++#line 3442 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 139:
- #line 1466 "awkgram.y" /* yacc.c:1646  */
 -#line 1452 "awkgram.y" /* yacc.c:1646  */
++#line 1455 "awkgram.y" /* yacc.c:1646  */
      {
                  (yyval) = mk_getline((yyvsp[-1]), (yyvsp[0]), (yyvsp[-3]), 
(yyvsp[-2])->redir_type);
                  bcfree((yyvsp[-2]));
                }
- #line 3462 "awkgram.c" /* yacc.c:1646  */
 -#line 3448 "awkgram.c" /* yacc.c:1646  */
++#line 3451 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 140:
- #line 1472 "awkgram.y" /* yacc.c:1646  */
 -#line 1458 "awkgram.y" /* yacc.c:1646  */
++#line 1461 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1])); }
- #line 3468 "awkgram.c" /* yacc.c:1646  */
 -#line 3454 "awkgram.c" /* yacc.c:1646  */
++#line 3457 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 141:
- #line 1474 "awkgram.y" /* yacc.c:1646  */
 -#line 1460 "awkgram.y" /* yacc.c:1646  */
++#line 1463 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1])); }
- #line 3474 "awkgram.c" /* yacc.c:1646  */
 -#line 3460 "awkgram.c" /* yacc.c:1646  */
++#line 3463 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 142:
- #line 1476 "awkgram.y" /* yacc.c:1646  */
 -#line 1462 "awkgram.y" /* yacc.c:1646  */
++#line 1465 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1])); }
- #line 3480 "awkgram.c" /* yacc.c:1646  */
 -#line 3466 "awkgram.c" /* yacc.c:1646  */
++#line 3469 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 143:
- #line 1478 "awkgram.y" /* yacc.c:1646  */
 -#line 1464 "awkgram.y" /* yacc.c:1646  */
++#line 1467 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1])); }
- #line 3486 "awkgram.c" /* yacc.c:1646  */
 -#line 3472 "awkgram.c" /* yacc.c:1646  */
++#line 3475 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 144:
- #line 1480 "awkgram.y" /* yacc.c:1646  */
 -#line 1466 "awkgram.y" /* yacc.c:1646  */
++#line 1469 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1])); }
- #line 3492 "awkgram.c" /* yacc.c:1646  */
 -#line 3478 "awkgram.c" /* yacc.c:1646  */
++#line 3481 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 145:
- #line 1482 "awkgram.y" /* yacc.c:1646  */
 -#line 1468 "awkgram.y" /* yacc.c:1646  */
++#line 1471 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = list_append(list_merge((yyvsp[-2]), (yyvsp[0])), 
(yyvsp[-1])); }
- #line 3498 "awkgram.c" /* yacc.c:1646  */
 -#line 3484 "awkgram.c" /* yacc.c:1646  */
++#line 3487 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 146:
- #line 1487 "awkgram.y" /* yacc.c:1646  */
 -#line 1473 "awkgram.y" /* yacc.c:1646  */
++#line 1476 "awkgram.y" /* yacc.c:1646  */
      {
                (yyval) = list_create((yyvsp[0]));
          }
- #line 3506 "awkgram.c" /* yacc.c:1646  */
 -#line 3492 "awkgram.c" /* yacc.c:1646  */
++#line 3495 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 147:
- #line 1491 "awkgram.y" /* yacc.c:1646  */
 -#line 1477 "awkgram.y" /* yacc.c:1646  */
++#line 1480 "awkgram.y" /* yacc.c:1646  */
      {
                if ((yyvsp[0])->opcode == Op_match_rec) {
                        (yyvsp[0])->opcode = Op_nomatch;
@@@ -3515,42 -3501,60 +3504,42 @@@
                        (yyval) = 
list_append(list_append(list_create((yyvsp[-1])),
                                                instruction(Op_field_spec)), 
(yyvsp[0]));
                } else {
 -                      if (do_optimize && (yyvsp[0])->nexti == 
(yyvsp[0])->lasti
 -                                      && (yyvsp[0])->nexti->opcode == 
Op_push_i
 -                                      && ((yyvsp[0])->nexti->memory->flags & 
(MPFN|MPZN)) == 0
 -                      ) {
 -                              NODE *n = (yyvsp[0])->nexti->memory;
 -                              if ((n->flags & (STRCUR|STRING)) != 0) {
 -                                      n->numbr = (AWKNUM) (n->stlen == 0);
 -                                      n->flags &= ~(STRCUR|STRING);
 -                                      n->flags |= (NUMCUR|NUMBER);
 -                                      efree(n->stptr);
 -                                      n->stptr = NULL;
 -                                      n->stlen = 0;
 -                              } else
 -                                      n->numbr = (AWKNUM) (n->numbr == 0.0);
 -                              bcfree((yyvsp[-1]));
 -                              (yyval) = (yyvsp[0]);
 -                      } else {
 -                              (yyvsp[-1])->opcode = Op_not;
 -                              add_lint((yyvsp[0]), LINT_assign_in_cond);
 -                              (yyval) = list_append((yyvsp[0]), (yyvsp[-1]));
 -                      }
 +                      (yyvsp[-1])->opcode = Op_not;
 +                      add_lint((yyvsp[0]), LINT_assign_in_cond);
 +                      (yyval) = list_append((yyvsp[0]), (yyvsp[-1]));
                }
           }
- #line 3524 "awkgram.c" /* yacc.c:1646  */
 -#line 3528 "awkgram.c" /* yacc.c:1646  */
++#line 3513 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 148:
- #line 1505 "awkgram.y" /* yacc.c:1646  */
 -#line 1509 "awkgram.y" /* yacc.c:1646  */
++#line 1494 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[-1]); }
- #line 3530 "awkgram.c" /* yacc.c:1646  */
 -#line 3534 "awkgram.c" /* yacc.c:1646  */
++#line 3519 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 149:
- #line 1507 "awkgram.y" /* yacc.c:1646  */
 -#line 1511 "awkgram.y" /* yacc.c:1646  */
++#line 1496 "awkgram.y" /* yacc.c:1646  */
      {
                (yyval) = snode((yyvsp[-1]), (yyvsp[-3]));
                if ((yyval) == NULL)
                        YYABORT;
          }
- #line 3540 "awkgram.c" /* yacc.c:1646  */
 -#line 3544 "awkgram.c" /* yacc.c:1646  */
++#line 3529 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 150:
- #line 1513 "awkgram.y" /* yacc.c:1646  */
 -#line 1517 "awkgram.y" /* yacc.c:1646  */
++#line 1502 "awkgram.y" /* yacc.c:1646  */
      {
                (yyval) = snode((yyvsp[-1]), (yyvsp[-3]));
                if ((yyval) == NULL)
                        YYABORT;
          }
- #line 3550 "awkgram.c" /* yacc.c:1646  */
 -#line 3554 "awkgram.c" /* yacc.c:1646  */
++#line 3539 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 151:
- #line 1519 "awkgram.y" /* yacc.c:1646  */
 -#line 1523 "awkgram.y" /* yacc.c:1646  */
++#line 1508 "awkgram.y" /* yacc.c:1646  */
      {
                static bool warned = false;
  
@@@ -3563,45 -3567,45 +3552,45 @@@
                if ((yyval) == NULL)
                        YYABORT;
          }
- #line 3567 "awkgram.c" /* yacc.c:1646  */
 -#line 3571 "awkgram.c" /* yacc.c:1646  */
++#line 3556 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 154:
- #line 1534 "awkgram.y" /* yacc.c:1646  */
 -#line 1538 "awkgram.y" /* yacc.c:1646  */
++#line 1523 "awkgram.y" /* yacc.c:1646  */
      {
                (yyvsp[-1])->opcode = Op_preincrement;
                (yyval) = mk_assignment((yyvsp[0]), NULL, (yyvsp[-1]));
          }
- #line 3576 "awkgram.c" /* yacc.c:1646  */
 -#line 3580 "awkgram.c" /* yacc.c:1646  */
++#line 3565 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 155:
- #line 1539 "awkgram.y" /* yacc.c:1646  */
 -#line 1543 "awkgram.y" /* yacc.c:1646  */
++#line 1528 "awkgram.y" /* yacc.c:1646  */
      {
                (yyvsp[-1])->opcode = Op_predecrement;
                (yyval) = mk_assignment((yyvsp[0]), NULL, (yyvsp[-1]));
          }
- #line 3585 "awkgram.c" /* yacc.c:1646  */
 -#line 3589 "awkgram.c" /* yacc.c:1646  */
++#line 3574 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 156:
- #line 1544 "awkgram.y" /* yacc.c:1646  */
 -#line 1548 "awkgram.y" /* yacc.c:1646  */
++#line 1533 "awkgram.y" /* yacc.c:1646  */
      {
                (yyval) = list_create((yyvsp[0]));
          }
- #line 3593 "awkgram.c" /* yacc.c:1646  */
 -#line 3597 "awkgram.c" /* yacc.c:1646  */
++#line 3582 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 157:
- #line 1548 "awkgram.y" /* yacc.c:1646  */
 -#line 1552 "awkgram.y" /* yacc.c:1646  */
++#line 1537 "awkgram.y" /* yacc.c:1646  */
      {
                (yyval) = list_create((yyvsp[0]));
          }
- #line 3601 "awkgram.c" /* yacc.c:1646  */
 -#line 3605 "awkgram.c" /* yacc.c:1646  */
++#line 3590 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 158:
- #line 1552 "awkgram.y" /* yacc.c:1646  */
 -#line 1556 "awkgram.y" /* yacc.c:1646  */
++#line 1541 "awkgram.y" /* yacc.c:1646  */
      {
                if ((yyvsp[0])->lasti->opcode == Op_push_i
                        && ((yyvsp[0])->lasti->memory->flags & (STRCUR|STRING)) 
== 0
@@@ -3616,11 -3620,11 +3605,11 @@@
                        (yyval) = list_append((yyvsp[0]), (yyvsp[-1]));
                }
          }
- #line 3620 "awkgram.c" /* yacc.c:1646  */
 -#line 3624 "awkgram.c" /* yacc.c:1646  */
++#line 3609 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 159:
- #line 1567 "awkgram.y" /* yacc.c:1646  */
 -#line 1571 "awkgram.y" /* yacc.c:1646  */
++#line 1556 "awkgram.y" /* yacc.c:1646  */
      {
            /*
             * was: $$ = $2
@@@ -3629,20 -3633,20 +3618,20 @@@
                (yyvsp[-1])->opcode = Op_unary_plus;
                (yyval) = list_append((yyvsp[0]), (yyvsp[-1]));
          }
- #line 3633 "awkgram.c" /* yacc.c:1646  */
 -#line 3637 "awkgram.c" /* yacc.c:1646  */
++#line 3622 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 160:
- #line 1579 "awkgram.y" /* yacc.c:1646  */
 -#line 1583 "awkgram.y" /* yacc.c:1646  */
++#line 1568 "awkgram.y" /* yacc.c:1646  */
      {
                func_use((yyvsp[0])->lasti->func_name, FUNC_USE);
                (yyval) = (yyvsp[0]);
          }
- #line 3642 "awkgram.c" /* yacc.c:1646  */
 -#line 3646 "awkgram.c" /* yacc.c:1646  */
++#line 3631 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 161:
- #line 1584 "awkgram.y" /* yacc.c:1646  */
 -#line 1588 "awkgram.y" /* yacc.c:1646  */
++#line 1573 "awkgram.y" /* yacc.c:1646  */
      {
                /* indirect function call */
                INSTRUCTION *f, *t;
@@@ -3675,11 -3679,11 +3664,11 @@@
  
                (yyval) = list_prepend((yyvsp[0]), t);
          }
- #line 3679 "awkgram.c" /* yacc.c:1646  */
 -#line 3683 "awkgram.c" /* yacc.c:1646  */
++#line 3668 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 162:
- #line 1620 "awkgram.y" /* yacc.c:1646  */
 -#line 1624 "awkgram.y" /* yacc.c:1646  */
++#line 1609 "awkgram.y" /* yacc.c:1646  */
      {
                param_sanity((yyvsp[-1]));
                (yyvsp[-3])->opcode = Op_func_call;
@@@ -3693,49 -3697,49 +3682,49 @@@
                        (yyval) = list_append(t, (yyvsp[-3]));
                }
          }
- #line 3697 "awkgram.c" /* yacc.c:1646  */
 -#line 3701 "awkgram.c" /* yacc.c:1646  */
++#line 3686 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 163:
- #line 1637 "awkgram.y" /* yacc.c:1646  */
 -#line 1641 "awkgram.y" /* yacc.c:1646  */
++#line 1626 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 3703 "awkgram.c" /* yacc.c:1646  */
 -#line 3707 "awkgram.c" /* yacc.c:1646  */
++#line 3692 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 164:
- #line 1639 "awkgram.y" /* yacc.c:1646  */
 -#line 1643 "awkgram.y" /* yacc.c:1646  */
++#line 1628 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 3709 "awkgram.c" /* yacc.c:1646  */
 -#line 3713 "awkgram.c" /* yacc.c:1646  */
++#line 3698 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 165:
- #line 1644 "awkgram.y" /* yacc.c:1646  */
 -#line 1648 "awkgram.y" /* yacc.c:1646  */
++#line 1633 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 3715 "awkgram.c" /* yacc.c:1646  */
 -#line 3719 "awkgram.c" /* yacc.c:1646  */
++#line 3704 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 166:
- #line 1646 "awkgram.y" /* yacc.c:1646  */
 -#line 1650 "awkgram.y" /* yacc.c:1646  */
++#line 1635 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[-1]); }
- #line 3721 "awkgram.c" /* yacc.c:1646  */
 -#line 3725 "awkgram.c" /* yacc.c:1646  */
++#line 3710 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 167:
- #line 1651 "awkgram.y" /* yacc.c:1646  */
 -#line 1655 "awkgram.y" /* yacc.c:1646  */
++#line 1640 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 3727 "awkgram.c" /* yacc.c:1646  */
 -#line 3731 "awkgram.c" /* yacc.c:1646  */
++#line 3716 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 168:
- #line 1653 "awkgram.y" /* yacc.c:1646  */
 -#line 1657 "awkgram.y" /* yacc.c:1646  */
++#line 1642 "awkgram.y" /* yacc.c:1646  */
      {
                (yyval) = list_merge((yyvsp[-1]), (yyvsp[0]));
          }
- #line 3735 "awkgram.c" /* yacc.c:1646  */
 -#line 3739 "awkgram.c" /* yacc.c:1646  */
++#line 3724 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 169:
- #line 1660 "awkgram.y" /* yacc.c:1646  */
 -#line 1664 "awkgram.y" /* yacc.c:1646  */
++#line 1649 "awkgram.y" /* yacc.c:1646  */
      {
                INSTRUCTION *ip = (yyvsp[0])->lasti; 
                int count = ip->sub_count;      /* # of SUBSEP-seperated 
expressions */
@@@ -3749,11 -3753,11 +3738,11 @@@
                sub_counter++;  /* count # of dimensions */
                (yyval) = (yyvsp[0]);
          }
- #line 3753 "awkgram.c" /* yacc.c:1646  */
 -#line 3757 "awkgram.c" /* yacc.c:1646  */
++#line 3742 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 170:
- #line 1677 "awkgram.y" /* yacc.c:1646  */
 -#line 1681 "awkgram.y" /* yacc.c:1646  */
++#line 1666 "awkgram.y" /* yacc.c:1646  */
      {
                INSTRUCTION *t = (yyvsp[-1]);
                if ((yyvsp[-1]) == NULL) {
@@@ -3767,31 -3771,31 +3756,31 @@@
                        (yyvsp[0])->sub_count = count_expressions(&t, false);
                (yyval) = list_append(t, (yyvsp[0]));
          }
- #line 3771 "awkgram.c" /* yacc.c:1646  */
 -#line 3775 "awkgram.c" /* yacc.c:1646  */
++#line 3760 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 171:
- #line 1694 "awkgram.y" /* yacc.c:1646  */
 -#line 1698 "awkgram.y" /* yacc.c:1646  */
++#line 1683 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); }
- #line 3777 "awkgram.c" /* yacc.c:1646  */
 -#line 3781 "awkgram.c" /* yacc.c:1646  */
++#line 3766 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 172:
- #line 1696 "awkgram.y" /* yacc.c:1646  */
 -#line 1700 "awkgram.y" /* yacc.c:1646  */
++#line 1685 "awkgram.y" /* yacc.c:1646  */
      {
                (yyval) = list_merge((yyvsp[-1]), (yyvsp[0]));
          }
- #line 3785 "awkgram.c" /* yacc.c:1646  */
 -#line 3789 "awkgram.c" /* yacc.c:1646  */
++#line 3774 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 173:
- #line 1703 "awkgram.y" /* yacc.c:1646  */
 -#line 1707 "awkgram.y" /* yacc.c:1646  */
++#line 1692 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[-1]); }
- #line 3791 "awkgram.c" /* yacc.c:1646  */
 -#line 3795 "awkgram.c" /* yacc.c:1646  */
++#line 3780 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 174:
- #line 1708 "awkgram.y" /* yacc.c:1646  */
 -#line 1712 "awkgram.y" /* yacc.c:1646  */
++#line 1697 "awkgram.y" /* yacc.c:1646  */
      {
                char *var_name = (yyvsp[0])->lextok;
  
@@@ -3799,22 -3803,22 +3788,22 @@@
                (yyvsp[0])->memory = variable((yyvsp[0])->source_line, 
var_name, Node_var_new);
                (yyval) = list_create((yyvsp[0]));
          }
- #line 3803 "awkgram.c" /* yacc.c:1646  */
 -#line 3807 "awkgram.c" /* yacc.c:1646  */
++#line 3792 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 175:
- #line 1716 "awkgram.y" /* yacc.c:1646  */
 -#line 1720 "awkgram.y" /* yacc.c:1646  */
++#line 1705 "awkgram.y" /* yacc.c:1646  */
      {
                char *arr = (yyvsp[-1])->lextok;
                (yyvsp[-1])->memory = variable((yyvsp[-1])->source_line, arr, 
Node_var_new);
                (yyvsp[-1])->opcode = Op_push_array;
                (yyval) = list_prepend((yyvsp[0]), (yyvsp[-1]));
          }
- #line 3814 "awkgram.c" /* yacc.c:1646  */
 -#line 3818 "awkgram.c" /* yacc.c:1646  */
++#line 3803 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 176:
- #line 1726 "awkgram.y" /* yacc.c:1646  */
 -#line 1730 "awkgram.y" /* yacc.c:1646  */
++#line 1715 "awkgram.y" /* yacc.c:1646  */
      {
                INSTRUCTION *ip = (yyvsp[0])->nexti;
                if (ip->opcode == Op_push
@@@ -3826,73 -3830,73 +3815,73 @@@
                } else
                        (yyval) = (yyvsp[0]);
          }
- #line 3830 "awkgram.c" /* yacc.c:1646  */
 -#line 3834 "awkgram.c" /* yacc.c:1646  */
++#line 3819 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 177:
- #line 1738 "awkgram.y" /* yacc.c:1646  */
 -#line 1742 "awkgram.y" /* yacc.c:1646  */
++#line 1727 "awkgram.y" /* yacc.c:1646  */
      {
                (yyval) = list_append((yyvsp[-1]), (yyvsp[-2]));
                if ((yyvsp[0]) != NULL)
                        mk_assignment((yyvsp[-1]), NULL, (yyvsp[0]));
          }
- #line 3840 "awkgram.c" /* yacc.c:1646  */
 -#line 3844 "awkgram.c" /* yacc.c:1646  */
++#line 3829 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 178:
- #line 1747 "awkgram.y" /* yacc.c:1646  */
 -#line 1751 "awkgram.y" /* yacc.c:1646  */
++#line 1736 "awkgram.y" /* yacc.c:1646  */
      {
                (yyvsp[0])->opcode = Op_postincrement;
          }
- #line 3848 "awkgram.c" /* yacc.c:1646  */
 -#line 3852 "awkgram.c" /* yacc.c:1646  */
++#line 3837 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 179:
- #line 1751 "awkgram.y" /* yacc.c:1646  */
 -#line 1755 "awkgram.y" /* yacc.c:1646  */
++#line 1740 "awkgram.y" /* yacc.c:1646  */
      {
                (yyvsp[0])->opcode = Op_postdecrement;
          }
- #line 3856 "awkgram.c" /* yacc.c:1646  */
 -#line 3860 "awkgram.c" /* yacc.c:1646  */
++#line 3845 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 180:
- #line 1754 "awkgram.y" /* yacc.c:1646  */
 -#line 1758 "awkgram.y" /* yacc.c:1646  */
++#line 1743 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = NULL; }
- #line 3862 "awkgram.c" /* yacc.c:1646  */
 -#line 3866 "awkgram.c" /* yacc.c:1646  */
++#line 3851 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 182:
- #line 1762 "awkgram.y" /* yacc.c:1646  */
 -#line 1766 "awkgram.y" /* yacc.c:1646  */
++#line 1751 "awkgram.y" /* yacc.c:1646  */
      { yyerrok; }
- #line 3868 "awkgram.c" /* yacc.c:1646  */
 -#line 3872 "awkgram.c" /* yacc.c:1646  */
++#line 3857 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 183:
- #line 1766 "awkgram.y" /* yacc.c:1646  */
 -#line 1770 "awkgram.y" /* yacc.c:1646  */
++#line 1755 "awkgram.y" /* yacc.c:1646  */
      { yyerrok; }
- #line 3874 "awkgram.c" /* yacc.c:1646  */
 -#line 3878 "awkgram.c" /* yacc.c:1646  */
++#line 3863 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 186:
- #line 1775 "awkgram.y" /* yacc.c:1646  */
 -#line 1779 "awkgram.y" /* yacc.c:1646  */
++#line 1764 "awkgram.y" /* yacc.c:1646  */
      { yyerrok; }
- #line 3880 "awkgram.c" /* yacc.c:1646  */
 -#line 3884 "awkgram.c" /* yacc.c:1646  */
++#line 3869 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 187:
- #line 1779 "awkgram.y" /* yacc.c:1646  */
 -#line 1783 "awkgram.y" /* yacc.c:1646  */
++#line 1768 "awkgram.y" /* yacc.c:1646  */
      { (yyval) = (yyvsp[0]); yyerrok; }
- #line 3886 "awkgram.c" /* yacc.c:1646  */
 -#line 3890 "awkgram.c" /* yacc.c:1646  */
++#line 3875 "awkgram.c" /* yacc.c:1646  */
      break;
  
    case 188:
- #line 1783 "awkgram.y" /* yacc.c:1646  */
 -#line 1787 "awkgram.y" /* yacc.c:1646  */
++#line 1772 "awkgram.y" /* yacc.c:1646  */
      { yyerrok; }
- #line 3892 "awkgram.c" /* yacc.c:1646  */
 -#line 3896 "awkgram.c" /* yacc.c:1646  */
++#line 3881 "awkgram.c" /* yacc.c:1646  */
      break;
  
  
- #line 3896 "awkgram.c" /* yacc.c:1646  */
 -#line 3900 "awkgram.c" /* yacc.c:1646  */
++#line 3885 "awkgram.c" /* yacc.c:1646  */
        default: break;
      }
    /* User semantic actions sometimes alter yychar, and that requires
@@@ -4120,7 -4124,7 +4109,7 @@@ yyreturn
  #endif
    return yyresult;
  }
- #line 1785 "awkgram.y" /* yacc.c:1906  */
 -#line 1789 "awkgram.y" /* yacc.c:1906  */
++#line 1774 "awkgram.y" /* yacc.c:1906  */
  
  
  struct token {
@@@ -7800,11 -7854,81 +7842,90 @@@ one_line_close(int fd
        return ret;
  }
  
+ 
 +#ifdef NUMDEBUG
 +static NODE *
 +do_default(int nargs)
 +{
 +      fatal(_("not implemented"));
 +      return NULL;
 +}
 +#endif
++
+ /* lookup_builtin --- find a builtin function or return NULL */
+ 
+ builtin_func_t
+ lookup_builtin(const char *name)
+ {
+       int mid = check_special(name);
+ 
+       if (mid == -1 || tokentab[mid].class != LEX_BUILTIN)
+               return NULL;
+ 
+       return tokentab[mid].ptr;
+ }
+ 
+ /* install_builtins --- add built-in functions to FUNCTAB */
+ 
+ void
+ install_builtins(void)
+ {
+       int i, j;
+ 
+       j = sizeof(tokentab) / sizeof(tokentab[0]);
+       for (i = 0; i < j; i++) {
+               if (    tokentab[i].class == LEX_BUILTIN
+                   && (tokentab[i].flags & DEBUG_USE) == 0) {
+                       (void) install_symbol(tokentab[i].operator, 
Node_builtin_func);
+               }
+       }
+ }
+ 
+ /*
+  * 9/2014: Gawk cannot use <ctype.h> isalpha or isalnum when
+  * parsing the program since that can let through non-English
+  * letters.  So, we supply our own. address@hidden&*()-ing locales!
+  */
+ 
+ /* is_alpha --- return true if c is an English letter */
+ 
+ bool
+ is_alpha(int c)
+ {
+ #ifdef I_DONT_KNOW_WHAT_IM_DOING
+       return isalpha(c);
+ #else /* ! I_DONT_KNOW_WHAT_IM_DOING */
+       switch (c) {
+       case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+       case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+       case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+       case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+       case 'y': case 'z':
+       case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+       case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+       case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+       case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+       case 'Y': case 'Z':
+               return true;
+       }
+       return false;
+ #endif /* ! I_DONT_KNOW_WHAT_IM_DOING */
+ }
+ 
+ /* is_alnum --- return true for alphanumeric, English only letters */
+ 
+ bool
+ is_alnum(int c)
+ {
+       /* digit test is good for EBCDIC too. so there. */
+       return (is_alpha(c) || ('0' <= c && c <= '9'));
+ }
+ 
+ 
+ /* is_identchar --- return true if c can be in an identifier */
+ 
+ bool
+ is_identchar(int c)
+ {
+       return (is_alnum(c) || c == '_');
+ }
diff --cc awkgram.y
index 9b0f311,eaa615a..852621e
--- a/awkgram.y
+++ b/awkgram.y
@@@ -5461,11 -5515,81 +5503,90 @@@ one_line_close(int fd
        return ret;
  }
  
+ 
 +#ifdef NUMDEBUG
 +static NODE *
 +do_default(int nargs)
 +{
 +      fatal(_("not implemented"));
 +      return NULL;
 +}
 +#endif
++
+ /* lookup_builtin --- find a builtin function or return NULL */
+ 
+ builtin_func_t
+ lookup_builtin(const char *name)
+ {
+       int mid = check_special(name);
+ 
+       if (mid == -1 || tokentab[mid].class != LEX_BUILTIN)
+               return NULL;
+ 
+       return tokentab[mid].ptr;
+ }
+ 
+ /* install_builtins --- add built-in functions to FUNCTAB */
+ 
+ void
+ install_builtins(void)
+ {
+       int i, j;
+ 
+       j = sizeof(tokentab) / sizeof(tokentab[0]);
+       for (i = 0; i < j; i++) {
+               if (    tokentab[i].class == LEX_BUILTIN
+                   && (tokentab[i].flags & DEBUG_USE) == 0) {
+                       (void) install_symbol(tokentab[i].operator, 
Node_builtin_func);
+               }
+       }
+ }
+ 
+ /*
+  * 9/2014: Gawk cannot use <ctype.h> isalpha or isalnum when
+  * parsing the program since that can let through non-English
+  * letters.  So, we supply our own. address@hidden&*()-ing locales!
+  */
+ 
+ /* is_alpha --- return true if c is an English letter */
+ 
+ bool
+ is_alpha(int c)
+ {
+ #ifdef I_DONT_KNOW_WHAT_IM_DOING
+       return isalpha(c);
+ #else /* ! I_DONT_KNOW_WHAT_IM_DOING */
+       switch (c) {
+       case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':
+       case 'g': case 'h': case 'i': case 'j': case 'k': case 'l':
+       case 'm': case 'n': case 'o': case 'p': case 'q': case 'r':
+       case 's': case 't': case 'u': case 'v': case 'w': case 'x':
+       case 'y': case 'z':
+       case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':
+       case 'G': case 'H': case 'I': case 'J': case 'K': case 'L':
+       case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R':
+       case 'S': case 'T': case 'U': case 'V': case 'W': case 'X':
+       case 'Y': case 'Z':
+               return true;
+       }
+       return false;
+ #endif /* ! I_DONT_KNOW_WHAT_IM_DOING */
+ }
+ 
+ /* is_alnum --- return true for alphanumeric, English only letters */
+ 
+ bool
+ is_alnum(int c)
+ {
+       /* digit test is good for EBCDIC too. so there. */
+       return (is_alpha(c) || ('0' <= c && c <= '9'));
+ }
+ 
+ 
+ /* is_identchar --- return true if c can be in an identifier */
+ 
+ bool
+ is_identchar(int c)
+ {
+       return (is_alnum(c) || c == '_');
+ }
diff --cc long_double.h
index ee7c13d,0000000..e9fb55e
mode 100644,000000..100644
--- a/long_double.h
+++ b/long_double.h
@@@ -1,1830 -1,0 +1,1891 @@@
 +/*
 + * long_double.h - routines for AWKLDBL number support in gawk.
 + */
 +
 +/* 
 + * Copyright (C) 2012 the Free Software Foundation, Inc.
 + * 
 + * This file is part of GAWK, the GNU implementation of the
 + * AWK Programming Language.
 + * 
 + * GAWK is free software; you can redistribute it and/or modify
 + * it under the terms of the GNU General Public License as published by
 + * the Free Software Foundation; either version 3 of the License, or
 + * (at your option) any later version.
 + * 
 + * GAWK is distributed in the hope that it will be useful,
 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + * GNU General Public License for more details.
 + * 
 + * You should have received a copy of the GNU General Public License
 + * along with this program; if not, write to the Free Software
 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, 
USA
 + */
 +
 +
 +/*
 + * XXX:       This is a only a template, and M*U**S***T N*O**T include any 
headers
 + *    nor any reference to the C long double type. Please see long_double.c.
 + */
 +
 +
 +static AWKLDBL *pow2d_table;  /* 2^n table for 0 <= n <= 128 */
 +static void init_pow2d_table(void);
 +static AWKLDBL pow2ld__p(int n);
 +
 +static inline AWKLDBL
 +pow2ld(unsigned int n)
 +{
 +      return n <= 128 ? pow2d_table[n] : pow2ld__p(n);
 +}
 +
 +/* Can declare these, since we always use the random shipped with gawk */
 +extern char *initstate(unsigned long seed, char *state, long n);
 +extern char *setstate(char *state);
 +extern long random(void);
 +extern void srandom(unsigned long seed);
 +
 +/*
 + * Since we supply the version of random(), we know what
 + * value to use here.
 + */
 +#define GAWK_RANDOM_MAX 0x7fffffffL
 +
 +
 +/* exported routines */
 +
 +static NODE *make_awknum(AWKNUM);
 +static void free_awkldbl(NODE *tmp);
 +static int cmp_awkldbls(const NODE *, const NODE *);
 +static void negate_awkldbl(NODE *);
 +static NODE *str2awkldbl(char *, char **, int, bool);
 +static NODE *force_awkldbl(NODE *);
 +static NODE *format_awkldbl_val(const char *, int, NODE *);
 +static unsigned long awkldbl_toulong(const NODE *);
 +static long awkldbl_tolong(const NODE *);
 +static double awkldbl_todouble(const NODE *);
 +static uintmax_t awkldbl_touintmax_t(const NODE *);
 +static int awkldbl_sgn(const NODE *);
 +static bool awkldbl_isinteger(const NODE *);
 +static bool awkldbl_isnan(const NODE *);
 +static bool awkldbl_isinf(const NODE *);
 +static NODE *awkldbl_copy(const NODE *);
 +static int format_awkldbl_printf(NODE *, struct format_spec *, struct 
print_fmt_buf *);
 +static bool awkldbl_init(bltin_t **);
 +static NODE *awkldbl_add(const NODE *, const NODE *);
 +static NODE *awkldbl_sub(const NODE *, const NODE *);
 +static NODE *awkldbl_mul(const NODE *, const NODE *);
 +static NODE *awkldbl_div(const NODE *, const NODE *);
 +static NODE *awkldbl_mod(const NODE *, const NODE *);
 +static NODE *awkldbl_pow(const NODE *, const NODE *);
 +static NODE *awkldbl_add_long(const NODE *, long);
 +static NODE *awkldbl_update_var(NODE *);
 +static void awkldbl_set_var(const NODE *);
 +static long awkldbl_increment_var(const NODE *, long);
 +static void awkldbl_init_vars(void);
 +
 +static NODE *do_and(int);
 +static NODE *do_atan2(int);
 +static NODE *do_compl(int);
 +static NODE *do_cos(int);
++static NODE *do_div_l(int);
 +static NODE *do_exp(int);
 +static NODE *do_int(int);
 +static NODE *do_log(int);
 +static NODE *do_lshift(int);
 +static NODE *do_or(int);
 +static NODE *do_rand(int);
 +static NODE *do_rshift(int);
 +static NODE *do_sin(int);
 +static NODE *do_sqrt(int);
 +static NODE *do_srand(int);
 +static NODE *do_strtonum(int);
 +static NODE *do_xor(int);
 +
 +/* private routines */
 +static int is_ieee_magic_val(const char *val);
 +static AWKLDBL get_ieee_magic_val(const char *val);
 +static AWKLDBL calc_exp(AWKLDBL x1, AWKLDBL x2);
 +static NODE *make_awkldbl(AWKLDBL);
 +
 +static long MFNR;
 +static long MNR;
 +
 +numbr_handler_t awkldbl_hndlr = {
 +      awkldbl_init,
 +      NULL,   /* version_str */
 +      NULL,   /* load_procinfo */
 +      make_awknum,
 +      str2awkldbl,
 +      awkldbl_copy,
 +      free_awkldbl,
 +      force_awkldbl,
 +      negate_awkldbl,
 +      cmp_awkldbls,
 +      awkldbl_sgn,
 +      awkldbl_isinteger,
 +      awkldbl_isnan,
 +      awkldbl_isinf,
 +      format_awkldbl_val,
 +      format_awkldbl_printf,
 +      awkldbl_todouble,
 +      awkldbl_tolong,
 +      awkldbl_toulong,
 +      awkldbl_touintmax_t,
 +      awkldbl_add,
 +      awkldbl_sub,
 +      awkldbl_mul,
 +      awkldbl_div,
 +      awkldbl_mod,
 +      awkldbl_pow,
 +      awkldbl_add_long,
 +      awkldbl_update_var,
 +      awkldbl_set_var,
 +      awkldbl_increment_var,
 +      awkldbl_init_vars,
 +};
 +
 +/* awkldbl_init --- initialization routine */
 +
 +static bool
 +awkldbl_init(bltin_t **numbr_bltins)
 +{
 +      static bltin_t awkldbl_bltins[] = {
 +              { "and",        do_and },
 +              { "atan2",      do_atan2 },
 +              { "compl",      do_compl },
 +              { "cos",        do_cos },
++              { "div",        do_div_l },
 +              { "exp",        do_exp },
 +              { "int",        do_int },
 +              { "log",        do_log },
 +              { "lshift",     do_lshift },
 +              { "or",         do_or },
 +              { "rand",       do_rand },
 +              { "rshift",     do_rshift },
 +              { "sin",        do_sin },
 +              { "sqrt",       do_sqrt },
 +              { "srand",      do_srand },
 +              { "strtonum",   do_strtonum },
 +              { "xor",        do_xor },
 +              { NULL, NULL },
 +      };
 +
 +      /* set the numeric value of null string */
 +      get_long_double(Nnull_string->qnumbr);
 +      LDBL_VAL(Nnull_string) = LDC(0.0);
 +      Nnull_string->flags |= (NUMCUR|NUMBER);
 +
 +      /* initialize TRUE and FALSE nodes */
 +      false_node = make_awkldbl(LDC(0.0));
 +      true_node = make_awkldbl(LDC(1.0));
 +      false_node->flags |= NUMINT;
 +      true_node->flags |= NUMINT;
 +
 +      init_pow2d_table();     /* FIXME -- initialize only if needed ? */
 +
 +      *numbr_bltins = awkldbl_bltins;
 +      return true;
 +}
 +
 +/* awkldbl_toulong --- conversion to unsigned long */
 +
 +static unsigned long
 +awkldbl_toulong(const NODE *n)
 +{
 +      return LDBL_VAL(n);
 +}
 +
 +/* awkldbl_tolong --- conversion to long */
 +
 +static long
 +awkldbl_tolong(const NODE *n)
 +{
 +      return LDBL_VAL(n);
 +}
 +
 +/* awkldbl_todouble --- conversion to double */
 +
 +static double
 +awkldbl_todouble(const NODE *n)
 +{
 +      return LDBL_VAL(n);
 +}
 +
 +/* awkldbl_touintmax_t --- conversion to uintmax_t */
 +
 +static uintmax_t
 +awkldbl_touintmax_t(const NODE *n)
 +{
 +      return LDBL_VAL(n);
 +}
 +
 +/* awkldbl_sgn --- return 1 if number > 0, zero if number == 0, and -1 if 
number < 0 */
 +
 +static int
 +awkldbl_sgn(const NODE *n)
 +{
 +      AWKLDBL d = LDBL_VAL(n);
 +      return (d < LDC(0.0) ? -1 : d > LDC(0.0));
 +}
 +
 +/* awkldbl_isinteger --- check if a number is an integer */
 +
 +static bool
 +awkldbl_isinteger(const NODE *n)
 +{
 +      AWKLDBL d = LDBL_VAL(n);
 +
 +      if (isnan(d) || isinf(d))
 +              return false;
 +      return double_to_int(d) == d;
 +}
 +
 +/* awkldbl_isnan --- check if number is NaN */
 +
 +static bool
 +awkldbl_isnan(const NODE *n)
 +{
 +      return isnan(LDBL_VAL(n));
 +}
 +
 +/* awkldbl_isinf --- check if number is infinity */
 +
 +static bool
 +awkldbl_isinf(const NODE *n)
 +{
 +      return isinf(LDBL_VAL(n));
 +}
 +
 +/* negate_awkldbl --- negate number in NODE */
 +
 +static void
 +negate_awkldbl(NODE *n)
 +{
 +      LDBL_VAL(n) = - LDBL_VAL(n);
 +}
 +
 +/* awkldbl_add --- add two numbers */
 +
 +static NODE *
 +awkldbl_add(const NODE *t1, const NODE *t2)
 +{
 +      return make_awkldbl(LDBL_VAL(t1) + LDBL_VAL(t2));
 +}
 +
 +/* awkldbl_sub --- subtract two numbers */
 +
 +static NODE *
 +awkldbl_sub(const NODE *t1, const NODE *t2)
 +{
 +      return make_awkldbl(LDBL_VAL(t1) - LDBL_VAL(t2));
 +}
 +
 +/* awkldbl_mul --- multiply two numbers */
 +
 +static NODE *
 +awkldbl_mul(const NODE *t1, const NODE *t2)
 +{
 +      return make_awkldbl(LDBL_VAL(t1) * LDBL_VAL(t2));
 +}
 +
 +/* awkldbl_add --- quotient of two numbers */
 +
 +static NODE *
 +awkldbl_div(const NODE *t1, const NODE *t2)
 +{
 +      AWKLDBL d = LDBL_VAL(t2);
 +      if (d == LDC(0.0))
 +              fatal(_("division by zero attempted"));
 +      return make_awkldbl(LDBL_VAL(t1) / d);
 +}
 +
 +/* awkldbl_add_long --- add long value to a number */
 +
 +static NODE *
 +awkldbl_add_long(const NODE *t1, long n)
 +{
 +      return make_awkldbl(LDBL_VAL(t1) + (AWKLDBL) n);
 +}
 +
 +/* awkldbl_copy --- copy a number */
 +
 +static NODE *
 +awkldbl_copy(const NODE *t1)
 +{
 +      return make_awkldbl(LDBL_VAL(t1));
 +}
 +
 +/* awkldbl_update_var --- update a special variable from internal variables */
 +
 +static NODE *
 +awkldbl_update_var(NODE *var)
 +{
 +      NODE *val = var->var_value;
 +      AWKLDBL d;
 +
 +      d = LDBL_VAL(val);
 +      if (var == NR_node) {
 +              if (MNR == 0 && d != NR) {
 +                      unref(val);
 +                      val = NR_node->var_value = make_awkldbl((AWKLDBL) NR);
 +              } else if (MNR != 0) {
 +                      unref(val);
 +                      d = ((AWKLDBL) MNR) * LONG_MAX + (AWKLDBL) NR;
 +                      val = var->var_value = make_awkldbl(d);
 +              }
 +              return val;
 +      }
 +
 +      assert(var == FNR_node);
 +      if (MFNR == 0 && d != FNR) {
 +              unref(val);
 +              val = FNR_node->var_value = make_awkldbl((AWKLDBL) FNR);
 +      } else if (MFNR != 0) {
 +              unref(val);
 +              d = ((AWKLDBL) MFNR) * LONG_MAX + (AWKLDBL) FNR;
 +              val = var->var_value = make_awkldbl(d);
 +      }
 +      return val;
 +}
 +
 +/*
 + * awkldbl_set_var --- update internal variables for assignment
 + *    to a special variable.
 + */
 +
 +static void
 +awkldbl_set_var(const NODE *var)
 +{
 +      NODE *val = var->var_value;
 +      AWKLDBL d;
 +      
 +      if (var == NR_node) {
 +              d = LDBL_VAL(val);
 +              MNR = d / LONG_MAX;
 +              NR = d - ((AWKLDBL) MNR) * LONG_MAX;
 +      } else if (var == FNR_node) {
 +              d = LDBL_VAL(val);
 +              MFNR = d / LONG_MAX;
 +              FNR = d - ((AWKLDBL) MFNR) * LONG_MAX;
 +      } else {
 +              /* PREC and ROUNMODE */
 +              if (do_lint)
 +                      lintwarn(_("setting `%s' has no effect"),
 +                              var == PREC_node ? "PREC" : "ROUNDMODE");
 +      }
 +}
 +
 +/* awkldbl_increment_var --- increment NR or FNR */
 +
 +static long
 +awkldbl_increment_var(const NODE *var, long nr)
 +{
 +      if (nr == LONG_MAX - 1) {
 +              /* increment quotient, set remainder(NR or FNR) to 0 */
 +              if (var == NR_node)
 +                      MNR++;
 +              else /* var == FNR_node */
 +                      MFNR++;
 +              return 0;
 +      }
 +      return ++nr;
 +}
 +
 +/* awkldbl_init_vars --- initialize special variables */
 +
 +static void
 +awkldbl_init_vars()
 +{
 +      unref(PREC_node->var_value);
 +        PREC_node->var_value = make_awknum(GAWK_LDBL_FRAC_BITS);
 +      PREC_node->var_value->flags |= NUMINT;
 +        unref(ROUNDMODE_node->var_value);
 +        ROUNDMODE_node->var_value = make_string("N", 1);
 +}
 +
 +/*
 + * make_awkldbl --- allocate a node with defined number;
 + *    this routine is not exported. 
 + */
 +
 +static NODE *
 +make_awkldbl(AWKLDBL x)
 +{
 +      NODE *r;
 +      getnode(r);
 +      r->type = Node_val;
 +      get_long_double(r->qnumbr);
 +      LDBL_VAL(r) = x;
 +      r->flags = MALLOC|NUMBER|NUMCUR;
 +      r->valref = 1;
 +      r->stptr = NULL;
 +      r->stlen = 0;
 +#if MBS_SUPPORT
 +      r->wstptr = NULL;
 +      r->wstlen = 0;
 +#endif /* defined MBS_SUPPORT */
 +      return r;
 +}
 +
 +/* make_awknum --- allocate a node with defined AWKNUM */
 +
 +static NODE *
 +make_awknum(AWKNUM x)
 +{
 +      NODE *r;
 +      getnode(r);
 +      r->type = Node_val;
 +      get_long_double(r->qnumbr);
 +      LDBL_VAL(r) = (AWKLDBL) x;
 +      r->flags = MALLOC|NUMBER|NUMCUR;
 +      r->valref = 1;
 +      r->stptr = NULL;
 +      r->stlen = 0;
 +#if MBS_SUPPORT
 +      r->wstptr = NULL;
 +      r->wstlen = 0;
 +#endif /* defined MBS_SUPPORT */
 +      return r;
 +}
 +
 +/* free_awkldbl --- free all storage allocated for a AWKLDBL */
 +
 +static void
 +free_awkldbl(NODE *tmp)
 +{
 +      assert((tmp->flags & (NUMBER|NUMCUR)) != 0);
 +        free_long_double(tmp->qnumbr);
 +}
 +
 +/* make_integer --- Convert an integer to a number node. */
 +
 +static inline NODE *
 +make_integer(uintmax_t n)
 +{
 +#ifdef HAVE_UINTMAX_T
 +
 +      /* N.B: -- see adjust_uint() in floatcomp.c */
 +
 +      /* XXX: is this really needed in this case ??? */
 +      
 +      if (GAWK_LDBL_FRAC_BITS < CHAR_BIT * sizeof (n)) {
 +              int i = CHAR_BIT * sizeof (n) - GAWK_LDBL_FRAC_BITS;
 +
 +              /* strip leading `i' bits */
 +
 +              n = (n << i) >> i;      /* XXX: equivalent code in floatcomp.c
 +                                       * generates compiler warning.
 +                                       */ 
 +      }
 +#endif /* HAVE_UINTMAX_T */
 +
 +      return make_awkldbl(n);
 +}
 +
 +/* do_lshift --- perform a << operation */
 +
 +static NODE *
 +do_lshift(int nargs)
 +{
 +      NODE *s1, *s2;
 +      uintmax_t uval, ushift, res;
 +      AWKLDBL val, shift;
 +
 +      s2 = POP_SCALAR();
 +      s1 = POP_SCALAR();
 +      if (do_lint) {
 +              if ((s1->flags & (NUMCUR|NUMBER)) == 0)
 +                      lintwarn(_("lshift: received non-numeric first 
argument"));
 +              if ((s2->flags & (NUMCUR|NUMBER)) == 0)
 +                      lintwarn(_("lshift: received non-numeric second 
argument"));
 +      }
 +
 +      (void) force_number(s1);
 +      (void) force_number(s2);
 +      val = LDBL_VAL(s1);
 +      shift = LDBL_VAL(s2);
 +
 +      if (do_lint) {
 +              if (val < LDC(0.0) || shift < LDC(0.0))
 +                      lintwarn(_("lshift(%f, %f): negative values will give 
strange results"),
 +                                      (double) val, (double) shift);
 +              if (double_to_int(val) != val || double_to_int(shift) != shift)
 +                      lintwarn(_("lshift(%f, %f): fractional values will be 
truncated"),
 +                                      (double) val, (double) shift);
 +              if (shift >= sizeof(uintmax_t) * CHAR_BIT)
 +                      lintwarn(_("lshift(%f, %f): too large shift value will 
give strange results"),
 +                                      (double) val, (double) shift);
 +      }
 +
 +      DEREF(s1);
 +      DEREF(s2);
 +      uval = (uintmax_t) val;
 +      ushift = (uintmax_t) shift;
 +      res = uval << ushift;
 +      return make_integer(res);
 +}
 +
 +/* do_rshift --- perform a >> operation */
 +
 +static NODE *
 +do_rshift(int nargs)
 +{
 +      NODE *s1, *s2;
 +      uintmax_t uval, ushift, res;
 +      AWKLDBL val, shift;
 +
 +      s2 = POP_SCALAR();
 +      s1 = POP_SCALAR();
 +      if (do_lint) {
 +              if ((s1->flags & (NUMCUR|NUMBER)) == 0)
 +                      lintwarn(_("rshift: received non-numeric first 
argument"));
 +              if ((s2->flags & (NUMCUR|NUMBER)) == 0)
 +                      lintwarn(_("rshift: received non-numeric second 
argument"));
 +      }
 +
 +      (void) force_number(s1);
 +      (void) force_number(s2);
 +      val = LDBL_VAL(s1);
 +      shift = LDBL_VAL(s2);
 +      if (do_lint) {
 +              if (val < LDC(0.0) || shift < LDC(0.0))
 +                      lintwarn(_("rshift(%f, %f): negative values will give 
strange results"),
 +                                      (double) val, (double) shift);
 +              if (double_to_int(val) != val || double_to_int(shift) != shift)
 +                      lintwarn(_("rshift(%f, %f): fractional values will be 
truncated"),
 +                                      (double) val, (double) shift);
 +              if (shift >= sizeof(uintmax_t) * CHAR_BIT)
 +                      lintwarn(_("rshift(%f, %f): too large shift value will 
give strange results"),
 +                                      (double) val, (double) shift);
 +      }
 +
 +      DEREF(s1);
 +      DEREF(s2);
 +      uval = (uintmax_t) val;
 +      ushift = (uintmax_t) shift;
 +      res = uval >> ushift;
 +      return make_integer(res);
 +}
 +
 +/* do_and --- perform an & operation */
 +
 +static NODE *
 +do_and(int nargs)
 +{
 +      NODE *s1;
 +      uintmax_t res, uval;
 +      AWKLDBL val;
 +      int i;
 +
 +      res = ~0;       /* start off with all ones */
 +      if (nargs < 2)
 +              fatal(_("and: called with less than two arguments"));
 +
 +      for (i = 1; nargs > 0; nargs--, i++) {
 +              s1 = POP_SCALAR();
 +              if (do_lint && (s1->flags & (NUMCUR|NUMBER)) == 0)
 +                      lintwarn(_("and: argument %d is non-numeric"), i);
 +
 +              (void) force_number(s1);
 +              val = LDBL_VAL(s1);
 +              if (do_lint && val < LDC(0.0))
 +                      lintwarn(_("and: argument %d negative value %g will 
give strange results"),
 +                                      i, (double) val);
 +
 +              uval = (uintmax_t) val;
 +              res &= uval;
 +              DEREF(s1);
 +      }
 +
 +      return make_integer(res);
 +}
 +
 +/* do_or --- perform an | operation */
 +
 +static NODE *
 +do_or(int nargs)
 +{
 +      NODE *s1;
 +      uintmax_t res, uval;
 +      AWKLDBL val;
 +      int i;
 +
 +      res = 0;
 +      if (nargs < 2)
 +              fatal(_("or: called with less than two arguments"));
 +
 +      for (i = 1; nargs > 0; nargs--, i++) {
 +              s1 = POP_SCALAR();
 +              if (do_lint && (s1->flags & (NUMCUR|NUMBER)) == 0)
 +                      lintwarn(_("or: argument %d is non-numeric"), i);
 +
 +              (void) force_number(s1);
 +              val = LDBL_VAL(s1);
 +              if (do_lint && val < LDC(0.0))
 +                      lintwarn(_("or: argument %d negative value %g will give 
strange results"),
 +                                      i, (double) val);
 +
 +              uval = (uintmax_t) val;
 +              res |= uval;
 +
 +              DEREF(s1);
 +      }
 +
 +      return make_integer(res);
 +}
 +
 +/* do_xor --- perform an ^ operation */
 +
 +static NODE *
 +do_xor(int nargs)
 +{
 +      NODE *s1;
 +      uintmax_t res, uval;
 +      AWKLDBL val;
 +      int i;
 +
 +      if (nargs < 2)
 +              fatal(_("xor: called with less than two arguments"));
 +
 +      res = 0;        /* silence compiler warning */
 +      for (i = 1; nargs > 0; nargs--, i++) {
 +              s1 = POP_SCALAR();
 +              if (do_lint && (s1->flags & (NUMCUR|NUMBER)) == 0)
 +                      lintwarn(_("xor: argument %d is non-numeric"), i);
 +
 +              (void) force_number(s1);
 +              val = LDBL_VAL(s1);
 +              if (do_lint && val < LDC(0.0))
 +                      lintwarn(_("xor: argument %d negative value %g will 
give strange results"),
 +                                      i, (double) val);
 +
 +              uval = (uintmax_t) val;
 +              if (i == 1)
 +                      res = uval;
 +              else
 +                      res ^= uval;
 +              DEREF(s1);
 +      }
 +
 +      return make_integer(res);
 +}
 +
 +/* do_compl --- perform a ~ operation */
 +
 +static NODE *
 +do_compl(int nargs)
 +{
 +      NODE *tmp;
 +      AWKLDBL d;
 +      uintmax_t uval;
 +
 +      tmp = POP_SCALAR();
 +      if (do_lint && (tmp->flags & (NUMCUR|NUMBER)) == 0)
 +              lintwarn(_("compl: received non-numeric argument"));
 +      (void) force_number(tmp);
 +      d = LDBL_VAL(tmp);
 +      DEREF(tmp);
 +
 +      if (do_lint) {
 +              if (d < LDC(0.0))
 +                      lintwarn(_("compl(%f): negative value will give strange 
results"), (double) d);
 +              if (double_to_int(d) != d)
 +                      lintwarn(_("compl(%f): fractional value will be 
truncated"), (double) d);
 +      }
 +
 +      uval = (uintmax_t) d;
 +      uval = ~ uval;
 +      return make_integer(uval);
 +}
 +
 +/* nondec2awkldbl --- convert octal or hex value to long double */
 +
 +/*
 + * Because of awk's concatenation rules and the way awk.y:yylex()
 + * collects a number, this routine has to be willing to stop on the
 + * first invalid character.
 + */
 +
 +static AWKLDBL
 +nondec2awkldbl(char *str, size_t len)
 +{
 +      AWKLDBL retval = 0.0;
 +      char save;
 +      short val;
 +      char *start = str;
 +
 +      if (*str == '0' && (str[1] == 'x' || str[1] == 'X')) {
 +              /*
 +               * User called strtonum("0x") or some such,
 +               * so just quit early.
 +               */
 +              if (len <= 2)
 +                      return 0.0;
 +
 +              for (str += 2, len -= 2; len > 0; len--, str++) {
 +                      switch (*str) {
 +                      case '0':
 +                      case '1':
 +                      case '2':
 +                      case '3':
 +                      case '4':
 +                      case '5':
 +                      case '6':
 +                      case '7':
 +                      case '8':
 +                      case '9':
 +                              val = *str - '0';
 +                              break;
 +                      case 'a':
 +                      case 'b':
 +                      case 'c':
 +                      case 'd':
 +                      case 'e':
 +                      case 'f':
 +                              val = *str - 'a' + 10;
 +                              break;
 +                      case 'A':
 +                      case 'B':
 +                      case 'C':
 +                      case 'D':
 +                      case 'E':
 +                      case 'F':
 +                              val = *str - 'A' + 10;
 +                              break;
 +                      default:
 +                              goto done;
 +                      }
 +                      retval = (retval * LDC(16.0)) + (AWKLDBL) val;
 +              }
 +      } else if (*str == '0') {
 +              for (; len > 0; len--) {
 +                      if (! isdigit((unsigned char) *str))
 +                              goto done;
 +                      else if (*str == '8' || *str == '9') {
 +                              str = start;
 +                              goto decimal;
 +                      }
 +                      retval = (retval * LDC(8.0)) + (AWKLDBL) (*str - '0');
 +                      str++;
 +              }
 +      } else {
 +decimal:
 +              save = str[len];
 +              retval = gawk_strtold(str, NULL);
 +              str[len] = save;
 +      }
 +done:
 +      return retval;
 +}
 +
 +
 +/* do_rand --- do the rand function */
 +
 +static bool firstrand = true;
 +/* Some systems require this array to be integer aligned. Sigh. */
 +#define SIZEOF_STATE 256
 +static uint32_t istate[SIZEOF_STATE/sizeof(uint32_t)];
 +static char *const state = (char *const) istate;
 +
 +/* ARGSUSED */
 +static NODE *
 +do_rand(int nargs ATTRIBUTE_UNUSED)
 +{
 +      double tmprand;
 +#define RAND_DIVISOR ((double)GAWK_RANDOM_MAX+1.0)
 +      if (firstrand) {
 +              (void) initstate((unsigned) 1, state, SIZEOF_STATE);
 +              /* don't need to srandom(1), initstate() does it for us. */
 +              firstrand = false;
 +              setstate(state);
 +      }
 +      /*
 +       * Per historical practice and POSIX, return value N is
 +       *
 +       *      0 <= n < 1
 +       */
 +      /*
 +       * Date: Wed, 28 Aug 2013 17:52:46 -0700
 +       * From: Bob Jewett <address@hidden>
 +       *
 +       * Call random() twice to fill in more bits in the value
 +       * of the double.  Also, there is a bug in random() such
 +       * that when the values of successive values are combined
 +       * like (rand1*rand2)^2, (rand3*rand4)^2,  ...  the
 +       * resulting time series is not white noise.  The
 +       * following also seems to fix that bug. 
 +       *
 +       * The add/subtract 0.5 keeps small bits from filling
 +       * below 2^-53 in the double, not that anyone should be
 +       * looking down there. 
 +       */
 + 
 +      tmprand = 0.5 + ( (random()/RAND_DIVISOR + random()) / RAND_DIVISOR);
 +      return make_awkldbl( (AWKLDBL) (tmprand - 0.5) );
 +}
 +
 +/* do_srand --- seed the random number generator */
 +
 +static NODE *
 +do_srand(int nargs)
 +{
 +      NODE *tmp;
 +      static long save_seed = 1;
 +      long ret = save_seed;   /* SVR4 awk srand returns previous seed */
 +      AWKLDBL d;
 +
 +      if (firstrand) {
 +              (void) initstate((unsigned) 1, state, SIZEOF_STATE);
 +              /* don't need to srandom(1), we're changing the seed below */
 +              firstrand = false;
 +              (void) setstate(state);
 +      }
 +
 +      if (nargs == 0)
 +              srandom((unsigned int) (save_seed = (long) time((time_t *) 0)));
 +      else {
 +              tmp = POP_SCALAR();
 +              if (do_lint && (tmp->flags & (NUMCUR|NUMBER)) == 0)
 +                      lintwarn(_("srand: received non-numeric argument"));
 +              (void) force_number(tmp);
 +              d = LDBL_VAL(tmp);
 +              srandom((unsigned int) (save_seed = (long) d));
 +              DEREF(tmp);
 +      }
 +      return make_awkldbl(ret);
 +}
 +
 +/* str2awkldbl --- create a number node from string */
 +
 +static NODE *
 +str2awkldbl(char *str, char **endptr, int base, bool is_integer 
ATTRIBUTE_UNUSED)
 +{
 +      NODE *r;
 +      AWKLDBL d;
 +
 +      if (base == 0) {
 +              /*
 +               * special case -- only used to parse input in the debugger?
 +               * FIXME: reject ieee specials we don't want and/or use the same
 +               * rules when reading numbers from a source file and nuke this 
case.
 +               * Also in double.c.
 +               */
 +
 +              errno = 0;
 +              d = gawk_strtold(str, endptr);
 +              if (errno != 0)
 +                      d = LDC(0.0);
 +      } else {
 +              if (base == 8 || base == 16)
 +                      d = nondec2awkldbl(str, strlen(str));
 +              else {
 +                      /* atof for double */
 +                      errno = 0;
 +                      d = gawk_strtold(str, NULL);
 +                      if (errno != 0)
 +                              d = LDC(0.0);
 +                      errno = 0;
 +              }
 +      }
 +
 +      r = make_awkldbl(d);
 +
 +      /* XXX: is this relevant ? */
 +      if (d <= INT32_MAX && d >= INT32_MIN && d == (int32_t) d)
 +              r->flags |= NUMINT;
 +
 +      return r;
 +}
 +
 +/* awkldbl_mod --- remainder from division of two numbers */
 +
 +static NODE *
 +awkldbl_mod(const NODE *t1, const NODE *t2)
 +{
 +      AWKLDBL d2;
 +
 +      d2 = LDBL_VAL(t2);
 +      if (d2 == LDC(0.0))
 +              fatal(_("division by zero attempted in `%%'"));
 +      return make_awkldbl(gawk_fmodl(LDBL_VAL(t1), d2));
 +}
 +
 +/* awkldbl_pow --- power function */
 +
 +static NODE *
 +awkldbl_pow(const NODE *t1, const NODE *t2)
 +{
 +      return make_awkldbl(calc_exp(LDBL_VAL(t1), LDBL_VAL(t2)));
 +}
 +
 +
 +/*
 + * calc_exp_posint --- calculate x^n for positive integral n,
 + *    using exponentiation by squaring without recursion.
 + */
 +
 +static AWKLDBL
 +calc_exp_posint(AWKLDBL x, long n)
 +{
 +      AWKLDBL mult = LDC(1.0);
 +
 +      while (n > 1) {
 +              if ((n % 2) == 1)
 +                      mult *= x;
 +              x *= x;
 +              n /= 2;
 +      }
 +      return mult * x;
 +}
 +
 +/* calc_exp --- calculate x1^x2 */
 +
 +static AWKLDBL
 +calc_exp(AWKLDBL x1, AWKLDBL x2)
 +{
 +      long lx = x2;
 +
 +      if (((AWKLDBL) lx) == x2) {             /* integer exponent */
 +              if (lx == 0)
 +                      return LDC(1.0);
 +              return (lx > 0) ? calc_exp_posint(x1, lx)
 +                              : LDC(1.0) / calc_exp_posint(x1, -lx);
 +      }
 +      return gawk_powl(x1, x2);
 +}
 +
 +/* cmp_awkldbls --- compare two doubles */
 +
 +static int
 +cmp_awkldbls(const NODE *t1, const NODE *t2)
 +{
 +      /*
 +       * This routine is also used to sort numeric array indices or values.
 +       * For the purposes of sorting, NaN is considered greater than
 +       * any other value, and all NaN values are considered equivalent and 
equal.
 +       * This isn't in compliance with IEEE standard, but compliance w.r.t. 
NaN
 +       * comparison at the awk level is a different issue, and needs to be 
dealt
 +       * with in the interpreter for each opcode seperately.
 +       */
 +      AWKLDBL d1 = LDBL_VAL(t1);
 +      AWKLDBL d2 = LDBL_VAL(t2);
 +
 +      if (isnan(d1))
 +              return ! isnan(d2);
 +      if (isnan(d2))
 +              return -1;
 +      /* don't subtract, in case one or both are infinite */
 +      if (d1 == d2)
 +              return 0;
 +      if (d1 < d2)
 +              return -1;
 +      return 1;
 +}
 +
 +/* force_awkldbl --- force a value to be numeric */
 +
 +static NODE *
 +force_awkldbl(NODE *n)
 +{
 +      char *cp;
 +      char *cpend;
 +      char save;
 +      char *ptr;
 +      unsigned int newflags;
 +
 +      if ((n->flags & NUMCUR) != 0)
 +              return n;
 +
 +      /* all the conditionals are an attempt to avoid the expensive strtod */
 +
 +      /* Note: only set NUMCUR if we actually convert some digits */
 +
 +      get_long_double(n->qnumbr);
 +      LDBL_VAL(n) = LDC(0.0);
 +
 +      if (n->stlen == 0)
 +              return n;
 +
 +      cp = n->stptr;
 +      /*
 +       * 2/2007:
 +       * POSIX, by way of severe language lawyering, seems to
 +       * allow things like "inf" and "nan" to mean something.
 +       * So if do_posix, the user gets what he deserves.
 +       * This also allows hexadecimal floating point. Ugh.
 +       */
 +      if (! do_posix) {
 +              if (isalpha((unsigned char) *cp)) {
 +                      return n;
 +              } else if (n->stlen == 4 && is_ieee_magic_val(n->stptr)) {
 +                      if ((n->flags & MAYBE_NUM) != 0)
 +                              n->flags &= ~MAYBE_NUM;
 +                      n->flags |= NUMBER|NUMCUR;
 +                      LDBL_VAL(n) = get_ieee_magic_val(n->stptr);
 +                      return n;
 +              }
 +              /* else
 +                      fall through */
 +      }
 +      /* else not POSIX, so
 +              fall through */
 +
 +      cpend = cp + n->stlen;
 +      while (cp < cpend && isspace((unsigned char) *cp))
 +              cp++;
 +
 +      if (   cp == cpend              /* only spaces, or */
 +          || (! do_posix              /* not POSIXLY paranoid and */
 +              && (isalpha((unsigned char) *cp)        /* letter, or */
 +                                      /* CANNOT do non-decimal and saw 0x */
 +                  || (! do_non_decimal_data && cp[0] == '0'
 +                      && (cp[1] == 'x' || cp[1] == 'X'))))) {
 +              return n;
 +      }
 +
 +      if ((n->flags & MAYBE_NUM) != 0) {
 +              newflags = NUMBER;
 +              n->flags &= ~MAYBE_NUM;
 +      } else
 +              newflags = 0;
 +
 +      if (cpend - cp == 1) {          /* only one character */
 +              if (isdigit((unsigned char) *cp)) {     /* it's a digit! */
 +                      LDBL_VAL(n) = (AWKLDBL)(*cp - '0');
 +                      n->flags |= newflags;
 +                      n->flags |= NUMCUR;
 +                      if (cp == n->stptr)             /* no leading spaces */
 +                              n->flags |= NUMINT;
 +              }
 +              return n;
 +      }
 +
 +      if (do_non_decimal_data) {      /* main.c assures false if do_posix */
 +              errno = 0;
 +              if (! do_traditional && get_numbase(cp, true) != 10) {
 +                      LDBL_VAL(n) = nondec2awkldbl(cp, cpend - cp);
 +                      n->flags |= NUMCUR;
 +                      ptr = cpend;
 +                      goto finish;
 +              }
 +      }
 +
 +      errno = 0;
 +      save = *cpend;
 +      *cpend = '\0';
 +      LDBL_VAL(n) = gawk_strtold((const char *) cp, & ptr);
 +
 +      /* POSIX says trailing space is OK for NUMBER */
 +      while (isspace((unsigned char) *ptr))
 +              ptr++;
 +      *cpend = save;
 +finish:
 +      if (errno == 0 && ptr == cpend) {
 +              n->flags |= newflags;
 +              n->flags |= NUMCUR;
 +      } else {
 +              errno = 0;
 +      }
 +      return n;
 +}
 +
 +
 +/*
 + * The following lookup table is used as an optimization in force_string;
 + * (more complicated) variations on this theme didn't seem to pay off, but 
 + * systematic testing might be in order at some point.
 + */
 +static const char *values[] = {
 +      "0",
 +      "1",
 +      "2",
 +      "3",
 +      "4",
 +      "5",
 +      "6",
 +      "7",
 +      "8",
 +      "9",
 +};
 +#define       NVAL    (sizeof(values)/sizeof(values[0]))
 +
 +/* format_awkldbl_val --- format a numeric value based on format */
 +
 +static NODE *
 +format_awkldbl_val(const char *format, int index, NODE *s)
 +{
 +      char buf[BUFSIZ];
 +      char *sp = buf;
 +      AWKLDBL ival, d;
 +
 +      /*
 +       * 2/2007: Simplify our lives here. Instead of worrying about
 +       * whether or not the value will fit into a long just so we
 +       * can use sprintf("%ld", val) on it, always format it ourselves.
 +       * The only thing to worry about is that integral values always
 +       * format as integers. %.0f does that very well.
 +       *
 +       * 6/2008: Would that things were so simple. Always using %.0f
 +       * imposes a notable performance penalty for applications that
 +       * do a lot of conversion of integers to strings. So, we reinstate
 +       * the old code, but use %.0f for integral values that are outside
 +       * the range of a long.  This seems a reasonable compromise.
 +       *
 +       * 12/2009: Use <= and >= in the comparisons with LONG_xxx instead of
 +       * < and > so that things work correctly on systems with 64 bit 
integers.
 +       */
 +
 +      d = LDBL_VAL(s);
 +
 +      if ((s->flags & STRCUR) != 0)
 +              efree(s->stptr);
 +      free_wstr(s);
 +
 +      /* not an integral value, or out of range */
 +      if ((ival = double_to_int(d)) != d
 +                      || ival <= (AWKLDBL) LONG_MIN || ival >= (AWKLDBL) 
LONG_MAX
 +      ) {
 +              struct format_spec spec;
 +              struct print_fmt_buf *outb;
 +
 +              /*
 +               * Once upon a time, we just blindly did this:
 +               *      sprintf(sp, format, s->numbr);
 +               *      s->stlen = strlen(sp);
 +               *      s->stfmt = (char) index;
 +               * but that's no good if, e.g., OFMT is %s. So we punt,
 +               * and just always format the value ourselves.
 +               */
 +
 +              /* XXX: format_spec copied since can be altered in the 
formatting routine */
 +
 +              if (ival == d) {
 +                      /* integral value, but outside range of %ld, use %.0f */
 +                      spec = *fmt_list[INT_0f_FMT_INDEX].spec;
 +                      s->stfmt = -1;
 +              } else {
 +                      assert(fmt_list[index].spec != NULL);   /* or we can 
use fmt_parse() */
 +                      spec = *fmt_list[index].spec;
 +                      s->stfmt = (char) index;        
 +              }
 +
 +              outb = get_fmt_buf();
 +              format_awkldbl_printf(s, & spec, outb);
 +              (void) bytes2node(outb, s);
 +              free_fmt_buf(outb);
 +
 +              s->stptr[s->stlen] = '\0';
 +      } else {
 +              /*
 +               * integral value; force conversion to long only once.
 +               */
 +              long num = (long) ival;
 +
 +              if (num < NVAL && num >= 0) {
 +                      sp = (char *) values[num];
 +                      s->stlen = 1;
 +              } else {
 +                      (void) sprintf(sp, "%ld", num);
 +                      s->stlen = strlen(sp);
 +              }
 +              s->stfmt = -1;
 +              if ((s->flags & INTIND) != 0) {
 +                      s->flags &= ~(INTIND|NUMBER);
 +                      s->flags |= STRING;
 +              }
 +
 +              emalloc(s->stptr, char *, s->stlen + 2, "format_awkldbl_val");
 +              memcpy(s->stptr, sp, s->stlen + 1);
 +      }
 +
 +      s->flags |= STRCUR;
 +      return s;
 +}
 +
 +/* is_ieee_magic_val --- return true for +inf, -inf, +nan, -nan */
 +
 +static int
 +is_ieee_magic_val(const char *val)
 +{
 +      /*
 +       * Avoid strncasecmp: it mishandles ASCII bytes in some locales.
 +       * Assume the length is 4, as the caller checks this.
 +       */
 +      return (   (val[0] == '+' || val[0] == '-')
 +              && (   (   (val[1] == 'i' || val[1] == 'I')
 +                      && (val[2] == 'n' || val[2] == 'N')
 +                      && (val[3] == 'f' || val[3] == 'F'))
 +                  || (   (val[1] == 'n' || val[1] == 'N')
 +                      && (val[2] == 'a' || val[2] == 'A')
 +                      && (val[3] == 'n' || val[3] == 'N'))));
 +}
 +
 +/* get_ieee_magic_val --- return magic value for string */
 +
 +static AWKLDBL
 +get_ieee_magic_val(const char *val)
 +{
 +      static bool first = true;
 +      static AWKLDBL inf;
 +      static AWKLDBL nan;
 +      char *ptr;
 +      AWKLDBL v;
 +
 +      v = gawk_strtold(val, & ptr);
 +
 +      if (val == ptr) { /* Older strtod implementations don't support inf or 
nan. */
 +              if (first) {
 +                      first = false;
 +                      nan = gawk_sqrtl(-LDC(1.0));    /* FIXME -- this isn't 
right */
 +                      inf = -gawk_logl(LDC(0.0));     /* Ditto */
 +              }
 +              v = ((val[1] == 'i' || val[1] == 'I') ? inf : nan);
 +              if (val[0] == '-')
 +                      v = -v;
 +      }
 +
 +      return v;
 +}
 +
 +/* do_int --- convert double to int for awk */
 +
 +static NODE *
 +do_int(int nargs)
 +{
 +      NODE *tmp;
 +      AWKLDBL d;
 +
 +      tmp = POP_SCALAR();
 +      if (do_lint && (tmp->flags & (NUMCUR|NUMBER)) == 0)
 +              lintwarn(_("int: received non-numeric argument"));
 +      (void) force_number(tmp);
 +      d = LDBL_VAL(tmp);
 +      DEREF(tmp);
 +      return make_awkldbl(double_to_int(d));
 +}
 +
 +/* do_log --- the log function */
 +
 +static NODE *
 +do_log(int nargs)
 +{
 +      NODE *tmp;
 +      AWKLDBL d, arg;
 +
 +      tmp = POP_SCALAR();
 +      if (do_lint && (tmp->flags & (NUMCUR|NUMBER)) == 0)
 +              lintwarn(_("log: received non-numeric argument"));
 +      (void) force_number(tmp);
 +      arg = LDBL_VAL(tmp);
 +      if (arg < LDC(0.0))
 +              warning(_("log: received negative argument %g"), (double) arg);
 +      d = gawk_logl(arg);
 +      DEREF(tmp);
 +      return make_awkldbl(d);
 +}
 +
 +/* do_sqrt --- do the sqrt function */
 +
 +static NODE *
 +do_sqrt(int nargs)
 +{
 +      NODE *tmp;
 +      AWKLDBL arg;
 +
 +      tmp = POP_SCALAR();
 +      if (do_lint && (tmp->flags & (NUMCUR|NUMBER)) == 0)
 +              lintwarn(_("sqrt: received non-numeric argument"));
 +      (void) force_number(tmp);
 +      arg = LDBL_VAL(tmp);
 +      DEREF(tmp);
 +      if (arg < LDC(0.0))
 +              warning(_("sqrt: called with negative argument %g"), (double) 
arg);
 +      return make_awkldbl(gawk_sqrtl(arg));
 +}
 +
 +/* do_exp --- exponential function */
 +
 +static NODE *
 +do_exp(int nargs)
 +{
 +      NODE *tmp;
 +      AWKLDBL d, res;
 +
 +      tmp = POP_SCALAR();
 +      if (do_lint && (tmp->flags & (NUMCUR|NUMBER)) == 0)
 +              lintwarn(_("exp: received non-numeric argument"));
 +      (void) force_number(tmp);
 +      d = LDBL_VAL(tmp);
 +      DEREF(tmp);
 +      errno = 0;
 +      res = gawk_expl(d);
 +      if (errno == ERANGE)
 +              warning(_("exp: argument %g is out of range"), (double) d);
 +      return make_awkldbl(res);
 +}
 +
 +/* do_atan2 --- do the atan2 function */
 +
 +static NODE *
 +do_atan2(int nargs)
 +{
 +      NODE *t1, *t2;
 +      AWKLDBL d1, d2;
 +
 +      t2 = POP_SCALAR();
 +      t1 = POP_SCALAR();
 +      if (do_lint) {
 +              if ((t1->flags & (NUMCUR|NUMBER)) == 0)
 +                      lintwarn(_("atan2: received non-numeric first 
argument"));
 +              if ((t2->flags & (NUMCUR|NUMBER)) == 0)
 +                      lintwarn(_("atan2: received non-numeric second 
argument"));
 +      }
 +      (void) force_number(t1);
 +      (void) force_number(t2);
 +      d1 = LDBL_VAL(t1);
 +      d2 = LDBL_VAL(t2);
 +      DEREF(t1);
 +      DEREF(t2);
 +      return make_awkldbl(gawk_atan2l(d1, d2));
 +}
 +
 +/* do_sin --- do the sin function */
 +
 +static NODE *
 +do_sin(int nargs)
 +{
 +      NODE *tmp;
 +      AWKLDBL d;
 +
 +      tmp = POP_SCALAR();
 +      if (do_lint && (tmp->flags & (NUMCUR|NUMBER)) == 0)
 +              lintwarn(_("sin: received non-numeric argument"));
 +      (void) force_number(tmp);
 +      d = gawk_sinl(LDBL_VAL(tmp));
 +      DEREF(tmp);
 +      return make_awkldbl(d);
 +}
 +
 +/* do_cos --- do the cos function */
 +
 +static NODE *
 +do_cos(int nargs)
 +{
 +      NODE *tmp;
 +      AWKLDBL d;
 +
 +      tmp = POP_SCALAR();
 +      if (do_lint && (tmp->flags & (NUMCUR|NUMBER)) == 0)
 +              lintwarn(_("cos: received non-numeric argument"));
 +      (void) force_number(tmp);
 +      d = gawk_cosl(LDBL_VAL(tmp));
 +      DEREF(tmp);
 +      return make_awkldbl(d);
 +}
 +
++/* do_div_l --- do integer division, return quotient and remainder in dest 
array */
++
++/*
++ * We define the semantics as:
++ *    numerator = int(numerator)
++ *    denominator = int(denonmator)
++ *    quotient = int(numerator / denomator)
++ *    remainder = int(numerator % denomator)
++ */
++
++static NODE *
++do_div_l(int nargs)
++{
++      NODE *numerator, *denominator, *result;
++      AWKLDBL num, denom, quotient, remainder;
++      NODE *sub, **lhs;
++
++      result = POP_PARAM();
++      if (result->type != Node_var_array)
++              fatal(_("div: third argument is not an array"));
++      assoc_clear(result);
++
++      denominator = POP_SCALAR();
++      numerator = POP_SCALAR();
++
++      if (do_lint) {
++              if ((numerator->flags & (NUMCUR|NUMBER)) == 0)
++                      lintwarn(_("div: received non-numeric first argument"));
++              if ((denominator->flags & (NUMCUR|NUMBER)) == 0)
++                      lintwarn(_("div: received non-numeric second 
argument"));
++      }
++
++      (void) force_number(numerator);
++      (void) force_number(denominator);
++      num = double_to_int(LDBL_VAL(numerator));
++      denom = double_to_int(LDBL_VAL(denominator));
++
++      if (denom == 0.0)
++              fatal(_("div: division by zero attempted"));
++
++      quotient = double_to_int(num / denom);
++
++      remainder = fmodl(num, denom);
++      remainder = double_to_int(remainder);
++
++      sub = make_string("quotient", 8);
++      lhs = assoc_lookup(result, sub);
++      unref(*lhs);
++      *lhs = make_number((AWKNUM) quotient);
++
++      sub = make_string("remainder", 9);
++      lhs = assoc_lookup(result, sub);
++      unref(*lhs);
++      *lhs = make_number((AWKNUM) remainder);
++
++      return make_number((AWKNUM) 0.0);
++}
++
++
 +/* do_strtonum --- the strtonum function */
 +
 +static NODE *
 +do_strtonum(int nargs)
 +{
 +      NODE *tmp;
 +      AWKLDBL d;
 +
 +      tmp = POP_SCALAR();
 +      if ((tmp->flags & (NUMBER|NUMCUR)) != 0) {
 +              (void) force_number(tmp);
 +              d = LDBL_VAL(tmp);
 +      } else if (get_numbase(tmp->stptr, use_lc_numeric) != 10)
 +              d = nondec2awkldbl(tmp->stptr, tmp->stlen);
 +      else {
 +              (void) force_number(tmp);
 +              d = LDBL_VAL(tmp);
 +      }
 +
 +      DEREF(tmp);
 +      return make_awkldbl(d);
 +}
 +
 +/* format_awkldbl_prinf --- format a number for (s)printf */
 +
 +static int
 +format_awkldbl_printf(NODE *arg, struct format_spec *spec, struct 
print_fmt_buf *outb)
 +{
 +      AWKLDBL tmpval;
 +      uintmax_t uval;
 +      bool sgn;
 +      int i, ii, jj;
 +      char *chp, *cp;
 +      char cs1;
 +      int nc;
 +
 +      static char stackbuf[64];       /* temporary buffer for integer 
formatting */ 
 +      static char *intbuf = stackbuf;
 +      size_t intbuf_size = 64;
 +
 +#     define CP               cpbuf_start(outb)
 +#     define CEND             cpbuf_end(outb)
 +#     define CPBUF            cpbuf(outb)
 +
 +      tmpval = LDBL_VAL(arg);
 +      spec->fill = space_string;
 +      spec->chbuf = lchbuf;
 +
 +      cp = CP;
 +      cs1 = spec->fmtchar;
 +      switch (cs1) {
 +      case 'd':
 +      case 'i':
 +              if (isnan(tmpval) || isinf(tmpval))
 +                      goto out_of_range;
 +
 +              tmpval = double_to_int(tmpval);
 +
 +              /*
 +               * ``The result of converting a zero value with a
 +               * precision of zero is no characters.''
 +               */
 +              if (spec->have_prec && spec->prec == 0 && tmpval == LDC(0.0)) {
 +                      pr_num_tail(cp, spec->prec, spec, outb);
 +                      return 0;
 +              }
 +
 +              if (tmpval < LDC(0.0)) {
 +                      tmpval = -tmpval;
 +                      sgn = true;
 +              } else {
 +                      if (tmpval == - LDC(0.0))       /* avoid printing -0; 
XXX:  0.0 == -0.0, but does the job. */
 +                              tmpval = LDC(0.0);
 +                      sgn = false;
 +              }
 +
 +              /*
 +               * Use snprintf return value to tell if there
 +               * is enough room in the buffer or not.
 +               */
 +              while ((i = format_uint_1(intbuf, intbuf_size, tmpval)) >= 
intbuf_size) {
 +                      if (intbuf == stackbuf)
 +                              intbuf = NULL;
 +                      intbuf_size = i + 1;
 +                      erealloc(intbuf, char *, intbuf_size, "format_tree");
 +              }
 +
 +              if (i < 1)
 +                      goto out_of_range;
 +
 +              chp = & intbuf[i-1];
 +              ii = jj = 0;
 +              do {
 +                      tmpbuf_prepend(outb, *chp);
 +                      chp--; i--;
 +#if defined(HAVE_LOCALE_H)
 +                      if (spec->quote_flag && loc.grouping[ii] && ++jj == 
loc.grouping[ii]) {
 +                              if (i)  /* only add if more digits coming */
 +                                      tmpbuf_prepend(outb, 
loc.thousands_sep[0]);     /* XXX - assumption it's one char */
 +                              if (loc.grouping[ii+1] == 0)
 +                                      jj = 0;         /* keep using current 
val in loc.grouping[ii] */
 +                              else if (loc.grouping[ii+1] == CHAR_MAX)
 +                                      spec->quote_flag= false;
 +                              else {                 
 +                                      ii++;
 +                                      jj = 0;
 +                              }
 +                      }
 +#endif
 +              } while (i > 0);
 +
 +
 +              /* add more output digits to match the precision */
 +              if (spec->have_prec) {
 +                      while (CEND - CP < spec->prec)
 +                              tmpbuf_prepend(outb, '0');
 +              }
 +
 +              if (sgn)
 +                      tmpbuf_prepend(outb, '-');
 +              else if (spec->signchar)
 +                      tmpbuf_prepend(outb, spec->signchar);
 +              /*
 +               * When to fill with zeroes is of course not simple.
 +               * First: No zero fill if left-justifying.
 +               * Next: There seem to be two cases:
 +               *      A '0' without a precision, e.g. %06d
 +               *      A precision with no field width, e.g. %.10d
 +               * Any other case, we don't want to fill with zeroes.
 +               */
 +              if (! spec->lj
 +                  && ((spec->zero_flag && ! spec->have_prec)
 +                       || (spec->fw == 0 && spec->have_prec)))
 +                      spec->fill = zero_string;
 +              if (spec->prec > spec->fw)
 +                      spec->fw = spec->prec;
 +              spec->prec = CEND - CP;
 +              if (spec->fw > spec->prec && ! spec->lj && spec->fill != 
space_string
 +                  && (*CP == '-' || spec->signchar)) {
 +                      bchunk_one(outb, CP);
 +                      CP++;
 +                      spec->prec--;
 +                      spec->fw--;
 +              }
 +              cp = CP;
 +
 +              pr_num_tail(CP, spec->prec, spec, outb);
 +              return 0;
 +
 +      case 'X':
 +              spec->chbuf = Uchbuf;
 +              /* FALL THROUGH */
 +      case 'x':
 +              /* FALL THROUGH */
 +      case 'u':
 +              /* FALL THROUGH */
 +      case 'o':
 +              /*
 +               * ``The result of converting a zero value with a
 +               * precision of zero is no characters.''
 +               *
 +               * If I remember the ANSI C standard, though,
 +               * it says that for octal conversions
 +               * the precision is artificially increased
 +               * to add an extra 0 if # is supplied.
 +               * Indeed, in C,
 +               *      printf("%#.0o\n", 0);
 +               * prints a single 0.
 +               */
 +      
 +              if (! spec->alt && spec->have_prec && spec->prec == 0 && tmpval 
== LDC(0.0)) {
 +                      pr_num_tail(cp, spec->prec, spec, outb);
 +                      return 0;
 +              }
 +
 +              if (tmpval < LDC(0.0)) {
 +                      uval = (uintmax_t) (intmax_t) tmpval;
 +                      if ((AWKLDBL)(intmax_t) uval != double_to_int(tmpval))
 +                              goto out_of_range;
 +              } else {
 +                      uval = (uintmax_t) tmpval;
 +                      if ((AWKLDBL) uval != double_to_int(tmpval))
 +                              goto out_of_range;
 +              }
 +
 +              format_nondecimal(uval, spec, outb);
 +              return 0;
 +
 +out_of_range:
 +              /* out of range - emergency use of %g format */
 +              if (do_lint)
 +                      lintwarn(_("[s]printf: value %g is out of range for 
`%%%c' format"),
 +                                      (double) tmpval, cs1);
 +              cs1 = 'g';
 +              goto fmt1;
 +
 +      case 'F':
 +#if ! defined(PRINTF_HAS_F_FORMAT) || PRINTF_HAS_F_FORMAT != 1
 +              cs1 = 'f';
 +              /* FALL THROUGH */
 +#endif
 +      case 'g':
 +      case 'G':
 +      case 'e':
 +      case 'f':
 +      case 'E':
 +#ifdef NUMDEBUG
 +      case 'a':       /* hexadecimal */
 +      case 'b':       /* MPFR binary format */
 +#endif
 +fmt1:
 +              if (! spec->have_prec)
 +                      spec->prec = DEFAULT_G_PRECISION;
 +
 +              chksize(outb, spec->fw + spec->prec + 11);      /* 11 == slop */
 +              cp = CPBUF;     /* XXX:  using the temporary prepend-buffer and
 +                               * we know it has enough room (>=11).
 +                                 */
 +              *cp++ = '%';
 +              if (spec->lj)
 +                      *cp++ = '-';
 +              if (spec->signchar)
 +                      *cp++ = spec->signchar;
 +              if (spec->alt)
 +                      *cp++ = '#';
 +              if (spec->zero_flag)
 +                      *cp++ = '0';
 +              if (spec->quote_flag)
 +                      *cp++ = '\'';
 +
 +#if defined(LC_NUMERIC)
 +              if (spec->quote_flag && ! use_lc_numeric)
 +                      setlocale(LC_NUMERIC, "");
 +#endif
 +
 +              sprintf(cp, "*.*L%c", cs1);
 +              while ((nc = format_float_1(buf_end(outb), buf_space(outb), 
CPBUF,
 +                              (int) spec->fw, (int) spec->prec, tmpval)) >= 
buf_space(outb))
 +                      chksize(outb, nc + 1);
 +
 +#if defined(LC_NUMERIC)
 +              if (spec->quote_flag && ! use_lc_numeric)
 +                      setlocale(LC_NUMERIC, "C");
 +#endif
 +
 +              buf_adjust(outb, nc); /* adjust data and free space in output 
buffer */
 +              return 0;
 +
 +      default:
 +              cant_happen();  
 +      }
 +
 +      return -1;
 +#undef CP
 +#undef CEND
 +#undef CPBUF
 +}
 +
 +
 +/*--------------- replacement routines for losing systems -----------*/
 +
 +
 +/* init_pow2d_table --- populate powers of 2 table */
 +
 +static void
 +init_pow2d_table()
 +{
 +      unsigned i;
 +      emalloc(pow2d_table, AWKLDBL *, 129 * sizeof (AWKLDBL), 
"init_pow2d_table");
 +      pow2d_table[0] = LDC(1.0);
 +      for (i = 1; i <= 128; i++)
 +              pow2d_table[i] = pow2d_table[i - 1] * LDC(2.0);
 +}
 +
 +/* pow2ld__p --- return 2^n for some integer n >= 0 */
 +
 +static inline AWKLDBL
 +pow2ld__p(int n)
 +{
 +      AWKLDBL dval = LDC(1.0);
 +        for (; n > 128; n -= 128)
 +              dval *= pow2d_table[128];
 +        return dval * pow2d_table[n];
 +}
 +
 +#if defined(GAWK_FMT_INT)
 +
 +/*
 + * gawk_floorl_finite_p --- provide floor() for long double. The double value
 + *    must be finite and >= 0. If the 2nd array argument isn't NULL, also 
split the
 + *    integer value into 16 (32) bit chunks.
 + */
 +
 +static AWKLDBL
 +gawk_floorl_finite_p(AWKLDBL x, gawk_uint_t *chunk)
 +{
 +      int high, low, mid;
 +      AWKLDBL intval = LDC(0.0);
 +
 +#if   GAWK_LDBL_INT_BITS == 128
 +      if (x >= pow2ld(113))
 +#else
 +      if (x >= pow2ld(64))
 +#endif
 +              return -LDC(1.0);
 +
 +      if (chunk != NULL)
 +              memset(chunk, '\0', 4 * sizeof (gawk_uint_t));
 +
 +      /* binary search */
 +      high = GAWK_LDBL_INT_BITS - 1;
 +      while (x >= LDC(2.0)) {
 +              low = 0;
 +              while (low <= high) {
 +                      mid = (low + high) / 2;
 +                      if (x < pow2ld(mid))
 +                              high = mid - 1;
 +                      else
 +                              low = mid + 1;
 +              }
 +
 +              if (x < pow2ld(low)) {
 +                      x -= pow2ld(low - 1);
 +                      intval += pow2ld(low - 1);
 +
 +                      if (chunk != NULL) {
 +                              /*
 +                               * seperate the 64 (128) bits into 16 (32) bit 
chunks.
 +                               *      | D[3]  |  D[2] |  D[1] | D[0]  |
 +                               *      |<------- x (64/128 bits) ----->|
 +                               */
 +
 +#if   GAWK_LDBL_INT_BITS == 128
 +                              if (low <= 32) chunk[0] += (gawk_uint_t) 
pow2ld(low - 1);
 +                              else if (low <= 64) chunk[1] += (gawk_uint_t) 
pow2ld(low - 33);
 +                              else if (low <= 96) chunk[2] += (gawk_uint_t) 
pow2ld(low - 65);
 +                              else chunk[3] += (gawk_uint_t) pow2ld(low - 97);
 +#else
 +                              if (low <= 16) chunk[0] += (gawk_uint_t) 
pow2ld(low - 1);
 +                              else if (low <= 32) chunk[1] += (gawk_uint_t) 
pow2ld(low - 17);
 +                              else if (low <= 48) chunk[2] += (gawk_uint_t) 
pow2ld(low - 33);
 +                              else chunk[3] += (gawk_uint_t) pow2ld(low - 49);
 +#endif
 +                      }
 +              }
 +
 +              high = low;
 +      }
 +
 +      if (x >= LDC(1.0)) {
 +              if (chunk != NULL)
 +                      chunk[0]++;
 +              x -= LDC(1.0);
 +              intval += LDC(1.0);
 +      }
 +      return intval;  /* >= 0.0 */
 +}
 +
 +/*
 + * format_uint_finite_p --- format a AWKLDBL as an unsigned integer. The 
AWKLDBL value
 + *    must be finite and in the range 0 <= x < 2^LDBL_FRAC_BITS.
 + */
 +
 +static int
 +format_uint_finite_p(char *str, size_t size, AWKLDBL x)
 +{
 +      /*
 +       * For an explanation of the algorithm, and the derivation for the
 +       * magic numbers below, please see:
 +       *
 +       *  Binary to Decimal Conversion in Limited Precision
 +       *  Part of the Arithmetic Tutorial Collection
 +       *  by Douglas W. Jones
 +       *  THE UNIVERSITY OF IOWA Department of Computer Science
 +       *  URL: homepage.cs.uiowa.edu/~jones/bcd/decimal.html
 +       */
 +
 +#if   GAWK_LDBL_INT_BITS == 128
 +      static gawk_uint_t coeff[] = { 
 +              1, 4967296, 9551616,
 +#ifdef        GAWK_INT_IS_LONG_LONG
 +              3585223950336ULL,
 +#else
 +              3585223950336UL,
 +#endif
 +              429, 4407370, 3400832,
 +              184467, 5142643,
 +              79228162
 +      };
 +      static const char format[] = "%7.7u%7.7u%7.7u%7.7u%7.7u";
 +      gawk_uint_t decimal_base = 10000000;
 +#else
 +      static gawk_uint_t coeff[] = {
 +              1, 5536, 7296, 656,
 +              6, 9496, 7671,
 +              42, 4749,
 +              281
 +      };
 +      static const char format[] = "%4.4u%4.4u%4.4u%4.4u%4.4u";
 +      gawk_uint_t decimal_base = 10000;
 +#endif
 +      char *p;
 +      int len;
 +      gawk_uint_t d0, d1, d2, d3, d4, q;
 +      gawk_uint_t chunk[4];
 +
 +      assert(x >= LDC(0.0));
 +
 +      assert(size > 35);      /* maximum size ever needed excluding 
terminating null */
 +
 +      if (gawk_floorl_finite_p(x, chunk) < LDC(0.0))  /* outside range */
 +              return -1;
 +
 +        d0 = chunk[0] + coeff[1] * chunk[1] + coeff[2] * chunk[2] + coeff[3] 
* chunk[3];
 +        q = d0 / decimal_base;
 +        d0 = d0 % decimal_base;
 +
 +        d1 = q + coeff[4] * chunk[1] + coeff[5] * chunk[2] + coeff[6] * 
chunk[3];
 +        q = d1 / decimal_base;
 +        d1 = d1 % decimal_base;
 +
 +        d2 = q + coeff[7] * chunk[2] + coeff[8] * chunk[3];
 +        q = d2 / decimal_base;
 +        d2 = d2 % decimal_base;
 +
 +        d3 = q + coeff[9] * chunk[3];
 +        q = d3 / decimal_base;
 +        d3 = d3 % decimal_base;
 +
 +        d4 = q;
 +
 +      (void) sprintf(str, format, (unsigned) d4, (unsigned) d3,
 +                              (unsigned) d2, (unsigned) d1, (unsigned) d0);
 +
 +      /* strip leading 0s */
 +      for (p = str; *(p + 1); p++)    /* don't strip the last 0, the value 
can be "0" */
 +              if (*p != '0')
 +                      break;
 +      len = strlen(p);
 +      if (p != str)
 +              memmove(str, p, len + 1);
 +      return len;
 +}
 +
 +#endif
diff --cc mpfr.c
index 2c5d5f4,d7d22b0..6cbf717
--- a/mpfr.c
+++ b/mpfr.c
@@@ -1507,45 -1523,132 +1529,170 @@@ do_mpfp_srand(int nargs
        return res;
  }
  
+ /* do_mpfp_div --- do integer division, return quotient and remainder in dest 
array */
+ 
+ /*
+  * We define the semantics as:
+  *    numerator = int(numerator)
+  *    denominator = int(denonmator)
+  *    quotient = int(numerator / denomator)
+  *    remainder = int(numerator % denomator)
+  */
+ 
+ static NODE *
+ do_mpfp_div(int nargs)
+ {
+       NODE *numerator, *denominator, *result;
+       NODE *num, *denom;
+       NODE *quotient, *remainder;
+       NODE *sub, **lhs;
+ 
+       result = POP_PARAM();
+       if (result->type != Node_var_array)
+               fatal(_("div: third argument is not an array"));
+       assoc_clear(result);
+ 
+       denominator = POP_SCALAR();
+       numerator = POP_SCALAR();
+ 
+       if (do_lint) {
+               if ((numerator->flags & (NUMCUR|NUMBER)) == 0)
+                       lintwarn(_("div: received non-numeric first argument"));
+               if ((denominator->flags & (NUMCUR|NUMBER)) == 0)
+                       lintwarn(_("div: received non-numeric second 
argument"));
+       }
+ 
+       (void) force_number(numerator);
+       (void) force_number(denominator);
+ 
+       /* convert numerator and denominator to integer */
+       if (is_mpfp_integer(numerator)) {
+               num = mpfp_integer();
+               mpz_set(num->qnumbr, numerator->qnumbr);
+       } else {
+               if (! mpfr_number_p(numerator->qnumbr)) {
+                       /* [+-]inf or NaN */
+                       return numerator;
+               }
+ 
+               num = mpfp_integer();
+               mpfr_get_z(num->qnumbr, numerator->qnumbr, MPFR_RNDZ);
+       }
+ 
+       if (is_mpfp_integer(denominator)) {
+               denom = mpfp_integer();
+               mpz_set(denom->qnumbr, denominator->qnumbr);
+       } else {
+               if (! mpfr_number_p(denominator->qnumbr)) {
+                       /* [+-]inf or NaN */
+                       return denominator;
+               }
+ 
+               denom = mpfp_integer();
+               mpfr_get_z(denom->qnumbr, denominator->qnumbr, MPFR_RNDZ);
+       }
+ 
+       if (mpz_sgn(MPZ_T(denom->qnumbr)) == 0)
+               fatal(_("div: division by zero attempted"));
+ 
+       quotient = mpfp_integer();
+       remainder = mpfp_integer();
+ 
+       /* do the division */
+       mpz_tdiv_qr(quotient->qnumbr, remainder->qnumbr, num->qnumbr, 
denom->qnumbr);
+       unref(num);
+       unref(denom);
+       unref(numerator);
+       unref(denominator);
+ 
+       sub = make_string("quotient", 8);
+       lhs = assoc_lookup(result, sub);
+       unref(*lhs);
+       *lhs = quotient;
+ 
+       sub = make_string("remainder", 9);
+       lhs = assoc_lookup(result, sub);
+       unref(*lhs);
+       *lhs = remainder;
+ 
+       return make_number((AWKNUM) 0.0);
+ }
+ 
+ /*
+  * mpg_tofloat --- convert an arbitrary-precision integer operand to
+  *    a float without loss of precision. It is assumed that the
+  *    MPFR variable has already been initialized.
+  */
+ 
+ static inline mpfr_ptr
+ mpg_tofloat(mpfr_ptr mf, mpz_ptr mz)
+ {
+       size_t prec;
+ 
+       /*
+        * When implicitely converting a GMP integer operand to a MPFR float, 
use
+        * a precision sufficiently large to hold the converted value exactly.
+        *      
+        *      $ ./gawk -M 'BEGIN { print 13 % 2 }'
+        *      1
+        * If the user-specified precision is used to convert the integer 13 to 
a
+        * float, one will get:
+        *      $ ./gawk -M 'BEGIN { PREC=2; print 13 % 2.0 }'
+        *      0       
+        */
+ 
+       prec = mpz_sizeinbase(mz, 2);   /* most significant 1 bit position 
starting at 1 */
+       if (prec > PRECISION_MIN) {
+               prec -= (size_t) mpz_scan1(mz, 0);      /* least significant 1 
bit index starting at 0 */
+               if (prec > MPFR_PREC_MAX)
+                       prec = MPFR_PREC_MAX;
+               if (prec > PRECISION_MIN) 
+                       mpfr_set_prec(mf, prec);
+       }
+ 
+       mpfr_set_z(mf, mz, ROUND_MODE);
+       return mf;
+ }
+ 
  
 +#ifdef NUMDEBUG
 +
 +/* do_mpfp_next_down --- return the greatest representable float that’s 
strictly less than x. */
 +
 +static NODE *
 +do_mpfp_next_down(int nargs)
 +{
 +      NODE *tmp, *r;
 +
 +      tmp = POP_SCALAR();
 +      tmp = force_number(tmp);
 +
 +      if (is_mpfp_integer(tmp)) {
 +              /* XXX: have no use. */  
 +              fatal(_("next_down: not implemented for an integer"));
 +      } else {
 +              if (mpfr_nan_p(MPFR_T(tmp->qnumbr)))    /* NaN */
 +                      return tmp;
 +
 +              /*
 +               * apply current precision (which can be different from the 
precision of the
 +               * input number if changed with an assignment to PREC prior to 
the call),
 +               * and round toward minus infinity.
 +               */
 +              r = mpfp_float();
 +              (void) mpfr_set(r->qnumbr, MPFR_T(tmp->qnumbr), MPFR_RNDD);
 +
 +              /* representable float that’s strictly less than x */
 +              mpfr_nextbelow(MPFR_T(r->qnumbr));
 +      }
 +
 +      DEREF(tmp);
 +      return r;
 +}
 +
 +#endif
 +
 +
  /* mpfp_add --- add arbitrary-precision numbers */ 
  
  static NODE *

-----------------------------------------------------------------------

Summary of changes:
 CMakeLists.txt                |  108 +
 ChangeLog                     |  408 ++
 Makefile.am                   |    7 +-
 Makefile.in                   |    8 +-
 NEWS                          |   45 +-
 README.git                    |   15 +-
 README_d/ChangeLog            |    4 +
 README_d/README.cmake         |   95 +
 TODO                          |   26 +-
 awk.h                         |   24 +-
 awkgram.c                     |  957 +++--
 awkgram.y                     |  239 +-
 awklib/Makefile.am            |   11 +-
 awklib/Makefile.in            |  105 +-
 awklib/eg/lib/ctime.awk       |    2 +-
 awklib/eg/lib/div.awk         |   17 +
 awklib/eg/lib/getopt.awk      |    5 +-
 awklib/eg/lib/gettime.awk     |    2 +-
 awklib/eg/lib/grcat.c         |    2 +-
 awklib/eg/lib/groupawk.in     |    3 +-
 awklib/eg/lib/pwcat.c         |    2 +-
 awklib/eg/lib/strtonum.awk    |   17 +-
 awklib/eg/prog/alarm.awk      |    5 +-
 awklib/eg/prog/cut.awk        |   11 +-
 awklib/eg/prog/egrep.awk      |    7 +-
 awklib/eg/prog/extract.awk    |    8 +-
 awklib/eg/prog/id.awk         |   40 +-
 awklib/eg/prog/igawk.sh       |    2 +-
 awklib/eg/prog/labels.awk     |    3 +-
 awklib/eg/prog/split.awk      |    5 +-
 awklib/eg/prog/tee.awk        |    6 +-
 awklib/eg/prog/uniq.awk       |    5 +-
 builtin.c                     |   62 +-
 cmake/Toolchain_clang.cmake   |   19 +
 cmake/Toolchain_generic.cmake |   21 +
 cmake/Toolchain_mingw32.cmake |   23 +
 cmake/Toolchain_s390.cmake    |   20 +
 cmake/auk.ico                 |  Bin 0 -> 5190 bytes
 cmake/basictest               |  553 +++
 cmake/configure               |   58 +
 cmake/configure.cmake         |  300 ++
 cmake/docmaker                |  100 +
 cmake/package.cmake           |   54 +
 command.c                     |    6 +-
 command.y                     |    6 +-
 configh.in                    |    6 +-
 configure                     |   12 +-
 configure.ac                  |   11 +-
 custom.h                      |   14 +-
 debug.c                       |   24 +-
 dfa.c                         | 1795 ++++-----
 dfa.h                         |   26 +-
 doc/CMakeLists.txt            |   95 +
 doc/ChangeLog                 |  294 ++
 doc/Makefile.am               |   16 +-
 doc/Makefile.in               |   16 +-
 doc/array-elements.eps        |  158 +
 doc/array-elements.fig        |   27 +
 doc/array-elements.pdf        |  Bin 0 -> 6796 bytes
 doc/array-elements.png        |  Bin 0 -> 6091 bytes
 doc/array-elements.txt        |    4 +
 doc/awkcard.in                |    3 +
 doc/gawk.1                    |   35 +-
 doc/gawk.info                 | 8775 ++++++++++++++++++++++------------------
 doc/gawk.texi                 | 9125 ++++++++++++++++++++++++-----------------
 doc/gawktexi.in               | 9032 ++++++++++++++++++++++++-----------------
 double.c                      |   67 +
 eval.c                        |   32 +-
 ext.c                         |   30 +-
 extension/CMakeLists.txt      |   84 +
 extension/ChangeLog           |   14 +
 extension/Makefile.am         |    5 +-
 extension/Makefile.in         |    5 +-
 field.c                       |   21 +-
 format.c                      |   26 +-
 gawkapi.h                     |    4 +-
 helpers/ChangeLog             |    8 +
 helpers/chlistref.awk         |   31 +
 helpers/testdfa.c             |   31 +-
 interpret.h                   |   56 +-
 io.c                          |  254 +-
 long_double.h                 |   61 +
 main.c                        |   40 +-
 mpfr.c                        |  196 +-
 node.c                        |    4 +-
 pc/ChangeLog                  |    4 +
 pc/Makefile.tst               |   10 +-
 po/CMakeLists.txt             |  133 +
 po/id.po                      | 3284 +++++++++++-----
 po/it.po                      |   32 +-
 profile.c                     |   30 +-
 regcomp.c                     |   46 +-
 regex.h                       |   62 +-
 regex_internal.c              |    9 +-
 replace.c                     |    2 +-
 symbol.c                      |   66 +-
 test/CMakeLists.txt           |   90 +
 test/ChangeLog                |   89 +
 test/Makefile.am              |   72 +-
 test/Makefile.in              |   91 +-
 test/Maketests                |   19 +-
 test/badargs.ok               |    4 +-
 test/dbugeval.in              |    2 +
 test/dbugeval.ok              |    1 +
 test/functab4.awk             |   26 +-
 test/functab4.ok              |    7 +-
 test/id.ok                    |   81 +-
 test/indirectcall2.awk        |   11 +
 test/indirectcall2.ok         |    4 +
 test/lintwarn.ok              |    4 +-
 test/mpfrrem.awk              |    6 +
 test/mpfrrem.ok               |    4 +
 test/mpfrsqrt.awk             |   82 +
 test/mpfrsqrt.ok              |    2 +
 test/ofs1.ok                  |    6 +-
 test/printhuge.awk            |    3 +
 test/printhuge.ok             |    1 +
 test/profile2.ok              |    4 +-
 test/regnul1.awk              |   84 +
 test/regnul1.ok               |    8 +
 test/regnul2.awk              |  112 +
 test/regnul2.ok               |   27 +
 test/rsgetline.awk            |   23 +
 test/rsgetline.in             |    1 +
 test/rsgetline.ok             |    3 +
 test/rsglstdin.ok             |    3 +
 vms/ChangeLog                 |    4 +
 vms/gawk_alias_setup.com      |   33 +-
 xalloc.h                      |   24 +-
 129 files changed, 23951 insertions(+), 14511 deletions(-)
 create mode 100644 CMakeLists.txt
 create mode 100644 README_d/README.cmake
 create mode 100644 awklib/eg/lib/div.awk
 create mode 100644 cmake/Toolchain_clang.cmake
 create mode 100644 cmake/Toolchain_generic.cmake
 create mode 100644 cmake/Toolchain_mingw32.cmake
 create mode 100644 cmake/Toolchain_s390.cmake
 create mode 100644 cmake/auk.ico
 create mode 100755 cmake/basictest
 create mode 100755 cmake/configure
 create mode 100644 cmake/configure.cmake
 create mode 100755 cmake/docmaker
 create mode 100644 cmake/package.cmake
 create mode 100644 doc/CMakeLists.txt
 create mode 100644 doc/array-elements.eps
 create mode 100644 doc/array-elements.fig
 create mode 100644 doc/array-elements.pdf
 create mode 100644 doc/array-elements.png
 create mode 100644 doc/array-elements.txt
 create mode 100644 extension/CMakeLists.txt
 create mode 100644 helpers/chlistref.awk
 create mode 100644 po/CMakeLists.txt
 create mode 100644 test/CMakeLists.txt
 create mode 100644 test/dbugeval.in
 create mode 100644 test/dbugeval.ok
 create mode 100644 test/indirectcall2.awk
 create mode 100644 test/indirectcall2.ok
 create mode 100644 test/mpfrrem.awk
 create mode 100644 test/mpfrrem.ok
 create mode 100644 test/mpfrsqrt.awk
 create mode 100644 test/mpfrsqrt.ok
 create mode 100644 test/printhuge.awk
 create mode 100644 test/printhuge.ok
 create mode 100644 test/regnul1.awk
 create mode 100644 test/regnul1.ok
 create mode 100644 test/regnul2.awk
 create mode 100644 test/regnul2.ok
 create mode 100644 test/rsgetline.awk
 create mode 100644 test/rsgetline.in
 create mode 100644 test/rsgetline.ok
 create mode 100644 test/rsglstdin.ok


hooks/post-receive
-- 
gawk



reply via email to

[Prev in Thread] Current Thread [Next in Thread]