gawk-diffs
[Top][All Lists]
Advanced

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

[gawk-diffs] [SCM] gawk branch, array-iface, updated. d3699b66e430f40943


From: Arnold Robbins
Subject: [gawk-diffs] [SCM] gawk branch, array-iface, updated. d3699b66e430f40943242dcc2b2687e871207471
Date: Mon, 26 Nov 2012 18:26:29 +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, array-iface has been updated
       via  d3699b66e430f40943242dcc2b2687e871207471 (commit)
       via  9a9ff61bbd952c1263b55f82a269da5b09289a6b (commit)
       via  7af1da783175273a26609911c3a95975ed0f5c13 (commit)
       via  926ec51aed30a7c0091ad7433332898371b0b418 (commit)
       via  72c4c0c07b3276ea59498af9c4d7d21492382b28 (commit)
       via  5045e46ea4200ddc4aa825974b1f51eac72c93aa (commit)
       via  a4891bca3e5b9cd33bdb8857e233042efdf77412 (commit)
       via  30b18b839b49213383f7dcbb430b3185a21efa99 (commit)
       via  5b104d3e3515df3f23cfaa2037de9e535cd0c0a4 (commit)
       via  3a0cd74e7a88803c548f22272e8eba40a9ac4293 (commit)
       via  8e36cf1525655ac9c2e4258293450bdeecffd7f2 (commit)
       via  1cdbf2500687a8b35bdd94ead4a20378c84aa4ae (commit)
       via  86024b7f014c286daa68c3a0a223ce51f6e13dfa (commit)
       via  391c19511eda50484a80827694f4555127cca1c8 (commit)
       via  adc4e4b4a6466236adb1759a79183afb7501b8de (commit)
       via  adb0a3271736be1b8c9a899d7e42ac9777837688 (commit)
       via  c9e416d0703fc11828a1d175002805b326029735 (commit)
       via  ad772284fd932cc884431e71487917ba42aa2b30 (commit)
       via  9deed84c9490e3fcd7ee449990f342d921f9403f (commit)
       via  df1abb8c0d0b5855af8bb78ecf87f3511807905d (commit)
       via  fd17b777a698d2b40da34d461d090eda8b905789 (commit)
       via  fcae661473aab45b7b6f60e949b98acbc2dd1dc7 (commit)
       via  cafbb82185c4a5fc2608975c048d66017456a038 (commit)
       via  3b0ec209b9630bd4f8689a4ecc5544c419ebd259 (commit)
       via  efddae1261ed612c21efcbfabb2cabe7c16021f1 (commit)
       via  81c2e977b7bc19068440f7df766c4a9dc316de01 (commit)
       via  cc9ad42776a97d37a4996b2ebbf0386537a8f4ac (commit)
       via  f3e98d540c007fcf93ff31e24161d10713bec48b (commit)
       via  1f713af5cd22df0ba9e7bbbde5b2d9eaf527c1ad (commit)
       via  8d895539f8a2e5ebf478aae974da73378c6dba95 (commit)
       via  93b30fe5b9042edc85acde68befaa7c82a4aac95 (commit)
       via  3bb52bc2b515aa00bcd72382a786a45a65538e1d (commit)
       via  1d607c0112f20a1f3a46668bc61fdc7e38c492eb (commit)
       via  080a0a51372998be6d995208697c0537b975c1bc (commit)
       via  2fe4775356a1042a90f0236d69df1d0379b1a9bc (commit)
       via  a92d9e310f119d61752b38bcb232e0cbe867c34f (commit)
       via  b1f42bdc87249e1869d13df2cacaa3aceea6fc1e (commit)
       via  2f8505ba759663f2c4a3e5b34471851025337df6 (commit)
       via  da81e3806c39654f4036ac63abacbc0c8c5e0e92 (commit)
       via  9e49de573a7ea6f84e6577511aec5a5fc1f47cb6 (commit)
       via  d5cc356948eb6d3ed024b1addad6daccb809448b (commit)
       via  5d5984ca88b4872d8052cde29ac904bdb193ffd8 (commit)
       via  d9d3d7cd3aa52bb248b3a0784a4ef5973fe1faac (commit)
       via  5bbfd2aea95c6fcc0a0a326bebce6d9ada2bfb53 (commit)
       via  f8998c45dffcbbd874038f7e19515a504834f3cd (commit)
       via  2204f38c05fef5747b8f6764a202b646f4126338 (commit)
       via  5d3c11459bf9c8870cfc599722118b910aa17394 (commit)
       via  507adb95a9a4eec0e2c84102482d0db9c484e1a2 (commit)
       via  8642601a56e6652d5d913cebca84a1ad0351b6e4 (commit)
       via  c4206d92d5bb73c1fc55484fbf938d2d59f18679 (commit)
       via  50eac5ad4b81cb3aeb699f4c7ffd71c282d09ab6 (commit)
       via  993eaa708f7785e0ab5c1b1e53ddf4abe1d835e4 (commit)
       via  cec88d59be5ef7c50647e45f5aeb3d9260236705 (commit)
       via  69ec4c3f4e2d96d353f72d2ad845a36bb41a6509 (commit)
       via  67dd635c4d3c72c2c3e6ca62482e7ef9c232f3a7 (commit)
       via  0d49bc78aa0f761383e4b669dcd83932e2e60dd8 (commit)
       via  76bfb555b1fc1a93de0714a9cdfd36557182b131 (commit)
       via  38769b3a29111cc309f6ef3ac05f4e5ed4456007 (commit)
       via  f15a58325621a744dabc684f2c14e5e0d97b985d (commit)
       via  cea7b7eb1c73fd0680ccf637e9d762f0d26ff6bf (commit)
       via  154ca7ba84b1f8db0f0bb48e294d2fc26b3f7fbe (commit)
       via  4fd10562c474ec13a932b51ed31bddbd5ffd28c4 (commit)
       via  4a267501525be3157b0d41e9030e9d4a9c7f5897 (commit)
       via  1f0d8c64a08d9d19faf9c77e35f77dc46b2f34a9 (commit)
       via  b9392f1328394ba9b5601af8e9ef6f2e73042048 (commit)
       via  684e0459f9209b11d796636949ec5cf6c9269a94 (commit)
       via  150130bb66391dea89da18d470547bf1b9129ff9 (commit)
       via  d61172dcf8117f4d3092a186122e3c66c17c58ba (commit)
       via  104a4dbd6430d1b96dbf44601738c3652bcc85c9 (commit)
       via  599e89596c2a813b084e40645d801eb1c7de1ee1 (commit)
       via  fd0df9b0201fcb59831828e6a1c5bd177108d677 (commit)
       via  bada9c9a2562ad850757988effc848fb55850c98 (commit)
       via  0a1746da98ef24b887074bad1c390523f6c4b190 (commit)
       via  a892293556960b0813098ede7da7a34774da7d3c (commit)
       via  151fc88916ca2d6fb1fc3b945dbd8912ff162c94 (commit)
       via  d45f10d95061489b135987cc3168207d0ed4aa7b (commit)
       via  b335b9de89c16714839913b35ac5a81ec237c5e3 (commit)
       via  e8e225d7d45e44126d57097cb9209195cdaf2c22 (commit)
       via  fb5a67778f7eeb008a515988d336ae078e5e6121 (commit)
       via  7187c507d21165be6c060f0ee6495cd8869a1e08 (commit)
       via  0961d7b8cc08365bc82f7410a013517a839d683e (commit)
       via  921f9dd3b97236892c632e15c1a8f35ce3e74533 (commit)
       via  8eb78103a37e75819388c2a175caf40bf0f7b4c9 (commit)
       via  f489c70d2686bb0ea1c84d5c80a06ff019d04927 (commit)
       via  bcb0224f8f2d19cd03a2527eec2f5eb42abef7cd (commit)
       via  5caf2424094016b9a26c5d9d74b25cab39671478 (commit)
       via  8f187fd7072762e4024afeef074a50c8ab735561 (commit)
       via  738835a65bc8afa60fd2b3df4c98bd0f8020018f (commit)
       via  6d63bb4d7df65d29f5c8a2662fbad8044e78e03b (commit)
       via  e7bdf5ebd4162172e79c00196061af625bd729f2 (commit)
       via  81896b422307105edb9908958bbedd09967d9a05 (commit)
       via  3d9b832439afeb1b05c60831e0865df585dc55ac (commit)
       via  82f91536607791340faab394432860f68f0b2787 (commit)
       via  a0ef67a123fd54eeaf8eb2aa9ccae2d4835bd3c5 (commit)
       via  9e2703f7ca0b35129a94465654d0e18d14048dbc (commit)
       via  b9a82851866f84ca306a2802b4ca50089a2fe683 (commit)
       via  eb2698f49247c94c84e1e2c2304ba94d96c89bc9 (commit)
       via  07e825ba195cc9778bcdb75a831d11f26f99ef5a (commit)
       via  cf1aa2d743d3f6d94ed6cbd3fae97889913c5d75 (commit)
       via  b84831d5a75556aa732cfa3552b90b9c804d9991 (commit)
       via  5117dd79ab0271ae5e1bb775876e9e1b80fd2f4a (commit)
       via  8eb919e188c5a903a7d0194e42a97698b649d9ac (commit)
       via  fc9109734ddcf57c5f1faaedfadc432ec6841aa8 (commit)
       via  99290f5ca37cb905f7f1dab9be416b2e2057d243 (commit)
       via  c2db2b9ff8465cb5044e6f22beb229336479be57 (commit)
       via  47f2bd34643ceda78773e5abbfa466c2f898a815 (commit)
       via  c6cf44eef1b7c80f4dbdaa74eddbf7a67636f84f (commit)
       via  f057575c9312808fd716858504b8cf2f9d3dc5d0 (commit)
       via  68698dede294f3690dc0e51eeb76f18f420f8b8a (commit)
       via  000380108735d54f472a7825a865d0308ed357cb (commit)
       via  472dc41713ee71609b2ddc8c77c00adb34354154 (commit)
       via  1dcb6bf5de886c0fdefa9e68557f348e3d5ec450 (commit)
       via  9b8770d74f2e1cfd719fa0dbf21c676d1c64e8ea (commit)
       via  17edae8fbae125b54e85c2be94f198f228465f81 (commit)
       via  8b4c4f85fbbc5282702b0367c04d1275b62dd6ef (commit)
       via  80a3d18599a261873d9790f094b6792e1d9f8742 (commit)
       via  1ef98b7f216198b5c17b516642eded9d3ef7c6b2 (commit)
       via  0b4ff99fec136012af7a54f179bdf601e55e6274 (commit)
       via  8e34526a147a2e07c08c950b9f28c2e2132b6fd3 (commit)
       via  439d946a0e936267f7f478b22d0754e882bf7cf0 (commit)
       via  3c09996d7efa635947c357efb3ccc5ed05b1ea31 (commit)
       via  a8ffb47faf32e7f065bfca5ffeee20cca85f6195 (commit)
       via  759f2234c9bfa689151277fd2215bc0927cfc9c3 (commit)
       via  8970970f3f3bc3d757fe491e90e608366fb7e604 (commit)
       via  cca8e6fca6c40de9c67f17ed74fc80291fd969e1 (commit)
       via  5cc7f618cb125b389538db5a75e1f0de33139f9b (commit)
       via  21df49a92356710bfa6551939041438af55d8c84 (commit)
       via  b49f18335837eed25c1ef823d2ccb88c8c3b9e97 (commit)
       via  07fb393999d623541bf2e54aeeb0d9c0311baace (commit)
       via  e6b05afd9971b457c0b46907a91185b66be8ff4e (commit)
       via  3b23e177cd166e96c700379491b4a99bddf9aa4d (commit)
       via  76cc4d241f328876b18e48639d631823c3d304d6 (commit)
       via  a58fa491cdaf57a9f67cff35c58398ef0c87f52e (commit)
       via  4f196c2431034aa4865fcd4e3bcc45a6e764266f (commit)
       via  63aeb055437534122ddb774b7eecc261ab6e592a (commit)
       via  84d6acb5c16aa9aed908fde7cb0bc53c2ecbeede (commit)
       via  88f8278587c7f254d4c5bb2e8f996f3947da32e9 (commit)
       via  8d5a66b529a220239037a3cd7a2421aab85de53d (commit)
       via  9cc3e7f1126d924a343f01be6a92cf6aefe97bab (commit)
       via  35716c6aaa573dc15012fe1cba8d18b242367fd0 (commit)
       via  94008850575fe9450b52aa83b77f9b08e5e55f6e (commit)
       via  49658bfd0ef5d4efccd210c48560c43bf455ee16 (commit)
       via  88e81c931345aa485e55c6d6c7f3ad61dc200fed (commit)
       via  30bb821bad107a676c1d0f0688f90b2b7e6c7505 (commit)
       via  f60abc38c224e5a56aef64564d37f5f6ef7e87a9 (commit)
       via  eb126595c90ac7f6242415dfd29d6c88a8f0f0a2 (commit)
       via  c6454cc02a0c79c3da5316aa580e545c8e7085f0 (commit)
       via  9bf467bbe0bf6868919b2a672f70b945f320c7a8 (commit)
       via  66693943a96ef1d0c0a991c3780dabc0071d6233 (commit)
       via  022ad6523bf98e8c2a272a06787be6931e7f3457 (commit)
       via  6456df6de8e7f5931551612cfd4eb4f1c562654b (commit)
       via  8969981b6c3b77527db5dea2b7f7650e3fc5e083 (commit)
       via  60cc3b626b5c6cdd4612691c1437172a4d6017bd (commit)
       via  dc8d2e7b62b9191266a281c80ebb1265436250fc (commit)
       via  030501c017701733c2d88cddd2656cb3a12b56bf (commit)
       via  0eaab9127d090da073a53695583837fcbd2be9d3 (commit)
       via  7e649df8a9e0375363a724ce89f78021a4395bf0 (commit)
       via  7a7aff46c959aa4f2f885fa52b93137e409aa6b9 (commit)
       via  82816b279615b27f7c4f87349a8c830a96939d8c (commit)
       via  a02d28a4829917a98c6620f4f14864b68d707d41 (commit)
       via  dce685318154027d30f8dad8df796e1e12436765 (commit)
       via  913a0f88f5cfff1f139bb05ffd4a0a9a516ebdde (commit)
       via  fbff497e69139d7cd8434112d6f0a36a46350da1 (commit)
       via  207fc1458c7f168822e454a89f23428c64163427 (commit)
       via  0544971abd3bf6eda1531e62b4a19e221a68a6e5 (commit)
       via  e4945f9ecab4d2a143f9e41b6a112bb2d36fa7c1 (commit)
       via  ce63a9b40865adeaa643208d9c645bd5ac5575e3 (commit)
       via  dfff2221d2d36ef3fba2a3970440079e2415f8b2 (commit)
       via  11cdf30aa3c7b397ba0702a043f5a44f3607b218 (commit)
       via  652a11e5fbe9862a2b8e961b32b9748b3c2c418b (commit)
       via  c3d3c83b0a60454c7b1bc335c022051b58f393e3 (commit)
       via  ca83de0ec92b56c712f7a7376b21a1a1337b3107 (commit)
       via  1a69f3ec43ba9748ad63443f88b2e26b014c11d2 (commit)
       via  7e5b2a94ce3c089c50c5862168d1d917e5febcf4 (commit)
       via  40eefdd931066129d0bb2f6144a0ec7741c6cc2b (commit)
       via  4bb85f0f0e221c158b1a81af286acb422834c0fd (commit)
       via  3d2d6b46bf3325c0273b35a202184ab09d38e0cd (commit)
       via  0fff60287fb9cc41288b3373f47031ab3dd597ac (commit)
       via  502050948a347ef5c618886cec1b83357ad7ac3f (commit)
       via  7bfc288d27bacb715ff63dbf71be53304917685a (commit)
       via  43a12b8c65b687489e0dbb29cd707eeff92e5865 (commit)
       via  91049b1eef7366b3223e36125d6cfca898f8c3dd (commit)
       via  50831fa7f402480d83d5e3647d09acdad7cd0eeb (commit)
       via  ffbf8454171c0ef037db425f436c735da3691d9f (commit)
       via  2abd3979c829934905f5a84dd2f5836b1d8eec37 (commit)
       via  0907dd281b71fb440c83fc53e6b4c7312f1c1f47 (commit)
       via  7e99da1009403952ec84ade1cad199b59927f735 (commit)
       via  b06c8780cef407a0a6421691f60496ffd7d369de (commit)
       via  518a62884ff2b87b94cbfa1e2fa759f1829f6bd9 (commit)
       via  77036f5ae0d0c4e2e1551838c193dd2ca877a54e (commit)
       via  4fe1f4ac1aa0e4b99c9abb26794fc0d10ebb77c6 (commit)
       via  7c209cbe1b2fd054769512e325ede72d865f0c84 (commit)
       via  28daef44c3c08f16002c678319a30b816f6972fd (commit)
       via  4319d9141a56cb8ed878d44d0e74bedee51085a6 (commit)
       via  a49be44686e3d0707c43d643bfcad68d50a75b98 (commit)
       via  33b647ef23daa8a310701c767098f11ee48cf4e8 (commit)
       via  dda2495337929a86cc40017d8f1cd72a46876618 (commit)
       via  64fecd1d7a14c23fbbd6938e237c66a31fabb04f (commit)
       via  73533707616e119778993fe18540098239ecbb2e (commit)
       via  6d1724214a95330b63a6a557f89fb9b40b4a521f (commit)
       via  e33b672ff4ab1b7469355a79eaf4c4740f412e45 (commit)
       via  e14e5c9737c2e8e61a3f5184525d7e9cbb3170b8 (commit)
       via  077270f8fb16ad5dbf33fe0ff8afedd34fdf435a (commit)
       via  7d37bcd5a8066718b15de8c03725708819389931 (commit)
       via  e1749c3c853ace06796efd7dd3bd3e9bf025a549 (commit)
       via  c494c33d585d0b7498b8e368434f60f2c107497f (commit)
       via  518bcc6e640648717bc5512d3fd5c2bf16d6fec3 (commit)
       via  33734338e34ed4588ca05cecd5324d5ab5a1a654 (commit)
       via  47828911ae88038eda1051cfa2232f46eda95fd8 (commit)
       via  2d0d82f7453b1c5ad5e1baa8c02c2f6d5e5ccb67 (commit)
       via  7642bd16ac81fbf85247ab2b5768cb6b316c8419 (commit)
       via  93e689fa83ef9a78f2bdfa093af31fcecb429d58 (commit)
       via  6139211362667682c3022a72321e0cd8945b6592 (commit)
       via  37cd3566b9b74c43d5f11f1cba8dec147a25e474 (commit)
       via  115d332143b1a9d23bbf57088a577e778dcf31f8 (commit)
       via  d0d954cce2ca5a2e0ed41116502b636446ac528f (commit)
       via  898eb2ad1d514887993994e60fe860ac3ee1bba8 (commit)
       via  d66f3c9922e36bb2e760e0ac36364c1a5aa11442 (commit)
       via  cd380faebed56979c993ec46daa8c9d927c2d1dd (commit)
       via  0b9dc23236f49d3e23a14900b1f34bb027fc3ba0 (commit)
       via  91cdc24dc028b758e409ac6e92759b52b2a079d6 (commit)
       via  09a6e6fecf9691ea9a0ceb2aef26197f821868cd (commit)
       via  1ab61e1508bb2c35d536717868d9dbe5ea20fa93 (commit)
       via  fd3c1195711270a001d860770098b8c0d9118c10 (commit)
       via  3a40be8a79f9d4e4bb205cca4eb15b1ee811f60c (commit)
       via  1e3ac8a49caeeb991d8163042a576a66db51c74b (commit)
       via  b0f08ac2443e239b0ed9cc4421758f0ed3f7a94f (commit)
       via  6311c35dd8984a8516802b3cc111c1f411e098fd (commit)
       via  7eaf540145fa9ed1ffb19196f18124b076bae495 (commit)
       via  5e79fa8735ec2984fee9054cccd51d86fa939621 (commit)
       via  2c698c5eb4294783e821e986c74e55b63507c790 (commit)
       via  8ce87087172ee5be4ee72a1513daad3821185bf7 (commit)
       via  820b6a2ccb7859e15ade36af6ac1d0d08c1da4b1 (commit)
       via  b4a2d75b7d9fd23069a55dc91a42f7fddd0c7570 (commit)
       via  5472c2cc2889aab121c32ed4ca6bd831ae520d89 (commit)
       via  7891af5ec56ff4ed99435433c135079a9e24e037 (commit)
       via  18e7a6250a5daa170729a2adbc6b9d71f75f2bb5 (commit)
       via  058fc8ac436001c3f186bdeaf0d596352483a0b8 (commit)
       via  21a01e3ad4e2e77dccf73e8fd069370749880757 (commit)
       via  dab3a678b3f65ae4cde21ca4b1d4fd24e8a71918 (commit)
       via  fcc37ab5b658388a6fa14bcd9c0254454418c96a (commit)
       via  a9c75046c071c9a67455ef27be44cac0b64be3c4 (commit)
       via  a0f0d2b98fa88ef98f7c7100795869e0bad5b08d (commit)
       via  90813d0b1978f96589b707545a64e7a83b097432 (commit)
       via  e6ddb0631c88b591792e3486f857ca26875de310 (commit)
       via  04dc190623f0d99d80387b33ca747b8cbad37724 (commit)
       via  62d890d4384a70c7550876c617b3a34e28dab234 (commit)
       via  eec7101174a3b2807fb282272f75cc13d4b953c3 (commit)
       via  577c3fc31a2718461fba2e599d162de96fe838fa (commit)
       via  c62b9d773bc064bc1dd5d8db35207fd4e6d42f1e (commit)
       via  29f456563c740cb79f7668bc3dc282aac6a92de1 (commit)
       via  37496c4be6c14569528c6ea83cbbb257d1130324 (commit)
       via  cd9fdf221c0504639a38e773c3d56a32ae80e2cc (commit)
       via  f8ec28a30e98cad325d18478a3d054b8c30a3129 (commit)
       via  ab670cb99e104c3718c4c6b343d236898e057634 (commit)
       via  cdf892a07fa67c635997e41ee8fe175aaafb2431 (commit)
       via  860fe8fd4734fb3e9cc5568595ce1ac719d71112 (commit)
       via  0f2e51f9b18a1c4e203e0bd0ac3c68db9faa9b6d (commit)
       via  85458962f4ca247b4c263a5588150960ee6f3e42 (commit)
       via  ac950a04867fce7784680ba76d654d910e88a8cd (commit)
       via  60a3183d9a228569eee98b19c67600e103ae1eac (commit)
       via  793e9c5f44d355b7b7cbc81cf505787c15d420f1 (commit)
       via  f7369c4de041f3090809536aaf95f7363aac0293 (commit)
       via  9e2a3076e2e1abbe89f8437826229a8011994764 (commit)
       via  a8b749aa356c6f7bb0facd14220c2c0c14e40e6f (commit)
       via  67abdd7a54c00fae450a0f0964a9c9615a8a50c5 (commit)
       via  ae93fda5ed5957fb62e2b6f0cd6f104c7009b2ee (commit)
       via  4b43ad8d4aeb149eb4ca42c5da20934183ee9698 (commit)
       via  06323619397520aba2fc2f8f983d67d06c6610fa (commit)
       via  3d662631342d999b3c80952f2e8eca8b390bdd95 (commit)
       via  e5353c0f447a8628985722296f57fc02dd2e0063 (commit)
       via  4f8aff5908706e6f526b61337d10a412f4f66360 (commit)
       via  26911e4062be696b2090aa139f96f8210f012b48 (commit)
       via  a59319732d89feda419acab674ea580c95db7d4a (commit)
       via  8ff0b4eaa7592280b5a55087c0326c6ef1f88db5 (commit)
       via  fe0a0998411173db5cab614253562b2efd6f9664 (commit)
       via  5f17e95bd711f3aa73b5e59fa6748eab5745c869 (commit)
       via  2af8e280532731492ee91cd91fe713b3ca1538eb (commit)
       via  002a1fb117731667209dbf1278f138c8ad97bc10 (commit)
       via  d71ec1612b2bfebded1854d536d54e3e5af7172e (commit)
       via  c41908d0b02f7746a67ab7aa2e54058e5b66439a (commit)
       via  96d7539b12aa96f85280be1ebbb933e951046cff (commit)
       via  bc4094635391dcb93cc3d5d6bef56a96bfff2a00 (commit)
       via  f8ca822a7e81bd80afa7181ec5c0f0b4a50a4945 (commit)
       via  15070b3cd065d20f04985568edf18723ee7d761e (commit)
       via  408223d694d6d838ca11d9617f23b0aa2d21f2e5 (commit)
       via  762b3a4c2246ac817da7bac7ccb78889f117ca93 (commit)
       via  54f5f71fb743e58427e2d72f0caaee12a12a5140 (commit)
       via  17a2a7c14dc27248d87f2561a1ec311ad4972355 (commit)
       via  123a03a71df8594a8878d464ed9826fbb827709d (commit)
       via  3a4c3d7b0c2f683c191429ea9e3b88b2a958f965 (commit)
       via  a7fe78d7a2ce2000837350ee4fa0e7ab70b2a9bc (commit)
       via  fa620d22a63f26f8098d7b4c4b835ad27c1b13a7 (commit)
       via  ed69ad69e9e4603fef71510cfef13d2a8b153ae0 (commit)
       via  2ee1a96b398f3bd183a84509464770153a8890d4 (commit)
       via  d7dfcfc5bb3fa6aa01d96a079d4a0bc89cf3f5b0 (commit)
       via  67db3f45748d22ff23c03d1887cb0aac341f81bb (commit)
       via  7e83cf5fd642b233a8d7af72b092e0c9bab29647 (commit)
       via  b2a499ad0442dc0d8d4ac4b51c31d215fd810bf9 (commit)
       via  7f07ca78f5e35834e3f6ff8f9217efecfdd073ed (commit)
       via  876bfa5513ae175535a5e67e90973b712fce8399 (commit)
       via  247e18a50b836bedcaec2575a31f2802e14721c9 (commit)
       via  e7b3566cf6c8daa53131ec2681e5c195a9660162 (commit)
       via  059a60ca01fbe31d4e6cea8cde7fa086abec90aa (commit)
       via  76fce411492be9713284936f23a4cd90f9454ce0 (commit)
       via  7975e6a2960b95942b6732dd59969aa3abca2502 (commit)
       via  3d2ecabdecfbaf1496984ff333d630c3eacbcb68 (commit)
       via  cebe01dc11a95fac048459ed3439ab65fba38d00 (commit)
       via  7a566d8be209d0f283e3d2afa2e5637cf316dde7 (commit)
       via  e5d13091279241edacfa48773f2b4b113b2addb0 (commit)
       via  e58357f1ae364e4ade0f814f8953d3e4ea3a719f (commit)
       via  266864e87a5f500d0c3b570cb489e040ae69a3b2 (commit)
       via  d6ee0f78f05caa4136cbc713fab64a0308f0da5d (commit)
       via  00e983dfaf983f2e63d74062b7e81716ce2cc0d1 (commit)
       via  bc9ed3fd239984429613095e6cfc142092f036c4 (commit)
       via  caaf36c8363f9280433f37615ec41d606281136e (commit)
       via  aa23de50eb7c81a3e8f94769c5288aecfeb52b4c (commit)
       via  f53d7e7b6afd4fbbc00c89a19d595c29998633c6 (commit)
       via  d6d6a4ac9c6eb33a71595fd596b9a8f2db6444b7 (commit)
       via  bcdea5969e5b16d5c5169488431778a704207a4e (commit)
       via  93ca7b261a2dad770be20328da1d747414d3e6d8 (commit)
       via  920b87dfab2e0504c8a1eb26eb6f130bcb748218 (commit)
       via  3438b2129cd933e430349a6bd66a1933071c92c2 (commit)
       via  ca6df261b71a738b4f0d0719f79cacee008a16c5 (commit)
       via  bf761c687204a51337dad0f539cdaf87c3a3a08f (commit)
       via  4d26f7436c0acf8617c4736f110f06e2f4531bbd (commit)
       via  495620140c3e925d3e9ffd0937d932de4425ed5d (commit)
       via  389a62c56e6a09a5e3348aa46b52288a533c653e (commit)
       via  15635ff21b6f1a0951f0ff5de6ddaf0edab8edd7 (commit)
       via  2981962139f8a726f5568d8ab1004e078214cea3 (commit)
       via  2e14bf32d257e86fb4db379211c1f86af2b23165 (commit)
       via  dbb8f309183eb908cca5178460f61f93afdab0a0 (commit)
       via  74b8a90b739cdfdaf2539f2a4e936cca3f1b2346 (commit)
       via  9f25c096019b378cc0734fce4291ab53a35b391e (commit)
       via  68318433e8e0627c722797cab90f23f30bb42c45 (commit)
       via  bb9e935084b97bc8369856d3e075b7e19182e120 (commit)
       via  b406b0ddbc1c306162ec94b76724347a1bea99f6 (commit)
       via  0bbb717969921d9a8a587ae39cedff283cd898fa (commit)
       via  afb9913ce1218d07cffa1f88e6a10f2de2800dce (commit)
       via  db7a3cd086535605db484590dbac91b2587f8cf5 (commit)
       via  90fd3ce39521c90213d1a7090370bc1aba100451 (commit)
       via  02108925ef6d1c8bae2aea95864a0e22ce0fc55e (commit)
       via  9b594365fa257ae16a479038805840e447b24336 (commit)
       via  857a1007645f45c31ed0f6070e04ca066fc1bce5 (commit)
       via  0d3d874286915d998648922158dabf2ffc38d7f9 (commit)
       via  021b5a16001132e8a11a28471525f28747ffa4b2 (commit)
       via  85a195f6f9901e98abe9306f1e05e25107e61955 (commit)
       via  c30225e9a828bb8d5245e0c648f08ec8bb165321 (commit)
       via  700b6ddbe8f6c0a84cb61abac6fd94a4fe9221ca (commit)
       via  c40211033292efb689bfca1819d9d34fd1e3b8cd (commit)
       via  2dcf0c1084fafc7bb4d8ff5435a228ce90c408f8 (commit)
       via  b51edf37c4271bf5ec5dcad9d35169f55e38efa9 (commit)
       via  8dffe780526d2bd419d17917eacd91bbacbab9ec (commit)
      from  dbabe5a569ad82a9faeb2f121e387ec6399f9dcb (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=d3699b66e430f40943242dcc2b2687e871207471

commit d3699b66e430f40943242dcc2b2687e871207471
Author: Arnold D. Robbins <address@hidden>
Date:   Mon Nov 26 20:25:38 2012 +0200

    Finish porting to current code base.

diff --git a/ChangeLog b/ChangeLog
index bb60a06..6cd9889 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2012-11-26         Arnold D. Robbins     <address@hidden>
+
+       * awk.h (Node_old_ext_func, Op_old_ext_func): New enum values.
+       * configure.ac: Use -export-dynamic if supported for old extension
+       mechanism.
+       * eval.c (nodeytpes): Add Node_old_ext_func.
+       (optypetab): Add Op_old_ext_func.
+       * ext.c (make_old_ext_builtin): "New" function.
+       * interpret.h: Special case Op_old_ext_builtin. Add checks for
+       Node_old_ext_func.
+       * msg.c: Adjust placement of a comment.
+
 2012-05-02         John Haque      <address@hidden>
 
        * str_array.c (str_copy): Initialize next pointer in the linked list
diff --git a/awk.h b/awk.h
index 67fb6ac..a01f28f 100644
--- a/awk.h
+++ b/awk.h
@@ -294,6 +294,7 @@ typedef enum nodevals {
        Node_param_list,        /* lnode is a variable, rnode is more list */
        Node_func,              /* lnode is param. list, rnode is body */
        Node_ext_func,          /* extension function, code_ptr is builtin code 
*/
+       Node_old_ext_func,      /* extension function, code_ptr is builtin code 
*/
 
        Node_array_ref,         /* array passed by ref as parameter */
        Node_array_tree,        /* Hashed array tree (HAT) */
@@ -628,6 +629,7 @@ typedef enum opcodeval {
        Op_builtin,
        Op_sub_builtin,         /* sub, gsub and gensub */
        Op_ext_builtin,
+       Op_old_ext_builtin,     /* temporary */
        Op_in_array,            /* boolean test of membership in array */
 
        /* function call instruction */
@@ -1284,7 +1286,7 @@ if (val++) \
 if (--val) \
        memcpy((char *) tag, (const char *) (stack), sizeof(jmp_buf))
 
-#define assoc_length(a)        (*((a)->alength(a, NULL)))->table_size
+#define assoc_length(a)        ((*((a)->alength(a, NULL)))->table_size)
 #define assoc_empty(a) (assoc_length(a) == 0)
 #define assoc_lookup(a, s)     ((a)->alookup(a, s))
 
diff --git a/configure b/configure
index 0e1998e..4834aae 100755
--- a/configure
+++ b/configure
@@ -10086,6 +10086,10 @@ fi
 
 $as_echo "#define DYNAMIC 1" >>confdefs.h
 
+               if uname | $EGREP -i 'linux|freebsd' > /dev/null
+               then
+                       LDFLAGS="$LDFLAGS -export-dynamic"
+               fi
        fi
 
 fi
diff --git a/configure.ac b/configure.ac
index bda6919..8d82747 100644
--- a/configure.ac
+++ b/configure.ac
@@ -295,6 +295,10 @@ AC_CHECK_HEADER(dlfcn.h,
        if test "$gawk_have_dlopen" = yes
        then
                AC_DEFINE([DYNAMIC], 1, [dynamic loading is possible])
+               if uname | $EGREP -i 'linux|freebsd' > /dev/null
+               then
+                       LDFLAGS="$LDFLAGS -export-dynamic"
+               fi
        fi
 ])
 
diff --git a/eval.c b/eval.c
index 2cf2212..e9b971d 100644
--- a/eval.c
+++ b/eval.c
@@ -241,6 +241,7 @@ static const char *const nodetypes[] = {
        "Node_param_list",
        "Node_func",
        "Node_ext_func",
+       "Node_old_ext_func",
        "Node_array_ref",
        "Node_array_tree",
        "Node_array_leaf",
@@ -330,6 +331,7 @@ static struct optypetab {
        { "Op_builtin", NULL },
        { "Op_sub_builtin", NULL },
        { "Op_ext_builtin", NULL },
+       { "Op_old_ext_builtin", NULL }, /* temporary */
        { "Op_in_array", " in " },
        { "Op_func_call", NULL },
        { "Op_indirect_func_call", NULL },
diff --git a/ext.c b/ext.c
index d861b82..54098e5 100644
--- a/ext.c
+++ b/ext.c
@@ -223,92 +223,56 @@ make_builtin(const awk_ext_func_t *funcinfo)
        return true;
 }
 
-#if 0
 /* make_old_builtin --- register name to be called as func with a builtin body 
*/
 
 void
-make_old_builtin(const char *, NODE *(*)(int), int)            /* temporary */
+make_old_builtin(const char *name, NODE *(*func)(int), int count)      /* 
temporary */
 {
-       NODE *p, *symbol, *f;
-       INSTRUCTION *b, *r;
+       NODE *symbol, *f;
+       INSTRUCTION *b;
        const char *sp;
-       char *pname;
-       char **vnames = NULL;
-       char c, buf[200];
-       size_t space_needed;
-       int i;
+       char c;
 
        sp = name;
        if (sp == NULL || *sp == '\0')
                fatal(_("extension: missing function name"));
 
        while ((c = *sp++) != '\0') {
-               if ((sp == &name[1] && c != '_' && ! isalpha((unsigned char) c))
+               if ((sp == & name[1] && c != '_' && ! isalpha((unsigned char) 
c))
                                || (sp > &name[1] && ! is_identchar((unsigned 
char) c)))
-                       fatal(_("make_old_builtin: illegal character `%c' in 
function name `%s'"), c, name);
+                       fatal(_("extension: illegal character `%c' in function 
name `%s'"), c, name);
        }
 
        f = lookup(name);
 
        if (f != NULL) {
                if (f->type == Node_func) {
-                       INSTRUCTION *pc = f->code_ptr;
-                       if (pc->opcode != Op_ext_func)  /* user-defined 
function */
-                               fatal(_("extension: can't redefine function 
`%s'"), name);
-                       else {
-                               /* multiple extension() calls etc. */ 
-                               if (do_lint)
-                                       lintwarn(_("extension: function `%s' 
already defined"), name);
-                               return;
-                       }
+                       /* user-defined function */
+                       fatal(_("extension: can't redefine function `%s'"), 
name);
+               } else if (f->type == Node_ext_func) {
+                       /* multiple extension() calls etc. */ 
+                       if (do_lint)
+                               lintwarn(_("extension: function `%s' already 
defined"), name);
+                       return;
                } else
                        /* variable name etc. */ 
                        fatal(_("extension: function name `%s' previously 
defined"), name);
        } else if (check_special(name) >= 0)
                fatal(_("extension: can't use gawk built-in `%s' as function 
name"), name); 
-       /* count parameters, create artificial list of param names */
 
        if (count < 0)
                fatal(_("make_builtin: negative argument count for function 
`%s'"),
-                                       name);
-
-       if (count > 0) {
-               sprintf(buf, "p%d", count);
-               space_needed = strlen(buf) + 1;
-               emalloc(vnames, char **, count * sizeof(char  *), 
"make_builtin");
-               for (i = 0; i < count; i++) {
-                       emalloc(pname, char *, space_needed, "make_builtin");
-                       sprintf(pname, "p%d", i);
-                       vnames[i] = pname;
-               }
-       }
-
-
-       getnode(p);
-       p->type = Node_param_list;
-       p->flags |= FUNC;
-       /* get our own copy for name */
-       p->param = estrdup(name, strlen(name));
-       p->param_cnt = count;
+                               name);
 
-       /* actual source and line numbers set at runtime for these instructions 
*/
-       b = bcalloc(Op_builtin, 1, __LINE__);
+       b = bcalloc(Op_symbol, 1, 0);
        b->builtin = func;
        b->expr_count = count;
-       b->nexti = bcalloc(Op_K_return, 1, __LINE__);
-       r = bcalloc(Op_ext_func, 1, __LINE__);
-       r->source_file = __FILE__;
-       r->nexti = b;
 
        /* NB: extension sub must return something */
 
-       symbol = mk_symbol(Node_func, p);
-       symbol->parmlist = vnames;
-       symbol->code_ptr = r;
-       r->func_body = symbol;
-       (void) install_symbol(p->param, symbol);
+               symbol = install_symbol(estrdup(name, strlen(name)), 
Node_old_ext_func);
+       symbol->code_ptr = b;
 }
-#endif
 
 
 /* get_argument --- get the i'th argument of a dynamically linked function */
diff --git a/extension/ChangeLog b/extension/ChangeLog
index 4089185..932eb3a 100644
--- a/extension/ChangeLog
+++ b/extension/ChangeLog
@@ -1,3 +1,9 @@
+2012-11-26         Arnold D. Robbins     <address@hidden>
+
+       * bindarr.c, fileop.c, sparr.c: Make them compile.
+       * steps: Reinstated and updated.
+       * testsparr.awk: Add call to extension().
+
 2011-05-03         John Haque     <address@hidden>
 
        * fileop.c, record.awk, testrecord.sh: New files.
diff --git a/extension/bindarr.c b/extension/bindarr.c
index 9f8e090..6095990 100644
--- a/extension/bindarr.c
+++ b/extension/bindarr.c
@@ -203,7 +203,7 @@ do_bind_array(int nargs)
        array_t *aq;
        char *aname;
 
-       symbol = get_array_argument(0, FALSE);
+       symbol = get_array_argument(0, false);
        if (symbol->array_funcs == bind_array_func)
                fatal(_("bind_array: array `%s' already bound"), 
array_vname(symbol));
 
@@ -212,7 +212,7 @@ do_bind_array(int nargs)
        emalloc(aq, array_t *, sizeof(array_t), "do_bind_array");
        memset(aq, '\0', sizeof(array_t));
 
-       t = get_array_argument(1, FALSE);
+       t = get_array_argument(1, false);
 
        for (i = 0; i < sizeof(bfn)/sizeof(char *); i++) {
                NODE *subs, *val, *f;
@@ -265,7 +265,7 @@ do_unbind_array(int nargs)
        NODE *symbol, *xn, *td;
        array_t *aq;
 
-       symbol = get_array_argument(0, FALSE);
+       symbol = get_array_argument(0, false);
        if (symbol->array_funcs != bind_array_func)
                fatal(_("unbind_array: `%s' is not a bound array"), 
array_vname(symbol));
 
@@ -341,7 +341,7 @@ call_func(NODE *func, NODE **arg, int arg_count)
 NODE *
 dlload(NODE *obj, void *dl)
 {
-       make_builtin("bind_array", do_bind_array, 2);
-       make_builtin("unbind_array", do_unbind_array, 1);
+       make_old_builtin("bind_array", do_bind_array, 2);
+       make_old_builtin("unbind_array", do_unbind_array, 1);
        return make_number((AWKNUM) 0);
 }
diff --git a/extension/fileop.c b/extension/fileop.c
index 947c683..86f6257 100644
--- a/extension/fileop.c
+++ b/extension/fileop.c
@@ -49,16 +49,16 @@ do_fread(int nargs)
        file_t *f;
        char *rbuf;
 
-       f = file_open("fread", nargs, TRUE);
+       f = file_open("fread", nargs, true);
 
-       arg = get_scalar_argument(2, FALSE);
+       arg = get_scalar_argument(2, false);
        force_number(arg);
        rlen = get_number_ui(arg);
 
        emalloc(rbuf, char *, rlen + 2, "do_fread");
        if ((count = fread(rbuf, 1, rlen, f->fp)) < rlen) {
                if (! feof(f->fp))
-                       update_ERRNO();
+                       update_ERRNO_int(errno);
        }
        return make_str_node(rbuf, count, ALREADY_MALLOCED);
 }
@@ -72,14 +72,14 @@ do_fwrite(int nargs)
        file_t *f;
        size_t count = 0;
 
-       f = file_open("fwrite", nargs, TRUE);
+       f = file_open("fwrite", nargs, true);
 
-       arg = get_scalar_argument(2, FALSE);
+       arg = get_scalar_argument(2, false);
        force_string(arg);
        if (arg->stlen > 0) {
                count = fwrite(arg->stptr, 1, arg->stlen, f->fp);
                if (count < arg->stlen)
-                       update_ERRNO();
+                       update_ERRNO_int(errno);
        }
        return make_number(count);
 }
@@ -94,13 +94,13 @@ do_fseek(int nargs)
        file_t *f;
        int whence = 0, ret = 0;
 
-       f = file_open("fseek", nargs, TRUE);
+       f = file_open("fseek", nargs, true);
 
-       arg = get_scalar_argument(2, FALSE);
+       arg = get_scalar_argument(2, false);
        force_number(arg);
        offset = get_number_si(arg);
 
-       arg = get_scalar_argument(3, FALSE);
+       arg = get_scalar_argument(3, false);
        force_string(arg);
        if (strcasecmp(arg->stptr, "SEEK_SET") == 0)
                whence = SEEK_SET;
@@ -113,7 +113,7 @@ do_fseek(int nargs)
                        (int) arg->stlen, arg->stptr);
 
        if (fseek(f->fp, offset, whence) < 0) {
-               update_ERRNO();
+               update_ERRNO_int(errno);
                ret = -1;
        }
        return make_number(ret);
@@ -129,12 +129,12 @@ do_ftruncate(int nargs)
        off_t len;
        int ret = 0;
 
-       f = file_open("ftruncate", nargs, TRUE);
-       arg = get_scalar_argument(2, FALSE);
+       f = file_open("ftruncate", nargs, true);
+       arg = get_scalar_argument(2, false);
        force_number(arg);
        len = (off_t) get_number_si(arg);
        if (ftruncate(fileno(f->fp), len) < 0) {
-               update_ERRNO();
+               update_ERRNO_int(errno);
                ret = -1;
        }
        return make_number(ret);
@@ -148,12 +148,12 @@ do_unlink(int nargs)
        NODE *file;
        int ret = 0;
 
-       file = get_scalar_argument(0, FALSE);
+       file = get_scalar_argument(0, false);
        force_string(file);
        if (file->stlen == 0)
                fatal(_("unlink: filename has empty string value"));
        if (unlink(file->stptr) < 0) {
-               update_ERRNO();
+               update_ERRNO_int(errno);
                ret = -1;
        }
        return make_number(ret);
@@ -167,11 +167,11 @@ do_flush(int nargs)
        file_t *f;
        int status = -1;
 
-       f = file_open("flush", nargs, FALSE);
+       f = file_open("flush", nargs, false);
        if (f != NULL) {
                status = fflush(f->fp);
                if (status != 0)
-                       update_ERRNO();
+                       update_ERRNO_int(errno);
        }
        return make_number(status);
 }
@@ -184,11 +184,11 @@ do_fclose(int nargs)
        file_t *f;
        int status = -1;
 
-       f = file_open("fclose", nargs, FALSE);
+       f = file_open("fclose", nargs, false);
        if (f != NULL) {
                status = fclose(f->fp);
                if (status != 0)
-                       update_ERRNO();
+                       update_ERRNO_int(errno);
                assert(files == f);
                files = f->next;
                efree(f);
@@ -205,18 +205,18 @@ do_filesize(int nargs)
        struct stat sbuf;
        AWKNUM d = -1.0;
 
-       file = get_scalar_argument(0, FALSE);
+       file = get_scalar_argument(0, false);
        force_string(file);
        if (file->stlen == 0)
                fatal(_("filesize: filename has empty string value"));
 
        if (stat(file->stptr, & sbuf) < 0) {
-               update_ERRNO();
+               update_ERRNO_int(errno);
                goto ferror;
        }
        if ((sbuf.st_mode & S_IFMT) != S_IFREG) {
                errno = EINVAL;
-               update_ERRNO();
+               update_ERRNO_int(errno);
                goto ferror;
        }
        d = sbuf.st_size;
@@ -234,14 +234,14 @@ do_file_exists(int nargs)
        struct stat sbuf;
        int ret = 1;
 
-       file = get_scalar_argument(0, FALSE);
+       file = get_scalar_argument(0, false);
        force_string(file);
        if (file->stlen == 0)
                fatal(_("file_exists: filename has empty string value"));
 
        if (stat(file->stptr, & sbuf) < 0) {
                if (errno != ENOENT)
-                       update_ERRNO();
+                       update_ERRNO_int(errno);
                ret = 0;
        }
        return make_number(ret);
@@ -262,9 +262,9 @@ file_open(const char *builtin_name, int nargs, int do_open)
        if (nargs < 2)
                cant_happen();
 
-       file = get_scalar_argument(0, FALSE);
+       file = get_scalar_argument(0, false);
        force_string(file);
-       mode = get_scalar_argument(1, TRUE);
+       mode = get_scalar_argument(1, true);
        force_string(mode);
 
        if (file->stlen == 0)
@@ -366,15 +366,15 @@ mode2flags(const char *mode)
 NODE *
 dlload(NODE *tree, void *dl)
 {
-       make_builtin("fseek", do_fseek, 4);
-       make_builtin("fread", do_fread, 3);
-       make_builtin("fwrite", do_fwrite, 3);
-       make_builtin("flush", do_flush, 2);
-       make_builtin("filesize", do_filesize, 1);
-       make_builtin("file_exists", do_file_exists, 1);
-       make_builtin("fclose", do_fclose, 2);
-       make_builtin("ftruncate", do_ftruncate, 3);
-       make_builtin("unlink", do_unlink, 1);
+       make_old_builtin("fseek", do_fseek, 4);
+       make_old_builtin("fread", do_fread, 3);
+       make_old_builtin("fwrite", do_fwrite, 3);
+       make_old_builtin("flush", do_flush, 2);
+       make_old_builtin("filesize", do_filesize, 1);
+       make_old_builtin("file_exists", do_file_exists, 1);
+       make_old_builtin("fclose", do_fclose, 2);
+       make_old_builtin("ftruncate", do_ftruncate, 3);
+       make_old_builtin("unlink", do_unlink, 1);
        return make_number((AWKNUM) 0);
 }
 
diff --git a/extension/sparr.c b/extension/sparr.c
index e986eb1..a3d06e6 100644
--- a/extension/sparr.c
+++ b/extension/sparr.c
@@ -47,7 +47,7 @@ install_array(const char *name)
                r = install_symbol(estrdup(name, strlen(name)), Node_var_array);
        switch (r->type) {
        case Node_var_new:
-               r = force_array(r, FALSE);
+               r = force_array(r, false);
                /* fall through */
        case Node_var_array:
                assoc_clear(r);
@@ -79,7 +79,7 @@ store_SYS(NODE *symbol, NODE *subs, NODE *val, void *data)
        if (subs != NULL && val != NULL && val->type == Node_val) {
                force_string(subs);
                if (strcmp(subs->stptr, "readline") == 0) {
-                       sd->load_file = TRUE;
+                       sd->load_file = true;
                        unref(sd->filename);
                        sd->filename = dupnode(val);
                }
@@ -95,7 +95,8 @@ load_READLINE(NODE *symbol, void *data)
        NODE *file, *tmp;
        FILE *fp;
        static char linebuf[BUFSIZ];
-       int i, long_line = FALSE;
+       int i;
+       bool long_line = false;
 
        if (! sd->load_file)    /* non-existent SYS["readline"] or already 
loaded */ 
                return;
@@ -122,7 +123,7 @@ load_READLINE(NODE *symbol, void *data)
                        linebuf[sz - 1] = '\0';
                        sz--;
                        if (long_line) {
-                               long_line = FALSE;
+                               long_line = false;
                                i--;
                                continue;
                        }
@@ -133,7 +134,7 @@ load_READLINE(NODE *symbol, void *data)
                        if (do_lint)
                                lintwarn(_("file `%s' does not end in newline 
or line # `%d' is too long"),
                                        file->stptr, i);
-                       long_line = TRUE;
+                       long_line = true;
                }
 
                tmp = make_number(i);
@@ -143,7 +144,7 @@ load_READLINE(NODE *symbol, void *data)
                *lhs = make_string(linebuf, sz);
        }
        fclose(fp);
-       sd->load_file = FALSE;  /* don't load this file again */
+       sd->load_file = false;  /* don't load this file again */
 }      
 
 /* dlload --- load this library */
diff --git a/extension/steps b/extension/steps
index 168ec39..3e8070d 100755
--- a/extension/steps
+++ b/extension/steps
@@ -1,15 +1,10 @@
 # what to do under linux to make dl.so
-# Tue Nov 24 15:04:14 EST 1998
-# Sun Aug 26 16:03:58 IDT 2001
-# Sun Apr 28 15:59:57 IDT 2002
-# Mon Jun 21 17:03:37 IDT 2004
-# Fri May 15 15:48:45 IDT 2009
 # Sun Nov 25 21:40:49 IST 2012
 
-gcc -fPIC -shared -Wall -DHAVE_CONFIG_H -c -O -g -I.. spec_array.c
-gcc -fPIC -shared -Wall -DHAVE_CONFIG_H -c -O -g -I.. sparr.c
-gcc -fPIC -shared -Wall -DHAVE_CONFIG_H -c -O -g -I.. bindarr.c
-gcc -fPIC -shared -Wall -DHAVE_CONFIG_H -c -O -g -I.. fileop.c
-ld -o sparr.so -shared sparr.o spec_array.o
-ld -o bindarr.so -shared bindarr.o
-ld -o fileop.so -shared fileop.o
+gcc -fPIC -shared -Wall -DGAWK -DHAVE_CONFIG_H -c -O -g -I.. spec_array.c
+gcc -fPIC -shared -Wall -DGAWK -DHAVE_CONFIG_H -c -O -g -I.. sparr.c
+gcc -fPIC -shared -Wall -DGAWK -DHAVE_CONFIG_H -c -O -g -I.. bindarr.c
+gcc -fPIC -shared -Wall -DGAWK -DHAVE_CONFIG_H -c -O -g -I.. fileop.c
+gcc -o sparr.so -shared sparr.o spec_array.o
+gcc -o bindarr.so -shared bindarr.o
+gcc -o fileop.so -shared fileop.o
diff --git a/extension/testsparr.awk b/extension/testsparr.awk
index b31409f..648a21a 100644
--- a/extension/testsparr.awk
+++ b/extension/testsparr.awk
@@ -1,5 +1,6 @@
 # ../gawk -lsparr -f testsparr.awk
 BEGIN {
+       extension("sparr")
        print SYS["time"]
        SYS["readline"] = "sparr.c";
        printf("File %s has %d lines\n", SYS["readline"], length(READLINE)) 
diff --git a/interpret.h b/interpret.h
index 419fc2e..0d1511a 100644
--- a/interpret.h
+++ b/interpret.h
@@ -901,12 +901,16 @@ arrayfor:
                        break;
 
                case Op_ext_builtin:
+               case Op_old_ext_builtin:
                {
                        int arg_count = pc->expr_count;
                        awk_value_t result;
 
                        PUSH_CODE(pc);
-                       r = awk_value_to_node(pc->extfunc(arg_count, & result));
+                       if (op == Op_ext_builtin)
+                               r = awk_value_to_node(pc->extfunc(arg_count, & 
result));
+                       else
+                               r = pc->builtin(arg_count);
                        (void) POP_CODE();
                        while (arg_count-- > 0) {
                                t1 = POP();
@@ -1012,7 +1016,7 @@ match_re:
                        }
 
                        if (f == NULL || f->type != Node_func) {
-                               if (f->type == Node_ext_func)
+                               if (f->type == Node_ext_func || f->type == 
Node_old_ext_func)
                                        fatal(_("cannot (yet) call extension 
functions indirectly"));
                                else
                                        fatal(_("function called indirectly 
through `%s' does not exist"),
@@ -1032,19 +1036,22 @@ match_re:
                        f = pc->func_body;
                        if (f == NULL) {
                                f = lookup(pc->func_name);
-                               if (f == NULL || (f->type != Node_func && 
f->type != Node_ext_func))
+                               if (f == NULL || (f->type != Node_func && 
f->type != Node_ext_func && f->type != Node_old_ext_func))
                                        fatal(_("function `%s' not defined"), 
pc->func_name);
                                pc->func_body = f;     /* save for next call */
                        }
 
-                       if (f->type == Node_ext_func) {
+                       if (f->type == Node_ext_func || f->type == 
Node_old_ext_func) {
                                INSTRUCTION *bc;
                                char *fname = pc->func_name;
                                int arg_count = (pc + 1)->expr_count;
 
                                bc = f->code_ptr;
                                assert(bc->opcode == Op_symbol);
-                               pc->opcode = Op_ext_builtin;    /* self 
modifying code */
+                               if (f->type == Node_ext_func)
+                                       pc->opcode = Op_ext_builtin;    /* self 
modifying code */
+                               else
+                                       pc->opcode = Op_old_ext_builtin;        
/* self modifying code */
                                pc->extfunc = bc->extfunc;
                                pc->expr_count = arg_count;             /* 
actual argument count */
                                (pc + 1)->func_name = fname;    /* name of the 
builtin */
diff --git a/msg.c b/msg.c
index 5427a96..c0bf38a 100644
--- a/msg.c
+++ b/msg.c
@@ -162,7 +162,6 @@ gawk_exit(int status)
                longjmp(fatal_tag, 1);
        }
 
-       /* we could close_io() here */
        final_exit(status);
 }
 
@@ -173,6 +172,8 @@ final_exit(int status)
 {
        /* run any extension exit handlers */
        run_ext_exit_handlers(status);
+
+       /* we could close_io() here */
        close_extensions();
 
        exit(status);

http://git.sv.gnu.org/cgit/gawk.git/commit/?id=9a9ff61bbd952c1263b55f82a269da5b09289a6b

commit 9a9ff61bbd952c1263b55f82a269da5b09289a6b
Merge: dbabe5a 7af1da7
Author: Arnold D. Robbins <address@hidden>
Date:   Sun Nov 25 21:54:48 2012 +0200

    Merge branch 'master' into array-iface

diff --cc ChangeLog
index 5784af3,caf7736..bb60a06
--- a/ChangeLog
+++ b/ChangeLog
@@@ -1,90 -1,1126 +1,1213 @@@
 +2012-05-02         John Haque      <address@hidden>
 +
 +      * str_array.c (str_copy): Initialize next pointer in the linked list
 +      to avoid memory corruption.
 +      * int_array.c (int_copy): Ditto.
 +
 +2012-04-21         John Haque      <address@hidden>
 +
 +      Shutdown routine for a dynamic extension.
 +
 +      * awk.h (SRCFILE): New field fini_func.
 +      * ext.c (load_ext): Takes an additional argument to look up and
 +      save the clean up routine in SRCFILE struct. 
 +      (INIT_FUNC, FINI_FUNC): Defines for default init and fini routine
 +      names.
 +      (do_ext): Use default for the name of the init or fini routine if
 +      one is not supplied. Adjust call to load_ext().
 +      (close_extensions): Execute fini routines.
 +      * interpret.h (Op_at_exit): Call close_extensions().
 +      * msg.c (gawk_exit): Ditto.
 +      * debug.c (close_all): Ditto.
 +      * main.c (main): Adjust call to load_ext().
 +      * awkgram.y (tokentab): Specify 2nd and 3rd optional arguments
 +      for the extension() built-in.
 +
 +      Unrelated:
 +
 +      * interpret.h (Op_arrayfor_init): Use assoc_length for array size. 
 +      
 +2012-04-19         John Haque      <address@hidden>
 +
 +      Enhanced array interface to support transparent implementation
 +      using external storage and ...
 +
 +      * awk.h (astore): Optional post-assignment store routine for
 +      array subscripts.
 +      (Op_subscript_assign): New opcode to support the store routine.
 +      (alength): New array interface routine for array length.
 +      (assoc_length): New macro.
 +      (assoc_empty): Renamed from array_empty.
 +      * awkgram.y (snode): Append Op_subscript_assign opcode if
 +      (g)sub variable is an array element.
 +      (mk_getline): Same for getline variable.
 +      (mk_assignment): Same if assigning to an array element.
 +      * field.c (set_element): Call store routine if needed.
 +      * builtin.c (do_match): Ditto.
 +      (do_length): Use length routine for array size.
 +      * symbol.c (print_vars): Ditto.
 +      * array.c (null_length): Default function for array length interface.
 +      (asort_actual): Call store routine if defined.
 +      (asort_actual, assoc_list): Use length routine for array size.
 +      (null_array_func): Add length and store routine entries.
 +      * str_array.c (str_array_func): Same.
 +      * cint_array.c (cint_array_func): Same.
 +      * int_array.c (int_array_func): Same. 
 +      * eval.c (optypetab): Add Op_subscript_assign.
 +      * profile.c (pprint): Add case Op_subscript_assign.
 +      * interpret.h (set_array, set_idx): New variables to keep track
 +      of an array element with store routine.
 +      (Op_sub_array, Op_subscript_lhs, Op_store_sub, Op_subscript_assign):
 +      Add code to handle array store routine.
 +      * debug.c (print_symbol, print_array, cmp_val, watchpoint_triggered,
 +      initialize_watch_item): Use length routine for array size.
 +
 +      * awk.h (assoc_kind_t): New typedef for enum assoc_list_flags.
 +      (sort_context_t): Renamed from SORT_CONTEXT.
 +      * array.c (asort_actual, assoc_sort): Adjust.
 +      * cint_array.c (cint_list, tree_list, leaf_list): Adjust.
 +      * int_array.c (int_list): Adjust.
 +      * str_array.c (str_list): Adjust.
 +
 +2012-04-18         John Haque      <address@hidden>
 +
 +      * awk.h (atypeof, AFUNC): New macros.
 +      (afunc_t): Renamed typedef from array_ptr.
 +      * array.c (register_array_func, null_lookup): Use AFUNC macro
 +      instead of hard-coded index for array functions.
 +      (asort_actual): Unref null array elements before overwriting.
 +      (force_array): Renamed from get_array.
 +      (null_array): Renamed from init_array. Also initialize flags to 0.
 +      (array_types): Renamed from atypes.
 +      (num_array_types): Renamed from num_atypes.
 +      * interpret.h (r_interpret): In case Op_sub_array, unref null array 
element.
 +      * str_array.c (str_array_init): Reworked for (re)initialization of 
array.
 +      * int_array.c (int_array_init): Ditto.
 +      * cint_array.c (cint_array_init): Ditto.
 +
+ 2012-11-24         Arnold D. Robbins     <address@hidden>
+ 
+       Directory cleanup.
+ 
+       * TODO.xgawk, FUTURES: Merged into TODO.
+       * TODO: More stuff added.
+       * Makefile.am (EXTRA_DIST): Updated.
+ 
+ 2012-11-22         Arnold D. Robbins     <address@hidden>
+ 
+       Cleanup of awk.h.
+ 
+       * array.c (r_in_array): Removed.
+       * awk.h (MALLOC_ARG_T): Replaced with size_t everywhere.
+       (S_ISREG, setsid): Moved to io.c.
+       (__extension__): Removed.
+       (INT32_BIT): Moved to cint_array.c.
+       (_t): Always declare.
+       (DO_LINT_INVALID, et al): Moved into an enum.
+       (POP_ARRAY, POP_PARAM, POP_SCALAR, TOP_SCALAR, dupnode, in_array):
+       Moved into inline functions.
+       (force_number, force_string): Simplified.
+       (ZOS_USS): Remove undef of DYNAMIC, it's handled in configure.ac.
+       * io.c (S_ISREG, setsid): Moved to here.
+       * cint_array.c (INT32_BIT): Moved to here.
+       * eval.c (_t): Always define.
+       * protos.h: Use size_t directly instead of MALLOC_ARG_T.
+ 
+       Unrelated:
+ 
+       * gawkapi.h: Add `awk_' prefix to structure tags where they
+       were missing.  Document the full list of include files needed.
+ 
+ 2012-11-14         Arnold D. Robbins     <address@hidden>
+ 
+       * io.c (do_find_source): On VMS, don't add the `/' separater.
+       Thanks to Anders Wallin.
+ 
+       MPFR minor cleanup:
+ 
+       * awk.h (mpfr_unset): Declare new function.
+       * mpfr.c (mpfr_unset): New function.
+       * node.c (r_unref): Call it instead of inline code.
+       * gawk_api.c (api_sym_update_scalar): Call it instead of inline code.
+ 
+ 2012-11-13         Arnold D. Robbins     <address@hidden>
+ 
+       * symbol.c (get_symbols): Check type, not vname. Keeps
+       valgrind happy. Thanks to Andrew Schorr for noticing the problem.
+ 
+ 2012-11-10         Arnold D. Robbins     <address@hidden>
+ 
+       * Update to bison 2.6.5. Various files regenerated.
+       * io.c (find_source): Add a default value for SHLIBEXT.
+       (read_with_timeout): For VMS also, just use read().
+ 
+ 2012-11-10         John Haque      <address@hidden>
+ 
+       * int_array.c (int_copy): Initialize next pointer of newchain to null.
+       * eval.c (eval_condition): Force string context for an integer used
+       as array index.
+ 
+ 2012-11-10         Arnold D. Robbins     <address@hidden>
+ 
+       * gawkapi.c (api_add_ext_func, api_awk_atexit, api_clear_array,
+       api_create_array, api_create_value, api_register_ext_version,
+       api_release_value, api_update_ERRNO_string, node_to_awk_value,
+       remove_element, run_ext_exit_handlers): Add null pointer checks.
+       Everywhere: Add / fixup leading comments.
+ 
+       * interpret.h (Op_store_sub): If assigning to an unitialized variable
+       through SYMTAB, change it to Node_var. Add explanatory comments.
+       * symbol.c (get_symbol): Rationalized. Skip non-variables in SYMTAB.
+ 
+ 2012-11-04         Arnold D. Robbins     <address@hidden>
+ 
+       * gawkapi.h: Minor documentation edit.
+ 
+ 2012-10-31         Arnold D. Robbins     <address@hidden>
+ 
+       * awkgram.y (want_regexp): Use as a bool, not as an int.
+       * field.c: Fix a comment.
+       * gawkapi.h: Add comment to include <errno.h>.
+       * symbol.c (load_symbols): ``No automatic aggregate initialization.''
+       Here too. Sigh again.
+ 
+       * gawkapi.h: Minor documentation edits.
+ 
+ 2012-10-28         Arnold D. Robbins     <address@hidden>
+ 
+       * Update to bison 2.6.4. Various files regenerated.
+ 
+ 2012-10-27         Arnold D. Robbins     <address@hidden>
+ 
+       * gawkapi.h: Continuing the minor formatting / doc cleanups.
+ 
+ 2012-10-26         Arnold D. Robbins     <address@hidden>
+ 
+       * gawkapi.h: Continuing the minor formatting / doc cleanups.
+ 
+ 2012-10-24         Arnold D. Robbins     <address@hidden>
+ 
+       * gawkapi.h: Still more minor formatting / doc cleanups.
+ 
+ 2012-10-23         Arnold D. Robbins     <address@hidden>
+ 
+       * gawkapi.h: More minor formatting / doc cleanups.
+ 
+ 2012-10-21         Arnold D. Robbins     <address@hidden>
+ 
+       Fixes for z/OS from Dave Pitts.
+ 
+       * awk.h (assoc_list_flags): No trailing comma on last enum value.
+       * gawkapi.h (awk_valtype_t): Ditto.
+       * symbol.c (lookup): ``No automatic aggregate initialization.'' Sigh.
+ 
+       Unrelated:
+ 
+       * gawkapi.h: Minor formatting / doc cleanups.
+ 
+ 2012-10-19         Arnold D. Robbins     <address@hidden>
+ 
+       If SYMTAB is used, make sure ENVIRON and PROCINFO get loaded too.
+ 
+       * awkgram.y (process_deferred): New function. Call it when program
+       is completely parsed.
+       (symtab_used): New variable.
+       (variable): Set it to true if SYMTAB is looked up.
+       * main.c (load_environ, load_procinfo): Make sure the routines are
+       only called once.
+ 
+       Unrelated fixes:
+ 
+       * awkgram.y (yylex): Check continue_allowed and break_allowed as
+       soon as they are seen in the scanner; the rules that check them
+       can not be reduced until after a token that allows them is seen,
+       leading to errors at execution time.
+       * interpret.h (Op_K_break, Op_K_continue, Op_jmp): Add asssertion
+       that pc->target_jmp is not NULL.
+ 
+       * symbol.c (lookup): Correct a comment.
+ 
+ 2012-10-14         Arnold D. Robbins     <address@hidden>
+ 
+       * gawkapi.h (IOBUF_PUBLIC): Renamed awk_input_buf_t.
+       (struct iobuf_public): Renamed struct awk_input.
+       * awk.h: Adjust.
+ 
+ 2012-10-13         Arnold D. Robbins     <address@hidden>
+ 
+       * Update to Automake 1.12.4. Various files regenerated.
+ 
+ 2012-10-11         Arnold D. Robbins     <address@hidden>
+ 
+       * awk.h (dup_ent): New member for Node_param_list.
+       * symbol.c (install): For parameters, if this is a duplicate, chain
+       it off the original using the dup_ent pointer.
+       (remove_params): If there's a duplicate, remove it from the list.
+ 
+       * awk.h: Fix flags to have unique numeric values. Oops.
+ 
+ 2012-10-10         Arnold D. Robbins     <address@hidden>
+ 
+       * gawkapi.h: Add considerably more documentation. Rearrange order
+       of functions in the struct to make more sense, grouping related
+       functions together in a more logical order.
+       * gawkapi.c: Adjust as needed.
+       * ext.c (make_builtin): Adjust for name change in struct member.
+ 
+ 2012-10-05         Arnold D. Robbins     <address@hidden>
+ 
+       * mbsupport.h: Add a bunch of undefs for z/OS.
+ 
+ 2012-10-04         Arnold D. Robbins     <address@hidden>
+ 
+       * TODO.xgawk: Update.
+       * awk.h (make_str_node): Removed macro.
+       (make_string): Modified to call make_str_node.
+       (r_make_str_node): Renamed to make_str_node.
+       * gawkapi.c: Changed r_make_str_node to make_str_node everywhere.
+       * node.c (make_str_node): Renamed from make_str_node.
+ 
+       Update to automake 1.12.4.
+ 
+       * Makefile.in, aclocal.m4, awklib/Makefile.in, doc/Makefile.in,
+       extension/Makefile.in, extension/aclocal.m4, test/Makefile.in:
+       Regenerated.
+ 
+       * interpret.h (Op_Subscript): Added lint warnings for FUNCTAB
+       and SYMTAB.
+ 
+ 2012-10-02         Arnold D. Robbins     <address@hidden>
+ 
+       * awk.h (func_table): Declare.
+       * awkgram.y: If do_posix or do_traditional, then check for
+       delete on SYMTAB. Add check for delete on FUNCTAB, also.
+       * interpret.h (Op_Subscript): For FUNCTAB, return the element name
+       as its value too.  Avoids lots of weirdness and allows indirect calls
+       after assignment from FUNCTAB["foo"] to work.
+       (Op_store_sub): Disallow assignment to elements of FUNCTAB.
+       (Op_indirect_func_all): Turn assert into check and fatal error.
+       * symbol.c (func_table): No longer static.
+       (lookup): If do_posix or do_traditional, skip the global table.
+       (release_all_vars): Clear func_table too.
+ 
+ 2012-09-25         Arnold D. Robbins     <address@hidden>
+ 
+       First cut at SYMTAB and FUNCTAB. This does the following:
+       - Change symbol table handling to use gawk arrays.
+       - Store symbols in SYMTAB array and allow indirect access
+         through SYMTAB to variables, both getting and setting.
+       - List function names in FUNCTAB indexes; Values cannot be
+         used at the moment.
+       - No documentation yet.
+ 
+       * awk.h (Node_hashnode, hnext, hname, hlength, hcode, hvalue):
+       Removed, not needed any more.
+       (init_symbol_table, symbol_table): Add declarations.
+       * awkgram.y: Disallow delete on SYMTAB, fix warning for tawk
+       extension if traditional.
+       * eval.c (nodetypes): Remove Node_hashnode element.
+       * interpret.h (Op_subscript, Op_store_sub): Handle SYMTAB and go
+       through to the actual value.
+       * main.c (main): Init Nnull_string earlier. Add call to
+       init_symbol_table().
+       * profile.c (pp_str, pp_len): Change definitions.
+       (pp_next): New macro.
+       (pp_push, pp_pop): Adjust uses.
+       * symbol.c (variables): Removed.
+       (global_table, param_table, func_table, symbol_table,
+       installing_specials): New variables.
+       (lookup, make_params, install_params, remove_params, remove_symbol,
+       make_symbol, install, get_symbols, release_all_vars, append_symbol,
+       release_symbols, load_symbols): Rework logic considerably.
+       (init_symbol_table): New function.
+ 
+ 2012-09-23         Arnold D. Robbins     <address@hidden>
+ 
+       `delete array' and `nextfile' are now in POSIX.
+       Thanks to Nathan Weeks <address@hidden> for the
+       initiative and letting us know about it.
+ 
+       * awkgram.y: Make the right code changes for `delete array'
+       and `nextfile'.
+       (tokentab): Set flags to zero for nextfile.
+ 
+ 2012-09-19         Arnold D. Robbins     <address@hidden>
+ 
+       * symbol.c (load_symbols): Zero out the new node. Prevents assertion
+       failure on PPC Mac OS X.
+ 
+ 2012-09-14         Arnold D. Robbins     <address@hidden>
+ 
+       Allow read-only access to built-in variables from extensions.
+ 
+       * awk.h (NO_EXT_SET): New flag.
+       * gawkapi.c (api_sym_lookup, api_sym_update_real): Set flag if off
+       limits variable instead of failing. Adjust logic.
+       (api_sym_update_scalar, api_set_array_element, api_del_array_element,
+       api_release_flattened_array): Adjust logic.
+       * gawkapi.h: Adjust documentation.
+ 
+       Provide PROCINFO["identifiers"]. Undocumented for now.
+ 
+       * awk.h (load_symbols): Add declaration.
+       * awkgram.y (variable): Adjust comment formatting.
+       * main.c (main): Call load_symbols().
+       * symbol.c (load_symbols): New function.
+ 
+ 2012-09-13         Arnold D. Robbins     <address@hidden>
+ 
+       * configure.ac: Determination of DYNAMIC adjusted. Hopefully is
+       smarter for z/OS.
+ 
+ 2012-09-13         Dave Pitts            <address@hidden>
+ 
+       * awk.h: Add defines for z/OS for newer types.
+ 
+ 2012-08-31         Arnold D. Robbins     <address@hidden>
+ 
+       * gawkapi.c: Wrap various bits in #ifdef DYNAMIC so that
+       gawk will compile on systems without dynamic loading.
+ 
+ 2012-08-24         Arnold D. Robbins     <address@hidden>
+ 
+       Add version facility to API. Thanks to Manuel Collado
+       for the idea.
+ 
+       * awk.h (print_ext_versions): Declare.
+       Rearrange includes and decls to make more sense.
+       * gawkapi.h (register_ext_version): New API.
+       (dl_load_func): Add code for ext_version.
+       * gawkapi.c (api_register_ext_version, print_ext_versions):
+       New functions.
+       * main.c (do_version): New variable.
+       (optab): Set it for -v / --version.
+       (main): Set it in arg parsing switch. Call version() after the
+       extensions have been loaded.
+ 
+ 2012-08-22         Arnold D. Robbins     <address@hidden>
+ 
+       Add output wrapper and two-way processor to extension API.
+ 
+       * awk.h (struct redirect): Replace output FILE * with awk_output_buf_t.
+       (register_output_wrapper, register_two_way_processor): Declare.
+       * builtin.c (efwrite): Adjust logic to use rp->output data and
+       functions if rp is not NULL. Remove redundant declaration of function.
+       (do_fflush, do_printf, do_print, do_print_rec): Same adjustment.
+       * ext.c (make_builtin): Adjust error messages.
+       * gawkapi.c (api_register_output_wrapper,
+       api_register_two_way_processor): New functions.
+       (sym_update_real): Adjust code formatting.
+       * gawkapi.h (awk_input_parser_t): Make next pointer awk_const.
+       (awk_output_buf_t, awk_two_way_processor_t): New structs.
+       (api_register_output_wrapper, api_register_two_way_processor): New APIs.
+       (dl_load_func): Allow for empty function table (NULL elements).
+       * io.c (find_output_wrapper, init_output_wrapper, find_two_processor,
+       gawk_fwrite, gawk_ferror, gawk_fflush, gawk_fclose): New functions.
+       (redirect): Call init_output_wrapper, find_output_wrapper as needed.
+       Adjust use of rp->fp to rp->output.fp and also function calls.
+       (close_rp, close_redir, flush_io): Same adjustment.
+       (two_way_open): Same adjustment. Call find_two_way_processor, and
+       find_output_wrapper, as needed.
+ 
+ 2012-08-17         Arnold D. Robbins     <address@hidden>
+ 
+       * Update infrastructure: Automake 1.12.3 and bison 2.6.2.
+ 
+ 2012-08-15         Arnold D. Robbins     <address@hidden>
+ 
+       * dfa.c: Sync w/GNU grep.
+ 
+ 2012-08-12         Arnold D. Robbins     <address@hidden>
+ 
+       * gawkapi.h: Make the versions enum constants instead of defines.
+ 
+ 2012-08-11         Andrew J. Schorr     <address@hidden>
+ 
+       * awkgram.y (add_srcfile): It is now a fatal error to load the
+       same file with -f and -i (or @include).
+       * TODO.xgawk: Update to reflect this change.
+ 
+ 2012-08-10         Arnold D. Robbins     <address@hidden>
+ 
+       * FUTURES, TODO.xgawk: Updates.
+ 
+ 2012-08-08         Arnold D. Robbins     <address@hidden>
+ 
+       * configure.ac: Add -DNDEBUG to remove asserts if not developing.
+ 
+       * gawkapi.h: Document how to build up arrays.
+       * gawkapi.c (api_sym_update): For an array, pass the new cookie
+       back out to the extension.
+ 
+       * awk.h (IOBUF): Move struct stat into IOBUF_PUBLIC.
+       (os_isreadable): Change to take an IOBUF_PUBLIC.
+       * gawkapi.h (IOBUF_PUBLIC): Received struct stat.
+       (INVALID_HANDLE): Moves to here.
+       * io.c (iop_alloc): Stat the fd and fill in stat buf.
+       (iop_finish): Use passed in stat info.
+ 
+ 2012-08-05         Arnold D. Robbins     <address@hidden>
+ 
+       * README.git: More stuff added.
+ 
+ 2012-08-01         Arnold D. Robbins     <address@hidden>
+ 
+       * io.c (iop_finish): New function.
+       (iop_alloc): Add errno_val parameter. Move code into iop_finish.
+       Add large explanatory leading comment.
+       (after_beginfile): Rework logic. Check for input parser first, then
+       check for invalid iop.
+       (nextfile): Organize code better. Call iop_alloc then iop_finish.
+       (redirect): Call iop_alloc, find_input_parser, iop_finish.
+       (two_way_open): Call iop_alloc, find_input_parser, iop_finish.
+       (gawk_popen): Call iop_alloc, find_input_parser, iop_finish.
+       (find_input_parser): Set iop->valid if input parser takes control.
+       (get_a_record): Rework setting RT to use macros.
+ 
+ 2012-07-29         Andrew J. Schorr     <address@hidden>
+ 
+       * awk.h (set_RT_to_null, set_RT): Removed.
+       * gawkapi.h (api_set_RT): Removed.
+       (get_record): Signature changed in input parser struct.
+       * gawkapi.c (api_set_RT): Removed.
+       * io.c (set_RT_to_null, set_RT): Removed.
+       (get_a_record): Adjustments for new API for input parser.
+ 
+ 2012-07-29         Arnold D. Robbins     <address@hidden>
+ 
+       * awk.h (os_isreadable): Adjust declaration.
+       (struct iobuf): Add new member `valid'.
+       * io.c (iop_alloc): Remove do_input_parsers parameter, it's
+       always true. Adjust logic to set things to invalid if could not
+       find an input parser.
+       (after_beginfile): Use valid member to check if iobuf is valid.
+       Don't clear iop->errcode.
+       (nextfile): Adjust logic to clear errcode if valid is true and
+       also to update ERRNO.
+       (redirect): Check iop->valid and cleanup as necessary, including
+       setting ERRNO.
+       (two_way_open): Ditto.
+       (gawk_popen): Ditto.
+       (devopen): Remove check for directory.
+ 
+ 2012-07-27         Andrew J. Schorr     <address@hidden>
+ 
+       * io.c (find_input_parser): Issue a warning if take_control_of fails.
+ 
+ 2012-07-27         Arnold D. Robbins     <address@hidden>
+ 
+       * awk.h (set_RT): Change to take a NODE * parameter.
+       * io.c (set_RT): Change to take a NODE * parameter.
+       * gawkapi.h: Change open hook to input parser in comment.
+       * gawkapi.c (api_set_RT): Adjust call to set_RT.
+ 
+ 2012-07-26         Arnold D. Robbins     <address@hidden>
+ 
+       * awk.h (set_RT_to_null, set_RT): Declare functions.
+       (os_isreadable): Declare function.
+       * io.c (set_RT_to_null, set_RT): New functions.
+       (iop_close): Init ret to zero.
+       * gawkapi.c (api_register_input_parser): Check for null pointer.
+       (api_set_RT): New function.
+       * gawkapi.h (api_set_RT): New function.
+ 
+ 2012-07-26         Andrew J. Schorr     <address@hidden>
+ 
+       * gawkapi.h (IOBUF_PUBLIC): Document the get_record and close_func
+       API.
+       (awk_input_parser_t) Change can_take_file argument to const, and
+       document the API.
+       * io.c (get_a_record): Document that the caller initializes *errcode
+       to 0, and remote the test for non-NULL errcode.
+ 
+ 2012-07-26         Andrew J. Schorr     <address@hidden>
+ 
+       * gawkapi.c (api_sym_update_scalar): Fix some minor bugs.  Was
+       not updating AWK_NUMBER when valref != 1.  And strings were not
+       freeing MPFR values.
+ 
+ 2012-07-25         Arnold D. Robbins     <address@hidden>
+ 
+       Start refactoring of IOBUF handling and turn "open hooks"
+       into "input parsers".
+ 
+       * awk.h (IOP_NOFREE_OBJ): Flag removed.
+       (register_input_parser): Renamed from register_open_hook.
+       * ext.c (load_ext): Make sure lib_name is not NULL.
+       * gawk_api.c (api_register_input_parser): Renamed from
+       api_register_open_hook.
+       * gawk_api.h (api_register_input_parser): Renamed from
+       api_register_open_hook.  Rework structure to have "do you want it"
+       and "take control of it" functions.
+       * io.c (iop_alloc): Remove third argument which is IOBUF pointer.
+       Always malloc it. Remove use of IOP_NOFREE_OBJ everywhere.
+       (find_input_parser): Renamed from find_open_hook.
+       (nextfile): Don't use static IOBUF.
+       (iop_close): Call close_func first. Then close fd or remap it
+       if it's still not INVALID_HANDLE.
+       (register_input_parser): Renamed from register_open_hook.
+       Use a FIFO list and check if more than one parser will accept the
+       file. If so, fatal error.
+ 
+ 2012-07-25         Andrew J. Schorr     <address@hidden>
+ 
+       * configure.ac: Instead of using acl_shlibext for the shared library
+       extension, define our own variable GAWKLIBEXT with a hack to work
+       correctly on Mac OS X.
+       * Makefile.am (SHLIBEXT): Use the value of GAWKLIBEXT instead of
+       acl_shlibext.
+ 
+ 2012-07-24         Arnold D. Robbins     <address@hidden>
+ 
+       * configure.ac: Add crude but small hack to make plug-ins work
+       on Mac OS X.
+ 
+ 2012-07-20         Arnold D. Robbins     <address@hidden>
+ 
+       * gawkapi.h: Rework table to not take up so much space.
+       * gawkapi.c (api_sym_update_scalar): Rework optimization code
+       to clean up the function.
+ 
+ 2012-07-17         Andrew J. Schorr     <address@hidden>
+ 
+       * gawkapi.h: Add comments explaining new api_create_value and
+       api_release_value functions.
+       * gawkapi.c (sym_update_real): Allow updates with AWK_SCALAR and
+       AWK_VALUE_COOKIE types.  After creating a regular variable,
+       remove the call to unref(node->var_value), since this is not
+       done elsewhere in the code (see, for example, main.c:init_vars).
+       If the update is for an existing variable, allow any val_type
+       except AWK_ARRAY (was previously disallowing AWK_SCALAR and
+       AWK_VALUE_COOKIE for no apparent reason).
+       (api_sym_update_scalar): The switch should return false for an
+       invalid val_type value, so change the AWK_ARRAY case to default.
+       (valid_subscript_type): Any scalar value is good, so accept any valid
+       type except AWK_ARRAY.
+       (api_create_value): Accept only AWK_NUMBER and AWK_STRING values.
+       Anything else should fail.
+ 
+ 2012-07-17         Arnold D. Robbins     <address@hidden>
+ 
+       Speedup:
+ 
+       * awk.h (r_free_wstr): Renamed from free_wstr.
+       (free_wstr): Macro to test the WSTRCUR flag first.
+       * node.c (r_free_wstr): Renamed from free_wstr.
+ 
+       Support value cookies:
+ 
+       * gawkapi.h (awk_val_type_t): Add AWK_VALUE_COOKIE.
+       (awk_value_cookie_t): New type.
+       (awk_value_t): Support AWK_VALUE_COOKIE.
+       (api_create_value, api_release_value): New function pointers.
+       * gawkapi.c (awk_value_to_node, api_sym_update_scalar,
+       valid_subscript_type): Handle AWK_VALUE_COOKIE.
+       (api_create_value, api_release_value): New functions.
+ 
+ 2012-07-16         Arnold D. Robbins     <address@hidden>
+ 
+       * gawkapi.c (awk_value_to_node): Support AWK_SCALAR.
+       (api_sym_update_scalar): Performance improvements.
+ 
+ 2012-07-12         Arnold D. Robbins     <address@hidden>
+ 
+       Allow creation of constants. Thanks to John Haque for the
+       implementation concept.
+ 
+       * gawk_api.h (api_sym_constant): Create a constant.
+       * gawk_api.h (api_sym_update_real): Renamed from api_sym_update.
+       Add is_const paramater and do the right thing if true.
+       (api_sym_update, api_sym_constant): Call api_sym_update_real
+       in the correct way.
+       (set_constant): New function.
+ 
+ 2012-07-11         Andrew J. Schorr     <address@hidden>
+ 
+       * gawkapi.h: Fix typo in comment.
+       (awk_value_t): Type for scalar_cookie should be awk_scalar_t,
+       not awk_array_t.
+       (gawk_api): Add new api_sym_lookup_scalar function.
+       (sym_lookup_scalar): New wrapper macro for api_sym_lookup_scalar hook.
+       * gawkapi.c (api_sym_lookup_scalar): New function for faster scalar
+       lookup.
+       (api_impl): Add entry for api_sym_lookup_scalar.
+ 
+ 2012-07-11         Andrew J. Schorr     <address@hidden>
+ 
+       * gawkapi.c (awk_value_to_node): Change to a switch statement
+       so AWK_SCALAR or other invalid type is handled properly.
+       (valid_subscript_type): Test whether a value type is acceptable
+       for use as an array subscript (any scalar value will do).
+       (api_get_array_element, api_set_array_element, api_del_array_element):
+       Use new valid_subscript_type instead of restricting to string values.
+ 
+ 2012-07-11         Arnold D. Robbins     <address@hidden>
+ 
+       Lots of API work.
+ 
+       * gawkapi.h: Function pointer members renamed api_XXXX and
+       macros adjusted. More documentation.
+       (awk_valtype_t): New AWK_SCALAR enum for scalar cookies.
+       (awk_scalar_t): New type.
+       (awk_value_t): New member scalar_cookie.
+       (api_sym_update_scalar): New API function.
+       (erealloc): New macro.
+       (make_const_string): New macro, renamed from dup_string.
+       (make_malloced_string): New macro, renamed from make_string.
+       (make_null_string): New inline function.
+       (dl_load_func): Add call to init routine through pointer if
+       not NULL.
+ 
+       * gawkapi.c (awk_value_to_node): Assume that string values came
+       from malloc.
+       (node_to_awk_value): Handle AWK_SCALAR.
+       (api_sym_update): Ditto.
+       (api_sym_update_scalar): New routine.
+       (api_get_array_element): Return false if the element doesn't exist.
+       Always unref the subscript.
+       (remove_element): New helper routine.
+       (api_del_array_element): Use it.
+       (api_release_flattened_array): Ditto.
+       (api_impl): Add the new routine.
+ 
+ 2012-07-11         Andrew J. Schorr     <address@hidden>
+ 
+       * gawkapi.c (api_sym_update): Allow val_type to be AWK_UNDEFINED
+       for setting a variable to "", i.e. dupnode(Nnull_string).
+ 
+ 2012-07-10         Andrew J. Schorr     <address@hidden>
+ 
+       * awkgram.y (add_srcfile): Lint warning message for a previously loaded
+       shared library should say "already loaded shared library" instead
+       of "already included source file".
+ 
+ 2012-07-08         Arnold D. Robbins     <address@hidden>
+ 
+       * gawkapi.h (set_array_element): Use index + value instead
+       of element structure. Matches get_array_element.
+       (set_array_element_by_elem): New macro to use an element.
+       * gawkapi.c (api_set_array_element): Make the necessary adjustments.
+ 
+ 2012-07-04         Arnold D. Robbins     <address@hidden>
+ 
+       * awkgram.y (tokentab): Remove limit on number of arguments
+       for "and", "or", and "xor".
+       * builtin.c (do_and, do_or, do_xor): Modify code to perform the
+       respective operation on any number of arguments. There must be
+       at least two.
+ 
+ 2012-06-29         Arnold D. Robbins     <address@hidden>
+ 
+       * gawkapi.h: Improve the documentation of the return values
+       per Andrew Schorr.
+ 
+ 2012-06-25         Arnold D. Robbins     <address@hidden>
+ 
+       * TODO.xgawk: Updated.
+       * awk.h (track_ext_func): Declared.
+       * awkgram.y (enum defref): Add option for extension function.
+       (struct fdesc): Add member for extension function.
+       (func_use): Handle extension function, mark as extension and defined.
+       (track_ext_func): New function.
+       (check_funcs): Update logic for extension functions.
+       * ext.c (make_builtin): Call track_ext_func.
+ 
+ 2012-06-24         Andrew J. Schorr     <address@hidden>
+ 
+       * TODO.xgawk: Most of IOBUF has been hidden.
+       * gawkapi.h (IOBUF): Remove declaration (now back in awk.h).
+       (IOBUF_PUBLIC): Declare new structure defining subset of IOBUF fields
+       that should be exposed to extensions.
+       (gawk_api): Update register_open_hook argument from IOBUF to
+       IOBUF_PUBLIC.
+       * awk.h (IOBUF): Restore declaration with 5 fields moved to new
+       IOBUF_PUBLIC structure.
+       (register_open_hook): Update open_func argument from IOBUF to
+       IOBUF_PUBLIC.
+       * gawkapi.c (api_register_open_hook): Ditto.
+       * io.c (after_beginfile, nextfile, iop_close, gawk_pclose): Some fields
+       such as fd and name are now inside the IOBUF public structure.
+       (struct open_hook): Update open_func argument from IOBUF to
+       (register_open_hook): Ditto.
+       (find_open_hook): opaque now inside IOBUF_PUBLIC.
+       (iop_alloc): fd and name now in IOBUF_PUBLIC.
+       (get_a_record): If the get_record hook returns EOF, set the IOP_AT_EOF
+       flag.  Access fd inside IOBUF_PUBLIC.
+       (get_read_timeout): File name now inside IOBUF_PUBLIC.
+       * interpret.h (r_interpret): File name now inside IOBUF_PUBLIC.
+       * ext.c (load_ext): No need to call return at the end of a void
+       function.
+ 
+ 2012-06-24         Arnold D. Robbins     <address@hidden>
+ 
+       * ext.c (load_ext): Don't retun a value from a void function.
+       * gawkapi.c (api_set_array_element): Set up vname and parent_array.
+ 
+ 2012-06-21         Arnold D. Robbins     <address@hidden>
+ 
+       More API and cleanup:
+ 
+       * awk.h (stopme): Make signature match other built-ins.
+       * awkgram.y (stopme): Make signature match other built-ins.
+       (regexp): Minor edit.
+       * gawkapi.c (api_set_argument): Remove unused variable.
+       Set parent_array field of array value.
+       * TODO.xgawk: Update some.
+ 
+       Remove extension() builtin.
+ 
+       * awk.h (do_ext): Removed.
+       (load_ext): Signature changed.
+       * awkgram.y (tokentab): Remove do_ext.
+       Change calls to do_ext.
+       * ext.c (load_ext): Make init function a constant.
+       * main.c (main): Change calls to do_ext.
+ 
+ 2012-06-20         Arnold D. Robbins     <address@hidden>
+ 
+       Restore lost debugging function:
+ 
+       * awkgram.y (stopme): Restore long lost debugging function.
+       * awk.h (stopme): Add declaration.
+ 
+       API work:
+ 
+       * ext.c (get_argument): Make extern.
+       * awk.h (get_argument): Declare it.
+       * gawkapi.c (api_set_argument): Call it. Finish off the logic.
+       (api_get_argument): Refine logic to use get_argument.
+       * gawkapi.h (set_argument): New API.
+ 
+ 2012-06-19         Arnold D. Robbins     <address@hidden>
+ 
+       Remove code duplication in gawkapi.c from msg.c:
+ 
+       * awk.h (err): Add `isfatal' first parameter.
+       * awkgram.y (err): Adjust all calls.
+       * msg.c (err): Adjust all calls. Move fatal code to here ...
+       (r_fatal): From here.
+       * gawkapi.c: Remove code duplication and adjust calls to `err'.
+ 
+       Handle deleting elements of flattened array:
+ 
+       * awk.h (get_argument): Remove declaration.
+       * ext.c (get_argument): Make static.
+       * gawkapi.h (awk_flat_array_t): Make opaque fields const. Add
+       more descriptive comments.
+       * gawkapi.c (release_flattened_array): Delete elements flagged
+       for deletion. Free the flattened array also.
+ 
+       Add additional debugging when developing:
+ 
+       * configure.ac: Add additional debugging flags.
+       * configure: Regenerated.
+ 
+ 2012-06-18         Arnold D. Robbins     <address@hidden>
+ 
+       * gawkapi.h (get_array_element): Restore `wanted' paramater.
+       (awk_element_t): Use awk_value_t for index. Add awk_flat_array_t.
+       (flatten_array): Change signature to use awk_flat_array_t;
+       (release_flattened_array): Change signature to use awk_flat_array_t;
+       * gawkapi.c (api_sym_update): Handle case where variable exists already.
+       (api_get_array_element): Restore `wanted' paramater and pass it
+       on to node_to_awk_value.
+       (api_set_array_element): Revisse to match changed element type.
+       (api_flatten_array): Revise signature, implement.
+       (api_release_flattened_array): Revise signature, implement.
+ 
+ 2012-06-17         Arnold D. Robbins     <address@hidden>
+ 
+       API Work:
+ 
+       * gawkapi.h (get_array_element): Remove `wanted' parameter.
+       (r_make_string): Comment the need for `api' and `ext_id' parameters.
+       * gawkapi.c (api_sym_update): Move checks to front.
+       Initial code for handling arrays. Still needs work.
+       (api_get_array_element): Implemented.
+       (api_set_array_element): Additional checking code.
+       (api_del_array_element): Implemented.
+       (api_create_array): Implemented.
+       (init_ext_api): Force do_xxx values to be 1 or 0.
+       (update_ext_api): Ditto.
+ 
+ 2012-06-12         Arnold D. Robbins     <address@hidden>
+ 
+       API Work:
+ 
+       * gawkapi.h (awk_value_t): Restore union.
+       (get_curfunc_param): Renamed to get_argument. Return type changed
+       to awk_bool_t. Semantics better thought out and documented.
+       (awk_atexit, get_array_element): Return type now void.
+       (sym_lookup): Return type now void. Argument order rationalized.
+       * gawkapi.c (node_to_awk_value): Return type is now awk_bool_t.
+       Semantics now match table in gawkawpi.h.
+       (api_awk_atexit): Return type now void.
+       (api_sym_lookup): Return type is now awk_bool_t. Change parameter
+       order.
+       (api_get_array_element): Return type is now awk_bool_t.
+ 
+       Further API implementations and fixes for extension/testext.c:
+ 
+       * awk.h (final_exit): Add declaration.
+       * ext.c (load_ext): Change `func' to install_func.
+       * gawkapi.c: Add casts to void for id param in all functions.
+       (api_sym_update): Finish implementation.
+       (api_get_array_element): Start implementation.
+       (api_set_array_element): Add error checking.
+       (api_get_element_count): Add error checking, return the right value.
+       * main.c (main): Call final_exit instead of exit.
+       (arg_assign): Ditto.
+       * msg.c (final_exit): New routine to run the exit handlers and exit.
+       (gawk_exit): Call it.
+       * profile.c (dump_and_exit): Ditto.
+ 
+ 2012-06-10         Andrew J. Schorr     <address@hidden>
+ 
+       * TODO.xgawk: Addition of time extension moved to "done" section.
+ 
+ 2012-06-10         Andrew J. Schorr     <address@hidden>
+ 
+       * gawkapi.c (api_update_ERRNO_string): Treat boolean true as a request
+       for TRANSLATE, and false as DONT_TRANSLATE.
+ 
+ 2012-06-06         Arnold D. Robbins     <address@hidden>
+ 
+       * cint_array.c (tree_print, leaf_print): Add additional casts
+       for printf warnings.
+ 
+       * awk.h (update_ext_api): Add declaration.
+       * gawkapi.c (update_ext_api): New function.
+       * eval.c (set_LINT): Call update_ext_api() at the end.
+       * gawkapi.h: Document that do_XXX could change on the fly.
+ 
+       * awk.h (run_ext_exit_handlers): Add declaration.
+       * msg.c (gawk_exit): Call it.
+ 
+ 2012-06-05         Arnold D. Robbins     <address@hidden>
+ 
+       * ext.c (load_ext): Remove use of RTLD_GLOBAL. Not needed in new
+       scheme. Clean up error messages.
+ 
+ 2012-06-04         Arnold D. Robbins     <address@hidden>
+ 
+       * configure.ac: Remove use of -export-dynamic for GCC.
+       * configure: Regenerated.
+ 
+ 2012-05-30         Arnold D. Robbins     <address@hidden>
+ 
+       * main.c (is_off_limits_var): Minor coding style edit.
+       * gawkapi.c (awk_value_to_node): More cleanup.
+       (node_to_awk_value): Use `wanted' for decision making.
+       (api_sym_update): Start implementation. Needs more work.
+       General: More cleanup, comments.
+       * gawkapi.h (api_sym_update): Add additional comments.
+ 
+ 2012-05-29         Arnold D. Robbins     <address@hidden>
+ 
+       * gawkapi.c (node_to_awk_value): Add third parameter indicating type
+       of value desired. Based on that, do force_string or force_number
+       to get the "other" type.
+       (awk_value_to_node): Clean up the code a bit.
+       (get_curfunc_param): Move forcing of values into node_to_awk_value.
+       (api_sym_lookup): Add third parameter indicating type of value wanted.
+       (api_get_array_element): Ditto.
+       * gawk_api.h: Additional comments and clarifications. Revise APIs
+       to take third 'wanted' argument as above.
+       (awk_value_t): No longer a union so that both values may be accessed.
+       All macros: Parenthesized the bodies.
+       * bootstrap.sh: Rationalize a bit.
+ 
+ 2012-05-26         Andrew J. Schorr     <address@hidden>
+ 
+       * Makefile.am (include_HEADERS): Add so gawkapi.h will be installed.
+       (base_sources): Add gawkapi.h so that it is in dist tarball.
+       * TODO.xgawk: Update.
+       * main.c (is_off_limits_var): Stop returning true for everything
+       except PROCINFO.
+ 
+ 2012-05-25         Arnold D. Robbins     <address@hidden>
+ 
+       * main.c (is_off_limits_var): New function to check if a variable
+       is one that an extension function may not change.
+       * awk.h (is_off_limits_var): Declare it.
+       * gawkapi.c (api_sym_lookup): Use it.
+ 
+       * bootstrap.sh: Touch various files in the extension directory also.
+ 
+ 2012-05-24         Andrew J. Schorr     <address@hidden>
+ 
+       * gawkapi.h (awk_param_type_t): Remove (use awk_valtype_t instead).
+       (awk_ext_func_t): Pass a result argument, and return an awk_value_t *.
+       (gawk_api.get_curfunc_param): Add a result argument.
+       (gawk_api.set_return_value): Remove obsolete function.
+       (gawk_api.sym_lookup, gawk_api.get_array_element): Add a result
+       argument.
+       (gawk_api.api_make_string, gawk_api.api_make_number): Remove hooks,
+       since access to gawk internal state is not required to do this.
+       (set_return_value): Remove obsolete macro.
+       (get_curfunc_param, sym_lookup, get_array_element): Add result argument.
+       (r_make_string, make_number): New static inline functions.
+       (make_string, dup_string): Revise macro definitions.
+       (dl_load_func): Remove global_api_p and global_ext_id args,
+       and fix SEGV by setting api prior to checking its version members.
+       (GAWK): Expand ifdef to include more stuff.
+       * gawkapi.c (node_to_awk_value): Add result argument.
+       (api_get_curfunc_param): Add result argument, and use awk_valtype_t.
+       (api_set_return_value): Remove obsolete function.
+       (awk_value_to_node): New global function to convert back into internal
+       format.
+       (api_add_ext_func): Simply call make_builtin.
+       (node_to_awk_value): Add result argument, and handle Node_val case.
+       (api_sym_lookup, api_get_array_element): Add result argument.
+       (api_set_array_element): Implement.
+       (api_make_string, api_make_number): Remove functions that belong on
+       client side.
+       (api_impl): Remove 3 obsolete entries.
+       * TODO.xgawk: Update to reflect progress.
+       * Makefile.am (base_sources): Add gawkapi.c.
+       * awk.h: Include gawkapi.h earlier.
+       (api_impl, init_ext_api, awk_value_to_node): Add declarations
+       so we can hook in new API.
+       (INSTRUCTION): Add new union type efptr for external functions.
+       (extfunc): New define for d.efptr.
+       (load_ext): Remove 3rd obj argument that was never used for anything.
+       (make_builtin): Change signature for new API.
+       * awkgram.y (load_library): Change 2nd argument to load_ext
+       from dlload to dl_load, and remove pointless 3rd argument.
+       * main.c (main): Call init_ext_api() before loading shared libraries.
+       Change 2nd argument to load_ext from dlload to dl_load, and remove
+       pointless 3rd argument.
+       * ext.c (do_ext): Remove pointless 3rd argument to load_ext.
+       (load_ext): Remove 3rd argument.  Port to new API (change initialization
+       function signature).  If initialization function fails, issue a warning
+       and return -1, else return 0.
+       (make_builtin): Port to new API.
+       * interpret.h (r_interpret): For Op_ext_builtin, call external functions
+       with an awk_value_t result buffer, and convert the returned value
+       to a NODE *.  For Node_ext_func, code now in extfunc instead of builtin.
+ 
+ 2012-05-21         Andrew J. Schorr     <address@hidden>
+ 
+       * configure.ac: Remove libtool, and call configure in the
+       extension subdirectory.  Change pkgextensiondir to remove the
+       version number, since the new API has builtin version checks.
+       * TODO.xgawk: Update.
+       * ltmain.sh: Removed, since libtool no longer used here.
+ 
+ 2012-05-19         Andrew J. Schorr     <address@hidden>
+ 
+       * TODO.xgawk: Update to reflect progress and new issues.
+       * main.c (main): Add -i (--include) option.
+       (usage): Ditto.
+       * awkgram.y (add_srcfile): Eliminate duplicates only for SRC_INC
+       and SRC_EXTLIB sources (i.e. -f duplicates should not be removed).
+       * io.c (find_source): Set DEFAULT_FILETYPE to ".awk" if not defined
+       elsewhere.
+ 
+ 2012-05-15         Arnold D. Robbins     <address@hidden>
+ 
+       * awk.h: Include "gawkapi.h" to get IOBUF.
+       * gawkapi.h: Considerable updates.
+       * gawkapi.c: New file. Start at implementing the APIs.
+ 
+ 2012-05-13         Andrew J. Schorr     <address@hidden>
+ 
+       * TODO.xgawk: Update to reflect recent discussions and deletion of
+       extension/xreadlink.[ch].
+ 
+ 2012-05-11         Arnold D. Robbins     <address@hidden>
+ 
+       Sweeping change: Use `bool', `true', and `false' everywhere.
+ 
+ 2012-04-09         Andrew J. Schorr     <address@hidden>
+ 
+       * eval.c (unset_ERRNO): Fix memory management bug -- need to use
+       dupnode with Nnull_string.
+ 
+ 2012-04-08         Andrew J. Schorr     <address@hidden>
+ 
+       * Makefile.am (valgrind): Define VALGRIND instead of redefining AWK.
+       This allows test/Makefile.am to set up the command environment as
+       desired.
+       (valgrind-noleak): Ditto, plus set --leak-check=no instead of the
+       default summary setting.
+ 
+ 2012-04-07         Andrew J. Schorr     <address@hidden>
+ 
+       * TODO.xgawk: Update to reflect progress.
+ 
+ 2012-04-01         Andrew J. Schorr     <address@hidden>
+ 
+       * TODO.xgawk: Move valgrind-noleak item into "done" section.
+       * Makefile.am (valgrind-noleak): Add new valgrind rule that omits
+       the "--leak-check=full" option to help spot more serious problems.
+ 
+ 2012-04-01         Andrew J. Schorr     <address@hidden>
+ 
+       * TODO.xgawk: Move ERRNO item into "done" section.
+       * awk.h (update_ERRNO, update_ERRNO_saved): Remove declarations.
+       (update_ERRNO_int, enum errno_translate, update_ERRNO_string,
+       unset_ERRNO): Add new declarations.
+       * eval.c (update_ERRNO_saved): Renamed to update_ERRNO_int.
+       (update_ERRNO_string, unset_ERRNO): New functions.
+       * ext.c (do_ext): Use new update_ERRNO_string function.
+       * io.c (ERRNO_node): Remove redundant extern declaration (in awk.h).
+       (after_beginfile, nextfile): Replace update_ERRNO() with
+       update_ERRNO_int(errno).
+       (inrec): Replace update_ERRNO_saved with update_ERRNO_int.
+       (do_close): Use new function update_ERRNO_string.
+       (close_redir, do_getline_redir, do_getline): Replace update_ERRNO_saved
+       with update_ERRNO_int.
+ 
+ 2012-03-27         Andrew J. Schorr     <address@hidden>
+ 
+       * TODO.xgawk: Update to reflect debate about how to support Cygwin
+       and other platforms that cannot link shared libraries with unresolved
+       references.
+       * awkgram.y (add_srcfile): Minor bug fix: reverse sense of test
+       added by Arnold in last patch.
+       * configure.ac: AC_DISABLE_STATIC must come before AC_PROG_LIBTOOL.
+ 
+ 2012-03-26         Arnold D. Robbins     <address@hidden>
+ 
+       Some cleanups.
+ 
+       * awkgram.y (add_srcfile): Use whole messages, better for
+       translations.
+       * io.c (init_awkpath): Small style tweak.
+       * main.c (path_environ): Straighten out initial comment, fix
+       compiler warning by making `val' const char *.
+ 
+ 2012-03-25         Andrew J. Schorr     <address@hidden>
+ 
+       * configure.ac (AC_DISABLE_STATIC): Add this to avoid building useless
+       static extension libraries.
+ 
+ 2012-03-25         Andrew J. Schorr     <address@hidden>
+ 
+       * TODO.xgawk: New file listing completed and pending xgawk enhancements.
+ 
+ 2012-03-24         Andrew J. Schorr     <address@hidden>
+ 
+       * io.c (path_info): Fix white space.
+       (pi_awkpath, pi_awklibpath): Avoid structure initializers.
+       (do_find_source): Eliminate pointless parentheses.
+       (find_source): Leave a space after "&".
+       * main.c (load_environ): Fix typo in comment.
+ 
+ 2012-03-21         Andrew J. Schorr     <address@hidden>
+ 
+       * awkgram.y (LEX_LOAD): New token to support @load.
+       (grammar): Add rules to support @load.
+       (tokentab): Add "load".
+       (add_srcfile): Improve error message to distinguish between source files
+       and shared libraries.
+       (load_library): New function to load libraries specified with @load.
+       (yylex): Add support for LEX_LOAD (treated the same way as LEX_INCLUDE).
+ 
+ 2012-03-20         Andrew J. Schorr     <address@hidden>
+ 
+       * Makefile.am (EXTRA_DIST): Remove extension.
+       (SUBDIRS): Add extension so libraries will be built.
+       (DEFS): Define DEFLIBPATH and SHLIBEXT so we can find shared libraries.
+       * awk.h (deflibpath): New extern declaration.
+       * configure.ac: Add support for building shared libraries by adding
+       AC_PROG_LIBTOOL and AC_SUBST for acl_shlibext and pkgextensiondir.
+       (AC_CONFIG_FILES): Add extension/Makefile.
+       * io.c (pi_awkpath, pi_awklibpath): New static structures to contain
+       path information.
+       (awkpath, max_pathlen): Remove static variables now inside pi_awkpath.
+       (init_awkpath): Operate on path_info structure to support both
+       AWKPATH and AWKLIBPATH.  No need for max_path to be static, since
+       this should be called only once for each environment variable.
+       (do_find_source): Add a path_info arg to specify which path to search.
+       Check the try_cwd parameter to decide whether to search the current
+       directory (not desirable for AWKLIBPATH).
+       (find_source): Choose appropriate path_info structure based on value
+       of the is_extlib argument.  Set EXTLIB_SUFFIX using SHLIBEXT define
+       instead of hardcoding ".so".
+       * main.c (path_environ): New function to add AWKPATH or AWKLIBPATH
+       to the ENVIRON array.
+       (load_environ): Call path_environ for AWKPATH and AWKLIBPATH.
+ 
+ 2012-06-19         Arnold D. Robbins     <address@hidden>
+ 
+       * main.c (main): Do setlocale to "C" if --characters-as-bytes.
+       Thanks to "SP" <address@hidden> for the bug report.
+ 
+ 2012-05-09         Arnold D. Robbins     <address@hidden>
+ 
+       * configure.ac: Added AC_HEADER_STDBOOL
+       * awk.h, dfa.c, regex.c: Reworked to use results
+       of test and include missing_d/gawkbool.h.
+ 
+ 2012-05-07         Arnold D. Robbins     <address@hidden>
+ 
+       * array.c (prnode): Add casts to void* for %p format.
+       * debug.c (print_instruction): Ditto.
+       * builtin.c: Fix %lf format to be %f everywhere.
+ 
+       Unrelated:
+ 
+       * replace.c: Don't include "config.h", awk.h gets it for us.
+ 
+ 2012-05-04         Arnold D. Robbins     <address@hidden>
+ 
+       * getopt.c [DJGPP]: Change to __DJGPP__.
+       * mbsupport.h [DJGPP]: Change to __DJGPP__.
+ 
+       Unrelated:
+ 
+       * awk.h: Workarounds for _TANDEM_SOURCE.
+ 
+ 2012-05-01         Arnold D. Robbins     <address@hidden>
+ 
+       * dfa.c: Sync with GNU grep. RRI code now there, needed additional
+       change for gawk.
+       * configure.ac: Add check for stdbool.h.
+       * regex.c: Add check for if not have stdbool.h, then define the
+       bool stuff.
+ 
+ 2012-04-27         Arnold D. Robbins     <address@hidden>
+ 
+       * dfa.c: Sync with GNU grep.
+       * xalloc.h (xmemdup): Added, from grep, for dfa.c. Sigh.
+ 
+ 2012-04-27         Arnold D. Robbins     <address@hidden>
+ 
+       Update to autoconf 2.69, automake 1.12.
+ 
+       * INSTALL, aclocal.m4, configh.in, depcomp, install-sh, missing,
+       mkinstalldirs, ylwrap: Updated.
+       * configure.ac (AC_TYPE_LONG_LONG_INT, AC_TYPE_UNSIGNED_LONG_LONG_INT,
+       AC_TYPE_INTMAX_T, AC_TYPE_UINTMAX_T): Renamed from gl_* versions.
+       * configure: Regenerated.
+ 
+ 2012-04-24         Arnold D. Robbins     <address@hidden>
+ 
+       * cmd.h (dPrompt, commands_Prompt, eval_Prompt, dgawk_Prompt): Changed
+       to dbg_prompt, commands_prompt, eval_prompt, dgawk_prompt.
+       * debug.c: Ditto.
+       * command.y: Ditto.  Some minor whitespace and comments cleanup.
+ 
+ 2012-04-24         Arnold D. Robbins     <address@hidden>
+ 
+       io.c cleanup and some speedup for RS as regexp parsing.
+ 
+       * awk.h (Regexp): New members has_meta and maybe_long.
+       (enum redirval): Add redirect_none as value 0.
+       (remaybelong): Remove function declaration.
+       * awkgram.y: Use redirect_none instead of 0 for no redirect cases.
+       * io.c (go_getline_redir): Second arg now of type enum redirval.
+       Changed intovar into into_variable.
+       (comments and whitespace): Lots of general cleanup.
+       (socket_open): readle changed to read_len.
+       (two_way_open): Add additional calls to os_close_on_exec.
+       (rsrescan): Simplify code a bit and use RS->maybe_long.
+       * re.c (make_regexp): Set up new members in Regexp struct.
+       (remaybelong): Remove function.
+       (reisstring): Simplified code.
+ 
  2012-04-16  Eli Zaretskii  <address@hidden>
  
        * io.c (read_with_timeout) [__MINGW32__]: Just call the blocking
diff --cc array.c
index 66a1460,411bbe6..f968edd
--- a/array.c
+++ b/array.c
@@@ -50,23 -52,30 +50,23 @@@ static afunc_t null_array_func[] = 
  
  #define MAX_ATYPE 10
  
 -static array_ptr *atypes[MAX_ATYPE];
 -static int num_atypes = 0;
 +static afunc_t *array_types[MAX_ATYPE];
 +static int num_array_types = 0;
  
 -/*
 - * register_array_func --- add routines to handle arrays.
 - *
 - *    index 0 : initialization.
 - *    index 1 : check if index is compatible.
 - *    index 8 : array dump, memory and other statistics (do_adump).
 - */
 - 
 +/* register_array_func --- add routines to handle arrays */
  
  int
 -register_array_func(array_ptr *afunc)
 +register_array_func(afunc_t *afunc)
  {
 -      if (afunc && num_atypes < MAX_ATYPE) {
 -              if (afunc != str_array_func && ! afunc[1])
 +      if (afunc && num_array_types < MAX_ATYPE) {
 +              if (afunc != str_array_func && ! afunc[AFUNC(atypeof)])
-                       return FALSE;
+                       return false;
 -              atypes[num_atypes++] = afunc;
 -              if (afunc[0])   /* execute init routine if any */
 -                      (void) (*afunc[0])(NULL, NULL);
 +              array_types[num_array_types++] = afunc;
 +              if (afunc[AFUNC(ainit)])        /* execute init routine if any 
*/
 +                      (void) (*afunc[AFUNC(ainit)])(NULL, NULL);
-               return TRUE;
+               return true;
        }
-       return FALSE;
+       return false;
  }
  
  
@@@ -338,10 -324,10 +323,10 @@@ array_vname(const NODE *symbol
   */
  
  NODE *
- force_array(NODE *symbol, int canfatal)
 -get_array(NODE *symbol, bool canfatal)
++force_array(NODE *symbol, bool canfatal)
  {
        NODE *save_symbol = symbol;
-       int isparam = FALSE;
+       bool isparam = false;
  
        if (symbol->type == Node_param_list) {
                save_symbol = symbol = GET_PARAM(symbol->param_cnt);
diff --cc awk.h
index c89ed97,557e036..67fb6ac
--- a/awk.h
+++ b/awk.h
@@@ -1041,14 -1031,10 +1042,12 @@@ extern NODE *(*str2number)(NODE *)
  extern NODE *(*format_val)(const char *, int, NODE *);
  extern int (*cmp_numbers)(const NODE *, const NODE *);
  
 -typedef int (*Func_pre_exec)(INSTRUCTION **);
 -typedef void (*Func_post_exec)(INSTRUCTION *);
 +/* built-in array types */
 +extern afunc_t str_array_func[];
 +extern afunc_t cint_array_func[];
 +extern afunc_t int_array_func[];
  
- #if __GNUC__ < 2
  extern NODE *_t;      /* used as temporary in macros */
- #endif
  extern NODE *_r;      /* used as temporary in macros */
  
  extern BLOCK nextfree[];
@@@ -1344,9 -1271,8 +1284,9 @@@ if (val++) 
  if (--val) \
        memcpy((char *) tag, (const char *) (stack), sizeof(jmp_buf))
  
 -#define array_empty(a)        ((a)->table_size == 0)
 +#define assoc_length(a)       (*((a)->alength(a, NULL)))->table_size
 +#define assoc_empty(a)        (assoc_length(a) == 0)
- #define assoc_lookup(a, s)    (a)->alookup(a, s)
+ #define assoc_lookup(a, s)    ((a)->alookup(a, s))
  
  /* assoc_clear --- flush all the values in symbol[] */
  #define assoc_clear(a)        (void) ((a)->aclear(a, NULL))
@@@ -1354,44 -1280,33 +1294,35 @@@
  /* assoc_remove --- remove an index from symbol[] */
  #define assoc_remove(a, s) ((a)->aremove(a, s) != NULL)
  
- 
- #if __GNUC__ >= 2
- #define in_array(a, s)        ({ NODE **_l = (a)->aexists(a, s); _l ? *_l : 
NULL; })
- #else /* not __GNUC__ */
- #define in_array(a, s)        r_in_array(a, s)
- #endif /* __GNUC__ */
- 
- 
  /* ------------- Function prototypes or defs (as appropriate) ------------- */
  /* array.c */
 -typedef enum sort_context { SORTED_IN = 1, ASORT, ASORTI } SORT_CTXT;
 -enum assoc_list_flags {
 +typedef enum { SORTED_IN = 1, ASORT, ASORTI } sort_context_t;
 +typedef enum {
-       AINDEX = 0x01,          /* list of indices */ 
-       AVALUE = 0x02,          /* list of values */
-       AINUM = 0x04,           /* numeric index */
-       AISTR = 0x08,           /* string index */
-       AVNUM = 0x10,           /* numeric scalar value */
-       AVSTR = 0x20,           /* string scalar value */
-       AASC = 0x40,            /* ascending order */
-       ADESC = 0x80,           /* descending order */
-       ADELETE = 0x100,        /* need a single index; for use in 
do_delete_loop */
+       AINDEX  = 0x001,        /* list of indices */ 
+       AVALUE  = 0x002,        /* list of values */
+       AINUM   = 0x004,        /* numeric index */
+       AISTR   = 0x008,        /* string index */
+       AVNUM   = 0x010,        /* numeric scalar value */
+       AVSTR   = 0x020,        /* string scalar value */
+       AASC    = 0x040,        /* ascending order */
+       ADESC   = 0x080,        /* descending order */
+       ADELETE = 0x100         /* need a single index; for use in 
do_delete_loop */
 -};
 +} assoc_kind_t;
  
  extern NODE *make_array(void);
 -extern void init_array(NODE *symbol);
 -extern NODE *get_array(NODE *symbol, bool canfatal);
 +extern void null_array(NODE *symbol);
- extern NODE *force_array(NODE *symbol, int canfatal);
++extern NODE *force_array(NODE *symbol, bool canfatal);
  extern const char *make_aname(const NODE *symbol);
  extern const char *array_vname(const NODE *symbol);
  extern void array_init(void);
 -extern int register_array_func(array_ptr *afunc);
 +extern int register_array_func(afunc_t *afunc);
 +extern NODE **null_length(NODE *symbol, NODE *subs);
 +extern NODE **null_afunc(NODE *symbol, NODE *subs);
  extern void set_SUBSEP(void);
- extern NODE *concat_exp(int nargs, int do_subsep);
- extern NODE *r_in_array(NODE *symbol, NODE *subs);
+ extern NODE *concat_exp(int nargs, bool do_subsep);
  extern NODE *assoc_copy(NODE *symbol, NODE *newsymb);
  extern void assoc_dump(NODE *symbol, NODE *p);
 -extern NODE **assoc_list(NODE *symbol, const char *sort_str, SORT_CTXT 
sort_ctxt);
 +extern NODE **assoc_list(NODE *symbol, const char *sort_str, sort_context_t 
sort_ctxt);
  extern void assoc_info(NODE *subs, NODE *val, NODE *p, const char *aname);
  extern void do_delete(NODE *symbol, int nsubs);
  extern void do_delete_loop(NODE *symbol, NODE **lhs);
@@@ -1490,15 -1408,13 +1424,17 @@@ extern STACK_ITEM *grow_stack(void)
  extern void dump_fcall_stack(FILE *fp);
  extern int register_exec_hook(Func_pre_exec preh, Func_post_exec posth);
  /* ext.c */
 -void load_ext(const char *lib_name);
 +extern NODE *do_ext(int nargs);
- extern NODE *load_ext(SRCFILE *s, const char *init_func, const char 
*fini_func, NODE *obj);
++void load_ext(const char *lib_name);  /* temporary */
++extern NODE *load_old_ext(SRCFILE *s, const char *init_func, const char 
*fini_func, NODE *obj);
 +extern void close_extensions(void);
  #ifdef DYNAMIC
- extern void make_builtin(const char *, NODE *(*)(int), int);
++extern void make_old_builtin(const char *, NODE *(*)(int), int);
+ extern awk_bool_t make_builtin(const awk_ext_func_t *);
  extern NODE *get_argument(int);
- extern NODE *get_actual_argument(int, int, int);
- #define get_scalar_argument(i, opt)  get_actual_argument((i), (opt), FALSE)
- #define get_array_argument(i, opt)   get_actual_argument((i), (opt), TRUE)
+ extern NODE *get_actual_argument(int, bool, bool);
+ #define get_scalar_argument(i, opt)  get_actual_argument((i), (opt), false)
+ #define get_array_argument(i, opt)   get_actual_argument((i), (opt), true)
  #endif
  /* field.c */
  extern void init_fields(void);
@@@ -1723,3 -1653,107 +1673,107 @@@ extern uintmax_t adjust_uint(uintmax_t 
  
  #define EXIT_FAILURE 1
  #endif
+ 
+ /* ------------------ Inline Functions ------------------ */
+ 
+ /*
+  * These must come last to get all the function declarations and
+  * macro definitions before their bodies.
+  *
+  * This is wasteful if the compiler doesn't support inline. We won't
+  * worry about it until someone complains.
+  */
+ 
+ /* POP_ARRAY --- get the array at the top of the stack */
+ 
+ static inline NODE *
+ POP_ARRAY()
+ {
+       NODE *t = POP();
+ 
 -      return (t->type == Node_var_array) ? t : get_array(t, true);
++      return (t->type == Node_var_array) ? t : force_array(t, true);
+ }
+ 
+ /* POP_PARAM --- get the top parameter, array or scalar */
+ 
+ static inline NODE *
+ POP_PARAM()
+ {
+       NODE *t = POP();
+ 
 -      return (t->type == Node_var_array) ? t : get_array(t, false);
++      return (t->type == Node_var_array) ? t : force_array(t, false);
+ }
+ 
+ /* POP_SCALAR --- pop the scalar at the top of the stack */
+ 
+ static inline NODE *
+ POP_SCALAR()
+ {
+       NODE *t = POP();
+ 
+       if (t->type == Node_var_array)
+               fatal(_("attempt to use array `%s' in a scalar context"), 
array_vname(t));
+       
+       return t;
+ }
+ 
+ /* TOP_SCALAR --- get the scalar at the top of the stack */
+ 
+ static inline NODE *
+ TOP_SCALAR()
+ {
+       NODE *t = TOP();
+ 
+       if (t->type == Node_var_array)
+               fatal(_("attempt to use array `%s' in a scalar context"), 
array_vname(t));
+       
+       return t;
+ }
+ 
+ /* POP_STRING --- pop the string at the top of the stack */
+ 
+ static inline NODE *
+ POP_STRING()
+ {
+       NODE *s = POP_SCALAR();
+       
+       return m_force_string(s);
+ }
+ 
+ /* TOP_STRING --- get the string at the top of the stack */
+ 
+ static inline NODE *
+ TOP_STRING()
+ {
+       NODE *s = TOP_SCALAR();
+       
+       return m_force_string(s);
+ }
+ 
+ /* in_array --- return pointer to element in array if there */
+ 
+ static inline NODE *
+ in_array(NODE *a, NODE *s)
+ {
+       NODE **ret;
+ 
+       ret = a->aexists(a, s);
+       
+       return ret ? *ret : NULL;
+ }
+ 
+ #ifdef GAWKDEBUG
+ #define dupnode       r_dupnode
+ #else
+ /* dupnode --- up the reference on a node */
+ 
+ static inline NODE *
+ dupnode(NODE *n)
+ {
+       if ((n->flags & MALLOC) != 0) {
+               n->valref++;
+               return n;
+       }
+       return r_dupnode(n);
+ }
+ #endif
diff --cc builtin.c
index 6ca6509,6a2d9d6..6e7e78b
--- a/builtin.c
+++ b/builtin.c
@@@ -491,24 -497,15 +497,24 @@@ do_length(int nargs
  
        tmp = POP();
        if (tmp->type == Node_var_array) {
-               static short warned = FALSE;
+               static bool warned = false;
 +              unsigned long size;
  
                if (do_posix)
                        fatal(_("length: received array argument"));
                if (do_lint && ! warned) {
-                       warned = TRUE;
+                       warned = true;
                        lintwarn(_("`length(array)' is a gawk extension"));
                }
 -              return make_number((AWKNUM) tmp->table_size);
 +
 +              /*
 +               * Support for deferred loading of array elements requires that
 +               * we use the array length interface even though it isn't 
 +               * necessary for the built-in array types.
 +               */
 +
 +              size = assoc_length(tmp);
 +              return make_number(size);
        }
  
        assert(tmp->type == Node_val);
diff --cc debug.c
index 8bd3e84,6dda3a4..90a9d80
--- a/debug.c
+++ b/debug.c
@@@ -1642,14 -1641,14 +1641,14 @@@ cmp_val(struct list_item *w, NODE *old
        if (WATCHING_ARRAY(w)) {
                long size = 0;
                if (! new)              /* 9 */
-                       return TRUE;
+                       return true;
                if (new->type == Node_val)      /* 7 */
-                       return TRUE;
+                       return true;
                /* new->type == Node_var_array */       /* 8 */
 -              size = new->table_size;
 +              size = assoc_length(new);
                if (w->cur_size == size)
-                       return FALSE;
-               return TRUE;
+                       return false;
+               return true;
        }
  
        if (! old && ! new)     /* 3 */
diff --cc ext.c
index dc312cc,5fc16af..d861b82
--- a/ext.c
+++ b/ext.c
@@@ -32,100 -31,50 +32,141 @@@ extern SRCFILE *srcfiles
  
  #ifdef DYNAMIC
  
- #define INIT_FUNC     "dlload"
- #define FINI_FUNC     "dlunload"
++#define OLD_INIT_FUNC "dlload"
++#define OLD_FINI_FUNC "dlunload"
 +
  #include <dlfcn.h>
  
+ #define INIT_FUNC     "dl_load"
+ 
+ /* load_ext --- load an external library */
+ 
+ void
+ load_ext(const char *lib_name)
+ {
+       int (*install_func)(const gawk_api_t *const, awk_ext_id_t);
+       void *dl;
+       int flags = RTLD_LAZY;
+       int *gpl_compat;
+ 
+       if (do_sandbox)
+               fatal(_("extensions are not allowed in sandbox mode"));
+ 
+       if (do_traditional || do_posix)
+               fatal(_("-l / @load are gawk extensions"));
+ 
+       if (lib_name == NULL)
+               fatal(_("load_ext: received NULL lib_name"));
+ 
+       if ((dl = dlopen(lib_name, flags)) == NULL)
+               fatal(_("load_ext: cannot open library `%s' (%s)\n"), lib_name,
+                     dlerror());
+ 
+       /* Per the GNU Coding standards */
+       gpl_compat = (int *) dlsym(dl, "plugin_is_GPL_compatible");
+       if (gpl_compat == NULL)
+               fatal(_("load_ext: library `%s': does not define 
`plugin_is_GPL_compatible' (%s)\n"),
+                               lib_name, dlerror());
+ 
+       install_func = (int (*)(const gawk_api_t *const, awk_ext_id_t))
+                               dlsym(dl, INIT_FUNC);
+       if (install_func == NULL)
+               fatal(_("load_ext: library `%s': cannot call function `%s' 
(%s)\n"),
+                               lib_name, INIT_FUNC, dlerror());
+ 
+       if (install_func(& api_impl, NULL /* ext_id */) == 0)
+               warning(_("load_ext: library `%s' initialization routine `%s' 
failed\n"),
+                               lib_name, INIT_FUNC);
+ }
+ 
 +/* do_ext --- load an extension at run-time: interface to load_ext */
 + 
 +NODE *
 +do_ext(int nargs)
 +{
 +      NODE *obj, *init = NULL, *fini = NULL, *ret = NULL;
 +      SRCFILE *s;
 +      char *init_func = NULL;
 +      char *fini_func = NULL;
 +
 +      if (nargs == 3) {
 +              fini = POP_STRING();
 +              fini_func = fini->stptr;
 +      }
 +      if (nargs >= 2) { 
 +              init = POP_STRING();
 +              init_func = init->stptr;
 +      }
 +      obj = POP_STRING();
 +
 +      s = add_srcfile(SRC_EXTLIB, obj->stptr, srcfiles, NULL, NULL);
 +      if (s != NULL)
-               ret = load_ext(s, init_func, fini_func, obj);
++              ret = load_old_ext(s, init_func, fini_func, obj);
 +
 +      DEREF(obj);
 +      if (fini != NULL)
 +              DEREF(fini);
 +      if (init != NULL)
 +              DEREF(init);
 +      if (ret == NULL)
 +              ret = dupnode(Nnull_string);
 +      return ret;
 +}
 +
 +/* load_ext --- load an external library */
 +
 +NODE *
- load_ext(SRCFILE *s, const char *init_func, const char *fini_func, NODE *obj)
++load_old_ext(SRCFILE *s, const char *init_func, const char *fini_func, NODE 
*obj)
 +{
-       NODE *tmp = NULL;
 +      NODE *(*func)(NODE *, void *);
++      NODE *tmp;
 +      void *dl;
 +      int flags = RTLD_LAZY;
 +      int *gpl_compat;
 +      const char *lib_name = s->fullpath;
 +
 +      if (init_func == NULL || init_func[0] == '\0')
-               init_func = INIT_FUNC;
++              init_func = OLD_INIT_FUNC;
 +
 +      if (fini_func == NULL || fini_func[0] == '\0')
-               fini_func = FINI_FUNC;
++              fini_func = OLD_FINI_FUNC;
 +
 +      if (do_sandbox)
 +              fatal(_("extensions are not allowed in sandbox mode"));
 +
 +      if (do_traditional || do_posix)
 +              fatal(_("`extension' is a gawk extension"));
 +
- #ifdef RTLD_GLOBAL
-       flags |= RTLD_GLOBAL;
- #endif
++      if (lib_name == NULL)
++              fatal(_("load_ext: received NULL lib_name"));
 +
 +      if ((dl = dlopen(s->fullpath, flags)) == NULL)
 +              fatal(_("extension: cannot open library `%s' (%s)"), lib_name,
 +                    dlerror());
 +
 +      /* Per the GNU Coding standards */
 +      gpl_compat = (int *) dlsym(dl, "plugin_is_GPL_compatible");
 +      if (gpl_compat == NULL)
 +              fatal(_("extension: library `%s': does not define 
`plugin_is_GPL_compatible' (%s)"),
 +                              lib_name, dlerror());
 +      func = (NODE *(*)(NODE *, void *)) dlsym(dl, init_func);
 +      if (func == NULL)
 +              fatal(_("extension: library `%s': cannot call function `%s' 
(%s)"),
 +                              lib_name, init_func, dlerror());
 +
 +      if (obj == NULL) {
 +              obj = make_string(lib_name, strlen(lib_name));
 +              tmp = (*func)(obj, dl);
 +              unref(tmp);
 +              unref(obj);
 +              tmp = NULL;
 +      } else
 +              tmp = (*func)(obj, dl);
 +
 +      s->fini_func = (void (*)(void)) dlsym(dl, fini_func);
 +      return tmp;
 +}
 +
  
  /* make_builtin --- register name to be called as func with a builtin body */
  
@@@ -176,8 -127,10 +219,97 @@@ make_builtin(const awk_ext_func_t *func
  
                symbol = install_symbol(estrdup(name, strlen(name)), 
Node_ext_func);
        symbol->code_ptr = b;
+       track_ext_func(name);
+       return true;
+ }
+ 
++#if 0
++/* make_old_builtin --- register name to be called as func with a builtin 
body */
++
++void
++make_old_builtin(const char *, NODE *(*)(int), int)           /* temporary */
++{
++      NODE *p, *symbol, *f;
++      INSTRUCTION *b, *r;
++      const char *sp;
++      char *pname;
++      char **vnames = NULL;
++      char c, buf[200];
++      size_t space_needed;
++      int i;
++
++      sp = name;
++      if (sp == NULL || *sp == '\0')
++              fatal(_("extension: missing function name"));
++
++      while ((c = *sp++) != '\0') {
++              if ((sp == &name[1] && c != '_' && ! isalpha((unsigned char) c))
++                              || (sp > &name[1] && ! is_identchar((unsigned 
char) c)))
++                      fatal(_("make_old_builtin: illegal character `%c' in 
function name `%s'"), c, name);
++      }
++
++      f = lookup(name);
++
++      if (f != NULL) {
++              if (f->type == Node_func) {
++                      INSTRUCTION *pc = f->code_ptr;
++                      if (pc->opcode != Op_ext_func)  /* user-defined 
function */
++                              fatal(_("extension: can't redefine function 
`%s'"), name);
++                      else {
++                              /* multiple extension() calls etc. */ 
++                              if (do_lint)
++                                      lintwarn(_("extension: function `%s' 
already defined"), name);
++                              return;
++                      }
++              } else
++                      /* variable name etc. */ 
++                      fatal(_("extension: function name `%s' previously 
defined"), name);
++      } else if (check_special(name) >= 0)
++              fatal(_("extension: can't use gawk built-in `%s' as function 
name"), name); 
++      /* count parameters, create artificial list of param names */
++
++      if (count < 0)
++              fatal(_("make_builtin: negative argument count for function 
`%s'"),
++                                      name);
++
++      if (count > 0) {
++              sprintf(buf, "p%d", count);
++              space_needed = strlen(buf) + 1;
++              emalloc(vnames, char **, count * sizeof(char  *), 
"make_builtin");
++              for (i = 0; i < count; i++) {
++                      emalloc(pname, char *, space_needed, "make_builtin");
++                      sprintf(pname, "p%d", i);
++                      vnames[i] = pname;
++              }
++      }
++
++
++      getnode(p);
++      p->type = Node_param_list;
++      p->flags |= FUNC;
++      /* get our own copy for name */
++      p->param = estrdup(name, strlen(name));
++      p->param_cnt = count;
++
++      /* actual source and line numbers set at runtime for these instructions 
*/
++      b = bcalloc(Op_builtin, 1, __LINE__);
++      b->builtin = func;
++      b->expr_count = count;
++      b->nexti = bcalloc(Op_K_return, 1, __LINE__);
++      r = bcalloc(Op_ext_func, 1, __LINE__);
++      r->source_file = __FILE__;
++      r->nexti = b;
++
++      /* NB: extension sub must return something */
++
++      symbol = mk_symbol(Node_func, p);
++      symbol->parmlist = vnames;
++      symbol->code_ptr = r;
++      r->func_body = symbol;
++      (void) install_symbol(p->param, symbol);
 +}
++#endif
 +
  
  /* get_argument --- get the i'th argument of a dynamically linked function */
  
@@@ -208,13 -161,12 +340,13 @@@ get_argument(int i
  }
  
  
 -/* get_actual_argument --- get the i'th scalar or array argument of a
 -      dynamically linked function, allowed to be optional.
 -*/
 +/*
 + * get_actual_argument --- get the i'th scalar or array argument of a
 + *    dynamically linked function, allowed to be optional.
 + */
  
  NODE *
- get_actual_argument(int i, int optional, int want_array)
+ get_actual_argument(int i, bool optional, bool want_array)
  {
        NODE *t;
        char *fname;
@@@ -238,7 -190,7 +370,7 @@@
  
        if (t->type == Node_var_new) {
                if (want_array)
-                       return force_array(t, FALSE);
 -                      return get_array(t, false);
++                      return force_array(t, false);
                else {
                        t->type = Node_var;
                        t->var_value = dupnode(Nnull_string);
@@@ -261,36 -213,11 +393,23 @@@
  
  #else
  
- /* do_ext --- dummy version if extensions not available */
- 
- NODE *
- do_ext(int nargs)
- {
-       const char *emsg = _("Operation Not Supported");
- 
-       unref(ERRNO_node->var_value);
-       ERRNO_node->var_value = make_string(emsg, strlen(emsg));
-       return make_number((AWKNUM) -1);
- }
- 
  /* load_ext --- dummy version if extensions not available */
  
- NODE *
- load_ext(const char *lib_name, const char *init_func, NODE *obj)
+ void
+ load_ext(const char *lib_name)
  {
        fatal(_("dynamic loading of library not supported"));
-       return NULL;
  }
  #endif
 +
 +/* close_extensions --- execute extension cleanup routines */
 +
 +void
 +close_extensions()
 +{
 +      SRCFILE *s;
 +
 +      for (s = srcfiles->next; s != srcfiles; s = s->next) 
 +              if (s->stype == SRC_EXTLIB && s->fini_func)
 +                              (*s->fini_func)();
 +}
diff --cc extension/ChangeLog
index 678e270,ca47bf6..4089185
--- a/extension/ChangeLog
+++ b/extension/ChangeLog
@@@ -1,18 -1,531 +1,546 @@@
 +2011-05-03         John Haque     <address@hidden>
 +
 +      * fileop.c, record.awk, testrecord.sh: New files.
 +      * steps: Updated.
 +
 +2011-05-02         John Haque     <address@hidden>
 +
 +      * bindarr.c, dbarray.awk, testdbarray.awk: New files.
 +      * steps: Updated.
 +
 +2011-04-24         John Haque     <address@hidden>
 +
 +      * spec_array.c, spec_array.h, sparr.c, testsparr.awk: New files.
 +      * steps: Updated.
 +
+ 2012-11-21         Arnold D. Robbins     <address@hidden>
+ 
+       * filefuncs.c (do_stat): Optional third argument indicates to
+       use stat(2) instead of lstat(2).
+       * filefuncs.3am: Document same.
+ 
+ 2012-11-19         Arnold D. Robbins     <address@hidden>
+ 
+       * readdir.c: Simplify code to always print file type and not
+       use stat().
+       * readdir.3am: Document same.
+ 
+ 2012-11-16         Arnold D. Robbins     <address@hidden>
+ 
+       * testext.c: In awk code, use printf(...) instead of the form
+       without parentheses everywhere. This makes Nelson happy.
+ 
+ 2012-11-14         Andrew J. Schorr     <address@hidden>
+ 
+       Bug fix for filesystems without d_type in directory entry.
+ 
+       * readdir.c (open_directory_t): Add more fields for path.
+       (ftype): Take open_directory_t argument. Build the full path
+       for lstat. Adjust calls.
+       (dir_close): Free the storage.
+       (dir_take_control_of): Allocate storage for the path.
+ 
+ 2012-11-06         Arnold D. Robbins     <address@hidden>
+ 
+       * configure.ac: Add check for $srcdir/.developing as in
+       the main directory's configure.ac.
+ 
+ 2012-11-04         Arnold D. Robbins     <address@hidden>
+ 
+       * rwarray.3am: Minor edits.
+ 
+ 2012-10-28         Arnold D. Robbins     <address@hidden>
+ 
+       * Makefile.am (dist_man_MANS): Update the list.
+ 
+ 2012-10-26         Arnold D. Robbins     <address@hidden>
+ 
+       * revtwoway.3am: Clean up example.
+       * revtwoway.c: Minor cleanup (add translation calls).
+ 
+ 2012-10-24         Arnold D. Robbins     <address@hidden>
+ 
+       * revtwoway.3am: New file.
+ 
+ 2012-10-21         Arnold D. Robbins     <address@hidden>
+ 
+       * filefuncs.c (do_stat): Always clear the array.
+ 
+ 2012-10-14         Arnold D. Robbins     <address@hidden>
+ 
+       * readdir.c, revoutput.c, revtwoway.c: Adjust for name change
+       of IOBUF_PUBLIC to awk_input_buf_t. Additional sanitizing in
+       revoutput.c to use `revoutput' everywhere instead of `revout'.
+       * revoutput.3am: New file.
+       * filefuncs.3am, fnmatch.3am, fork.3am, ordchr.3am, readdir.3am,
+       readfile.3am, rwarray.3am, time.3am: Add ref to revoutput(3am).
+ 
+ 2012-10-11         Arnold D. Robbins     <address@hidden>
+ 
+       * textext.c (try_modify_environ): Save array cookie in a separate
+       variable so it isn't clobbered. Thanks to Andrew Schorr, by way
+       of valgrind, for finding the bug.
+ 
+ 2012-09-14         Arnold D. Robbins     <address@hidden>
+ 
+       * testext.c (try_modify_environ): New function and test.
+       (var_test): Modified ARGC test, added additional.
+       (test_scalar_reserved): New function and test.
+       (try_modify_environ): Don't print count of ENVIRON elements.
+ 
+ 2012-09-13         Dave Pitts            <address@hidden>
+ 
+       * gawkfts.c: Add defines and ifdefs for z/OS.
+       * gawkfts.h: Add defines and ifdefs for z/OS. Fix // comments.
+       * readdir.c (dir_get_record): Adjust sprintf format for z/OS.
+       * rwarray.c: Add defines and ifdefs for z/OS. Fix // comments.
+ 
+ 2012-09-11         Arnold D. Robbins     <address@hidden>
+ 
+       * readdir.c (do_readdir_do_ftype): Set ERRNO for bad arguments.
+       * readdir.3a: Document same, minor fixes.
+ 
+ 2012-09-07         Akim Demaille         <address@hidden>
+ 
+       * extension/gawkfts.h (__THROW): Define if it is not.
+       Copied from getopt.h.
+       * extension/gawkfts.c (fts_alloc): Since FTSENT.fts_statp is
+       defined as a struct stat*, use that type for casts instead of
+       the undefined __fts_stat_t type.
+ 
+ 2012-09-07         Arnold D. Robbins     <address@hidden>
+ 
+       * readdir.c, readdir.3am: Change argument to readdir_do_ftype()
+       to be a string. Update the doc accordingly.
+       * gawkfts.h: Add explanatory comment before defines of API
+       names towards the end. Thanks to Eli Zaretskii for the suggestion.
+ 
+ 2012-08-28         Andrew J. Schorr     <address@hidden>
+ 
+       * readdir.c: Have three states, 0, 1, 2 for never, fallback, and
+       always.
+       * readdir.3am: Adjust appropriately.
+ 
+ 2012-08-29         Arnold D. Robbins     <address@hidden>
+ 
+       Make fts work everywhere by using our own source.
+ 
+       * README.fts, gawkfts.c, gawkfts.h, fts.3: New files.
+       * Makefile.am (filefuncs_la_SOURCES, EXTRA_DIST): Adjust.
+       * configure.ac: Remove check for fts.h and fts_XXX functions.
+       * filefuncs.c: Remove various ifdefs, change includes around.
+ 
+ 2012-08-28         Andrew J. Schorr     <address@hidden>
+ 
+       * Makefile.am: Rename man_MANS to dist_man_MANS to include the man
+       pages in the distribution tarball.
+ 
+ 2012-08-26         Arnold D. Robbins     <address@hidden>
+ 
+       * configure.ac (AC_SYS_LARGEFILE): Added. Needed for consistency
+       with gawk, to get the same size struct stat everywhere.
+       * filefuncs.c, fnmatch.c, fork.c, ordchr.c, readdir.c, readfile.c,
+       revoutput.c, revtwoway.c, rwarray.c, rwarray0.c, testext.c,
+       time.c: Move include of config.h to top (or add it!)
+ 
+ 2012-08-24         Arnold D. Robbins     <address@hidden>
+ 
+       * filefuncs.c, fnmatch.c, fork.c, ordchr.c, readdir.c, readfile.c,
+       revoutput.c, revtwoway.c, rwarray.c, rwarray0.c, testext.c,
+       time.c: Add ext_version string.
+ 
+ 2012-08-23         Arnold D. Robbins     <address@hidden>
+ 
+       * revoutwoway.c: New testing extension for two way processor.
+       * Makefile.am: Build revtwoway extension.
+       * readdir.c: Fix to fall back to stat if d_type is 'u' and
+       do_ftype is one.
+       * readdir.3am: Revise doc that some GNU/Linux filesystems
+       don't support d_type.
+ 
+ 2012-08-22         Arnold D. Robbins     <address@hidden>
+ 
+       * revoutput.c: New testing extension for output wrapper.
+       * Makefile.am: Build revoutput extension.
+ 
+ 2012-08-08         Arnold D. Robbins     <address@hidden>
+ 
+       Add fts() to filefuncs.
+ 
+       * filefuncs.3am: Update doc.
+       * filefuncs.c: Lots of new code.
+       * configure.ac: Add checks for appropriate headers and functions.
+       * stack.h, stack.c: New files.
+       * Makefile.am: Update list of files.
+ 
+       * readdir.c (dir_can_take_file): Use members in iobuf.
+       * rwarray.c (do_writea): Initialize fp to NULL.
+ 
+       * filefuncs.3am, fnmatch.3am, fork.3am, ordchr.3am, readdir.3am,
+       readfile.3am, rwarray.3am, time.3am: Updated.
+ 
+ 2012-08-03         Andrew J. Schorr     <address@hidden>
+ 
+       * readdir.c (dir_get_record): Fix for systems where ino_t is
+       64 bit even on 32 bit systems (cygwin).
+ 
+ 2012-08-01         Arnold D. Robbins     <address@hidden>
+ 
+       * Makefile.am (man_MANS): Add man page files so that they
+       get installed.
+       * rwarray.3am: New file.
+       * fnmatch.3am, fork.3am, time.3am: Revised.
+ 
+ 2012-07-31         Arnold D. Robbins     <address@hidden>
+ 
+       * rwarray0.c: Renamed from rwarray.c.
+       * rwarray.c: New file using stdio instead of system calls,
+       works on cygwin.
+ 
+ 2012-07-30         Arnold D. Robbins     <address@hidden>
+ 
+       * ABOUT-NLS: New file.
+       * Makefile.am, configure.ac: Revised for gettext.
+ 
+       * fork.3am, readdir.3am, time.3am: New files.
+       * filefuncs.3am, fnmatch.3am, ordchr.3am, readfile.3am: Revised.
+ 
+ 2012-07-29         Andrew J. Schorr     <address@hidden>
+ 
+       * readdir.c (dir_get_record): Adjust to new interface for RT.
+ 
+ 2012-07-29         Arnold D. Robbins     <address@hidden>
+ 
+       * readdir.c (dir_take_control_of): Print error message and
+       set ERRNO if failure. Adjust count of max digits.
+ 
+ 2012-07-27         Andrew J. Schorr     <address@hidden>
+ 
+       * Makefile.am (*_la_LIBADD): Need to link with $(LIBINTL) for
+       gettext to work on platforms where it is not included in libc.
+ 
+ 2012-07-27         Andrew J. Schorr     <address@hidden>
+ 
+       * readdir.c (dir_get_record): Need to set errno to 0 before calling
+       readdir, since readdir sets errno only on failure, not on EOF.
+ 
+ 2012-07-27         Andrew J. Schorr     <address@hidden>
+ 
+       * readdir.c (dir_get_record): If readdir fails, set errcode.  Otherwise,
+       don't bother to set errcode.
+ 
+ 2012-07-27         Arnold D. Robbins     <address@hidden>
+ 
+       * readdir.c (dir_take_control_of): Fix typo for case where
+       we don't have fopendir (e.g., Mac OS X 10.5).
+ 
+ 2012-07-26         Arnold D. Robbins     <address@hidden>
+ 
+       * configure.ac: Extremely crude hack to get the value of
+       ENABLE_NLS so that gettext will work in extensions.
+ 
+       * readdir.c (dir_get_record): Call set_RT.
+       (dir_can_take_file): Make parameter const.
+ 
+       * testext.c (valrep2str): Add AWK_VALUE_COOKIE.
+ 
+       * readdir.c: Add readdir_do_ftype function for systems without
+       dirent->d_type.  Clean up buffer handling.
+ 
+ 2012-07-26         Andrew J. Schorr     <address@hidden>
+ 
+       * readdir.c (dir_get_record): No need to set *errcode to 0.
+       (dir_take_control_of): Remove some paranoia -- no need to test for
+       NULL iobuf, and no need to check dir_can_take_file again.
+ 
+ 2012-07-25         Arnold D. Robbins     <address@hidden>
+ 
+       * readdir.c: New file.
+       * Makefile.am (readdir): New extension.
+ 
+       * time.c: Fix all calls to update_ERRNO_string.
+ 
+       * filefuncs.c, fnmatch.c, fork.c, ordchr.c, readfile.c, rwarray.c,
+       time.c: Translate strings.
+ 
+ 2012-07-20         Arnold D. Robbins     <address@hidden>
+ 
+       * filefuncs.3am, fnmatch.3am, ordchr.3am, readfile.3am:
+       new files.
+ 
+ 2012-07-16         Arnold D. Robbins     <address@hidden>
+ 
+       * fnmatch.c: Simplify flag table.
+ 
+ 2012-07-15         Arnold D. Robbins     <address@hidden>
+ 
+       * testext.c (test_scalar): New function and new tests.
+       (init_testext): Add a new variable.
+ 
+ 2012-07-13         Arnold D. Robbins     <address@hidden>
+ 
+       * filefuncs.c (fill_stat_array): New function to do the work
+       for stat.
+       (do_stat): Call it.
+ 
+ 2012-07-12         Arnold D. Robbins     <address@hidden>
+ 
+       * fnmatch.c: New file.
+       * Makefile.am: Build fnmatch extension.
+       * configure.ac: Look for fnmatch.h and fnmatch function.
+ 
+       * fnmatch.c (init_fnmatch): Use sym_constant for FNM_NOMATCH.
+       * testext.c (dl_load): Use sym_constant for answer_num.
+ 
+       * testext.c (init_testext): Move extra code to here.
+       (init_func): Change to point to init_testext.
+       (dl_load): Deleted.
+       (dl_load_func): Use the macro.
+ 
+ 2012-07-11         Arnold D. Robbins     <address@hidden>
+ 
+       * filefuncs.c (array_set, do_stat): Use make_const_string.
+       * fork.c (array_set_numeric): Ditto.
+       * ordchr.c (do_chr): Ditto.
+       * readfile.c (do_readfile): Use make_null_string, make_malloced_string.
+       * rwarray.c (read_elem): Ditto.
+       * testext.c (valrep2str): Add case for AWK_SCALAR.
+       (test_array_elem): Duplicate strings coming from gawk before passing
+       them back in.
+ 
+       All files: Add null 'init_func' file pointer for dl_load_func
+       to work.
+ 
+ 2012-07-09         Arnold D. Robbins     <address@hidden>
+ 
+       * filefuncs.c (do_readfile): Return "" and set ERRNO on error
+       instead of returning -1. Per suggestion from Andrew Schorr.
+ 
+ 2012-07-08         Arnold D. Robbins     <address@hidden>
+ 
+       * filefuncs.c (array_set): Adjust for change in set_array_element API.
+       * fork.c (array_set_numeric): Ditto.
+       * rwarray.c (read_array): Use set_array_element_by_elem.
+       (read_value): Add a cast to silence a compiler warning.
+       * testext.c (test_array_elem): Adjust for change in set_array_element
+       API.
+       (fill_in_array): Ditto. Change parameter name to new_array.
+ 
+ 2012-06-29         Arnold D. Robbins     <address@hidden>
+ 
+       * ordchr.c (do_ord, do_chr): Improve argument checking and
+       lint messages.
+ 
+ 2012-06-25         Arnold D. Robbins     <address@hidden>
+ 
+       * Makefile.am (EXTRA_DIST): Remove *.awk.
+       * rwarray.awk: Moved to test directory.
+ 
+ 2012-06-24         Arnold D. Robbins     <address@hidden>
+ 
+       * Makefile.am: Enable rwarray extension.
+       * rwarray.c: Redone to use new API.
+       * rwarray.awk: Revamped for new version.
+ 
+ 2012-06-21         Arnold D. Robbins     <address@hidden>
+ 
+       * testext.c (test_array_elem): Add a subarray.
+       (test_array_flatten): Removed: Tests done elsewhere.
+ 
+ 2012-06-20         Arnold D. Robbins     <address@hidden>
+ 
+       * testext.c (fill_in_array): New function.
+       (create_new_array): Most code moved into fill_in_array.
+       (test_array_param): New function.
+ 
+ 2012-06-19         Arnold D. Robbins     <address@hidden>
+ 
+       * testext.c (dump_array_and_delete): Renamed from dump_array.
+       Get second parameter which is index to delete. Update awk test.
+ 
+ 2012-06-18         Arnold D. Robbins     <address@hidden>
+ 
+       * filefuncs.c (do_chdir): Change element use to match change types.
+       * fork.c (array_set_numeric): Ditto.
+       * testext.c (valrep2str): New function.
+       (test_array_elem): Add AWK_UNDEFINED for `wanted'. Use valrep2str.
+       Adjust use of element index.
+       (dump_array): Renamed from `dump_procinfo' and implemented.
+       (func_table): Updated.
+ 
+ 2012-06-17         Arnold D. Robbins     <address@hidden>
+ 
+       * filefuncs.c (do_chdir, do_stat): Add assert(result != NULL).
+       * fork.c (do_fork, do_waitpid, do_wait): Ditto.
+       * ordchr.c (do_ord, do_chr): Ditto.
+       * readfile.c (do_readfile): Ditto.
+       * time.c (do_gettimeofday, do_sleep): Ditto.
+       * testext.c (All functions): Ditto. Clean up initial testing and use
+       make_number to make default return value up front.
+       (create_new_array, test_array_flatten): New functions.
+       (test_array_elem): Implemented.
+       (at_exit1): Don't printa actual pointer value: not portable.
+       (dl_load): Load up an array also.
+ 
+ 2012-06-14         Andrew J. Schorr     <address@hidden>
+ 
+       * time.c (RETURN): Remove obsolete define.
+       (do_sleep): Change update_ERRNO_str argument to request translation.
+ 
+ 2012-06-12         Arnold D. Robbins     <address@hidden>
+ 
+       Revise API:
+ 
+       * filefuncs.c (do_chdir): Replace get_curfunc_param with get_argument.
+       (format_mode): Use unsigned masks.
+       (do_stat): Replace get_curfunc_param with get_argument.
+       * fork.c (do_fork): Rearrange arg order in call to sym_lookup
+       (do_waitpid): Replace get_curfunc_param with get_argument.
+       * ordchr.c (do_ord, do_chr): Replace get_curfunc_param with 
get_argument.
+       * readfile.c (do_readfile): Replace get_curfunc_param with get_argument.
+       * time.c (do_sleep): Replace get_curfunc_param with get_argument.
+       Replace set_ERRNO with update_ERRNO_str for no way to sleep case.
+ 
+       Work on testext.c:
+ 
+       * Makefile.am: Add stuff to make testext. Remove doit and steps
+       from EXTRA_DIST.
+       * testext.c: Fill in many of the test routines. Still more to do.
+       Fix up test scripts for each routine.
+       * time.c (do_sleep): Fix use of get_argument to be boolean.
+ 
+ 2012-06-10         Andrew J. Schorr     <address@hidden>
+ 
+       * Makefile.am: Add time extension.
+       * configure.ac: To support time extension, check for some headers
+       and functions that are needed.
+       * time.c: New file implementing sleep and gettimeofday.
+ 
+ 2012-06-10         Andrew J. Schorr     <address@hidden>
+ 
+       * Makefile.am: Remove comment referring to deleted test extensions
+       arrayparm, dl (zaxxon) and testarg.
+ 
+ 2012-06-10         Andrew J. Schorr     <address@hidden>
+ 
+       * arrayparm.c, dl.c, doit, foo.awk, steps, testarg.awk, testarg.c,
+       testarrayparm.awk, testff.awk, testfork.awk, testordchr.awk: Remove
+       unused (obsolete) files.
+ 
+ 2012-06-06         Arnold D. Robbins     <address@hidden>
+ 
+       * filefuncs.c (do_stat): Make `type' const char *.
+ 
+       * testext.c: Functions renamed, some of them filled in. Corresponding
+       awk code for each test added inline.
+ 
+ 2012-05-30         Arnold D. Robbins     <address@hidden>
+ 
+       * testext.c: New file. Outline of tests for extension API.
+ 
+ 2012-05-29         Arnold D. Robbins     <address@hidden>
+ 
+       * filefuncs.c: Further cleanup and condensation of code into tables.
+       * fork.c, ordchr.c, readfile.c: Update copyright, general cleanup.
+ 
+ 2012-05-25         Arnold D. Robbins     <address@hidden>
+ 
+       * filefuncs.c (array_set_numeric): Don't return a value from
+       a void function.
+ 
+ 2012-05-24         Andrew J. Schorr     <address@hidden>
+ 
+       * Makefile.am (AM_CPPFLAGS): Use $(srcdir) to work properly when
+       built outside the source directory.
+       * configure.ac (INSTALL): Set location manually since autoconf was
+       not specifying the proper path for install-sh.
+       * filefuncs2.c, ordchr2.c, readfile2.c: Deleted.
+       * filefuncs.c: Install filefuncs2.c and patch for recent API changes.
+       * ordchr.c: Install ordchr2.c and patch for recent API changes.
+       * readfile.c: Install readfile2.c and patch for recent API changes.
+       * fork.c: Port to new API.
+ 
+ 2012-05-21         Andrew J. Schorr     <address@hidden>
+ 
+       * configure.ac: New file to run configure with libtool support
+       in this subdirectory.
+       * Makefile.am: Some changes related to running automake in this
+       directory.
+       * AUTHORS, COPYING, INSTALL, NEWS, README: Added files to make automake
+       happy.
+       * aclocal.m4, configure, configh.in: Added autoconf files.
+       * build-aux, m4: New subdirectories for autoconf stuff.
+ 
+ 2012-05-15         Arnold D. Robbins     <address@hidden>
+ 
+       * filefuncs2.c: New file implementing chdir and stat using the
+       new interface.
+ 
+       Everything else is temporarily broken.
+ 
+ 2012-05-13         Andrew J. Schorr     <address@hidden>
+ 
+       * filefuncs.c (array_set): Add a comment discussing the use of unref
+       on the value returned by assoc_lookup.
+ 
+ 2012-05-13         Andrew J. Schorr     <address@hidden>
+ 
+       * xreadlink.[ch]: Remove unused files.
+ 
+ 2012-05-11         Arnold D. Robbins     <address@hidden>
+ 
+       Sweeping change: Use `bool', `true', and `false' everywhere.
+ 
+ 2012-04-11         Andrew J. Schorr     <address@hidden>
+ 
+       * filefuncs.c (array_set): New function to set an array element.
+       (do_set): Use new array_set function to reduce code duplication and
+       to make sure the memory management is handled properly.
+ 
+ 2012-04-07         Andrew J. Schorr     <address@hidden>
+ 
+       * filefuncs.c: Remove unnecessary #include <sys/sysmacros.h>.
+       (read_symlink): New function to read symbolic links more robustly.
+       (do_stat): Use read_symlink instead of readlink.
+       * fork.c (do_wait): new function.
+       (dlload): Call make_builtin to add "wait" function.
+ 
+ 2012-04-02         Andrew J. Schorr     <address@hidden>
+ 
+       * fork.c (do_fork): Test whether PROCINFO_node exists before updating
+       the pid values.  And do so properly using make_number.
+       * readfile.c (do_readfile): Function should be static.
+ 
+ 2012-04-01         Andrew J. Schorr     <address@hidden>
+ 
+       * filefuncs.c (do_chdir, do_stat): Replace update_ERRNO() with
+       update_ERRNO_int(errno).
+       * fork.c (do_fork, do_waitpid): Ditto.
+       * readfile.c (do_readfile): Ditto.
+       * rwarray.c (do_writea, do_reada): Ditto.
+ 
+ 2012-03-25         Andrew J. Schorr     <address@hidden>
+ 
+       * Makefile.am: Major cleanup.  Use libtool options -module and
+       -avoid-version to create the modules properly without my local hack
+       to override the default behavior.
+ 
+ 2012-03-25         Andrew J. Schorr     <address@hidden>
+ 
+       * .gitignore: New file to ignore files created by libtool (including
+       binaries and associated metadata).
+ 
+ 2012-03-21         Andrew J. Schorr     <address@hidden>
+ 
+       * Makefile.am (INCLUDES): Remove -I$(top_srcdir)/intl.
+ 
+ 2012-03-20         Andrew J. Schorr     <address@hidden>
+ 
+       * Makefile.am: New file to build and install shared libraries.
+       * arrayparm.c (do_mkarray): Get it to compile by removing 2nd arg
+       to assoc_clear.
+       * filefuncs.c (do_stat): Ditto.
+ 
  2011-08-31         John Haque     <address@hidden>
  
        * arrayparm.c, filefuncs.c, fork.c, ordchr.c, readfile.c,
diff --cc extension/steps
index 9e0cc00,0000000..168ec39
mode 100755,000000..100755
--- a/extension/steps
+++ b/extension/steps
@@@ -1,30 -1,0 +1,15 @@@
 +# what to do under linux to make dl.so
 +# Tue Nov 24 15:04:14 EST 1998
 +# Sun Aug 26 16:03:58 IDT 2001
 +# Sun Apr 28 15:59:57 IDT 2002
 +# Mon Jun 21 17:03:37 IDT 2004
 +# Fri May 15 15:48:45 IDT 2009
++# Sun Nov 25 21:40:49 IST 2012
 +
- gcc -fPIC -shared -Wall -DHAVE_CONFIG_H -c -O -g -I.. dl.c
- gcc -fPIC -shared -Wall -DHAVE_CONFIG_H -c -O -g -I.. filefuncs.c
- gcc -fPIC -shared -Wall -DHAVE_CONFIG_H -c -O -g -I.. fork.c
- gcc -fPIC -shared -Wall -DHAVE_CONFIG_H -c -O -g -I.. ordchr.c
- gcc -fPIC -shared -Wall -DHAVE_CONFIG_H -c -O -g -I.. arrayparm.c
- gcc -fPIC -shared -Wall -DHAVE_CONFIG_H -c -O -g -I.. readfile.c
- gcc -fPIC -shared -Wall -DHAVE_CONFIG_H -c -O -g -I.. testarg.c
- gcc -fPIC -shared -Wall -DHAVE_CONFIG_H -c -O -g -I.. rwarray.c
 +gcc -fPIC -shared -Wall -DHAVE_CONFIG_H -c -O -g -I.. spec_array.c
 +gcc -fPIC -shared -Wall -DHAVE_CONFIG_H -c -O -g -I.. sparr.c
 +gcc -fPIC -shared -Wall -DHAVE_CONFIG_H -c -O -g -I.. bindarr.c
 +gcc -fPIC -shared -Wall -DHAVE_CONFIG_H -c -O -g -I.. fileop.c
- ld -o dl.so -shared dl.o
- ld -o filefuncs.so -shared filefuncs.o
- ld -o fork.so -shared fork.o
- ld -o ordchr.so -shared ordchr.o
- ld -o arrayparm.so -shared arrayparm.o
- ld -o readfile.so -shared readfile.o
- ld -o testarg.so -shared testarg.o
- ld -o rwarray.so -shared rwarray.o
 +ld -o sparr.so -shared sparr.o spec_array.o
 +ld -o bindarr.so -shared bindarr.o
 +ld -o fileop.so -shared fileop.o
diff --cc gawkapi.c
index 0000000,ba3fc50..474135f
mode 000000,100644..100644
--- a/gawkapi.c
+++ b/gawkapi.c
@@@ -1,0 -1,1173 +1,1173 @@@
+ /*
+  * gawkapi.c -- Implement the functions defined for gawkapi.h
+  */
+ 
+ /* 
+  * 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
+  */
+ 
+ #include "awk.h"
+ 
+ static awk_bool_t node_to_awk_value(NODE *node, awk_value_t *result, 
awk_valtype_t wanted);
+ static void set_constant();
+ 
+ /*
+  * api_get_argument --- get the count'th paramater, zero-based.
+  *
+  * Returns false if count is out of range, or if actual paramater
+  * does not match what is specified in wanted. In the latter
+  * case, fills in result->val_type with the actual type.
+  */
+ 
+ static awk_bool_t
+ api_get_argument(awk_ext_id_t id, size_t count,
+                       awk_valtype_t wanted, awk_value_t *result)
+ {
+ #ifdef DYNAMIC
+       NODE *arg;
+ 
+       if (result == NULL)
+               return false;
+ 
+       (void) id;
+ 
+       /* set up default result */
+       memset(result, 0, sizeof(*result));
+       result->val_type = AWK_UNDEFINED;
+ 
+       /*
+        * Song and dance here.  get_array_argument() and get_scalar_argument()
+        * will force a change in type of a parameter that is Node_var_new.
+        *
+        * Start by looking at the unadulterated argument as it was passed.
+        */
+       arg = get_argument(count);
+       if (arg == NULL)
+               return false;
+ 
+       /* if type is undefined */
+       if (arg->type == Node_var_new) {
+               if (wanted == AWK_UNDEFINED)
+                       return true;
+               else if (wanted == AWK_ARRAY) {
+                       goto array;
+               } else {
+                       goto scalar;
+               }
+       }
+       
+       /* at this point, we have real type */
+       if (arg->type == Node_var_array || arg->type == Node_array_ref) {
+               if (wanted != AWK_ARRAY && wanted != AWK_UNDEFINED)
+                       return false;
+               goto array;
+       } else
+               goto scalar;
+ 
+ array:
+       /* get the array here */
+       arg = get_array_argument(count, false);
+       if (arg == NULL)
+               return false;
+ 
+       return node_to_awk_value(arg, result, wanted);
+ 
+ scalar:
+       /* at this point we have a real type that is not an array */
+       arg = get_scalar_argument(count, false);
+       if (arg == NULL)
+               return false;
+ 
+       return node_to_awk_value(arg, result, wanted);
+ #else
+       return false;
+ #endif
+ }
+ 
+ /* api_set_argument --- convert an argument to an array */
+ 
+ static awk_bool_t
+ api_set_argument(awk_ext_id_t id,
+               size_t count,
+               awk_array_t new_array)
+ {
+ #ifdef DYNAMIC
+       NODE *arg;
+       NODE *array = (NODE *) new_array;
+ 
+       (void) id;
+ 
+       if (array == NULL || array->type != Node_var_array)
+               return false;
+ 
+       if (   (arg = get_argument(count)) == NULL
+           || arg->type != Node_var_new)
+               return false;
+ 
+       arg = get_array_argument(count, false);
+       if (arg == NULL)
+               return false;
+ 
+       array->vname = arg->vname;
+       *arg = *array;
+       freenode(array);
+ 
+       return true;
+ #else
+       return false;
+ #endif
+ }
+ 
+ /* awk_value_to_node --- convert a value into a NODE */
+ 
+ NODE *
+ awk_value_to_node(const awk_value_t *retval)
+ {
+       NODE *ext_ret_val;
+       NODE *v;
+ 
+       if (retval == NULL)
+               fatal(_("awk_value_to_node: received null retval"));
+ 
+       switch (retval->val_type) {
+       case AWK_ARRAY:
+               ext_ret_val = (NODE *) retval->array_cookie;
+               break;
+       case AWK_UNDEFINED:
+               ext_ret_val = dupnode(Nnull_string);
+               break;
+       case AWK_NUMBER:
+               ext_ret_val = make_number(retval->num_value);
+               break;
+       case AWK_STRING:
+               ext_ret_val = make_str_node(retval->str_value.str,
+                               retval->str_value.len, ALREADY_MALLOCED);
+               break;
+       case AWK_SCALAR:
+               v = (NODE *) retval->scalar_cookie;
+               if (v->type != Node_var)
+                       ext_ret_val = NULL;
+               else
+                       ext_ret_val = dupnode(v->var_value);
+               break;
+       case AWK_VALUE_COOKIE:
+               ext_ret_val = dupnode((NODE *)(retval->value_cookie));
+               break;
+       default:        /* any invalid type */
+               ext_ret_val = NULL;
+               break;
+       }
+ 
+       return ext_ret_val;
+ }
+ 
+ /* Functions to print messages */
+ 
+ /* api_fatal --- print a fatal message and exit */
+ 
+ static void
+ api_fatal(awk_ext_id_t id, const char *format, ...)
+ {
+       va_list args;
+ 
+       (void) id;
+ 
+       va_start(args, format);
+       err(true, _("fatal: "), format, args);
+       va_end(args);
+ }
+ 
+ /* api_warning --- print a warning message and exit */
+ 
+ static void
+ api_warning(awk_ext_id_t id, const char *format, ...)
+ {
+       va_list args;
+ 
+       (void) id;
+ 
+       va_start(args, format);
+       err(false, _("warning: "), format, args);
+       va_end(args);
+ }
+ 
+ /* api_lintwarn --- print a lint warning message and exit if appropriate */
+ 
+ static void
+ api_lintwarn(awk_ext_id_t id, const char *format, ...)
+ {
+       va_list args;
+ 
+       (void) id;
+ 
+       va_start(args, format);
+       if (lintwarn == r_fatal) {
+               err(true, _("fatal: "), format, args);
+               va_end(args);
+       } else {
+               err(false, _("warning: "), format, args);
+               va_end(args);
+       }
+ }
+ 
+ /* api_register_input_parser --- register an input_parser; for opening files 
read-only */
+ 
+ static void
+ api_register_input_parser(awk_ext_id_t id, awk_input_parser_t *input_parser)
+ {
+       (void) id;
+ 
+       if (input_parser == NULL)
+               return;
+ 
+       register_input_parser(input_parser);
+ }
+ 
+ /* api_register_output_wrapper --- egister an output wrapper, for writing 
files / two-way pipes */
+ 
+ static void api_register_output_wrapper(awk_ext_id_t id,
+               awk_output_wrapper_t *output_wrapper)
+ {
+       (void) id;
+ 
+       if (output_wrapper == NULL)
+               return;
+ 
+       register_output_wrapper(output_wrapper);
+ }
+ 
+ /* api_register_two_way_processor --- register a processor for two way I/O */
+ 
+ static void
+ api_register_two_way_processor(awk_ext_id_t id,
+               awk_two_way_processor_t *two_way_processor)
+ {
+       (void) id;
+ 
+       if (two_way_processor == NULL)
+               return;
+ 
+       register_two_way_processor(two_way_processor);
+ }
+ 
+ /* Functions to update ERRNO */
+ 
+ /* api_update_ERRNO_int --- update ERRNO with an integer value */
+ 
+ static void
+ api_update_ERRNO_int(awk_ext_id_t id, int errno_val)
+ {
+       (void) id;
+ 
+       update_ERRNO_int(errno_val);
+ }
+ 
+ /* api_update_ERRNO_string --- update ERRNO with a string value */
+ 
+ static void
+ api_update_ERRNO_string(awk_ext_id_t id,
+                       const char *string)
+ {
+       (void) id;
+ 
+       if (string == NULL)
+               return;
+ 
+       update_ERRNO_string(string);
+ }
+ 
+ /* api_unset_ERRNO --- unset ERRNO */
+ 
+ static void
+ api_unset_ERRNO(awk_ext_id_t id)
+ {
+       (void) id;
+ 
+       unset_ERRNO();
+ }
+ 
+ 
+ /* api_add_ext_func --- add a function to the interpreter, returns true upon 
success */
+ 
+ static awk_bool_t
+ api_add_ext_func(awk_ext_id_t id,
+               const char *namespace,
+               const awk_ext_func_t *func)
+ {
+       (void) id;
+       (void) namespace;
+ 
+       if (func == NULL)
+               return false;
+ 
+ #ifdef DYNAMIC
+       return make_builtin(func);
+ #else
+       return false;
+ #endif
+ }
+ 
+ /* Stuff for exit handler - do it as linked list */
+ 
+ struct ext_exit_handler {
+       struct ext_exit_handler *next;
+       void (*funcp)(void *data, int exit_status);
+       void *arg0;
+ };
+ static struct ext_exit_handler *list_head = NULL;
+ 
+ /* run_ext_exit_handlers --- run the extension exit handlers, LIFO order */
+ 
+ void
+ run_ext_exit_handlers(int exitval)
+ {
+       struct ext_exit_handler *p, *next;
+ 
+       for (p = list_head; p != NULL; p = next) {
+               next = p->next;
+               p->funcp(p->arg0, exitval);
+               free(p);
+       }
+       list_head = NULL;
+ }
+ 
+ /* api_awk_atexit --- add an exit call back */
+ 
+ static void
+ api_awk_atexit(awk_ext_id_t id,
+               void (*funcp)(void *data, int exit_status),
+               void *arg0)
+ {
+       struct ext_exit_handler *p;
+ 
+       (void) id;
+ 
+       if (funcp == NULL)
+               return;
+ 
+       /* allocate memory */
+       emalloc(p, struct ext_exit_handler *, sizeof(struct ext_exit_handler), 
"api_awk_atexit");
+ 
+       /* fill it in */
+       p->funcp = funcp;
+       p->arg0 = arg0;
+ 
+       /* add to linked list, LIFO order */
+       p->next = list_head;
+       list_head = p;
+ }
+ 
+ /* node_to_awk_value --- convert a node into a value for an extension */
+ 
+ static awk_bool_t
+ node_to_awk_value(NODE *node, awk_value_t *val, awk_valtype_t wanted)
+ {
+       awk_bool_t ret = false;
+ 
+       if (node == NULL)
+               fatal(_("node_to_awk_value: received null node"));
+ 
+       if (val == NULL)
+               fatal(_("node_to_awk_value: received null val"));
+ 
+       switch (node->type) {
+       case Node_var_new:      /* undefined variable */
+               val->val_type = AWK_UNDEFINED;
+               if (wanted == AWK_UNDEFINED) {
+                       ret = true;
+               }
+               break;
+ 
+       case Node_var:
+               /* a scalar value */
+               if (wanted == AWK_SCALAR) {
+                       val->val_type = AWK_SCALAR;
+                       val->scalar_cookie = (void *) node;
+                       ret = true;
+                       break;
+               }
+ 
+               node = node->var_value;
+               /* FALL THROUGH */
+       case Node_val:
+               /* a scalar value */
+               switch (wanted) {
+               case AWK_NUMBER:
+                       val->val_type = AWK_NUMBER;
+ 
+                       (void) force_number(node);
+                       if (node->flags & NUMCUR) {
+                               val->num_value = get_number_d(node);
+                               ret = true;
+                       }
+                       break;
+ 
+               case AWK_STRING:
+                       val->val_type = AWK_STRING;
+ 
+                       (void) force_string(node);
+                       if (node->flags & STRCUR) {
+                               val->str_value.str = node->stptr;
+                               val->str_value.len = node->stlen;
+                               ret = true;
+                       }
+                       break;
+ 
+               case AWK_SCALAR:
+                       if (node->flags & NUMBER) {
+                               val->val_type = AWK_NUMBER;
+                       } else if (node->flags & STRING) {
+                               val->val_type = AWK_STRING;
+                       } else
+                               val->val_type = AWK_UNDEFINED;
+                       ret = false;
+                       break;
+ 
+               case AWK_UNDEFINED:
+                       /* return true and actual type for request of undefined 
*/
+                       if (node->flags & NUMBER) {
+                               val->val_type = AWK_NUMBER;
+                               val->num_value = get_number_d(node);
+                               ret = true;
+                       } else if (node->flags & STRING) {
+                               val->val_type = AWK_STRING;
+                               val->str_value.str = node->stptr;
+                               val->str_value.len = node->stlen;
+                               ret = true;
+                       } else
+                               val->val_type = AWK_UNDEFINED;
+                       break;
+ 
+               case AWK_ARRAY:
+               case AWK_VALUE_COOKIE:
+                       break;
+               }
+               break;
+ 
+       case Node_var_array:
+               val->val_type = AWK_ARRAY;
+               if (wanted == AWK_ARRAY || wanted == AWK_UNDEFINED) {
+                       val->array_cookie = node;
+                       ret = true;
+               } else {
+                       ret = false;
+               }
+               break;
+ 
+       default:
+               val->val_type = AWK_UNDEFINED;
+               ret = false;
+               break;
+       }
+ 
+       return ret;
+ }
+ 
+ /*
+  * Symbol table access:
+  *    - No access to special variables (NF, etc.)
+  *    - One special exception: PROCINFO.
+  *    - Use sym_update() to change a value, including from UNDEFINED
+  *      to scalar or array. 
+  */
+ /*
+  * Lookup a variable, fills in value. No messing with the value
+  * returned. Returns false if the variable doesn't exist
+  * or the wrong type was requested.
+  * In the latter case, fills in vaule->val_type with the real type.
+  * Built-in variables (except PROCINFO) may not be accessed by an extension.
+  */
+ 
+ /* api_sym_lookup --- look up a symbol */
+ 
+ static awk_bool_t
+ api_sym_lookup(awk_ext_id_t id,
+               const char *name,
+               awk_valtype_t wanted,
+               awk_value_t *result)
+ {
+       NODE *node;
+ 
+       if (   name == NULL
+           || *name == '\0'
+           || result == NULL
+           || (node = lookup(name)) == NULL)
+               return false;
+ 
+       if (is_off_limits_var(name))    /* a built-in variable */
+               node->flags |= NO_EXT_SET;
+ 
+       return node_to_awk_value(node, result, wanted);
+ }
+ 
+ /* api_sym_lookup_scalar --- retrieve the current value of a scalar */
+ 
+ static awk_bool_t
+ api_sym_lookup_scalar(awk_ext_id_t id,
+                       awk_scalar_t cookie,
+                       awk_valtype_t wanted,
+                       awk_value_t *result)
+ {
+       NODE *node = (NODE *) cookie;
+ 
+       if (node == NULL
+           || result == NULL
+           || node->type != Node_var)
+               return false;
+ 
+       return node_to_awk_value(node, result, wanted);
+ }
+ 
+ /* api_sym_update_real --- update a symbol's value, see gawkapi.h for 
semantics */
+ 
+ static awk_bool_t
+ sym_update_real(awk_ext_id_t id,
+               const char *name,
+               awk_value_t *value,
+               bool is_const)
+ {
+       NODE *node;
+       NODE *array_node;
+ 
+       if (   name == NULL
+           || *name == '\0'
+           || value == NULL)
+               return false;
+ 
+       switch (value->val_type) {
+       case AWK_NUMBER:
+       case AWK_STRING:
+       case AWK_UNDEFINED:
+       case AWK_ARRAY:
+       case AWK_SCALAR:
+       case AWK_VALUE_COOKIE:
+               break;
+ 
+       default:
+               /* fatal(_("api_sym_update: invalid value for type of new value 
(%d)"), value->val_type); */
+               return false;
+       }
+ 
+       node = lookup(name);
+ 
+       if (node == NULL) {
+               /* new value to be installed */
+               if (value->val_type == AWK_ARRAY) {
+                       array_node = awk_value_to_node(value);
+                       node = install_symbol(estrdup((char *) name, 
strlen(name)),
+                                       Node_var_array);
+                       array_node->vname = node->vname;
+                       *node = *array_node;
+                       freenode(array_node);
+                       value->array_cookie = node;     /* pass new cookie back 
to extension */
+               } else {
+                       /* regular variable */
+                       node = install_symbol(estrdup((char *) name, 
strlen(name)),
+                                       Node_var);
+                       node->var_value = awk_value_to_node(value);
+                       if (is_const)
+                               node->var_assign = set_constant;
+               }
+ 
+               return true;
+       }
+ 
+       /*
+        * If we get here, then it exists already.  Any valid type is
+        * OK except for AWK_ARRAY.
+        */
+       if (   (node->flags & NO_EXT_SET) != 0
+           || is_off_limits_var(name)) {       /* most built-in vars not 
allowed */
+               node->flags |= NO_EXT_SET;
+               return false;
+       }
+ 
+       if (    value->val_type != AWK_ARRAY
+           && (node->type == Node_var || node->type == Node_var_new)) {
+               unref(node->var_value);
+               node->var_value = awk_value_to_node(value);
+               /* let the extension change its own variable */
+               if (is_const)
+                       node->var_assign = set_constant;
+ 
+               return true;
+       }
+ 
+       return false;
+ }
+ 
+ /* api_sym_update --- update a symbol, non-constant */
+ 
+ static awk_bool_t
+ api_sym_update(awk_ext_id_t id,
+               const char *name,
+               awk_value_t *value)
+ {
+       return sym_update_real(id, name, value, false);
+ }
+ 
+ /* api_sym_update --- update a symbol, constant */
+ 
+ static awk_bool_t
+ api_sym_constant(awk_ext_id_t id,
+               const char *name,
+               awk_value_t *value)
+ {
+       return sym_update_real(id, name, value, true);
+ }
+ 
+ /* api_sym_update_scalar --- update a scalar cookie */
+ 
+ static awk_bool_t
+ api_sym_update_scalar(awk_ext_id_t id,
+                       awk_scalar_t cookie,
+                       awk_value_t *value)
+ {
+       NODE *node = (NODE *) cookie;
+ 
+       if (value == NULL
+           || node == NULL
+           || node->type != Node_var
+           || (node->flags & NO_EXT_SET) != 0)
+               return false;
+ 
+       /*
+        * Optimization: if valref is 1, and the new value is a string or
+        * a number, we can avoid calling unref and then making a new node
+        * by simply installing the new value.  First, we follow the same
+        * recipe used by node.c:r_unref to wipe the current values, and then
+        * we copy the logic from r_make_number or make_str_node to install
+        * the new value.
+        */
+       switch (value->val_type) {
+       case AWK_NUMBER:
+               if (node->var_value->valref == 1 && ! do_mpfr) {
+                       NODE *r = node->var_value;
+ 
+                       /* r_unref: */
+                       if ((r->flags & (MALLOC|STRCUR)) == (MALLOC|STRCUR))
+                               efree(r->stptr);
+                       free_wstr(r);
+ 
+                       /* r_make_number: */
+                       r->numbr = value->num_value;
+                       r->flags = MALLOC|NUMBER|NUMCUR;
+                       r->stptr = NULL;
+                       r->stlen = 0;
+                       return true;
+               }
+               break;
+       case AWK_STRING:
+               if (node->var_value->valref == 1) {
+                       NODE *r = node->var_value;
+ 
+                       /* r_unref: */
+                       if ((r->flags & (MALLOC|STRCUR)) == (MALLOC|STRCUR))
+                               efree(r->stptr);
+ 
+                       mpfr_unset(r);
+                       free_wstr(r);
+ 
+                       /* make_str_node(s, l, ALREADY_MALLOCED): */
+                       r->numbr = 0;
+                       r->flags = (MALLOC|STRING|STRCUR);
+                       r->stfmt = -1;
+                       r->stptr = value->str_value.str;
+                       r->stlen = value->str_value.len;
+                       return true;
+               }
+               break;
+       case AWK_UNDEFINED:
+       case AWK_SCALAR:
+       case AWK_VALUE_COOKIE:
+               break;
+ 
+       default:        /* AWK_ARRAY or invalid type */
+               return false;
+       }
+ 
+       /* do it the hard (slow) way */
+       unref(node->var_value);
+       node->var_value = awk_value_to_node(value);
+       return true;
+ }
+ 
+ /*
+  * valid_subscript_type --- test if a type is allowed for an array subscript.
+  *
+  * Any scalar value is fine, so only AWK_ARRAY (or an invalid type) is 
illegal.
+  */
+ 
+ static inline int
+ valid_subscript_type(awk_valtype_t valtype)
+ {
+       switch (valtype) {
+       case AWK_UNDEFINED:
+       case AWK_NUMBER:
+       case AWK_STRING:
+       case AWK_SCALAR:
+       case AWK_VALUE_COOKIE:
+               return true;
+       default:        /* AWK_ARRAY or an invalid type */
+               return false;
+       }
+ }
+ 
+ /* Array management */
+ /*
+  * api_get_array_element --- teturn the value of an element - read only!
+  *
+  * Use set_array_element to change it.
+  */
+ 
+ static awk_bool_t
+ api_get_array_element(awk_ext_id_t id,
+               awk_array_t a_cookie,
+               const awk_value_t *const index,
+               awk_valtype_t wanted,
+               awk_value_t *result)
+ {
+       NODE *array = (NODE *) a_cookie;
+       NODE *subscript;
+       NODE **aptr;
+ 
+       /* don't check for index len zero, null str is ok as index */
+       if (   array == NULL
+           || array->type != Node_var_array
+           || result == NULL
+           || index == NULL
+           || ! valid_subscript_type(index->val_type))
+               return false;
+ 
+       subscript = awk_value_to_node(index);
+ 
+       /* if it doesn't exist, return false */
+       if (in_array(array, subscript) == NULL) {
+               unref(subscript);
+               return false;
+       }
+ 
+       aptr = assoc_lookup(array, subscript);
+ 
+       if (aptr == NULL) {     /* can't happen */
+               unref(subscript);
+               return false;
+       }
+ 
+       unref(subscript);
+ 
+       return node_to_awk_value(*aptr, result, wanted);
+ }
+ 
+ /*
+  * api_set_array_element --- change (or create) element in existing array
+  *    with element->index and element->value.
+  */
+ 
+ static awk_bool_t
+ api_set_array_element(awk_ext_id_t id, awk_array_t a_cookie,
+                                       const awk_value_t *const index,
+                                       const awk_value_t *const value)
+ {
+       NODE *array = (NODE *)a_cookie;
+       NODE *tmp;
+       NODE *elem;
+       NODE **aptr;
+ 
+       /* don't check for index len zero, null str is ok as index */
+       if (   array == NULL
+           || array->type != Node_var_array
+           || (array->flags & NO_EXT_SET) != 0
+           || index == NULL
+           || value == NULL
+           || ! valid_subscript_type(index->val_type))
+               return false;
+ 
+       tmp = awk_value_to_node(index);
+       aptr = assoc_lookup(array, tmp);
+       unref(tmp);
+       unref(*aptr);
+       elem = *aptr = awk_value_to_node(value);
+       if (elem->type == Node_var_array) {
+               elem->parent_array = array;
+               elem->vname = estrdup(index->str_value.str,
+                                       index->str_value.len);
+               make_aname(elem);
+       }
+ 
+       return true;
+ }
+ 
+ /*
+  * remove_element --- remove an array element 
+  *            common code used by multiple functions
+  */
+ 
+ static void
+ remove_element(NODE *array, NODE *subscript)
+ {
+       NODE *val;
+ 
+       if (array == NULL)
+               fatal(_("remove_element: received null array"));
+ 
+       if (subscript == NULL)
+               fatal(_("remove_element: received null subscript"));
+ 
+       val = in_array(array, subscript);
+ 
+       if (val == NULL)
+               return;
+ 
+       if (val->type == Node_var_array) {
+               assoc_clear(val);
+               /* cleared a sub-array, free Node_var_array */
+               efree(val->vname);
+               freenode(val);
+       } else
+               unref(val);
+ 
+       (void) assoc_remove(array, subscript);
+ }
+ 
+ /*
+  * api_del_array_element --- remove the element with the given index.
+  *    Return success if removed or if element did not exist.
+  */
+ 
+ static awk_bool_t
+ api_del_array_element(awk_ext_id_t id,
+               awk_array_t a_cookie, const awk_value_t* const index)
+ {
+       NODE *array, *sub;
+ 
+       array = (NODE *) a_cookie;
+       if (   array == NULL
+           || array->type != Node_var_array
+           || (array->flags & NO_EXT_SET) != 0
+           || index == NULL
+           || ! valid_subscript_type(index->val_type))
+               return false;
+ 
+       sub = awk_value_to_node(index);
+       remove_element(array, sub);
+       unref(sub);
+ 
+       return true;
+ }
+ 
+ /*
+  * api_get_element_count --- retrieve total number of elements in array.
+  *    Return false if some kind of error.
+  */
+ 
+ static awk_bool_t
+ api_get_element_count(awk_ext_id_t id,
+               awk_array_t a_cookie, size_t *count)
+ {
+       NODE *node = (NODE *) a_cookie;
+ 
+       if (count == NULL || node == NULL || node->type != Node_var_array)
+               return false;
+ 
+       *count = node->table_size;
+       return true;
+ }
+ 
+ /* api_create_array --- create a new array cookie to which elements may be 
added */
+ 
+ static awk_array_t
+ api_create_array(awk_ext_id_t id)
+ {
+       NODE *n;
+ 
+       getnode(n);
+       memset(n, 0, sizeof(NODE));
 -      init_array(n);
++      null_array(n);
+ 
+       return (awk_array_t) n;
+ }
+ 
+ /* api_clear_array --- clear out an array */
+ 
+ static awk_bool_t
+ api_clear_array(awk_ext_id_t id, awk_array_t a_cookie)
+ {
+       NODE *node = (NODE *) a_cookie;
+ 
+       if (   node == NULL
+           || node->type != Node_var_array
+           || (node->flags & NO_EXT_SET) != 0)
+               return false;
+ 
+       assoc_clear(node);
+       return true;
+ }
+ 
+ /* api_flatten_array --- flatten out an array so that it can be looped over 
easily. */
+ 
+ static awk_bool_t
+ api_flatten_array(awk_ext_id_t id,
+               awk_array_t a_cookie,
+               awk_flat_array_t **data)
+ {
+       NODE **list;
+       size_t i, j;
+       NODE *array = (NODE *) a_cookie;
+       size_t alloc_size;
+ 
+       if (   array == NULL
+           || array->type != Node_var_array
+           || array->table_size == 0
+           || data == NULL)
+               return false;
+ 
+       alloc_size = sizeof(awk_flat_array_t) +
+                       (array->table_size - 1) * sizeof(awk_element_t);
+ 
+       emalloc(*data, awk_flat_array_t *, alloc_size,
+                       "api_flatten_array");
+       memset(*data, 0, alloc_size);
+ 
+       list = assoc_list(array, "@unsorted", ASORTI);
+ 
+       (*data)->opaque1 = array;
+       (*data)->opaque2 = list;
+       (*data)->count = array->table_size;
+ 
+       for (i = j = 0; i < 2 * array->table_size; i += 2, j++) {
+               NODE *index, *value;
+ 
+               index = force_string(list[i]);
+               value = list[i + 1]; /* number or string or subarray */
+ 
+               /* convert index and value to ext types */
+               if (! node_to_awk_value(index,
+                               & (*data)->elements[j].index, AWK_UNDEFINED)) {
+                       fatal(_("api_flatten_array: could not convert index 
%d\n"),
+                                               (int) i);
+               }
+               if (! node_to_awk_value(value,
+                               & (*data)->elements[j].value, AWK_UNDEFINED)) {
+                       fatal(_("api_flatten_array: could not convert value 
%d\n"),
+                                               (int) i);
+               }
+       }
+       return true;
+ }
+ 
+ /*
+  * api_release_flattened_array --- release array memory,
+  *    delete any marked elements. Count must match what
+  *    gawk thinks the size is.
+  */
+ 
+ static awk_bool_t
+ api_release_flattened_array(awk_ext_id_t id,
+               awk_array_t a_cookie,
+               awk_flat_array_t *data)
+ {
+       NODE *array = a_cookie;
+       NODE **list;
+       size_t i, j, k;
+ 
+       if (   array == NULL
+           || array->type != Node_var_array
+           || data == NULL
+           || array != (NODE *) data->opaque1
+           || data->count != array->table_size
+           || data->opaque2 == NULL)
+               return false;
+ 
+       list = (NODE **) data->opaque2;
+ 
+       /* free index nodes */
+       for (i = j = 0, k = 2 * array->table_size; i < k; i += 2, j++) {
+               /* Delete items flagged for delete. */
+               if (   (data->elements[j].flags & AWK_ELEMENT_DELETE) != 0
+                   && (array->flags & NO_EXT_SET) == 0) {
+                       remove_element(array, list[i]);
+               }
+               unref(list[i]);
+       }
+ 
+       efree(list);
+       efree(data);
+ 
+       return true;
+ }
+ 
+ /* api_create_value --- create a cached value */
+ 
+ static awk_bool_t
+ api_create_value(awk_ext_id_t id, awk_value_t *value,
+               awk_value_cookie_t *result)
+ {
+       if (value == NULL || result == NULL)
+               return false;
+ 
+       switch (value->val_type) {
+       case AWK_NUMBER:
+       case AWK_STRING:
+               break;
+       default:
+               /* reject anything other than a simple scalar */
+               return false;
+       }
+ 
+       return (*result = awk_value_to_node(value)) != NULL;
+ }
+ 
+ /* api_release_value --- release a cached value */
+ 
+ static awk_bool_t
+ api_release_value(awk_ext_id_t id, awk_value_cookie_t value)
+ {
+       NODE *val = (NODE *) value;
+ 
+       if (val == NULL)
+               return false;
+ 
+       unref(val);
+       return true;
+ }
+ 
+ /*
+  * Register a version string for this extension with gawk.
+  */
+ 
+ struct version_info {
+       const char *version;
+       struct version_info *next;
+ };
+ 
+ static struct version_info *vi_head;
+ 
+ /* api_register_ext_version --- add an extension version string to the list */
+ 
+ static void
+ api_register_ext_version(awk_ext_id_t id, const char *version)
+ {
+       struct version_info *info;
+ 
+       if (version == NULL)
+               return;
+ 
+       (void) id;
+ 
+       emalloc(info, struct version_info *, sizeof(struct version_info), 
"register_ext_version");
+       info->version = version;
+       info->next = vi_head;
+       vi_head = info;
+ }
+ 
+ /* the struct api */
+ gawk_api_t api_impl = {
+       /* data */
+       GAWK_API_MAJOR_VERSION, /* major and minor versions */
+       GAWK_API_MINOR_VERSION,
+       { 0 },                  /* do_flags */
+ 
+       /* registration functions */
+       api_add_ext_func,
+       api_register_input_parser,
+       api_register_output_wrapper,
+       api_register_two_way_processor,
+       api_awk_atexit,
+       api_register_ext_version,
+ 
+       /* message printing functions */
+       api_fatal,
+       api_warning,
+       api_lintwarn,
+ 
+       /* updating ERRNO */
+       api_update_ERRNO_int,
+       api_update_ERRNO_string,
+       api_unset_ERRNO,
+ 
+       /* Function arguments */
+       api_get_argument,
+       api_set_argument,
+ 
+       /* Accessing and installing variables and constants */
+       api_sym_lookup,
+       api_sym_update,
+       api_sym_constant,
+ 
+       /* Accessing and modifying variables via scalar cookies */
+       api_sym_lookup_scalar,
+       api_sym_update_scalar,
+ 
+       /* Cached values */
+       api_create_value,
+       api_release_value,
+ 
+       /* Array management */
+       api_get_element_count,
+       api_get_array_element,
+       api_set_array_element,
+       api_del_array_element,
+       api_create_array,
+       api_clear_array,
+       api_flatten_array,
+       api_release_flattened_array,
+ };
+ 
+ /* init_ext_api --- init the extension API */
+ 
+ void
+ init_ext_api()
+ {
+       /* force values to 1 / 0 */
+       api_impl.do_flags[0] = (do_lint ? 1 : 0);
+       api_impl.do_flags[1] = (do_traditional ? 1 : 0);
+       api_impl.do_flags[2] = (do_profile ? 1 : 0);
+       api_impl.do_flags[3] = (do_sandbox ? 1 : 0);
+       api_impl.do_flags[4] = (do_debug ? 1 : 0);
+       api_impl.do_flags[5] = (do_mpfr ? 1 : 0);
+ }
+ 
+ /* update_ext_api --- update the variables in the API that can change */
+ 
+ void
+ update_ext_api()
+ {
+       api_impl.do_flags[0] = (do_lint ? 1 : 0);
+ }
+ 
+ /* set_constant --- prevent awk code from changing a constant */
+ 
+ static void
+ set_constant()
+ {
+       fatal(_("cannot assign to defined constant"));
+ }
+ 
+ /* print_ext_versions --- print the list */
+ 
+ extern void
+ print_ext_versions(void)
+ {
+       struct version_info *p;
+ 
+       for (p = vi_head; p != NULL; p = p->next)
+               printf("%s\n", p->version);
+ }
diff --cc interpret.h
index 2fed224,26725a2..419fc2e
--- a/interpret.h
+++ b/interpret.h
@@@ -37,17 -37,14 +37,17 @@@ r_interpret(INSTRUCTION *code
        AWKNUM x, x2;
        int di;
        Regexp *rp;
 +      NODE *set_array = NULL; /* array with a post-assignment routine */
 +      NODE *set_idx = NULL;   /* the index of the array element */
 +
  
  /* array subscript */
- #define mk_sub(n)     (n == 1 ? POP_SCALAR() : concat_exp(n, TRUE))
+ #define mk_sub(n)     (n == 1 ? POP_SCALAR() : concat_exp(n, true))
  
  #ifdef EXEC_HOOK
- #define JUMPTO(x)     do { if (post_execute) post_execute(pc); pc = (x); goto 
top; } while (FALSE)
+ #define JUMPTO(x)     do { if (post_execute) post_execute(pc); pc = (x); goto 
top; } while (false)
  #else
- #define JUMPTO(x)     do { pc = (x); goto top; } while (FALSE)
+ #define JUMPTO(x)     do { pc = (x); goto top; } while (false)
  #endif
  
        pc = code;
@@@ -267,15 -280,7 +291,36 @@@ top
                                                array_vname(t1), (int) 
t2->stlen, t2->stptr);
                        }
  
 -                      DEREF(t2);
++                      /*
++                       * Changing something in FUNCTAB is not allowed.
++                       *
++                       * SYMTAB is a little more messy.  Three kinds of 
values may
++                       * be stored in SYMTAB:
++                       *      1. Variables that don"t yet have a value 
(Node_var_new)
++                       *      2. Variables that have a value (Node_var)
++                       *      3. Values that awk code stuck into SYMTAB not 
related to variables (Node_value)
++                       * For 1, since we are giving it a value, we have to 
change the type to Node_var.
++                       * For 1 and 2, we have to step through the Node_var to 
get to the value.
++                       * For 3, we just us the value we got from 
assoc_lookup(), above.
++                       */
++                      if (t1 == func_table)
++                              fatal(_("cannot assign to elements of 
FUNCTAB"));
++                      else if (   t1 == symbol_table
++                               && (   (*lhs)->type == Node_var
++                                   || (*lhs)->type == Node_var_new)) {
++                              (*lhs)->type = Node_var;        /* in case was 
Node_var_new */
++                              lhs = & ((*lhs)->var_value);    /* extra level 
of indirection */
++                      }
++
 +                      assert(set_idx == NULL);
 +
 +                      if (t1->astore) {
 +                              /* array has post-assignment routine */
 +                              set_array = t1;
 +                              set_idx = t2;
 +                      } else
 +                              DEREF(t2);
 +
                        PUSH_ADDRESS(lhs);
                        break;
  
@@@ -538,11 -544,10 +584,11 @@@ mod
                        break;
  
                case Op_store_sub:
 -                      /* array[sub] assignment optimization,
 +                      /*
 +                       * array[sub] assignment optimization,
                         * see awkgram.y (optimize_assignment)
                         */
-                       t1 = force_array(pc->memory, TRUE);     /* array */
 -                      t1 = get_array(pc->memory, true);       /* array */
++                      t1 = force_array(pc->memory, true);     /* array */
                        t2 = mk_sub(pc->expr_count);    /* subscript */
                        lhs = assoc_lookup(t1, t2);
                        if ((*lhs)->type == Node_var_array) {
@@@ -550,14 -555,31 +596,37 @@@
                                fatal(_("attempt to use array `%s[\"%.*s\"]' in 
a scalar context"),
                                                array_vname(t1), (int) 
t2->stlen, t2->stptr);
                        }
+                       DEREF(t2);
+ 
+                       /*
+                        * Changing something in FUNCTAB is not allowed.
+                        *
+                        * SYMTAB is a little more messy.  Three kinds of 
values may
+                        * be stored in SYMTAB:
+                        *      1. Variables that don"t yet have a value 
(Node_var_new)
+                        *      2. Variables that have a value (Node_var)
+                        *      3. Values that awk code stuck into SYMTAB not 
related to variables (Node_value)
+                        * For 1, since we are giving it a value, we have to 
change the type to Node_var.
+                        * For 1 and 2, we have to step through the Node_var to 
get to the value.
+                        * For 3, we just us the value we got from 
assoc_lookup(), above.
+                        */
+                       if (t1 == func_table)
+                               fatal(_("cannot assign to elements of 
FUNCTAB"));
+                       else if (   t1 == symbol_table
+                                && (   (*lhs)->type == Node_var
+                                    || (*lhs)->type == Node_var_new)) {
+                               (*lhs)->type = Node_var;        /* in case was 
Node_var_new */
+                               lhs = & ((*lhs)->var_value);    /* extra level 
of indirection */
+                       }
+ 
                        unref(*lhs);
                        *lhs = POP_SCALAR();
 +
 +                      /* execute post-assignment routine if any */
 +                      if (t1->astore != NULL)
 +                              (*t1->astore)(t1, t2);
 +
 +                      DEREF(t2);
                        break;
  
                case Op_store_var:
@@@ -638,30 -659,6 +707,30 @@@
                        REPLACE(r);
                        break;
  
 +              case Op_subscript_assign:
 +                      /* conditionally execute post-assignment routine for an 
array element */ 
 +
 +                      if (set_idx != NULL) {
-                               di = TRUE;
++                              di = true;
 +                              if (pc->assign_ctxt == Op_sub_builtin
 +                                      && (r = TOP())
 +                                      && get_number_si(r) == 0        /* no 
substitution performed */
 +                              )
-                                       di = FALSE;
++                                      di = false;
 +                              else if ((pc->assign_ctxt == Op_K_getline
 +                                              || pc->assign_ctxt == 
Op_K_getline_redir)
 +                                      && (r = TOP())
 +                                      && get_number_si(r) <= 0        /* EOF 
or error */
 +                              )
-                                       di = FALSE;
++                                      di = false;
 +
 +                              if (di)
 +                                      (*set_array->astore)(set_array, 
set_idx);
 +                              unref(set_idx);
 +                              set_idx = NULL;
 +                      }
 +                      break;
 +
                /* numeric assignments */
                case Op_assign_plus:
                case Op_assign_minus:
@@@ -765,6 -762,12 +834,11 @@@
                        /* get the array */
                        array = POP_ARRAY();
  
+                       /* sanity: check if empty */
 -                      if (array_empty(array))
++                      num_elems = assoc_length(array);
++                      if (num_elems == 0)
+                               goto arrayfor;
+ 
 -                      num_elems = array->table_size;
 -
                        if (sorted_in == NULL)          /* do this once */
                                sorted_in = make_string("sorted_in", 9);
  
diff --cc msg.c
index dabd20e,bc446a1..5427a96
--- a/msg.c
+++ b/msg.c
@@@ -159,8 -162,16 +162,18 @@@ gawk_exit(int status
                longjmp(fatal_tag, 1);
        }
  
 +      /* we could close_io() here */
+       final_exit(status);
+ }
+ 
+ /* final_exit --- run extension exit handlers and exit */
+ 
+ void
+ final_exit(int status)
+ {
+       /* run any extension exit handlers */
+       run_ext_exit_handlers(status);
 +      close_extensions();
  
        exit(status);
  }
diff --cc po/da.gmo
index 0f945fd,7d57685..4a76a74
--- a/po/da.gmo
+++ b/po/da.gmo
@@@ -1,10 -1,14 +1,10 @@@
- Þ•
- $
- 
- ”
- 
- 
- 
 -Þ•
 -+
 --
 -
 -]
 -v
 -ˆ
 -¢
 -
 -
 -
++Þ•
++
++K
++ˆ
++
++
++
  
  
  
@@@ -76,8 -80,8 +76,9 @@@ GNU General Public License for more det
  
  
  along with this program. If not, see http://www.gnu.org/licenses/.
- 
- 
+ 
 -
++
++
  or used as a variable or an array
  By default it reads standard input and writes standard output.
  
@@@ -169,8 -173,8 +170,9 @@@ General Public License for yderligere i
  
  
  med dette program. Hvis ikke, så se http://www.gnu.org/licenses/.
- 
- 
+ 
 -
++
++
  eller brugt som en variabel eller et array
  Almindeligvis læser gawk fra standard ind og skriver til standard ud.
  
diff --cc po/da.po
index 3c9d02d,0cd8a51..e799a95
--- a/po/da.po
+++ b/po/da.po
@@@ -842,270 -868,1407 +868,1414 @@@ msgid "rshift(%f, %f): too large shift 
  msgstr ""
  "rshift(%lf, %lf): for store skifteværdier vil give mærkelige resultater"
  
- #: builtin.c:2851
- msgid "and: received non-numeric first argument"
- msgstr "and: fik et ikke-numerisk første argument"
+ #: builtin.c:3037
+ #, fuzzy
+ msgid "and: called with less than two arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: builtin.c:2853
- msgid "and: received non-numeric second argument"
- msgstr "and: fik et ikke-numerisk andet argument"
+ #: builtin.c:3042
+ #, fuzzy, c-format
+ msgid "and: argument %d is non-numeric"
+ msgstr "exp: argumentet %g er uden for det tilladte område"
  
- #: builtin.c:2859
- #, c-format
- msgid "and(%lf, %lf): negative values will give strange results"
+ #: builtin.c:3046
+ #, fuzzy, c-format
+ msgid "and: argument %d negative value %g will give strange results"
  msgstr "and(%lf, %lf): negative værdier vil give mærkelige resultater"
  
- #: builtin.c:2861
- #, c-format
- msgid "and(%lf, %lf): fractional values will be truncated"
- msgstr "and(%lf, %lf): kommatalsværdier vil blive trunkeret"
+ #: builtin.c:3069
+ #, fuzzy
+ msgid "or: called with less than two arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: builtin.c:2886
- msgid "or: received non-numeric first argument"
- msgstr "or: fik et ikke-numerisk første argument"
+ #: builtin.c:3074
+ #, fuzzy, c-format
+ msgid "or: argument %d is non-numeric"
+ msgstr "exp: argumentet %g er uden for det tilladte område"
  
- #: builtin.c:2888
- msgid "or: received non-numeric second argument"
- msgstr "or: fik et ikke-numerisk andet argument"
+ #: builtin.c:3078
+ #, fuzzy, c-format
+ msgid "or: argument %d negative value %g will give strange results"
+ msgstr "compl(%lf): negative værdier vil give mærkelige resultater"
+ 
+ #: builtin.c:3100
+ #, fuzzy
+ msgid "xor: called with less than two arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
+ 
+ #: builtin.c:3106
+ #, fuzzy, c-format
+ msgid "xor: argument %d is non-numeric"
+ msgstr "exp: argumentet %g er uden for det tilladte område"
+ 
+ #: builtin.c:3110
+ #, fuzzy, c-format
+ msgid "xor: argument %d negative value %g will give strange results"
+ msgstr "xor(%lf, %lf): negative værdier vil give mærkelige resultater"
+ 
+ #: builtin.c:3135 mpfr.c:800
+ msgid "compl: received non-numeric argument"
+ msgstr "compl: fik et ikke-numerisk argument"
+ 
+ #: builtin.c:3141
+ #, fuzzy, c-format
+ msgid "compl(%f): negative value will give strange results"
+ msgstr "compl(%lf): negative værdier vil give mærkelige resultater"
+ 
+ #: builtin.c:3143
+ #, fuzzy, c-format
+ msgid "compl(%f): fractional value will be truncated"
+ msgstr "compl(%lf): kommatalsværdier vil blive trunkeret"
  
- #: builtin.c:2894
+ #: builtin.c:3312
  #, c-format
- msgid "or(%lf, %lf): negative values will give strange results"
- msgstr "or(%lf, %lf): negative værdier vil give mærkelige resultater"
+ msgid "dcgettext: `%s' is not a valid locale category"
+ msgstr "dcgettext: '%s' er ikke en gyldig lokalitetskategori"
  
- #: builtin.c:2896
+ #: command.y:225
  #, c-format
- msgid "or(%lf, %lf): fractional values will be truncated"
- msgstr "or(%lf, %lf): kommatalsværdier vil blive trunkeret"
+ msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+ msgstr ""
  
- #: builtin.c:2924
- msgid "xor: received non-numeric first argument"
- msgstr "xor: fik et ikke-numerisk første argument"
+ #: command.y:289
+ #, fuzzy, c-format
+ msgid "invalid frame number: %d"
+ msgstr "Ugyldig intervalslutning"
  
- #: builtin.c:2926
- msgid "xor: received non-numeric second argument"
- msgstr "xor: fik et ikke-numerisk andet argument"
+ #: command.y:295
+ #, fuzzy, c-format
+ msgid "info: invalid option - \"%s\""
+ msgstr "%s: ugyldigt flag - '%c'\n"
  
- #: builtin.c:2932
+ #: command.y:321
  #, c-format
- msgid "xor(%lf, %lf): negative values will give strange results"
- msgstr "xor(%lf, %lf): negative værdier vil give mærkelige resultater"
+ msgid "source \"%s\": already sourced."
+ msgstr ""
  
- #: builtin.c:2934
+ #: command.y:326
  #, c-format
- msgid "xor(%lf, %lf): fractional values will be truncated"
- msgstr "xor(%lf, %lf): kommatalsværdier vil blive trunkeret"
+ msgid "save \"%s\": command not permitted."
+ msgstr ""
  
- #: builtin.c:2958 builtin.c:2964
- msgid "compl: received non-numeric argument"
- msgstr "compl: fik et ikke-numerisk argument"
+ #: command.y:339
+ msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+ msgstr ""
+ 
+ #: command.y:341
+ msgid "no breakpoint/watchpoint has been set yet"
+ msgstr ""
+ 
+ #: command.y:343
+ msgid "invalid breakpoint/watchpoint number"
+ msgstr ""
  
- #: builtin.c:2966
+ #: command.y:348
  #, c-format
- msgid "compl(%lf): negative value will give strange results"
- msgstr "compl(%lf): negative værdier vil give mærkelige resultater"
+ msgid "Type commands for when %s %d is hit, one per line.\n"
+ msgstr ""
  
- #: builtin.c:2968
+ #: command.y:350
  #, c-format
- msgid "compl(%lf): fractional value will be truncated"
- msgstr "compl(%lf): kommatalsværdier vil blive trunkeret"
+ msgid "End with the command \"end\"\n"
+ msgstr ""
+ 
+ #: command.y:357
+ msgid "`end' valid only in command `commands' or `eval'"
+ msgstr ""
+ 
+ #: command.y:367
+ msgid "`silent' valid only in command `commands'"
+ msgstr ""
+ 
+ #: command.y:373
+ #, fuzzy, c-format
+ msgid "trace: invalid option - \"%s\""
+ msgstr "%s: ugyldigt flag - '%c'\n"
+ 
+ #: command.y:387
+ msgid "condition: invalid breakpoint/watchpoint number"
+ msgstr ""
  
- #: builtin.c:3137
+ #: command.y:449
+ #, fuzzy
+ msgid "argument not a string"
+ msgstr "exp: argumentet %g er uden for det tilladte område"
+ 
+ #: command.y:459 command.y:464
  #, c-format
- msgid "dcgettext: `%s' is not a valid locale category"
- msgstr "dcgettext: '%s' er ikke en gyldig lokalitetskategori"
+ msgid "option: invalid parameter - \"%s\""
+ msgstr ""
  
- #: eval.c:393
+ #: command.y:474
  #, c-format
- msgid "unknown nodetype %d"
- msgstr "ukendt nodetype %d"
+ msgid "no such function - \"%s\""
+ msgstr ""
+ 
+ #: command.y:531
+ #, fuzzy, c-format
+ msgid "enable: invalid option - \"%s\""
+ msgstr "%s: ugyldigt flag - '%c'\n"
+ 
+ #: command.y:597
+ #, fuzzy, c-format
+ msgid "invalid range specification: %d - %d"
+ msgstr "Ugyldig intervalslutning"
+ 
+ #: command.y:659
+ #, fuzzy
+ msgid "non-numeric value for field number"
+ msgstr "ukendt værdi for felt-spec: %d\n"
+ 
+ #: command.y:680 command.y:687
+ msgid "non-numeric value found, numeric expected"
+ msgstr ""
+ 
+ #: command.y:712 command.y:718
+ msgid "non-zero integer value"
+ msgstr ""
+ 
+ #: command.y:817
+ msgid ""
+ "backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+ "frames."
+ msgstr ""
+ 
+ #: command.y:819
+ msgid ""
+ "break [[filename:]N|function] - set breakpoint at the specified location."
+ msgstr ""
+ 
+ #: command.y:821
+ msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+ msgstr ""
+ 
+ #: command.y:823
+ msgid ""
+ "commands [num] - starts a list of commands to be executed at a breakpoint"
+ "(watchpoint) hit."
+ msgstr ""
+ 
+ #: command.y:825
+ msgid "condition num [expr] - set or clear breakpoint or watchpoint 
condition."
+ msgstr ""
+ 
+ #: command.y:827
+ msgid "continue [COUNT] - continue program being debugged."
+ msgstr ""
+ 
+ #: command.y:829
+ msgid "delete [breakpoints] [range] - delete specified breakpoints."
+ msgstr ""
+ 
+ #: command.y:831
+ msgid "disable [breakpoints] [range] - disable specified breakpoints."
+ msgstr ""
+ 
+ #: command.y:833
+ msgid "display [var] - print value of variable each time the program stops."
+ msgstr ""
+ 
+ #: command.y:835
+ msgid "down [N] - move N frames down the stack."
+ msgstr ""
+ 
+ #: command.y:837
+ msgid "dump [filename] - dump instructions to file or stdout."
+ msgstr ""
+ 
+ #: command.y:839
+ msgid "enable [once|del] [breakpoints] [range] - enable specified 
breakpoints."
+ msgstr ""
+ 
+ #: command.y:841
+ msgid "end - end a list of commands or awk statements."
+ msgstr ""
+ 
+ #: command.y:843
+ msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+ msgstr ""
+ 
+ #: command.y:845
+ msgid "finish - execute until selected stack frame returns."
+ msgstr ""
+ 
+ #: command.y:847
+ msgid "frame [N] - select and print stack frame number N."
+ msgstr ""
+ 
+ #: command.y:849
+ msgid "help [command] - print list of commands or explanation of command."
+ msgstr ""
+ 
+ #: command.y:851
+ msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+ msgstr ""
+ 
+ #: command.y:853
+ msgid ""
+ "info topic - source|sources|variables|functions|break|frame|args|locals|"
+ "display|watch."
+ msgstr ""
+ 
+ #: command.y:855
+ msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+ msgstr ""
+ 
+ #: command.y:857
+ msgid "next [COUNT] - step program, proceeding through subroutine calls."
+ msgstr ""
+ 
+ #: command.y:859
+ msgid ""
+ "nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+ msgstr ""
+ 
+ #: command.y:861
+ msgid "option [name[=value]] - set or display debugger option(s)."
+ msgstr ""
+ 
+ #: command.y:863
+ msgid "print var [var] - print value of a variable or array."
+ msgstr ""
+ 
+ #: command.y:865
+ msgid "printf format, [arg], ... - formatted output."
+ msgstr ""
+ 
+ #: command.y:867
+ msgid "quit - exit debugger."
+ msgstr ""
+ 
+ #: command.y:869
+ msgid "return [value] - make selected stack frame return to its caller."
+ msgstr ""
+ 
+ #: command.y:871
+ msgid "run - start or restart executing program."
+ msgstr ""
+ 
+ #: command.y:874
+ msgid "save filename - save commands from the session to file."
+ msgstr ""
+ 
+ #: command.y:877
+ msgid "set var = value - assign value to a scalar variable."
+ msgstr ""
+ 
+ #: command.y:879
+ msgid ""
+ "silent - suspends usual message when stopped at a breakpoint/watchpoint."
+ msgstr ""
+ 
+ #: command.y:881
+ msgid "source file - execute commands from file."
+ msgstr ""
+ 
+ #: command.y:883
+ msgid "step [COUNT] - step program until it reaches a different source line."
+ msgstr ""
+ 
+ #: command.y:885
+ msgid "stepi [COUNT] - step one instruction exactly."
+ msgstr ""
+ 
+ #: command.y:887
+ msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+ msgstr ""
+ 
+ #: command.y:889
+ msgid "trace on|off - print instruction before executing."
+ msgstr ""
+ 
+ #: command.y:891
+ msgid "undisplay [N] - remove variable(s) from automatic display list."
+ msgstr ""
+ 
+ #: command.y:893
+ msgid ""
+ "until [[filename:]N|function] - execute until program reaches a different "
+ "line or line N within current frame."
+ msgstr ""
+ 
+ #: command.y:895
+ msgid "unwatch [N] - remove variable(s) from watch list."
+ msgstr ""
+ 
+ #: command.y:897
+ msgid "up [N] - move N frames up the stack."
+ msgstr ""
+ 
+ #: command.y:899
+ msgid "watch var - set a watchpoint for a variable."
+ msgstr ""
  
- #: eval.c:404 eval.c:418
+ #: command.y:1011 debug.c:395 msg.c:128
  #, c-format
- msgid "unknown opcode %d"
- msgstr "ukendt opkode %d"
+ msgid "error: "
+ msgstr "fejl: "
+ 
+ #: command.y:1051
+ #, fuzzy, c-format
+ msgid "can't read command (%s)\n"
+ msgstr "kan ikke omdirigere fra '%s' (%s)"
+ 
+ #: command.y:1065
+ #, fuzzy, c-format
+ msgid "can't read command (%s)"
+ msgstr "kan ikke omdirigere fra '%s' (%s)"
+ 
+ #: command.y:1116
+ #, fuzzy
+ msgid "invalid character in command"
+ msgstr "Ugyldigt tegnklassenavn"
  
- #: eval.c:415
+ #: command.y:1152
  #, c-format
- msgid "opcode %s not an operator or keyword"
- msgstr "opkode %s er ikke en operator eller et nøgleord"
+ msgid "unknown command - \"%.*s\", try help"
+ msgstr ""
  
- #: eval.c:468
- msgid "buffer overflow in genflags2str"
- msgstr "bufferoverløb i genflags2str"
+ #: command.y:1222
+ #, c-format
+ msgid "%s"
+ msgstr ""
+ 
+ #: command.y:1284
+ #, fuzzy
+ msgid "invalid character"
+ msgstr "Ugyldigt sorteringstegn"
  
- #: eval.c:678
+ #: command.y:1455
  #, c-format
- msgid ""
- "\n"
- "\t# Function Call Stack:\n"
- "\n"
+ msgid "undefined command: %s\n"
+ msgstr ""
+ 
+ #: debug.c:246
+ msgid "set or show the number of lines to keep in history file."
+ msgstr ""
+ 
+ #: debug.c:248
+ msgid "set or show the list command window size."
+ msgstr ""
+ 
+ #: debug.c:250
+ msgid "set or show gawk output file."
+ msgstr ""
+ 
+ #: debug.c:252
+ msgid "set or show debugger prompt."
+ msgstr ""
+ 
+ #: debug.c:254
+ msgid "(un)set or show saving of command history (value=on|off)."
+ msgstr ""
+ 
+ #: debug.c:256
+ msgid "(un)set or show saving of options (value=on|off)."
+ msgstr ""
+ 
+ #: debug.c:258
+ msgid "(un)set or show instruction tracing (value=on|off)."
+ msgstr ""
+ 
+ #: debug.c:339
+ msgid "program not running."
+ msgstr ""
+ 
+ #: debug.c:442 debug.c:597
+ #, fuzzy, c-format
+ msgid "can't read source file `%s' (%s)"
+ msgstr "kan ikke læse kildefilen '%s' (%s)"
+ 
+ #: debug.c:447
+ #, fuzzy, c-format
+ msgid "source file `%s' is empty.\n"
+ msgstr "kildefilen '%s' er tom"
+ 
+ #: debug.c:474
+ msgid "no current source file."
+ msgstr ""
+ 
+ #: debug.c:499
+ #, fuzzy, c-format
+ msgid "cannot find source file named `%s' (%s)"
+ msgstr "kan ikke læse kildefilen '%s' (%s)"
+ 
+ #: debug.c:523
+ #, c-format
+ msgid "WARNING: source file `%s' modified since program compilation.\n"
+ msgstr ""
+ 
+ #: debug.c:542
+ #, c-format
+ msgid "line number %d out of range; `%s' has %d lines"
+ msgstr ""
+ 
+ #: debug.c:602
+ #, fuzzy, c-format
+ msgid "unexpected eof while reading file `%s', line %d"
+ msgstr "uventet nylinjetegn eller strengafslutning"
+ 
+ #: debug.c:611
+ #, c-format
+ msgid "source file `%s' modified since start of program execution"
+ msgstr ""
+ 
+ #: debug.c:723
+ #, fuzzy, c-format
+ msgid "Current source file: %s\n"
+ msgstr "allerede inkluderet kildefil '%s'"
+ 
+ #: debug.c:724
+ #, c-format
+ msgid "Number of lines: %d\n"
+ msgstr ""
+ 
+ #: debug.c:731
+ #, c-format
+ msgid "Source file (lines): %s (%d)\n"
+ msgstr ""
+ 
+ #: debug.c:745
+ msgid ""
+ "Number  Disp  Enabled  Location\n"
+ "\n"
+ msgstr ""
+ 
+ #: debug.c:756
+ #, c-format
+ msgid "\tno of hits = %ld\n"
+ msgstr ""
+ 
+ #: debug.c:758
+ #, c-format
+ msgid "\tignore next %ld hit(s)\n"
+ msgstr ""
+ 
+ #: debug.c:760 debug.c:900
+ #, c-format
+ msgid "\tstop condition: %s\n"
+ msgstr ""
+ 
+ #: debug.c:762 debug.c:902
+ msgid "\tcommands:\n"
+ msgstr ""
+ 
+ #: debug.c:784
+ #, c-format
+ msgid "Current frame: "
+ msgstr ""
+ 
+ #: debug.c:787
+ #, c-format
+ msgid "Called by frame: "
+ msgstr ""
+ 
+ #: debug.c:791
+ #, c-format
+ msgid "Caller of frame: "
+ msgstr ""
+ 
+ #: debug.c:809
+ #, c-format
+ msgid "None in main().\n"
+ msgstr ""
+ 
+ #: debug.c:839
+ #, fuzzy
+ msgid "No arguments.\n"
+ msgstr "printf: ingen argumenter"
+ 
+ #: debug.c:840
+ msgid "No locals.\n"
+ msgstr ""
+ 
+ #: debug.c:848
+ msgid ""
+ "All defined variables:\n"
+ "\n"
+ msgstr ""
+ 
+ #: debug.c:858
+ msgid ""
+ "All defined functions:\n"
+ "\n"
+ msgstr ""
+ 
+ #: debug.c:877
+ msgid ""
+ "Auto-display variables:\n"
+ "\n"
+ msgstr ""
+ 
+ #: debug.c:880
+ msgid ""
+ "Watch variables:\n"
+ "\n"
+ msgstr ""
+ 
+ #: debug.c:1020
+ #, fuzzy, c-format
+ msgid "no symbol `%s' in current context\n"
+ msgstr "'exit' kan ikke kaldes i den aktuelle kontekst"
+ 
+ #: debug.c:1032 debug.c:1416
+ #, fuzzy, c-format
+ msgid "`%s' is not an array\n"
+ msgstr "'%s' er ikke et gyldigt variabelnavn"
+ 
+ #: debug.c:1046
+ #, fuzzy, c-format
+ msgid "$%ld = uninitialized field\n"
+ msgstr "reference til ikke-initieret felt '$%d'"
+ 
+ #: debug.c:1067
+ #, fuzzy, c-format
+ msgid "array `%s' is empty\n"
+ msgstr "datafilen '%s' er tom"
+ 
+ #: debug.c:1110 debug.c:1162
+ #, fuzzy, c-format
+ msgid "[\"%s\"] not in array `%s'\n"
+ msgstr "delete: indeks '%s' findes ikke i array '%s'"
+ 
+ #: debug.c:1166
+ #, c-format
+ msgid "`%s[\"%s\"]' is not an array\n"
+ msgstr ""
+ 
+ #: debug.c:1227 debug.c:4947
+ #, fuzzy, c-format
+ msgid "`%s' is not a scalar variable"
+ msgstr "'%s' er ikke et gyldigt variabelnavn"
+ 
+ #: debug.c:1249 debug.c:4977
+ #, fuzzy, c-format
+ msgid "attempt to use array `%s[\"%s\"]' in a scalar context"
+ msgstr "forsøg på at bruge array '%s[\"%.*s\"]' i skalarsammenhæng"
+ 
+ #: debug.c:1269 debug.c:4988
+ #, fuzzy, c-format
+ msgid "attempt to use scalar `%s[\"%s\"]' as array"
+ msgstr "forsøg på at bruge skalaren '%s[\"%.*s\"]' som array"
+ 
+ #: debug.c:1412
+ #, fuzzy, c-format
+ msgid "`%s' is a function"
+ msgstr "'%s' er ugyldigt som funktionsnavn"
+ 
+ #: debug.c:1454
+ #, c-format
+ msgid "watchpoint %d is unconditional\n"
+ msgstr ""
+ 
+ #: debug.c:1488
+ #, c-format
+ msgid "No display item numbered %ld"
+ msgstr ""
+ 
+ #: debug.c:1491
+ #, c-format
+ msgid "No watch item numbered %ld"
+ msgstr ""
+ 
+ #: debug.c:1517
+ #, fuzzy, c-format
+ msgid "%d: [\"%s\"] not in array `%s'\n"
+ msgstr "delete: indeks '%s' findes ikke i array '%s'"
+ 
+ #: debug.c:1756
+ #, fuzzy
+ msgid "attempt to use scalar value as array"
+ msgstr "forsøg på at bruge en skalar som array"
+ 
+ #: debug.c:1845
+ #, c-format
+ msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+ msgstr ""
+ 
+ #: debug.c:1856
+ #, c-format
+ msgid "Display %d deleted because parameter is out of scope.\n"
+ msgstr ""
+ 
+ #: debug.c:1889
+ #, c-format
+ msgid " in file `%s', line %d\n"
+ msgstr ""
+ 
+ #: debug.c:1910
+ #, c-format
+ msgid " at `%s':%d"
+ msgstr ""
+ 
+ #: debug.c:1926 debug.c:1989
+ #, c-format
+ msgid "#%ld\tin "
+ msgstr ""
+ 
+ #: debug.c:1963
+ #, c-format
+ msgid "More stack frames follow ...\n"
+ msgstr ""
+ 
+ #: debug.c:2006
+ #, fuzzy
+ msgid "invalid frame number"
+ msgstr "Ugyldig intervalslutning"
+ 
+ #: debug.c:2178
+ #, c-format
+ msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+ msgstr ""
+ 
+ #: debug.c:2185
+ #, c-format
+ msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+ msgstr ""
+ 
+ #: debug.c:2192
+ #, c-format
+ msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at 
%s:%d"
+ msgstr ""
+ 
+ #: debug.c:2199
+ #, c-format
+ msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+ msgstr ""
+ 
+ #: debug.c:2216
+ #, c-format
+ msgid "Breakpoint %d set at file `%s', line %d\n"
+ msgstr ""
+ 
+ #: debug.c:2318
+ #, c-format
+ msgid "Can't set breakpoint in file `%s'\n"
+ msgstr ""
+ 
+ #: debug.c:2347 debug.c:2470 debug.c:3328
+ #, fuzzy, c-format
+ msgid "line number %d in file `%s' out of range"
+ msgstr "exp: argumentet %g er uden for det tilladte område"
+ 
+ #: debug.c:2351
+ #, c-format
+ msgid "Can't find rule!!!\n"
+ msgstr ""
+ 
+ #: debug.c:2353
+ #, c-format
+ msgid "Can't set breakpoint at `%s':%d\n"
+ msgstr ""
+ 
+ #: debug.c:2365
+ #, c-format
+ msgid "Can't set breakpoint in function `%s'\n"
+ msgstr ""
+ 
+ #: debug.c:2381
+ #, c-format
+ msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+ msgstr ""
+ 
+ #: debug.c:2486 debug.c:2508
+ #, c-format
+ msgid "Deleted breakpoint %d"
+ msgstr ""
+ 
+ #: debug.c:2492
+ #, c-format
+ msgid "No breakpoint(s) at entry to function `%s'\n"
+ msgstr ""
+ 
+ #: debug.c:2519
+ #, fuzzy, c-format
+ msgid "No breakpoint at file `%s', line #%d\n"
+ msgstr "fejl ved læsning af inddatafilen '%s': %s"
+ 
+ #: debug.c:2574 debug.c:2615 debug.c:2635 debug.c:2678
+ msgid "invalid breakpoint number"
+ msgstr ""
+ 
+ #: debug.c:2590
+ msgid "Delete all breakpoints? (y or n) "
+ msgstr ""
+ 
+ #: debug.c:2591 debug.c:2901 debug.c:2954
+ msgid "y"
+ msgstr ""
+ 
+ #: debug.c:2640
+ #, c-format
+ msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+ msgstr ""
+ 
+ #: debug.c:2644
+ #, c-format
+ msgid "Will stop next time breakpoint %d is reached.\n"
+ msgstr ""
+ 
+ #: debug.c:2761
+ #, c-format
+ msgid "Can only debug programs provided with the `-f' option.\n"
+ msgstr ""
+ 
+ #: debug.c:2886
+ #, c-format
+ msgid "Failed to restart debugger"
+ msgstr ""
+ 
+ #: debug.c:2900
+ msgid "Program already running. Restart from beginning (y/n)? "
+ msgstr ""
+ 
+ #: debug.c:2904
+ #, c-format
+ msgid "Program not restarted\n"
+ msgstr ""
+ 
+ #: debug.c:2914
+ #, c-format
+ msgid "error: cannot restart, operation not allowed\n"
+ msgstr ""
+ 
+ #: debug.c:2920
+ #, c-format
+ msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+ msgstr ""
+ 
+ #: debug.c:2928
+ #, c-format
+ msgid "Starting program: \n"
+ msgstr ""
+ 
+ #: debug.c:2937
+ #, c-format
+ msgid "Program exited %s with exit value: %d\n"
+ msgstr ""
+ 
+ #: debug.c:2953
+ msgid "The program is running. Exit anyway (y/n)? "
+ msgstr ""
+ 
+ #: debug.c:2988
+ #, c-format
+ msgid "Not stopped at any breakpoint; argument ignored.\n"
+ msgstr ""
+ 
+ #: debug.c:2993
+ #, c-format
+ msgid "invalid breakpoint number %d."
+ msgstr ""
+ 
+ #: debug.c:2998
+ #, c-format
+ msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+ msgstr ""
+ 
+ #: debug.c:3185
+ #, c-format
+ msgid "'finish' not meaningful in the outermost frame main()\n"
+ msgstr ""
+ 
+ #: debug.c:3190
+ #, c-format
+ msgid "Run till return from "
+ msgstr ""
+ 
+ #: debug.c:3233
+ #, c-format
+ msgid "'return' not meaningful in the outermost frame main()\n"
+ msgstr ""
+ 
+ #: debug.c:3347
+ #, c-format
+ msgid "Can't find specified location in function `%s'\n"
+ msgstr ""
+ 
+ #: debug.c:3355
+ #, fuzzy, c-format
+ msgid "invalid source line %d in file `%s'"
+ msgstr "allerede inkluderet kildefil '%s'"
+ 
+ #: debug.c:3370
+ #, c-format
+ msgid "Can't find specified location %d in file `%s'\n"
+ msgstr ""
+ 
+ #: debug.c:3402
+ #, fuzzy, c-format
+ msgid "element not in array\n"
+ msgstr "delete: indeks '%s' findes ikke i array '%s'"
+ 
+ #: debug.c:3402
+ #, c-format
+ msgid "untyped variable\n"
+ msgstr ""
+ 
+ #: debug.c:3444
+ #, c-format
+ msgid "Stopping in %s ...\n"
+ msgstr ""
+ 
+ #: debug.c:3521
+ #, c-format
+ msgid "'finish' not meaningful with non-local jump '%s'\n"
+ msgstr ""
+ 
+ #: debug.c:3528
+ #, c-format
+ msgid "'until' not meaningful with non-local jump '%s'\n"
+ msgstr ""
+ 
+ #: debug.c:4163
+ msgid "\t------[Enter] to continue or q [Enter] to quit------"
+ msgstr ""
+ 
+ #: debug.c:4164
+ msgid "q"
+ msgstr ""
+ 
+ #: debug.c:4984
+ #, fuzzy, c-format
+ msgid "[\"%s\"] not in array `%s'"
+ msgstr "delete: indeks '%s' findes ikke i array '%s'"
+ 
+ #: debug.c:5190
+ #, c-format
+ msgid "sending output to stdout\n"
+ msgstr ""
+ 
+ #: debug.c:5230
+ msgid "invalid number"
+ msgstr ""
+ 
+ #: debug.c:5362
+ #, fuzzy, c-format
+ msgid "`%s' not allowed in current context; statement ignored"
+ msgstr "'exit' kan ikke kaldes i den aktuelle kontekst"
+ 
+ #: debug.c:5370
+ #, fuzzy
+ msgid "`return' not allowed in current context; statement ignored"
+ msgstr "'exit' kan ikke kaldes i den aktuelle kontekst"
+ 
+ #: debug.c:5571
+ #, fuzzy, c-format
+ msgid "No symbol `%s' in current context"
+ msgstr "forsøg på at bruge array '%s' i skalarsammenhæng"
+ 
+ #: dfa.c:984 dfa.c:987 dfa.c:1007 dfa.c:1017 dfa.c:1029 dfa.c:1080 dfa.c:1089
+ #: dfa.c:1092 dfa.c:1097 dfa.c:1110 dfa.c:1178
+ msgid "unbalanced ["
+ msgstr ""
+ 
+ #: dfa.c:1038
+ #, fuzzy
+ msgid "invalid character class"
+ msgstr "Ugyldigt tegnklassenavn"
+ 
+ #: dfa.c:1215
+ msgid "character class syntax is [[:space:]], not [:space:]"
+ msgstr ""
+ 
+ #: dfa.c:1267
+ msgid "unfinished \\ escape"
+ msgstr ""
+ 
+ #: dfa.c:1414 regcomp.c:161
+ msgid "Invalid content of \\{\\}"
+ msgstr "Ugyldigt indhold i \\{\\}"
+ 
+ #: dfa.c:1417 regcomp.c:176
+ msgid "Regular expression too big"
+ msgstr "Regulært udtryk for stort"
+ 
+ #: dfa.c:1802
+ msgid "unbalanced ("
+ msgstr ""
+ 
+ #: dfa.c:1929
+ msgid "no syntax specified"
+ msgstr ""
+ 
+ #: dfa.c:1937
+ msgid "unbalanced )"
+ msgstr ""
+ 
+ #: eval.c:394
+ #, c-format
+ msgid "unknown nodetype %d"
+ msgstr "ukendt nodetype %d"
+ 
+ #: eval.c:405 eval.c:419
+ #, c-format
+ msgid "unknown opcode %d"
+ msgstr "ukendt opkode %d"
+ 
+ #: eval.c:416
+ #, c-format
+ msgid "opcode %s not an operator or keyword"
+ msgstr "opkode %s er ikke en operator eller et nøgleord"
+ 
+ #: eval.c:471
+ msgid "buffer overflow in genflags2str"
+ msgstr "bufferoverløb i genflags2str"
+ 
+ #: eval.c:674
+ #, c-format
+ msgid ""
+ "\n"
+ "\t# Function Call Stack:\n"
+ "\n"
+ msgstr ""
+ "\n"
+ "\t# Funktionskaldsstak:\n"
+ "\n"
+ 
+ #: eval.c:703
+ msgid "`IGNORECASE' is a gawk extension"
+ msgstr "'IGNORECASE' er en gawk-udvidelse"
+ 
+ #: eval.c:735
+ msgid "`BINMODE' is a gawk extension"
+ msgstr "'BINMODE' er en gawk-udvidelse"
+ 
+ #: eval.c:792
+ #, c-format
+ msgid "BINMODE value `%s' is invalid, treated as 3"
+ msgstr "BINMODE værdi '%s' er ugyldig, behandles som 3"
+ 
+ #: eval.c:884
+ #, c-format
+ msgid "bad `%sFMT' specification `%s'"
+ msgstr "forkert '%sFMT'-specifikation '%s'"
+ 
+ #: eval.c:968
+ msgid "turning off `--lint' due to assignment to `LINT'"
+ msgstr "deaktiverer '--lint' på grund af en tildeling til 'LINT'"
+ 
+ #: eval.c:1144
+ #, c-format
+ msgid "reference to uninitialized argument `%s'"
+ msgstr "reference til ikke-initieret argument '%s'"
+ 
+ #: eval.c:1145
+ #, c-format
+ msgid "reference to uninitialized variable `%s'"
+ msgstr "reference til ikke-initieret variabel '%s'"
+ 
+ #: eval.c:1163
+ msgid "attempt to field reference from non-numeric value"
+ msgstr "forsøg på at referere til et felt fra ikke-numerisk værdi"
+ 
+ #: eval.c:1165
+ msgid "attempt to field reference from null string"
+ msgstr "forsøg på at referere til et felt fra tom streng"
+ 
+ #: eval.c:1173
+ #, c-format
+ msgid "attempt to access field %ld"
+ msgstr "forsøg på at få adgang til felt %ld"
+ 
+ #: eval.c:1182
+ #, c-format
+ msgid "reference to uninitialized field `$%ld'"
+ msgstr "reference til ikke-initieret felt '$%ld'"
+ 
+ #: eval.c:1269
+ #, c-format
+ msgid "function `%s' called with more arguments than declared"
+ msgstr "funktionen '%s' kaldt med flere argumenter end deklareret"
+ 
+ #: eval.c:1464
+ #, c-format
+ msgid "unwind_stack: unexpected type `%s'"
+ msgstr "unwind_stack: uventet type `%s'"
+ 
+ #: eval.c:1560
+ msgid "division by zero attempted in `/='"
+ msgstr "forsøgte at dividere med nul i '/='"
+ 
+ #: eval.c:1567
+ #, c-format
+ msgid "division by zero attempted in `%%='"
+ msgstr "forsøgte at dividere med nul i '%%='"
+ 
+ #: ext.c:49
+ msgid "extensions are not allowed in sandbox mode"
+ msgstr "udvidelser er ikke tilladt i sandkasse-tilstand"
+ 
+ #: ext.c:52
+ #, fuzzy
+ msgid "-l / @load are gawk extensions"
+ msgstr "@include er en gawk-udvidelse"
+ 
+ #: ext.c:55
+ msgid "load_ext: received NULL lib_name"
+ msgstr ""
+ 
+ #: ext.c:58
+ #, fuzzy, c-format
+ msgid "load_ext: cannot open library `%s' (%s)\n"
+ msgstr "atalt: extension: kan ikke åbne '%s' (%s)\n"
+ 
+ #: ext.c:64
+ #, fuzzy, c-format
+ msgid ""
+ "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)\n"
+ msgstr ""
+ "fatalt: extension: bibliotek '%s': definer ikke "
+ "'plugin_is_GPL_compatible' (%s)\n"
+ 
+ #: ext.c:70
+ #, fuzzy, c-format
+ msgid "load_ext: library `%s': cannot call function `%s' (%s)\n"
+ msgstr ""
+ "fatalt: extension: bibliotek '%s': kan ikke kalde funktionen '%s' (%s)\n"
+ 
+ #: ext.c:74
+ #, c-format
+ msgid "load_ext: library `%s' initialization routine `%s' failed\n"
+ msgstr ""
+ 
+ #: ext.c:93
+ #, fuzzy
+ msgid "make_builtin: missing function name"
+ msgstr "extension: mangler funktionsnavn"
+ 
+ #: ext.c:98
+ #, fuzzy, c-format
+ msgid "make_builtin: illegal character `%c' in function name `%s'"
+ msgstr "extension: ugyldigt tegn '%c' i funktionsnavn '%s'"
+ 
+ #: ext.c:106
+ #, fuzzy, c-format
+ msgid "make_builtin: can't redefine function `%s'"
+ msgstr "extension: kan ikke omdefinere funktion '%s'"
+ 
+ #: ext.c:110
+ #, fuzzy, c-format
+ msgid "make_builtin: function `%s' already defined"
+ msgstr "extension: funktionen '%s' er allerede defineret"
+ 
+ #: ext.c:114
+ #, fuzzy, c-format
+ msgid "make_builtin: function name `%s' previously defined"
+ msgstr "extension: funktionsnavnet '%s' er defineret tidligere"
+ 
+ #: ext.c:116
+ #, fuzzy, c-format
+ msgid "make_builtin: can't use gawk built-in `%s' as function name"
+ msgstr "extension: kan ikke bruge gawk's indbyggede '%s' som funktionsnavn"
+ 
+ #: ext.c:119
+ #, c-format
+ msgid "make_builtin: negative argument count for function `%s'"
+ msgstr "make_builtin: negativt argumentantal for funktion '%s'"
+ 
+ #: ext.c:183
+ #, c-format
+ msgid "function `%s' defined to take no more than %d argument(s)"
+ msgstr "funktionen '%s' defineret til at tage ikke mere end %d argumenter"
+ 
+ #: ext.c:186
+ #, c-format
+ msgid "function `%s': missing argument #%d"
+ msgstr "funktion '%s': mangler argument nummer %d"
+ 
+ #: ext.c:203
+ #, c-format
+ msgid "function `%s': argument #%d: attempt to use scalar as an array"
+ msgstr ""
+ "funktion '%s': argument nummer %d: forsøg på at bruge skalar som et array"
+ 
+ #: ext.c:207
+ #, c-format
+ msgid "function `%s': argument #%d: attempt to use array as a scalar"
+ msgstr ""
+ "funktion '%s': argument nummer %d: forsøg på at bruge array som en skalar"
+ 
+ #: ext.c:221
+ msgid "dynamic loading of library not supported"
+ msgstr ""
+ 
+ #: extension/filefuncs.c:75
+ #, fuzzy
+ msgid "chdir: called with incorrect number of arguments, expecting 1"
+ msgstr "sqrt: kaldt med negativt argument %g"
+ 
+ #: extension/filefuncs.c:317
+ #, c-format
+ msgid "stat: unable to read symbolic link `%s'"
+ msgstr ""
+ 
+ #: extension/filefuncs.c:348
+ #, fuzzy
+ msgid "stat: called with wrong number of arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
+ 
+ #: extension/filefuncs.c:355
+ #, fuzzy
+ msgid "stat: bad parameters"
+ msgstr "%s: er parameter\n"
+ 
+ #: extension/filefuncs.c:404
+ #, fuzzy, c-format
+ msgid "fts init: could not create constant %s"
+ msgstr "indeks: andet argument er ikke en streng"
+ 
+ #: extension/filefuncs.c:424
+ msgid "fill_stat_element: could not create array"
+ msgstr ""
+ 
+ #: extension/filefuncs.c:433
+ msgid "fill_stat_element: could not set element"
+ msgstr ""
+ 
+ #: extension/filefuncs.c:448
+ #, fuzzy
+ msgid "fill_path_element: could not set element"
+ msgstr "indeks: andet argument er ikke en streng"
+ 
+ #: extension/filefuncs.c:464
+ msgid "fill_error_element: could not set element"
+ msgstr ""
+ 
+ #: extension/filefuncs.c:511 extension/filefuncs.c:558
+ msgid "fts-process: could not create array"
+ msgstr ""
+ 
+ #: extension/filefuncs.c:521 extension/filefuncs.c:568
+ #: extension/filefuncs.c:586
+ #, fuzzy
+ msgid "fts-process: could not set element"
+ msgstr "indeks: andet argument er ikke en streng"
+ 
+ #: extension/filefuncs.c:635
+ #, fuzzy
+ msgid "fts: called with incorrect number of arguments, expecting 3"
+ msgstr "sqrt: kaldt med negativt argument %g"
+ 
+ #: extension/filefuncs.c:638
+ #, fuzzy
+ msgid "fts: bad first parameter"
+ msgstr "%s: er parameter\n"
+ 
+ #: extension/filefuncs.c:644
+ #, fuzzy
+ msgid "fts: bad second parameter"
+ msgstr "%s: er parameter\n"
+ 
+ #: extension/filefuncs.c:650
+ #, fuzzy
+ msgid "fts: bad third parameter"
+ msgstr "%s: er parameter\n"
+ 
+ #: extension/filefuncs.c:657
+ #, fuzzy
+ msgid "fts: could not flatten array\n"
+ msgstr "'%s' er ikke et gyldigt variabelnavn"
+ 
+ #: extension/filefuncs.c:675
+ msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+ msgstr ""
+ 
+ #: extension/filefuncs.c:692
+ msgid "fts: clear_array() failed\n"
+ msgstr ""
+ 
+ #: extension/fnmatch.c:91
+ #, fuzzy
+ msgid "fnmatch: called with less than three arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
+ 
+ #: extension/fnmatch.c:94
+ #, fuzzy
+ msgid "fnmatch: called with more than three arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
+ 
+ #: extension/fnmatch.c:97
+ #, fuzzy
+ msgid "fnmatch: could not get first argument"
+ msgstr "strftime: fik et første argument som ikke er en streng"
+ 
+ #: extension/fnmatch.c:102
+ #, fuzzy
+ msgid "fnmatch: could not get second argument"
+ msgstr "indeks: andet argument er ikke en streng"
+ 
+ #: extension/fnmatch.c:107
+ msgid "fnmatch: could not get third argument"
  msgstr ""
- "\n"
- "\t# Funktionskaldsstak:\n"
- "\n"
  
- #: eval.c:706
- msgid "`IGNORECASE' is a gawk extension"
- msgstr "'IGNORECASE' er en gawk-udvidelse"
+ #: extension/fnmatch.c:120
+ msgid "fnmatch is not implemented on this system\n"
+ msgstr ""
  
- #: eval.c:736
- msgid "`BINMODE' is a gawk extension"
- msgstr "'BINMODE' er en gawk-udvidelse"
+ #: extension/fnmatch.c:152
+ msgid "fnmatch init: could not add FNM_NOMATCH variable"
+ msgstr ""
  
- #: eval.c:794
+ #: extension/fnmatch.c:162
  #, c-format
- msgid "BINMODE value `%s' is invalid, treated as 3"
- msgstr "BINMODE værdi '%s' er ugyldig, behandles som 3"
+ msgid "fnmatch init: could not set array element %s"
+ msgstr ""
  
- #: eval.c:887
- #, c-format
- msgid "bad `%sFMT' specification `%s'"
- msgstr "forkert '%sFMT'-specifikation '%s'"
+ #: extension/fnmatch.c:172
+ msgid "fnmatch init: could not install FNM array"
+ msgstr ""
  
- #: eval.c:969
- msgid "turning off `--lint' due to assignment to `LINT'"
- msgstr "deaktiverer '--lint' på grund af en tildeling til 'LINT'"
+ #: extension/fork.c:81
+ #, fuzzy
+ msgid "fork: called with too many arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: eval.c:1119
- #, c-format
- msgid "reference to uninitialized argument `%s'"
- msgstr "reference til ikke-initieret argument '%s'"
+ #: extension/fork.c:94
+ msgid "fork: PROCINFO is not an array!"
+ msgstr ""
  
- #: eval.c:1120
- #, c-format
- msgid "reference to uninitialized variable `%s'"
- msgstr "reference til ikke-initieret variabel '%s'"
+ #: extension/fork.c:118
+ #, fuzzy
+ msgid "waitpid: called with too many arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: eval.c:1138
- msgid "attempt to field reference from non-numeric value"
- msgstr "forsøg på at referere til et felt fra ikke-numerisk værdi"
+ #: extension/fork.c:126
+ #, fuzzy
+ msgid "wait: called with no arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: eval.c:1140
- msgid "attempt to field reference from null string"
- msgstr "forsøg på at referere til et felt fra tom streng"
+ #: extension/fork.c:143
+ #, fuzzy
+ msgid "wait: called with too many arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: eval.c:1146
- #, c-format
- msgid "attempt to access field %ld"
- msgstr "forsøg på at få adgang til felt %ld"
+ #: extension/ordchr.c:69
+ #, fuzzy
+ msgid "ord: called with too many arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: eval.c:1155
- #, c-format
- msgid "reference to uninitialized field `$%ld'"
- msgstr "reference til ikke-initieret felt '$%ld'"
+ #: extension/ordchr.c:75
+ #, fuzzy
+ msgid "ord: called with no arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: eval.c:1242
- #, c-format
- msgid "function `%s' called with more arguments than declared"
- msgstr "funktionen '%s' kaldt med flere argumenter end deklareret"
+ #: extension/ordchr.c:77
+ #, fuzzy
+ msgid "ord: called with inappropriate argument(s)"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: eval.c:1436
- #, c-format
- msgid "unwind_stack: unexpected type `%s'"
- msgstr "unwind_stack: uventet type `%s'"
+ #: extension/ordchr.c:99
+ #, fuzzy
+ msgid "chr: called with too many arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: eval.c:1536
- msgid "division by zero attempted in `/='"
- msgstr "forsøgte at dividere med nul i '/='"
+ #: extension/ordchr.c:109
+ #, fuzzy
+ msgid "chr: called with no arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: eval.c:1543
- #, c-format
- msgid "division by zero attempted in `%%='"
- msgstr "forsøgte at dividere med nul i '%%='"
+ #: extension/ordchr.c:111
+ #, fuzzy
+ msgid "chr: called with inappropriate argument(s)"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: ext.c:70
- msgid "extensions are not allowed in sandbox mode"
- msgstr "udvidelser er ikke tilladt i sandkasse-tilstand"
+ #: extension/readfile.c:81
+ #, fuzzy
+ msgid "readfile: called with too many arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: ext.c:73
- msgid "`extension' is a gawk extension"
- msgstr "'extension' er en gawk-udvidelse"
+ #: extension/readfile.c:114
+ #, fuzzy
+ msgid "readfile: called with no arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: ext.c:80
- #, fuzzy, c-format
- msgid "extension: cannot open library `%s' (%s)\n"
- msgstr "atalt: extension: kan ikke åbne '%s' (%s)\n"
+ #: extension/rwarray.c:120
+ #, fuzzy
+ msgid "writea: called with too many arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: ext.c:86
+ #: extension/rwarray.c:127
  #, fuzzy, c-format
++
 +msgid ""
 +"extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)\n"
 +msgstr ""
 +"fatalt: extension: bibliotek '%s': definer ikke 'plugin_is_GPL_compatible' 
(%"
 +"s)\n"
 +
- #: ext.c:91
- #, fuzzy, c-format
- msgid "extension: library `%s': cannot call function `%s' (%s)\n"
- msgstr ""
- "fatalt: extension: bibliotek '%s': kan ikke kalde funktionen '%s' (%s)\n"
+ msgid "do_writea: argument 0 is not a string\n"
 -msgstr "exp: argumentet %g er uden for det tilladte område"
++msgstr "exp: argumentet %g er uden for det tilladte område\n"
  
- #: ext.c:119
- msgid "extension: missing function name"
- msgstr "extension: mangler funktionsnavn"
+ #: extension/rwarray.c:133
+ #, fuzzy, c-format
+ msgid "do_writea: argument 1 is not an array\n"
 -msgstr "split: fjerde argument er ikke et array"
++msgstr "split: fjerde argument er ikke et array\n"
  
- #: ext.c:124
+ #: extension/rwarray.c:180
  #, c-format
- msgid "extension: illegal character `%c' in function name `%s'"
- msgstr "extension: ugyldigt tegn '%c' i funktionsnavn '%s'"
+ msgid "write_array: could not flatten array\n"
+ msgstr ""
  
- #: ext.c:132
+ #: extension/rwarray.c:194
  #, c-format
- msgid "extension: can't redefine function `%s'"
- msgstr "extension: kan ikke omdefinere funktion '%s'"
+ msgid "write_array: could not release flattened array\n"
+ msgstr ""
  
- #: ext.c:136
- #, c-format
- msgid "extension: function `%s' already defined"
- msgstr "extension: funktionen '%s' er allerede defineret"
+ #: extension/rwarray.c:276
+ #, fuzzy
+ msgid "reada: called with too many arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: ext.c:140
- #, c-format
- msgid "extension: function name `%s' previously defined"
- msgstr "extension: funktionsnavnet '%s' er defineret tidligere"
+ #: extension/rwarray.c:283
+ #, fuzzy, c-format
+ msgid "do_reada: argument 0 is not a string\n"
+ msgstr "exp: argumentet %g er uden for det tilladte område"
  
- #: ext.c:142
- #, c-format
- msgid "extension: can't use gawk built-in `%s' as function name"
- msgstr "extension: kan ikke bruge gawk's indbyggede '%s' som funktionsnavn"
+ #: extension/rwarray.c:289
+ #, fuzzy, c-format
+ msgid "do_reada: argument 1 is not an array\n"
+ msgstr "match: tredje argument er ikke et array"
  
- #: ext.c:145
+ #: extension/rwarray.c:333
  #, c-format
- msgid "make_builtin: negative argument count for function `%s'"
- msgstr "make_builtin: negativt argumentantal for funktion '%s'"
+ msgid "do_reada: clear_array failed\n"
+ msgstr ""
  
- #: ext.c:207
+ #: extension/rwarray.c:370
  #, c-format
- msgid "function `%s' defined to take no more than %d argument(s)"
- msgstr "funktionen '%s' defineret til at tage ikke mere end %d argumenter"
+ msgid "read_array: set_array_element failed\n"
+ msgstr ""
  
- #: ext.c:210
- #, c-format
- msgid "function `%s': missing argument #%d"
- msgstr "funktion '%s': mangler argument nummer %d"
+ #: extension/time.c:78
+ #, fuzzy
+ msgid "gettimeofday: ignoring arguments"
+ msgstr "mktime: fik et argument som ikke er en streng"
  
- #: ext.c:227
- #, c-format
- msgid "function `%s': argument #%d: attempt to use scalar as an array"
+ #: extension/time.c:109
+ msgid "gettimeofday: not supported on this platform"
  msgstr ""
- "funktion '%s': argument nummer %d: forsøg på at bruge skalar som et array"
  
- #: ext.c:231
- #, c-format
- msgid "function `%s': argument #%d: attempt to use array as a scalar"
- msgstr ""
- "funktion '%s': argument nummer %d: forsøg på at bruge array som en skalar"
+ #: extension/time.c:130
+ #, fuzzy
+ msgid "sleep: called with too many arguments"
+ msgstr "sqrt: kaldt med negativt argument %g"
  
- #: ext.c:245
- msgid "Operation Not Supported"
- msgstr "Operationen understøttes ikke"
+ #: extension/time.c:133
+ #, fuzzy
+ msgid "sleep: missing required numeric argument"
+ msgstr "exp: fik et ikke-numerisk argument"
  
- #: ext.c:257
- msgid "dynamic loading of library not supported"
+ #: extension/time.c:139
+ #, fuzzy
+ msgid "sleep: argument is negative"
+ msgstr "exp: argumentet %g er uden for det tilladte område"
+ 
+ #: extension/time.c:166
+ msgid "sleep: not supported on this platform"
  msgstr ""
  
- #: field.c:328
+ #: field.c:339
  msgid "NF set to negative value"
  msgstr "NF sat til en negativ værdi"
  
diff --cc po/de.po
index 05ac454,797631a..64d9a98
--- a/po/de.po
+++ b/po/de.po
@@@ -15,9 -15,9 +15,9 @@@ msgstr "
  "MIME-Version: 1.0\n"
  "Content-Type: text/plain; charset=utf-8\n"
  "Content-Transfer-Encoding: 8bit\n"
 +"Language: de\n"
  
- #: array.c:267
+ #: array.c:266
  #, c-format
  msgid "from %s"
  msgstr "von %s"
@@@ -126,13 -126,13 +126,13 @@@ msgstr "Das alte awk erlaubt keine mehr
  msgid "`%s' is a built-in function, it cannot be redefined"
  msgstr "»%s« ist eine eingebaute Funktion und kann nicht umdefiniert werden"
  
- #: awkgram.y:389
+ #: awkgram.y:414
  msgid "regexp constant `//' looks like a C++ comment, but is not"
  msgstr ""
 -"Die Regulärer-Ausdruck-Konstante »//« sieht wie ein C-Kommentar aus, ist "
 -"aber keiner"
 +"Die Regulärer-Ausdruck-Konstante »//« sieht wie ein C-Kommentar aus, ist 
aber "
 +"keiner"
  
- #: awkgram.y:393
+ #: awkgram.y:418
  #, c-format
  msgid "regexp constant `/%s/' looks like a C comment, but is not"
  msgstr ""
@@@ -467,10 -493,10 +493,10 @@@ msgstr "Funktion »%s«: Funktionsname
  #, c-format
  msgid "function `%s': can't use special variable `%s' as a function parameter"
  msgstr ""
 -"Funktion »%s«: die spezielle Variable »%s« kann nicht als Parameter "
 -"verwendet werden"
 +"Funktion »%s«: die spezielle Variable »%s« kann nicht als Parameter 
verwendet "
 +"werden"
  
- #: awkgram.y:4055
+ #: awkgram.y:4248
  #, c-format
  msgid "function `%s': parameter #%d, `%s', duplicates parameter #%d"
  msgstr "Funktion »%s«: Parameter #%d, »%s« wiederholt Parameter #%d"
@@@ -538,9 -564,10 +564,9 @@@ msgstr "
  #, c-format
  msgid "fflush: cannot flush: file `%s' opened for reading, not writing"
  msgstr ""
 -"fflush: Leeren der Puffer nicht möglich, Datei »%s« ist nur zum Lesen "
 -"geöffnet"
 +"fflush: Leeren der Puffer nicht möglich, Datei »%s« ist nur zum Lesen 
geöffnet"
  
- #: builtin.c:217
+ #: builtin.c:223
  #, c-format
  msgid "fflush: `%s' is not an open file, pipe or co-process"
  msgstr "fflush: »%s« ist keine geöffnete Datei, Pipe oder Prozess"
@@@ -1279,12 -2479,13 +2478,12 @@@ msgstr "%s: Die Option »-W %s« hat ke
  msgid "%s: option '-W %s' requires an argument\n"
  msgstr "%s: Die Option »-W %s« erfordert ein Argument\n"
  
- #: io.c:315
+ #: io.c:339
  #, c-format
  msgid "command line argument `%s' is a directory: skipped"
 -msgstr ""
 -"das Kommandozeilen-Argument »%s« ist ein Verzeichnis: wird übersprungen"
 +msgstr "das Kommandozeilen-Argument »%s« ist ein Verzeichnis: wird 
übersprungen"
  
- #: io.c:318 io.c:421
+ #: io.c:342 io.c:455
  #, c-format
  msgid "cannot open file `%s' for reading (%s)"
  msgstr "Die Datei »%s« kann nicht zum Lesen geöffnet werden (%s)"
@@@ -1381,10 -2582,10 +2580,10 @@@ msgstr "»close« für eine Umlenkung, 
  #, c-format
  msgid "close: redirection `%s' not opened with `|&', second argument ignored"
  msgstr ""
 -"close: Umlenkung »%s« wurde nicht mit »[&« geöffnet, das zweite 
Argument "
 -"wird ignoriert"
 +"close: Umlenkung »%s« wurde nicht mit »[&« geöffnet, das zweite 
Argument wird "
 +"ignoriert"
  
- #: io.c:1105
+ #: io.c:1159
  #, c-format
  msgid "failure status (%d) on pipe close of `%s' (%s)"
  msgstr "Fehlerstatus (%d) beim Schließen der Pipe »%s« (%s)"
@@@ -2031,15 -3353,17 +3351,15 @@@ msgstr "
  msgid "redir2str: unknown redirection type %d"
  msgstr "redir2str: unbekannter Umlenkungstyp %d"
  
- #: re.c:573
+ #: re.c:568
  #, c-format
  msgid "range of the form `[%c-%c]' is locale dependent"
 -msgstr ""
 -"Ein Bereich in der Form »[%c-%c]« ist abhängig von der gesetzten Locale"
 +msgstr "Ein Bereich in der Form »[%c-%c]« ist abhängig von der gesetzten 
Locale"
  
- #: re.c:600
+ #: re.c:595
  #, c-format
  msgid "regexp component `%.*s' should probably be `[%.*s]'"
 -msgstr ""
 -"Regulärer-Ausdruck-Komponente »%.*s« sollte wahrscheinlich »[%.*s]« 
sein"
 +msgstr "Regulärer-Ausdruck-Komponente »%.*s« sollte wahrscheinlich 
»[%.*s]« sein"
  
  #: regcomp.c:131
  msgid "Success"
diff --cc po/es.po
index e504e6c,99a9cc8..5ef69dc
--- a/po/es.po
+++ b/po/es.po
@@@ -14,9 -14,9 +14,9 @@@ msgstr "
  "MIME-Version: 1.0\n"
  "Content-Type: text/plain; charset=UTF-8\n"
  "Content-Transfer-Encoding: 8bit\n"
 +"Language: es\n"
  
- #: array.c:267
+ #: array.c:266
  #, c-format
  msgid "from %s"
  msgstr "desde %s"
@@@ -936,200 -953,1351 +953,1366 @@@ msgstr "compl(%lf): el valor fraccionar
  msgid "dcgettext: `%s' is not a valid locale category"
  msgstr "dcgettext: `%s' no es una categoría local válida"
  
- #: eval.c:393
+ #: command.y:225
  #, c-format
- msgid "unknown nodetype %d"
- msgstr "tipo de nodo %d desconocido"
+ msgid "Type (g)awk statement(s). End with the command \"end\"\n"
+ msgstr ""
+ 
+ #: command.y:289
+ #, fuzzy, c-format
+ msgid "invalid frame number: %d"
+ msgstr "Final de rango inválido"
+ 
+ #: command.y:295
+ #, fuzzy, c-format
+ msgid "info: invalid option - \"%s\""
+ msgstr "%s: opción inválida -- '%c'\n"
  
- #: eval.c:404 eval.c:418
+ #: command.y:321
  #, c-format
- msgid "unknown opcode %d"
- msgstr "código de operación %d desconocido"
+ msgid "source \"%s\": already sourced."
+ msgstr ""
  
- #: eval.c:415
+ #: command.y:326
  #, c-format
- msgid "opcode %s not an operator or keyword"
- msgstr "el código de operación %s no es un operador o una palabra clave"
+ msgid "save \"%s\": command not permitted."
+ msgstr ""
  
- #: eval.c:468
- msgid "buffer overflow in genflags2str"
- msgstr "desbordamiento de almacenamiento temporal en genflags2str"
+ #: command.y:339
+ msgid "Can't use command `commands' for breakpoint/watchpoint commands"
+ msgstr ""
+ 
+ #: command.y:341
+ msgid "no breakpoint/watchpoint has been set yet"
+ msgstr ""
+ 
+ #: command.y:343
+ msgid "invalid breakpoint/watchpoint number"
+ msgstr ""
+ 
+ #: command.y:348
+ #, c-format
+ msgid "Type commands for when %s %d is hit, one per line.\n"
+ msgstr ""
+ 
+ #: command.y:350
+ #, c-format
+ msgid "End with the command \"end\"\n"
+ msgstr ""
+ 
+ #: command.y:357
+ msgid "`end' valid only in command `commands' or `eval'"
+ msgstr ""
+ 
+ #: command.y:367
+ msgid "`silent' valid only in command `commands'"
+ msgstr ""
+ 
+ #: command.y:373
+ #, fuzzy, c-format
+ msgid "trace: invalid option - \"%s\""
+ msgstr "%s: opción inválida -- '%c'\n"
+ 
+ #: command.y:387
+ msgid "condition: invalid breakpoint/watchpoint number"
+ msgstr ""
+ 
+ #: command.y:449
+ #, fuzzy
+ msgid "argument not a string"
+ msgstr "exp: el argumento %g está fuera de rango"
  
- #: eval.c:678
+ #: command.y:459 command.y:464
  #, c-format
+ msgid "option: invalid parameter - \"%s\""
+ msgstr ""
+ 
+ #: command.y:474
+ #, c-format
+ msgid "no such function - \"%s\""
+ msgstr ""
+ 
+ #: command.y:531
+ #, fuzzy, c-format
+ msgid "enable: invalid option - \"%s\""
+ msgstr "%s: opción inválida -- '%c'\n"
+ 
+ #: command.y:597
+ #, fuzzy, c-format
+ msgid "invalid range specification: %d - %d"
+ msgstr "Final de rango inválido"
+ 
+ #: command.y:659
+ #, fuzzy
+ msgid "non-numeric value for field number"
+ msgstr "valor desconocido para la especificación de campo: %d\n"
+ 
+ #: command.y:680 command.y:687
+ msgid "non-numeric value found, numeric expected"
+ msgstr ""
+ 
+ #: command.y:712 command.y:718
+ msgid "non-zero integer value"
+ msgstr ""
+ 
+ #: command.y:817
  msgid ""
- "\n"
- "\t# Function Call Stack:\n"
- "\n"
+ "backtrace [N] - print trace of all or N innermost (outermost if N < 0) "
+ "frames."
  msgstr ""
- "\n"
- "\t# Pila de Llamadas de Funciones:\n"
- "\n"
  
- #: eval.c:706
- msgid "`IGNORECASE' is a gawk extension"
- msgstr "`IGNORECASE' es una extensión de gawk"
+ #: command.y:819
+ msgid ""
+ "break [[filename:]N|function] - set breakpoint at the specified location."
+ msgstr ""
  
- #: eval.c:736
- msgid "`BINMODE' is a gawk extension"
- msgstr "`BINMODE' es una extensión de gawk"
+ #: command.y:821
+ msgid "clear [[filename:]N|function] - delete breakpoints previously set."
+ msgstr ""
+ 
+ #: command.y:823
+ msgid ""
+ "commands [num] - starts a list of commands to be executed at a breakpoint"
+ "(watchpoint) hit."
+ msgstr ""
+ 
+ #: command.y:825
+ msgid "condition num [expr] - set or clear breakpoint or watchpoint 
condition."
+ msgstr ""
+ 
+ #: command.y:827
+ msgid "continue [COUNT] - continue program being debugged."
+ msgstr ""
+ 
+ #: command.y:829
+ msgid "delete [breakpoints] [range] - delete specified breakpoints."
+ msgstr ""
+ 
+ #: command.y:831
+ msgid "disable [breakpoints] [range] - disable specified breakpoints."
+ msgstr ""
+ 
+ #: command.y:833
+ msgid "display [var] - print value of variable each time the program stops."
+ msgstr ""
+ 
+ #: command.y:835
+ msgid "down [N] - move N frames down the stack."
+ msgstr ""
+ 
+ #: command.y:837
+ msgid "dump [filename] - dump instructions to file or stdout."
+ msgstr ""
+ 
+ #: command.y:839
+ msgid "enable [once|del] [breakpoints] [range] - enable specified 
breakpoints."
+ msgstr ""
+ 
+ #: command.y:841
+ msgid "end - end a list of commands or awk statements."
+ msgstr ""
+ 
+ #: command.y:843
+ msgid "eval stmt|[p1, p2, ...] - evaluate awk statement(s)."
+ msgstr ""
+ 
+ #: command.y:845
+ msgid "finish - execute until selected stack frame returns."
+ msgstr ""
+ 
+ #: command.y:847
+ msgid "frame [N] - select and print stack frame number N."
+ msgstr ""
+ 
+ #: command.y:849
+ msgid "help [command] - print list of commands or explanation of command."
+ msgstr ""
+ 
+ #: command.y:851
+ msgid "ignore N COUNT - set ignore-count of breakpoint number N to COUNT."
+ msgstr ""
+ 
+ #: command.y:853
+ msgid ""
+ "info topic - source|sources|variables|functions|break|frame|args|locals|"
+ "display|watch."
+ msgstr ""
+ 
+ #: command.y:855
+ msgid "list [-|+|[filename:]lineno|function|range] - list specified line(s)."
+ msgstr ""
+ 
+ #: command.y:857
+ msgid "next [COUNT] - step program, proceeding through subroutine calls."
+ msgstr ""
+ 
+ #: command.y:859
+ msgid ""
+ "nexti [COUNT] - step one instruction, but proceed through subroutine calls."
+ msgstr ""
+ 
+ #: command.y:861
+ msgid "option [name[=value]] - set or display debugger option(s)."
+ msgstr ""
+ 
+ #: command.y:863
+ msgid "print var [var] - print value of a variable or array."
+ msgstr ""
+ 
+ #: command.y:865
+ msgid "printf format, [arg], ... - formatted output."
+ msgstr ""
+ 
+ #: command.y:867
+ msgid "quit - exit debugger."
+ msgstr ""
  
- #: eval.c:794
+ #: command.y:869
+ msgid "return [value] - make selected stack frame return to its caller."
+ msgstr ""
+ 
+ #: command.y:871
+ msgid "run - start or restart executing program."
+ msgstr ""
+ 
+ #: command.y:874
+ msgid "save filename - save commands from the session to file."
+ msgstr ""
+ 
+ #: command.y:877
+ msgid "set var = value - assign value to a scalar variable."
+ msgstr ""
+ 
+ #: command.y:879
+ msgid ""
+ "silent - suspends usual message when stopped at a breakpoint/watchpoint."
+ msgstr ""
+ 
+ #: command.y:881
+ msgid "source file - execute commands from file."
+ msgstr ""
+ 
+ #: command.y:883
+ msgid "step [COUNT] - step program until it reaches a different source line."
+ msgstr ""
+ 
+ #: command.y:885
+ msgid "stepi [COUNT] - step one instruction exactly."
+ msgstr ""
+ 
+ #: command.y:887
+ msgid "tbreak [[filename:]N|function] - set a temporary breakpoint."
+ msgstr ""
+ 
+ #: command.y:889
+ msgid "trace on|off - print instruction before executing."
+ msgstr ""
+ 
+ #: command.y:891
+ msgid "undisplay [N] - remove variable(s) from automatic display list."
+ msgstr ""
+ 
+ #: command.y:893
+ msgid ""
+ "until [[filename:]N|function] - execute until program reaches a different "
+ "line or line N within current frame."
+ msgstr ""
+ 
+ #: command.y:895
+ msgid "unwatch [N] - remove variable(s) from watch list."
+ msgstr ""
+ 
+ #: command.y:897
+ msgid "up [N] - move N frames up the stack."
+ msgstr ""
+ 
+ #: command.y:899
+ msgid "watch var - set a watchpoint for a variable."
+ msgstr ""
+ 
+ #: command.y:1011 debug.c:395 msg.c:128
  #, c-format
- msgid "BINMODE value `%s' is invalid, treated as 3"
- msgstr "el valor BINMODE `%s' es inválido; se trata como 3"
+ msgid "error: "
+ msgstr "error: "
+ 
+ #: command.y:1051
+ #, fuzzy, c-format
+ msgid "can't read command (%s)\n"
+ msgstr "no se puede redirigir desde `%s' (%s)"
+ 
+ #: command.y:1065
+ #, fuzzy, c-format
+ msgid "can't read command (%s)"
+ msgstr "no se puede redirigir desde `%s' (%s)"
+ 
+ #: command.y:1116
+ #, fuzzy
+ msgid "invalid character in command"
+ msgstr "Nombre de clase de caracter inválido"
+ 
+ #: command.y:1152
+ #, c-format
+ msgid "unknown command - \"%.*s\", try help"
+ msgstr ""
+ 
+ #: command.y:1222
+ #, c-format
+ msgid "%s"
+ msgstr ""
+ 
+ #: command.y:1284
+ #, fuzzy
+ msgid "invalid character"
+ msgstr "Caracter de ordenación inválido"
+ 
+ #: command.y:1455
+ #, c-format
+ msgid "undefined command: %s\n"
+ msgstr ""
+ 
+ #: debug.c:246
+ msgid "set or show the number of lines to keep in history file."
+ msgstr ""
+ 
+ #: debug.c:248
+ msgid "set or show the list command window size."
+ msgstr ""
+ 
+ #: debug.c:250
+ msgid "set or show gawk output file."
+ msgstr ""
+ 
+ #: debug.c:252
+ msgid "set or show debugger prompt."
+ msgstr ""
+ 
+ #: debug.c:254
+ msgid "(un)set or show saving of command history (value=on|off)."
+ msgstr ""
+ 
+ #: debug.c:256
+ msgid "(un)set or show saving of options (value=on|off)."
+ msgstr ""
+ 
+ #: debug.c:258
+ msgid "(un)set or show instruction tracing (value=on|off)."
+ msgstr ""
+ 
+ #: debug.c:339
+ msgid "program not running."
+ msgstr ""
+ 
+ #: debug.c:442 debug.c:597
+ #, fuzzy, c-format
+ msgid "can't read source file `%s' (%s)"
+ msgstr "no se puede leer el fichero fuente `%s' (%s)"
+ 
+ #: debug.c:447
+ #, fuzzy, c-format
+ msgid "source file `%s' is empty.\n"
+ msgstr "el fichero fuente `%s' está vacío"
+ 
+ #: debug.c:474
+ msgid "no current source file."
+ msgstr ""
+ 
+ #: debug.c:499
+ #, fuzzy, c-format
+ msgid "cannot find source file named `%s' (%s)"
+ msgstr "no se puede leer el fichero fuente `%s' (%s)"
+ 
+ #: debug.c:523
+ #, c-format
+ msgid "WARNING: source file `%s' modified since program compilation.\n"
+ msgstr ""
+ 
+ #: debug.c:542
+ #, c-format
+ msgid "line number %d out of range; `%s' has %d lines"
+ msgstr ""
+ 
+ #: debug.c:602
+ #, fuzzy, c-format
+ msgid "unexpected eof while reading file `%s', line %d"
+ msgstr "error interno: fichero `%s', línea %d\n"
+ 
+ #: debug.c:611
+ #, c-format
+ msgid "source file `%s' modified since start of program execution"
+ msgstr ""
+ 
+ #: debug.c:723
+ #, fuzzy, c-format
+ msgid "Current source file: %s\n"
+ msgstr "ya se incluyó el fichero fuente `%s'"
+ 
+ #: debug.c:724
+ #, c-format
+ msgid "Number of lines: %d\n"
+ msgstr ""
+ 
+ #: debug.c:731
+ #, c-format
+ msgid "Source file (lines): %s (%d)\n"
+ msgstr ""
+ 
+ #: debug.c:745
+ msgid ""
+ "Number  Disp  Enabled  Location\n"
+ "\n"
+ msgstr ""
+ 
+ #: debug.c:756
+ #, c-format
+ msgid "\tno of hits = %ld\n"
+ msgstr ""
+ 
+ #: debug.c:758
+ #, c-format
+ msgid "\tignore next %ld hit(s)\n"
+ msgstr ""
+ 
+ #: debug.c:760 debug.c:900
+ #, c-format
+ msgid "\tstop condition: %s\n"
+ msgstr ""
+ 
+ #: debug.c:762 debug.c:902
+ msgid "\tcommands:\n"
+ msgstr ""
+ 
+ #: debug.c:784
+ #, c-format
+ msgid "Current frame: "
+ msgstr ""
+ 
+ #: debug.c:787
+ #, c-format
+ msgid "Called by frame: "
+ msgstr ""
+ 
+ #: debug.c:791
+ #, c-format
+ msgid "Caller of frame: "
+ msgstr ""
+ 
+ #: debug.c:809
+ #, c-format
+ msgid "None in main().\n"
+ msgstr ""
+ 
+ #: debug.c:839
+ #, fuzzy
+ msgid "No arguments.\n"
+ msgstr "printf: sin argumentos"
+ 
+ #: debug.c:840
+ msgid "No locals.\n"
+ msgstr ""
+ 
+ #: debug.c:848
+ msgid ""
+ "All defined variables:\n"
+ "\n"
+ msgstr ""
+ 
+ #: debug.c:858
+ msgid ""
+ "All defined functions:\n"
+ "\n"
+ msgstr ""
+ 
+ #: debug.c:877
+ msgid ""
+ "Auto-display variables:\n"
+ "\n"
+ msgstr ""
+ 
+ #: debug.c:880
+ msgid ""
+ "Watch variables:\n"
+ "\n"
+ msgstr ""
+ 
+ #: debug.c:1020
+ #, fuzzy, c-format
+ msgid "no symbol `%s' in current context\n"
+ msgstr "`exit' no se puede llamar en el contexto actual"
+ 
+ #: debug.c:1032 debug.c:1416
+ #, fuzzy, c-format
+ msgid "`%s' is not an array\n"
+ msgstr "`%s' no es un nombre de variable legal"
+ 
+ #: debug.c:1046
+ #, fuzzy, c-format
+ msgid "$%ld = uninitialized field\n"
+ msgstr "referencia al campo sin inicializar `$%d'"
+ 
+ #: debug.c:1067
+ #, fuzzy, c-format
+ msgid "array `%s' is empty\n"
+ msgstr "el fichero de datos `%s' está vacío"
+ 
+ #: debug.c:1110 debug.c:1162
+ #, fuzzy, c-format
+ msgid "[\"%s\"] not in array `%s'\n"
+ msgstr "delete: el índice `%s' no está en la matriz `%s'"
+ 
+ #: debug.c:1166
+ #, c-format
+ msgid "`%s[\"%s\"]' is not an array\n"
+ msgstr ""
+ 
+ #: debug.c:1227 debug.c:4947
+ #, fuzzy, c-format
+ msgid "`%s' is not a scalar variable"
+ msgstr "`%s' no es un nombre de variable legal"
+ 
+ #: debug.c:1249 debug.c:4977
+ #, fuzzy, c-format
+ msgid "attempt to use array `%s[\"%s\"]' in a scalar context"
+ msgstr "se intentó usar la matriz `%s[\"%.*s\"]' en un contexto escalar"
+ 
+ #: debug.c:1269 debug.c:4988
+ #, fuzzy, c-format
+ msgid "attempt to use scalar `%s[\"%s\"]' as array"
+ msgstr "se intentó usar el dato escalar `%s[\"%.*s\"]' como una matriz"
+ 
+ #: debug.c:1412
+ #, fuzzy, c-format
+ msgid "`%s' is a function"
+ msgstr "`%s' es inválido como un nombre de función"
+ 
+ #: debug.c:1454
+ #, c-format
+ msgid "watchpoint %d is unconditional\n"
+ msgstr ""
+ 
+ #: debug.c:1488
+ #, c-format
+ msgid "No display item numbered %ld"
+ msgstr ""
+ 
+ #: debug.c:1491
+ #, c-format
+ msgid "No watch item numbered %ld"
+ msgstr ""
+ 
+ #: debug.c:1517
+ #, fuzzy, c-format
+ msgid "%d: [\"%s\"] not in array `%s'\n"
+ msgstr "delete: el índice `%s' no está en la matriz `%s'"
+ 
+ #: debug.c:1756
+ #, fuzzy
+ msgid "attempt to use scalar value as array"
+ msgstr "se intentó usar un valor escalar como una matriz"
+ 
+ #: debug.c:1845
+ #, c-format
+ msgid "Watchpoint %d deleted because parameter is out of scope.\n"
+ msgstr ""
+ 
+ #: debug.c:1856
+ #, c-format
+ msgid "Display %d deleted because parameter is out of scope.\n"
+ msgstr ""
+ 
+ #: debug.c:1889
+ #, fuzzy, c-format
+ msgid " in file `%s', line %d\n"
+ msgstr "error interno: fichero `%s', línea %d\n"
+ 
+ #: debug.c:1910
+ #, c-format
+ msgid " at `%s':%d"
+ msgstr ""
+ 
+ #: debug.c:1926 debug.c:1989
+ #, c-format
+ msgid "#%ld\tin "
+ msgstr ""
+ 
+ #: debug.c:1963
+ #, c-format
+ msgid "More stack frames follow ...\n"
+ msgstr ""
+ 
+ #: debug.c:2006
+ #, fuzzy
+ msgid "invalid frame number"
+ msgstr "Final de rango inválido"
+ 
+ #: debug.c:2178
+ #, c-format
+ msgid "Note: breakpoint %d (enabled, ignore next %ld hits), also set at %s:%d"
+ msgstr ""
+ 
+ #: debug.c:2185
+ #, c-format
+ msgid "Note: breakpoint %d (enabled), also set at %s:%d"
+ msgstr ""
+ 
+ #: debug.c:2192
+ #, c-format
+ msgid "Note: breakpoint %d (disabled, ignore next %ld hits), also set at 
%s:%d"
+ msgstr ""
+ 
+ #: debug.c:2199
+ #, c-format
+ msgid "Note: breakpoint %d (disabled), also set at %s:%d"
+ msgstr ""
+ 
+ #: debug.c:2216
+ #, fuzzy, c-format
+ msgid "Breakpoint %d set at file `%s', line %d\n"
+ msgstr "error interno: fichero `%s', línea %d\n"
+ 
+ #: debug.c:2318
+ #, c-format
+ msgid "Can't set breakpoint in file `%s'\n"
+ msgstr ""
+ 
+ #: debug.c:2347 debug.c:2470 debug.c:3328
+ #, fuzzy, c-format
+ msgid "line number %d in file `%s' out of range"
+ msgstr "exp: el argumento %g está fuera de rango"
+ 
+ #: debug.c:2351
+ #, c-format
+ msgid "Can't find rule!!!\n"
+ msgstr ""
+ 
+ #: debug.c:2353
+ #, c-format
+ msgid "Can't set breakpoint at `%s':%d\n"
+ msgstr ""
+ 
+ #: debug.c:2365
+ #, c-format
+ msgid "Can't set breakpoint in function `%s'\n"
+ msgstr ""
+ 
+ #: debug.c:2381
+ #, c-format
+ msgid "breakpoint %d set at file `%s', line %d is unconditional\n"
+ msgstr ""
+ 
+ #: debug.c:2486 debug.c:2508
+ #, c-format
+ msgid "Deleted breakpoint %d"
+ msgstr ""
+ 
+ #: debug.c:2492
+ #, c-format
+ msgid "No breakpoint(s) at entry to function `%s'\n"
+ msgstr ""
+ 
+ #: debug.c:2519
+ #, fuzzy, c-format
+ msgid "No breakpoint at file `%s', line #%d\n"
+ msgstr "error interno: fichero `%s', línea %d\n"
+ 
+ #: debug.c:2574 debug.c:2615 debug.c:2635 debug.c:2678
+ msgid "invalid breakpoint number"
+ msgstr ""
+ 
+ #: debug.c:2590
+ msgid "Delete all breakpoints? (y or n) "
+ msgstr ""
+ 
+ #: debug.c:2591 debug.c:2901 debug.c:2954
+ msgid "y"
+ msgstr ""
+ 
+ #: debug.c:2640
+ #, c-format
+ msgid "Will ignore next %ld crossing(s) of breakpoint %d.\n"
+ msgstr ""
+ 
+ #: debug.c:2644
+ #, c-format
+ msgid "Will stop next time breakpoint %d is reached.\n"
+ msgstr ""
+ 
+ #: debug.c:2761
+ #, c-format
+ msgid "Can only debug programs provided with the `-f' option.\n"
+ msgstr ""
+ 
+ #: debug.c:2886
+ #, c-format
+ msgid "Failed to restart debugger"
+ msgstr ""
+ 
+ #: debug.c:2900
+ msgid "Program already running. Restart from beginning (y/n)? "
+ msgstr ""
+ 
+ #: debug.c:2904
+ #, c-format
+ msgid "Program not restarted\n"
+ msgstr ""
+ 
+ #: debug.c:2914
+ #, c-format
+ msgid "error: cannot restart, operation not allowed\n"
+ msgstr ""
+ 
+ #: debug.c:2920
+ #, c-format
+ msgid "error (%s): cannot restart, ignoring rest of the commands\n"
+ msgstr ""
+ 
+ #: debug.c:2928
+ #, c-format
+ msgid "Starting program: \n"
+ msgstr ""
+ 
+ #: debug.c:2937
+ #, c-format
+ msgid "Program exited %s with exit value: %d\n"
+ msgstr ""
+ 
+ #: debug.c:2953
+ msgid "The program is running. Exit anyway (y/n)? "
+ msgstr ""
+ 
+ #: debug.c:2988
+ #, c-format
+ msgid "Not stopped at any breakpoint; argument ignored.\n"
+ msgstr ""
+ 
+ #: debug.c:2993
+ #, c-format
+ msgid "invalid breakpoint number %d."
+ msgstr ""
+ 
+ #: debug.c:2998
+ #, c-format
+ msgid "Will ignore next %ld crossings of breakpoint %d.\n"
+ msgstr ""
+ 
+ #: debug.c:3185
+ #, c-format
+ msgid "'finish' not meaningful in the outermost frame main()\n"
+ msgstr ""
+ 
+ #: debug.c:3190
+ #, c-format
+ msgid "Run till return from "
+ msgstr ""
+ 
+ #: debug.c:3233
+ #, c-format
+ msgid "'return' not meaningful in the outermost frame main()\n"
+ msgstr ""
+ 
+ #: debug.c:3347
+ #, c-format
+ msgid "Can't find specified location in function `%s'\n"
+ msgstr ""
+ 
+ #: debug.c:3355
+ #, fuzzy, c-format
+ msgid "invalid source line %d in file `%s'"
+ msgstr "ya se incluyó el fichero fuente `%s'"
+ 
+ #: debug.c:3370
+ #, c-format
+ msgid "Can't find specified location %d in file `%s'\n"
+ msgstr ""
+ 
+ #: debug.c:3402
+ #, fuzzy, c-format
+ msgid "element not in array\n"
+ msgstr "delete: el índice `%s' no está en la matriz `%s'"
+ 
+ #: debug.c:3402
+ #, c-format
+ msgid "untyped variable\n"
+ msgstr ""
+ 
+ #: debug.c:3444
+ #, c-format
+ msgid "Stopping in %s ...\n"
+ msgstr ""
+ 
+ #: debug.c:3521
+ #, c-format
+ msgid "'finish' not meaningful with non-local jump '%s'\n"
+ msgstr ""
+ 
+ #: debug.c:3528
+ #, c-format
+ msgid "'until' not meaningful with non-local jump '%s'\n"
+ msgstr ""
+ 
+ #: debug.c:4163
+ msgid "\t------[Enter] to continue or q [Enter] to quit------"
+ msgstr ""
+ 
+ #: debug.c:4164
+ msgid "q"
+ msgstr ""
+ 
+ #: debug.c:4984
+ #, fuzzy, c-format
+ msgid "[\"%s\"] not in array `%s'"
+ msgstr "delete: el índice `%s' no está en la matriz `%s'"
+ 
+ #: debug.c:5190
+ #, c-format
+ msgid "sending output to stdout\n"
+ msgstr ""
+ 
+ #: debug.c:5230
+ msgid "invalid number"
+ msgstr ""
+ 
+ #: debug.c:5362
+ #, fuzzy, c-format
+ msgid "`%s' not allowed in current context; statement ignored"
+ msgstr "`exit' no se puede llamar en el contexto actual"
+ 
+ #: debug.c:5370
+ #, fuzzy
+ msgid "`return' not allowed in current context; statement ignored"
+ msgstr "`exit' no se puede llamar en el contexto actual"
+ 
+ #: debug.c:5571
+ #, fuzzy, c-format
+ msgid "No symbol `%s' in current context"
+ msgstr "se intentó usar la matriz `%s' en un contexto escalar"
+ 
+ #: dfa.c:984 dfa.c:987 dfa.c:1007 dfa.c:1017 dfa.c:1029 dfa.c:1080 dfa.c:1089
+ #: dfa.c:1092 dfa.c:1097 dfa.c:1110 dfa.c:1178
+ #, fuzzy
+ msgid "unbalanced ["
+ msgstr "[ desbalanceado"
+ 
+ #: dfa.c:1038
+ #, fuzzy
+ msgid "invalid character class"
+ msgstr "Nombre de clase de caracter inválido"
+ 
+ #: dfa.c:1215
+ msgid "character class syntax is [[:space:]], not [:space:]"
+ msgstr ""
+ 
+ #: dfa.c:1267
+ #, fuzzy
+ msgid "unfinished \\ escape"
+ msgstr "Escape \\ sin terminar"
+ 
+ #: dfa.c:1414 regcomp.c:161
+ msgid "Invalid content of \\{\\}"
+ msgstr "Contenido inválido de \\{\\}"
+ 
+ #: dfa.c:1417 regcomp.c:176
+ msgid "Regular expression too big"
+ msgstr "La expresión regular es demasiado grande"
+ 
+ #: dfa.c:1802
+ #, fuzzy
+ msgid "unbalanced ("
+ msgstr "( desbalanceado"
+ 
+ #: dfa.c:1929
+ #, fuzzy
+ msgid "no syntax specified"
+ msgstr "No se especifican los bits de sintaxis de la expresión regular"
+ 
+ #: dfa.c:1937
+ #, fuzzy
+ msgid "unbalanced )"
+ msgstr ") desbalanceado"
+ 
+ #: eval.c:394
+ #, c-format
+ msgid "unknown nodetype %d"
+ msgstr "tipo de nodo %d desconocido"
+ 
+ #: eval.c:405 eval.c:419
+ #, c-format
+ msgid "unknown opcode %d"
+ msgstr "código de operación %d desconocido"
+ 
+ #: eval.c:416
+ #, c-format
+ msgid "opcode %s not an operator or keyword"
+ msgstr "el código de operación %s no es un operador o una palabra clave"
+ 
+ #: eval.c:471
+ msgid "buffer overflow in genflags2str"
+ msgstr "desbordamiento de almacenamiento temporal en genflags2str"
+ 
+ #: eval.c:674
+ #, c-format
+ msgid ""
+ "\n"
+ "\t# Function Call Stack:\n"
+ "\n"
+ msgstr ""
+ "\n"
+ "\t# Pila de Llamadas de Funciones:\n"
+ "\n"
+ 
+ #: eval.c:703
+ msgid "`IGNORECASE' is a gawk extension"
+ msgstr "`IGNORECASE' es una extensión de gawk"
+ 
+ #: eval.c:735
+ msgid "`BINMODE' is a gawk extension"
+ msgstr "`BINMODE' es una extensión de gawk"
+ 
+ #: eval.c:792
+ #, c-format
+ msgid "BINMODE value `%s' is invalid, treated as 3"
+ msgstr "el valor BINMODE `%s' es inválido; se trata como 3"
+ 
+ #: eval.c:884
+ #, c-format
+ msgid "bad `%sFMT' specification `%s'"
+ msgstr "especificación `%sFMT' `%s' errónea"
+ 
+ #: eval.c:968
+ msgid "turning off `--lint' due to assignment to `LINT'"
+ msgstr "se desactiva `--lint' debido a una asignación a `LINT'"
+ 
+ #: eval.c:1144
+ #, c-format
+ msgid "reference to uninitialized argument `%s'"
+ msgstr "referencia al argumento sin inicializar `%s'"
+ 
+ #: eval.c:1145
+ #, c-format
+ msgid "reference to uninitialized variable `%s'"
+ msgstr "referencia a la variable sin inicializar `%s'"
+ 
+ #: eval.c:1163
+ msgid "attempt to field reference from non-numeric value"
+ msgstr "se intentó una referencia de campo desde un valor que no es 
númerico"
+ 
+ #: eval.c:1165
+ msgid "attempt to field reference from null string"
+ msgstr "se intentó una referencia de campo desde una cadena nula"
+ 
+ #: eval.c:1173
+ #, c-format
+ msgid "attempt to access field %ld"
+ msgstr "se intentó acceder al campo %ld"
+ 
+ #: eval.c:1182
+ #, c-format
+ msgid "reference to uninitialized field `$%ld'"
+ msgstr "referencia al campo sin inicializar `$%ld'"
+ 
+ #: eval.c:1269
+ #, c-format
+ msgid "function `%s' called with more arguments than declared"
+ msgstr "se llamó a la función `%s' con más argumentos de los declarados"
+ 
+ #: eval.c:1464
+ #, c-format
+ msgid "unwind_stack: unexpected type `%s'"
+ msgstr "unwind_stack: tipo `%s' inesperado"
+ 
+ #: eval.c:1560
+ msgid "division by zero attempted in `/='"
+ msgstr "se intentó una división por cero en `/='"
+ 
+ #: eval.c:1567
+ #, c-format
+ msgid "division by zero attempted in `%%='"
+ msgstr "se intentó una división por cero en `%%='"
+ 
+ #: ext.c:49
+ msgid "extensions are not allowed in sandbox mode"
+ msgstr "no se permiten las extensiones en modo sandbox"
+ 
+ #: ext.c:52
+ #, fuzzy
+ msgid "-l / @load are gawk extensions"
+ msgstr "@include es una extensión de gawk"
+ 
+ #: ext.c:55
+ msgid "load_ext: received NULL lib_name"
+ msgstr ""
+ 
+ #: ext.c:58
+ #, fuzzy, c-format
+ msgid "load_ext: cannot open library `%s' (%s)\n"
+ msgstr "fatal: extension: no se puede abrir `%s' (%s)\n"
+ 
+ #: ext.c:64
+ #, fuzzy, c-format
+ msgid ""
+ "load_ext: library `%s': does not define `plugin_is_GPL_compatible' (%s)\n"
+ msgstr ""
+ "fatal: extension: la biblioteca `%s': no define "
+ "`plugin_is_GPL_compatible' (%s)\n"
+ 
+ #: ext.c:70
+ #, fuzzy, c-format
+ msgid "load_ext: library `%s': cannot call function `%s' (%s)\n"
+ msgstr ""
+ "fatal: extension: la biblioteca `%s': no puede llamar a la función `"
+ "%s' (%s)\n"
+ 
+ #: ext.c:74
+ #, c-format
+ msgid "load_ext: library `%s' initialization routine `%s' failed\n"
+ msgstr ""
+ 
+ #: ext.c:93
+ #, fuzzy
+ msgid "make_builtin: missing function name"
+ msgstr "extension: falta el nombre de la función"
+ 
+ #: ext.c:98
+ #, fuzzy, c-format
+ msgid "make_builtin: illegal character `%c' in function name `%s'"
+ msgstr "extension: carácter ilegal `%c' en el nombre de la función `%s'"
+ 
+ #: ext.c:106
+ #, fuzzy, c-format
+ msgid "make_builtin: can't redefine function `%s'"
+ msgstr "extension: no se puede redefinir la función `%s'"
+ 
+ #: ext.c:110
+ #, fuzzy, c-format
+ msgid "make_builtin: function `%s' already defined"
+ msgstr "extension: la función `%s' ya está definida"
+ 
+ #: ext.c:114
+ #, fuzzy, c-format
+ msgid "make_builtin: function name `%s' previously defined"
+ msgstr "extension: el nombre de función `%s' se definió previamente"
+ 
+ #: ext.c:116
+ #, fuzzy, c-format
+ msgid "make_builtin: can't use gawk built-in `%s' as function name"
+ msgstr ""
+ "extension: no se puede utilizar la orden interna de gawk `%s' como nombre de 
"
+ "función"
+ 
+ #: ext.c:119
+ #, c-format
+ msgid "make_builtin: negative argument count for function `%s'"
+ msgstr "make_builtin: cuenta de argumento negativa para la función `%s'"
+ 
+ #: ext.c:183
+ #, c-format
+ msgid "function `%s' defined to take no more than %d argument(s)"
+ msgstr "la función `%s' se definió para tomar no más de %d argumento(s)"
+ 
+ #: ext.c:186
+ #, c-format
+ msgid "function `%s': missing argument #%d"
+ msgstr "función `%s': falta el argumento #%d"
+ 
+ #: ext.c:203
+ #, c-format
+ msgid "function `%s': argument #%d: attempt to use scalar as an array"
+ msgstr ""
+ "función `%s': argumento #%d: se intentó usar un escalar como una matriz"
+ 
+ #: ext.c:207
+ #, c-format
+ msgid "function `%s': argument #%d: attempt to use array as a scalar"
+ msgstr ""
+ "función `%s': argumento #%d: se intentó usar una matriz como un escalar"
+ 
+ #: ext.c:221
+ msgid "dynamic loading of library not supported"
+ msgstr ""
+ 
+ #: extension/filefuncs.c:75
+ #, fuzzy
+ msgid "chdir: called with incorrect number of arguments, expecting 1"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
+ 
+ #: extension/filefuncs.c:317
+ #, c-format
+ msgid "stat: unable to read symbolic link `%s'"
+ msgstr ""
+ 
+ #: extension/filefuncs.c:348
+ #, fuzzy
+ msgid "stat: called with wrong number of arguments"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
+ 
+ #: extension/filefuncs.c:355
+ #, fuzzy
+ msgid "stat: bad parameters"
+ msgstr "%s: es un parámetro\n"
+ 
+ #: extension/filefuncs.c:404
+ #, fuzzy, c-format
+ msgid "fts init: could not create constant %s"
+ msgstr "index: el segundo argumento recibido no es una cadena"
+ 
+ #: extension/filefuncs.c:424
+ msgid "fill_stat_element: could not create array"
+ msgstr ""
+ 
+ #: extension/filefuncs.c:433
+ msgid "fill_stat_element: could not set element"
+ msgstr ""
+ 
+ #: extension/filefuncs.c:448
+ #, fuzzy
+ msgid "fill_path_element: could not set element"
+ msgstr "index: el segundo argumento recibido no es una cadena"
+ 
+ #: extension/filefuncs.c:464
+ msgid "fill_error_element: could not set element"
+ msgstr ""
+ 
+ #: extension/filefuncs.c:511 extension/filefuncs.c:558
+ msgid "fts-process: could not create array"
+ msgstr ""
+ 
+ #: extension/filefuncs.c:521 extension/filefuncs.c:568
+ #: extension/filefuncs.c:586
+ #, fuzzy
+ msgid "fts-process: could not set element"
+ msgstr "index: el segundo argumento recibido no es una cadena"
+ 
+ #: extension/filefuncs.c:635
+ #, fuzzy
+ msgid "fts: called with incorrect number of arguments, expecting 3"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
+ 
+ #: extension/filefuncs.c:638
+ #, fuzzy
+ msgid "fts: bad first parameter"
+ msgstr "%s: es un parámetro\n"
+ 
+ #: extension/filefuncs.c:644
+ #, fuzzy
+ msgid "fts: bad second parameter"
+ msgstr "%s: es un parámetro\n"
+ 
+ #: extension/filefuncs.c:650
+ #, fuzzy
+ msgid "fts: bad third parameter"
+ msgstr "%s: es un parámetro\n"
+ 
+ #: extension/filefuncs.c:657
+ #, fuzzy
+ msgid "fts: could not flatten array\n"
+ msgstr "`%s' no es un nombre de variable legal"
+ 
+ #: extension/filefuncs.c:675
+ msgid "fts: ignoring sneaky FTS_NOSTAT flag. nyah, nyah, nyah."
+ msgstr ""
+ 
+ #: extension/filefuncs.c:692
+ msgid "fts: clear_array() failed\n"
+ msgstr ""
+ 
+ #: extension/fnmatch.c:91
+ #, fuzzy
+ msgid "fnmatch: called with less than three arguments"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
+ 
+ #: extension/fnmatch.c:94
+ #, fuzzy
+ msgid "fnmatch: called with more than three arguments"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
+ 
+ #: extension/fnmatch.c:97
+ #, fuzzy
+ msgid "fnmatch: could not get first argument"
+ msgstr "strftime: el primer argumento recibido no es una cadena"
  
- #: eval.c:887
- #, c-format
- msgid "bad `%sFMT' specification `%s'"
- msgstr "especificación `%sFMT' `%s' errónea"
+ #: extension/fnmatch.c:102
+ #, fuzzy
+ msgid "fnmatch: could not get second argument"
+ msgstr "index: el segundo argumento recibido no es una cadena"
  
- #: eval.c:969
- msgid "turning off `--lint' due to assignment to `LINT'"
- msgstr "se desactiva `--lint' debido a una asignación a `LINT'"
+ #: extension/fnmatch.c:107
+ msgid "fnmatch: could not get third argument"
+ msgstr ""
  
- #: eval.c:1119
- #, c-format
- msgid "reference to uninitialized argument `%s'"
- msgstr "referencia al argumento sin inicializar `%s'"
+ #: extension/fnmatch.c:120
+ msgid "fnmatch is not implemented on this system\n"
+ msgstr ""
+ 
+ #: extension/fnmatch.c:152
+ msgid "fnmatch init: could not add FNM_NOMATCH variable"
+ msgstr ""
  
- #: eval.c:1120
+ #: extension/fnmatch.c:162
  #, c-format
- msgid "reference to uninitialized variable `%s'"
- msgstr "referencia a la variable sin inicializar `%s'"
+ msgid "fnmatch init: could not set array element %s"
+ msgstr ""
  
- #: eval.c:1138
- msgid "attempt to field reference from non-numeric value"
- msgstr "se intentó una referencia de campo desde un valor que no es 
númerico"
+ #: extension/fnmatch.c:172
+ msgid "fnmatch init: could not install FNM array"
+ msgstr ""
  
- #: eval.c:1140
- msgid "attempt to field reference from null string"
- msgstr "se intentó una referencia de campo desde una cadena nula"
+ #: extension/fork.c:81
+ #, fuzzy
+ msgid "fork: called with too many arguments"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
  
- #: eval.c:1146
- #, c-format
- msgid "attempt to access field %ld"
- msgstr "se intentó acceder al campo %ld"
+ #: extension/fork.c:94
+ msgid "fork: PROCINFO is not an array!"
+ msgstr ""
  
- #: eval.c:1155
- #, c-format
- msgid "reference to uninitialized field `$%ld'"
- msgstr "referencia al campo sin inicializar `$%ld'"
+ #: extension/fork.c:118
+ #, fuzzy
+ msgid "waitpid: called with too many arguments"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
  
- #: eval.c:1242
- #, c-format
- msgid "function `%s' called with more arguments than declared"
- msgstr "se llamó a la función `%s' con más argumentos de los declarados"
+ #: extension/fork.c:126
+ #, fuzzy
+ msgid "wait: called with no arguments"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
  
- #: eval.c:1436
- #, c-format
- msgid "unwind_stack: unexpected type `%s'"
- msgstr "unwind_stack: tipo `%s' inesperado"
+ #: extension/fork.c:143
+ #, fuzzy
+ msgid "wait: called with too many arguments"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
  
- #: eval.c:1536
- msgid "division by zero attempted in `/='"
- msgstr "se intentó una división por cero en `/='"
+ #: extension/ordchr.c:69
+ #, fuzzy
+ msgid "ord: called with too many arguments"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
  
- #: eval.c:1543
- #, c-format
- msgid "division by zero attempted in `%%='"
- msgstr "se intentó una división por cero en `%%='"
+ #: extension/ordchr.c:75
+ #, fuzzy
+ msgid "ord: called with no arguments"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
  
- #: ext.c:70
- msgid "extensions are not allowed in sandbox mode"
- msgstr "no se permiten las extensiones en modo sandbox"
+ #: extension/ordchr.c:77
+ #, fuzzy
+ msgid "ord: called with inappropriate argument(s)"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
  
- #: ext.c:73
- msgid "`extension' is a gawk extension"
- msgstr "`extension' es una extensión de gawk"
+ #: extension/ordchr.c:99
+ #, fuzzy
+ msgid "chr: called with too many arguments"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
  
- #: ext.c:80
- #, fuzzy, c-format
- msgid "extension: cannot open library `%s' (%s)\n"
- msgstr "fatal: extension: no se puede abrir `%s' (%s)\n"
+ #: extension/ordchr.c:109
+ #, fuzzy
+ msgid "chr: called with no arguments"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
  
 +#: ext.c:86
 +#, fuzzy, c-format
 +msgid ""
 +"extension: library `%s': does not define `plugin_is_GPL_compatible' (%s)\n"
 +msgstr ""
 +"fatal: extension: la biblioteca `%s': no define `plugin_is_GPL_compatible' 
(%"
 +"s)\n"
 +
 +#: ext.c:91
 +#, fuzzy, c-format
 +msgid "extension: library `%s': cannot call function `%s' (%s)\n"
 +msgstr ""
 +"fatal: extension: la biblioteca `%s': no puede llamar a la función `%s' (%"
 +"s)\n"
 +
- #: ext.c:119
- msgid "extension: missing function name"
- msgstr "extension: falta el nombre de la función"
+ #: extension/ordchr.c:111
+ #, fuzzy
+ msgid "chr: called with inappropriate argument(s)"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
  
- #: ext.c:124
- #, c-format
- msgid "extension: illegal character `%c' in function name `%s'"
- msgstr "extension: carácter ilegal `%c' en el nombre de la función `%s'"
+ #: extension/readfile.c:81
+ #, fuzzy
+ msgid "readfile: called with too many arguments"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
  
- #: ext.c:132
- #, c-format
- msgid "extension: can't redefine function `%s'"
- msgstr "extension: no se puede redefinir la función `%s'"
+ #: extension/readfile.c:114
+ #, fuzzy
+ msgid "readfile: called with no arguments"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
  
- #: ext.c:136
- #, c-format
- msgid "extension: function `%s' already defined"
- msgstr "extension: la función `%s' ya está definida"
+ #: extension/rwarray.c:120
+ #, fuzzy
+ msgid "writea: called with too many arguments"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
  
- #: ext.c:140
- #, c-format
- msgid "extension: function name `%s' previously defined"
- msgstr "extension: el nombre de función `%s' se definió previamente"
+ #: extension/rwarray.c:127
+ #, fuzzy, c-format
+ msgid "do_writea: argument 0 is not a string\n"
+ msgstr "exp: el argumento %g está fuera de rango"
  
- #: ext.c:142
+ #: extension/rwarray.c:133
+ #, fuzzy, c-format
+ msgid "do_writea: argument 1 is not an array\n"
+ msgstr "split: el cuarto argumento no es una matriz"
+ 
+ #: extension/rwarray.c:180
  #, c-format
- msgid "extension: can't use gawk built-in `%s' as function name"
+ msgid "write_array: could not flatten array\n"
  msgstr ""
- "extension: no se puede utilizar la orden interna de gawk `%s' como nombre de 
"
- "función"
  
- #: ext.c:145
+ #: extension/rwarray.c:194
  #, c-format
- msgid "make_builtin: negative argument count for function `%s'"
- msgstr "make_builtin: cuenta de argumento negativa para la función `%s'"
+ msgid "write_array: could not release flattened array\n"
+ msgstr ""
  
- #: ext.c:207
- #, c-format
- msgid "function `%s' defined to take no more than %d argument(s)"
- msgstr "la función `%s' se definió para tomar no más de %d argumento(s)"
+ #: extension/rwarray.c:276
+ #, fuzzy
+ msgid "reada: called with too many arguments"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
  
- #: ext.c:210
- #, c-format
- msgid "function `%s': missing argument #%d"
- msgstr "función `%s': falta el argumento #%d"
+ #: extension/rwarray.c:283
+ #, fuzzy, c-format
+ msgid "do_reada: argument 0 is not a string\n"
+ msgstr "exp: el argumento %g está fuera de rango"
+ 
+ #: extension/rwarray.c:289
+ #, fuzzy, c-format
+ msgid "do_reada: argument 1 is not an array\n"
+ msgstr "match: el tercer argumento no es una matriz"
  
- #: ext.c:227
+ #: extension/rwarray.c:333
  #, c-format
- msgid "function `%s': argument #%d: attempt to use scalar as an array"
+ msgid "do_reada: clear_array failed\n"
  msgstr ""
- "función `%s': argumento #%d: se intentó usar un escalar como una matriz"
  
- #: ext.c:231
+ #: extension/rwarray.c:370
  #, c-format
- msgid "function `%s': argument #%d: attempt to use array as a scalar"
+ msgid "read_array: set_array_element failed\n"
  msgstr ""
- "función `%s': argumento #%d: se intentó usar una matriz como un escalar"
  
- #: ext.c:245
- msgid "Operation Not Supported"
- msgstr "No Se Admite La Operación"
+ #: extension/time.c:78
+ #, fuzzy
+ msgid "gettimeofday: ignoring arguments"
+ msgstr "mktime: se recibió un argumento que no es una cadena"
+ 
+ #: extension/time.c:109
+ msgid "gettimeofday: not supported on this platform"
+ msgstr ""
  
- #: ext.c:257
- msgid "dynamic loading of library not supported"
+ #: extension/time.c:130
+ #, fuzzy
+ msgid "sleep: called with too many arguments"
+ msgstr "sqrt: se llamó con el argumento negativo %g"
+ 
+ #: extension/time.c:133
+ #, fuzzy
+ msgid "sleep: missing required numeric argument"
+ msgstr "exp: se recibió un argumento que no es númerico"
+ 
+ #: extension/time.c:139
+ #, fuzzy
+ msgid "sleep: argument is negative"
+ msgstr "exp: el argumento %g está fuera de rango"
+ 
+ #: extension/time.c:166
+ msgid "sleep: not supported on this platform"
  msgstr ""
  
- #: field.c:328
+ #: field.c:339
  msgid "NF set to negative value"
  msgstr "se definió NF con un valor negativo"
  
@@@ -1494,10 -2697,10 +2712,10 @@@ msgstr "falló al cerrar la entrada est
  #, c-format
  msgid "moving slave pty to stdin in child failed (dup: %s)"
  msgstr ""
 -"falló el movimiento del pty esclavo a la entrada estándar en el hijo (dup: 
"
 -"%s)"
 +"falló el movimiento del pty esclavo a la entrada estándar en el hijo (dup: 
%"
 +"s)"
  
- #: io.c:1795 io.c:1816
+ #: io.c:1847 io.c:1868
  #, c-format
  msgid "close of slave pty failed (%s)"
  msgstr "falló al cerrar el pty esclavo (%s)"
diff --cc po/fi.po
index b9bee74,0ecb615..8cc434f
--- a/po/fi.po
+++ b/po/fi.po
@@@ -14,10 -14,10 +14,10 @@@ msgstr "
  "MIME-Version: 1.0\n"
  "Content-Type: text/plain; charset=UTF-8\n"
  "Content-Transfer-Encoding: 8bit\n"
 +"Language: fi\n"
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
  
- #: array.c:267
+ #: array.c:266
  #, c-format
  msgid "from %s"
  msgstr "taulukosta %s"
diff --cc symbol.c
index aed75ac,7c770b4..4ff9c78
--- a/symbol.c
+++ b/symbol.c
@@@ -43,6 -42,31 +42,31 @@@ static void free_bcpool(INSTRUCTION *pl
  static AWK_CONTEXT *curr_ctxt = NULL;
  static int ctxt_level;
  
+ static NODE *global_table, *param_table;
+ NODE *symbol_table, *func_table;
+ 
+ /* Use a flag to avoid a strcmp() call inside install() */
+ static bool installing_specials = false;
+ 
+ /* init_symbol_table --- make sure the symbol tables are initialized */
+ 
+ void
+ init_symbol_table()
+ {
+       getnode(global_table);
+       memset(global_table, '\0', sizeof(NODE));
 -      init_array(global_table);
++      null_array(global_table);
+ 
+       getnode(param_table);
+       memset(param_table, '\0', sizeof(NODE));
 -      init_array(param_table);
++      null_array(param_table);
+ 
+       installing_specials = true;
+       func_table = install_symbol(estrdup("FUNCTAB", 7), Node_var_array);
+ 
+       symbol_table = install_symbol(estrdup("SYMTAB", 6), Node_var_array);
+       installing_specials = false;
+ }
  
  /*
   * install_symbol:
@@@ -249,17 -275,12 +275,12 @@@ destroy_symbol(NODE *r
  static NODE *
  make_symbol(char *name, NODETYPE type)
  {
-       NODE *hp, *r;
+       NODE *r;
  
-       getnode(hp);
-       hp->type = Node_hashnode;
-       hp->hlength = strlen(name);
-       hp->hname = name;
        getnode(r);
        memset(r, '\0', sizeof(NODE));
-       hp->hvalue = r;
        if (type == Node_var_array)
 -              init_array(r);
 +              null_array(r);
        else if (type == Node_var)
                r->var_value = dupnode(Nnull_string);
        r->vname = name;
@@@ -475,6 -522,96 +522,96 @@@ release_symbols(NODE *symlist, int keep
        symlist->rnode = NULL;
  }
  
+ /* load_symbols --- fill in symbols' information */
+ 
+ void
+ load_symbols()
+ {
+       NODE *r;
+       NODE *tmp;
+       NODE *sym_array;
+       NODE **aptr;
+       long i, j, max;
+       NODE *user, *extension, *untyped, *scalar, *array;
+       NODE **list;
+       NODE *tables[4];
+ 
+       if (PROCINFO_node == NULL)
+               return;
+ 
+       tables[0] = func_table;
+       tables[1] = symbol_table;
+       tables[2] = global_table;
+       tables[3] = NULL;
+ 
+       tmp = make_string("identifiers", 11);
+       aptr = assoc_lookup(PROCINFO_node, tmp);
+ 
+       getnode(sym_array);
+       memset(sym_array, '\0', sizeof(NODE));  /* PPC Mac OS X wants this */
 -      init_array(sym_array);
++      null_array(sym_array);
+ 
+       unref(*aptr);
+       *aptr = sym_array;
+ 
+       sym_array->parent_array = PROCINFO_node;
+       sym_array->vname = estrdup("identifiers", 11);
+       make_aname(sym_array);
+ 
+       user = make_string("user", 4);
+       extension = make_string("extension", 9);
+       scalar = make_string("scalar", 6);
+       untyped = make_string("untyped", 7);
+       array = make_string("array", 5);
+ 
+       for (i = 0; tables[i] != NULL; i++) {
+               list = assoc_list(tables[i], "@unsorted", ASORTI);
+               max = tables[i]->table_size * 2;
+               if (max == 0)
+                       continue;
+               for (j = 0; j < max; j += 2) {
+                       r = list[j+1];
+                       if (   r->type == Node_ext_func
+                           || r->type == Node_func
+                           || r->type == Node_var
+                           || r->type == Node_var_array
+                           || r->type == Node_var_new) {
+                               tmp = make_string(r->vname, strlen(r->vname));
+                               aptr = assoc_lookup(sym_array, tmp);
+                               unref(tmp);
+                               unref(*aptr);
+                               switch (r->type) {
+                               case Node_ext_func:
+                                       *aptr = dupnode(extension);
+                                       break;
+                               case Node_func:
+                                       *aptr = dupnode(user);
+                                       break;
+                               case Node_var:
+                                       *aptr = dupnode(scalar);
+                                       break;
+                               case Node_var_array:
+                                       *aptr = dupnode(array);
+                                       break;
+                               case Node_var_new:
+                                       *aptr = dupnode(untyped);
+                                       break;
+                               default:
+                                       cant_happen();
+                                       break;
+                               }
+                       }
+               }
+               efree(list);
+       }
+ 
+       unref(user);
+       unref(extension);
+       unref(scalar);
+       unref(untyped);
+       unref(array);
+ }
+ 
  #define pool_size     d.dl
  #define freei         x.xi
  static INSTRUCTION *pool_list;

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

Summary of changes:
 .gitignore                                       |    1 +
 ChangeLog                                        | 1159 ++-
 FUTURES                                          |   67 -
 INSTALL                                          |  212 +-
 LIMITATIONS                                      |   22 -
 Makefile.am                                      |   20 +-
 Makefile.in                                      |  353 +-
 NEWS                                             |   22 +-
 README.git                                       |   50 +-
 TODO                                             |  223 +-
 aclocal.m4                                       |  349 +-
 array.c                                          |   31 +-
 awk.h                                            |  456 +-
 awkgram.c                                        | 2889 ++--
 awkgram.y                                        |  506 +-
 awklib/Makefile.in                               |   99 +-
 awklib/eg/lib/gettime.awk                        |    4 +-
 awklib/eg/prog/alarm.awk                         |    4 +-
 bootstrap.sh                                     |    2 +
 builtin.c                                        |  331 +-
 cint_array.c                                     |   20 +-
 cmd.h                                            |   19 +-
 command.c                                        |  681 +-
 command.y                                        |   77 +-
 config.guess                                     |  543 +-
 config.sub                                       |  328 +-
 configh.in                                       |   36 +-
 configure                                        |  939 +-
 configure.ac                                     |   55 +-
 debug.c                                          |  518 +-
 depcomp                                          |  346 +-
 dfa.c                                            |  102 +-
 doc/ChangeLog                                    |  233 +
 doc/Makefile.am                                  |   24 +-
 doc/Makefile.in                                  |  191 +-
 doc/api-figure1.eps                              |  536 +
 doc/api-figure1.fig                              |   40 +
 doc/api-figure1.pdf                              |  Bin 0 -> 10707 bytes
 doc/api-figure1.png                              |  Bin 0 -> 9183 bytes
 doc/api-figure1.txt                              |   24 +
 doc/api-figure2.eps                              |  517 +
 doc/api-figure2.fig                              |   26 +
 doc/api-figure2.pdf                              |  Bin 0 -> 12027 bytes
 doc/api-figure2.png                              |  Bin 0 -> 8963 bytes
 doc/api-figure2.txt                              |   12 +
 doc/api-figure3.eps                              |  526 +
 doc/api-figure3.fig                              |   29 +
 doc/api-figure3.pdf                              |  Bin 0 -> 12345 bytes
 doc/api-figure3.png                              |  Bin 0 -> 8860 bytes
 doc/api-figure3.txt                              |   13 +
 doc/awkcard.in                                   |   97 +-
 doc/gawk.1                                       |  174 +-
 doc/gawk.info                                    |22565 ++++++++++++---------
 doc/gawk.texi                                    |23290 +++++++++++++---------
 doc/gawkinet.info                                |   72 +-
 doc/general-program.pdf                          |  Bin 5588 -> 5613 bytes
 doc/general-program.png                          |  Bin 0 -> 6078 bytes
 doc/general-program.txt                          |    4 +
 doc/process-flow.pdf                             |  Bin 6558 -> 6583 bytes
 doc/process-flow.png                             |  Bin 0 -> 7856 bytes
 doc/process-flow.txt                             |   11 +
 doc/texinfo.tex                                  |  402 +-
 eval.c                                           |   84 +-
 ext.c                                            |  141 +-
 extension/.gitignore                             |    3 +
 ABOUT-NLS => extension/ABOUT-NLS                 |    0
 AUTHORS => extension/AUTHORS                     |    0
 COPYING => extension/COPYING                     |    0
 extension/ChangeLog                              |  534 +
 extension/INSTALL                                |  370 +
 extension/Makefile.am                            |  106 +
 extension/Makefile.in                            | 1171 ++
 extension/NEWS                                   |    7 +
 extension/README                                 |   10 +
 extension/README.fts                             |   68 +
 extension/aclocal.m4                             | 1017 +
 extension/arrayparm.c                            |   83 -
 extension/bindarr.c                              |   10 +-
 extension/build-aux/ChangeLog                    |    8 +
 extension/build-aux/ar-lib                       |  270 +
 extension/build-aux/config.guess                 | 1534 ++
 config.rpath => extension/build-aux/config.rpath |    0
 extension/build-aux/config.sub                   | 1782 ++
 extension/build-aux/depcomp                      |  780 +
 extension/build-aux/install-sh                   |  527 +
 extension/build-aux/ltmain.sh                    | 9655 +++++++++
 extension/build-aux/missing                      |  330 +
 extension/configh.in                             |  137 +
 extension/configure                              |16293 +++++++++++++++
 extension/configure.ac                           |   75 +
 extension/dl.c                                   |   92 -
 extension/doit                                   |    1 -
 extension/filefuncs.3am                          |  363 +
 extension/filefuncs.c                            |  844 +-
 extension/fileop.c                               |   70 +-
 extension/fnmatch.3am                            |  120 +
 extension/fnmatch.c                              |  186 +
 extension/foo.awk                                |    9 -
 extension/fork.3am                               |   97 +
 extension/fork.c                                 |  143 +-
 extension/fts.3                                  |  773 +
 extension/gawkfts.c                              | 1240 ++
 extension/gawkfts.h                              |  157 +
 extension/m4/ChangeLog                           |   13 +
 {m4 => extension/m4}/gettext.m4                  |    0
 {m4 => extension/m4}/iconv.m4                    |    0
 extension/m4/intlmacosx.m4                       |   51 +
 {m4 => extension/m4}/lib-ld.m4                   |    0
 {m4 => extension/m4}/lib-link.m4                 |    0
 {m4 => extension/m4}/lib-prefix.m4               |    0
 extension/m4/libtool.m4                          | 7986 ++++++++
 extension/m4/ltoptions.m4                        |  384 +
 extension/m4/ltsugar.m4                          |  123 +
 extension/m4/ltversion.m4                        |   23 +
 extension/m4/lt~obsolete.m4                      |   98 +
 {m4 => extension/m4}/nls.m4                      |    0
 extension/m4/po.m4                               |  449 +
 {m4 => extension/m4}/progtest.m4                 |    0
 extension/ordchr.3am                             |   77 +
 extension/ordchr.c                               |  101 +-
 extension/readdir.3am                            |  104 +
 extension/readdir.c                              |  254 +
 extension/readfile.3am                           |   70 +
 extension/readfile.c                             |   85 +-
 extension/revoutput.3am                          |   73 +
 extension/revoutput.c                            |  139 +
 extension/revtwoway.3am                          |   63 +
 extension/revtwoway.c                            |  336 +
 extension/rwarray.3am                            |  102 +
 extension/rwarray.awk                            |   28 -
 extension/rwarray.c                              |  525 +-
 extension/rwarray0.c                             |  475 +
 extension/sparr.c                                |   13 +-
 extension/stack.c                                |   90 +
 extension/stack.h                                |   31 +
 extension/steps                                  |   36 +-
 extension/testarg.awk                            |    7 -
 extension/testarg.c                              |   55 -
 extension/testarrayparm.awk                      |   10 -
 extension/testext.c                              |  827 +
 extension/testff.awk                             |   30 -
 extension/testfork.awk                           |   20 -
 extension/testordchr.awk                         |    6 -
 extension/testsparr.awk                          |    1 +
 extension/time.3am                               |   88 +
 extension/time.c                                 |  179 +
 extension/xreadlink.c                            |   95 -
 extension/xreadlink.h                            |   23 -
 field.c                                          |  160 +-
 gawkapi.c                                        | 1173 ++
 gawkapi.h                                        |  910 +
 getopt.c                                         |    2 +-
 install-sh                                       |  258 +-
 int_array.c                                      |    9 +-
 interpret.h                                      |  160 +-
 io.c                                             | 1353 +-
 m4/ChangeLog                                     |   19 +
 m4/codeset.m4                                    |   12 +-
 m4/glibc2.m4                                     |   18 +-
 m4/glibc21.m4                                    |   18 +-
 m4/intdiv0.m4                                    |   50 +-
 m4/intl.m4                                       |  121 +-
 m4/intldir.m4                                    |    6 +-
 m4/intlmacosx.m4                                 |   12 +-
 m4/intmax.m4                                     |   12 +-
 m4/inttypes-pri.m4                               |   12 +-
 m4/inttypes_h.m4                                 |   29 +-
 m4/lcmessage.m4                                  |   11 +-
 m4/lock.m4                                       |  308 +-
 m4/longlong.m4                                   |  106 +-
 m4/po.m4                                         |    2 +-
 m4/printf-posix.m4                               |   15 +-
 m4/size_max.m4                                   |   37 +-
 m4/stdint_h.m4                                   |   29 +-
 m4/uintmax_t.m4                                  |   14 +-
 m4/visibility.m4                                 |   34 +-
 m4/wchar_t.m4                                    |   10 +-
 m4/wint_t.m4                                     |   20 +-
 m4/xsize.m4                                      |    6 +-
 main.c                                           |  235 +-
 mbsupport.h                                      |   15 +-
 missing                                          |  183 +-
 missing_d/ChangeLog                              |    8 +
 missing_d/gawkbool.h                             |   40 +
 missing_d/snprintf.c                             |    8 +-
 missing_d/strtoul.c                              |   12 +-
 mkinstalldirs                                    |    9 +-
 mpfr.c                                           |   52 +-
 msg.c                                            |   34 +-
 node.c                                           |   37 +-
 pc/ChangeLog                                     |   49 +
 pc/Makefile                                      |    7 -
 pc/Makefile.tst                                  |   51 +-
 pc/config.h                                      |   71 +-
 pc/config.sed                                    |   24 +-
 pc/gawkmisc.pc                                   |   27 +
 po/ChangeLog                                     |    4 +
 po/LINGUAS                                       |    1 +
 po/POTFILES.in                                   |   21 +-
 po/da.gmo                                        |  Bin 46123 -> 42587 bytes
 po/da.po                                         | 2477 ++-
 po/de.po                                         | 2492 ++-
 po/es.gmo                                        |  Bin 48746 -> 44930 bytes
 po/es.po                                         | 2493 ++-
 po/fi.po                                         | 2478 ++-
 po/fr.gmo                                        |  Bin 50390 -> 46424 bytes
 po/fr.po                                         | 2491 ++-
 po/gawk.pot                                      | 2334 ++-
 po/it.gmo                                        |  Bin 41479 -> 43572 bytes
 po/it.po                                         | 2670 ++-
 po/ja.gmo                                        |  Bin 52218 -> 48191 bytes
 po/ja.po                                         | 2478 ++-
 po/nl.gmo                                        |  Bin 46629 -> 43081 bytes
 po/nl.po                                         | 2480 ++-
 po/pl.gmo                                        |  Bin 48745 -> 44960 bytes
 po/pl.po                                         | 2502 ++-
 po/sv.gmo                                        |  Bin 46113 -> 42504 bytes
 po/sv.po                                         | 2477 ++-
 po/vi.gmo                                        |  Bin 0 -> 50868 bytes
 po/vi.po                                         | 3333 +++-
 posix/ChangeLog                                  |   27 +
 posix/gawkmisc.c                                 |   37 +-
 profile.c                                        |   73 +-
 protos.h                                         |    6 +-
 re.c                                             |  129 +-
 regex.c                                          |    6 +-
 replace.c                                        |    3 +-
 symbol.c                                         |  387 +-
 test/ChangeLog                                   |  285 +
 test/Makefile.am                                 |  294 +-
 test/Makefile.in                                 |  463 +-
 test/Maketests                                   |  117 +-
 test/assignconst.awk                             |   58 +
 test/assignconst.ok                              |   42 +
 test/badargs.ok                                  |    1 +
 test/charasbytes.awk                             |    1 +
 test/charasbytes.in                              |    1 +
 test/charasbytes.ok                              |    3 +
 test/filefuncs.awk                               |   25 +
 test/{arrayprm2.ok => filefuncs.ok}              |    0
 test/fnmatch.awk                                 |   11 +
 test/fnmatch.ok                                  |    9 +
 test/fork.awk                                    |   33 +
 test/{arrayprm2.ok => fork.ok}                   |    0
 test/fork2.awk                                   |   35 +
 test/{arrayprm2.ok => fork2.ok}                  |    0
 test/fts.awk                                     |  121 +
 test/functab1.awk                                |    3 +
 test/functab1.ok                                 |    2 +
 test/functab2.awk                                |    8 +
 test/functab2.ok                                 |    2 +
 test/functab3.awk                                |   10 +
 test/functab3.ok                                 |    2 +
 test/functab4.awk                                |   14 +
 test/functab4.ok                                 |    3 +
 test/getline5.awk                                |   35 +
 test/{rsnulbig2.ok => getline5.ok}               |    0
 test/hello.awk                                   |    3 +
 test/id.awk                                      |   11 +
 test/id.ok                                       |   32 +
 test/incdupe.ok                                  |    3 +
 test/incdupe2.ok                                 |    2 +
 test/incdupe3.ok                                 |    2 +
 test/incdupe4.ok                                 |    2 +
 test/incdupe5.ok                                 |    2 +
 test/incdupe6.ok                                 |    3 +
 test/incdupe7.ok                                 |    3 +
 test/inchello.awk                                |    1 +
 test/inclib.awk                                  |    7 +
 test/include.awk                                 |    5 +
 test/include.ok                                  |    2 +
 test/include2.ok                                 |    2 +
 test/jarebug.awk                                 |    1 +
 test/jarebug.in                                  |    4 +
 test/jarebug.ok                                  |    4 +
 test/jarebug.sh                                  |   21 +
 test/lintwarn.ok                                 |    3 +-
 test/messages.awk                                |    2 +-
 test/ofs1.awk                                    |   23 +
 test/ofs1.in                                     |    4 +
 test/ofs1.ok                                     |    7 +
 test/ordchr.awk                                  |   10 +
 test/ordchr.ok                                   |    5 +
 test/ordchr2.ok                                  |    1 +
 test/readdir.awk                                 |    3 +
 test/readdir0.awk                                |    9 +
 test/regexprange.awk                             |   14 +
 test/regexprange.ok                              |   52 +
 test/revout.awk                                  |    6 +
 test/revout.ok                                   |    1 +
 test/revtwoway.awk                               |   11 +
 test/revtwoway.ok                                |    2 +
 test/rwarray.awk                                 |   33 +
 test/rwarray.in                                  |  780 +
 test/rwarray.ok                                  |    3 +
 test/symtab1.awk                                 |   21 +
 test/symtab1.ok                                  |   31 +
 test/symtab2.awk                                 |    6 +
 test/symtab2.ok                                  |    2 +
 test/symtab3.awk                                 |    1 +
 test/symtab3.ok                                  |    2 +
 test/symtab4.awk                                 |    1 +
 test/symtab4.in                                  |    2 +
 test/{nulrsend.ok => symtab4.ok}                 |    0
 test/symtab5.awk                                 |    1 +
 test/symtab5.in                                  |    2 +
 test/{nulrsend.ok => symtab5.ok}                 |    0
 test/symtab6.awk                                 |    1 +
 test/symtab6.ok                                  |   26 +
 test/testext.ok                                  |   75 +
 test/time.awk                                    |   22 +
 test/time.ok                                     |    3 +
 version.c                                        |    2 +-
 vms/ChangeLog                                    |   44 +
 vms/gawkmisc.vms                                 |   26 +
 vms/vms-conf.h                                   |    9 +
 vms/vms-notes                                    |    8 +
 vms/vms_fwrite.c                                 |    2 +-
 vms/vms_gawk.c                                   |    4 +-
 vms/vmsbuild.com                                 |   50 +-
 vms/vmstest.com                                  |   23 +-
 xalloc.h                                         |   10 +
 ylwrap                                           |  201 +-
 323 files changed, 117338 insertions(+), 34491 deletions(-)
 delete mode 100644 FUTURES
 delete mode 100644 LIMITATIONS
 create mode 100644 doc/api-figure1.eps
 create mode 100644 doc/api-figure1.fig
 create mode 100644 doc/api-figure1.pdf
 create mode 100644 doc/api-figure1.png
 create mode 100644 doc/api-figure1.txt
 create mode 100644 doc/api-figure2.eps
 create mode 100644 doc/api-figure2.fig
 create mode 100644 doc/api-figure2.pdf
 create mode 100644 doc/api-figure2.png
 create mode 100644 doc/api-figure2.txt
 create mode 100644 doc/api-figure3.eps
 create mode 100644 doc/api-figure3.fig
 create mode 100644 doc/api-figure3.pdf
 create mode 100644 doc/api-figure3.png
 create mode 100644 doc/api-figure3.txt
 create mode 100644 doc/general-program.png
 create mode 100644 doc/general-program.txt
 create mode 100644 doc/process-flow.png
 create mode 100644 doc/process-flow.txt
 create mode 100644 extension/.gitignore
 copy ABOUT-NLS => extension/ABOUT-NLS (100%)
 copy AUTHORS => extension/AUTHORS (100%)
 copy COPYING => extension/COPYING (100%)
 create mode 100644 extension/INSTALL
 create mode 100644 extension/Makefile.am
 create mode 100644 extension/Makefile.in
 create mode 100644 extension/NEWS
 create mode 100644 extension/README
 create mode 100644 extension/README.fts
 create mode 100644 extension/aclocal.m4
 delete mode 100644 extension/arrayparm.c
 create mode 100644 extension/build-aux/ChangeLog
 create mode 100755 extension/build-aux/ar-lib
 create mode 100755 extension/build-aux/config.guess
 copy config.rpath => extension/build-aux/config.rpath (100%)
 create mode 100755 extension/build-aux/config.sub
 create mode 100755 extension/build-aux/depcomp
 create mode 100755 extension/build-aux/install-sh
 create mode 100644 extension/build-aux/ltmain.sh
 create mode 100755 extension/build-aux/missing
 create mode 100644 extension/configh.in
 create mode 100755 extension/configure
 create mode 100644 extension/configure.ac
 delete mode 100644 extension/dl.c
 delete mode 100755 extension/doit
 create mode 100644 extension/filefuncs.3am
 create mode 100644 extension/fnmatch.3am
 create mode 100644 extension/fnmatch.c
 delete mode 100644 extension/foo.awk
 create mode 100644 extension/fork.3am
 create mode 100644 extension/fts.3
 create mode 100644 extension/gawkfts.c
 create mode 100644 extension/gawkfts.h
 create mode 100644 extension/m4/ChangeLog
 copy {m4 => extension/m4}/gettext.m4 (100%)
 copy {m4 => extension/m4}/iconv.m4 (100%)
 create mode 100644 extension/m4/intlmacosx.m4
 copy {m4 => extension/m4}/lib-ld.m4 (100%)
 copy {m4 => extension/m4}/lib-link.m4 (100%)
 copy {m4 => extension/m4}/lib-prefix.m4 (100%)
 create mode 100644 extension/m4/libtool.m4
 create mode 100644 extension/m4/ltoptions.m4
 create mode 100644 extension/m4/ltsugar.m4
 create mode 100644 extension/m4/ltversion.m4
 create mode 100644 extension/m4/lt~obsolete.m4
 copy {m4 => extension/m4}/nls.m4 (100%)
 create mode 100644 extension/m4/po.m4
 copy {m4 => extension/m4}/progtest.m4 (100%)
 create mode 100644 extension/ordchr.3am
 create mode 100644 extension/readdir.3am
 create mode 100644 extension/readdir.c
 create mode 100644 extension/readfile.3am
 create mode 100644 extension/revoutput.3am
 create mode 100644 extension/revoutput.c
 create mode 100644 extension/revtwoway.3am
 create mode 100644 extension/revtwoway.c
 create mode 100644 extension/rwarray.3am
 delete mode 100644 extension/rwarray.awk
 create mode 100644 extension/rwarray0.c
 create mode 100644 extension/stack.c
 create mode 100644 extension/stack.h
 delete mode 100644 extension/testarg.awk
 delete mode 100644 extension/testarg.c
 delete mode 100644 extension/testarrayparm.awk
 create mode 100644 extension/testext.c
 delete mode 100644 extension/testff.awk
 delete mode 100644 extension/testfork.awk
 delete mode 100644 extension/testordchr.awk
 create mode 100644 extension/time.3am
 create mode 100644 extension/time.c
 delete mode 100644 extension/xreadlink.c
 delete mode 100644 extension/xreadlink.h
 create mode 100644 gawkapi.c
 create mode 100644 gawkapi.h
 create mode 100644 missing_d/gawkbool.h
 create mode 100644 po/vi.gmo
 create mode 100644 test/assignconst.awk
 create mode 100644 test/assignconst.ok
 create mode 100755 test/charasbytes.awk
 create mode 100644 test/charasbytes.in
 create mode 100644 test/charasbytes.ok
 create mode 100644 test/filefuncs.awk
 copy test/{arrayprm2.ok => filefuncs.ok} (100%)
 create mode 100644 test/fnmatch.awk
 create mode 100644 test/fnmatch.ok
 create mode 100644 test/fork.awk
 copy test/{arrayprm2.ok => fork.ok} (100%)
 create mode 100644 test/fork2.awk
 copy test/{arrayprm2.ok => fork2.ok} (100%)
 create mode 100644 test/fts.awk
 create mode 100644 test/functab1.awk
 create mode 100644 test/functab1.ok
 create mode 100644 test/functab2.awk
 create mode 100644 test/functab2.ok
 create mode 100644 test/functab3.awk
 create mode 100644 test/functab3.ok
 create mode 100644 test/functab4.awk
 create mode 100644 test/functab4.ok
 create mode 100644 test/getline5.awk
 copy test/{rsnulbig2.ok => getline5.ok} (100%)
 create mode 100644 test/hello.awk
 create mode 100644 test/id.awk
 create mode 100644 test/id.ok
 create mode 100644 test/incdupe.ok
 create mode 100644 test/incdupe2.ok
 create mode 100644 test/incdupe3.ok
 create mode 100644 test/incdupe4.ok
 create mode 100644 test/incdupe5.ok
 create mode 100644 test/incdupe6.ok
 create mode 100644 test/incdupe7.ok
 create mode 100644 test/inchello.awk
 create mode 100644 test/inclib.awk
 create mode 100644 test/include.awk
 create mode 100644 test/include.ok
 create mode 100644 test/include2.ok
 create mode 100644 test/jarebug.awk
 create mode 100644 test/jarebug.in
 create mode 100644 test/jarebug.ok
 create mode 100755 test/jarebug.sh
 create mode 100755 test/ofs1.awk
 create mode 100644 test/ofs1.in
 create mode 100644 test/ofs1.ok
 create mode 100644 test/ordchr.awk
 create mode 100644 test/ordchr.ok
 create mode 100644 test/ordchr2.ok
 create mode 100644 test/readdir.awk
 create mode 100644 test/readdir0.awk
 create mode 100644 test/regexprange.awk
 create mode 100644 test/regexprange.ok
 create mode 100644 test/revout.awk
 create mode 100644 test/revout.ok
 create mode 100644 test/revtwoway.awk
 create mode 100644 test/revtwoway.ok
 create mode 100644 test/rwarray.awk
 create mode 100644 test/rwarray.in
 create mode 100644 test/rwarray.ok
 create mode 100644 test/symtab1.awk
 create mode 100644 test/symtab1.ok
 create mode 100644 test/symtab2.awk
 create mode 100644 test/symtab2.ok
 create mode 100644 test/symtab3.awk
 create mode 100644 test/symtab3.ok
 create mode 100644 test/symtab4.awk
 create mode 100644 test/symtab4.in
 copy test/{nulrsend.ok => symtab4.ok} (100%)
 create mode 100644 test/symtab5.awk
 create mode 100644 test/symtab5.in
 copy test/{nulrsend.ok => symtab5.ok} (100%)
 create mode 100644 test/symtab6.awk
 create mode 100644 test/symtab6.ok
 create mode 100644 test/testext.ok
 create mode 100644 test/time.awk
 create mode 100644 test/time.ok
 create mode 100644 vms/vms-notes
 mode change 100644 => 100755 ylwrap


hooks/post-receive
-- 
gawk



reply via email to

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